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

#include <QStringList>
akiraohgaki's avatar
akiraohgaki committed
#include <QStandardPaths>
akiraohgaki's avatar
akiraohgaki committed

#include "qtlib_dir.h"

ConfigHandler::ConfigHandler(QObject *parent)
    : QObject(parent)
{
    appConfig_ = qtlib::Config(":/configs");
akiraohgaki's avatar
akiraohgaki committed
    importAppConfigApplication();
    importAppConfigInstallTypes();
akiraohgaki's avatar
akiraohgaki committed
    usrConfig_ = qtlib::Config(qtlib::Dir::genericConfigPath() + "/" + getAppConfigApplication()["id"].toString());
}

akiraohgaki's avatar
akiraohgaki committed
QJsonObject ConfigHandler::getAppConfigApplication() const
akiraohgaki's avatar
akiraohgaki committed
{
    return appConfigApplication_;
}

akiraohgaki's avatar
akiraohgaki committed
QJsonObject ConfigHandler::getAppConfigInstallTypes() const
akiraohgaki's avatar
akiraohgaki committed
{
    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
{
    /* object format
    {
        "update_checked_at": 1483658977219
    }
    */
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);
}

QJsonObject ConfigHandler::getUsrConfigUpdateAvailable() const
{
    return usrConfig_.get("update_available");
}

bool ConfigHandler::setUsrConfigUpdateAvailable(const QJsonObject &object) const
{
    return usrConfig_.set("update_available", 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);
}

bool ConfigHandler::setUsrConfigUpdateAvailableFile(const QString &fileKey, const QJsonObject &object) const
{
    /* object format
    {
        "path": "/home/user/.local/bin/example.AppImage",
        "filename": "example.AppImage",
        "installed_item": "http://example.com/downloads/example.AppImage",
        "update_method": "appimageupdate"
    }
    */
    auto updateAvailable = getUsrConfigUpdateAvailable();
    updateAvailable[fileKey] = object;
    return setUsrConfigUpdateAvailable(updateAvailable);
}

bool ConfigHandler::removeUsrConfigUpdateAvailableFile(const QString &fileKey) const
{
    auto updateAvailable = getUsrConfigUpdateAvailable();
    updateAvailable.remove(fileKey);
    return setUsrConfigUpdateAvailable(updateAvailable);
}

akiraohgaki's avatar
akiraohgaki committed
void ConfigHandler::importAppConfigApplication()
{
    appConfigApplication_ = appConfig_.get("application");
}

void ConfigHandler::importAppConfigInstallTypes()
{
    auto installTypes = appConfig_.get("install_types");
    for (const auto &key : installTypes.keys()) {
        auto installtype = installTypes[key].toObject();
        installtype["destination"] = convertPathString(installtype["destination"].toString());
        installtype["generic_destination"] = convertPathString(installtype["generic_destination"].toString());
        installTypes[key] = installtype;
    }
    auto installTypesAlias = appConfig_.get("install_types_alias");
    for (const auto &key : installTypesAlias.keys()) {
        auto installTypeAlias = installTypesAlias[key].toObject();
        auto baseKey = installTypeAlias["base"].toString();
        if (installTypes.contains(baseKey)) {
            auto installType = installTypes[baseKey].toObject();
            installType["base"] = baseKey;
            installType["name"] = installTypeAlias["name"].toString();
            installTypes[key] = installType;
        }
    }
    appConfigInstallTypes_ = installTypes;
}

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());
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (newPath.contains("$XDG_DOCUMENTS_DIR")) {
        newPath.replace("$XDG_DOCUMENTS_DIR", QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation));
    }
    else if (newPath.contains("$XDG_DOWNLOAD_DIR")) {
        newPath.replace("$XDG_DOWNLOAD_DIR", QStandardPaths::writableLocation(QStandardPaths::DownloadLocation));
    }
    else if (newPath.contains("$XDG_PICTURES_DIR")) {
        newPath.replace("$XDG_PICTURES_DIR", QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
    }
    else if (newPath.contains("$XDG_MUSIC_DIR")) {
        newPath.replace("$XDG_MUSIC_DIR", QStandardPaths::writableLocation(QStandardPaths::MusicLocation));
    }
    else if (newPath.contains("$XDG_VIDEOS_DIR")) {
        newPath.replace("$XDG_VIDEOS_DIR", QStandardPaths::writableLocation(QStandardPaths::MoviesLocation));
    }
akiraohgaki's avatar
akiraohgaki committed
    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;
}