| 1 | /**************************************************************************** | 
| 2 | ** | 
| 3 | ** Copyright (C) 2015 The Qt Company Ltd and/or its subsidiary(-ies). | 
| 4 | ** Contact: http://www.qt-project.org/legal | 
| 5 | ** | 
| 6 | ** This file is part of the QtSystems module of the Qt Toolkit. | 
| 7 | ** | 
| 8 | ** $QT_BEGIN_LICENSE:LGPL21$ | 
| 9 | ** Commercial License Usage | 
| 10 | ** Licensees holding valid commercial Qt licenses may use this file in | 
| 11 | ** accordance with the commercial license agreement provided with the | 
| 12 | ** Software or, alternatively, in accordance with the terms contained in | 
| 13 | ** a written agreement between you and The Qt Company. For licensing terms | 
| 14 | ** and conditions see http://www.qt.io/terms-conditions. For further | 
| 15 | ** information use the contact form at http://www.qt.io/contact-us. | 
| 16 | ** | 
| 17 | ** GNU Lesser General Public License Usage | 
| 18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | 
| 19 | ** General Public License version 2.1 or version 3 as published by the Free | 
| 20 | ** Software Foundation and appearing in the file LICENSE.LGPLv21 and | 
| 21 | ** LICENSE.LGPLv3 included in the packaging of this file. Please review the | 
| 22 | ** following information to ensure the GNU Lesser General Public License | 
| 23 | ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and | 
| 24 | ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | 
| 25 | ** | 
| 26 | ** As a special exception, The Qt Company gives you certain additional | 
| 27 | ** rights. These rights are described in The Qt Company LGPL Exception | 
| 28 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | 
| 29 | ** | 
| 30 | ** $QT_END_LICENSE$ | 
| 31 | ** | 
| 32 | ****************************************************************************/ | 
| 33 |  | 
| 34 | #include "qnetworkinfo.h" | 
| 35 |  | 
| 36 | #if defined(QT_SIMULATOR) | 
| 37 | #  include "simulator/qsysteminfo_simulator_p.h" | 
| 38 | #elif defined(Q_OS_LINUX) | 
| 39 | #  include "linux/qnetworkinfo_linux_p.h" | 
| 40 | #elif defined(Q_OS_WIN) | 
| 41 | #  include "windows/qnetworkinfo_win_p.h" | 
| 42 | #elif defined(Q_OS_MAC) | 
| 43 | #  include "mac/qnetworkinfo_mac_p.h" | 
| 44 | #else | 
| 45 | QT_BEGIN_NAMESPACE | 
| 46 | class QNetworkInfoPrivate | 
| 47 | { | 
| 48 | public: | 
| 49 |     QNetworkInfoPrivate(QNetworkInfo *) {} | 
| 50 |  | 
| 51 |     int networkInterfaceCount(QNetworkInfo::NetworkMode) { return -1; } | 
| 52 |     int networkSignalStrength(QNetworkInfo::NetworkMode, int) { return -1; } | 
| 53 |     QNetworkInfo::CellDataTechnology currentCellDataTechnology(int) { return QNetworkInfo::UnknownDataTechnology; } | 
| 54 |     QNetworkInfo::NetworkMode currentNetworkMode() { return QNetworkInfo::UnknownMode; } | 
| 55 |     QNetworkInfo::NetworkStatus networkStatus(QNetworkInfo::NetworkMode, int) { return QNetworkInfo::UnknownStatus; } | 
| 56 | #ifndef QT_NO_NETWORKINTERFACE | 
| 57 |     QNetworkInterface interfaceForMode(QNetworkInfo::NetworkMode, int) { return QNetworkInterface(); } | 
| 58 | #endif // QT_NO_NETWORKINTERFACE | 
| 59 |     QString cellId(int) { return QString(); } | 
| 60 |     QString currentMobileCountryCode(int) { return QString(); } | 
| 61 |     QString currentMobileNetworkCode(int) { return QString(); } | 
| 62 |     QString homeMobileCountryCode(int) { return QString(); } | 
| 63 |     QString homeMobileNetworkCode(int) { return QString(); } | 
| 64 |     QString imsi(int) { return QString(); } | 
| 65 |     QString locationAreaCode(int) { return QString(); } | 
| 66 |     QString macAddress(QNetworkInfo::NetworkMode, int) { return QString(); } | 
| 67 |     QString networkName(QNetworkInfo::NetworkMode, int) { return QString(); } | 
| 68 | }; | 
| 69 | QT_END_NAMESPACE | 
| 70 | #endif | 
| 71 |  | 
| 72 | #include <QtCore/qmetaobject.h> | 
| 73 |  | 
| 74 | QT_BEGIN_NAMESPACE | 
| 75 |  | 
| 76 | /*! | 
| 77 |     \class QNetworkInfo | 
| 78 |     \inmodule QtSystemInfo | 
| 79 |     \brief The QNetworkInfo class provides various information about the network status. | 
| 80 |  | 
| 81 |     \ingroup systeminfo | 
| 82 |  | 
| 83 |     To support the cases where one has multiple interfaces / modems for the same network mode, you | 
| 84 |     can specify which interface you refer to. For those cases, the 'interface' parameter is the index | 
| 85 |     of the interface, starting from 0. | 
| 86 | */ | 
| 87 |  | 
| 88 | /*! | 
| 89 |     \enum QNetworkInfo::CellDataTechnology | 
| 90 |     This enum describes the type of cellular technology. | 
| 91 |  | 
| 92 |     \value UnknownDataTechnology   The cellular technology is unknown or an error occured. | 
| 93 |     \value GprsDataTechnology      General Packet Radio Service (GPRS) data service. | 
| 94 |     \value EdgeDataTechnology      Enhanced Data Rates for GSM Evolution (EDGE) data service. | 
| 95 |     \value UmtsDataTechnology      Universal Mobile Telecommunications System (UMTS) data service. | 
| 96 |     \value HspaDataTechnology      High Speed Packet Access (HSPA) data service. | 
| 97 | */ | 
| 98 |  | 
| 99 | /*! | 
| 100 |     \enum QNetworkInfo::NetworkMode | 
| 101 |     This enumeration describes the type of the network. | 
| 102 |  | 
| 103 |     \value UnknownMode     The network is unknown or an error occured. | 
| 104 |     \value GsmMode         Global System for Mobile (GSM) network. | 
| 105 |     \value CdmaMode        Code Division Multiple Access (CDMA) network. | 
| 106 |     \value WcdmaMode       Wideband Code Division Multiple Access (WCDMA) network. | 
| 107 |     \value WlanMode        Wireless local area network (WLAN) network. | 
| 108 |     \value EthernetMode    Local area network (LAN), or Ethernet network. | 
| 109 |     \value BluetoothMode   Bluetooth network. | 
| 110 |     \value WimaxMode       Worldwide Interoperability for Microwave Access (WiMAX) network. | 
| 111 |     \value LteMode         3GPP Long Term Evolution (LTE) network. | 
| 112 |     \value TdscdmaMode     Time Division Synchronous Code Division Multiple Access (TD-SCDMA) network. | 
| 113 | */ | 
| 114 |  | 
| 115 | /*! | 
| 116 |     \enum QNetworkInfo::NetworkStatus | 
| 117 |     This enumeration describes the status of the network. | 
| 118 |  | 
| 119 |     \value UnknownStatus        The status is unknown or an error occured. | 
| 120 |     \value NoNetworkAvailable   There is no network available. | 
| 121 |     \value EmergencyOnly        The network only allows emergency calls. | 
| 122 |     \value Searching            The device is searching or connecting to the network. | 
| 123 |     \value Busy                 The network is too busy to be connected. | 
| 124 |     \value Denied               The connection to the network has been denied. | 
| 125 |     \value HomeNetwork          The device is connected to the home network. | 
| 126 |     \value Roaming              The device is connected to some roaming network. | 
| 127 | */ | 
| 128 |  | 
| 129 | /*! | 
| 130 |     \fn void QNetworkInfo::cellIdChanged(int interface, const QString &id) | 
| 131 |  | 
| 132 |     This signal is emitted whenever the cell ID for \a interface has changed to \a id. | 
| 133 | */ | 
| 134 |  | 
| 135 | /*! | 
| 136 |     \fn void QNetworkInfo::currentCellDataTechnologyChanged(int interface, QNetworkInfo::CellDataTechnology tech) | 
| 137 |  | 
| 138 |     This signal is emitted whenever the current cell data technology for \a interface has changed to \a tech. | 
| 139 | */ | 
| 140 |  | 
| 141 | /*! | 
| 142 |     \fn void QNetworkInfo::currentMobileCountryCodeChanged(int interface, const QString &mcc) | 
| 143 |  | 
| 144 |     This signal is emitted whenever the current Mobile Country Code (MCC) for \a interface has changed | 
| 145 |     to \a mcc. | 
| 146 | */ | 
| 147 |  | 
| 148 | /*! | 
| 149 |     \fn void QNetworkInfo::currentMobileNetworkCodeChanged(int interface, const QString &mnc) | 
| 150 |  | 
| 151 |     This signal is emitted whenever the current Mobile Network Code (MNC) for \a interface has changed | 
| 152 |     to \a mnc. | 
| 153 | */ | 
| 154 |  | 
| 155 | /*! | 
| 156 |     \fn void QNetworkInfo::currentNetworkModeChanged(QNetworkInfo::NetworkMode mode) | 
| 157 |  | 
| 158 |     This signal is emitted whenever the current network has changed to \a mode. | 
| 159 | */ | 
| 160 |  | 
| 161 | /*! | 
| 162 |     \fn void QNetworkInfo::locationAreaCodeChanged(int interface, const QString &lac) | 
| 163 |  | 
| 164 |     This signal is emitted whenever the location area code for \a interface has changed to \a lac. | 
| 165 | */ | 
| 166 |  | 
| 167 | /*! | 
| 168 |     \fn void QNetworkInfo::networkInterfaceCountChanged(QNetworkInfo::NetworkMode mode, int count) | 
| 169 |  | 
| 170 |     This signal is emitted whenever the number of interfaces for the \a mode has changed to \a count. | 
| 171 | */ | 
| 172 |  | 
| 173 | /*! | 
| 174 |     \fn void QNetworkInfo::networkNameChanged(QNetworkInfo::NetworkMode mode, int interface, const QString &name) | 
| 175 |  | 
| 176 |     This signal is emitted whenever the name for the \a interface of \a mode has changed to \a name. | 
| 177 | */ | 
| 178 |  | 
| 179 | /*! | 
| 180 |     \fn void QNetworkInfo::networkSignalStrengthChanged(QNetworkInfo::NetworkMode mode, int interface, int strength) | 
| 181 |  | 
| 182 |     This signal is emitted whenever the signal strength for the \a interface of \a mode has changed | 
| 183 |     to \a strength. | 
| 184 | */ | 
| 185 |  | 
| 186 | /*! | 
| 187 |     \fn void QNetworkInfo::networkStatusChanged(QNetworkInfo::NetworkMode mode, int interface, QNetworkInfo::NetworkStatus status) | 
| 188 |  | 
| 189 |     This signal is emitted whenever the status for the \a interface of \a mode has changed to \a status. | 
| 190 | */ | 
| 191 |  | 
| 192 | /*! | 
| 193 |     Constructs a QNetworkInfo object with the given \a parent. | 
| 194 | */ | 
| 195 | QNetworkInfo::QNetworkInfo(QObject *parent) | 
| 196 |     : QObject(parent) | 
| 197 | #if !defined(QT_SIMULATOR) | 
| 198 |     , d_ptr(new QNetworkInfoPrivate(this)) | 
| 199 | #else | 
| 200 |     , d_ptr(new QNetworkInfoSimulator(this)) | 
| 201 | #endif // QT_SIMULATOR | 
| 202 | { | 
| 203 | } | 
| 204 |  | 
| 205 | /*! | 
| 206 |     Destroys the object | 
| 207 | */ | 
| 208 | QNetworkInfo::~QNetworkInfo() | 
| 209 | { | 
| 210 |     delete d_ptr; | 
| 211 | } | 
| 212 |  | 
| 213 | /*! | 
| 214 |     Returns the number of interfaces for the \a mode. If the information is not available, or error | 
| 215 |     occurs, -1 is returned. | 
| 216 | */ | 
| 217 | int QNetworkInfo::networkInterfaceCount(QNetworkInfo::NetworkMode mode) const | 
| 218 | { | 
| 219 |     return d_ptr->networkInterfaceCount(mode); | 
| 220 | } | 
| 221 |  | 
| 222 | /*! | 
| 223 |     Returns the signal strength for \a interfaceDevice of \a mode, in 0 - 100 scale. If the information | 
| 224 |     is not available, or error occurs, -1 is returned. | 
| 225 | */ | 
| 226 | int QNetworkInfo::networkSignalStrength(QNetworkInfo::NetworkMode mode, int interfaceDevice) const | 
| 227 | { | 
| 228 |     return d_ptr->networkSignalStrength(mode, interface: interfaceDevice); | 
| 229 | } | 
| 230 |  | 
| 231 | /*! | 
| 232 |     Returns the current cell data technology used for \a interfaceDevice. | 
| 233 | */ | 
| 234 | QNetworkInfo::CellDataTechnology QNetworkInfo::currentCellDataTechnology(int interfaceDevice) const | 
| 235 | { | 
| 236 |     return d_ptr->currentCellDataTechnology(interface: interfaceDevice); | 
| 237 | } | 
| 238 |  | 
| 239 | /*! | 
| 240 |     Returns the current active network mode. If there are more than one modes activated, the preferred | 
| 241 |     one is returned. | 
| 242 | */ | 
| 243 | QNetworkInfo::NetworkMode QNetworkInfo::currentNetworkMode() const | 
| 244 | { | 
| 245 |     return d_ptr->currentNetworkMode(); | 
| 246 | } | 
| 247 |  | 
| 248 | /*! | 
| 249 |     Returns the current status for \a interfaceDevice of \a mode. | 
| 250 | */ | 
| 251 | QNetworkInfo::NetworkStatus QNetworkInfo::networkStatus(QNetworkInfo::NetworkMode mode, int interfaceDevice) const | 
| 252 | { | 
| 253 |     return d_ptr->networkStatus(mode, interface: interfaceDevice); | 
| 254 | } | 
| 255 |  | 
| 256 | #ifndef QT_NO_NETWORKINTERFACE | 
| 257 | /*! | 
| 258 |     Returns the first found interface for \a interfaceDevice of \a mode. If none is found, or it can't be | 
| 259 |     represented by QNetworkInterface (e.g. Bluetooth), and empty object is returned. | 
| 260 | */ | 
| 261 | QNetworkInterface QNetworkInfo::interfaceForMode(QNetworkInfo::NetworkMode mode, int interfaceDevice) const | 
| 262 | { | 
| 263 |     return d_ptr->interfaceForMode(mode, interface: interfaceDevice); | 
| 264 | } | 
| 265 | #endif // QT_NO_NETWORKINTERFACE | 
| 266 |  | 
| 267 | /*! | 
| 268 |     Returns the cell ID of the connected tower or based station for \a interfaceDevice. If this information | 
| 269 |     is not available or error occurs, an empty string is returned. | 
| 270 | */ | 
| 271 | QString QNetworkInfo::cellId(int interfaceDevice) const | 
| 272 | { | 
| 273 |     return d_ptr->cellId(interface: interfaceDevice); | 
| 274 | } | 
| 275 |  | 
| 276 | /*! | 
| 277 |     Returns the current Mobile Country Code (MCC) for \a interfaceDevice. An empty string is returned if the | 
| 278 |     information is not available or an error occurs. | 
| 279 | */ | 
| 280 | QString QNetworkInfo::currentMobileCountryCode(int interfaceDevice) const | 
| 281 | { | 
| 282 |     return d_ptr->currentMobileCountryCode(interface: interfaceDevice); | 
| 283 | } | 
| 284 |  | 
| 285 | /*! | 
| 286 |     Returns the current Mobile Network Code (MNC) for \a interfaceDevice. An empty string is returned if the | 
| 287 |     information is not available or an error occurs. | 
| 288 | */ | 
| 289 | QString QNetworkInfo::currentMobileNetworkCode(int interfaceDevice) const | 
| 290 | { | 
| 291 |     return d_ptr->currentMobileNetworkCode(interface: interfaceDevice); | 
| 292 | } | 
| 293 |  | 
| 294 | /*! | 
| 295 |     Returns the home Mobile Country Code (MCC) for \a interfaceDevice. An empty string is returned if the | 
| 296 |     information is not available or an error occurs. | 
| 297 | */ | 
| 298 | QString QNetworkInfo::homeMobileCountryCode(int interfaceDevice) const | 
| 299 | { | 
| 300 |     return d_ptr->homeMobileCountryCode(interface: interfaceDevice); | 
| 301 | } | 
| 302 |  | 
| 303 | /*! | 
| 304 |     Returns the home Mobile Network Code (MNC) for \a interfaceDevice. An empty string is returned if the | 
| 305 |     information is not available or an error occurs. | 
| 306 | */ | 
| 307 | QString QNetworkInfo::homeMobileNetworkCode(int interfaceDevice) const | 
| 308 | { | 
| 309 |     return d_ptr->homeMobileNetworkCode(interface: interfaceDevice); | 
| 310 | } | 
| 311 |  | 
| 312 | /*! | 
| 313 |     Returns the International Mobile Subscriber Identity (IMSI) for \a interfaceDevice. If this information is | 
| 314 |     not available, or error occurs, an empty string is returned. | 
| 315 | */ | 
| 316 | QString QNetworkInfo::imsi(int interfaceDevice) const | 
| 317 | { | 
| 318 |     return d_ptr->imsi(interface: interfaceDevice); | 
| 319 | } | 
| 320 |  | 
| 321 | /*! | 
| 322 |     Returns the location area code of the current cellular radio network for \a interfaceDevice. If this information | 
| 323 |     is not available or error occurs, an empty string is returned. | 
| 324 | */ | 
| 325 | QString QNetworkInfo::locationAreaCode(int interfaceDevice) const | 
| 326 | { | 
| 327 |     return d_ptr->locationAreaCode(interface: interfaceDevice); | 
| 328 | } | 
| 329 |  | 
| 330 | /*! | 
| 331 |     Returns the MAC address for \a interfaceDevice of \a mode. If the MAC address is not available or error | 
| 332 |     occurs, an empty string is returned. | 
| 333 | */ | 
| 334 | QString QNetworkInfo::macAddress(QNetworkInfo::NetworkMode mode, int interfaceDevice) const | 
| 335 | { | 
| 336 |     return d_ptr->macAddress(mode, interface: interfaceDevice); | 
| 337 | } | 
| 338 |  | 
| 339 | /*! | 
| 340 |     Returns the name of the operator for \a interfaceDevice of \a mode. If the information is not available, | 
| 341 |     or an error occurs, an empty string is returned. | 
| 342 |  | 
| 343 |     In case of WLAN, the SSID is returned; for Ethernet, the domain name is returned if available. | 
| 344 | */ | 
| 345 | QString QNetworkInfo::networkName(QNetworkInfo::NetworkMode mode, int interfaceDevice) const | 
| 346 | { | 
| 347 |     return d_ptr->networkName(mode, interface: interfaceDevice); | 
| 348 | } | 
| 349 |  | 
| 350 | extern QMetaMethod proxyToSourceSignal(const QMetaMethod &, QObject *); | 
| 351 |  | 
| 352 | /*! | 
| 353 |     \internal | 
| 354 | */ | 
| 355 | void QNetworkInfo::connectNotify(const QMetaMethod &signal) | 
| 356 | { | 
| 357 | #if defined(Q_OS_LINUX) || defined(Q_OS_WIN) || defined(QT_SIMULATOR) || defined(Q_OS_MAC) | 
| 358 |     QMetaMethod sourceSignal = proxyToSourceSignal(signal, d_ptr); | 
| 359 |     connect(sender: d_ptr, signal: sourceSignal, receiver: this, method: signal, type: Qt::UniqueConnection); | 
| 360 | #else | 
| 361 |     Q_UNUSED(signal) | 
| 362 | #endif | 
| 363 | } | 
| 364 |  | 
| 365 | /*! | 
| 366 |     \internal | 
| 367 | */ | 
| 368 | void QNetworkInfo::disconnectNotify(const QMetaMethod &signal) | 
| 369 | { | 
| 370 | #if defined(Q_OS_LINUX) || defined(Q_OS_WIN) || defined(QT_SIMULATOR) || defined(Q_OS_MAC) | 
| 371 |     // We can only disconnect with the private implementation, when there is no receivers for the signal. | 
| 372 |     if (isSignalConnected(signal)) | 
| 373 |         return; | 
| 374 |  | 
| 375 |     QMetaMethod sourceSignal = proxyToSourceSignal(signal, d_ptr); | 
| 376 |     disconnect(sender: d_ptr, signal: sourceSignal, receiver: this, member: signal); | 
| 377 | #else | 
| 378 |     Q_UNUSED(signal) | 
| 379 | #endif | 
| 380 | } | 
| 381 |  | 
| 382 | QT_END_NAMESPACE | 
| 383 |  |