
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5438 8e941d3f-bd1b-0410-a28a-d453659cc2b4
283 lines
8.0 KiB
ObjectPascal
283 lines
8.0 KiB
ObjectPascal
{ Notes:
|
|
The purpose of this unit is to allow a server command
|
|
handler to register itself with a server engine.
|
|
We couldn't embed this functionality into TfFServerEngine
|
|
and TffServerCommandHandler because they are declared in separate
|
|
units. }
|
|
|
|
{*********************************************************}
|
|
{* FlashFiler: Server intermediate classes *}
|
|
{*********************************************************}
|
|
|
|
(* ***** BEGIN LICENSE BLOCK *****
|
|
* Version: MPL 1.1
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
* http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
* for the specific language governing rights and limitations under the
|
|
* License.
|
|
*
|
|
* The Original Code is TurboPower FlashFiler
|
|
*
|
|
* The Initial Developer of the Original Code is
|
|
* TurboPower Software
|
|
*
|
|
* Portions created by the Initial Developer are Copyright (C) 1996-2002
|
|
* the Initial Developer. All Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
*
|
|
* ***** END LICENSE BLOCK ***** *)
|
|
|
|
{$I ffdefine.inc}
|
|
|
|
unit ffsrintm;
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes,
|
|
ffllbase,
|
|
ffllcomm,
|
|
ffllcomp,
|
|
fflleng,
|
|
fflllgcy;
|
|
|
|
type
|
|
|
|
TffIntermediateCommandHandler = class; { forward declaration }
|
|
|
|
TffIntermediateServerEngine = class(TffBaseServerEngine)
|
|
protected
|
|
FCmdHandlers : TffThreadList;
|
|
|
|
function iseGetCmdHandler(aInx : Longint) : TffIntermediateCommandHandler;
|
|
|
|
function iseGetCmdHandlerCount : Longint;
|
|
|
|
procedure scSetState(const aState : TffState); override;
|
|
|
|
public
|
|
|
|
constructor Create(aOwner : TComponent); override;
|
|
|
|
destructor Destroy; override;
|
|
|
|
procedure FFAddDependent(ADependent : TffComponent); override; {!!.11}
|
|
procedure FFRemoveDependent(ADependent : TffComponent); override; {!!.11}
|
|
|
|
property CmdHandler[aInx : Longint] : TffIntermediateCommandHandler
|
|
read iseGetCmdHandler;
|
|
|
|
property CmdHandlerCount : Longint read iseGetCmdHandlerCount;
|
|
|
|
end;
|
|
|
|
|
|
TffIntermediateCommandHandler = class(TffBaseCommandHandler)
|
|
protected
|
|
|
|
FServerEngine : TffIntermediateServerEngine;
|
|
|
|
procedure ichLog(const aMsg : string); virtual;
|
|
{-Use this method to log a string to the event log. }
|
|
|
|
procedure ichLogFmt(const aMsg : string; args : array of const); virtual;
|
|
{-Use this method to log a formatted string to the event log. }
|
|
|
|
procedure ichLogAll(const Msgs : array of string); virtual;
|
|
{-Use this method to log multiple strings to the event log. }
|
|
|
|
procedure ichLogBlock(const S : string; Buf : pointer;
|
|
BufLen : TffMemSize); virtual;
|
|
|
|
procedure ichSetServerEngine(anEngine : TffIntermediateServerEngine); virtual;
|
|
{-Sets the server engine to be used by this command handler. }
|
|
|
|
public
|
|
|
|
constructor Create(aOwner : TComponent); override;
|
|
|
|
destructor Destroy; override;
|
|
|
|
procedure FFNotificationEx(const AOp : Byte; AFrom : TffComponent; {!!.11}
|
|
const AData : TffWord32); override; {!!.11}
|
|
|
|
published
|
|
|
|
property ServerEngine : TffIntermediateServerEngine read FServerEngine
|
|
write ichSetServerEngine;
|
|
{ The server engine handling requests received by this command handler. }
|
|
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
SysUtils;
|
|
|
|
{===TffIntermediateServerEngine===========================================}
|
|
constructor TffIntermediateServerEngine.Create(aOwner : TComponent);
|
|
begin
|
|
inherited Create(aOwner);
|
|
FCmdHandlers := TffThreadList.Create;
|
|
end;
|
|
{--------}
|
|
destructor TffIntermediateServerEngine.Destroy;
|
|
{Rewritten !!.11}
|
|
begin
|
|
FFNotifyDependents(ffn_Destroy);
|
|
FCmdHandlers.Free;
|
|
inherited Destroy;
|
|
end;
|
|
{Begin !!.11}
|
|
{--------}
|
|
procedure TffIntermediateServerEngine.FFAddDependent(ADependent : TffComponent);
|
|
var
|
|
aListItem : TffIntListItem;
|
|
begin
|
|
inherited;
|
|
if ADependent is TffIntermediateCommandHandler then begin
|
|
aListItem := TffIntListItem.Create(LongInt(ADependent));
|
|
with FCmdHandlers.BeginWrite do
|
|
try
|
|
Insert(aListItem);
|
|
finally
|
|
EndWrite;
|
|
end;
|
|
end;
|
|
end;
|
|
{--------}
|
|
procedure TffIntermediateServerEngine.FFRemoveDependent(ADependent : TffComponent);
|
|
begin
|
|
inherited;
|
|
if ADependent is TffIntermediateCommandHandler then
|
|
with FCmdHandlers.BeginWrite do
|
|
try
|
|
Delete(LongInt(ADependent));
|
|
finally
|
|
EndWrite;
|
|
end;
|
|
end;
|
|
{End !!.11}
|
|
{--------}
|
|
function TffIntermediateServerEngine.iseGetCmdHandler(aInx: Integer) : TffIntermediateCommandHandler;
|
|
begin
|
|
Result := TffIntermediateCommandHandler(TffIntListItem(FCmdHandlers[aInx]).KeyAsInt);
|
|
end;
|
|
{--------}
|
|
function TffIntermediateServerEngine.iseGetCmdHandlerCount: Longint;
|
|
begin
|
|
Result := FCmdHandlers.Count;
|
|
end;
|
|
{--------}
|
|
procedure TffIntermediateServerEngine.scSetState(const aState : TffState);
|
|
var
|
|
Idx : longInt;
|
|
NextState : TffState;
|
|
Handler : TffBaseCommandHandler;
|
|
begin
|
|
if aState = State then exit;
|
|
|
|
if Assigned(FCmdHandlers) then
|
|
with FCmdHandlers.BeginRead do
|
|
try
|
|
while State <> aState do begin
|
|
{ Based upon our current state & the target state, get the next state. }
|
|
NextState := ffStateDiagram[State, aState];
|
|
|
|
{ Move all command handlers to the specified state. }
|
|
for Idx := Pred(Count) downto 0 do begin
|
|
Handler := TffBaseCommandHandler(TffIntListItem(Items[Idx]).KeyAsInt);
|
|
Handler.State := NextState;
|
|
end;
|
|
|
|
{For each step, call the inherited SetState method. The inherited
|
|
method is responsible for calling the state methods for the
|
|
engine}
|
|
inherited scSetState(NextState);
|
|
end;
|
|
finally
|
|
EndRead;
|
|
end;
|
|
end;
|
|
|
|
{=========================================================================}
|
|
|
|
{===TffIntermediateCommandHandler=========================================}
|
|
constructor TffIntermediateCommandHandler.Create(aOwner : TComponent);
|
|
begin
|
|
inherited Create(aOwner);
|
|
FServerEngine := nil;
|
|
end;
|
|
{--------}
|
|
destructor TffIntermediateCommandHandler.Destroy;
|
|
begin
|
|
if assigned(FServerEngine) then
|
|
FServerEngine.FFRemoveDependent(Self);
|
|
|
|
inherited Destroy;
|
|
end;
|
|
{--------}
|
|
procedure TffIntermediateCommandHandler.ichLog(const aMsg : string);
|
|
begin
|
|
if FLogEnabled and assigned(FEventLog) then
|
|
FEventLog.WriteString(aMsg);
|
|
end;
|
|
{--------}
|
|
procedure TffIntermediateCommandHandler.ichLogAll(const Msgs : array of string);
|
|
begin
|
|
if FLogEnabled and assigned(FEventLog) then
|
|
FEventLog.WriteStrings(Msgs);
|
|
end;
|
|
{--------}
|
|
procedure TffIntermediateCommandHandler.ichLogBlock(const S : string; Buf : pointer;
|
|
BufLen : TffMemSize);
|
|
begin
|
|
if FLogEnabled and assigned(FEventLog) then
|
|
FEventLog.WriteBlock(S, Buf, BufLen);
|
|
end;
|
|
{--------}
|
|
procedure TffIntermediateCommandHandler.ichLogFmt(const aMsg : string; args : array of const);
|
|
begin
|
|
if FLogEnabled and assigned(FEventLog) then
|
|
FEventLog.WriteString(format(aMsg, args));
|
|
end;
|
|
{--------}
|
|
procedure TffIntermediateCommandHandler.ichSetServerEngine(anEngine : TffIntermediateServerEngine);
|
|
begin
|
|
if FServerEngine = anEngine then Exit;
|
|
|
|
scCheckInactive;
|
|
|
|
if assigned(FServerEngine) then
|
|
FServerEngine.FFRemoveDependent(Self); {!!.11}
|
|
|
|
if assigned(anEngine) then
|
|
anEngine.FFAddDependent(Self); {!!.11}
|
|
|
|
FServerEngine := anEngine;
|
|
|
|
end;
|
|
{--------}
|
|
{Rewritten !!.11}
|
|
procedure TffIntermediateCommandHandler.FFNotificationEx
|
|
(const AOp : Byte; AFrom : TffComponent;
|
|
const AData : TffWord32);
|
|
begin
|
|
inherited;
|
|
if (AFrom = FServerEngine) and
|
|
(AOp in [ffn_Destroy, ffn_Remove]) then begin
|
|
State := ffesStopped;
|
|
FServerEngine.FFRemoveDependent(Self);
|
|
FServerEngine := nil;
|
|
end;
|
|
end;
|
|
{=========================================================================}
|
|
end.
|