174 lines
4.3 KiB
Plaintext
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.
|
||
|
|