diff -r 000000000000 -r c8830336c852 wlansecuritysettings/wlaneapsettingsui/pap/configui/src/papuiview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlansecuritysettings/wlaneapsettingsui/pap/configui/src/papuiview.cpp Thu Dec 17 08:47:43 2009 +0200 @@ -0,0 +1,647 @@ +/* +* Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Implementation of PAP UI settings dialog +* +*/ + + + +// INCLUDE FILES +#include "papuiview.h" +#include "papuisettingarray.h" +#include "papuipwsettingitem.h" +#include "papui.hrh" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +// CONSTANTS +// UID of general settings app, in which help texts are included +const TUid KHelpUidPlugin = { 0x100058EC }; + +// MODULE DATA STRUCTURES +enum TSettingIds + { + EUsernameItem=0, + EPasswordPromptItem, + EPasswordItem + }; + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPapUiDialog::CPapUiDialog +// ----------------------------------------------------------------------------- +// +CPapUiDialog::CPapUiDialog( CEapTlsPeapUiConnection* aConnection, + TInt& aButtonId ) +: CAknDialog(), + iConnection( aConnection ), + iNaviPane( 0 ), + iNaviDecorator( 0 ), + iButtonId( &aButtonId ), + iSettingPwPrompt( ETrue ), + iIsUIConstructionCompleted( EFalse ), + iUsernameCancelled( EFalse ) + { + } + + +// --------------------------------------------------------- +// CPapUiDialog::ConstructAndRunLD +// --------------------------------------------------------- +// +TInt CPapUiDialog::ConstructAndRunLD( TInt aResourceId ) + { + CleanupStack::PushL( this ); + + iSettingArray = CPapSettingItemArray::NewL(); + + User::LeaveIfError( iConnection->Connect() ); + + // Basic data + iDataConnection = iConnection->GetDataConnection(); + if ( iDataConnection == 0 ) + { + User::Leave( KErrNoMemory ); + } + User::LeaveIfError( iDataConnection->Open() ); + User::LeaveIfError( iDataConnection->GetData( &iUiData ) ); + + //Copy the eapol UI data to the temporary data shown on the setting UI + iSettingUsername.Copy( iUiData->GetPapUserName() ); + iSettingPwPrompt = *( iUiData->GetPapPasswordPrompt() ); + iSettingPassword.Copy( iUiData->GetPapPassword() ); + + #if defined(_DEBUG) || defined(DEBUG) + RDebug::Print(_L("When read from eapol, iSettingUsername = %S"), &iSettingUsername ); + RDebug::Print(_L("When read from eapol, iSettingPwPrompt = %d"), iSettingPwPrompt ); + RDebug::Print(_L("When read from eapol, iSettingPassword = %S"), &iSettingPassword ); + #endif + + FeatureManager::InitializeLibL(); + + ConstructL( R_PAP_MENUBAR ); + + // ExecuteLD will PushL( this ), so we have to Pop it first... + CleanupStack::Pop( this ); + + return CAknDialog::ExecuteLD( aResourceId ); + } + + +// ----------------------------------------------------------------------------- +// CPapUiDialog::~CPapUiDialog +// ----------------------------------------------------------------------------- +// +CPapUiDialog::~CPapUiDialog() + { + + delete iNaviDecorator; + + if ( iSettingArray ) + { + iSettingArray->Array()->ResetAndDestroy(); + delete iSettingArray; + } + + iSettingListBox = NULL; + + if ( iDataConnection ) + { + iDataConnection->Close(); + delete iDataConnection; + } + + if ( iConnection ) + { + iConnection->Close(); + } + + delete iPreviousText; + + FeatureManager::UnInitializeLib(); + } + + +// --------------------------------------------------------- +// CPapUiDialog::HandleListBoxEventL +// --------------------------------------------------------- +// +void CPapUiDialog::HandleListBoxEventL( CEikListBox* /*aListBox*/, + TListBoxEvent aEventType ) + { + switch ( aEventType ) + { + case EEventEnterKeyPressed: + case EEventItemSingleClicked: + { + OkToExitL( EPapUiCmdChange ); + break; + } + + case EEventItemActioned: + case EEventEditingStarted: + case EEventEditingStopped: + case EEventPenDownOnItem: + case EEventItemDraggingActioned: + { + break; + } + + default: + { + break; + }; + }; + } + + +// ----------------------------------------------------------------------------- +// CPapUiDialog::PreLayoutDynInitL +// ----------------------------------------------------------------------------- +// +void CPapUiDialog::PreLayoutDynInitL() + { + ChangeTitleL( ETrue ); + + TUid naviPaneUid; + naviPaneUid.iUid = EEikStatusPaneUidNavi; + CEikStatusPane* statusPane = iEikonEnv->AppUiFactory()->StatusPane(); + CEikStatusPaneBase::TPaneCapabilities subPane = + statusPane->PaneCapabilities( naviPaneUid ); + if ( subPane.IsPresent()&&subPane.IsAppOwned() ) + { + iNaviPane = static_cast( + statusPane->ControlL( naviPaneUid ) ); + + // Set empty text to hide tabs. + iNaviDecorator = iNaviPane->CreateNavigationLabelL( KNullDesC ); + iNaviPane->PushL( *iNaviDecorator ); + } + + + // Initialize setting page + iSettingListBox = static_cast( + ControlOrNull( EPapSettingsListBox ) ); + iSettingListBox->SetMopParent( this ); + iSettingListBox->CreateScrollBarFrameL( ETrue ); + iSettingListBox->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, + CEikScrollBarFrame::EAuto ); + iSettingListBox->SetListBoxObserver( this ); + DrawSettingsListL(); + + iIsUIConstructionCompleted = ETrue; + + } + + +// ----------------------------------------------------------------------------- +// CPapUiDialog::ChangeTitleL +// ----------------------------------------------------------------------------- +// +void CPapUiDialog::ChangeTitleL( TBool aIsStarted ) + { + TUid titlePaneUid; + titlePaneUid.iUid = EEikStatusPaneUidTitle; + + CEikStatusPane* statusPane = iEikonEnv->AppUiFactory()->StatusPane(); + CEikStatusPaneBase::TPaneCapabilities subPane = + statusPane->PaneCapabilities( titlePaneUid ); + + if ( subPane.IsPresent() && subPane.IsAppOwned() ) + { + CAknTitlePane* titlePane = static_cast( + statusPane->ControlL( titlePaneUid) ); + if ( aIsStarted ) + { + // Store previous application title text + const TDesC* prevText = titlePane->Text(); + iPreviousText = HBufC::NewL( prevText->Length() ); + iPreviousText->Des().Append( *prevText ); + TDesC* titleText = iEikonEnv->AllocReadResourceLC( + R_PAP_SETTINGS_TITLE ); + titlePane->SetTextL( *titleText ); + CleanupStack::PopAndDestroy( titleText ); + } + else + { + // Set calling application title text back + titlePane->SetTextL( *iPreviousText ); + } + } + } + + +// ----------------------------------------------------------------------------- +// CPapUiDialog::OkToExitL +// ----------------------------------------------------------------------------- +// +TBool CPapUiDialog::OkToExitL( TInt aButtonId ) + { + #if defined(_DEBUG) || defined(DEBUG) + RDebug::Print(_L("CPapUiDialog::OkToExitL") ); + #endif + + TBool ret( EFalse ); + switch ( aButtonId ) + { + case EEikBidOk: + { + if( iIsUIConstructionCompleted ) + { + if ( iSettingListBox->IsFocused() ) + { + ShowSettingPageL( EFalse ); + } + } + else + { + #if defined(_DEBUG) || defined(DEBUG) + RDebug::Print(_L("CPapUiDialog::OkToExitL - UI not ready - Ignoring key press.\n") ); + #endif + } + + break; + } + + case EAknSoftkeyOptions: + { + DisplayMenuL(); + break; + } + + case EAknSoftkeyBack: + case EAknCmdExit: + { + UpdateEapolData(); + ChangeTitleL( EFalse ); + ret = ETrue; + break; + } + + case EPapUiCmdChange: + { + if( iIsUIConstructionCompleted ) + { + ShowSettingPageL( EFalse ); + } + else + { + #if defined(_DEBUG) || defined(DEBUG) + RDebug::Print(_L("CPapUiDialog::ProcessCommandL - UI not ready - Ignoring key press.\n") ); + #endif + } + + break; + } + + default: + { + break; + } + } + + if ( ret ) + { + *iButtonId = aButtonId; + } + + return ret; + } + + +// ----------------------------------------------------------------------------- +// CPapUiDialog::DrawSettingsListL +// ----------------------------------------------------------------------------- +// +void CPapUiDialog::DrawSettingsListL() + { + iSettingArray->Array()->ResetAndDestroy(); + TInt ordinal = 0; + + // --------------------------------------------------------------- + // Username setting item. If the username has never been set, + // shows "(not defined)", otherwise shows the username. + iSettingArray->AddTextItemL( iSettingUsername, + EPapSettingPageUserName, + R_PAP_USERNAME_SETTING_TITLE, + R_PAP_USERNAME_PAGE, + NULL, + ordinal++ ); + + // --------------------------------------------------------------- + // Password prompt setting item. Radio buttons Prompt/User defined. + iSettingArray->AddBinarySettingItemL( R_PAP_PASSWORD_POPUP_PAGE, + R_PAP_PASSWORD_SETTING_TITLE, + R_PAP_PASSWORD_PROMPT_CHOICES, + ordinal++, + iSettingPwPrompt ); + + // --------------------------------------------------------------- + // Password setting item. Never visible in the setting list, but the + // setting page opens when the user selects "User defined" in the + // password prompt setting item. + iSettingArray->AddPasswordItemL( iSettingPassword, + EPapSettingPagePassword, + R_PAP_PASSWORD_SETTING_TITLE, + R_PAP_PASSWORD_SETTING_PAGE, + NULL, + ordinal++ ); + + // Set the last item hidden + CAknSettingItem* item = iSettingArray->Array()->At( EPasswordItem ); + item->SetHidden( ETrue ); + + + iSettingListBox->Model()->SetItemTextArray( iSettingArray->Array() ); + iSettingListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray ); + iSettingArray->Array()->RecalculateVisibleIndicesL(); + iSettingListBox->HandleItemAdditionL(); + iSettingListBox->UpdateScrollBarsL(); + } + + +// ----------------------------------------------------------------------------- +// CPapUiDialog::DynInitMenuPaneL +// ----------------------------------------------------------------------------- +// +void CPapUiDialog::DynInitMenuPaneL( TInt aResourceId, + CEikMenuPane* aMenuPane ) + { + CAknDialog::DynInitMenuPaneL( aResourceId, aMenuPane ); + + if ( aResourceId == R_PAP_MENU_PANE ) + { + if ( aMenuPane && !FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + aMenuPane->DeleteMenuItem( EAknCmdHelp ); + } + + } + } + +// ----------------------------------------------------------------------------- +// CPapUiDialog::UpdateEapolData +// ----------------------------------------------------------------------------- +// +void CPapUiDialog::UpdateEapolData() + { + #if defined(_DEBUG) || defined(DEBUG) + RDebug::Print(_L("CPapUiDialog::UpdateEapolData") ); + RDebug::Print(_L("Saving username: %S"), &iSettingUsername ); + RDebug::Print(_L("Saving pwprompt: %d"), iSettingPwPrompt ); + RDebug::Print(_L("Saving password: %S"), &iSettingPassword ); + #endif + + // username + if ( iSettingUsername.Length() ) + { + ( iUiData->GetPapUserName() ).Copy( iSettingUsername ); + } + + + // pwprompt + *( iUiData->GetPapPasswordPrompt() ) = iSettingPwPrompt; + + // password + ( iUiData->GetPapPassword() ).Copy( iSettingPassword ); + + iDataConnection->Update(); + } + + +// ----------------------------------------------------------------------------- +// CPapUiDialog::ProcessCommandL +// ----------------------------------------------------------------------------- +// +void CPapUiDialog::ProcessCommandL( TInt aCommand ) + { + if ( MenuShowing() ) + { + HideMenu(); + } + + switch( aCommand ) + { + case EAknCmdExit: + { + TryExitL( aCommand ); + break; + } + + case EAknCmdHelp: + { + HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), + iEikonEnv->EikAppUi()->AppHelpContextL() ); + break; + } + + case EPapUiCmdChange: + { + if( iIsUIConstructionCompleted ) + { + ShowSettingPageL( ETrue ); + } + else + { + #if defined(_DEBUG) || defined(DEBUG) + RDebug::Print(_L("CPapUiDialog::ProcessCommandL - UI not ready - Ignoring key press.\n") ); + #endif + } + break; + } + + default: + { + break; + } + } + } + + +// ----------------------------------------------------------------------------- +// CPapUiDialog::ShowSettingPageL +// ----------------------------------------------------------------------------- +// +void CPapUiDialog::ShowSettingPageL( TInt aCalledFromMenu ) + { + #if defined(_DEBUG) || defined(DEBUG) + RDebug::Print(_L("CPapUiDialog::ShowSettingPageL") ); + #endif + + TInt index = iSettingListBox->CurrentItemIndex(); + + if ( index == EUsernameItem ) + { + ShowUsernameSettingPageL(); + } + + else if ( index == EPasswordPromptItem ) + { + // The previous value is needed for comparison, + // after the user has done the editing + TBool oldChoice = iSettingPwPrompt; + + // Show the radio button page and let the user edit + CAknSettingItem* item = iSettingArray->Array()->At( index ); + item->EditItemL( aCalledFromMenu ); + item->StoreL(); + + // Check the new value + TBool newChoice = iSettingPwPrompt; + + // Prompt -> User defined + if ( oldChoice && !newChoice ) + { + // Ask to set a password + ShowPasswordSettingPageL(); + + // If the password item was cancelled, + // or if username was prompted and cancelled, + // restore "Prompt" for the password prompt setting + if ( iSettingArray->IsPwItemCancelled() || iUsernameCancelled ) + { + // Toggle the setting back to Prompt without showing the page + item->EditItemL( EFalse ); + item->StoreL(); + } + } + + // User defined -> User defined + else if ( !oldChoice && !newChoice ) + { + // Ask to set a new password + ShowPasswordSettingPageL(); + } + + // Prompt -> Prompt + else if ( oldChoice && newChoice ) + { + // Do nothing + } + + // User defined -> Prompt + else if ( !oldChoice && newChoice ) + { + // Remove the password + CPapUiPwSettingItem* pwItem = + static_cast< CPapUiPwSettingItem* >( + iSettingArray->Array()->At( EPasswordItem ) ); + pwItem->DeletePasswordL(); + + } + + else + { + // It shouldn't be possible to end up here + } + + } + + else + { + // shouldn't end up here + } + + DrawNow(); + } + +// ----------------------------------------------------------------------------- +// CPapUiDialog::ShowUsernameSettingPageL +// ----------------------------------------------------------------------------- +// +void CPapUiDialog::ShowUsernameSettingPageL() + { + #if defined(_DEBUG) || defined(DEBUG) + RDebug::Print(_L("CPapUiDialog::ShowUsernameSettingPageL") ); + #endif + + iUsernameCancelled = EFalse; + + CAknSettingItem* item = iSettingArray->Array()->At( EUsernameItem ); + item->EditItemL( EFalse ); + item->StoreL(); + } + +// ----------------------------------------------------------------------------- +// CPapUiDialog::ShowPasswordSettingPageL +// ----------------------------------------------------------------------------- +// +void CPapUiDialog::ShowPasswordSettingPageL() + { + #if defined(_DEBUG) || defined(DEBUG) + RDebug::Print(_L("CPapUiDialog::ShowPasswordSettingPageL") ); + #endif + + CAknSettingItem* item = iSettingArray->Array()->At( EPasswordItem ); + + item->EditItemL( EFalse ); + item->StoreL(); + DrawNow(); + + // If password is set, then username must also be defined + if ( !iSettingUsername.Length() && !iSettingArray->IsPwItemCancelled() ) + { + // Show an info note about missing username + HBufC* message = NULL; + message = StringLoader::LoadLC( R_PAP_DEFINE_USERNAME_INFO_NOTE ); + CAknInformationNote* note = new( ELeave ) CAknInformationNote( ETrue ); + note->ExecuteLD( *message ); + CleanupStack::PopAndDestroy( message ); + + ShowUsernameSettingPageL(); + + // If the username is still empty, it can only mean that the user has + // cancelled the operation -> remove the temporarily accepted password + if ( !iSettingUsername.Length() ) + { + iUsernameCancelled = ETrue; + // Remove the password + CPapUiPwSettingItem* pwItem = + static_cast< CPapUiPwSettingItem* >( + iSettingArray->Array()->At( EPasswordItem ) ); + pwItem->DeletePasswordL(); + } + } + + } + +// ----------------------------------------------------------------------------- +// CPapUiDialog::GetHelpContext +// ----------------------------------------------------------------------------- +// +void CPapUiDialog::GetHelpContext( TCoeHelpContext& aContext ) const + { + aContext.iMajor = KHelpUidPlugin; + aContext.iContext = KSET_HLP_WLAN_EAP_PAP; + } + +// End of File