diff -r 63be7eb3fc78 -r f28ada11abbf wlanutilities/wlansniffer/apwizard/src/wsfwlaniapwizard.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlanutilities/wlansniffer/apwizard/src/wsfwlaniapwizard.cpp Wed Sep 01 12:20:32 2010 +0100 @@ -0,0 +1,679 @@ +/* +* Copyright (c) 2007-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: Implementation of CWsfWlanIapWizard +* +*/ + + + +// EXTERNAL INCLUDES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// CLASS HEADER +#include "wsfwlaniapwizard.h" + +// INTERNAL INCLUDES +#include "wsfwlaniapcreator.h" +#include "wsfwlanssiddiscovery.h" +#include "wsflogger.h" + + + +using namespace CMManager; + + +/** +* ROM folder +*/ +_LIT( KDriveZ, "z:" ); + +/** +* Resource file name +*/ +_LIT( KResourceFileName, "wsfapwizard.rsc" ); + +/** +* the longest possible key is the 64 character long hex WPA key +*/ +static const TInt KMaxSecureKeyLength = 64; + + + +#ifdef _DEBUG + _LIT( KApWizardPanic, "wsfapwizard" ); + #define __ASSERTD( v ) __ASSERT_DEBUG( (v), \ + User::Panic( KApWizardPanic, 0 ) ) +#else + #define __ASSERTD( v ) +#endif + + + +// ---------------------------------------------------------------------------- +// CWsfWlanIapWizard::NewL +// ---------------------------------------------------------------------------- +// +EXPORT_C CWsfWlanIapWizard* CWsfWlanIapWizard::NewL() + { + CWsfWlanIapWizard* thisPtr = NewLC(); + CleanupStack::Pop( thisPtr ); + return thisPtr; + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanIapWizard::NewLC +// ---------------------------------------------------------------------------- +// +EXPORT_C CWsfWlanIapWizard* CWsfWlanIapWizard::NewLC() + { + CWsfWlanIapWizard* thisPtr = new (ELeave) CWsfWlanIapWizard(); + CleanupStack::PushL( thisPtr ); + thisPtr->ConstructL(); + return thisPtr; + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanIapWizard::CWsfWlanIapWizard +// ---------------------------------------------------------------------------- +// +CWsfWlanIapWizard::CWsfWlanIapWizard(): + iEnv( *CEikonEnv::Static() ), + iResourceFileOffset( -1 ), + iWlanInfo( NULL ) + { + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanIapWizard::ConstructL +// ---------------------------------------------------------------------------- +// +void CWsfWlanIapWizard::ConstructL() + { + iResourceFileOffset = InitResourcesL( iEnv ); + + iCreator = CWsfWlanIapCreator::NewL(); + iSsidDiscovery = CWsfWlanSsidDiscovery::NewL(); + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanIapWizard::~CWsfWlanIapWizard +// ---------------------------------------------------------------------------- +// +EXPORT_C CWsfWlanIapWizard::~CWsfWlanIapWizard() + { + delete iCreator; + + ReleaseResources( iEnv, iResourceFileOffset ); + + delete iUsedPassword; + delete iWaitDialog; + delete iSsidDiscovery; + } + + +// --------------------------------------------------------------------------- +// CWsfWlanIapWizard::InitResourcesL +// --------------------------------------------------------------------------- +// +TInt CWsfWlanIapWizard::InitResourcesL( CEikonEnv& aEnv ) + { + // The resource has to be loaded manually since it is not an application. + TFileName resourceFileName; + + resourceFileName.Append( KDriveZ ); + resourceFileName.Append( KDC_RESOURCE_FILES_DIR ); + resourceFileName.Append( KResourceFileName ); + + BaflUtils::NearestLanguageFile( aEnv.FsSession(), resourceFileName ); + + return aEnv.AddResourceFileL( resourceFileName ); + } + + +// --------------------------------------------------------------------------- +// CWsfWlanIapWizard::ReleaseResources +// --------------------------------------------------------------------------- +// +void CWsfWlanIapWizard::ReleaseResources( CEikonEnv& aEnv, TInt aResOffset ) + { + if ( aResOffset != -1 ) + { + aEnv.DeleteResourceFile( aResOffset ); + } + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanIapWizard::LaunchWizardL +// ---------------------------------------------------------------------------- +// +EXPORT_C TBool CWsfWlanIapWizard::LaunchWizardL( TWsfWlanInfo& aWlanInfo, + TBool aDefineNewAccessPoint ) + { + LOG_ENTERFN( "CWsfWlanIapWizard::LaunchWizardL" ); + LOG_WRITEF( "defineAp = %d", aDefineNewAccessPoint ); + + if ( aDefineNewAccessPoint && + !( aWlanInfo.Hidden() && !aWlanInfo.Known() ) ) + { + HBufC* ssid16 = aWlanInfo.GetSsidAsUnicodeLC(); + LOG_WRITEF( "ssid = %S", ssid16 ); + HBufC* infoText = StringLoader::LoadLC( + R_QTN_CMON_QUEST_CREATE_WLAN_IAP, + *ssid16 ); + + CAknQueryDialog* confirmQuery = CAknQueryDialog::NewL(); + TBool result = confirmQuery->ExecuteLD( + R_QTN_WIZARD_CONFIRMATION_QUERY, + *infoText ); + + CleanupStack::PopAndDestroy( infoText ); + CleanupStack::PopAndDestroy( ssid16 ); + + if ( !result ) + { + return result; + } + } + + iWlanInfo = &aWlanInfo; + iDefineNewAccessPoint = aDefineNewAccessPoint; + + TRAPD( err, AskNetworkDetailsL() ); + if ( err ) + { + // We are here also if selection of + // the hidden network AP leaves or is + // cancelled by the end-user + LOG_WRITE( "AskNetworkDetailsL failed" ); + } + + return ( !err ); + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanIapWizard::CreateAccessPointL +// ---------------------------------------------------------------------------- +// +EXPORT_C TBool CWsfWlanIapWizard::CreateAccessPointL() + { + LOG_ENTERFN( "CWsfWlanIapWizard::CreateAccessPointL" ); + __ASSERTD( iWlanInfo ); + + + if ( iWlanInfo->iIapId != 0 ) + { + // Access Point already exists + User::Leave( KErrAlreadyExists ); + } + + + // otherwise new Access Point will be created + if ( !iWlanInfo->iSsid.Length() ) + { + User::Leave( KErrGeneral ); + } + + TPtrC sharedKey = iUsedPassword ? *iUsedPassword : KNullDesC(); + + TUint32 destId( 0 ); + + if ( iDefineNewAccessPoint ) + { + // define access point was selected, select destination query follows + LOG_WRITE( "defineAp = ETrue, opening select destination dialog..." ); + + CCmSettingsUi* settings = CCmSettingsUi::NewL(); + CleanupStack::PushL( settings ); + + TBool result( EFalse ); + result = settings->SelectDestinationDlgL( destId ); + + CleanupStack::PopAndDestroy( settings ); //settings + + if ( !result ) + { + LOG_WRITE( "dialog cancelled" ); + // cancel was pressed, abort creation + return EFalse; + } + LOG_WRITEF( "target destination = %d", destId ); + } + + iCreator->SetDefaultDestination( destId ); + + iCreator->CreateAccessPointL( *iWlanInfo, sharedKey, iIsHexWep ); + + return ETrue; + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanIapWizard::QueryTextL +// ---------------------------------------------------------------------------- +// +TInt CWsfWlanIapWizard::QueryTextL( TInt aQueryStringResource, + TDes& aVariable, + const TInt &aMaxLength ) + { + LOG_ENTERFN( "CWsfWlanIapWizard::QueryTextL" ); + HBufC* queryText = StringLoader::LoadLC( aQueryStringResource ); + CAknTextQueryDialog* textQuery = CAknTextQueryDialog::NewL( aVariable ); + CleanupStack::PushL( textQuery ); + textQuery->SetPromptL( *queryText ); + textQuery->SetMaxLength( aMaxLength ); + CleanupStack::Pop( textQuery ); + TInt result = textQuery->ExecuteLD( R_QTN_WIZARD_QUERY_GENERAL ); + CleanupStack::PopAndDestroy( queryText ); + return result; + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanIapWizard::QuerySecureKeyL +// ---------------------------------------------------------------------------- +// +TBool CWsfWlanIapWizard::QuerySecureKeyL() + { + LOG_ENTERFN( "CWsfWlanIapWizard::QuerySecureKeyL" ); + TBool okPressed( ETrue ); + + switch ( iWlanInfo->iSecurityMode ) + { + case EWlanSecModeWep: + { + LOG_WRITE( "secmode WEP" ); + CConnectionUiUtilities* connUiUtils = + CConnectionUiUtilities::NewL(); + CleanupStack::PushL( connUiUtils ); + iUsedPassword = HBufC::NewL( KMaxSecureKeyLength ); + TPtr ptr( iUsedPassword->Des() ); + okPressed = connUiUtils->EasyWepDlg( &ptr, iIsHexWep ); + CleanupStack::PopAndDestroy( connUiUtils ); + break; + } + + case EWlanSecModeWpa: + case EWlanSecModeWpa2: + case EWlanSecMode802_1x: + { + if ( iWlanInfo->UsesPreSharedKey() ) + { + // WPA-PSK + LOG_WRITE( "secmode WPA-PSK" ); + + CConnectionUiUtilities* connUiUtils = + CConnectionUiUtilities::NewL(); + CleanupStack::PushL( connUiUtils ); + iUsedPassword = HBufC::NewL( KMaxSecureKeyLength ); + TPtr ptr( iUsedPassword->Des() ); + okPressed = connUiUtils->EasyWpaDlg( &ptr ); + CleanupStack::PopAndDestroy( connUiUtils ); + } + else + { + // no key prompt in EAP mode, but the usual note is shown + LOG_WRITE( "secmode WPA-EAP" ); + + HBufC* eapText = StringLoader::LoadLC( + R_QTN_NETW_CONSET_INFO_EAP_SETTINGS_DEFAULT ); + CAknInformationNote* informationNote = + new (ELeave) CAknInformationNote( ETrue ); + informationNote->ExecuteLD( *eapText ); + + CleanupStack::PopAndDestroy( eapText ); + } + + break; + } + + case EWlanSecModeOpen: + default: + { + LOG_WRITE( "secmode Open" ); + + delete iUsedPassword; + iUsedPassword = NULL; + } + } + + return okPressed; + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanIapWizard::DismissWaitNote +// ---------------------------------------------------------------------------- +// +void CWsfWlanIapWizard::DismissWaitNote( TAny* aPtr ) + { + LOG_ENTERFN( "CWsfWlanIapWizard::DismissWaitNote" ); + CWsfWlanIapWizard* self = static_cast( aPtr ); + + if ( self->iWaitDialog ) + { + // close waitnote + LOG_WRITE( "closing waitnote..." ); + TRAP_IGNORE( self->iWaitDialog->ProcessFinishedL() ); + + // cleanup + delete self->iWaitDialog; + self->iWaitDialog = NULL; + } + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanIapWizard::AskNetworkDetailsL +// ---------------------------------------------------------------------------- +// +void CWsfWlanIapWizard::AskNetworkDetailsL() + { + LOG_ENTERFN( "CWsfWlanIapWizard::AskNetworkDetailsL" ); + + + // check the wlan info, and make proper questions.... + if ( iWlanInfo->Hidden() && !iWlanInfo->Known() ) + { + LOG_WRITE( "unlisted network" ); + + // query network SSID + HBufC* ssid16 = AskSsidL(); + LOG_WRITEF( "SSID: [%S]", ssid16 ); + + // update SSID + CnvUtfConverter::ConvertFromUnicodeToUtf8( iWlanInfo->iSsid, *ssid16 ); + delete ssid16; + + // pop up waitnote + iWaitDialog = new ( ELeave ) CAknWaitDialog( + reinterpret_cast( &iWaitDialog ), ETrue ); + iWaitDialog->SetCallback( this ); + iWaitDialog->ExecuteLD( R_SEARCHING_WLAN_WAIT_NOTE ); + + CleanupStack::PushL( TCleanupItem( DismissWaitNote, this ) ); + + // start to scan for surrounding WLAN networks + TBool foundSsid( EFalse ); + TBool usePsk( EFalse ); + TWlanSsid ssid( iWlanInfo->iSsid ); + + // make a broadcast scan + LOG_WRITE( "broadcast scanning for SSID" ); + foundSsid = iSsidDiscovery->ScanForSsidL( ssid, ETrue, + iWlanInfo->iNetMode, + iWlanInfo->iSecurityMode, + usePsk ); + + // SSID found? + if ( !foundSsid ) + { + // must be really hidden, direct scan for SSID + LOG_WRITE( "broadcast scan failed, direct scanning for SSID" ); + foundSsid = iSsidDiscovery->ScanForSsidL( ssid, EFalse, + iWlanInfo->iNetMode, + iWlanInfo->iSecurityMode, + usePsk ); + + // it can only be found as hidden + iWlanInfo->iVisibility = EFalse; + + CleanupStack::PopAndDestroy( 1 ); // DismissWaitNote + + if ( !foundSsid ) + { + LOG_WRITE( "direct scan failed, entering fully manual mode" ); + + // pop up discreet popup: No WLANs found + CConnectionUiUtilities* connUiUtils = CConnectionUiUtilities::NewL(); + connUiUtils->NoWLANNetworksAvailableNote(); + delete connUiUtils; + + // now entering fully manual mode + + // query network mode + TInt mode( 0 ); + CAknListQueryDialog* listQuery = + new (ELeave) CAknListQueryDialog( &mode ); + listQuery->PrepareLC( R_QTN_WIZARD_NETWORK_MODE ); + TInt retval = listQuery->RunLD(); + if ( !retval ) + { + User::Leave( KErrCancel ); + } + + const TInt KModeInfraPublic = 0; + const TInt KModeInfraHidden = 1; + const TInt KModeAdhocPublic = 2; + + TBool adhoc( EFalse ); + + switch ( mode ) + { + case KModeInfraPublic: + { + LOG_WRITE( "infra public mode" ); + iWlanInfo->iNetMode = EInfra; + iWlanInfo->iVisibility = ETrue; + break; + } + + case KModeInfraHidden: + { + LOG_WRITE( "infra hidden mode" ); + iWlanInfo->iNetMode = EInfra; + iWlanInfo->iVisibility = EFalse; + break; + } + + case KModeAdhocPublic: + { + LOG_WRITE( "adhoc public mode" ); + adhoc = ETrue; + iWlanInfo->iNetMode = EAdhoc; + iWlanInfo->iVisibility = ETrue; + break; + } + } + + + // query security mode + const TInt KSecModeOpen = 0; + const TInt KSecModeWep = 1; + const TInt KSecMode8021x = 2; + const TInt KSecModeWpa = 3; + + mode = KSecModeOpen; + listQuery = new (ELeave) CAknListQueryDialog( &mode ); + + if ( adhoc ) + { + listQuery->PrepareLC( R_QTN_WIZARD_AUTH_MODE_AD_HOC ); + } + else + { + listQuery->PrepareLC( R_QTN_WIZARD_AUTH_MODE ); + } + + retval = listQuery->RunLD(); + + if ( !retval ) + { + User::Leave( KErrCancel ); + } + + // map the security mode + + switch ( mode ) + { + case KSecModeWep: + { + LOG_WRITE( "security: WEP" ); + iWlanInfo->iSecurityMode = EWlanSecModeWep; + break; + } + case KSecMode8021x: + { + LOG_WRITE( "security: 802.1x" ); + iWlanInfo->iSecurityMode = EWlanSecMode802_1x; + break; + } + case KSecModeWpa: + { + LOG_WRITE( "security: WPA" ); + iWlanInfo->iSecurityMode = EWlanSecModeWpa; + break; + } + + case KSecModeOpen: + default: + { + LOG_WRITE( "security: Open" ); + iWlanInfo->iSecurityMode = EWlanSecModeOpen; + } + } + + // if WPA, query WPA mode + if ( iWlanInfo->iSecurityMode == EWlanSecModeWpa ) + { + const TInt KWpaModeEap = 0; + const TInt KWpaModePsk = 1; + + mode = KWpaModeEap; + listQuery = new (ELeave) CAknListQueryDialog( &mode ); + listQuery->PrepareLC( R_QTN_WIZARD_WPA_MODE ); + retval = listQuery->RunLD(); + if ( !retval ) + { + User::Leave( KErrCancel ); + } + + // 0 - EAP, 1 - PSK + + usePsk = ( mode == KWpaModePsk ); + if ( usePsk ) + { + LOG_WRITE( "WPA-PSK" ); + } + else + { + LOG_WRITE( "WPA-EAP" ); + } + } + + } // if !foundssid (direct) + + + } // if !foundssid (broadcast) + else + { + // it was thought to be hidden but actually it isn't + LOG_WRITE( "broadcast scan succeeded, " + L"network isn't hidden as it was thought" ); + LOG_WRITEF( "netmode: %d, secmode: %d, usepsk: %d", + iWlanInfo->iNetMode, + iWlanInfo->iSecurityMode, + usePsk ); + + CleanupStack::PopAndDestroy( 1 ); // DismissWaitNote + + // set WLAN to public + iWlanInfo->iVisibility = ETrue; + } + + // convey PSK settings to iwlaninfo + // (netmode and secmode are already updated) + iWlanInfo->SetUsesPreSharedKey( usePsk ); + + } + else + { + // if NOT hidden + LOG_WRITE( "visible network" ); + LOG_WRITEF( "netmode: %d, secmode: %d, usepsk: %d", + iWlanInfo->iNetMode, + iWlanInfo->iSecurityMode, + iWlanInfo->UsesPreSharedKey() ); + } + + // query the key and leave if cancelled + if ( !QuerySecureKeyL() ) + { + User::Leave( KErrCancel ); + } + + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanIapWizard::AskSsidL +// ---------------------------------------------------------------------------- +// +HBufC* CWsfWlanIapWizard::AskSsidL() + { + LOG_ENTERFN( "CWsfWlanIapWizard::AskSsidL" ); + + HBufC* apName = HBufC::NewLC( KWlanMaxSsidLength ); + TPtr namePtr( apName->Des() ); + if ( iWlanInfo->iSsid.Length() ) + { + CnvUtfConverter::ConvertToUnicodeFromUtf8( namePtr, iWlanInfo->iSsid ); + } + TInt response = QueryTextL( R_QTN_ENTER_NETWORK_SSID, + namePtr, + KWlanMaxSsidLength ); + if ( response != EEikBidOk ) + { + User::Leave( KErrCancel ); + } + + CleanupStack::Pop( apName ); + return apName; + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanIapWizard::DialogDismissedL +// ---------------------------------------------------------------------------- +// +void CWsfWlanIapWizard::DialogDismissedL( TInt aButtonId ) + { + LOG_ENTERFN( "CWsfWlanIapWizard::DialogDismissedL" ); + iWaitDialog = NULL; + + if ( aButtonId == EEikBidCancel ) + { + // dialog was cancelled by the user + LOG_WRITE( "dialog was cancelled" ); + iSsidDiscovery->AbortScanning(); + } + } + +