From 069ae9f0da6401520380a42884adf8b769d16412 Mon Sep 17 00:00:00 2001
From: Akira Ohgaki <akiraohgaki@gmail.com>
Date: Tue, 21 Nov 2017 07:22:29 +0900
Subject: [PATCH] updateAppImage

---
 app/src/handlers/appimagehandler.cpp   | 22 ++++++++++++++++++----
 app/src/handlers/appimagehandler.h     |  7 ++++++-
 app/src/websockets/websocketserver.cpp | 26 ++++++++++++++++++++++++++
 app/src/websockets/websocketserver.h   |  4 ++++
 4 files changed, 54 insertions(+), 5 deletions(-)

diff --git a/app/src/handlers/appimagehandler.cpp b/app/src/handlers/appimagehandler.cpp
index 3f3fa70..7ca9fc2 100644
--- a/app/src/handlers/appimagehandler.cpp
+++ b/app/src/handlers/appimagehandler.cpp
@@ -1,6 +1,9 @@
 #include "appimagehandler.h"
 
 #ifdef QTLIB_UNIX
+#include <thread>
+#include <chrono>
+
 #include "appimage/update.h"
 #endif
 
@@ -39,12 +42,23 @@ bool AppImageHandler::isUpdateAvailable(const QString &path) const
 }
 
 #ifdef QTLIB_UNIX
-bool AppImageHandler::updateAppImage(const QString &path) const
+bool AppImageHandler::updateAppImage(const QString &path)
 {
     appimage::update::Updater appImageUpdater(path.toStdString(), false);
-    /*if (appImageUpdater.start()) {
-        // TODO: make signals&slots bindings later
-    }*/
+    if (appImageUpdater.start()) {
+        emit updateStarted(path);
+        while (!appImageUpdater.isDone()) {
+            std::this_thread::sleep_for(std::chrono::milliseconds(100));
+            double progress;
+            if (appImageUpdater.progress(progress)) {
+                emit updateProgress(path, progress * 100);
+            }
+        }
+        emit updateFinished(path);
+        if (!appImageUpdater.hasError()) {
+            return true;
+        }
+    }
 
     return false;
 }
diff --git a/app/src/handlers/appimagehandler.h b/app/src/handlers/appimagehandler.h
index 9b23165..2cdc860 100644
--- a/app/src/handlers/appimagehandler.h
+++ b/app/src/handlers/appimagehandler.h
@@ -11,12 +11,17 @@ class AppImageHandler : public QObject
 public:
     explicit AppImageHandler(ConfigHandler *configHandler, QObject *parent = nullptr);
 
+signals:
+    void updateStarted(QString path);
+    void updateFinished(QString path);
+    void updateProgress(QString path, int progress);
+
 public slots:
     QString describeAppImage(const QString &path) const;
     bool isUpdateAvailable(const QString &path) const;
 
 #ifdef QTLIB_UNIX
-    bool updateAppImage(const QString &path) const;
+    bool updateAppImage(const QString &path);
 #endif
 
 private:
diff --git a/app/src/websockets/websocketserver.cpp b/app/src/websockets/websocketserver.cpp
index 5079900..649b8a8 100644
--- a/app/src/websockets/websocketserver.cpp
+++ b/app/src/websockets/websocketserver.cpp
@@ -38,6 +38,10 @@ WebSocketServer::WebSocketServer(ConfigHandler *configHandler, const QString &se
     connect(itemHandler_, &ItemHandler::installFinished, this, &WebSocketServer::itemInstallFinished);
     connect(itemHandler_, &ItemHandler::uninstallStarted, this, &WebSocketServer::itemUninstallStarted);
     connect(itemHandler_, &ItemHandler::uninstallFinished, this, &WebSocketServer::itemUninstallFinished);
+
+    connect(appImageHandler_, &AppImageHandler::updateStarted, this, &WebSocketServer::appImageUpdateStarted);
+    connect(appImageHandler_, &AppImageHandler::updateFinished, this, &WebSocketServer::appImageUpdateFinished);
+    connect(appImageHandler_, &AppImageHandler::updateProgress, this, &WebSocketServer::appImageUpdateProgress);
 }
 
 WebSocketServer::~WebSocketServer()
@@ -193,6 +197,28 @@ void WebSocketServer::itemUninstallFinished(QJsonObject result)
     sendMessage("", "ItemHandler::uninstallFinished", data);
 }
 
+void WebSocketServer::appImageUpdateStarted(QString path)
+{
+    QJsonArray data;
+    data.append(path);
+    sendMessage("", "AppImageHandler::updateStarted", data);
+}
+
+void WebSocketServer::appImageUpdateFinished(QString path)
+{
+    QJsonArray data;
+    data.append(path);
+    sendMessage("", "AppImageHandler::updateFinished", data);
+}
+
+void WebSocketServer::appImageUpdateProgress(QString path, int progress)
+{
+    QJsonArray data;
+    data.append(path);
+    data.append(progress);
+    sendMessage("", "AppImageHandler::updateProgress", data);
+}
+
 void WebSocketServer::receiveMessage(const QString &id, const QString &func, const QJsonArray &data)
 {
     /* message object format
diff --git a/app/src/websockets/websocketserver.h b/app/src/websockets/websocketserver.h
index 595fb42..0e4659b 100644
--- a/app/src/websockets/websocketserver.h
+++ b/app/src/websockets/websocketserver.h
@@ -51,6 +51,10 @@ private slots:
     void itemUninstallStarted(QJsonObject result);
     void itemUninstallFinished(QJsonObject result);
 
+    void appImageUpdateStarted(QString path);
+    void appImageUpdateFinished(QString path);
+    void appImageUpdateProgress(QString path, int progress);
+
 private:
     void receiveMessage(const QString &id, const QString &func, const QJsonArray &data);
     void sendMessage(const QString &id, const QString &func, const QJsonArray &data);
-- 
GitLab