email/pop3andsmtpmtm/imapservermtm/inc/IMAPSYNC.H
changeset 25 84d9eb65b26f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/pop3andsmtpmtm/imapservermtm/inc/IMAPSYNC.H	Mon May 03 12:29:07 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 <mentact.h>
+#include <msventry.h>
+#include <imapset.h>
+
+// 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<TImImap4SyncList>* 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<TImImap4SyncList>*	iFolderList;
+	// temporary list of folders to be added to iFolderList at end
+	CArrayFix<TImImap4SyncList>*	iFolderListDest;
+
+	// List of folders to subscribe or unsubscribe from
+	CArrayFix<TMsvId>*		iSubscribeList;
+	CArrayFix<TMsvId>*		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<TMsvId>*		iOutstandingMoveTypeDeletes;
+	CArrayFix<TMsvId>*		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