| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- { $HDR$}
- {**********************************************************************}
- { Unit archived using Team Coherence }
- { Team Coherence is Copyright 2002 by Quality Software Components }
- { }
- { For further information / comments, visit our WEB site at }
- { http://www.TeamCoherence.com }
- {**********************************************************************}
- {}
- { $Log: 56078: IdServerIOHandlerChain.pas
- {
- Rev 1.2 6/11/2004 8:40:06 AM DSiders
- Added "Do not Localize" comments.
- }
- {
- { Rev 1.1 2004.02.09 9:16:50 PM czhower
- { Updated to compile and match lib changes.
- }
- {
- { Rev 1.0 2004.02.03 12:39:00 AM czhower
- { Move
- }
- {
- { Rev 1.6 2003.10.19 4:38:34 PM czhower
- { Updates
- }
- {
- { Rev 1.5 2003.10.19 2:51:10 PM czhower
- { Fiber cleanup
- }
- {
- { Rev 1.4 2003.10.14 11:17:10 PM czhower
- { Updates to match core changes.
- }
- {
- { Rev 1.3 2003.10.11 5:43:56 PM czhower
- { Chained servers now functional.
- }
- {
- { Rev 1.2 2003.09.19 10:09:42 PM czhower
- { Next stage of fiber support in servers.
- }
- {
- { Rev 1.1 2003.09.18 5:54:32 PM czhower
- { TIdYarnFix
- }
- {
- { Rev 1.0 8/16/2003 11:09:02 AM JPMugaas
- { Moved from Indy Core dir as part of package reorg
- }
- {
- Rev 1.6 7/6/2003 8:04:08 PM BGooijen
- Renamed IdScheduler* to IdSchedulerOf*
- }
- {
- { Rev 1.5 4/11/2003 01:09:54 PM JPMugaas
- }
- {
- Rev 1.4 3/29/2003 5:55:02 PM BGooijen
- now calls AfterAccept
- }
- {
- Rev 1.3 3/27/2003 12:51:30 PM BGooijen
- changed for IdSchedulerFiberBase
- }
- {
- Rev 1.2 3/25/2003 11:05:30 PM BGooijen
- The ChainEngine is now a property
- }
- {
- Rev 1.1 3/23/2003 11:30:26 PM BGooijen
- Moved a lot of code to IdSchedulerFiber, added MakeClientIOHandler
- }
- {
- Rev 1.0 3/13/2003 11:51:14 AM BGooijen
- Initial check in
- }
- unit IdServerIOHandlerChain;
- interface
- uses
- IdServerIOHandler, IdIOHandlerChain, IdYarn,
- IdSocketHandle, IdThread, IdIOHandler, IdScheduler, IdFiber,
- Classes;
- type
- TIdServerIOHandlerChain = class(TIdServerIOHandler)
- protected
- FChainEngine: TIdChainEngine;
- public
- function Accept(
- ASocket: TIdSocketHandle;
- AListenerThread: TIdThread;
- AYarn: TIdYarn
- ): TIdIOHandler;
- override;
- function MakeClientIOHandler(
- AYarn: TIdYarn
- ): TIdIOHandler;
- override;
- procedure SetScheduler(
- AScheduler: TIdScheduler
- ); override;
- published
- //TODO: Need to add notification for this prop
- property ChainEngine: TIdChainEngine read FChainEngine write FChainEngine;
- end;
- implementation
- uses
- IdGlobal, IdSchedulerOfFiber, IdException, IdFiberWeaver,
- SysUtils;
- procedure TIdServerIOHandlerChain.SetScheduler(
- AScheduler: TIdScheduler
- );
- begin
- if AScheduler <> nil then begin
- EIdException.IfFalse(AScheduler is TIdSchedulerOfFiber
- , 'Scheduler not a fiber scheduler'); {do not localize}
- end;
- FScheduler := AScheduler;
- end;
- function TIdServerIOHandlerChain.Accept(
- ASocket: TIdSocketHandle;
- AListenerThread: TIdThread;
- AYarn: TIdYarn
- ): TIdIOHandler;
- var
- LIOHandler: TIdIOHandlerChain;
- begin
- EIdException.IfNotAssigned(FChainEngine, 'No ChainEngine defined.'); {do not localize}
- LIOHandler := TIdIOHandlerChain.Create(nil, FChainEngine
- //TODO: Can remove this cast later
- , TIdFiberWeaver(TIdSchedulerOfFiber(FScheduler).FiberWeaver)
- , TIdYarnOfFiber(AYarn).Fiber);
- LIOHandler.Open;
- Result := nil;
- if AListenerThread <> nil then begin
- while not AListenerThread.Stopped do try
- if ASocket.Select(100) then begin // Wait for 100 ms
- if LIOHandler.Binding.Accept(ASocket.Handle) then begin
- LIOHandler.AfterAccept;
- Result := LIOHandler;
- Exit;
- end else begin
- FreeAndNil(LIOHandler);
- Exit;
- end;
- end;
- finally
- if AListenerThread.Stopped then begin
- FreeAndNil(LIOHandler);
- end;
- end;
- end else begin
- // Old way for compatibility
- if LIOHandler.Binding.Accept(ASocket.Handle) then begin
- Result := LIOHandler;
- Exit;
- end else begin
- FreeAndNil(LIOHandler);
- end;
- end;
- end;
- function TIdServerIOHandlerChain.MakeClientIOHandler(
- AYarn: TIdYarn
- ): TIdIOHandler;
- begin
- Result := TIdIOHandlerChain.Create(nil, FChainEngine
- //TODO: CAn remove this cast later.
- , TIdFiberWeaver(TIdSchedulerOfFiber(FScheduler).FiberWeaver)
- , TIdYarnOfFiber(AYarn).Fiber);
- end;
- end.
|