IdServerIOHandler.pas 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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.7 2003.10.11 5:49:56 PM czhower
  18. -VCL fixes for servers
  19. -Chain suport for servers (Super core)
  20. -Scheduler upgrades
  21. -Full yarn support
  22. Rev 1.6 2003.09.19 11:54:32 AM czhower
  23. -Completed more features necessary for servers
  24. -Fixed some bugs
  25. Rev 1.5 2003.09.18 4:10:28 PM czhower
  26. Preliminary changes for Yarn support.
  27. Rev 1.4 3/23/2003 11:26:08 PM BGooijen
  28. Added SetScheduler,MakeClientIOHandler
  29. Rev 1.3 3/13/2003 10:18:22 AM BGooijen
  30. Server side fibers, bug fixes
  31. Rev 1.2 1-17-2003 22:22:02 BGooijen
  32. new design
  33. Rev 1.1 1-1-2003 16:28:58 BGooijen
  34. Changed TIdThread to TIdYarn
  35. Rev 1.0 11/13/2002 08:46:16 AM JPMugaas
  36. }
  37. unit IdServerIOHandler;
  38. interface
  39. {$i IdCompilerDefines.inc}
  40. uses
  41. Classes,
  42. IdSocketHandle, IdComponent, IdIOHandlerStack,
  43. IdIOHandler, IdThread, IdScheduler, IdYarn;
  44. type
  45. TIdServerIOHandler = class(TIdComponent)
  46. protected
  47. {$IF DEFINED(HAS_UNSAFE_OBJECT_REF)}[Unsafe]
  48. {$ELSEIF DEFINED(HAS_WEAK_OBJECT_REF)}[Weak]
  49. {$IFEND} FScheduler: TIdScheduler;
  50. //
  51. {$IFDEF USE_OBJECT_REF_FREENOTIF}
  52. procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  53. {$ENDIF}
  54. public
  55. // This is a thread and not a yarn. Its the listener thread.
  56. function Accept(ASocket: TIdSocketHandle; AListenerThread: TIdThread; AYarn: TIdYarn ): TIdIOHandler; virtual;
  57. function MakeClientIOHandler(AYarn: TIdYarn): TIdIOHandler; virtual;
  58. // Init is called when the server goes active
  59. procedure Init; virtual;
  60. procedure Shutdown; virtual;
  61. // SetScheduler is called by the user (normally TCPServer) automatically
  62. procedure SetScheduler(AScheduler: TIdScheduler); virtual;
  63. //
  64. property Scheduler: TIdScheduler read FScheduler: write SetScheduler;
  65. end;
  66. implementation
  67. procedure TIdServerIOHandler.Init;
  68. begin
  69. end;
  70. function TIdServerIOHandler.Accept(ASocket: TIdSocketHandle; AListenerThread: TIdThread;
  71. AYarn: TIdYarn): TIdIOHandler;
  72. begin
  73. Result := nil;
  74. end;
  75. function TIdServerIOHandler.MakeClientIOHandler(AYarn: TIdYarn): TIdIOHandler;
  76. begin
  77. Result := nil;
  78. end;
  79. // under ARC, all weak references to a freed object get nil'ed automatically
  80. {$IFDEF USE_OBJECT_REF_FREENOTIF}
  81. procedure TIdServerIOHandler.Notification(AComponent: TComponent; Operation: TOperation);
  82. begin
  83. // Remove the reference to the linked Scheduler if it is deleted
  84. if (Operation = opRemove) and (AComponent = FScheduler) then begin
  85. FScheduler := nil;
  86. end;
  87. inherited Notification(AComponent, Operation);
  88. end;
  89. {$ENDIF}
  90. // RLebeau: not IFDEF'ing the entire method since it is virtual and could be
  91. // overridden in user code...
  92. procedure TIdServerIOHandler.SetScheduler(AScheduler: TIdScheduler);
  93. begin
  94. {$IFDEF USE_OBJECT_REF_FREENOTIF}
  95. if FScheduler <> AScheduler then begin
  96. // Remove self from the Scheduler's notification list
  97. if Assigned(FScheduler) then begin
  98. FScheduler.RemoveFreeNotification(Self);
  99. end;
  100. FScheduler := AScheduler;
  101. // Add self to the Scheduler's notification list
  102. if Assigned(FScheduler) then begin
  103. FScheduler.FreeNotification(Self);
  104. end;
  105. end;
  106. {$ELSE}
  107. // under ARC, all weak references to a freed object get nil'ed automatically
  108. FScheduler := AScheduler;
  109. {$ENDIF}
  110. end;
  111. procedure TIdServerIOHandler.Shutdown;
  112. begin
  113. end;
  114. end.