emailservices/emailstore/base_plugin/inc/BasePlugin.h
changeset 0 8466d47a6819
child 8 e1b6206813b4
--- /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 <e32std.h>
+#include <e32base.h>
+
+#include "CFSMailPlugin.h"
+#include "mmrorganizer.h"
+
+//<cmail>
+#include "MsgStoreFolderUtils.h"
+#include "MsgStoreMailBox.h"
+#include "MsgStoreMailBoxObserver.h"
+#include "MsgStoreMessage.h"
+#include "MsgStoreObserver.h"
+#include "DebugLogMacros.h"
+//</cmail>
+
+#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<CMsgStoreMessagePart> iMsgChildren;
+        RPointerArray<CMsgStoreMessagePart> 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<TFSMailMsgId>& 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<TFSMailMsgId>& aMessageIds,
+            const TFSMailMsgId& aSourceFolderId,
+            const TFSMailMsgId& aDestinationFolderId );
+
+        IMPORT_C virtual void CopyMessagesL(
+            const TFSMailMsgId& aMailBoxId,
+            const RArray<TFSMailMsgId>& aMessageIds,
+            RArray<TFSMailMsgId>& 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<CFSMailFolder>& aFolderList );
+
+        IMPORT_C virtual void ListFoldersL(
+            const TFSMailMsgId& aMailBoxId,
+            RPointerArray<CFSMailFolder>& 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<TFSMailSortCriteria>& 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<TFSMailMsgId>& 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<TFSMailMsgId>& aMessageIds,
+            TFSMailDetails aDetails,
+            MFSMailRequestObserver& aObserver,
+            TInt aRequestId );
+
+        IMPORT_C virtual void FetchMessagePartsL(
+            const TFSMailMsgId& aMailBoxId,
+     		const TFSMailMsgId& aFolderId,
+     		const TFSMailMsgId& aMessageId,
+     		const RArray<TFSMailMsgId>& aMessagePartIds,
+        	MFSMailRequestObserver& aOperationObserver,
+			const TInt aRequestId,
+        	const TUint aPreferredByteCount );
+
+        IMPORT_C virtual void GetMessagesL(
+            const TFSMailMsgId& aMailBoxId,
+            const TFSMailMsgId& aParentFolderId,
+            const RArray<TFSMailMsgId>& aMessageIds,
+            RPointerArray<CFSMailMessage>& aMessageList,
+            TFSMailDetails aDetails );
+
+        IMPORT_C virtual void ChildPartsL(
+            const TFSMailMsgId& aMailBoxId,
+            const TFSMailMsgId& aParentFolderId,
+			const TFSMailMsgId& aMessageId,
+     		const TFSMailMsgId& aParentId,
+     		RPointerArray<CFSMailMessagePart>& 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<TFSMailMsgId>& aPartIds );
+
+	    IMPORT_C virtual void SearchL(
+	        const TFSMailMsgId& aMailBoxId,
+			const RArray<TFSMailMsgId>& aFolderIds,
+			const RPointerArray<TDesC>& 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<CFSMailFolder>& 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<CFSMailAddress>& 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<CMsgStoreMessagePart>& GetCachedMsgChildrenL();
+
+	    IMPORT_C RPointerArray<CMsgStoreMessagePart>& 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<TInt64, CMailboxInfo> iMailboxes;
+
+        //does not actually own the observers.
+        RPointerArray<MFSMailEventObserver> iObservers;
+        //async fetch reqs.
+        RPointerArray<CFetchRequester> 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<MFSMailEventObserver> 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<TFSMailMsgId>& 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<TFSMailMsgId>& aMessages );
+
+    private:
+        CBasePlugin& iPlugin;
+    public:
+        RArray<TFSMailMsgId> iParts;
+        MFSMailRequestObserver& iObserver;
+        TFSMailMsgId iMailBoxId;
+        TFSMailMsgId iMessageId;
+        TInt iRequestId;
+
+        __LOG_DECLARATION
+    };
+
+#endif // __BASEPLUGIN_H__