email/alwaysonlineemailplugin/inc/AlwaysOnlineImapAgent.h
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/alwaysonlineemailplugin/inc/AlwaysOnlineImapAgent.h	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,315 @@
+/*
+* Copyright (c) 2002 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: 
+*     Imap agent implementation
+*
+*/
+
+#ifndef __ALWAYSONLINEIMAPAGENT_H__
+#define __ALWAYSONLINEIMAPAGENT_H__
+
+#include "AlwaysOnlineEmailAgentBase.h"
+#include "AlwaysOnlineImap4FolderObserver.h"
+#include "AlwaysOnlineEmailFlags.h"
+
+#include <mtclreg.h>//ClientMtmRegistry
+#include <impcmtm.h>//imapclientmtm
+#include <imapconnectionobserver.h>
+
+
+
+enum
+    {
+    EAlwaysOnlineImap4ThisHasBeenSynced = 0x01,
+    EAlwaysOnlineImap4StayOnline = 0x02,
+    EAlwaysOnlineImap4StartFetchAfterFolderSync = 0x04,
+    EAlwaysOnlineImap4DontReconnect = 0x08,
+    EAlwaysOnlineImap4RemoveMeImmediately = 0x10,
+    EAlwaysOnlineImap4TemporaryConnectionObserver = 0x20,
+    EAlwaysOnlineImap4DontRemoveOnDisconnect = 0x40
+    };
+
+
+/**
+* CAlwaysOnlineImap4Agent 
+*
+* Class takes care of IMAP mailbox "always" online logic
+*/
+class CAlwaysOnlineImap4Agent : 
+    public CAlwaysOnlineEmailAgentBase,
+    public MMsvImapConnectionObserver,
+    public MAlwaysOnlineImap4FolderObserver
+    {
+    public:
+
+    
+        /**
+        * NewL
+        * Two phased constructor
+        * @param CMsvSession&, session reference
+        * @param CClientMtmRegistry&, mtm registry reference
+        * @param TMsvId, mailbox id
+        * @param MAlwaysOnlineStatusQueryInterface&, status query interface
+        * @param CAlwaysOnlineEmailAgent&, email agent reference
+        * @return CAlwaysOnlineImap4Agent*, self pointer
+        */
+        static CAlwaysOnlineImap4Agent* NewL( CMsvSession& aSession,
+            CClientMtmRegistry& aClientMtmRegistry,
+            TMsvId aMailboxId,
+            MAlwaysOnlineStatusQueryInterface& aAlwaysOnlineManager,
+            CAlwaysOnlineEmailAgent& aEmailAgent );
+
+        /**
+        * ~CAlwaysOnlineImap4Agent()
+        * Destructor
+        */
+        ~CAlwaysOnlineImap4Agent();
+
+        //from CAlwaysOnlineEmailAgentBase
+    public:
+
+        /**
+        * StartL
+        * from CAlwaysOnlineEmailAgentBase
+        */
+        void StartL();
+
+        /**
+        * ConnectAndUpdateHeadersL
+        * from CAlwaysOnlineEmailAgentBase
+        */
+        void ConnectAndUpdateHeadersL( );
+
+        
+        /**
+        * DisconnectL
+        * from CAlwaysOnlineEmailAgentBase
+        * @param TBool, automatic or manual disconnection
+        */
+        void DisconnectL( TBool aAutomatic );
+
+
+        /**
+        * ResumeL
+        * Need to override this to update EAlwaysOnlineImap4StayOnline flag
+        * from CAlwaysOnlineEmailAgentBase
+        */
+        void ResumeL( const TBool aConnectNow = EFalse );
+        
+
+        /**
+        * HandleImapConnectionEvent
+        * From MMsvImapConnectionObserver
+        * @param TImapConnectionEvent, imap connection event
+        */
+        virtual void HandleImapConnectionEvent(
+           TImapConnectionEvent aConnectionEvent);
+
+        /**
+        * From MAlwaysOnlineImap4FolderObserver
+        */
+    	virtual void HandleFolderEntryL( const CMsvEntrySelection& aFolderArray );
+
+        /**
+        *
+        */
+        void SetUpdateMailWhileConnectedL( TBool aAgentAlreadyCreated );
+
+    protected:
+        /**
+        * ChangeNextStateL
+        * from CAlwaysOnlineEmailAgentBase
+        */
+        void ChangeNextStateL();
+
+        /**
+        * HandleOpErrorL
+        * from CAlwaysOnlineEmailAgentBase
+        */
+        void HandleOpErrorL();
+
+       /**
+        * DoSyncDisconnectL(), from emailagentbase
+        * Does sync disconnect. Meant to be called from ResetAll().
+        * This is needed because this must not have imapact on state machine.
+        */
+        void DoSyncDisconnectL();
+
+        /**
+        * HandleOpCompleted
+        * from CAlwaysOnlineEmailAgentBase
+        * @param TMsvOp, id of completed operation
+        * @param, TInt, completion code
+        */
+        void HandleOpCompleted( TMsvOp opId, TInt aCompletionCode );
+
+        /**
+        * CreateCompletedOpL
+        * from CAlwaysOnlineEmailAgentBase
+        */
+        void CreateCompletedOpL();
+
+        /**
+        * SynchroniseNewL()
+        */
+        void SynchroniseNewL();
+
+        
+    private:
+
+        /**
+        * CAlwaysOnlineImap4Agent
+        * C++ constructor
+        * @param CMsvSession&, session reference
+        * @param CClientMtmRegistry&, mtm registry reference
+        * @param TMsvId, mailbox id
+        * @param MAlwaysOnlineStatusQueryInterface&, status query interface
+        * @param CAlwaysOnlineEmailAgent&, email agent reference
+        */
+        CAlwaysOnlineImap4Agent( CMsvSession& aSession,
+            CClientMtmRegistry& aClientMtmRegistry,
+            MAlwaysOnlineStatusQueryInterface& aAlwaysOnlineManager,
+            CAlwaysOnlineEmailAgent& aEmailAgent);
+
+        /**
+        * ConstructL
+        * @param TMsvId, mailbox id
+        */
+        void ConstructL( TMsvId aMailboxId );
+
+        /**
+        * StartWaitTimerL
+        * starts interval waiter. Does not handle schedule waits, only polling interval
+        */
+        void StartWaitTimerL();
+
+        /**
+        * CreateImap4OperationL
+        * aFunctionId ignored and completed operation is created if aCompletedOperation is true.
+        * @param TMsvOp&, this operation id is set in this function
+        * @param TInt, function Id
+        * @param TBool, ETrue if we want completed operation instead of real one
+        */
+        void CreateImap4OperationL( 
+            TMsvOp& aOpId, TInt aFunctionId, TBool aCompletedOperation = EFalse );
+
+        /**
+        * CreateImap4OperationL
+        * aFunctionId ignored and completed operation is created if aCompletedOperation is true.
+        * @param TInt, function Id
+        * @param TBool, ETrue if we want completed operation instead of real one
+        */
+        void CreateImap4OperationL( 
+            TInt aFunctionId, TBool aCompletedOperation = EFalse );
+
+        /**
+        * FetchNewMailL
+        */
+        TMsvOp FetchNewMailL();
+
+        /**
+        * FindInboxL
+        * @return TMsvId, folder if of inbox
+        */
+        TMsvId FindInboxL();
+
+        /**
+        * StartFolderSyncL()
+        * Starts imap folder sync and sets timer to repeat
+        */
+        void DoFolderSyncL();
+
+        
+        /**
+        * StartFolderSyncTimerL()
+        * Starts timer for folder sync.
+        */
+        void StartFolderSyncTimerL();
+
+        /**
+        * Updates iFolderArray member
+        * @since 2.6
+        */
+        void UpdateSubscribedFoldersL( 
+            TMsvId aServiceId );
+
+        /**
+        * Updates iFolderArray member
+        * @since 2.6
+        */
+        void DoUpdateSubscribedFoldersL( 
+            TMsvId aFolderId );
+
+        /**
+        * Appends iFolderArray (except aInboxId) to given folder selection
+        * @since 2.6
+        * @param aFolders:
+        * @param aInboxId
+        */
+        void AppendFolderArrayL( CMsvEntrySelection& aFolders, TMsvId aInboxId );
+
+        /**
+        *
+        * @since 2.6
+        */
+        void StartFolderObserverL();
+
+        /**
+        *
+        * @since 2.6
+        */
+        void StopFolderObserver();
+
+        /**
+        * Starts folder populate operation for the given folders 
+        * @since 2.6
+        * @param aFolder: folders to be populated
+        * @return operation id
+        */
+        TMsvOp FetchNewMailFromSelectedFoldersL( const CMsvEntrySelection& aFolders );
+
+
+        /**
+        * Sets flag for whether to stay online or disconnect.
+        */
+        void SetStayOnlineFlagL();
+
+        /**
+        * Is agent temporary?
+        * @since S60 3.1
+        * @return ETrue, if EAlwaysOnlineImap4TemporaryConnectionObserver
+        * flag is set.
+        */
+        TBool IsTemporary() const;
+
+        /**
+         * Fills mail fetching options
+         *
+         * @since S60 v3.2 
+         * @return  mail fetching options
+         */
+        TImImap4GetPartialMailInfo FillMailOptionsL();
+        
+        //data
+    private:
+        CImap4ClientMtm*                    iImap4ClientMtm;
+        CAlwaysOnlineImap4FolderObserver*   iFolderObserver; // at the moment only inbox, should we add others also?
+        CMsvEntrySelection*                 iFolderArray; // subscribed folders and last fetched mail
+        TMsvId                              iInboxId;
+        TAlwaysOnlineEmailFlags             iImap4StateFlags;
+    };
+
+
+#endif
+//EOF