lazarus-ccr/components/flashfiler/sourcelaz/ffsrIntm.pas
2016-12-07 13:31:59 +00:00

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.