email/imum/Mtms/Src/ImumOnlineOperation.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imum/Mtms/Src/ImumOnlineOperation.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,308 @@
+/*
+* 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: 
+*       Common base class for email online operations
+*
+*/
+
+
+#include <eikenv.h>
+#include <eikrutil.h>
+#include <MsvPrgReporter.h>
+#include <MTMStore.h>
+#include <mtmuibas.h>
+#include <ImumInternalApi.h>        // CImumInternalApi
+
+#include "ImumOnlineOperation.h"
+#include "ImumPanic.h"
+#include "ImumMtmLogging.h"
+
+
+// ----------------------------------------------------------------------------
+// CImumOnlineOperation::~CImumOnlineOperation()
+// ----------------------------------------------------------------------------
+//
+CImumOnlineOperation::~CImumOnlineOperation()
+    {
+    IMUM_CONTEXT( CImumOnlineOperation::~CImumOnlineOperation, 0, KImumMtmLog );
+    IMUM_IN();
+
+    Cancel();
+    delete iOperation;
+    if(iMtmUi)
+        {
+        iReporter.MtmStore().ReleaseMtmUi(iMtmUi->Type());
+        }
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumOnlineOperation::ProgressL()
+// ----------------------------------------------------------------------------
+//
+const TDesC8& CImumOnlineOperation::ProgressL()
+    {
+    IMUM_CONTEXT( CImumOnlineOperation::ProgressL, 0, KImumMtmLog );
+    IMUM_IN();
+
+    IMUM_OUT();
+    if(iError != KErrNone)
+        {
+        return GetErrorProgressL(iError);
+        }
+    else if(iOperation)
+        {
+        return iOperation->ProgressL();
+        }
+    return iDummyProg;
+    }
+
+// ----------------------------------------------------------------------------
+// CImumOnlineOperation::CImumOnlineOperation()
+// ----------------------------------------------------------------------------
+//
+CImumOnlineOperation::CImumOnlineOperation(
+    CImumInternalApi& aMailboxApi,
+    TInt aPriority,
+    TRequestStatus& aObserverRequestStatus,
+    MMsvProgressReporter& aReporter)
+    :
+    CMsvOperation(
+        aMailboxApi.MsvSession(),
+        aPriority,
+        aObserverRequestStatus),
+    iReporter(aReporter),
+    iMailboxApi( aMailboxApi ),
+    iEikEnv(CEikonEnv::Static())
+    {
+    IMUM_CONTEXT( CImumOnlineOperation::CImumOnlineOperation, 0, KImumMtmLog );
+    IMUM_IN();
+    IMUM_OUT();
+
+    }
+
+// ----------------------------------------------------------------------------
+// CImumOnlineOperation::BaseConstructL()
+// ----------------------------------------------------------------------------
+//
+void CImumOnlineOperation::BaseConstructL(TUid aMtmType)
+    {
+    IMUM_CONTEXT( CImumOnlineOperation::BaseConstructL, 0, KImumMtmLog );
+    IMUM_IN();
+
+    iObserverRequestStatus = KRequestPending;
+    CActiveScheduler::Add(this);
+    iMtmUi = &(iReporter.MtmStore().ClaimMtmUiL(aMtmType));
+    iMtm = aMtmType;
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumOnlineOperation::DoCancel()
+// ----------------------------------------------------------------------------
+//
+void CImumOnlineOperation::DoCancel()
+    {
+    IMUM_CONTEXT( CImumOnlineOperation::DoCancel, 0, KImumMtmLog );
+    IMUM_IN();
+
+    if(iOperation)
+        {
+        iOperation->Cancel();
+        }
+    CompleteObserver();
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumOnlineOperation::RunL()
+// ----------------------------------------------------------------------------
+//
+void CImumOnlineOperation::RunL()
+    {
+    IMUM_CONTEXT( CImumOnlineOperation::RunL, 0, KImumMtmLog );
+    IMUM_IN();
+
+    // First do a disk space check, so the operation can continue
+    iError = DoDiskSpaceCheckL();
+
+    // If still free disk space, the actual operation can be continued
+    if ( iError == KErrNone )
+        {
+        DoRunL();
+        }
+	else
+		{
+		User::Leave( iError );
+		}
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumOnlineOperation::RunError()
+// ----------------------------------------------------------------------------
+//
+TInt CImumOnlineOperation::RunError( TInt aError )
+    {
+    IMUM_CONTEXT( CImumOnlineOperation::RunError, 0, KImumMtmLog );
+    IMUM_IN();
+
+    IMUM1( 0, "RunL error %d", aError );
+    CompleteObserver( aError );
+
+    IMUM_OUT();
+     // RunError must return KErrNone to active sheduler.
+     // We return the error, since we do not fully handle the error
+     // We may want the framework to show some notes etc...
+    return aError;
+    }
+
+// ----------------------------------------------------------------------------
+// CImumOnlineOperation::CompleteObserver()
+// ----------------------------------------------------------------------------
+//
+void CImumOnlineOperation::CompleteObserver( TInt aStatus /*= KErrNone*/ )
+    {
+    IMUM_CONTEXT( CImumOnlineOperation::CompleteObserver, 0, KImumMtmLog );
+    IMUM_IN();
+
+    TRequestStatus* status = &iObserverRequestStatus;
+    User::RequestComplete(status, aStatus);
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumOnlineOperation::CompleteThis()
+// ----------------------------------------------------------------------------
+//
+void CImumOnlineOperation::CompleteThis()
+    {
+    IMUM_CONTEXT( CImumOnlineOperation::CompleteThis, 0, KImumMtmLog );
+    IMUM_IN();
+
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete(status, KErrNone);
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumOnlineOperation::GetOperationCompletionCodeL()
+// ----------------------------------------------------------------------------
+//
+TInt CImumOnlineOperation::GetOperationCompletionCodeL()
+    {
+    IMUM_CONTEXT( CImumOnlineOperation::GetOperationCompletionCodeL, 0, KImumMtmLog );
+    IMUM_IN();
+
+    if(iStatus.Int() != KErrNone)
+        {
+        IMUM_OUT();
+        return iStatus.Int();
+        }
+    __ASSERT_DEBUG( iMtmUi, User::Panic( KImumMtmUiPanic,EPanicOpNoMtmUi ) );
+    TBuf<CBaseMtmUi::EProgressStringMaxLen> retString;
+    TInt totalEntryCount = 0;
+    TInt entriesDone = 0;
+    TInt currentEntrySize = 0;
+    TInt currentBytesTrans = 0;
+    IMUM_OUT();
+
+    return iMtmUi->GetProgress(
+        ProgressL(),
+        retString,
+        totalEntryCount,
+        entriesDone,
+        currentEntrySize,
+        currentBytesTrans);
+    }
+
+// ----------------------------------------------------------------------------
+// CImumOnlineOperation::InvokeClientMtmAsyncFunctionL()
+// ----------------------------------------------------------------------------
+//
+void CImumOnlineOperation::InvokeClientMtmAsyncFunctionL(
+    TInt aFunctionId,
+    TMsvId aEntryId,
+    TMsvId aContextId,
+    const TDesC8& aParams)
+    {
+    IMUM_CONTEXT( CImumOnlineOperation::InvokeClientMtmAsyncFunctionL, 0, KImumMtmLog );
+    IMUM_IN();
+
+    CMsvEntrySelection* sel = new(ELeave) CMsvEntrySelection;
+    CleanupStack::PushL(sel);
+    sel->AppendL(aEntryId);
+    InvokeClientMtmAsyncFunctionL(aFunctionId, *sel, aContextId, aParams);
+    CleanupStack::PopAndDestroy(); // sel
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumOnlineOperation::InvokeClientMtmAsyncFunctionL()
+// ----------------------------------------------------------------------------
+//
+void CImumOnlineOperation::InvokeClientMtmAsyncFunctionL(
+    TInt aFunctionId,
+    const CMsvEntrySelection& aSel,
+    TMsvId aContextId,
+    const TDesC8& aParams)
+    {
+    IMUM_CONTEXT( CImumOnlineOperation::InvokeClientMtmAsyncFunctionL, 0, KImumMtmLog );
+    IMUM_IN();
+
+    __ASSERT_DEBUG(iMtmUi, User::Panic( KImumMtmUiPanic,EPanicOpNoMtmUi));
+    CBaseMtm& mtm = iMtmUi->BaseMtm();
+    mtm.SwitchCurrentEntryL(aContextId);
+    HBufC8* params = aParams.AllocLC();
+    TPtr8 ptr(params->Des());
+    // Delete previous operation if it exist
+    if ( iOperation )
+        {
+        delete iOperation;
+        iOperation = NULL;
+        }
+    iOperation = mtm.InvokeAsyncFunctionL(aFunctionId, aSel, ptr, iStatus);
+    CleanupStack::PopAndDestroy(); // params
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumOnlineOperation::ReDisplayProgressL()
+// ----------------------------------------------------------------------------
+//
+void CImumOnlineOperation::ReDisplayProgressL(
+    TInt /*aTitleResourceId*/, TMsvId /*aServiceId*/)
+    {
+    IMUM_CONTEXT( CImumOnlineOperation::ReDisplayProgressL, 0, KImumMtmLog );
+    IMUM_IN();
+
+    iReporter.MakeProgressVisibleL(ETrue);
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumOnlineOperation::DoDiskSpaceCheckL()
+// ----------------------------------------------------------------------------
+//
+TInt CImumOnlineOperation::DoDiskSpaceCheckL()
+    {
+    IMUM_CONTEXT( CImumOnlineOperation::DoDiskSpaceCheckL, 0, KImumMtmLog );
+    IMUM_IN();
+    IMUM_OUT();
+
+    // As default, return KErrNone
+    return KErrNone;
+    }
+
+