www.pudn.com > indyprelim.zip > IdAttachment.pas


{ 
  $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 
  IdMessageParts, 
  IdBaseComponent, 
  IdSys, 
  IdObjs; 
 
type 
  TIdAttachment = class(TIdMessagePart) 
  protected 
    FFileName: String; 
 
    function  GetContentDisposition: string; virtual; 
    function  GetContentType: String; override; 
    function  GetContentTypeName: String; virtual; 
    procedure SetContentDisposition(const Value: string); virtual; 
    procedure SetContentType(const Value: String); override; 
  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: TIdStream; 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: TIdStream; virtual; abstract; 
    procedure FinishTempStream; virtual; abstract; 
    procedure SaveToFile(const FileName: String); virtual; 
    procedure SaveToStream(AStream: TIdStream); virtual; 
 
    procedure Assign(Source: TIdPersistent); override; 
 
 
    property  FileName: String read FFileName write FFileName; 
    property  ContentDisposition: string read GetContentDisposition write SetContentDisposition; 
    property  ContentTypeName: String read GetContentTypeName; 
    class function PartType: TIdMessagePartType; override; 
  end; 
 
  TIdAttachmentClass = class of TIdAttachment; 
 
implementation 
 
uses 
  IdGlobal, IdGlobalProtocols; 
 
const 
  SContentDisposition = 'Content-Disposition';  {do not localize} 
 
{ TIdAttachment } 
 
procedure TIdAttachment.Assign(Source: TIdPersistent); 
var 
  mp: TIdAttachment; 
begin 
  if Source is TIdAttachment then begin 
    mp := TIdAttachment(Source); 
    { 
    ContentTransfer := mp.ContentTransfer; 
    ContentType := mp.ContentType; 
    ContentID := mp.ContentID; 
    ContentDisposition := mp.ContentDisposition; 
    } 
 
    // RLebeau 10/17/2003 
    Headers.Assign(mp.Headers); 
 
    ExtraHeaders.Assign(mp.ExtraHeaders); 
    FileName := mp.FileName; 
  end else begin 
    inherited; 
  end; 
end; 
 
function TIdAttachment.GetContentDisposition: string; 
begin 
  Result := Headers.Values[SContentDisposition]; {do not localize} 
  Result := Fetch(Result,';'); 
end; 
 
function TIdAttachment.GetContentType: String; 
Begin 
  Result := inherited GetContentType; 
  Result := Fetch(Result,';'); 
End;// 
 
function TIdAttachment.GetContentTypeName: String; 
Begin 
  Result := ExtractHeaderSubItem(inherited GetContentType, 'NAME='); {do not localize} 
End;// 
 
class function TIdAttachment.PartType: TIdMessagePartType; 
begin 
  Result := mptAttachment; 
end; 
 
procedure TIdAttachment.SaveToFile(const FileName: String); 
var 
  fs: TIdFileStream; 
begin 
  fs := TIdFileStream.Create(FileName, fmCreate); try 
    SaveToStream(fs); 
  finally 
    Sys.FreeAndNil(fs); 
  end; 
end; 
 
procedure TIdAttachment.SaveToStream(AStream: TIdStream); 
var 
  os: TIdStream; 
begin 
  os := OpenLoadStream; 
  try 
    AStream.CopyFrom(os, 0); 
  finally 
    CloseLoadStream; 
  end; 
end; 
 
procedure TIdAttachment.SetContentDisposition(const Value: string); 
begin 
  Headers.Values[SContentDisposition] := Value; 
end; 
 
 
procedure TIdAttachment.SetContentType(const Value: String); 
begin 
  inherited SetContentType(Value); // TODO: what is here? must we add 'name='? 
end; 
 
end.