From 9905e8f9bb9c6ea593199becf4ae1ce1d1797324 Mon Sep 17 00:00:00 2001
From: Akira Ohgaki <akiraohgaki@gmail.com>
Date: Tue, 21 Feb 2017 04:10:26 +0900
Subject: [PATCH] Add confighandler class

---
 src/app/app.pri                    |  2 +
 src/app/handlers/confighandler.cpp | 61 ++++++++++++++++++++++++++++++
 src/app/handlers/confighandler.h   | 25 ++++++++++++
 3 files changed, 88 insertions(+)
 create mode 100644 src/app/handlers/confighandler.cpp
 create mode 100644 src/app/handlers/confighandler.h

diff --git a/src/app/app.pri b/src/app/app.pri
index 5ccff3b..15ac50a 100644
--- a/src/app/app.pri
+++ b/src/app/app.pri
@@ -6,10 +6,12 @@ QT += \
     svg
 
 HEADERS += \
+    $${PWD}/handlers/confighandler.h \
     $${PWD}/handlers/ocsurlhandler.h
 
 SOURCES += \
     $${PWD}/main.cpp \
+    $${PWD}/handlers/confighandler.cpp \
     $${PWD}/handlers/ocsurlhandler.cpp
 
 RESOURCES += \
diff --git a/src/app/handlers/confighandler.cpp b/src/app/handlers/confighandler.cpp
new file mode 100644
index 0000000..7d11115
--- /dev/null
+++ b/src/app/handlers/confighandler.cpp
@@ -0,0 +1,61 @@
+#include "confighandler.h"
+
+#include "qtlib_dir.h"
+
+ConfigHandler::ConfigHandler(QObject *parent)
+    : QObject(parent)
+{
+    appConfig_ = qtlib::Config(":/configs");
+}
+
+QJsonObject ConfigHandler::getAppConfigApplication()
+{
+    if (appConfigApplication_.isEmpty()) {
+        appConfigApplication_ = appConfig_.get("application");
+    }
+    return appConfigApplication_;
+}
+
+QJsonObject ConfigHandler::getAppConfigInstallTypes()
+{
+    if (appConfigInstallTypes_.isEmpty()) {
+        QJsonObject installTypes = appConfig_.get("install_types");
+        foreach (const QString &key, installTypes.keys()) {
+            QJsonObject installtype = installTypes[key].toObject();
+            installtype["destination"] = convertPathString(installtype["destination"].toString());
+            installtype["generic_destination"] = convertPathString(installtype["generic_destination"].toString());
+            installTypes[key] = installtype;
+        }
+        QJsonObject installTypesAlias = appConfig_.get("install_types_alias");
+        foreach (const QString &key, installTypesAlias.keys()) {
+            QJsonObject installTypeAlias = installTypesAlias[key].toObject();
+            QString baseKey = installTypeAlias["base"].toString();
+            if (installTypes.contains(baseKey)) {
+                QJsonObject installType = installTypes[baseKey].toObject();
+                installType["base"] = baseKey;
+                installType["name"] = installTypeAlias["name"].toString();
+                installTypes[key] = installType;
+            }
+        }
+        appConfigInstallTypes_ = installTypes;
+    }
+    return appConfigInstallTypes_;
+}
+
+QString ConfigHandler::convertPathString(const QString &path)
+{
+    QString newPath = path;
+    if (newPath.contains("$HOME")) {
+        newPath.replace("$HOME", qtlib::Dir::homePath());
+    }
+    else if (newPath.contains("$XDG_DATA_HOME")) {
+        newPath.replace("$XDG_DATA_HOME", qtlib::Dir::genericDataPath());
+    }
+    else if (newPath.contains("$KDEHOME")) {
+        newPath.replace("$KDEHOME", qtlib::Dir::kdehomePath());
+    }
+    else if (newPath.contains("$APP_DATA")) {
+        newPath.replace("$APP_DATA", qtlib::Dir::genericDataPath() + "/" + getAppConfigApplication()["id"].toString());
+    }
+    return newPath;
+}
diff --git a/src/app/handlers/confighandler.h b/src/app/handlers/confighandler.h
new file mode 100644
index 0000000..247afc8
--- /dev/null
+++ b/src/app/handlers/confighandler.h
@@ -0,0 +1,25 @@
+#pragma once
+
+#include <QObject>
+#include <QJsonObject>
+
+#include "qtlib_config.h"
+
+class ConfigHandler : public QObject
+{
+    Q_OBJECT
+
+public:
+    explicit ConfigHandler(QObject *parent = 0);
+
+public slots:
+    QJsonObject getAppConfigApplication();
+    QJsonObject getAppConfigInstallTypes();
+
+private:
+    QString convertPathString(const QString &path);
+
+    qtlib::Config appConfig_;
+    QJsonObject appConfigApplication_;
+    QJsonObject appConfigInstallTypes_;
+};
-- 
GitLab