email/pop3andsmtpmtm/imapservermtm/inc/IMPSMTM.H
changeset 25 84d9eb65b26f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/pop3andsmtpmtm/imapservermtm/inc/IMPSMTM.H	Mon May 03 12:29:07 2010 +0300
@@ -0,0 +1,284 @@
+// 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:
+//
+
+#ifndef __IMPSMTM_H__
+#define __IMPSMTM_H__
+
+#include <mtsr.h>
+#include <msvstd.h>
+
+#include <imapset.h>
+#include <imapcmds.h>
+#include "mimapsessionobserver.h"
+
+#include <offop.h>
+
+// Forward declarations
+class CImImap4Session;
+class CImImap4FolderSync;
+class CImImap4Synchronise;
+class CImap4ServerMtm;
+class CImImap4Compound;
+class CImap4OffLineControl;
+class CImap4Utils;
+
+//******************
+// MActiveWrapperObserver - A Mixin class which provides mechanism to communicate to CActiveOwner
+//******************
+class MActiveWrapperObserver
+/**
+@internalComponent
+@released
+*/
+	{
+public:	
+	virtual void RequestCompleted(TInt aChildActiveObjectID, TInt aError)=0;
+	virtual void Activate()=0;
+	virtual void NonCompletedFailureOnSession(TInt aId)=0;
+	};
+
+//*******************
+// CActiveWrapper - The wrapper class which owns a CmsgActive and signals its Cactive parent
+//*******************
+
+// CActiveWrapper is the 'thin' CActive object which wraps each of your CMsgActive objects
+class CActiveWrapper : public CActive, public MImapSessionObserver
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	static CActiveWrapper* NewL(TInt aID);
+	void StartL(MActiveWrapperObserver* aManager);
+	~CActiveWrapper();
+	TRequestStatus* SessionStatus();
+	void SetEntry(CMsvServerEntry* aEntry);
+	
+	// Return of current imap4session
+	CImImap4Session* GetImap4Session();
+	
+protected:
+	void RunL();
+	void DoCancel();
+	void DoComplete(TInt aStatus);
+
+private:
+	CActiveWrapper(TInt aID);
+	void ConstructL();
+
+	// From MImapSessionObserver
+	void NonCompletedFailure();
+private:
+	TInt iID;							// my unique ID which my parent uses to identify me
+	MActiveWrapperObserver* iParentPtr;	// handle to my parent (and hence its Completed() function)
+
+protected:
+	// The session which CActiveWrapper owns
+	CImImap4Session*	iSession;
+
+	// Class for compound operations
+	CImImap4Compound*	iCompound;
+
+	// Full synchronise class (only ever instantiated on primary session)
+	CImImap4Synchronise*	iFullSync;
+
+private:
+	friend class CImap4ServerMtm;
+	};
+
+// package buffer for progress info.
+typedef TPckgBuf<TImap4CompoundProgress> TImap4ProgressBuf;
+
+// States that MTM can be in
+/**
+@internalComponent
+@released
+*/
+enum TMtmState
+	{
+	EMtmStateIdle=0,
+	EMtmStateCopyToLocal,
+	EMtmStateCopyFromLocal,
+	EMtmStateCopyWithinService,
+	EMtmStateMoveToLocal,
+	EMtmStateMoveFromLocal,
+	EMtmStateMoveWithinService,
+	EMtmStateDeleteAfterMove,
+	EMtmStateDelete,
+	EMtmStateDeleteFolder,
+	EMtmStateCreateFolder,
+	EMtmStateRenameFolder,
+	EMtmStatePrimaryConnect,
+	EMtmStateSecondaryConnect,
+	EMtmStateForegroundSync,
+	EMtmStateMiscCommand,
+	EMtmStateWaitingForBackgroundToFinish,
+	EMtmStateSyncCompleted,
+	EMtmStatePopulate,
+	EMtmStateLogging,
+	EMtmStateOffLineDelete,
+	EMtmStateOffLineUndelete,
+	EMtmStateOffLineCopyToLocal,
+	EMtmStateOffLineMoveToLocal,
+	EMtmStateOffLineCopyFromLocal,
+	EMtmStateOffLineMoveFromLocal,
+	EMtmStateOffLineCopyWithinService,
+	EMtmStateOffLineMoveWithinService,
+	EMtmStateOffLinePopulate,
+	EMtmStateSecondarySessionIdle
+	};
+
+class CImap4ServerMtm : public CBaseServerMtm, public MActiveWrapperObserver
+/**
+@internalTechnology
+@released
+*/
+	{
+public:
+	IMPORT_C static CImap4ServerMtm* NewL(CRegisteredMtmDll& aRegisteredMtmDll,CMsvServerEntry* aEntry);
+	~CImap4ServerMtm();
+
+	void CopyToLocalL(const CMsvEntrySelection& aSelection,TMsvId aDestination, TRequestStatus& aStatus);
+	void CopyFromLocalL(const CMsvEntrySelection& aSelection,TMsvId aDestination, TRequestStatus& aStatus);
+	void CopyWithinServiceL(const CMsvEntrySelection& aSelection,TMsvId aDestination, TRequestStatus& aStatus);
+	void MoveToLocalL(const CMsvEntrySelection& aSelection,TMsvId aDestination, TRequestStatus& aStatus);
+	void MoveFromLocalL(const CMsvEntrySelection& aSelection,TMsvId aDestination, TRequestStatus& aStatus);
+	void MoveWithinServiceL(const CMsvEntrySelection& aSelection,TMsvId aDestination, TRequestStatus& aStatus);
+	void DeleteAllL(const CMsvEntrySelection& aSelection, TRequestStatus& aStatus);
+	void CreateL(TMsvEntry aNewEntry, TRequestStatus& aStatus);
+	void ChangeL(TMsvEntry aNewEntry, TRequestStatus& aStatus);
+	//
+	void StartCommandL(CMsvEntrySelection& aSelection, TInt aCommand, const TDesC8& aParameter, TRequestStatus& aStatus);
+	//
+	TBool CommandExpected();
+	//
+	const TDesC8& Progress();
+
+	// What state we're in
+	enum
+		{
+		EBothIdle=0,
+		EPrimaryBusy,
+		EBothBusy,
+		ESecondaryBusy
+		};
+protected:
+	void DoCancel();
+	void DoRunL();
+	void DoComplete(TInt aError);
+	
+	// From MActiveWrapperObserver
+	void RequestCompleted(TInt aId, TInt aCode);
+	void Activate();
+	void NonCompletedFailureOnSession(TInt aId);
+
+private:
+	CImap4ServerMtm(CRegisteredMtmDll& aRegisteredMtmDll,CMsvServerEntry* aEntry);
+	void ConstructL();
+	TInt CheckSelectionL(const CMsvEntrySelection& aSelection,
+					 	 CMsvEntrySelection* aLocalCopy,
+				 		 const TBool aMessages,
+				 		 const TBool aParts,
+						 const TBool aFolders,
+						 const TBool aIsInService);
+//	void SaveOperationL(CImOffLineOperation& aOperation);
+	void MessageErrorL(const TMsvId aMessageId, const TInt aError);
+	TInt SetLocalSubscription(const TMsvId aFolder, const TBool aSubscribed);
+	void MtmCommandL(const TInt aType,const CMsvEntrySelection& aSelection, TMsvId aDestination, TRequestStatus& aStatus);
+	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 GoneOffline();
+
+	// 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);
+
+	// Get children, leave if error
+	void GetChildrenL(CMsvEntrySelection& aSelection);
+
+	void DeleteEntryL(TMsvId aId);
+	void UndeleteAllL(const CMsvEntrySelection& aSelection, TRequestStatus& aStatus);
+
+	// now used instead of ChangeL
+	TBool RenameFolderL(TMsvId aId, const TImap4RenameFolder& aRename);
+
+	// load or reload service settings
+	void LoadSettingsL(TMsvId aId);
+
+	void ClearNewFlagL(TMsvId aParent);
+
+	TBool PruneMessages(const CMsvEntrySelection& aSelection);
+	TBool IsPartialPopulate(TDes8& aParameter);
+
+private:
+	TInt						iProgressMsgsToDo;
+	TInt						iProgressMsgsDone;
+	TInt						iProgressErrorCode;
+	TImap4ProgressBuf			iProgressBuf;
+
+	TImap4GenericProgress::TImap4GenericProgressState	iLastSessionState;
+	TImap4GenericProgress::TImap4GenericProgressOp		iRequestedOperation;
+
+	TMsvId						iServiceId;
+
+	// Copy of the service's settings
+	CImImap4Settings*			iServiceSettings;
+
+	// Internal state for multipart operations
+	TMtmState					iState;
+	TMtmState					iSavedState;
+	TInt						iLastCommand;
+	CMsvEntrySelection*			iSelection;
+	CMsvEntrySelection*			iOneSelection;
+	TMsvId						iDestination;
+
+	// The two sessions that we can deal with
+	CActiveWrapper*				iPrimarySession;
+	CActiveWrapper*				iSecondarySession;
+
+	// the object that manages our offline operations
+	CImap4OffLineControl*		iOffLineControl;
+	
+	// The session the last command was issued to
+	CActiveWrapper*				iCurrentSession;
+	TInt						iId;
+	TInt						iCode;
+
+	// State of sessions
+	//TInt						iSessionState;
+	TBool						iBackgroundSyncInProgress;
+	TBool						iBatchInProgress;
+
+	// Can we be deleted now?
+	TBool						iCanBeDeletedNow;
+
+	// Should we clear New flag on messages?
+	TBool						iClearNewFlagOnNextSync;
+
+	TRequestStatus*				iRequest;
+
+	TImap4GetMailOptions		iGetMailOptions;
+
+	CImap4Utils*				iUtils;
+
+	TInt						iTotalSize;
+	TImImap4GetPartialMailInfo	iPartialMailInfo;
+	};
+#endif