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 }