IdServerIOHandlerChain.pas 4.3 KB

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