// POPSMTM.H
//
// Copyright (c) 1998 Symbian Ltd.  All rights reserved. 
// 

#if !defined(__POPSMTM_H__)
#define __POPSMTM_H__



#if !defined(__E32BASE_H__)
#include <e32base.h>
#endif

#include "msvstd.h"
#include <mtsr.h>

#include "pops.h"
#include "popsmbx.h"

//////////////////////////////////////

enum TPopsMtmState{ EPopConnecting, EPopRefreshing, EPopCopying, EPopMoving, EPopDeleting, EPopQuitting, EPopTidying, EPopConnectedAndIdle, EPopDisconnected };

//**********************************
// CImppServerMtm
//**********************************
// 
// POP3 server MTM

// package buffer for progress info.
typedef TPckgBuf<TPop3Progress> TPop3ProgressBuf;

#define KImPopsMTMResourcePath _L("c:\\system\\data\\imcv.r01")

//
// Forward declarations
class CImPop3Settings;
//
//
class CImppServerMtm : public CBaseServerMtm
{
public:
	IMPORT_C static CImppServerMtm* NewL(CRegisteredMtmDll& aPopServerMtmDll);
	~CImppServerMtm();
	//
	void CopyFromLocalL(const CMsvEntrySelection& aSelection, TMsvId aDestination, TRequestStatus& aStatus);
	void CopyToLocalL(const CMsvEntrySelection& aSelection, TMsvId aDestination, TRequestStatus& aStatus);
	void CopyWithinServiceL(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);
	//
	const TDesC8& Progress();

	TBool CommandExpected();
	//
	void SetInitialEntry(CMsvServerEntry* aEntry);

	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);
private:
	CImppServerMtm(CRegisteredMtmDll& aPopServerMtmDll);
	void ConstructL();

	void DoCancel();
	void DoRunL();
	void DoComplete(TInt aError);

	void DoConnectL(TRequestStatus& aStatus);
	void DoRefreshL();
	void DoCopyMoveL(const CMsvEntrySelection& aSelection, TMsvId aDestination, TRequestStatus& aStatus, TBool aMove);
	void DoQuitL(TRequestStatus& aStatus);

	void GetPopDetailsL(CMsvEntrySelection& aSel);
	void QueueRemoteCleanup();  // tidy up if anything goes wrong with refresh

	void ResetProgress();

    //  Called from DoRun() sets TMsvEntry visible flag for each POP3 child. 
    void DoShowMessagesL( TBool aHide);
	void CommandComplete( TInt aErrorCode );
	CMsvEntrySelection* StripInvalidEntriesLC(const CMsvEntrySelection& aSelection) const;

	//
private:
	CMsvServerEntry*			iEntry;

	CImPop3Session*				iPopSession;
	CImPop3RefreshMailBox*		iPopRefreshMailbox;
	CImPop3CopyMove*			iPopCopyMove;
	CImPop3Delete*				iPopDelete;

	RFs							iFs; // temporary;
	TPopsMtmState				iCurrentOperation;	// an enum

	CArrayFixFlat<TMsvId>*		iMsvIdArray;		// stores any failed refresh msgs
	TInt						iArrayCtr;
	TRequestStatus*				iReportStatus;
	// Pop3 settings
	CImPop3Settings*			iPopSettings;

	TPop3Progress				iPopProgress;
	TPop3ProgressBuf			iPopProgressBuf;

	TBool						iConnectedToPopMbox;
	TBool						iOperationActive;

	TMsvId						iServiceId;
	TUint						iPort;
	TInt	iDoCallShowMessages;
public:
	};

#endif