simpleipc.inc 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. {
  2. This file is part of the Free Component library.
  3. Copyright (c) 2005 by Michael Van Canneyt, member of
  4. the Free Pascal development team
  5. Unix implementation of one-way IPC between 2 processes
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. uses baseunix;
  13. ResourceString
  14. SErrFailedToCreatePipe = 'Failed to create named pipe: %s';
  15. SErrFailedToRemovePipe = 'Failed to remove named pipe: %s';
  16. { ---------------------------------------------------------------------
  17. TPipeClientComm
  18. ---------------------------------------------------------------------}
  19. Type
  20. TPipeClientComm = Class(TIPCClientComm)
  21. Private
  22. FFileName: String;
  23. FStream: TFileStream;
  24. Public
  25. Constructor Create(AOWner : TSimpleIPCClient); override;
  26. Procedure Connect; override;
  27. Procedure Disconnect; override;
  28. Procedure SendMessage(MsgType : TMessageType; AStream : TStream); override;
  29. Function ServerRunning : Boolean; override;
  30. Property FileName : String Read FFileName;
  31. Property Stream : TFileStream Read FStream;
  32. end;
  33. constructor TPipeClientComm.Create(AOWner: TSimpleIPCClient);
  34. Var
  35. D : String;
  36. begin
  37. inherited Create(AOWner);
  38. FFileName:=Owner.ServerID;
  39. If (Owner.ServerInstance<>'') then
  40. FFileName:=FFileName+'-'+Owner.ServerInstance;
  41. D:='/tmp/'; // Change to something better later
  42. FFileName:=D+FFileName;
  43. end;
  44. procedure TPipeClientComm.Connect;
  45. begin
  46. If Not ServerRunning then
  47. Owner.DoError(SErrServerNotActive,[Owner.ServerID]);
  48. FStream:=TFileStream.Create(FFileName,fmOpenReadWrite);
  49. end;
  50. procedure TPipeClientComm.Disconnect;
  51. begin
  52. FreeAndNil(FStream);
  53. end;
  54. procedure TPipeClientComm.SendMessage(MsgType : TMessagetype; AStream: TStream);
  55. Var
  56. Hdr : TMsgHeader;
  57. P,L,Count : Integer;
  58. begin
  59. Hdr.Version:=MsgVersion;
  60. Hdr.msgType:=mtString;
  61. Hdr.MsgLen:=AStream.Size;
  62. FStream.WriteBuffer(hdr,SizeOf(hdr));
  63. FStream.CopyFrom(AStream,0);
  64. end;
  65. function TPipeClientComm.ServerRunning: Boolean;
  66. begin
  67. Result:=FileExists(FFileName);
  68. end;
  69. { ---------------------------------------------------------------------
  70. TPipeServerComm
  71. ---------------------------------------------------------------------}
  72. Type
  73. TPipeServerComm = Class(TIPCServerComm)
  74. Private
  75. FFileName: String;
  76. FStream: TFileStream;
  77. Public
  78. Constructor Create(AOWner : TSimpleIPCServer); override;
  79. Procedure StartServer; override;
  80. Procedure StopServer; override;
  81. Function PeekMessage(TimeOut : Integer) : Boolean; override;
  82. Procedure ReadMessage ; override;
  83. Function GetInstanceID : String;override;
  84. Property FileName : String Read FFileName;
  85. Property Stream : TFileStream Read FStream;
  86. end;
  87. constructor TPipeServerComm.Create(AOWner: TSimpleIPCServer);
  88. Var
  89. D : String;
  90. begin
  91. inherited Create(AOWner);
  92. FFileName:=Owner.ServerID;
  93. If Not Owner.Global then
  94. FFileName:=FFileName+'-'+IntToStr(fpGetPID);
  95. D:='/tmp/'; // Change to something better later
  96. FFileName:=D+FFileName;
  97. end;
  98. procedure TPipeServerComm.StartServer;
  99. begin
  100. If not FileExists(FFileName) then
  101. If (fpmkFifo(FFileName,438)<>0) then
  102. Owner.DoError(SErrFailedToCreatePipe,[FFileName]);
  103. FStream:=TFileStream.Create(FFileName,fmOpenReadWrite);
  104. end;
  105. procedure TPipeServerComm.StopServer;
  106. begin
  107. FreeAndNil(FStream);
  108. if Not DeleteFile(FFileName) then
  109. Owner.DoError(SErrFailedtoRemovePipe,[FFileName]);
  110. end;
  111. function TPipeServerComm.PeekMessage(TimeOut: Integer): Boolean;
  112. Var
  113. FDS : TFDSet;
  114. begin
  115. fpfd_zero(FDS);
  116. fpfd_set(FStream.Handle,FDS);
  117. Result:=fpSelect(FStream.Handle+1,@FDS,Nil,Nil,TimeOut)>0;
  118. end;
  119. procedure TPipeServerComm.ReadMessage;
  120. Var
  121. L,P,Count : Integer;
  122. Hdr : TMsgHeader;
  123. begin
  124. FStream.ReadBuffer(Hdr,SizeOf(Hdr));
  125. Count:=Hdr.MsgLen;
  126. Owner.FMsgData.Seek(0,soFrombeginning);
  127. Owner.FMsgData.CopyFrom(FStream,Count);
  128. end;
  129. function TPipeServerComm.GetInstanceID: String;
  130. begin
  131. Result:=IntToStr(fpGetPID);
  132. end;
  133. { ---------------------------------------------------------------------
  134. Set TSimpleIPCClient / TSimpleIPCServer defaults.
  135. ---------------------------------------------------------------------}
  136. Function TSimpleIPCServer.CommClass : TIPCServerCommClass;
  137. begin
  138. if (DefaultIPCServerClass<>Nil) then
  139. Result:=DefaultIPCServerClass
  140. else
  141. Result:=TPipeServerComm;
  142. end;
  143. function TSimpleIPCClient.CommClass: TIPCClientCommClass;
  144. begin
  145. if (DefaultIPCClientClass<>Nil) then
  146. Result:=DefaultIPCClientClass
  147. else
  148. Result:=TPipeClientComm;
  149. end;