ginebra2/SystemNetworkImpl.cpp
changeset 6 1c3b8676e58c
parent 5 0f2326c2a325
--- a/ginebra2/SystemNetworkImpl.cpp	Wed Jun 23 17:59:43 2010 +0300
+++ b/ginebra2/SystemNetworkImpl.cpp	Tue Jul 06 14:03:49 2010 +0300
@@ -29,8 +29,11 @@
 
 namespace GVA {
 
+#define WCDMA2GSM_WORKAROUND // work around for QtMobility issue
+
 SystemNetworkImpl::SystemNetworkImpl()
-    : m_currentMode(QSystemNetworkInfo::UnknownMode)
+    : m_currentMode(QSystemNetworkInfo::UnknownMode),
+      m_sessionNetworkName("")
 {
     // create Qt Mobility API objects for network information
     m_networkInfo = new QSystemNetworkInfo(this);
@@ -49,17 +52,16 @@
         QSystemNetworkInfo::NetworkMode, QSystemNetworkInfo::NetworkStatus)), this,
         SLOT(handleNetworkStatusChanged(QSystemNetworkInfo::NetworkMode, QSystemNetworkInfo::NetworkStatus)));
 
-#ifdef QT_MOBILITY_BEARER_MANAGEMENT        	
+#ifdef QT_MOBILITY_BEARER_MANAGEMENT
     // Get the singleton instance of WebNetworkConnectionManager 
     WRT::WebNetworkConnectionManager &webNetworkConnectionManager 
     	  = WRT::WebNetworkConnectionManagerSingleton::Instance();
-     	
-    safe_connect(&webNetworkConnectionManager, SIGNAL(networkNameChanged(
+    
+    safe_connect(&webNetworkConnectionManager, SIGNAL(networkOnlineStateChanged(bool)),
+        this, SLOT(handleNetworkOnlineStateChanged(bool)));
+    safe_connect(&webNetworkConnectionManager, SIGNAL(networkSessionNameChanged(
         QSystemNetworkInfo::NetworkMode, const QString&)), this,
-        SLOT(handleNetworkNameChanged(QSystemNetworkInfo::NetworkMode, const QString&)));
-    safe_connect(&webNetworkConnectionManager, SIGNAL(networkSignalStrengthChanged(
-        QSystemNetworkInfo::NetworkMode, int)), this,
-        SLOT(handleNetworkSignalStrengthChanged(QSystemNetworkInfo::NetworkMode, int)));
+        SLOT(handleNetworkSessionNameChanged(QSystemNetworkInfo::NetworkMode, const QString&)));
 
       // Update all configurations
     webNetworkConnectionManager.updateConfigurations();
@@ -74,28 +76,43 @@
 //! Gets the network name for the current network mode.
 QString SystemNetworkImpl::getNetworkName() const
 {
-    QString netName = m_networkInfo->networkName(m_currentMode);
+    QString netName;
 
-    // if WLAN SSID name is unknown show "WiFi"
-    if ((m_currentMode == QSystemNetworkInfo::WlanMode) &&
-        (netName == "")) {
-        netName = "WiFi";
+    switch(m_currentMode) {
+        case QSystemNetworkInfo::WlanMode:
+        case QSystemNetworkInfo::EthernetMode:
+        case QSystemNetworkInfo::BluetoothMode:
+        case QSystemNetworkInfo::WimaxMode:
+            // for wireless cases use name from session.
+#ifdef QT_MOBILITY_BEARER_MANAGEMENT
+            netName = m_sessionNetworkName;
+#else
+            netName = m_networkInfo->networkName(m_currentMode);
+            // if WLAN SSID name is unknown show "WiFi"
+            if (netName == "")
+                netName = "WiFi";
+#endif // QT_MOBILITY_BEARER_MANAGEMENT
+            break;
+
+        default:
+            netName = m_networkInfo->networkName(m_currentMode);
+            break;
     }
 
-    //qDebug() << "DeviceDelegate: network name " << netName;
+    qDebug() << "SystemNetworkImpl::getNetworkName: network name " << netName;
     return (netName);
 }
 
 //! Gets the network signal strength for the current network mode.
 int SystemNetworkImpl::getNetworkSignalStrength() const
 {
-      int strength = m_networkInfo->networkSignalStrength(m_currentMode);
-
+    int strength = m_networkInfo->networkSignalStrength(m_currentMode);
+    
     // Strength in WLAN mode is reported as -1 by QtMobility
     if ((strength == -1) && (m_currentMode == QSystemNetworkInfo::WlanMode)) {
         strength = 100;
     }
-
+    
     return (strength);
 }
 
@@ -106,8 +123,7 @@
 void SystemNetworkImpl::handleNetworkModeChanged(
     QSystemNetworkInfo::NetworkMode mode)
 {
-      qDebug() << "handleNetworkModeChanged" << "Mode:" << mode;
-      m_currentMode = mode;
+    qDebug() << "SystemNetworkImpl::handleNetworkModeChanged" << "Mode:" << mode;
 }
 
 //! Handles the networkSignalStrengthChanged signal from system network info.
@@ -118,15 +134,17 @@
 void SystemNetworkImpl::handleNetworkSignalStrengthChanged(
     QSystemNetworkInfo::NetworkMode mode, int strength)
 {
-    qDebug() << "handleNetworkSignalStrengthChanged" << "Mode:" << mode << "strength:" << strength;
+    qDebug() << "SystemNetworkImpl::handleNetworkSignalStrengthChanged" << "Mode:" << mode << "strength:" << strength;
+    
+    // Only send signal strength changes for current mode.
+    if (mode == m_currentMode) {
+        // Unknown mode could mean network error so send negative strength to indicate offline.
+        if (m_currentMode == QSystemNetworkInfo::UnknownMode)
+            strength = -1;
 
-    // Bootstrap the mode change if no networkModeChanged signal is recived
-      if (m_currentMode == 0)
-          m_currentMode = mode;
-
-    // Only send signal strength changes for current mode.
-    if (mode == m_currentMode)
+        qDebug() << "SystemNetworkImpl::handleNetworkSignalStrengthChanged" << "emit strength:" << strength;
         emit networkSignalStrengthChanged(strength);
+    }
 }
 
 //! Handles the networkNameChanged signal from system network info.
@@ -137,15 +155,13 @@
 void SystemNetworkImpl::handleNetworkNameChanged(
         QSystemNetworkInfo::NetworkMode mode, const QString& name)
 {
-      qDebug() << "handleNetworkStatusChanged" << "Mode:" << mode << "name:" << name;
-
-      // Bootstrap the mode change if no networkModeChanged signal is recived
-      if (m_currentMode == 0)
-          m_currentMode = mode;
-
+    qDebug() << "SystemNetworkImpl::handleNetworkNameChanged" << "Mode:" << mode << "name:" << name;
+    
     // Only send network name changes for current mode.
-    if (mode == m_currentMode)
+    if (mode == m_currentMode) {
+        // Now update name.
         emit networkNameChanged(name);
+    }
 }
 
 //! Handles the networkStatusChanged signal from system network info.
@@ -156,8 +172,73 @@
 void SystemNetworkImpl::handleNetworkStatusChanged(
         QSystemNetworkInfo::NetworkMode mode, QSystemNetworkInfo::NetworkStatus status)
 {
-      qDebug() << "handleNetworkSignalStrengthChanged" << "Mode:" << mode << "status:" << status;
+    qDebug() << "SystemNetworkImpl::handleNetworkStatusChanged" << "mode: " << mode << "status: " << status; 
+}
+
+#ifdef QT_MOBILITY_BEARER_MANAGEMENT
+//! Handles online state changed signal from the web network connection manager.
+/*!
+  \param mode network mode of connection that changed
+*/
+void SystemNetworkImpl::handleNetworkOnlineStateChanged(bool isOnline)
+{
+    qDebug() << "SystemNetworkImpl::handleOnlineStateChanged" << "isOnline:" << isOnline;
+    
+    // Offline indicates no active network configurations.
+    if (!isOnline) {
+        qDebug() << "SystemNetworkImpl::handleOnlineStateChanged: change mode to unknown, emit -1 str";
+        m_currentMode = QSystemNetworkInfo::UnknownMode;
+        // negative strength indicates offline to UI
+        emit networkSignalStrengthChanged(-1);
+    }
+    // Online indicates at least 1 active network config but not necessarily 
+    // one being used by the browser.
 }
 
+void SystemNetworkImpl::handleNetworkSessionNameChanged(QSystemNetworkInfo::NetworkMode mode, const QString& name)
+{
+    // UI must get non-negative strength to indicate online status
+    int strength = m_networkInfo->networkSignalStrength(mode);
+    
+    qDebug() << "SystemNetworkImpl::handleNetworkSessionNameChanged" << "Mode:" << mode << "name:" << name << "strength:" << strength;
+    
+    switch (mode) {
+        case QSystemNetworkInfo::WlanMode:
+        case QSystemNetworkInfo::EthernetMode:
+        case QSystemNetworkInfo::BluetoothMode:
+        case QSystemNetworkInfo::WimaxMode:
+            // for wireless cases use name from session.
+            m_sessionNetworkName = name;
+            break;
+
+        default:
+            // clear session name - not needed in this mode
+            m_sessionNetworkName = "";
+            break;
+    }
+
+#ifdef WCDMA2GSM_WORKAROUND
+    // Work around for QtMobility issue. Bearer management reports WCDMA bearer but
+    // QSystemNetworkInfo sees connection as GSM mode. 
+    if ((mode == QSystemNetworkInfo::WcdmaMode) && (strength < 0)) {
+        strength = m_networkInfo->networkSignalStrength(QSystemNetworkInfo::GsmMode);
+        if (strength >= 0)
+            mode = QSystemNetworkInfo::GsmMode;
+    }
+#endif
+
+    qDebug() << "SystemNetworkImpl::handleNetworkSessionNameChanged: set mode to " << mode;
+    m_currentMode = mode;
+
+    // emit signal strength of new connection,
+    // use wrapper access method for correct WLAN strength
+    qDebug() << "SystemNetworkImpl::handleNetworkSessionNameChanged: emit str=" << getNetworkSignalStrength();
+    emit networkSignalStrengthChanged(getNetworkSignalStrength());
+
+    // Update network name on mode change.
+    qDebug() << "SystemNetworkImpl::handleNetworkSessionNameChanged: emit network name= " << getNetworkName();
+    emit networkNameChanged(getNetworkName());
+}
+#endif // QT_MOBILITY_BEARER_MANAGEMENT
+
 } // GVA
-