📄 mimedec.pas
字号:
FOnPartHeaderBegin : TNotifyEvent;
FOnPartHeaderLine : TNotifyEvent;
FOnPartHeaderEnd : TNotifyEvent;
FOnPartBegin : TNotifyEvent;
FOnPartLine : TMimeDecodePartLine;
FOnPartEnd : TNotifyEvent;
FOnMessageEnd : TNotifyEvent;
FOnInlineDecodeBegin : TInlineDecodeBegin;
FOnInlineDecodeLine : TInlineDecodeLine;
FOnInlineDecodeEnd : TInlineDecodeEnd;
{ Used to force InLine decoding even if there was no OnInlineDecodeLine
event. See UUProcessLine }
FInlineDecodeLine : Boolean;
FLengthHeader : Integer;
procedure TriggerHeaderBegin; virtual;
procedure TriggerHeaderLine; virtual;
procedure TriggerHeaderEnd; virtual;
procedure TriggerPartHeaderBegin; virtual;
procedure TriggerPartHeaderLine; virtual;
procedure TriggerPartHeaderEnd; virtual;
procedure TriggerPartBegin; virtual;
procedure TriggerPartLine(Data : Pointer; DataLen : Integer); virtual;
procedure TriggerPartEnd; virtual;
procedure TriggerMessageEnd; virtual;
procedure TriggerInlineDecodeBegin(Filename: String); virtual;
procedure TriggerInlineDecodeLine(Line: Pointer; Len : Integer); virtual;
procedure TriggerInlineDecodeEnd(Filename: String); virtual;
procedure ProcessLineUUDecode;
function UUProcessLine(FCurrentData: PChar): boolean;
procedure ProcessHeaderLine;
procedure ProcessPartHeaderLine;
procedure ProcessPartLine;
procedure ProcessWaitBoundary;
procedure ProcessMessageLine;
procedure PreparePart;
procedure PrepareNextPart;
procedure ProcessDecodedLine(Line : Pointer; Len : Integer);
procedure InternalDecodeStream(aStream : TStream);
procedure MessageBegin;
procedure MessageEnd;
procedure ParseYBegin(const Ch : String);
public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
procedure DecodeFile(FileName : String);
procedure DecodeStream(aStream : TStream);
procedure ProcessLineBase64;
procedure ProcessLineQuotedPrintable;
property From : String read FFrom;
property Dest : String read FDest;
property Subject : String read FSubject;
property Date : String read FDate;
property ReturnPath : String read FReturnPath;
property ContentType : String read FContentType;
property Encoding : String read FEncoding;
property Charset : String read FCharset;
property MimeVersion : String read FMimeVersion;
property HeaderName : String read FHeaderName;
property Disposition : String read FDisposition;
property FileName : String read FFileName;
property Format : String read FFormat;
property HeaderLines : TStrings read FHeaderLines;
property IsMultipart : Boolean read FIsMultipart;
property EndOfMime : Boolean read FEndOfMime;
property PartContentType : String read FPartContentType;
property PartEncoding : String read FPartEncoding;
property PartName : String read FPartName;
property PartDisposition : String read FPartDisposition;
property PartContentID : String read FPartContentID;
property PartFileName : String read FPartFileName;
property PartFormat : String read FPartFormat;
property PartCharset : String read FPartCharset;
property ApplicationType : String read FApplicationType;
property PartNumber : Integer read FPartNumber;
property CurrentData : PChar read FCurrentData
write FCurrentData;
property DestStream : TStream read FDestStream
write FDestStream;
property InlineDecodeLine : boolean read FInlineDecodeLine
write FInlineDecodeLine
default FALSE;
property LengthHeader : Integer read FLengthHeader;
published
property OnHeaderBegin : TNotifyEvent read FOnHeaderBegin
write FOnHeaderBegin;
property OnHeaderLine : TNotifyEvent read FOnHeaderLine
write FOnHeaderLine;
property OnHeaderEnd : TNotifyEvent read FOnHeaderEnd
write FOnHeaderEnd;
property OnPartHeaderBegin : TNotifyEvent read FOnPartHeaderBegin
write FOnPartHeaderBegin;
property OnPartHeaderLine : TNotifyEvent read FOnPartHeaderLine
write FOnPartHeaderLine;
property OnPartHeaderEnd : TNotifyEvent read FOnPartHeaderEnd
write FOnPartHeaderEnd;
property OnPartBegin : TNotifyEvent read FOnPartBegin
write FOnPartBegin;
property OnPartLine : TMimeDecodePartLine read FOnPartLine
write FOnPartLine;
property OnPartEnd : TNotifyEvent read FOnPartEnd
write FOnPartEnd;
property OnMessageEnd : TNotifyEvent read FOnMessageEnd
write FOnMessageEnd;
property OnInlineDecodeBegin : TInlineDecodeBegin
read FOnInlineDecodeBegin
write FOnInlineDecodeBegin;
property OnInlineDecodeLine : TInlineDecodeLine
read FOnInlineDecodeLine
write FOnInlineDecodeLine;
property OnInlineDecodeEnd : TInlineDecodeEnd
read FOnInlineDecodeEnd
write FOnInlineDecodeEnd;
end;
procedure Register;
function GetToken(Src : PChar; var Dst : String; var Delim : Char) : PChar;
function GetHeaderValue(X : PChar) : String;
implementation
type
TLookup = array [0..127] of Byte;
const
Base64In: TLookup = (
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 62, 255, 255, 255, 63, 52, 53, 54, 55,
56, 57, 58, 59, 60, 61, 255, 255, 255, 64, 255, 255, 255,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
255, 255, 255, 255, 255, 255, 26, 27, 28, 29, 30, 31, 32,
33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
46, 47, 48, 49, 50, 51, 255, 255, 255, 255, 255
);
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure Register;
begin
RegisterComponents('FPiette', [TMimeDecode]);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{$IFDEF VER80}
{ Delphi 1 miss the SetLength procedure. So we rewrite it. }
procedure SetLength(var S: string; NewLength: Integer);
begin
S[0] := chr(NewLength);
end;
{$ENDIF}
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{$IFDEF VER80}
function TrimRight(Str : String) : String;
var
i : Integer;
begin
i := Length(Str);
while (i > 0) and (Str[i] in [' ', #9]) do
i := i - 1;
Result := Copy(Str, 1, i);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TrimLeft(Str : String) : String;
var
i : Integer;
begin
if Str[1] <> ' ' then
Result := Str
else begin
i := 1;
while (i <= Length(Str)) and (Str[i] = ' ') do
i := i + 1;
Result := Copy(Str, i, Length(Str) - i + 1);
end;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function Trim(Str : String) : String;
begin
Result := TrimLeft(TrimRight(Str));
end;
{$ENDIF}
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function HexConv(Ch : Char) : Integer;
begin
if Ch in ['0'..'9'] then
Result := Ord(Ch) - Ord('0')
else
Result := (Ord(Ch) and 15) + 9;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
constructor TMimeDecode.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
FHeaderLines := TStringList.Create;
FIsMultipart := FALSE;
FEndOfMime := FALSE;
FInlineDecodeLine := false;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
destructor TMimeDecode.Destroy;
begin
if Assigned(FHeaderLines) then begin
FHeaderLines.Destroy;
FHeaderLines := nil;
end;
inherited Destroy;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TMimeDecode.TriggerHeaderBegin;
begin
if Assigned(FOnHeaderBegin) then
FOnHeaderBegin(Self);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TMimeDecode.TriggerHeaderLine;
begin
if Assigned(FOnHeaderLine) then
FOnHeaderLine(Self);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TMimeDecode.TriggerHeaderEnd;
begin
if Assigned(FOnHeaderEnd) then
FOnHeaderEnd(Self);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TMimeDecode.TriggerPartHeaderBegin;
begin
if Assigned(FOnPartHeaderBegin) then
FOnPartHeaderBegin(Self);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TMimeDecode.TriggerPartHeaderLine;
begin
if Assigned(FOnPartHeaderLine) then
FOnPartHeaderLine(Self);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TMimeDecode.TriggerPartHeaderEnd;
begin
if Assigned(FOnPartHeaderEnd) then
FOnPartHeaderEnd(Self);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TMimeDecode.TriggerPartBegin;
begin
if Assigned(FOnPartBegin) then
FOnPartBegin(Self);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TMimeDecode.TriggerPartLine(Data : Pointer; DataLen : Integer);
begin
if Assigned(FOnPartLine) then
FOnPartLine(Self, Data, DataLen);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TMimeDecode.TriggerPartEnd;
begin
if Assigned(FOnPartEnd) then
FOnPartEnd(Self);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TMimeDecode.TriggerMessageEnd;
begin
if Assigned(FOnMessageEnd) then
FOnMessageEnd(Self);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TMimeDecode.TriggerInlineDecodeBegin(Filename: String);
begin
if Assigned(FOnInlineDecodeBegin) then
FOnInlineDecodeBegin(self, Filename);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TMimeDecode.TriggerInlineDecodeLine(Line: Pointer; Len : Integer);
begin
if Assigned(FOnInlineDecodeLine) then
FOnInlineDecodeLine(self, Line, Len);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TMimeDecode.TriggerInlineDecodeEnd(Filename: String);
begin
if Assigned(FOnInlineDecodeEnd) then
FOnInlineDecodeEnd(self, Filename);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TMimeDecode.ProcessDecodedLine(Line : Pointer; Len : Integer);
begin
if Len > 0 then begin
if (FPartContentType = '') { Not sure it is always OK ! }
{ As such we can't have a MIME part which }
{ is uu-encoded. }
and uuprocessline(line) then
Exit;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -