wlansecuritysettings/wlaneapsettingsui/pap/configui/src/papuiview.cpp
branchRCL_3
changeset 46 c74b3d9f6b9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wlansecuritysettings/wlaneapsettingsui/pap/configui/src/papuiview.cpp	Wed Sep 01 12:23:57 2010 +0100
@@ -0,0 +1,649 @@
+/*
+* Copyright (c) 2001-2010 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
+*
+*/
+
+/*
+* %version: 13 %
+*/
+
+// INCLUDE FILES
+#include "papuiview.h"
+#include "papuisettingarray.h"
+#include "papuipwsettingitem.h"
+#include "papui.hrh"
+#include <papui.rsg>
+#include <eikdialg.h>
+#include <AknDialog.h>
+#include <aknlists.h>
+#include <akntextsettingpage.h>
+#include <aknsettingitemlist.h>
+#include <aknnavi.h>
+#include <aknnavide.h>
+#include <aknnotewrappers.h>
+#include <StringLoader.h>
+#include <EapTlsPeapUiConnection.h>
+#include <EapTlsPeapUiDataConnection.h>
+#include <EapTlsPeapUiTlsPeapData.h>
+#include <featmgr.h>
+#include <hlplch.h>
+#include <csxhelp/cp.hlp.hrh>
+
+
+// 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<CAknNavigationControlContainer*>( 
+                                        statusPane->ControlL( naviPaneUid ) );
+
+        // Set empty text to hide tabs.
+        iNaviDecorator = iNaviPane->CreateNavigationLabelL( KNullDesC );
+        iNaviPane->PushL( *iNaviDecorator );
+        }           
+
+    
+    // Initialize setting page 
+    iSettingListBox = static_cast<CAknSettingStyleListBox*>( 
+                                    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<CAknTitlePane*>(
+                                        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