email/imum/Utils/Src/ImumMboxManager.cpp
branchRCL_3
changeset 27 7fdbb852d323
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imum/Utils/Src/ImumMboxManager.cpp	Wed Sep 01 12:31:54 2010 +0100
@@ -0,0 +1,1700 @@
+/*
+* 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: 
+*       Encapsulates saving and removing email accounts
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <msvapi.h>                     // CMsvEntry
+#include <cemailaccounts.h>             // CEmailAccounts
+#include <smtpset.h>                    // CImSmtpSettings
+#include <pop3set.h>                    // CImPop3Settings
+#include <imapset.h>                    // CImImap4Settings
+#include <iapprefs.h>                   // CImIAPPreferences
+#include <muiumsvuiserviceutilitiesinternal.h>
+#include <SendUiConsts.h>
+
+#include "ImumInternalApiImpl.h"
+#include "ImumMboxSymbianDataConverter.h"
+#include "ImumMboxInternalDataConverter.h"
+#include "ImumMboxManager.h"
+#include "ImumInHealthServicesImpl.h"
+#include "ImumMboxData.h"
+#include "ImumMboxSettingsCtrl.h"
+#include "IMSSettingsNoteUi.h"
+#include "ImumUtilsLogging.h"
+#include "EmailUtils.H"
+#include "ImumPanic.h"
+
+#include <mtudreg.h>
+#include <muiumsvuiserviceutilitiesinternal.h>
+#include <featmgr.h>
+
+// EXTERNAL DATA STRUCTURES
+// EXTERNAL FUNCTION PROTOTYPES
+// CONSTANTS
+const TInt KImumMboxQueryTextLength    = 100;
+const TInt KImumMboxArrayGranularity   = 4;
+
+// MACROS
+// LOCAL CONSTANTS AND MACROS
+// MODULE DATA STRUCTURES
+// LOCAL FUNCTION PROTOTYPES
+// FORWARD DECLARATIONS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::CImumMboxManager()
+// ----------------------------------------------------------------------------
+//
+CImumMboxManager::CImumMboxManager(
+    CImumInternalApiImpl& aMailboxApi )
+    :
+    iMailboxApi( aMailboxApi ),
+    iMboxSettingsCtrl( NULL ),
+    iAccounts( NULL ),
+    iCleaner( NULL )
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::ConstructL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::ConstructL()
+    {
+    IMUM_CONTEXT( CImumMboxManager::ConstructL, 0, KLogData );
+    IMUM_IN();
+
+    FeatureManager::InitializeLibL();
+
+    iAccounts = CEmailAccounts::NewL();
+    iMboxSettingsCtrl = CImumMboxSettingsCtrl::NewL( iMailboxApi );
+    iCleaner = CImumInHealthServicesImpl::NewL( iMailboxApi );
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::~CImumMboxManager()
+// ----------------------------------------------------------------------------
+//
+CImumMboxManager::~CImumMboxManager()
+    {
+    IMUM_CONTEXT( CImumMboxManager::~CImumMboxManager, 0, KLogData );
+    IMUM_IN();
+
+    FeatureManager::UnInitializeLib();
+    delete iMboxSettingsCtrl;
+    iMboxSettingsCtrl = NULL;
+    delete iAccounts;
+    iAccounts = NULL;
+    delete iCleaner;
+    iCleaner = NULL;
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::NewL()
+// ----------------------------------------------------------------------------
+//
+CImumMboxManager* CImumMboxManager::NewL(
+    CImumInternalApiImpl& aMailboxApi )
+    {
+    IMUM_STATIC_CONTEXT( CImumMboxManager::NewL, 0, utils, KLogData );
+    IMUM_IN();
+
+    CImumMboxManager* self = NewLC( aMailboxApi );
+    CleanupStack::Pop( self );
+
+    IMUM_OUT();
+
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::NewLC()
+// ----------------------------------------------------------------------------
+//
+CImumMboxManager* CImumMboxManager::NewLC(
+    CImumInternalApiImpl& aMailboxApi )
+    {
+    IMUM_STATIC_CONTEXT( CImumMboxManager::NewLC, 0, utils, KLogData );
+    IMUM_IN();
+
+    CImumMboxManager* self =
+        new ( ELeave ) CImumMboxManager( aMailboxApi );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+
+    IMUM_OUT();
+
+    return self;
+    }
+
+/******************************************************************************
+
+    Static Functions
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::GetIapPreferencesL()
+// ----------------------------------------------------------------------------
+//
+TInt CImumMboxManager::GetIapPreferencesL(
+    const TMsvId aMailboxId,
+    CEmailAccounts& aAccounts,
+    CImIAPPreferences& aIapPrefs,
+    CImumInternalApiImpl& aMailboxApi,
+    const TBool aSmtp )
+    {
+    IMUM_STATIC_CONTEXT( CImumMboxManager::GetIapPreferencesL, 0, utils, KLogData );
+    IMUM_IN();
+
+    TMsvEntry entry;
+
+    // Get the correct part of the mailbox
+    if ( aSmtp )
+        {
+        // Get SMTP part of the mailbox
+        entry = aMailboxApi.MailboxUtilitiesL().GetMailboxEntryL(
+            aMailboxId, MImumInMailboxUtilities::ERequestSending );
+
+        // Define the account id
+        TSmtpAccount smtpAccountId;
+        smtpAccountId.iSmtpAccountId = entry.iMtmData2;
+
+        // Load preferences
+        aAccounts.LoadSmtpIapSettingsL( smtpAccountId, aIapPrefs );
+        }
+    else
+        {
+        // Get POP3 or IMAP4 part of the mailbox
+        entry = aMailboxApi.MailboxUtilitiesL().GetMailboxEntryL(
+            aMailboxId, MImumInMailboxUtilities::ERequestReceiving );
+
+        // Load settings based on the mtm type
+        if ( entry.iMtm.iUid == KSenduiMtmImap4UidValue )
+            {
+            // Define imap4 account id
+            TImapAccount imapAccountId;
+            imapAccountId.iImapAccountId = entry.iMtmData2;
+
+            // Load preferences
+            aAccounts.LoadImapIapSettingsL( imapAccountId, aIapPrefs );
+            }
+        else
+            {
+            // Define pop3 account id
+            TPopAccount popAccountId;
+            popAccountId.iPopAccountId = entry.iMtmData2;
+
+            // Load preferences
+            aAccounts.LoadPopIapSettingsL( popAccountId, aIapPrefs );
+            }
+        }
+
+    IMUM_OUT();
+
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::SetIapPreferencesL()
+// ----------------------------------------------------------------------------
+//
+TInt CImumMboxManager::SetIapPreferencesL(
+    const TMsvId aMailboxId,
+    CEmailAccounts& aAccounts,
+    const CImIAPPreferences& aIapPrefs,
+    CImumInternalApiImpl& aMailboxApi,
+    const TBool aSmtp )
+    {
+    IMUM_STATIC_CONTEXT( CImumMboxManager::SetIapPreferencesL, 0, utils, KLogData );
+    IMUM_IN();
+
+    TMsvEntry entry;
+    TInt error = KErrNone;
+
+    // Get the correct part of the mailbox
+    if ( aSmtp )
+        {
+        // Get SMTP part of the mailbox
+        entry = aMailboxApi.MailboxUtilitiesL().GetMailboxEntryL(
+            aMailboxId, MImumInMailboxUtilities::ERequestSending );
+
+        // Define the account id
+        TSmtpAccount smtpAccountId;
+        smtpAccountId.iSmtpAccountId = entry.iMtmData2;
+
+        // Load preferences
+        aAccounts.SaveSmtpIapSettingsL( smtpAccountId, aIapPrefs );
+        }
+    else
+        {
+        // Get POP3 or IMAP4 part of the mailbox
+        entry = aMailboxApi.MailboxUtilitiesL().GetMailboxEntryL(
+            aMailboxId, MImumInMailboxUtilities::ERequestReceiving );
+
+        // Load settings based on the mtm type
+        if ( entry.iMtm.iUid == KSenduiMtmImap4UidValue )
+            {
+            // Define imap4 account id
+            TImapAccount imapAccountId;
+            imapAccountId.iImapAccountId = entry.iMtmData2;
+
+            // Load preferences
+            aAccounts.SaveImapIapSettingsL( imapAccountId, aIapPrefs );
+            }
+        else
+            {
+            // Define pop3 account id
+            TPopAccount popAccountId;
+            popAccountId.iPopAccountId = entry.iMtmData2;
+
+            // Load preferences
+            aAccounts.SavePopIapSettingsL( popAccountId, aIapPrefs );
+            }
+        }
+
+    IMUM_OUT();
+
+    return error;
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::ForceAlwaysAskL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::ForceAlwaysAskL(
+    const TMsvId aMailboxId,
+    CEmailAccounts& aAccounts,
+    CImIAPPreferences& aIapPrefs,
+    CImumInternalApiImpl& aMailboxApi,
+    const TBool aSmtp )
+    {
+    IMUM_STATIC_CONTEXT( CImumMboxManager::ForceAlwaysAskL, 0, utils, KLogData );
+    IMUM_IN();
+
+    aIapPrefs.RemoveIAPL( 0 );
+    TImIAPChoice iap;
+    iap.iDialogPref = ECommDbDialogPrefPrompt;
+    iap.iIAP = 0;
+    aIapPrefs.AddIAPL( iap );
+    User::LeaveIfError( CImumMboxManager::SetIapPreferencesL(
+        aMailboxId, aAccounts, aIapPrefs, aMailboxApi, aSmtp ) );
+
+    IMUM_OUT();
+    }
+
+/******************************************************************************
+
+    Manager tools
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::CreateAccountFillIapL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::CreateAccountFillIapL(
+    CImumMboxData& aSettings )
+    {
+    IMUM_CONTEXT( CImumMboxManager::CreateAccountFillIapL, 0, KLogData );
+    IMUM_IN();
+
+    // This is not ideal choice, but current situation forces to do this,
+    // until Reset() funcion is exported from class CImIAPPreferences
+    delete aSettings.iIncomingIapPref;
+    aSettings.iIncomingIapPref = NULL;
+    delete aSettings.iOutgoingIapPref;
+    aSettings.iOutgoingIapPref = NULL;
+
+    // Make sure the preferences are made
+    if ( !aSettings.iIncomingIapPref )
+        {
+        aSettings.iIncomingIapPref = CImIAPPreferences::NewLC();
+        CleanupStack::Pop( aSettings.iIncomingIapPref );
+        }
+
+    if ( !aSettings.iOutgoingIapPref )
+        {
+        aSettings.iOutgoingIapPref = CImIAPPreferences::NewLC();
+        CleanupStack::Pop( aSettings.iOutgoingIapPref );
+        }
+
+    // Set incoming internet access point
+    TImIAPChoice incomingIapChoice;
+    incomingIapChoice.iIAP = aSettings.iIncomingIap;
+    incomingIapChoice.iDialogPref = ECommDbDialogPrefDoNotPrompt;
+    aSettings.iIncomingIapPref->AddIAPL( incomingIapChoice );
+
+    // Set outgoing internet access point
+    TImIAPChoice outgoingIapChoice;
+    outgoingIapChoice.iIAP = aSettings.iOutgoingIap;
+    outgoingIapChoice.iDialogPref = ECommDbDialogPrefDoNotPrompt;
+    aSettings.iOutgoingIapPref->AddIAPL( outgoingIapChoice );
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::LoadAccountFillIapL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::LoadAccountFillIapL(
+    CImumMboxData& aSettings )
+    {
+    IMUM_CONTEXT( CImumMboxManager::LoadAccountFillIapL, 0, KLogData );
+    IMUM_IN();
+	
+	//check Incoming IAP number 
+    if ( aSettings.iIncomingIapPref->NumberOfIAPs() > 0 )
+        {
+        // Set internet access point (incoming IAP)
+        TImIAPChoice incomingIapChoice =
+        aSettings.iIncomingIapPref->IAPPreference( 0 );
+        aSettings.iIncomingIap = incomingIapChoice.iIAP;
+        }
+    
+    //check SNAP define    
+    else if( aSettings.iIncomingIapPref->SNAPDefined() )
+        {
+        aSettings.iIncomingIap = aSettings.iIncomingIapPref->SNAPPreference();
+        }    
+    else 
+        {
+        aSettings.iIncomingIap = 0;
+        }
+    
+    //check Outgoing IAP number 
+    if ( aSettings.iOutgoingIapPref->NumberOfIAPs() > 0 )
+        {
+    // Set internet access point (Outgoing IAP)
+    TImIAPChoice outgoingIapChoice =
+        aSettings.iOutgoingIapPref->IAPPreference( 0 );
+    aSettings.iOutgoingIap = outgoingIapChoice.iIAP;
+       }
+    //check SNAP define    
+    else if( aSettings.iOutgoingIapPref->SNAPDefined() )
+        {
+        aSettings.iOutgoingIap = aSettings.iOutgoingIapPref->SNAPPreference();
+        }    
+   else 
+       {
+        aSettings.iOutgoingIap = 0;
+       }
+        
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::DetermineDefaultAccountL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::DetermineDefaultAccountL(
+    CImumMboxData& aSettings )
+    {
+    IMUM_CONTEXT( CImumMboxManager::DetermineDefaultAccountL, 0, KLogData );
+    IMUM_IN();
+
+    // First check if default account id is set
+    aSettings.iDefaultAccountId =
+        MsvUiServiceUtilitiesInternal::DefaultServiceForMTML(
+            iMailboxApi.MsvSession(), KSenduiMtmSmtpUid, EFalse );
+
+    // Set the newly created one as a default account
+    if ( aSettings.iDefaultAccountId == KMsvUnknownServiceIndexEntryId )
+        {
+    	if( !FeatureManager::FeatureSupported( KFeatureIdSelectableEmail ) ||
+			!MsvUiServiceUtilitiesInternal::OtherEmailMTMExistL( 
+			iMailboxApi.MsvSession(), aSettings.iMailboxId ) )
+			{
+            TSmtpAccount smtpAccountId;
+            iAccounts->GetSmtpAccountL( aSettings.iMailboxId, smtpAccountId );
+            iAccounts->SetDefaultSmtpAccountL( smtpAccountId );
+
+			MsvUiServiceUtilitiesInternal::SetDefaultServiceForMTML(
+					iMailboxApi.MsvSession(), KSenduiMtmSmtpUid, 
+					aSettings.iMailboxId );
+			aSettings.iDefaultAccountId = aSettings.iMailboxId;
+			}
+		}
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::RemoveAccountL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::RemoveAccountL(
+    const CImumMboxData& aSettings )
+    {
+    IMUM_CONTEXT( CImumMboxManager::RemoveAccountL, 0, KLogData );
+    IMUM_IN();
+
+    // Delete Imap4 or Pop3 account
+    if ( aSettings.iIsImap4 )
+        {
+        DeleteExtendedSettings( TIMAStorerParams(
+            aSettings.iImap4AccountId.iImapAccountId, KSenduiMtmImap4Uid ) );
+
+        DeleteBaseSettingsL( aSettings );
+        }
+    else
+        {
+        DeleteExtendedSettings( TIMAStorerParams(
+            aSettings.iPop3AccountId.iPopAccountId, KSenduiMtmPop3Uid ) );
+
+        DeleteBaseSettingsL( aSettings );
+        }
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::RemoveAccountL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::RemoveAccountL(
+    const TMsvEntry& aMailboxEntry, TBool aSilent )
+    {
+    IMUM_CONTEXT( CImumMboxManager::RemoveAccountL, 0, KLogData );
+    IMUM_IN();
+
+    if ( aSilent || AccountDeletionConditionsOkL( aMailboxEntry.Id() ) )
+        {
+        // Delete Imap4 or Pop3 account
+        if ( aMailboxEntry.iMtm == KSenduiMtmImap4Uid )
+            {
+            DeleteExtendedSettings( TIMAStorerParams(
+                aMailboxEntry.iMtmData2, KSenduiMtmImap4Uid ) );
+
+            DeleteBaseSettingsL( aMailboxEntry.iMtmData2, ETrue );
+            }
+        else
+            {
+            DeleteExtendedSettings( TIMAStorerParams(
+                aMailboxEntry.iMtmData2, KSenduiMtmPop3Uid ) );
+
+            DeleteBaseSettingsL( aMailboxEntry.iMtmData2, EFalse );
+            }
+        }
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::RemoveAccountL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::RemoveAccountL(
+    const TUint32 aRelatedAccountId,
+    const TUid& aMtmId )
+    {
+    IMUM_CONTEXT( CImumMboxManager::RemoveAccountL, 0, KLogData );
+    IMUM_IN();
+
+    // First remove the extended settings, as this cannot leave
+    DeleteExtendedSettings(
+        TIMAStorerParams( aRelatedAccountId, aMtmId ) );
+
+    // Delete Imap4 or Pop3 account
+    DeleteBaseSettingsL(
+        aRelatedAccountId, aMtmId == KSenduiMtmImap4Uid );
+
+    IMUM_OUT();
+    }
+
+// ---------------------------------------------------------------------------
+// CImumMboxManager::RemoveAccount()
+// ---------------------------------------------------------------------------
+//
+void CImumMboxManager::RemoveAccount( const TMsvId aMailboxId, TBool aSilent )
+    {
+    IMUM_CONTEXT( CImumMboxManager::RemoveAccount, 0, KLogData );
+    IMUM_IN();
+
+    TMsvEntry entry;
+    TRAPD( error, entry = iMailboxApi.MailboxUtilitiesL().GetMailboxEntryL(
+        aMailboxId,
+        MImumInMailboxUtilities::ERequestReceiving ) );
+
+    if ( !error )
+        {
+        TRAP_IGNORE( RemoveAccountL( entry, aSilent ) );
+        }
+
+    IMUM_OUT();
+    }
+
+
+/******************************************************************************
+
+    Account creation
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::CreateEmailAccount()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::CreateEmailAccount(
+    CImumMboxData& aSettings,
+    const TBool aPopulateDefaults )
+    {
+    IMUM_CONTEXT( CImumMboxManager::CreateEmailAccount, 0, KLogData );
+    IMUM_IN();
+
+    // If settings not ready, don't try to create
+    if ( aSettings.IsOk() )
+        {
+        // Attempt to create the mailaccount
+        TRAPD( error, CreateEmailAccountL( aSettings, aPopulateDefaults ) );
+
+        // Creating mailbox has failed, delete entries and cenrep settings
+        if ( error != KErrNone )
+            {
+            TRAP_IGNORE( RemoveAccountL( aSettings ) );
+            __ASSERT_DEBUG( EFalse, User::Panic( KImumMtmUiPanic, error ) );
+            }
+        }
+
+    IMUM_OUT();
+    }
+
+// ---------------------------------------------------------------------------
+// CImumMboxManager::CreateEmailAccountL()
+// ---------------------------------------------------------------------------
+//
+TMsvId CImumMboxManager::CreateEmailAccountL(
+    const CImumInSettingsData& aSettingsData )
+    {
+    IMUM_CONTEXT( CImumMboxManager::CreateEmailAccountL, 0, KLogData );
+    IMUM_IN();
+
+    CImumMboxData* settings =
+        CImumMboxSymbianDataConverter::ConvertToSymbianMboxDataLC(
+            iMailboxApi, aSettingsData );
+
+    CreateEmailAccountL( *settings, EFalse );
+
+    TMsvId mboxId = settings->iMailboxId;
+    CleanupStack::PopAndDestroy( settings );
+    settings = NULL;
+
+    IMUM_OUT();
+
+    return mboxId;
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::CreateEmailAccountL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::CreateEmailAccountL(
+    CImumMboxData& aSettings,
+    const TBool aPopulateDefaults )
+    {
+    IMUM_CONTEXT( CImumMboxManager::CreateEmailAccountL, 0, KLogData );
+    IMUM_IN();
+
+    TUint32 id = 0;
+    TUid mtmId;
+    TMsvId serviceId = 0;
+    IMUM0(0, " ### Starting mailbox creation processs");
+
+    // Check for imap4
+    if ( aSettings.iIsImap4 )
+        {
+        IMUM0( 0, " # STEP1 : Create IMAP4 account" );
+        // Catch all the problems with account creation
+        id = CreateImap4AccountL( aSettings, aPopulateDefaults );
+        serviceId = aSettings.iImap4AccountId.iImapService;
+        mtmId = KSenduiMtmImap4Uid;
+        }
+    else
+        {
+        IMUM0( 0, " # STEP1 : Create POP3 account" );
+
+        id = CreatePop3AccountL( aSettings, aPopulateDefaults );
+        serviceId = aSettings.iPop3AccountId.iPopService;
+        mtmId = KSenduiMtmPop3Uid;
+        }
+
+    IMUM0( 0, " # STEP1.5 : Store IMEI" );
+    iCleaner->StoreIMEIToMailbox( aSettings.iMailboxId );
+
+    IMUM0( 0, " # STEP2 : Create extended settings" );
+    CreateExtendedSettingsL( aSettings.iMailboxId, id, mtmId, aSettings, aPopulateDefaults );
+
+    IMUM0( 0, " # STEP3 : Store account ID to entry" );
+    StoreAccountIdToEntryL( aSettings );
+
+    IMUM0( 0, " # STEP4 : Choose default account" );
+    DetermineDefaultAccountL( aSettings );
+
+    IMUM0( 0, " # STEP5 : Store signature" );
+    TRAP_IGNORE( StoreSignatureL( aSettings ) );
+    
+    IMUM0( 0, " # STEP6 : Activate AO Email plugin if needed" );
+    if( serviceId && ( 
+        EMailAoOff  != aSettings.iExtendedSettings->AlwaysOnlineState() ||
+        EMailEmnOff != aSettings.iExtendedSettings->EmailNotificationState() ) )
+        {
+        TRAPD( error, MsvEmailMtmUiUtils::SendAOCommandL( EServerAPIEmailTurnOn, serviceId ) );
+		if ( error != KErrNotFound )
+			{
+			User::LeaveIfError( error );
+			}
+        }
+    IMUM0(0, " ### Finishing mailbox creation processs");
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::CreateImap4AccountL()
+// ----------------------------------------------------------------------------
+//
+TUint32 CImumMboxManager::CreateImap4AccountL(
+    CImumMboxData& aSettings,
+    const TBool aPopulateDefaults,
+    const TBool aReadOnly )
+    {
+    IMUM_CONTEXT( CImumMboxManager::CreateImap4AccountL, 0, KLogData );
+    IMUM_IN();
+
+    // Populate defaults
+    if ( aPopulateDefaults )
+        {
+        iAccounts->PopulateDefaultImapSettingsL(
+            *aSettings.iImap4Settings, *aSettings.iIncomingIapPref );
+        iAccounts->PopulateDefaultSmtpSettingsL(
+            *aSettings.iSmtpSettings, *aSettings.iOutgoingIapPref );
+        }
+
+    // Fill iap preferences
+    CreateAccountFillIapL( aSettings );
+
+    // Create the account
+    aSettings.iImap4AccountId = iAccounts->CreateImapAccountL(
+        aSettings.iName, *aSettings.iImap4Settings,
+        *aSettings.iIncomingIapPref, aReadOnly );
+    iAccounts->CreateSmtpAccountL( aSettings.iImap4AccountId,
+        *aSettings.iSmtpSettings, *aSettings.iOutgoingIapPref, aReadOnly );
+
+    aSettings.iMailboxId = aSettings.iImap4AccountId.iSmtpService;
+
+    IMUM_OUT();
+
+    return aSettings.iImap4AccountId.iImapAccountId;
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::CreatePop3AccountL()
+// ----------------------------------------------------------------------------
+//
+TUint32 CImumMboxManager::CreatePop3AccountL(
+    CImumMboxData& aSettings,
+    const TBool aPopulateDefaults,
+    const TBool aReadOnly )
+    {
+    IMUM_CONTEXT( CImumMboxManager::CreatePop3AccountL, 0, KLogData );
+    IMUM_IN();
+
+    // Populate defaults
+    if ( aPopulateDefaults )
+        {
+        iAccounts->PopulateDefaultPopSettingsL(
+            *aSettings.iPop3Settings, *aSettings.iIncomingIapPref );
+        iAccounts->PopulateDefaultSmtpSettingsL(
+            *aSettings.iSmtpSettings, *aSettings.iOutgoingIapPref );
+        }
+
+    // Fill iap preferences
+    CreateAccountFillIapL( aSettings );
+
+    // Create the account
+    aSettings.iPop3AccountId = iAccounts->CreatePopAccountL(
+        aSettings.iName,
+        *aSettings.iPop3Settings, *aSettings.iIncomingIapPref, aReadOnly );
+    iAccounts->CreateSmtpAccountL( aSettings.iPop3AccountId,
+        *aSettings.iSmtpSettings, *aSettings.iOutgoingIapPref, aReadOnly );
+
+    aSettings.iMailboxId = aSettings.iPop3AccountId.iSmtpService;
+
+    IMUM_OUT();
+
+    return aSettings.iPop3AccountId.iPopAccountId;
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::CreateExtendedSettingsL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::CreateExtendedSettingsL(
+    const TMsvId aMailboxId,
+    const TUint32 aAccountId,
+    const TUid& aProtocol,
+    CImumMboxData& aSettings,
+    const TBool aPopulateDefaults )
+    {
+    IMUM_CONTEXT( CImumMboxManager::CreateExtendedSettingsL, 0, KLogData );
+    IMUM_IN();
+
+    // If populating has been successful
+    User::LeaveIfError( iMboxSettingsCtrl->CreateSettings(
+        aMailboxId, aAccountId, aProtocol,
+        *aSettings.iExtendedSettings, aPopulateDefaults ) );
+
+    IMUM_OUT();
+    }
+
+/******************************************************************************
+
+    Account Deletion
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::DeleteExtendedSettings()
+// ----------------------------------------------------------------------------
+//
+TInt CImumMboxManager::DeleteExtendedSettings(
+    const TIMAStorerParams& aParams )
+    {
+    // Delete the settings
+    return iMboxSettingsCtrl->DeleteExtendedSettings( aParams );
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::DeleteRelatedSmtpAccountsL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::DeleteRelatedSmtpAccountsL(
+    const CImumMboxData& aSettings )
+    {
+    IMUM_CONTEXT( CImumMboxManager::DeleteRelatedSmtpAccountsL, 0, KLogData );
+    IMUM_IN();
+
+    // Get the available smtp accounts
+    RArray<TSmtpAccount> smtpAccountArray;
+    iAccounts->GetSmtpAccountsL( smtpAccountArray );
+
+    // Get the related service id
+    TMsvId relatedServiceId = aSettings.iIsImap4 ?
+        aSettings.iImap4AccountId.iImapService :
+        aSettings.iPop3AccountId.iPopService;
+
+    // Delete the accounts
+    DeleteSmtpAccountsL( relatedServiceId, smtpAccountArray );
+
+    smtpAccountArray.Reset();
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::DeleteRelatedSmtpAccountsL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::DeleteRelatedSmtpAccountsL(
+    const TUint32 aRelatedAccountId,
+    const TBool aIsImap4 )
+    {
+    IMUM_CONTEXT( CImumMboxManager::DeleteRelatedSmtpAccountsL, 0, KLogData );
+    IMUM_IN();
+
+    // Get the available imap accounts
+    TMsvId relatedService = KMsvNullIndexEntryId;
+
+    if ( aIsImap4 )
+        {
+        // Get Imap account
+        RIMASImap4IdArray imapAccountArray;
+        iAccounts->GetImapAccountsL( imapAccountArray );
+
+        // Find the account from imap accounts
+        for ( TInt mailbox = imapAccountArray.Count();
+            --mailbox >= 0 && relatedService == KMsvNullIndexEntryId; )
+            {
+            TUint32 imapId = imapAccountArray[mailbox].iImapAccountId;
+            if ( imapId == aRelatedAccountId )
+                {
+                relatedService = imapAccountArray[mailbox].iImapService;
+                }
+            }
+
+        imapAccountArray.Reset();
+        }
+    else
+        {
+        // Get pop account
+        RIMASPop3IdArray popAccountArray;
+        iAccounts->GetPopAccountsL( popAccountArray );
+
+        // Find the account from pop accounts
+        for ( TInt mailbox = popAccountArray.Count();
+            --mailbox >= 0 && relatedService == KMsvNullIndexEntryId; )
+            {
+            TUint32 popId = popAccountArray[mailbox].iPopAccountId;
+            if ( popId == aRelatedAccountId )
+                {
+                relatedService = popAccountArray[mailbox].iPopService;
+                }
+            }
+
+        popAccountArray.Reset();
+        }
+
+    // If found, remove the accounts
+    if ( relatedService != KMsvNullIndexEntryId )
+        {
+        RIMASSmtpIdArray smtpAccountArray;
+        iAccounts->GetSmtpAccountsL( smtpAccountArray );
+
+        // Delete the accounts
+        DeleteSmtpAccountsL( relatedService, smtpAccountArray );
+        smtpAccountArray.Reset();
+        }
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::DeleteSmtpAccountsL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::DeleteSmtpAccountsL(
+    const TMsvId aRelatedMailboxId,
+    const RIMASSmtpIdArray& aSmtpAccountArray )
+    {
+    IMUM_CONTEXT( CImumMboxManager::DeleteSmtpAccountsL, 0, KLogData );
+    IMUM_IN();
+
+    TSmtpAccount smtpId;
+
+    // Start checking the mailboxes
+    for ( TInt mailbox = aSmtpAccountArray.Count(); --mailbox >= 0; )
+        {
+        smtpId = aSmtpAccountArray[mailbox];
+
+        // If the related id matches with the smtp accounts related service
+        // id, the account can be deleted.
+        if ( aRelatedMailboxId == smtpId.iRelatedService )
+            {
+            iAccounts->DeleteSmtpAccountL( smtpId );
+            }
+        }
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::DeleteBaseSettingsL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::DeleteBaseSettingsL(
+    const TUint32 aRelatedAccountId,
+    const TBool aIsImap4 )
+    {
+    IMUM_CONTEXT( CImumMboxManager::DeleteBaseSettingsL, 0, KLogData );
+
+    // Remove the related smtp accounts
+    DeleteRelatedSmtpAccountsL( aRelatedAccountId, aIsImap4 );
+
+    // Determine the account type
+    if ( aIsImap4 )
+        {
+        // Remove the Imap4 account
+        TImapAccount imapId;
+        imapId.iImapAccountId = aRelatedAccountId;
+        iAccounts->DeleteImapAccountL( imapId );
+        }
+    else
+        {
+        // Remove the Pop3 account
+        TPopAccount popId;
+        popId.iPopAccountId = aRelatedAccountId;
+        iAccounts->DeletePopAccountL( popId );
+        }
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::DeleteBaseSettingsL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::DeleteBaseSettingsL(
+    const CImumMboxData& aSettings )
+    {
+    IMUM_CONTEXT( CImumMboxManager::DeleteBaseSettingsL, 0, KLogData );
+    IMUM_IN();
+
+    // Remove the related smtp accounts
+    DeleteRelatedSmtpAccountsL( aSettings );
+
+    // Determine the account type
+    if ( aSettings.iIsImap4 )
+        {
+        // Remove the Imap4 account
+        iAccounts->DeleteImapAccountL( aSettings.iImap4AccountId );
+        }
+    else
+        {
+        // Remove the Pop3 account
+        iAccounts->DeletePopAccountL( aSettings.iPop3AccountId );
+        }
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::DeleteAccountSettings()
+// ----------------------------------------------------------------------------
+//
+TInt CImumMboxManager::DeleteAccountSettings(
+    const TUint32 aAccountId,
+    const TUid& aMtmId )
+    {
+    IMUM_CONTEXT( CImumMboxManager::DeleteAccountSettings, 0, KLogData );
+    IMUM_IN();
+
+    TInt error = KErrNone;
+
+    // Delete the related extended settings
+    if ( aMtmId == KSenduiMtmImap4Uid )
+        {
+        // Delete Imap4 or Pop3 account
+        TImapAccount imapId;
+        imapId.iImapAccountId = aAccountId;
+        TRAP( error, iAccounts->DeleteImapAccountL( imapId ) );
+        }
+    else if ( aMtmId == KSenduiMtmPop3Uid )
+        {
+        // Remove the Pop3 account
+        TPopAccount popId;
+        popId.iPopAccountId = aAccountId;
+        TRAP( error, iAccounts->DeletePopAccountL( popId ) );
+        }
+    else
+        {
+        // Remove the Smtp account
+        TSmtpAccount smtpId;
+        smtpId.iSmtpAccountId = aAccountId;
+        TRAP( error, iAccounts->DeleteSmtpAccountL( smtpId ) );
+        }
+
+    if ( aMtmId != KSenduiMtmSmtpUid )
+        {
+        DeleteExtendedSettings(
+            TIMAStorerParams( aAccountId, aMtmId ) );
+        }
+
+    IMUM_OUT();
+
+    return error;
+    }
+
+// ---------------------------------------------------------------------------
+// CImumMboxManager::CheckAccountDeletionConditionsL()
+// ---------------------------------------------------------------------------
+//
+TBool CImumMboxManager::CheckAccountDeletionConditionsL(
+    const TMsvId aMailboxId )
+    {
+    return AccountDeletionConditionsOkL( aMailboxId );
+    }
+
+/******************************************************************************
+
+    Account Saving
+
+******************************************************************************/
+
+// ---------------------------------------------------------------------------
+// CImumMboxManager::SaveEmailSettingsL()
+// ---------------------------------------------------------------------------
+//
+void CImumMboxManager::SaveEmailSettingsL(
+    const CImumInSettingsData& aSettingsData )
+    {
+    IMUM_CONTEXT( CImumMboxManager::SaveEmailSettingsL, 0, KLogData );
+    IMUM_IN();
+
+    CImumMboxData* settings =
+        CImumMboxSymbianDataConverter::ConvertToSymbianMboxDataLC(
+            iMailboxApi, aSettingsData );
+
+    SaveEmailSettingsL( *settings );
+
+    CleanupStack::PopAndDestroy( settings );
+    settings = NULL;
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::SaveEmailSettingsL()
+// ----------------------------------------------------------------------------
+//
+TInt CImumMboxManager::SaveEmailSettingsL(
+    CImumMboxData& aSettings )
+    {
+    IMUM_CONTEXT( CImumMboxManager::SaveEmailSettingsL, 0, KLogData );
+    IMUM_IN();
+
+    // If settings not ready, don't try to create
+    if ( !aSettings.IsOk() )
+        {
+        return KErrNotFound;
+        }
+
+    TInt error = KErrNone;
+    CreateAccountFillIapL( aSettings );
+
+    // Check for imap4
+    if ( aSettings.iIsImap4 )
+        {
+        // Catch all the problems with account creation
+        TRAP( error, SaveImap4SettingsL( aSettings ) );
+
+        // Attempt to save the extended settings, even if other settings have
+        // failed to save
+        iMboxSettingsCtrl->SaveSettings( *aSettings.iExtendedSettings );
+        TRAP_IGNORE( StoreSignatureL( aSettings ) );
+        }
+    // It's a pop
+    else
+        {
+        // Catch all the problems with account creation
+        TRAP( error, SavePop3SettingsL( aSettings ) );
+
+        // Attempt to save the extended settings, even if other settings have
+        // failed to save
+        iMboxSettingsCtrl->SaveSettings( *aSettings.iExtendedSettings );
+        TRAP_IGNORE( StoreSignatureL( aSettings ) );
+        }
+
+    IMUM_OUT();
+
+    return error;
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::SavePop3SettingsL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::SavePop3SettingsL(
+    CImumMboxData& aSettings )
+    {
+    IMUM_CONTEXT( CImumMboxManager::SavePop3SettingsL, 0, KLogData );
+    IMUM_IN();
+
+    TSmtpAccount smtpAccountId;
+    iAccounts->GetSmtpAccountL(
+        aSettings.iPop3AccountId.iSmtpService, smtpAccountId );
+
+    // Store the mailbox name
+    aSettings.iPop3AccountId.iPopAccountName.Copy(
+        aSettings.iName );
+    smtpAccountId.iSmtpAccountName.Copy(
+        aSettings.iName );
+
+    // Load mailbox settings
+    iAccounts->SavePopSettingsL(
+        aSettings.iPop3AccountId, *aSettings.iPop3Settings );
+    iAccounts->SavePopIapSettingsL(
+        aSettings.iPop3AccountId, *aSettings.iIncomingIapPref );
+    iAccounts->SaveSmtpSettingsL(
+        smtpAccountId, *aSettings.iSmtpSettings );
+    iAccounts->SaveSmtpIapSettingsL(
+        smtpAccountId, *aSettings.iOutgoingIapPref );
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::SaveImap4SettingsL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::SaveImap4SettingsL(
+    CImumMboxData& aSettings )
+    {
+    IMUM_CONTEXT( CImumMboxManager::SaveImap4SettingsL, 0, KLogData );
+    IMUM_IN();
+
+    TSmtpAccount smtpAccountId;
+    iAccounts->GetSmtpAccountL(
+        aSettings.iImap4AccountId.iSmtpService, smtpAccountId );
+
+    // Store the mailbox name
+    aSettings.iImap4AccountId.iImapAccountName.Copy(
+        aSettings.iName );
+    smtpAccountId.iSmtpAccountName.Copy(
+        aSettings.iName );
+
+    // Load mailbox settings
+    iAccounts->SaveImapSettingsL(
+        aSettings.iImap4AccountId, *aSettings.iImap4Settings );
+    iAccounts->SaveImapIapSettingsL(
+        aSettings.iImap4AccountId, *aSettings.iIncomingIapPref );
+    iAccounts->SaveSmtpSettingsL(
+        smtpAccountId, *aSettings.iSmtpSettings );
+    iAccounts->SaveSmtpIapSettingsL(
+        smtpAccountId, *aSettings.iOutgoingIapPref );
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::StoreAccountIdToEntryL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::StoreAccountIdToEntryL(
+    const TMsvId aMailboxId,
+    const TUint32 aAccountId )
+    {
+    IMUM_CONTEXT( CImumMboxManager::StoreAccountIdToEntryL, 0, KLogData );
+    IMUM_IN();
+
+    // Get the entry
+    CMsvEntry* cEntry = iMailboxApi.MsvSession().GetEntryL( aMailboxId );
+    CleanupStack::PushL( cEntry );
+
+    // Store the value to the entry
+    TMsvEntry tEntry( cEntry->Entry() );
+    tEntry.iMtmData2 = aAccountId;
+    cEntry->ChangeL( tEntry );
+
+    CleanupStack::PopAndDestroy( cEntry );
+    cEntry = NULL;
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::GetMailboxAccountIdsL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::GetMailboxAccountIdsL(
+    const TMsvId aMailboxId,
+    TMsvId& aReceivingMailboxId,
+    TUint32& aReceivingAccountId,
+    TMsvId& aSendingMailboxId,
+    TUint32& aSendingAccountId )
+    {
+    IMUM_CONTEXT( CImumMboxManager::GetMailboxAccountIdsL, 0, KLogData );
+    IMUM_IN();
+
+    MImumInMailboxUtilities::RMsvEntryArray entries;
+    iMailboxApi.MailboxUtilitiesL().GetMailboxEntriesL(
+        aMailboxId, entries );
+    TMsvEntry receiving = entries[0];
+    TMsvEntry sending = entries[1];
+    entries.Reset();
+
+    if ( receiving.iMtm == KSenduiMtmImap4Uid )
+        {
+        // Get Imap account id
+        TImapAccount imapAccountId;
+        iAccounts->GetImapAccountL( receiving.Id(), imapAccountId );
+
+        aReceivingMailboxId = receiving.Id();
+        aReceivingAccountId = imapAccountId.iImapAccountId;
+        aSendingMailboxId = sending.Id();
+        }
+    else if ( receiving.iMtm == KSenduiMtmPop3Uid )
+        {
+        // Get Pop account id
+        TPopAccount popAccountId;
+        iAccounts->GetPopAccountL( receiving.Id(), popAccountId );
+
+        aReceivingMailboxId = receiving.Id();
+        aReceivingAccountId = popAccountId.iPopAccountId;
+        aSendingMailboxId = sending.Id();
+        }
+    else
+        {
+        // This should not happen ever, but if it does for some reason
+        // then leave, as the leave will be trapped and the mailbox
+        // shall be removed after it
+        User::Leave( KErrUnknown );
+        }
+
+    // Get smtp account id
+    TSmtpAccount smtpAccountId;
+    iAccounts->GetSmtpAccountL( aSendingMailboxId, smtpAccountId );
+
+    aSendingAccountId = smtpAccountId.iSmtpAccountId;
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::StoreAccountIdToEntryL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::StoreAccountIdToEntryL(
+    CImumMboxData& aSettings )
+    {
+    IMUM_CONTEXT( CImumMboxManager::StoreAccountIdToEntryL, 0, KLogData );
+    IMUM_IN();
+
+    TMsvId sendingMailboxId;
+    TMsvId receivingMailboxId;
+    TUint32 sendingAccountId;
+    TUint32 receivingAccountId;
+    GetMailboxAccountIdsL( aSettings.iMailboxId,
+        receivingMailboxId, receivingAccountId,
+        sendingMailboxId, sendingAccountId );
+
+    StoreAccountIdToEntryL( receivingMailboxId, receivingAccountId );
+    StoreAccountIdToEntryL( sendingMailboxId, sendingAccountId );
+
+    IMUM_OUT();
+    }
+
+/******************************************************************************
+
+    Account Loading
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::LoadEmailSettingsL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::LoadEmailSettingsL(
+    const TMsvEntry& aEntry,
+    CImumMboxData& aSettings )
+    {
+    IMUM_CONTEXT( CImumMboxManager::LoadEmailSettingsL, 0, KLogData );
+    IMUM_IN();
+
+    // Get both of the entries
+    TMsvEntry receiving = iMailboxApi.MailboxUtilitiesL().GetMailboxEntryL(
+        aEntry.Id(), MImumInMailboxUtilities::ERequestReceiving );
+
+    // Store the id and protocol
+    aSettings.iMailboxId = receiving.iRelatedId;
+    aSettings.iIsImap4 = ( receiving.iMtm == KSenduiMtmImap4Uid );
+
+    // Load settings based on the protocol
+    if ( aSettings.iIsImap4 )
+        {
+        iAccounts->GetImapAccountL(
+            receiving.Id(), aSettings.iImap4AccountId );
+        LoadImap4SettingsL( aSettings );
+
+        // Load extended settings
+        TUint32 accountId = aSettings.iImap4AccountId.iImapAccountId;
+        iMboxSettingsCtrl->LoadSettings(
+            TIMAStorerParams( accountId, receiving.iMtm ),
+            *aSettings.iExtendedSettings );
+
+        // Attempt to read the signature
+        TRAP_IGNORE( RestoreSignatureL( aSettings ) );
+        }
+    else // pop3
+        {
+        iAccounts->GetPopAccountL(
+            receiving.Id(), aSettings.iPop3AccountId );
+        LoadPop3SettingsL( aSettings );
+
+        // Load extended settings
+        TUint32 accountId = aSettings.iPop3AccountId.iPopAccountId;
+        iMboxSettingsCtrl->LoadSettings(
+            TIMAStorerParams( accountId, receiving.iMtm ),
+            *aSettings.iExtendedSettings );
+
+        // Attempt to read the signature
+        TRAP_IGNORE( RestoreSignatureL( aSettings ) );
+        }
+
+    IMUM_OUT();
+    }
+
+// ---------------------------------------------------------------------------
+// CImumMboxManager::LoadEmailSettingsL()
+// ---------------------------------------------------------------------------
+//
+CImumInSettingsData* CImumMboxManager::LoadEmailSettingsL(
+    const TMsvId aMailboxId )
+    {
+    IMUM_CONTEXT( CImumMboxManager::LoadEmailSettingsL, 0, KLogData );
+    IMUM_IN();
+
+    CImumMboxData* oldData = CImumMboxData::NewLC();
+    TMsvEntry mailbox =
+        iMailboxApi.MailboxUtilitiesL().GetMailboxEntryL( aMailboxId );
+    LoadEmailSettingsL( mailbox, *oldData );
+
+    CImumInSettingsData* internalData =
+        CImumMboxInternalDataConverter::ConvertToInternalMboxDataLC(
+            iMailboxApi, *oldData );
+    CleanupStack::Pop( internalData );
+    CleanupStack::PopAndDestroy( oldData );
+    oldData = NULL;
+
+    IMUM_OUT();
+
+    return internalData;
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::LoadPop3SettingsL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::LoadPop3SettingsL(
+    CImumMboxData& aSettings )
+    {
+    IMUM_CONTEXT( CImumMboxManager::LoadPop3SettingsL, 0, KLogData );
+    IMUM_IN();
+
+    TSmtpAccount smtpAccountId;
+    iAccounts->GetSmtpAccountL(
+        aSettings.iPop3AccountId.iSmtpService, smtpAccountId );
+
+    // Load mailbox settings
+    iAccounts->LoadPopSettingsL(
+        aSettings.iPop3AccountId, *aSettings.iPop3Settings );
+    iAccounts->LoadPopIapSettingsL(
+        aSettings.iPop3AccountId, *aSettings.iIncomingIapPref );
+    iAccounts->LoadSmtpSettingsL(
+        smtpAccountId, *aSettings.iSmtpSettings );
+    iAccounts->LoadSmtpIapSettingsL(
+        smtpAccountId, *aSettings.iOutgoingIapPref );
+
+    LoadAccountFillIapL( aSettings );
+    aSettings.iName.Copy( aSettings.iPop3AccountId.iPopAccountName );
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::LoadImap4SettingsL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::LoadImap4SettingsL(
+    CImumMboxData& aSettings )
+    {
+    IMUM_CONTEXT( CImumMboxManager::LoadImap4SettingsL, 0, KLogData );
+    IMUM_IN();
+
+    TSmtpAccount smtpAccountId;
+    iAccounts->GetSmtpAccountL(
+        aSettings.iImap4AccountId.iSmtpService, smtpAccountId );
+
+    // Load mailbox settings
+    iAccounts->LoadImapSettingsL(
+        aSettings.iImap4AccountId, *aSettings.iImap4Settings );
+    iAccounts->LoadImapIapSettingsL(
+        aSettings.iImap4AccountId, *aSettings.iIncomingIapPref );
+    iAccounts->LoadSmtpSettingsL(
+        smtpAccountId, *aSettings.iSmtpSettings );
+    iAccounts->LoadSmtpIapSettingsL(
+        smtpAccountId, *aSettings.iOutgoingIapPref );
+
+    LoadAccountFillIapL( aSettings );
+    aSettings.iName.Copy( aSettings.iImap4AccountId.iImapAccountName );
+
+    IMUM_OUT();
+    }
+
+/******************************************************************************
+
+    MISC TOOLS
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::StoreSignatureL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::StoreSignatureL(
+    const CImumMboxData& aSettings )
+    {
+    IMUM_CONTEXT( CImumMboxManager::StoreSignatureL, 0, KLogData );
+    IMUM_IN();
+
+    // Get Signature
+    CMsvEntry* entry = iMailboxApi.MsvSession().GetEntryL( aSettings.iMailboxId );
+    CleanupStack::PushL( entry );
+    CMsvStore* msvStore = entry->EditStoreL();
+    CleanupStack::PushL( msvStore );
+
+    msvStore->StoreBodyTextL( *( aSettings.iSignature->iRichText ) );
+    msvStore->CommitL();
+
+    CleanupStack::PopAndDestroy( msvStore );
+    msvStore = NULL;
+    CleanupStack::PopAndDestroy( entry );
+    entry = NULL;
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::RestoreSignatureL()
+// ----------------------------------------------------------------------------
+//
+void CImumMboxManager::RestoreSignatureL(
+    CImumMboxData& aSettings )
+    {
+    IMUM_CONTEXT( CImumMboxManager::RestoreSignatureL, 0, KLogData );
+    IMUM_IN();
+
+    // Get Signature
+    CMsvEntry* entry = iMailboxApi.MsvSession().GetEntryL( aSettings.iMailboxId );
+    CleanupStack::PushL( entry );
+    CMsvStore* msvStore = entry->ReadStoreL();
+    CleanupStack::PushL( msvStore );
+
+    aSettings.iSignature->CreateEmptyRichTextL();
+    msvStore->RestoreBodyTextL( *( aSettings.iSignature->iRichText ) );
+
+    CleanupStack::PopAndDestroy( msvStore );
+    msvStore = NULL;
+    CleanupStack::PopAndDestroy( entry );
+    entry = NULL;
+
+    IMUM_OUT();
+    }
+
+// ---------------------------------------------------------------------------
+// CImumMboxManager::IsConnectedL()
+// ---------------------------------------------------------------------------
+//
+TBool CImumMboxManager::IsConnectedL( const TMsvId aMailboxId ) const
+    {
+    IMUM_CONTEXT( CImumMboxManager::IsConnectedL, 0, KLogData );
+    IMUM_IN();
+
+    TBool connected = EFalse;
+
+    // Make sure that none of the entries is in connected state
+    MImumInMailboxUtilities::RMsvEntryArray entries;
+    iMailboxApi.MailboxUtilitiesL().GetMailboxEntriesL(
+        aMailboxId, entries );
+    CleanupClosePushL( entries );
+
+    for ( TInt mbox = entries.Count(); --mbox >= 0 && !connected; )
+        {
+        connected = entries[mbox].Connected();
+        }
+
+    CleanupStack::PopAndDestroy( &entries );
+
+    IMUM_OUT();
+
+    return connected;
+    }
+
+// ---------------------------------------------------------------------------
+// CImumMboxManager::IsLockedL()
+// ---------------------------------------------------------------------------
+//
+TBool CImumMboxManager::IsLockedL( const TMsvId aMailboxId ) const
+    {
+    IMUM_CONTEXT( CImumMboxManager::IsLockedL, 0, KLogData );
+    IMUM_IN();
+
+    TBool isLocked = EFalse;
+    CMsvEntry* centry =
+        iMailboxApi.MsvSession().GetEntryL( aMailboxId );
+    CleanupStack::PushL( centry );
+
+    // If the entry is locked, deletion should not be possible
+    TRAPD( err, centry->ChangeL( centry->Entry() ) );
+    if( err != KErrNone )
+        {
+        isLocked = ETrue;
+        }
+
+    CleanupStack::PopAndDestroy( centry );
+    centry = NULL;
+
+    IMUM_OUT();
+
+    return isLocked;
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxManager::HandleMailboxInUseDeleteL()
+// ----------------------------------------------------------------------------
+//
+TBool CImumMboxManager::HandleMailboxInUseDeleteL(
+    MImumInHealthServices::RMailboxIdArray& aMailboxes,
+    const TMsvEntry& aSmtpEntry ) const
+    {
+    IMUM_CONTEXT( CImumMboxManager::HandleMailboxInUseDeleteL, 0, KLogData );
+    IMUM_IN();
+    TBool continueDeletion(ETrue);
+    TMsvId newDefaultId = 0;
+    TInt mailboxCount = aMailboxes.Count();
+    if ( mailboxCount == 2 ) // CSI: 47 # Mailbox count.
+        {
+        // set default to be the other one
+        TInt newDefaultIndex =
+            ( aSmtpEntry.Id() == aMailboxes[0] ) ? 1 : 0;
+        newDefaultId = aMailboxes[newDefaultIndex];
+        }
+    else
+        {
+        // To show mailbox name list, the array must be constructed here
+        CDesCArrayFlat* items =
+            new ( ELeave ) CDesCArrayFlat( KImumMboxArrayGranularity );
+        CleanupStack::PushL( items );
+
+        TMsvEntry tempEntry;
+        TInt delIndex=-1;
+        for (TInt loop = 0; loop < mailboxCount; loop++)
+            {
+            TMsvId tempServiceId;
+            User::LeaveIfError( iMailboxApi.MsvSession().GetEntry(
+                aMailboxes[loop],
+                tempServiceId,
+                tempEntry ) );
+            if ( aSmtpEntry.Id() != tempEntry.Id() )
+                {
+                items->AppendL( tempEntry.iDetails );
+                }
+            else
+                {
+                delIndex = loop;
+                }
+            }
+        if ( delIndex>=0 )
+            {
+            //take the mailbox to be deleted off from the array
+            aMailboxes.Remove(delIndex);
+            }
+
+        TInt index = 0;
+        CAknListQueryDialog* dlg = new (ELeave) CAknListQueryDialog(&index);
+        dlg->PrepareLC( R_IMUM_NEW_DEFAULT_MAILBOX_LIST_QUERY );
+        dlg->SetItemTextArray( items );
+        dlg->SetOwnershipType( ELbmDoesNotOwnItemArray );
+        if ( dlg->RunLD( ) == EEikBidOk )
+            {
+            newDefaultId = aMailboxes[index];
+            }
+        else
+            {
+            continueDeletion = EFalse;
+            }
+
+        CleanupStack::PopAndDestroy( items );  // items
+        items = NULL;
+        }
+
+    if ( newDefaultId )
+        {
+        // Set default
+        MsvUiServiceUtilitiesInternal::SetDefaultServiceForMTML(
+                iMailboxApi.MsvSession(),
+                KSenduiMtmSmtpUid,
+                newDefaultId );
+        }
+
+    IMUM_OUT();
+    return continueDeletion;
+    }
+
+// ---------------------------------------------------------------------------
+// CImumMboxManager::AccountDeletionConditionsOkL()
+// ---------------------------------------------------------------------------
+//
+TBool CImumMboxManager::AccountDeletionConditionsOkL(
+    const TMsvId aMailboxId )
+    {
+    IMUM_CONTEXT( CImumMboxManager::AccountDeletionConditionsOkL, 0, KLogData );
+    IMUM_IN();
+
+    TBool conditionsOk = EFalse;
+
+    // Entry is required to get the name of the mailbox Id
+    TMsvEntry mailbox = iMailboxApi.MailboxUtilitiesL().GetMailboxEntryL(
+        aMailboxId, MImumInMailboxUtilities::ERequestSending );
+    TBuf<KImumMboxQueryTextLength> name;
+    name.Copy( mailbox.iDetails.Left( KImumMboxQueryTextLength ) );
+    TUid mtm = KSenduiMtmSmtpUid;
+
+    TMsvId defaultService = MsvUiServiceUtilitiesInternal::
+            DefaultServiceForMTML(
+                iMailboxApi.MsvSession(), mtm, EFalse );
+
+    // Get the list of available mailboxes
+    MImumInHealthServices::RMailboxIdArray mailboxes;
+    iMailboxApi.HealthServicesL().GetMailboxList( mailboxes, 
+        MImumInHealthServices::EFlagGetHealthy | 
+        MImumInHealthServices::EFlagIncludeSmtp );
+    CleanupClosePushL( mailboxes );
+
+    // Don't allow locked or connected mailboxes to be deleted
+    if ( IsConnectedL( aMailboxId ) ||
+         IsLockedL( mailbox.Id() ) )
+        {
+        CIMSSettingsNoteUi::ShowNoteL(
+            R_IMUM_SETTINGS_MAIL_NO_DELETE, EIMSInformationNote, ETrue );
+        }
+    //
+    else if ( mailboxes.Count() == 1 )
+        {
+        conditionsOk =
+            CIMSSettingsNoteUi::ShowQueryL<KImumMboxQueryTextLength>(
+                R_IMUM_SETTINGS_MAIL_QUEST_DEL,
+                mailbox.iDetails );
+
+        }
+    // If the current mailbox is not default, it can be deleted
+    // immediately.
+    else if ( mailbox.Id() != defaultService )
+        {
+        conditionsOk =
+            CIMSSettingsNoteUi::ShowQueryL<KImumMboxQueryTextLength>(
+                R_IMUM_COMMON_CONF_DELETE,
+                mailbox.iDetails );
+        }
+    else
+        {
+        conditionsOk =
+            CIMSSettingsNoteUi::ShowQueryL<KImumMboxQueryTextLength>(
+                R_IMUM_SETTINGS_MAIL_QUEST_D,
+                mailbox.iDetails );
+
+        if ( conditionsOk )
+            {
+            conditionsOk = HandleMailboxInUseDeleteL( mailboxes, mailbox );
+            }
+        }
+
+    CleanupStack::PopAndDestroy( &mailboxes );
+
+    IMUM_OUT();
+    return conditionsOk;
+    }
+
+
+// End Of File
+