File 0001-Fix-PackageKit-not-emitting-network-state-changed-signal.patch of Package PackageKit-Qt.9930

From 9652f94119523ab1125b3be435c367913e18869b Mon Sep 17 00:00:00 2001
From: Antonio Larrosa <alarrosa@suse.com>
Date: Mon, 18 Mar 2019 16:00:39 +0100
Subject: [PATCH] Fix PackageKit not emitting network state changed signal when
 stopped

PackageKit can be configured to shutdown automatically after x seconds
of inactivity. If a computer doesn't have a network connection and PackageKit
is shut down (for example because a laptop user takes too long to enter the
 wifi password) then PackageKit never emits the properties changed signal
(it can't since it's not running) so PackageKit-Qt never emits the
networkStateChanged signal and applications like the plasma pk update applet
never updates its status.

With this commit, a NetworkManagerMonitor class is added that connects
directly to the NetworkManager's StateChanged signal and emits a
networkStateChanged signal, so we can react to a network state change
even when PackageKit is stopped. In this case, we update all properties,
which triggers PK to run and emits the appropiate PK signals as
expected.

Rebased for PackageKit-Qt 0.9.6

---
 src/CMakeLists.txt            |  1 +
 src/daemon.h                  |  1 +
 src/daemonprivate.cpp         | 14 ++++++++
 src/daemonprivate.h           |  3 ++
 src/networkmanagermonitor.cpp | 66 +++++++++++++++++++++++++++++++++++
 src/networkmanagermonitor.h   | 55 +++++++++++++++++++++++++++++
 6 files changed, 140 insertions(+)
 create mode 100644 src/networkmanagermonitor.cpp
 create mode 100644 src/networkmanagermonitor.h

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 096ebd7..c559dc3 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -21,6 +21,7 @@ set(packagekitqt_SRC
     transaction.cpp
     transactionprivate.cpp
     details.cpp
+    networkmanagermonitor.cpp
 )
 
 find_path(PK_INTERFACES_DIR org.freedesktop.PackageKit.xml
diff --git a/src/daemon.h b/src/daemon.h
index 449cf17..51a818f 100644
--- a/src/daemon.h
+++ b/src/daemon.h
@@ -840,6 +840,7 @@ private:
     Q_PRIVATE_SLOT(d_func(), void serviceOwnerChanged(QString,QString,QString))
     Q_PRIVATE_SLOT(d_func(), void propertiesChanged(QString,QVariantMap,QStringList))
     Q_PRIVATE_SLOT(d_func(), void updateProperties(QVariantMap))
+    Q_PRIVATE_SLOT(d_func(), void getAllPropertiesIfPackageKitNotRunning())
     Daemon(QObject *parent = 0);
     static Daemon *m_global;
 };
diff --git a/src/daemonprivate.cpp b/src/daemonprivate.cpp
index e423916..04cdc60 100644
--- a/src/daemonprivate.cpp
+++ b/src/daemonprivate.cpp
@@ -43,6 +43,14 @@ DaemonPrivate::DaemonPrivate(Daemon* par
 
     // On PK 0.9 this will always be async
     getAllProperties(false);
+
+    // If PackageKit is not running, we are not getting a signal when
+    // properties are updated (like when the network changes its state)
+    // so we connect to the NetworkManager dbus signal directly and then
+    // get all properties again to force packagekit to run and
+    // update the properties so we can emit the appropiate signals.
+    q_ptr->connect(&networkManagerMonitor, SIGNAL(networkStateChanged(uint)),
+                   SLOT(getAllPropertiesIfPackageKitNotRunning()));
 }
 
 void DaemonPrivate::serviceOwnerChanged(const QString &service, const QString &oldOwner, const QString &newOwner)
@@ -73,6 +81,16 @@ void DaemonPrivate::serviceOwnerChanged(
     }
 }
 
+void DaemonPrivate::getAllPropertiesIfPackageKitNotRunning()
+{
+    // If PackageKit is not running, we are not getting a signal when
+    // properties are updated (like when the network changes its state)
+    // so we get all properties again to force packagekit to run and
+    // update the properties so we can emit the appropiate signals
+    if (!running)
+        getAllProperties(false);
+}
+
 void DaemonPrivate::getAllProperties(bool sync)
 {
     Q_Q(Daemon);
diff --git a/src/daemonprivate.h b/src/daemonprivate.h
index 9bf794c..6ddd1b0 100644
--- a/src/daemonprivate.h
+++ b/src/daemonprivate.h
@@ -26,6 +26,7 @@
 #include <QtDBus/QDBusServiceWatcher>
 
 #include "daemon.h"
+#include "networkmanagermonitor.h"
 
 class OrgFreedesktopPackageKitInterface;
 
@@ -61,11 +62,13 @@ protected:
     uint versionMinor = 0;
 
     bool running = false;
+    NetworkManagerMonitor networkManagerMonitor;
 
 protected Q_SLOTS:
     void serviceOwnerChanged(const QString &service, const QString &oldOwner, const QString &newOwner);
     void propertiesChanged(const QString &interface, const QVariantMap &properties, const QStringList &invalidatedProperties);
     void updateProperties(const QVariantMap &properties);
+    void getAllPropertiesIfPackageKitNotRunning();
 
 private:
     QDBusServiceWatcher *m_watcher;
diff --git a/src/networkmanagermonitor.cpp b/src/networkmanagermonitor.cpp
new file mode 100644
index 0000000..05ddb87
--- /dev/null
+++ b/src/networkmanagermonitor.cpp
@@ -0,0 +1,66 @@
+/*
+ * This file is part of the QPackageKit project
+ * Copyright (C) 2019 Daniel Nicoletti <dantti12@gmail.com>
+ * Copyright (C) 2019 Antonio Larrosa <alarrosa@suse.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "networkmanagermonitor.h"
+
+#include <QDBusConnection>
+#include <QDBusMessage>
+#include <QList>
+#include <QVariant>
+#include <QString>
+
+static QString NM_DBUS_SERVICE   = QStringLiteral("org.freedesktop.NetworkManager");
+static QString NM_DBUS_PATH      = QStringLiteral("/org/freedesktop/NetworkManager");
+static QString NM_DBUS_INTERFACE = QStringLiteral("org.freedesktop.NetworkManager");
+
+using namespace PackageKit;
+
+NetworkManagerMonitor::NetworkManagerMonitor(QObject *parent)
+    : QObject(parent)
+{
+    QDBusConnection::systemBus().connect(NM_DBUS_SERVICE,
+                              NM_DBUS_PATH,
+                              NM_DBUS_INTERFACE,
+                              QLatin1String("StateChanged"),
+                              this, SIGNAL(networkStateChanged(uint)));
+}
+
+NetworkManagerMonitor::~NetworkManagerMonitor()
+{
+    QDBusConnection::systemBus().disconnect(NM_DBUS_SERVICE,
+                              NM_DBUS_PATH,
+                              NM_DBUS_INTERFACE,
+                              QLatin1String("StateChanged"),
+                              this, SIGNAL(networkStateChanged(uint)));
+}
+
+NetworkManagerMonitor::NMState NetworkManagerMonitor::state()
+{
+    QDBusMessage message = QDBusMessage::createMethodCall(NM_DBUS_SERVICE,
+                                             NM_DBUS_PATH,
+                                             NM_DBUS_INTERFACE,
+                                             QLatin1String("state"));
+
+    QDBusMessage reply = QDBusConnection::systemBus().call(message);
+    if (reply.arguments().isEmpty()) return NM_STATE_UNKNOWN;
+
+    return static_cast<NMState>(reply.arguments()[0].toUInt());
+}
diff --git a/src/networkmanagermonitor.h b/src/networkmanagermonitor.h
new file mode 100644
index 0000000..16eb25c
--- /dev/null
+++ b/src/networkmanagermonitor.h
@@ -0,0 +1,55 @@
+/*
+ * This file is part of the QPackageKit project
+ * Copyright (C) 2019 Daniel Nicoletti <dantti12@gmail.com>
+ * Copyright (C) 2019 Antonio Larrosa <alarrosa@suse.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef NETWORKMANAGERMONITOR_H
+#define NETWORKMANAGERMONITOR_H
+
+#include <QObject>
+
+namespace PackageKit {
+
+class NetworkManagerMonitor : public QObject
+{
+    Q_OBJECT
+public:
+    enum NMState {
+        NM_STATE_UNKNOWN = 0,
+        NM_STATE_ASLEEP = 10,
+        NM_STATE_DISCONNECTED = 20,
+        NM_STATE_DISCONNECTING = 30,
+        NM_STATE_CONNECTING = 40,
+        NM_STATE_CONNECTED_LOCAL = 50,
+        NM_STATE_CONNECTED_SITE = 60,
+        NM_STATE_CONNECTED_GLOBAL = 70
+    };
+
+    NetworkManagerMonitor(QObject *parent = nullptr);
+    ~NetworkManagerMonitor();
+
+    NMState state();
+
+Q_SIGNALS:
+    void networkStateChanged(uint state);
+};
+
+};
+
+#endif
-- 
2.21.0

openSUSE Build Service is sponsored by