diff -r 000000000000 -r 72b543305e3a email/imum/Mtms/Src/SmtpCopyMoveOp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/imum/Mtms/Src/SmtpCopyMoveOp.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,321 @@ +/* +* 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: +* Class implementation file +* +*/ + + +#include +#include +#include "SmtpCopyMoveOp.h" +#include "MsvEmailConnectionProgressProvider.h" +#include "ImumPanic.h" +#include "ImumMtmLogging.h" +#include "EmailUtils.H" +#include "MsvConnectionValidation.h" +#include "ImumMboxSettingsUtils.h" +#include "ImumInMailboxUtilities.h" +#include "SendUiConsts.h" + +const TInt KCopyMoveOpPriority = CActive::EPriorityStandard; +const TInt KImumMaxLoginRetries = 3; + + +// ---------------------------------------------------------------------------- +// CSmtpCopyMoveOp::NewL() +// ---------------------------------------------------------------------------- +// +CSmtpCopyMoveOp* CSmtpCopyMoveOp::NewL( + CImumInternalApi& aMailboxApi, + TRequestStatus& aObserverRequestStatus, + MMsvProgressReporter& aReporter, + TMsvId aTarget, + const CMsvEntrySelection& aSel, + TBool aMoving ) + { + IMUM_STATIC_CONTEXT( CSmtpCopyMoveOp::NewL, 0, mtm, KImumMtmLog ); + IMUM_IN(); + + CSmtpCopyMoveOp* op = new ( ELeave ) CSmtpCopyMoveOp( + aMailboxApi, aObserverRequestStatus, aReporter, aTarget, aMoving ); + CleanupStack::PushL( op ); + op->ConstructL( aSel ); + CleanupStack::Pop( op ); + IMUM_OUT(); + return op; + } + +// ---------------------------------------------------------------------------- +// CSmtpCopyMoveOp::~CSmtpCopyMoveOp() +// ---------------------------------------------------------------------------- +// +CSmtpCopyMoveOp::~CSmtpCopyMoveOp() + { + IMUM_CONTEXT( CSmtpCopyMoveOp::~CSmtpCopyMoveOp, 0, KImumMtmLog ); + IMUM_IN(); + + delete iEntry; + delete iSelection; + delete iProgProvider; + IMUM_OUT(); + } + + +// ---------------------------------------------------------------------------- +// CSmtpCopyMoveOp::ProgressL() +// ---------------------------------------------------------------------------- +// +const TDesC8& CSmtpCopyMoveOp::ProgressL() + { + IMUM_CONTEXT( CSmtpCopyMoveOp::ProgressL, 0, KImumMtmLog ); + IMUM_IN(); + + if(!iOperation) + { + if ( iValidIap ) + { + IMUM_OUT(); + return iDummyProg; + } + else + { + TImSmtpProgress& progress = iProgress(); + progress.SetError( KSmtpUnknownErr ); + IMUM_OUT(); + return iProgress; + } + } + TRAPD( err, iProgress.Copy( iOperation->ProgressL() ) ); + // If message is already being sent, ProgressL will leave with KErrNotReady + // Ignore this error, otherwise progress bar of the second sending + // will be missing 'Connecting to mailbox...' texts. + if ( err != KErrNotReady && err != KErrNone ) + { + User::Leave( err ); + } + if ( ( iStatus == KRequestPending ) && + ( iProgress().Status() != EMsgOutboxProgressSending ) ) + { + IMUM_OUT(); + return iProgProvider->GetConnectionProgressL(iError); + } + + IMUM_OUT(); + return iProgress; + } + + +// ---------------------------------------------------------------------------- +// CSmtpCopyMoveOp::GetErrorProgressL() +// ---------------------------------------------------------------------------- +// +const TDesC8& CSmtpCopyMoveOp::GetErrorProgressL(TInt /*aError*/) + { + IMUM_CONTEXT( CSmtpCopyMoveOp::GetErrorProgressL, 0, KImumMtmLog ); + IMUM_IN(); + IMUM_OUT(); + + // Never called. + return iProgress; + } + + +// ---------------------------------------------------------------------------- +// CSmtpCopyMoveOp::DoRunL() +// ---------------------------------------------------------------------------- +// +void CSmtpCopyMoveOp::DoRunL() + { + IMUM_CONTEXT( CSmtpCopyMoveOp::DoRunL, 0, KImumMtmLog ); + IMUM_IN(); + + if ( ContinueSendingL() ) + { + InitiateSendingOperationL(); + } + else + { + CompleteObserver( iValidIap ? KErrNone : KSmtpUnknownErr ); + } + IMUM_OUT(); + } + + +// ---------------------------------------------------------------------------- +// CSmtpCopyMoveOp::CSmtpCopyMoveOp() +// ---------------------------------------------------------------------------- +// +CSmtpCopyMoveOp::CSmtpCopyMoveOp( + CImumInternalApi& aMailboxApi, + TRequestStatus& aObserverRequestStatus, + MMsvProgressReporter& aReporter, + TMsvId aTarget, + TBool aMoving) + : + CImumOnlineOperation( + aMailboxApi, KCopyMoveOpPriority, aObserverRequestStatus, aReporter ), + iTarget(aTarget), + iMoving(aMoving), + iValidIap( ETrue ), // valid until otherwise stated + iLoginRetryCounter( 0 ) + { + IMUM_CONTEXT( CSmtpCopyMoveOp::CSmtpCopyMoveOp, 0, KImumMtmLog ); + IMUM_IN(); + IMUM_OUT(); + + } + + +// ---------------------------------------------------------------------------- +// CSmtpCopyMoveOp::ConstructL() +// ---------------------------------------------------------------------------- +// +void CSmtpCopyMoveOp::ConstructL( + const CMsvEntrySelection& aSel ) + { + IMUM_CONTEXT( CSmtpCopyMoveOp::ConstructL, 0, KImumMtmLog ); + IMUM_IN(); + + __ASSERT_ALWAYS( aSel.Count(), + User::Panic( KImumMtmUiPanic,ESmtpMtmUiEmptySelection ) ); + BaseConstructL( KUidMsgTypeSMTP ); + + iEntry = iMsvSession.GetEntryL(aSel[0]); + iService = iEntry->Entry().iServiceId; + const TMsvId parent = iEntry->Entry().Parent(); + + // To speed up connection establishment, avoid loading settings multiple + // times. Get all the info needed at once. + CImumInSettingsData* settings = + iMailboxApi.MailboxServicesL().LoadMailboxSettingsL( iService ); + CleanupStack::PushL( settings ); + + // Get iap name + TBuf iapName; + MsvConnectionValidation::GetServiceIapNameL( *settings, + KSenduiMtmSmtpUid, iapName); + + TBool ok = ValidateL( *settings ); + CleanupStack::PopAndDestroy(); // settings + + if ( !ok ) + { + // Will be unable to connect. Complete now. + SetActive(); + CompleteThis(); + IMUM_OUT(); + return; + } + + iSelection = aSel.CopyL(); + + iProgProvider = CMsvEmailConnectionProgressProvider::NewL( iapName, + iService ); + + iEntry->SetEntryL(parent); + InitiateSendingOperationL(); + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CSmtpCopyMoveOp::ValidateL() +// ---------------------------------------------------------------------------- +// +TBool CSmtpCopyMoveOp::ValidateL( CImumInSettingsData& aSettings ) + { + IMUM_CONTEXT( CSmtpCopyMoveOp::ValidateL, 0, KImumMtmLog ); + IMUM_IN(); + + TBool ok = ETrue; + iEntry->SetEntryL(iService); + if(!iEntry->Entry().Connected()) + { + ok = iValidIap = ( aSettings.Validate() == KErrNone ); + } + IMUM_OUT(); + return ok; + } + +// ---------------------------------------------------------------------------- +// CSmtpCopyMoveOp::InitiateSendingOperationL() +// ---------------------------------------------------------------------------- +// +void CSmtpCopyMoveOp::InitiateSendingOperationL() + { + IMUM_CONTEXT( CSmtpCopyMoveOp::InitiateSendingOperationL, 0, KImumMtmLog ); + IMUM_IN(); + + if ( iOperation ) + { + delete iOperation; + iOperation = NULL; + } + + iOperation = MsvEmailMtmUiUtils::DoCEntryCopyMoveL( + *iEntry, *iSelection, iTarget, iStatus, !iMoving ); + + iStatus = KRequestPending; + SetActive(); + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CSmtpCopyMoveOp::GetProgressErrorL() +// ---------------------------------------------------------------------------- +// +TInt CSmtpCopyMoveOp::GetProgressErrorL() + { + IMUM_CONTEXT( CSmtpCopyMoveOp::GetProgressErrorL, 0, KImumMtmLog ); + IMUM_IN(); + + const TPckgBuf& progress = + static_cast&>( ProgressL() ); + IMUM_OUT(); + return progress().Error(); + } + +// ---------------------------------------------------------------------------- +// CSmtpCopyMoveOp::ContinueSendingL() +// ---------------------------------------------------------------------------- +// +TBool CSmtpCopyMoveOp::ContinueSendingL() + { + IMUM_CONTEXT( CSmtpCopyMoveOp::ContinueSendingL, 0, KImumMtmLog ); + IMUM_IN(); + + TInt error = GetProgressErrorL(); + + TBool continueSending = + !( error != KSmtpLoginRefused && error != KSmtpUnknownErr ); + + // If login is refused we can try again + if ( continueSending ) + { + continueSending = ( iLoginRetryCounter++ < KImumMaxLoginRetries ); + } + + if ( continueSending ) + { + continueSending = + MsvConnectionValidation::ShowLoginDetailsRejectionDlgL( + iMailboxApi, iService ); + } + IMUM_OUT(); + + return continueSending; + } + + +