Skip to content
Snippets Groups Projects
confighandler.cpp 8.28 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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);
    }
    
    
    akiraohgaki's avatar
    akiraohgaki committed
    QJsonObject ConfigHandler::getUsrConfigUpdateAvailableItems() const
    
    akiraohgaki's avatar
    akiraohgaki committed
        return usrConfig_.get("update_available_items");
    
    akiraohgaki's avatar
    akiraohgaki committed
    bool ConfigHandler::setUsrConfigUpdateAvailableItems(const QJsonObject &object) const
    
    akiraohgaki's avatar
    akiraohgaki committed
        return usrConfig_.set("update_available_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
    bool ConfigHandler::setUsrConfigUpdateAvailableItemsItem(const QString &itemKey, const QJsonObject &object) const
    
    {
        /* object format
        {
            "installed_item": "http://example.com/downloads/example.AppImage",
            "update_method": "appimageupdate"
        }
        */
    
    akiraohgaki's avatar
    akiraohgaki committed
        auto updateAvailableItems = getUsrConfigUpdateAvailableItems();
        updateAvailableItems[itemKey] = object;
        return setUsrConfigUpdateAvailableItems(updateAvailableItems);
    
    akiraohgaki's avatar
    akiraohgaki committed
    bool ConfigHandler::removeUsrConfigUpdateAvailableItemsItem(const QString &itemKey) const
    
    akiraohgaki's avatar
    akiraohgaki committed
        auto updateAvailableItems = getUsrConfigUpdateAvailableItems();
        updateAvailableItems.remove(itemKey);
        return setUsrConfigUpdateAvailableItems(updateAvailableItems);
    
    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;
    }