diff -r 000000000000 -r 8466d47a6819 emailservices/emailstore/base_plugin/inc/BasePlugin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/base_plugin/inc/BasePlugin.h Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,884 @@ +/* +* Copyright (c) 2006 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: Email Interface base implementation header file. +* +*/ + + +#ifndef __BASEPLUGIN_H__ +#define __BASEPLUGIN_H__ + +#include +#include + +#include "CFSMailPlugin.h" +#include "mmrorganizer.h" + +// +#include "MsgStoreFolderUtils.h" +#include "MsgStoreMailBox.h" +#include "MsgStoreMailBoxObserver.h" +#include "MsgStoreMessage.h" +#include "MsgStoreObserver.h" +#include "DebugLogMacros.h" +// + +#include "BaseMrInfoObject.h" +#include "Map.h" + + +class CMsgStore; + +class CBaseMrInfoProcessor; +class TDayOfWeekFtor; +class CFetchRequester; +class CMailboxInfo; +class CSearchHandler; +class HMailIterator; +class CDelayedOpsManager; +class MDelayedOpsManager; + + +/** + * Notes for derived classes: + * GetPluginId - you must override this to return the ECOM id of the plugin. + */ +class CBasePlugin : + public CFSMailPlugin, + public MMsgStoreObserver, + protected MMsgStoreMailBoxObserver + + { + friend class HMailIterator; + friend class CBaseMrInfoProcessor; + friend class CMailboxInfo; + friend class CSearchHandler; + //there is a need for a better way to access internal plugin state by + //private components. + friend class CDelayedDeleteMessagesOp; + friend class CDelayedSetContentOp; + + protected: + struct TOngoingFetchInfo; + struct TCacheLine + { + CMsgStoreMessage* iMsg; + CMsgStoreMessagePart* iBody; + RPointerArray iMsgChildren; + RPointerArray iBodyChildren; + }; + + public: + static CBasePlugin* NewL(); + static CBasePlugin* NewLC(); + IMPORT_C virtual ~CBasePlugin(); + protected: + IMPORT_C CBasePlugin(); + IMPORT_C void ConstructL(); + + // CFSMailPlugin // + public: + + IMPORT_C virtual void ListMailBoxesL( + RArray& aMailboxes ); + + IMPORT_C virtual CFSMailBox* GetMailBoxByUidL( + const TFSMailMsgId& aMailBox); + + IMPORT_C virtual void DeleteMailBoxByUidL( + const TFSMailMsgId& aMailBoxId, + MFSMailRequestObserver& aOperationObserver, + const TInt aRequestId ); + + IMPORT_C virtual TDesC& GetBrandingIdL( + const TFSMailMsgId& aMailboxId ); + + IMPORT_C virtual void MoveMessagesL( + const TFSMailMsgId& aMailBoxId, + const RArray& aMessageIds, + const TFSMailMsgId& aSourceFolderId, + const TFSMailMsgId& aDestinationFolderId ); + + IMPORT_C virtual void CopyMessagesL( + const TFSMailMsgId& aMailBoxId, + const RArray& aMessageIds, + RArray& aNewMessages, + const TFSMailMsgId& aSourceFolderId, + const TFSMailMsgId& aDestinationFolderId ); + + IMPORT_C MDesCArray* GetMrusL( + const TFSMailMsgId& aMailBoxId ); + + IMPORT_C void SetMrusL( + const TFSMailMsgId& aMailBoxId, + MDesCArray* aNewMruList ); + + IMPORT_C void GoOnlineL( + const TFSMailMsgId& aMailBoxId ); + + IMPORT_C void GoOfflineL( + const TFSMailMsgId& aMailBoxId ); + + IMPORT_C const TFSProgress GetLastSyncStatusL( + const TFSMailMsgId& aMailBoxId ); + + IMPORT_C void RefreshNowL( + const TFSMailMsgId& aMailBoxId, + MFSMailRequestObserver& aOperationObserver, + TInt aRequestId ); + + IMPORT_C virtual CFSMailFolder* GetFolderByUidL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aFolderId ); + + IMPORT_C virtual CFSMailFolder* CreateFolderL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aFolderId, + const TDesC& aFolderName, + const TBool aSync ); + + IMPORT_C virtual void DeleteFolderByUidL( + const TFSMailMsgId& aMailBox, + const TFSMailMsgId& aFolder ); + + IMPORT_C virtual void ListFoldersL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aFolderId, + RPointerArray& aFolderList ); + + IMPORT_C virtual void ListFoldersL( + const TFSMailMsgId& aMailBoxId, + RPointerArray& aFolderList ); + + IMPORT_C virtual TFSMailMsgId GetStandardFolderIdL( + const TFSMailMsgId& aMailBoxId, + const TFSFolderType aFolderType ); + + IMPORT_C virtual MFSMailIterator* ListMessagesL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aFolderId, + const TFSMailDetails aDetails, + const RArray& aSorting ); + + IMPORT_C virtual CFSMailMessage* GetMessageByUidL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aFolderId, + const TFSMailMsgId& aMessageId, + const TFSMailDetails aDetails ); + + /** + * The delete is executed asynchronously. The base plugin will queue + * the request and return immediately. + */ + IMPORT_C virtual void DeleteMessagesByUidL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aFolderId, + const RArray& aMessages ); + + IMPORT_C virtual CFSMailMessage* CreateMessageToSendL( + const TFSMailMsgId& aMailBox ); + + IMPORT_C virtual CFSMailMessage* CreateForwardMessageL( + const TFSMailMsgId& aMailBox, + const TFSMailMsgId& aOriginal, + const TDesC& aHeaderDescriptor ); + + IMPORT_C virtual CFSMailMessage* CreateReplyMessageL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aOriginalMessageId, + const TBool aReplyToAll, + const TDesC& aHeaderDescriptor ); + + IMPORT_C virtual void StoreMessageL( + const TFSMailMsgId& aMailBoxId, + CFSMailMessage& aMessage ); + + IMPORT_C virtual void FetchMessagesL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aFolderId, + const RArray& aMessageIds, + TFSMailDetails aDetails, + MFSMailRequestObserver& aObserver, + TInt aRequestId ); + + IMPORT_C virtual void FetchMessagePartsL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aFolderId, + const TFSMailMsgId& aMessageId, + const RArray& aMessagePartIds, + MFSMailRequestObserver& aOperationObserver, + const TInt aRequestId, + const TUint aPreferredByteCount ); + + IMPORT_C virtual void GetMessagesL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aParentFolderId, + const RArray& aMessageIds, + RPointerArray& aMessageList, + TFSMailDetails aDetails ); + + IMPORT_C virtual void ChildPartsL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aParentFolderId, + const TFSMailMsgId& aMessageId, + const TFSMailMsgId& aParentId, + RPointerArray& aParts ); + + IMPORT_C virtual CFSMailMessagePart* NewChildPartL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aParentFolderId, + const TFSMailMsgId& aMessageId, + const TFSMailMsgId& aParentPartId, + const TFSMailMsgId& aInsertBefore, + const TDesC& aContentType ); + + IMPORT_C virtual CFSMailMessagePart* CopyMessageAsChildPartL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aParentFolderId, + const TFSMailMsgId& aMessageId, + const TFSMailMsgId& aParentPartId, + const TFSMailMsgId& aInsertBefore, + const CFSMailMessage& aMessage ); + + IMPORT_C virtual void RemoveChildPartL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aParentFolderId, + const TFSMailMsgId& aMessageId, + const TFSMailMsgId& aParentPartId, + const TFSMailMsgId& aPartId ); + + IMPORT_C virtual void SetPartContentFromFileL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aParentFolderId, + const TFSMailMsgId& aMessageId, + const TFSMailMsgId& aMessagePartId, + const TDesC& aFilePath ); + + IMPORT_C virtual void StoreMessagePartL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aParentFolderId, + const TFSMailMsgId& aMessageId, + CFSMailMessagePart& aMessagePart ); + + IMPORT_C virtual CFSMailMessagePart* MessagePartL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aParentFolderId, + const TFSMailMsgId& aMessageId, + const TFSMailMsgId& aMessagePartId ); + + IMPORT_C virtual TInt GetMessagePartFileL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aParentFolderId, + const TFSMailMsgId& aMessageId, + const TFSMailMsgId& aMessagePartId, + RFile& aFileHandle ); + + IMPORT_C virtual void CopyMessagePartFileL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aParentFolderId, + const TFSMailMsgId& aMessageId, + const TFSMailMsgId& aMessagePartId, + const TDesC& aFilePath ); + + IMPORT_C virtual void GetContentToBufferL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aParentFolderId, + const TFSMailMsgId& aMessageId, + const TFSMailMsgId& aMessagePartId, + TDes& aBuffer, + TUint aStartOffset ); + + IMPORT_C virtual void SetContentL( + const TDesC& aBuffer, + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aParentFolderId, + const TFSMailMsgId& aMessageId, + const TFSMailMsgId& aMessagePartId); + + IMPORT_C virtual void RemovePartContentL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aParentFolderId, + const TFSMailMsgId& aMessageId, + const RArray& aPartIds ); + + IMPORT_C virtual void SearchL( + const TFSMailMsgId& aMailBoxId, + const RArray& aFolderIds, + const RPointerArray& aSearchStrings, + const TFSMailSortCriteria& aSortCriteria, + MFSMailBoxSearchObserver& aSearchObserver ); + + IMPORT_C virtual void CancelSearch( + const TFSMailMsgId& aMailBoxId ); + + IMPORT_C virtual void ClearSearchResultCache( + const TFSMailMsgId& aMailBoxId ); + + IMPORT_C virtual void AddObserverL( + MFSMailEventObserver& aObserver ); + + IMPORT_C virtual void RemoveObserver( + MFSMailEventObserver& aObserver ); + + IMPORT_C virtual void UnregisterRequestObserver( + TInt aRequestId ); + + IMPORT_C virtual void SendMessageL( + CFSMailMessage& aMessage ); + + IMPORT_C virtual TFSProgress StatusL( + TInt aRequestId ); + + IMPORT_C virtual void CancelL( + TInt aRequestId ); + + IMPORT_C virtual void SubscribeMailboxEventsL( + const TFSMailMsgId& aMailboxId, + MFSMailEventObserver& aObserver ); + + IMPORT_C virtual void UnsubscribeMailboxEvents( + const TFSMailMsgId& aMailboxId, + MFSMailEventObserver& aObserver ); + + IMPORT_C virtual TSSMailSyncState CurrentSyncState( + const TFSMailMsgId& aMailboxId ); + + IMPORT_C virtual TFSMailBoxStatus GetMailBoxStatus( + const TFSMailMsgId& aMailboxId ); + + IMPORT_C virtual TBool MailboxHasCapabilityL( + TFSMailBoxCapabilities aCapability, + TFSMailMsgId aMailBoxId ); + + /** + * Create a new ChildPart using a file path + */ + IMPORT_C virtual CFSMailMessagePart* NewChildPartFromFileL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aParentFolderId, + const TFSMailMsgId& aMessageId, + const TFSMailMsgId& aParentPartId, + const TDesC& aContentType, + const TDesC& aFilePath ); + + /** + * Create a new ChildPart using a file handle + * NOTE 1: RFs.ShareProtected() must have been called already before calling this method. + * NOTE 2: The ownersip of the RFile handle (aFile) is transferred to this method. + */ + IMPORT_C virtual CFSMailMessagePart* NewChildPartFromFileL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aParentFolderId, + const TFSMailMsgId& aMessageId, + const TFSMailMsgId& aParentPartId, + const TDesC& aContentType, + RFile& aFile ); + + IMPORT_C virtual TInt WizardDataAvailableL(); + + IMPORT_C virtual void AuthenticateL( + MFSMailRequestObserver& aOperationObserver, + TInt aRequestId ); + + IMPORT_C virtual void SetCredentialsL( + const TFSMailMsgId& aMailBoxId, + const TDesC& aUsername, + const TDesC& aPassword ); + + IMPORT_C virtual TInt CancelSyncL( + const TFSMailMsgId& aMailBoxId ); + + IMPORT_C virtual void SetMailboxName( + const TFSMailMsgId& /*aMailboxId*/, + const TDesC& /*aMailboxName*/ ); + + // MMsgStoreObserver // + public: + IMPORT_C virtual void SystemEventNotify( + TMsgStoreSystemEvent aEvent ); + + IMPORT_C virtual void AccountEventNotify( + TMsgStoreAccountEvent aEvent, + TInt32 aOwnerId, + const TDesC& aName, + const TDesC& aNewName, + TMsgStoreId aMailboxId ); + + IMPORT_C virtual void ModificationNotify( + TMsgStoreId aMailBoxId, + TMsgStoreOperation aOperation, + TMsgStoreContainerType aType, + TUint32 aFlags, + TMsgStoreId aId, + TMsgStoreId aParentId, + TMsgStoreId aOtherId ); + + protected: + + IMPORT_C CFSMailAddress* FetchEmailAddressL( + CMsgStorePropertyContainer& aMessage, + TUint aIdx ); + + IMPORT_C CMailboxInfo& GetMailboxInfoL( + TMsgStoreId aId ); + + void GetMailboxDisplayNameL( + TMsgStoreId aId, + RBuf& aDisplayName ); + + IMPORT_C virtual TUint GetPluginId(); + + /** + * Get signature string from protocol specific subclass. + * Caller is responsible for memory of returned string. + */ + virtual HBufC* GetSignatureL( TFSMailMsgId /* aMailBox */ ) + { + return NULL; + } + + /** + * Get reply-to address from protocol specific subclass. + * Caller is responsible for memory of returned string. + */ + virtual HBufC* GetReplyToAddressL( TFSMailMsgId /* aMailBox */ ) + { + return NULL; + } + + /** + * Get MailBox address from protocol specific subclass. + * Caller is responsible for memory of returned string. + */ + virtual HBufC* GetMailBoxAddressL( TFSMailMsgId /*aMailBox*/ ) + { + return NULL; + } + + + IMPORT_C virtual void TranslateMsgStorePropsL( + const TFSMailMsgId& aMailBoxId, + CMsgStorePropertyContainer& aMessage, + CFSMailMessagePart& aFsMsg, + const TFSMailDetails aDetails = EFSMsgDataEnvelope ); + + /** + * Translates common message store meeting requests into Freestyle mr info + * objects. + * Sync plugins might be interested in extending the default behavior. + */ + IMPORT_C virtual void TranslateMsgStoreMrL( + const TFSMailMsgId& aMailBoxId, + CMsgStorePropertyContainer& aMessage, + CMsgStorePropertyContainer& aCalendar, + CFSMailMessagePart& aFsMsg ); + + /** + * Translates a message in Freestyle format to the common Message Store + * format. Does not store the destination's properties in the msgstore. + * The caller must call StorePropertiesL when necessary. This way writes + * to the message store can be minimized. + * + * @param aSrc input/source Freestyle message. + * @param aDst output/destination MessageStore message. + */ + IMPORT_C virtual void TranslateEmailFwMessageL( + CFSMailMessagePart& aSrc, + CMsgStoreMessagePart& aDst, + TBool aInInbox ); + + IMPORT_C virtual void TranslateEmailFwMrL( + MMRInfoObject& aSrc, + CMsgStorePropertyContainer& aDst ); + + IMPORT_C void TranslateEmailFwAttendeeL( + MMROrganizer& aSrc, + RMsgStoreAddress& aDst ); + + void DoListFoldersL( + TFSMailMsgId aMailBoxId, + TMsgStoreId aFolderId, + TBool aRecursive, + RPointerArray& aFolderList ); + + void NotifyEventL( + TMsgStoreId aMailBoxId, + TMsgStoreId aId, + TMsgStoreId aParentId, + TFSMailEvent aFsEvent, + TMsgStoreId aOtherId = KMsgStoreInvalidId ); + + void NotifyGlobalEventL( + TFSMailEvent aEvent, + TFSMailMsgId aMailBox = TFSMailMsgId(), + TAny* aParam1 = NULL, + TAny* aParam2 = NULL, + TAny* aParam3 = NULL ); + + IMPORT_C virtual void NotifyMailboxEventL( + TFSMailEvent aEvent, + TFSMailMsgId aMailBox, + TAny* aParam1 = NULL, + TAny* aParam2 = NULL, + TAny* aParam3 = NULL ); + + /** + * Tries to find a body part of the specified content type. By default + * looks for the text/plain part. + * @return the main body text part or NULL if one can not be found. + */ + IMPORT_C CMsgStoreMessagePart* GetBodyPartL( + CMsgStoreMessage& aMessage, + const TDesC& aContentType = KFSMailContentTypeTextPlain() ); + + /** + * Creates a forward/reply message via copying the original, using sender(s) as + * recipient(s). + * + * @param aHeaderDescriptor packaged TReplyForwardParams that provide the message + * quote header and the smart reply label that needs to be inserted in case of a + * truncated message. + * @param aKeepAttachments true if the original message attachments are to be kept. + */ + IMPORT_C CFSMailMessage* CreateForwardReplyMessageL( + const TFSMailMsgId& aMailBox, + const TFSMailMsgId& aOriginal, + const TBool aReplyToAll, + const TDesC& aHeaderDescriptor, + TBool aKeepAttachments, + TBool aKeepMeetingRequestInfo = ETrue ); + + /** + * Recursively looks for the part with id aPartId in the part container + * aParent. + */ + IMPORT_C CMsgStoreMessagePart* FindMessagePartL( + CMsgStoreMessagePart& aParent, + TMsgStoreId aPartId ); + + /** + * Get MsgStore account object for the specified mailbox id. + */ + IMPORT_C CMsgStoreAccount* GetAccountForMsgBoxL( + const TFSMailMsgId& aMailboxId ); + + /** + * Create a MR reply message. + */ + IMPORT_C virtual CFSMailMessage* CreateMrReplyMessageL( + const TFSMailMsgId& aMailBoxId, + MMRInfoObject& aMeetingRequest, + const TFSMailMsgId& aOriginalMessageId ); + + /** + * Applyed when an account was deleted for proper cleanup. + */ + IMPORT_C virtual void HandleMailboxDeleteL( + const TFSMailMsgId& aMailboxId ); + + + protected: + + void SystemEventNotifyL( + TMsgStoreSystemEvent aEvent ); + + void AccountEventNotifyL( + TMsgStoreAccountEvent aEvent, + TInt32 aOwnerId, + const TDesC& aName, + const TDesC& aNewName, + TMsgStoreId aMailboxId ); + + void ModificationNotifyL( + TMsgStoreId aMailBoxId, + TMsgStoreOperation aOperation, + TMsgStoreContainerType aType, + TUint32 aFlags, + TMsgStoreId aId, + TMsgStoreId aParentId, + TMsgStoreId aOtherId ); + + void TranslateMsgStoreDayOfWeek( + TUint32 aDayOfWeekMask, + TDayOfWeekFtor& aFtor ); + + void TranslateEmailFwDayOfWeek( + MRRecurrenceRule::TMRRecurrentDay aSrc, + TUint32& aDst ); + + void TranslateEmailFwRecipientsL( + CMsgStoreMessagePart& aDst, + const TDesC8& aDstProperty, + RPointerArray& aRecipients ); + + IMPORT_C static void RemoveAllPropertiesL( + CMsgStorePropertyContainer& aContainer, + const TDesC8& aName ); + + IMPORT_C CMailboxInfo& RefreshMailboxCacheL( TMsgStoreId aMailBoxId ); + + void UnsubscribeMailboxEventsL( + const TFSMailMsgId& aMailboxId, + MFSMailEventObserver& aObserver ); + + /** + * Children should overload to call CFSMailFolderBase::BlockMoveFromL() + * and CFSMailFolderBase::BlockCopyFromL() for the CFSMailFolder + */ + virtual void BlockCopyMoveFromFoldersL( + TFSMailMsgId /*aFolderId*/, + TFSFolderType /*aFolderType*/, + CFSMailFolder& /*aFSMailFolder*/ ) + { + // do nothing + } + + void DoCancelSearchL( + const TFSMailMsgId& aMailBoxId ); + + void DoClearSearchResultCacheL( + const TFSMailMsgId& aMailBoxId ); + + /** + * Helper method to avoid duplicated code + */ + CFSMailMessagePart* NewChildPartFromFilePathOrHandleL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aParentFolderId, + const TFSMailMsgId& aMessageId, + const TFSMailMsgId& aParentPartId, + const TDesC& aContentType, + const TDesC& aFilePath, + TBool aUseFileHandle, + RFile& aFile ); + + /** + * Called by RemovePartContentL for each part that needs its content removed. + */ + IMPORT_C virtual void HandleRemovePartContentL( + CMsgStoreMessage& aMsg, + CMsgStoreMessagePart& aPart ); + + /** + * When replying or forwarding a message determine the "To:" field's value. + */ + void SetReplyOrForwardToFieldL( CMsgStoreMessage& newMsg ); + + + /** + * Used to refresh the cached mailbox display name, which can be changed by the user. The name + * is cached along with other mailbox info so that we can tell when it's changed in the message + * store and only notify the UI when such a change occurs. + * + * @param aMailBoxNameHasChanged - used to return to the caller if a change is detected. + * @param aMailBoxId - the ID of the mailbox + */ + void RefreshCachedMailBoxDisplayNameL( TBool& aMailBoxNameHasChanged, const TMsgStoreId& aMailBoxId ); + + IMPORT_C virtual void ReportRequestStatusL( + TMsgStoreId aMailBox, + TMsgStoreId aOtherId, + TMsgStoreId aMsgId, + TMsgStoreId aPartId, + TBool aCanReportCompletion = EFalse ); + + /** + * Finds the corresponding download request object for the part with id + * of aPartId identified by also the mailbox and the message ids. + */ + IMPORT_C TBool FindFetchRequestL( + TMsgStoreId aMailBox, + TMsgStoreId aOtherId, + TMsgStoreId aMsgId, + TMsgStoreId aPartId, + CBasePlugin::TOngoingFetchInfo& aOngoingFetchInfo ); + + IMPORT_C TBool DeleteFetchRequestForPart( + TOngoingFetchInfo& aFetchInfo ); + + IMPORT_C void DeleteFetchRequest( + TOngoingFetchInfo& aFetchInfo ); + + + protected: + IMPORT_C void ResetCache(); + + IMPORT_C void ResetBodyCache(); + + /** + * This method retrieves the specified message store message from a + * cache or directly from the message store if not cached. If the + * message was retrieved from the message store it is put into the + * cache. The lifetime of the message is managed by the cache but if a + * plugin makes a modification that would make the cached message + * invalid it must call the ResetCache method. + * + * @param aMailBoxId + * @param aMsgId + */ + IMPORT_C CMsgStoreMessage* GetCachedMsgL( + TMsgStoreId aMailBoxId, + TMsgStoreId aMsgId ); + + IMPORT_C CMsgStoreMessagePart* GetCachedBodyL( + TMsgStoreId aPartId ); + + IMPORT_C RPointerArray& GetCachedMsgChildrenL(); + + IMPORT_C RPointerArray& GetCachedBodyChildrenL(); + + IMPORT_C void InvalidateCacheIfNecessary( + TMsgStoreId aId, + TMsgStoreId aParentId, + TMsgStoreId aOtherId ); + + public: + + /** + * Direct message sending that does not require having a FW message + * instance. The FW's SendMessageL method internally uses this method + * after translating the FW message to the MsgStore format. + */ + IMPORT_C void SendMessageL( + CMsgStoreMailBox& aMailBox, + CMsgStoreMessage& aMsg, + const TTime& aSentTime ); + + /** + * The delayed ops manager is used to queue asynchronous processing of + * plugin requests. + */ + IMPORT_C MDelayedOpsManager& GetDelayedOpsManager(); + + protected: + + CMsgStore* iMsgStore; + RMap iMailboxes; + + //does not actually own the observers. + RPointerArray iObservers; + //async fetch reqs. + RPointerArray iReqs; + + TCacheLine iCacheLine; + + private: + + MDelayedOpsManager* iDelayedOpsManager; + + /** + * Descriptor for an ongoing part(attachment) fetch operation. + */ + struct TOngoingFetchInfo + { + CFetchRequester* iRequest; + TInt iPartIndex; + TMsgStoreId iMessageId; + TInt iRequestIndex; + + TOngoingFetchInfo() : + iRequest( NULL ), + iPartIndex( KErrNotFound ), + iMessageId( KMsgStoreInvalidId ), + iRequestIndex( 0 ) + { } + }; + + __LOG_DECLARATION + }; + + +/** + * There is mailbox-related state information that is used to bind + * the FSEF representation and the MsgStore one. This entity groups + * it in one place. + */ +class CMailboxInfo : public CBase + { + public: + CMailboxInfo( CBasePlugin* aBasePlugin ) + : iBasePlugin( aBasePlugin ) + { + } + + virtual ~CMailboxInfo() + { + iMailBox->RemoveObserverL( iBasePlugin ); + iObservers.Close(); + + delete iMailBoxName; + delete iMailBoxDisplayName; + delete iBrandingId; + delete iMailBox; + }; + + CMsgStoreMailBox& operator() () + { + return *iMailBox; + } + + public: + CMsgStoreMailBox* iMailBox; + HBufC* iMailBoxName; + HBufC* iMailBoxDisplayName; + HBufC* iBrandingId; + //does not actually own the observers. + RPointerArray iObservers; + CBasePlugin* iBasePlugin; + + TMsgStoreRootFolders iRootFolders; + }; + + +/** + * Asynchronous attachment/body fetch descriptor. + */ +/**@ move to separate unit.*/ +NONSHARABLE_CLASS (CFetchRequester) : public CBase + { + friend class CBasePlugin; + + public: + static CFetchRequester* NewL( + CBasePlugin& aPlugin, + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& iMessageId, + const RArray& aMessages, + MFSMailRequestObserver& aObserver, + TInt aRequestId ); + + virtual ~CFetchRequester(); + + private: + CFetchRequester( + CBasePlugin& aPlugin, + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& iMessageId, + MFSMailRequestObserver& aObserver, + TInt aRequestId ); + void ConstructL( const RArray& aMessages ); + + private: + CBasePlugin& iPlugin; + public: + RArray iParts; + MFSMailRequestObserver& iObserver; + TFSMailMsgId iMailBoxId; + TFSMailMsgId iMessageId; + TInt iRequestId; + + __LOG_DECLARATION + }; + +#endif // __BASEPLUGIN_H__