IdMessageCoder.pas 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. { $HDR$}
  2. {**********************************************************************}
  3. { Unit archived using Team Coherence }
  4. { Team Coherence is Copyright 2002 by Quality Software Components }
  5. { }
  6. { For further information / comments, visit our WEB site at }
  7. { http://www.TeamCoherence.com }
  8. {**********************************************************************}
  9. {}
  10. { $Log: 10255: IdMessageCoder.pas
  11. {
  12. { Rev 1.2 8/10/04 1:26:58 PM RLebeau
  13. { Added FreeSourceStream property to TIdMessageDecoder
  14. }
  15. {
  16. { Rev 1.1 7/23/04 6:12:46 PM RLebeau
  17. { TFileStream access right tweak for Encode()
  18. }
  19. {
  20. { Rev 1.0 2002.11.12 10:45:56 PM czhower
  21. }
  22. unit IdMessageCoder;
  23. interface
  24. uses
  25. Classes,
  26. IdComponent, IdGlobal, IdMessage;
  27. type
  28. TIdMessageCoderPartType = (mcptUnknown, mcptText, mcptAttachment);
  29. TIdMessageDecoder = class(TIdComponent)
  30. protected
  31. FFilename: string;
  32. // Dont use TIdHeaderList for FHeaders - we dont know that they will all be like MIME.
  33. FFreeSourceStream: Boolean;
  34. FHeaders: TStrings;
  35. FPartType: TIdMessageCoderPartType;
  36. FSourceStream: TStream;
  37. public
  38. function ReadBody(ADestStream: TStream; var AMsgEnd: Boolean): TIdMessageDecoder; virtual; abstract;
  39. procedure ReadHeader; virtual;
  40. function ReadLn: string;
  41. constructor Create(AOwner: TComponent); override;
  42. destructor Destroy; override;
  43. //
  44. property Filename: string read FFilename;
  45. property FreeSourceStream: Boolean read FFreeSourceStream write FFreeSourceStream;
  46. property SourceStream: TStream read FSourceStream write FSourceStream;
  47. property Headers: TStrings read FHeaders;
  48. property PartType: TIdMessageCoderPartType read FPartType;
  49. end;
  50. TIdMessageDecoderInfo = class(TObject)
  51. public
  52. function CheckForStart(ASender: TIdMessage; ALine: string): TIdMessageDecoder; virtual;
  53. abstract;
  54. constructor Create; virtual;
  55. end;
  56. TIdMessageDecoderList = class(TObject)
  57. protected
  58. FMessageCoders: TStringList;
  59. public
  60. class function ByName(const AName: string): TIdMessageDecoderInfo;
  61. class function CheckForStart(ASender: TIdMessage; const ALine: string): TIdMessageDecoder;
  62. constructor Create;
  63. destructor Destroy; override;
  64. class procedure RegisterDecoder(const AMessageCoderName: string;
  65. AMessageCoderInfo: TIdMessageDecoderInfo);
  66. end;
  67. TIdMessageEncoder = class(TIdComponent)
  68. protected
  69. FFilename: string;
  70. FPermissionCode: integer;
  71. public
  72. constructor Create(AOwner: TComponent); override;
  73. procedure Encode(const AFilename: string; ADest: TStream); overload;
  74. procedure Encode(ASrc: TStream; ADest: TStream); overload; virtual; abstract;
  75. published
  76. property Filename: string read FFilename write FFilename;
  77. property PermissionCode: integer read FPermissionCode write FPermissionCode;
  78. end;
  79. TIdMessageEncoderClass = class of TIdMessageEncoder;
  80. TIdMessageEncoderInfo = class(TObject)
  81. protected
  82. FMessageEncoderClass: TIdMessageEncoderClass;
  83. public
  84. constructor Create; virtual;
  85. procedure InitializeHeaders(AMsg: TIdMessage); virtual;
  86. //
  87. property MessageEncoderClass: TIdMessageEncoderClass read FMessageEncoderClass;
  88. end;
  89. TIdMessageEncoderList = class(TObject)
  90. protected
  91. FMessageCoders: TStringList;
  92. public
  93. class function ByName(const AName: string): TIdMessageEncoderInfo;
  94. constructor Create;
  95. destructor Destroy; override;
  96. class procedure RegisterEncoder(const AMessageEncoderName: string;
  97. AMessageEncoderInfo: TIdMessageEncoderInfo);
  98. end;
  99. implementation
  100. uses
  101. IdException, IdResourceStrings, IdStream,
  102. SysUtils;
  103. var
  104. GMessageDecoderList: TIdMessageDecoderList = nil;
  105. GMessageEncoderList: TIdMessageEncoderList = nil;
  106. { TIdMessageDecoderList }
  107. class function TIdMessageDecoderList.ByName(const AName: string): TIdMessageDecoderInfo;
  108. begin
  109. with GMessageDecoderList.FMessageCoders do begin
  110. Result := TIdMessageDecoderInfo(Objects[IndexOf(AName)]);
  111. end;
  112. if Result = nil then begin
  113. raise EIdException.Create(RSMessageDecoderNotFound + ': ' + AName); {Do not Localize}
  114. end;
  115. end;
  116. class function TIdMessageDecoderList.CheckForStart(ASender: TIdMessage; const ALine: string): TIdMessageDecoder;
  117. var
  118. i: integer;
  119. begin
  120. Result := nil;
  121. for i := 0 to GMessageDecoderList.FMessageCoders.Count - 1 do begin
  122. Result := TIdMessageDecoderInfo(GMessageDecoderList.FMessageCoders.Objects[i]).CheckForStart(ASender
  123. , ALine);
  124. if Result <> nil then begin
  125. Break;
  126. end;
  127. end;
  128. end;
  129. constructor TIdMessageDecoderList.Create;
  130. begin
  131. inherited;
  132. FMessageCoders := TStringList.Create;
  133. end;
  134. destructor TIdMessageDecoderList.Destroy;
  135. var
  136. i: integer;
  137. begin
  138. for i := 0 to FMessageCoders.Count - 1 do begin
  139. TIdMessageDecoderInfo(FMessageCoders.Objects[i]).Free;
  140. end;
  141. FreeAndNil(FMessageCoders);
  142. inherited;
  143. end;
  144. class procedure TIdMessageDecoderList.RegisterDecoder(const AMessageCoderName: string;
  145. AMessageCoderInfo: TIdMessageDecoderInfo);
  146. begin
  147. if GMessageDecoderList = nil then begin
  148. GMessageDecoderList := TIdMessageDecoderList.Create;
  149. end;
  150. GMessageDecoderList.FMessageCoders.AddObject(AMessageCoderName, AMessageCoderInfo);
  151. end;
  152. { TIdMessageDecoderInfo }
  153. constructor TIdMessageDecoderInfo.Create;
  154. begin
  155. //
  156. end;
  157. { TIdMessageDecoder }
  158. constructor TIdMessageDecoder.Create(AOwner: TComponent);
  159. begin
  160. inherited;
  161. FHeaders := TStringList.Create;
  162. FFreeSourceStream := True;
  163. end;
  164. destructor TIdMessageDecoder.Destroy;
  165. begin
  166. FreeAndNil(FHeaders);
  167. if FFreeSourceStream then begin
  168. FreeAndNil(FSourceStream);
  169. end else begin
  170. FSourceStream := nil;
  171. end;
  172. inherited;
  173. end;
  174. procedure TIdMessageDecoder.ReadHeader;
  175. begin
  176. end;
  177. function TIdMessageDecoder.ReadLn: string;
  178. begin
  179. Result := TIdStream(SourceStream).ReadLn;
  180. end;
  181. { TIdMessageEncoderInfo }
  182. constructor TIdMessageEncoderInfo.Create;
  183. begin
  184. //
  185. end;
  186. procedure TIdMessageEncoderInfo.InitializeHeaders(AMsg: TIdMessage);
  187. begin
  188. //
  189. end;
  190. { TIdMessageEncoderList }
  191. class function TIdMessageEncoderList.ByName(const AName: string): TIdMessageEncoderInfo;
  192. begin
  193. with GMessageEncoderList.FMessageCoders do begin
  194. Result := TIdMessageEncoderInfo(Objects[IndexOf(AName)]);
  195. end;
  196. if Result = nil then begin
  197. raise EIdException.Create(RSMessageEncoderNotFound + ': ' + AName); {Do not Localize}
  198. end;
  199. end;
  200. constructor TIdMessageEncoderList.Create;
  201. begin
  202. inherited;
  203. FMessageCoders := TStringList.Create;
  204. end;
  205. destructor TIdMessageEncoderList.Destroy;
  206. var
  207. i: integer;
  208. begin
  209. for i := 0 to FMessageCoders.Count - 1 do begin
  210. TIdMessageEncoderInfo(FMessageCoders.Objects[i]).Free;
  211. end;
  212. FreeAndNil(FMessageCoders);
  213. inherited;
  214. end;
  215. class procedure TIdMessageEncoderList.RegisterEncoder(const AMessageEncoderName: string;
  216. AMessageEncoderInfo: TIdMessageEncoderInfo);
  217. begin
  218. if GMessageEncoderList = nil then begin
  219. GMessageEncoderList := TIdMessageEncoderList.Create;
  220. end;
  221. GMessageEncoderList.FMessageCoders.AddObject(AMessageEncoderName, AMessageEncoderInfo);
  222. end;
  223. { TIdMessageEncoder }
  224. procedure TIdMessageEncoder.Encode(const AFilename: string; ADest: TStream);
  225. var
  226. LSrcStream: TFileStream;
  227. begin
  228. LSrcStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite); try
  229. Encode(LSrcStream, ADest);
  230. finally FreeAndNil(LSrcStream); end;
  231. end;
  232. constructor TIdMessageEncoder.Create(AOwner: TComponent);
  233. begin
  234. inherited;
  235. FPermissionCode := 660;
  236. end;
  237. initialization
  238. finalization
  239. FreeAndNil(GMessageDecoderList);
  240. FreeAndNil(GMessageEncoderList);
  241. end.