Skip to content
Snippets Groups Projects
configstorage.cc 2.85 KiB
Newer Older
#include <QDebug>
#include <QStandardPaths>
#include <QCoreApplication>
#include <QDir>
#include <QJsonParseError>

#include "configstorage.h"

#define CHECK_INTERVAL 300

//-------------------------------------------------------------------------------------------------
ConfigStorage::ConfigStorage()
    : mConfigFileName(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation)
                  + "/" + qApp->applicationName() + "/config.json")
    connect(&mWatchTimer, &QTimer::timeout, this, &ConfigStorage::checkConfigUpdate);
}

//-------------------------------------------------------------------------------------------------
bool ConfigStorage::init()
{
    if (!resetConfigEnv())
    updateConfig();
    mWatchTimer.start(CHECK_INTERVAL);

//-------------------------------------------------------------------------------------------------
void ConfigStorage::checkConfigUpdate()
{
    QDateTime lastModification = QFileInfo(mConfigFileName).lastModified();
    if (!lastModification.isValid()) {
        emit requestAppExit("Configuration file removed");
        return;
    }

    if (QFileInfo(mConfigFileName).lastModified() > mLastUpdate)
        updateConfig();
}

//-------------------------------------------------------------------------------------------------
bool ConfigStorage::resetConfigEnv()
    QDir configDir = QFileInfo(mConfigFileName).absoluteDir();
    if (!configDir.exists() && ! configDir.mkpath(".")) {
        qWarning() << "Failed to create path" << configDir.absolutePath();
        return false;
    }
    QFileInfo config(mConfigFileName);

    // create default configuration file
    if ((!config.exists() || config.size() == 0) && !revertToDefaults()) {
        qWarning() << "Failed to create default configuration";
        return false;
    }

    return true;
//-------------------------------------------------------------------------------------------------
void ConfigStorage::updateConfig()
    mLastUpdate = QDateTime::currentDateTime();

    QFile file(mConfigFileName);
    bool open = file.open(QIODevice::ReadOnly);
    Q_ASSERT(open);

    QJsonParseError err = mParser.setConfig(file.readAll());
    if (err.error != QJsonParseError::NoError) {
        qWarning() << "Invalid Json configuration:" << err.errorString() << ". Keeping old configuration";
        return;
    }

    mApis = mParser.allApiCfgs();
    emit configUpdate();
}
//-------------------------------------------------------------------------------------------------
bool ConfigStorage::revertToDefaults()
{
    QFile defaults(":/config/install/default.json");
    Q_ASSERT(defaults.exists());
    bool open = defaults.open(QIODevice::ReadOnly);
    Q_ASSERT(open);

    QFile config(mConfigFileName);
    if (!config.open(QIODevice::WriteOnly))
        return false;

    config.write(defaults.readAll());
    return true;