syncipcserver.pp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. program syncipcserver;
  2. {$mode objfpc}{$H+}
  3. uses
  4. {$IFDEF UNIX}
  5. cthreads,
  6. {$ENDIF}
  7. Classes, SysUtils, CustApp,
  8. syncipc;
  9. const
  10. TEST_SERVER_NAME = 'TestSyncIPCServer';
  11. MSG_TEST_STOP = 101;
  12. RES_TEST_STOPPED = $0CACA; //:-( A message for you in Italian...
  13. type
  14. { TTestSyncIPCServer }
  15. TTestSyncIPCServer=class(TSyncIPCServer)
  16. protected
  17. function MessageReceived(AMsgID:Integer):Boolean; override; overload;
  18. function MessageReceived(AMsgID:Integer; AInteger:Integer; IntegerSize:Byte):Boolean; override; overload;
  19. function MessageReceived(AMsgID:Integer; AStream:TStream):Boolean; override; overload;
  20. function MessageReceived(AMsgID:Integer; const Msg: String):Boolean; override; overload;
  21. function MessageReceived(AMsgID:Integer; const Buffer; Count: LongInt):Boolean; override; overload;
  22. function MessageReceived(AMsgID:Integer; const APointer:Pointer; Count: LongInt):Boolean; override; overload;
  23. end;
  24. { TTestSyncIPCServerApp }
  25. TTestSyncIPCServerApp = class(TCustomApplication)
  26. protected
  27. CommServer : TTestSyncIPCServer;
  28. procedure DoRun; override;
  29. public
  30. constructor Create(TheOwner: TComponent); override;
  31. destructor Destroy; override;
  32. procedure WriteHelp; virtual;
  33. end;
  34. var
  35. DoStop : Boolean=False;
  36. { TTwain32SyncIPCServer }
  37. function TTestSyncIPCServer.MessageReceived(AMsgID: Integer): Boolean;
  38. var
  39. resBuf:array of TRect;
  40. begin
  41. if (resultClient = nil)
  42. then writeln('MessageReceived Async (mtData_Null) : '+IntToStr(AMsgID))
  43. else writeln('MessageReceived (mtData_Null) : '+IntToStr(AMsgID));
  44. Case AMsgID of
  45. MSG_TEST_STOP: begin
  46. if (resultClient <> nil)
  47. then Writeln(' Result=$0CACA');
  48. Result:= MessageResult(RES_TEST_STOPPED);
  49. DoStop:=True;
  50. end;
  51. end;
  52. end;
  53. function TTestSyncIPCServer.MessageReceived(AMsgID: Integer; AInteger: Integer; IntegerSize:Byte): Boolean;
  54. begin
  55. if (resultClient = nil)
  56. then Writeln('MessageReceived '+IntToStr(AMsgID)+' Async (mtData_Integer '+IntToStr(IntegerSize)+' bytes) :'+IntToHex(AInteger))
  57. else Writeln('MessageReceived '+IntToStr(AMsgID)+' (mtData_Integer '+IntToStr(IntegerSize)+' bytes) :'+IntToHex(AInteger));
  58. Case AMsgID of
  59. 3: begin
  60. if (resultClient <> nil)
  61. then Writeln(' Result=$ABCDEF0');
  62. Result:= MessageResult($ABCDEF0);
  63. end;
  64. end;
  65. end;
  66. function TTestSyncIPCServer.MessageReceived(AMsgID: Integer; AStream: TStream): Boolean;
  67. begin
  68. if (resultClient = nil)
  69. then writeln('MessageReceived '+IntToStr(AMsgID)+' Async (mtData_Stream '+IntToStr(AStream.Size)+' bytes) :')
  70. else writeln('MessageReceived '+IntToStr(AMsgID)+' (mtData_Stream '+IntToStr(AStream.Size)+' bytes) :');
  71. Case AMsgID of
  72. 4: begin
  73. if (resultClient <> nil)
  74. then Writeln(' Result=Reply to SyncMessage 4 as Stream');
  75. AStream.WriteAnsiString('Reply to SyncMessage 4 as Stream');
  76. Result :=MessageResult(AStream);
  77. end;
  78. end;
  79. end;
  80. function TTestSyncIPCServer.MessageReceived(AMsgID: Integer; const Msg: String): Boolean;
  81. begin
  82. if (resultClient = nil)
  83. then writeln('MessageReceived '+IntToStr(AMsgID)+' Async (mtData_String) :'+Msg)
  84. else writeln('MessageReceived '+IntToStr(AMsgID)+' (mtData_String) :'+Msg);
  85. Case AMsgID of
  86. 1: begin
  87. if (resultClient <> nil)
  88. then Writeln(' Result=Ciao son Sync Result for 1');
  89. Result :=MessageResult('Ciao son Sync Result for 1');
  90. end;
  91. end;
  92. end;
  93. function TTestSyncIPCServer.MessageReceived(AMsgID: Integer; const Buffer; Count: LongInt): Boolean;
  94. var
  95. resRect: TRect;
  96. begin
  97. if (resultClient = nil)
  98. then writeln('MessageReceived '+IntToStr(AMsgID)+' Async (mtData_Var '+IntToStr(Count)+' bytes):')
  99. else writeln('MessageReceived '+IntToStr(AMsgID)+' (mtData_Var '+IntToStr(Count)+' bytes):');
  100. Case AMsgID of
  101. 2: begin
  102. resRect:= TRect(Buffer);
  103. Writeln(' '+IntToStr(resRect.Top)+'-'+IntToStr(resRect.Left)+'-'+IntToStr(resRect.Bottom)+'-'+IntToStr(resRect.Right));
  104. resRect.Top:=resRect.Top+33;
  105. resRect.Left:=resRect.Left+66;
  106. resRect.Bottom:=resRect.Bottom+100;
  107. resRect.Right:=resRect.Right+200;
  108. if (resultClient <> nil)
  109. then Writeln(' Result='+IntToStr(resRect.Top)+'-'+IntToStr(resRect.Left)+'-'+IntToStr(resRect.Bottom)+'-'+IntToStr(resRect.Right));
  110. Result :=MessageResult(resRect, sizeof(TRect));
  111. end;
  112. end;
  113. end;
  114. function TTestSyncIPCServer.MessageReceived(AMsgID: Integer; const APointer: Pointer; Count: LongInt): Boolean;
  115. type PRect=^TRect;
  116. begin
  117. if (resultClient = nil)
  118. then writeln('MessageReceived '+IntToStr(AMsgID)+' Async (mtData_Pointer '+IntToStr(Count)+' bytes) :')
  119. else writeln('MessageReceived '+IntToStr(AMsgID)+' (mtData_Pointer '+IntToStr(Count)+' bytes) :');
  120. Case AMsgID of
  121. 5: begin
  122. Writeln(' '+IntToStr(PRect(APointer)^.Top)+'-'+IntToStr(PRect(APointer)^.Left)+'-'+IntToStr(PRect(APointer)^.Bottom)+'-'+IntToStr(PRect(APointer)^.Right));
  123. PRect(APointer)^.Top:=PRect(APointer)^.Top+33;
  124. PRect(APointer)^.Left:=PRect(APointer)^.Left+66;
  125. PRect(APointer)^.Bottom:=PRect(APointer)^.Bottom+100;
  126. PRect(APointer)^.Right:=PRect(APointer)^.Right+200;
  127. if (resultClient <> nil)
  128. then Writeln(' Result='+IntToStr(PRect(APointer)^.Top)+'-'+IntToStr(PRect(APointer)^.Left)+'-'+IntToStr(PRect(APointer)^.Bottom)+'-'+IntToStr(PRect(APointer)^.Right));
  129. Result :=MessageResult(APointer, sizeof(TRect));
  130. end;
  131. end;
  132. end;
  133. { TDigIt_Twain32Comm }
  134. procedure TTestSyncIPCServerApp.DoRun;
  135. var
  136. ErrorMsg: String;
  137. stopClient: TSyncIPCClient;
  138. recSize, recBuf:Longint;
  139. begin
  140. // quick check parameters
  141. ErrorMsg:=CheckOptions('h s', 'help stop');
  142. if ErrorMsg<>'' then begin
  143. ShowException(Exception.Create(ErrorMsg));
  144. Terminate;
  145. Exit;
  146. end;
  147. // parse help parameter
  148. if HasOption('h', 'help') then
  149. begin
  150. WriteHelp;
  151. Terminate;
  152. Exit;
  153. end;
  154. // parse stop parameter
  155. if HasOption('s', 'stop') then
  156. try
  157. stopClient :=TSyncIPCClient.Create(nil);
  158. stopClient.ServerID:=TEST_SERVER_NAME {$ifdef UNIX} + '-' + GetEnvironmentVariable('USER'){$endif};
  159. stopClient.Connect;
  160. if stopClient.ServerRunning
  161. then stopClient.SendSyncMessage(10000, MSG_TEST_STOP, mtData_Null, recBuf, 0, recBuf, recSize);
  162. stopClient.Free;
  163. Terminate;
  164. Exit;
  165. except
  166. On E:Exception do begin
  167. ShowException(E);
  168. stopClient.Free;
  169. Terminate;
  170. Exit;
  171. end;
  172. end;
  173. try
  174. CommServer := TTestSyncIPCServer.Create(Nil);
  175. CommServer.ServerID:=TEST_SERVER_NAME {$ifdef UNIX} + '-' + GetEnvironmentVariable('USER'){$endif};
  176. CommServer.StartServer(True); // start listening, threaded
  177. if CommServer.Active then
  178. begin
  179. writeln('Start listening, threaded on : '+CommServer.ServerID);
  180. repeat
  181. Sleep(10);
  182. CheckSynchronize;
  183. until DoStop;
  184. writeln('Stop listening, threaded on : '+CommServer.ServerID);
  185. end;
  186. finally
  187. CommServer.Free;
  188. Terminate;
  189. end;
  190. end;
  191. constructor TTestSyncIPCServerApp.Create(TheOwner: TComponent);
  192. begin
  193. inherited Create(TheOwner);
  194. StopOnException:=True;
  195. end;
  196. destructor TTestSyncIPCServerApp.Destroy;
  197. begin
  198. inherited Destroy;
  199. end;
  200. procedure TTestSyncIPCServerApp.WriteHelp;
  201. begin
  202. writeln('Usage: ', ExtractFileName(ExeName), ' options');
  203. writeln(' options:');
  204. writeln(' -h [--help] ', 'Show This Help');
  205. writeln(' -s [--stop] ', 'Stop Server');
  206. end;
  207. var
  208. Application: TTestSyncIPCServerApp;
  209. begin
  210. Application:=TTestSyncIPCServerApp.Create(nil);
  211. Application.Title:='Test SyncIPC Server';
  212. Application.Run;
  213. Application.Free;
  214. end.