diff -r b852595f5cbe -r 63be7eb3fc78 wlanutilities/wlanqtutilities/wrapper/src/wlanqtutilsscanap_symbian.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlanutilities/wlanqtutilities/wrapper/src/wlanqtutilsscanap_symbian.cpp Tue Aug 31 16:18:40 2010 +0300 @@ -0,0 +1,428 @@ +/* +* Copyright (c) 2010 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: +* Symbian platform specific implementation of WLAN AP scanning. +*/ + +// System includes + +#include +#include +#include + +// User includes + +#include "wlanqtutils.h" +#include "wlanqtutilsap.h" +#include "wlanqtutilsscan.h" +#include "wlanqtutilsscanap_symbian.h" + +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "wlanqtutilsscanap_symbianTraces.h" +#endif + + +/*! + \class WlanQtUtilsScanApPrivate + \brief Symbian platform specific implementation of WLAN AP scanning. + + Symbian platform specific implementation of WLAN AP scanning. +*/ + + +// External function prototypes + +// Local constants + +// Information Element ID for SSID as specified in 802.11. +static const TUint8 KWlan802Dot11SsidIE = 0; + +// Bit mask for Capability info field to get type (Infra/AdHoc). +static const TUint8 KWlan802Dot11CapabilityEssMask = 0x0001; + +// ======== LOCAL FUNCTIONS ======== + +// ======== MEMBER FUNCTIONS ======== + +/*! + Static factory constructor. + + @param [in,out] wrapper Public implementation class reference. + + @return New instance of the class. +*/ + +WlanQtUtilsScanApPrivate *WlanQtUtilsScanApPrivate::NewL(WlanQtUtilsScan *wrapper) +{ + OstTraceFunctionEntry0(WLANQTUTILSSCANAPPRIVATE_NEWL_ENTRY); + + WlanQtUtilsScanApPrivate *self = new (ELeave) WlanQtUtilsScanApPrivate(wrapper); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + + OstTraceFunctionExit0(WLANQTUTILSSCANAPPRIVATE_NEWL_EXIT); + return self; +} + +/*! + Destructor. +*/ + +WlanQtUtilsScanApPrivate::~WlanQtUtilsScanApPrivate() +{ + OstTraceFunctionEntry0(WLANQTUTILSSCANAPPRIVATE_WLANQTUTILSSCANAPPRIVATE_ENTRY); + + Cancel(); + delete mWlanMgmtClient; + mWlanMgmtClient = NULL; + delete mResults; + mResults = NULL; + + OstTraceFunctionExit0(WLANQTUTILSSCANAPPRIVATE_WLANQTUTILSSCANAPPRIVATE_EXIT); +} + +/*! + Starts a broadcast scan of available access points. +*/ + +void WlanQtUtilsScanApPrivate::Scan() +{ + OstTraceFunctionEntry0(WLANQTUTILSSCANAPPRIVATE_SCAN_ENTRY); + + // Scanning while previous scan is not complete is not supported + Q_ASSERT(!IsActive()); + + // Make the scan + mWlanMgmtClient->GetScanResults(iStatus, *mResults); + SetActive(); + + OstTraceFunctionExit0(WLANQTUTILSSCANAPPRIVATE_SCAN_EXIT); +} + +/*! + Starts a direct scan of available access points having given SSID. + + @param ssid SSID to scan. +*/ + +void WlanQtUtilsScanApPrivate::Scan(const QString &ssid) +{ + OstTraceFunctionEntry0(WLANQTUTILSSCANAPPRIVATE_SCAN_SSID_ENTRY); + + // Scanning while previous scan is not complete is not supported + Q_ASSERT(!IsActive()); + + // Convert from QString to TBuf8 + TBuf buffer(ssid.utf16()); + TInt error = CnvUtfConverter::ConvertFromUnicodeToUtf8(mWlanSsid, buffer); + qt_symbian_throwIfError(error); + + OstTraceExt1( + TRACE_NORMAL, + WLANQTUTILSSCANAPPRIVATE_SCAN_SSID, + "WlanQtUtilsScanApPrivate::Scan;mWlanSsid=%s", + mWlanSsid); + + // Make the scan + mWlanMgmtClient->GetScanResults(mWlanSsid, iStatus, *mResults); + SetActive(); + + OstTraceFunctionExit0(WLANQTUTILSSCANAPPRIVATE_SCAN_SSID_EXIT); +} + +/*! + Stops an ongoing scan. +*/ + +void WlanQtUtilsScanApPrivate::StopScan() +{ + OstTraceFunctionEntry0(WLANQTUTILSSCANAPPRIVATE_STOPSCAN_ENTRY); + + Cancel(); + + OstTraceFunctionExit0(WLANQTUTILSSCANAPPRIVATE_STOPSCAN_EXIT); +} + +/*! + Scan results handler. +*/ + +void WlanQtUtilsScanApPrivate::RunL() +{ + OstTraceFunctionEntry0(WLANQTUTILSSCANAPPRIVATE_RUNL_ENTRY); + + QT_TRYCATCH_LEAVING( + if (iStatus != KErrNone) { + // Scan failed + emit q_ptr->scanFailed(WlanQtUtils::ScanStatusError); + } else { + // Scan succeeded + QList< QSharedPointer > scanResults; + ExtractScanResults(scanResults); + + // Inform about the results + emit q_ptr->availableWlanAps(scanResults); + } + ); + + OstTraceFunctionExit0(WLANQTUTILSSCANAPPRIVATE_RUNL_EXIT); +} + +/*! + Cancels an outstanding request. +*/ + +void WlanQtUtilsScanApPrivate::DoCancel() +{ + OstTraceFunctionEntry0(WLANQTUTILSSCANAPPRIVATE_DOCANCEL_ENTRY); + + mWlanMgmtClient->CancelGetScanResults(); + + OstTraceFunctionExit0(WLANQTUTILSSCANAPPRIVATE_DOCANCEL_EXIT); +} + +/*! + Constructor. + + @param [in,out] wrapper Public implementation class reference. +*/ + +WlanQtUtilsScanApPrivate::WlanQtUtilsScanApPrivate(WlanQtUtilsScan *wrapper) : + CActive(EPriorityStandard), + q_ptr(wrapper), + mWlanMgmtClient(NULL), + mResults(NULL) +{ + OstTraceFunctionEntry0(DUP1_WLANQTUTILSSCANAPPRIVATE_WLANQTUTILSSCANAPPRIVATE_ENTRY); + OstTraceFunctionExit0(DUP1_WLANQTUTILSSCANAPPRIVATE_WLANQTUTILSSCANAPPRIVATE_EXIT); +} + +/*! + Second phase constructor. +*/ + +void WlanQtUtilsScanApPrivate::ConstructL() +{ + OstTraceFunctionEntry0(WLANQTUTILSSCANAPPRIVATE_CONSTRUCTL_ENTRY); + + CActiveScheduler::Add(this); + mWlanMgmtClient = CWlanMgmtClient::NewL(); + mResults = CWlanScanInfo::NewL(); + + OstTraceFunctionExit0(WLANQTUTILSSCANAPPRIVATE_CONSTRUCTL_EXIT); +} + +/* + Extracts scan results and stores them into the given AP list. + + @param [out] scanResults Scan result list. +*/ + +void WlanQtUtilsScanApPrivate::ExtractScanResults( + QList< QSharedPointer > &scanResults) +{ + for (mResults->First(); !mResults->IsDone(); mResults->Next()) { + // Create an access point for each result + QSharedPointer ap(new WlanQtUtilsAp()); + + // SSID + QString ssid = ExtractSsid(); + + // Skip over hidden networks. There is no spec for what + // their names will contain, but at least names with only + // null characters and whitespace characters are seen + // in real life. + if (ssid.trimmed().isEmpty()) { + continue; + } + ap->setValue(WlanQtUtilsAp::ConfIdSsid, ssid); + + // BSSID + QByteArray bssid = ExtractBssid(); + ap->setValue(WlanQtUtilsAp::ConfIdBssid, bssid); + + // Signal strength + ap->setValue( + WlanQtUtilsAp::ConfIdSignalStrength, + (int)mResults->RXLevel()); + + // Connection Mode + CMManagerShim::WlanConnMode connMode; + if (mResults->Capability() & KWlan802Dot11CapabilityEssMask) { + connMode = CMManagerShim::Infra; + } else { + connMode = CMManagerShim::Adhoc; + } + ap->setValue(WlanQtUtilsAp::ConfIdConnectionMode, (int)connMode); + + // Security Mode parameters + StoreSecMode(ap, mResults->ExtendedSecurityMode()); + + // Hidden attribute + // These scan results do not tell if the AP is hidden or not + ap->setValue(WlanQtUtilsAp::ConfIdHidden, false); + ap->setValue(WlanQtUtilsAp::ConfIdWlanScanSSID, false); + + // WPS support + TBool wpsSupported = mResults->IsProtectedSetupSupported(); + ap->setValue( + WlanQtUtilsAp::ConfIdWpsSupported, + (wpsSupported == EFalse) ? false : true); + + // Append the AP to scan result list + scanResults.append(ap); + } +} + +/*! + Extracts and cleans up the WLAN SSID from current scan result element. + + @return SSID string. +*/ + +QString WlanQtUtilsScanApPrivate::ExtractSsid() +{ + // Get the SSID in raw data format + TUint8 ieLen; + const TUint8* ieData; + TInt ret = mResults->InformationElement(KWlan802Dot11SsidIE, ieLen, &ieData); + + // Convert into QString + QString ssid; + if (ret == KErrNone && ieLen > 0) { + // Trace the buffer as data to ease low level debugging + OstTraceData( + TRACE_DUMP, + WLANQTUTILSSCANAPPRIVATE_EXTRACTSSID_DATA, + "WlanQtUtilsScanApPrivate::ExtractSsid data 0x%{hex8[]}", + ieData, + ieLen); + + // The IEEE 802.11-2007 section 7.3.2.1 only specifies that + // the SSID is 0-32 octets, leaving the format of the octets + // completely open. + // To support a bit wider character set than 7-bit ASCII, we + // treat the raw SSID bytes as the lowest octets of Unicode. + for (int i = 0; i < ieLen; i++) { + ssid.append(QChar((uint)ieData[i])); + } + +#ifdef OST_TRACE_COMPILER_IN_USE + TPtrC16 string(ssid.utf16(), ssid.length()); + OstTraceExt1( + TRACE_DUMP, + WLANQTUTILSSCANAPPRIVATE_EXTRACTSSID_STRING, + "WlanQtUtilsScanApPrivate::ExtractSsid string;ssid=%S", + string); +#endif + } + + // Remove nul characters + ssid.remove(QChar()); + + return ssid; +} + +/*! + Extracts the WLAN BSSID from current scan result element. + + @return BSSID array. +*/ + +QByteArray WlanQtUtilsScanApPrivate::ExtractBssid() +{ + TWlanBssid wlanBssid; + mResults->Bssid(wlanBssid); + QByteArray bssid; + for (int i = 0; i < (int)wlanBssid.Length(); i++) { + bssid[i] = (char)wlanBssid[i]; + } + +#ifdef OST_TRACE_COMPILER_IN_USE + QString bssidHex(bssid.toHex()); + TPtrC16 string(bssidHex.utf16(), bssidHex.length()); + + OstTraceExt1( + TRACE_DUMP, + WLANQTUTILSSCANAPPRIVATE_EXTRACTBSSID, + "WlanQtUtilsScanApPrivate::ExtractBssid;bssid=%S", + string); +#endif + + return bssid; +} + +/*! + Stores Security mode parameters to \a ap class. + + @param [in,out] ap Access Point object to where the configuration is stored. + @param [in] secMode Security mode to store. +*/ + +void WlanQtUtilsScanApPrivate::StoreSecMode( + QSharedPointer ap, + TUint wlanSecMode) +{ + CMManagerShim::WlanSecMode secMode = CMManagerShim::WlanSecModeOpen; + ap->setValue(WlanQtUtilsAp::ConfIdWpaPskUse, false); + + switch (wlanSecMode) { + case EWlanConnectionExtentedSecurityModeWepOpen: + case EWlanConnectionExtentedSecurityModeWepShared: + secMode = CMManagerShim::WlanSecModeWep; + break; + + case EWlanConnectionExtentedSecurityMode802d1x: + secMode = CMManagerShim::WlanSecMode802_1x; + break; + + case EWlanConnectionExtentedSecurityModeWpa: + secMode = CMManagerShim::WlanSecModeWpa; + break; + + case EWlanConnectionExtentedSecurityModeWpaPsk: + secMode = CMManagerShim::WlanSecModeWpa; + ap->setValue(WlanQtUtilsAp::ConfIdWpaPskUse, true); + break; + + case EWlanConnectionExtentedSecurityModeWpa2: + secMode = CMManagerShim::WlanSecModeWpa2; + break; + + case EWlanConnectionExtentedSecurityModeWpa2Psk: + secMode = CMManagerShim::WlanSecModeWpa2; + ap->setValue(WlanQtUtilsAp::ConfIdWpaPskUse, true); + break; + + case EWlanConnectionExtentedSecurityModeWapi: + case EWlanConnectionExtentedSecurityModeWapiPsk: + secMode = CMManagerShim::WlanSecModeWapi; + break; + + case EWlanConnectionExtentedSecurityModeOpen: + secMode = CMManagerShim::WlanSecModeOpen; + break; + +#ifndef QT_NO_DEBUG + default: + // Invalid security mode detected + Q_ASSERT(0); + break; +#endif + } + + ap->setValue(WlanQtUtilsAp::ConfIdSecurityMode, secMode); +}