From 58c4883e9bd10a52f704babd9d85ce3fb5316fc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=BCrz?= Date: Wed, 6 Dec 2023 11:57:52 +0100 Subject: [PATCH 1/2] Add CheckConnectivity method and verify connectivity on state changed due to missing property changed signal --- libnymea-networkmanager/networkmanager.cpp | 21 ++++++++++++++++++++- libnymea-networkmanager/networkmanager.h | 4 +++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/libnymea-networkmanager/networkmanager.cpp b/libnymea-networkmanager/networkmanager.cpp index 9571cb5..235ed32 100644 --- a/libnymea-networkmanager/networkmanager.cpp +++ b/libnymea-networkmanager/networkmanager.cpp @@ -592,6 +592,24 @@ bool NetworkManager::enableWireless(bool enabled) return m_networkManagerInterface->setProperty("WirelessEnabled", enabled); } +void NetworkManager::checkConnectivity() +{ + // Get network devices + qCDebug(dcNetworkManager()) << "Checking connectivity ..."; + QDBusMessage query = m_networkManagerInterface->call("CheckConnectivity"); + if(query.type() != QDBusMessage::ReplyMessage) { + qCWarning(dcNetworkManager()) << query.errorName() << query.errorMessage(); + return; + } + + if (query.arguments().isEmpty()) + return; + + NetworkManagerConnectivityState state = static_cast(query.arguments().at(0).toUInt()); + qCDebug(dcNetworkManager()) << "Checked connectevitiy state successfully:" << query.arguments().at(0).toUInt() << state; + setConnectivityState(state); +} + void NetworkManager::init() { qCDebug(dcNetworkManager()) << "Initializing network manager"; @@ -766,6 +784,7 @@ void NetworkManager::setState(const NetworkManager::NetworkManagerState &state) qCDebug(dcNetworkManager()) << "State changed:" << networkManagerStateToString(state); m_state = state; emit stateChanged(m_state); + checkConnectivity(); } void NetworkManager::onServiceRegistered() @@ -780,7 +799,7 @@ void NetworkManager::onServiceUnregistered() deinit(); } -void NetworkManager::onStateChanged(const uint &state) +void NetworkManager::onStateChanged(uint state) { setState(static_cast(state)); } diff --git a/libnymea-networkmanager/networkmanager.h b/libnymea-networkmanager/networkmanager.h index 0bf7b5f..16a39c4 100644 --- a/libnymea-networkmanager/networkmanager.h +++ b/libnymea-networkmanager/networkmanager.h @@ -134,6 +134,8 @@ public: bool wirelessEnabled() const; bool enableWireless(bool enabled); + void checkConnectivity(); + private: QDBusServiceWatcher *m_serviceWatcher = nullptr; QDBusInterface *m_networkManagerInterface = nullptr; @@ -187,7 +189,7 @@ private slots: void onServiceRegistered(); void onServiceUnregistered(); - void onStateChanged(const uint &state); + void onStateChanged(uint state); void onDeviceAdded(const QDBusObjectPath &deviceObjectPath); void onDeviceRemoved(const QDBusObjectPath &deviceObjectPath); void onPropertiesChanged(const QVariantMap &properties); From 74e6335ac512b4826fc1d4facd3aee4675140e33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=BCrz?= Date: Mon, 18 Dec 2023 15:15:55 +0100 Subject: [PATCH 2/2] Update PropertiesChanged signal to work with old and new network-manager instances --- libnymea-networkmanager/networkmanager.cpp | 16 ++++++++++-- libnymea-networkmanager/networkmanager.h | 3 ++- libnymea-networkmanager/networksettings.cpp | 19 +++++++++++--- libnymea-networkmanager/networksettings.h | 3 ++- .../wirednetworkdevice.cpp | 19 ++++++++++---- libnymea-networkmanager/wirednetworkdevice.h | 3 ++- .../wirelessaccesspoint.cpp | 26 +++++++++++++------ libnymea-networkmanager/wirelessaccesspoint.h | 3 ++- .../wirelessnetworkdevice.cpp | 15 ++++++----- .../wirelessnetworkdevice.h | 4 +-- 10 files changed, 79 insertions(+), 32 deletions(-) diff --git a/libnymea-networkmanager/networkmanager.cpp b/libnymea-networkmanager/networkmanager.cpp index 235ed32..cb446f1 100644 --- a/libnymea-networkmanager/networkmanager.cpp +++ b/libnymea-networkmanager/networkmanager.cpp @@ -653,7 +653,11 @@ void NetworkManager::init() QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), NetworkManagerUtils::networkManagerPathString(), NetworkManagerUtils::networkManagerServiceString(), "StateChanged", this, SLOT(onStateChanged(uint))); QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), NetworkManagerUtils::networkManagerPathString(), NetworkManagerUtils::networkManagerServiceString(), "DeviceAdded", this, SLOT(onDeviceAdded(QDBusObjectPath))); QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), NetworkManagerUtils::networkManagerPathString(), NetworkManagerUtils::networkManagerServiceString(), "DeviceRemoved", this, SLOT(onDeviceRemoved(QDBusObjectPath))); - QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), NetworkManagerUtils::networkManagerPathString(), NetworkManagerUtils::networkManagerServiceString(), "PropertiesChanged", this, SLOT(onPropertiesChanged(QVariantMap))); + + // Networkmanager < 1.2.0 uses custom signal instead of the standard D-Bus properties changed signal + QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), NetworkManagerUtils::networkManagerPathString(), NetworkManagerUtils::networkManagerServiceString(), "PropertiesChanged", this, SLOT(processProperties(QVariantMap))); + // Networkmanager >= 1.2.0 uses standard D-Bus properties changed signal + QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), NetworkManagerUtils::networkManagerPathString(), "org.freedesktop.DBus.Properties", "PropertiesChanged", this, SLOT(onPropertiesChanged(QString,QVariantMap,QStringList))); // Load network devices loadDevices(); @@ -875,7 +879,15 @@ void NetworkManager::onDeviceRemoved(const QDBusObjectPath &deviceObjectPath) networkDevice->deleteLater(); } -void NetworkManager::onPropertiesChanged(const QVariantMap &properties) +void NetworkManager::onPropertiesChanged(const QString &interface, const QVariantMap &changedProperties, const QStringList &invalidatedProperties) +{ + Q_UNUSED(interface) + Q_UNUSED(invalidatedProperties) + //qCDebug(dcNetworkManager()) << "NetworkManager: Properties changed" << interface << changedProperties << invalidatedProperties; + processProperties(changedProperties); +} + +void NetworkManager::processProperties(const QVariantMap &properties) { if (properties.contains("Version")) setVersion(properties.value("Version").toString()); diff --git a/libnymea-networkmanager/networkmanager.h b/libnymea-networkmanager/networkmanager.h index 16a39c4..bb5edf5 100644 --- a/libnymea-networkmanager/networkmanager.h +++ b/libnymea-networkmanager/networkmanager.h @@ -192,7 +192,8 @@ private slots: void onStateChanged(uint state); void onDeviceAdded(const QDBusObjectPath &deviceObjectPath); void onDeviceRemoved(const QDBusObjectPath &deviceObjectPath); - void onPropertiesChanged(const QVariantMap &properties); + void onPropertiesChanged(const QString &interface, const QVariantMap &changedProperties, const QStringList &invalidatedProperties); + void processProperties(const QVariantMap &properties); void onWirelessDeviceChanged(); void onWiredDeviceChanged(); diff --git a/libnymea-networkmanager/networksettings.cpp b/libnymea-networkmanager/networksettings.cpp index 480a36c..2e0363c 100644 --- a/libnymea-networkmanager/networksettings.cpp +++ b/libnymea-networkmanager/networksettings.cpp @@ -60,7 +60,10 @@ NetworkSettings::NetworkSettings(QObject *parent) : QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), NetworkManagerUtils::settingsPathString(), NetworkManagerUtils::settingsInterfaceString(), "NewConnection", this, SLOT(connectionAdded(QDBusObjectPath))); QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), NetworkManagerUtils::settingsPathString(), NetworkManagerUtils::settingsInterfaceString(), "ConnectionRemoved", this, SLOT(connectionRemoved(QDBusObjectPath))); - QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), NetworkManagerUtils::settingsPathString(), NetworkManagerUtils::settingsInterfaceString(), "PropertiesChanged", this, SLOT(propertiesChanged(QVariantMap))); + // Networkmanager < 1.2.0 uses custom signal instead of the standard D-Bus properties changed signal + QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), NetworkManagerUtils::settingsPathString(), NetworkManagerUtils::settingsInterfaceString(), "PropertiesChanged", this, SLOT(processProperties(QVariantMap))); + // Networkmanager >= 1.2.0 uses standard D-Bus properties changed signal + QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), NetworkManagerUtils::settingsPathString(), "org.freedesktop.DBus.Properties", "PropertiesChanged", this, SLOT(onPropertiesChanged(QString,QVariantMap,QStringList))); } /*! Add the given \a settings to this \l{NetworkSettings}. Returns the dbus object path from the new settings. */ @@ -121,9 +124,17 @@ void NetworkSettings::connectionRemoved(const QDBusObjectPath &objectPath) connection->deleteLater(); } -void NetworkSettings::propertiesChanged(const QVariantMap &properties) +void NetworkSettings::onPropertiesChanged(const QString &interface, const QVariantMap &changedProperties, const QStringList &invalidatedProperties) +{ + Q_UNUSED(interface) + Q_UNUSED(invalidatedProperties) + //qCDebug(dcNetworkManager()) << "Settins: Properties changed" << interface << changedProperties << invalidatedProperties; + processProperties(changedProperties); +} + +void NetworkSettings::processProperties(const QVariantMap &properties) { Q_UNUSED(properties) - // TODO: handle settings changes - //qCDebug(dcNetworkManager()) << "Settins: properties changed" << properties; } + + diff --git a/libnymea-networkmanager/networksettings.h b/libnymea-networkmanager/networksettings.h index 53a9ea6..79830c4 100644 --- a/libnymea-networkmanager/networksettings.h +++ b/libnymea-networkmanager/networksettings.h @@ -68,7 +68,8 @@ private: private slots: void connectionAdded(const QDBusObjectPath &objectPath); void connectionRemoved(const QDBusObjectPath &objectPath); - void propertiesChanged(const QVariantMap &properties); + void onPropertiesChanged(const QString &interface, const QVariantMap &changedProperties, const QStringList &invalidatedProperties); + void processProperties(const QVariantMap &properties); }; diff --git a/libnymea-networkmanager/wirednetworkdevice.cpp b/libnymea-networkmanager/wirednetworkdevice.cpp index 411b04c..aa6d95e 100644 --- a/libnymea-networkmanager/wirednetworkdevice.cpp +++ b/libnymea-networkmanager/wirednetworkdevice.cpp @@ -62,6 +62,9 @@ WiredNetworkDevice::WiredNetworkDevice(const QDBusObjectPath &objectPath, QObjec m_bitRate = m_wiredInterface->property("Bitrate").toInt(); m_pluggedIn = m_wiredInterface->property("Carrier").toBool(); + // Networkmanager < 1.2.0 uses custom signal instead of the standard D-Bus properties changed signal + QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), this->objectPath().path(), NetworkManagerUtils::wiredInterfaceString(), "PropertiesChanged", this, SLOT(processProperties(QVariantMap))); + // Networkmanager >= 1.2.0 uses standard D-Bus properties changed signal QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), this->objectPath().path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", this, SLOT(propertiesChanged(QString, QVariantMap, QStringList))); } @@ -83,12 +86,18 @@ bool WiredNetworkDevice::pluggedIn() const return m_pluggedIn; } -void WiredNetworkDevice::propertiesChanged(const QString &interface_name, const QVariantMap &changed_properties, const QStringList &invalidated_properties) +void WiredNetworkDevice::onPropertiesChanged(const QString &interfaceName, const QVariantMap &changedProperties, const QStringList &invalidatedProperties) { - Q_UNUSED(interface_name) - Q_UNUSED(invalidated_properties) - if (changed_properties.contains("Carrier")) { - m_pluggedIn = changed_properties.value("Carrier").toBool(); + Q_UNUSED(interfaceName) + Q_UNUSED(invalidatedProperties) + //qCDebug(dcNetworkManager()) << "WiredNetworkDevice: Properties changed" << interface << changedProperties << invalidatedProperties; + processProperties(changedProperties); +} + +void WiredNetworkDevice::processProperties(const QVariantMap &properties) +{ + if (properties.contains("Carrier")) { + m_pluggedIn = properties.value("Carrier").toBool(); emit pluggedInChanged(m_pluggedIn); } diff --git a/libnymea-networkmanager/wirednetworkdevice.h b/libnymea-networkmanager/wirednetworkdevice.h index d526ada..8252002 100644 --- a/libnymea-networkmanager/wirednetworkdevice.h +++ b/libnymea-networkmanager/wirednetworkdevice.h @@ -50,7 +50,8 @@ signals: void pluggedInChanged(bool pluggedIn); private slots: - void propertiesChanged(const QString &interface_name, const QVariantMap &changed_properties, const QStringList &invalidated_properties); + void onPropertiesChanged(const QString &interfaceName, const QVariantMap &changedProperties, const QStringList &invalidatedProperties); + void processProperties(const QVariantMap &properties); private: QDBusInterface *m_wiredInterface = nullptr; diff --git a/libnymea-networkmanager/wirelessaccesspoint.cpp b/libnymea-networkmanager/wirelessaccesspoint.cpp index aaa699d..5a94f58 100644 --- a/libnymea-networkmanager/wirelessaccesspoint.cpp +++ b/libnymea-networkmanager/wirelessaccesspoint.cpp @@ -84,7 +84,10 @@ WirelessAccessPoint::WirelessAccessPoint(const QDBusObjectPath &objectPath, QObj qCDebug(dcNetworkManager()) << ssid() << "RSN flags:" << m_rsnFlags; qCDebug(dcNetworkManager()) << ssid() << "Capabilities:" << m_capabilities; - QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), objectPath.path(), NetworkManagerUtils::accessPointInterfaceString(), "PropertiesChanged", this, SLOT(onPropertiesChanged(QVariantMap))); + // Networkmanager < 1.2.0 uses custom signal instead of the standard D-Bus properties changed signal + QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), this->objectPath().path(), NetworkManagerUtils::accessPointInterfaceString(), "PropertiesChanged", this, SLOT(processProperties(QVariantMap))); + // Networkmanager >= 1.2.0 uses standard D-Bus properties changed signal + QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), objectPath.path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", this, SLOT(onPropertiesChanged(QString,QVariantMap,QStringList))); } /*! Returns the dbus object path of this \l{WirelessAccessPoint}. */ @@ -153,6 +156,20 @@ void WirelessAccessPoint::setIsProtected(bool isProtected) m_isProtected = isProtected; } +void WirelessAccessPoint::onPropertiesChanged(const QString &interface, const QVariantMap &changedProperties, const QStringList &invalidatedProperties) +{ + Q_UNUSED(interface) + Q_UNUSED(invalidatedProperties) + //qCDebug(dcNetworkManager()) << "WirelessAccessPoint: Properties changed" << interface << changedProperties << invalidatedProperties; + processProperties(changedProperties); +} + +void WirelessAccessPoint::processProperties(const QVariantMap &properties) +{ + if (properties.contains("Strength")) + setSignalStrength(properties.value("Strength").toInt()); +} + /*! Returns true if this \l{WirelessAccessPoint} is password protected. */ bool WirelessAccessPoint::isProtected() const { @@ -186,13 +203,6 @@ WirelessAccessPoint::ApSecurityModes WirelessAccessPoint::rsnFlags() const return m_rsnFlags; } -void WirelessAccessPoint::onPropertiesChanged(const QVariantMap &properties) -{ - if (properties.contains("Strength")) - setSignalStrength(properties.value("Strength").toInt()); - -} - QDebug operator<<(QDebug debug, WirelessAccessPoint *accessPoint) { debug.nospace() << "AccessPoint(" << accessPoint->signalStrength() << "%, " diff --git a/libnymea-networkmanager/wirelessaccesspoint.h b/libnymea-networkmanager/wirelessaccesspoint.h index b75e00b..5a8cf78 100644 --- a/libnymea-networkmanager/wirelessaccesspoint.h +++ b/libnymea-networkmanager/wirelessaccesspoint.h @@ -109,7 +109,8 @@ signals: void signalStrengthChanged(); private slots: - void onPropertiesChanged(const QVariantMap &properties); + void onPropertiesChanged(const QString &interface, const QVariantMap &changedProperties, const QStringList &invalidatedProperties); + void processProperties(const QVariantMap &properties); }; diff --git a/libnymea-networkmanager/wirelessnetworkdevice.cpp b/libnymea-networkmanager/wirelessnetworkdevice.cpp index 983f8a4..f12e977 100644 --- a/libnymea-networkmanager/wirelessnetworkdevice.cpp +++ b/libnymea-networkmanager/wirelessnetworkdevice.cpp @@ -83,9 +83,9 @@ WirelessNetworkDevice::WirelessNetworkDevice(const QDBusObjectPath &objectPath, QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), this->objectPath().path(), NetworkManagerUtils::wirelessInterfaceString(), "AccessPointAdded", this, SLOT(accessPointAdded(QDBusObjectPath))); QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), this->objectPath().path(), NetworkManagerUtils::wirelessInterfaceString(), "AccessPointRemoved", this, SLOT(accessPointRemoved(QDBusObjectPath))); // org.freedesktop.NetworkManager.Device.Wireless.PropertiesChanged(QVariantMap) is used in older versions of NetworkManager instead of the standard D-Bus properties changed signal - QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), this->objectPath().path(), NetworkManagerUtils::wirelessInterfaceString(), "PropertiesChanged", this, SLOT(propertiesChanged(QVariantMap))); + QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), this->objectPath().path(), NetworkManagerUtils::wirelessInterfaceString(), "PropertiesChanged", this, SLOT(processProperties(QVariantMap))); // Newer versions of NetworkManager dropped the other and switched to the D-Bus standard PropertiesChanged - QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), this->objectPath().path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", this, SLOT(propertiesChanged(QString, QVariantMap, QStringList))); + QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), this->objectPath().path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", this, SLOT(onPropertiesChanged(QString, QVariantMap, QStringList))); readAccessPoints(); @@ -222,7 +222,7 @@ void WirelessNetworkDevice::accessPointRemoved(const QDBusObjectPath &objectPath accessPoint->deleteLater(); } -void WirelessNetworkDevice::propertiesChanged(const QVariantMap &properties) +void WirelessNetworkDevice::processProperties(const QVariantMap &properties) { //qCDebug(dcNetworkManager()) << "WirelessNetworkDevice: Property changed" << properties; @@ -249,11 +249,12 @@ void WirelessNetworkDevice::propertiesChanged(const QVariantMap &properties) emit deviceChanged(); } -void WirelessNetworkDevice::propertiesChanged(const QString &interface_name, const QVariantMap &changed_properties, const QStringList &invalidated_properties) +void WirelessNetworkDevice::onPropertiesChanged(const QString &interface, const QVariantMap &changedProperties, const QStringList &invalidatedProperties) { - Q_UNUSED(interface_name) - Q_UNUSED(invalidated_properties) - propertiesChanged(changed_properties); + Q_UNUSED(interface) + Q_UNUSED(invalidatedProperties) + //qCDebug(dcNetworkManager()) << "WirelessNetworkDevice: Properties changed" << interface << changedProperties << invalidatedProperties; + processProperties(changedProperties); } /*! Writes the given \a device to the given to \a debug. \sa WirelessNetworkDevice, */ diff --git a/libnymea-networkmanager/wirelessnetworkdevice.h b/libnymea-networkmanager/wirelessnetworkdevice.h index 2fbec9e..51095fd 100644 --- a/libnymea-networkmanager/wirelessnetworkdevice.h +++ b/libnymea-networkmanager/wirelessnetworkdevice.h @@ -78,8 +78,8 @@ signals: private slots: void accessPointAdded(const QDBusObjectPath &objectPath); void accessPointRemoved(const QDBusObjectPath &objectPath); - void propertiesChanged(const QVariantMap &properties); - void propertiesChanged(const QString &interface_name, const QVariantMap &changed_properties, const QStringList &invalidated_properties); + void processProperties(const QVariantMap &properties); + void onPropertiesChanged(const QString &interface, const QVariantMap &changedProperties, const QStringList &invalidatedProperties); private: QDBusInterface *m_wirelessInterface = nullptr;