email/pop3andsmtpmtm/servermtmutils/inc/IMCVSEND.H
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/pop3andsmtpmtm/servermtmutils/inc/IMCVSEND.H	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,731 @@
+// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// IMCVSEND.H
+//
+
+#if !defined(__IMCVSEND_H__)
+#define __IMCVSEND_H__
+
+#include <s32mem.h>
+#include <badesca.h>
+#include <miutatch.h>
+#include <miuthdr.h>
+#include <mentact.h>
+#include <msvuids.h>
+#include <msventry.h>
+#include <smtpset.h>
+
+#include <imutdll.h>
+#include <imcvtext.h>
+#include <imcvcodc.h>
+#include <imcvutil.h>
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS  
+#include "timrfc822datefield.h"	
+#include "cimconvertheader.h"				
+#endif
+
+class CImSendEmail;
+class CImEmailTraverser;
+class CImSendPlainEmail;
+class CImSendMimeEmail;
+class CImSendMimeHeader;
+class CImSendRfc822Header;
+class CImSendRichText;
+class CImSendFile;
+class CMsvPlainBodyText;
+
+/**
+@internalComponent
+@released
+*/
+enum TMimeHeaderType { EMainMimeHeader, EPartMimeHeader };
+
+
+const TImHeaderEncodingInfo::TEncodingType	
+			KDefaultSendingHeaderEncoding = TImHeaderEncodingInfo::EBase64;
+const TUint KDefaultSendingCharset		  = KCharacterSetIdentifierIso88591;
+const TInt KArrayAllocationNumber		  =6;
+
+/**
+The number of US ASCII UU Encoded characters per line between the CRLF line
+terminator and the character count at the beginning of the encoded line when sending
+UU encoded emails.
+*/
+const TInt KMaxUUUnEncodedCharsPerLine = 45; // Historically, UU implmentations use 45.
+const TInt KMaxUUEncodedCharsPerLine = static_cast<TInt>(KMaxUUUnEncodedCharsPerLine / 0.75); // 60.
+ 
+/**
+The maximum number of US ASCII characters per line that are before the CRLF line
+terminator when sending emails.  RFC 2822 recommends that each line SHOULD not exceed
+80 characters including the CRLF terminator, and MUST not exceed 1000.
+*/
+const TInt KMaxB64EncodedCharsPerLine = 60; // Could be increased to 75 characters for every encoded line if KDecodeLineLength = 675.  60 was chosen to maintain existing behaviour.
+
+/**
+Size of 8 bit data chunk to extract when encoding using B64 or UU.
+The size allows for the appending of CRLF every KMaxEncodedCharsPerLine
+characters after encoding to limit the line length as per RFC 2822.
+The size also allows for the expansion of every 3 bytes of unencoded data to
+4 bytes when encoded. 
+*/
+const TInt KDecodeLineLength = 675; //  675/0.75= 900 = 100 bytes left for CRLF and UU length chars, 900/45 = exactly 20 UU lines per SMTP buffer sent, 900/60 = exactly 15 B64 lines per SMTP buffer sent.
+
+
+// External interface to imcvsend.
+
+//----------------------------------------------------------------------------------------
+class CImSendMessage : public CBase
+//----------------------------------------------------------------------------------------
+/**
+@internalAll
+@released
+*/
+	{
+public:
+	IMPORT_C static CImSendMessage* NewL(CMsvServerEntry& aServerEntry);
+	IMPORT_C static CImSendMessage* NewLC(CMsvServerEntry& aServerEntry);
+
+	IMPORT_C ~CImSendMessage( );
+
+	// Returns KImcvFinished when done.
+	IMPORT_C TInt NextLineL( TDes8& rOutputLine, TInt& rPaddingCount );
+	IMPORT_C void InitialiseL(TMsvId aMessageId, const TTime aTimeDate,
+						const TDesC& aDomainName, const TImEmailTransformingInfo& aInfo, 
+						const TImSMTPSendCopyToSelf aCopyToSelf);
+	IMPORT_C void InitialiseL(TMsvId aMessageId, TImSendMethod aSendMethod, const TTime aTimeDate,
+		const TDesC& aDomainName, TUint aCharset, const TImSMTPSendCopyToSelf aCopyToSelf);
+	IMPORT_C TInt HeaderSize();
+	IMPORT_C TInt BodySizeL();
+	IMPORT_C void Reset();
+
+private:
+
+	CImSendMessage(CMsvServerEntry& aServerEntry);
+	void ConstructL();
+	void SetSendMethodL(TImSendMethod aSendMethod);
+
+private:
+	CMsvServerEntry& iServerEntry;
+
+	CImSendEmail* iSendEmail;
+	TMsvId iMessageId;
+	TTime	iTimeDate;
+
+	TBool	iLogFileExists;	// Logging.
+	RFile	iLogFile;
+	};
+
+
+
+// This class is a VIRTUAL base class from which email protocol classes are derived. 
+// gives derived classes  ability to traverse the entry structure and extract  
+// information from entries.
+//  It determines which entry to set the current context to and which entry will follow,
+//  and knows when the end of the message has been reached.
+
+//----------------------------------------------------------------------------------------
+class CImSendEmail : public CBase
+//----------------------------------------------------------------------------------------
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	CImSendEmail(CMsvServerEntry& aServerEntry);
+	~CImSendEmail( );
+
+	virtual TInt NextLineL(TDes8& rOutputLine, TInt& rPaddingCount) = 0;
+	virtual void Reset();
+
+	virtual void InitialiseL( const TTime aTimeDate, const TDesC& aDomainName, 
+								const TImSMTPSendCopyToSelf aCopyToSelf,
+								const TImEmailTransformingInfo& aTransformingInfo);
+	virtual TInt HeaderSize();
+	virtual TInt BodySizeL();
+
+protected:
+	virtual void ConstructL(); // Call base class Construct in the derived function
+	TBool InitBodyObjectL(TMsvEntry& rEntry);
+	TBool InitAttachmentObjectL(TMsvEntry& rEntry);
+	TImFileCodec& Encoder(TImEncodingType aType);
+
+protected:
+	CMsvServerEntry&	iServerEntry;
+
+	// Encoding classes including a default.
+	TImCodecNull		iNULLEncoder;
+	TImCodecUU			iUUEncoder;
+	TImCodecB64WithLineBreaks iB64Encoder;
+	TImCodecQP			iQPEncoder;
+
+	// Objects common to all email types
+
+	CImSendFile*					iSendFile;
+	CImSendRfc822Header*			iRfc822Header;
+	CImSendRichText*				iSendRichText;
+
+	CImConvertCharconv*			iCharConv;
+	CCnvCharacterSetConverter*	iCharacterConverter;
+	CImConvertHeader*			iHeaderConverter;
+
+	TInt						iState;
+	CImEmailTraverser*			iEmailTraverser;
+	CImHeader*					iHeader;
+
+	TInt						iEmbeddedEmail;
+
+	TTime						iTimeDate;
+	TPtrC						iDomainName;
+
+	TUint						iAlgorithm; // used for encoding a body/attachment.
+	TImEmailTransformingInfo	iDefaultTransformingInfo;	
+	};
+
+
+// Traverses the TMsvEntry structure of email message, used by CImSendEmail.
+// Complex email messages have a hierarchical structure with more than one LEVEL.
+
+//----------------------------------------------------------------------------------------
+class CImEmailTraverser : CBase 
+//----------------------------------------------------------------------------------------
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	static CImEmailTraverser* NewL( CMsvServerEntry& aServerEntry );
+	~CImEmailTraverser();
+	void InitialiseL(TMsvId aId);
+
+	TBool				NextEntryL(TMsvEntry& rEntry);
+	TBool				DownLevelL();
+	TBool				UpLevelL();
+	inline void			SetBaseEntry();
+
+	inline TBool				IsBaseLevel() const;
+	inline CMsvEntrySelection&	CurrentList() const;
+	inline const TMsvEntry&		ThisEntry() const;	
+
+private:
+	CImEmailTraverser( CMsvServerEntry& aServerEntry );
+	void ConstructL();
+	void Reset();
+
+	inline TBool	LevelExists() const;
+	inline TBool	DeleteCurrentList();
+	inline void		AddList(CMsvEntrySelection&	children);
+	inline TInt		CurrentEntry();
+
+private:
+	TMsvId				iBaseId;  // ID of the Top level email entry.
+	CMsvServerEntry&	iServerEntry;
+
+	// Storing the child entries in a hierarchical entry structure.
+	// List and count arrays
+	CArrayFixFlat<CMsvEntrySelection*>*	iSelectionList; 
+	CArrayFixFlat<TInt>					iCurrentEntryList; 
+	};
+
+
+// This class is derived from CImSendEmail and encapsulates the non-MIME protocol. 
+// The class only knows about the entry which is currently in its context, which is 
+// determined by it base class. 
+
+//----------------------------------------------------------------------------------------
+class CImSendPlainEmail : public CImSendEmail
+//----------------------------------------------------------------------------------------
+/**
+@internalComponent
+@released
+*/
+	{
+private:
+	enum TSendState	{
+		ERfc822Header = 0,
+		EBody,
+		EAttachmentFile,
+		};
+
+public:
+	static CImSendPlainEmail* NewL(CMsvServerEntry& aServerEntry );
+	static CImSendPlainEmail* NewLC(CMsvServerEntry& aServerEntry );
+	TInt NextLineL( TDes8& rOutputLine, TInt& rPaddingCount );
+
+private:
+	CImSendPlainEmail(CMsvServerEntry& aServerEntry);
+	TBool ChangeStateL();
+	};
+
+
+
+//	It encapsulates the MIME protocol and controls what needs to be sent for a specific
+//  entry type, this being the type of entry that is currently in context. 
+//  Only knows about the entry which is currently in its context, which is determined by 
+//  it base class. Creates and looks after the boundary strings. 
+
+//----------------------------------------------------------------------------------------
+class CImSendMimeEmail : public CImSendEmail
+//----------------------------------------------------------------------------------------
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	// From RFC 1521, (Boundaries) must be no longer than 70 characters.
+	enum{KBoundaryStringLength = 55};
+
+private:
+	enum TSendState	{
+		ERfc822Header = 0,
+		EMimeMainHeader,
+		EMimeText,
+		EBoundary,
+		EMimePartHeader,
+		EBody,
+		EAttachmentFile,
+		EEndBoundary,
+		ELineAfterEndBoundary,
+		};
+
+public:
+	static CImSendMimeEmail* NewL(CMsvServerEntry& aServerEntry );
+	static CImSendMimeEmail* NewLC(CMsvServerEntry& aServerEntry );
+	~CImSendMimeEmail( );
+
+	TInt NextLineL( TDes8& rOutputLine, TInt& rPaddingCount );
+
+	void Reset();
+	TInt HeaderSize();
+	TBool InitBodyObjectL(TMsvEntry& rEntry);
+
+private:
+	CImSendMimeEmail(CMsvServerEntry& aServerEntry );
+	void ConstructL();
+	TBool ChangeStateL();
+
+	void CreateBoundaryL();
+	void DeleteBoundary();
+
+	inline void Boundary(TDes8& rOutputLine);
+	inline TPtrC8 Boundary();
+	inline TPtrC8 SetBoundaryL(TBool aMultipart);
+	inline TInt SendBoundaryLine( TDes8& rOutputLine, TInt& rPaddingCount);
+	inline TBool ValidBoundaryChar( TUint aCharacter );
+	
+	void InitEmbeddedEmailL();
+
+	TBool CreateMimeHeaderL();
+	void InitMimeHeaderL( TMsvEntry& aEntry, TPtrC8& rBoundary, TPtrC& rFilename);
+	void InitSendMimeHeaderL(TMsvEntry& aEntry, TMimeHeaderType aMimeHeaderType	);
+
+	inline TBool Next(TMsvEntry& rEntry);
+	inline TBool Down(TMsvEntry& rEntry);
+	inline void GetNextEntryL(TMsvEntry& rEntry);
+	inline TBool CheckForEmbeddedEmailL(const TMsvEntry& aEntry) const;
+	inline TBool CheckForMultipartEmailL( TMsvEntry& rEntry, TImEmailFolderType& aFolder);
+
+private:
+	CDesC8ArrayFlat*		iBoundaryArray;
+	CImSendMimeHeader*		iSendMimeHeader;
+	CImMimeHeader*			iMimeHeader;
+
+	TBool					iTextDisplayed;
+	TInt64					iRandSeed;
+	};
+
+
+
+// 	This class creates the main message header lines which conform to the rfc822 specification. 
+//  The code is currently implemented in Imcvsend.cpp.
+
+//----------------------------------------------------------------------------------------
+class CImSendRfc822Header : public CBase
+//----------------------------------------------------------------------------------------
+/**
+@internalComponent
+@released
+*/
+	{
+private:
+	// Defines the state order of the CImSendRfc822Header object... 
+	// !! DO NOT CHANGE THE ORDER !!
+
+	enum TSendState	{
+		EFrom=0, // 0
+		EReplyTo,
+		ETo,
+		ECc,
+		EBcc,
+		ESubject,
+		EDate,
+		EReturnReceiptTo,
+		EPriority,
+		EImportance,
+		EMessageID,
+		EXMailer,
+		EEndOfRfc822Header
+		};
+
+public:
+	static CImSendRfc822Header* NewLC( RFs& anFs, CImConvertHeader& aConverter );
+	static CImSendRfc822Header* NewL( RFs& anFs, CImConvertHeader& aConverter  );
+	~CImSendRfc822Header();
+
+	TInt NextLineL( TDes8& rOutputLine, TInt& rPaddingCount );
+	TBool InitialiseL( const TTime aTimeDate , const TDesC& aDomainName, 
+					CMsvServerEntry& aServerEntry, const TMsvPriority aPriority, 
+					const TImSMTPSendCopyToSelf aCopyToSelf,
+					TImEmailTransformingInfo& rInfo);
+
+	TInt DoRecipientsL( TDes8& rOutputLine, const TPtrC8& aPrompt, CDesCArray& aList );
+	void PrepareBufferL( const TPtrC8& aPrompt, const TDesC& aData);
+	void PrepareBufferL( const TPtrC8& aPrompt, const TDesC8& aData);
+	TInt SendOutput( TDes8& rOutputLine );
+	TInt PriorityL(TDes8& rOutputLine);
+	TInt ImportanceL(TDes8& rOutputLine);
+
+	TUint HeaderCharset() const;
+	void SetMessageIdL();
+	void Reset();
+	TInt Size() const;
+	inline const TImEmailTransformingInfo& TransformingInfo() const;
+
+private:
+	CImSendRfc822Header( RFs& anFs, CImConvertHeader& aConverter );
+	void ConstructL();
+
+	inline TInt FromL( TDes8& rOutputLine );
+	inline TInt ReplyToL( TDes8& rOutputLine );
+	inline TInt ToL( TDes8& rOutputLine );
+	inline TInt CcL( TDes8& rOutputLine );
+	inline TInt BccL( TDes8& rOutputLine );
+	inline TInt SubjectL( TDes8& rOutputLine );
+	inline TInt MessageIdL( TDes8& rOutputLine );
+	inline TInt XMailerL( TDes8& rOutputLine );
+	inline TInt ReturnReceiptsL(TDes8& rOutputLine);
+	inline TBool FieldIsEmailAddress() const;
+
+	TBool ValidEmailAddress(const TPtrC8& aData, const TInt aPos, TInt& rStart, TInt& rEnd);
+	 void EncodeHeaderFieldL(const TDesC& aBufIn, RBuf8& rBufOut, const TInt aArrayVal);
+
+	void AddCopyToSelfL(TImSMTPSendCopyToSelf aCopyToSelf, CDesCArray& aList);
+
+	void HandleSpecialCharacters(TPtr8& aAddressPtr);
+	TBool IsSpecialCharacter(const TUint aChar);
+	void PackRemainingData(TDes8& rOutputLine, TPtrC8& aBuf);
+
+private:
+	RFs&			iFs;
+	CImHeader*		iHeader;
+	TInt			iState;
+
+	HBufC8*			iOutputBuffer;
+	const TUint8*	ipOutputBuffer;
+
+	TImRfc822DateField	iRfc822Date;
+	TTime				iTimeDate;
+	TMsvPriority		iPriority;
+
+	// resource strings
+	HBufC*		iProductName;
+	HBufC*		iDomainName;
+
+	CImConvertHeader&   iHeaderConverter;
+	CImcvUtils*			iImcvUtils;
+	CDesC8Array*		iPriorityFields;
+	CDesC8Array*		iImportanceFields;
+	CDesC8Array*		iReceiptFields;
+
+	TUint			iHeaderCharset;
+	TImEncodingType iHeaderEncoding;
+
+	TImSMTPSendCopyToSelf		iCopyToSelf;
+	TImEmailTransformingInfo	iTransformingInfo;
+	TBool						iAddSpaceToNewLine;	
+	};
+
+
+// This class encapsulates the MIME header protocol. 
+// The header strings are created from a text resource of standard MIME tokens
+// Info obtained from cImMimeHeader object. 
+
+//----------------------------------------------------------------------------------------
+class CImSendMimeHeader : public CBase
+//----------------------------------------------------------------------------------------
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	enum TMimeHeaderState		
+		{
+		EMimeVersion = 0, // Main only
+		EContentLanguage, // Main only
+		EDescription,	 // Part only
+		EContentType,
+		EBoundaryString,
+		EDisposition,
+		ETransferEncoding,
+		ECRLF,
+		EEndOfMimeHeader
+		};
+
+	enum TImSplitLine
+		{	
+		EFirstLine = 0,
+		ESecondLine
+		};
+public:
+	static CImSendMimeHeader* NewL(CImConvertHeader& aConverter, TMimeHeaderType aType);
+	static CImSendMimeHeader* NewLC(CImConvertHeader& aConverter, TMimeHeaderType aType);
+	~CImSendMimeHeader();
+
+	TInt NextLine( TDes8& rOutputLine, TInt& rPaddingCount );
+
+	void InitialiseL( CImMimeHeader& aMimeHeader, const TPtrC aFilename, 
+					const TPtrC8& aBoundary,  const TBool aEmbedded, 
+					const TMsvEntry& aEntry,  const TImEmailTransformingInfo& aInfo,
+					TBool aEmbeddedEmail = EFalse);
+	inline TInt BlankLine( TDes8& rOutputLine ) const;
+	inline TInt MimeVersion( TDes8& rOutputLine ) const;
+	inline TBool ContentType( TDes8& rOutputLine) const;
+	inline TBool TransferEncoding(TDes8& rOutputLine) const;
+	inline TInt ContentLanguage( TDes8& rOutputLine ) const;
+	inline TBool Description( TDes8& rOutputLine) const;
+	inline TBool Disposition( TDes8& rOutputLine, TInt& rAdvance);
+	inline const TPtrC8 EncodingType() const;
+
+	TUint CharsetUid() const;
+	void SetCharsetUidL(const TUint aId);
+	TPtrC8 GetCharsetString() const;
+
+	inline TInt Boundary(TDes8& rOutputLine) const;
+	void AppendFilenameL( TDes8& rOutputLine ) const;
+	TInt Size() const;
+
+private:
+	CImSendMimeHeader( CImConvertHeader& aConverter, TMimeHeaderType aType);
+
+private:
+	CImConvertHeader&	iConverter;
+	TInt				iHeaderState;
+
+	CImMimeHeader*		iMimeHeader;
+	// Info needed when filling in header details
+	TImEncodingType		iAlgorithm;
+	HBufC8*				iCharsetString;
+	TPtrC8				iBoundaryString;
+	TFileName			iFilename;
+	TMsvEntry			iEntry;
+
+	TInt				iLine;
+	TBool				iIsMultipart;
+	TMimeHeaderType		iMimeHeaderType;
+
+	TUint			iHeaderCharset;
+	TImEncodingType iHeaderEncodingType;
+
+	TUint			iCharsetUid;
+	TImEncodingType iEncodingType;
+
+	TBool			iDealingWithAnEmbeddedEmail;
+	};
+
+
+// 	This class sends the text from a richtext object. 
+//  The text can be encoded using any of the available encoding techniques
+
+//----------------------------------------------------------------------------------------
+class CImSendRichText : public CBase
+//----------------------------------------------------------------------------------------
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	static CImSendRichText* NewL( CImConvertCharconv& aConv );
+	static CImSendRichText* NewLC( CImConvertCharconv& aConv );
+
+	TBool InitialiseL( CMsvServerEntry& aServerEntry,  TImCodec& anEncoder,
+										    TImEncodingType aType, TUint aCharset);
+	TInt NextLineL( TDes8& rOutputLine, TInt& rPaddingCount );
+	void ExtractLineFromChunkL(TDes16& aOutputLine);
+	~CImSendRichText();
+	inline TInt Size() const;
+
+private:
+	CImSendRichText(CImConvertCharconv& aConv);
+	void ConstructL();
+
+	TInt NoEncodeNextLineL( TDes8& rOutputLine, TInt& rPaddingCount );
+	TInt RemoveControlCharacters( const TDesC& aInputLine, TDes& rOutputLine, TInt& rPaddingCount );
+
+	TInt EncodeNextLineL( TDes8& rOutputLine, TInt& rPaddingCount );
+	TInt EncodeQPNextLineL( TDes8& rOutputLine, TInt& rPaddingCount );
+
+	TInt ConvertNextLineL( const TDesC& aInput, TDes8& rOutput);
+	TBool SmartBreak( TInt written, const TDesC& pSource );
+	TBool SmartBreak( TInt written, const TUint8* pSource, TInt aMaxLength );
+
+	inline TBool IsBreakable( TChar aChar ) const;
+	inline TBool IsEOL(TChar aChar) const;
+	inline TUint8 ReplacementChar(TChar aControlChar) const;
+	inline TBool IsPlain(TChar aChar) const;
+	inline int ConvertLineBreaks( TDes& aSource, TBool aLineBreak) const;
+
+private:
+	// The message store class for reteiving chunks of body text from mail store.
+	CMsvPlainBodyText* 	iPlainBodyText;
+	CImConvertCharconv& iConverter;
+	TBool	iPreparedToConvert;
+	TImCodec*		iEncoder;
+
+	TInt			iMaxLength;
+	TBool			iUseRichText;
+	TInt			iBodySize;
+	TInt			iPos;
+	TImEncodingType	iBodyEncoding;
+	HBufC8*			iLeftOver;
+	// Buffer used for extracting line of body text from restored chunk.
+	RBuf			iCurrentChunk;
+	// Indicates whether a chunk needs to be restored from Message Store. 
+	TBool			iIsNewChunk;
+	};
+
+
+//	This class creates lines to send from files, 
+//  the files can be encoded using any of the available encoding techniques.
+
+//----------------------------------------------------------------------------------------
+class CImSendFile : public CBase
+//----------------------------------------------------------------------------------------
+/**
+@internalComponent
+@released
+*/
+	{
+private:
+	enum TImSplitLine
+		{
+		EFirstLine = 0,
+		ESecondLine
+		};
+
+	// Length of source text buffer used when encoding and outputting.
+	// Taking into account that the length may increase.
+
+	enum TImAttachmentSend
+		{
+		ENextFile = 0,
+		EPrefixLines,
+		EEncodeFile,
+		EPostfixLines,
+		EEndOfAttachments,
+		ECloseDelimiter,
+		ECRLFLine,
+		EEnd
+		};
+public:
+	static CImSendFile* NewLC(RFs& anFs, CImConvertCharconv& aCharConv);
+	static CImSendFile* NewL(RFs& anFs, CImConvertCharconv& aCharConv);
+	~CImSendFile();
+
+	void InitialiseL(  CMsvServerEntry& aServerEntry, TImFileCodec& anEncoder);
+
+	TInt NextLineL( TDes8& rOutputLine, TInt& rPaddingCount );
+
+	inline TInt BlankLine( TDes8& rOutputLine, TInt& rPaddingCount );
+    const TFileName& Filename() const;
+    
+    TFileName& Filename( CMsvServerEntry& aEntry, SAttachmentInfo& aInfo);
+
+	static void EmbeddedEmailFilename(TMsvEntry& aEntry, TFileName& aFileName);
+	inline TInt Size() const;
+
+private:
+	CImSendFile(RFs& anFs, CImConvertCharconv& aCharConv);
+	void ConstructL();
+
+private:
+	const RFs&			iFs;
+
+	TImFileCodec* iEncoder;  // Either B64 or UU encoder or none
+	CImConvertCharconv& iConverter;
+
+	SAttachmentInfo		iAttachmentInfo;
+	TImAttachmentFile*	iAttachmentFile;
+	TBuf8<KDecodeLineLength> iSourceLine;
+	CImMimeHeader*		iMimeHeader; // Passed in.
+
+	TInt	iAttachmentState;  // so dont change there order
+	TInt	iFileIndex;		// The following are init'ed in the Ctor list
+	TInt	iBodyHeaderState;
+
+	TInt	iPrefixState;
+	TInt	iPostfixState;
+	};
+
+
+//----------------------------------------------------------------------------------------
+class CImCalculateMsgSize : public CMsgActive
+//----------------------------------------------------------------------------------------
+/**
+@internalTechnology
+@released
+*/
+	{
+public:
+	IMPORT_C static CImCalculateMsgSize* NewL(RFs &anFs,CMsvServerEntry& aServerEntry);
+	IMPORT_C ~CImCalculateMsgSize();
+	IMPORT_C void StartL(TRequestStatus& aStatus,TMsvId aMsvId, 
+			TImSendMethod aAlgorithm, TTime& aTimeDate, 
+			const TDesC& aDomainName, const TUint aCharset);
+
+	inline TInt MessageSize() const;	// total size of Email - once active object has completed
+	inline void Progress(TInt& aBytes, TInt& aTotal);	// current info on size of Email
+
+private:
+	void DoRunL();
+	void DoCancel();
+private:
+	CImCalculateMsgSize(RFs &anFs,CMsvServerEntry& aServerEntry);
+	void ConstructL();
+	void Reset();
+private:
+	RFs& iFs;
+	CMsvServerEntry& iServerEntry;
+	TMsvId iMsvId;
+
+	TInt iSize;
+	TInt iTotal;
+
+	CImSendMessage* iSendMsg;
+	TBuf8<KImMailMaxBufferSize> iMailString;
+	TBool iFinished;
+#if defined (_DEBUG)
+	RFile iFile;
+	TBool iFileOpen;
+#endif
+	};
+
+
+#include <imcvsend.inl>
+
+#endif