wlanutilities/wlanqtutilities/base/src/wlanqtutils_p.cpp
changeset 39 7b3e49e4608a
parent 31 e8f4211554fb
child 53 bdc64aa9b954
--- a/wlanutilities/wlanqtutilities/base/src/wlanqtutils_p.cpp	Thu Jun 10 15:44:54 2010 +0300
+++ b/wlanutilities/wlanqtutilities/base/src/wlanqtutils_p.cpp	Thu Jun 24 10:49:51 2010 +0300
@@ -27,7 +27,7 @@
 #include "wlanqtutilsiapsettings.h"
 #include "wlanqtutilsconmonwrapper.h"
 #include "wlanqtutilsesockwrapper.h"
-#include "wlanqtutilsconntestwrapper.h"
+#include "wlanqtutilsscan.h"
 
 #include "wlanqtutils.h"
 #include "wlanqtutils_p.h"
@@ -63,8 +63,10 @@
     q_ptr(q_ptr),
     mSettings(new WlanQtUtilsIapSettings(this)),
     mConMonWrapper(new WlanQtUtilsConMonWrapper(this)),
+    mScanWrapper(new WlanQtUtilsScan(this)),
     mEsockWrapper(new WlanQtUtilsEsockWrapper(this)),
-    mConnTestWrapper(new ConnTestWrapper(this)),
+    mIctService(),
+    mScanMode(ScanModeNone),
     mWlanScanList(),
     mToBeTestedIapId(WlanQtUtils::IapIdNone), 
     mConnectingIapId(WlanQtUtils::IapIdNone),
@@ -74,12 +76,17 @@
 
     // Make all connections.
     bool connectStatus = connect(
-        mConMonWrapper, 
-        SIGNAL(availableWlanApsFromWrapper(
-            QList< QSharedPointer<WlanQtUtilsAp> >&)), 
+        mScanWrapper, 
+        SIGNAL(availableWlanAps(QList< QSharedPointer<WlanQtUtilsAp> >&)), 
         this, 
-        SLOT(updateAvailableWlanAps(
-            QList< QSharedPointer<WlanQtUtilsAp> >&)));
+        SLOT(updateAvailableWlanAps(QList< QSharedPointer<WlanQtUtilsAp> >&)));
+    Q_ASSERT(connectStatus);
+    
+    connectStatus = connect(
+        mScanWrapper,
+        SIGNAL(scanFailed(int)),
+        this,
+        SLOT(reportScanResult(int)));
     Q_ASSERT(connectStatus);
 
     connectStatus = connect(
@@ -90,13 +97,6 @@
     Q_ASSERT(connectStatus);
 
     connectStatus = connect(
-        mConnTestWrapper, 
-        SIGNAL(connectivityTestResult(bool)), 
-        this,
-        SLOT(updateConnectivityTestResult(bool)));
-    Q_ASSERT(connectStatus);
-
-    connectStatus = connect(
         mConMonWrapper, 
         SIGNAL(connCreatedEventFromWrapper(uint)), 
         this,
@@ -142,8 +142,12 @@
 {
     OstTraceFunctionEntry1(WLANQTUTILSPRIVATE_SCANWLANS_ENTRY, this);
 
-    // Just forward the request to wrapper, which triggers a single WLAN scan
-    mConMonWrapper->scanAvailableWlanAPs();
+    // Scanning while there is an ongoing scan is not supported
+    Q_ASSERT(mScanMode == ScanModeNone);
+    
+    // Just forward the request to wrapper, which triggers a broadcast WLAN scan
+    mScanMode = ScanModeAvailableWlans;
+    mScanWrapper->scanWlanAps();
 
     OstTraceFunctionExit1(WLANQTUTILSPRIVATE_SCANWLANS_EXIT, this);
 }
@@ -156,8 +160,12 @@
 {
     OstTraceFunctionEntry1(WLANQTUTILSPRIVATE_SCANWLANAPS_ENTRY, this);
     
-    emit q_ptr->wlanScanApReady();
-    // TODO: implement me (wizard requires this)
+    // Scanning while there is an ongoing scan is not supported
+    Q_ASSERT(mScanMode == ScanModeNone);
+    
+    // Just forward the request to wrapper, which triggers a broadcast WLAN scan
+    mScanMode = ScanModeAvailableWlanAps;
+    mScanWrapper->scanWlanAps();
 
     OstTraceFunctionExit1(WLANQTUTILSPRIVATE_SCANWLANAPS_EXIT, this);
 }
@@ -169,11 +177,13 @@
 void WlanQtUtilsPrivate::scanWlanDirect(const QString &ssid)
 {
     OstTraceFunctionEntry1(WLANQTUTILSPRIVATE_SCANWLANDIRECT_ENTRY, this);
-    
-    Q_UNUSED(ssid);
+
+    // Scanning while there is an ongoing scan is not supported
+    Q_ASSERT(mScanMode == ScanModeNone);
     
-    emit q_ptr->wlanScanDirectReady();
-    // TODO: implement me (wizard requires this)
+    // Just forward the request to wrapper, which triggers a direct WLAN scan
+    mScanMode = ScanModeDirect;
+    mScanWrapper->scanWlanDirect(ssid);
     
     OstTraceFunctionExit1(WLANQTUTILSPRIVATE_SCANWLANDIRECT_EXIT, this);
 }
@@ -186,7 +196,14 @@
 {
     OstTraceFunctionEntry1(WLANQTUTILSPRIVATE_STOPWLANSCAN_ENTRY, this);
     
-    mConMonWrapper->stopScan();
+    if (mScanMode != ScanModeNone) {
+        // Inform that scan was cancelled
+        reportScanResult(WlanQtUtils::ScanStatusCancelled);
+        
+        // Stop the scan
+        mScanMode = ScanModeNone;
+        mScanWrapper->stopScan();
+    }
     
     OstTraceFunctionExit1(WLANQTUTILSPRIVATE_STOPWLANSCAN_EXIT, this);
 }
@@ -205,13 +222,13 @@
     wlanApList.clear();
 
     // Read the list of configured IAPs
-    QList<QSharedPointer<WlanQtUtilsIap> > configuredIapList;
+    QList< QSharedPointer<WlanQtUtilsIap> > configuredIapList;
     mSettings->fetchIaps(configuredIapList);
 
     // Match IAPs against WLAN scan results
     foreach (QSharedPointer<WlanQtUtilsIap> iap, configuredIapList) {
         foreach (QSharedPointer<WlanQtUtilsAp> scanAp, mWlanScanList) {
-            if (WlanQtUtilsAp::compare(iap.data(), scanAp.data()) == true) {
+            if (WlanQtUtilsAp::compare(iap.data(), scanAp.data()) == 0) {
                 // IAP found, add it to caller's list of known IAPs
                 // (signal strength needs to be updated manually since
                 // the IAP in our list does not have that information yet)
@@ -249,8 +266,8 @@
 {
     OstTraceFunctionEntry1(WLANQTUTILSPRIVATE_AVAILABLEWLANAPS_ENTRY, this);
     
-    Q_UNUSED(wlanApList);
-    // TODO: implement me (wizard requires this)
+    // Just copy the results
+    wlanApList = mWlanScanList;
     
     OstTraceFunctionExit1(WLANQTUTILSPRIVATE_AVAILABLEWLANAPS_EXIT, this);
 }
@@ -341,7 +358,8 @@
     OstTrace1(
         TRACE_BORDER,
         WLANQTUTILSPRIVATE_DISCONNECTIAP,
-        "WlanQtUtilsPrivate::disconnectIap;IAP ID=%d", iapId );
+        "WlanQtUtilsPrivate::disconnectIap;IAP ID=%d",
+        iapId);
 
     if (iapId != WlanQtUtils::IapIdNone) {
         // Close our RConnection handle, if needed. Wrapper ignores call, if
@@ -437,7 +455,7 @@
     bool match = false;     // Return value
     
     foreach (QSharedPointer<WlanQtUtilsIap> iap, list) {
-        if (WlanQtUtilsAp::compare(iap.data(), ap) == true) {
+        if (WlanQtUtilsAp::compare(iap.data(), ap) == 0) {
             // Match found
             match = true;
             break;
@@ -468,7 +486,7 @@
         OstTraceExt3(
             TRACE_NORMAL,
             WLANQTUTILSPRIVATE_TRACEAVAILABLEWLANAPS_IAP,
-            "WlanQtUtilsPrivate::traceAvailableWlanAps IAP;name=%S;iap->securityMode()=%d;iap->signalStrength()=%d",
+            "WlanQtUtilsPrivate::traceAvailableWlanAps IAP;name=%S;secMode=%{WlanSecMode};signalStrength=%d",
             name,
             iap->value(WlanQtUtilsAp::ConfIdSecurityMode).toInt(),
             iap->value(WlanQtUtilsAp::ConfIdSignalStrength).toInt());
@@ -479,10 +497,10 @@
         OstTraceExt3(
             TRACE_NORMAL,
             WLANQTUTILSPRIVATE_TRACEAVAILABLEWLANAPS_AP,
-            "WlanQtUtilsPrivate::traceAvailableWlanAps AP;ssid=%S;ap->securityMode()=%d;ap->signalStrength()=%d",
+            "WlanQtUtilsPrivate::traceAvailableWlanAps AP;ssid=%S;secMode=%{WlanSecMode};signalStrength=%d",
             ssid,
             ap->value(WlanQtUtilsAp::ConfIdSecurityMode).toInt(),
-            ap->value(WlanQtUtilsAp::ConfIdSignalStrength).toInt() );
+            ap->value(WlanQtUtilsAp::ConfIdSignalStrength).toInt());
     }
 #endif
 }
@@ -495,7 +513,7 @@
 */
 
 void WlanQtUtilsPrivate::updateAvailableWlanAps(
-    QList<QSharedPointer<WlanQtUtilsAp> > &availableWlanList)
+    QList< QSharedPointer<WlanQtUtilsAp> > &availableWlanList)
 {
     OstTraceFunctionEntry1(WLANQTUTILSPRIVATE_UPDATEAVAILABLEWLANAPS_ENTRY, this);
 
@@ -507,7 +525,7 @@
         for (int j = 0; j < mWlanScanList.count(); j++) {
             if (WlanQtUtilsAp::compare(
                 availableWlanList[i].data(),
-                mWlanScanList[j].data()) == true) {
+                mWlanScanList[j].data()) == 0) {
                 duplicate = true;
                 break;
             }
@@ -517,17 +535,61 @@
         }
     }
 
-    // The information is forwarded to the UI
-    OstTrace0(
-        TRACE_BORDER,
-        WLANQTUTILSPRIVATE_WLANSCANREADY,
-        "WlanQtUtilsPrivate::emit wlanScanReady");
-    emit q_ptr->wlanScanReady();
+    // The information is forwarded to the client
+    reportScanResult(WlanQtUtils::ScanStatusOk);
+    
+    // Scan is complete
+    mScanMode = ScanModeNone;
     
     OstTraceFunctionExit1(WLANQTUTILSPRIVATE_UPDATEAVAILABLEWLANAPS_EXIT, this);
 }
 
 /*!
+    Scan result handler. Reports the scanning result to the client.
+        
+    @param [in] status Scan status code (WlanQtUtils::ScanStatus).
+*/
+
+void WlanQtUtilsPrivate::reportScanResult(int status)
+{
+    switch (mScanMode) {
+    case ScanModeAvailableWlans:
+        OstTrace1(
+            TRACE_BORDER,
+            WLANQTUTILSPRIVATE_WLANSCANREADY,
+            "WlanQtUtilsPrivate::reportScanResult emit wlanScanReady;status=%{ScanStatus};",
+            status);
+        emit q_ptr->wlanScanReady(status);
+        break;
+
+    case ScanModeAvailableWlanAps:
+        OstTrace1(
+            TRACE_BORDER,
+            WLANQTUTILSPRIVATE_WLANSCANAPREADY,
+            "WlanQtUtilsPrivate::reportScanResult emit wlanScanApReady;status=%{ScanStatus};",
+            status);
+        emit q_ptr->wlanScanApReady(status);
+        break;
+
+    case ScanModeDirect:
+        OstTrace1(
+            TRACE_BORDER,
+            WLANQTUTILSPRIVATE_WLANSCANDIRECTREADY,
+            "WlanQtUtilsPrivate::reportScanResult emit wlanScanDirectReady;status=%{ScanStatus};",
+            status);
+        emit q_ptr->wlanScanDirectReady(status);
+        break;
+
+#ifndef QT_NO_DEBUG
+    default:
+        // Invalid scan mode detected
+        Q_ASSERT(0);
+        break;
+#endif        
+    }
+}
+
+/*!
     Slot for handling connection setup status event from wrapper.
 
     @param [in] isOpened Was connection setup successful?
@@ -556,8 +618,7 @@
     } else {
         // Opening succeeded, update connection status and inform UI
         if (mConnection) {
-            mConnection->setConnectionStatus(
-                WlanQtUtils::ConnStatusConnected);
+            mConnection->setConnectionStatus(WlanQtUtils::ConnStatusConnected);
         }
         
         OstTrace1(
@@ -569,9 +630,30 @@
 
         // Start ICT, if needed
         if (mConnectingIapId == mToBeTestedIapId) {
-            QSharedPointer<WlanQtUtilsIap> iap = 
-                mSettings->fetchIap(mToBeTestedIapId);
-            mConnTestWrapper->startConnectivityTest(
+            QSharedPointer<WlanQtUtilsIap> iap(mSettings->fetchIap(mConnectingIapId));
+            
+            mIctService = QSharedPointer<IctsWlanLoginInterface>(
+                new IctsWlanLoginInterface(this));
+            
+            // IctsWlanLoginInterface instance is created for each connectivity test
+            // Note: Queued connection is required since mIctService is deleted
+            // when signal comes
+            bool connectStatus = connect(
+                mIctService.data(),
+                SIGNAL(ictsResult(int)),
+                this,
+                SLOT(updateIctResult(int)),
+                Qt::QueuedConnection); 
+            Q_ASSERT(connectStatus);            
+            connectStatus = connect(
+                mIctService.data(),
+                SIGNAL(hotspotCase()),
+                this,
+                SLOT(updateIctHotspotCase()),
+                Qt::QueuedConnection);
+            Q_ASSERT(connectStatus);
+            
+            mIctService->start(
                 mToBeTestedIapId,
                 iap->value(WlanQtUtilsIap::ConfIdNetworkId).toInt());
         }
@@ -583,36 +665,71 @@
 }
 
 /*!
-    Slot for handling connectivity test result event from wrapper. Tested
-    IAP is stored to Internet SNAP, if test was successful.
+    Slot for handling internet connectivity test result event from wrapper.
+    Tested IAP is stored to Internet SNAP, if test was successful. If the
+    IAP needs Hotspot authentication, it remains ungategorized.
 
-    @param [in] result Was the test successful?
+    @param [in] result Result of internet connectivity test and hotspot
+                       authentication (IctsWlanLoginInterface::ictsResultType).
 */
 
-void WlanQtUtilsPrivate::updateConnectivityTestResult(bool result)
+void WlanQtUtilsPrivate::updateIctResult(int ictsResult)
 {
-    OstTraceFunctionEntry1(WLANQTUTILSPRIVATE_UPDATECONNECTIVITYTESTRESULT_ENTRY, this);
+    OstTraceFunctionEntry1(WLANQTUTILSPRIVATE_UPDATEICTRESULT_ENTRY, this);
 
-    if (result == true) {
+    Q_ASSERT(mToBeTestedIapId != WlanQtUtils::IapIdNone);
+    WlanQtUtils::IctStatus result = WlanQtUtils::IctFailed;
+    
+    if (ictsResult == IctsWlanLoginInterface::IctsPassed) {
         // Move the tested IAP to Internet SNAP since the test passed
         Q_ASSERT(mToBeTestedIapId != WlanQtUtils::IapIdNone);
         mSettings->moveIapToInternetSnap(mToBeTestedIapId);
-    } // else: do nothing, IAP remains to be uncategorized
-
+        result = WlanQtUtils::IctPassed;
+    } else if (ictsResult == IctsWlanLoginInterface::IctsHotspotPassed) {
+        Q_ASSERT(mToBeTestedIapId != WlanQtUtils::IapIdNone);
+        result = WlanQtUtils::IctHotspotPassed;
+    } else if (ictsResult == IctsWlanLoginInterface::IctsCanceled) {
+        Q_ASSERT(mToBeTestedIapId != WlanQtUtils::IapIdNone);
+        result = WlanQtUtils::IctCancelled;
+    } else {
+        // ICTS failed - IAP remains to be uncategorized and mIctService is deleted.
+        mIctService.clear();
+    }
+    
     // Inform UI
     OstTraceExt2(
         TRACE_NORMAL,
         WLANQTUTILSPRIVATE_ICTRESULT,
-        "WlanQtUtilsPrivate::emit ictResult;result=%hhu;IAP ID=%d",
-        result,
-        mToBeTestedIapId);
+        "WlanQtUtilsPrivate::emit ictResult;iapId=%d;result=%{IctStatus}",
+        mToBeTestedIapId,
+        result);
 
     emit q_ptr->ictResult(mToBeTestedIapId, result);
 
     // This IAP is now tested
     mToBeTestedIapId = WlanQtUtils::IapIdNone;
 
-    OstTraceFunctionExit1(WLANQTUTILSPRIVATE_UPDATECONNECTIVITYTESTRESULT_EXIT, this);
+    OstTraceFunctionExit1(WLANQTUTILSPRIVATE_UPDATEICTRESULT_EXIT, this);
+}
+
+/*!
+    Slot for setting IAP to be tested as hotspot IAP.
+*/
+
+void WlanQtUtilsPrivate::updateIctHotspotCase()
+{
+    OstTraceFunctionEntry1(WLANQTUTILSPRIVATE_UPDATEICTHOTSPOTCASE_ENTRY, this);
+
+    mSettings->setAsHotspotIap(mToBeTestedIapId);
+  
+    Q_ASSERT(mToBeTestedIapId != WlanQtUtils::IapIdNone);
+    OstTrace1(
+        TRACE_BORDER,
+        WLANQTUTILSPRIVATE_UPDATEICTHOTSPOTCASE,
+        "WlanQtUtilsPrivate::updateIctHotspotCase set as hotspot IAP;iapId=%d",
+        mToBeTestedIapId);
+        
+    OstTraceFunctionExit1(WLANQTUTILSPRIVATE_UPDATEICTHOTSPOTCASE_EXIT, this);
 }
 
 /*!
@@ -668,7 +785,7 @@
             OstTraceExt2(
                 TRACE_BORDER,
                 DUP1_WLANQTUTILSPRIVATE_WLANNETWORKCLOSED,
-                "WlanQtUtilsPrivate::emit wlanNetworkClosed;IAP ID=%d;status=%d",
+                "WlanQtUtilsPrivate::emit wlanNetworkClosed;iapID=%d;status=%d",
                 closedIapId,
                 KErrNone);
             emit q_ptr->wlanNetworkClosed(closedIapId, KErrNone);
@@ -695,7 +812,7 @@
     OstTraceExt2(
         TRACE_BORDER,
         WLANQTUTILSPRIVATE_UPDATEACTIVECONNECTION,
-        "WlanQtUtilsPrivate::updateActiveConnection;connectionId=%u;connectionStatus=%u",
+        "WlanQtUtilsPrivate::updateActiveConnection;connectionId=%u;connectionStatus=%{ConnStatus}",
         connectionId,
         (uint)connectionStatus);
 
@@ -708,7 +825,7 @@
             OstTrace1(
                 TRACE_BORDER,
                 DUP1_WLANQTUTILSPRIVATE_WLANNETWORKOPENED,
-                "WlanQtUtilsPrivate::emit wlanNetworkOpened;IAP ID=%d",
+                "WlanQtUtilsPrivate::emit wlanNetworkOpened;iapId=%d",
                 mConnection->iapId());
             emit q_ptr->wlanNetworkOpened(mConnection->iapId());
         }