From a189ca94610c6b9f61fa7d9d9455fc3463675f45 Mon Sep 17 00:00:00 2001
From: Akira Ohgaki <akiraohgaki@gmail.com>
Date: Sun, 9 Oct 2016 00:51:55 +0900
Subject: [PATCH] Add package class

---
 src/utility/package.cpp | 104 ++++++++++++++++++++++++++++++++++++++++
 src/utility/package.h   |  22 +++++++++
 xdgurl.pro              |   6 ++-
 3 files changed, 130 insertions(+), 2 deletions(-)
 create mode 100644 src/utility/package.cpp
 create mode 100644 src/utility/package.h

diff --git a/src/utility/package.cpp b/src/utility/package.cpp
new file mode 100644
index 0000000..b3c5c75
--- /dev/null
+++ b/src/utility/package.cpp
@@ -0,0 +1,104 @@
+#include <QJsonObject>
+#include <QMimeDatabase>
+#include <QProcess>
+
+#include "package.h"
+
+namespace Utility {
+
+Package::Package(QObject *parent) : QObject(parent)
+{}
+
+bool Package::uncompressArchive(const QString &path, const QString &targetDir)
+{
+    QJsonObject archiveTypes;
+    archiveTypes["application/x-tar"] = QString("tar");
+    archiveTypes["application/x-gzip"] = QString("tar");
+    archiveTypes["application/gzip"] = QString("tar");
+    archiveTypes["application/x-bzip"] = QString("tar");
+    archiveTypes["application/x-bzip2"] = QString("tar");
+    archiveTypes["application/x-xz"] = QString("tar");
+    archiveTypes["application/x-lzma"] = QString("tar");
+    archiveTypes["application/x-lzip"] = QString("tar");
+    archiveTypes["application/x-compressed-tar"] = QString("tar");
+    archiveTypes["application/x-bzip-compressed-tar"] = QString("tar");
+    archiveTypes["application/x-bzip2-compressed-tar"] = QString("tar");
+    archiveTypes["application/x-xz-compressed-tar"] = QString("tar");
+    archiveTypes["application/x-lzma-compressed-tar"] = QString("tar");
+    archiveTypes["application/x-lzip-compressed-tar"] = QString("tar");
+    archiveTypes["application/zip"] = QString("zip");
+    archiveTypes["application/x-7z-compressed"] = QString("7z");
+    archiveTypes["application/x-rar"] = QString("rar");
+    archiveTypes["application/x-rar-compressed"] = QString("rar");
+
+    QMimeDatabase mimeDb;
+    QString mimeType = mimeDb.mimeTypeForFile(path).name();
+
+    if (archiveTypes.contains(mimeType)) {
+        QString archiveType = archiveTypes[mimeType].toString();
+
+        QProcess process;
+        QString program;
+        QStringList arguments;
+
+        if (archiveType == "tar") {
+            program = "tar";
+            arguments << "-xf" << path << "-C" << targetDir;
+        }
+        else if (archiveType == "zip") {
+            program = "unzip";
+            arguments << "-o" << path << "-d" << targetDir;
+        }
+        else if (archiveType == "7z") {
+            program = "7z";
+            arguments << "x" << path << "-o" + targetDir; // No space between -o and directory
+        }
+        else if (archiveType == "rar") {
+            program = "unrar";
+            arguments << "e" << path << targetDir;
+        }
+
+        process.start(program, arguments);
+
+        if (process.waitForFinished()) {
+            process.waitForReadyRead();
+            return true;
+        }
+    }
+
+    return false;
+}
+
+bool Package::installPlasmapkg(const QString &path, const QString &type)
+{
+    QProcess process;
+    QString program = "plasmapkg2"; // Use plasmapkg2 for now
+    QStringList arguments;
+    arguments << "-t" << type << "-i" << path;
+
+    process.start(program, arguments);
+
+    if (process.waitForFinished()) {
+        return true;
+    }
+
+    return false;
+}
+
+bool Package::uninstallPlasmapkg(const QString &path, const QString &type)
+{
+    QProcess process;
+    QString program = "plasmapkg2"; // Use plasmapkg2 for now
+    QStringList arguments;
+    arguments << "-t" << type << "-r" << path;
+
+    process.start(program, arguments);
+
+    if (process.waitForFinished()) {
+        return true;
+    }
+
+    return false;
+}
+
+} // namespace Utility
diff --git a/src/utility/package.h b/src/utility/package.h
new file mode 100644
index 0000000..89bf037
--- /dev/null
+++ b/src/utility/package.h
@@ -0,0 +1,22 @@
+#ifndef UTILITY_PACKAGE_H
+#define UTILITY_PACKAGE_H
+
+#include <QObject>
+
+namespace Utility {
+
+class Package : public QObject
+{
+    Q_OBJECT
+
+public:
+    explicit Package(QObject *parent = 0);
+
+    static bool uncompressArchive(const QString &path, const QString &targetDir);
+    static bool installPlasmapkg(const QString &path, const QString &type = "plasmoid");
+    static bool uninstallPlasmapkg(const QString &path, const QString &type = "plasmoid");
+};
+
+} // namespace Utility
+
+#endif // UTILITY_PACKAGE_H
diff --git a/xdgurl.pro b/xdgurl.pro
index b1f84a7..096220b 100644
--- a/xdgurl.pro
+++ b/xdgurl.pro
@@ -20,14 +20,16 @@ SOURCES += \
     src/core/network.cpp \
     src/handlers/xdgurl.cpp \
     src/utility/file.cpp \
-    src/utility/json.cpp
+    src/utility/json.cpp \
+    src/utility/package.cpp
 
 HEADERS += \
     src/core/config.h \
     src/core/network.h \
     src/handlers/xdgurl.h \
     src/utility/file.h \
-    src/utility/json.h
+    src/utility/json.h \
+    src/utility/package.h
 
 RESOURCES += \
     src/configs.qrc \
-- 
GitLab