Skip to content
Snippets Groups Projects
confighandler.cpp 6.34 KiB
Newer Older
akiraohgaki's avatar
akiraohgaki committed
#include "confighandler.h"

#include <QStringList>

#include "qtlib_dir.h"

ConfigHandler::ConfigHandler(QObject *parent)
    : QObject(parent)
{
    appConfig_ = qtlib::Config(":/configs");
    usrConfig_ = qtlib::Config(qtlib::Dir::genericConfigPath() + "/" + getAppConfigApplication()["id"].toString());
}

QJsonObject ConfigHandler::getAppConfigApplication()
{
    if (appConfigApplication_.isEmpty()) {
        appConfigApplication_ = appConfig_.get("application");
    }
    return appConfigApplication_;
}

QJsonObject ConfigHandler::getAppConfigInstallTypes()
{
    if (appConfigInstallTypes_.isEmpty()) {
akiraohgaki's avatar
akiraohgaki committed
        auto installTypes = appConfig_.get("install_types");
        for (const auto &key : installTypes.keys()) {
            auto installtype = installTypes[key].toObject();
akiraohgaki's avatar
akiraohgaki committed
            installtype["destination"] = convertPathString(installtype["destination"].toString());
            installtype["generic_destination"] = convertPathString(installtype["generic_destination"].toString());
            installTypes[key] = installtype;
        }
akiraohgaki's avatar
akiraohgaki committed
        auto installTypesAlias = appConfig_.get("install_types_alias");
        for (const auto &key : installTypesAlias.keys()) {
            auto installTypeAlias = installTypesAlias[key].toObject();
            auto baseKey = installTypeAlias["base"].toString();
akiraohgaki's avatar
akiraohgaki committed
            if (installTypes.contains(baseKey)) {
akiraohgaki's avatar
akiraohgaki committed
                auto installType = installTypes[baseKey].toObject();
akiraohgaki's avatar
akiraohgaki committed
                installType["base"] = baseKey;
                installType["name"] = installTypeAlias["name"].toString();
                installTypes[key] = installType;
            }
        }
        appConfigInstallTypes_ = installTypes;
    }
    return appConfigInstallTypes_;
}

akiraohgaki's avatar
akiraohgaki committed
QJsonObject ConfigHandler::getUsrConfigApplication() const
akiraohgaki's avatar
akiraohgaki committed
{
    return usrConfig_.get("application");
}

akiraohgaki's avatar
akiraohgaki committed
bool ConfigHandler::setUsrConfigApplication(const QJsonObject &object) const
akiraohgaki's avatar
akiraohgaki committed
{
    return usrConfig_.set("application", object);
}

akiraohgaki's avatar
akiraohgaki committed
QJsonObject ConfigHandler::getUsrConfigProviders() const
akiraohgaki's avatar
akiraohgaki committed
{
    return usrConfig_.get("providers");
}

akiraohgaki's avatar
akiraohgaki committed
bool ConfigHandler::setUsrConfigProviders(const QJsonObject &object) const
akiraohgaki's avatar
akiraohgaki committed
{
    return usrConfig_.set("providers", object);
}

akiraohgaki's avatar
akiraohgaki committed
QJsonObject ConfigHandler::getUsrConfigCategories() const
akiraohgaki's avatar
akiraohgaki committed
{
    return usrConfig_.get("categories");
}

akiraohgaki's avatar
akiraohgaki committed
bool ConfigHandler::setUsrConfigCategories(const QJsonObject &object) const
akiraohgaki's avatar
akiraohgaki committed
{
    return usrConfig_.set("categories", object);
}

akiraohgaki's avatar
akiraohgaki committed
QJsonObject ConfigHandler::getUsrConfigInstalledItems() const
akiraohgaki's avatar
akiraohgaki committed
{
    return usrConfig_.get("installed_items");
}

akiraohgaki's avatar
akiraohgaki committed
bool ConfigHandler::setUsrConfigInstalledItems(const QJsonObject &object) const
akiraohgaki's avatar
akiraohgaki committed
{
    return usrConfig_.set("installed_items", object);
}

akiraohgaki's avatar
akiraohgaki committed
bool ConfigHandler::setUsrConfigProvidersProvider(const QString &providerKey, const QJsonObject &object) const
akiraohgaki's avatar
akiraohgaki committed
{
    /* object format
    {
        "id": "example",
        "location": "https://example.com/ocs/v1/",
        "name": "Example",
        "icon": "https://example.com/icon.png",
        "termsofuse": "https://example.com/termsofuse",
        "register": "https://example.com/register",
        "_providerfile": "https://example.com/ocs/providers.xml"
    }
    */
akiraohgaki's avatar
akiraohgaki committed
    auto providers = getUsrConfigProviders();
akiraohgaki's avatar
akiraohgaki committed
    providers[providerKey] = object;
    return setUsrConfigProviders(providers);
}

akiraohgaki's avatar
akiraohgaki committed
bool ConfigHandler::removeUsrConfigProvidersProvider(const QString &providerKey) const
akiraohgaki's avatar
akiraohgaki committed
{
akiraohgaki's avatar
akiraohgaki committed
    auto providers = getUsrConfigProviders();
akiraohgaki's avatar
akiraohgaki committed
    providers.remove(providerKey);
    return setUsrConfigProviders(providers);
}

akiraohgaki's avatar
akiraohgaki committed
bool ConfigHandler::setUsrConfigCategoriesProvider(const QString &providerKey, const QJsonObject &object) const
akiraohgaki's avatar
akiraohgaki committed
{
    /* object format
    {
        "1": {
            "id": "1",
            "name": "Desktop Icons",
            "install_type": "icons"
        },
        "2": {
            "id": "2",
            "name": "Desktop Themes",
            "install_type": "themes"
        }
    }
    */
akiraohgaki's avatar
akiraohgaki committed
    auto categories = getUsrConfigCategories();
akiraohgaki's avatar
akiraohgaki committed
    categories[providerKey] = object;
    return setUsrConfigCategories(categories);
}

akiraohgaki's avatar
akiraohgaki committed
bool ConfigHandler::removeUsrConfigCategoriesProvider(const QString &providerKey) const
akiraohgaki's avatar
akiraohgaki committed
{
akiraohgaki's avatar
akiraohgaki committed
    auto categories = getUsrConfigCategories();
akiraohgaki's avatar
akiraohgaki committed
    categories.remove(providerKey);
    return setUsrConfigCategories(categories);
}

akiraohgaki's avatar
akiraohgaki committed
bool ConfigHandler::setUsrConfigCategoriesInstallType(const QString &providerKey, const QString &categoryKey, const QString &installType) const
akiraohgaki's avatar
akiraohgaki committed
{
akiraohgaki's avatar
akiraohgaki committed
    auto categories = getUsrConfigCategories();
akiraohgaki's avatar
akiraohgaki committed
    QJsonObject providerCategories;
    if (categories.contains(providerKey)) {
        providerCategories = categories[providerKey].toObject();
    }
    QJsonObject providerCategory;
    if (providerCategories.contains(categoryKey)) {
        providerCategory = providerCategories[categoryKey].toObject();
    }
    providerCategory["install_type"] = installType;
    providerCategories[categoryKey] = providerCategory;
    categories[providerKey] = providerCategories;
    return setUsrConfigCategories(categories);
}

akiraohgaki's avatar
akiraohgaki committed
bool ConfigHandler::setUsrConfigInstalledItemsItem(const QString &itemKey, const QJsonObject &object) const
akiraohgaki's avatar
akiraohgaki committed
{
    /* object format
    {
        "url": "http://example.com/downloads/123-1.tar.gz",
        "filename": "123-1.tar.gz",
        "install_type": "icons",
        "provider": "http://example.com/ocs/v1/",
        "content_id": "123",
        "files": [
            "iconset-light",
            "iconset-dark"
        ],
        "installed_at": 1483658977219
    }
    */
akiraohgaki's avatar
akiraohgaki committed
    auto installedItems = getUsrConfigInstalledItems();
akiraohgaki's avatar
akiraohgaki committed
    installedItems[itemKey] = object;
    return setUsrConfigInstalledItems(installedItems);
}

akiraohgaki's avatar
akiraohgaki committed
bool ConfigHandler::removeUsrConfigInstalledItemsItem(const QString &itemKey) const
akiraohgaki's avatar
akiraohgaki committed
{
akiraohgaki's avatar
akiraohgaki committed
    auto installedItems = getUsrConfigInstalledItems();
akiraohgaki's avatar
akiraohgaki committed
    installedItems.remove(itemKey);
    return setUsrConfigInstalledItems(installedItems);
}

akiraohgaki's avatar
akiraohgaki committed
QString ConfigHandler::convertPathString(const QString &path) const
akiraohgaki's avatar
akiraohgaki committed
{
akiraohgaki's avatar
akiraohgaki committed
    auto newPath = path;
akiraohgaki's avatar
akiraohgaki committed
    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;
}