unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,
ComCtrls, strutils, FileUtil, laz_synapse, blcksock, cmem,
Interfaces;
type
{ TForm1 }
TForm1 = class(TForm)
CloseServer: TButton;
ChecksumEdit: TEdit;
FolderPath: TEdit;
FolderLocateButton: TButton;
FilePath: TEdit;
FileLocateButton: TButton;
FileSendButton: TButton;
ConnectButton: TButton;
Log: TMemo;
OpenFileDialog: TOpenDialog;
PortEdit: TEdit;
IpEdit: TEdit;
HostButton: TButton;
OpenFolderDialog: TSelectDirectoryDialog;
GetTimer: TTimer;
ProgressBar1: TProgressBar;
procedure CloseServerClick(Sender: TObject);
procedure ConnectButtonClick(Sender: TObject);
procedure ChecksumEditChange(Sender: TObject);
procedure FileLocateButtonClick(Sender: TObject);
procedure FileSendButtonClick(Sender: TObject);
procedure FolderLocateButtonClick(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure HostButtonClick(Sender: TObject);
procedure GetTimerTimer(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
var MainServer:TTCPBlockSocket;
Connection:TTCPBlockSocket;
AcceptState:byte=1;
LogMessage:string;
connected:boolean;
filename:string;
mode:string;
checksum:string;
MainStream:TFileStream;
filesize:integer;
streambuffer:string;
threadcount:integer;
function ThreadRun(p:pointer):PtrInt;
begin
Connection.RecvStreamRaw(MainStream, 60000);
end;
procedure Logging;
begin
Form1.Log.Lines.Add(LogMessage);
LogMessage:='';
end;
procedure TForm1.FolderLocateButtonClick(Sender: TObject);
begin
if OpenFolderDialog.execute then FolderPath.Text:=OpenFolderDialog.FileName;
SetCurrentDir(OpenFolderDialog.FileName);
end;
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
Halt;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
mode:='string';
end;
procedure TForm1.FileLocateButtonClick(Sender: TObject);
var f:file;
s:string;
begin
if OpenFileDialog.execute then FilePath.Text:=OpenFileDialog.FileName;
filename:=ExtractDelimited(WordCount(OpenFileDialog.FileName,[DirectorySeparator]),
OpenFileDialog.FileName,[DirectorySeparator]);
Filesize:=FileUtil.FileSize(OpenFileDialog.FileName);
showmessage(filename+' '+IntToStr(filesize));
end;
procedure TForm1.FileSendButtonClick(Sender: TObject);
begin
mode:='filesend';
FilePath.Enabled:=false;
if connected=true then
if Connection.CanWrite(10) then
if checksum<>'' then
Connection.SendString('>StartSendFile'+':'+filename+':'+IntToStr(filesize)
+':'+checksum+#13#10)
else
Connection.SendString('>StartSendFile'+':'+filename+':'+IntToStr(filesize)+#13#10);
MainStream:=TFileStream.Create(OpenFileDialog.FileName,fmOpenRead);
Connection.SendStreamRaw(MainStream);
MainStream.Free;
mode:='string';
FilePath.Enabled:=true;
end;
procedure TForm1.ConnectButtonClick(Sender: TObject);
begin
connection:=TTCPBlockSocket.Create;
Connection.CreateSocket;
Connection.Connect(IpEdit.Text,PortEdit.Text);
if Connection.LastError=0 then begin
LogMessage:=('Successfully connected to ('+Connection.GetRemoteSinIP+')');
connected:=true;
end;
Logging;
end;
procedure TForm1.CloseServerClick(Sender: TObject);
begin
AcceptState:=0;
FreeAndNil(MainServer);
LogMessage:='Server Stopped.';
Logging;
end;
procedure TForm1.ChecksumEditChange(Sender: TObject);
begin
checksum:=ChecksumEdit.Text;
end;
procedure TForm1.HostButtonClick(Sender: TObject);
begin
MainServer:=TTCPBlockSocket.Create;
MainServer.CreateSocket;
MainServer.Bind(IpEdit.Text,PortEdit.Text);
MainServer.Listen;
LogMessage:='Server Run.';
Logging;
AcceptState:=1;
while AcceptState=1 do begin
Application.ProcessMessages;
if Assigned(MainServer) then
if MainServer.CanRead(100) then begin
Connection:=TTCPBlockSocket.Create;
Connection.CreateSocket;
Connection.Socket:=MainServer.Accept;
LogMessage:=('Connection accepted from ('+Connection.GetRemoteSinIP+')');
if LogMessage<>'' then Logging;
connected:=true;
end;
end;
end;
procedure TForm1.GetTimerTimer(Sender: TObject);
var messagein:String;
infile_name:string;
infile_size:string;
infile_checksum:string;
f:file;
n:integer;
finished:LongInt;
begin
//TEXT MODE
if connected then begin
if mode='string' then begin
messagein:=Connection.RecvString(10);
if (messagein<>'') and (messagein[1]<>'>') then begin
LogMessage:=messagein;
Logging;
end
else
if (messagein<>'') and (messagein[1]='>') then begin
mode:='fileaccept';
infile_name:=ExtractDelimited(2,messagein,[':']);
infile_size:=ExtractDelimited(3,messagein,[':']);
infile_checksum:=ExtractDelimited(4,messagein,[':']);
LogMessage:='Accepting file: '+infile_name+' Size: '+
infile_size+' Checksum: '+infile_checksum;
logging;
end;
end;
//FILE MODE
if mode='fileaccept' then begin
FolderPath.Enabled:=false;
MainStream:=TFileStream.Create(infile_name,fmCreate);
if threadcount=0 then begin
if BeginThread(@ThreadRun,pointer(threadcount))=1 then
EndThread(1);
inc(threadcount,1);
end;
while FileUtil.FileSize(OpenFileDialog.FileName)>=StrToInt(infile_size) do begin
MainStream.Free;
mode:='string';
FolderPath.Enabled:=true;
end;
end;
end;
end;
end.