diff -r 000000000000 -r 72b543305e3a email/imap4mtm/imapprotocolcontroller/inc/cimapprotocolcontroller.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/imap4mtm/imapprotocolcontroller/inc/cimapprotocolcontroller.h Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,266 @@ +// Copyright (c) 2006-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: +// + +#ifndef __CIMAPPROTOCOLCONTROLLER_H__ +#define __CIMAPPROTOCOLCONTROLLER_H__ + +#include +#include +#include + +#include "cimapidlecontroller.h" +#include "mimapopbackgroundsyncobserver.h" +#include "mimmobileserver.h" +#include "cimmobilitymanager.h" + +/** +package buffer for progress info. +@internalComponent +@prototype +*/ +typedef TPckgBuf TImap4ProgressBuf; + +// Forward Declarations +class CImapCompoundBase; +class CImapSessionManager; +class CImapSession; +class CImapSettings; +class CImapMailStore; +class CImapSyncManager; +class CMsgActive; +class TImImap4GetPartialMailInfo; +class CImapOpBackgroundSync; +class CImapOfflineControl; + +/** +Provides an API for connecting/disconnecting to a remote IMAP server and for +connected IMAP operations. +Manages background online activities: synchronisation after connection +and the usage of IMAP idle between requested operations. +Uses instance of class CImapSyncManager to manage synchronisation of folders +on the remote IMAP server and the headers contained within subscribed folders. +Uses instances of CImapCompoundBase derived classes to perform requested +operations. +@internalTechnology +@prototype +*/ +class CImapProtocolController : public CMsgActive, + public MImapOpBackgroundSyncObserver, + public MImapIdleControllerObserver, + public MImMobileServer + { +public: + + typedef RPointerArray RImapSessionArray; + + virtual ~CImapProtocolController(); + IMPORT_C static CImapProtocolController* NewL(CMsvServerEntry& aEntry,CImapOfflineControl& aImapOfflineControl); + + // Connection APIs + IMPORT_C TBool Connected() const; + IMPORT_C void ConnectL( TRequestStatus& aStatus, + CMsvEntrySelection& aSelection ); + IMPORT_C void ConnectAndSynchroniseL( TRequestStatus& aStatus, + CMsvEntrySelection& aSelection ); + + IMPORT_C void DisconnectL(TRequestStatus& aStatus); + IMPORT_C TBool Busy() const; + IMPORT_C TInt GetAccessPointIdForConnection(TUint32& aAccessPointId) const; + + // Account Synchronisation APIs + IMPORT_C TBool BackgroundSyncInProgress() const; + IMPORT_C void CancelBackgroundSync(TRequestStatus& aStatus); + IMPORT_C void WaitForBackground(TRequestStatus& aStatus); + IMPORT_C void SynchroniseTreeL(TRequestStatus& aStatus); + IMPORT_C void SynchroniseAllL(TRequestStatus& aStatus); + + // from MImapOpBackgroundSyncObserver + void BackgroundSyncComplete(TInt aError); + + // from MImapIdleControllerObserver + void OnIdleError(TInt aError); + + // Message/Folder APIs + IMPORT_C void CopyToLocalL(TRequestStatus& aStatus, const CMsvEntrySelection& aSourceSel, const TMsvId aDestination); + IMPORT_C void PopulateL(TRequestStatus& aStatus, const CMsvEntrySelection& aSourceSel, TImImap4GetPartialMailInfo aGetPartialMailInfo); + IMPORT_C void MoveToLocalL(TRequestStatus& aStatus, const CMsvEntrySelection& aSourceSel, const TMsvId aDestination); + IMPORT_C void CopyWithinServiceL(TRequestStatus& aStatus, const CMsvEntrySelection& aSourceSel, const TMsvId aDestination); + IMPORT_C void MoveWithinServiceL(TRequestStatus& aStatus, const CMsvEntrySelection& aSourceSel, const TMsvId aDestination); + IMPORT_C void CopyFromLocalL(TRequestStatus& aStatus, const CMsvEntrySelection& aSourceSel, const TMsvId aDestination); + IMPORT_C void MoveFromLocalL(TRequestStatus& aStatus, const CMsvEntrySelection& aSourceSel, const TMsvId aDestination); + IMPORT_C void DeleteL(TRequestStatus& aStatus, const CMsvEntrySelection& aSourceSel); + IMPORT_C void DeleteFolderL(TRequestStatus& aStatus, const CMsvEntrySelection& aSelection); + IMPORT_C void NewOnlySyncFolderL(TRequestStatus& aStatus); + IMPORT_C void FullSyncFolderL(TRequestStatus& aStatus, const TMsvId aFolder); + IMPORT_C void SelectL(TRequestStatus& aStatus, const TMsvId aFolder); + IMPORT_C void FullSyncSelectedFolderL(TRequestStatus& aStatus); + IMPORT_C void CreateL(TRequestStatus& aStatus, const TMsvId aParent, const TDesC& aLeafName, const TBool aFolder ); + IMPORT_C void RenameL(TRequestStatus& aStatus, const TMsvId aTarget, const TDesC& aNewName); + + IMPORT_C TInt SetLocalSubscription(const TMsvId aFolder, TBool aSubscribed); + + // Progress and Cancel APIs + IMPORT_C TImap4CompoundProgress Progress(); + IMPORT_C void CancelAndCleanup(); + IMPORT_C void UpdateFlagL(TRequestStatus& aStatus); + + // mobility API from MImMobileServer + void PrepareForNewCarrier(TImMobilityAction aAction, TBool aIsSeamless); + void CarrierLost(); + void NewCarrierActive(TAccessPointInfo aNewAp, TBool aIsSeamless); + void MobilityError(TUint aError); + const TDesC8& MobilityProgress(); + + +private: + CImapProtocolController(CMsvServerEntry& aEntry,CImapOfflineControl& aImapOfflineControl); + + void ConstructL(); + // from CMsgActive + virtual void DoRunL(); + void DoComplete(TInt& aErr); + virtual void DoCancel(); + void DoCancelClientOp(); + + void DoDisconnectL(TRequestStatus& aStatus); + void DropSession(TInt aSessionId); + void DisconnectAll(); + TBool CompleteIfBackgroundOpInProgress(TRequestStatus& aStatus); + TBool SelectSessionL(TInt& aIndexToUse); + void StartPrimaryOperation(); + void StartIdle(); + + void MarkOnOrOfflineL(const TBool aOnline); + void ChangeVisibilityL(TMsvId aParent, TBool aInvisible); + void ChangeVisibilityL(TMsvId aParent, TBool aInvisible, TBool aRecurse, TUid aType); + void PropagateInvisibleFlagL(TMsvId aId); + void PropagateUnsubscribeL(const TMsvId aFolder); + + TBool IdIsLocalL(TMsvId aId); + TMsvId ServiceOfL(TMsvId aId); + + TBool ProcessError(TInt aError); + void ThranslateSessionError(TInt& errCode); + void ResetProgress(); + + // Migration methods + void DoMigrateRunL(); + void CompleteCurrentForMigrate(); + void StopCurrentForMigrate(); + void CancelForMigrate(); + void DoCancelForMigrate(); + void ProcessOpCompleteForMigrate(); + void DisconnectForMigrateL(); + void NewPrimarySessionL(); + void RestartAfterMigrateL(); + +private: + + enum TImapProtocolOp + { + /** Idle. The default connected state. */ + EIdle, + /** Connect operation. */ + EConnect, + /** Disconnect operation. */ + EDisconnect, + /** Sync operation. */ + ESync, + /** Select operation. */ + ESelect, + /** Copy messages to local operation. */ + ECopyToLocal, + /** Copy messages within remote server operation. */ + ECopyWithinService, + /** Copy messages from local operation. */ + ECopyFromLocal, + /** Move messages to local operation. */ + EMoveToLocal, + /** Move messages within remote server operation. */ + EMoveWithinService, + /** Move messages from local operation. */ + EMoveFromLocal, + /** Message population operation. */ + EPopulate, + /** Delete operation. (messages) */ + EDelete, + /** Delete operation. (folders) */ + EDeleteFolder, + /** Create operation. (folders) */ + ECreate, + /** Rename operation. (folders) */ + ERename, + /** Stop idle operation. */ + EStopIdle, + /** Connect a secondary session. */ + EConnectSecondary, + /** Recovering primary session following a cancel. */ + ECancelRecoverPrimary, + /** Update read/unread message flags */ + EUpdateFlag, + }; + + // protocol controller migration states + enum TImapPcMigrateState + { + ENotMigrating, // normal state + ESuspendingForMigrate, // intermediate state + EWaitingForOpToComplete, // async wait on compound op/bground op/idle controller + EWaitingForOpToStop, // async wait on compound op/bground op/idle controller + EDisconnectingForMigrate, // async wait on compound op + EWaitingForNewCarrier, // async wait state on mobility engine + EStartingReconnect, // intermediate state + EConnectingAfterMigrate, // async wait on session manager + EWaitingInitialCarrierRejected, // async wait state on mobility engine + EHandlingConnectError // Handling Initial connect error + }; + + CMsvServerEntry& iEntry; + + // objects the Protocol Controller owns + CImapSettings* iImapSettings; + CImapMailStore* iImapMailStore; + CImapSessionManager* iImapSessionManager; + RImapSessionArray iImapSessionArray; + CImapCompoundBase* iImapCompound; + CImapCompoundBase* iMigrateCompound; + + // CImapOfflineControl object is owned by the CImap4ServerMtm + CImapOfflineControl& iImapOfflineControl; + CImapSyncManager* iImapSyncManager; + CImapOpBackgroundSync* iBackgroundSyncOp; + CImapIdleController* iImapIdleController; + CImMobilityManager* iMobilityManager; + + // Service ID + TMsvId iServiceId; + + // Progress + TImap4CompoundProgress iProgress; + + // Current operational state + // Requested and current foreground operation + TImapProtocolOp iRequestedOp; + TImapProtocolOp iCurrentOp; + TInt iForegroundSession; + + TBool iWaitForBackgroundSync; + TBool iFlushPrimary; + TBool iCancelInProgress; + TImapPcMigrateState iMigrateState; + TImap4ProgressBuf iProgressBuffer; + }; + +#endif //__CIMAPPROTOCOLCONTROLLER_H__