| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
- { $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: 10255: IdMessageCoder.pas
- {
- { Rev 1.2 8/10/04 1:26:58 PM RLebeau
- { Added FreeSourceStream property to TIdMessageDecoder
- }
- {
- { Rev 1.1 7/23/04 6:12:46 PM RLebeau
- { TFileStream access right tweak for Encode()
- }
- {
- { Rev 1.0 2002.11.12 10:45:56 PM czhower
- }
- unit IdMessageCoder;
- interface
- uses
- Classes,
- IdComponent, IdGlobal, IdMessage;
- type
- TIdMessageCoderPartType = (mcptUnknown, mcptText, mcptAttachment);
- TIdMessageDecoder = class(TIdComponent)
- protected
- FFilename: string;
- // Dont use TIdHeaderList for FHeaders - we dont know that they will all be like MIME.
- FFreeSourceStream: Boolean;
- FHeaders: TStrings;
- FPartType: TIdMessageCoderPartType;
- FSourceStream: TStream;
- public
- function ReadBody(ADestStream: TStream; var AMsgEnd: Boolean): TIdMessageDecoder; virtual; abstract;
- procedure ReadHeader; virtual;
- function ReadLn: string;
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- //
- property Filename: string read FFilename;
- property FreeSourceStream: Boolean read FFreeSourceStream write FFreeSourceStream;
- property SourceStream: TStream read FSourceStream write FSourceStream;
- property Headers: TStrings read FHeaders;
- property PartType: TIdMessageCoderPartType read FPartType;
- end;
- TIdMessageDecoderInfo = class(TObject)
- public
- function CheckForStart(ASender: TIdMessage; ALine: string): TIdMessageDecoder; virtual;
- abstract;
- constructor Create; virtual;
- end;
- TIdMessageDecoderList = class(TObject)
- protected
- FMessageCoders: TStringList;
- public
- class function ByName(const AName: string): TIdMessageDecoderInfo;
- class function CheckForStart(ASender: TIdMessage; const ALine: string): TIdMessageDecoder;
- constructor Create;
- destructor Destroy; override;
- class procedure RegisterDecoder(const AMessageCoderName: string;
- AMessageCoderInfo: TIdMessageDecoderInfo);
- end;
- TIdMessageEncoder = class(TIdComponent)
- protected
- FFilename: string;
- FPermissionCode: integer;
- public
- constructor Create(AOwner: TComponent); override;
- procedure Encode(const AFilename: string; ADest: TStream); overload;
- procedure Encode(ASrc: TStream; ADest: TStream); overload; virtual; abstract;
- published
- property Filename: string read FFilename write FFilename;
- property PermissionCode: integer read FPermissionCode write FPermissionCode;
- end;
- TIdMessageEncoderClass = class of TIdMessageEncoder;
- TIdMessageEncoderInfo = class(TObject)
- protected
- FMessageEncoderClass: TIdMessageEncoderClass;
- public
- constructor Create; virtual;
- procedure InitializeHeaders(AMsg: TIdMessage); virtual;
- //
- property MessageEncoderClass: TIdMessageEncoderClass read FMessageEncoderClass;
- end;
- TIdMessageEncoderList = class(TObject)
- protected
- FMessageCoders: TStringList;
- public
- class function ByName(const AName: string): TIdMessageEncoderInfo;
- constructor Create;
- destructor Destroy; override;
- class procedure RegisterEncoder(const AMessageEncoderName: string;
- AMessageEncoderInfo: TIdMessageEncoderInfo);
- end;
- implementation
- uses
- IdException, IdResourceStrings, IdStream,
- SysUtils;
- var
- GMessageDecoderList: TIdMessageDecoderList = nil;
- GMessageEncoderList: TIdMessageEncoderList = nil;
- { TIdMessageDecoderList }
- class function TIdMessageDecoderList.ByName(const AName: string): TIdMessageDecoderInfo;
- begin
- with GMessageDecoderList.FMessageCoders do begin
- Result := TIdMessageDecoderInfo(Objects[IndexOf(AName)]);
- end;
- if Result = nil then begin
- raise EIdException.Create(RSMessageDecoderNotFound + ': ' + AName); {Do not Localize}
- end;
- end;
- class function TIdMessageDecoderList.CheckForStart(ASender: TIdMessage; const ALine: string): TIdMessageDecoder;
- var
- i: integer;
- begin
- Result := nil;
- for i := 0 to GMessageDecoderList.FMessageCoders.Count - 1 do begin
- Result := TIdMessageDecoderInfo(GMessageDecoderList.FMessageCoders.Objects[i]).CheckForStart(ASender
- , ALine);
- if Result <> nil then begin
- Break;
- end;
- end;
- end;
- constructor TIdMessageDecoderList.Create;
- begin
- inherited;
- FMessageCoders := TStringList.Create;
- end;
- destructor TIdMessageDecoderList.Destroy;
- var
- i: integer;
- begin
- for i := 0 to FMessageCoders.Count - 1 do begin
- TIdMessageDecoderInfo(FMessageCoders.Objects[i]).Free;
- end;
- FreeAndNil(FMessageCoders);
- inherited;
- end;
- class procedure TIdMessageDecoderList.RegisterDecoder(const AMessageCoderName: string;
- AMessageCoderInfo: TIdMessageDecoderInfo);
- begin
- if GMessageDecoderList = nil then begin
- GMessageDecoderList := TIdMessageDecoderList.Create;
- end;
- GMessageDecoderList.FMessageCoders.AddObject(AMessageCoderName, AMessageCoderInfo);
- end;
- { TIdMessageDecoderInfo }
- constructor TIdMessageDecoderInfo.Create;
- begin
- //
- end;
- { TIdMessageDecoder }
- constructor TIdMessageDecoder.Create(AOwner: TComponent);
- begin
- inherited;
- FHeaders := TStringList.Create;
- FFreeSourceStream := True;
- end;
- destructor TIdMessageDecoder.Destroy;
- begin
- FreeAndNil(FHeaders);
- if FFreeSourceStream then begin
- FreeAndNil(FSourceStream);
- end else begin
- FSourceStream := nil;
- end;
- inherited;
- end;
- procedure TIdMessageDecoder.ReadHeader;
- begin
- end;
- function TIdMessageDecoder.ReadLn: string;
- begin
- Result := TIdStream(SourceStream).ReadLn;
- end;
- { TIdMessageEncoderInfo }
- constructor TIdMessageEncoderInfo.Create;
- begin
- //
- end;
- procedure TIdMessageEncoderInfo.InitializeHeaders(AMsg: TIdMessage);
- begin
- //
- end;
- { TIdMessageEncoderList }
- class function TIdMessageEncoderList.ByName(const AName: string): TIdMessageEncoderInfo;
- begin
- with GMessageEncoderList.FMessageCoders do begin
- Result := TIdMessageEncoderInfo(Objects[IndexOf(AName)]);
- end;
- if Result = nil then begin
- raise EIdException.Create(RSMessageEncoderNotFound + ': ' + AName); {Do not Localize}
- end;
- end;
- constructor TIdMessageEncoderList.Create;
- begin
- inherited;
- FMessageCoders := TStringList.Create;
- end;
- destructor TIdMessageEncoderList.Destroy;
- var
- i: integer;
- begin
- for i := 0 to FMessageCoders.Count - 1 do begin
- TIdMessageEncoderInfo(FMessageCoders.Objects[i]).Free;
- end;
- FreeAndNil(FMessageCoders);
- inherited;
- end;
- class procedure TIdMessageEncoderList.RegisterEncoder(const AMessageEncoderName: string;
- AMessageEncoderInfo: TIdMessageEncoderInfo);
- begin
- if GMessageEncoderList = nil then begin
- GMessageEncoderList := TIdMessageEncoderList.Create;
- end;
- GMessageEncoderList.FMessageCoders.AddObject(AMessageEncoderName, AMessageEncoderInfo);
- end;
- { TIdMessageEncoder }
- procedure TIdMessageEncoder.Encode(const AFilename: string; ADest: TStream);
- var
- LSrcStream: TFileStream;
- begin
- LSrcStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite); try
- Encode(LSrcStream, ADest);
- finally FreeAndNil(LSrcStream); end;
- end;
- constructor TIdMessageEncoder.Create(AOwner: TComponent);
- begin
- inherited;
- FPermissionCode := 660;
- end;
- initialization
- finalization
- FreeAndNil(GMessageDecoderList);
- FreeAndNil(GMessageEncoderList);
- end.
|