email/imum/Utils/Src/ImumMBoxServiceDeletion.cpp
changeset 0 72b543305e3a
--- /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.h> // StringLoader
+#include <mtuireg.h>
+#include <muiumsvuiserviceutilitiesinternal.h>
+#include <imum.rsg>
+#include <MtmExtendedCapabilities.hrh>
+
+#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<CBaseMtmUi::EProgressStringMaxLen>& 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