diff -r 000000000000 -r c8830336c852 wlansecuritysettings/wlaneapsettingsui/EapTtls/ConfigUi/src/EapTtlsUiView.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlansecuritysettings/wlaneapsettingsui/EapTtls/ConfigUi/src/EapTtlsUiView.cpp Thu Dec 17 08:47:43 2009 +0200 @@ -0,0 +1,1901 @@ +/* +* 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 EAP TTLS UI settings dialog +* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include "EapTtlsUiView.h" +#include "EapTtlsUi.hrh" +#include +#include +#include +#include "EapTtlsUiSettingArray.h" +#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 }; + +static const TInt KSettingArrayGranularity = 4; +static const TInt KSuiteArrayGranularity = 5; +static const TInt KMaxLengthOfEapLine = 270; +static const TInt KCertificateArrayGranularity = 5; +static const TInt KMaxLengthOfSuiteName = 255; +static const TInt KEapTtlsId = 21; + +_LIT( KNameSeparator, " " ); +_LIT( KEmptyString, "" ); +const TUint KFirstElement = 0; +const TUint KSecondElement = 1; +const TUint KMinEnabledCount = 1; + +/* This is the maximum length of a certificate's full name, includes +label, primary and secondary names */ +const TUint32 KMaxFullCertLabelLength = KMaxCertLabelLength + 2 * + KMaxNameLength + 1; // 1 is for separator. + +// MODULE DATA STRUCTURES +enum TPageIds + { + ESettingsPage = 0, + EEapTypePage, + ECipherSuitePage + }; + +enum TSettingIds + { + EUserCertificateItem = 0, + ECaCertificateItem, + EUsernameInUseItem, + EUsernameItem, + ERealmInUseItem, + ERealmItem + }; + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::CEapTtlsUiDialog +// ----------------------------------------------------------------------------- +// +CEapTtlsUiDialog::CEapTtlsUiDialog( CEapTlsPeapUiConnection* aConnection, + TIndexType aIndexType, TInt aIndex, + TInt& aButtonId ) +: CAknDialog(), + iConnection( aConnection ), + iIndexType( aIndexType ), + iIndex( aIndex ), + iButtonId( &aButtonId ), + iIsUIConstructionCompleted( EFalse ), + iExiting( EFalse ) + { + } + + +// --------------------------------------------------------- +// CEapTtlsUiDialog::ConstructAndRunLD +// --------------------------------------------------------- +// +TInt CEapTtlsUiDialog::ConstructAndRunLD( TInt aResourceId ) + { + CleanupStack::PushL( this ); + + iSettingArray = CEapTtlsSettingItemArray::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 ) ); + + // Cipher suites + iCipherSuites = iConnection->GetCipherSuiteConnection(); + if ( iCipherSuites == 0 ) + { + User::Leave( KErrNoMemory ); + } + + User::LeaveIfError( iCipherSuites->Open() ); + User::LeaveIfError( iCipherSuites->GetCipherSuites( &iUiCipherSuites ) ); + + iCipherSuitesViewArray = new( ELeave ) CDesCArrayFlat( + KSuiteArrayGranularity ); + //EAP types + iEapTypes = iConnection->GetEapTypeConnection(); + if ( iEapTypes == 0 ) + { + User::Leave( KErrNoMemory ); + } + User::LeaveIfError( iEapTypes->Open() ); + User::LeaveIfError( iEapTypes->GetEapTypes( &iUiEapTypes ) ); + if ( iUiEapTypes->Count() == 0 ) + { + CreateEapTypeDataBaseL(); + } + + iEapTypeViewArray = new( ELeave ) CDesCArrayFlat( + KSettingArrayGranularity ); + + FeatureManager::InitializeLibL(); + + ConstructL( R_TTLS_MENUBAR ); + + // ExecuteLD will PushL( this ), so we have to Pop it... + CleanupStack::Pop( this ); // this + + return CAknDialog::ExecuteLD( aResourceId ); + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::OfferKeyEventL +// ----------------------------------------------------------------------------- +// +TKeyResponse CEapTtlsUiDialog::OfferKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + TKeyResponse result( EKeyWasNotConsumed ); + + // gently handle impatient users + if ( !iIsUIConstructionCompleted ) + { + return CAknDialog::OfferKeyEventL( aKeyEvent, aType ); + } + + TInt pageId = ActivePageId(); + if ( aType == EEventKey && pageId == KEAPTTLSCIPHERPAGE ) + { + TInt indexBefore = iCipherSuiteListBox->CurrentItemIndex(); + + if ( aKeyEvent.iCode == EKeyEnter ) + { + if ( ( *iUiCipherSuites )[indexBefore].iIsEnabled ) + { + OkToExitL( ETtlsUiCmdDisable ); + } + else + { + OkToExitL( ETtlsUiCmdEnable ); + } + + result = EKeyWasConsumed; + } + else + { + result = CAknDialog::OfferKeyEventL( aKeyEvent, aType ); + } + + TInt indexAfter = iCipherSuiteListBox->CurrentItemIndex(); + + if ( indexBefore != indexAfter ) + { + CEikButtonGroupContainer& cba = ButtonGroupContainer(); + if( ( *iUiCipherSuites )[ indexAfter ].iIsEnabled ) + { + cba.SetCommandSetL( R_TTLS_UI_SOFTKEYS_OPTIONS_BACK_DISABLE ); + } + else + { + cba.SetCommandSetL( R_TTLS_UI_SOFTKEYS_OPTIONS_BACK_ENABLE ); + } + + cba.DrawDeferred(); + } + } + else if ( aType == EEventKey && pageId == KEAPTTLSEAPPAGE ) + { + TInt indexBefore = iEapTypesListBox->CurrentItemIndex(); + + if ( aKeyEvent.iCode == EKeyEnter ) + { + if ( ( *iUiEapTypes )[indexBefore].iIsEnabled ) + { + OkToExitL( ETtlsUiCmdConfigure ); + } + else + { + OkToExitL( ETtlsUiCmdEnable ); + } + + result = EKeyWasConsumed; + } + else + { + result = CAknDialog::OfferKeyEventL( aKeyEvent, aType ); + } + + TInt indexAfter = iEapTypesListBox->CurrentItemIndex(); + + if ( indexBefore != indexAfter ) + { + CEikButtonGroupContainer& cba = ButtonGroupContainer(); + if( ( *iUiEapTypes )[indexAfter].iIsEnabled ) + { + cba.SetCommandSetL( R_TTLS_UI_SOFTKEYS_OPTIONS_BACK_CONFIGURE ); + } + else + { + cba.SetCommandSetL( R_TTLS_UI_SOFTKEYS_OPTIONS_BACK_ENABLE ); + } + + cba.DrawDeferred(); + } + } + else + { + result = CAknDialog::OfferKeyEventL( aKeyEvent, aType ); + } + + return result; + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::~CEapTtlsUiDialog +// ----------------------------------------------------------------------------- +// +CEapTtlsUiDialog::~CEapTtlsUiDialog() + { + if ( iSettingArray ) + { + iSettingArray->Array()->ResetAndDestroy(); + } + + delete iSettingArray; + + iSettingListBox = NULL; + + iDataConnection->Close(); + delete iDataConnection; + + iCipherSuitesViewArray->Reset(); + delete iCipherSuitesViewArray; + + iEapTypeViewArray->Reset(); + delete iEapTypeViewArray; + + iCertificates->Close(); + delete iCertificates; + + iCipherSuites->Close(); + delete iCipherSuites; + + iEapTypes->Close(); + delete iEapTypes; + + iConnection->Close(); + + delete iPreviousText; + + FeatureManager::UnInitializeLib(); + } + + +// --------------------------------------------------------- +// CEapTtlsUiDialog::HandleListBoxEventL +// --------------------------------------------------------- +// +void CEapTtlsUiDialog::HandleListBoxEventL( CEikListBox* aListBox, + TListBoxEvent aEventType ) + { + switch ( aEventType ) + { + case EEventEnterKeyPressed: + case EEventItemSingleClicked: + { + if ( aListBox == iSettingListBox ) + { + OkToExitL( ETtlsUiCmdChange ); + } + + else if ( aListBox == iEapTypesListBox ) + { + TInt index = iEapTypesListBox->CurrentItemIndex(); + if ( iUiEapTypes->At( index ).iIsEnabled ) + { + ConfigureL(ETrue); + } + else + { + OkToExitL( ETtlsUiCmdEnable ); + } + } + + else if ( aListBox == iCipherSuiteListBox ) + { + TInt index = iCipherSuiteListBox->CurrentItemIndex(); + if ( iUiCipherSuites->At( index ).iIsEnabled ) + { + OkToExitL( ETtlsUiCmdDisable ); + } + else + { + OkToExitL( ETtlsUiCmdEnable ); + } + } + + else + { + // Do nothing; we should never end up here + } + + break; + } + + case EEventItemActioned: + case EEventEditingStarted: + case EEventEditingStopped: + case EEventPenDownOnItem: + case EEventItemDraggingActioned: + { + break; + } + + default: + { + break; + }; + }; + } + + +// --------------------------------------------------------- +// CEapTtlsUiDialog::HandleDialogPageEventL +// --------------------------------------------------------- +// +void CEapTtlsUiDialog::HandleDialogPageEventL( TInt aEventID ) + { + CAknDialog::HandleDialogPageEventL( aEventID ); + if( iExiting ) + { + // Exit requested. + TryExitL( EAknCmdExit ); + } + } + + +// --------------------------------------------------------- +// CEapTtlsUiDialog::ConfigureL +// --------------------------------------------------------- +// +void CEapTtlsUiDialog::ConfigureL( TBool aQuick ) + { + RImplInfoPtrArray eapArray; + eapArray.Reset(); + REComSession::ListImplementationsL( KEapTypeInterfaceUid, + eapArray ); + TInt itemIndex = iEapTypesListBox->CurrentItemIndex(); + TInt eapIndex( 0 ); + for ( TInt i = 0; i < eapArray.Count(); ++i ) + { + CImplementationInformation* tempInfo = eapArray[i]; + if ( iUiEapTypes->At( itemIndex ).iEapType == + tempInfo->DataType() ) + { + eapIndex = i; + break; + } + } + + CEapType* eapType; + eapType = CEapType::NewL( eapArray[eapIndex]->DataType(), + iIndexType, iIndex ); + eapArray.ResetAndDestroy(); + eapType->SetTunnelingType( KEapTtlsId ); + CleanupStack::PushL( eapType ); + TInt buttonId = eapType->InvokeUiL(); + CleanupStack::PopAndDestroy( eapType ); + if ( buttonId == EAknCmdExit || buttonId == EEikCmdExit ) + { + if (aQuick == EFalse) + { + TryExitL( buttonId ); + } + else + { + iExiting = ETrue; + // Don't exit here. Framework command chain will + // cause a KERN-EXEC 3 panic. Handle the exit in + // HandleDialogPageEventL(). + } + } + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::PreLayoutDynInitL +// ----------------------------------------------------------------------------- +// +void CEapTtlsUiDialog::PreLayoutDynInitL() + { + // Change title + ChangeTitleL( ETrue ); + + iSettingListBox = static_cast( + ControlOrNull( ETtlsSettingsListbox ) ); + iSettingListBox->SetComponentsToInheritVisibility( ETrue ); + + iEapTypesListBox = static_cast( + ControlOrNull( ETtlsSettingsEapTypeListbox ) ); + iEapTypesListBox->SetComponentsToInheritVisibility( ETrue ); + + iCipherSuiteListBox = static_cast( + ControlOrNull( ETtlsSettingsCipherSuiteListbox ) ); + iCipherSuiteListBox->SetComponentsToInheritVisibility( ETrue ); + + // Get certificates before building the UI. + // Will continue when certificates are received + iCertificates = iConnection->GetCertificateConnection( this ); + User::LeaveIfError( iCertificates->Open() ); + iCertificates->GetCertificates( &iUiUserCertificates, &iUiCACertificates ); + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::CompleteReadCertificates +// ----------------------------------------------------------------------------- +// +void CEapTtlsUiDialog::CompleteReadCertificates( const TInt aResult ) + { + if ( aResult == KErrNone ) // Certifiocates are received from core + { + TRAPD( err, CompleteUiConstructionL() ); + if ( err != KErrNone ) + { + TRAP_IGNORE( TryExitL( KErrCancel ) ); + } + } + else + { + TRAP_IGNORE( TryExitL( KErrCancel ) ); + } + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::CompleteUiConstructionL +// ----------------------------------------------------------------------------- +// +void CEapTtlsUiDialog::CompleteUiConstructionL() + { + // Initialize setting page + iSettingListBox = static_cast( + ControlOrNull( ETtlsSettingsListbox ) ); + iSettingListBox->SetMopParent( this ); + iSettingListBox->CreateScrollBarFrameL( ETrue ); + iSettingListBox->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, + CEikScrollBarFrame::EAuto ); + iSettingListBox->SetListBoxObserver( this ); + DrawSettingsListL(); + + // Initialize EAP types page + iEapTypesListBox = static_cast( + ControlOrNull( ETtlsSettingsEapTypeListbox ) ); + iEapTypesListBox->SetMopParent( this ); + iEapTypesListBox->CreateScrollBarFrameL( ETrue ); + iEapTypesListBox->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, + CEikScrollBarFrame::EAuto ); + iEapTypesListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray ); + iEapTypesListBox->SetListBoxObserver( this ); + + // Following deletes internal array created from resources. + // To prevent memory leak. + MDesCArray* internalArray1 = iEapTypesListBox->Model()->ItemTextArray(); + delete internalArray1; + + // Initialize cipher suites page + iCipherSuiteListBox = static_cast( + ControlOrNull( ETtlsSettingsCipherSuiteListbox ) ); + iCipherSuiteListBox->CreateScrollBarFrameL( ETrue ); + iCipherSuiteListBox->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, + CEikScrollBarFrame::EAuto ); + iCipherSuiteListBox->UpdateScrollBarsL(); + iCipherSuiteListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray ); + iCipherSuiteListBox->SetListBoxObserver( this ); + + //Following deletes internal array created from resources. + // To prevent memory leak. + MDesCArray* internalArray2 = iCipherSuiteListBox->Model()->ItemTextArray(); + delete internalArray2; + + SetEapIconsL(); + DrawEapListL( 0 ); + + SetCipherIconsL(); + DrawCipherSuitesL(); + + iIsUIConstructionCompleted = ETrue; + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::PostLayoutDynInitL +// ----------------------------------------------------------------------------- +// +void CEapTtlsUiDialog::PostLayoutDynInitL() + { + TUid naviPaneUid; + naviPaneUid.iUid = EEikStatusPaneUidNavi; + CEikStatusPane* statusPane = iEikonEnv->AppUiFactory()->StatusPane(); + CEikStatusPaneBase::TPaneCapabilities subPane = + statusPane->PaneCapabilities( naviPaneUid ); + if ( subPane.IsPresent() && subPane.IsAppOwned() ) + { + CAknNavigationControlContainer* naviPane = + static_cast( + statusPane->ControlL( naviPaneUid ) ); + CAknNavigationDecorator* naviDecorator = naviPane->ResourceDecorator(); + if ( naviDecorator ) + { + CAknTabGroup* tabGroup = static_cast( + naviDecorator->DecoratedControl() ); + tabGroup->SetActiveTabById( 0 ); + tabGroup->SetTabFixedWidthL( KTabWidthWithOneTab ); + } + } + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::ChangeTitleL +// ----------------------------------------------------------------------------- +// +void CEapTtlsUiDialog::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_TTLS_SETTINGS_TITLE ); + titlePane->SetTextL( *titleText ); + CleanupStack::PopAndDestroy( titleText ); + } + else + { + // Set calling application title text back + titlePane->SetTextL( *iPreviousText ); + } + } + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::OkToExitL +// ----------------------------------------------------------------------------- +// +TBool CEapTtlsUiDialog::OkToExitL( TInt aButtonId ) + { + TBool ret( EFalse ); + switch ( aButtonId ) + { + case EEikBidOk: + { + if( iIsUIConstructionCompleted ) + { + TPageIds index = static_cast( ActivePageIndex() ); + if ( index == ESettingsPage ) + { + ShowSettingPageL( EFalse ); + } + else if ( index == EEapTypePage ) + { + ProcessCommandL( ETtlsUiCmdConfigure ); + } + } + else + { + #if defined(_DEBUG) || defined(DEBUG) + RDebug::Print(_L("CEapTtlsUiDialog::OkToExitL - UI not ready - Ignoring key press.\n") ); + #endif + } + break; + } + + case EAknSoftkeyOptions: + { + DisplayMenuL(); + break; + } + + case EAknSoftkeyBack: + case EAknCmdExit: + { + if( ( GetEnabledEapTypeCount() > KMinEnabledCount ) && + ( IsPlainMschapv2Enabled() || IsPapEnabled() ) ) + { + HBufC* stringLabel; + + if ( IsPlainMschapv2Enabled() ) + { + stringLabel = StringLoader::LoadL( + R_TTLS_INFO_PLAIN_MSCHAP_CANNOT_ENABLE_ALONG, + iEikonEnv ); + } + else + { + stringLabel = StringLoader::LoadL( + R_TTLS_INFO_PAP_CANNOT_ENABLE_ALONG, + iEikonEnv ); + } + CleanupStack::PushL( stringLabel ); + CAknInformationNote* dialog = new ( ELeave ) + CAknInformationNote( ETrue ); + dialog->ExecuteLD( *stringLabel ); + CleanupStack::PopAndDestroy( stringLabel ); + + // after showing the info note, EAP settings page + // must be shown + if( ActivePageId() == KEAPTTLSSETTINGSPAGE ) + { + TKeyEvent keyRight = + { + EKeyRightArrow, + EStdKeyRightArrow, + EModifierPureKeycode, + 0 + }; + CAknDialog::OfferKeyEventL + ( keyRight, + EEventKey ); + } + if( ActivePageId() == KEAPTTLSCIPHERPAGE ) + { + TKeyEvent keyLeft = + { + EKeyLeftArrow, + EStdKeyLeftArrow, + EModifierPureKeycode, + 0 + }; + CAknDialog::OfferKeyEventL + ( keyLeft, + EEventKey ); + } + + iExiting = EFalse; + ret = EFalse; + } + else + { + if( iIsUIConstructionCompleted ) + { + iDataConnection->Update(); + ChangeTitleL( EFalse ); + ret = ETrue; + } + } + break; + } + + case ETtlsUiCmdChange: + { + TPageIds index = static_cast( ActivePageIndex() ); + if ( index == ESettingsPage ) + { + if( iIsUIConstructionCompleted ) + { + ShowSettingPageL( EFalse ); + } + else + { + #if defined(_DEBUG) || defined(DEBUG) + RDebug::Print(_L("CEapPeapUiDialog::ProcessCommandL - UI not ready - Ignoring key press.\n") ); + #endif + } + } + break; + } + + case ETtlsUiCmdConfigure: + case ETtlsUiCmdEnable: + case ETtlsUiCmdDisable: + { + ProcessCommandL( aButtonId ); + ret = EFalse; + break; + } + + default: + { + break; + } + } + + if ( ret ) + { + *iButtonId = aButtonId; + } + + return ret; + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::DrawSettingsListL +// ----------------------------------------------------------------------------- +// +void CEapTtlsUiDialog::DrawSettingsListL() + { + iSettingArray->Array()->ResetAndDestroy(); + TInt ordinal = 0; + TInt activeUserCertificate = CheckActiveUserCertificate(); + TBuf aActiveuserCertificateName = KEmptyString(); + if ( activeUserCertificate != KErrNotFound ) + { + TBuf text; + GetFullCertLabelL( + iUiUserCertificates->At( activeUserCertificate ).iCertEntry, + text ); + aActiveuserCertificateName.Copy( text ); + } + else + { + TDesC* notDefinedText = iEikonEnv->AllocReadResourceLC( + R_TTLS_NOT_DEFINED ); + aActiveuserCertificateName.Copy( *notDefinedText ); + CleanupStack::PopAndDestroy( notDefinedText ); + } + + iSettingArray->AddTextItemL( aActiveuserCertificateName, + ETtlsSettingUserCert, + R_TTLS_USER_CERT_STRING, + R_TTLS_USERNAME_PAGE, + NULL, + ordinal++ ); + + TInt activeCaCertificate = CheckActiveCaCertificate(); + TBuf aActiveCaCertificateName = KEmptyString(); + if ( activeCaCertificate != KErrNotFound ) + { + TBuf text; + GetFullCertLabelL( + iUiCACertificates->At( activeCaCertificate ).iCertEntry, + text ); + aActiveCaCertificateName.Copy( text ); + } + else + { + TDesC* notDefinedText = iEikonEnv->AllocReadResourceLC( + R_TTLS_NOT_DEFINED ); + aActiveCaCertificateName.Copy( *notDefinedText ); + CleanupStack::PopAndDestroy( notDefinedText ); + } + + iSettingArray->AddTextItemL( aActiveCaCertificateName, + ETtlsSettingCaCert, + R_TTLS_CA_CERT_STRING, + R_TTLS_USERNAME_PAGE, + NULL, + ordinal++ ); + + iSettingArray->AddBinarySettingItemL( R_TTLS_DISPLAY_AUTOUSECONF_PAGE, + R_TTLS_USERNAME_INUSESTRING, + R_TTLS_USERNAME_AUTOUSECONF_TEXTS, + ordinal++, + *iUiData->GetUseManualUsername() ); + + iSettingArray->AddTextItemL( iUiData->GetManualUsername(), + ETtlsTabSheetSettingsUsername, + R_TTLS_USERNAME_STRING, + R_TTLS_USERNAME_PAGE, + NULL, + ordinal++ ); + + iSettingArray->AddBinarySettingItemL( R_TTLS_DISPLAY_AUTOUSECONF_PAGE, + R_TTLS_REALM_INUSESTRING, + R_TTLS_REALM_AUTOUSECONF_TEXTS, + ordinal++, + *iUiData->GetUseManualRealm() ); + + iSettingArray->AddTextItemL( iUiData->GetManualRealm(), + ETtlsTabSheetSettingsRealm, + R_TTLS_REALM_STRING, + R_TTLS_REALM_PAGE, + NULL, + ordinal++ ); + + iSettingArray->AddBinarySettingItemL( R_TTLS_DISPLAY_AUTOUSECONF_PAGE, + R_TTLS_TLS_PRIVACY_STRING, + R_TTLS_TLS_PRIVACY_AUTOUSECONF_TEXTS, + ordinal++, + *iUiData->GetTlsPrivacy() ); + + iSettingListBox->Model()->SetItemTextArray( iSettingArray->Array() ); + iSettingListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray ); + iSettingArray->Array()->RecalculateVisibleIndicesL(); + iSettingListBox->HandleItemAdditionL(); + iSettingListBox->UpdateScrollBarsL(); + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::DynInitMenuPaneL +// ----------------------------------------------------------------------------- +// +void CEapTtlsUiDialog::DynInitMenuPaneL( TInt aResourceId, + CEikMenuPane* aMenuPane ) + { + CAknDialog::DynInitMenuPaneL( aResourceId, aMenuPane ); + + if ( aMenuPane && aResourceId == R_TTLS_MENU_PANE ) + { + if ( !FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + aMenuPane->DeleteMenuItem( EAknCmdHelp ); + } + + TPageIds index = static_cast( ActivePageIndex() ); + if ( index == ESettingsPage ) + { + aMenuPane->SetItemDimmed( ETtlsUiCmdEnable, ETrue ); + aMenuPane->SetItemDimmed( ETtlsUiCmdDisable, ETrue ); + aMenuPane->SetItemDimmed( ETtlsUiCmdConfigure, ETrue ); + aMenuPane->SetItemDimmed( ETtlsUiCmdMoveUp, ETrue ); + aMenuPane->SetItemDimmed( ETtlsUiCmdMoveDown, ETrue ); + } + else if ( index == EEapTypePage ) + { + aMenuPane->SetItemDimmed( ETtlsUiCmdChange, ETrue ); + + if ( iEapTypeViewArray->Count() > 0 ) + { + TInt currentIndex = iEapTypesListBox->CurrentItemIndex(); + TBool enabled = iUiEapTypes->At( currentIndex ).iIsEnabled; + + // Hide either "Enable" or "Disable", as appropriate. + aMenuPane->SetItemDimmed( ETtlsUiCmdEnable, enabled ); + aMenuPane->SetItemDimmed( ETtlsUiCmdDisable, !enabled ); + + // Don't display "Configure" for disabled items + aMenuPane->SetItemDimmed( ETtlsUiCmdConfigure, !enabled ); + + // Don't display "Raise priority" nor "Lower priority" for + // disabled items + aMenuPane->SetItemDimmed( ETtlsUiCmdMoveUp, !enabled ); + aMenuPane->SetItemDimmed( ETtlsUiCmdMoveDown, !enabled ); + + if ( enabled ) + { + if ( currentIndex == 0 ) + { + // Can't go higher than top. + aMenuPane->SetItemDimmed( ETtlsUiCmdMoveUp, ETrue ); + } + else if ( currentIndex == iEapTypeViewArray->Count()-1 || + ( currentIndex < iEapTypeViewArray->Count()-1 && + !iUiEapTypes->At( currentIndex + 1 ).iIsEnabled ) ) + { + // Can't go lower than the last enabled item + aMenuPane->SetItemDimmed( ETtlsUiCmdMoveDown, ETrue ); + } + } + + } + else + { + aMenuPane->SetItemDimmed( ETtlsUiCmdEnable, ETrue ); + aMenuPane->SetItemDimmed( ETtlsUiCmdDisable, ETrue ); + aMenuPane->SetItemDimmed( ETtlsUiCmdConfigure, ETrue ); + aMenuPane->SetItemDimmed( ETtlsUiCmdMoveUp, ETrue ); + aMenuPane->SetItemDimmed( ETtlsUiCmdMoveDown, ETrue ); + aMenuPane->SetItemDimmed( ETtlsUiCmdChange, ETrue ); + } + } + else if ( index == ECipherSuitePage ) + { + aMenuPane->SetItemDimmed( ETtlsUiCmdConfigure, ETrue ); + aMenuPane->SetItemDimmed( ETtlsUiCmdMoveUp, ETrue ); + aMenuPane->SetItemDimmed( ETtlsUiCmdMoveDown, ETrue ); + aMenuPane->SetItemDimmed( ETtlsUiCmdChange, ETrue ); + + if ( iCipherSuitesViewArray->Count() > 0 ) + { + TInt currIndex = iCipherSuiteListBox->CurrentItemIndex(); + TBool enabled = iUiCipherSuites->At( currIndex ).iIsEnabled; + + // Hide either "Enable" or "Disable", as appropriate. + aMenuPane->SetItemDimmed( ETtlsUiCmdEnable, enabled ); + aMenuPane->SetItemDimmed( ETtlsUiCmdDisable, !enabled ); + } + else + { + aMenuPane->SetItemDimmed( ETtlsUiCmdEnable, ETrue ); + aMenuPane->SetItemDimmed( ETtlsUiCmdDisable, ETrue ); + } + } + } + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::ProcessCommandL +// ----------------------------------------------------------------------------- +// +void CEapTtlsUiDialog::ProcessCommandL( TInt aCommand ) + { + if ( MenuShowing() ) + { + HideMenu(); + } + + TPageIds pageIndex = static_cast( ActivePageIndex() ); + switch( aCommand ) + { + case EAknCmdExit: + { + TryExitL( aCommand ); + break; + } + + case EAknCmdHelp: + { + HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), + iEikonEnv->EikAppUi()->AppHelpContextL() ); + break; + } + + case ETtlsUiCmdChange: + { + if ( pageIndex == ESettingsPage ) + { + if( iIsUIConstructionCompleted ) + { + ShowSettingPageL( ETrue ); + } + else + { + #if defined(_DEBUG) || defined(DEBUG) + RDebug::Print(_L("CEapTtlsUiDialog::ProcessCommandL - UI not ready - Ignoring key press.\n") ); + #endif + } + } + break; + } + + case ETtlsUiCmdMoveUp: + { + if ( pageIndex == EEapTypePage ) + { + TInt cur = iEapTypesListBox->CurrentItemIndex(); + MoveEapTypeL( cur, cur - 1 ); + } + break; + } + + case ETtlsUiCmdMoveDown: + { + if ( pageIndex == EEapTypePage ) + { + TInt cur = iEapTypesListBox->CurrentItemIndex(); + MoveEapTypeL( cur, cur + 1 ); + } + break; + } + + case ETtlsUiCmdEnable: + { + if ( pageIndex == ECipherSuitePage ) + { + TInt index = iCipherSuiteListBox->CurrentItemIndex(); + iUiCipherSuites->At( index ).iIsEnabled = ETrue; + iCipherSuites->Update(); + DrawCipherSuitesL(); + CEikButtonGroupContainer& cba = ButtonGroupContainer(); + cba.SetCommandSetL( R_TTLS_UI_SOFTKEYS_OPTIONS_BACK_DISABLE ); + cba.DrawDeferred(); + } + else if ( pageIndex == EEapTypePage ) + { + TInt cur = iEapTypesListBox->CurrentItemIndex(); + iUiEapTypes->At( cur ).iIsEnabled = ETrue; + + iEapTypes->Update(); + + // enabling moves item to the top of the list + MoveEapTypeL( cur, 0 ); + + // load the new CBA from resource + CEikButtonGroupContainer& cba = ButtonGroupContainer(); + cba.SetCommandSetL( R_TTLS_UI_SOFTKEYS_OPTIONS_BACK_CONFIGURE ); + cba.DrawDeferred(); + } + break; + } + + case ETtlsUiCmdDisable: + { + if ( pageIndex == ECipherSuitePage ) + { + TInt index = iCipherSuiteListBox->CurrentItemIndex(); + iUiCipherSuites->At( index ).iIsEnabled = EFalse; + iCipherSuites->Update(); + DrawCipherSuitesL(); + CEikButtonGroupContainer& cba = ButtonGroupContainer(); + cba.SetCommandSetL( R_TTLS_UI_SOFTKEYS_OPTIONS_BACK_ENABLE ); + cba.DrawDeferred(); + } + else if ( pageIndex == EEapTypePage ) + { + TInt itemIndex = iEapTypesListBox->CurrentItemIndex(); + + if( GetEnabledEapTypeCount() > KMinEnabledCount ) + { + // disabling moves item just after the last enabled one, + // so find that position + TInt next = itemIndex; + + while ( next < iUiEapTypes->Count() - 1 && + iUiEapTypes->At( next ).iIsEnabled ) + { + ++next; + } + + if ( next > itemIndex && + !iUiEapTypes->At( next ).iIsEnabled ) + { + --next; + } + + + iUiEapTypes->At( itemIndex ).iIsEnabled = EFalse; + + // move item if needed + MoveEapTypeL( itemIndex, next ); + iEapTypes->Update(); + + // Highlight follows movement. + //iEapTypesListBox->SetCurrentItemIndex( next ); + + // load the new CBA from resource + CEikButtonGroupContainer& cba = ButtonGroupContainer(); + cba.SetCommandSetL( + R_TTLS_UI_SOFTKEYS_OPTIONS_BACK_ENABLE ); + cba.DrawDeferred(); + } + else + { + HBufC* stringLabel; + stringLabel = StringLoader::LoadL( + R_TTLS_INFO_CANNOT_DISABLE_ALL_EAP_PLUGINS, + iEikonEnv ); + CleanupStack::PushL( stringLabel ); + CAknInformationNote* dialog = new ( ELeave ) + CAknInformationNote( ETrue ); + dialog->ExecuteLD( *stringLabel ); + CleanupStack::PopAndDestroy( stringLabel ); + } + } + break; + } + + case ETtlsUiCmdConfigure: + { + if ( pageIndex == EEapTypePage ) + { + ConfigureL(EFalse); + } + break; + } + + default: + { + break; + } + } + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::PageChangedL +// ----------------------------------------------------------------------------- +// +void CEapTtlsUiDialog::PageChangedL( TInt aPageId ) + { + if ( !iIsUIConstructionCompleted ) + { + return; + } + + if ( aPageId == KEAPTTLSSETTINGSPAGE ) + { + if (iSettingListBox->ScrollBarFrame()) + { + iSettingListBox->ScrollBarFrame()->ComponentControl(0)->MakeVisible(ETrue); + } + if (iEapTypesListBox->ScrollBarFrame()) + { + iEapTypesListBox->ScrollBarFrame()->ComponentControl(0)->MakeVisible(EFalse); + } + if (iCipherSuiteListBox->ScrollBarFrame()) + { + iCipherSuiteListBox->ScrollBarFrame()->ComponentControl(0)->MakeVisible(EFalse); + } + } + else if ( aPageId == KEAPTTLSEAPPAGE ) + { + if (iSettingListBox->ScrollBarFrame()) + { + iSettingListBox->ScrollBarFrame()->ComponentControl(0)->MakeVisible(EFalse); + } + if (iEapTypesListBox->ScrollBarFrame()) + { + iEapTypesListBox->ScrollBarFrame()->ComponentControl(0)->MakeVisible(ETrue); + } + if (iCipherSuiteListBox->ScrollBarFrame()) + { + iCipherSuiteListBox->ScrollBarFrame()->ComponentControl(0)->MakeVisible(EFalse); + } + } + else if ( aPageId == KEAPTTLSCIPHERPAGE ) + { + if (iSettingListBox->ScrollBarFrame()) + { + iSettingListBox->ScrollBarFrame()->ComponentControl(0)->MakeVisible(EFalse); + } + if (iEapTypesListBox->ScrollBarFrame()) + { + iEapTypesListBox->ScrollBarFrame()->ComponentControl(0)->MakeVisible(EFalse); + } + if (iCipherSuiteListBox->ScrollBarFrame()) + { + iCipherSuiteListBox->ScrollBarFrame()->ComponentControl(0)->MakeVisible(ETrue); + } + } + + CEikButtonGroupContainer& cba = ButtonGroupContainer(); + if( aPageId == KEAPTTLSSETTINGSPAGE ) + { + cba.SetCommandSetL( R_TTLS_UI_SOFTKEYS_OPTIONS_BACK_EDIT ); + } + else if( aPageId == KEAPTTLSEAPPAGE ) + { + cba.SetCommandSetL( R_TTLS_UI_SOFTKEYS_OPTIONS_BACK_CONFIGURE ); + } + else if( aPageId == KEAPTTLSCIPHERPAGE ) + { + TInt index = iCipherSuiteListBox->CurrentItemIndex(); + if( ( *iUiCipherSuites )[ index ].iIsEnabled ) + { + cba.SetCommandSetL( R_TTLS_UI_SOFTKEYS_OPTIONS_BACK_DISABLE ); + } + else + { + cba.SetCommandSetL( R_TTLS_UI_SOFTKEYS_OPTIONS_BACK_ENABLE ); + } + } + cba.DrawDeferred(); + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::ShowSettingPageL +// ----------------------------------------------------------------------------- +// +void CEapTtlsUiDialog::ShowSettingPageL( TInt aCalledFromMenu ) + { + TInt index = iSettingListBox->CurrentItemIndex(); + if ( index == EUserCertificateItem ) + { + TInt activeUserCertificate = CheckActiveUserCertificate(); + CDesCArrayFlat* tempArray = new( ELeave )CDesCArrayFlat( + KCertificateArrayGranularity ); + CleanupStack::PushL( tempArray ); + + TDesC* noneText = iEikonEnv->AllocReadResourceLC( + R_TTLS_NONE_SELECTION ); + tempArray->InsertL( 0, *noneText ); + CleanupStack::PopAndDestroy( noneText ); + + for ( TInt i = 0; i < iUiUserCertificates->Count() ; i++ ) + { + TEapTlsPeapUiCertificate certificate = + iUiUserCertificates->At( i ); + SCertEntry entry = certificate.iCertEntry; + TBuf text; + GetFullCertLabelL( entry, text); + tempArray->InsertL( i+1, text ); + } + TInt selected( 0 ); + if ( activeUserCertificate == KErrNotFound ) + { + selected = ShowRadioButtonSettingPageL( R_TTLS_USER_CERT_STRING, + tempArray, 0 ); + } + else + { + selected = ShowRadioButtonSettingPageL( R_TTLS_USER_CERT_STRING, + tempArray, + activeUserCertificate+1 ); + //Plus 1 cause we added 'none' selection + } + + CleanupStack::PopAndDestroy( tempArray ); + UserCertificateHouseKeeping( selected ); + iCertificates->Update(); + DrawSettingsListL(); // List must be drawn again at this stage + } + else if ( index == ECaCertificateItem ) + { + TInt activeCaCertificate = CheckActiveCaCertificate(); + + CDesCArrayFlat* tempArray = new( ELeave )CDesCArrayFlat( + KCertificateArrayGranularity ); + CleanupStack::PushL( tempArray ); + + TDesC* noneText = iEikonEnv->AllocReadResourceLC( + R_TTLS_NONE_SELECTION ); + tempArray->InsertL( 0, *noneText ); + CleanupStack::PopAndDestroy( noneText ); + + for ( TInt i = 0; i < iUiCACertificates->Count(); i++ ) + { + TEapTlsPeapUiCertificate certificate = iUiCACertificates->At( i ); + SCertEntry entry = certificate.iCertEntry; + TBuf text; + GetFullCertLabelL( entry, text ); + tempArray->InsertL( i+1, text ); + } + + TInt selected( 0 ); + if ( activeCaCertificate == KErrNotFound ) + { + selected = ShowRadioButtonSettingPageL( R_TTLS_CA_CERT_STRING, + tempArray, 0 ); + } + else + { + selected = ShowRadioButtonSettingPageL( R_TTLS_CA_CERT_STRING, + tempArray, + activeCaCertificate+1 ); + //Plus 1 cause we added 'none' selection + } + CleanupStack::PopAndDestroy( tempArray ); + CaCertificateHouseKeeping( selected ); + iCertificates->Update(); + DrawSettingsListL(); // List must be drawn again at this stage + } + else + { + CAknSettingItem* item = iSettingArray->Array()->At( index ); + item->EditItemL( aCalledFromMenu ); + item->StoreL(); + } + + DrawNow(); + } + + +// ----------------------------------------------------------------------------- +// CEapPeapUiDialog::MoveEapTypeL +// ----------------------------------------------------------------------------- +// +void CEapTtlsUiDialog::MoveEapTypeL( TInt aOldPos, TInt aNewPos ) + { + TEapTlsPeapUiEapType originalUpper = iUiEapTypes->At( aOldPos ); + iUiEapTypes->Delete( aOldPos ); + iUiEapTypes->InsertL( aNewPos, originalUpper ); + iUiEapTypes->Compress(); // Might not be needed + iEapTypes->Update(); + DrawEapListL( aNewPos ); + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::DrawEapListL +// ----------------------------------------------------------------------------- +// +void CEapTtlsUiDialog::DrawEapListL( TInt aWantedIndex ) + { + iEapTypeViewArray->Reset(); + RImplInfoPtrArray eapArray; + eapArray.Reset(); + + REComSession::ListImplementationsL( KEapTypeInterfaceUid, eapArray ); + for ( TInt i = 0; i < iUiEapTypes->Count(); i++ ) + { + TBuf tempLine; + + if ( iUiEapTypes->At( i ).iIsEnabled ) + { + _LIT( KNumTab, "%d\t" ); + tempLine.AppendFormat( KNumTab, i+1 ); + } + else + { + _LIT( KTab, "\t" ); + tempLine.Append( KTab ); + } + + for ( TInt index = 0; index < eapArray.Count(); index++ ) + { + if ( eapArray[index]->DataType() == iUiEapTypes->At( i ).iEapType ) + { + tempLine.Append( eapArray[index]->DisplayName() ); + break; + } + } + + if ( iUiEapTypes->At( i ).iIsEnabled ) + { // Add mark icon to indicate that the eap type is enabled + _LIT( KTab0, "\t0" ); + tempLine.Append( KTab0 ); + } + + iEapTypeViewArray->InsertL( i, tempLine ); + } + + eapArray.ResetAndDestroy(); + iEapTypesListBox->Model()->SetItemTextArray( iEapTypeViewArray ); + iEapTypesListBox->HandleItemAdditionL(); + iEapTypesListBox->SetCurrentItemIndex( aWantedIndex ); + iEapTypesListBox->DrawDeferred(); + iEapTypesListBox->UpdateScrollBarsL(); + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::ShowRadioButtonSettingPageL +// ----------------------------------------------------------------------------- +// +TInt CEapTtlsUiDialog::ShowRadioButtonSettingPageL( TInt aTitle, + CDesCArrayFlat* aValues, + TInt aCurrentItem ) + { + // title of the dialog + HBufC* title = iCoeEnv->AllocReadResourceLC( aTitle ); + + // We have everything to create dialog + CAknRadioButtonSettingPage* dlg = new( ELeave )CAknRadioButtonSettingPage( + R_RADIO_BUTTON_SETTING_PAGE, + aCurrentItem, + aValues ); + CleanupStack::PushL( dlg ); + dlg->SetSettingTextL( *title ); + CleanupStack::Pop( dlg ); + dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ); + CleanupStack::PopAndDestroy( title ); // title + // index must be re-turned upside down, because options list is upside down + return aCurrentItem; + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::DrawCipherSuitesL +// ----------------------------------------------------------------------------- +// +void CEapTtlsUiDialog::DrawCipherSuitesL() + { + iCipherSuitesViewArray->Reset(); + TInt listCount( 0 ); + TBuf temp; + for ( TInt i = 0; i < iUiCipherSuites->Count(); i++ ) + { + temp.Zero(); + _LIT( KTab, "\t" ); + temp.Append( KTab ); + + TEapTlsPeapUiCipherSuite suite = iUiCipherSuites->At( i ); + TUint32 suiteId = suite.iCipherSuite; + + switch( suiteId ) + { + case 0x0004: + { + HBufC* suite = iCoeEnv->AllocReadResourceLC( + R_TTLS_SUITE_RSARC4MD5 ); + temp.Append( *suite ); + CleanupStack::PopAndDestroy( suite ); + break; + } + + case 0x0005: + { + HBufC* suite = iCoeEnv->AllocReadResourceLC( + R_TTLS_SUITE_RSARC4SHA ); + temp.Append( *suite ); + CleanupStack::PopAndDestroy( suite ); + break; + } + + case 0x000a: + { + HBufC* suite = iCoeEnv->AllocReadResourceLC( + R_TTLS_SUITE_RSA3DESSHA ); + temp.Append( *suite ); + CleanupStack::PopAndDestroy( suite ); + break; + } + + case 0x0016: + { + HBufC* suite = iCoeEnv->AllocReadResourceLC( + R_TTLS_SUITE_DHERSA3DESSHA ); + temp.Append( *suite ); + CleanupStack::PopAndDestroy( suite ); + break; + } + + case 0x0013: + { + HBufC* suite = iCoeEnv->AllocReadResourceLC( + R_TTLS_SUITE_DHEDSS3DESSHA ); + temp.Append( *suite ); + CleanupStack::PopAndDestroy( suite ); + break; + } + + case 0x002F: + { + HBufC* suite = iCoeEnv->AllocReadResourceLC( + R_TTLS_SUITE_RSAAESSHA ); + temp.Append( *suite ); + CleanupStack::PopAndDestroy( suite ); + break; + } + + case 0x0032: + { + HBufC* suite = iCoeEnv->AllocReadResourceLC( + R_TTLS_SUITE_DHERSAAESSHA ); + temp.Append( *suite ); + CleanupStack::PopAndDestroy( suite ); + break; + } + + case 0x0033: + { + HBufC* suite = iCoeEnv->AllocReadResourceLC( + R_TTLS_SUITE_DHEDSSAESSHA ); + temp.Append( *suite ); + CleanupStack::PopAndDestroy( suite ); + break; + } + + default: + { + temp.Append( KEmptyString ); + break; + } + } + + if ( iUiCipherSuites->At( i ).iIsEnabled ) + { // Add mark icon to indicate that the suite is enabled + _LIT( KTab0, "\t0" ); + temp.Append( KTab0 ); + } + + iCipherSuitesViewArray->InsertL( listCount, temp ); + listCount++; + } + + iCipherSuiteListBox->Model()->SetItemTextArray( iCipherSuitesViewArray ); + iCipherSuiteListBox->HandleItemAdditionL(); + iCipherSuiteListBox->DrawDeferred(); + iCipherSuiteListBox->UpdateScrollBarsL(); + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::CheckActiveUserCertificate +// ----------------------------------------------------------------------------- +// +TInt CEapTtlsUiDialog::CheckActiveUserCertificate() + { + for ( TInt i = 0; i < iUiUserCertificates->Count(); i++ ) + { + if ( iUiUserCertificates->At( i ).iIsEnabled ) + { + return i; + } + } + + return KErrNotFound; + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::CheckActiveCaCertificate +// ----------------------------------------------------------------------------- +// +TInt CEapTtlsUiDialog::CheckActiveCaCertificate() + { + for ( TInt i = 0; i < iUiCACertificates->Count(); i++ ) + { + if ( iUiCACertificates->At( i ).iIsEnabled ) + { + return i; + } + } + + return KErrNotFound; + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::UserCertificateHouseKeeping +// ----------------------------------------------------------------------------- +// +void CEapTtlsUiDialog::UserCertificateHouseKeeping( TInt aSelected ) + { + for ( TInt i = 0; i < iUiUserCertificates->Count(); i++ ) + { + iUiUserCertificates->At( i ).iIsEnabled = EFalse; + } + + if ( aSelected != 0 ) // Zero index is none + { + iUiUserCertificates->At( aSelected-1 ).iIsEnabled = ETrue; + } + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::CaCertificateHouseKeeping +// ----------------------------------------------------------------------------- +// +void CEapTtlsUiDialog::CaCertificateHouseKeeping( TInt aSelected ) + { + for ( TInt i = 0; i < iUiCACertificates->Count(); i++ ) + { + iUiCACertificates->At( i ).iIsEnabled = EFalse; + } + + if ( aSelected != 0 ) // Zero index is none + { + iUiCACertificates->At( aSelected-1 ).iIsEnabled = ETrue; + } + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::CreateEapTypeDataBaseL +// ----------------------------------------------------------------------------- +// +void CEapTtlsUiDialog::CreateEapTypeDataBaseL() + { + RImplInfoPtrArray eapArray; + eapArray.Reset(); + + REComSession::ListImplementationsL( KEapTypeInterfaceUid, eapArray ); + TInt allowedInTtlsCount( 0 ); + for ( TInt i = 0; i < eapArray.Count(); i++ ) + { + if ( !CEapType::IsDisallowedInsideTTLS(*eapArray[i]) ) + { + CImplementationInformation* info = eapArray[i]; + TEapTlsPeapUiEapType tempEapType; + tempEapType.iEapType = info->DataType(); + + // BINARY RESOURCE DATA + + // [FE] [00 00 00] [TEapType_bigendian] + // OR + // [FE] [FF FF FF] [MSCHAPv2_bigendian] + + _LIT8( KExpEapFirstQuad, "\xFE\0\0\0" ); + TPtrC8 firstQuad( tempEapType.iEapType.Ptr(), 4 ); + // TUint32 dataType = BigEndian::Get32( tempEapType.iEapType.Ptr()+4 ); + TUint32 dataType = ( tempEapType.iEapType[4] << 24 ) | + ( tempEapType.iEapType[5] << 16 ) | + ( tempEapType.iEapType[6] << 8 ) | + tempEapType.iEapType[7]; + + + if ( !firstQuad.Compare( KExpEapFirstQuad ) && + ( dataType == EAPSettings::EEapSim || + dataType == EAPSettings::EEapAka ) ) + { + tempEapType.iIsEnabled = ETrue; + iUiEapTypes->InsertL( KFirstElement, tempEapType ); + } + else + { + tempEapType.iIsEnabled = EFalse; + iUiEapTypes->InsertL( allowedInTtlsCount, tempEapType ); + } + + allowedInTtlsCount++; + } + } + + __ASSERT_DEBUG( iUiEapTypes->Count() >= 2, User::Panic( _L("EAP-SIM/AKA missing"), 1) ); + + // Check if EAP-SIM and EAP-AKA are in correct order + + // BINARY RESOURCE DATA + const TDesC8& firstEap = iUiEapTypes->At( KFirstElement ).iEapType; + const TDesC8& secondEap = iUiEapTypes->At( KSecondElement ).iEapType; + + TUint32 dataTypeFirst = ( firstEap[4] << 24 ) | + ( firstEap[5] << 16 ) | + ( firstEap[6] << 8 ) | + firstEap[7]; + TUint32 dataTypeSecond = ( secondEap[4] << 24 ) | + ( secondEap[5] << 16 ) | + ( secondEap[6] << 8 ) | + secondEap[7]; + + // If not, switch them + if ( dataTypeFirst == EAPSettings::EEapAka && + dataTypeSecond == EAPSettings::EEapSim ) + { + TEapTlsPeapUiEapType tempEapType = iUiEapTypes->At( KFirstElement ); + iUiEapTypes->Delete( KFirstElement ); + iUiEapTypes->InsertL( KSecondElement, tempEapType ); + } + + iEapTypes->Update(); + eapArray.ResetAndDestroy(); + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::SetCipherIconsL +// ----------------------------------------------------------------------------- +// +void CEapTtlsUiDialog::SetCipherIconsL() + { + CArrayPtr< CGulIcon >* icons = new( ELeave ) CAknIconArray( 1 ); + CleanupStack::PushL( icons ); + + MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance(); + + CGulIcon* icon = CGulIcon::NewLC(); + CFbsBitmap* bitmap = NULL; + CFbsBitmap* mask = NULL; + AknsUtils::CreateColorIconL( skinInstance, + KAknsIIDQgnIndiMarkedAdd, + KAknsIIDQsnIconColors, + EAknsCIQsnIconColorsCG13, + bitmap, + mask, + AknIconUtils::AvkonIconFileName(), + EMbmAvkonQgn_indi_marked_add, + EMbmAvkonQgn_indi_marked_add_mask, + KRgbBlack ); + icon->SetBitmap( bitmap ); + icon->SetMask( mask ); + icons->AppendL( icon ); + + CleanupStack::Pop( icon ); + CleanupStack::Pop( icons ); // icons + + iCipherSuiteListBox->ItemDrawer()->ColumnData()->SetIconArray( icons ); + + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::SetEapIconsL +// ----------------------------------------------------------------------------- +// +void CEapTtlsUiDialog::SetEapIconsL() + { + CArrayPtr< CGulIcon >* icons = new( ELeave ) CAknIconArray( 1 ); + CleanupStack::PushL( icons ); + + MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance(); + + CGulIcon* icon = CGulIcon::NewLC(); + CFbsBitmap* bitmap = NULL; + CFbsBitmap* mask = NULL; + AknsUtils::CreateColorIconL( skinInstance, + KAknsIIDQgnIndiMarkedAdd, + KAknsIIDQsnIconColors, + EAknsCIQsnIconColorsCG13, + bitmap, + mask, + AknIconUtils::AvkonIconFileName(), + EMbmAvkonQgn_indi_marked_add, + EMbmAvkonQgn_indi_marked_add_mask, + KRgbBlack ); + icon->SetBitmap( bitmap ); + icon->SetMask( mask ); + icons->AppendL( icon ); + + CleanupStack::Pop( icon ); + CleanupStack::Pop( icons ); // icons + + iEapTypesListBox->ItemDrawer()->ColumnData()->SetIconArray( icons ); + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::GetEnabledEapTypeCount +// ----------------------------------------------------------------------------- +// +TUint CEapTtlsUiDialog::GetEnabledEapTypeCount() + { + TUint itemCount( 0 ); + for( TInt i( 0 ); i < iUiEapTypes->Count(); ++i ) + { + if( iUiEapTypes->At( i ).iIsEnabled ) + { + ++itemCount; + } + } + return itemCount; + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::IsPlainMschapv2Enabled +// ----------------------------------------------------------------------------- +// +TBool CEapTtlsUiDialog::IsPlainMschapv2Enabled() + { + TBool isEnabled( EFalse ); + for( TUint i( 0 ); i < iUiEapTypes->Count(); ++i ) + { + // was: _LIT8( KPlainMsChapV2ExpandedId, "\xFE\xFF\xFF\xFF\0\0\0\x1A" ); + // workaround: + _LIT8( KPlainMsChapV2ExpandedId, "\xFE\xFF\xFF\xFF\0\0\0\x63" ); + + const TDesC8& currEap = iUiEapTypes->At( i ).iEapType; + + if ( !currEap.Compare( KPlainMsChapV2ExpandedId ) ) + { + isEnabled = iUiEapTypes->At( i ).iIsEnabled; + break; + } + + } + return isEnabled; + } + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::IsPapEnabled +// ----------------------------------------------------------------------------- +// +TBool CEapTtlsUiDialog::IsPapEnabled() + { + TBool isEnabled( EFalse ); + for( TUint i( 0 ); i < iUiEapTypes->Count(); ++i ) + { + _LIT8( KPapExpandedId, "\xFE\xFF\xFF\xFF\0\0\0\x62" ); + const TDesC8& currEap = iUiEapTypes->At( i ).iEapType; + if ( !currEap.Compare( KPapExpandedId ) ) + { + isEnabled = iUiEapTypes->At( i ).iIsEnabled; + break; + } + } + return isEnabled; + } + + +// ----------------------------------------------------------------------------- +// CEapTtlsUiDialog::GetHelpContext +// ----------------------------------------------------------------------------- +// +void CEapTtlsUiDialog::GetHelpContext( TCoeHelpContext& aContext ) const + { + aContext.iMajor = KHelpUidPlugin; + TPageIds index = static_cast( ActivePageIndex() ); + switch ( index ) + { + case EEapTypePage: + { + aContext.iContext = KSET_HLP_WLAN_EAP_TTLS_TYPES; + break; + } + + case ECipherSuitePage: + { + aContext.iContext = KSET_HLP_WLAN_EAP_TTLS_SUITES; + break; + } + + default: + { + aContext.iContext = KSET_HLP_WLAN_EAP_TTLS_SETT; + break; + } + } + } + + +void CEapTtlsUiDialog::GetFullCertLabelL( const SCertEntry& aCert, + TDes& aFullLabel ) + { + TInt length = 0; + + // For label. + length += aCert.iLabel.Length(); + + // For separator between label and primary name. + length += KNameSeparator.iTypeLength; + + // For primary name. + length += aCert.iPrimaryName.Length(); + + if ( !( aCert.iLabel.Length() ) ) + { + // For secondary name. + length += aCert.iSecondaryName.Length(); + } + + if( length > aFullLabel.MaxLength() ) + { +#if defined(_DEBUG) || defined(DEBUG) + RDebug::Print(_L("CEapTtlsUiDialog::GetFullCertLabelL - ERROR! Length Mismatch in Certificate's full name\n") ); +#endif + } + + HBufC* label = HBufC::NewL( length ); + label->Des().Append( aCert.iLabel ); + + label->Des().Append( KNameSeparator ); + label->Des().Append( aCert.iPrimaryName ); + + if ( !( aCert.iLabel.Length() ) ) + { + // Secondary name, only if no label. Certificate manager does the same way. + label->Des().Append( aCert.iSecondaryName ); + } + + aFullLabel.Copy( label->Des().Left( aFullLabel.MaxLength() ) ); + + delete label; + label = NULL; + } + + +// End of file