diff -r 000000000000 -r 72b543305e3a email/imum/Mtms/Src/Imap4ConnectedOp.cpp --- /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 +#include +#include + +#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(); + } + +