File indexing completed on 2025-03-23 12:49:49
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"