summaryrefslogtreecommitdiffstats
path: root/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp')
-rw-r--r--src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp693
1 files changed, 493 insertions, 200 deletions
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp
index f249ac6100..2d54fa3029 100644
--- a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp
+++ b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp
@@ -44,7 +44,6 @@
#include <QtDBus/QDBusPendingCall>
#include "qnetworkmanagerservice.h"
-#include "qnmdbushelper.h"
#ifndef QT_NO_DBUS
@@ -64,18 +63,38 @@ QNetworkManagerInterface::QNetworkManagerInterface(QObject *parent)
d->connectionInterface = new QDBusInterface(QLatin1String(NM_DBUS_SERVICE),
QLatin1String(NM_DBUS_PATH),
QLatin1String(NM_DBUS_INTERFACE),
- QDBusConnection::systemBus());
+ QDBusConnection::systemBus(),parent);
if (!d->connectionInterface->isValid()) {
d->valid = false;
return;
}
d->valid = true;
- nmDBusHelper = new QNmDBusHelper(this);
- connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)),
- this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)));
- connect(nmDBusHelper,SIGNAL(pathForStateChanged(QString,quint32)),
- this, SIGNAL(stateChanged(QString,quint32)));
+ QDBusInterface managerPropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
+ QLatin1String(NM_DBUS_PATH),
+ QLatin1String("org.freedesktop.DBus.Properties"),
+ QDBusConnection::systemBus());
+ QList<QVariant> argumentList;
+ argumentList << QLatin1String(NM_DBUS_INTERFACE);
+ QDBusPendingReply<QVariantMap> propsReply
+ = managerPropertiesInterface.callWithArgumentList(QDBus::Block,QLatin1String("GetAll"),
+ argumentList);
+ if (!propsReply.isError()) {
+ propertyMap = propsReply.value();
+ }
+
+ QDBusPendingReply<QList <QDBusObjectPath> > nmReply
+ = d->connectionInterface->call(QLatin1String("GetDevices"));
+ nmReply.waitForFinished();
+ if (!nmReply.isError()) {
+ devicesPathList = nmReply.value();
+ }
+
+ QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
+ QLatin1String(NM_DBUS_PATH),
+ QLatin1String(NM_DBUS_INTERFACE),
+ QLatin1String("PropertiesChanged"),
+ this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
}
QNetworkManagerInterface::~QNetworkManagerInterface()
@@ -91,27 +110,24 @@ bool QNetworkManagerInterface::isValid()
bool QNetworkManagerInterface::setConnections()
{
- if(!isValid() )
+ if (!isValid())
return false;
- QDBusConnection dbusConnection = QDBusConnection::systemBus();
-
- bool allOk = false;
- if (dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
+ QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
QLatin1String(NM_DBUS_PATH),
QLatin1String(NM_DBUS_INTERFACE),
QLatin1String("PropertiesChanged"),
- nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>)))) {
- allOk = true;
- }
- if (dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
+ this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
+
+ bool allOk = false;
+ if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
QLatin1String(NM_DBUS_PATH),
QLatin1String(NM_DBUS_INTERFACE),
QLatin1String("DeviceAdded"),
this,SIGNAL(deviceAdded(QDBusObjectPath)))) {
allOk = true;
}
- if (dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
+ if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
QLatin1String(NM_DBUS_PATH),
QLatin1String(NM_DBUS_INTERFACE),
QLatin1String("DeviceRemoved"),
@@ -127,14 +143,17 @@ QDBusInterface *QNetworkManagerInterface::connectionInterface() const
return d->connectionInterface;
}
-QList <QDBusObjectPath> QNetworkManagerInterface::getDevices() const
+QList <QDBusObjectPath> QNetworkManagerInterface::getDevices()
{
- QDBusReply<QList<QDBusObjectPath> > reply = d->connectionInterface->call(QLatin1String("GetDevices"));
- return reply.value();
+ if (devicesPathList.isEmpty()) {
+ qWarning() << "using blocking call!";
+ QDBusReply<QList<QDBusObjectPath> > reply = d->connectionInterface->call(QLatin1String("GetDevices"));
+ devicesPathList = reply.value();
+ }
+ return devicesPathList;
}
-void QNetworkManagerInterface::activateConnection( const QString &,
- QDBusObjectPath connectionPath,
+void QNetworkManagerInterface::activateConnection(QDBusObjectPath connectionPath,
QDBusObjectPath devicePath,
QDBusObjectPath specificObject)
{
@@ -150,28 +169,80 @@ void QNetworkManagerInterface::activateConnection( const QString &,
void QNetworkManagerInterface::deactivateConnection(QDBusObjectPath connectionPath) const
{
- d->connectionInterface->call(QLatin1String("DeactivateConnection"), QVariant::fromValue(connectionPath));
+ d->connectionInterface->asyncCall(QLatin1String("DeactivateConnection"), QVariant::fromValue(connectionPath));
}
bool QNetworkManagerInterface::wirelessEnabled() const
{
- return d->connectionInterface->property("WirelessEnabled").toBool();
+ if (propertyMap.contains("WirelessEnabled"))
+ return propertyMap.value("WirelessEnabled").toBool();
+ return false;
}
bool QNetworkManagerInterface::wirelessHardwareEnabled() const
{
- return d->connectionInterface->property("WirelessHardwareEnabled").toBool();
+ if (propertyMap.contains("WirelessHardwareEnabled"))
+ return propertyMap.value("WirelessHardwareEnabled").toBool();
+ return false;
}
QList <QDBusObjectPath> QNetworkManagerInterface::activeConnections() const
{
- QVariant prop = d->connectionInterface->property("ActiveConnections");
- return prop.value<QList<QDBusObjectPath> >();
+ if (propertyMap.contains("ActiveConnections")) {
+
+ const QDBusArgument &dbusArgs = propertyMap.value("ActiveConnections").value<QDBusArgument>();
+ QDBusObjectPath path;
+ QList <QDBusObjectPath> list;
+
+ dbusArgs.beginArray();
+ while (!dbusArgs.atEnd()) {
+ dbusArgs >> path;
+ list.append(path);
+ }
+ dbusArgs.endArray();
+
+ return list;
+ }
+
+ QList <QDBusObjectPath> list;
+ list << QDBusObjectPath();
+ return list;
+}
+
+QNetworkManagerInterface::NMState QNetworkManagerInterface::state()
+{
+ if (propertyMap.contains("State"))
+ return static_cast<QNetworkManagerInterface::NMState>(propertyMap.value("State").toUInt());
+ return QNetworkManagerInterface::NM_STATE_UNKNOWN;
}
-quint32 QNetworkManagerInterface::state()
+QString QNetworkManagerInterface::version() const
{
- return d->connectionInterface->property("State").toUInt();
+ if (propertyMap.contains("Version"))
+ return propertyMap.value("Version").toString();
+ return QString();
+}
+
+void QNetworkManagerInterface::propertiesSwap(QMap<QString,QVariant> map)
+{
+ QMapIterator<QString, QVariant> i(map);
+ while (i.hasNext()) {
+ i.next();
+ propertyMap.insert(i.key(),i.value());
+
+ if (i.key() == QStringLiteral("State")) {
+ quint32 state = i.value().toUInt();
+ if (state == NM_DEVICE_STATE_ACTIVATED
+ || state == NM_DEVICE_STATE_DISCONNECTED
+ || state == NM_DEVICE_STATE_UNAVAILABLE
+ || state == NM_DEVICE_STATE_FAILED) {
+ Q_EMIT propertiesChanged(map);
+ Q_EMIT stateChanged(state);
+ }
+ } else if (i.key() == QStringLiteral("ActiveConnections")) {
+ Q_EMIT propertiesChanged(map);
+ }
+ }
}
class QNetworkManagerInterfaceAccessPointPrivate
@@ -183,18 +254,38 @@ public:
};
QNetworkManagerInterfaceAccessPoint::QNetworkManagerInterfaceAccessPoint(const QString &dbusPathName, QObject *parent)
- : QObject(parent), nmDBusHelper(0)
+ : QObject(parent)
{
d = new QNetworkManagerInterfaceAccessPointPrivate();
d->path = dbusPathName;
d->connectionInterface = new QDBusInterface(QLatin1String(NM_DBUS_SERVICE),
d->path,
QLatin1String(NM_DBUS_INTERFACE_ACCESS_POINT),
- QDBusConnection::systemBus());
+ QDBusConnection::systemBus(),parent);
if (!d->connectionInterface->isValid()) {
d->valid = false;
return;
}
+ QDBusInterface accessPointPropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String("org.freedesktop.DBus.Properties"),
+ QDBusConnection::systemBus());
+
+ QList<QVariant> argumentList;
+ argumentList << QLatin1String(NM_DBUS_INTERFACE_ACCESS_POINT);
+ QDBusPendingReply<QVariantMap> propsReply
+ = accessPointPropertiesInterface.callWithArgumentList(QDBus::Block,QLatin1String("GetAll"),
+ argumentList);
+ if (!propsReply.isError()) {
+ propertyMap = propsReply.value();
+ }
+
+ QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String(NM_DBUS_INTERFACE_ACCESS_POINT),
+ QLatin1String("PropertiesChanged"),
+ this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
+
d->valid = true;
}
@@ -212,24 +303,10 @@ bool QNetworkManagerInterfaceAccessPoint::isValid()
bool QNetworkManagerInterfaceAccessPoint::setConnections()
{
- if(!isValid() )
+ if (!isValid())
return false;
- bool allOk = false;
- delete nmDBusHelper;
- nmDBusHelper = new QNmDBusHelper(this);
- connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)),
- this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)));
-
- if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
- d->path,
- QLatin1String(NM_DBUS_INTERFACE_ACCESS_POINT),
- QLatin1String("PropertiesChanged"),
- nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>))) ) {
- allOk = true;
-
- }
- return allOk;
+ return true;
}
QDBusInterface *QNetworkManagerInterfaceAccessPoint::connectionInterface() const
@@ -239,47 +316,74 @@ QDBusInterface *QNetworkManagerInterfaceAccessPoint::connectionInterface() const
quint32 QNetworkManagerInterfaceAccessPoint::flags() const
{
- return d->connectionInterface->property("Flags").toUInt();
+ if (propertyMap.contains("Flags"))
+ return propertyMap.value("Flags").toUInt();
+ return 0;
}
quint32 QNetworkManagerInterfaceAccessPoint::wpaFlags() const
{
- return d->connectionInterface->property("WpaFlags").toUInt();
+ if (propertyMap.contains("WpaFlags"))
+ return propertyMap.value("WpaFlags").toUInt();
+ return 0;
}
quint32 QNetworkManagerInterfaceAccessPoint::rsnFlags() const
{
- return d->connectionInterface->property("RsnFlags").toUInt();
+ if (propertyMap.contains("RsnFlags"))
+ return propertyMap.value("RsnFlags").toUInt();
+ return 0;
}
QString QNetworkManagerInterfaceAccessPoint::ssid() const
{
- return d->connectionInterface->property("Ssid").toString();
+ if (propertyMap.contains("Ssid"))
+ return propertyMap.value("Ssid").toString();
+ return QString();
}
quint32 QNetworkManagerInterfaceAccessPoint::frequency() const
{
- return d->connectionInterface->property("Frequency").toUInt();
+ if (propertyMap.contains("Frequency"))
+ return propertyMap.value("Frequency").toUInt();
+ return 0;
}
QString QNetworkManagerInterfaceAccessPoint::hwAddress() const
{
- return d->connectionInterface->property("HwAddress").toString();
+ if (propertyMap.contains("HwAddress"))
+ return propertyMap.value("HwAddress").toString();
+ return QString();
}
quint32 QNetworkManagerInterfaceAccessPoint::mode() const
{
- return d->connectionInterface->property("Mode").toUInt();
+ if (propertyMap.contains("Mode"))
+ return propertyMap.value("Mode").toUInt();
+ return 0;
}
quint32 QNetworkManagerInterfaceAccessPoint::maxBitrate() const
{
- return d->connectionInterface->property("MaxBitrate").toUInt();
+ if (propertyMap.contains("MaxBitrate"))
+ return propertyMap.value("MaxBitrate").toUInt();
+ return 0;
}
quint32 QNetworkManagerInterfaceAccessPoint::strength() const
{
- return d->connectionInterface->property("Strength").toUInt();
+ if (propertyMap.contains("Strength"))
+ return propertyMap.value("Strength").toUInt();
+ return 0;
+}
+
+void QNetworkManagerInterfaceAccessPoint::propertiesSwap(QMap<QString,QVariant> map)
+{
+ QMapIterator<QString, QVariant> i(map);
+ while (i.hasNext()) {
+ i.next();
+ propertyMap.insert(i.key(),i.value());
+ }
}
class QNetworkManagerInterfaceDevicePrivate
@@ -291,18 +395,39 @@ public:
};
QNetworkManagerInterfaceDevice::QNetworkManagerInterfaceDevice(const QString &deviceObjectPath, QObject *parent)
- : QObject(parent), nmDBusHelper(0)
+ : QObject(parent)
{
+
d = new QNetworkManagerInterfaceDevicePrivate();
d->path = deviceObjectPath;
d->connectionInterface = new QDBusInterface(QLatin1String(NM_DBUS_SERVICE),
d->path,
QLatin1String(NM_DBUS_INTERFACE_DEVICE),
- QDBusConnection::systemBus());
+ QDBusConnection::systemBus(),parent);
if (!d->connectionInterface->isValid()) {
d->valid = false;
return;
}
+ QDBusInterface devicePropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String("org.freedesktop.DBus.Properties"),
+ QDBusConnection::systemBus(),parent);
+
+ QList<QVariant> argumentList;
+ argumentList << QLatin1String(NM_DBUS_INTERFACE_DEVICE);
+ QDBusPendingReply<QVariantMap> propsReply
+ = devicePropertiesInterface.callWithArgumentList(QDBus::Block,QLatin1String("GetAll"),
+ argumentList);
+
+ if (!propsReply.isError()) {
+ propertyMap = propsReply.value();
+ }
+
+ QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String(NM_DBUS_INTERFACE_DEVICE),
+ QLatin1String("PropertiesChanged"),
+ this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
d->valid = true;
}
@@ -319,35 +444,10 @@ bool QNetworkManagerInterfaceDevice::isValid()
bool QNetworkManagerInterfaceDevice::setConnections()
{
- if(!isValid() )
+ if (!isValid())
return false;
- bool allOk = true;
- delete nmDBusHelper;
- nmDBusHelper = new QNmDBusHelper(this);
- connect(nmDBusHelper,SIGNAL(pathForStateChanged(QString,quint32)),
- this, SIGNAL(stateChanged(QString,quint32)));
-
- if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
- d->path,
- QLatin1String(NM_DBUS_INTERFACE_DEVICE),
- QLatin1String("StateChanged"),
- nmDBusHelper,SLOT(deviceStateChanged(quint32)))) {
- allOk = false;
- }
-
- connect(nmDBusHelper, SIGNAL(pathForConnectionsChanged(QStringList)),
- this,SIGNAL(connectionsChanged(QStringList)));
-
- if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
- d->path,
- QLatin1String(NM_DBUS_INTERFACE_ACCESS_POINT),
- QLatin1String("PropertiesChanged"),
- nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>))) ) {
- allOk = false;
- }
-
- return allOk;
+ return true;
}
QDBusInterface *QNetworkManagerInterfaceDevice::connectionInterface() const
@@ -357,33 +457,66 @@ QDBusInterface *QNetworkManagerInterfaceDevice::connectionInterface() const
QString QNetworkManagerInterfaceDevice::udi() const
{
- return d->connectionInterface->property("Udi").toString();
+ if (propertyMap.contains("Udi"))
+ return propertyMap.value("Udi").toString();
+ return QString();
}
QString QNetworkManagerInterfaceDevice::networkInterface() const
{
- return d->connectionInterface->property("Interface").toString();
+ if (propertyMap.contains("Interface"))
+ return propertyMap.value("Interface").toString();
+ return QString();
}
quint32 QNetworkManagerInterfaceDevice::ip4Address() const
{
- return d->connectionInterface->property("Ip4Address").toUInt();
+ if (propertyMap.contains("Ip4Address"))
+ return propertyMap.value("Ip4Address").toUInt();
+ return 0;
}
quint32 QNetworkManagerInterfaceDevice::state() const
{
- return d->connectionInterface->property("State").toUInt();
+ if (propertyMap.contains("State"))
+ return propertyMap.value("State").toUInt();
+ return 0;
}
quint32 QNetworkManagerInterfaceDevice::deviceType() const
{
- return d->connectionInterface->property("DeviceType").toUInt();
+ if (propertyMap.contains("DeviceType"))
+ return propertyMap.value("DeviceType").toUInt();
+ return 0;
}
QDBusObjectPath QNetworkManagerInterfaceDevice::ip4config() const
{
- QVariant prop = d->connectionInterface->property("Ip4Config");
- return prop.value<QDBusObjectPath>();
+ if (propertyMap.contains("Ip4Config"))
+ return propertyMap.value("Ip4Config").value<QDBusObjectPath>();
+ return QDBusObjectPath();
+}
+
+void QNetworkManagerInterfaceDevice::propertiesSwap(QMap<QString,QVariant> map)
+{
+ QMapIterator<QString, QVariant> i(map);
+ while (i.hasNext()) {
+ i.next();
+ if (i.key() == QStringLiteral("AvailableConnections")) { //Device
+ const QDBusArgument &dbusArgs = i.value().value<QDBusArgument>();
+ QDBusObjectPath path;
+ QStringList paths;
+ dbusArgs.beginArray();
+ while (!dbusArgs.atEnd()) {
+ dbusArgs >> path;
+ paths << path.path();
+ }
+ dbusArgs.endArray();
+ Q_EMIT connectionsChanged(paths);
+ }
+ propertyMap.insert(i.key(),i.value());
+ }
+ Q_EMIT propertiesChanged(map);
}
class QNetworkManagerInterfaceDeviceWiredPrivate
@@ -395,7 +528,7 @@ public:
};
QNetworkManagerInterfaceDeviceWired::QNetworkManagerInterfaceDeviceWired(const QString &ifaceDevicePath, QObject *parent)
- : QObject(parent), nmDBusHelper(0)
+ : QObject(parent)
{
d = new QNetworkManagerInterfaceDeviceWiredPrivate();
d->path = ifaceDevicePath;
@@ -407,6 +540,27 @@ QNetworkManagerInterfaceDeviceWired::QNetworkManagerInterfaceDeviceWired(const Q
d->valid = false;
return;
}
+ QDBusInterface deviceWiredPropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String("org.freedesktop.DBus.Properties"),
+ QDBusConnection::systemBus(),parent);
+
+ QList<QVariant> argumentList;
+ argumentList << QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRED);
+ QDBusPendingReply<QVariantMap> propsReply
+ = deviceWiredPropertiesInterface.callWithArgumentList(QDBus::Block,QLatin1String("GetAll"),
+ argumentList);
+
+ if (!propsReply.isError()) {
+ propertyMap = propsReply.value();
+ }
+
+ QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRED),
+ QLatin1String("PropertiesChanged"),
+ this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
+
d->valid = true;
}
@@ -424,23 +578,9 @@ bool QNetworkManagerInterfaceDeviceWired::isValid()
bool QNetworkManagerInterfaceDeviceWired::setConnections()
{
- if(!isValid() )
+ if (!isValid())
return false;
-
- bool allOk = true;
-
- delete nmDBusHelper;
- nmDBusHelper = new QNmDBusHelper(this);
- connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)),
- this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)));
- if (!QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
- d->path,
- QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRED),
- QLatin1String("PropertiesChanged"),
- nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>))) ) {
- allOk = false;
- }
- return allOk;
+ return true;
}
QDBusInterface *QNetworkManagerInterfaceDeviceWired::connectionInterface() const
@@ -450,17 +590,33 @@ QDBusInterface *QNetworkManagerInterfaceDeviceWired::connectionInterface() const
QString QNetworkManagerInterfaceDeviceWired::hwAddress() const
{
- return d->connectionInterface->property("HwAddress").toString();
+ if (propertyMap.contains("HwAddress"))
+ return propertyMap.value("HwAddress").toString();
+ return QString();
}
quint32 QNetworkManagerInterfaceDeviceWired::speed() const
{
- return d->connectionInterface->property("Speed").toUInt();
+ if (propertyMap.contains("Speed"))
+ return propertyMap.value("Speed").toUInt();
+ return 0;
}
bool QNetworkManagerInterfaceDeviceWired::carrier() const
{
- return d->connectionInterface->property("Carrier").toBool();
+ if (propertyMap.contains("Carrier"))
+ return propertyMap.value("Carrier").toBool();
+ return false;
+}
+
+void QNetworkManagerInterfaceDeviceWired::propertiesSwap(QMap<QString,QVariant> map)
+{
+ QMapIterator<QString, QVariant> i(map);
+ while (i.hasNext()) {
+ i.next();
+ propertyMap.insert(i.key(),i.value());
+ }
+ Q_EMIT propertiesChanged(map);
}
class QNetworkManagerInterfaceDeviceWirelessPrivate
@@ -472,7 +628,7 @@ public:
};
QNetworkManagerInterfaceDeviceWireless::QNetworkManagerInterfaceDeviceWireless(const QString &ifaceDevicePath, QObject *parent)
- : QObject(parent), nmDBusHelper(0)
+ : QObject(parent)
{
d = new QNetworkManagerInterfaceDeviceWirelessPrivate();
d->path = ifaceDevicePath;
@@ -484,6 +640,34 @@ QNetworkManagerInterfaceDeviceWireless::QNetworkManagerInterfaceDeviceWireless(c
d->valid = false;
return;
}
+
+
+ QDBusPendingReply<QList <QDBusObjectPath> > nmReply
+ = d->connectionInterface->call(QLatin1String("GetAccessPoints"));
+
+ if (!nmReply.isError()) {
+ accessPointsList = nmReply.value();
+ }
+
+ QDBusInterface deviceWirelessPropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String("org.freedesktop.DBus.Properties"),
+ QDBusConnection::systemBus(),parent);
+
+ QList<QVariant> argumentList;
+ argumentList << QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS);
+ QDBusPendingReply<QVariantMap> propsReply
+ = deviceWirelessPropertiesInterface.callWithArgumentList(QDBus::Block,QLatin1String("GetAll"),
+ argumentList);
+ if (!propsReply.isError()) {
+ propertyMap = propsReply.value();
+ }
+
+ QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
+ QLatin1String("PropertiesChanged"),
+ this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
d->valid = true;
}
@@ -498,29 +682,31 @@ bool QNetworkManagerInterfaceDeviceWireless::isValid()
return d->valid;
}
+void QNetworkManagerInterfaceDeviceWireless::slotAccessPointAdded(QDBusObjectPath path)
+{
+ if (path.path().length() > 2)
+ Q_EMIT accessPointAdded(path.path());
+}
+
+void QNetworkManagerInterfaceDeviceWireless::slotAccessPointRemoved(QDBusObjectPath path)
+{
+ if (path.path().length() > 2)
+ Q_EMIT accessPointRemoved(path.path());
+}
+
bool QNetworkManagerInterfaceDeviceWireless::setConnections()
{
- if(!isValid() )
+ if (!isValid())
return false;
QDBusConnection dbusConnection = QDBusConnection::systemBus();
bool allOk = true;
- delete nmDBusHelper;
- nmDBusHelper = new QNmDBusHelper(this);
- connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)),
- this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)));
-
- connect(nmDBusHelper, SIGNAL(pathForAccessPointAdded(QString)),
- this,SIGNAL(accessPointAdded(QString)));
-
- connect(nmDBusHelper, SIGNAL(pathForAccessPointRemoved(QString)),
- this,SIGNAL(accessPointRemoved(QString)));
if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
- d->path,
+ d->path,
QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
QLatin1String("AccessPointAdded"),
- nmDBusHelper, SLOT(slotAccessPointAdded(QDBusObjectPath)))) {
+ this, SLOT(slotAccessPointAdded(QDBusObjectPath)))) {
allOk = false;
}
@@ -529,18 +715,10 @@ bool QNetworkManagerInterfaceDeviceWireless::setConnections()
d->path,
QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
QLatin1String("AccessPointRemoved"),
- nmDBusHelper, SLOT(slotAccessPointRemoved(QDBusObjectPath)))) {
+ this, SLOT(slotAccessPointRemoved(QDBusObjectPath)))) {
allOk = false;
}
-
- if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
- d->path,
- QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
- QLatin1String("PropertiesChanged"),
- nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>)))) {
- allOk = false;
- }
if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
d->path,
QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
@@ -558,33 +736,48 @@ QDBusInterface *QNetworkManagerInterfaceDeviceWireless::connectionInterface() co
QList <QDBusObjectPath> QNetworkManagerInterfaceDeviceWireless::getAccessPoints()
{
- QDBusReply<QList<QDBusObjectPath> > reply = d->connectionInterface->call(QLatin1String("GetAccessPoints"));
- return reply.value();
+ if (accessPointsList.isEmpty()) {
+ qWarning() << "Using blocking call!";
+ QDBusReply<QList<QDBusObjectPath> > reply
+ = d->connectionInterface->call(QLatin1String("GetAccessPoints"));
+ accessPointsList = reply.value();
+ }
+ return accessPointsList;
}
QString QNetworkManagerInterfaceDeviceWireless::hwAddress() const
{
- return d->connectionInterface->property("HwAddress").toString();
+ if (propertyMap.contains("HwAddress"))
+ return propertyMap.value("HwAddress").toString();
+ return QString();
}
quint32 QNetworkManagerInterfaceDeviceWireless::mode() const
{
- return d->connectionInterface->property("Mode").toUInt();
+ if (propertyMap.contains("Mode"))
+ return propertyMap.value("Mode").toUInt();
+ return 0;
}
quint32 QNetworkManagerInterfaceDeviceWireless::bitrate() const
{
- return d->connectionInterface->property("Bitrate").toUInt();
+ if (propertyMap.contains("Bitrate"))
+ return propertyMap.value("Bitrate").toUInt();
+ return 0;
}
QDBusObjectPath QNetworkManagerInterfaceDeviceWireless::activeAccessPoint() const
{
- return d->connectionInterface->property("ActiveAccessPoint").value<QDBusObjectPath>();
+ if (propertyMap.contains("ActiveAccessPoint"))
+ return propertyMap.value("ActiveAccessPoint").value<QDBusObjectPath>();
+ return QDBusObjectPath();
}
quint32 QNetworkManagerInterfaceDeviceWireless::wirelessCapabilities() const
{
- return d->connectionInterface->property("WirelelessCapabilities").toUInt();
+ if (propertyMap.contains("WirelelessCapabilities"))
+ return propertyMap.value("WirelelessCapabilities").toUInt();
+ return 0;
}
void QNetworkManagerInterfaceDeviceWireless::scanIsDone()
@@ -597,6 +790,17 @@ void QNetworkManagerInterfaceDeviceWireless::requestScan()
d->connectionInterface->asyncCall(QLatin1String("RequestScan"));
}
+void QNetworkManagerInterfaceDeviceWireless::propertiesSwap(QMap<QString,QVariant> map)
+{
+ QMapIterator<QString, QVariant> i(map);
+ while (i.hasNext()) {
+ i.next();
+ propertyMap.insert(i.key(),i.value());
+ if (i.key() == QStringLiteral("ActiveAccessPoint")) { //DeviceWireless
+ Q_EMIT propertiesChanged(map);
+ }
+ }
+}
class QNetworkManagerInterfaceDeviceModemPrivate
{
@@ -607,7 +811,7 @@ public:
};
QNetworkManagerInterfaceDeviceModem::QNetworkManagerInterfaceDeviceModem(const QString &ifaceDevicePath, QObject *parent)
- : QObject(parent), nmDBusHelper(0)
+ : QObject(parent)
{
d = new QNetworkManagerInterfaceDeviceModemPrivate();
d->path = ifaceDevicePath;
@@ -619,6 +823,25 @@ QNetworkManagerInterfaceDeviceModem::QNetworkManagerInterfaceDeviceModem(const Q
d->valid = false;
return;
}
+ QDBusInterface deviceModemPropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String("org.freedesktop.DBus.Properties"),
+ QDBusConnection::systemBus(),parent);
+
+ QList<QVariant> argumentList;
+ argumentList << QLatin1String(NM_DBUS_INTERFACE_DEVICE_MODEM);
+ QDBusPendingReply<QVariantMap> propsReply
+ = deviceModemPropertiesInterface.callWithArgumentList(QDBus::Block,QLatin1String("GetAll"),
+ argumentList);
+ if (!propsReply.isError()) {
+ propertyMap = propsReply.value();
+ }
+
+ QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String(NM_DBUS_INTERFACE_DEVICE_MODEM),
+ QLatin1String("PropertiesChanged"),
+ this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
d->valid = true;
}
@@ -639,20 +862,7 @@ bool QNetworkManagerInterfaceDeviceModem::setConnections()
if (!isValid() )
return false;
- bool allOk = true;
-
- delete nmDBusHelper;
- nmDBusHelper = new QNmDBusHelper(this);
- connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)),
- this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)));
- if (!QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
- d->path,
- QLatin1String(NM_DBUS_INTERFACE_DEVICE_MODEM),
- QLatin1String("PropertiesChanged"),
- nmDBusHelper,SLOT(slotDevicePropertiesChanged(QMap<QString,QVariant>))) ) {
- allOk = false;
- }
- return allOk;
+ return true;
}
QDBusInterface *QNetworkManagerInterfaceDeviceModem::connectionInterface() const
@@ -660,14 +870,28 @@ QDBusInterface *QNetworkManagerInterfaceDeviceModem::connectionInterface() const
return d->connectionInterface;
}
-quint32 QNetworkManagerInterfaceDeviceModem::modemCapabilities() const
+QNetworkManagerInterfaceDeviceModem::ModemCapabilities QNetworkManagerInterfaceDeviceModem::modemCapabilities() const
{
- return d->connectionInterface->property("ModemCapabilities").toUInt();
+ if (propertyMap.contains("ModemCapabilities"))
+ return static_cast<QNetworkManagerInterfaceDeviceModem::ModemCapabilities>(propertyMap.value("ModemCapabilities").toUInt());
+ return QNetworkManagerInterfaceDeviceModem::None;
}
-quint32 QNetworkManagerInterfaceDeviceModem::currentCapabilities() const
+QNetworkManagerInterfaceDeviceModem::ModemCapabilities QNetworkManagerInterfaceDeviceModem::currentCapabilities() const
{
- return d->connectionInterface->property("CurrentCapabilities").toUInt();
+ if (propertyMap.contains("CurrentCapabilities"))
+ return static_cast<QNetworkManagerInterfaceDeviceModem::ModemCapabilities>(propertyMap.value("CurrentCapabilities").toUInt());
+ return QNetworkManagerInterfaceDeviceModem::None;
+}
+
+void QNetworkManagerInterfaceDeviceModem::propertiesSwap(QMap<QString,QVariant> map)
+{
+ QMapIterator<QString, QVariant> i(map);
+ while (i.hasNext()) {
+ i.next();
+ propertyMap.insert(i.key(),i.value());
+ }
+ Q_EMIT propertiesChanged(map);
}
class QNetworkManagerSettingsPrivate
@@ -691,6 +915,14 @@ QNetworkManagerSettings::QNetworkManagerSettings(const QString &settingsService,
d->valid = false;
return;
}
+
+ QDBusPendingReply<QList <QDBusObjectPath> > nmReply
+ = d->connectionInterface->call(QLatin1String("ListConnections"));
+
+ if (!nmReply.isError()) {
+ connectionsList = nmReply.value();
+ }
+
d->valid = true;
}
@@ -722,10 +954,16 @@ bool QNetworkManagerSettings::setConnections()
QList <QDBusObjectPath> QNetworkManagerSettings::listConnections()
{
- QDBusReply<QList<QDBusObjectPath> > reply = d->connectionInterface->call(QLatin1String("ListConnections"));
- return reply.value();
+ if (connectionsList.isEmpty()) {
+ qWarning() << "Using blocking call!";
+ QDBusReply<QList<QDBusObjectPath> > reply
+ = d->connectionInterface->call(QLatin1String("ListConnections"));
+ connectionsList = reply.value();
+ }
+ return connectionsList;
}
+
QString QNetworkManagerSettings::getConnectionByUuid(const QString &uuid)
{
QList<QVariant> argumentList;
@@ -751,7 +989,7 @@ public:
};
QNetworkManagerSettingsConnection::QNetworkManagerSettingsConnection(const QString &settingsService, const QString &connectionObjectPath, QObject *parent)
- : QObject(parent), nmDBusHelper(0)
+ : QObject(parent)
{
qDBusRegisterMetaType<QNmSettingsMap>();
d = new QNetworkManagerSettingsConnectionPrivate();
@@ -766,8 +1004,12 @@ QNetworkManagerSettingsConnection::QNetworkManagerSettingsConnection(const QStri
return;
}
d->valid = true;
- QDBusReply< QNmSettingsMap > rep = d->connectionInterface->call(QLatin1String("GetSettings"));
- d->settingsMap = rep.value();
+
+ QDBusPendingReply<QNmSettingsMap> nmReply
+ = d->connectionInterface->call(QLatin1String("GetSettings"));
+ if (!nmReply.isError()) {
+ d->settingsMap = nmReply.value();
+ }
}
QNetworkManagerSettingsConnection::~QNetworkManagerSettingsConnection()
@@ -783,7 +1025,7 @@ bool QNetworkManagerSettingsConnection::isValid()
bool QNetworkManagerSettingsConnection::setConnections()
{
- if(!isValid() )
+ if (!isValid())
return false;
QDBusConnection dbusConnection = QDBusConnection::systemBus();
@@ -796,21 +1038,21 @@ bool QNetworkManagerSettingsConnection::setConnections()
allOk = false;
}
- delete nmDBusHelper;
- nmDBusHelper = new QNmDBusHelper(this);
- connect(nmDBusHelper, SIGNAL(pathForSettingsRemoved(QString)),
- this,SIGNAL(removed(QString)));
-
if (!dbusConnection.connect(d->service,
d->path,
QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION),
QLatin1String("Removed"),
- nmDBusHelper, SIGNAL(slotSettingsRemoved()))) {
+ this, SIGNAL(slotSettingsRemoved()))) {
allOk = false;
}
return allOk;
}
+void QNetworkManagerSettingsConnection::slotSettingsRemoved()
+{
+ Q_EMIT removed(d->path);
+}
+
QDBusInterface *QNetworkManagerSettingsConnection::connectionInterface() const
{
return d->connectionInterface;
@@ -818,8 +1060,11 @@ QDBusInterface *QNetworkManagerSettingsConnection::connectionInterface() const
QNmSettingsMap QNetworkManagerSettingsConnection::getSettings()
{
- QDBusReply< QNmSettingsMap > rep = d->connectionInterface->call(QLatin1String("GetSettings"));
- d->settingsMap = rep.value();
+ if (d->settingsMap.isEmpty()) {
+ qWarning() << "Using blocking call!";
+ QDBusReply<QNmSettingsMap> reply = d->connectionInterface->call(QLatin1String("GetSettings"));
+ d->settingsMap = reply.value();
+ }
return d->settingsMap;
}
@@ -832,6 +1077,8 @@ NMDeviceType QNetworkManagerSettingsConnection::getType()
return DEVICE_TYPE_ETHERNET;
else if (devType == QLatin1String("802-11-wireless"))
return DEVICE_TYPE_WIFI;
+ else if (devType == QLatin1String("gsm"))
+ return DEVICE_TYPE_MODEM;
else
return DEVICE_TYPE_UNKNOWN;
}
@@ -908,7 +1155,7 @@ public:
};
QNetworkManagerConnectionActive::QNetworkManagerConnectionActive(const QString &activeConnectionObjectPath, QObject *parent)
- : QObject(parent), nmDBusHelper(0)
+ : QObject(parent)
{
d = new QNetworkManagerConnectionActivePrivate();
d->path = activeConnectionObjectPath;
@@ -920,6 +1167,29 @@ QNetworkManagerConnectionActive::QNetworkManagerConnectionActive(const QString &
d->valid = false;
return;
}
+ QDBusInterface connectionActivePropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String("org.freedesktop.DBus.Properties"),
+ QDBusConnection::systemBus());
+
+
+ QList<QVariant> argumentList;
+ argumentList << QLatin1String(NM_DBUS_INTERFACE_ACTIVE_CONNECTION);
+ QDBusPendingReply<QVariantMap> propsReply
+ = connectionActivePropertiesInterface.callWithArgumentList(QDBus::Block,QLatin1String("GetAll"),
+ argumentList);
+
+ if (!propsReply.isError()) {
+ propertyMap = propsReply.value();
+ } else {
+ qWarning() << propsReply.error().message();
+ }
+
+ QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String(NM_DBUS_INTERFACE_ACTIVE_CONNECTION),
+ QLatin1String("PropertiesChanged"),
+ this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
d->valid = true;
}
@@ -936,24 +1206,10 @@ bool QNetworkManagerConnectionActive::isValid()
bool QNetworkManagerConnectionActive::setConnections()
{
- if(!isValid() )
+ if (!isValid())
return false;
- bool allOk = true;
- delete nmDBusHelper;
- nmDBusHelper = new QNmDBusHelper(this);
- connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)),
- this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)));
-
- if (!QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
- d->path,
- QLatin1String(NM_DBUS_INTERFACE_ACTIVE_CONNECTION),
- QLatin1String("PropertiesChanged"),
- nmDBusHelper,SLOT(activeConnectionPropertiesChanged(QMap<QString,QVariant>))) ) {
- allOk = false;
- }
-
- return allOk;
+ return true;
}
QDBusInterface *QNetworkManagerConnectionActive::connectionInterface() const
@@ -963,30 +1219,67 @@ QDBusInterface *QNetworkManagerConnectionActive::connectionInterface() const
QDBusObjectPath QNetworkManagerConnectionActive::connection() const
{
- QVariant prop = d->connectionInterface->property("Connection");
- return prop.value<QDBusObjectPath>();
+ if (propertyMap.contains("Connection"))
+ return propertyMap.value("Connection").value<QDBusObjectPath>();
+ return QDBusObjectPath();
}
QDBusObjectPath QNetworkManagerConnectionActive::specificObject() const
{
- QVariant prop = d->connectionInterface->property("SpecificObject");
- return prop.value<QDBusObjectPath>();
+ if (propertyMap.contains("SpecificObject"))
+ return propertyMap.value("SpecificObject").value<QDBusObjectPath>();
+ return QDBusObjectPath();
}
QList<QDBusObjectPath> QNetworkManagerConnectionActive::devices() const
{
- QVariant prop = d->connectionInterface->property("Devices");
- return prop.value<QList<QDBusObjectPath> >();
+ if (propertyMap.contains("Devices")) {
+ const QDBusArgument &dbusArgs = propertyMap.value("Devices").value<QDBusArgument>();
+ QDBusObjectPath path;
+ QList <QDBusObjectPath> list;
+
+ dbusArgs.beginArray();
+ while (!dbusArgs.atEnd()) {
+ dbusArgs >> path;
+ list.append(path);
+ }
+ dbusArgs.endArray();
+
+ return list;
+ }
+ QList<QDBusObjectPath> list;
+ list << QDBusObjectPath();
+ return list;
}
quint32 QNetworkManagerConnectionActive::state() const
{
- return d->connectionInterface->property("State").toUInt();
+ if (propertyMap.contains("State"))
+ return propertyMap.value("State").toUInt();
+ return 0;
}
bool QNetworkManagerConnectionActive::defaultRoute() const
{
- return d->connectionInterface->property("Default").toBool();
+ if (propertyMap.contains("Default"))
+ return propertyMap.value("Default").toBool();
+ return false;
+}
+
+void QNetworkManagerConnectionActive::propertiesSwap(QMap<QString,QVariant> map)
+{
+ QMapIterator<QString, QVariant> i(map);
+ while (i.hasNext()) {
+ i.next();
+ propertyMap.insert(i.key(),i.value());
+ if (i.key() == QStringLiteral("State")) {
+ quint32 state = i.value().toUInt();
+ if (state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED
+ || state == NM_ACTIVE_CONNECTION_STATE_DEACTIVATED) {
+ Q_EMIT propertiesChanged(map);
+ }
+ }
+ }
}
class QNetworkManagerIp4ConfigPrivate