email/imum/Utils/Src/IMSSettingsWizard.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imum/Utils/Src/IMSSettingsWizard.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,1703 @@
+/*
+* 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:  IMSSettingsWizard.cpp
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <badesca.h>                // CDesCArrayFlat
+#include <avkon.hrh>                // Softkey enumerations
+#include <cemailaccounts.h>         // CEmailAccounts
+#include <smtpset.h>                // CImSmtpSettings
+#include <imapset.h>                // CImImap4Settings
+#include <pop3set.h>                // CImPop3Settings
+#include <iapprefs.h>               // CImIAPPreferences
+#include <StringLoader.h>           // StringLoader
+#include <aknmessagequerydialog.h>  // CAknMessageQueryDialog
+#include <MuiuMsvUiServiceUtilities.h> // MsvUiServiceUtilities
+#include <eikrted.h>                // CEikRichTextEditor
+#include <txtrich.h>                // CRichText
+#include <AknInfoPopupNoteController.h>
+#include <mtudcbas.h>				// CBaseMtmUiData
+#include <mtmuibas.h>		        // CBaseMtmUi
+#include <mtsr.h>                   // CMtmRegistryControl
+
+#include <MtmExtendedCapabilities.hrh>
+#include <MTMStore.h>				// CMtmStore
+#include "MuiuDynamicSettingsItemFinderInterface.h"
+#include "MuiuDynamicSettingsDialog.h"
+#include <SendUiConsts.h>
+
+#include <ImumUtils.rsg>
+
+#include "ImumInSettingsData.h"
+#include "ImumInternalApiImpl.h"
+#include "ImumInMailboxServicesImpl.h"
+#include "IMSSettingsNoteUi.h"
+#include "IMSSettingsWizard.h"
+#include "IMSWTextEditorPage.h"
+#include "IMSWRadiobuttonPage.h"
+#include "IMSSettingsItemApprover.h"
+#include "IMASPageIds.hrh"
+#include "EmailUtils.H"
+#include "EmailFeatureUtils.h"
+#include "ComDbUtl.h"               // CMsvCommDbUtilities
+#include "ImumUtilsLogging.h"
+#include "ImumPanic.h"
+#include "IMSWizardControl.h"
+
+// EXTERNAL DATA STRUCTURES
+// EXTERNAL FUNCTION PROTOTYPES
+// CONSTANTS
+const TText KIMASCharDot = '.';
+const TText KIMASCharAt = '@';
+const TInt KMaxPages = 6;
+const TInt KMsToWaitBeforePopup = 2000;
+const TInt KMsToWaitBeforeRePopup = 6000;
+
+// MACROS
+// LOCAL CONSTANTS AND MACROS
+// MODULE DATA STRUCTURES
+// LOCAL FUNCTION PROTOTYPES
+// FORWARD DECLARATIONS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::CIMSSettingsWizard()
+// ----------------------------------------------------------------------------
+//
+CIMSSettingsWizard::CIMSSettingsWizard(
+    CIMSSettingsUi& aDialog,
+    CImumInternalApiImpl& aMailboxApi,
+    CEikFormattedCellListBox& aListBox,
+    CIMSWizardControl& aHelpContainer,
+    CAknTitlePane& aTitlePane,
+    CMuiuFlags& aFlags )
+    :
+    CIMSSettingsBaseUI( aDialog, aMailboxApi, aListBox,
+    					aTitlePane, aFlags ),
+    iCurrentItem( KNullUid ),
+    iWizState( EWizStateQuerying ),
+    iPageEdit( NULL ),
+    iPageRadioBtn( NULL ),
+    iCurPage( 0 ),
+    iPageText( NULL ),
+    iHelpContainer( aHelpContainer )
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::~CIMSSettingsWizard()
+// ----------------------------------------------------------------------------
+//
+CIMSSettingsWizard::~CIMSSettingsWizard()
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::~CIMSSettingsWizard, 0, KLogUi );
+    IMUM_IN();
+
+    iProtocolArray.Close();
+    delete iPageText;
+    delete iMtmStore;
+
+    iPageEdit = NULL;
+    iPageRadioBtn = NULL;
+
+    if ( iWizardLauncher )
+        {
+        iWizardLauncher->Cancel();
+        }
+
+    delete iWizardLauncher;
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::ConstructL()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::ConstructL( CEikButtonGroupContainer& aSoftkeys,
+    const TDesC& aEmailAddress )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::ConstructL, 0, KLogUi );
+    IMUM_IN();
+
+    BaseUiConstructL( aSoftkeys, R_IMAS_WIZARD );
+
+	iMtmStore = CMtmStore::NewL(iMailboxApi.MsvSession());
+
+    // Clear the flags
+    for ( TUint flag = EWizFlagLastFlag; --flag >= EWizFlagFirstFlag; )
+        {
+        ClearFlag( flag );
+        }
+
+    SettingsStartedL( aEmailAddress );
+    
+    // Hide the unnecessary scrollbar from the first page of the wizard
+    CEikScrollBarFrame* scrollbar = iListBox.ScrollBarFrame();
+    if ( scrollbar )
+    	{
+    	scrollbar->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EOff );    	
+    	}
+    
+	IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::NewL()
+// ----------------------------------------------------------------------------
+//
+CIMSSettingsWizard* CIMSSettingsWizard::NewL(
+    CIMSSettingsUi& aDialog,
+    CImumInternalApiImpl& aMailboxApi,
+    CEikFormattedCellListBox& aListBox,
+    CIMSWizardControl& aHelpContainer,
+    CAknTitlePane& aTitlePane,
+    CEikButtonGroupContainer& aSoftkeys,
+    CMuiuFlags& aFlags,
+    const TDesC& aEmailAddress )
+    {
+    CIMSSettingsWizard* self = NewLC(
+        aDialog, aMailboxApi,
+        aListBox, aHelpContainer, aTitlePane, aSoftkeys, aFlags, aEmailAddress );
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::NewLC()
+// ----------------------------------------------------------------------------
+//
+CIMSSettingsWizard* CIMSSettingsWizard::NewLC(
+    CIMSSettingsUi& aDialog,
+    CImumInternalApiImpl& aMailboxApi,
+    CEikFormattedCellListBox& aListBox,
+    CIMSWizardControl& aHelpContainer,
+    CAknTitlePane& aTitlePane,
+    CEikButtonGroupContainer& aSoftkeys,
+    CMuiuFlags& aFlags,
+    const TDesC& aEmailAddress )
+    {
+    IMUM_STATIC_CONTEXT( CIMSSettingsWizard::NewLC, 0, utils, KLogUi );
+    IMUM_IN();
+
+    CIMSSettingsWizard* self =
+        new ( ELeave ) CIMSSettingsWizard(
+            aDialog, aMailboxApi,
+            aListBox, aHelpContainer, aTitlePane, aFlags );
+    CleanupStack::PushL( self );
+    self->ConstructL( aSoftkeys, aEmailAddress );
+
+	IMUM_OUT();
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::DefinePageNumberStringL()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::DefinePageNumberStringL()
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::DefinePageNumberStringL, 0, KLogUi );
+    IMUM_IN();
+
+    CArrayFix<TInt>* array = new ( ELeave ) CArrayFixFlat<TInt>( 1 );
+    CleanupStack::PushL( array );
+
+    // If current page is zero, increase it to 1
+    if ( iCurPage == 0 )
+    	{
+    	iCurPage++;
+    	}
+
+    array->AppendL( iCurPage );
+    array->AppendL( KMaxPages );
+
+    delete iPageText;
+    iPageText = NULL;
+
+    // Load page number to descriptor
+	iPageText = StringLoader::LoadL(
+	R_MBXS_SETTINGS_MAIL_NEWBOX_PAGES, *array );
+
+
+    CleanupStack::PopAndDestroy( array );
+    array = NULL;
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::SettingsStartedL()
+// ----------------------------------------------------------------------------
+//
+TBool CIMSSettingsWizard::SettingsStartedL( const TDesC& aEmailAddress )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::SettingsStartedL, 0, KLogUi );
+	IMUM_IN();
+
+    // Set the titlepane text
+    HBufC* text = StringLoader::LoadL( R_MBXS_SETTINGS_NEW_BOX );
+    CleanupStack::PushL( text );
+    SetTitlePaneTextL( *text );
+    CleanupStack::PopAndDestroy( text );
+
+    HidePermanently( ToUid( EIMAWRadioButtonIapAlwaysAsk ), ETrue );
+
+    CMuiuSettingsEditText* email = static_cast<CMuiuSettingsEditText*>(
+        GetItem( TUid::Uid( EIMAWEmailAddress ) ) );
+    TMuiuSettingsText emailText;
+
+    if ( aEmailAddress.Length() )
+        {
+        emailText = aEmailAddress;
+        email->SetText( &emailText );
+        SettingsItemDefineServers( *email->Text() );
+        SettingsItemDefineMailboxName( *email->Text() );
+        SetFlag( EWizFlagSkipEmail );
+
+        SetFlag( EWizFlagPluginDetected );
+        iWizardLauncher = CIMSWizardLauncher::NewL( *this, iDialog );
+
+        //Next prevents the original info screen and buttons from flashing
+        //on the screen
+        iSoftkeys->SetVisibility( EFalse, this );
+
+        if ( iHelpContainer.CountComponentControls() )
+            {
+            iHelpContainer.ComponentControl( 0 )->MakeVisible( EFalse );
+            }
+        }
+    else
+        {
+        // Hide the listbox and the helpscreen
+        // The buttons should be hidden here too for the dialog
+        SetHideItems( ETrue, R_IMAS_WIZARD, ETrue );
+        iDialog.MakeLineVisible( EIMSWizardRichTxtEditorContainer, ETrue);
+
+        //TMuiuSettingsText at;
+        emailText.Append( KIMASCharAt );
+        email->SetText( &emailText );
+        }
+
+
+	IMUM_OUT();
+    return EFalse;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::OkToExitL()
+// ----------------------------------------------------------------------------
+//
+TInt CIMSSettingsWizard::OkToExitL( const TInt /* aButtonId */ )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::OkToExitL, 0, KLogUi );
+    IMUM_IN();
+
+    // If wizard is running (setting page is on display), let setting page
+    // and wizard loop to exit before exiting. Save exit flags to reinstate
+    // them when wizard loop exists.
+    if ( Flag( EWizFlagStateRunning ) )
+        {
+        ChangeFlag( EWizFlagShouldExit, Flag( EImumSettingShouldExit ) );
+        ChangeFlag( EWizFlagShouldClose, Flag( EImumSettingShouldClose ) );
+        IMUM_OUT();
+        return EFalse;
+        }
+
+    // Show query for exit
+    TInt result = 1;
+
+    // Check if user has to be asked about the exit
+    if ( Flag( EImumSettingQueryClose ) && !Flag( EWizFlagForcedCancel ))
+        {
+        if ( !Flag( EWizFlagCompleted ) )
+            {
+            result = CIMSSettingsNoteUi::ShowQueryL(
+	                R_MBXS_SETTINGS_NEW_BOX_EXIT_QUERY,
+	                R_EMAIL_CONFIRMATION_QUERY );
+            if ( !result && Flag( EWizFlagPluginDetected ) )
+                {
+                iWizardLauncher->StartLauncher();
+                ClearFlag( EWizFlagShouldExit );
+                ClearFlag( EWizFlagShouldClose );
+                }
+            }
+        }
+
+	IMUM_OUT();
+    return result;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::KeyPressSoftkey()
+// ----------------------------------------------------------------------------
+//
+TBool CIMSSettingsWizard::KeyPressSoftkey(
+    const TInt aButton )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::KeyPressSoftkey, 0, KLogUi );
+    IMUM_IN();
+
+    TInt error = KErrNone;
+
+    // Check which of the keys has been pressed
+    if ( aButton == EAknSoftkeyBack )
+        {
+        if ( iWizState == EWizStateQuerying )
+            {
+            SetFlag( EImumSettingShouldClose );
+            }
+        else
+            {
+            TRAP( error, KeyPressBackL() );
+            }
+        }
+    else
+        {
+        if ( iWizState == EWizStateQuerying )
+            {
+			WizRunStart();
+            TRAP( error,
+            		while( Flag( EWizFlagStateRunning ) )
+            				 {
+            				 WizRunStepL();
+            				 } );
+            }
+        else
+            {
+            TRAP( error, KeyPressNextL() );
+            }
+        }
+
+    __ASSERT_DEBUG( error == KErrNone,
+        User::Panic( KIMSWizardPanic, error ) );
+
+    IMUM_OUT();
+    return ETrue;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::KeyPressOKButtonL()
+// ----------------------------------------------------------------------------
+//
+TBool CIMSSettingsWizard::KeyPressOKButtonL( const TInt /* aButton */ )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::KeyPressOKButtonL, 0, KLogUi );
+    IMUM_IN();
+
+    // In help screen, ok button opens the first page
+    if ( iWizState == EWizStateQuerying )
+        {
+        KeyPressSoftkey( EAknSoftkeyShow );
+        }
+    // Text page editing ongoing, call correct page
+    else if ( iSettingPage && Flag( EWizFlagTextEditPage ) )
+        {
+        iPageEdit->KeyPressedSelectL();
+        }
+    // Radio button page editing ongoing, call correct page
+    else if ( iSettingPage && Flag( EWizFlagRadioButtonPage ) )
+        {
+        iPageRadioBtn->KeyPressedSelectL();
+        }
+    else
+        {
+        // Nothing
+        }
+
+	IMUM_OUT();
+    return ETrue;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::KeyPressNextL()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::KeyPressNextL()
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::KeyPressNextL, 0, KLogUi );
+    IMUM_IN();
+
+    SetFlag( EWizFlagNextKeyPressed );
+
+    // Text page editing ongoing, call correct page
+    if ( iSettingPage && Flag( EWizFlagTextEditPage ) )
+        {
+        iPageEdit->KeyPressedNextL();
+        }
+    // Radio button page editing ongoing, call correct page
+    else if ( iSettingPage && Flag( EWizFlagRadioButtonPage ) )
+        {
+        iPageRadioBtn->KeyPressedNextL();
+        }
+    else
+        {
+        // Nothing
+        }
+
+	IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::KeyPressBackL()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::KeyPressBackL()
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::KeyPressBackL, 0, KLogUi );
+    IMUM_IN();
+
+    SetFlag( EWizFlagBackKeyPressed );
+
+    // Text page editing ongoing, call correct page
+    if ( iSettingPage && Flag( EWizFlagTextEditPage ) )
+        {
+        iPageEdit->KeyPressedBackL();
+        }
+    // Radio button page editing ongoing, call correct page
+    else if ( iSettingPage && Flag( EWizFlagRadioButtonPage ) )
+        {
+        iPageRadioBtn->KeyPressedBackL();
+        }
+    else
+        {
+        // Nothing
+        }
+    if ( Flag( EWizFlagPluginDetected ) && iCurrentItem.iUid == EIMAWProtocol )
+        {
+        SetFlag( EImumSettingShouldClose );
+        }
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::EventItemEditStartsL
+// ----------------------------------------------------------------------------
+//
+TMuiuPageEventResult CIMSSettingsWizard::EventItemEditStartsL(
+    CMuiuSettingBase& /* aBaseItem */ )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::EventItemEditStartsL, 0, KLogUi );
+    IMUM_IN();
+
+    iNoteDialog = ShowMailSettingsPopupAfterL(
+        iCurrentItem, KMsToWaitBeforePopup );
+
+	IMUM_OUT();
+    return EMuiuPageEventResultApproved;
+    }
+
+/******************************************************************************
+
+    Wizard state machine
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::WizRunStart()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::WizRunStart()
+    {
+    // This function is called, when user starts the wizard by
+    // pressing Start-key or by choosing options->Start
+    SetFlag( EWizFlagStateRunning );
+    iWizState = EWizStateStarted;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::WizRunStepL()
+// ----------------------------------------------------------------------------
+//
+TBool CIMSSettingsWizard::WizRunStepL()
+	{
+	IMUM_CONTEXT( CIMSSettingsWizard::WizRunStepL, 0, KLogUi );
+	IMUM_IN();
+
+	// Run wizard step and change state
+    WizStateMachineL();
+    WizStateChangeStateL();
+
+	IMUM_OUT();
+    return Flag( EWizFlagStateRunning );
+	}
+
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::WizStateChangeStateL()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::WizStateChangeStateL()
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::WizStateChangeStateL, 0, KLogUi );
+    IMUM_IN();
+
+    // if EWizFlagShouldExit or EWizFlagShouldClose are on, OkToExitL()
+    // inquiry was received while wizard is running. Should exit wizard
+    // loop immediately.
+    if ( Flag( EWizFlagShouldExit ) || Flag( EWizFlagShouldClose ) )
+        {
+        // Reinstate exit flags as they were reset after we declined
+        // exit request in OkToExitL().
+        ChangeFlag( EImumSettingShouldExit, Flag( EWizFlagShouldExit ) );
+        ChangeFlag( EImumSettingShouldClose, Flag( EWizFlagShouldClose ) );
+
+        ClearFlag( EWizFlagStateRunning ); // exit wizard loop
+        IMUM_OUT();
+        return;
+        }
+
+    // This seperate function is meant only to chage the state of the
+    // state machine.
+    switch ( iWizState )
+        {
+        // After wizard has been initialized, go straight to page open state
+        case EWizStateStarted:
+            iWizState = EWizStateEditPage;
+            break;
+
+        // After new item has been chosen, Change to editing mode
+        case EWizStateDeterminePage:
+            iWizState = EWizStateEditPage;
+            break;
+
+        // After the item has been edited, check that the changes are ok
+        case EWizStateEditPage:
+            iWizState = EWizFinishEditing;
+            break;
+
+        // After validating item, the wizard can be exited by succesfully
+        // finishing the wizard, or by returning back to help screen
+        case EWizFinishEditing:
+            iWizState = ( Flag( EWizFlagExiting ) ||
+                          Flag( EImumSettingShouldExit ) ) ?
+                 EWizStateExit : EWizStateDeterminePage;
+            break;
+
+        // As default, try to leave the wizard
+        default:
+        case EWizStateExit:
+            iWizState = ( !Flag( EWizFlagCompleted ) && !Flag( EWizFlagForcedCancel )) ?
+                 EWizStateQuerying : EWizStateStarted;
+            break;
+
+        }
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::WizStateMachineL()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::WizStateMachineL()
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::WizStateMachineL, 0, KLogUi );
+    IMUM_IN();
+
+    switch ( iWizState )
+        {
+        // This is executed, when wizard is started
+        case EWizStateStarted:
+            WizHandleStateInitializeL();
+            break;
+
+        // In this state, the wizard chooses the next item to be edited
+        case EWizStateDeterminePage:
+            WizHandleStateDeterminePage();
+            break;
+
+        // Start editing the actual item
+        case EWizStateEditPage:
+            WizHandleStateEditL();
+            break;
+
+        // Check that the item is ok, so that the editing can be continued
+        case EWizFinishEditing:
+            WizHandleStateFinishEditingL();
+            break;
+
+        // Handle the exiting from the wizard
+        default:
+        case EWizStateExit:
+            WizHandleStateExitL();
+            break;
+        }
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::WizHandleStateInitializeL()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::WizHandleStateInitializeL()
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::WizHandleStateInitializeL, 0, KLogUi );
+    IMUM_IN();
+
+    SetHideItems( ETrue, R_IMAS_WIZARD, ETrue );
+
+    iDialog.MakeLineVisible( EIMSWizardRichTxtEditorContainer, EFalse);
+
+    iCurrentItem.iUid = EIMAWProtocol;
+
+    // if protocoll for mailbox has not yet been selected the iCurPage is set to 0 so that
+    // wizard page number text is only updated after the number of pages is known.
+    if ( iProtocol == KNullUid )
+    	iCurPage = 0;
+
+    // Clear all flags except EWizFlagStateRunning
+    for ( TInt flag = EWizFlagExiting; flag <= EWizFlagTextEditPage; flag++ )
+        {
+        ClearFlag( flag );
+        }
+
+    iPageEdit = NULL;
+    iPageRadioBtn = NULL;
+	IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::WizHandlePageForward()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::WizHandlePageForward()
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::WizHandlePageForward, 0, KLogUi );
+    IMUM_IN();
+
+    iCurrentItem.iUid++;
+    iCurPage++;
+
+    ClearFlag( EWizFlagItemApproved );
+    ClearFlag( EWizFlagNextKeyPressed );
+
+	IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::WizHandlePageBackward()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::WizHandlePageBackward()
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::WizHandlePageBackward, 0, KLogUi );
+	IMUM_IN();
+
+    iCurrentItem.iUid--;
+    iCurPage--;
+
+    ClearFlag( EWizFlagBackKeyPressed );
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::WizHandleStateDeterminePage()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::WizHandleStateDeterminePage()
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::WizHandleStateDeterminePage, 0, KLogUi );
+    IMUM_IN();
+
+    // When next key is pressed and the item is approved, change to next page
+    if ( Flag( EWizFlagNextKeyPressed ) &&
+         Flag( EWizFlagItemApproved ) )
+        {
+        WizHandlePageForward();
+        }
+    // When back key is pressed, change to previous page
+    else if ( Flag( EWizFlagBackKeyPressed ) )
+        {
+        WizHandlePageBackward();
+        }
+    else
+        {
+        // Just open the same page again, as it has not been filled correctly
+        ClearFlag( EWizFlagNextKeyPressed );
+        }
+
+	IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::WizHandleStateEditL()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::WizHandleStateEditL()
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::WizHandleStateEditL, 0, KLogUi );
+    IMUM_IN();
+
+    // Get the item from the list
+    CMuiuSettingBase* setting = GetItem( iCurrentItem );
+    User::LeaveIfNull( setting );
+
+    // When editing other edit settings, create page with next and back
+    if ( setting->iItemType == EMuiuDynSetItemEditText )
+        {
+        SetFlag( EWizFlagTextEditPage );
+        }
+    // For radiobutton pages, show next and back
+    else if ( setting->iItemType == EMuiuDynSetRadioButtonArray )
+        {
+        SetFlag( EWizFlagRadioButtonPage );
+        }
+    // Iap is radiobutton page
+    else if ( iCurrentItem.iUid == EIMAWIap )
+        {
+        SetFlag( EWizFlagRadioButtonPage );
+        }
+    else
+        {
+        // do nothing
+        }
+
+    DefinePageNumberStringL();
+
+    //Checks if email editor should be skipped
+    if ( !CheckEmailSkip() )
+        {
+        // Begin editing the page
+        OpenSettingPageL( *setting );
+        }
+
+    delete iNoteDialog;
+    iNoteDialog = NULL;
+
+	IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::WizHandleStateFinishEditingL()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::WizHandleStateFinishEditingL()
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::WizHandleStateFinishEditingL, 0, KLogUi );
+    IMUM_IN();
+
+    // Should exit when:
+    // Back key pressed and first page  OR
+    if ( Flag( EWizFlagBackKeyPressed ) &&
+         iCurrentItem.iUid == EIMAWProtocol )
+        {
+        SetFlag( EWizFlagExiting );
+        }
+
+    // Next key pressed and item validated and last item
+    if ( Flag( EWizFlagNextKeyPressed ) )
+        {
+       	TBool isInternal = iMailboxApi.MailboxUtilitiesL().IsMailMtm( iProtocol, ETrue );
+
+		if ( !isInternal && iCurrentItem.iUid == EIMAWProtocol )
+			{
+            TBool completed = ETrue;
+			//This should not make the utils code leave
+			TRAP_IGNORE( CallExternalMtmWizardL( iProtocol, completed ) );
+            if (!completed)
+                {
+                ClearFlag( EWizFlagNextKeyPressed );
+                }
+			}
+		else
+			{
+            // Get the item to be edited
+            CMuiuSettingBase* base = GetItem( iCurrentItem );
+
+            if ( iCurrentItem.iUid == EIMAWMailboxName )
+                {
+                ChangeFlag( EWizFlagExiting, Flag( EWizFlagItemApproved ) );
+            	}
+            }
+        }
+
+    if ( Flag ( EWizFlagNextKeyPressed ) || Flag ( EWizFlagBackKeyPressed ) )
+        {
+        // Clear the flags while exiting
+        ClearFlag( EWizFlagRadioButtonPage );
+        }
+    ClearFlag( EWizFlagTextEditPage );
+    iPageEdit = NULL;
+    iPageRadioBtn = NULL;
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::WizHandleStateExitL()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::WizHandleStateExitL()
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::WizHandleStateExitL, 0, KLogUi );
+    IMUM_IN();
+
+    // Stop the wizard
+    ClearFlag( EWizFlagStateRunning );
+
+    // If the last item is approved, complete the wizard
+    if ( Flag( EWizFlagNextKeyPressed ) &&
+        iCurrentItem.iUid == EIMAWMailboxName )
+        {
+        ChangeFlag( EWizFlagCompleted, CheckCompleted() );
+        }
+
+    // In case wizard is not completed, but just returned back to help screen
+   	if ( !Flag( EWizFlagCompleted ) && !Flag( EWizFlagForcedCancel ))
+        {
+        iDialog.MakeLineVisible( EIMSWizardRichTxtEditorContainer, ETrue);
+        }
+    else
+        {
+        if( Flag( EWizFlagCompleted ) )
+        	{
+   			// Show the information query to the user
+        	// before leaving the wizard.
+   			CIMSSettingsNoteUi::ShowQueryL(
+                R_MBXS_SETTINGS_MAIL_NEWBOX_FINAL, R_EMAIL_INFORMATION_QUERY, ETrue );
+        	}
+        SetFlag( EImumSettingShouldClose );
+        }
+
+	IMUM_OUT();
+    }
+
+
+/******************************************************************************
+
+    Item handling
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::EventItemEditEndsL()
+// ----------------------------------------------------------------------------
+//
+TInt CIMSSettingsWizard::EventItemEditEndsL(
+    CMuiuSettingBase& aBaseItem )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::EventItemEditEndsL, 0, KLogUi );
+    IMUM_IN();
+
+    if ( Flag( EWizFlagItemApproved ) )
+        {
+        // Set item as approved accoding to the settings
+        aBaseItem.iItemFlags.SetFlag( EMuiuDynItemValidated );
+
+        SettingsItemProcessItemL( aBaseItem );
+        }
+
+	IMUM_OUT();
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::EventItemEvaluateRadioButton()
+// ----------------------------------------------------------------------------
+//
+TMuiuPageEventResult CIMSSettingsWizard::EventItemEvaluateRadioButton(
+    const CMuiuSettingBase& aBaseItem,
+    TInt& aNewValue )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::EventItemEvaluateRadioButton, 0, KLogUi );
+	IMUM_IN();
+
+    // Test the item with the approver
+    TIMSApproverEvent event;
+    TMuiuPageEventResult result = iItemApprover->EvaluateValue(
+        event, aBaseItem, aNewValue );
+
+    // The EWizFlagItemApproved has to be updated according to result of the
+    // validation. When flag is ETrue, next page can be opened
+    TBool approved = ( result == EMuiuPageEventResultApproved );
+    ChangeFlag( EWizFlagItemApproved, approved );
+    if ( !approved )
+        {
+        // Needs to clear this as CMuiuDynamicSettingsDialog opens the
+        // same page again without returning to wizard.
+        ClearFlag( EWizFlagNextKeyPressed );
+        }
+
+    IMUM_OUT();
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::EventItemEvaluateText()
+// ----------------------------------------------------------------------------
+//
+TMuiuPageEventResult CIMSSettingsWizard::EventItemEvaluateText(
+    const CMuiuSettingBase& aBaseItem,
+    TDes& aNewText )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::EventItemEvaluateText, 0, KLogUi );
+    IMUM_IN();
+
+    // Test the item with the approver
+    TIMSApproverEvent event;
+    TMuiuPageEventResult result = iItemApprover->EvaluateText(
+        event, aBaseItem, aNewText );
+
+    // The EWizFlagItemApproved has to be updated according to result of the
+    // validation. When flag is ETrue, next page can be opened
+    TBool approved = ( result == EMuiuPageEventResultApproved );
+    ChangeFlag( EWizFlagItemApproved, approved );
+    if ( !approved )
+        {
+        // Needs to clear this as CMuiuDynamicSettingsDialog opens the
+        // same page again without returning to wizard.
+        ClearFlag( EWizFlagNextKeyPressed );
+        }
+
+    IMUM_OUT();
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::SettingsItemProcessItemL()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::SettingsItemProcessItemL(
+    CMuiuSettingBase& aBaseItem )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::SettingsItemProcessItemL, 0, KLogUi );
+    IMUM_IN();
+
+    switch ( aBaseItem.iItemId.iUid )
+        {
+        case EIMAWProtocol:
+            SettingsItemProcessProtocol( aBaseItem );
+            break;
+
+        case EIMAWEmailAddress:
+            SettingsItemProcessEmailL( aBaseItem );
+            break;
+
+        case EIMAWIap:
+            SettingsItemProcessIapL( aBaseItem );
+            break;
+
+        default:
+            break;
+        }
+
+	IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::SettingsItemProcessProtocol()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::SettingsItemProcessProtocol(
+    CMuiuSettingBase& aBaseItem )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::SettingsItemProcessProtocol, 0, KLogUi );
+
+   	iProtocol.iUid = iProtocolArray[aBaseItem.Value()];
+   	if ( iProtocol == KSenduiMtmImap4Uid )
+   	    {
+   	    SettingsItemDefineNormalWizardArray();
+   	    }
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::SettingsItemDefineNormalWizardArray()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::SettingsItemDefineNormalWizardArray()
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::SettingsItemDefineNormalWizardArray, 0, KLogUi );
+
+    // Unhide all the items
+    HidePermanently( ToUid( EIMAWProtocol ), EFalse );
+    HidePermanently( ToUid( EIMAWEmailAddress ), EFalse );
+    HidePermanently( ToUid( EIMAWReceivingServer ), EFalse );
+    HidePermanently( ToUid( EIMAWSendingServer ), EFalse );
+    HidePermanently( ToUid( EIMAWIap ), EFalse );
+    HidePermanently( ToUid( EIMAWMailboxName ), EFalse );
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::SettingsItemProcessEmailL()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::SettingsItemProcessEmailL(
+    CMuiuSettingBase& aBaseItem )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::SettingsItemProcessEmailL, 0, KLogUi );
+
+    CMuiuSettingsEditText* email =
+        static_cast<CMuiuSettingsEditText*>( &aBaseItem );
+
+    // Define new server address and mailbox name, if the email address changes
+    if ( email->Text() &&
+         email->Text()->CompareC( iTemporaryText ) )
+        {
+        // Fill rest of the items
+        SettingsItemDefineServers( *email->Text() );
+        SettingsItemDefineMailboxName( *email->Text() );
+        }
+
+    email = NULL;
+    iTemporaryText.Zero();
+
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::SettingsItemProcessIapL()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::SettingsItemProcessIapL(
+    CMuiuSettingBase& aBaseItem )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::SettingsItemProcessIapL, 0, KLogUi );
+
+    CIMSSettingsAccessPointItem* iapItem =
+        static_cast<CIMSSettingsAccessPointItem*>( &aBaseItem );
+
+    // Update the iap item, but use the radio button as reference point
+    SetItemIapItemL( *iapItem );
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::SettingsItemDefineServerL()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::SettingsItemDefineServers(
+    const TDesC& aEmailAddress )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::SettingsItemDefineServers, 0, KLogUi );
+
+    // Fetch the item
+    CMuiuSettingsEditText* outgoing = static_cast<CMuiuSettingsEditText*>(
+        GetItem( TUid::Uid( EIMAWSendingServer ) ) );
+    CMuiuSettingsEditText* incoming = static_cast<CMuiuSettingsEditText*>(
+        GetItem( TUid::Uid( EIMAWReceivingServer ) ) );
+
+    if ( outgoing && incoming )
+        {
+        TMuiuSettingsText newAddress;
+        TInt len = aEmailAddress.Length();
+
+        // Find index after '@' character
+        TInt index = aEmailAddress.Locate( KIMASCharAt ) + 1;
+        newAddress.Zero();
+        newAddress.Append( KIMASCharDot );
+        newAddress.Append( aEmailAddress.Right( len - index ) );
+
+        // Finally copy the address
+        outgoing->SetText( &newAddress );
+        incoming->SetText( &newAddress );
+        }
+
+    outgoing = NULL;
+    incoming = NULL;
+
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::SettingsItemDefineMailboxName()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::SettingsItemDefineMailboxName(
+    const TDesC& aEmailAddress )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::SettingsItemDefineMailboxName, 0, KLogUi );
+
+    // Fetch the item
+    CMuiuSettingsEditText* name = static_cast<CMuiuSettingsEditText*>(
+        GetItem( TUid::Uid( EIMAWMailboxName ) ) );
+    TInt len = aEmailAddress.Length();
+
+    if ( name && len > 0 )
+        {
+        // Clear the old name and prepare the new
+        TMuiuSettingsText newAddress;
+
+        // Find the first letter after '@' character and set the string
+        // to name field
+        TInt firstLetterIndex = aEmailAddress.Locate( KIMASCharAt ) + 1;
+        newAddress.Append( aEmailAddress.Right( len - firstLetterIndex ) );
+
+        // Find the first '.' character and remove it and
+        // all the text after it
+        TInt pointCharIndex = newAddress.Locate( KIMASCharDot );
+        if ( pointCharIndex > 0 )
+            {
+            newAddress.Delete( pointCharIndex, newAddress.Length() - 1 );
+            }
+
+        // Validate the generated account name
+        TIMSApproverEvent event;
+        name->iItemFlags.SetFlag( EIMSApproverGenerate );
+        iItemApprover->EvaluateText( event, *name, newAddress );
+        name->iItemFlags.ClearFlag( EIMSApproverGenerate );
+
+        // Finally copy the address
+        name->SetText( &newAddress );
+        }
+
+    // Clean up
+    name = NULL;
+
+    }
+
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::CheckEmailSkip()
+// ----------------------------------------------------------------------------
+//
+TBool CIMSSettingsWizard::CheckEmailSkip()
+    {
+    TBool ok = EFalse;
+    if ( Flag( EWizFlagSkipEmail ) && iCurrentItem.iUid == EIMAWEmailAddress )
+        {
+        ClearFlag( EWizFlagSkipEmail );
+        CMuiuSettingsEditText* email = static_cast<CMuiuSettingsEditText*>(
+            GetItem( TUid::Uid( EIMAWEmailAddress ) ) );
+        TRAPD( error, ok =
+            MsvUiServiceUtilities::IsValidEmailAddressL( *email->Text() ) );
+        if ( !error && ok )
+            {
+            CMuiuSettingBase* emailItem = GetItem( TUid::Uid( EIMAWEmailAddress ) );
+            emailItem->iItemFlags.SetFlag( EMuiuDynItemValidated );
+            SetFlag( EWizFlagItemApproved );
+            SetFlag( EWizFlagNextKeyPressed );
+            }
+        else
+            {
+            // Should not leave just show the email address
+            TRAP_IGNORE( CIMSSettingsNoteUi::ShowNoteL(
+                R_IMUM_EDIT_OWN_EMAIL_ADDRESS_ERROR_TEXT,
+                EIMSInformationNote, ETrue ) );
+            }
+        }
+    return ok;
+    }
+
+/******************************************************************************
+
+    Custom settings
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::AcquireCustomSettingPageL()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::AcquireCustomSettingPageL(
+    CAknSettingPage*& aReturnPage,
+    TMuiuDynSetUpdateMode& aReturnUpdateMode,
+    TInt& aReturnSettingValue,
+    TMuiuSettingsText& aReturnSettingText,
+    CDesCArrayFlat& aReturnRadioButtonArray,
+    CMuiuSettingBase& aParamBaseItem )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::AcquireCustomSettingPageL, 0, KLogUi );
+
+    switch ( aParamBaseItem.iItemId.iUid )
+        {
+        // Radiobutton pages
+        case EIMAWProtocol:
+            aReturnPage = AcquireProtocolPageL(
+                aReturnSettingValue, aReturnUpdateMode,
+                aReturnRadioButtonArray, aParamBaseItem );
+            break;
+
+        // Text editors
+        case EIMAWEmailAddress:
+        case EIMAWSendingServer:
+        case EIMAWReceivingServer:
+        case EIMAWMailboxName:
+            aReturnPage = AcquireCustomTextEditorL(
+                aReturnSettingText, aReturnUpdateMode,
+                aParamBaseItem );
+            break;
+
+        case EIMAWIap:
+            aReturnPage = AcquireCustomIapPageL(
+                aReturnSettingValue, aReturnUpdateMode,
+                aReturnRadioButtonArray, aParamBaseItem );
+            break;
+
+        default:
+            break;
+        }
+
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::AcquireCustomRadioButtonPageL()
+// ----------------------------------------------------------------------------
+//
+CAknSettingPage* CIMSSettingsWizard::AcquireCustomRadioButtonPageL(
+    TInt& aReturnSettingValue,
+    TMuiuDynSetUpdateMode& aReturnUpdateMode,
+    MDesCArray& aReturnRadioButtonArray,
+    CMuiuSettingBase& aParamBaseItem )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::AcquireCustomRadioButtonPageL, 0, KLogUi );
+
+    iPageRadioBtn =
+        ( CIMSSettingsWizardRadioButtonPage::NewL(
+            *this, R_IMAS_WIZARD_DIALOG_LISTBOX_NEXT_BACK,
+            aReturnSettingValue, &aReturnRadioButtonArray, *iPageText ) );
+
+    // Define the page properties
+    iPageRadioBtn->SetSettingTextL( *aParamBaseItem.iItemLabel );
+
+    // Set updatemode to accept setting only when the setting is
+    // accepted
+    aReturnUpdateMode = CAknSettingPage::EUpdateWhenAccepted;
+
+    return iPageRadioBtn;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::AcquireCustomTextEditorL()
+// ----------------------------------------------------------------------------
+//
+CAknSettingPage* CIMSSettingsWizard::AcquireCustomTextEditorL(
+    TMuiuSettingsText& aReturnSettingText,
+    TMuiuDynSetUpdateMode& aReturnUpdateMode,
+    CMuiuSettingBase& aParamBaseItem )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::AcquireCustomTextEditorL, 0, KLogUi );
+
+    // Allow zero length with wizard, the setting won't be accepted
+    // anyway, when empty
+    TInt settingPageFlags = GetTextEditorFlags( aParamBaseItem );
+
+    // Determine buttons
+    TInt page = ( aParamBaseItem.iItemId.iUid == EIMAWMailboxName ) ?
+        R_IMAS_WIZARD_DIALOG_EDWIN_FINISH_BACK :
+        R_IMAS_WIZARD_DIALOG_EDWIN_NEXT_BACK;
+
+    // Create the text editir page
+    iPageEdit =
+        ( CIMSSettingsWizardEditTextPage::NewL(
+            *this, page, *&aReturnSettingText, *iPageText,
+            settingPageFlags ) );
+
+    // Define the page properties
+    iPageEdit->SetSettingTextL( *aParamBaseItem.iItemLabel );
+    CMuiuSettingsEditText* textEditor =
+        static_cast<CMuiuSettingsEditText*>( &aParamBaseItem );
+    iPageEdit->TextControl()->SetTextLimit(
+        textEditor->iItemMaxLength );
+    aReturnSettingText.Copy( *textEditor->Text() );
+    iTemporaryText.Zero();
+    iTemporaryText.Copy( *textEditor->Text() );
+
+    // Set updatemode to accept setting only when the setting is
+    // accepted
+    aReturnUpdateMode = CAknSettingPage::EUpdateWhenAccepted;
+
+    return iPageEdit;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::AcquireCustomIapPageL()
+// ----------------------------------------------------------------------------
+//
+CAknSettingPage* CIMSSettingsWizard::AcquireCustomIapPageL(
+    TInt& aReturnSettingValue,
+    TMuiuDynSetUpdateMode& aReturnUpdateMode,
+    CDesCArrayFlat& aReturnRadioButtonArray,
+    CMuiuSettingBase& aParamBaseItem )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::AcquireCustomIapPageL, 0, KLogUi );
+
+    CIMSSettingsAccessPointItem* iapItem =
+        static_cast<CIMSSettingsAccessPointItem*>( &aParamBaseItem );
+
+    // Initialize item in the first round
+    if ( !aParamBaseItem.iItemFlags.Flag( EMuiuDynItemChecked ) )
+        {
+        aParamBaseItem.iItemFlags.SetFlag( EMuiuDynItemChecked );
+        iMailboxApi.CommDbUtilsL().InitItemAccessPointL( *iapItem, ETrue );
+        }
+
+    // Create the button array
+    CDesCArrayFlat* buttons = &aReturnRadioButtonArray;
+
+    TRAPD( error, iMailboxApi.CommDbUtilsL().FillCustomIapArrayL( *buttons ) );
+    if ( error != KErrNone )
+        {
+        __ASSERT_DEBUG( EFalse,
+            User::Panic( KIMSWizardPanic, error ) );
+        }
+
+    // The correct radiobutton index is fetched from the item
+    aReturnSettingValue = iMailboxApi.CommDbUtilsL().GetWizardRadioButton( *iapItem );
+
+    AcquireCustomRadioButtonPageL(
+        aReturnSettingValue, aReturnUpdateMode, *buttons, aParamBaseItem );
+
+    // Focus the first access point, when no items selected
+    if ( aParamBaseItem.Value() == KErrNotFound )
+        {
+        TInt staticCount = iMailboxApi.CommDbUtilsL().StaticIAPCount();
+        TInt highlight = buttons->Count() > staticCount ? staticCount : 0;
+
+        iPageRadioBtn->ListBoxControl()->SetCurrentItemIndexAndDraw( highlight );
+        }
+
+    return iPageRadioBtn;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::AcquireProtocolPageL()
+// ----------------------------------------------------------------------------
+//
+CAknSettingPage* CIMSSettingsWizard::AcquireProtocolPageL(
+    TInt& aReturnSettingValue,
+    TMuiuDynSetUpdateMode& aReturnUpdateMode,
+    CDesCArrayFlat& aReturnRadioButtonArray,
+    CMuiuSettingBase& aParamBaseItem )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::AcquireProtocolPageL, 0, KLogUi );
+	IMUM_IN();
+
+    CDesCArrayFlat* buttons = &aReturnRadioButtonArray;
+
+	CMtmUiDataRegistry* uiDataMtmRegistry = CMtmUiDataRegistry::NewL( iMailboxApi.MsvSession() );
+	CleanupStack::PushL( uiDataMtmRegistry );
+	CBaseMtmUiData* uiData = NULL;
+
+    // Initialize the button/protocol ID mapping table
+    iProtocolArray.Reset();
+	iProtocolArray.AppendL( KSenduiMtmImap4UidValue );
+	iProtocolArray.AppendL( KSenduiMtmPop3UidValue );
+
+	for ( TInt i = uiDataMtmRegistry->NumRegisteredMtmDlls(); --i >= 0; )
+		{
+        TUid mtmType = uiDataMtmRegistry->MtmTypeUid(i);
+
+        if ( uiDataMtmRegistry->TechnologyTypeUid( mtmType ) == KSenduiTechnologyMailUid )
+            {
+            TRAPD( err, uiData = &( iMtmStore->MtmUiDataL( mtmType ) ) );
+
+            if ( err == KErrNone )
+                {
+                CheckMtmWizardSupportL( *uiData, *buttons );
+                iMtmStore->ReleaseMtmUiData( mtmType );
+                }
+            }
+		}
+
+	CleanupStack::PopAndDestroy( uiDataMtmRegistry );
+	uiDataMtmRegistry = NULL;
+
+    AcquireCustomRadioButtonPageL(
+        aReturnSettingValue, aReturnUpdateMode, *buttons, aParamBaseItem );
+
+    IMUM_OUT();
+
+    return iPageRadioBtn;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::CheckMtmWizardSupportL()
+// Checks if spesified MTM has ability to launch added-on wizard from email
+// creation wizard
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::CheckMtmWizardSupportL(
+    CBaseMtmUiData& aMtmUiData,
+    CDesCArrayFlat& aRadioButtons
+    )
+    {
+	IMUM_CONTEXT( CIMSSettingsWizard::CheckMtmWizardSupportL, 0, KLogUi );
+	IMUM_IN();
+
+    const CArrayFix<CBaseMtmUiData::TMtmUiFunction>& funcs =
+        aMtmUiData.MtmSpecificFunctions();
+    TInt  funcIndex = -1;
+    TBool found = EFalse;
+
+    while ( ( ++funcIndex < funcs.Count() ) && found == EFalse )
+        {
+        CBaseMtmUiData::TMtmUiFunction func = funcs.At( funcIndex );
+
+        if ( func.iFunctionId == KMtmUiFunctionSettingsWizard )
+            {
+            aRadioButtons.AppendL( func.iCaption );
+            iProtocolArray.AppendL( aMtmUiData.Type().iUid );
+            found = ETrue;
+            }
+        }
+    IMUM_OUT();
+    }
+
+
+/******************************************************************************
+
+    Account creating
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::StoreSettingsToAccountL()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::StoreSettingsToAccountL(
+    CImumInSettingsData& aSettings )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::StoreSettingsToAccountL, 0, KLogUi );
+
+
+    SetPreviousTitlePaneText();
+
+    // Make sure that all settings really are ok
+    if ( !Flag( EWizFlagCompleted ) )
+        {
+        // Settings not ok, don't try to create them
+        aSettings.ResetAll();
+
+        return;
+        }
+
+    TUid protocol;
+    if ( iProtocol == KSenduiMtmImap4Uid )
+        {
+        protocol = KSenduiMtmImap4Uid;
+        }
+    else
+        {
+        protocol = KSenduiMtmPop3Uid;
+        }
+
+    // First get the items and check they can be used
+    CMuiuSettingsEditText* emailAddress =
+        static_cast<CMuiuSettingsEditText*>(
+            GetItem( TUid::Uid( EIMAWEmailAddress ) ) );
+    User::LeaveIfNull( emailAddress );
+
+    CMuiuSettingsEditText* outgoingAddress =
+        static_cast<CMuiuSettingsEditText*>(
+            GetItem( TUid::Uid( EIMAWSendingServer ) ) );
+    User::LeaveIfNull( outgoingAddress );
+
+
+    CMuiuSettingsEditText* incomingAddress =
+        static_cast<CMuiuSettingsEditText*>(
+            GetItem( TUid::Uid( EIMAWReceivingServer ) ) );
+    User::LeaveIfNull( incomingAddress );
+
+    CIMSSettingsAccessPointItem* iapPreference =
+        static_cast<CIMSSettingsAccessPointItem*>(
+            GetItem( TUid::Uid( EIMAWIap ) ) );
+    User::LeaveIfNull( iapPreference );
+    // Resolve Access Point type, and actual ID; it is assumed
+    // that Default Connection is always first in the list
+    if( iapPreference->iIapRadioButton <= 0 )
+    	{
+    	iapPreference->iIap.iResult = CMManager::EDefaultConnection;
+    	iapPreference->iIap.iId = 0; // default conn id
+    	}
+    else
+    	{
+    	iapPreference->iIap.iResult = CMManager::EConnectionMethod;
+    	iapPreference->iIap.iId = iMailboxApi.CommDbUtilsL().GetIapIdL(
+    			iapPreference->iIapRadioButton );
+
+    	}
+
+    CMuiuSettingsEditText* mailboxName =
+        static_cast<CMuiuSettingsEditText*>(
+            GetItem( TUid::Uid( EIMAWMailboxName ) ) );
+    User::LeaveIfNull( mailboxName );
+
+    // Create settings data object through the interface
+    iMailboxApi.MailboxServicesImplL().FillCompulsorySettingsL(
+        aSettings,
+        protocol,
+        *emailAddress->Text(),
+        *incomingAddress->Text(),
+        *outgoingAddress->Text(),
+        iapPreference->iIap.iId,
+        *mailboxName->Text() );
+
+    // Store the exit code, so the settings will be saved
+    iBaseUiFlags.SetFlag( EImumSettingSave );
+
+    // Cleanup
+    emailAddress = NULL;
+    incomingAddress = NULL;
+    outgoingAddress = NULL;
+    iapPreference = NULL;
+    mailboxName = NULL;
+
+    }
+
+/******************************************************************************
+
+    Utilitites
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsWizard::CheckCompleted()
+// ----------------------------------------------------------------------------
+//
+TBool CIMSSettingsWizard::CheckCompleted()
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::CheckCompleted, 0, KLogUi );
+
+    // Get the array of main resource
+    CMuiuDynFinderItemArray* array = GetResource( R_IMAS_WIZARD, EFalse );
+
+    // Search through the array, and if all items are ready, return true
+    TInt item = array->Count();
+    TBool ok = item > 0;
+    while ( --item >= 0 )
+        {
+        TMuiuFlags flags = ( *array )[item].iItem->iItemFlags;
+
+        // All visible items are checked and one failure is enough to
+        // make the array unfinished
+        ok = flags.Flag( EMuiuDynItemPermanentlyHidden ) ||
+             flags.Flag( EMuiuDynItemValidated ) && ok;
+        }
+
+    return ok;
+    }
+
+// -----------------------------------------------------------------------------
+// CIMSSettingsWizard::PostponePopup()
+// PostponePopup is used to move time forward
+// when popup will be displayed. This is needed
+// to prevent situation when user is typing
+// e.g. email address and popup will be displayed
+// after user is typed a half of address but
+// original time has experied.
+// -----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::PostponePopup()
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::PostponePopup, 0, KLogUi );
+    IMUM_IN();
+
+    if( iNoteDialog )
+        {
+        iNoteDialog->SetTimeDelayBeforeShow( KMsToWaitBeforeRePopup );
+        iNoteDialog->ShowInfoPopupNote();
+        }
+
+    IMUM_OUT();
+    }
+
+// -----------------------------------------------------------------------------
+// CIMSSettingsWizard::ShowMailSettingsPopupAfter()
+// -----------------------------------------------------------------------------
+//
+CAknInfoPopupNoteController* CIMSSettingsWizard::ShowMailSettingsPopupAfterL(
+    const TUid& aId,
+    TInt aAfterMs )
+    {
+    IMUM_CONTEXT( CIMSSettingsWizard::ShowMailSettingsPopupAfterL, 0, KLogUi );
+
+    CAknInfoPopupNoteController* noteDialog = NULL;
+    switch ( aId.iUid )
+        {
+        case EIMAWProtocol:
+            noteDialog = CIMSSettingsNoteUi::ShowPopupL( 
+                R_IMUM_POPUP_MAILBOX_TYPE, aAfterMs );
+            break;
+
+        case EIMAWEmailAddress:
+            noteDialog = CIMSSettingsNoteUi::ShowPopupL(
+                R_IMUM_POPUP_MY_EMAIL_ADDRESS, aAfterMs );
+            break;
+
+        case EIMAWSendingServer:
+            noteDialog = CIMSSettingsNoteUi::ShowPopupL(
+                R_IMUM_POPUP_OUTGOING_SERVER, aAfterMs );
+            break;
+
+        case EIMAWReceivingServer:
+            noteDialog = CIMSSettingsNoteUi::ShowPopupL(
+                R_IMUM_POPUP_INCOMING_SERVER, aAfterMs );
+            break;
+
+        case EIMAWIap:
+            noteDialog = CIMSSettingsNoteUi::ShowPopupL(
+                R_IMUM_POPUP_DEFINING_ACCESS_POINT, aAfterMs );
+            break;
+
+        case EIMAWMailboxName:
+            noteDialog = CIMSSettingsNoteUi::ShowPopupL(
+                R_IMUM_POPUP_MAILBOX_NAME, aAfterMs );
+            break;
+
+        default:
+            __ASSERT_DEBUG( EFalse,
+                User::Panic( KIMSWizardPanic, KErrUnknown ) );
+            break;
+        }
+
+    return noteDialog;
+    }
+
+// -----------------------------------------------------------------------------
+// CIMSSettingsWizard::CallExternalMtmWizardL()
+// Calls added-on MTM-wizard
+// -----------------------------------------------------------------------------
+//
+void CIMSSettingsWizard::CallExternalMtmWizardL( const TUid& aMtmUid, TBool& aCompleted )
+	{
+	IMUM_CONTEXT( CIMSSettingsWizard::CallExternalMtmWizardL, 0, KLogUi );
+	IMUM_IN();
+
+	TInt completed( 0 );
+    TPckgBuf<TInt> buf( completed );
+
+	CBaseMtmUi& mtmUi = iMtmStore->ClaimMtmUiL( aMtmUid );
+
+    CMsvEntrySelection* emptySelection = new (ELeave) CMsvEntrySelection;
+    CleanupStack::PushL( emptySelection );
+
+	TRAP_IGNORE( mtmUi.InvokeSyncFunctionL(
+		KMtmUiFunctionSettingsWizard, *emptySelection, buf) );
+
+	iMtmStore->ReleaseMtmUi( aMtmUid );
+
+	CleanupStack::PopAndDestroy( emptySelection );
+	emptySelection = NULL;
+
+    aCompleted = (buf() != 1);
+
+    // Makes the wizard exit
+    if ( aCompleted )
+        {
+       	SetFlag( EWizFlagExiting );
+    	SetFlag( EWizFlagForcedCancel );
+    	IMUM0(0, "MTM wizard has returned an exit code!");
+        }
+
+    IMUM_OUT();
+	}
+
+//  End of File