restemplate/indy/Protocols/IdAttachment.pas

157 lines
3.9 KiB
Plaintext

{
$Project$
$Workfile$
$Revision$
$DateUTC$
$Id$
This file is part of the Indy (Internet Direct) project, and is offered
under the dual-licensing agreement described on the Indy website.
(http://www.indyproject.org/)
Copyright:
(c) 1993-2005, Chad Z. Hower and the Indy Pit Crew. All rights reserved.
}
{
$Log$
}
{
Rev 1.8 2/8/05 6:02:10 PM RLebeau
Try that again...
Rev 1.7 2/8/05 6:00:02 PM RLebeau
Updated SaveToFile() to call SaveToStream()
Rev 1.6 6/16/2004 2:10:48 PM EHill
Added SaveToStream method for TIdAttachment
Rev 1.5 2004.03.03 10:30:46 AM czhower
Removed warning.
Rev 1.4 2/24/04 1:23:58 PM RLebeau
Bug fix for SaveToFile() using the wrong Size
Rev 1.3 2004.02.03 5:44:50 PM czhower
Name changes
Rev 1.2 10/17/03 12:07:28 PM RLebeau
Updated Assign() to copy all available header values rather than select ones.
Rev 1.1 10/16/2003 10:55:24 PM DSiders
Added localization comments.
Rev 1.0 11/14/2002 02:12:36 PM JPMugaas
}
unit IdAttachment;
interface
{$i IdCompilerDefines.inc}
uses
Classes,
IdMessageParts,
IdBaseComponent;
type
TIdAttachment = class(TIdMessagePart)
public
// here the methods you have to override...
// for open handling
// works like this:
// 1) you create an attachment - and do whatever it takes to put data in it
// 2) you send the message
// 3) this will be called - first OpenLoadStream, to get a stream
// 4) when the message is fully encoded, CloseLoadStream is called
// to close the stream. The Attachment implementation decides what to do
function OpenLoadStream: TStream; virtual; abstract;
procedure CloseLoadStream; virtual; abstract;
// for save handling
// works like this:
// 1) new attachment is created
// 2) PrepareTempStream is called
// 3) stuff is loaded
// 4) FinishTempStream is called of the newly created attachment
function PrepareTempStream: TStream; virtual; abstract;
procedure FinishTempStream; virtual; abstract;
procedure LoadFromFile(const FileName: String); virtual;
procedure LoadFromStream(AStream: TStream); virtual;
procedure SaveToFile(const FileName: String); virtual;
procedure SaveToStream(AStream: TStream); virtual;
class function PartType: TIdMessagePartType; override;
end;
TIdAttachmentClass = class of TIdAttachment;
implementation
uses
IdGlobal, IdGlobalProtocols, IdCoderHeader,
SysUtils;
{ TIdAttachment }
class function TIdAttachment.PartType: TIdMessagePartType;
begin
Result := mptAttachment;
end;
procedure TIdAttachment.LoadFromFile(const FileName: String);
var
LStrm: TIdReadFileExclusiveStream;
begin
LStrm := TIdReadFileExclusiveStream.Create(FileName); try
LoadFromStream(LStrm);
finally
FreeAndNil(LStrm);
end;
end;
procedure TIdAttachment.LoadFromStream(AStream: TStream);
var
LStrm: TStream;
begin
LStrm := PrepareTempStream;
try
// TODO: use AStream.Size-AStream.Position instead of 0, and don't call
// CopyFrom() if (AStream.Size-AStream.Position) is <= 0. Passing 0 to
// CopyFrom() tells it to seek AStream to Position=0 and then copy the
// entire stream, which is fine for the stream provided by LoadFromFile(),
// but may not always be desirable for user-provided streams...
LStrm.CopyFrom(AStream, 0);
finally
FinishTempStream;
end;
end;
procedure TIdAttachment.SaveToFile(const FileName: String);
var
LStrm: TIdFileCreateStream;
begin
LStrm := TIdFileCreateStream.Create(FileName); try
SaveToStream(LStrm);
finally
FreeAndNil(LStrm);
end;
end;
procedure TIdAttachment.SaveToStream(AStream: TStream);
var
LStrm: TStream;
begin
LStrm := OpenLoadStream;
try
AStream.CopyFrom(LStrm, 0);
finally
CloseLoadStream;
end;
end;
end.