wlanutilities/wlanqtutilities/wrapper/src/wlanqtutilsconmonwrapperscan_s60.cpp
changeset 38 2dc6da6fb431
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wlanutilities/wlanqtutilities/wrapper/src/wlanqtutilsconmonwrapperscan_s60.cpp	Fri Jun 11 14:43:07 2010 +0300
@@ -0,0 +1,330 @@
+/*
+* Copyright (c) 2009-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:
+* Private implementation of wrapper for Symbian Connection Monitor
+* library's scan interface.
+*/
+
+// System includes
+
+#include <QSharedPointer>
+#include <QVariant>
+#include <rconnmon.h>
+#include <cmmanagerdefines_shim.h>
+
+// User includes
+
+#include "wlanqtutilsap.h"
+#include "wlanqtutilsconmonwrapper.h"
+#include "wlanqtutilsconmonwrapperscan_s60_p.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "wlanqtutilsconmonwrapperscan_s60Traces.h"
+#endif
+
+/*!
+    \class WlanQtUtilsConMonWrapperScan
+    \brief Private wrapper for Symbian Connection Monitor library.
+
+    Provides functionality to scan WLAN networks.
+*/
+
+// External function prototypes
+
+// Local constants
+
+//! Size of the scan result buffer. Good for about 100 networks.
+#define SCAN_RESULT_BUFFER_SIZE 15000
+
+// ======== LOCAL FUNCTIONS ========
+
+// ======== MEMBER FUNCTIONS ========
+
+/*!
+    Constructor.
+    
+    @param [in] wrapper Wrapper to report progress to.
+ */
+
+WlanQtUtilsConMonWrapperScan::WlanQtUtilsConMonWrapperScan(
+    WlanQtUtilsConMonWrapper *wrapper) :
+    CActive(EPriorityStandard),
+    iWlanBuf(NULL),
+    iWlanPtr(0, 0),
+    iScanCancelled(EFalse),
+    q_ptr(wrapper)
+{
+    OstTraceFunctionEntry1(WLANQTUTILSCONMONWRAPPERSCAN_WLANQTUTILSCONMONWRAPPERSCAN_ENTRY, this);
+    
+    CActiveScheduler::Add(this);
+    // Errors in Connection Monitor Server connection are fatal so just
+    // throw them as exceptions
+    QT_TRAP_THROWING(iMonitor.ConnectL());
+
+    OstTraceFunctionExit1(WLANQTUTILSCONMONWRAPPERSCAN_WLANQTUTILSCONMONWRAPPERSCAN_EXIT, this);
+}
+
+/*!
+    Destructor.
+ */
+
+WlanQtUtilsConMonWrapperScan::~WlanQtUtilsConMonWrapperScan()
+{
+    OstTraceFunctionEntry1(DUP1_WLANQTUTILSCONMONWRAPPERSCAN_WLANQTUTILSCONMONWRAPPERSCAN_ENTRY, this);
+
+    // Cancel possibly ongoing scan
+    Cancel();
+    // Cancel notifications and close connection monitor session
+    iMonitor.Close();
+    delete iWlanBuf;
+
+    OstTraceFunctionExit1(DUP1_WLANQTUTILSCONMONWRAPPERSCAN_WLANQTUTILSCONMONWRAPPERSCAN_EXIT, this);
+}
+
+/*!
+    Request a scan for available WLAN networks.
+ */
+
+void WlanQtUtilsConMonWrapperScan::ScanAvailableWlanAPs()
+{
+    OstTraceFunctionEntry1(WLANQTUTILSCONMONWRAPPERSCAN_SCANAVAILABLEWLANAPS_ENTRY, this);
+
+    if (!IsActive()) {
+        // Reserve the scan result buffer, if this is the first scan
+        // request. Same buffer is used for the lifetime of this object.
+        if (iWlanBuf == NULL) {
+            iWlanBuf = new CConnMonWlanNetworksPtrArrayPckg(
+                SCAN_RESULT_BUFFER_SIZE);
+            iWlanPtr.Set(iWlanBuf->Buf()->Des());
+        }
+
+        iScanCancelled = EFalse;
+        iMonitor.GetPckgAttribute(
+            EBearerIdWLAN,
+            0,
+            KWlanNetworks,
+            iWlanPtr,
+            iStatus);
+        SetActive();
+    }
+
+    OstTraceFunctionExit1(WLANQTUTILSCONMONWRAPPERSCAN_SCANAVAILABLEWLANAPS_EXIT, this);
+}
+
+/*!
+    Stops a possibly ongoing WLAN scan.
+ */
+
+void WlanQtUtilsConMonWrapperScan::StopScan()
+{
+    OstTraceFunctionEntry1(WLANQTUTILSCONMONWRAPPERSCAN_STOPSCAN_ENTRY, this);
+
+    iScanCancelled = ETrue;
+    Cancel();
+
+    OstTraceFunctionExit1(WLANQTUTILSCONMONWRAPPERSCAN_STOPSCAN_EXIT, this);
+}
+
+/*!
+   From CActive: called when active object is cancelled.
+ */
+
+void WlanQtUtilsConMonWrapperScan::DoCancel()
+{
+    OstTraceFunctionEntry1(WLANQTUTILSCONMONWRAPPERSCAN_DOCANCEL_ENTRY, this);
+
+    // Stop scan request, if one is active
+    iMonitor.CancelAsyncRequest(EConnMonGetPckgAttribute);
+
+    OstTraceFunctionExit1(WLANQTUTILSCONMONWRAPPERSCAN_DOCANCEL_EXIT, this);
+}
+
+/*!
+   From CActive: called when async scan request has been completed.
+   Reports results to owning wrapper.
+ */
+
+void WlanQtUtilsConMonWrapperScan::RunL()
+{
+    OstTraceFunctionEntry1(WLANQTUTILSCONMONWRAPPERSCAN_RUNL_ENTRY, this);
+    
+    OstTrace1(
+        TRACE_NORMAL,
+        WLANQTUTILSCONMONWRAPPERSCAN_RUNL_STATUS,
+        "WlanQtUtilsConMonWrapperScan::RunL;iStatus=%d", iStatus.Int() );
+    
+    if (iStatus == KErrNone) {
+        RConnMonWlanNetworksPtrArray wlanPtrArray;
+        iWlanBuf->UnpackToL(wlanPtrArray);
+        QList< QSharedPointer<WlanQtUtilsAp> > wlanScanResult;
+
+        OstTrace1(
+            TRACE_NORMAL,
+            WLANQTUTILSCONMONWRAPPERSCAN_RUNL_COUNT,
+            "WlanQtUtilsConMonWrapperScan::RunL;count=%d",
+            wlanPtrArray.Count());
+        
+        for (TInt i = 0; i < wlanPtrArray.Count(); i++) {
+            // Convert name to QString
+            TBuf<CConnMonWlanNetwork::KMaxNameLength> wlanName =
+                    wlanPtrArray[i]->Name();
+            QString wlanNameInQt =
+                QString::fromUtf16(wlanName.Ptr(), wlanName.Length());
+
+            OstTraceExt1(
+                TRACE_DUMP,
+                WLANQTUTILSCONMONWRAPPERSCAN_RUNL,
+                "WlanQtUtilsConMonWrapperScan::RunL;name=%S",
+                wlanPtrArray[i]->Name());
+            
+            // 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.
+            wlanNameInQt.remove(QChar());
+            if (wlanNameInQt.trimmed().isEmpty()) {
+                delete wlanPtrArray[i];
+                continue;
+            }
+            
+            // Go ahead and create the access point
+            QSharedPointer<WlanQtUtilsAp> ap = 
+                QSharedPointer<WlanQtUtilsAp>(new WlanQtUtilsAp());
+
+            ap->setValue(WlanQtUtilsAp::ConfIdSsid, wlanNameInQt);
+
+            StoreConMonConnMode(ap, wlanPtrArray[i]->ConnectionMode());
+            ap->setValue(
+                WlanQtUtilsAp::ConfIdSignalStrength, 
+                wlanPtrArray[i]->SignalStrength());
+
+            // Security mode values defined in enum TConnMonSecurityModeV2,
+            // rconnmon.h.
+            StoreConMonSecMode(ap, wlanPtrArray[i]->SecurityModeV2());
+
+            // TODO: "Adding WLAN network manually" subfreature:
+            // wps (Wifi Protected Setup) support, read this from connmon
+            ap->setValue(WlanQtUtilsAp::ConfIdWpsSupported, false);
+            // TODO: "Adding WLAN network manually" subfreature:
+            // different scan requests needed to identify hidden networks
+            ap->setValue(WlanQtUtilsAp::ConfIdHidden, false);
+            
+            wlanScanResult.append(ap);
+            delete wlanPtrArray[i];
+        }
+        // Don't report results, if scan was cancelled
+        if (!iScanCancelled) {
+            emit q_ptr->availableWlanApsFromWrapper(wlanScanResult);                
+        }
+        // else: scan was probably stopped before results were reveived
+        
+        wlanPtrArray.Close();
+        
+        // QSharedPointer takes care of memory deallocation
+        wlanScanResult.clear();
+    }
+
+    OstTraceFunctionExit1(WLANQTUTILSCONMONWRAPPERSCAN_RUNL_EXIT, this);
+}
+
+/*!
+   Stores Security mode parameters received from ConnMon to \a ap class.
+
+   @param ap Access Point object to where the configuration is stored
+   @param conMonSecMode Security mode to store.
+ */
+
+void WlanQtUtilsConMonWrapperScan::StoreConMonSecMode(
+    QSharedPointer<WlanQtUtilsAp> ap,
+    TUint conMonSecMode)
+    {
+    // Entry-exit traces left out on purpose, because this is a simple
+    // function and called many times inside a loop.
+    
+    CMManagerShim::WlanSecMode secMode;
+    ap->setValue(WlanQtUtilsAp::ConfIdWpaPskUse, false);
+    
+    switch (conMonSecMode) {
+    case EConnMonSecurityV2WepOpen:
+    case EConnMonSecurityV2WepShared:
+        secMode = CMManagerShim::WlanSecModeWep;
+        break;
+        
+    case EConnMonSecurityV2802d1x:
+        secMode = CMManagerShim::WlanSecMode802_1x;
+        break;
+        
+    case EConnMonSecurityV2Wpa:
+        secMode = CMManagerShim::WlanSecModeWpa;
+        break;
+        
+    case EConnMonSecurityV2WpaPsk:
+        secMode = CMManagerShim::WlanSecModeWpa;
+        ap->setValue(WlanQtUtilsAp::ConfIdWpaPskUse, true);
+        break;
+        
+    case EConnMonSecurityV2Wpa2:
+        secMode = CMManagerShim::WlanSecModeWpa2;
+        break;
+        
+    case EConnMonSecurityV2Wpa2Psk:
+        secMode = CMManagerShim::WlanSecModeWpa2;
+        ap->setValue(WlanQtUtilsAp::ConfIdWpaPskUse, true);
+        break;
+        
+    case EConnMonSecurityV2Wapi:
+    case EConnMonSecurityV2WapiPsk:
+        secMode = CMManagerShim::WlanSecModeWapi;
+        break;
+        
+    default:
+        Q_ASSERT(conMonSecMode == EConnMonSecurityV2Open);
+        secMode = CMManagerShim::WlanSecModeOpen;
+        break;
+    }
+    
+    ap->setValue(WlanQtUtilsAp::ConfIdSecurityMode, secMode);
+}
+
+/*!
+   Stores connection mode parameters received from ConnMon to \a ap class.
+
+   @param ap Access Point object to where the configuration is stored
+   @param conMonConnMode Connection mode to store.
+ */
+
+void WlanQtUtilsConMonWrapperScan::StoreConMonConnMode(
+    QSharedPointer<WlanQtUtilsAp> ap,
+    TInt conMonConnMode)
+{
+    // Entry-exit traces left out on purpose, because this is a simple
+    // function and called many times inside a loop.
+    
+    CMManagerShim::WlanConnMode connMode; 
+    
+    switch (conMonConnMode){
+    case EConnMonInfraStructure:
+    case EConnMonSecureInfra:
+        connMode = CMManagerShim::Infra;
+        break;
+        
+    default:
+        Q_ASSERT(conMonConnMode == EConnMonAdHoc);
+        connMode = CMManagerShim::Adhoc;
+        break;
+    }
+    
+    ap->setValue(WlanQtUtilsAp::ConfIdConnectionMode, connMode);
+}