--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imum/Mtms/Src/Imap4ConnectedOp.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,285 @@
+/*
+* Copyright (c) 2006 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:
+* Base class for operations requiring connection
+*
+*/
+
+
+#include <eikenv.h>
+#include <eikrutil.h>
+#include <imapcmds.h>
+
+#include "Imap4ConnectedOp.h"
+#include "EmailMsgSizerOperation.h"
+#include "EmailUtils.H"
+#include "ImumDisconnectOperation.h"
+#include "IMAPPRGR.H"
+#include "ImumMtmLogging.h"
+
+
+#include "ImumPanic.h"
+
+// Constants and defines
+const TInt KConnectedOpPriority = CActive::EPriorityStandard;
+const TInt KConnectedOpConnectPriority = CActive::EPriorityStandard;
+
+CImap4ConnectedOp::~CImap4ConnectedOp()
+ {
+ IMUM_CONTEXT( CImap4ConnectedOp::~CImap4ConnectedOp, 0, KImumMtmLog );
+ IMUM_IN();
+
+ delete iConnectedOpErrorProgress;
+ IMUM_OUT();
+ }
+
+const TDesC8& CImap4ConnectedOp::ProgressL()
+ {
+ IMUM_CONTEXT( CImap4ConnectedOp::ProgressL, 0, KImumMtmLog );
+ IMUM_IN();
+
+ if(iConnectedOpErrorProgress && (iState == EStateIdle))
+ {
+ // Completed, but with an error during connected operation.
+ return *iConnectedOpErrorProgress;
+ }
+ IMUM_OUT();
+ return CImumOnlineOperation::ProgressL();
+ }
+
+const TDesC8& CImap4ConnectedOp::GetErrorProgressL(TInt aError)
+ {
+ IMUM_CONTEXT( CImap4ConnectedOp::GetErrorProgressL, 0, KImumMtmLog );
+ IMUM_IN();
+
+ // Called if DoRunL leaves.
+ switch(iState)
+ {
+ case EStateConnecting:
+ case EStateDisconnecting:
+ if(!iProgressBuf().iGenericProgress.iErrorCode)
+ {
+ TImap4CompoundProgress& prog = iProgressBuf();
+ prog.iGenericProgress.iState =
+ (iState == EStateConnecting) ?
+ (TImap4GenericProgress::EConnecting) :
+ (TImap4GenericProgress::EDisconnecting);
+ prog.iGenericProgress.iErrorCode = aError;
+ }
+ IMUM_OUT();
+ return iProgressBuf;
+
+ case EStateDoingOp:
+ case EStateIdle:
+ default:
+ IMUM_OUT();
+ // Call pure virtual function to get progress for the connected operation.
+ return ConnectedOpErrorProgressL(aError);
+
+ }
+ }
+
+CImap4ConnectedOp::CImap4ConnectedOp(
+ CImumInternalApi& aMailboxApi,
+ TRequestStatus& aStatus,
+ MMsvProgressReporter& aReporter,
+ TMsvId aServiceId )
+ :
+ CImumDiskSpaceObserverOperation(aMailboxApi, KConnectedOpPriority, aStatus, aReporter),
+ iConnectionCompletionState(CImapConnectionOp::EWithSyncCompleteAfterFullSync)
+ {
+ IMUM_CONTEXT( CImap4ConnectedOp::CImap4ConnectedOp, 0, KImumMtmLog );
+ IMUM_IN();
+
+ iService = aServiceId;
+ IMUM_OUT();
+ }
+
+void CImap4ConnectedOp::ConstructL( TInt /* aFuncId */ )
+ {
+ IMUM_CONTEXT( CImap4ConnectedOp::ConstructL, 0, KImumMtmLog );
+ IMUM_IN();
+
+ BaseConstructL(KUidMsgTypeIMAP4);
+
+ StartL();
+ IMUM_OUT();
+ }
+
+void CImap4ConnectedOp::StartL()
+ {
+ IMUM_CONTEXT( CImap4ConnectedOp::StartL, 0, KImumMtmLog );
+ IMUM_IN();
+
+ CMsvEntry* centry = iMsvSession.GetEntryL(iService);
+ iDisconnect = !(centry->Entry().Connected());
+ // Only disconnect afterwards if not currently connected.
+ delete centry;
+
+ if(iDisconnect)
+ {
+ iState = EStateConnecting;
+ DoConnectL();
+ }
+ else
+ {
+ // Already connected, get on with it.
+ iState = EStateDoingOp;
+ DoConnectedOpL();
+ }
+ IMUM_OUT();
+ }
+
+void CImap4ConnectedOp::RunL()
+ {
+ IMUM_CONTEXT( CImap4ConnectedOp::RunL, 0, KImumMtmLog );
+ IMUM_IN();
+
+ const TInt previousError = iError;
+ TRAP(iError, DoRunL()); // CSI: 86 # Needed here to properly handle error situations
+ if(iError != KErrNone)
+ {
+ // Need to ensure we disconnect if we have connected.
+ if( (iError == KErrNoMemory) || (iState == EStateDisconnecting) )
+ {
+ // OOM and/or failed to create disconnect operation. Call StopService()
+ iMsvSession.StopService(iService);
+ // Ignore return, nothing we can do.
+ }
+ else if( (iState == EStateDoingOp) && (iDisconnect) )
+ {
+ // Failed to start connected operation. Need to disconnect.
+ SetActive();
+ CompleteThis();
+ IMUM_OUT();
+ // Next DoRunL() will attempt to disconnect.
+ return;
+ }
+ CompleteObserver();
+ }
+ else if(previousError != KErrNone)
+ {
+ iError = previousError;
+ }
+ IMUM_OUT();
+ }
+
+void CImap4ConnectedOp::DoCancel()
+ {
+ IMUM_CONTEXT( CImap4ConnectedOp::DoCancel, 0, KImumMtmLog );
+ IMUM_IN();
+
+ CImumOnlineOperation::DoCancel();
+ if ( iState == EStateConnecting )
+ {
+ // Cancelled while doing connected op. Need to disconnect.
+ iMsvSession.StopService( iService );
+ // Ignore return, nothing we can do.
+ }
+ IMUM_OUT();
+ }
+
+void CImap4ConnectedOp::DoRunL()
+ {
+ IMUM_CONTEXT( CImap4ConnectedOp::DoRunL, 0, KImumMtmLog );
+ IMUM_IN();
+
+ switch(iState)
+ {
+ case EStateConnecting:
+ // Connection completed.
+ if(GetOperationCompletionCodeL() != KErrNone)
+ {
+ iState = EStateIdle;
+ CompleteObserver();
+ }
+ else
+ {
+ iState = EStateDoingOp;
+ DoConnectedOpL();
+ }
+ break;
+ case EStateDoingOp:
+ // Connected operation completed.
+ if(GetOperationCompletionCodeL() != KErrNone)
+ {
+ // Store the failure progress.
+ __ASSERT_DEBUG(!iConnectedOpErrorProgress,
+ User::Panic(KImumMtmUiPanic,EPanicAlreadyHaveErrProg));
+ iConnectedOpErrorProgress = iOperation->ProgressL().AllocL();
+ }
+
+ /* Background Handling */
+ MsvEmailMtmUiUtils::CallNewMessagesL( iService );
+ iState = EStateDisconnecting;
+ DoDisconnectL();
+ break;
+ case EStateDisconnecting:
+ // Disonnection completed.
+ iState = EStateIdle;
+ CompleteObserver();
+ break;
+ case EStateIdle:
+ default:
+ break;
+ }
+ if(iOperation)
+ {
+ iMtm = iOperation->Mtm();
+ }
+ IMUM_OUT();
+ }
+
+void CImap4ConnectedOp::DoConnectL()
+ {
+ IMUM_CONTEXT( CImap4ConnectedOp::DoConnectL, 0, KImumMtmLog );
+ IMUM_IN();
+
+ __ASSERT_DEBUG(!iOperation, User::Panic(KImumMtmUiPanic,EPanicOpAlreadySet));
+ delete iOperation;
+ iOperation = NULL;
+ iStatus = KRequestPending;
+ iOperation = CImapConnectionOp::NewL(iMailboxApi.MsvSession(), KConnectedOpConnectPriority,
+ iStatus, iService, iReporter, iConnectionCompletionState);
+ SetActive();
+ IMUM_OUT();
+ }
+
+void CImap4ConnectedOp::DoDisconnectL()
+ {
+ IMUM_CONTEXT( CImap4ConnectedOp::DoDisconnectL, 0, KImumMtmLog );
+ IMUM_IN();
+
+ iStatus = KRequestPending;
+ if(iDisconnect)
+ {
+ delete iOperation;
+ iOperation = NULL;
+ iOperation = CImumDisconnectOperation::NewL(
+ iMailboxApi,
+ iStatus,
+ iReporter,
+ iService,
+ KIMAP4MTMDisconnect,
+ KUidMsgTypeIMAP4);
+ }
+ else
+ {
+ CompleteThis();
+ }
+ SetActive();
+ IMUM_OUT();
+ }
+
+