diff -r 6a20128ce557 -r ebfee66fde93 email/imap4mtm/imapprotocolcontroller/inc/cimapidlecontroller.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/imap4mtm/imapprotocolcontroller/inc/cimapidlecontroller.h Fri Jun 04 10:25:39 2010 +0100 @@ -0,0 +1,129 @@ +// 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 __CIMAPIDLECONTROLLER_H__ +#define __CIMAPIDLECONTROLLER_H__ + +#include +#include +#include +#include "cimapobservabletimer.h" + + +class CImapSyncManager; +class CImapFolder; +class CImapSettings; +class CMsvServerEntry; +class CImapSession; +class CImapCompoundCopyToLocal; +class CImapMailStore; + +/** +Implemented by anything that wants to use a CImapIdleController. +Provides an interface that can be called if an unexpected error +occurs while in IDLE. + +@internalTechnology +@prototype +*/ +class MImapIdleControllerObserver + { +public: + virtual void OnIdleError(TInt aError) = 0; + }; + + +/** +Provides management of IMAP IDLE as a background task. +The Protocol Controller is free to complete a client requested operation +immediately after calling StartIdle(). + +@internalTechnology +@prototype +*/ +class CImapIdleController : public CActive, public MImapTimerObserver + { +public: + ~CImapIdleController(); + + static CImapIdleController* NewL(MImapIdleControllerObserver& aObserver, CImapSession*& aSession, CImapSyncManager& aSyncManager, CMsvServerEntry& aServerEntry, CImapSettings& aImapSettings, CImapMailStore& aImapMailStore); + + void StartIdle(); + void StopIdle(TRequestStatus& aStatus); + + void Progress(TImap4CompoundProgress& aCompoundProgress); + +private: + enum TIdleControllerState + { + EFinished, // 00 No Command Issued, NOT active in this state + EStartingIdle, // 01 StartIdle() requested, Active in this state + ESelectingInbox, // 02 SELECT command issued. Active in this state + EWaitingForContinuation, // 03 IDLE command issued. Active in this state + EIdling, // 04 wait-for-event issued Active in this state + EWaitingForDone, // 05 DONE command issued Active in this state + EWaitingForServerEvent, // 06 Dummy read issued Active in this state + EWaitingForFlush, // 07 read cancelled and flushed Active in this state + ESynchronising, // 08 CImapFolder::Synchronise issued Active in this state. + ESyncFetching // 09 CImapCompoundCopyToLocal Active in this state... + }; + + CImapIdleController(MImapIdleControllerObserver& aObserver, CImapSession*& aSession, CImapSyncManager& aSyncManager, CMsvServerEntry& aServerEntry, CImapSettings& aImapSettings, CImapMailStore& aImapMailStore); + void ConstructL(); + + void RunContinueL(); + void RunStopL(); + void GoIdleL(); + TBool DoBodyDownloadL(); + TBool SyncRequired(); + + // From CActive + virtual void RunL(); + + // mimic CMsgActive + void Queue(TRequestStatus& aStatus); + virtual void DoRunL(); + virtual void DoCancel(); + virtual void Complete(TInt aErr); + virtual void DoComplete(TInt& aErr); + + // From MImapTimerObserver + virtual void OnTimerL(const CImapObservableTimer& aSourceTimer); + + void EnterIdlingState(); + void InternalCancelAndSetState(TIdleControllerState aNextState); + +private: + MImapIdleControllerObserver& iObserver; + CImapSession*& iSession; + CImapSyncManager& iSyncManager; + CMsvServerEntry& iServerEntry; + CImapSettings& iImapSettings; + CImapMailStore& iImapMailStore; + CImapCompoundCopyToLocal* iCopyToLocal; + + // report request status + TRequestStatus* iReport; + + // State Information + TBool iUsingIdle; + TIdleControllerState iState; + TBool iStoppingIdle; + TBool iInternalCancel; + + CImapObservableTimer* iReissueTimer; + }; + +#endif // __CIMAPIDLECONTROLLER_H__