www.pudn.com > indy10.0.52_source.rar > IdContext.pas
{ $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: 15128: IdContext.pas
{
{ Rev 1.14 6/16/2004 2:08:48 PM JPMugaas
{ Binding made public for the FTP Server.
}
{
Rev 1.13 6/4/2004 1:34:24 PM DSiders
Removed unused TIdContextDoRun, TIdContextMethod types.
}
{
{ Rev 1.12 2004.02.03 4:17:08 PM czhower
{ For unit name changes.
}
{
{ Rev 1.11 21.1.2004 ã. 12:31:04 DBondzhev
{ Fix for Indy source. Workaround for dccil bug
{ now it can be compiled using Compile instead of build
}
{
{ Rev 1.10 2003.10.21 12:18:58 AM czhower
{ TIdTask support and fiber bug fixes.
}
{
{ Rev 1.9 2003.10.11 5:47:18 PM czhower
{ -VCL fixes for servers
{ -Chain suport for servers (Super core)
{ -Scheduler upgrades
{ -Full yarn support
}
{
{ Rev 1.8 2003.09.19 11:54:28 AM czhower
{ -Completed more features necessary for servers
{ -Fixed some bugs
}
{
{ Rev 1.7 3/22/2003 09:45:26 PM JPMugaas
{ Now should compile under D4.
}
{
Rev 1.6 3/13/2003 10:18:38 AM BGooijen
Server side fibers, bug fixes
}
{
Rev 1.5 1/31/2003 7:24:18 PM BGooijen
Added a .Binding function
}
{
Rev 1.4 1/23/2003 8:33:20 PM BGooijen
}
{
Rev 1.3 1/23/2003 11:06:06 AM BGooijen
}
{
{ Rev 1.2 1-17-2003 23:58:30 BGooijen
{ removed OnCreate/OnDestroy again, they had no use
}
{
{ Rev 1.0 1-17-2003 22:28:58 BGooijen
}
unit IdContext;
interface
uses
Classes,
IdSocketHandle, IdTCPConnection, IdTask, IdYarn;
type
TIdContext = class;
TIdContextClass = class of TIdContext;
TIdContextRun = function (AContext: TIdContext): Boolean of object;
TIdContextBeforeRun = procedure (AContext: TIdContext) of object;
TIdContextAfterRun = procedure (AContext: TIdContext) of object;
TIdContext = class(TIdTask)
protected
// A list in which this context is registered, this can be nil, and should
// therefore not be used
FContextList: TThreadList;
FConnection: TIdTCPConnection;
FOnRun: TIdContextRun;
FOnBeforeRun: TIdContextBeforeRun;
FOnAfterRun: TIdContextAfterRun;
//
procedure AfterRun; override;
procedure BeforeRun; override;
function Run: Boolean; override;
public
constructor Create(
AConnection: TIdTCPConnection;
AYarn: TIdYarn;
AList: TThreadList = nil
); reintroduce; virtual;
destructor Destroy; override;
procedure RemoveFromList;
function Binding: TIdSocketHandle;
//
property Connection: TIdTCPConnection read FConnection;
//
property OnAfterRun:TIdContextAfterRun read FOnAfterRun
write FOnAfterRun;
property OnBeforeRun:TIdContextBeforeRun read FOnBeforeRun
write FOnBeforeRun;
property OnRun:TIdContextRun read FOnRun write FOnRun;
end;
implementation
{ TIdContext }
uses
IdGlobal,
IdIOHandlerSocket,
SysUtils;
constructor TIdContext.Create(
AConnection: TIdTCPConnection;
AYarn: TIdYarn;
AList: TThreadList = nil
);
begin
inherited Create(AYarn);
FConnection := AConnection;
FContextList := AList;
if FContextList <> nil then begin
FContextList.Add(Self);
end;
end;
destructor TIdContext.Destroy;
begin
if FContextList <> nil then begin
FContextList.Remove(Self);
end;
FreeAndNil(FConnection);
inherited Destroy;
end;
procedure TIdContext.RemoveFromList;
begin
FContextList := nil;
end;
procedure TIdContext.BeforeRun;
begin
if Assigned(OnBeforeRun) then begin
OnBeforeRun(Self);
end;
end;
function TIdContext.Run: Boolean;
begin
if Assigned(OnRun) then begin
Result := OnRun(Self);
end else begin
Result := True;
end;
end;
procedure TIdContext.AfterRun;
begin
if Assigned(OnAfterRun) then begin
OnAfterRun(Self);
end;
end;
function TIdContext.Binding: TIdSocketHandle;
begin
Result := nil;
if Connection <> nil then begin
if Connection.Socket <> nil then begin
Result := Connection.Socket.Binding;
end;
end;
end;
end.