ginebra2/SystemNetworkImpl.cpp
author hgs
Wed, 01 Sep 2010 13:56:21 -0400
changeset 11 786160610b4d
parent 3 0954f5dd2cd0
permissions -rw-r--r--
201035
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
*
hgs
parents:
diff changeset
     5
* This program is free software: you can redistribute it and/or modify
hgs
parents:
diff changeset
     6
* it under the terms of the GNU Lesser General Public License as published by
hgs
parents:
diff changeset
     7
* the Free Software Foundation, version 2.1 of the License.
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* This program is distributed in the hope that it will be useful,
hgs
parents:
diff changeset
    10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
hgs
parents:
diff changeset
    11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
hgs
parents:
diff changeset
    12
* GNU Lesser General Public License for more details.
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* You should have received a copy of the GNU Lesser General Public License
hgs
parents:
diff changeset
    15
* along with this program.  If not,
hgs
parents:
diff changeset
    16
* see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/".
hgs
parents:
diff changeset
    17
*
hgs
parents:
diff changeset
    18
* Description:
hgs
parents:
diff changeset
    19
*  This file implements the SystemNetworkImpl class.
hgs
parents:
diff changeset
    20
*/
hgs
parents:
diff changeset
    21
#include <QList>
hgs
parents:
diff changeset
    22
#include <QString>
hgs
parents:
diff changeset
    23
#ifdef QT_MOBILITY_BEARER_MANAGEMENT
hgs
parents:
diff changeset
    24
#include "WebNetworkConnectionManagerSingleton.h"
hgs
parents:
diff changeset
    25
#endif // QT_MOBILITY_BEARER_MANAGEMENT
hgs
parents:
diff changeset
    26
#include "NetworkDelegate.h"
hgs
parents:
diff changeset
    27
#include "SystemNetworkImpl.h"
hgs
parents:
diff changeset
    28
#include "Utilities.h"
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
namespace GVA {
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
#define WCDMA2GSM_WORKAROUND // work around for QtMobility issue
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
SystemNetworkImpl::SystemNetworkImpl()
hgs
parents:
diff changeset
    35
    : m_currentMode(QSystemNetworkInfo::UnknownMode),
hgs
parents:
diff changeset
    36
      m_sessionNetworkName("")
hgs
parents:
diff changeset
    37
{
hgs
parents:
diff changeset
    38
    // create Qt Mobility API objects for network information
hgs
parents:
diff changeset
    39
    m_networkInfo = new QSystemNetworkInfo(this);
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
    // set up handlers for system network info signals
hgs
parents:
diff changeset
    42
    safe_connect(m_networkInfo, SIGNAL(networkModeChanged(
hgs
parents:
diff changeset
    43
        QSystemNetworkInfo::NetworkMode)), this,
hgs
parents:
diff changeset
    44
        SLOT(handleNetworkModeChanged(QSystemNetworkInfo::NetworkMode)));
hgs
parents:
diff changeset
    45
    safe_connect(m_networkInfo, SIGNAL(networkNameChanged(
hgs
parents:
diff changeset
    46
        QSystemNetworkInfo::NetworkMode, const QString&)), this,
hgs
parents:
diff changeset
    47
        SLOT(handleNetworkNameChanged(QSystemNetworkInfo::NetworkMode, const QString&)));
hgs
parents:
diff changeset
    48
    safe_connect(m_networkInfo, SIGNAL(networkSignalStrengthChanged(
hgs
parents:
diff changeset
    49
        QSystemNetworkInfo::NetworkMode, int)), this,
hgs
parents:
diff changeset
    50
        SLOT(handleNetworkSignalStrengthChanged(QSystemNetworkInfo::NetworkMode, int)));
hgs
parents:
diff changeset
    51
    safe_connect(m_networkInfo, SIGNAL(networkStatusChanged(
hgs
parents:
diff changeset
    52
        QSystemNetworkInfo::NetworkMode, QSystemNetworkInfo::NetworkStatus)), this,
hgs
parents:
diff changeset
    53
        SLOT(handleNetworkStatusChanged(QSystemNetworkInfo::NetworkMode, QSystemNetworkInfo::NetworkStatus)));
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
#ifdef QT_MOBILITY_BEARER_MANAGEMENT
hgs
parents:
diff changeset
    56
    // Get the singleton instance of WebNetworkConnectionManager 
hgs
parents:
diff changeset
    57
    WRT::WebNetworkConnectionManager &webNetworkConnectionManager 
hgs
parents:
diff changeset
    58
    	  = WRT::WebNetworkConnectionManagerSingleton::Instance();
hgs
parents:
diff changeset
    59
    
hgs
parents:
diff changeset
    60
    safe_connect(&webNetworkConnectionManager, SIGNAL(networkOnlineStateChanged(bool)),
hgs
parents:
diff changeset
    61
        this, SLOT(handleNetworkOnlineStateChanged(bool)));
hgs
parents:
diff changeset
    62
    safe_connect(&webNetworkConnectionManager, SIGNAL(networkSessionNameChanged(
hgs
parents:
diff changeset
    63
        QSystemNetworkInfo::NetworkMode, const QString&)), this,
hgs
parents:
diff changeset
    64
        SLOT(handleNetworkSessionNameChanged(QSystemNetworkInfo::NetworkMode, const QString&)));
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
      // Update all configurations
hgs
parents:
diff changeset
    67
    webNetworkConnectionManager.updateConfigurations();
hgs
parents:
diff changeset
    68
#endif // QT_MOBILITY_BEARER_MANAGEMENT
hgs
parents:
diff changeset
    69
}
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
SystemNetworkImpl::~SystemNetworkImpl()
hgs
parents:
diff changeset
    72
{
hgs
parents:
diff changeset
    73
    delete m_networkInfo;
hgs
parents:
diff changeset
    74
}
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
//! Gets the network name for the current network mode.
hgs
parents:
diff changeset
    77
QString SystemNetworkImpl::getNetworkName() const
hgs
parents:
diff changeset
    78
{
hgs
parents:
diff changeset
    79
    QString netName;
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
    switch(m_currentMode) {
hgs
parents:
diff changeset
    82
        case QSystemNetworkInfo::WlanMode:
hgs
parents:
diff changeset
    83
        case QSystemNetworkInfo::EthernetMode:
hgs
parents:
diff changeset
    84
        case QSystemNetworkInfo::BluetoothMode:
hgs
parents:
diff changeset
    85
        case QSystemNetworkInfo::WimaxMode:
hgs
parents:
diff changeset
    86
            // for wireless cases use name from session.
hgs
parents:
diff changeset
    87
#ifdef QT_MOBILITY_BEARER_MANAGEMENT
hgs
parents:
diff changeset
    88
            netName = m_sessionNetworkName;
hgs
parents:
diff changeset
    89
#else
hgs
parents:
diff changeset
    90
            netName = m_networkInfo->networkName(m_currentMode);
hgs
parents:
diff changeset
    91
            // if WLAN SSID name is unknown show "WiFi"
hgs
parents:
diff changeset
    92
            if (netName == "")
hgs
parents:
diff changeset
    93
                netName = "WiFi";
hgs
parents:
diff changeset
    94
#endif // QT_MOBILITY_BEARER_MANAGEMENT
hgs
parents:
diff changeset
    95
            break;
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
        default:
hgs
parents:
diff changeset
    98
            netName = m_networkInfo->networkName(m_currentMode);
hgs
parents:
diff changeset
    99
            break;
hgs
parents:
diff changeset
   100
    }
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
    qDebug() << "SystemNetworkImpl::getNetworkName: network name " << netName;
hgs
parents:
diff changeset
   103
    return (netName);
hgs
parents:
diff changeset
   104
}
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
//! Gets the network signal strength for the current network mode.
hgs
parents:
diff changeset
   107
int SystemNetworkImpl::getNetworkSignalStrength() const
hgs
parents:
diff changeset
   108
{
hgs
parents:
diff changeset
   109
    int strength = m_networkInfo->networkSignalStrength(m_currentMode);
hgs
parents:
diff changeset
   110
    
hgs
parents:
diff changeset
   111
    // Strength in WLAN mode is reported as -1 by QtMobility
hgs
parents:
diff changeset
   112
    if ((strength == -1) && (m_currentMode == QSystemNetworkInfo::WlanMode)) {
hgs
parents:
diff changeset
   113
        strength = 100;
hgs
parents:
diff changeset
   114
    }
hgs
parents:
diff changeset
   115
    
hgs
parents:
diff changeset
   116
    return (strength);
hgs
parents:
diff changeset
   117
}
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
//! Handles the networkNetworkModeChanged signal from system network info.
hgs
parents:
diff changeset
   120
/*!
hgs
parents:
diff changeset
   121
  \param mode network mode of connection that changed
hgs
parents:
diff changeset
   122
*/
hgs
parents:
diff changeset
   123
void SystemNetworkImpl::handleNetworkModeChanged(
hgs
parents:
diff changeset
   124
    QSystemNetworkInfo::NetworkMode mode)
hgs
parents:
diff changeset
   125
{
hgs
parents:
diff changeset
   126
    qDebug() << "SystemNetworkImpl::handleNetworkModeChanged" << "Mode:" << mode;
hgs
parents:
diff changeset
   127
}
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
//! Handles the networkSignalStrengthChanged signal from system network info.
hgs
parents:
diff changeset
   130
/*!
hgs
parents:
diff changeset
   131
  \param mode network mode of connection that changed
hgs
parents:
diff changeset
   132
  \param strength new signal strength
hgs
parents:
diff changeset
   133
*/
hgs
parents:
diff changeset
   134
void SystemNetworkImpl::handleNetworkSignalStrengthChanged(
hgs
parents:
diff changeset
   135
    QSystemNetworkInfo::NetworkMode mode, int strength)
hgs
parents:
diff changeset
   136
{
hgs
parents:
diff changeset
   137
    qDebug() << "SystemNetworkImpl::handleNetworkSignalStrengthChanged" << "Mode:" << mode << "strength:" << strength;
hgs
parents:
diff changeset
   138
    
hgs
parents:
diff changeset
   139
    // Only send signal strength changes for current mode.
hgs
parents:
diff changeset
   140
    if (mode == m_currentMode) {
hgs
parents:
diff changeset
   141
        // Unknown mode could mean network error so send negative strength to indicate offline.
hgs
parents:
diff changeset
   142
        if (m_currentMode == QSystemNetworkInfo::UnknownMode)
hgs
parents:
diff changeset
   143
            strength = -1;
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
        qDebug() << "SystemNetworkImpl::handleNetworkSignalStrengthChanged" << "emit strength:" << strength;
hgs
parents:
diff changeset
   146
        emit networkSignalStrengthChanged(strength);
hgs
parents:
diff changeset
   147
    }
hgs
parents:
diff changeset
   148
}
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
//! Handles the networkNameChanged signal from system network info.
hgs
parents:
diff changeset
   151
/*!
hgs
parents:
diff changeset
   152
  \param mode network mode of connection that changed
hgs
parents:
diff changeset
   153
  \param name new network name
hgs
parents:
diff changeset
   154
*/
hgs
parents:
diff changeset
   155
void SystemNetworkImpl::handleNetworkNameChanged(
hgs
parents:
diff changeset
   156
        QSystemNetworkInfo::NetworkMode mode, const QString& name)
hgs
parents:
diff changeset
   157
{
hgs
parents:
diff changeset
   158
    qDebug() << "SystemNetworkImpl::handleNetworkNameChanged" << "Mode:" << mode << "name:" << name;
hgs
parents:
diff changeset
   159
    
hgs
parents:
diff changeset
   160
    // Only send network name changes for current mode.
hgs
parents:
diff changeset
   161
    if (mode == m_currentMode) {
hgs
parents:
diff changeset
   162
        // Now update name.
hgs
parents:
diff changeset
   163
        emit networkNameChanged(name);
hgs
parents:
diff changeset
   164
    }
hgs
parents:
diff changeset
   165
}
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
//! Handles the networkStatusChanged signal from system network info.
hgs
parents:
diff changeset
   168
/*!
hgs
parents:
diff changeset
   169
  \param mode network mode of connection that changed
hgs
parents:
diff changeset
   170
  \param status network status of connection that changed
hgs
parents:
diff changeset
   171
*/
hgs
parents:
diff changeset
   172
void SystemNetworkImpl::handleNetworkStatusChanged(
hgs
parents:
diff changeset
   173
        QSystemNetworkInfo::NetworkMode mode, QSystemNetworkInfo::NetworkStatus status)
hgs
parents:
diff changeset
   174
{
hgs
parents:
diff changeset
   175
    qDebug() << "SystemNetworkImpl::handleNetworkStatusChanged" << "mode: " << mode << "status: " << status; 
hgs
parents:
diff changeset
   176
}
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
#ifdef QT_MOBILITY_BEARER_MANAGEMENT
hgs
parents:
diff changeset
   179
//! Handles online state changed signal from the web network connection manager.
hgs
parents:
diff changeset
   180
/*!
hgs
parents:
diff changeset
   181
  \param mode network mode of connection that changed
hgs
parents:
diff changeset
   182
*/
hgs
parents:
diff changeset
   183
void SystemNetworkImpl::handleNetworkOnlineStateChanged(bool isOnline)
hgs
parents:
diff changeset
   184
{
hgs
parents:
diff changeset
   185
    qDebug() << "SystemNetworkImpl::handleOnlineStateChanged" << "isOnline:" << isOnline;
hgs
parents:
diff changeset
   186
    
hgs
parents:
diff changeset
   187
    // Offline indicates no active network configurations.
hgs
parents:
diff changeset
   188
    if (!isOnline) {
hgs
parents:
diff changeset
   189
        qDebug() << "SystemNetworkImpl::handleOnlineStateChanged: change mode to unknown, emit -1 str";
hgs
parents:
diff changeset
   190
        m_currentMode = QSystemNetworkInfo::UnknownMode;
hgs
parents:
diff changeset
   191
        // negative strength indicates offline to UI
hgs
parents:
diff changeset
   192
        emit networkSignalStrengthChanged(-1);
hgs
parents:
diff changeset
   193
    }
hgs
parents:
diff changeset
   194
    // Online indicates at least 1 active network config but not necessarily 
hgs
parents:
diff changeset
   195
    // one being used by the browser.
hgs
parents:
diff changeset
   196
}
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198
void SystemNetworkImpl::handleNetworkSessionNameChanged(QSystemNetworkInfo::NetworkMode mode, const QString& name)
hgs
parents:
diff changeset
   199
{
hgs
parents:
diff changeset
   200
    // UI must get non-negative strength to indicate online status
hgs
parents:
diff changeset
   201
    int strength = m_networkInfo->networkSignalStrength(mode);
hgs
parents:
diff changeset
   202
    
hgs
parents:
diff changeset
   203
    qDebug() << "SystemNetworkImpl::handleNetworkSessionNameChanged" << "Mode:" << mode << "name:" << name << "strength:" << strength;
hgs
parents:
diff changeset
   204
    
hgs
parents:
diff changeset
   205
    switch (mode) {
hgs
parents:
diff changeset
   206
        case QSystemNetworkInfo::WlanMode:
hgs
parents:
diff changeset
   207
        case QSystemNetworkInfo::EthernetMode:
hgs
parents:
diff changeset
   208
        case QSystemNetworkInfo::BluetoothMode:
hgs
parents:
diff changeset
   209
        case QSystemNetworkInfo::WimaxMode:
hgs
parents:
diff changeset
   210
            // for wireless cases use name from session.
hgs
parents:
diff changeset
   211
            m_sessionNetworkName = name;
hgs
parents:
diff changeset
   212
            break;
hgs
parents:
diff changeset
   213
hgs
parents:
diff changeset
   214
        default:
hgs
parents:
diff changeset
   215
            // clear session name - not needed in this mode
hgs
parents:
diff changeset
   216
            m_sessionNetworkName = "";
hgs
parents:
diff changeset
   217
            break;
hgs
parents:
diff changeset
   218
    }
hgs
parents:
diff changeset
   219
hgs
parents:
diff changeset
   220
#ifdef WCDMA2GSM_WORKAROUND
hgs
parents:
diff changeset
   221
    // Work around for QtMobility issue. Bearer management reports WCDMA bearer but
hgs
parents:
diff changeset
   222
    // QSystemNetworkInfo sees connection as GSM mode. 
hgs
parents:
diff changeset
   223
    if ((mode == QSystemNetworkInfo::WcdmaMode) && (strength < 0)) {
hgs
parents:
diff changeset
   224
        strength = m_networkInfo->networkSignalStrength(QSystemNetworkInfo::GsmMode);
hgs
parents:
diff changeset
   225
        if (strength >= 0)
hgs
parents:
diff changeset
   226
            mode = QSystemNetworkInfo::GsmMode;
hgs
parents:
diff changeset
   227
    }
hgs
parents:
diff changeset
   228
#endif
hgs
parents:
diff changeset
   229
hgs
parents:
diff changeset
   230
    qDebug() << "SystemNetworkImpl::handleNetworkSessionNameChanged: set mode to " << mode;
hgs
parents:
diff changeset
   231
    m_currentMode = mode;
hgs
parents:
diff changeset
   232
hgs
parents:
diff changeset
   233
    // emit signal strength of new connection,
hgs
parents:
diff changeset
   234
    // use wrapper access method for correct WLAN strength
hgs
parents:
diff changeset
   235
    qDebug() << "SystemNetworkImpl::handleNetworkSessionNameChanged: emit str=" << getNetworkSignalStrength();
hgs
parents:
diff changeset
   236
    emit networkSignalStrengthChanged(getNetworkSignalStrength());
hgs
parents:
diff changeset
   237
hgs
parents:
diff changeset
   238
    // Update network name on mode change.
hgs
parents:
diff changeset
   239
    qDebug() << "SystemNetworkImpl::handleNetworkSessionNameChanged: emit network name= " << getNetworkName();
hgs
parents:
diff changeset
   240
    emit networkNameChanged(getNetworkName());
hgs
parents:
diff changeset
   241
}
hgs
parents:
diff changeset
   242
#endif // QT_MOBILITY_BEARER_MANAGEMENT
hgs
parents:
diff changeset
   243
hgs
parents:
diff changeset
   244
} // GVA