diff -r 000000000000 -r 72b543305e3a email/imum/Utils/Src/ImumMBoxServiceDeletion.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/imum/Utils/Src/ImumMBoxServiceDeletion.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,422 @@ +/* +* Copyright (c) 2007 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: MsvOperation encapsulating deletion of email service +* +*/ + + +#include // StringLoader +#include +#include +#include +#include + +#include "ImumMboxServiceDeletion.h" +#include "MsvPrgReporter.h" +#include "EmailUtils.H" +#include "SenduiMtmUids.h" +#include "ImumPanic.h" +#include "IMSSettingsNoteUi.h" +#include "ImumInternalApiImpl.h" + +#include "ImumMtmLogging.h" + +const TInt KSvcDelOpPriority = CActive::EPriorityStandard; + +// ---------------------------------------------------------------------------- +// CImumMBoxServiceDeletion::NewL() +// ---------------------------------------------------------------------------- +// +EXPORT_C CImumMBoxServiceDeletion* CImumMBoxServiceDeletion::NewL( + CMsvSession& aMsvSession, + TRequestStatus& aObserverRequestStatus, + MMsvProgressReporter& aReporter, + TMsvId aServiceId ) + { + CImumMBoxServiceDeletion* op = + new ( ELeave ) CImumMBoxServiceDeletion( aMsvSession, + aObserverRequestStatus, + aReporter, + aServiceId ); + + CleanupStack::PushL( op ); + op->ConstructL(); + CleanupStack::Pop( op ); + return op; + } + +// ---------------------------------------------------------------------------- +// CImumMBoxServiceDeletion::~CImumMBoxServiceDeletion() +// ---------------------------------------------------------------------------- +// +CImumMBoxServiceDeletion::~CImumMBoxServiceDeletion() + { + IMUM_CONTEXT( CImumMBoxServiceDeletion::CImumMBoxServiceDeletion, 0, KImumMtmLog ); + IMUM_IN(); + + if ( IsActive() ) + { + Cancel(); + } + + delete iEmailApi; + delete iSubOperation; + delete iProgressString; + + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMBoxServiceDeletion::ProgressL() +// ---------------------------------------------------------------------------- +// +const TDesC8& CImumMBoxServiceDeletion::ProgressL() + { + if ( iState == EDeleteService ) + { + iProgressBuf.Copy( iSubOperation->ProgressL() ); + } + return iProgressBuf; + } + +// ---------------------------------------------------------------------------- +// CImumMBoxServiceDeletion::RunL() +// ---------------------------------------------------------------------------- +// +void CImumMBoxServiceDeletion::RunL() + { + IMUM_CONTEXT( CImumMBoxServiceDeletion::RunL, 0, KImumMtmLog ); + IMUM_IN(); + + DoRunL(); + + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMBoxServiceDeletion::DoCancel() +// ---------------------------------------------------------------------------- +// +void CImumMBoxServiceDeletion::DoCancel() + { + IMUM_CONTEXT( CImumMBoxServiceDeletion::DoCancel, 0, KImumMtmLog ); + IMUM_IN(); + + if ( iSubOperation ) + { + iSubOperation->Cancel(); + } + CompleteObserver(); + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMBoxServiceDeletion::RunError() +// ---------------------------------------------------------------------------- +// +TInt CImumMBoxServiceDeletion::RunError(TInt __DEBUG_ONLY( aError ) ) + { + IMUM_CONTEXT( CImumMBoxServiceDeletion::RunError, 0, KImumMtmLog ); + IMUM_IN(); + + IMUM1( 0, "RunL error %d", aError); + + CompleteObserver(); + + IMUM_OUT(); + return KErrNone; // RunError must return KErrNone to active sheduler. + } + +// ---------------------------------------------------------------------------- +// CImumMBoxServiceDeletion::CImumMBoxServiceDeletion() +// ---------------------------------------------------------------------------- +// +CImumMBoxServiceDeletion::CImumMBoxServiceDeletion( + CMsvSession& aMsvSession, + TRequestStatus& aObserverRequestStatus, + MMsvProgressReporter& aReporter, + TMsvId aServiceId ) + : + CMsvOperation( aMsvSession, KSvcDelOpPriority, aObserverRequestStatus ), + iReporter( aReporter ), + iServiceId( aServiceId ) + { + IMUM_CONTEXT( CImumMBoxServiceDeletion::CImumMBoxServiceDeletion, 0, KImumMtmLog ); + IMUM_IN(); + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMBoxServiceDeletion::ConstructL() +// ---------------------------------------------------------------------------- +// +void CImumMBoxServiceDeletion::ConstructL() + { + IMUM_CONTEXT( CImumMBoxServiceDeletion::ConstructL, 0, KImumMtmLog ); + IMUM_IN(); + + CActiveScheduler::Add( this ); + + iEmailApi = CImumInternalApiImpl::NewL( &iMsvSession ); + + TMsvEntry servEntry; + TMsvId serviceId; + User::LeaveIfError( + iMsvSession.GetEntry( iServiceId, serviceId, servEntry ) ); + + iSMTPServiceId = servEntry.iRelatedId; + iMtm = servEntry.iMtm; + + TMsvEntry smtpEntry; + TMsvId smtpServiceId; + + User::LeaveIfError( iMsvSession.GetEntry( + iSMTPServiceId, smtpServiceId, smtpEntry ) ); + + // serviceEntry must: be a service entry and have the root as parent. + __ASSERT_DEBUG(servEntry.iType.iUid == KUidMsvServiceEntryValue, + User::Panic(KImumMtmUiPanic,ESmtpMtmUiSvcDelOpNotAService) ); + __ASSERT_DEBUG(servEntry.Parent() == KMsvRootIndexEntryIdValue, + User::Panic(KImumMtmUiPanic,ESmtpMtmUiSvcDelOpParentIsNotRoot) ); + + SetProgressStringL( smtpEntry.Id() ); + iReporter.SetProgressDecoder( *this ); + + // Remove mailbox from ao agent list. + // if fails, just ignore, doesn't effect us + TRAP_IGNORE( MsvEmailMtmUiUtils::SendAOCommandL( EServerAPIEmailAgentRemove, + iServiceId ) ); + + BeginDeleteOperationL(); + iState = EDoPrompts; + ProgressL();//Update initial progress. + + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMBoxServiceDeletion::BeginDeleteOperationL() +// ---------------------------------------------------------------------------- +// +void CImumMBoxServiceDeletion::BeginDeleteOperationL() + { + IMUM_CONTEXT( CImumMBoxServiceDeletion::BeginDeleteOperationL, 0, KImumMtmLog ); + IMUM_IN(); + + iSubOperation = CMsvCompletedOperation::NewL( + iMsvSession, KUidMsvLocalServiceMtm, KNullDesC8, + KMsvLocalServiceIndexEntryId, iStatus ); + + SetActive(); + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMBoxServiceDeletion::RemovePreCreatedMessagesL() +// ---------------------------------------------------------------------------- +// +void CImumMBoxServiceDeletion::RemovePreCreatedMessagesL() + { + IMUM_CONTEXT( CImumMBoxServiceDeletion::RemovePreCreatedMessagesL, 0, KImumMtmLog ); + IMUM_IN(); + + iStatus = KRequestPending; + iSubOperation = GetPreCreatedMailDeletionOpL( iStatus ); + SetActive(); + + if( !iSubOperation ) + { + // If this is the case, complete this stage. + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + } + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMBoxServiceDeletion::DoRunL() +// ---------------------------------------------------------------------------- +// +void CImumMBoxServiceDeletion::DoRunL() + { + IMUM_CONTEXT( CImumMBoxServiceDeletion::DoRunL, 0, KImumMtmLog ); + IMUM_IN(); + + if( iSubOperation ) + { + if ( iSubOperation->IsActive() ) + { + iSubOperation->Cancel(); + } + + delete iSubOperation; + iSubOperation = NULL; + } + + switch(iState) + { + case EDoPrompts: + DoRemoveMailboxL(); + iState = EDeleteService; + break; + case EDeleteService: + RemovePreCreatedMessagesL(); + iState = EDeletePreCreatedMsgs; + break; + case EDeletePreCreatedMsgs: + CompleteObserver(); + break; + case EStateComplete: + default: + break; + } + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMBoxServiceDeletion::CompleteObserver() +// ---------------------------------------------------------------------------- +// +void CImumMBoxServiceDeletion::CompleteObserver() + { + TRequestStatus* status = &iObserverRequestStatus; + User::RequestComplete(status, iStatus.Int()); + } + + +// ---------------------------------------------------------------------------- +// CImumMBoxServiceDeletion::DecodeProgress() +// ---------------------------------------------------------------------------- +// +TInt CImumMBoxServiceDeletion::DecodeProgress( + const TDesC8& /* aProgress */, + TBuf& aReturnString, + TInt& aTotalEntryCount, + TInt& aEntriesDone, + TInt& aCurrentEntrySize, + TInt& aCurrentBytesTrans, + TBool /* aInternal */) + { + aTotalEntryCount = 0; + aEntriesDone = 0; + aCurrentEntrySize = 0; + aCurrentBytesTrans = 0; + aReturnString.Copy( *iProgressString ); + return KErrNone; + } + +// ---------------------------------------------------------------------------- +// CImumMBoxServiceDeletion::BeginRemoveAccountDeleteOpL() +// ---------------------------------------------------------------------------- +// +void CImumMBoxServiceDeletion::BeginRemoveAccountDeleteOpL() + { + IMUM_CONTEXT( CImumMBoxServiceDeletion::BeginRemoveAccountDeleteOpL, 0, KImumMtmLog ); + IMUM_IN(); + + // Complete right after the deletion + iSubOperation = CMsvCompletedOperation::NewL( iMsvSession, + KUidMsvLocalServiceMtm, + KNullDesC8, + KMsvLocalServiceIndexEntryId, + iStatus ); + iStatus = KRequestPending; + SetActive(); + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMBoxServiceDeletion::GetPreCreatedMailDeletionOpL() +// ---------------------------------------------------------------------------- +// +CMsvOperation* CImumMBoxServiceDeletion::GetPreCreatedMailDeletionOpL( TRequestStatus& aStatus ) + { + IMUM_CONTEXT( CImumMBoxServiceDeletion::GetPreCreatedMailDeletionOpL, 0, KImumMtmLog ); + IMUM_IN(); + + //Get SMTP UI mtm + CClientMtmRegistry* clientRegistry = CClientMtmRegistry::NewL( iMsvSession ); + CleanupStack::PushL( clientRegistry ); + + CBaseMtm* smtpmtm = clientRegistry->NewMtmL( KUidMsgTypeSMTP ); + CleanupStack::PushL( smtpmtm ); + + CMtmUiRegistry* mtmuireg = CMtmUiRegistry::NewL( iMsvSession ); + CleanupStack::PushL( mtmuireg ); + + CBaseMtmUi* smtpUi = mtmuireg->NewMtmUiL( *smtpmtm ); + CleanupStack::PushL( smtpUi ); + + CMsvEntrySelection* sel = new(ELeave) CMsvEntrySelection; + CleanupStack::PushL(sel); + sel->AppendL( iSMTPServiceId ); + + TBuf8<1> dummyParam; + CMsvOperation* op = smtpUi->InvokeAsyncFunctionL( KMtmUiFunctionPreCreateMessage, *sel, aStatus, dummyParam ); + + CleanupStack::PopAndDestroy( 5, clientRegistry ); // CSI: 47 # sel, smtpUi, mtmuireg, smtpmtm, clientRegistry + + IMUM_OUT(); + return op; + } + +// ---------------------------------------------------------------------------- +// CImumMBoxServiceDeletion::DoRemoveMailboxL() +// ---------------------------------------------------------------------------- +// +void CImumMBoxServiceDeletion::DoRemoveMailboxL() + { + IMUM_CONTEXT( CImumMBoxServiceDeletion::DoRemoveMailboxL, 0, KImumMtmLog ); + IMUM_IN(); + + iStatus = KRequestPending; + + iEmailApi->SettingsManagerL().RemoveAccount( iServiceId, ETrue ); + + iSubOperation = CMsvCompletedOperation::NewL( iMsvSession, + KUidMsvLocalServiceMtm, + KNullDesC8, + KMsvLocalServiceIndexEntryId, + iStatus ); + + + SetActive(); + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMBoxServiceDeletion::SetProgressStringL() +// ---------------------------------------------------------------------------- +// +void CImumMBoxServiceDeletion::SetProgressStringL( TMsvId aServiceId ) + { + TMsvId serv; + TMsvEntry tEntry; + + TInt err = iMsvSession.GetEntry( aServiceId, serv, tEntry ); + + if ( iProgressString ) + { + delete iProgressString; + iProgressString = NULL; + } + + iProgressString = StringLoader::LoadL( + R_EMAIL_SVCDELOP_DIALOG_TITLE, tEntry.iDetails, CEikonEnv::Static() ); + + iReporter.SetTitleL(*iProgressString); + iReporter.SetProgressDecoder( *this ); + } + +// End of File