From 520b10be4cab66f3f66d3692d0bbbef57eff09e1 Mon Sep 17 00:00:00 2001 From: Lorn Potter Date: Tue, 7 Oct 2014 17:18:09 +1000 Subject: Add better mobile connections to QtBearer NetworkManager backend. Task-number: QTBUG-41807 Change-Id: Ifb5904d4887111416b4bb1a32d6d056029186f5c Reviewed-by: Lorn Potter --- .../networkmanager/qnetworkmanagerengine.cpp | 39 ++++++++--- .../networkmanager/qnetworkmanagerservice.cpp | 75 ++++++++++++++++++++++ .../bearer/networkmanager/qnetworkmanagerservice.h | 37 +++++++++++ 3 files changed, 142 insertions(+), 9 deletions(-) diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp index 105531c7f1..ec5666d36c 100644 --- a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp +++ b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp @@ -67,10 +67,6 @@ QNetworkManagerEngine::QNetworkManagerEngine(QObject *parent) this, SLOT(deviceAdded(QDBusObjectPath))); connect(interface, SIGNAL(deviceRemoved(QDBusObjectPath)), this, SLOT(deviceRemoved(QDBusObjectPath))); -#if 0 - connect(interface, SIGNAL(stateChanged(QString,quint32)), - this, SIGNAL(configurationsChanged())); -#endif connect(interface, SIGNAL(activationFinished(QDBusPendingCallWatcher*)), this, SLOT(activationFinished(QDBusPendingCallWatcher*))); connect(interface, SIGNAL(propertiesChanged(QString,QMap)), @@ -586,7 +582,7 @@ void QNetworkManagerEngine::newAccessPoint(const QString &path, const QDBusObjec ptr->isValid = true; ptr->id = objectPath.path(); ptr->type = QNetworkConfiguration::InternetAccessPoint; - if(accessPoint->flags() == NM_802_11_AP_FLAGS_PRIVACY) { + if (accessPoint->flags() == NM_802_11_AP_FLAGS_PRIVACY) { ptr->purpose = QNetworkConfiguration::PrivatePurpose; } else { ptr->purpose = QNetworkConfiguration::PublicPurpose; @@ -724,7 +720,7 @@ QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QStri const QString connectionSsid = map.value("802-11-wireless").value("ssid").toString(); const QString connectionSecurity = map.value("802-11-wireless").value("security").toString(); - if(!connectionSecurity.isEmpty()) { + if (!connectionSecurity.isEmpty()) { cpPriv->purpose = QNetworkConfiguration::PrivatePurpose; } else { cpPriv->purpose = QNetworkConfiguration::PublicPurpose; @@ -749,9 +745,34 @@ QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QStri break; } } - } else if (connectionType == "gsm") { - cpPriv->bearerType = QNetworkConfiguration::Bearer2G; - } else if (connectionType == "cdma") { + } else if (connectionType == QLatin1String("gsm")) { + + foreach (const QDBusObjectPath &devicePath, interface->getDevices()) { + QNetworkManagerInterfaceDevice device(devicePath.path()); + + if (device.deviceType() == DEVICE_TYPE_GSM) { + QNetworkManagerInterfaceDeviceModem deviceModem(device.connectionInterface()->path(),this); + switch (deviceModem.currentCapabilities()) { + case 2: + cpPriv->bearerType = QNetworkConfiguration::Bearer2G; + break; + case 4: + cpPriv->bearerType = QNetworkConfiguration::Bearer3G; + break; + case 8: + cpPriv->bearerType = QNetworkConfiguration::Bearer4G; + break; + default: + cpPriv->bearerType = QNetworkConfiguration::BearerUnknown; + break; + }; + } + } + + cpPriv->purpose = QNetworkConfiguration::PrivatePurpose; + cpPriv->state |= QNetworkConfiguration::Discovered; + } else if (connectionType == QLatin1String("cdma")) { + cpPriv->purpose = QNetworkConfiguration::PrivatePurpose; cpPriv->bearerType = QNetworkConfiguration::BearerCDMA2000; } diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp index a7d1289b38..d154f1187e 100644 --- a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp +++ b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp @@ -568,6 +568,81 @@ quint32 QNetworkManagerInterfaceDeviceWireless::wirelessCapabilities() const return d->connectionInterface->property("WirelelessCapabilities").toUInt(); } +class QNetworkManagerInterfaceDeviceModemPrivate +{ +public: + QDBusInterface *connectionInterface; + QString path; + bool valid; +}; + +QNetworkManagerInterfaceDeviceModem::QNetworkManagerInterfaceDeviceModem(const QString &ifaceDevicePath, QObject *parent) + : QObject(parent), nmDBusHelper(0) +{ + d = new QNetworkManagerInterfaceDeviceModemPrivate(); + d->path = ifaceDevicePath; + d->connectionInterface = new QDBusInterface(QLatin1String(NM_DBUS_SERVICE), + d->path, + QLatin1String(NM_DBUS_INTERFACE_DEVICE_MODEM), + QDBusConnection::systemBus(), parent); + if (!d->connectionInterface->isValid()) { + d->valid = false; + return; + } + d->valid = true; +} + +QNetworkManagerInterfaceDeviceModem::~QNetworkManagerInterfaceDeviceModem() +{ + delete d->connectionInterface; + delete d; +} + +bool QNetworkManagerInterfaceDeviceModem::isValid() +{ + + return d->valid; +} + +bool QNetworkManagerInterfaceDeviceModem::setConnections() +{ + if (!isValid() ) + return false; + + bool allOk = false; + + delete nmDBusHelper; + nmDBusHelper = new QNmDBusHelper(this); + connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap)), + this,SIGNAL(propertiesChanged(QString,QMap))); + if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE), + d->path, + QLatin1String(NM_DBUS_INTERFACE_DEVICE_MODEM), + QLatin1String("PropertiesChanged"), + nmDBusHelper,SLOT(slotDevicePropertiesChanged(QMap))) ) { + allOk = true; + } + return allOk; +} + +QDBusInterface *QNetworkManagerInterfaceDeviceModem::connectionInterface() const +{ + return d->connectionInterface; +} + +quint32 QNetworkManagerInterfaceDeviceModem::modemCapabilities() const +{ + return d->connectionInterface->property("ModemCapabilities").toUInt(); +} + +quint32 QNetworkManagerInterfaceDeviceModem::currentCapabilities() const +{ + return d->connectionInterface->property("CurrentCapabilities").toUInt(); +} + + + + class QNetworkManagerSettingsPrivate { public: diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h index 25e6d3cf3a..8cda02482b 100644 --- a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h +++ b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h @@ -98,6 +98,7 @@ typedef enum #define NM_DBUS_INTERFACE_DEVICE NM_DBUS_INTERFACE ".Device" #define NM_DBUS_INTERFACE_DEVICE_WIRED NM_DBUS_INTERFACE_DEVICE ".Wired" #define NM_DBUS_INTERFACE_DEVICE_WIRELESS NM_DBUS_INTERFACE_DEVICE ".Wireless" +#define NM_DBUS_INTERFACE_DEVICE_MODEM NM_DBUS_INTERFACE_DEVICE ".Modem" #define NM_DBUS_PATH_ACCESS_POINT NM_DBUS_PATH "/AccessPoint" #define NM_DBUS_INTERFACE_ACCESS_POINT NM_DBUS_INTERFACE ".AccessPoint" @@ -329,6 +330,42 @@ private: QNmDBusHelper *nmDBusHelper; }; +class QNetworkManagerInterfaceDeviceModemPrivate; +class QNetworkManagerInterfaceDeviceModem : public QObject +{ + Q_OBJECT + +public: + + enum ModemCapability { + None = 0x0, + Pots = 0x1, + Cmda_Edvo = 0x2, + Gsm_Umts = 0x4, + Lte = 0x08 + }; + + explicit QNetworkManagerInterfaceDeviceModem(const QString &ifaceDevicePath, + QObject *parent = 0); + ~QNetworkManagerInterfaceDeviceModem(); + + QDBusObjectPath path() const; + QDBusInterface *connectionInterface() const; + + bool setConnections(); + bool isValid(); + + quint32 modemCapabilities() const; + quint32 currentCapabilities() const; + +Q_SIGNALS: + void propertiesChanged( const QString &, QMap); +private: + QNetworkManagerInterfaceDeviceModemPrivate *d; + QNmDBusHelper *nmDBusHelper; +}; + + class QNetworkManagerSettingsPrivate; class QNetworkManagerSettings : public QObject { -- cgit v1.2.3