blob: 2d6cba1791191347d99748d3d4dc06c8b7c2de05 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the plugins of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QObject>
#include <QList>
#include <QtDBus/QtDBus>
#include <QtDBus/QDBusConnection>
#include <QtDBus/QDBusError>
#include <QtDBus/QDBusInterface>
#include <QtDBus/QDBusMessage>
#include <QtDBus/QDBusReply>
#include <QtDBus/QDBusPendingCallWatcher>
#include <QtDBus/QDBusObjectPath>
#include <QtDBus/QDBusPendingCall>
#include "qnetworkmanagerservice.h"
#ifndef QT_NO_DBUS
#define DBUS_PROPERTIES_INTERFACE "org.freedesktop.DBus.Properties"
QT_BEGIN_NAMESPACE
QNetworkManagerInterface::QNetworkManagerInterface(QObject *parent)
: QDBusAbstractInterface(QLatin1String(NM_DBUS_SERVICE),
QLatin1String(NM_DBUS_PATH),
NM_DBUS_INTERFACE,
QDBusConnection::systemBus(),parent)
{
if (!isValid()) {
return;
}
PropertiesDBusInterface managerPropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
QLatin1String(NM_DBUS_PATH),
DBUS_PROPERTIES_INTERFACE,
QDBusConnection::systemBus());
QDBusPendingReply<QVariantMap> propsReply
= managerPropertiesInterface.call(QDBus::Block, QLatin1String("GetAll"), QLatin1String(NM_DBUS_INTERFACE));
if (!propsReply.isError()) {
propertyMap = propsReply.value();
} else {
qWarning() << "propsReply" << propsReply.error().message();
}
QDBusPendingReply<QList <QDBusObjectPath> > nmReply
= call(QLatin1String("GetDevices"));
nmReply.waitForFinished();
if (!nmReply.isError()) {
devicesPathList = nmReply.value();
} else {
qWarning() << "nmReply" << nmReply.error().message();
}
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()
{
QDBusConnection::systemBus().disconnect(QLatin1String(NM_DBUS_SERVICE),
QLatin1String(NM_DBUS_PATH),
QLatin1String(NM_DBUS_INTERFACE),
QLatin1String("PropertiesChanged"),
this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
QDBusConnection::systemBus().disconnect(QLatin1String(NM_DBUS_SERVICE),
QLatin1String(NM_DBUS_PATH),
QLatin1String(NM_DBUS_INTERFACE),
QLatin1String("DeviceAdded"),
this,SIGNAL(deviceAdded(QDBusObjectPath)));
QDBusConnection::systemBus().disconnect(QLatin1String(NM_DBUS_SERVICE),
QLatin1String(NM_DBUS_PATH),
QLatin1String(NM_DBUS_INTERFACE),
QLatin1String("DeviceRemoved"),
this,SIGNAL(deviceRemoved(QDBusObjectPath)));
}
bool QNetworkManagerInterface::setConnections()
{
if (!isValid())
return false;
QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
QLatin1String(NM_DBUS_PATH),
QLatin1String(NM_DBUS_INTERFACE),
QLatin1String("PropertiesChanged"),
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 (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
QLatin1String(NM_DBUS_PATH),
QLatin1String(NM_DBUS_INTERFACE),
QLatin1String("DeviceRemoved"),
this,SIGNAL(deviceRemoved(QDBusObjectPath)))) {
allOk = true;
}
return allOk;
}
QList <QDBusObjectPath> QNetworkManagerInterface::getDevices()
{
if (devicesPathList.isEmpty()) {
//qWarning("using blocking call!");
QDBusReply<QList<QDBusObjectPath> > reply = call(QLatin1String("GetDevices"));
devicesPathList = reply.value();
}
return devicesPathList;
}
void QNetworkManagerInterface::activateConnection(QDBusObjectPath connectionPath,
QDBusObjectPath devicePath,
QDBusObjectPath specificObject)
{
QDBusPendingCall pendingCall = asyncCall(QLatin1String("ActivateConnection"),
QVariant::fromValue(connectionPath),
QVariant::fromValue(devicePath),
QVariant::fromValue(specificObject));
QDBusPendingCallWatcher *callWatcher = new QDBusPendingCallWatcher(pendingCall);
connect(callWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
this, SIGNAL(activationFinished(QDBusPendingCallWatcher*)));
}
void QNetworkManagerInterface::deactivateConnection(QDBusObjectPath connectionPath)
{
asyncCall(QLatin1String("DeactivateConnection"), QVariant::fromValue(connectionPath));
}
bool QNetworkManagerInterface::wirelessEnabled() const
{
if (propertyMap.contains("WirelessEnabled"))
return propertyMap.value("WirelessEnabled").toBool();
return false;
}
bool QNetworkManagerInterface::wirelessHardwareEnabled() const
{
if (propertyMap.contains("WirelessHardwareEnabled"))
return propertyMap.value("WirelessHardwareEnabled").toBool();
return false;
}
QList <QDBusObjectPath> QNetworkManagerInterface::activeConnections() const
{
if (propertyMap.contains("ActiveConnections")) {
const QDBusArgument &dbusArgs = qvariant_cast<QDBusArgument>(propertyMap.value("ActiveConnections"));
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;
}
QString QNetworkManagerInterface::version() const
{
if (propertyMap.contains("Version"))
return propertyMap.value("Version").toString();
return QString();
}
void QNetworkManagerInterface::propertiesSwap(QMap<QString,QVariant> map)
{
for (auto i = map.cbegin(), end = map.cend(); i != end; ++i) {
propertyMap.insert(i.key(),i.value());
if (i.key() == QLatin1String("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() == QLatin1String("ActiveConnections")) {
Q_EMIT propertiesChanged(map);
}
}
}
QNetworkManagerInterfaceAccessPoint::QNetworkManagerInterfaceAccessPoint(const QString &dbusPathName, QObject *parent)
: QDBusAbstractInterface(QLatin1String(NM_DBUS_SERVICE),
dbusPathName,
NM_DBUS_INTERFACE_ACCESS_POINT,
QDBusConnection::systemBus(),parent)
{
}
QNetworkManagerInterfaceAccessPoint::~QNetworkManagerInterfaceAccessPoint()
{
}
quint32 QNetworkManagerInterfaceAccessPoint::flags() const
{
if (propertyMap.contains("Flags"))
return propertyMap.value("Flags").toUInt();
return 0;
}
quint32 QNetworkManagerInterfaceAccessPoint::wpaFlags() const
{
if (propertyMap.contains("WpaFlags"))
return propertyMap.value("WpaFlags").toUInt();
return 0;
}
quint32 QNetworkManagerInterfaceAccessPoint::rsnFlags() const
{
if (propertyMap.contains("RsnFlags"))
return propertyMap.value("RsnFlags").toUInt();
return 0;
}
QString QNetworkManagerInterfaceAccessPoint::ssid() const
{
if (propertyMap.contains("Ssid"))
return propertyMap.value("Ssid").toString();
return QString();
}
quint32 QNetworkManagerInterfaceAccessPoint::frequency() const
{
if (propertyMap.contains("Frequency"))
return propertyMap.value("Frequency").toUInt();
return 0;
}
QString QNetworkManagerInterfaceAccessPoint::hwAddress() const
{
if (propertyMap.contains("HwAddress"))
return propertyMap.value("HwAddress").toString();
return QString();
}
quint32 QNetworkManagerInterfaceAccessPoint::mode() const
{
if (propertyMap.contains("Mode"))
return propertyMap.value("Mode").toUInt();
return 0;
}
quint32 QNetworkManagerInterfaceAccessPoint::maxBitrate() const
{
if (propertyMap.contains("MaxBitrate"))
return propertyMap.value("MaxBitrate").toUInt();
return 0;
}
quint32 QNetworkManagerInterfaceAccessPoint::strength() const
{
if (propertyMap.contains("Strength"))
return propertyMap.value("Strength").toUInt();
return 0;
}
void QNetworkManagerInterfaceAccessPoint::propertiesSwap(QMap<QString,QVariant> map)
{
for (auto i = map.cbegin(), end = map.cend(); i != end; ++i)
propertyMap.insert(i.key(),i.value());
}
QNetworkManagerInterfaceDevice::QNetworkManagerInterfaceDevice(const QString &deviceObjectPath, QObject *parent)
: QDBusAbstractInterface(QLatin1String(NM_DBUS_SERVICE),
deviceObjectPath,
NM_DBUS_INTERFACE_DEVICE,
QDBusConnection::systemBus(),parent)
{
if (!isValid()) {
return;
}
PropertiesDBusInterface devicePropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
deviceObjectPath,
DBUS_PROPERTIES_INTERFACE,
QDBusConnection::systemBus(),parent);
QDBusPendingReply<QVariantMap> propsReply
= devicePropertiesInterface.call(QDBus::Block, QLatin1String("GetAll"), QLatin1String(NM_DBUS_INTERFACE_DEVICE));
if (!propsReply.isError()) {
propertyMap = propsReply.value();
}
QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
deviceObjectPath,
QLatin1String(NM_DBUS_INTERFACE_DEVICE),
QLatin1String("PropertiesChanged"),
this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
}
QNetworkManagerInterfaceDevice::~QNetworkManagerInterfaceDevice()
{
QDBusConnection::systemBus().disconnect(QLatin1String(NM_DBUS_SERVICE),
path(),
QLatin1String(NM_DBUS_INTERFACE_DEVICE),
QLatin1String("PropertiesChanged"),
this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
}
QString QNetworkManagerInterfaceDevice::udi() const
{
if (propertyMap.contains("Udi"))
return propertyMap.value("Udi").toString();
return QString();
}
QString QNetworkManagerInterfaceDevice::networkInterface() const
{
if (propertyMap.contains("Interface"))
return propertyMap.value("Interface").toString();
return QString();
}
quint32 QNetworkManagerInterfaceDevice::ip4Address() const
{
if (propertyMap.contains("Ip4Address"))
return propertyMap.value("Ip4Address").toUInt();
return 0;
}
quint32 QNetworkManagerInterfaceDevice::state() const
{
if (propertyMap.contains("State"))
return propertyMap.value("State").toUInt();
return 0;
}
quint32 QNetworkManagerInterfaceDevice::deviceType() const
{
if (propertyMap.contains("DeviceType"))
return propertyMap.value("DeviceType").toUInt();
return 0;
}
QDBusObjectPath QNetworkManagerInterfaceDevice::ip4config() const
{
if (propertyMap.contains("Ip4Config"))
return qvariant_cast<QDBusObjectPath>(propertyMap.value("Ip4Config"));
return QDBusObjectPath();
}
void QNetworkManagerInterfaceDevice::propertiesSwap(QMap<QString,QVariant> map)
{
for (auto i = map.cbegin(), end = map.cend(); i != end; ++i) {
if (i.key() == QLatin1String("AvailableConnections")) { //Device
const QDBusArgument &dbusArgs = qvariant_cast<QDBusArgument>(i.value());
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);
}
QNetworkManagerInterfaceDeviceWired::QNetworkManagerInterfaceDeviceWired(const QString &ifaceDevicePath, QObject *parent)
: QDBusAbstractInterface(QLatin1String(NM_DBUS_SERVICE),
ifaceDevicePath,
NM_DBUS_INTERFACE_DEVICE_WIRED,
QDBusConnection::systemBus(), parent)
{
if (!isValid()) {
return;
}
PropertiesDBusInterface deviceWiredPropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
ifaceDevicePath,
DBUS_PROPERTIES_INTERFACE,
QDBusConnection::systemBus(),parent);
QDBusPendingReply<QVariantMap> propsReply
= deviceWiredPropertiesInterface.call(QDBus::Block, QLatin1String("GetAll"), QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRED));
if (!propsReply.isError()) {
propertyMap = propsReply.value();
}
QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
ifaceDevicePath,
QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRED),
QLatin1String("PropertiesChanged"),
this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
}
QNetworkManagerInterfaceDeviceWired::~QNetworkManagerInterfaceDeviceWired()
{
QDBusConnection::systemBus().disconnect(QLatin1String(NM_DBUS_SERVICE),
path(),
QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRED),
QLatin1String("PropertiesChanged"),
this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
}
QString QNetworkManagerInterfaceDeviceWired::hwAddress() const
{
if (propertyMap.contains("HwAddress"))
return propertyMap.value("HwAddress").toString();
return QString();
}
quint32 QNetworkManagerInterfaceDeviceWired::speed() const
{
if (propertyMap.contains("Speed"))
return propertyMap.value("Speed").toUInt();
return 0;
}
bool QNetworkManagerInterfaceDeviceWired::carrier() const
{
if (propertyMap.contains("Carrier"))
return propertyMap.value("Carrier").toBool();
return false;
}
QStringList QNetworkManagerInterfaceDeviceWired::availableConnections()
{
QStringList list;
if (propertyMap.contains("AvailableConnections")) {
const QDBusArgument &dbusArgs = qvariant_cast<QDBusArgument>(propertyMap.value("Carrier"));
QDBusObjectPath path;
dbusArgs.beginArray();
while (!dbusArgs.atEnd()) {
dbusArgs >> path;
list << path.path();
}
dbusArgs.endArray();
}
return list;
}
void QNetworkManagerInterfaceDeviceWired::propertiesSwap(QMap<QString,QVariant> map)
{
for (auto i = map.cbegin(), end = map.cend(); i != end; ++i) {
propertyMap.insert(i.key(),i.value());
if (i.key() == QLatin1String("Carrier"))
Q_EMIT carrierChanged(i.value().toBool());
}
Q_EMIT propertiesChanged(map);
}
QNetworkManagerInterfaceDeviceWireless::QNetworkManagerInterfaceDeviceWireless(const QString &ifaceDevicePath, QObject *parent)
: QDBusAbstractInterface(QLatin1String(NM_DBUS_SERVICE),
ifaceDevicePath,
NM_DBUS_INTERFACE_DEVICE_WIRELESS,
QDBusConnection::systemBus(), parent)
{
if (!isValid()) {
return;
}
interfacePath = ifaceDevicePath;
QDBusPendingReply<QList <QDBusObjectPath> > nmReply
= call(QLatin1String("GetAccessPoints"));
if (!nmReply.isError()) {
accessPointsList = nmReply.value();
}
PropertiesDBusInterface deviceWirelessPropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
interfacePath,
DBUS_PROPERTIES_INTERFACE,
QDBusConnection::systemBus(),parent);
QDBusPendingReply<QVariantMap> propsReply
= deviceWirelessPropertiesInterface.call(QDBus::Block, QLatin1String("GetAll"), QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS));
if (!propsReply.isError()) {
propertyMap = propsReply.value();
}
QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
interfacePath,
QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
QLatin1String("PropertiesChanged"),
this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
}
QNetworkManagerInterfaceDeviceWireless::~QNetworkManagerInterfaceDeviceWireless()
{
QDBusConnection::systemBus().disconnect(QLatin1String(NM_DBUS_SERVICE),
path(),
QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
QLatin1String("PropertiesChanged"),
this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
}
bool QNetworkManagerInterfaceDeviceWireless::setConnections()
{
return true;
}
QList <QDBusObjectPath> QNetworkManagerInterfaceDeviceWireless::getAccessPoints()
{
if (accessPointsList.isEmpty()) {
//qWarning("Using blocking call!");
QDBusReply<QList<QDBusObjectPath> > reply
= call(QLatin1String("GetAccessPoints"));
accessPointsList = reply.value();
}
return accessPointsList;
}
QString QNetworkManagerInterfaceDeviceWireless::hwAddress() const
{
if (propertyMap.contains("HwAddress"))
return propertyMap.value("HwAddress").toString();
return QString();
}
quint32 QNetworkManagerInterfaceDeviceWireless::mode() const
{
if (propertyMap.contains("Mode"))
return propertyMap.value("Mode").toUInt();
return 0;
}
quint32 QNetworkManagerInterfaceDeviceWireless::bitrate() const
{
if (propertyMap.contains("Bitrate"))
return propertyMap.value("Bitrate").toUInt();
return 0;
}
QDBusObjectPath QNetworkManagerInterfaceDeviceWireless::activeAccessPoint() const
{
if (propertyMap.contains("ActiveAccessPoint"))
return qvariant_cast<QDBusObjectPath>(propertyMap.value("ActiveAccessPoint"));
return QDBusObjectPath();
}
quint32 QNetworkManagerInterfaceDeviceWireless::wirelessCapabilities() const
{
if (propertyMap.contains("WirelelessCapabilities"))
return propertyMap.value("WirelelessCapabilities").toUInt();
return 0;
}
void QNetworkManagerInterfaceDeviceWireless::requestScan()
{
asyncCall(QLatin1String("RequestScan"));
}
void QNetworkManagerInterfaceDeviceWireless::propertiesSwap(QMap<QString,QVariant> map)
{
for (auto i = map.cbegin(), end = map.cend(); i != end; ++i) {
propertyMap.insert(i.key(),i.value());
if (i.key() == QLatin1String("ActiveAccessPoint")) //DeviceWireless
Q_EMIT propertiesChanged(map);
}
}
QNetworkManagerInterfaceDeviceModem::QNetworkManagerInterfaceDeviceModem(const QString &ifaceDevicePath, QObject *parent)
: QDBusAbstractInterface(QLatin1String(NM_DBUS_SERVICE),
ifaceDevicePath,
NM_DBUS_INTERFACE_DEVICE_MODEM,
QDBusConnection::systemBus(), parent)
{
if (!isValid()) {
return;
}
PropertiesDBusInterface deviceModemPropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
ifaceDevicePath,
QLatin1String("org.freedesktop.DBus.Properties"),
QDBusConnection::systemBus(),parent);
QDBusPendingReply<QVariantMap> propsReply
= deviceModemPropertiesInterface.call(QDBus::Block, QLatin1String("GetAll"), QLatin1String(NM_DBUS_INTERFACE_DEVICE_MODEM));
if (!propsReply.isError()) {
propertyMap = propsReply.value();
}
QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
ifaceDevicePath,
QLatin1String(NM_DBUS_INTERFACE_DEVICE_MODEM),
QLatin1String("PropertiesChanged"),
this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
}
QNetworkManagerInterfaceDeviceModem::~QNetworkManagerInterfaceDeviceModem()
{
QDBusConnection::systemBus().disconnect(QLatin1String(NM_DBUS_SERVICE),
path(),
QLatin1String(NM_DBUS_PATH_SETTINGS),
QLatin1String(NM_DBUS_IFACE_SETTINGS),
QLatin1String("NewConnection"),
this, SIGNAL(newConnection(QDBusObjectPath)));
}
QNetworkManagerInterfaceDeviceModem::ModemCapabilities QNetworkManagerInterfaceDeviceModem::modemCapabilities() const
{
if (propertyMap.contains("ModemCapabilities"))
return static_cast<QNetworkManagerInterfaceDeviceModem::ModemCapabilities>(propertyMap.value("ModemCapabilities").toUInt());
return QNetworkManagerInterfaceDeviceModem::None;
}
QNetworkManagerInterfaceDeviceModem::ModemCapabilities QNetworkManagerInterfaceDeviceModem::currentCapabilities() const
{
if (propertyMap.contains("CurrentCapabilities"))
return static_cast<QNetworkManagerInterfaceDeviceModem::ModemCapabilities>(propertyMap.value("CurrentCapabilities").toUInt());
return QNetworkManagerInterfaceDeviceModem::None;
}
void QNetworkManagerInterfaceDeviceModem::propertiesSwap(QMap<QString,QVariant> map)
{
for (auto i = map.cbegin(), end = map.cend(); i != end; ++i)
propertyMap.insert(i.key(),i.value());
Q_EMIT propertiesChanged(map);
}
QNetworkManagerSettings::QNetworkManagerSettings(const QString &settingsService, QObject *parent)
: QDBusAbstractInterface(settingsService,
NM_DBUS_PATH_SETTINGS,
NM_DBUS_IFACE_SETTINGS,
QDBusConnection::systemBus(), parent)
{
if (!isValid()) {
return;
}
interfacePath = settingsService;
QDBusPendingReply<QList <QDBusObjectPath> > nmReply
= call(QLatin1String("ListConnections"));
if (!nmReply.isError()) {
connectionsList = nmReply.value();
}
}
QNetworkManagerSettings::~QNetworkManagerSettings()
{
}
bool QNetworkManagerSettings::setConnections()
{
bool allOk = true;
if (!QDBusConnection::systemBus().connect(interfacePath,
QLatin1String(NM_DBUS_PATH_SETTINGS),
QLatin1String(NM_DBUS_IFACE_SETTINGS),
QLatin1String("NewConnection"),
this, SIGNAL(newConnection(QDBusObjectPath)))) {
allOk = false;
qWarning("NewConnection could not be connected");
}
return allOk;
}
QList <QDBusObjectPath> QNetworkManagerSettings::listConnections()
{
if (connectionsList.isEmpty()) {
//qWarning("Using blocking call!");
QDBusReply<QList<QDBusObjectPath> > reply
= call(QLatin1String("ListConnections"));
connectionsList = reply.value();
}
return connectionsList;
}
QString QNetworkManagerSettings::getConnectionByUuid(const QString &uuid)
{
QDBusReply<QDBusObjectPath > reply = call(QDBus::Block, QLatin1String("GetConnectionByUuid"), uuid);
return reply.value().path();
}
QNetworkManagerSettingsConnection::QNetworkManagerSettingsConnection(const QString &settingsService, const QString &connectionObjectPath, QObject *parent)
: QDBusAbstractInterface(settingsService,
connectionObjectPath,
NM_DBUS_IFACE_SETTINGS_CONNECTION,
QDBusConnection::systemBus(), parent)
{
qDBusRegisterMetaType<QNmSettingsMap>();
if (!isValid()) {
return;
}
interfacepath = connectionObjectPath;
QDBusPendingReply<QNmSettingsMap> nmReply
= call(QLatin1String("GetSettings"));
if (!nmReply.isError()) {
settingsMap = nmReply.value();
}
}
QNetworkManagerSettingsConnection::~QNetworkManagerSettingsConnection()
{
QDBusConnection::systemBus().disconnect(service(),
path(),
QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION),
QLatin1String("Updated"),
this, SIGNAL(updated()));
QDBusConnection::systemBus().disconnect(service(),
path(),
QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION),
QLatin1String("Removed"),
this, SIGNAL(slotSettingsRemoved()));
}
bool QNetworkManagerSettingsConnection::setConnections()
{
if (!isValid())
return false;
QDBusConnection dbusConnection = QDBusConnection::systemBus();
bool allOk = true;
if (!dbusConnection.connect(service(),
interfacepath,
QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION),
QLatin1String("Updated"),
this, SIGNAL(updated()))) {
allOk = false;
}
if (!dbusConnection.connect(service(),
interfacepath,
QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION),
QLatin1String("Removed"),
this, SIGNAL(slotSettingsRemoved()))) {
allOk = false;
}
return allOk;
}
void QNetworkManagerSettingsConnection::slotSettingsRemoved()
{
Q_EMIT removed(interfacepath);
}
QNmSettingsMap QNetworkManagerSettingsConnection::getSettings()
{
if (settingsMap.isEmpty()) {
//qWarning("Using blocking call!");
QDBusReply<QNmSettingsMap> reply = call(QLatin1String("GetSettings"));
settingsMap = reply.value();
}
return settingsMap;
}
NMDeviceType QNetworkManagerSettingsConnection::getType()
{
const QString devType =
settingsMap.value(QLatin1String("connection")).value(QLatin1String("type")).toString();
if (devType == QLatin1String("802-3-ethernet"))
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;
}
bool QNetworkManagerSettingsConnection::isAutoConnect()
{
const QVariant autoConnect =
settingsMap.value(QLatin1String("connection")).value(QLatin1String("autoconnect"));
// NetworkManager default is to auto connect
if (!autoConnect.isValid())
return true;
return autoConnect.toBool();
}
quint64 QNetworkManagerSettingsConnection::getTimestamp()
{
return settingsMap.value(QLatin1String("connection"))
.value(QLatin1String("timestamp")).toUInt();
}
QString QNetworkManagerSettingsConnection::getId()
{
return settingsMap.value(QLatin1String("connection")).value(QLatin1String("id")).toString();
}
QString QNetworkManagerSettingsConnection::getUuid()
{
const QString id = settingsMap.value(QLatin1String("connection"))
.value(QLatin1String("uuid")).toString();
// is no uuid, return the connection path
return id.isEmpty() ? path() : id;
}
QString QNetworkManagerSettingsConnection::getSsid()
{
return settingsMap.value(QLatin1String("802-11-wireless"))
.value(QLatin1String("ssid")).toString();
}
QString QNetworkManagerSettingsConnection::getMacAddress()
{
NMDeviceType type = getType();
if (type == DEVICE_TYPE_ETHERNET) {
return settingsMap.value(QLatin1String("802-3-ethernet"))
.value(QLatin1String("mac-address")).toString();
} else if (type == DEVICE_TYPE_WIFI) {
return settingsMap.value(QLatin1String("802-11-wireless"))
.value(QLatin1String("mac-address")).toString();
} else {
return QString();
}
}
QStringList QNetworkManagerSettingsConnection::getSeenBssids()
{
if (getType() == DEVICE_TYPE_WIFI) {
return settingsMap.value(QLatin1String("802-11-wireless"))
.value(QLatin1String("seen-bssids")).toStringList();
} else {
return QStringList();
}
}
QNetworkManagerConnectionActive::QNetworkManagerConnectionActive(const QString &activeConnectionObjectPath, QObject *parent)
: QDBusAbstractInterface(QLatin1String(NM_DBUS_SERVICE),
activeConnectionObjectPath,
NM_DBUS_INTERFACE_ACTIVE_CONNECTION,
QDBusConnection::systemBus(), parent)
{
if (!isValid()) {
return;
}
PropertiesDBusInterface connectionActivePropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
activeConnectionObjectPath,
QLatin1String("org.freedesktop.DBus.Properties"),
QDBusConnection::systemBus());
QDBusPendingReply<QVariantMap> propsReply
= connectionActivePropertiesInterface.call(QDBus::Block, QLatin1String("GetAll"), QLatin1String(NM_DBUS_INTERFACE_ACTIVE_CONNECTION));
if (!propsReply.isError()) {
propertyMap = propsReply.value();
} else {
qWarning() << propsReply.error().message();
}
QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
activeConnectionObjectPath,
QLatin1String(NM_DBUS_INTERFACE_ACTIVE_CONNECTION),
QLatin1String("PropertiesChanged"),
this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
}
QNetworkManagerConnectionActive::~QNetworkManagerConnectionActive()
{
QDBusConnection::systemBus().disconnect(QLatin1String(NM_DBUS_SERVICE),
path(),
QLatin1String(NM_DBUS_INTERFACE_ACTIVE_CONNECTION),
QLatin1String("PropertiesChanged"),
this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
}
QDBusObjectPath QNetworkManagerConnectionActive::connection() const
{
if (propertyMap.contains("Connection"))
return qvariant_cast<QDBusObjectPath>(propertyMap.value("Connection"));
return QDBusObjectPath();
}
QDBusObjectPath QNetworkManagerConnectionActive::specificObject() const
{
if (propertyMap.contains("SpecificObject"))
return qvariant_cast<QDBusObjectPath>(propertyMap.value("SpecificObject"));
return QDBusObjectPath();
}
QStringList QNetworkManagerConnectionActive::devices() const
{
QStringList list;
if (propertyMap.contains("Devices")) {
const QDBusArgument &dbusArgs = qvariant_cast<QDBusArgument>(propertyMap.value("Devices"));
QDBusObjectPath path;
dbusArgs.beginArray();
while (!dbusArgs.atEnd()) {
dbusArgs >> path;
list.append(path.path());
}
dbusArgs.endArray();
}
return list;
}
quint32 QNetworkManagerConnectionActive::state() const
{
if (propertyMap.contains("State"))
return propertyMap.value("State").toUInt();
return 0;
}
bool QNetworkManagerConnectionActive::defaultRoute() const
{
if (propertyMap.contains("Default"))
return propertyMap.value("Default").toBool();
return false;
}
bool QNetworkManagerConnectionActive::default6Route() const
{
if (propertyMap.contains("Default6"))
return propertyMap.value("Default6").toBool();
return false;
}
void QNetworkManagerConnectionActive::propertiesSwap(QMap<QString,QVariant> map)
{
for (auto i = map.cbegin(), end = map.cend(); i != end; ++i) {
propertyMap.insert(i.key(),i.value());
if (i.key() == QLatin1String("State")) {
quint32 state = i.value().toUInt();
if (state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED
|| state == NM_ACTIVE_CONNECTION_STATE_DEACTIVATED) {
Q_EMIT propertiesChanged(map);
}
}
}
}
QNetworkManagerIp4Config::QNetworkManagerIp4Config( const QString &deviceObjectPath, QObject *parent)
: QDBusAbstractInterface(QLatin1String(NM_DBUS_SERVICE),
deviceObjectPath,
NM_DBUS_INTERFACE_IP4_CONFIG,
QDBusConnection::systemBus(), parent)
{
if (!isValid()) {
return;
}
}
QNetworkManagerIp4Config::~QNetworkManagerIp4Config()
{
}
QStringList QNetworkManagerIp4Config::domains() const
{
return property("Domains").toStringList();
}
QT_END_NAMESPACE
#endif // QT_NO_DBUS