diff -r 000000000000 -r 72b543305e3a email/imum/Utils/Src/IMSSettingsWizard.cpp --- /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 +#include // CDesCArrayFlat +#include // Softkey enumerations +#include // CEmailAccounts +#include // CImSmtpSettings +#include // CImImap4Settings +#include // CImPop3Settings +#include // CImIAPPreferences +#include // StringLoader +#include // CAknMessageQueryDialog +#include // MsvUiServiceUtilities +#include // CEikRichTextEditor +#include // CRichText +#include +#include // CBaseMtmUiData +#include // CBaseMtmUi +#include // CMtmRegistryControl + +#include +#include // CMtmStore +#include "MuiuDynamicSettingsItemFinderInterface.h" +#include "MuiuDynamicSettingsDialog.h" +#include + +#include + +#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* array = new ( ELeave ) CArrayFixFlat( 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( + 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( &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( &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( + GetItem( TUid::Uid( EIMAWSendingServer ) ) ); + CMuiuSettingsEditText* incoming = static_cast( + 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( + 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( + 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( &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( &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& 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( + GetItem( TUid::Uid( EIMAWEmailAddress ) ) ); + User::LeaveIfNull( emailAddress ); + + CMuiuSettingsEditText* outgoingAddress = + static_cast( + GetItem( TUid::Uid( EIMAWSendingServer ) ) ); + User::LeaveIfNull( outgoingAddress ); + + + CMuiuSettingsEditText* incomingAddress = + static_cast( + GetItem( TUid::Uid( EIMAWReceivingServer ) ) ); + User::LeaveIfNull( incomingAddress ); + + CIMSSettingsAccessPointItem* iapPreference = + static_cast( + 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( + 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 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