unit MainTcpServer; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, tcpClient,tcpServer, tcpthreadhelper, ConnectionsDmUnit, syncobjs, extTypes, eventlog; type { TClientThread } { TCGIServerGUI } TCGIServerGUI = class(TForm) edtAnswer: TEdit; edtQValue: TEdit; edtRequest: TComboBox; GroupBox1: TGroupBox; GroupBox2: TGroupBox; intValues: TListBox; StatusPanel: TPanel; retValues: TMemo; Keys: TMemo; SendButton: TButton; Panel1: TPanel; Splitter1: TSplitter; StartButton: TButton; procedure edtAnswerDblClick(Sender: TObject); procedure SendButtonClick(Sender: TObject); procedure StartButtonClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private fLogger: TEventLog; Server: TConnectionsDM; Client: TClientMainThread; cmdDone: boolean; started: boolean; procedure LogQuery(const qtype: integer; const command: string; const aKeys: TStrings; const code: DWORD; const Param: QWORD; const data: TParamArray); function onAnswer(Sender: TMainThread; const mode: byte; const Code:DWORD; const QValue: QWORD; const Answer: string; const Values: TStrings; const iValues: TParamArray; const Data: TStream): boolean; public end; { TConnectionThread } var CGIServerGUI: TCGIServerGUI; implementation {$R *.lfm} uses types,strUtils; { TCGIServerGUI } procedure TCGIServerGUI.FormCreate(Sender: TObject); begin fLogger := TEventLog.Create(self); fLogger.LogType:=TLogType.ltFile; fLogger.FileName:=ChangeFileExt(paramstr(0),'.log'); flogger.Identification:='LMS-Report-Test'; fLogger.Active:=false; fLogger.Active:=true; Server := TConnectionsDM.CreateWithLog(fLogger); ConnectionsDM := Server; cmdDone := true; started := false; SendButton.Enabled := Paramstr(1)='client'; StartButton.Enabled := not SendButton.Enabled; end; procedure TCGIServerGUI.SendButtonClick(Sender: TObject); begin if not started and StartButton.enabled then exit; client := TClientMainThread.Create(edtRequest.Text,Keys.Lines,@Server.log,'localhost',6543,@onAnswer); LogQuery(0,edtRequest.Text,Keys.Lines,0,0,[]); cmdDone := false; edtAnswer.Text := ''; edtQValue.Text := ''; StatusPanel.Caption := 'Ожидание'; retValues.Clear; client.Start; end; procedure TCGIServerGUI.edtAnswerDblClick(Sender: TObject); begin Keys.Lines.Add('='+edtanswer.text); end; procedure TCGIServerGUI.StartButtonClick(Sender: TObject); begin Server.Start; started := true; Panel1.Caption := 'запущен'; SendButton.Enabled := true; end; procedure TCGIServerGUI.FormDestroy(Sender: TObject); begin Server.Free; fLogger.Free; end; procedure TCGIServerGUI.LogQuery(const qtype: integer; const command: string; const aKeys: TStrings; const code: DWORD; const Param: QWORD; const data: TParamArray); var f: textfile; logfile: string; i: integer; begin logfile := ExtractFilePath(paramstr(0))+'out/query.log'; assignfile(f,logfile); if fileexists(logfile) then append(f) else rewrite(f); case qType of 0: writeln(f,DateTimeToStr(now()),#09,'REQUEST'); 1: writeln(f,DateTimeToStr(now()),#09,'RESULT'); end; writeln(f,#09,command); if qType=1 then writeln(f,#09,format('code=%d, value=0x%x',[code,Param])); if assigned(aKeys) then for i := 0 to akeys.Count-1 do writeln(f,#09,#09,aKeys[i]); closefile(f); end; function TCGIServerGUI.onAnswer(Sender: TMainThread; const mode: byte; const Code: DWORD; const QValue: QWORD; const Answer: string; const Values: TStrings; const iValues: TParamArray; const Data: TStream ): boolean; var i: integer; fs: TFileStream; begin try LogQuery(1,Answer,Values,code,QValue,iValues); edtAnswer.Text := Answer; case mode of cmdAnswer: StatusPanel.Caption := format('OK(%d)',[code]); cmdError: StatusPanel.Caption := format('ERROR(%d)',[code]); end; edtQValue.Text:=IntToHex(QValue,16); if assigned(Values) then retValues.Lines.Assign(Values) else retValues.Clear; intValues.Clear; for i := low(iValues) to high(iValues) do intValues.AddItem(inttostr(ivalues[i]),TObject(PtrInt(iValues[i]))); if Assigned(Data) then begin Data.seek(0,soFromBeginning); fs := TFileStream.Create(Answer,fmCreate); try fs.CopyFrom(Data,Data.size); finally fs.free; end; end; finally Sender.Terminate; cmdDone := true; end; end; end.