diff -r 05bc53fe583b -r 83ca720e2b9a bearermanagement/mpm/src/mpmwlanquerydialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bearermanagement/mpm/src/mpmwlanquerydialog.cpp Wed Sep 01 12:23:51 2010 +0100 @@ -0,0 +1,875 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Handles displaying wlan dialogs +* +*/ + + +#include +#include +#include +#include +#include + +#include "mpmwlanquerydialog.h" +#include "mpmiapselection.h" +#include "mpmconnmonevents.h" +#include "mpmlogger.h" + +// valid Wep key lengths, to check wep key format +// (wep key format depends on key length) +const TInt KConnUiUtilsWepLengthASCII5 = 5; +const TInt KConnUiUtilsWepLengthASCII13 = 13; +const TInt KConnUiUtilsWepLengthASCII29 = 29; +const TInt KConnUiUtilsWepLengthHEX10 = 10; +const TInt KConnUiUtilsWepLengthHEX26 = 26; +const TInt KConnUiUtilsWepLengthHEX58 = 58; + +// Retry count and delay for storing Easy WLAN data +const TInt KStoreRetryCount = 10; +const TInt KStoreRetryDelay = 100000; + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CMPMWlanQueryDialog::CMPMWlanQueryDialog +// --------------------------------------------------------------------------- +// +CMPMWlanQueryDialog::CMPMWlanQueryDialog( CMPMIapSelection& aSession, + TUint32 aWlanIapId ) + : CActive( CActive::EPriorityStandard ), + iIapSelection( aSession ), + iNetworkPrefs(), + iNotifWep(), + iWlanQueryState( EWlanNetwork ), + iWlanIapId( aWlanIapId ), + iEasyWlanSelected( EFalse ), + iOverrideStatus( KErrNone ), + iConnUiUtils( NULL ), + iWps( NULL ), + iWpsReturn( WiFiProt::EWiFiOK ), + iWpsCompleted( EFalse ), + iRetryCount( 0 ) + { + + } + +// --------------------------------------------------------------------------- +// CMPMWlanQueryDialog::ConstructL +// --------------------------------------------------------------------------- +// +void CMPMWlanQueryDialog::ConstructL() + { + User::LeaveIfError(iNotifier.Connect()); + CActiveScheduler::Add( this ); + iConnUiUtils = CConnectionUiUtilities::NewL(); + User::LeaveIfError( iTimer.CreateLocal() ); + } + +// --------------------------------------------------------------------------- +// CMPMWlanQueryDialog::NewL +// --------------------------------------------------------------------------- +// +CMPMWlanQueryDialog* CMPMWlanQueryDialog::NewL( CMPMIapSelection& aSession, + TUint32 aWlanIapElementId ) + { + CMPMWlanQueryDialog* self = new( ELeave ) CMPMWlanQueryDialog( aSession, + aWlanIapElementId ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// CMPMWlanQueryDialog::~CMPMWlanQueryDialog +// --------------------------------------------------------------------------- +// +CMPMWlanQueryDialog::~CMPMWlanQueryDialog() + { + MPMLOGSTRING( "CMPMWlanQueryDialog::~CMPMWlanQueryDialog enters" ) + // Check if this dialog instance was not started but only added to the queue + if ( iIapSelection.Session()->MyServer().FirstInWlanQueryQueue() != this ) + { + MPMLOGSTRING( "CMPMWlanQueryDialog::~CMPMWlanQueryDialog, not a active delete" ) + + // Close notifier and timer + iNotifier.Close(); + iTimer.Close(); + + // We're not first in the queue, thus we can just delete. + // But remember the pointer in the array. + iIapSelection.Session()->MyServer().RemoveFromWlanQueryQueue( this ); + MPMLOGSTRING( "CMPMWlanQueryDialog::~CMPMWlanQueryDialog exits (break)" ) + return; + } + + // Cancel previous dialogs if any. + Cancel(); + + // Close notifier and timer + iNotifier.Close(); + iTimer.Close(); + + delete iConnUiUtils; + + delete iWps; + // Remove self from the queue + iIapSelection.Session()->MyServer().RemoveFromWlanQueryQueue( this ); + + // Start the next query + CMPMWlanQueryDialog* dlg = iIapSelection.Session()->MyServer().FirstInWlanQueryQueue(); + if ( dlg ) + { + MPMLOGSTRING( "CMPMWlanQueryDialog::~CMPMWlanQueryDialog starts new dialog" ) + dlg->OfferInformation( iWlanIapId, + iStatus.Int() ); + // In destructor we cannot let the query leave + TRAPD( err, dlg->StartWlanQueryL(); ) + if ( err != KErrNone ) + { + MPMLOGSTRING2( "CMPMWlanQueryDialog::~CMPMWlanQueryDialog caught Leave %d, executing RunError()", err ) + dlg->RunError( err ); + } + } + + MPMLOGSTRING( "CMPMWlanQueryDialog::~CMPMWlanQueryDialog exits" ) + } + +// --------------------------------------------------------------------------- +// CMPMWlanQueryDialog::DoCancel +// --------------------------------------------------------------------------- +// +void CMPMWlanQueryDialog::DoCancel() + { + MPMLOGSTRING2( "CMPMWlanQueryDialog::DoCancel state %d", iWlanQueryState ) + if ( iWlanQueryState == EOffline ) + { + iNotifier.CancelNotifier( KUidCOfflineWlanNoteDlg ); + } + else if ( iWlanQueryState == EWlanNetwork ) + { + iConnUiUtils->CancelSearchWLANNetwork(); + } + else if ( iWlanQueryState == EWepSettings ) + { + iNotifier.CancelNotifier( KUidEasyWepDlg ); + } + else if( iWlanQueryState == EWPS ) + { + iWps->CancelWiFiProt(); + } + else if ( iWlanQueryState == EWpaSettings ) + { + iNotifier.CancelNotifier( KUidEasyWpaDlg ); + } + else // ERetrySettingsStorage + { + iTimer.Cancel(); + } + } + +// --------------------------------------------------------------------------- +// CMPMWlanQueryDialog::RunL +// --------------------------------------------------------------------------- +// +void CMPMWlanQueryDialog::RunL() + { + MPMLOGSTRING3( "CMPMWlanQueryDialog::RunL status %d state %d", + iStatus.Int(), + iWlanQueryState ) + if( iWlanQueryState == EOffline ) + { + if( iStatus.Int() == KErrNone ) + { + iIapSelection.Session()->MyServer().SetOfflineWlanQueryResponse( + EOfflineResponseYes ); + if( iIapSelection.Session()->MyServer().CommsDatAccess()->CheckEasyWLanL( iWlanIapId ) ) + { + MPMLOGSTRING( "CMPMWlanQueryDialog::RunL starting wlan network query" ) + GetNetworkPrefs(); + return; + } + } + else if ( iStatus.Int() == KErrCancel ) + { + iIapSelection.Session()->MyServer().SetOfflineWlanQueryResponse( + EOfflineResponseNo ); + MPMLOGSTRING2( "CMPMWlanQueryDialog::RunL offline query returned %d", + iStatus.Int() ) + } + else + { + MPMLOGSTRING2( "CMPMWlanQueryDialog::RunL offline query returned %d", + iStatus.Int() ) + } + } + else if( iWlanQueryState == EWlanNetwork ) + { + if( iStatus.Int() == KErrNone ) + { + + TUint secMode( 0 ); + TWlanNetMode connMode( EInfra ); + TInt err = ConnSecModeToCommsDatSecMode( iNetworkPrefs().iSecMode, + secMode ); + if( err != KErrNone ) + { + MPMLOGSTRING( "CMPMWlanQueryDialog::RunL, Unknown security mode" ) + iWlanIapId = 0; + iWlanQueryState = EWlanNetwork; + iIapSelection.UserWlanSelectionDoneL( KErrCouldNotConnect, iWlanIapId ); + return; + } + + TUint32 configuredIap = iIapSelection.Session()->MyServer(). + CommsDatAccess()->CheckWLANIapWithSsidL( iNetworkPrefs().iSsId, + secMode, + connMode ); + // If previously unknown IAP, query wep/wpa parameters + // + if( !configuredIap ) + { + iEasyWlanSelected = ETrue; + if ( iNetworkPrefs().iProtectedSetupSupported && + iNetworkPrefs().iNetworkMode != EWlanConnectionModeAdhoc ) + { + StartWpsDlgL(); + return; + } + // WEP + // + if( iNetworkPrefs().iSecMode == EWlanConnectionSecurityWep ) + { + MPMLOGSTRING( "CMPMWlanQueryDialog::RunL unknown wep network" ) + iWlanQueryState = EWepSettings; + iNotifier.StartNotifierAndGetResponse( iStatus, + KUidEasyWepDlg, + iNotifWep, + iNotifWep ); + SetActive(); + return; + } + // WPA + // + else if ( iNetworkPrefs().iSecMode == EWlanConnectionSecurityWpaPsk ) + { + MPMLOGSTRING( "CMPMWlanQueryDialog::RunL unknown wpa network" ) + iWlanQueryState = EWpaSettings; + iNotifier.StartNotifierAndGetResponse( iStatus, + KUidEasyWpaDlg, + iNotifWpaKey, + iNotifWpaKey ); + SetActive(); + return; + + } + else + { + MPMLOGSTRING2( "CMPMWlanQueryDialog::RunL security mode %d", + iNetworkPrefs().iSecMode ) + } + } + + else + { + iWlanIapId = configuredIap; + MPMLOGSTRING2( "CMPMWlanQueryDialog::RunL found configured iap matching ssid, id %d", + iWlanIapId ) + + } + } + else if( iStatus.Int() == KErrCancel ) + { + iEasyWlanSelected = EFalse; + MPMLOGSTRING( "CMPMWlanQueryDialog::RunL easy wlan dialog cancelled, \ +setting easy wlan as not selected" ) + } + else + { + MPMLOGSTRING2( "CMPMWlanQueryDialog::RunL EWlanNetwork error %d", + iStatus.Int() ) + } + + } + else if( iWlanQueryState == EWepSettings || iWlanQueryState == EWpaSettings ) + { + if( iStatus.Int() == KErrCancel ) + { + MPMLOGSTRING( "CMPMWlanQueryDialog::Key dialog cancelled,back to easy wlan" ) + iNetworkPrefs().iSsId.FillZ(); + iNetworkPrefs().iNetworkMode = EWlanConnectionModeNotConnected; + iNetworkPrefs().iSecMode = EWlanConnectionSecurityOpen; + GetNetworkPrefs(); + return; + } + } + else if( iWlanQueryState == EWPS ) + { + MPMLOGSTRING2( "CMPMWlanQueryDialog::RunL WPS, status %d", iStatus.Int() ) + if( iStatus.Int() == KErrNone ) + { + if( iWpsReturn == WiFiProt::EWiFiOK) + { + MPMLOGSTRING( "CMPMWlanQueryDialog::RunL WPS ok" ) + iWpsCompleted = ETrue; + } + else if ( iWpsReturn == WiFiProt::EWiFiCancel ) + { + MPMLOGSTRING( "CMPMWlanQueryDialog::RunL WPS cancelled" ) + iStatus = KErrCancel; + } + else // WiFiProt::EWiFiNoAuto + { + if( iNetworkPrefs().iSecMode == EWlanConnectionSecurityWep ) + { + MPMLOGSTRING( "CMPMWlanQueryDialog::RunL: No WPS, starting WEP key query" ); + iWlanQueryState = EWepSettings; + iNotifier.StartNotifierAndGetResponse( iStatus, + KUidEasyWepDlg, + iNotifWep, + iNotifWep ); + SetActive(); + return; + } + else if ( iNetworkPrefs().iSecMode == EWlanConnectionSecurityWpaPsk ) + { + MPMLOGSTRING( "CMPMWlanQueryDialog::RunL: No WPS, starting WPA key query" ); + iWlanQueryState = EWpaSettings; + iNotifier.StartNotifierAndGetResponse( iStatus, + KUidEasyWpaDlg, + iNotifWpaKey, + iNotifWpaKey ); + SetActive(); + return; + } + else if ( iNetworkPrefs().iSecMode == EWlanConnectionSecurityOpen ) + { + MPMLOGSTRING( "CMPMWlanQueryDialog::RunL: No WPS, sec mode open" ); + iStatus = KErrNone; + } + else + { + MPMLOGSTRING2( "CMPMWlanQueryDialog::RunL: No WPS, unsupported sec mode %d", + iNetworkPrefs().iSecMode ); + iStatus = KErrNotSupported; + } + } + } + } + else if ( iWlanQueryState == ERetrySettingsStorage ) + { + // Retry settings storage + MPMLOGSTRING( "CMPMWlanQueryDialog::RunL Retry settings storage" ) + } + else + { + MPMLOGSTRING2( "CMPMWlanQueryDialog::RunL, unknown state: %d", iWlanQueryState ) + User::Leave( KErrCancel ); + } + + TRAPD( leaveCode, iIapSelection.UserWlanSelectionDoneL( iStatus.Int(), iWlanIapId ) ); + if( leaveCode != KErrNone ) + { + // Something caused method to leave, if CommsDat was locked we should retry + if ( iStatus.Int() == KErrNone && + leaveCode == KErrLocked && + iRetryCount > 0 ) + { + MPMLOGSTRING2( "CMPMWlanQueryDialog::RunL Start retry timer, retry count %d", iRetryCount ) + iWlanQueryState = ERetrySettingsStorage; + iRetryCount--; + iTimer.After( iStatus, KStoreRetryDelay ); + SetActive(); + return; + } + else + { + User::Leave( leaveCode ); + } + } + + iWlanIapId = 0; + iWlanQueryState = EWlanNetwork; + } + +// --------------------------------------------------------------------------- +// CMPMWlanQueryDialog::RunError +// --------------------------------------------------------------------------- +// +TInt CMPMWlanQueryDialog::RunError( TInt aError ) + { + MPMLOGSTRING2( "CMPMWlanQueryDialog::RunError failed with %d", aError ) + iEasyWlanSelected = EFalse; + iIapSelection.ChooseIapComplete( aError, NULL ); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CMPMWlanQueryDialog::StartWlanQueryL +// ----------------------------------------------------------------------------- +// +void CMPMWlanQueryDialog::StartWlanQueryL() + { + MPMLOGSTRING( "CMPMWlanQueryDialog::StartWlanQuery" ) + + iRetryCount = KStoreRetryCount; + + // if first dialog user, add it to the array and continue. + // + if ( iIapSelection.Session()->MyServer().WlanQueryQueue()->Count() == 0 ) + { + MPMLOGSTRING( "CMPMWlanQueryDialog::StartWlanQuery First one, start immediately" ) + iIapSelection.Session()->MyServer().AppendWlanQueryQueueL( this ); + } + // if another dialog should be processed before this, just add and return. + // + else if ( iIapSelection.Session()->MyServer().FirstInWlanQueryQueue() != this ) + { + MPMLOGSTRING( "CMPMWlanQueryDialog::StartWlanQuery Latter, process later" ) + iIapSelection.Session()->MyServer().AppendWlanQueryQueueL( this ); + return; + } + // else Continue to process the first dialog.(this one) + // FirstInWlanQueryQueue() == this && Count() > 0 + + TUint32 activeWlanIap = iIapSelection.Session()->MyServer().IsWlanConnectionStartedL( + iIapSelection.Session()->MyServer().CommsDatAccess() ); + + // Get EmergencyCallInfo via Publish & Subscribe + // + TInt emergencyCallEstablished( 0 ); + RProperty::Get( KPSUidCtsyEmergencyCallInfo, + KCTSYEmergencyCallInfo, + emergencyCallEstablished ); + MPMLOGSTRING2( "CMPMWlanQueryDialog::StartWlanQuery KCTSYEmergencyCallInfo = %d", + emergencyCallEstablished ) + + // Get note behaviour setting + TUint32 noteBehaviour( 0 ); + noteBehaviour = iIapSelection.MpmConnPref().NoteBehaviour(); + MPMLOGSTRING2( "CMPMWlanQueryDialog::StartWlanQuery noteBehaviour = %d", noteBehaviour ) + + if( !emergencyCallEstablished && + iIapSelection.Session()->MyServer().IsPhoneOffline() && + !activeWlanIap && + iIapSelection.Session()->MyServer().OfflineWlanQueryResponse() != EOfflineResponseYes && + iOverrideStatus == KErrNone ) + { + if ( noteBehaviour & TExtendedConnPref::ENoteBehaviourConnDisableQueries ) + { + MPMLOGSTRING( "CMPMWlanQueryDialog::StartWlanQuery offline note query not shown due to disabled queries" ) + iIapSelection.UserWlanSelectionDoneL( KErrPermissionDenied, iWlanIapId ); + } + else + { + MPMLOGSTRING( "CMPMWlanQueryDialog::StartWlanQuery, starting offline note" ) + iWlanQueryState = EOffline; + iNotifier.StartNotifierAndGetResponse( iStatus, + KUidCOfflineWlanNoteDlg, + KNullDesC8(), + iOfflineReply ); + SetActive(); + } + } + // if easy wlan iap and some wlan iap started, use existing connection + // + else if( iIapSelection.Session()->MyServer().CommsDatAccess()->CheckEasyWLanL( iWlanIapId ) && + activeWlanIap ) + { + MPMLOGSTRING2( "CMPMWlanQueryDialog::StartWlanQuery using active WLAN IAP %d", + activeWlanIap ) + iIapSelection.UserWlanSelectionDoneL( KErrNone, activeWlanIap ); + } + // if easy wlan iap and easy wlan is not already started + // + else if( iIapSelection.Session()->MyServer().CommsDatAccess()->CheckEasyWLanL( iWlanIapId ) && + iIapSelection.Session()->MyServer().CheckUsageOfIap( + iWlanIapId, iIapSelection.Session()->ConnectionId() ) != EStarted && + iNetworkPrefs().iSsId.Length() == 0 && + iOverrideStatus == KErrNone ) + { + MPMLOGSTRING( "CMPMWlanQueryDialog::StartWlanQuery starting network query" ) + GetNetworkPrefs(); + } + // if an error was given through OfferInformation() -call we abort the execution. + // + else if ( iOverrideStatus != KErrNone ) + { + MPMLOGSTRING2( "CMPMWlanQueryDialog::StartWlanQuery inherited error %d", iOverrideStatus ) + iIapSelection.UserWlanSelectionDoneL( iOverrideStatus, iWlanIapId ); + } + else + { + MPMLOGSTRING( "CMPMWlanQueryDialog::StartWlanQuery no wlan dialog to show" ) + iIapSelection.UserWlanSelectionDoneL( KErrNone, iWlanIapId ); + } + } + + +// ----------------------------------------------------------------------------- +// CMPMWlanQueryDialog::OfferInformation +// ----------------------------------------------------------------------------- +// +void CMPMWlanQueryDialog::OfferInformation( + TUint32 aWlanIapId, + TInt aDialogStatus ) + { + TBool isEasyWlan( EFalse ); + // Take information from earlier note into use + // if the selected IAP is EasyWLAN or Offline note response was No. + // + TRAP_IGNORE( isEasyWlan = + iIapSelection.Session()->MyServer().CommsDatAccess()->CheckEasyWLanL( iWlanIapId ); ) + if ( isEasyWlan ) + { + // iEasyWlanSelected is not passed as only the first connection + // should write the easy wlan settings to commsdat if easy wlan is used. + // + MPMLOGSTRING3( "CMPMWlanQueryDialog<0x%x>::OfferInformation: EasyWLAN, iap %d", + iIapSelection.Session()->ConnectionId(), + aWlanIapId ) + + iWlanIapId = aWlanIapId; + iOverrideStatus = aDialogStatus; + } + TOfflineWlanQueryResponse offlineResponse = + iIapSelection.Session()->MyServer().OfflineWlanQueryResponse(); + if ( offlineResponse != EOfflineResponseUndefined ) + { + MPMLOGSTRING3( "CMPMWlanQueryDialog<0x%x>::OfferInformation: offline response %d", + iIapSelection.Session()->ConnectionId(), + offlineResponse ) + iOverrideStatus = aDialogStatus; + } + +#ifdef _LOG + else + { + MPMLOGSTRING( "CMPMWlanQueryDialog::OfferInformation, information not taken." ) + } +#endif + } + + +// ----------------------------------------------------------------------------- +// CMPMWlanQueryDialog::StoreEasyWlanSelectionL +// ----------------------------------------------------------------------------- +// +void CMPMWlanQueryDialog::StoreEasyWlanSelectionL() + { + if( iEasyWlanSelected ) + { + TWlanSsid ssid; + TWepKeyData wepData; + TUint wpaPskEnabled( 0 ); + TUint wpaPskLen( 0 ); + TBuf8 wpa; + TUint secMode( 0 ); + TWlanNetMode connMode( EInfra ); + + if( iWpsCompleted ) + { + GetEasyWlanDataForWpsL( ssid, + secMode, + connMode, + wepData, + wpaPskEnabled, + wpa, + wpaPskLen ); + MPMLOGSTRING3( "CMPMWlanQueryDialog::StoreEasyWlanSelection: \ +wps used, connection iap %d, ssid %S", iWlanIapId, &iWpsAttribute.iSsid ) + iIapSelection.Session()->MyServer().Events()-> + SetConnInfoIapSsid( iWlanIapId, + iWpsAttribute.iSsid ); + iIapSelection.Session()->MyServer().CommsDatAccess()->SetEasyWlanDataL( ssid, + secMode, + connMode, + wepData, + wpaPskEnabled, + wpa, + wpaPskLen ); + return; + } + + MPMLOGSTRING( "CMPMWlanQueryDialog::StoreEasyWlanSelection: setting easy wlan data" ) + GetEasyWlanDataL( ssid, + secMode, + connMode, + wepData, + wpaPskEnabled, + wpa, + wpaPskLen ); + + MPMLOGSTRING3( "CMPMWlanQueryDialog::StoreEasyWlanSelection: \ +setting easy wlan iap %d ssid %S in connmon events", iWlanIapId, &iNetworkPrefs().iSsId ) + iIapSelection.Session()->MyServer().Events()->SetConnInfoIapSsid( iWlanIapId, + iNetworkPrefs().iSsId ); + iIapSelection.Session()->MyServer().CommsDatAccess()->SetEasyWlanDataL( ssid, + secMode, + connMode, + wepData, + wpaPskEnabled, + wpa, + wpaPskLen ); + + } + else + { + MPMLOGSTRING( "CMPMWlanQueryDialog::StoreEasyWlanSelection: no easy wlan selected by user" ) + } + } + + +// ----------------------------------------------------------------------------- +// CMPMWlanQueryDialog::GetEasyWlanDataL +// ----------------------------------------------------------------------------- +// +void CMPMWlanQueryDialog::GetEasyWlanDataL( TWlanSsid& aSsid, + TUint& aSecMode, + TWlanNetMode& aConnMode, + TWepKeyData& aWepData, + TUint& aEnableWpaPsk, + TDes8& aWpaPsk, + TUint& aWpaKeyLen ) + { + aSsid.Copy( iNetworkPrefs().iSsId ); + if ( iNetworkPrefs().iNetworkMode == EWlanConnectionModeAdhoc ) + { + aConnMode = EAdhoc; + } + + // Set security mode + TInt err = ConnSecModeToCommsDatSecMode( iNetworkPrefs().iSecMode, + aSecMode ); + + if( err != KErrNone ) + { + MPMLOGSTRING2( "CMPMWlanQueryDialog::StoreEasyWlanSelection: \ +unsupported sec mode %d. leaving", iNetworkPrefs().iSecMode ) + User::Leave( KErrNotSupported ); + } + + if( iNetworkPrefs().iSecMode == EWlanConnectionSecurityWep ) + { + CnvUtfConverter::ConvertFromUnicodeToUtf8( aWepData.iWep1, iNotifWep().iKey ); + //MPMLOG8STRING2( "CMPMWlanQueryDialog::StoreEasyWlanSelection:wep-key8:%S ", &aWepData.iWep1 ) + if( iNotifWep().iHex ) + { + aWepData.iWepFormat1 = 1; + MPMLOGSTRING( "CMPMWlanQueryDialog::StoreEasyWlanSelection: wep format is 1 (hex)") + } + aWepData.iDefaultWep = EWlanDefaultWepKey1; + } + else if( iNetworkPrefs().iSecMode == EWlanConnectionSecurityWpaPsk ) + { + CnvUtfConverter::ConvertFromUnicodeToUtf8( aWpaPsk, iNotifWpaKey() ); + aEnableWpaPsk = 1; + aWpaKeyLen = aWpaPsk.Length(); + MPMLOGSTRING3( "CMPMWlanQueryDialog::StoreEasyWlanSelection:wpapsk-key:%s, len:%d", + &iNotifWpaKey(), + aWpaKeyLen ) + } + else + { + MPMLOGSTRING2( "CMPMWlanQueryDialog::StoreEasyWlanSelection: \ +no key handling needed for sec mode %d", iNetworkPrefs().iSecMode ) + } + } + +// --------------------------------------------------------------------------- +// CMPMWlanQueryDialog::ConnSecModeToCommsDatSecMode +// --------------------------------------------------------------------------- +// +TInt CMPMWlanQueryDialog::ConnSecModeToCommsDatSecMode( TWlanConnectionSecurityMode aConnSecmode, + TUint& aCommsdatSecMode ) const + { + + if ( aConnSecmode == EWlanConnectionSecurityOpen ) + { + aCommsdatSecMode = EWlanSecModeOpen; + } + else if ( aConnSecmode == EWlanConnectionSecurityWep ) + { + aCommsdatSecMode = EWlanSecModeWep; + } + else if ( aConnSecmode == EWlanConnectionSecurityWpaPsk ) + { + aCommsdatSecMode = EWlanSecModeWpa2; + } + else if ( aConnSecmode == EWlanConnectionSecurityWpa ) + { + aCommsdatSecMode = EWlanSecModeWpa; + } + else + { + MPMLOGSTRING( "CMPMWlanQueryDialog::RunL, Unknown security mode" ) + return KErrCouldNotConnect; + } + return KErrNone; + } + + +// --------------------------------------------------------------------------- +// CMPMWlanQueryDialog::IapSecModeToCommsDatSecMode +// --------------------------------------------------------------------------- +// +TInt CMPMWlanQueryDialog::IapSecModeToCommsDatSecMode( TWlanIapSecurityMode aIapSecmode, + TUint& aCommsdatSecMode ) const + { + switch( aIapSecmode ) + { + case EWlanIapSecurityModeAllowUnsecure: + aCommsdatSecMode |= EWlanSecModeOpen; + break; + case EWlanIapSecurityModeWep: + aCommsdatSecMode |= EWlanSecModeWep; + break; + case EWlanIapSecurityModeWpa: + aCommsdatSecMode |= EWlanSecModeWpa; + break; + case EWlanIapSecurityModeWpa2Only: + aCommsdatSecMode |= EWlanSecModeWpa2; + break; + default: + MPMLOGSTRING2( "CMPMWlanQueryDialog::IapSecModeToCommsDatSecMode: \ +unsupported sec mode %d ", aIapSecmode ) + return KErrNotSupported; + } + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CMPMWlanQueryDialog::GetEasyWlanDataForWpsL +// ----------------------------------------------------------------------------- +// +void CMPMWlanQueryDialog::GetEasyWlanDataForWpsL( TWlanSsid& aSsid, + TUint& aSecMode, + TWlanNetMode& aConnMode, + TWepKeyData& aWepKeyData, + TUint& aEnableWpaPsk, + TDes8& aWpaPsk, + TUint& aWpaKeyLen ) + { + aSsid.Copy( iWpsAttribute.iSsid ); + if ( iWpsAttribute.iOperatingMode == EWlanOperatingModeAdhoc ) + { + aConnMode = EAdhoc; + } + TInt err = IapSecModeToCommsDatSecMode( iWpsAttribute.iSecurityMode, + aSecMode ); + if( err != KErrNone ) + { + MPMLOGSTRING( "CMPMWlanQueryDialog::GetEasyWlanDataForWpsL: \ +unsupported wps sec mode leaving" ) + User::Leave( KErrNotSupported ); + } + + if( iWpsAttribute.iSecurityMode == EWlanIapSecurityModeWep ) + { + if( iWpsAttribute.iWepKey1.Length() && + IsWepFormatHexL( iWpsAttribute.iWepKey1.Length() ) ) + { + aWepKeyData.iWepFormat1 = 1; + } + if( iWpsAttribute.iWepKey2.Length() && + IsWepFormatHexL( iWpsAttribute.iWepKey2.Length() ) ) + { + aWepKeyData.iWepFormat2 = 1; + } + if( iWpsAttribute.iWepKey3.Length() && + IsWepFormatHexL( iWpsAttribute.iWepKey3.Length() ) ) + { + aWepKeyData.iWepFormat3 = 1; + } + if( iWpsAttribute.iWepKey4.Length() && + IsWepFormatHexL( iWpsAttribute.iWepKey4.Length() ) ) + { + aWepKeyData.iWepFormat4 = 1; + } + aWepKeyData.iWep1.Copy( iWpsAttribute.iWepKey1 ); + aWepKeyData.iWep2.Copy( iWpsAttribute.iWepKey2 ); + aWepKeyData.iWep3.Copy( iWpsAttribute.iWepKey3 ); + aWepKeyData.iWep4.Copy( iWpsAttribute.iWepKey4 ); + aWepKeyData.iDefaultWep = iWpsAttribute.iWepDefaultKey; + } + if( iWpsAttribute.iWpaPreSharedKey.Length() ) + { + aEnableWpaPsk = 1; + aWpaPsk.Copy( iWpsAttribute.iWpaPreSharedKey ); + aWpaKeyLen = aWpaPsk.Length(); + } + + } + +// --------------------------------------------------------------------------- +// CMPMWlanQueryDialog::StartWpsDlgL +// --------------------------------------------------------------------------- +// +void CMPMWlanQueryDialog::StartWpsDlgL() + { + MPMLOGSTRING( "CMPMWlanQueryDialog::StartWpsDlgL, Starting WPS" ) + iWlanQueryState = EWPS; + iWps = CWiFiProtUiClient::NewL(); + iWps->StartWiFiProtConnL( iNetworkPrefs().iSsId, // TWlanSsid&, + iWpsAttribute, + iWpsReturn, + iStatus ); + SetActive(); + } + +// --------------------------------------------------------------------------- +// CMPMWlanQueryDialog::IsWepFormatHexL +// --------------------------------------------------------------------------- +// +TBool CMPMWlanQueryDialog::IsWepFormatHexL( TInt aLength ) const + { + MPMLOGSTRING2( "CMPMWlanQueryDialog::IsWepFormatHexL length %d", aLength ) + + if ( ( aLength == KConnUiUtilsWepLengthASCII5 ) || + ( aLength == KConnUiUtilsWepLengthASCII13 ) || + ( aLength == KConnUiUtilsWepLengthASCII29 ) ) + { + return EFalse; + } + else if ( ( aLength == KConnUiUtilsWepLengthHEX10 ) || + ( aLength == KConnUiUtilsWepLengthHEX26 ) || + ( aLength == KConnUiUtilsWepLengthHEX58 ) ) + { + return ETrue; + } + else + { + User::Leave( KErrNotSupported ); + } + return EFalse; + } + +// --------------------------------------------------------------------------- +// CMPMWlanQueryDialog::GetNetworkPrefs +// --------------------------------------------------------------------------- +// +void CMPMWlanQueryDialog::GetNetworkPrefs() + { + iWlanQueryState = EWlanNetwork; + iConnUiUtils->SearchWLANNetworkAsync( iStatus, + iNetworkPrefs().iSsId, + iNetworkPrefs().iNetworkMode, + iNetworkPrefs().iSecMode, + iNetworkPrefs().iProtectedSetupSupported + ); + SetActive(); + } +