email/pop3andsmtpmtm/clientmtms/inc/cimmessagepart.h
changeset 0 72b543305e3a
child 76 60a8a215b0ec
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/pop3andsmtpmtm/clientmtms/inc/cimmessagepart.h	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,359 @@
+// Copyright (c) 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:
+// cimmessagepart.h
+//
+
+/**
+ * @file 
+ * @
+ * @released
+ */
+
+#ifndef __CIMMESSAGEPART_H__
+#define __CIMMESSAGEPART_H__
+
+class CImEmailMessage;
+class CImMimeHeader;
+class CMsvMimeHeaders;
+class CImHtmlConverter;
+
+class TImCreateMessageOptions
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	TMsvPartList		iMsvPartList;
+	TMsvEmailTypeList	iMsvEmailTypeList;
+	TUid				iMessageType;
+	};
+
+
+class CImRemoveMessagePart : public CMsvOperation
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	static CImRemoveMessagePart* DeleteAttachmentL(TRequestStatus &aStatus, CMsvEntry& aMsvEntry, TMsvId aMessageId, TMsvId aAttachmentId);
+	static CImRemoveMessagePart* DeleteAttachedMessageL(TRequestStatus &aStatus, CMsvEntry& aMsvEntry, TMsvId aMessageId, TMsvId aAttachedMessageId);
+	~CImRemoveMessagePart();
+	const TDesC8& FinalProgress();
+	void DoCancel();
+	void RunL();
+	const TDesC8& ProgressL();		// returns NULL until operation completed - then returns MessageId
+	TMsvId RemovedAttachmentId();	
+private:
+	CImRemoveMessagePart(TRequestStatus& aStatus, CMsvEntry& aMsvEntry, TMsvId aMessageId);
+	void ConstructL(TMsvId aAttachmentId);
+	void ErrorRecovery(TInt aError);
+	void SelectNextStateL();					// selects next state to go to
+	void ChangeStateL();					// initiates the next state operation
+	void SelectAndChangeToNextStateL();
+	void RequestComplete(TInt aError);
+	void Recover();							// leave message in a 'good' state
+
+	void CheckAttachmentParentTypeL();
+	void MoveOtherEntryToParentOfFolderL();
+	void DeleteAttachmentEntryL();
+	void DeleteFolderEntryL();
+	void CompleteRemoveMessagePartL();
+private:
+	enum TImRemoveMessagePartState
+		{
+		ECheckAttachmentParentType,
+		EMoveOtherEntryToParentOfFolder,
+		EDeleteAttachmentEntry,
+		EDeleteFolderEntry,
+		ECompleteRemoveMessagePart,
+		EFinished
+		};
+	CMsvEntry&			iMsvEntry;
+	CMsvOperation*		iMsvOperation;
+
+	CMsvEntrySelection*	iMessageEntrySelection;
+	CImEmailMessage*	iEmailMessage;
+
+	TInt				iState;
+	TPckgBuf<TMsvId>	iDataMember;
+	TMsvId				iMessageId;
+	TMsvId				iFolderToDeleteId;
+	TInt				iAttachmentSize;
+	TMsvId				iAttachmentId;
+	TMsvId				iEntryToMoveId;
+	};
+
+class CImStoreMessagePart : public CMsvOperation
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	static CImStoreMessagePart* AddAttachmentL(TMsvId aMessageId, const TDesC& aFilePath, CMsvEntry& aMsvEntry,CMsvAttachment* aAttachmentInfo,TRequestStatus& aStatus );
+	static CImStoreMessagePart* AddEntryAsAttachmentL(TMsvId aMessageId,TMsvId aAttachmentMessageId, CMsvEntry& aMsvEntry, CMsvAttachment* aAttachmentInfo,TRequestStatus& aStatus);
+	static CImStoreMessagePart* AddAttachmentL(TMsvId aMessageId,RFile& aFile, CMsvEntry& aMsvEntry, CMsvAttachment* aAttachmentInfo, TRequestStatus& aStatus);
+	static CImStoreMessagePart* AddLinkedAttachmentL(TMsvId aMessageId,const TDesC& aFilePath, CMsvEntry& aMsvEntry,CMsvAttachment* aAttachmentInfo,TRequestStatus& aStatus );	
+	static CImStoreMessagePart* CreateAttachmentL(TMsvId aMessageId,const TDesC& aFileName, RFile& aAttachmentFile,CMsvEntry& aMsvEntry, CMsvAttachment* aAttachmentInfo, TRequestStatus& aStatus);
+	static CImStoreMessagePart* AddRelatedPartL(TRequestStatus &aStatus, CMsvEntry& aMsvEntry, TMsvId aMessageId, const TDesC& aAttachmentFullName, TMsvId aRelatedPartId, const TDesC8& aContentId);
+	static CImStoreMessagePart* StoreBodyTextL(TRequestStatus& aStatus, CMsvEntry& aMsvEntry, TMsvId aMessageId, CRichText& aRichText, TBool aUsePlainTextStorage = EFalse);
+	static CImStoreMessagePart* StoreBodyTextWithMimeHeaderL(TRequestStatus& aStatus, CMsvEntry& aMsvEntry, TMsvId aMessageId, CRichText& aRichText, const CImMimeHeader& aMimeHeader, TBool aUsePlainTextStorage = EFalse);
+	static CImStoreMessagePart* StorePlainBodyTextL(TRequestStatus& aStatus, CMsvEntry& aMsvEntry, TMsvId aMessageId, TBool aUsePlainTextStorage = ETrue);
+	static CImStoreMessagePart* StorePlainBodyTextL(TRequestStatus& aStatus, CMsvEntry& aMsvEntry, TMsvId aMessageId, CImMimeHeader& aMimeHeader, TBool aUsePlainTextStorage = ETrue);
+	~CImStoreMessagePart();
+	const TDesC8& FinalProgress();
+	void DoCancel();
+	void RunL();
+	const TDesC8& ProgressL();
+private:
+	enum TImMessagePart
+		{
+		EMessagePartAttachment,
+		EMessagePartBody,
+		EMessagePartMessageAttachment
+		};
+	void ConstructL(RFile& aFile);
+	void ConstructL(RFile& aFile,const TDesC& aAttachmentName);
+	void ConstructL(const TDesC& aAttachmentFullName, const TDesC8& aContentId);
+	void ConstructAttachmentInfo(CMsvAttachment* aAttachmentInfo,TInt aAttachmentCreationState);
+	CImStoreMessagePart(TRequestStatus& aStatus, CMsvEntry& aMsvEntry, TMsvId aMessageId, TBool aUsePlainTextStorage = EFalse);
+	
+	void ConstructL();
+	void ConstructL(const TDesC& aAttachmentFullName);
+	void ConstructL(TMsvId aAttachmentMessageId);
+	void ConstructL(const TDesC& aAttachmentFullName, TMsvId aRelatedPartId, const TDesC8& aContentId);
+	void ConstructL(CRichText& aRichText);
+	void ConstructL(CRichText& aRichText, const CImMimeHeader& aMimeHeader);
+	void ConstructL(CImMimeHeader& aMimeHeader);
+	void ConstructL(TImMessagePart aMessagePart);
+	void ErrorRecovery(TInt error);
+	void SelectNextStateL();				// selects next state to go to
+	void ChangeStateL();					// initiates the next state operation
+	void SelectAndChangeToNextStateL();
+	void RequestComplete(TInt aError);
+	void Recover();
+
+	TBool HTMLMessage() const;
+	void SetHTMLMessage(TBool aFlag);
+	TBool MultipartMixedExists() const;
+	void SetMultipartMixedExists(TBool aFlag);
+	TBool MultipartMixedCreated() const;
+	void SetMultipartMixedCreated(TBool aFlag);
+	TBool MultipartAlternativeExists() const;
+	void SetMultipartAlternativeExists(TBool aFlag);
+	TBool MultipartAlternativeCreated() const;
+	void SetMultipartAlternativeCreated(TBool aFlag);
+	TBool MultipartRelatedExists() const;
+	void SetMultipartRelatedExists(TBool aFlag);
+	TBool MultipartRelatedCreated() const;
+	void SetMultipartRelatedCreated(TBool aFlag);
+	TBool TextPartExists() const;
+	void SetTextPartExists(TBool aFlag);
+	TBool TextPartCreated() const;
+	void SetTextPartCreated(TBool aFlag);
+ 	TBool AttachmentEntryCreated() const;
+	void SetAttachmentEntryCreated(TBool aFlag);
+
+	void FindMultipartRelatedFolderL();
+	void CheckForSubfolderL();
+	void CreateAttachmentEntryL();
+	void CopyOrigMessageToMessageL();
+	void CreateMultipartMixedFolderEntryL();
+	void CreateMultipartAlternativeFolderEntryL();
+	void CreateMultipartRelatedFolderEntryL();
+	void MoveOriginalMessageEntryChildrenToNewFolderL();
+	void CreateTextEntryL();
+	void StoreRichTextL();
+	void CompleteStoreMessagePartL();
+	void CreateHTMLEntryL();
+	void PrepareToStoreHTMLEntryTextL();
+	void StoreHTMLEntryTextL();
+	void RemoveHTMLEntryL();
+	void MoveTextEntryToAltFolderL();
+	TPtrC GetDefaultAttachmentName();
+	void OpenAndReadResourceFileL();
+	void StoreMimeHeaderL();
+	TBool CreateAttachmentMimeHeaderL(CImMimeHeader& aMimeHeader, const TDesC& aDetails);
+	void CreateFolderMimeHeaderL(CImMimeHeader& aMimeHeader);
+	void CreateMessageMimeHeaderL(CImMimeHeader& aMimeHeader);
+	void AddAttachmentL();
+	void AddAttachmentUsingFileHandleL();
+	void AddLinkedAttachmentL();
+	void AddEntryAsAttachmentL();	
+	void CreateAttachmentL();
+	void DoAttachmentStoreL();
+	TInt CheckMimeInAttachmentInfoL(CMsvMimeHeaders& aMsvMimeHeaders);
+	CImMimeHeader* ProcessAttachmentMimeHeadersL();
+	void SetEntryDetailsL(TMsvEntry& aEntry);
+	void StorePlainTextL();
+private:
+	enum TImStoreMessagePartState
+		{
+		EFindMultipartRelatedFolder,
+		ECheckForSubfolder,
+		ECreateAttachmentEntry,
+		EStoreAttachment,
+		ECopyOrigMessageToMessage,
+		ECreateMultipartMixedFolderEntry,
+		ECreateMultipartRelatedFolderEntry,
+		ECreateMultipartAlternativeFolderEntry,
+		EMoveOriginalMessageEntryChildrenToNewFolder,
+		ECreateTextEntry,
+		EStoreRichText,
+		ERemoveHTMLEntry,
+		EMoveTextToAlternativeFolder,
+		ECreateHTMLEntry,
+		EPrepareToStoreHTMLEntryText,
+		EStoreHTMLEntryText,
+		ECompleteStoreMessage,
+		EFinished
+		,EStoreHTMLTextInEntry,
+		EAddEntryAttachment	
+		};
+
+	enum TImStoreMessagePartFlags
+		{
+		KStoreMessagePartClearFlag							= 0x00000000,
+		KStoreMessagePartHTMLMessage						= 0x00000001,
+		KStoreMessagePartMultipartMixedExists				= 0x00000002,
+		KStoreMessagePartMultipartMixedCreated				= 0x00000004,
+		KStoreMessagePartMultipartAlternativeExists			= 0x00000008,
+		KStoreMessagePartMultipartAlternativeCreated		= 0x00000010,
+		KStoreMessagePartTextPartExists						= 0x00000020,
+		KStoreMessagePartTextPartCreated					= 0x00000040,
+		KStoreMessagePartAttachmentEntryCreated				= 0x00000080,
+		KStoreMessagePartOrigMessageEntryChildrenCopied		= 0x00000100,
+		KStoreMessagePartOrigMessageEntryChildrenDeleted	= 0x00000200,
+		KStoreMessagePartMultipartRelatedExists				= 0x00000400,
+		KStoreMessagePartMultipartRelatedCreated			= 0x00000800
+		};
+	CMsvEntry&			iMsvEntry;
+	CMsvOperation*		iMsvOperation;
+	
+	CRichText*			iRichTextToStore; // I don't own this object!
+	CImMimeHeader*		iMimeHeaderOfBodyText;
+	CRichText*			iRichText;
+	CFileMan*			iFileMan;
+	CMsvEntrySelection* iMessageEntrySelection;
+
+	TInt				iState;
+	TPckgBuf<TMsvId>	iDataMember;
+	TMsvId				iMessageId;
+	TImMessagePart		iMessagePart;
+	TMsvId				iMixFolderId;
+	TMsvId				iAltFolderId;
+	TMsvId				iRelFolderId;
+	HBufC*				iAttachmentFullName;
+	TInt				iAttachmentSize;
+	TMsvId				iAttachmentId;
+	TMsvId				iTextId;
+	TMsvId				iHtmlId;
+	TMsvId				iRelatedPartId;
+	TMsvId				iAttachmentMessageId;
+	TUint32				iFlags;
+	HBufC8*				iContentId;
+	CImEmailMessage*	iEmailMessage;
+
+	// Used when converting rich text to html
+	CParaFormatLayer*	iParaLayer;
+	CCharFormatLayer*	iCharLayer;
+	CImHtmlConverter* 	iHtmlConverter;
+	TBool iFinishedConvertingHTML;
+	CMsvAttachment*		iAttachmentInfo;
+	CMsvStore* 			iStore;
+	TInt 				iAttachmentCreateState;
+	TBool				iIsAddByFileHandle;
+	RFile*				iFileHandle;
+	RFile               iFile;
+	// Indicates whether to store message body as CRichText or plaintext.
+	TBool 				iUsePlainTextStorage;
+	// Size of the plain text body.
+	TInt				iSizeOfBody;
+	// Size of the Fwd'ed/ReplyTo plaintext body part.
+	TInt				iSizeFwdReplyBody;
+	// The error value returned when CRichText is populated with message body text.
+	TInt 				iRestoreErr;
+	enum TImAttachmentCreation
+		{
+		EAddAttachment,
+		EAddAttachmentUsingFileHandle,
+		EAddLinkedAttachment,
+		EAddEntryAsAttachment,
+		ECreateAttachment
+		};
+	};
+
+class CImHtmlConverter : public CBase
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	static CImHtmlConverter* NewL(CMsvEntry& aMsvEntry, CParaFormatLayer& aParaLayer, CCharFormatLayer& aCharLayer);
+	~CImHtmlConverter();
+	void PrepareToStoreHTMLEntryTextL(TMsvId& aHtmlId, const TMsvId aTextId);
+	void ResetStoreL();
+	void ResetStoreWithoutCommit();
+	TBool StoreHTMLEntryTextAL(TRequestStatus& aStatus);
+	CMsvOperation* ChangeHTMLTextInEnrtyL(TRequestStatus& aStatus);
+	
+	void ReadDefaultAttachmentNameL( RResourceFile& resourceFile);
+	TInt Size() const;
+
+private:
+	CImHtmlConverter(CMsvEntry&	aMsvEntry, CParaFormatLayer& aParaLayer, CCharFormatLayer& aCharLayer);
+	TFileName HtmlFilename(CMsvEntry& aEntry, TPtrC aFileName);
+	TPtrC GetDefaultAttachmentName();
+	void ConstructL();
+
+private:
+	CMsvEntry&			iMsvEntry;
+	CParaFormatLayer&	iParaLayer;
+	CCharFormatLayer&	iCharLayer;
+
+	CConverterBase*		iToHTMLConverter;
+	CCnaConverterList*	iConverterList;
+
+	TMsvId				iTextId;
+	TMsvId				iHtmlId;
+	TInt				iSize;
+	HBufC*				iDefaultAttachmentName;
+	CRichText*			iRichText;
+	RDesReadStream 		iSourceStream;
+	RFileWriteStream	iTargetStream;
+	CMsvStore*			iStore;
+	RFile 				iFile;
+	};
+
+class CImStoreResolver : public CBase, public MRichTextStoreResolver
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	CImStoreResolver(CStreamStore* aStore);
+	~CImStoreResolver();
+	//
+private:
+	const CStreamStore& StreamStoreL(TInt aPos)const;
+	//
+private:
+	CStreamStore* iStore;
+	};
+
+#endif //__CIMMESSAGEPART_H__