Warning, file /frameworks/networkmanager-qt/src/settings.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002     SPDX-FileCopyrightText: 2011-2013 Lamarque Souza <lamarque@kde.org>
0003     SPDX-FileCopyrightText: 2013 Jan Grulich <jgrulich@redhat.com>
0004 
0005     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0006 */
0007 
0008 #include "settings.h"
0009 #include "macros.h"
0010 #include "manager_p.h"
0011 #include "settings_p.h"
0012 
0013 #include <QDBusObjectPath>
0014 
0015 #include <nm-setting-connection.h>
0016 
0017 #include "nmdebug.h"
0018 
0019 // NM_GLOBAL_STATIC(NetworkManager::SettingsPrivate, globalSettings)
0020 Q_GLOBAL_STATIC(NetworkManager::SettingsPrivate, globalSettings)
0021 
0022 NetworkManager::SettingsPrivate::SettingsPrivate()
0023 #ifdef NMQT_STATIC
0024     : iface(NetworkManagerPrivate::DBUS_SERVICE, NetworkManagerPrivate::DBUS_SETTINGS_PATH, QDBusConnection::sessionBus())
0025 #else
0026     : iface(NetworkManagerPrivate::DBUS_SERVICE, NetworkManagerPrivate::DBUS_SETTINGS_PATH, QDBusConnection::systemBus())
0027 #endif
0028     , m_canModify(true)
0029 {
0030     QDBusConnection::systemBus().connect(NetworkManagerPrivate::DBUS_SERVICE,
0031                                          NetworkManagerPrivate::DBUS_SETTINGS_PATH,
0032                                          NetworkManagerPrivate::FDO_DBUS_PROPERTIES,
0033                                          QLatin1String("PropertiesChanged"),
0034                                          this,
0035                                          SLOT(dbusPropertiesChanged(QString, QVariantMap, QStringList)));
0036     connect(&iface, &OrgFreedesktopNetworkManagerSettingsInterface::NewConnection, this, &SettingsPrivate::onConnectionAdded);
0037     connect(&iface,
0038             &OrgFreedesktopNetworkManagerSettingsInterface::ConnectionRemoved,
0039             this,
0040             static_cast<void (SettingsPrivate::*)(const QDBusObjectPath &)>(&SettingsPrivate::onConnectionRemoved));
0041     init();
0042     // This class is a friend of NetworkManagerPrivate thus initted there too
0043     // because of the init chain we must follow,
0044     // But if this class is used first we need to make sure the
0045     // NetworkManagerPrivate also get created so we have its signals for
0046     // when the daemon dies, we just can not call it directly here or
0047     // we will have a constructor infinite loop
0048     QTimer::singleShot(0, this, SLOT(initNotifier()));
0049 }
0050 
0051 void NetworkManager::SettingsPrivate::init()
0052 {
0053     const QList<QDBusObjectPath> connectionList = iface.connections();
0054     qCDebug(NMQT) << "Connections list";
0055     for (const QDBusObjectPath &connection : connectionList) {
0056         if (!connections.contains(connection.path())) {
0057             connections.insert(connection.path(), Connection::Ptr());
0058             Q_EMIT connectionAdded(connection.path());
0059             qCDebug(NMQT) << " " << connection.path();
0060         }
0061     }
0062 
0063     // Get all Setting's properties at once
0064     QVariantMap initialProperties = NetworkManagerPrivate::retrieveInitialProperties(iface.staticInterfaceName(), NetworkManagerPrivate::DBUS_SETTINGS_PATH);
0065     if (!initialProperties.isEmpty()) {
0066         propertiesChanged(initialProperties);
0067     }
0068 }
0069 
0070 NetworkManager::Connection::List NetworkManager::SettingsPrivate::listConnections()
0071 {
0072     NetworkManager::Connection::List list;
0073     QMap<QString, Connection::Ptr>::const_iterator i = connections.constBegin();
0074     while (i != connections.constEnd()) {
0075         NetworkManager::Connection::Ptr connection = findRegisteredConnection(i.key());
0076         if (connection) {
0077             list << connection;
0078         }
0079         ++i;
0080     }
0081     return list;
0082 }
0083 
0084 NetworkManager::Connection::Ptr NetworkManager::SettingsPrivate::findConnectionByUuid(const QString &uuid)
0085 {
0086     QMap<QString, Connection::Ptr>::const_iterator i = connections.constBegin();
0087     while (i != connections.constEnd()) {
0088         NetworkManager::Connection::Ptr connection = findRegisteredConnection(i.key());
0089         if (connection && connection->uuid() == uuid) {
0090             return connection;
0091         }
0092         ++i;
0093     }
0094 
0095     return NetworkManager::Connection::Ptr();
0096 }
0097 
0098 QString NetworkManager::SettingsPrivate::hostname() const
0099 {
0100     return m_hostname;
0101 }
0102 
0103 bool NetworkManager::SettingsPrivate::canModify() const
0104 {
0105     return m_canModify;
0106 }
0107 
0108 QDBusPendingReply<QDBusObjectPath> NetworkManager::SettingsPrivate::addConnection(const NMVariantMapMap &connection)
0109 {
0110     return iface.AddConnection(connection);
0111 }
0112 
0113 QDBusPendingReply<QDBusObjectPath> NetworkManager::SettingsPrivate::addConnectionUnsaved(const NMVariantMapMap &connection)
0114 {
0115     return iface.AddConnectionUnsaved(connection);
0116 }
0117 
0118 QDBusPendingReply<bool, QStringList> NetworkManager::SettingsPrivate::loadConnections(const QStringList &filenames)
0119 {
0120     return iface.LoadConnections(filenames);
0121 }
0122 
0123 QDBusPendingReply<bool> NetworkManager::SettingsPrivate::reloadConnections()
0124 {
0125     return iface.ReloadConnections();
0126 }
0127 
0128 void NetworkManager::SettingsPrivate::initNotifier()
0129 {
0130     notifier();
0131 }
0132 
0133 void NetworkManager::SettingsPrivate::saveHostname(const QString &hostname)
0134 {
0135     iface.SaveHostname(hostname);
0136 }
0137 
0138 void NetworkManager::SettingsPrivate::dbusPropertiesChanged(const QString &interfaceName,
0139                                                             const QVariantMap &properties,
0140                                                             const QStringList &invalidatedProperties)
0141 {
0142     Q_UNUSED(invalidatedProperties);
0143     if (interfaceName == QLatin1String("org.freedesktop.NetworkManager.Settings")) {
0144         propertiesChanged(properties);
0145     }
0146 }
0147 
0148 void NetworkManager::SettingsPrivate::propertiesChanged(const QVariantMap &properties)
0149 {
0150     QVariantMap::const_iterator it = properties.constBegin();
0151     while (it != properties.constEnd()) {
0152         const QString property = it.key();
0153         if (property == QLatin1String("CanModify")) {
0154             m_canModify = it->toBool();
0155             Q_EMIT canModifyChanged(m_canModify);
0156         } else if (property == QLatin1String("Hostname")) {
0157             m_hostname = it->toString();
0158             Q_EMIT hostnameChanged(m_hostname);
0159         } else if (property == QLatin1String("Connections")) {
0160             // will never get here in runtime NM < 0.9.10
0161             // TODO some action??
0162         } else {
0163             qCWarning(NMQT) << Q_FUNC_INFO << "Unhandled property" << property;
0164         }
0165         ++it;
0166     }
0167 }
0168 
0169 void NetworkManager::SettingsPrivate::onConnectionAdded(const QDBusObjectPath &path)
0170 {
0171     const QString id = path.path();
0172     if (connections.contains(id)) {
0173         return;
0174     }
0175     connections.insert(id, Connection::Ptr());
0176     Q_EMIT connectionAdded(id);
0177 }
0178 
0179 NetworkManager::Connection::Ptr NetworkManager::SettingsPrivate::findRegisteredConnection(const QString &path)
0180 {
0181     Connection::Ptr ret;
0182     if (!path.isEmpty()) {
0183         bool contains = connections.contains(path);
0184         if (contains && connections.value(path)) {
0185             ret = connections.value(path);
0186         } else {
0187             ret = Connection::Ptr(new Connection(path), &QObject::deleteLater);
0188             connections[path] = ret;
0189             connect(ret.data(), SIGNAL(removed(QString)), this, SLOT(onConnectionRemoved(QString)));
0190             if (!contains) {
0191                 Q_EMIT connectionAdded(path);
0192             }
0193         }
0194     }
0195     return ret;
0196 }
0197 
0198 void NetworkManager::SettingsPrivate::onConnectionRemoved(const QDBusObjectPath &path)
0199 {
0200     onConnectionRemoved(path.path());
0201 }
0202 
0203 void NetworkManager::SettingsPrivate::onConnectionRemoved(const QString &path)
0204 {
0205     connections.remove(path);
0206     Q_EMIT connectionRemoved(path);
0207 }
0208 
0209 void NetworkManager::SettingsPrivate::daemonUnregistered()
0210 {
0211     connections.clear();
0212 }
0213 
0214 NetworkManager::Connection::List NetworkManager::listConnections()
0215 {
0216     return globalSettings->listConnections();
0217 }
0218 
0219 NetworkManager::Connection::Ptr NetworkManager::findConnectionByUuid(const QString &uuid)
0220 {
0221     return globalSettings->findConnectionByUuid(uuid);
0222 }
0223 
0224 NetworkManager::Connection::Ptr NetworkManager::findConnection(const QString &path)
0225 {
0226     return globalSettings->findRegisteredConnection(path);
0227 }
0228 
0229 QDBusPendingReply<QDBusObjectPath> NetworkManager::addConnection(const NMVariantMapMap &connection)
0230 {
0231     return globalSettings->addConnection(connection);
0232 }
0233 
0234 QDBusPendingReply<QDBusObjectPath> NetworkManager::addConnectionUnsaved(const NMVariantMapMap &connection)
0235 {
0236     return globalSettings->addConnectionUnsaved(connection);
0237 }
0238 
0239 QDBusPendingReply<bool, QStringList> NetworkManager::loadConnections(const QStringList &filenames)
0240 {
0241     return globalSettings->loadConnections(filenames);
0242 }
0243 
0244 QDBusPendingReply<bool> NetworkManager::reloadConnections()
0245 {
0246     return globalSettings->reloadConnections();
0247 }
0248 
0249 void NetworkManager::saveHostname(const QString &hostname)
0250 {
0251     globalSettings->saveHostname(hostname);
0252 }
0253 
0254 bool NetworkManager::canModify()
0255 {
0256     return globalSettings->canModify();
0257 }
0258 
0259 QString NetworkManager::hostname()
0260 {
0261     return globalSettings->hostname();
0262 }
0263 
0264 NetworkManager::SettingsNotifier *NetworkManager::settingsNotifier()
0265 {
0266     return globalSettings;
0267 }