File indexing completed on 2025-03-23 12:49:54
0001 /* 0002 SPDX-FileCopyrightText: 2011 Ilia Kats <ilia-kats@gmx.net> 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 "connection.h" 0009 #include "device.h" 0010 #include "nmdebug.h" 0011 #include "settings.h" 0012 #include "vpnconnection_p.h" 0013 0014 NetworkManager::VpnConnectionPrivate::VpnConnectionPrivate(const QString &path, VpnConnection *q) 0015 : ActiveConnectionPrivate(path, q) 0016 #ifdef NMQT_STATIC 0017 , iface(NetworkManagerPrivate::DBUS_SERVICE, path, QDBusConnection::sessionBus()) 0018 #else 0019 , iface(NetworkManagerPrivate::DBUS_SERVICE, path, QDBusConnection::systemBus()) 0020 #endif 0021 , q_ptr(q) 0022 { 0023 } 0024 0025 NetworkManager::VpnConnection::State NetworkManager::VpnConnectionPrivate::convertVpnConnectionState(uint state) 0026 { 0027 return static_cast<NetworkManager::VpnConnection::State>(state); 0028 } 0029 0030 NetworkManager::VpnConnection::StateChangeReason NetworkManager::VpnConnectionPrivate::convertVpnConnectionStateReason(uint reason) 0031 { 0032 return static_cast<NetworkManager::VpnConnection::StateChangeReason>(reason); 0033 } 0034 0035 NetworkManager::VpnConnection::VpnConnection(const QString &path, QObject *parent) 0036 : ActiveConnection(*new VpnConnectionPrivate(path, this), parent) 0037 { 0038 Q_D(VpnConnection); 0039 0040 QDBusConnection::systemBus().connect(NetworkManagerPrivate::DBUS_SERVICE, 0041 d->path, 0042 NetworkManagerPrivate::FDO_DBUS_PROPERTIES, 0043 QLatin1String("PropertiesChanged"), 0044 d, 0045 SLOT(dbusPropertiesChanged(QString, QVariantMap, QStringList))); 0046 connect(&d->iface, &OrgFreedesktopNetworkManagerVPNConnectionInterface::VpnStateChanged, d, &VpnConnectionPrivate::vpnStateChanged); 0047 0048 // We need to get ActiveConnection's properties, because by default every ActiveConnection 0049 // is basically a VpnConnection 0050 QVariantMap initialProperties = 0051 NetworkManagerPrivate::retrieveInitialProperties(OrgFreedesktopNetworkManagerConnectionActiveInterface::staticInterfaceName(), path); 0052 if (!initialProperties.isEmpty()) { 0053 d->propertiesChanged(initialProperties); 0054 } 0055 0056 // Try to retrieve VPN specific properties if this is a VPN connection 0057 if (vpn()) { 0058 // Get all VpnConnection's properties at once 0059 QVariantMap initialProperties = NetworkManagerPrivate::retrieveInitialProperties(d->iface.staticInterfaceName(), path); 0060 if (!initialProperties.isEmpty()) { 0061 d->propertiesChanged(initialProperties); 0062 } 0063 } 0064 } 0065 0066 NetworkManager::VpnConnection::~VpnConnection() 0067 { 0068 } 0069 0070 QString NetworkManager::VpnConnection::banner() const 0071 { 0072 Q_D(const VpnConnection); 0073 // return d->banner; // FIXME NM doesn't Q_EMIT the Banner property change 0074 return d->iface.banner(); 0075 } 0076 0077 NetworkManager::VpnConnection::State NetworkManager::VpnConnection::state() const 0078 { 0079 Q_D(const VpnConnection); 0080 return d->state; 0081 } 0082 0083 void NetworkManager::VpnConnectionPrivate::dbusPropertiesChanged(const QString &interfaceName, 0084 const QVariantMap &properties, 0085 const QStringList &invalidatedProperties) 0086 { 0087 Q_UNUSED(invalidatedProperties); 0088 0089 if (interfaceName == QLatin1String("org.freedesktop.NetworkManager.VPN.Connection")) { 0090 propertiesChanged(properties); 0091 } else { 0092 ActiveConnectionPrivate::propertiesChanged(properties); 0093 } 0094 } 0095 0096 void NetworkManager::VpnConnectionPrivate::propertyChanged(const QString &property, const QVariant &value) 0097 { 0098 Q_Q(VpnConnection); 0099 0100 if (property == QLatin1String("Banner")) { 0101 banner = value.toString(); 0102 Q_EMIT q->bannerChanged(banner); 0103 } else if (property == QLatin1String("VpnState")) { 0104 // Do not notify about changed VpnState twice, because there is also signal VpnStateChanged() from NetworkManager 0105 state = NetworkManager::VpnConnectionPrivate::convertVpnConnectionState(value.toUInt()); 0106 // NetworkManager::VpnConnection::StateChangeReason reason = 0107 // NetworkManager::VpnConnectionPrivate::convertVpnConnectionStateReason(properties.key("Reason").toUInt()); Q_EMIT stateChanged(d->state, reason); 0108 } else { 0109 ActiveConnectionPrivate::propertyChanged(property, value); 0110 } 0111 } 0112 0113 void NetworkManager::VpnConnectionPrivate::vpnStateChanged(uint newState, uint reason) 0114 { 0115 Q_Q(VpnConnection); 0116 Q_UNUSED(reason); 0117 0118 state = NetworkManager::VpnConnectionPrivate::convertVpnConnectionState(newState); 0119 NetworkManager::VpnConnection::StateChangeReason stateChangeReason = NetworkManager::VpnConnectionPrivate::convertVpnConnectionStateReason(reason); 0120 Q_EMIT q->stateChanged(state, stateChangeReason); 0121 } 0122 0123 NetworkManager::VpnConnection::operator VpnConnection *() 0124 { 0125 Q_D(VpnConnection); 0126 if (d->vpn) { 0127 return this; 0128 } else { 0129 return nullptr; 0130 } 0131 } 0132 0133 #include "moc_vpnconnection.cpp" 0134 #include "moc_vpnconnection_p.cpp"