--- /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
+
+