File indexing completed on 2024-04-14 03:57:41

0001 /*
0002     SPDX-FileCopyrightText: 2008, 2009 Will Stephenson <wstephenson@kde.org>
0003     SPDX-FileCopyrightText: 2011 Ilia Kats <ilia-kats@gmx.net>
0004     SPDX-FileCopyrightText: 2011-2013 Lamarque V. Souza <lamarque@kde.org>
0005     SPDX-FileCopyrightText: 2013 Jan Grulich <jgrulich@redhat.com>
0006 
0007     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0008 */
0009 
0010 #include "connection_p.h"
0011 
0012 #undef signals
0013 #include <libnm/NetworkManager.h>
0014 #define signals Q_SIGNALS
0015 
0016 #include <QDBusConnection>
0017 #include <QDBusMetaType>
0018 #include <QDBusPendingCallWatcher>
0019 #include <QDBusReply>
0020 
0021 #include "nmdebug.h"
0022 
0023 NetworkManager::ConnectionPrivate::ConnectionPrivate(const QString &path, Connection *q)
0024 #ifdef NMQT_STATIC
0025     : iface(NetworkManagerPrivate::DBUS_SERVICE, path, QDBusConnection::sessionBus())
0026 #else
0027     : iface(NetworkManagerPrivate::DBUS_SERVICE, path, QDBusConnection::systemBus())
0028 #endif
0029     , q_ptr(q)
0030 {
0031 }
0032 
0033 NetworkManager::Connection::Connection(const QString &path, QObject *parent)
0034     : QObject(parent)
0035     , d_ptr(new ConnectionPrivate(path, this))
0036 {
0037     Q_D(Connection);
0038 
0039     qDBusRegisterMetaType<NMVariantMapMap>();
0040     QDBusReply<NMVariantMapMap> reply = d->iface.GetSettings();
0041     if (reply.isValid()) {
0042         d->updateSettings(reply.value());
0043     } else {
0044         d->updateSettings();
0045     }
0046     d->path = path;
0047     // qCDebug(NMQT) << m_connection;
0048 
0049     connect(&d->iface, &OrgFreedesktopNetworkManagerSettingsConnectionInterface::Updated, d, &ConnectionPrivate::onConnectionUpdated);
0050     connect(&d->iface, &OrgFreedesktopNetworkManagerSettingsConnectionInterface::Removed, d, &ConnectionPrivate::onConnectionRemoved);
0051 
0052     QDBusConnection::systemBus().connect(NetworkManagerPrivate::DBUS_SERVICE,
0053                                          d->path,
0054                                          NetworkManagerPrivate::FDO_DBUS_PROPERTIES,
0055                                          QLatin1String("PropertiesChanged"),
0056                                          d,
0057                                          SLOT(dbusPropertiesChanged(QString, QVariantMap, QStringList)));
0058     d->unsaved = d->iface.unsaved();
0059 }
0060 
0061 NetworkManager::Connection::~Connection()
0062 {
0063     delete d_ptr;
0064 }
0065 
0066 bool NetworkManager::Connection::isValid() const
0067 {
0068     Q_D(const Connection);
0069     return d->iface.isValid();
0070 }
0071 
0072 QString NetworkManager::Connection::uuid() const
0073 {
0074     Q_D(const Connection);
0075     return d->uuid;
0076 }
0077 
0078 QString NetworkManager::Connection::name() const
0079 {
0080     Q_D(const Connection);
0081     return d->id;
0082 }
0083 
0084 bool NetworkManager::Connection::isUnsaved() const
0085 {
0086     Q_D(const Connection);
0087     return d->unsaved;
0088 }
0089 
0090 NetworkManager::ConnectionSettings::Ptr NetworkManager::Connection::settings()
0091 {
0092     Q_D(Connection);
0093 
0094     if (d->connection.isNull()) {
0095         d->connection = ConnectionSettings::Ptr(new ConnectionSettings(d->settings));
0096     }
0097     return d->connection;
0098 }
0099 
0100 QDBusPendingReply<NMVariantMapMap> NetworkManager::Connection::secrets(const QString &setting)
0101 {
0102     Q_D(Connection);
0103     return d->iface.GetSecrets(setting);
0104 }
0105 
0106 QDBusPendingReply<> NetworkManager::Connection::update(const NMVariantMapMap &settings)
0107 {
0108     Q_D(Connection);
0109     return d->iface.Update(settings);
0110 }
0111 
0112 QDBusPendingReply<> NetworkManager::Connection::updateUnsaved(const NMVariantMapMap &settings)
0113 {
0114     Q_D(Connection);
0115     return d->iface.UpdateUnsaved(settings);
0116 }
0117 
0118 QDBusPendingReply<> NetworkManager::Connection::save()
0119 {
0120     Q_D(Connection);
0121     return d->iface.Save();
0122 }
0123 
0124 QDBusPendingReply<> NetworkManager::Connection::clearSecrets()
0125 {
0126     Q_D(Connection);
0127     return d->iface.ClearSecrets();
0128 }
0129 
0130 QDBusPendingReply<> NetworkManager::Connection::remove()
0131 {
0132     Q_D(Connection);
0133     return d->iface.Delete();
0134 }
0135 
0136 QString NetworkManager::Connection::path() const
0137 {
0138     Q_D(const Connection);
0139     return d->path;
0140 }
0141 
0142 void NetworkManager::ConnectionPrivate::onConnectionUpdated()
0143 {
0144     Q_Q(Connection);
0145     QDBusReply<NMVariantMapMap> reply = iface.GetSettings();
0146     if (reply.isValid()) {
0147         updateSettings(reply.value());
0148     } else {
0149         updateSettings();
0150     }
0151     Q_EMIT q->updated();
0152 }
0153 
0154 void NetworkManager::ConnectionPrivate::onConnectionRemoved()
0155 {
0156     Q_Q(Connection);
0157     QString tmpPath = path;
0158     updateSettings();
0159     Q_EMIT q->removed(tmpPath);
0160 }
0161 
0162 void NetworkManager::ConnectionPrivate::dbusPropertiesChanged(const QString &interfaceName,
0163                                                               const QVariantMap &properties,
0164                                                               const QStringList &invalidatedProperties)
0165 {
0166     Q_UNUSED(invalidatedProperties);
0167     if (interfaceName == QLatin1String("org.freedesktop.NetworkManager.Settings.Connection")) {
0168         onPropertiesChanged(properties);
0169     }
0170 }
0171 
0172 void NetworkManager::ConnectionPrivate::onPropertiesChanged(const QVariantMap &properties)
0173 {
0174     Q_Q(Connection);
0175     QVariantMap::const_iterator it = properties.constBegin();
0176     while (it != properties.constEnd()) {
0177         const QString property = it.key();
0178         if (property == QLatin1String("Unsaved")) {
0179             unsaved = it->toBool();
0180             Q_EMIT q->unsavedChanged(unsaved);
0181         } else {
0182             qCWarning(NMQT) << Q_FUNC_INFO << "Unhandled property" << property;
0183         }
0184         ++it;
0185     }
0186 }
0187 
0188 void NetworkManager::ConnectionPrivate::updateSettings(const NMVariantMapMap &newSettings)
0189 {
0190     settings = newSettings;
0191     if (settings.contains(QLatin1String(NM_SETTING_CONNECTION_SETTING_NAME))) {
0192         QVariantMap connectionSetting = settings.value(QLatin1String(NM_SETTING_CONNECTION_SETTING_NAME));
0193         if (connectionSetting.contains(QLatin1String(NM_SETTING_CONNECTION_UUID))) {
0194             uuid = connectionSetting.value(QLatin1String(NM_SETTING_CONNECTION_UUID)).toString();
0195         }
0196         if (connectionSetting.contains(QLatin1String(NM_SETTING_CONNECTION_ID))) {
0197             id = connectionSetting.value(QLatin1String(NM_SETTING_CONNECTION_ID)).toString();
0198         }
0199     } else if (newSettings.isEmpty()) {
0200         uuid.clear();
0201         id.clear();
0202     }
0203     connection.clear();
0204 }
0205 
0206 #include "moc_connection.cpp"
0207 #include "moc_connection_p.cpp"