| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- unit fmain;
- {$mode objfpc}{$H+}
- interface
- uses
- Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
- IdHL7, IdTCPConnection,idGlobal,idSync;
- type
- { TForm1 }
- { TLog }
- TLog = class(TIdNotify)
- protected
- FMsg: string;
- procedure DoNotify; override;
- public
- class procedure LogMsg(const AMsg :string);
- end;
- TForm1 = class(TForm)
- btnStart: TButton;
- btnListen: TButton;
- edtServerPort: TEdit;
- edtServer: TEdit;
- edtPort: TEdit;
- idHl7Client: TIdHL7;
- idHl7Server: TIdHL7;
- Label1: TLabel;
- Label2: TLabel;
- Label3: TLabel;
- Label4: TLabel;
- Label5: TLabel;
- memClient: TMemo;
- memClientReplyText: TMemo;
- memGeneral: TMemo;
- memServerReply: TMemo;
- memServer: TMemo;
- Panel1: TPanel;
- Panel2: TPanel;
- Panel3: TPanel;
- Panel4: TPanel;
- Panel5: TPanel;
- Panel6: TPanel;
- Panel7: TPanel;
- Panel8: TPanel;
- procedure btnListenClick(Sender: TObject);
- procedure btnStartClick(Sender: TObject);
- procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
- procedure FormCreate(Sender: TObject);
- procedure idHl7ClientConnCountChange(ASender: TIdHL7; AConnCount: integer);
- procedure idHl7ClientConnect(Sender: TObject);
- procedure idHl7ClientDisconnect(Sender: TObject);
- procedure idHl7ClientReceiveError(ASender: TObject; AConnection: TIdTCPConnection; AMsg: string; AException: Exception; var VReply: string; var VDropConnection: boolean);
- procedure idHl7ServerConnCountChange(ASender: TIdHL7; AConnCount: integer);
- procedure idHl7ServerConnect(Sender: TObject);
- procedure idHl7ServerDisconnect(Sender: TObject);
- procedure idHl7ServerReceiveError(ASender: TObject; AConnection: TIdTCPConnection; AMsg: string; AException: Exception; var VReply: string; var VDropConnection: boolean);
- procedure Panel3Click(Sender: TObject);
- protected
- procedure hl7ServerReceive(ASender: TObject; AConnection: TIdTCPConnection; AMsg: string; var VHandled: boolean; var VReply: string);
- procedure hl7ServerMsgArrive(ASender: TObject; AConnection: TIdTCPConnection; AMsg: string);
- procedure hl7clientReceive(ASender: TObject; AConnection: TIdTCPConnection; AMsg: string; var VHandled: boolean; var VReply: string);
- procedure logGeneral(sText : String);
- private
- procedure clientSend();
- public
- end;
- var
- Form1: TForm1;
- implementation
- {$R *.lfm}
- { TLog }
- procedure TLog.DoNotify;
- begin
- Form1.memGeneral.Lines.Add(Fmsg);
- end;
- class procedure TLog.LogMsg(const AMsg :string);
- begin
- with TLog.Create do
- try
- FMsg := AMsg;
- Notify;
- except
- Free;
- raise;
- end;
- end;
- { TForm1 }
- procedure TForm1.btnStartClick(Sender: TObject);
- begin
- if idHl7Client.Connected then begin
- idHl7Client.Stop;
- end;
- idHl7Client.Port := StrToInt(edtPort.Text);
- idHl7Client.Address := edtServer.Text;
- clientSend;
- end;
- procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: boolean);
- begin
- if idHl7Client.Status = isConnected then begin
- idHl7Client.Stop;
- end;
- end;
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- idHl7Server.OnReceiveMessage := @hl7ServerReceive;
- idHl7Server.OnMessageArrive := @hl7ServerMsgArrive;
- idHl7Client.OnReceiveMessage:= @hl7clientReceive;
- end;
- procedure TForm1.idHl7ClientConnCountChange(ASender: TIdHL7; AConnCount: integer);
- begin
- logGeneral('clientcon_count change : ');
- end;
- procedure TForm1.idHl7ClientConnect(Sender: TObject);
- begin
- logGeneral('clientconnect : ');
- end;
- procedure TForm1.idHl7ClientDisconnect(Sender: TObject);
- begin
- logGeneral('clientdisconnect : ');
- end;
- procedure TForm1.idHl7ClientReceiveError(ASender: TObject; AConnection: TIdTCPConnection; AMsg: string; AException: Exception; var VReply: string; var VDropConnection: boolean);
- begin
- logGeneral('clientrcverr : ' + AException.Message);
- VDropConnection := True;
- end;
- procedure TForm1.idHl7ServerConnCountChange(ASender: TIdHL7; AConnCount: integer);
- begin
- //Currently if evcents log to memo even in critical section it breaks the whole thread schedule system
- logGeneral('servercon_count change : ');
- end;
- procedure TForm1.idHl7ServerConnect(Sender: TObject);
- begin
- logGeneral('serverconnect : ');
- end;
- procedure TForm1.idHl7ServerDisconnect(Sender: TObject);
- begin
- //Currently if evcents log to memo even in critical section it breaks the whole thread schedule system
- logGeneral('serverdisconnect : ');
- end;
- procedure TForm1.idHl7ServerReceiveError(ASender: TObject; AConnection: TIdTCPConnection; AMsg: string; AException: Exception; var VReply: string; var VDropConnection: boolean);
- begin
- logGeneral('servrcverr : ' + AException.Message);
- VDropConnection := True;
- end;
- procedure TForm1.Panel3Click(Sender: TObject);
- begin
- end;
- procedure TForm1.hl7ServerReceive(ASender: TObject; AConnection: TIdTCPConnection; AMsg: string; var VHandled: boolean; var VReply: string);
- begin
- vReply := memServerReply.Lines.Text;
- memServer.lines.text := Amsg;
- vhandled := True;
- logGeneral('servreceived '+AMsg+
- '- reply provided '+vReply);
- end;
- procedure TForm1.hl7ServerMsgArrive(ASender: TObject; AConnection: TIdTCPConnection; AMsg: string);
- begin
- logGeneral('servmsgarrive : ' + AMsg);
- memServer.lines.add(amsg);
- idHl7Server.AsynchronousSend(memServerReply.Lines.text,AConnection);
- end;
- procedure TForm1.hl7clientReceive(ASender: TObject;
- AConnection: TIdTCPConnection; AMsg: string; var VHandled: boolean;
- var VReply: string);
- begin
- memClientReplyText.lines.text := Amsg;
- vhandled := True;
- logGeneral('clreceived '+AMsg);
- end;
- procedure TForm1.logGeneral(sText: String);
- begin
- TLog.LogMsg(sText);
- end;
- procedure TForm1.clientSend;
- var
- iX: integer;
- sAnt: string;
- // vR : TSendResponse;
- vMsg : IInterface;
- begin
- if idHl7Client.Status <> isConnected then begin
- idHl7Client.Start;
- idHl7Client.WaitForConnection(10000);
- end;
- idHl7Client.SendMessage(memClient.Lines.Text);
- iX := 0;
- while (iX < 10) do begin
- Inc(iX);
- sleep(10);
- Application.ProcessMessages;
- (*vR*)vMsg := idHl7Client.GetMessage(sAnt);
- if vMsg <> nil (*vR = srOK*) then begin
- memClientReplyText.Lines.text := 'success : '+sAnt;
- break
- (* end else if vR = srError then begin
- memClientReplyText.Lines.text := 'error : '+sAnt;
- break;
- end else if vR = srTimeout then begin
- memClientReplyText.Lines.text := 'timeout waiting for reply ';
- break;*)
- end;
- end;
- // memClientReplyText.Lines.Text := sAnt;
- end;
- procedure TForm1.btnListenClick(Sender: TObject);
- begin
- if btnListen.Tag = 0 then begin
- idHl7Server.Port := StrToInt(edtServerPort.Text);
- idHl7Server.Start;
- btnListen.Tag := 1;
- btnListen.Caption := 'Stop';
- end else begin
- idHl7Server.Stop;
- btnListen.Caption := 'Start';
- btnListen.Tag := 0;
- end;
- end;
- end.
|