IdMessageCoderUUE.pas 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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: 10259: IdMessageCoderUUE.pas
  11. {
  12. { Rev 1.0 2002.11.12 10:46:14 PM czhower
  13. }
  14. unit IdMessageCoderUUE;
  15. interface
  16. uses
  17. Classes,
  18. IdCoder3to4, IdMessageCoder, IdMessage;
  19. type
  20. TIdMessageDecoderUUE = class(TIdMessageDecoder)
  21. public
  22. function ReadBody(ADestStream: TStream; var AMsgEnd: Boolean): TIdMessageDecoder; override;
  23. end;
  24. TIdMessageDecoderInfoUUE = class(TIdMessageDecoderInfo)
  25. public
  26. function CheckForStart(ASender: TIdMessage; ALine: string): TIdMessageDecoder; override;
  27. end;
  28. TIdMessageEncoderUUEBase = class(TIdMessageEncoder)
  29. protected
  30. FEncoderClass: TIdEncoder3to4Class;
  31. public
  32. procedure Encode(ASrc: TStream; ADest: TStream); override;
  33. end;
  34. TIdMessageEncoderUUE = class(TIdMessageEncoderUUEBase)
  35. public
  36. constructor Create(AOwner: TComponent); override;
  37. end;
  38. TIdMessageEncoderInfoUUE = class(TIdMessageEncoderInfo)
  39. public
  40. constructor Create; override;
  41. end;
  42. implementation
  43. uses
  44. IdCoderUUE, IdCoderXXE, IdException, IdGlobal, IdResourceStrings,
  45. SysUtils;
  46. { TIdMessageDecoderInfoUUE }
  47. function TIdMessageDecoderInfoUUE.CheckForStart(ASender: TIdMessage;
  48. ALine: string): TIdMessageDecoder;
  49. var
  50. LPermissionCode: integer;
  51. begin
  52. LPermissionCode := StrToIntDef(Copy(ALine, 7, 3), 0);
  53. if AnsiSameText(Copy(ALine, 1, 6), 'begin ') and (Copy(ALine, 10, 1) = ' ') and (LPermissionCode > 0) {Do not Localize}
  54. then begin
  55. Result := TIdMessageDecoderUUE.Create(ASender);
  56. with TIdMessageDecoderUUE(Result) do begin
  57. FFilename := Copy(ALine, 11, MaxInt);
  58. FPartType := mcptAttachment;
  59. end;
  60. end else begin
  61. Result := nil;
  62. end;
  63. end;
  64. { TIdMessageDecoderUUE }
  65. function TIdMessageDecoderUUE.ReadBody(ADestStream: TStream; var AMsgEnd: Boolean): TIdMessageDecoder;
  66. var
  67. LDecoder: TIdDecoder4to3;
  68. LLine: string;
  69. begin
  70. AMSgEnd := False;
  71. Result := nil;
  72. LLine := ReadLn;
  73. if (Length(LLine) > 0) then
  74. begin
  75. case LLine[1] of
  76. 'M': begin {Do not Localize}
  77. LDecoder := TIdDecoderUUE.Create(nil);
  78. end;
  79. 'h': begin {Do not Localize}
  80. LDecoder := TIdDecoderXXE.Create(nil);
  81. end;
  82. else begin
  83. raise EIdException.Create(RSUnrecognizedUUEEncodingScheme);
  84. end;
  85. end;
  86. end;
  87. try
  88. repeat
  89. if (Length(Trim(LLine)) = 0) or (LLine = LDecoder.FillChar) then begin
  90. // UUE: Comes on the line before end. Supposed to be `, but some put a
  91. // blank line instead
  92. end else begin
  93. LDecoder.DecodeToStream(LLine, ADestStream);
  94. end;
  95. LLine := ReadLn;
  96. until AnsiSameText(Trim(LLine), 'end'); {Do not Localize}
  97. finally FreeAndNil(LDecoder); end;
  98. end;
  99. { TIdMessageEncoderInfoUUE }
  100. constructor TIdMessageEncoderInfoUUE.Create;
  101. begin
  102. inherited;
  103. FMessageEncoderClass := TIdMessageEncoderUUE;
  104. end;
  105. { TIdMessageEncoderUUEBase }
  106. procedure TIdMessageEncoderUUEBase.Encode(ASrc, ADest: TStream);
  107. var
  108. s: string;
  109. LEncoder: TIdEncoder3to4;
  110. begin
  111. ASrc.Position := 0;
  112. s := 'begin ' + IntToStr(PermissionCode) + ' ' + Filename + EOL; {Do not Localize}
  113. ADest.WriteBuffer(s[1], Length(s));
  114. LEncoder := FEncoderClass.Create(nil); try
  115. while ASrc.Position < ASrc.Size do begin
  116. s := LEncoder.Encode(ASrc, 45) + EOL;
  117. ADest.WriteBuffer(s[1], Length(s));
  118. end;
  119. s := LEncoder.FillChar + EOL + 'end' + EOL; {Do not Localize}
  120. ADest.WriteBuffer(s[1], Length(s));
  121. finally FreeAndNil(LEncoder); end;
  122. end;
  123. { TIdMessageEncoderUUE }
  124. constructor TIdMessageEncoderUUE.Create(AOwner: TComponent);
  125. begin
  126. inherited;
  127. FEncoderClass := TIdEncoderUUE;
  128. end;
  129. initialization
  130. TIdMessageDecoderList.RegisterDecoder('UUE', TIdMessageDecoderInfoUUE.Create); {Do not Localize}
  131. TIdMessageEncoderList.RegisterEncoder('UUE', TIdMessageEncoderInfoUUE.Create); {Do not Localize}
  132. end.