email/imum/Mtms/Src/ImumDeleteMessagesFromServer.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imum/Mtms/Src/ImumDeleteMessagesFromServer.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,425 @@
+/*
+* 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:  ImumDeleteMessagesFromServer.cpp
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <MTMStore.h>
+#include <msvstd.hrh>
+#include <mtmuibas.h>
+#include <msvuids.h>
+#include <imum.rsg>
+#include <coemain.h>
+#include <StringLoader.h>
+#include <imapset.h>
+#include <pop3set.h>
+#include <miut_err.h> // KErrImapServerBusy
+#include <eikenv.h>
+#include <f32file.h>
+
+#include "ImumDeleteMessagesFromServer.h"
+#include "ImumDeleteMessagesLocally.h"
+#include "EmailUtils.H"
+#include "ImumMtmLogging.h"
+
+
+// LOCAL CONSTANTS AND MACROS
+const TInt KImumEntriesDoneReplaceIndex = 0;
+const TInt KImumTotalEntriesReplaceIndex = 1;
+// minimum disk space needed when deleting messages locally
+const TInt KImumDiskSpaceForDelete = ( 2*1024 );
+const TUid KImumMtmImap4Uid = { 0x1000102A };
+const TUid KImumMtmPop3Uid = { 0x10001029 };
+_LIT8( KEmptyChar, "" );
+
+// ================= MEMBER FUNCTIONS =======================
+
+// -----------------------------------------------------------------------------
+// CImumDeleteMessagesFromServer::CImumDeleteMessagesFromServer()
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CImumDeleteMessagesFromServer::CImumDeleteMessagesFromServer(
+    CImumInternalApi& aMailboxApi,
+    TRequestStatus& aObserverRequestStatus )
+    :
+    CMsvOperation(aMailboxApi.MsvSession(), CActive::EPriorityStandard, aObserverRequestStatus),
+    iMailboxApi( aMailboxApi ),
+    iBlank( KEmptyChar ),
+    iDriveNo( KErrNotFound )
+    {
+    IMUM_CONTEXT( CImumDeleteMessagesFromServer::CImumDeleteMessagesFromServer, 0, KImumMtmLog );
+    IMUM_IN();
+
+    CActiveScheduler::Add(this);
+    IMUM_OUT();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CImumDeleteMessagesFromServer::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CImumDeleteMessagesFromServer::ConstructL(
+    CMsvEntrySelection& aDeletedEntries )
+    {
+    IMUM_CONTEXT( CImumDeleteMessagesFromServer::ConstructL, 0, KImumMtmLog );
+    IMUM_IN();
+
+    iEntrySelection = aDeletedEntries.CopyL();
+    iEntryCount = iEntrySelection->Count();
+    if ( iEntryCount == 0 )
+        {
+        User::Leave( KErrNotSupported );
+        }
+
+    // Define the environment
+    CEikonEnv* env = CEikonEnv::Static();
+
+    // Create the file session and get access to current drive
+    iFileSession = env->FsSession();
+    iDriveNo = iMsvSession.CurrentDriveL();
+
+    // Reserve disk space for deletion
+    User::LeaveIfError( MsvEmailMtmUiUtils::AcquireDiskSpace(
+        iFileSession, iDriveNo, KImumDiskSpaceForDelete ) );
+
+    TMsvId serviceId;
+    TMsvEntry entry;
+    User::LeaveIfError(
+        iMsvSession.GetEntry(
+            (*iEntrySelection)[0], serviceId, entry ) );
+    iEntry = CMsvEntry::NewL(
+        iMsvSession, entry.Parent(), TMsvSelectionOrdering() );
+    iMtm = iEntry->Entry().iMtm;
+
+    TInt resourceId = (iEntryCount>1) ?
+        R_IMAP4_PROGRESS_DELETING_MANY : R_IMAP4_PROGRESS_DELETING;
+
+    iProgressText = StringLoader::LoadL( resourceId, env );
+    iStatus=KRequestPending;
+    StartNextDeleteLocally();
+    // StartNextDeleteLocally activates this
+    IMUM_OUT();
+    }
+
+// -----------------------------------------------------------------------------
+// CImumDeleteMessagesFromServer::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CImumDeleteMessagesFromServer* CImumDeleteMessagesFromServer::NewL(
+    CImumInternalApi& aMailboxApi,
+    TRequestStatus& aObserverRequestStatus,
+    CMsvEntrySelection& aDeletedEntries )
+    {
+    IMUM_STATIC_CONTEXT( CImumDeleteMessagesFromServer::NewL, 0, mtm, KImumMtmLog );
+    IMUM_IN();
+
+    CImumDeleteMessagesFromServer* self=new (ELeave) CImumDeleteMessagesFromServer(
+        aMailboxApi, aObserverRequestStatus );
+    CleanupStack::PushL(self);
+    self->ConstructL( aDeletedEntries );
+    CleanupStack::Pop(); // self
+    IMUM_OUT();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CImumDeleteMessagesFromServer::~CImumDeleteMessagesFromServer()
+// -----------------------------------------------------------------------------
+//
+CImumDeleteMessagesFromServer::~CImumDeleteMessagesFromServer()
+    {
+    IMUM_CONTEXT( CImumDeleteMessagesFromServer::~CImumDeleteMessagesFromServer, 0, KImumMtmLog );
+    IMUM_IN();
+
+    Cancel();
+
+    // Release the disk space
+    iFileSession.ReleaseReserveAccess( iDriveNo );
+
+    delete iOperation;
+    delete iEntry;
+    delete iEntrySelection;
+    delete iProgressText;
+    IMUM_OUT();
+    }
+
+// -----------------------------------------------------------------------------
+// CImumDeleteMessagesFromServer::DoCancel()
+// -----------------------------------------------------------------------------
+//
+void CImumDeleteMessagesFromServer::DoCancel()
+    {
+    IMUM_CONTEXT( CImumDeleteMessagesFromServer::DoCancel, 0, KImumMtmLog );
+    IMUM_IN();
+
+    if (iOperation)
+        {
+        iOperation->Cancel();
+        }
+    TRequestStatus* status = &iObserverRequestStatus;
+    User::RequestComplete(status, iStatus.Int());
+    IMUM_OUT();
+    }
+
+// -----------------------------------------------------------------------------
+// CImumDeleteMessagesFromServer::RunL()
+// -----------------------------------------------------------------------------
+//
+void CImumDeleteMessagesFromServer::RunL()
+    {
+    IMUM_CONTEXT( CImumDeleteMessagesFromServer::RunL, 0, KImumMtmLog );
+    IMUM_IN();
+
+    // Make first a check, that nothing has failed
+    if ( iStatus.Int() != KErrNone )
+        {
+        // something failed, just complete
+        TRequestStatus* status = &iObserverRequestStatus;
+        User::RequestComplete(status, iStatus.Int());
+        return;
+        }
+
+    if ( iState == EImumDeletingMessagesStateLocally )
+        {
+        // local delete completed, start deleting from server
+        StartDeleteFromServer();
+        }
+    else
+        {
+        // nothing left to process, so complete the observer
+        TRequestStatus* status = &iObserverRequestStatus;
+        User::RequestComplete(status, iStatus.Int());
+        }
+    IMUM_OUT();
+    }
+
+// -----------------------------------------------------------------------------
+// CImumDeleteMessagesFromServer::ProgressL()
+// -----------------------------------------------------------------------------
+//
+const TDesC8& CImumDeleteMessagesFromServer::ProgressL()
+    {
+    IMUM_CONTEXT( CImumDeleteMessagesFromServer::ProgressL, 0, KImumMtmLog );
+    IMUM_IN();
+
+    // Make sure that operation is active
+    if ( IsActive() )
+        {
+        // Get progress
+        if ( iOperation )
+            {
+            return iOperation->ProgressL();
+            }
+        }
+    // Check that we're using IMAP4 protocol
+    else if ( iMtm == KImumMtmImap4Uid )
+        {
+        // Get the progress bar only with IMAP4
+        TImap4UiProgress& uiProgress=iUiProgress();
+        uiProgress.iBytesToDo=0;
+        uiProgress.iBytesDone=0;
+        uiProgress.iError= ( iStatus.Int() == KErrServerBusy ? KErrImapServerBusy : iStatus.Int() );
+        uiProgress.iUiOperation = TImap4UiProgress::EDeletingMessages;
+        IMUM_OUT();
+        return iUiProgress;
+        }
+    IMUM_OUT();
+
+    return iBlank;
+    }
+
+// -----------------------------------------------------------------------------
+// CImumDeleteMessagesFromServer::DecodeProgress()
+// -----------------------------------------------------------------------------
+//
+TInt CImumDeleteMessagesFromServer::DecodeProgress(
+    const TDesC8& aProgress,
+    TBuf<CBaseMtmUi::EProgressStringMaxLen>& aReturnString,
+    TInt& aTotalEntryCount,
+    TInt& aEntriesDone,
+    TInt& aCurrentEntrySize,
+    TInt& aCurrentBytesTrans,
+    TBool /*aInternal*/ )
+    {
+    IMUM_CONTEXT( CImumDeleteMessagesFromServer::DecodeProgress, 0, KImumMtmLog );
+    IMUM_IN();
+
+    aCurrentEntrySize = aTotalEntryCount = iEntryCount;
+    if ( iState == EImumDeletingMessagesStateLocally )
+        {
+        TPckgBuf<TImCacheManagerProgress> paramPack;
+        paramPack.Copy(aProgress);
+        const TImCacheManagerProgress& progress=paramPack();
+
+        aEntriesDone=progress.iMessagesProcessed;
+        aCurrentBytesTrans=progress.iMessagesProcessed;
+        }
+    else if ( iState == EImumDeletingMessagesStateFromServer )
+        {
+        if ( iMtm == KImumMtmImap4Uid )
+            {
+            TPckgBuf<TImap4CompoundProgress> paramPack;
+            paramPack.Copy(aProgress);
+            const TImap4GenericProgress& progress=paramPack().iGenericProgress;
+            aCurrentBytesTrans = aEntriesDone = progress.iMsgsDone == 0 ? 1 :
+                progress.iMsgsDone;
+            if ( progress.iState == TImap4GenericProgress::EDeleting )
+                {
+                iDeleteProgress = ETrue;
+                }
+            else
+                {
+                if ( iDeleteProgress )
+                    {
+                    aCurrentBytesTrans = aEntriesDone = aTotalEntryCount;
+                    }
+                }
+            }
+        else if ( iMtm == KImumMtmPop3Uid )
+            {
+            TPckgBuf<TPop3Progress> paramPack;
+            paramPack.Copy( aProgress );
+            const TPop3Progress& progress = paramPack();
+            aCurrentBytesTrans = aEntriesDone =
+                ( progress.iMsgsToProcess == progress.iTotalMsgs ) ?
+                1 : progress.iTotalMsgs-progress.iMsgsToProcess;
+            if ( ( progress.iPop3Progress == TPop3Progress::EPopDeleting )
+                && ( progress.iTotalMsgs != progress.iMsgsToProcess ) )
+                {
+                iDeleteProgress = ETrue;
+                }
+            else
+                {
+                if ( iDeleteProgress )
+                    {
+                    aCurrentBytesTrans = aEntriesDone = aTotalEntryCount;
+                    }
+                }
+            }
+        }
+    aReturnString.Copy( *iProgressText );
+    if ( iEntryCount > 1 )
+        {
+        TBuf<CBaseMtmUi::EProgressStringMaxLen> tempBuffer;
+        StringLoader::Format(
+            tempBuffer,
+            aReturnString,
+            KImumEntriesDoneReplaceIndex,
+            aEntriesDone );
+        StringLoader::Format(
+            aReturnString,
+            tempBuffer,
+            KImumTotalEntriesReplaceIndex,
+            aTotalEntryCount );
+        }
+    IMUM_OUT();
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CImumDeleteMessagesFromServer::StartNextDeleteLocally()
+// -----------------------------------------------------------------------------
+//
+void CImumDeleteMessagesFromServer::StartNextDeleteLocally()
+    {
+    IMUM_CONTEXT( CImumDeleteMessagesFromServer::StartNextDeleteLocally, 0, KImumMtmLog );
+    IMUM_IN();
+
+    if(iOperation)
+        {
+        delete iOperation;
+        iOperation = NULL;
+        }
+    TRAPD(err, MakeNextDeleteLocallyL());
+
+    // Set active
+    iState = EImumDeletingMessagesStateLocally;
+    iStatus=KRequestPending;
+    SetActive();
+    // if error then complete this pass with the error code
+    if (err)
+        {
+        TRequestStatus* status = &iStatus;
+        User::RequestComplete(status, err);
+        }
+    IMUM_OUT();
+    }
+
+// -----------------------------------------------------------------------------
+// CImumDeleteMessagesFromServer::MakeNextDeleteLocallyL()
+// -----------------------------------------------------------------------------
+//
+void CImumDeleteMessagesFromServer::MakeNextDeleteLocallyL()
+    {
+    IMUM_CONTEXT( CImumDeleteMessagesFromServer::MakeNextDeleteLocallyL, 0, KImumMtmLog );
+    IMUM_IN();
+
+    iOperation = CImumDeleteMessagesLocally::NewL(
+        *iEntrySelection, iMailboxApi, iStatus, EFalse );
+    IMUM_OUT();
+    }
+
+// -----------------------------------------------------------------------------
+// CImumDeleteMessagesFromServer::StartDeleteFromServer()
+// -----------------------------------------------------------------------------
+//
+void CImumDeleteMessagesFromServer::StartDeleteFromServer()
+    {
+    IMUM_CONTEXT( CImumDeleteMessagesFromServer::StartDeleteFromServer, 0, KImumMtmLog );
+    IMUM_IN();
+
+    if(iOperation)
+        {
+        delete iOperation;
+        iOperation = NULL;
+        }
+    TRAPD(err, MakeDeleteFromServerL());
+
+    // and set active
+    iState = EImumDeletingMessagesStateFromServer;
+    iStatus=KRequestPending;
+    SetActive();
+    // if error then complete this pass with the error code
+    if (err)
+        {
+        TRequestStatus* status = &iStatus;
+        User::RequestComplete(status, err);
+        }
+    IMUM_OUT();
+    }
+
+// -----------------------------------------------------------------------------
+// CImumDeleteMessagesFromServer::MakeDeleteFromServerL()
+// -----------------------------------------------------------------------------
+//
+void CImumDeleteMessagesFromServer::MakeDeleteFromServerL()
+    {
+    IMUM_CONTEXT( CImumDeleteMessagesFromServer::MakeDeleteFromServerL, 0, KImumMtmLog );
+    IMUM_IN();
+
+    iOperation = iEntry->DeleteL( *iEntrySelection, iStatus );
+    IMUM_OUT();
+    }
+
+//  End of File
+
+