IdServerIOHandlerChain.pas 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. { $HDR$}
  2. {**********************************************************************}
  3. { Unit archived using Team Coherence }
  4. { Team Coherence is Copyright 2002 by Quality Software Components }
  5. { }
  6. { For further information / comments, visit our WEB site at }
  7. { http://www.TeamCoherence.com }
  8. {**********************************************************************}
  9. {}
  10. { $Log: 56078: IdServerIOHandlerChain.pas
  11. {
  12. Rev 1.2 6/11/2004 8:40:06 AM DSiders
  13. Added "Do not Localize" comments.
  14. }
  15. {
  16. { Rev 1.1 2004.02.09 9:16:50 PM czhower
  17. { Updated to compile and match lib changes.
  18. }
  19. {
  20. { Rev 1.0 2004.02.03 12:39:00 AM czhower
  21. { Move
  22. }
  23. {
  24. { Rev 1.6 2003.10.19 4:38:34 PM czhower
  25. { Updates
  26. }
  27. {
  28. { Rev 1.5 2003.10.19 2:51:10 PM czhower
  29. { Fiber cleanup
  30. }
  31. {
  32. { Rev 1.4 2003.10.14 11:17:10 PM czhower
  33. { Updates to match core changes.
  34. }
  35. {
  36. { Rev 1.3 2003.10.11 5:43:56 PM czhower
  37. { Chained servers now functional.
  38. }
  39. {
  40. { Rev 1.2 2003.09.19 10:09:42 PM czhower
  41. { Next stage of fiber support in servers.
  42. }
  43. {
  44. { Rev 1.1 2003.09.18 5:54:32 PM czhower
  45. { TIdYarnFix
  46. }
  47. {
  48. { Rev 1.0 8/16/2003 11:09:02 AM JPMugaas
  49. { Moved from Indy Core dir as part of package reorg
  50. }
  51. {
  52. Rev 1.6 7/6/2003 8:04:08 PM BGooijen
  53. Renamed IdScheduler* to IdSchedulerOf*
  54. }
  55. {
  56. { Rev 1.5 4/11/2003 01:09:54 PM JPMugaas
  57. }
  58. {
  59. Rev 1.4 3/29/2003 5:55:02 PM BGooijen
  60. now calls AfterAccept
  61. }
  62. {
  63. Rev 1.3 3/27/2003 12:51:30 PM BGooijen
  64. changed for IdSchedulerFiberBase
  65. }
  66. {
  67. Rev 1.2 3/25/2003 11:05:30 PM BGooijen
  68. The ChainEngine is now a property
  69. }
  70. {
  71. Rev 1.1 3/23/2003 11:30:26 PM BGooijen
  72. Moved a lot of code to IdSchedulerFiber, added MakeClientIOHandler
  73. }
  74. {
  75. Rev 1.0 3/13/2003 11:51:14 AM BGooijen
  76. Initial check in
  77. }
  78. unit IdServerIOHandlerChain;
  79. interface
  80. uses
  81. IdServerIOHandler, IdIOHandlerChain, IdYarn,
  82. IdSocketHandle, IdThread, IdIOHandler, IdScheduler, IdFiber,
  83. Classes;
  84. type
  85. TIdServerIOHandlerChain = class(TIdServerIOHandler)
  86. protected
  87. FChainEngine: TIdChainEngine;
  88. public
  89. function Accept(
  90. ASocket: TIdSocketHandle;
  91. AListenerThread: TIdThread;
  92. AYarn: TIdYarn
  93. ): TIdIOHandler;
  94. override;
  95. function MakeClientIOHandler(
  96. AYarn: TIdYarn
  97. ): TIdIOHandler;
  98. override;
  99. procedure SetScheduler(
  100. AScheduler: TIdScheduler
  101. ); override;
  102. published
  103. //TODO: Need to add notification for this prop
  104. property ChainEngine: TIdChainEngine read FChainEngine write FChainEngine;
  105. end;
  106. implementation
  107. uses
  108. IdGlobal, IdSchedulerOfFiber, IdException, IdFiberWeaver,
  109. SysUtils;
  110. procedure TIdServerIOHandlerChain.SetScheduler(
  111. AScheduler: TIdScheduler
  112. );
  113. begin
  114. if AScheduler <> nil then begin
  115. EIdException.IfFalse(AScheduler is TIdSchedulerOfFiber
  116. , 'Scheduler not a fiber scheduler'); {do not localize}
  117. end;
  118. FScheduler := AScheduler;
  119. end;
  120. function TIdServerIOHandlerChain.Accept(
  121. ASocket: TIdSocketHandle;
  122. AListenerThread: TIdThread;
  123. AYarn: TIdYarn
  124. ): TIdIOHandler;
  125. var
  126. LIOHandler: TIdIOHandlerChain;
  127. begin
  128. EIdException.IfNotAssigned(FChainEngine, 'No ChainEngine defined.'); {do not localize}
  129. LIOHandler := TIdIOHandlerChain.Create(nil, FChainEngine
  130. //TODO: Can remove this cast later
  131. , TIdFiberWeaver(TIdSchedulerOfFiber(FScheduler).FiberWeaver)
  132. , TIdYarnOfFiber(AYarn).Fiber);
  133. LIOHandler.Open;
  134. Result := nil;
  135. if AListenerThread <> nil then begin
  136. while not AListenerThread.Stopped do try
  137. if ASocket.Select(100) then begin // Wait for 100 ms
  138. if LIOHandler.Binding.Accept(ASocket.Handle) then begin
  139. LIOHandler.AfterAccept;
  140. Result := LIOHandler;
  141. Exit;
  142. end else begin
  143. FreeAndNil(LIOHandler);
  144. Exit;
  145. end;
  146. end;
  147. finally
  148. if AListenerThread.Stopped then begin
  149. FreeAndNil(LIOHandler);
  150. end;
  151. end;
  152. end else begin
  153. // Old way for compatibility
  154. if LIOHandler.Binding.Accept(ASocket.Handle) then begin
  155. Result := LIOHandler;
  156. Exit;
  157. end else begin
  158. FreeAndNil(LIOHandler);
  159. end;
  160. end;
  161. end;
  162. function TIdServerIOHandlerChain.MakeClientIOHandler(
  163. AYarn: TIdYarn
  164. ): TIdIOHandler;
  165. begin
  166. Result := TIdIOHandlerChain.Create(nil, FChainEngine
  167. //TODO: CAn remove this cast later.
  168. , TIdFiberWeaver(TIdSchedulerOfFiber(FScheduler).FiberWeaver)
  169. , TIdYarnOfFiber(AYarn).Fiber);
  170. end;
  171. end.