restemplate/indy/Core/IdLogBase.pas

199 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.5 2004.02.03 4:17:14 PM czhower
For unit name changes.
Rev 1.4 2004.01.20 10:03:28 PM czhower
InitComponent
Rev 1.3 2003.10.17 6:15:54 PM czhower
Upgrades
Rev 1.2 2003.10.14 1:27:08 PM czhower
Uupdates + Intercept support
Rev 1.1 6/16/2003 10:39:02 AM EHill
Done: Expose Open/Close as public in TIdLogBase
Rev 1.0 11/13/2002 07:55:58 AM JPMugaas
}
unit IdLogBase;
interface
{$I IdCompilerDefines.inc}
//Put FPC into Delphi mode
uses
Classes,
IdIntercept, IdGlobal, IdSocketHandle, IdBaseComponent;
type
TIdLogBase = class(TIdConnectionIntercept)
protected
FActive: Boolean;
FLogTime: Boolean;
FReplaceCRLF: Boolean;
FStreamedActive: Boolean;
//
procedure InitComponent; override;
procedure LogStatus(const AText: string); virtual; abstract;
procedure LogReceivedData(const AText, AData: string); virtual; abstract;
procedure LogSentData(const AText, AData: string); virtual; abstract;
procedure SetActive(AValue: Boolean); virtual;
procedure Loaded; override;
function ReplaceCR(const AString : String) : String;
public
procedure Open; virtual;
procedure Close; virtual;
procedure Connect(AConnection: TComponent); override;
destructor Destroy; override;
procedure Disconnect; override;
procedure Receive(var ABuffer: TIdBytes); override;
procedure Send(var ABuffer: TIdBytes); override;
published
property Active: Boolean read FActive write SetActive default False;
property LogTime: Boolean read FLogTime write FLogTime default True;
property ReplaceCRLF: Boolean read FReplaceCRLF write FReplaceCRLF default true;
end;
implementation
uses
IdResourceStringsCore, SysUtils;
const
LOldStr : array [0..2] of string =
( EOL, CR, LF );
LNewStr : array [0..2] of string =
( RSLogEOL, RSLogCR, RSLogLF );
{ TIdLogBase }
procedure TIdLogBase.Close;
begin
end;
procedure TIdLogBase.Connect(AConnection: TComponent);
begin
inherited Connect(AConnection);
if FActive then begin
LogStatus(RSLogConnected);
end;
end;
destructor TIdLogBase.Destroy;
begin
Active := False;
inherited Destroy;
end;
procedure TIdLogBase.Disconnect;
begin
if FActive then begin
LogStatus(RSLogDisconnected);
end;
inherited Disconnect;
end;
procedure TIdLogBase.InitComponent;
begin
inherited InitComponent;
FLogTime := True;
ReplaceCRLF := True;
end;
procedure TIdLogBase.Loaded;
begin
inherited Loaded;
Active := FStreamedActive;
end;
procedure TIdLogBase.Open;
begin
end;
procedure TIdLogBase.Receive(var ABuffer: TIdBytes);
var
s: string;
LMsg: string;
begin
// let the next Intercept in the chain decode its data first
inherited Receive(ABuffer);
if FActive then begin
LMsg := '';
if LogTime then begin
LMsg := DateTimeToStr(Now);
end;
s := BytesToStringRaw(ABuffer);
if FReplaceCRLF then begin
s := ReplaceCR(S);
end;
LogReceivedData(LMsg, s);
end;
end;
function TIdLogBase.ReplaceCR(const AString: String): String;
begin
Result := StringsReplace(AString, LOldStr, LNewStr);
end;
procedure TIdLogBase.Send(var ABuffer: TIdBytes);
var
s: string;
LMsg: string;
begin
if FActive then begin
LMsg := '';
if LogTime then begin
LMsg := DateTimeToStr(Now);
end;
s := BytesToStringRaw(ABuffer);
if FReplaceCRLF then begin
s := ReplaceCR(S);
end;
LogSentData(LMsg, s);
end;
// let the next Intercept in the chain encode its data next
inherited Send(ABuffer);
end;
procedure TIdLogBase.SetActive(AValue: Boolean);
begin
if IsDesignTime or IsLoading then begin
FStreamedActive := AValue;
end
else if FActive <> AValue then
begin
FActive := AValue;
if FActive then begin
Open;
end else begin
Close;
end;
end;
end;
end.