restemplate/indy/SuperCore/IdServerIOHandlerChain.pas

174 lines
4.3 KiB
Plaintext

{
$Project$
$Workfile$
$Revision$
$DateUTC$
$Id$
This file is part of the Indy (Internet Direct) project, and is offered
under the dual-licensing agreement described on the Indy website.
(http://www.indyproject.org/)
Copyright:
(c) 1993-2005, Chad Z. Hower and the Indy Pit Crew. All rights reserved.
}
{
$Log$
}
{
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.