From 32257c8fab83cab89811111284cdca8bf5e9dbac Mon Sep 17 00:00:00 2001
From: xiphon <xiphon@protonmail.com>
Date: Fri, 27 Sep 2019 10:56:42 +0000
Subject: [PATCH] DaemonManager: implement async sendCommand

---
 components/DaemonConsole.qml   |  6 +++++-
 pages/settings/SettingsLog.qml |  6 +++++-
 src/daemon/DaemonManager.cpp   | 23 ++++++++++++-----------
 src/daemon/DaemonManager.h     |  4 ++--
 4 files changed, 24 insertions(+), 15 deletions(-)

diff --git a/components/DaemonConsole.qml b/components/DaemonConsole.qml
index 0138473b..20e14fe4 100644
--- a/components/DaemonConsole.qml
+++ b/components/DaemonConsole.qml
@@ -178,7 +178,11 @@ Window {
                 onAccepted: {
                     if(text.length > 0) {
                         textArea.logCommand(">>> " + text)
-                        daemonManager.sendCommand(text, currentWallet.nettype);
+                        daemonManager.sendCommandAsync(text.split(" "), currentWallet.nettype, function(result) {
+                            if (!result) {
+                                appWindow.showStatusMessage(qsTr("Failed to send command"), 3);
+                            }
+                        });
                     }
                     text = ""
                 }
diff --git a/pages/settings/SettingsLog.qml b/pages/settings/SettingsLog.qml
index eccd79b6..05101376 100644
--- a/pages/settings/SettingsLog.qml
+++ b/pages/settings/SettingsLog.qml
@@ -216,7 +216,11 @@ Rectangle {
             onAccepted: {
                 if(text.length > 0) {
                     consoleArea.logCommand(">>> " + text)
-                    daemonManager.sendCommand(text, currentWallet.nettype);
+                    daemonManager.sendCommandAsync(text.split(" "), currentWallet.nettype, function(result) {
+                        if (!result) {
+                            appWindow.showStatusMessage(qsTr("Failed to send command"), 3);
+                        }
+                    });
                 }
                 text = ""
             }
diff --git a/src/daemon/DaemonManager.cpp b/src/daemon/DaemonManager.cpp
index 0d311535..baabffb4 100644
--- a/src/daemon/DaemonManager.cpp
+++ b/src/daemon/DaemonManager.cpp
@@ -150,7 +150,7 @@ bool DaemonManager::start(const QString &flags, NetworkType::Type nettype, const
 bool DaemonManager::stop(NetworkType::Type nettype)
 {
     QString message;
-    sendCommand("exit", nettype, message);
+    sendCommand({"exit"}, nettype, message);
     qDebug() << message;
 
     // Start stop watcher - Will kill if not shutting down
@@ -240,7 +240,7 @@ void DaemonManager::printError()
 bool DaemonManager::running(NetworkType::Type nettype) const
 { 
     QString status;
-    sendCommand("sync_info", nettype, status);
+    sendCommand({"sync_info"}, nettype, status);
     qDebug() << status;
     return status.contains("Height:");
 }
@@ -257,17 +257,10 @@ void DaemonManager::runningAsync(NetworkType::Type nettype, const QJSValue& call
     }, callback);
 }
 
-bool DaemonManager::sendCommand(const QString &cmd, NetworkType::Type nettype) const
-{
-    QString message;
-    return sendCommand(cmd, nettype, message);
-}
-
-bool DaemonManager::sendCommand(const QString &cmd, NetworkType::Type nettype, QString &message) const
+bool DaemonManager::sendCommand(const QStringList &cmd, NetworkType::Type nettype, QString &message) const
 {
     QProcess p;
-    QStringList external_cmd;
-    external_cmd << cmd;
+    QStringList external_cmd(cmd);
 
     // Add network type flag if needed
     if (nettype == NetworkType::TESTNET)
@@ -286,6 +279,14 @@ bool DaemonManager::sendCommand(const QString &cmd, NetworkType::Type nettype, Q
     return started;
 }
 
+void DaemonManager::sendCommandAsync(const QStringList &cmd, NetworkType::Type nettype, const QJSValue& callback) const
+{
+    m_scheduler.run([this, cmd, nettype] {
+        QString message;
+        return QJSValueList({sendCommand(cmd, nettype, message)});
+    }, callback);
+}
+
 void DaemonManager::exit()
 {
     qDebug("DaemonManager: exit()");
diff --git a/src/daemon/DaemonManager.h b/src/daemon/DaemonManager.h
index 0df97c63..a03d3d9b 100644
--- a/src/daemon/DaemonManager.h
+++ b/src/daemon/DaemonManager.h
@@ -51,14 +51,14 @@ public:
     // return true if daemon process is started
     Q_INVOKABLE void runningAsync(NetworkType::Type nettype, const QJSValue& callback) const;
     // Send daemon command from qml and prints output in console window.
-    Q_INVOKABLE bool sendCommand(const QString &cmd, NetworkType::Type nettype) const;
+    Q_INVOKABLE void sendCommandAsync(const QStringList &cmd, NetworkType::Type nettype, const QJSValue& callback) const;
     Q_INVOKABLE void exit();
     Q_INVOKABLE QVariantMap validateDataDir(const QString &dataDir) const;
 
 private:
 
     bool running(NetworkType::Type nettype) const;
-    bool sendCommand(const QString &cmd, NetworkType::Type nettype, QString &message) const;
+    bool sendCommand(const QStringList &cmd, NetworkType::Type nettype, QString &message) const;
     bool startWatcher(NetworkType::Type nettype) const;
     bool stopWatcher(NetworkType::Type nettype) const;
 signals: