ipsservices/ipssosplugin/inc/ipsplgsosbaseplugin.h
changeset 0 8466d47a6819
child 8 e1b6206813b4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ipsservices/ipssosplugin/inc/ipsplgsosbaseplugin.h	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,693 @@
+/*
+* Copyright (c) 2007 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: This file defines class CIpsPlgSosBasePlugin.
+*
+*/
+
+
+#ifndef IPSPLGSOSBASEPLUGIN_H
+#define IPSPLGSOSBASEPLUGIN_H
+
+//<cmail>
+#include "CFSMailPlugin.h"
+#include "MFSMailRequestObserver.h"
+//</cmail>
+#include <rconnmon.h>
+
+#include "ipsplgsosbaseplugin.hrh"
+#include "ipsplgcommon.h"
+#include "ipsplgsingleopwatcher.h"
+#include "ipsplgtimeroperation.h"
+
+class CMsvSession;
+class CIpsPlgTimerOperation;
+class CIpsPlgMsgMapper;
+class CImEmailMessage;
+class CIpsPlgMruList;
+class CIpsPlgSettingsObserver;
+class CRepository;
+class CIpsPlgSearch;
+class CIpsSetDataApi;
+class CIpsPlgSmtpService;
+class CIpsPlgSyncStateHandler;
+class CIpsPlgEventHandler;
+
+/**
+ *  FreestyleIpsServices plugin class
+ *
+ *  @lib ipssosplugin.lib
+ *  @since FSEmail 2.0
+ */
+class CIpsPlgSosBasePlugin :
+    public CFSMailPlugin,
+                             public MIpsPlgSingleOpWatcher,
+                             public MFSMailRequestObserver, // a dummy observer
+                             public MIpsPlgTimerOperationCallBack
+    {
+
+public:
+
+    /**
+    * ~CIpsPlgSosBasePlugin
+    * Destructor
+    */
+    IMPORT_C virtual ~CIpsPlgSosBasePlugin();
+
+public: //from MIpsPlgSingleOpWatcher
+
+    /**
+    *
+    */
+    void OpCompleted(
+        CIpsPlgSingleOpWatcher& aOpWatcher,
+        TInt aCompletionCode );
+
+public: //from MFSMailRequestObserver
+
+    /**
+    * no real implementation for this. we're just a dummy observer,
+    * so we can internally run our own operations, like DisconnectL
+    */
+    virtual void RequestResponseL( TFSProgress aEvent, TInt aRequestId );
+
+public: // from MIpsPlgTimerOperationCallBack
+
+    /**
+    * Called when activity timer fires
+    */
+    virtual void HandleTimerFiredL( const TFSMailMsgId& aMailboxId );
+
+public: // from CFSMailPlugin
+
+    virtual void SetMailboxName(
+         const TFSMailMsgId& aMailboxId,
+         const TDesC& aMailboxName );
+
+    virtual TFSMailBoxStatus GetMailBoxStatus(
+         const TFSMailMsgId& aMailBoxId );
+
+    virtual TFSMailMsgId SpecifiedSendingMailbox();
+
+    virtual void ListMailBoxesL( RArray<TFSMailMsgId>& aMailboxes);
+
+    virtual CFSMailBox* GetMailBoxByUidL( const TFSMailMsgId& aMailBoxId);
+
+    virtual void DeleteMailBoxByUidL(
+        const TFSMailMsgId& aMailBoxId,
+        MFSMailRequestObserver& aOperationObserver,
+        const TInt aRequestId );
+
+    virtual TDesC& GetBrandingIdL( const TFSMailMsgId& aMailBoxId);
+
+    virtual void MoveMessagesL(
+        const TFSMailMsgId& aMailBoxId,
+        const RArray<TFSMailMsgId>& aMessageIds,
+        const TFSMailMsgId& aSourceFolderId,
+        const TFSMailMsgId& aDestinationFolderId );
+
+    virtual TInt MoveMessagesL(
+        const TFSMailMsgId& aMailBoxId,
+        const RArray<TFSMailMsgId>& aMessageIds,
+        const TFSMailMsgId& aSourceFolderId,
+        const TFSMailMsgId& aDestinationFolderId,
+        MFSMailRequestObserver& aOperationObserver,
+        TInt aRequestId );
+
+    virtual void CopyMessagesL(
+        const TFSMailMsgId& aMailBoxId,
+        const RArray<TFSMailMsgId>& aMessageIds,
+        RArray<TFSMailMsgId>& aNewMessages,
+        const TFSMailMsgId& aSourceFolderId,
+        const TFSMailMsgId& aDestinationFolderId );
+
+    virtual MDesCArray* GetMrusL( const TFSMailMsgId& aMailBoxId );
+
+    virtual void SetMrusL(
+            const TFSMailMsgId& aMailBoxId,
+            MDesCArray* aNewMruList );
+
+    virtual const TFSProgress GetLastSyncStatusL(
+        const TFSMailMsgId& aMailBoxId );
+
+    virtual TInt CancelSyncL( const TFSMailMsgId& aMailBoxId );
+
+    // FOLDER HANDLING
+
+    virtual CFSMailFolder* GetFolderByUidL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aFolderId );
+
+    virtual CFSMailFolder* CreateFolderL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aFolderId,
+        const TDesC& aFolderName,
+        const TBool aSync );
+
+    virtual void DeleteFolderByUidL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aFolderId);
+
+    // MESSAGE FETCH AND STORE
+
+    virtual MFSMailIterator* ListMessagesL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aFolderId,
+        const TFSMailDetails aDetails,
+        const RArray<TFSMailSortCriteria>& aSorting );
+
+    virtual CFSMailMessage* GetMessageByUidL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aFolderId,
+        const TFSMailMsgId& aMessageId,
+        const TFSMailDetails aDetails);
+
+    virtual void DeleteMessagesByUidL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aFolderId,
+        const RArray<TFSMailMsgId>& aMessages );
+
+    // MESSAGE STORE OPERATIONS
+
+    virtual CFSMailMessage* CreateMessageToSendL(
+        const TFSMailMsgId& aMailBoxId );
+
+    virtual CFSMailMessage* CreateForwardMessageL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aOriginalMessageId,
+        const TDesC& aHeaderDescriptor );
+
+    virtual CFSMailMessage* CreateReplyMessageL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aOriginalMessageId,
+        const TBool aReplyToAll,
+        const TDesC& aHeaderDescriptor );
+
+    virtual void StoreMessageL(
+        const TFSMailMsgId& aMailBoxId,
+        CFSMailMessage& aMessage );
+
+    virtual void GetMessagesL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aFolderId,
+        const RArray<TFSMailMsgId>& aMessageIds,
+        RPointerArray<CFSMailMessage>& aMessageList,
+        const TFSMailDetails aDetails );
+
+    virtual void ChildPartsL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aParentFolderId,
+        const TFSMailMsgId& aMessageId,
+        const TFSMailMsgId& aParentId,
+        RPointerArray<CFSMailMessagePart>& aParts);
+
+    virtual CFSMailMessagePart* NewChildPartL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aParentFolderId,
+        const TFSMailMsgId& aMessageId,
+        const TFSMailMsgId& aParentPartId,
+        const TFSMailMsgId& aInsertBefore,
+        const TDesC& aContentType);
+
+    virtual CFSMailMessagePart* NewChildPartFromFileL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aParentFolderId,
+        const TFSMailMsgId& aMessageId,
+        const TFSMailMsgId& aParentPartId,
+        const TDesC& aContentType,
+        const TDesC& aFilePath );
+
+    /**
+     * Creates attachment based on file handle
+     * @param aMailBoxId specifies the mailbox
+     * @param aParentFolderId specifies the folder where message is
+     * @param aMessageId specifies message
+     * @param aParentPartId
+     * @param aContentType mime type
+     * @param aFile handle to open file
+     */
+    virtual CFSMailMessagePart* NewChildPartFromFileL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aParentFolderId,
+        const TFSMailMsgId& aMessageId,
+        const TFSMailMsgId& aParentPartId,
+        const TDesC& aContentType,
+        RFile& aFile );
+
+    virtual CFSMailMessagePart* CopyMessageAsChildPartL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aParentFolderId,
+        const TFSMailMsgId& aMessageId,
+        const TFSMailMsgId& aParentPartId,
+        const TFSMailMsgId& aInsertBefore,
+        const CFSMailMessage& aMessage);
+
+    virtual void RemoveChildPartL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aParentFolderId,
+        const TFSMailMsgId& aMessageId,
+        const TFSMailMsgId& aParentPartId,
+        const TFSMailMsgId& aPartId);
+
+    virtual CFSMailMessagePart* MessagePartL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aParentFolderId,
+        const TFSMailMsgId& aMessageId,
+        const TFSMailMsgId& aMessagePartId);
+
+    virtual TInt GetMessagePartFileL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aParentFolderId,
+        const TFSMailMsgId& aMessageId,
+        const TFSMailMsgId& aMessagePartId,
+        RFile& aFileHandle);
+
+    virtual void CopyMessagePartFileL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aParentFolderId,
+        const TFSMailMsgId& aMessageId,
+        const TFSMailMsgId& aMessagePartId,
+        const TDesC& aFilePath);
+
+    virtual void GetContentToBufferL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aParentFolderId,
+        const TFSMailMsgId& aMessageId,
+        const TFSMailMsgId& aMessagePartId,
+        TDes& aBuffer,
+        const TUint aStartOffset);
+
+    virtual void SetContentL(
+        const TDesC& aBuffer,
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aParentFolderId,
+        const TFSMailMsgId& aMessageId,
+        const TFSMailMsgId& aMessagePartId);
+
+    virtual void RemovePartContentL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aParentFolderId,
+        const TFSMailMsgId& aMessageId,
+        const RArray<TFSMailMsgId>& aPartIds);
+
+    virtual void SetPartContentFromFileL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aParentFolderId,
+        const TFSMailMsgId& aMessageId,
+        const TFSMailMsgId& aMessagePartId,
+        const TDesC& aFilePath);
+
+    virtual void StoreMessagePartL(
+        const TFSMailMsgId& aMailBoxId,
+        const TFSMailMsgId& aParentFolderId,
+        const TFSMailMsgId& aMessageId,
+        CFSMailMessagePart& aMessagePart);
+
+    virtual void UnregisterRequestObserver( TInt aRequestId );
+
+    // MESSAGE SENDING
+
+    virtual void SendL(TFSMailMsgId aMessageId );
+
+    virtual void SendMessageL( CFSMailMessage& aMessage );
+
+    // OPERATION HANDLING
+
+    virtual void GoOnlineL( const TFSMailMsgId& aMailBoxId );
+
+    virtual void GoOfflineL( const TFSMailMsgId& aMailBoxId );
+
+    virtual TFSProgress StatusL(const TInt aRequestId);
+
+    virtual void CancelL(const TInt aRequestId);
+
+    // Search API
+
+    virtual void SearchL(
+        const TFSMailMsgId& aMailBoxId,
+        const RArray<TFSMailMsgId>& aFolderIds,
+        const RPointerArray<TDesC>& aSearchStrings,
+        const TFSMailSortCriteria& aSortCriteria,
+        MFSMailBoxSearchObserver& aSearchObserver );
+
+    virtual void CancelSearch( const TFSMailMsgId& aMailBoxId );
+
+    virtual void ClearSearchResultCache( const TFSMailMsgId& aMailBoxId );
+
+    virtual void AddObserverL(MFSMailEventObserver& aObserver);
+
+    virtual void RemoveObserver(MFSMailEventObserver& aObserver);
+
+    virtual void SubscribeMailboxEventsL(const TFSMailMsgId& aMailBoxId,
+        MFSMailEventObserver& aObserver);
+
+    virtual void UnsubscribeMailboxEvents(
+        const TFSMailMsgId& aMailBoxId,
+        MFSMailEventObserver& aObserver);
+
+    virtual TSSMailSyncState CurrentSyncState(
+        const TFSMailMsgId& aMailBoxId);
+
+    virtual TInt WizardDataAvailableL( );
+
+    /**
+     * reads connection id from plugin
+     *
+     * @param  aConnectionId reference to connection id
+     * @return KErrNone or error code
+     */
+     virtual TInt GetConnectionId( TFSMailMsgId aMailBoxId, TUint32& aConnectionId );
+
+    /**
+     * checks from plugin if connection is allowed when roaming
+     *
+     * @param  aConnectionAllowed
+     * @return KErrNone or error code
+     */
+     virtual TInt IsConnectionAllowedWhenRoaming(
+             TFSMailMsgId aMailBoxId,
+             TBool& aConnectionAllowed );
+
+    virtual void AuthenticateL(
+        MFSMailRequestObserver& aOperationObserver,
+        TInt aRequestId );
+
+    virtual void SetCredentialsL(
+       const TFSMailMsgId& aMailBoxId,
+       const TDesC& aUsername,
+       const TDesC& aPassword );
+
+public:
+
+    /**
+    * Function to identify which protocol plugin we are working with
+    * @return MTM id
+    * @since FSEmail 2.0
+    */
+    TUid MtmId() const;
+
+    /**
+     * Returns the implementation ID of the plugin
+     *
+     * @return Implementation ID of the plugin
+     * @since FSEmail 2.0
+     */
+   TUint PluginId() const;
+
+    /**
+     * Disconnects mailbox
+     *
+     * @param aMailbox unique mailbox id
+     * @param FSObserver can be pointed at this class (dummy observer)
+     * @param aRequestId FS async operation request id, can be zero (dummy)
+     * @param aRemoveAccountAlso boolean to indicate should accound be
+     *                           removed afted disconnect, default is EFalse
+     * @since FSEmail 2.0
+     */
+    virtual void DisconnectL(
+        const TFSMailMsgId& aMailBoxId,
+        MFSMailRequestObserver& aObserver,
+        const TInt aRequestId,
+        TBool aRemoveAccountAlso = EFalse );
+
+    /**
+     * Fetch content of new mail, used in event handler
+     * needed because imap idle
+     *
+     * @param aMailbox unique mailbox id
+     * @param aNewId msv id of new mail
+     * @param aParentId new mail's parent entry id
+     * @since FSEmail 2.0
+     */
+    virtual void PopulateNewMailL(
+        const TFSMailMsgId& aMailboxId,
+        TMsvId aNewId,
+        TMsvId aParentId ) = 0;
+
+    /**
+     * Gets reference to activity timer object, used when clearing
+     * activity timer in operation complete function (online operation)
+     * activity timer disconnects mailbox if no operations are running in
+     * certain period of time
+     *
+     * @param aMailbox unique mailbox id
+     * @return reference to mailbox's activity timer object
+     * @since FSEmail 2.0
+     */
+    CIpsPlgTimerOperation& ActivityTimerL( const TFSMailMsgId& aMailBoxId );
+
+    /*
+     * Gets reference to sync state handler class
+     * @return reference to sync state handler
+     * @since FSEmail 2.0
+     */
+    CIpsPlgSyncStateHandler& GetSyncStateHandler();
+
+    /**
+     * This is called after msv session ready event comes from msv server
+     * @since FSEmail 2.0
+     */
+    void CompleteConstructL();
+
+
+    /**
+     * called if session terminated event is sent by msv server
+     * @since FSEmail 2.0
+     */
+    void SessionTerminated();
+
+    /**
+    * Does checks to see is connection attempt possible and allowed
+    * @param aMailboxId mailbox to do the checks to
+    * @param aReason (possible) reason code if EFalse is returned
+    * @return EFalse if can't proceed with connect
+    * @since FSEmail 2.0
+    */
+    TBool CanConnectL( const TFSMailMsgId& aMailboxId,
+        TInt& aReason );
+
+    /*
+     * Gludge type check is plugin instance running under ui process
+     * needed in event handler
+     * @since FSEmail 2.0
+     */
+    TBool IsUnderUiProcess();
+
+protected:
+
+    /*
+     * Constructor
+     * @param aFSPluginId uint of fs plugin implementation, imap or pop
+     */
+    CIpsPlgSosBasePlugin( const TUint aFSPluginId );
+
+    /*
+     * Called in subclasses ConstructL functions
+     */
+    void BaseConstructL();
+
+    /**
+     * passes completion event to protocol plugin
+     * If certain operation completion requires special handling,
+     * protocol plugin should keep the id of the operation
+     * so it can know, that this certain operation has completed.
+     */
+    virtual void HandleOpCompletedL(
+        CIpsPlgSingleOpWatcher& aOpWatcher,
+        TInt aCompletionCode ) = 0;
+
+    /**
+    * Sends pending messages from outbox, if user manually start
+    * send-receive operation.
+    */
+    void EmptyOutboxL( const TFSMailMsgId& aMailBoxId );
+
+    /**
+    * Checks if offline mode is activated
+    */
+    TBool OfflineModeSetL();
+
+    /**
+    * Checks if given local feature is turned on
+    */
+    TBool CIpsPlgSosBasePlugin::LocalFeatureL(
+        const TUid& aCenRepUid,
+        const TUint32 aKeyId,
+        const TUint32 aFlag );
+
+    /**
+    * Checks if we are roaming and are we allowed to
+    * connect if we are.
+    */
+    TBool RoamingCheckL();
+
+    /**
+    * Check network registration status i.e. are we in gsm or wlan network
+    */
+    TInt RegistrationStatusL();
+
+    /**
+    * Called from Imap Plugin's MoveMessagesL if destination folder
+    * is draft folder.
+    */
+    void MoveMessagesToDraftL(
+        const TFSMailMsgId& aMailBoxId,
+        const RArray<TFSMailMsgId>& aMessageIds,
+        const TFSMailMsgId& aSourceFolderId,
+        const TFSMailMsgId& aDestinationFolderId );
+
+private:
+
+    /**
+     * Returns a cached entry objects or creates new objects and keeps them
+     * in the cache.
+     * Returned objects should not be deleted in the calling method.
+     * Pointers are set NULL in the case of error.
+     * Pointers are valid until the method is called next time
+     * Method should be used only for entries representing messages (not
+     * folders or attachements).
+     */
+    void GetMessageEntryL(
+        TMsvId aId,
+        CMsvEntry*& aMessageEntry,
+        CImEmailMessage*& aImEmailMessage );
+
+    /*
+     * Cleans up the cached messages entries that have accessed with
+     * GetMessageEntryL()
+     */
+    void CleanCachedMessageEntries();
+
+    /**
+    * Cancel all online operations, use before disconnect
+    */
+    void CancelAllOnlineOperations( const TFSMailMsgId& aMailboxId );
+
+    /**
+    * Checks is there any connect operations running, meaning
+    * that we are "connected" state
+    */
+    TBool ConnOpRunning( const TFSMailMsgId& aMailBoxId  );
+
+    /**
+    * Cancel, delete and remove operation from iOperations array.
+    * Send Sync Completed event to plugin if operation is sync op
+    */
+    void DeleteAndRemoveOperation(
+            const TInt aOpArrayIndex, TInt aCompleteCode );
+
+private:
+
+    /**
+    * Maps symbian msv api's folder type to fs folder type
+    */
+    TFSFolderType GetFolderType(
+            CMsvEntry* aEntry,
+            TFSMailMsgId aFolderId );
+
+    /**
+    * Set folders to blocklist in online, offline or in both cases.
+    * Operations (move/copy) allowed only between remote folders
+    * (+IMAP inbox) in online mode and Outbox->Drafts
+    */
+    void BlockCopyMoveFromFoldersL(
+        CMsvEntry* aFolderEntry,
+        TFSMailMsgId aFolderId,
+        CFSMailFolder& aFSMailFolder );
+
+    /**
+     * Set IMEI code to service's TEntry.iDescription
+     */
+    void StoreIMEIToMailboxL( const TMsvId aMailboxId );
+
+    /**
+     * Deletes the activity timer related to the specified mailbox, if it exists.
+     * If no timer is found, method returns silently
+     * @param aMailBoxId specifies the mailbox
+     */
+    void DeleteActivityTimer( const TFSMailMsgId& aMailBoxId  );
+
+protected: // internal enumerations and data structures
+
+    enum TSyncStatesInCenRep
+        {
+        ESyncFinishedSuccessfully = 103,
+        ESyncError,
+        ESyncCancelled
+        };
+
+private:
+
+    CIpsPlgSosBasePlugin();
+
+protected:
+
+    // uint of fs plugin implementation, pop of imap
+    const TUint iFSPluginId;
+
+    // Symbian message server session
+    CMsvSession* iSession;
+
+    // Message mapper instance
+    CIpsPlgMsgMapper* iMsgMapper;
+
+    //array of operation watchers
+    RPointerArray<CIpsPlgSingleOpWatcher>   iOperations;
+
+    //array of activity timers
+    RPointerArray<CIpsPlgTimerOperation>   iActivitytimers;
+
+    // contains smtp protocol related functions
+	CIpsPlgSmtpService* iSmtpService;
+
+    // Cached Symbian message data structures
+    CMsvEntry* iCachedEntry;
+    CImEmailMessage* iCachedEmailMessage;
+
+    // read and write most recent used address list
+    CIpsPlgMruList* iMruList;
+
+    // Search Engine
+    CIpsPlgSearch*  iSearch;
+
+    // interface to mailbox settings
+    CIpsSetDataApi*     iSettingsApi;
+
+    // maps symbian events to fs events
+    CIpsPlgEventHandler*    iEventHandler;
+
+    // keeps track is sync started in some plugin instance
+    // or in always online needed when mailbox status is asked
+    CIpsPlgSyncStateHandler* iSyncStateHandler;
+
+    RConnectionMonitor              iConMon;
+
+    // flag indicates is msv session ready
+    TBool iSessionOk;
+
+    TBuf<KIpsPlgMaxPhoneIdLength>  iIMEI;
+
+    // branding id i.e. "yahoo.com" or "google"
+    HBufC*  iBrandingId;
+
+    // flag indicates is instance under FSEmail.exe
+    TBool iIsUnderUiProcess;
+
+    // <cmail> delete draft synchronously
+    CActiveSchedulerWait iWait;
+	// </cmail>
+	};
+
+#endif /* IPSPLGSOSBASEPLUGIN_H */
+
+// End of File