diff -r ebe688cedc25 -r 7fdbb852d323 email/imum/Mtms/Src/ImumDeleteMessagesFromServer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/imum/Mtms/Src/ImumDeleteMessagesFromServer.cpp Wed Sep 01 12:31:54 2010 +0100 @@ -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 +#include +#include +#include +#include +#include +#include +#include +#include +#include // KErrImapServerBusy +#include +#include + +#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& 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 paramPack; + paramPack.Copy(aProgress); + const TImCacheManagerProgress& progress=paramPack(); + + aEntriesDone=progress.iMessagesProcessed; + aCurrentBytesTrans=progress.iMessagesProcessed; + } + else if ( iState == EImumDeletingMessagesStateFromServer ) + { + if ( iMtm == KImumMtmImap4Uid ) + { + TPckgBuf 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 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 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 + +