diff -r fa1df4b99609 -r ebe688cedc25 email/pop3andsmtpmtm/imapservermtm/inc/IMAPSYNC.H --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/pop3andsmtpmtm/imapservermtm/inc/IMAPSYNC.H Tue Aug 31 15:11:31 2010 +0300 @@ -0,0 +1,226 @@ +// Copyright (c) 1998-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: +// CImImap4Synchronise header +// +// + +#if !defined(__IMAPSYNC_H__) +#define __IMAPSYNC_H__ + +#include +#include +#include + +// Forward declarations +class CImImap4Session; +class CImImap4FolderSync; +class CImap4OffLineControl; +class CImap4Utils; + +// List of folders to be synchronised +class TImImap4SyncList +/** +@internalComponent +@released +*/ + { +public: + TMsvId iFolder; + TTime iLastSync; + TBool iNotSelectable; + }; + +class CImImap4Synchronise : public CMsgActive +/** +@internalComponent +@released +*/ + { +public: +// States +enum TSynchroniseState + { + ESyncStateIdle=1, + EInboxSelect, + EInboxPendingOps, + EInboxSync, + ESynchroniseFolderTree, // this must be in the correct place + ECheckRemoteSubscription, + EProcessRemoteSubscription, + EUpdateRemoteSubscription, + EFolderSelect, + EFolderPendingOps, + EFolderSynchronise, + EInboxEarlyDeletes, + EFolderEarlyDeletes, + EFolderEarlyExpunge, + EEndSelectInbox, + EInboxLateExpunge, + EFolderLateDeletes, + EFolderLateExpunge, + EInboxLogMessage, + EFolderLogMessage, + EStartIdle, + ESynchronise, + ESynchroniseTree, + ESynchroniseDeletes + }; + +public: + ~CImImap4Synchronise(); + static CImImap4Synchronise* NewLC(CImImap4Session *aSession); + static CImImap4Synchronise* NewL(CImImap4Session *aSession); + void ConstructL(CImImap4Session *aSession); + + // Mirror folder tree of remote server + void SynchroniseL(TRequestStatus& aStatus, TMsvId aRoot, TBool aNewInvisible, TBool aPerformDeletes, TBool aConnectAndSync = EFalse); + void SynchroniseDeletesL(TRequestStatus& aStatus, TMsvId aServiceId); + void SynchroniseTreeL(TRequestStatus& aStatus, TMsvId aServiceId, TBool aNewFoldersAreInvisible); + + // Set serverentry to use + void SetEntry(CMsvServerEntry* aEntry); + + // set OffLineControl to use + void SetOffLineControl(CImap4OffLineControl *aOffLine); + void SetUtils(CImap4Utils *aUtils); + + // Progress + TImap4SyncProgress Progress(); + +private: + CImImap4Synchronise(); + void DoRunL(); + void DoCancel(); + void DoComplete(TInt& aStatus); + + // once round the state machine, returns whether to go round again + TBool DoRunLoopL(); + + // do the appropriate offline operation + void DoOpL(const CImOffLineOperation& aOp); + + // finish up the op just done (send log message, append delete + // etc.) + void DonePendingOpL(); + + // process the next one in the outstanding ops list. Returns ETrue + // if finished + TBool NextPendingOpL(); + + // process pending deletes of the type given in the given + // folder. Returns ETrue if any items were deleted + TBool MatchDeleteOp(const CImOffLineOperation& aOp , TBool aMoveDeletesOnly ); + TBool ProcessPendingDeleteOpsL( TMsvId aFolder, TBool aMoveDeletesOnly ); + TBool ProcessPendingDeleteOpsListL( TBool aMoveDeletesOnly ); + + // Add folders to 'to do' list according to prevailing strategy + void AddLocalFoldersL(const TMsvId aFolder); + + // helper function for AddLocalFolders + void AddIfNotThereL(TMsvId aFolder, CArrayFix* aFolderList); + + // Sort to-do list + void SortFolderListL(); + + // Set entry, leave if error (not related to setentry() which sets iEntry) + void SetEntryL(const TMsvId aId); + + // Change entry, leave if error + void ChangeEntryL(const TMsvEntry& aEntry); + + // Change entry in bulk mode (i.e. no index file commit), leave if error + void ChangeEntryBulkL(const TMsvEntry& aEntry); + + // Get children, leave if error + void GetChildrenL(CMsvEntrySelection& aSelection); + + // make aId and its parents visible + void MakeVisibleL(TMsvId aId); + + // get the offlineOpArray from the id and set up iOutstandingOps and Folder + TBool RefreshOutstandingOpsL(TMsvId aId); + + void ResetStats(); + void GetInboxL(); + +private: + // IMAP4 session to use + CImImap4Session* iSession; + + // Folder tree synchronisation + CImImap4FolderSync* iFolderSync; + + // Compound operation used for multi-step IMAP operations + CImImap4Compound* iCompound; + + // Synchronisation state + TSynchroniseState iState; + TMsvId iServiceId; + TMsvId iFolderId; + TMsvId iInbox; + TBool iNewFoldersAreInvisible; + TBool iPerformDeletes; + + // Folders to synchronise + TFolderSyncType iSynchroniseStrategy; + TFolderSubscribeType iSubscribeStrategy; + CArrayFix* iFolderList; + // temporary list of folders to be added to iFolderList at end + CArrayFix* iFolderListDest; + + // List of folders to subscribe or unsubscribe from + CArrayFix* iSubscribeList; + CArrayFix* iUnsubscribeList; + + // List of outstanding operations on inbox/other folder + CImOffLineOperationArray* iOutstandingOps; + // current folder p=being processed + TMsvId iOutstandingOpsFolder; + + // list of ids that need to be deleted because they were the + // source of a move + CArrayFix* iOutstandingMoveTypeDeletes; + CArrayFix* iOutstandingLocalDeletes; + + // source id of current operation if it was a move and so should + // be deleted afterwards + TMsvId iMovedId; + + // shadow id of current operation - to be deleted when op finishes + TMsvId iShadowId; + + // Access to message database + CMsvServerEntry* iEntry; + + // Timer for new mail check + RTimer iCheckMailbox; + + // Current request status + TRequestStatus* iRequestStatus; + + // pointer to offline control object held by MTM + CImap4OffLineControl* iOffLineControl; + + TImap4SyncProgress iProgress; + + CImap4Utils* iUtils; + + TBool iIdleBeforeCommand; + + // Flag to indicate Pending Operation/s are done on folder, need to sync Inbox + TBool iPendingOpOnFolder; + + }; + +#endif