File Make-all-bluez-calls-asynchronous.patch of Package plasma-nm4

From 48a45ebad0e1d5ecc023a9e8866a95d47c76790f Mon Sep 17 00:00:00 2001
From: Jan Grulich <jgrulich@redhat.com>
Date: Sun, 25 Oct 2015 17:36:44 +0100
Subject: Make all bluez calls asynchronous

REVIEW:125785
BUG:354230
---
 libs/handler.cpp | 117 +++++++++++++++++++++++++++++--------------------------
 libs/handler.h   |   7 ++--
 2 files changed, 65 insertions(+), 59 deletions(-)

diff --git a/libs/handler.cpp b/libs/handler.cpp
index 901230d..20db520 100644
--- a/libs/handler.cpp
+++ b/libs/handler.cpp
@@ -36,6 +36,7 @@
 
 #include <QInputDialog>
 #include <QDBusError>
+#include <QDBusPendingReply>
 
 #include <KNotification>
 #include <KUser>
@@ -47,9 +48,8 @@
 #include <KWindowSystem>
 #include <KWallet/Wallet>
 
-Handler::Handler(QObject* parent)
+Handler::Handler(QObject *parent)
     : QObject(parent)
-    , m_tmpBluetoothEnabled(isBtEnabled())
     , m_tmpWimaxEnabled(NetworkManager::isWimaxEnabled())
     , m_tmpWirelessEnabled(NetworkManager::isWirelessEnabled())
     , m_tmpWwanEnabled(NetworkManager::isWwanEnabled())
@@ -227,18 +227,15 @@ void Handler::disconnectAll()
 void Handler::enableAirplaneMode(bool enable)
 {
     if (enable) {
-        m_tmpBluetoothEnabled = isBtEnabled();
         m_tmpWimaxEnabled = NetworkManager::isWimaxEnabled();
         m_tmpWirelessEnabled = NetworkManager::isWirelessEnabled();
         m_tmpWwanEnabled = NetworkManager::isWwanEnabled();
-        enableBt(false);
+        enableBluetooth(false);
         enableWimax(false);
         enableWireless(false);
         enableWwan(false);
     } else {
-        if (m_tmpBluetoothEnabled) {
-            enableBt(true);
-        }
+        enableBluetooth(true);
         if (m_tmpWimaxEnabled) {
             enableWimax(true);
         }
@@ -251,6 +248,72 @@ void Handler::enableAirplaneMode(bool enable)
     }
 }
 
+void Handler::enableBluetooth(bool enable)
+{
+    qDBusRegisterMetaType< QMap<QDBusObjectPath, NMVariantMapMap > >();
+
+    QDBusMessage message = QDBusMessage::createMethodCall("org.bluez", "/", "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
+    QDBusPendingReply<QMap<QDBusObjectPath, NMVariantMapMap> > reply = QDBusConnection::systemBus().asyncCall(message);
+    QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply, this);
+    watcher->setProperty("enable", enable);
+    connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(enableBluetooth_finished(QDBusPendingCallWatcher*)));
+}
+
+void Handler::enableBluetooth_finished(QDBusPendingCallWatcher *watcher)
+{
+    bool enable = watcher->property("enable").toBool();
+    QDBusPendingReply<QMap<QDBusObjectPath, NMVariantMapMap> > reply = *watcher;
+    if (reply.isValid()) {
+        foreach(const QDBusObjectPath &path, reply.value().keys()) {
+            const QString objPath = path.path();
+            //qDebug() << "inspecting path" << objPath;
+            const QStringList interfaces = reply.value().value(path).keys();
+            //qDebug() << "interfaces:" << interfaces;
+            if (interfaces.contains("org.bluez.Adapter1")) {
+                // We need to check previous state first
+                if (!enable) {
+                    QDBusMessage message = QDBusMessage::createMethodCall("org.bluez", objPath, "org.freedesktop.DBus.Properties", "Get");
+                    QList<QVariant> arguments;
+                    arguments << "org.bluez.Adapter1";
+                    arguments << "Powered";
+                    message.setArguments(arguments);
+                    QDBusPendingReply<QVariant> getReply = QDBusConnection::systemBus().asyncCall(message);
+                    QDBusPendingCallWatcher *getWatcher = new QDBusPendingCallWatcher(getReply, this);
+                    getWatcher->setProperty("objPath", objPath);
+                    connect(getWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
+                                    this, SLOT(enableBluetooth_finished2(QDBusPendingCallWatcher*)));
+                } else if (enable && m_bluetoothAdapters.value(objPath)) {
+                    QDBusMessage message = QDBusMessage::createMethodCall("org.bluez", objPath, "org.freedesktop.DBus.Properties", "Set");
+                    QList<QVariant> arguments;
+                    arguments << "org.bluez.Adapter1";
+                    arguments << "Powered";
+                    arguments << QVariant::fromValue(QDBusVariant(QVariant(enable)));
+                    message.setArguments(arguments);
+                    QDBusConnection::systemBus().asyncCall(message);
+                }
+            }
+        }
+    }
+    watcher->deleteLater();
+}
+
+void Handler::enableBluetooth_finished2(QDBusPendingCallWatcher *watcher)
+{
+    const QString objPath = watcher->property("objPath").toString();
+    QDBusPendingReply<QVariant> reply = *watcher;
+    if (reply.isValid()) {
+        m_bluetoothAdapters.insert(objPath, reply.value().toBool());
+        QDBusMessage message = QDBusMessage::createMethodCall("org.bluez", objPath, "org.freedesktop.DBus.Properties", "Set");
+        QList<QVariant> arguments;
+        arguments << "org.bluez.Adapter1";
+        arguments << "Powered";
+        arguments << QVariant::fromValue(QDBusVariant(QVariant(false)));
+        message.setArguments(arguments);
+        QDBusConnection::systemBus().asyncCall(message);
+    }
+    watcher->deleteLater();
+}
+
 void Handler::enableNetworking(bool enable)
 {
     NetworkManager::setNetworkingEnabled(enable);
@@ -271,54 +327,6 @@ void Handler::enableWwan(bool enable)
     NetworkManager::setWwanEnabled(enable);
 }
 
-bool Handler::isBtEnabled()
-{
-    qDBusRegisterMetaType< QMap<QDBusObjectPath, NMVariantMapMap > >();
-    bool result = false;
-
-    QDBusInterface managerIface("org.bluez", "/", "org.freedesktop.DBus.ObjectManager", QDBusConnection::systemBus(), this);
-    QDBusReply<QMap<QDBusObjectPath, NMVariantMapMap> > reply = managerIface.call("GetManagedObjects");
-    if (reply.isValid()) {
-        foreach(const QDBusObjectPath &path, reply.value().keys()) {
-            const QString objPath = path.path();
-            //qDebug() << "inspecting path" << objPath;
-            const QStringList interfaces = reply.value().value(path).keys();
-            //qDebug() << "interfaces:" << interfaces;
-            if (interfaces.contains("org.bluez.Adapter1")) {
-                QDBusInterface adapterIface("org.bluez", objPath, "org.bluez.Adapter1", QDBusConnection::systemBus(), this);
-                const bool adapterEnabled = adapterIface.property("Powered").toBool();
-                //qDebug() << "Adapter" << objPath << "enabled:" << adapterEnabled;
-                result |= adapterEnabled;
-            }
-        }
-    } else {
-        qDebug() << "Failed to enumerate BT adapters";
-    }
-
-    return result;
-}
-
-void Handler::enableBt(bool enable)
-{
-    QDBusInterface managerIface("org.bluez", "/", "org.freedesktop.DBus.ObjectManager", QDBusConnection::systemBus(), this);
-    QDBusReply<QMap<QDBusObjectPath, NMVariantMapMap> > reply = managerIface.call("GetManagedObjects");
-    if (reply.isValid()) {
-        foreach(const QDBusObjectPath &path, reply.value().keys()) {
-            const QString objPath = path.path();
-            //qDebug() << "inspecting path" << objPath;
-            const QStringList interfaces = reply.value().value(path).keys();
-            //qDebug() << "interfaces:" << interfaces;
-            if (interfaces.contains("org.bluez.Adapter1")) {
-                QDBusInterface adapterIface("org.bluez", objPath, "org.bluez.Adapter1", QDBusConnection::systemBus(), this);
-                //qDebug() << "Enabling adapter:" << objPath << (enable && m_btEnabled);
-                adapterIface.setProperty("Powered", enable);
-            }
-        }
-    } else {
-        qDebug() << "Failed to enumerate BT adapters";
-    }
-}
-
 void Handler::editConnection(const QString& uuid)
 {
     QStringList args;
diff --git a/libs/handler.h b/libs/handler.h
index ceedab9..28056c6 100644
--- a/libs/handler.h
+++ b/libs/handler.h
@@ -77,7 +77,6 @@ public Q_SLOTS:
      */
     void disconnectAll();
     void enableAirplaneMode(bool enable);
-    void enableBt(bool enable);
     void enableNetworking(bool enable);
     void enableWireless(bool enable);
     void enableWimax(bool enable);
@@ -100,10 +99,11 @@ public Q_SLOTS:
 private Q_SLOTS:
     void editDialogAccepted();
     void initKdedModule();
-    void replyFinished(QDBusPendingCallWatcher * watcher);
+    void replyFinished(QDBusPendingCallWatcher *watcher);
+    void enableBluetooth_finished(QDBusPendingCallWatcher *watcher);
+    void enableBluetooth_finished2(QDBusPendingCallWatcher *watcher);
 
 private:
-    bool m_tmpBluetoothEnabled;
     bool m_tmpWimaxEnabled;
     bool m_tmpWirelessEnabled;
     bool m_tmpWwanEnabled;
@@ -110,8 +110,9 @@ private:
     QString m_tmpConnectionUuid;
     QString m_tmpDevicePath;
     QString m_tmpSpecificPath;
+    QMap<QString, bool> m_bluetoothAdapters;
 
-    bool isBtEnabled();
+    void enableBluetooth(bool enable);
     QDBusInterface m_agentIface;
 };
 
-- 
cgit v0.11.2

openSUSE Build Service is sponsored by