messagingappbase/mcesettings/src/MceSettingsMultipleServicesDialog.cpp
changeset 0 72b543305e3a
child 12 caea42e26caa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/mcesettings/src/MceSettingsMultipleServicesDialog.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,1887 @@
+/*
+* Copyright (c) 2002 - 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:  
+*     Message centre's mail/smail dialog.
+*     Includes "remote mailboxes" and "Mailbox in use" setting items.
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include <muiumsvuiserviceutilitiesinternal.h> //MsvUiServiceUtilities
+#include <msvuids.h>
+#include <AknQueryDialog.h> // CAknQueryDialog
+#include <aknViewAppUi.h>
+#include <aknradiobuttonsettingpage.h>
+#include <StringLoader.h>   // StringLoader
+#include <e32base.h>
+
+#include <msvids.h>         // KMsvUnknownServiceIndexEntryId
+#include "MceSettingsMultipleServicesDialog.h"
+#include "MceSettingsAccountManager.h"
+#include "MceSettingsIds.hrh"
+
+#include "MceSettingsArrays.h"
+#include "MceSettingsMtmServicesDialog.h"
+#include <MceSettings.rsg>
+
+#include <featmgr.h>
+#include <hlplch.h>             // For HlpLauncher
+#include <csxhelp/mbxs.hlp.hrh>
+#include "mce.hlp.hrh"
+
+#include <bldvariant.hrh>
+#include <SenduiMtmUids.h>
+
+#include <ImumInternalApi.h>
+#include <ImumInHealthServices.h>
+#include <muiuflags.h>
+#include "MceSettingsUtils.h"
+#include <muiuemailtools.h>
+#include <mtudreg.h>
+
+#include <centralrepository.h>
+#include <miutset.h>
+#include <MessagingDomainCRKeys.h>
+#include <akninputblock.h> // CAknInputBlock
+#ifdef RD_MESSAGING_GENERAL_SETTINGS_RENOVATION
+#include <data_caging_path_literals.hrh>
+#endif // RD_MESSAGING_GENERAL_SETTINGS_RENOVATION
+#include <imum.rsg>
+
+// CONSTANTS
+
+#define KMceApplicationUidValue         0x100058C5
+const TUid KMceApplicationUid           = {KMceApplicationUidValue};
+
+const TInt KMceSettingsRemoteMailboxInUseSelectableEmailInUse   = 0;
+const TInt KMceSettingsRemoteMailboxInUse   = 1;
+const TInt KMceSettingsMailboxTextLength    = 20;
+const TInt KMceSettingsArrayGranularity     = 4;
+
+const TInt KMceSettingsMtmNameBufLength     = KHumanReadableNameLength + 5;
+const TInt KMSKPosition = 3;
+
+_LIT(KMceMtmName1,"\t");
+_LIT(KMceMtmName2,"\t\t");
+#ifdef RD_MESSAGING_GENERAL_SETTINGS_RENOVATION
+_LIT( KMceDirAndFile,"MceSettings.rsc" );
+#endif // RD_MESSAGING_GENERAL_SETTINGS_RENOVATION
+
+// ================= MEMBER FUNCTIONS =======================
+// ---------------------------------------------------------------------------
+// CMceSettingsMultipleServicesDialog::CreateAndExecuteL()
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CMceSettingsMultipleServicesDialog::CreateAndExecuteL(
+                                              MMceSettingsAccountManager& aManager,
+                                              TUid aMessageType,
+                                              CMsvSession* aSession )
+    {
+#ifdef RD_MESSAGING_GENERAL_SETTINGS_RENOVATION
+    CMceSettingsMultipleServicesDialog* mailDlg =new( ELeave ) CMceSettingsMultipleServicesDialog(aManager,  aMessageType, aSession );
+    CleanupStack::PushL( mailDlg );
+    FeatureManager::InitializeLibL();
+    if ( FeatureManager::FeatureSupported( KFeatureIdSelectableEmail ) )  
+    {
+      mailDlg->ConstructL(R_MCE_SETTINGS_MULTIPLE_SERVICES_DIALOG_MENUBAR_WITH_SELECTABLE_EMAIL );
+  	  CleanupStack::Pop( mailDlg );
+      return mailDlg->ExecuteLD( R_MCE_SETTINGS_MULTIPLE_SERVICES_DIALOG_MENUBAR_WITH_SELECTABLE_EMAIL );
+    }
+   else
+   {
+  	  mailDlg->ConstructL( R_MCE_SETTINGS_MULTIPLE_SERVICES_DIALOG_MENUBAR );
+  	  CleanupStack::Pop( mailDlg );
+      return mailDlg->ExecuteLD( R_MCE_SETTINGS_MULTIPLE_SERVICES_DIALOG );
+    
+   }
+   FeatureManager::UnInitializeLib();
+#else
+    User::Leave( KErrNotSupported );
+    return KErrNotSupported;
+#endif // RD_MESSAGING_GENERAL_SETTINGS_RENOVATION
+    }
+
+// ----------------------------------------------------
+// C++ default constructor can NOT contain any code that
+// might leave.
+// ----------------------------------------------------
+CMceSettingsMultipleServicesDialog::CMceSettingsMultipleServicesDialog(
+                                                MMceSettingsAccountManager& aManager, 
+                                                TUid aMessageType,
+                                                CMsvSession* aSession )
+    : 
+    CMceSettingsTitlePaneHandlerDialog(),
+    iManager( aManager ),
+    iMessageType( aMessageType ),
+    iSession( aSession )
+#ifdef RD_MESSAGING_GENERAL_SETTINGS_RENOVATION
+    ,iResources( *CCoeEnv::Static() )
+#endif // RD_MESSAGING_GENERAL_SETTINGS_RENOVATION
+	,iSubDialogOpen(EFalse)
+    ,iS60WizLaunched( EFalse )
+    {
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::Destructor
+// ----------------------------------------------------
+CMceSettingsMultipleServicesDialog::~CMceSettingsMultipleServicesDialog()
+    {
+    if ( iMceIntegration )
+        {
+        if ( iAiwServiceHandler )
+            {
+            iAiwServiceHandler->Reset();
+            }
+        delete iAiwServiceHandler;
+        iAiwServiceHandler = NULL;
+        }
+    // do not delete iMtmAccountTypesDlg only used to notify msgs changes
+    if ( iSessionObserverAdded )
+        {
+        iManager.Session().RemoveObserver( *this );
+        }
+    delete iEmailApi;
+    iEmailApi = NULL;
+    iMailboxArray.Reset();  
+#ifdef RD_MESSAGING_GENERAL_SETTINGS_RENOVATION
+    iResources.Close();
+#endif // RD_MESSAGING_GENERAL_SETTINGS_RENOVATION
+    if ( iProductIncludesSelectableEmail )
+        {
+        if ( iAccountArray )
+            {
+            delete iAccountArray;		
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMceSettingsMultipleServicesDialog::ConstructL()
+// ---------------------------------------------------------------------------
+//
+void CMceSettingsMultipleServicesDialog::ConstructL(TInt aResource )
+    {
+    CRepository* repository = NULL;
+    TRAPD( ret, repository = CRepository::NewL( KCRUidSelectableDefaultEmailSettings  ) );
+
+    if ( ret == KErrNone )
+        {
+        // Check if there is other than platform email application registered
+        // to handle S60 mailboxes  
+        TInt err = repository->Get( KIntegratedEmailAppMtmPluginId , iMtmPluginId );
+        if ( err != KErrNone )
+            {
+            iMtmPluginId = 0;
+            }
+        }
+    delete repository;
+
+    FeatureManager::InitializeLibL();
+    if ( FeatureManager::FeatureSupported( KFeatureIdSelectableEmail ) )
+        {
+        iProductIncludesSelectableEmail = ETrue;
+        }
+    else
+        {
+        iProductIncludesSelectableEmail = EFalse;	
+        }
+    if( FeatureManager::FeatureSupported( KFeatureIdEmailMceIntegration ) )
+        {
+        iMceIntegration = ETrue;
+        }
+    else
+        {
+        iMceIntegration = EFalse;
+        }
+    FeatureManager::UnInitializeLib();
+#ifdef RD_MESSAGING_GENERAL_SETTINGS_RENOVATION
+    TParse fp;
+    fp.Set( KMceDirAndFile, &KDC_RESOURCE_FILES_DIR , NULL );
+    TFileName fileName = fp.FullName();
+    iResources.OpenL( fileName );
+    CMceSettingsTitlePaneHandlerDialog::ConstructL( aResource );
+#endif // RD_MESSAGING_GENERAL_SETTINGS_RENOVATION
+    iEmailApi = CreateEmailApiL( iSession );
+    UpdateMailboxDataL();
+    }
+   
+// ---------------------------------------------------------------------------
+// CMceSettingsMultipleServicesDialog::ConstructL()
+// ---------------------------------------------------------------------------
+//
+void CMceSettingsMultipleServicesDialog::ConstructL()
+    {
+    CRepository* repository = NULL;
+    TRAPD( ret, repository = CRepository::NewL( KCRUidSelectableDefaultEmailSettings  ) );
+
+    if ( ret == KErrNone )
+        {
+        // Check if there is other than platform email application registered
+        // to handle S60 mailboxes  
+        TInt err = repository->Get( KIntegratedEmailAppMtmPluginId , iMtmPluginId );
+        if ( err != KErrNone )
+            {
+            iMtmPluginId = 0;
+            }
+        }
+    delete repository;
+
+    FeatureManager::InitializeLibL();
+    if ( FeatureManager::FeatureSupported( KFeatureIdSelectableEmail ) )
+        {
+        iProductIncludesSelectableEmail = ETrue;
+        }
+    else
+        {
+        iProductIncludesSelectableEmail = EFalse;	
+        }
+    if ( FeatureManager::FeatureSupported( KFeatureIdEmailMceIntegration ) )
+        {
+        iMceIntegration = ETrue;
+        }
+    else
+        {
+        iMceIntegration = EFalse;
+        }
+    FeatureManager::UnInitializeLib();
+    iEmailApi = CreateEmailApiL( iSession );
+    UpdateMailboxDataL();
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::OkToExitL
+// ----------------------------------------------------
+TInt CMceSettingsMultipleServicesDialog::OkToExitL( TInt aButtonId )
+    {
+    if ( iSubDialogOpen )
+        {
+        // Subdialog open, don't close yet
+        return EFalse;
+        }
+    TBool okToExit = CAknDialog::OkToExitL( aButtonId );
+    if ( ( aButtonId==EMceSettingsCmdSettingsDialogOpen ) ||
+         ( aButtonId==EMceSettingsCmdSettingsDialogChange ) )
+        {
+        // Middle soft key pressed
+        ProcessCommandL( aButtonId );
+        okToExit = EFalse; // Cannot exit, since MSK was pressed
+        }
+    else if ( aButtonId != EEikBidCancel && okToExit )
+        {
+        RestoreTitleTextL();
+        }
+
+    return okToExit;
+    }
+ 
+// ---------------------------------------------------------------------------
+// CMceSettingsMultipleServicesDialog::UpdateMailboxDataL()
+// ---------------------------------------------------------------------------
+//
+void CMceSettingsMultipleServicesDialog::UpdateMailboxDataL()
+    {
+    const MImumInHealthServices* healthApi = &iEmailApi->HealthServicesL();
+    
+    // Get the array of the mailboxes for the current view
+    MceSettingsUtils::GetHealthyMailboxListL( 
+        *healthApi,
+        iMailboxArray,
+        iMessageType != KSenduiMtmSyncMLEmailUid,
+        iMessageType != KSenduiMtmSyncMLEmailUid,
+        iMessageType == KSenduiMtmSyncMLEmailUid,
+        EFalse );
+    iNumberOfMailboxes = iMailboxArray.Count();
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::ProcessCommandL
+// ----------------------------------------------------
+void CMceSettingsMultipleServicesDialog::ProcessCommandL( TInt aCommandId )
+    {
+    if ( aCommandId == EMceSettingsCmdSettingsDialogExit )
+        {
+        CAknDialog::ProcessCommandL( aCommandId ); // hides menu
+        if (iAvkonViewAppUi->ExitHidesInBackground()) 
+            { 
+            iAvkonViewAppUi->ProcessCommandL( EAknCmdHideInBackground );
+            }
+        else
+            {
+            iAvkonViewAppUi->ProcessCommandL( EAknCmdExit );
+            }
+        return;
+        }
+
+    CAknDialog::ProcessCommandL( aCommandId ); // hides menu
+
+    if ( !iProductIncludesSelectableEmail )
+        {
+        if ( !iEmailApi )
+            {
+            iEmailApi = CreateEmailApiL( iSession );
+            }
+
+        const MImumInHealthServices* healthApi = &iEmailApi->HealthServicesL();
+
+        TInt error = MceSettingsUtils::GetHealthyMailboxListL( *healthApi,
+                                                               iMailboxArray,
+                                                               ETrue,
+                                                               ETrue,
+                                                               ETrue,ETrue );
+
+        iNumberOfMailboxes = iMailboxArray.Count();        
+        iMailboxArray.Reset();        
+        error = MceSettingsUtils::GetHealthyMailboxListL( *healthApi,
+                                  iMailboxArray,
+                                  iMessageType != KSenduiMtmSyncMLEmailUid,
+                                  iMessageType != KSenduiMtmSyncMLEmailUid,
+                                  iMessageType == KSenduiMtmSyncMLEmailUid,ETrue );
+        }
+    if ( iProductIncludesSelectableEmail )
+        {
+        CEikTextListBox* list=STATIC_CAST( CEikTextListBox*, 
+                Control( EMceSettingsMultipleServicesDialogChoiceList ) );
+        TInt item = list->CurrentItemIndex();
+
+        // first item in listbox is not account and must not be used
+        if ( item > 0 )
+            {
+            item--;
+            }
+
+        TUid mtmType;
+
+        if ( item >= 0 && iAccountArray->Count() &&
+             ( iAccountArray->Count() > item ) ) 
+            {
+            TMsvEntry tentry;
+            TMsvId dummyserviceid;
+            if ( iSession->GetEntry( (*iAccountArray)[item].iUid.iUid,
+                 dummyserviceid,
+                 tentry ) == KErrNone )
+                {
+                mtmType = tentry.iMtm;
+                }
+            else
+                {
+                mtmType.iUid = 0;
+                }
+
+            if ( ( mtmType == KSenduiMtmImap4Uid ) ||
+                 ( mtmType == KSenduiMtmPop3Uid ) )
+                {
+                mtmType = KSenduiMtmSmtpUid;
+                }
+            }
+
+        if ( iActiveMenuBar == EMultipleServices ) 
+            {
+            switch ( aCommandId )
+                {
+                case EMceSettingsCmdSettingsDialogChange:
+                    {
+                    ShowListBoxSettingPageL();
+                    }
+                    break;       
+                case EMceSettingsCmdSettingsDialogOpen:
+                    iManager.EditAccountL( (*iAccountArray)[item].iUid.iUid );
+                    break;
+                case EMceSettingsCmdSettingsDialogCreateNewEmpty:				
+                    iManager.CreateNewAccountL( mtmType, KMsvNullIndexEntryId );
+                    break;
+                case EMceSettingsCmdSettingsDialogCreateNewEmptyImap:				
+                    CreateNewImapPopL();
+                    break;
+                case EMceSettingsCmdSettingsDialogDelete:
+                    iManager.DeleteAccountL( (*iAccountArray)[item].iUid.iUid );
+                    break;
+                case EMceSettingsCmdSettingsDialogHelp:
+                    {
+                    LaunchHelpL();
+                    }         
+                    break;				                
+                default :
+                    break;
+                }
+            }
+        }
+    else // iProductIncludesSelectableEmail
+        {
+        switch ( aCommandId )
+            {
+            case EMceSettingsCmdSettingsDialogOpen:
+                EditServicesL();
+                break;
+            case EMceSettingsCmdSettingsDialogChange:
+                ShowListBoxSettingPageL();
+                break;
+            case EMceSettingsCmdSettingsDialogHelp:
+                {
+                LaunchHelpL();                
+                }
+                break;
+            default :
+                break;
+            }
+        }
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::DynInitMenuPaneL
+// ----------------------------------------------------
+void CMceSettingsMultipleServicesDialog::DynInitMenuPaneL( TInt aResourceId, 
+                                                                    CEikMenuPane* aMenuPane )
+    {
+    if ( iProductIncludesSelectableEmail )
+        {
+        CEikTextListBox* list = STATIC_CAST( CEikTextListBox*,
+                Control( EMceSettingsMultipleServicesDialogChoiceList ) );
+        TInt item = list->CurrentItemIndex();    
+
+        if ( aResourceId == R_MCE_SETTINGS_MULTIPLE_SERVICES_DIALOG_MENUPANE_WITH_SELECTABLE_EMAIL )
+            {    			
+            TInt offset = 0;
+
+            if ( item > offset )
+                {
+                TUid mtmType;
+
+                aMenuPane->DeleteMenuItem(
+                        EMceSettingsCmdSettingsDialogChange );				
+                aMenuPane->DeleteMenuItem(
+                        EMceSettingsCmdSettingsDialogCreateNewEmpty );    	                      
+
+                aMenuPane->SetItemDimmed( EMceSettingsCmdSettingsDialogHelp,
+                        !FeatureManager::FeatureSupported( KFeatureIdHelp ) );					
+
+                if ( iAccountArray->Count() &&
+                   ( iAccountArray->Count() >= item ) )
+                    {   	        		
+                    CMsvEntry* entry = iSession->GetEntryL(
+                                       (*iAccountArray)[item-1].iUid.iUid ); 
+
+                    TMsvEntry tentry = entry->Entry();
+                    mtmType = tentry.iMtm;
+                    delete entry;
+
+                    if ( iAccountArray->Count() >= KMceMaxNumberOfMailboxes )
+                        {             
+                        if ( ( mtmType != KSenduiMtmImap4Uid ) &&
+                             ( mtmType != KSenduiMtmPop3Uid ) )
+                            {
+                            aMenuPane->DeleteMenuItem(
+                                    EMceSettingsCmdSettingsDialogDelete ); 
+                            }                		  	
+                        aMenuPane->DeleteMenuItem(
+                                EMceSettingsCmdSettingsDialogCreateNewEmptyImap );
+                        }        		
+                    else if ( ( mtmType != KSenduiMtmImap4Uid ) &&
+                              ( mtmType != KSenduiMtmPop3Uid ) &&
+                              ( mtmType != KSenduiMtmSyncMLEmailUid ) )
+                        {
+                        aMenuPane->DeleteMenuItem(
+                                EMceSettingsCmdSettingsDialogCreateNewEmptyImap );
+                        aMenuPane->DeleteMenuItem(
+                                EMceSettingsCmdSettingsDialogDelete );         	        
+                        }
+                    }
+                }
+
+            else if ( item == KMceSettingsRemoteMailboxInUseSelectableEmailInUse )
+                {
+                aMenuPane->DeleteMenuItem(
+                        EMceSettingsCmdSettingsDialogOpen );
+                aMenuPane->DeleteMenuItem(
+                        EMceSettingsCmdSettingsDialogDelete );        
+                aMenuPane->DeleteMenuItem(
+                        EMceSettingsCmdSettingsDialogCreateNewEmpty );      	    
+
+                aMenuPane->SetItemDimmed( EMceSettingsCmdSettingsDialogHelp,
+                        !FeatureManager::FeatureSupported( KFeatureIdHelp ) ); 	
+
+                if ( iAccountArray->Count() >= KMceMaxNumberOfMailboxes )
+                    {
+                    aMenuPane->DeleteMenuItem(
+                            EMceSettingsCmdSettingsDialogCreateNewEmptyImap );
+                    }	            	                  	
+                }
+            else
+                {
+                aMenuPane->DeleteMenuItem(
+                        EMceSettingsCmdSettingsDialogChange );				
+                aMenuPane->DeleteMenuItem(
+                        EMceSettingsCmdSettingsDialogCreateNewEmptyImap ); 
+
+                aMenuPane->SetItemDimmed( EMceSettingsCmdSettingsDialogHelp,
+                        !FeatureManager::FeatureSupported( KFeatureIdHelp ) ); 					
+
+                if ( iAccountArray->Count() >= KMceMaxNumberOfMailboxes )
+                    {            		
+                    TUid mtmType;
+
+                    CMsvEntry* entry = iSession->GetEntryL(
+                                       (*iAccountArray)[item-1].iUid.iUid ); 
+
+                    TMsvEntry tentry = entry->Entry();
+                    mtmType = tentry.iMtm;
+                    delete entry;            		
+
+                    if ( ( mtmType != KSenduiMtmImap4Uid ) &&
+                         ( mtmType != KSenduiMtmPop3Uid ) )
+                        {
+                        aMenuPane->DeleteMenuItem(
+                                EMceSettingsCmdSettingsDialogDelete ); 
+                        }              		
+                    aMenuPane->DeleteMenuItem(
+                            EMceSettingsCmdSettingsDialogCreateNewEmpty );
+                    }
+                }
+            }
+        } // iProductIncludesSelectableEmail
+    else
+        {
+    if ( aResourceId == R_MCE_SETTINGS_MULTIPLE_SERVICES_DIALOG_MENUPANE )
+        {
+            aMenuPane->SetItemDimmed( EMceSettingsCmdSettingsDialogHelp,
+            !FeatureManager::FeatureSupported( KFeatureIdHelp ) );
+
+        CEikTextListBox* list = STATIC_CAST( CEikTextListBox*, 
+                                  Control( EMceSettingsMultipleServicesDialogChoiceList ) );
+        if ( list->CurrentItemIndex() == 0 )
+            {
+            aMenuPane->DeleteMenuItem( EMceSettingsCmdSettingsDialogChange );
+            }
+        else
+            {
+            aMenuPane->DeleteMenuItem( EMceSettingsCmdSettingsDialogOpen );
+            }
+        }
+    }
+    }
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::PreLayoutDynInitL
+// ----------------------------------------------------
+void CMceSettingsMultipleServicesDialog::PreLayoutDynInitL( )
+    {
+    CEikTextListBox* list = STATIC_CAST( CEikTextListBox*, 
+                                Control( EMceSettingsMultipleServicesDialogChoiceList ) );
+
+    THumanReadableName mtmName;
+
+    iSettingsItemArray = new (ELeave) CDesCArrayFlat(
+                         KMceSettingsArrayGranularity );
+    if ( iProductIncludesSelectableEmail )
+        {
+        if ( !iAccountArray )
+            {
+            iAccountArray = new (ELeave) CUidNameArray(
+                            KMceSettingsArrayGranularity );
+            }	
+
+        SetAccountInUseL();
+        mtmName = iManager.MtmName( iMessageType );
+        UpdateServicesArrayL();
+        // Scrollbar
+        list->CreateScrollBarFrameL( ETrue );
+        list->ScrollBarFrame()->SetScrollBarVisibilityL(
+                CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+        }
+    else // iProductIncludesSelectableEmail
+        {
+        mtmName = iManager.MtmName( iMessageType );
+    if ( iMessageType == KSenduiMtmSmtpUid )
+        {
+        // email
+        HBufC* text = StringLoader::LoadLC(
+            R_MCE_SETTINGS_MAIL_REMOTE_MAILBOXES, iEikonEnv );
+        iSettingsItemArray->AppendL( *text );
+        CleanupStack::PopAndDestroy( text );
+        }
+    else if ( iMessageType == KSenduiMtmSyncMLEmailUid )
+        {
+        // syncML
+        HBufC* text = StringLoader::LoadLC(
+            R_MCE_SETTINGS_SYNCMAIL_MAILBOXES, iEikonEnv );
+        iSettingsItemArray->AppendL( *text );
+        CleanupStack::PopAndDestroy( text );
+        }
+    else
+        {
+        // not email/syncML
+        TBuf<KMceSettingsMtmNameBufLength> mtms;
+        mtms.Copy( KMceMtmName1 );
+        mtms.Append( mtmName );
+        mtms.Append ( KMceMtmName2 );
+        iSettingsItemArray->AppendL( mtms );
+        }
+    
+    SetAccountInUseL();
+        } // iProductIncludesSelectableEmail
+
+    CTextListBoxModel* model=list->Model();
+    model->SetItemTextArray( iSettingsItemArray );
+    list->SetListBoxObserver(this);
+
+    if ( iMessageType == KSenduiMtmSmtpUid )
+        {
+        // email
+        HBufC* newText = StringLoader::LoadLC(
+            R_MCE_EMAIL_SETTINGS_TITLE, iEikonEnv );
+        StoreTitleTextAndSetNewL( *newText );
+        CleanupStack::PopAndDestroy( newText );
+        }
+    else if ( iMessageType == KSenduiMtmSyncMLEmailUid )
+        {
+        // syncML
+        HBufC* newText = StringLoader::LoadLC(
+            R_MCE_TITLE_SETTINGS_SYNCMAIL, iEikonEnv );
+        StoreTitleTextAndSetNewL( *newText );
+        CleanupStack::PopAndDestroy(  newText );
+        }
+    else
+        {
+        // not email/syncML
+        StoreTitleTextAndSetNewL( mtmName );
+        }     
+
+    iManager.Session().AddObserverL( *this );
+    iSessionObserverAdded = ETrue;
+    SetMSKButtonL();
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::ShowListBoxSettingPageL
+// ----------------------------------------------------
+void CMceSettingsMultipleServicesDialog::ShowListBoxSettingPageL()
+    {
+    TInt count = 0;
+    TBool nbrOfMailboxesOk = ETrue;
+    CUidNameArray* sel = NULL; // Used for iProductIncludesSelectableEmail
+
+    //Produce radiobutton list of mailboxes for selecting the default mailbox
+    if ( iProductIncludesSelectableEmail )
+        {
+        sel = MtmEmailAccountsL();
+        CleanupStack::PushL( sel );
+        count = sel->Count();
+        }
+    else
+        {
+        count = iMailboxArray.Count();
+        if ( iNumberOfMailboxes >= KMceMaxNumberOfMailboxes )
+            {
+            nbrOfMailboxesOk = EFalse;
+            }
+        }
+    if ( count == 0 && nbrOfMailboxesOk )
+        {
+        if ( HandleNoMailboxesL() )
+            {
+            if( iMceIntegration )
+                {
+                if ( iS60WizLaunched )
+                    {
+                    iS60WizLaunched = EFalse;
+                    EditServicesL();
+                    }
+                }
+            else // iMceIntegration
+                {
+                EditServicesL();
+                } // iMceIntegration
+            }
+        if ( iProductIncludesSelectableEmail )
+            {
+            CleanupStack::PopAndDestroy( sel );
+            }
+        return;
+        }
+    UpdateMailboxDataL();
+    CDesCArrayFlat* items = new( ELeave )CDesCArrayFlat(
+        KMceSettingsArrayGranularity );
+    CleanupStack::PushL( items );
+
+    TMsvId id = MsvUiServiceUtilitiesInternal::DefaultServiceForMTML(
+        iManager.Session(),
+        iMessageType,
+        ETrue );
+
+    if ( iProductIncludesSelectableEmail &&
+            ( iMessageType != KSenduiMtmSyncMLEmailUid ) )
+        {
+        CRepository* repository = NULL;
+        TRAPD( ret, repository = CRepository::NewL(
+                                 KCRUidSelectableDefaultEmailSettings  ) );
+        CleanupStack::PushL( repository );
+        TInt val;
+
+        if ( ret == KErrNone )
+            {
+            if ( repository->Get(
+                    KSelectableDefaultMailAccount , val ) == KErrNone )
+                {
+                id = val;
+                }
+            }
+        CleanupStack::PopAndDestroy( repository );		    
+        } // iProductIncludesSelectableEmail
+    TMsvEntry mailboxEntry;
+    TMsvId serviceId; // not used but needed by GetEntry function
+    TBool foundService = iManager.Session().GetEntry( id, serviceId, mailboxEntry ) == KErrNone;
+
+    TInt currentItem = 0;
+    for ( TInt loop = 0; loop < count; loop++ )
+        {
+        TMsvId arrayItemId;
+        if ( iProductIncludesSelectableEmail )
+            {
+            items->AppendL( (*sel)[loop].iName );
+            arrayItemId = (*sel)[loop].iUid.iUid;
+            }
+        else
+            {
+            TMsvEntry tentry =
+                    iEmailApi->MailboxUtilitiesL().GetMailboxEntryL( 
+                    iMailboxArray[loop],
+                    MImumInMailboxUtilities::ERequestSending );
+            items->AppendL( tentry.iDetails );
+            arrayItemId = iMailboxArray[loop];
+            }
+        // iRelatedId is compared because array can include both smtp and
+        // imap4/pop3 services
+        if ( foundService &&
+           ( id == arrayItemId || mailboxEntry.iRelatedId == arrayItemId ) )
+            {
+            currentItem = loop;
+            }
+        } // for
+
+    CAknRadioButtonSettingPage* dlg =
+            new ( ELeave )CAknRadioButtonSettingPage(
+            R_MCE_GENERAL_SETTINGS_LISTBOX, 
+            currentItem, items);
+    CleanupStack::PushL( dlg );    
+
+    THumanReadableName mtmName = iManager.MtmName( iMessageType );    
+    if ( iMessageType == KSenduiMtmSmtpUid )
+        {
+        // email
+        HBufC* titleText = StringLoader::LoadLC(
+                           R_MCE_SETTINGS_MAIL_TITLE_TITLEDEFAULT,
+                           iEikonEnv );
+        dlg->SetSettingTextL( *titleText );
+        CleanupStack::PopAndDestroy( titleText );
+        }
+    else if ( iMessageType == KSenduiMtmSyncMLEmailUid )
+        {
+        // syncML
+        HBufC* titleText = StringLoader::LoadLC(
+                           R_MCE_SETTINGS_MAIL_TITLE_TITLEDEFAULT,
+                           iEikonEnv );
+        dlg->SetSettingTextL( *titleText );
+        CleanupStack::PopAndDestroy( titleText );
+        }
+    else
+        {
+        // not email/syncML
+        dlg->SetSettingTextL( mtmName );
+        }
+
+    CleanupStack::Pop( dlg );
+
+    if ( dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ) )
+        {
+        if ( iProductIncludesSelectableEmail )
+            {
+            id = (*sel)[currentItem].iUid.iUid;
+            }
+        else
+            {
+            id = iMailboxArray[currentItem];
+            }
+        CMsvSession& session = iManager.Session();
+        TMsvEntry entry;
+        TMsvId serviceid;
+        if ( session.GetEntry( id, serviceid, entry ) == KErrNone )
+            {
+            // idTemp is used only if iProductIncludesSelectableEmail
+            TInt idTemp = entry.Id();
+            MsvUiServiceUtilitiesInternal::SetDefaultServiceForMTML(
+                                           session, entry.iMtm, id );
+
+            // set related service's default too...
+            if ( session.GetEntry(
+                    entry.iRelatedId, serviceid, entry ) == KErrNone )
+                {
+                MsvUiServiceUtilitiesInternal::SetDefaultServiceForMTML(
+                                               session, entry.iMtm, entry.Id() );
+                }
+
+            if( iProductIncludesSelectableEmail &&
+                    ( ( entry.iMtm == KSenduiMtmImap4Uid ) ||
+                            ( entry.iMtm == KSenduiMtmPop3Uid ) ||
+                            ( entry.iMtm == KSenduiMtmSmtpUid ) ) )
+                {		               
+                CRepository* repository = NULL;
+                TRAPD( ret, repository =
+                CRepository::NewL( KCRUidSelectableDefaultEmailSettings  ) );
+                CleanupStack::PushL( repository );
+
+                if ( ret == KErrNone )
+                    {
+                    TInt value = entry.Id();
+                    repository->Set( KSelectableDefaultMailAccount , idTemp );
+                    }
+                CleanupStack::PopAndDestroy( repository );		
+                } // iProductIncludesSelectableEmail
+            }               
+        SetAccountInUseL();
+
+        CEikTextListBox* list = STATIC_CAST( CEikTextListBox*, 
+                Control( EMceSettingsMultipleServicesDialogChoiceList ) );
+        list->DrawDeferred();
+        }
+
+    CleanupStack::PopAndDestroy( items );       
+
+    if ( iProductIncludesSelectableEmail )
+        {
+        CleanupStack::PopAndDestroy( sel );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMceSettingsMultipleServicesDialog::LaunchDialogL()
+// ---------------------------------------------------------------------------
+//
+void CMceSettingsMultipleServicesDialog::LaunchDialogL( 
+    MMceSettingsAccountManager& aManager, 
+    const TUid& aMessageType, 
+    CMsvSession& aSession,
+    const TInt& aMenuResource,
+    const TInt& aDialogResource )
+    {
+    // if mtm supports account creation then open new dialog to 
+    // handle many accounts
+    CMceSettingsMultipleServicesDialog* mailDlg =
+        new( ELeave ) CMceSettingsMultipleServicesDialog( 
+        aManager, aMessageType, &aSession );
+    CleanupStack::PushL( mailDlg );
+    mailDlg->ConstructL();
+    static_cast<CAknDialog*>( mailDlg )->ConstructL( aMenuResource );
+    CleanupStack::Pop( mailDlg );
+    mailDlg->ExecuteLD( aDialogResource );    
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::EditServicesL
+// ----------------------------------------------------
+void CMceSettingsMultipleServicesDialog::EditServicesL()
+    {
+    CUidNameArray* sel = iManager.MtmAccountsL( iMessageType );
+    UpdateMailboxDataL();
+    iSubDialogForceClosed = ETrue;
+    
+    if ( ( iNumberOfMailboxes < KMceMaxNumberOfMailboxes ) &&
+         ( iMailboxArray.Count() == 0 ) )
+        {
+        delete sel;
+        if ( HandleNoMailboxesL() && ( iSubDialogForceClosed == TRUE ) )
+            {    	    
+			if( iMceIntegration )
+				{
+            	if ( iS60WizLaunched )
+                	{
+                	iS60WizLaunched = EFalse;
+                    EditServicesL();
+                	}
+				} // iMceIntegration
+			else
+				{
+            	EditServicesL();
+                }
+            }
+        return;
+        }
+    delete sel;
+    if ( iProductIncludesSelectableEmail )
+        {
+        CEikTextListBox* list = STATIC_CAST( CEikTextListBox*,
+                Control( EMceSettingsMultipleServicesDialogChoiceList ) );
+        list->DrawDeferred();
+
+        SetAccountInUseL();
+        SetMSKButtonL();
+        }
+    else // iProductIncludesSelectableEmail
+        {
+        CMceSettingsMtmServicesDialog* dlg =
+        new( ELeave ) CMceSettingsMtmServicesDialog( iMessageType,
+                                                     iManager,
+                                                     iSession,
+                                                     *this );
+    CleanupStack::PushL( dlg );
+    dlg->ConstructL( R_MCE_SETTINGS_MTM_SERVICES_DIALOG_MENUBAR );
+    CleanupStack::Pop( dlg );
+
+    CleanupStack::PushL( TCleanupItem( ResetMtmServicesDialog, this ) );
+    iSubDialogOpen = ETrue;
+    dlg->ExecuteLD( R_MCE_SETTINGS_MTM_SERVICES_DIALOG );
+    CleanupStack::Pop(); //ResetMtmServicesDialog
+    iSubDialogOpen = EFalse;
+    
+    if ( iSubDialogForceClosed == TRUE )
+        {
+        SetAccountInUseL();    
+
+        CEikTextListBox* list=STATIC_CAST( CEikTextListBox*, 
+                                                                    Control( EMceSettingsMultipleServicesDialogChoiceList ) );
+        list->SetCurrentItemIndex( 0 );
+        list->DrawDeferred();
+        SetMSKButtonL();
+        }
+        }
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::HandleNoMailboxesL
+// ----------------------------------------------------
+TBool CMceSettingsMultipleServicesDialog::HandleNoMailboxesL()
+    {
+    //Deny creating new mail account if TARM is active.
+    if( !iEmailApi->IsEmailFeatureSupportedL( 
+        CImumInternalApi::EMailLockedSettings, R_QTN_SELEC_PROTECTED_SETTING ) )
+        {
+        CAknQueryDialog* confDialog = CAknQueryDialog::NewL();
+
+        THumanReadableName mtmName = iManager.MtmName( iMessageType );
+        
+        if ( iMessageType == KSenduiMtmSyncMLEmailUid )
+            {
+            // syncML
+            HBufC* text = StringLoader::LoadLC( 
+            R_MCE_SETTINGS_SMAIL_NEW, iEikonEnv );               
+            confDialog->SetPromptL( *text );
+            CleanupStack::PopAndDestroy( text ); // text        
+            }
+        else if ( iMessageType != KSenduiMtmSmtpUid )
+            {
+            // not email/SyncML
+            HBufC* text = StringLoader::LoadLC( 
+            R_MCE_MTM_CREATE_NEW, mtmName, iEikonEnv );               
+            confDialog->SetPromptL( *text );
+            CleanupStack::PopAndDestroy( text ); // text
+            }
+        else
+            {        
+            // if KSenduiMtmSmtpUid, the confDialog text has been set in
+            // R_MCE_SETTINGS_CREATE_NEW_MBOX_CONFIRMATION
+            }
+
+        if ( confDialog->ExecuteLD(
+                R_MCE_SETTINGS_CREATE_NEW_MBOX_CONFIRMATION ) )
+            {
+            if( iMceIntegration )
+                {
+                // In MCE wizard integration's case this return value
+                // is not used
+                return LaunchWizardL();
+                }
+            else // iMceIntegration
+                {
+                return iManager.CreateNewAccountL(
+                        iMessageType, KMsvNullIndexEntryId );
+                } // iMceIntegration
+            }
+        }
+    return EFalse;
+    }
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::CreateNewImapPopL
+// ----------------------------------------------------
+TBool CMceSettingsMultipleServicesDialog::CreateNewImapPopL()
+    {
+    TBool ret;
+    if( iMceIntegration )
+        {
+        // In MCE wizard integration's case this return value is not used
+        // just resetting this boolean to its original value
+        ret = LaunchWizardL();     
+        iS60WizLaunched = EFalse;  
+        }
+    else
+        {
+        ret = iManager.CreateNewAccountL(
+                iMessageType, KMsvNullIndexEntryId );
+        }
+    return ret;
+    }
+
+
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::LaunchWizardL
+// ----------------------------------------------------
+TBool CMceSettingsMultipleServicesDialog::LaunchWizardL()
+    {
+    TBool ret;
+    // launch S60 wizard
+    iS60WizLaunched = ETrue;
+    ret = iManager.CreateNewAccountL(
+            iMessageType, KMsvNullIndexEntryId );
+    return ret;
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::SetAccountInUseL
+// ----------------------------------------------------
+void CMceSettingsMultipleServicesDialog::SetAccountInUseL()
+    {
+    TMsvId id = MsvUiServiceUtilitiesInternal::DefaultServiceForMTML(
+        iManager.Session(),
+        iMessageType,
+        ETrue );
+
+    if( iProductIncludesSelectableEmail )
+        {
+        // Get all healthy mailbox array, especially necessary after a new
+        // account is created while there are invalid email accounts.
+        if ( !iEmailApi )
+            {
+            iEmailApi = CreateEmailApiL( iSession );
+            }
+
+        const MImumInHealthServices* healthApi =
+        &iEmailApi->HealthServicesL();
+
+        TInt error;
+        iMailboxArray.Reset();
+        if ( iMessageType == KSenduiMtmSyncMLEmailUid )
+            {
+            error = MceSettingsUtils::GetHealthyMailboxListL( *healthApi,
+                                                              iMailboxArray,
+                                                              EFalse,
+                                                              EFalse,
+                                                              ETrue,EFalse );
+            }
+        else
+            {
+            error = MceSettingsUtils::GetHealthyMailboxListL( *healthApi,
+                                                              iMailboxArray,
+                                                              ETrue,
+                                                              ETrue,
+                                                              EFalse,ETrue );
+            }
+
+        CRepository* repository = NULL;
+        TRAPD( ret, repository = CRepository::NewL(
+                                 KCRUidSelectableDefaultEmailSettings  ) );
+        CleanupStack::PushL( repository );
+        TInt val;
+        THumanReadableName mtmName;
+        TMsvEntry entryMail;
+        TBool nameGet = EFalse;
+        TBool setDefault( EFalse );
+        if ( ret == KErrNone && iMessageType != KSenduiMtmSyncMLEmailUid )
+            {
+            if ( repository->Get(
+                    KSelectableDefaultMailAccount , val ) == KErrNone )
+                {
+                id = val;
+                TMsvId serviceId;
+                TInt err = iSession->GetEntry( id, serviceId, entryMail );
+                CMtmUiDataRegistry* uiRegistry =
+                    CMtmUiDataRegistry::NewL( *iSession );
+                CleanupStack::PushL( uiRegistry );
+                TUid mailMTMTechType =
+                    uiRegistry->TechnologyTypeUid( KUidMsgTypePOP3 );
+
+                // Need check if the mailbox is healthy.
+                if ( ( healthApi->IsMailboxHealthy( entryMail.Id() ) || 
+                     ( ( entryMail.iType == KUidMsvServiceEntry) && 
+                       ( entryMail.Id() != KMsvLocalServiceIndexEntryId ) && 
+                       ( !MuiuEmailTools::IsMailMtm(
+                         entryMail.iMtm, ETrue ) ) ) )
+                         && err == KErrNone
+                         && ( entryMail.Visible() ||
+                         uiRegistry->TechnologyTypeUid( entryMail.iMtm )
+                         == mailMTMTechType ) )
+                    {
+                    mtmName.Append( entryMail.iDetails );
+                    nameGet = ETrue;
+                    }
+                else
+                    {
+                    err = iSession->GetEntry(
+                            entryMail.iRelatedId, serviceId, entryMail );
+                    if ( ( healthApi->IsMailboxHealthy( entryMail.Id() ) || 
+                         ( ( entryMail.iType == KUidMsvServiceEntry) && 
+                           ( entryMail.Id() != KMsvLocalServiceIndexEntryId )
+                             && ( !MuiuEmailTools::IsMailMtm(
+                             entryMail.iMtm, ETrue ) ) ) )
+                             && err == KErrNone 
+                             && ( entryMail.Visible() ||
+                             uiRegistry->TechnologyTypeUid( entryMail.iMtm )
+                             == mailMTMTechType ) )
+                        {
+                        mtmName.Append( entryMail.iDetails );
+                        nameGet = ETrue;
+                        }
+                    }
+                CleanupStack::PopAndDestroy( uiRegistry );
+
+                // If it cannot get the default account and there is a
+                // healthy mailbox created by user, then the mailbox should
+                // be set as default.
+                if ( !nameGet && iMailboxArray.Count() != 0 )
+                    {
+                    id = iMailboxArray[0];
+                    CMsvSession& session = iManager.Session();
+                    TMsvEntry entry;
+                    TMsvId serviceid;
+                    if ( session.GetEntry( id, serviceid, entry ) == KErrNone
+                            && ( entry.iMtm == KSenduiMtmImap4Uid
+                            || entry.iMtm == KSenduiMtmPop3Uid 
+                            || entry.iMtm == KSenduiMtmSmtpUid ) )
+                        {
+                        setDefault = ETrue;
+                        mtmName.Append( entry.iDetails );
+                        nameGet = ETrue;
+
+                        TInt idTemp = entry.Id();
+                        MsvUiServiceUtilitiesInternal::
+                        SetDefaultServiceForMTML( session, entry.iMtm, id );
+
+                        // set related service's default too...
+                        if ( session.GetEntry(
+                                entry.iRelatedId, serviceid, entry ) == KErrNone )
+                            {
+                            MsvUiServiceUtilitiesInternal::
+                            SetDefaultServiceForMTML( session, entry.iMtm, entry.Id() );
+                            }
+
+                        // Set default mailbox.
+                        repository->Set( KSelectableDefaultMailAccount ,idTemp );                    
+                        }
+                    }
+                }
+            }
+        CleanupStack::PopAndDestroy( repository );
+        iMailboxArray.Reset();
+
+        HBufC* mailboxInUseListBoxText = NULL;
+        TMsvEntry mailboxEntry;
+        TMsvId serviceId; // not used but needed by GetEntry function
+
+        if(!nameGet)
+            {
+            THumanReadableName mtmName = iManager.MtmName( iMessageType );
+            }
+
+        if ( id != KMsvUnknownServiceIndexEntryId
+             && iManager.Session().GetEntry( id, serviceId, mailboxEntry )
+             == KErrNone
+             && ( healthApi->IsMailboxHealthy( mailboxEntry.Id() ) || 
+             ( ( mailboxEntry.iType == KUidMsvServiceEntry ) && 
+             ( mailboxEntry.Id() != KMsvLocalServiceIndexEntryId ) && 
+             ( !MuiuEmailTools::IsMailMtm( mailboxEntry.iMtm, ETrue ) ) ) ) )
+            {
+            TInt mailboxNameLength;
+            if(!nameGet)
+                {
+                mailboxNameLength = mailboxEntry.iDetails.Left(
+                        KMceSettingsMailboxTextLength ).Length();
+                }
+            else
+                {
+                mailboxNameLength =	entryMail.iDetails.Left(
+                        KMceSettingsMailboxTextLength ).Length();
+                }
+
+            HBufC* mailboxInUseDefaultText = NULL;
+
+            if ( iMessageType == KSenduiMtmSmtpUid )
+                {
+                //remote mailboxes
+                mailboxInUseDefaultText = StringLoader::LoadLC(
+                                          R_MCE_SETTINGS_MAIL_DEFAULT, iEikonEnv );
+                }
+            else if ( iMessageType == KSenduiMtmSyncMLEmailUid )
+                {
+                //syncML remote mailboxes
+                mailboxInUseDefaultText = StringLoader::LoadLC(
+                                          R_MCE_SETTINGS_SYNCMAIL_INUSE, iEikonEnv );
+                }
+            else
+                {
+                mailboxInUseDefaultText = StringLoader::LoadLC(
+                                          R_MCE_MTM_IN_USE, mtmName, iEikonEnv );
+                }
+
+            mailboxInUseListBoxText = HBufC::NewLC(
+                mailboxInUseDefaultText->Length() + mailboxNameLength );
+
+            mailboxInUseListBoxText->Des().Copy( *mailboxInUseDefaultText );
+            if ( !nameGet )
+                {
+                mailboxInUseListBoxText->Des().Append(
+                        mailboxEntry.iDetails.Left( mailboxNameLength ) );
+                }
+            else
+                {
+                if ( setDefault )
+                    {
+                    mailboxInUseListBoxText->Des().Append(
+                            mtmName.Left( mailboxNameLength ) );
+                    }
+                else
+                    {
+                    mailboxInUseListBoxText->Des().Append(
+                            entryMail.iDetails.Left( mailboxNameLength ) );
+                    }
+                }
+
+            CleanupStack::Pop( mailboxInUseListBoxText );
+            CleanupStack::PopAndDestroy( mailboxInUseDefaultText );
+            }
+        else
+            {
+            if ( iMessageType == KSenduiMtmSmtpUid )
+                {
+                //remote mailboxes
+                mailboxInUseListBoxText = StringLoader::LoadL(
+                                          R_MCE_SETTINGS_MAIL_DEFAULT_IN_USE_NONE, iEikonEnv );
+                }
+            else if ( iMessageType == KSenduiMtmSyncMLEmailUid )
+                {
+                //syncML remote mailboxes
+                mailboxInUseListBoxText = StringLoader::LoadL(
+                                          R_MCE_SETTINGS_SYNCMAIL_INUSE_NONE, iEikonEnv );
+                }
+            else
+                {
+                mailboxInUseListBoxText = StringLoader::LoadL( 
+                                          R_MCE_MTM_IN_USE_NONE, mtmName, iEikonEnv );  
+                }        
+            }
+
+        if ( iSettingsItemArray->Count() > 1 )
+            {
+            // delete dummy item because we are adding 'real' item below
+            iSettingsItemArray->Delete(
+                    KMceSettingsRemoteMailboxInUseSelectableEmailInUse );
+            }
+
+        CleanupStack::PushL( mailboxInUseListBoxText );
+        iSettingsItemArray->InsertL( 0, *mailboxInUseListBoxText );
+        CleanupStack::PopAndDestroy( mailboxInUseListBoxText );
+
+        }
+    else // iProductIncludesSelectableEmail
+        {
+        HBufC* mailboxInUseListBoxText = NULL;
+    TMsvEntry mailboxEntry;
+    TMsvId serviceId; // not used but needed by GetEntry function
+    
+    THumanReadableName mtmName = iManager.MtmName( iMessageType );
+
+    if ( id != KMsvUnknownServiceIndexEntryId &&
+         iManager.Session().GetEntry( id, serviceId, mailboxEntry ) == KErrNone )
+        {
+        const TInt mailboxNameLength =
+            mailboxEntry.iDetails.Left( KMceSettingsMailboxTextLength ).Length();
+
+        HBufC* mailboxInUseDefaultText = NULL;
+        
+        if ( iMessageType == KSenduiMtmSmtpUid )
+            {
+            //remote mailboxes
+            mailboxInUseDefaultText = StringLoader::LoadLC(
+                R_MCE_SETTINGS_MAIL_RM_IN_USE, iEikonEnv );            
+            }
+        else if ( iMessageType == KSenduiMtmSyncMLEmailUid )
+            {
+            //syncML remote mailboxes
+            mailboxInUseDefaultText = StringLoader::LoadLC(
+                R_MCE_SETTINGS_SYNCMAIL_INUSE, iEikonEnv );            
+            }
+        else
+            {
+            mailboxInUseDefaultText = StringLoader::LoadLC( 
+                R_MCE_MTM_IN_USE, mtmName, iEikonEnv );            
+            }
+
+        mailboxInUseListBoxText = HBufC::NewLC(
+            mailboxInUseDefaultText->Length() + mailboxNameLength );
+
+        mailboxInUseListBoxText->Des().Copy( *mailboxInUseDefaultText );
+        mailboxInUseListBoxText->Des().Append(
+            mailboxEntry.iDetails.Left( mailboxNameLength ) );
+
+        CleanupStack::Pop( mailboxInUseListBoxText );
+        CleanupStack::PopAndDestroy( mailboxInUseDefaultText );
+        }
+    else
+        {
+        if ( iMessageType == KSenduiMtmSmtpUid )
+            {
+            //remote mailboxes
+            mailboxInUseListBoxText = StringLoader::LoadL( 
+                                                            R_MCE_SETTINGS_MAIL_RM_IN_USE_NONE, 
+                                                            iEikonEnv );
+            }
+        else if ( iMessageType == KSenduiMtmSyncMLEmailUid )
+            {
+            //syncML remote mailboxes
+            mailboxInUseListBoxText = StringLoader::LoadL( 
+                                                            R_MCE_SETTINGS_SYNCMAIL_INUSE_NONE, 
+                                                            iEikonEnv );
+            }
+        else
+            {
+            mailboxInUseListBoxText = StringLoader::LoadL( 
+                R_MCE_MTM_IN_USE_NONE, mtmName, iEikonEnv );  
+            }        
+        }
+
+    if ( iSettingsItemArray->Count() > 1 )
+        {
+        // delete dummy item because we are adding 'real' item below
+        iSettingsItemArray->Delete( KMceSettingsRemoteMailboxInUse );
+        }
+
+    CleanupStack::PushL( mailboxInUseListBoxText );
+    iSettingsItemArray->AppendL( *mailboxInUseListBoxText );
+    CleanupStack::PopAndDestroy( mailboxInUseListBoxText );
+        }
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::HandleSessionEventL
+// ----------------------------------------------------
+void CMceSettingsMultipleServicesDialog::HandleSessionEventL(
+    TMsvSessionEvent aEvent, TAny* aArg1, TAny* aArg2, TAny* /*aArg3*/)
+    {
+    switch ( aEvent )
+        {
+        case EMsvEntriesCreated:
+            if ( KMsvRootIndexEntryId == (*(TMsvId*) (aArg2)) )
+                {                
+                HandleEntriesCreatedL( (CMsvEntrySelection*) aArg1 );               
+				if( iProductIncludesSelectableEmail )
+					{
+                	UpdateServicesArrayL();
+					}
+                }
+            break;
+        case EMsvEntriesChanged:
+        case EMsvEntriesDeleted:
+        case EMsvMediaAvailable:
+            UpdateMailboxDataL();           
+        default:
+            // just ignore
+            break;
+        }
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::HandleEntriesCreatedL
+// ----------------------------------------------------
+void CMceSettingsMultipleServicesDialog::HandleEntriesCreatedL( CMsvEntrySelection* aSelection )
+    {     
+    UpdateMailboxDataL();   
+    if ( aSelection->Count() )
+        {
+        TMsvEntry currentEntry;
+        TMsvId serviceId; // not used here but needed by GetEntry function
+        if ( iManager.Session().GetEntry( aSelection->At( 0 ), serviceId, currentEntry ) == KErrNone
+                && currentEntry.iType == KUidMsvServiceEntry 
+                && currentEntry.iMtm == iMessageType )
+            {
+            SetAccountInUseL();
+            }
+	CEikTextListBox* list = STATIC_CAST( CEikTextListBox*, 
+	                                 Control( EMceSettingsMultipleServicesDialogChoiceList ) );
+	list->DrawDeferred();
+        }
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::HandleListBoxEventL
+// ----------------------------------------------------
+void CMceSettingsMultipleServicesDialog::HandleListBoxEventL(
+    CEikListBox* /*aListBox*/,
+    TListBoxEvent aEventType )
+    {
+    CEikTextListBox* list = STATIC_CAST( CEikTextListBox*, 
+                                        Control( EMceSettingsMultipleServicesDialogChoiceList ) );
+    switch( aEventType )
+        {
+        case EEventEnterKeyPressed:
+        case EEventItemSingleClicked:
+			if ( iProductIncludesSelectableEmail )
+				{
+	            if ( list->CurrentItemIndex() == 0 )
+    	            {
+                	ProcessCommandL( EMceSettingsCmdSettingsDialogChange );                
+                	}
+            	else
+                	{
+					ProcessCommandL( EMceSettingsCmdSettingsDialogOpen );
+                	}
+                }
+            else // iProductIncludesSelectableEmail
+            	{
+	            if ( list->CurrentItemIndex() == 0 )
+					{
+                	ProcessCommandL( EMceSettingsCmdSettingsDialogOpen );
+                	}
+            	else
+                	{
+                	ProcessCommandL( EMceSettingsCmdSettingsDialogChange );
+                	}
+                }
+        break;
+        case EEventItemDraggingActioned:
+            SetMSKButtonL();
+        break;
+        default:
+        break;
+        }
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::GetHelpContext
+// returns helpcontext as aContext
+//
+// ----------------------------------------------------
+void CMceSettingsMultipleServicesDialog::GetHelpContext
+        ( TCoeHelpContext& aContext ) const
+    {
+    aContext.iMajor = KMceApplicationUid;
+	if ( iProductIncludesSelectableEmail )
+	    {
+	    CEikTextListBox* list = STATIC_CAST(
+	            CEikTextListBox*,
+	            Control( EMceSettingsMultipleServicesDialogChoiceList ) );       
+
+	    if ( list->CurrentItemIndex() ==
+	    KMceSettingsRemoteMailboxInUseSelectableEmailInUse )
+	        {
+	        aContext.iContext = KES_HLP_EMAIL_SETTING;
+	        }
+	    else
+	        {
+	        // start        	
+	        TUid mtmType;
+	        TInt item = list->CurrentItemIndex();      	        		
+	        CMsvEntry* entry = NULL;
+
+	        TRAPD( error, entry = iSession->GetEntryL(
+	                (*iAccountArray)[item-1].iUid.iUid )); 
+
+	        if ( entry )
+	            {
+	            TMsvEntry tentry = entry->Entry();
+	            mtmType = tentry.iMtm;
+	            delete entry;            		
+
+	            if ( ( mtmType != KSenduiMtmImap4Uid ) &&
+	                    ( mtmType != KSenduiMtmPop3Uid ) )
+	                {
+	                aContext.iContext = KES_HLP_THIRDPARTY_MAILBOX;
+	                }
+	            else
+	                {
+	                aContext.iContext = KES_HLP_SMTP_MAILBOX;
+	                }						              		
+	            }
+	        }
+	    }
+	else // iProductIncludesSelectableEmail
+	    { 
+    if ( iMessageType == KSenduiMtmSyncMLEmailUid )
+        {
+        aContext.iContext = KMCE_HLP_SETT_SMAILBOX/*KMCE_HLP_SETTINGS_SMAIL*/;
+        }
+    else
+        {
+        aContext.iContext = KMCE_HLP_SETTINGS_EMAIL;
+        } 
+    }
+	}
+
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::LaunchHelpL
+// Launch help using context
+// 
+// ----------------------------------------------------
+void CMceSettingsMultipleServicesDialog::LaunchHelpL() const
+    { 
+    CCoeAppUi* appUi = STATIC_CAST( CCoeAppUi*, ControlEnv()->AppUi() );       
+    CArrayFix<TCoeHelpContext>* helpContext = appUi->AppHelpContextL();   
+    HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), helpContext );
+    }
+
+
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::ResetMtmServicesDialog
+// Sets the flag to indicate that the MTM services subdialog
+// is not open
+// ----------------------------------------------------
+void CMceSettingsMultipleServicesDialog::ResetMtmServicesDialog( TAny* aAny )
+    {
+    CMceSettingsMultipleServicesDialog* serviceDialog = ( CMceSettingsMultipleServicesDialog*)aAny;
+    serviceDialog->iSubDialogOpen = EFalse;
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::OfferKeyEventL
+// Handles this setting dialog view's arrow keys.
+// Forwards other keys.
+//
+// ----------------------------------------------------
+TKeyResponse CMceSettingsMultipleServicesDialog::OfferKeyEventL(
+                                                const TKeyEvent& aKeyEvent,
+                                                TEventCode aType )
+    {
+    if ( aType == EEventKey &&
+         ( aKeyEvent.iCode==EKeyUpArrow || aKeyEvent.iCode==EKeyDownArrow ) )
+        {
+        CEikTextListBox* list=STATIC_CAST(
+                        CEikTextListBox*,
+                        Control( EMceSettingsMultipleServicesDialogChoiceList ) );
+        list->OfferKeyEventL( aKeyEvent, aType );        
+        SetMSKButtonL();
+        return EKeyWasConsumed;
+        }    
+    return CAknDialog::OfferKeyEventL( aKeyEvent, aType );
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::SetMSKButtonL
+// Sets the MSK for the view
+//
+// ----------------------------------------------------
+void CMceSettingsMultipleServicesDialog::SetMSKButtonL()
+    {
+    CEikTextListBox* list=STATIC_CAST(
+                    CEikTextListBox*,
+                    Control( EMceSettingsMultipleServicesDialogChoiceList ) );
+    const TInt index = list->CurrentItemIndex();
+    const TInt numberOfItem = list->Model()->NumberOfItems();
+    TInt resourceId;
+	if ( iProductIncludesSelectableEmail )
+		{
+		 resourceId =
+	              index==0 ? R_MCE_MSK_BUTTON_CHANGE : R_MCE_MSK_BUTTON_OPEN;
+		}
+	else
+		{
+		resourceId =
+                  index==0 ? R_MCE_MSK_BUTTON_OPEN : R_MCE_MSK_BUTTON_CHANGE;
+		}
+    CEikButtonGroupContainer& cba = ButtonGroupContainer();
+    cba.SetCommandL( KMSKPosition, resourceId );
+    cba.DrawNow();
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::SubdialogClosed
+// Informs that subdialog has been closed
+//
+// ----------------------------------------------------
+void CMceSettingsMultipleServicesDialog::SubdialogClosed()
+    {
+    iSubDialogOpen = EFalse;
+    iSubDialogForceClosed = EFalse;
+    }
+
+// ----------------------------------------------------
+CMsvEntrySelection* CMceSettingsMultipleServicesDialog::GetEmailAccountsL(
+		CMsvSession& aSession )
+    {
+    CMsvEntrySelection* sel = new( ELeave ) CMsvEntrySelection();
+    CleanupStack::PushL( sel );
+    CMsvEntry* entry = aSession.GetEntryL( KMsvRootIndexEntryIdValue );
+    CleanupStack::PushL( entry );
+    if ( iMceIntegration )
+    	{
+    TInt cnt = entry->Count();
+    if ( cnt != 0 )
+        {
+        entry->SetSortTypeL( TMsvSelectionOrdering(
+        		                KMsvGroupByType | KMsvGroupByStandardFolders,
+        		                EMsvSortByDetailsReverse, ETrue ) );
+        const TMsvEntry* tentry;
+        for ( TInt cc = entry->Count(); --cc >= 0; )
+           {
+            tentry = &(*entry)[cc];
+                
+            if ( tentry->iType.iUid == KUidMsvServiceEntryValue &&
+            	 tentry->Id() != KMsvLocalServiceIndexEntryIdValue )
+                {
+                const TBool noRelatedId =
+                                tentry->iRelatedId == KMsvNullIndexEntryId ||
+                                tentry->iRelatedId == tentry->Id();
+                
+                TBool appendEmail = EFalse;
+                
+                if ( tentry->Visible() )
+                    {
+                    appendEmail = ETrue;
+                    }
+                else
+                    {
+                    CMtmUiDataRegistry* uiRegistry =
+                                       CMtmUiDataRegistry::NewL( *iSession );
+                    CleanupStack::PushL(uiRegistry);             
+                    if ( uiRegistry->IsPresent( tentry->iMtm ) &&
+                    	 uiRegistry->IsPresent( KUidMsgTypePOP3 ) )
+                        {            
+                        if( uiRegistry->TechnologyTypeUid( tentry->iMtm ) ==
+                                                        KSenduiTechnologyMailUid  )
+                            {
+                            appendEmail = ETrue;                    
+                            }
+                        }
+                    CleanupStack::PopAndDestroy( uiRegistry );
+                    }                    
+                
+                if ( appendEmail )
+                    {
+                    // Add this service if:
+                    // it is visible, or,there is no associated related
+                    // service, or, we have been asked to list all services.
+                    sel->AppendL( tentry->Id() );
+    					}
+                    }
+                }
+            }
+        }
+    CleanupStack::PopAndDestroy( entry );
+    CleanupStack::Pop( sel );
+    return sel;
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::MtmAccountsL
+// ----------------------------------------------------
+CUidNameArray* CMceSettingsMultipleServicesDialog::MtmEmailAccountsL()
+    {
+    CUidNameArray* accounts = new (ELeave) CUidNameArray(
+                              KMceSettingsArrayGranularity );
+    CleanupStack::PushL( accounts );
+
+    CMsvEntrySelection* sel = NULL;
+
+	sel = GetEmailAccountsL( *iSession );
+
+    CleanupStack::PushL( sel );
+
+    CMsvEntry* rootEntry=CMsvEntry::NewL(
+        *iSession,
+        KMsvRootIndexEntryId,
+        TMsvSelectionOrdering( KMsvNoGrouping, EMsvSortByNone, ETrue ) );
+	CleanupStack::PushL( rootEntry );
+
+	if ( !iEmailApi )
+        {
+        iEmailApi = CreateEmailApiL( iSession );
+        }
+
+   	const MImumInHealthServices* healthApi = &iEmailApi->HealthServicesL();
+
+   	TInt error = MceSettingsUtils::GetHealthyMailboxListL(
+   			                      *healthApi,
+        	                      iMailboxArray,
+								  iMessageType != KSenduiMtmSyncMLEmailUid,
+        						  iMessageType != KSenduiMtmSyncMLEmailUid,
+        				          iMessageType == KSenduiMtmSyncMLEmailUid,ETrue );
+    if ( error == KErrNone &&
+            ( iMtmPluginId == 0 || iMessageType == KSenduiMtmSyncMLEmailUid ) )
+        {
+        const TInt mailboxArrayCount = iMailboxArray.Count();
+        TBool foundServiceArray = EFalse;
+        TMsvId msvId;
+
+        for ( TInt cc = 0; cc < mailboxArrayCount; cc++)
+            {
+            msvId = iMailboxArray[cc];
+
+            TMsvEntry tentry2;
+            TRAPD( err2, ( tentry2 = rootEntry->ChildDataL( msvId ) ) );
+
+            const TInt count = accounts->Count();
+            TBool foundService = EFalse;
+            
+            if ( err2 == KErrNone )
+                {
+                
+                //check that related service is not already added to array
+                for ( TInt loop = 0; loop < count; loop ++ )
+                    {
+                    if ( tentry2.iRelatedId == iMailboxArray[loop] )
+                        {
+                        foundService = ETrue;
+                        break;
+                        }
+                    }
+                if ( !foundService )
+                    {               
+                    TUid uid;
+                    uid.iUid = tentry2.Id();
+                    TUidNameInfo info( uid, tentry2.iDetails.Left(
+                    		               KMceSettingsMailboxTextLength ) );
+                    accounts->AppendL( info );
+                    }    
+            
+                }
+            }
+        }
+    TUid uid;
+	CMtmUiDataRegistry* uiRegistry = CMtmUiDataRegistry::NewL( *iSession );
+    CleanupStack::PushL( uiRegistry );
+    const TInt numAccounts = sel->Count();
+    for ( TInt cc = 0; cc < numAccounts; cc++)
+        {
+        uid.iUid = sel->At( cc );
+        TMsvEntry tentry;
+        TRAPD( err, ( tentry = rootEntry->ChildDataL( uid.iUid ) ) );
+        
+        TBool appendEmail = EFalse;
+        
+        // This avoids FS boxes to show in SyncML list
+        if ( iMessageType != KSenduiMtmSyncMLEmailUid )
+            {
+            if ( tentry.Visible() )
+                {
+                appendEmail = ETrue;
+                }
+            else
+                {                
+                if ( uiRegistry->IsPresent( tentry.iMtm ) &&
+                     uiRegistry->IsPresent( KUidMsgTypePOP3 ) )
+                    {            
+                    TUid mailMTMTechType =
+                        uiRegistry->TechnologyTypeUid( KUidMsgTypePOP3 );                                          
+                    if( uiRegistry->TechnologyTypeUid( tentry.iMtm ) ==
+                        mailMTMTechType )
+                        {
+                        appendEmail = ETrue;                    
+                        }
+                    }
+                }            
+
+            // Remove 3'rd party mailboxes which are not registered to handle
+            // S60 mailboxes 
+            if ( iMtmPluginId != 0 &&
+                    tentry.iMtm.iUid != iMtmPluginId )
+                {
+                appendEmail = EFalse;
+                }
+            } // != KSenduiMtmSyncMLEmailUid
+
+        if ( err == KErrNone &&
+                uiRegistry->IsPresent( tentry.iMtm ) && appendEmail )
+            {
+            const TInt count = accounts->Count();
+            TBool foundService = EFalse;
+            //check that related service is not already added to array
+            for ( TInt loop = 0; loop < count; loop ++ )
+                {
+                if ( tentry.iRelatedId == (*accounts)[loop].iUid.iUid )
+                    {
+                    foundService = ETrue;
+                    break;
+                    }
+                }
+            if ( !foundService )
+                {
+                TUidNameInfo info( uid, tentry.iDetails.Left(
+                        KMceSettingsMailboxTextLength ) );
+                accounts->AppendL( info );
+                }
+            }
+        }
+    CleanupStack::PopAndDestroy( uiRegistry );
+    CleanupStack::PopAndDestroy( rootEntry );
+    CleanupStack::PopAndDestroy( sel );
+    CleanupStack::Pop( accounts );
+    return accounts;
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMultipleServicesDialog::UpdateForArrayChangeL
+// ----------------------------------------------------
+void CMceSettingsMultipleServicesDialog::UpdateServicesArrayL()
+    {        
+    CEikTextListBox* list = STATIC_CAST( CEikTextListBox*, 
+        Control( EMceSettingsMultipleServicesDialogChoiceList ) );
+
+    TInt selectedIndex = list->CurrentItemIndex();
+    const TInt count = iAccountArray->Count();
+    CUidNameArray* sel = MtmEmailAccountsL();
+    CleanupStack::PushL( sel );
+    const TInt newCount = sel->Count();
+    iAccountArray->Reset();
+	iSettingsItemArray->Reset();
+	SetAccountInUseL();
+	TBuf <KMceSettingsMtmNameBufLength> mtms;
+    
+	for ( TInt loop = 0; loop < newCount; loop++ )
+        {
+        iAccountArray->AppendL( sel->At( loop ) );
+
+
+		mtms.Copy( KMceMtmName1 );
+		mtms.Append( (*sel)[loop].iName );
+		mtms.Append( KMceMtmName2 );
+		iSettingsItemArray->AppendL( mtms );
+		mtms.Zero();
+        }
+    CleanupStack::PopAndDestroy( sel );
+
+    if ( newCount > count )
+        {
+        list->HandleItemAdditionL();
+        }
+    else if ( newCount < count )
+        {
+        list->HandleItemRemovalL();
+        }
+    else
+        {
+        // no action
+        }
+
+    if ( newCount > 0 )
+        {
+        if ( selectedIndex >= 0 && selectedIndex < newCount )
+            {
+            list->SetCurrentItemIndex( selectedIndex );
+            }
+        else
+            {
+            list->SetCurrentItemIndex( 0/*newCount - 1*/ );
+            }
+        }
+    list->DrawNow();
+    }
+
+//  End of File