email/imum/Mtms/Src/SmtpCopyMoveOp.cpp
changeset 0 72b543305e3a
--- /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 <e32base.h>
+#include <miut_err.h>
+#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<KImasImailMaxSettingsLength> 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<TImSmtpProgress>& progress =
+        static_cast<const TPckgBuf<TImSmtpProgress>&>( 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;
+    }
+
+
+