wlanutilities/wlansniffer/apwizard/src/wsfwlanssiddiscovery.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:20:32 +0100
branchRCL_3
changeset 25 f28ada11abbf
parent 0 56b72877c1cb
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201029 Kit: 201035

/*
* Copyright (c) 2006 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 WLAN SSID discovery class
*
*/



//  EXTERNAL INCLUDES
#include <wlanmgmtclient.h>
#include <wlanmgmtcommon.h>

//  CLASS HEADER
#include "wsfwlanssiddiscovery.h"

//  INTERNAL INCLUDES
#include "wsflogger.h"


using namespace CMManager;


/**
* Management frame information element IDs.
* needed to determine SSID
* (from \S60\osext\wlan\wlanldd\wlan_common\umac_common\inc\802dot11.h)
*/
enum TWsf802Dot11InformationElementID
    {
    E802Dot11SsidIE                 = 0,
    E802Dot11SupportedRatesIE       = 1,
    E802Dot11FhParameterSetIE       = 2,
    E802Dot11DsParameterSetIE       = 3,
    E802Dot11CfParameterSetIE       = 4,
    E802Dot11TimIE                  = 5,
    E802Dot11IbssParameterSetIE     = 6,
    E802Dot11CountryIE              = 7,
    E802Dot11HoppingPatternParamIE  = 8,
    E802Dot11HoppingPatternTableIE  = 9,
    E802Dot11RequestIE              = 10,

    E802Dot11ChallengeTextIE        = 16,
    // Reserved for challenge text extension 17 - 31
    E802Dot11ErpInformationIE       = 42,
    E802Dot11ExtendedRatesIE        = 50,
    E802Dot11AironetIE              = 133,
    E802Dot11ApIpAddressIE          = 149,
    E802Dot11RsnIE                  = 221
    };


/**
* Bit masks for Capability Information field.
* (from \S60\osext\wlan\wlanldd\wlan_common\umac_common\inc\802dot11.h)
*/
enum TWsf802Dot11CapabilityBitMask
    {
    E802Dot11CapabilityEssMask          = 0x0001,
    E802Dot11CapabilityIbssMask         = 0x0002,
    E802Dot11CapabilityCfPollableMask   = 0x0004,
    E802Dot11CapabilityCfPollRequestMask= 0x0008,
    E802Dot11CapabilityPrivacyMask      = 0x0010,
    E802Dot11ShortPreambleMask          = 0x0020,
    E802Dot11PbccMask                   = 0x0040,      
    E802Dot11ChannelAgilityMask         = 0x0080
    };


// ======================= MEMBER FUNCTIONS =================================

// ----------------------------------------------------------------------------
// CWsfWlanSsidDiscovery::NewL
// ----------------------------------------------------------------------------
//
CWsfWlanSsidDiscovery* CWsfWlanSsidDiscovery::NewL()
    {
    CWsfWlanSsidDiscovery* self = new (ELeave) CWsfWlanSsidDiscovery();
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }


// ----------------------------------------------------------------------------
// CWsfWlanSsidDiscovery::CWsfWlanSsidDiscovery
// ----------------------------------------------------------------------------
//
CWsfWlanSsidDiscovery::CWsfWlanSsidDiscovery(): CActive( EPriorityStandard )
    {
    CActiveScheduler::Add( this );
    }


// ----------------------------------------------------------------------------
// CWsfWlanSsidDiscovery::ConstructL
// ----------------------------------------------------------------------------
//
void CWsfWlanSsidDiscovery::ConstructL()
    {
    LOG_ENTERFN( "CWsfWlanSsidDiscovery::ConstructL" );
#ifndef __WINS__
    iWlanMgmt = CWlanMgmtClient::NewL();
    iScanInfo = CWlanScanInfo::NewL();
#endif    
    }
    
    
// ----------------------------------------------------------------------------
// CWsfWlanSsidDiscovery::~CWsfWlanSsidDiscovery()
// ----------------------------------------------------------------------------
//
CWsfWlanSsidDiscovery::~CWsfWlanSsidDiscovery()
    {
    LOG_ENTERFN( "CWsfWlanSsidDiscovery::~CWsfWlanSsidDiscovery" );
    Cancel();
    delete iWlanMgmt;
    delete iScanInfo;    
    }
    
    
// ----------------------------------------------------------------------------
// CWsfWlanSsidDiscovery::DoCancel
// ----------------------------------------------------------------------------
//
void CWsfWlanSsidDiscovery::DoCancel()
    {
    LOG_ENTERFN( "CWsfWlanSsidDiscovery::DoCancel" );
#ifndef __WINS__    
    iWlanMgmt->CancelGetScanResults();
#endif    
    }
    
    
// ----------------------------------------------------------------------------
// CWsfWlanSsidDiscovery::AbortScanning
// ----------------------------------------------------------------------------
//
void CWsfWlanSsidDiscovery::AbortScanning()
    {
    LOG_ENTERFN( "CWsfWlanSsidDiscovery::AbortScanning" );
    if ( iWait.IsStarted() )
        {
        LOG_WRITE( "aborting..." );
        Cancel();

        iProgState = EAborted;
        iWait.AsyncStop();
        }    
    }
    
    
// ----------------------------------------------------------------------------
// CWsfWlanSsidDiscovery::RunL
// ----------------------------------------------------------------------------
//
void CWsfWlanSsidDiscovery::RunL()
    {
    LOG_ENTERFN( "CWsfWlanSsidDiscovery::RunL" );

    if ( iProgState == EScanning )
        {
        if ( !iStatus.Int() )
            // The list is ready 
            {
            LOG_WRITE( "No error" );
            iProgState = EDone;
            }
        else
            // something went wrong -> no coverage.
            {
            LOG_WRITE( "error" );
            }
        }
        
    // stop blocking
    if ( iWait.IsStarted() )
        {
        iWait.AsyncStop();
        }
    
    }


// ----------------------------------------------------------------------------
// CWsfWlanSsidDiscovery::ScanForSsidL
// ----------------------------------------------------------------------------
//
TBool CWsfWlanSsidDiscovery::ScanForSsidL( TWlanSsid& aEnteredSsid,
                                TBool aBroadcast,
                                CMManager::TWlanNetMode& aNetworkMode, 
                                CMManager::TWlanSecMode& aSecurityMode,
                                TBool& aUsesPsk )
    {
    LOG_ENTERFN( "CWsfWlanSsidDiscovery::ScanForSsidL" );
    
    if ( IsActive() )
        {
        return EFalse;
        }
    
    TBool found = EFalse;
#ifndef __WINS__
    iProgState = EScanning;

    if ( aBroadcast )
        {
        LOG_WRITE( "performing broadcast scan" );
        iWlanMgmt->GetScanResults( iStatus, *iScanInfo );
        }
    else
        {
        LOG_WRITE( "performing direct scan" );        
        iWlanMgmt->GetScanResults( aEnteredSsid, iStatus, *iScanInfo );
        }

    SetActive();
    iWait.Start();
    
    // now we have the results and might start to work on them...
    if ( iProgState == EDone )
        {
        LOG_WRITE( "iProgState = EDone" );
        //finished without error, work on the result...
        for ( iScanInfo->First(); !found && !iScanInfo->IsDone(); 
                                                          iScanInfo->Next() )
            {
            TUint8 ieLen( 0 );
            const TUint8* ieData;
            
            TInt ret = iScanInfo->InformationElement( E802Dot11SsidIE, ieLen, 
                                                     &ieData );
            User::LeaveIfError( ret );
            
            // get the ssid
            TWlanSsid ssid;
            ssid.Copy( ieData, ieLen );
            
            if ( !aEnteredSsid.Compare( ssid ) )
                {
                // SSID matched
                LOG_WRITE( "SSID matched, processing security settings" );
                found = ETrue;

                // adhoc or infrastructure
                aNetworkMode = ( iScanInfo->Capability() & 
                                 E802Dot11CapabilityEssMask ) ?
                                        EInfra : EAdhoc;
                
                // security mode
                TWlanConnectionSecurityMode connSec = 
                                                   iScanInfo->SecurityMode();
                
                // convert TWlanConnectionSecurityMode to 
                // CMManager::TWlanSecMode
                switch ( connSec )
                    {
                    case EWlanConnectionSecurityOpen:
                        {
                        aSecurityMode = EWlanSecModeOpen;
                        break;
                        }
                    case EWlanConnectionSecurityWep:
                        {
                        aSecurityMode = EWlanSecModeWep;
                        break;
                        }
                    case EWlanConnectionSecurity802d1x:
                        {
                        aSecurityMode = EWlanSecMode802_1x;
                        break;
                        }
                    case EWlanConnectionSecurityWpa:
                    case EWlanConnectionSecurityWpaPsk:
                        {
                        aSecurityMode = EWlanSecModeWpa;
                        break;
                        }
                    default:
                        {
                        }
                    }

                aUsesPsk = ( connSec == EWlanConnectionSecurityWpaPsk );

                } // if aEnteredSsid
        
            } // for
        
        }
    else if ( iProgState == EAborted )
        {
        LOG_WRITE( "iProgState = EAborted" );
        User::Leave( KErrCancel );
        }
    else
        {
        LOG_WRITEF( "iProgState = ???, iStatus = %d", iStatus.Int() );
        User::LeaveIfError( iStatus.Int() );
        }
        
#else // __WINS__

    // we don't like warnings
    aEnteredSsid, aBroadcast, aNetworkMode, aSecurityMode, aUsesPsk;
    
#endif // __WINS__

    return found;
    }