| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- {
- $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.6 7/23/04 6:40:08 PM RLebeau
- Added extra exception handling to Connect()
- Rev 1.5 2004.05.20 11:39:10 AM czhower
- IdStreamVCL
- Rev 1.4 2004.02.03 4:17:18 PM czhower
- For unit name changes.
- Rev 1.3 10/19/2003 11:38:26 AM DSiders
- Added localization comments.
- Rev 1.2 2003.10.18 1:56:46 PM czhower
- Now uses ASCII instead of binary format.
- Rev 1.1 2003.10.17 6:16:20 PM czhower
- Functional complete.
- }
- unit IdInterceptSimLog;
- {
- This file uses string outputs instead of binary so that the results can be
- viewed and modified with notepad if necessary.
- Most times a Send/Receive includes a writeln, but may not always. We write out
- an additional EOL to guarantee separation in notepad.
- It also auto detects when an EOL can be used instead.
- TODO: Can also change it to detect several EOLs and non binary and use :Lines:x
- }
- interface
- {$i IdCompilerDefines.inc}
- uses
- Classes,
- IdGlobal, IdIntercept;
- type
- TIdInterceptSimLog = class(TIdConnectionIntercept)
- private
- protected
- FFilename: string;
- FStream: TStream;
- //
- procedure SetFilename(const AValue: string);
- procedure WriteRecord(const ATag: string; const ABuffer: TIdBytes);
- public
- procedure Connect(AConnection: TComponent); override;
- procedure Disconnect; override;
- procedure Receive(var ABuffer: TIdBytes); override;
- procedure Send(var ABuffer: TIdBytes); override;
- published
- property Filename: string read FFilename write SetFilename;
- end;
- implementation
- uses
- IdException, IdResourceStringsCore, SysUtils;
- { TIdInterceptSimLog }
- procedure TIdInterceptSimLog.Connect(AConnection: TComponent);
- begin
- inherited Connect(AConnection);
- // Warning! This will overwrite any existing file. It makes no sense
- // to concatenate sim logs.
- FStream := TIdFileCreateStream.Create(Filename);
- end;
- procedure TIdInterceptSimLog.Disconnect;
- begin
- FreeAndNil(FStream);
- inherited Disconnect;
- end;
- procedure TIdInterceptSimLog.Receive(var ABuffer: TIdBytes);
- begin
- // let the next Intercept in the chain decode its data first
- inherited Receive(ABuffer);
- WriteRecord('Recv', ABuffer); {do not localize}
- end;
- procedure TIdInterceptSimLog.Send(var ABuffer: TIdBytes);
- begin
- WriteRecord('Send', ABuffer); {do not localize}
- // let the next Intercept in the chain encode its data next
- inherited Send(ABuffer);
- end;
- procedure TIdInterceptSimLog.SetFilename(const AValue: string);
- begin
- if Assigned(FStream) then begin
- raise EIdException.Create(RSLogFileAlreadyOpen); // TODO: create a new Exception class for this
- end;
- FFilename := AValue;
- end;
- procedure TIdInterceptSimLog.WriteRecord(const ATag: string; const ABuffer: TIdBytes);
- var
- i: Integer;
- LUseEOL: Boolean;
- LSize: Integer;
- begin
- LUseEOL := False;
- LSize := Length(ABuffer);
- if LSize > 1 then begin
- if (ABuffer[LSize - 2] = 13) and (ABuffer[LSize - 1] = 10) then begin
- LUseEOL := True;
- for i := 0 to LSize - 3 do begin
- // If any binary, CR or LF
- if (ABuffer[i] < 32) or (ABuffer[i] > 127) then begin
- LUseEOL := False;
- Break;
- end;
- end;
- end;
- end;
- with FStream do begin
- if LUseEOL then begin
- WriteLn(ATag + ':EOL'); {do not localize}
- end else begin
- WriteLn(ATag + ':Bytes:' + IntToStr(LSize)); {do not localize}
- end;
- end;
- WriteStringToStream(FStream, '');
- WriteTIdBytesToStream(FStream, ABuffer, LSize);
- WriteStringToStream(FStream, EOL);
- end;
- end.
|