📄 idmessagecoderuue.pas
字号:
{ $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: 10259: IdMessageCoderUUE.pas
{
{ Rev 1.0 2002.11.12 10:46:14 PM czhower
}
unit IdMessageCoderUUE;
interface
uses
Classes,
IdCoder3to4, IdMessageCoder, IdMessage;
type
TIdMessageDecoderUUE = class(TIdMessageDecoder)
public
function ReadBody(ADestStream: TStream; var AMsgEnd: Boolean): TIdMessageDecoder; override;
end;
TIdMessageDecoderInfoUUE = class(TIdMessageDecoderInfo)
public
function CheckForStart(ASender: TIdMessage; ALine: string): TIdMessageDecoder; override;
end;
TIdMessageEncoderUUEBase = class(TIdMessageEncoder)
protected
FEncoderClass: TIdEncoder3to4Class;
public
procedure Encode(ASrc: TStream; ADest: TStream); override;
end;
TIdMessageEncoderUUE = class(TIdMessageEncoderUUEBase)
public
constructor Create(AOwner: TComponent); override;
end;
TIdMessageEncoderInfoUUE = class(TIdMessageEncoderInfo)
public
constructor Create; override;
end;
implementation
uses
IdCoderUUE, IdCoderXXE, IdException, IdGlobal, IdResourceStrings,
SysUtils;
{ TIdMessageDecoderInfoUUE }
function TIdMessageDecoderInfoUUE.CheckForStart(ASender: TIdMessage;
ALine: string): TIdMessageDecoder;
var
LPermissionCode: integer;
begin
LPermissionCode := StrToIntDef(Copy(ALine, 7, 3), 0);
if AnsiSameText(Copy(ALine, 1, 6), 'begin ') and (Copy(ALine, 10, 1) = ' ') and (LPermissionCode > 0) {Do not Localize}
then begin
Result := TIdMessageDecoderUUE.Create(ASender);
with TIdMessageDecoderUUE(Result) do begin
FFilename := Copy(ALine, 11, MaxInt);
FPartType := mcptAttachment;
end;
end else begin
Result := nil;
end;
end;
{ TIdMessageDecoderUUE }
function TIdMessageDecoderUUE.ReadBody(ADestStream: TStream; var AMsgEnd: Boolean): TIdMessageDecoder;
var
LDecoder: TIdDecoder4to3;
LLine: string;
begin
AMSgEnd := False;
Result := nil;
LLine := ReadLn;
if (Length(LLine) > 0) then
begin
case LLine[1] of
'M': begin {Do not Localize}
LDecoder := TIdDecoderUUE.Create(nil);
end;
'h': begin {Do not Localize}
LDecoder := TIdDecoderXXE.Create(nil);
end;
else begin
raise EIdException.Create(RSUnrecognizedUUEEncodingScheme);
end;
end;
end;
try
repeat
if (Length(Trim(LLine)) = 0) or (LLine = LDecoder.FillChar) then begin
// UUE: Comes on the line before end. Supposed to be `, but some put a
// blank line instead
end else begin
LDecoder.DecodeToStream(LLine, ADestStream);
end;
LLine := ReadLn;
until AnsiSameText(Trim(LLine), 'end'); {Do not Localize}
finally FreeAndNil(LDecoder); end;
end;
{ TIdMessageEncoderInfoUUE }
constructor TIdMessageEncoderInfoUUE.Create;
begin
inherited;
FMessageEncoderClass := TIdMessageEncoderUUE;
end;
{ TIdMessageEncoderUUEBase }
procedure TIdMessageEncoderUUEBase.Encode(ASrc, ADest: TStream);
var
s: string;
LEncoder: TIdEncoder3to4;
begin
ASrc.Position := 0;
s := 'begin ' + IntToStr(PermissionCode) + ' ' + Filename + EOL; {Do not Localize}
ADest.WriteBuffer(s[1], Length(s));
LEncoder := FEncoderClass.Create(nil); try
while ASrc.Position < ASrc.Size do begin
s := LEncoder.Encode(ASrc, 45) + EOL;
ADest.WriteBuffer(s[1], Length(s));
end;
s := LEncoder.FillChar + EOL + 'end' + EOL; {Do not Localize}
ADest.WriteBuffer(s[1], Length(s));
finally FreeAndNil(LEncoder); end;
end;
{ TIdMessageEncoderUUE }
constructor TIdMessageEncoderUUE.Create(AOwner: TComponent);
begin
inherited;
FEncoderClass := TIdEncoderUUE;
end;
initialization
TIdMessageDecoderList.RegisterDecoder('UUE', TIdMessageDecoderInfoUUE.Create); {Do not Localize}
TIdMessageEncoderList.RegisterEncoder('UUE', TIdMessageEncoderInfoUUE.Create); {Do not Localize}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -