diff -r 000000000000 -r 72b543305e3a email/pop3andsmtpmtm/clientmtms/inc/cimmessagepart.h --- /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 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 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__