wlansecuritysettings/wapisecuritysettingsui/src/wapisecuritysettingsdlg.cpp
changeset 17 8840d3e38314
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wlansecuritysettings/wapisecuritysettingsui/src/wapisecuritysettingsdlg.cpp	Fri Mar 19 09:29:58 2010 +0200
@@ -0,0 +1,1074 @@
+/*
+* ============================================================================
+*  Name     : wapisecuritysettingsdlg.cpp
+*  Part of  : WAPI Security Settings UI
+*
+*  Description:
+*     Implementation of dialog.
+*
+*  Version: %version:  16 %
+*
+*  Copyright (C) 2008 Nokia Corporation.
+*  This material, including documentation and any related 
+*  computer programs, is protected by copyright controlled by 
+*  Nokia Corporation. All rights are reserved. Copying, 
+*  including reproducing, storing,  adapting or translating, any 
+*  or all of this material requires the prior written consent of 
+*  Nokia Corporation. This material also contains confidential 
+*  information which may not be disclosed to others without the 
+*  prior written consent of Nokia Corporation.
+*
+* ============================================================================
+*/
+
+// INCLUDE FILES
+#include <aknnavide.h>
+#include <akntitle.h>
+#include <aknradiobuttonsettingpage.h>
+#include <akntextsettingpage.h>
+#include <aknmfnesettingpage.h>
+#include <barsread.h>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+
+#include <wapisecuritysettingsui.h>
+#include <wapisecuritysettingsui.rsg>
+#include "wapisecuritysettingsimpl.h"
+#include "wapisecuritysettingsuipanic.h"
+#include "wapisecuritysettingsdlg.h"
+#include "wapisecuritysettingsui.hrh"
+
+#include <hlplch.h>
+#include <csxhelp/wapi.hlp.hrh>
+
+#include <featmgr.h>
+
+
+// CONSTANT DECLARATIONS
+
+// Number of fields of main view
+LOCAL_D const TInt KNumOfFieldsMain = 3;
+
+LOCAL_D const TInt KTitles_Wapi_Main_Cert[KNumOfFieldsMain] =
+                   {
+                   R_WAPI_AUTH,
+                   R_WAPI_CLIENT_CERT,
+                   R_WAPI_ROOT_CERT
+                   };
+LOCAL_D const TInt KFields_Wapi_Main_Cert[KNumOfFieldsMain] =
+                   {
+                   CWAPISecuritySettingsDlg::EWapiAuth,
+                   CWAPISecuritySettingsDlg::EWapiUserCert,
+                   CWAPISecuritySettingsDlg::EWapiCACert
+                   };
+
+LOCAL_D const TInt KTitles_Wapi_Main_PSK[KNumOfFieldsMain] =
+                   {
+                   R_WAPI_AUTH,
+                   R_WAPI_PRESHARED_KEY_FORMAT,
+                   R_WAPI_PRESHARED_KEY
+                   };
+LOCAL_D const TInt KFields_Wapi_Main_PSK[KNumOfFieldsMain] =
+                   {
+                   CWAPISecuritySettingsDlg::EWapiAuth,
+                   CWAPISecuritySettingsDlg::EWapiPSKFormat,
+                   CWAPISecuritySettingsDlg::EWapiPSK
+                   };
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CWAPISecuritySettingsDlg::CWAPISecuritySettingsDlg
+// ---------------------------------------------------------
+//
+CWAPISecuritySettingsDlg::CWAPISecuritySettingsDlg( TInt& aEventStore )
+: iEventStore( &aEventStore )
+    {
+    }
+
+
+// ---------------------------------------------------------
+// CWAPISecuritySettingsDlg::~CWAPISecuritySettingsDlg
+// ---------------------------------------------------------
+//
+CWAPISecuritySettingsDlg::~CWAPISecuritySettingsDlg()
+    {
+    if ( iTitlePane )
+        {
+        // set old text back, if we have it...
+        if ( iOldTitleText )
+            {
+            TRAP_IGNORE( iTitlePane->SetTextL( *iOldTitleText ) );
+            delete iOldTitleText;
+            }
+        }
+    FeatureManager::UnInitializeLib();
+     }
+
+
+// ---------------------------------------------------------
+// CWAPISecuritySettingsDlg::NewL
+// ---------------------------------------------------------
+//
+CWAPISecuritySettingsDlg* CWAPISecuritySettingsDlg::NewL( TInt& aEventStore )
+    {
+    CWAPISecuritySettingsDlg* secSett = 
+                        new ( ELeave )CWAPISecuritySettingsDlg( aEventStore );
+    return secSett;
+    }
+
+
+// ---------------------------------------------------------
+// CWAPISecuritySettingsDlg::ConstructAndRunLD
+// ---------------------------------------------------------
+//
+TInt CWAPISecuritySettingsDlg::ConstructAndRunLD( 
+                                CWAPISecuritySettingsImpl* aSecuritySettings,
+                                const TDesC& aTitle )
+    {
+	CleanupStack::PushL( this );
+
+	iSecuritySettings = aSecuritySettings;
+    iConnectionName = aTitle;
+
+    // Build menu according to current authentication scheme.
+    if (iSecuritySettings->GetAuthentication() == EWapiAuthPSK)
+        {
+        iFieldsMain = ( TWapiMember* ) KFields_Wapi_Main_PSK;
+        iTitlesMain = MUTABLE_CAST( TInt*, KTitles_Wapi_Main_PSK );
+        }
+    else // ... == EWapiAuthCert
+        {
+        iFieldsMain = ( TWapiMember* ) KFields_Wapi_Main_Cert;
+        iTitlesMain = MUTABLE_CAST( TInt*, KTitles_Wapi_Main_Cert );
+        }
+    
+    //Let's fetch pointers to the certificate arrays
+
+    iSecuritySettings->GetCertificateLabels( iUserCertificates, iCACertificates );
+
+    #if defined( _DEBUG ) || defined( DEBUG )
+    if ( iUserCertificates )
+        {
+        RDebug::Print(_L("CWAPISecuritySettingsDlg::ConstructAndRunLD, %d user certs"), iUserCertificates->Count() );
+        }
+    else
+        {
+        RDebug::Print(_L("CWAPISecuritySettingsDlg::ConstructAndRunLD, no user certs") );
+        }
+    
+    if ( iCACertificates )
+        {
+        RDebug::Print(_L("CWAPISecuritySettingsDlg::ConstructAndRunLD, %d ca certs"), iCACertificates->Count() );
+        }
+    else
+        {
+        RDebug::Print(_L("CWAPISecuritySettingsDlg::ConstructAndRunLD, no ca certs") );
+        }
+    #endif
+    
+    FeatureManager::InitializeLibL();
+
+    ConstructL( R_WAPI_SECURITY_SETTINGS_MENUBAR );
+    
+    // ExecuteLD will PushL( this ), so we have to Pop it...
+    CleanupStack::Pop( this ); // this
+    return ExecuteLD( R_WAPISETTINGS_DIALOG );
+    }
+
+
+// ---------------------------------------------------------
+// CWAPISecuritySettingsDlg::OkToExitL
+// ---------------------------------------------------------
+//
+TBool CWAPISecuritySettingsDlg::OkToExitL( TInt aButtonId )
+{
+    // Translate the button presses into commands for the appui & current
+    // view to handle
+    TBool retval( EFalse );
+    if ( aButtonId == EAknSoftkeyOptions )
+        {
+        DisplayMenuL();
+        }
+    else if ( aButtonId == EEikCmdExit )        // ShutDown requested
+        {
+        *iEventStore |= CWAPISecuritySettings::EShutDownReq;
+        retval = ETrue;
+        }
+    else if ( aButtonId == EAknSoftkeyBack || aButtonId == EAknCmdExit )
+        {
+        if (iSecuritySettings->GetAuthentication() == EWapiAuthPSK)
+            {
+            if (iSecuritySettings->IsValid())
+                {
+                *iEventStore |= CWAPISecuritySettings::EValid;
+                retval = ETrue;
+                }
+            else if ( aButtonId == EAknSoftkeyBack )
+                {
+                HBufC* stringHolder = StringLoader::LoadL(
+                                R_WAPI_QUEST_PRESHARED_KEY_DATA_MISSING, iEikonEnv );
+                CleanupStack::PushL( stringHolder );
+    
+                CAknQueryDialog *queryDialog = new (ELeave) CAknQueryDialog();
+    
+                queryDialog->PrepareLC( R_WAPI_SEC_SETT_CONF_QUERY );
+                queryDialog->SetPromptL( stringHolder->Des() );
+                retval = queryDialog->RunLD();
+    
+                CleanupStack::PopAndDestroy( stringHolder );   // stringHolder
+    
+                }
+            else
+                {
+                retval = ETrue;
+                }
+            }
+        else
+            {
+            *iEventStore |= CWAPISecuritySettings::EValid;
+            retval = ETrue;
+            }
+        
+        if ( aButtonId == EAknCmdExit )
+            {
+            *iEventStore |= CWAPISecuritySettings::EExitReq;
+            }
+        
+        }
+    else if( aButtonId == EWapiSelCmdChange )
+        {
+        ChangeSettingsL();
+        retval = EFalse; // don't exit the dialog
+        }
+
+    return retval;
+}
+
+
+// ---------------------------------------------------------
+// CWAPISecuritySettingsDlg::OfferKeyEventL
+// ---------------------------------------------------------
+//
+TKeyResponse CWAPISecuritySettingsDlg::OfferKeyEventL( 
+                                const TKeyEvent& aKeyEvent, TEventCode aType )
+    {
+    TKeyResponse retval( EKeyWasNotConsumed );
+    TChar charCode( aKeyEvent.iCode );
+
+    // Only interested in standard key events
+    if ( aType == EEventKey )
+        {
+        // If a menu is showing offer key events to it.
+        if ( CAknDialog::MenuShowing() )
+            {
+            retval = CAknDialog::OfferKeyEventL( aKeyEvent, aType );
+            }
+        else
+            {
+            if ( iList )
+                {
+                // as list IS consuming, must handle because it IS 
+                //the SHUTDOWN or, a view switch is shutting us down...
+                if ( aKeyEvent.iCode == EKeyEscape )
+                    {
+                    ProcessCommandL( EEikCmdExit );
+                    retval = EKeyWasConsumed;
+                    }
+                else
+                    {
+                    retval = iList->OfferKeyEventL( aKeyEvent, aType );
+                    }
+                }
+            else
+                {
+                if ( aKeyEvent.iCode == EKeyOK )
+                    {
+                    ProcessCommandL( EWapiSelCmdChange );
+                    retval = EKeyWasConsumed;
+                    }
+                }
+            }
+        }
+    return retval;
+    }
+
+
+// ---------------------------------------------------------
+// CWAPISecuritySettingsDlg::HandleListboxDataChangeL
+// ---------------------------------------------------------
+//
+void CWAPISecuritySettingsDlg::HandleListboxDataChangeL()
+    {
+    // fill up our new list with data
+    CDesCArrayFlat* itemArray = new ( ELeave ) CDesCArrayFlat( 4 );
+    CleanupStack::PushL( itemArray );
+
+    FillListWithDataL( *itemArray, *iFieldsMain, KNumOfFieldsMain, 
+            iTitlesMain );
+
+    iList->Model()->SetItemTextArray( itemArray );
+    
+    CleanupStack::Pop( itemArray ); // now it is owned by the LB, so pop it
+    iItemArray = itemArray;
+
+    iList->HandleItemAdditionL();
+    }
+
+
+// ---------------------------------------------------------
+// CWAPISecuritySettingsDlg::ProcessCommandL
+// ---------------------------------------------------------
+//
+void CWAPISecuritySettingsDlg::ProcessCommandL( TInt aCommandId )
+    {
+    if ( MenuShowing() )
+        {
+        HideMenu();
+        }
+
+    switch ( aCommandId )
+        {
+        case EWapiSelCmdChange:
+            {
+            ChangeSettingsL();
+            break;
+            }
+
+        case EWapiSelCmdReset:
+            {
+            TRAPD( err, iSecuritySettings->ResetCertificateStoreL() );
+
+            HBufC* label;
+                            
+            if ( err == KErrNone )
+                {
+                //Certificate store was emptied, RARRAY's were closed,
+                //pointer's were freed and certificates's in use were set
+                //to "None" when ResetcertificateStoreL was called.
+                //So we have to update the selections on the screen to
+                //"(Not defined)" and redraw
+                
+                //refresh pointers
+                iSecuritySettings->GetCertificateLabels( 
+                                      iUserCertificates, iCACertificates );
+                
+                
+                for ( TInt i = 0; i < KNumOfFieldsMain; i++ )
+                    {
+
+                    TWapiMember* ptr = iFieldsMain + i;
+                    TInt* tptr = iTitlesMain + i;
+                    
+                    UpdateListBoxItemL( *ptr, *tptr, i );
+                    *iEventStore |= CWAPISecuritySettings::EModified;
+
+                    iList->ScrollToMakeItemVisible( i );
+                    iList->DrawItem( i );
+                    }
+
+
+                
+                label = StringLoader::LoadL( R_WAPI_DONE, iEikonEnv );
+                }
+            else
+                {
+                label = StringLoader::LoadL( R_WAPI_FAILURE, iEikonEnv );
+                }
+
+            CleanupStack::PushL( label );
+            
+            CAknInformationNote* dialog = new (ELeave)CAknInformationNote( 
+                    ETrue );
+            dialog->ExecuteLD( *label );
+            
+            CleanupStack::PopAndDestroy( label );         
+
+            break;
+            }                  
+            
+        case EAknCmdHelp:
+            {
+            HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(),
+                                    iEikonEnv->EikAppUi()->AppHelpContextL() );
+            break;
+            }
+
+        case EAknSoftkeyBack:
+        case EAknCmdExit:
+        case EEikCmdExit:
+            {
+            TryExitL( aCommandId );
+            break;
+            }
+
+        default:
+            {
+            // silently ignore it
+            break;
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------
+// CWAPISecuritySettingsDlg::HandleListBoxEventL
+// ---------------------------------------------------------
+//
+void CWAPISecuritySettingsDlg::HandleListBoxEventL( CEikListBox* /*aListBox*/,
+                                                   TListBoxEvent aEventType )
+    {
+    switch ( aEventType )
+        {
+        case EEventEnterKeyPressed:
+        case EEventItemSingleClicked:
+            {
+            ChangeSettingsL();
+            break;
+            }
+
+        case EEventEditingStarted:
+        case EEventEditingStopped:
+        case EEventPenDownOnItem:
+        case EEventItemDraggingActioned:
+            {
+            break;
+            }
+
+        default:
+            {
+            __ASSERT_DEBUG( EFalse, Panic( EUnknownCase ) );
+            break;
+            };
+        };
+    }
+
+
+// ---------------------------------------------------------
+// CWAPISecuritySettingsDlg::PreLayoutDynInitL()
+// ---------------------------------------------------------
+//
+void CWAPISecuritySettingsDlg::PreLayoutDynInitL()
+    {
+    // first get StatusPane
+    CEikStatusPane* statusPane = iEikonEnv->AppUiFactory()->StatusPane();
+
+    // then get TitlePane
+    iTitlePane = ( CAknTitlePane* ) statusPane->ControlL( TUid::Uid( 
+                                                    EEikStatusPaneUidTitle ) );
+    // if not already stored, store it for restoring
+    if ( !iOldTitleText )
+        {
+        iOldTitleText = iTitlePane->Text()->AllocL();
+        }
+
+    // set new titlepane text
+    iTitlePane->SetTextL( iConnectionName );
+
+    iList = STATIC_CAST( CAknSettingStyleListBox*, 
+                         Control( KWapiMainSettingsListboxId ) );
+
+    iList->CreateScrollBarFrameL( ETrue );
+    iList->ScrollBarFrame()->SetScrollBarVisibilityL
+        ( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+
+    HandleListboxDataChangeL();
+
+    iList->SetCurrentItemIndex( 0 );
+    iList->SetListBoxObserver( this );
+    }
+
+
+
+// ---------------------------------------------------------
+// CWAPISecuritySettingsDlg::DynInitMenuPaneL
+// ---------------------------------------------------------
+//
+void CWAPISecuritySettingsDlg::DynInitMenuPaneL( TInt aResourceId, 
+                                                 CEikMenuPane* aMenuPane )
+    {
+    CAknDialog::DynInitMenuPaneL( aResourceId, aMenuPane );
+    if ( aResourceId == R_WAPI_SECURITY_SETTINGS_MENU )
+        {
+        if( !FeatureManager::FeatureSupported( KFeatureIdHelp ) )
+            {
+            aMenuPane->DeleteMenuItem( EAknCmdHelp );
+            }
+        }
+    }
+
+
+//----------------------------------------------------------
+// CWAPISecuritySettingsDlg::FillListWithDataL
+//----------------------------------------------------------
+//
+void CWAPISecuritySettingsDlg::FillListWithDataL( CDesCArrayFlat& aItemArray,
+                                                  const TWapiMember& arr, 
+                                                  TInt aLength,
+                                                  const TInt* aRes )
+    {
+    TWapiMember* wapiMember = MUTABLE_CAST( TWapiMember*, &arr );
+
+    for( TInt i = 0; i < aLength; i++ )
+        {
+        HBufC* itemText = CreateTextualListBoxItemL( *wapiMember, 
+                                                         *aRes );         
+        CleanupStack::PushL( itemText );
+        aItemArray.AppendL( itemText->Des() );
+        CleanupStack::PopAndDestroy( itemText );
+
+        wapiMember++;
+        aRes++;
+        }
+    }
+
+
+//----------------------------------------------------------
+// CWAPISecuritySettingsDlg::UpdateListBoxItemL
+//----------------------------------------------------------
+//
+void CWAPISecuritySettingsDlg::UpdateListBoxItemL( TWapiMember aMember, 
+                                                   TInt aRes, TInt aPos )
+    {
+    HBufC* itemText = CreateTextualListBoxItemL( aMember, aRes );
+    CleanupStack::PushL( itemText );
+    // first try to add, if Leaves, list will be untouched
+    iItemArray->InsertL( aPos, itemText->Des() );
+    // if successful, previous item is scrolled up with one,
+    // so delete that one...
+    if ( ++aPos < iItemArray->MdcaCount() )
+        {
+        iItemArray->Delete( aPos );
+        }
+    CleanupStack::PopAndDestroy( itemText );
+    }
+
+
+//----------------------------------------------------------
+// CWAPISecuritySettingsDlg::CreateTextualListBoxItemL
+//----------------------------------------------------------
+//
+HBufC* CWAPISecuritySettingsDlg::CreateTextualListBoxItemL( 
+                                            TWapiMember aMember, TInt aRes )
+    {
+    #if defined( _DEBUG ) || defined( DEBUG )
+    RDebug::Print(_L("CWAPISecuritySettingsDlg::CreateTextualListBoxItemL") );
+    #endif
+    
+    
+    // Define a heap descriptor to hold title text
+    // that are "WAPI client certificate" or
+    // "WAPI root certificate"
+    HBufC* titleText = iEikonEnv->AllocReadResourceLC( aRes );
+//
+//    TInt certIndex = KNone;
+//    TPtrC certPtr;   
+
+    HBufC* optText = NULL;
+
+
+    switch ( aMember )
+        {
+        case EWapiAuth:
+            {
+            if (iSecuritySettings->GetAuthentication() == EWapiAuthPSK)
+                {
+                optText = iEikonEnv->AllocReadResourceLC(R_WAPI_AUTH_PSK);
+                }
+            else // ... == EWapiAuthCert
+                {
+                optText = iEikonEnv->AllocReadResourceLC(R_WAPI_AUTH_CERT);
+                }
+            }
+            break;
+        case EWapiUserCert:
+        case EWapiCACert:
+            {
+            optText = FormatCertTextualListBoxItemL(aMember, aRes);
+            break;
+            }
+        case EWapiPSKFormat:
+            {
+            if (iSecuritySettings->GetKeyFormat() == CWAPISecuritySettings::EWapiKeyAscii)
+                {
+                optText = iEikonEnv->AllocReadResourceLC(R_WAPI_PRESHARED_KEY_FORMAT_ASCII);                
+                }
+            else // ... == EWapiKeyHex
+                {
+                optText = iEikonEnv->AllocReadResourceLC(R_WAPI_PRESHARED_KEY_FORMAT_HEX);
+                }
+            break;
+            }
+        case EWapiPSK:
+            {
+            if (!iSecuritySettings->hasWapiPSKKey())
+                {
+                // PSK key not set.
+                optText = iEikonEnv->AllocReadResourceLC(R_WAPI_PRESHARED_KEY_NOT_DEFINED);
+                }
+            else
+                {
+                // PSK key set.
+                _LIT( KStars, "****" );
+                optText = HBufC::NewLC( KStars().Length() );
+                optText->Des().Copy( KStars ); 
+
+                }
+            break;
+            }
+        default:
+            {
+            __ASSERT_DEBUG( EFalse, Panic( EUnknownCase ) );
+            break;
+            }
+        }
+    _LIT( KTxtListItemFormat, " \t%S\t\t%S" );
+    const TInt KSpaceAndTabsLength = 4;
+        
+    // Define a heap descriptor to hold all the item text
+    // +4 for space and tab characters
+
+    TInt length = titleText->Length() + optText->Length() 
+                  + KSpaceAndTabsLength;
+    
+    HBufC* itemText = HBufC::NewLC( length );
+
+    // Define a modifiable pointer descriptor to be able to append the title
+    // text and the certificate label to the non-modifiable heap descriptor
+    // itemText
+    TPtr itemTextPtr = itemText->Des();
+    itemTextPtr.Format( KTxtListItemFormat, titleText, optText );
+ 
+    CleanupStack::Pop( itemText ); // itemtext is popped
+
+    CleanupStack::PopAndDestroy( 2, titleText ); // optText, titleText
+    return itemText;
+    }
+
+//----------------------------------------------------------
+// CWAPISecuritySettingsDlg::FormatCertTextualListBoxItemL
+//----------------------------------------------------------
+//
+HBufC* CWAPISecuritySettingsDlg::FormatCertTextualListBoxItemL( 
+                                            TWapiMember aMember, TInt /* aRes */ )
+    {
+    #if defined( _DEBUG ) || defined( DEBUG )
+    RDebug::Print(_L("CWAPISecuritySettingsDlg::FormatCertTextualListBoxItemL") );
+    #endif
+    
+    TInt certIndex = KCertNone;
+    TPtrC certPtr;   
+
+    //Check that pointers are not null for example after
+    //certificate store has been reset.
+    switch ( aMember )
+        {
+        case EWapiUserCert:
+            {
+            #if defined( _DEBUG ) || defined( DEBUG )
+            RDebug::Print(_L("user certIndex = %d"), certIndex );
+            #endif
+                
+            if ( iUserCertificates )
+                {
+                iSecuritySettings->GetUserCertInUse( certIndex );
+                certPtr.Set ((*iUserCertificates)[certIndex]);
+                }
+                
+            #if defined( _DEBUG ) || defined( DEBUG )
+            RDebug::Print(_L("user certIndex = %d"), certIndex );
+            #endif
+                
+            break;
+            }
+
+        case EWapiCACert:
+            {
+            #if defined( _DEBUG ) || defined( DEBUG )
+            RDebug::Print(_L("ca certIndex = %d"), certIndex );
+            #endif
+                
+            if ( iCACertificates )
+                {
+                iSecuritySettings->GetCACertInUse( certIndex );
+                certPtr.Set ((*iCACertificates)[certIndex]);
+                }
+                
+            #if defined( _DEBUG ) || defined( DEBUG )
+            RDebug::Print(_L("ca certIndex = %d"), certIndex );
+            #endif
+                
+            break;
+            }
+        default:
+            {
+            __ASSERT_DEBUG( EFalse, Panic( EUnknownCase ) );
+            break;
+            }
+        }
+ 
+    // Define a heap descriptor to hold the certificate label text
+    HBufC16* certText;
+    
+    if ( certIndex == KCertNone )
+        {
+        // If "None" is selected from pop up setting page then 
+        // "(Not defined)" is shown on the main screen. This item
+        // has to localized text so read it from resource file.
+        certText = iEikonEnv->AllocReadResourceLC( R_WAPI_CERT_NOT_DEFINED );
+        }
+    else
+        {
+        //Use certificate text found from certificate array
+        //(pointer was set in switch case above)
+        certText = HBufC::NewLC( (certPtr.Length()) ); //pushes pointer 
+                                                       //to Cleanup stack
+        certText->Des().Copy( certPtr ); 
+        }
+
+    return certText;
+    }
+
+
+//----------------------------------------------------------
+// CWAPISecuritySettingsDlg::ShowPopupSettingPageL
+//----------------------------------------------------------
+//
+TBool CWAPISecuritySettingsDlg::ShowPopupSettingPageL( TWapiMember aData )
+    {
+    TInt currvalue( 0 );
+    TBool retval( EFalse );
+    CDesCArrayFlat* items = FillPopupSettingPageLC( aData,  currvalue );
+    
+    #if defined( _DEBUG ) || defined( DEBUG )
+    RDebug::Print(_L("CWAPISecuritySettingsDlg::ShowPopupSettingPageL, %d items"), items->Count() );
+    #endif
+
+    TInt attr_resid( 0 );
+
+    switch ( aData )
+        {
+        case EWapiUserCert:
+            {
+            attr_resid = R_WAPI_CLIENT_CERT;
+            break;
+            }
+
+        case EWapiCACert:
+            {
+            attr_resid = R_WAPI_ROOT_CERT;
+            break;
+            }
+  
+        default:
+            {
+            __ASSERT_DEBUG( EFalse, Panic( EUnknownCase ) );
+            attr_resid = 0;
+            break;
+            }
+        }
+
+    HBufC* titlebuf;
+    CAknRadioButtonSettingPage* dlg;
+    if ( attr_resid )
+        {
+        titlebuf = iEikonEnv->AllocReadResourceLC( attr_resid );
+        dlg = new ( ELeave )CAknRadioButtonSettingPage( 
+                            R_RADIO_BUTTON_SETTING_PAGE, currvalue, items );
+        CleanupStack::PushL( dlg ); 
+        TPtrC ptr( titlebuf->Des() );
+        dlg->SetSettingTextL( ptr );
+        CleanupStack::Pop( dlg ); // dlg
+        }
+    else
+        {
+        dlg = new ( ELeave )CAknRadioButtonSettingPage( 
+                            R_RADIO_BUTTON_SETTING_PAGE, currvalue, items );
+        }
+    if ( dlg->ExecuteLD( CAknSettingPage::EUpdateWhenAccepted ) )
+        {
+    	retval = UpdateFromPopupSettingPage( aData, currvalue );
+	    }
+
+    if ( attr_resid )
+        {
+        CleanupStack::PopAndDestroy( titlebuf ); // titlebuf
+        }
+
+    CleanupStack::PopAndDestroy( items );   // items. It deletes also all 
+                                            // elements in the array.
+    return retval;
+    }
+
+//----------------------------------------------------------
+// CWAPISecuritySettingsDlg::ShowPopupPSKSettingPageL
+//----------------------------------------------------------
+//
+TBool CWAPISecuritySettingsDlg::ShowPopupPSKSettingPageL()
+    {
+    TBool retval( EFalse );
+
+    HBufC16* bufKeyData = HBufC16::NewLC( KWapiMaxKeyLength );
+    TPtr16 ptrKeyData( bufKeyData->Des() );
+
+    TBool showPage( ETrue );
+    while ( showPage )
+        {
+        CAknTextSettingPage* settingPage = 
+                new( ELeave )CAknTextSettingPage( R_PSK_SETTING_PAGE_KEY_DATA,
+                ptrKeyData, EAknSettingPageNoOrdinalDisplayed );
+
+        if ( settingPage->ExecuteLD( CAknSettingPage::EUpdateWhenAccepted ) )
+            {
+            HBufC8* buf8 = HBufC8::NewLC( bufKeyData->Des().Length() );
+            buf8->Des().Copy( bufKeyData->Des() ); 
+
+            if ( iSecuritySettings->SetWapiPSKKeyL(ptrKeyData) != KErrNone )
+                {
+                TInt resourceId = R_WAPI_INFO_PRESHARED_KEY_ILLEGAL_CHARS;
+                if ( (iSecuritySettings->GetKeyFormat()
+                        == CWAPISecuritySettings::EWapiKeyHex)
+                        && (ptrKeyData.Length() % 2 != 0))
+                    {
+                    resourceId = R_WAPI_INFO_PRESHARED_KEY_NOT_EVEN;
+                    }
+                HBufC* stringLabel;
+                stringLabel = StringLoader::LoadL( resourceId );
+                CleanupStack::PushL( stringLabel );
+
+                CAknInformationNote* dialog = new ( ELeave )
+                                              CAknInformationNote( ETrue );
+
+                CleanupStack::Pop( stringLabel );
+
+                dialog->ExecuteLD( *stringLabel );
+                delete stringLabel;
+                }
+            else
+                {
+                retval = ETrue;
+                showPage = EFalse;
+                }
+
+            CleanupStack::PopAndDestroy( buf8 ); // buf8
+            }
+        else
+            {
+            showPage = EFalse;
+            }
+        }
+
+    CleanupStack::PopAndDestroy( bufKeyData ); // bufKeyData
+
+    return retval;
+    }
+
+// ---------------------------------------------------------
+// CWAPISecuritySettingsDlg::FillPopupSettingPageLC
+// ---------------------------------------------------------
+//
+CDesCArrayFlat* CWAPISecuritySettingsDlg::FillPopupSettingPageLC( 
+                                                            TWapiMember aData,
+                                                            TInt& aCurrvalue )
+    {
+    TInt certIndex = KCertNone;
+    CDesCArrayFlat* items = new( ELeave)CDesCArrayFlat( 1 );
+    CleanupStack::PushL( items );
+
+    
+    // "None" item is not read from the certificate table as it has to be 
+    // localized string
+     RBuf16 resourceText( iEikonEnv->AllocReadResourceL( R_WAPI_NONE ) );
+     items->AppendL( resourceText );
+     resourceText.Close();
+    
+    switch ( aData )
+        {
+        case EWapiUserCert:
+            {
+            // Let's add user certificate labels from RARRAY
+            if ( iUserCertificates )
+                {
+                #if defined( _DEBUG ) || defined( DEBUG )
+                RDebug::Print(_L("CWAPISecuritySettingsDlg::FillPopupSettingPageLC, %d user certificates"), iUserCertificates->Count() );
+                #endif
+                
+                TPtrC ptr;
+                for ( TInt i = 1; i < iUserCertificates->Count(); i++ )
+                    {
+                    ptr.Set ((*iUserCertificates)[i]); // AppendL needs a pointer
+                    items->AppendL( ptr );
+                    }
+                }       
+            iSecuritySettings->GetUserCertInUse( certIndex );   
+            break;
+            }
+            
+        case EWapiCACert:
+            {
+          //Lets add CA certificate labels from RARRAY
+            if (iCACertificates)
+                {
+                TPtrC ptr;
+                for ( TInt i = 1; i < iCACertificates->Count(); i++ )
+                    {
+                    ptr.Set((*iCACertificates)[i]); // AppendL needs a pointer
+                    items->AppendL( ptr );
+                    }
+                }            
+            iSecuritySettings->GetCACertInUse( certIndex );
+            break;
+            }
+
+        default:
+            {
+            __ASSERT_DEBUG( EFalse, Panic ( EUnknownCase ) );
+            break;
+            }
+        }
+    aCurrvalue = certIndex; //Set current choice
+    return items;
+    }
+
+
+// ---------------------------------------------------------
+// CWAPISecuritySettingsDlg::UpdateFromPopupSettingPage
+// ---------------------------------------------------------
+//
+TBool CWAPISecuritySettingsDlg::UpdateFromPopupSettingPage( TWapiMember aData,
+                                                            TInt aCurrvalue )
+    {
+    #if defined( _DEBUG ) || defined( DEBUG )
+    RDebug::Print(_L("CWAPISecuritySettingsImpl::UpdateFromPopupSettingPage, aCurrvalue = %d"), aCurrvalue );
+    #endif
+    
+    TInt certIndex;
+    TBool retVal( EFalse );
+
+    switch ( aData )
+        {
+        case EWapiUserCert:
+            {
+            //Fetch the current certificate in use
+            iSecuritySettings->GetUserCertInUse( certIndex );
+            
+            if ( certIndex != aCurrvalue )
+                {
+                iSecuritySettings->SetUserCertInUse( aCurrvalue );
+                retVal = ETrue;
+                }
+            break;
+            }
+
+        case EWapiCACert:
+            {
+            //Fetch the current certificate in use
+            iSecuritySettings->GetCACertInUse( certIndex );
+            
+            if ( certIndex != aCurrvalue )
+                {
+                iSecuritySettings->SetCACertInUse( aCurrvalue );
+                retVal = ETrue;
+                }
+             break;
+  
+            }
+
+        default:
+            {
+            __ASSERT_DEBUG( EFalse, Panic( EUnknownCase ) );
+            break;
+            }
+        }
+    return retVal;
+    }
+
+
+//----------------------------------------------------------
+// CWAPISecuritySettingsDlg::ChangeSettingsL
+//----------------------------------------------------------
+//
+void CWAPISecuritySettingsDlg::ChangeSettingsL()
+    {
+    TInt itemIndex = Max( iList->CurrentItemIndex(), 0 );
+    TWapiMember* ptr = iFieldsMain + itemIndex;
+    TInt* tptr = iTitlesMain + itemIndex;
+
+    switch ( *ptr )
+        {
+        case EWapiAuth:
+            {
+            if (iSecuritySettings->GetAuthentication() == EWapiAuthCert)
+                {
+                iSecuritySettings->SetAuthentication( EWapiAuthPSK );
+                iFieldsMain = ( TWapiMember* ) KFields_Wapi_Main_PSK;
+                iTitlesMain = MUTABLE_CAST( TInt*, KTitles_Wapi_Main_PSK );
+                }
+            else // ... == EWapiAuthPSK
+                {
+                iSecuritySettings->SetAuthentication( EWapiAuthCert );
+                iFieldsMain = ( TWapiMember* ) KFields_Wapi_Main_Cert;
+                iTitlesMain = MUTABLE_CAST( TInt*, KTitles_Wapi_Main_Cert );
+                }
+            HandleListboxDataChangeL();
+            *iEventStore |= CWAPISecuritySettings::EModified;
+            break;
+            }
+        case EWapiCACert:
+        case EWapiUserCert:
+            {
+            if ( ShowPopupSettingPageL( *ptr ) )
+                {
+                UpdateListBoxItemL( *ptr, *tptr, itemIndex );
+                *iEventStore |= CWAPISecuritySettings::EModified;
+                }
+            break;
+            }
+        case EWapiPSKFormat:
+            {
+            if (iSecuritySettings->GetKeyFormat() == CWAPISecuritySettings::EWapiKeyAscii)
+                {
+                iSecuritySettings->SetKeyFormat(CWAPISecuritySettings::EWapiKeyHex);
+                }
+            else // ... == EWapiKeyHex
+                {
+                iSecuritySettings->SetKeyFormat(CWAPISecuritySettings::EWapiKeyAscii);
+                }
+            UpdateListBoxItemL( *ptr, *tptr, itemIndex );
+            *iEventStore |= CWAPISecuritySettings::EModified;
+            break;
+            }
+        case EWapiPSK:
+            {
+            if ( ShowPopupPSKSettingPageL())
+                {
+                UpdateListBoxItemL(*ptr, *tptr, itemIndex);
+                *iEventStore |= CWAPISecuritySettings::EModified;
+                }
+            break;
+            }
+        default:
+            {
+            __ASSERT_DEBUG( EFalse, Panic( EUnknownCase ) );
+            break;
+            }
+        }
+        
+    iList->ScrollToMakeItemVisible( itemIndex );
+    iList->SetCurrentItemIndexAndDraw( itemIndex );
+    }
+
+
+// ---------------------------------------------------------
+// CWAPISecuritySettingsDlg::GetHelpContext
+// ---------------------------------------------------------
+//
+void CWAPISecuritySettingsDlg::GetHelpContext( TCoeHelpContext& aContext ) const
+    {
+    aContext.iMajor = KWAPISecuritySettingsUiHelpMajor;
+    aContext.iContext = KSET_HLP_WLAN_WAPI_MAIN;
+    
+    }
+
+// End of File