Skip to content
Snippets Groups Projects
updatehandler.cpp 5.65 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include "updatehandler.h"
    
    akiraohgaki's avatar
    akiraohgaki committed
    #include <QStringList>
    #include <QJsonValue>
    #include <QJsonArray>
    #include <QDateTime>
    
    akiraohgaki's avatar
    akiraohgaki committed
    #include "qtlib_file.h"
    
    
    akiraohgaki's avatar
    akiraohgaki committed
    #include "handlers/confighandler.h"
    
    
    akiraohgaki's avatar
    akiraohgaki committed
    #ifdef QTLIB_UNIX
    #include "updaters/appimageupdater.h"
    #endif
    
    
    UpdateHandler::UpdateHandler(ConfigHandler *configHandler, QObject *parent)
    
    akiraohgaki's avatar
    akiraohgaki committed
        : QObject(parent), configHandler_(configHandler)
    {}
    
    
    akiraohgaki's avatar
    akiraohgaki committed
    void UpdateHandler::checkAll()
    
    akiraohgaki's avatar
    akiraohgaki committed
    {
    
    akiraohgaki's avatar
    akiraohgaki committed
        // Resets data
    
    akiraohgaki's avatar
    akiraohgaki committed
        QJsonObject updateAvailableItems;
    
    akiraohgaki's avatar
    akiraohgaki committed
        configHandler_->setUsrConfigUpdateAvailableItems(updateAvailableItems);
    
    akiraohgaki's avatar
    akiraohgaki committed
    
    
    akiraohgaki's avatar
    akiraohgaki committed
        auto installedItems = configHandler_->getUsrConfigInstalledItems();
    
    
    akiraohgaki's avatar
    akiraohgaki committed
        if (installedItems.isEmpty()) {
    
    akiraohgaki's avatar
    akiraohgaki committed
            emit checkAllStarted(false);
    
    akiraohgaki's avatar
    akiraohgaki committed
            return;
    
    akiraohgaki's avatar
    akiraohgaki committed
        }
    
    
    akiraohgaki's avatar
    akiraohgaki committed
        emit checkAllStarted(true);
    
    
    akiraohgaki's avatar
    akiraohgaki committed
        for (const auto &itemKey : installedItems.keys()) {
            auto installedItem = installedItems[itemKey].toObject();
    
    akiraohgaki's avatar
    akiraohgaki committed
            auto filename = installedItem["filename"].toString();
    
    akiraohgaki's avatar
    akiraohgaki committed
            auto installType = installedItem["install_type"].toString();
    
    
    akiraohgaki's avatar
    akiraohgaki committed
            QString filePath = "";
    
    akiraohgaki's avatar
    akiraohgaki committed
    #ifdef QTLIB_UNIX
    
    akiraohgaki's avatar
    akiraohgaki committed
            filePath = configHandler_->getAppConfigInstallTypes()[installType].toObject()["destination"].toString() + "/" + filename;
    
    akiraohgaki's avatar
    akiraohgaki committed
    #else
    
    akiraohgaki's avatar
    akiraohgaki committed
            filePath = configHandler_->getAppConfigInstallTypes()[installType].toObject()["generic_destination"].toString() + "/" + filename;
    
    akiraohgaki's avatar
    akiraohgaki committed
    #endif
    
    
    akiraohgaki's avatar
    akiraohgaki committed
            QString updateMethod = "";
    
    akiraohgaki's avatar
    akiraohgaki committed
    
    
    akiraohgaki's avatar
    akiraohgaki committed
            if (installType == "bin") {
    
    akiraohgaki's avatar
    akiraohgaki committed
    #ifdef QTLIB_UNIX
    
    akiraohgaki's avatar
    akiraohgaki committed
                if (filePath.endsWith(".appimage", Qt::CaseInsensitive)) {
                    if (AppImageUpdater(itemKey, filePath).checkAppImage()) {
    
    akiraohgaki's avatar
    akiraohgaki committed
                        updateMethod = "appimageupdate";
    
    akiraohgaki's avatar
    akiraohgaki committed
                    }
    
    akiraohgaki's avatar
    akiraohgaki committed
                    //else if (OcsFileUpdater(url).checkFile()) {
                    //    updateMethod = "appimageupdate_ocs";
    
    akiraohgaki's avatar
    akiraohgaki committed
                    //}
    
    akiraohgaki's avatar
    akiraohgaki committed
                }
    
    akiraohgaki's avatar
    akiraohgaki committed
    #endif
    
    akiraohgaki's avatar
    akiraohgaki committed
            }
    
    akiraohgaki's avatar
    akiraohgaki committed
    
            if (!updateMethod.isEmpty()) {
                QJsonObject updateAvailableItem;
                updateAvailableItem["installed_item"] = itemKey;
                updateAvailableItem["update_method"] = updateMethod;
                // Use installed item's key as unique key to the update available item
                configHandler_->setUsrConfigUpdateAvailableItemsItem(itemKey, updateAvailableItem);
            }
    
    akiraohgaki's avatar
    akiraohgaki committed
        }
    
    
    akiraohgaki's avatar
    akiraohgaki committed
        auto application = configHandler_->getUsrConfigApplication();
    
    akiraohgaki's avatar
    akiraohgaki committed
        application["update_checked_at"] = QDateTime::currentMSecsSinceEpoch();
        configHandler_->setUsrConfigApplication(application);
    
    
    akiraohgaki's avatar
    akiraohgaki committed
        emit checkAllFinished(true);
    
    akiraohgaki's avatar
    akiraohgaki committed
    void UpdateHandler::update(const QString &itemKey)
    
    akiraohgaki's avatar
    akiraohgaki committed
        auto updateAvailableItems = configHandler_->getUsrConfigUpdateAvailableItems();
    
        if (!updateAvailableItems.contains(itemKey)) {
    
    akiraohgaki's avatar
    akiraohgaki committed
            emit updateStarted(itemKey, false);
    
    akiraohgaki's avatar
    akiraohgaki committed
            return;
        }
    
        auto updateMethod = updateAvailableItems[itemKey].toObject()["update_method"].toString();
    
    akiraohgaki's avatar
    akiraohgaki committed
    
    #ifdef QTLIB_UNIX
    
    akiraohgaki's avatar
    akiraohgaki committed
        if (updateMethod == "appimageupdate") {
            updateAppImage(itemKey);
    
    akiraohgaki's avatar
    akiraohgaki committed
        }
    
    akiraohgaki's avatar
    akiraohgaki committed
        //else if (updateMethod == "appimageupdate_ocs") {
        //    updateAppImageOcs(itemKey);
    
    akiraohgaki's avatar
    akiraohgaki committed
        //}
    
    akiraohgaki's avatar
    akiraohgaki committed
    #endif
    
    akiraohgaki's avatar
    akiraohgaki committed
    
    #ifdef QTLIB_UNIX
    
    akiraohgaki's avatar
    akiraohgaki committed
    void UpdateHandler::appImageUpdaterFinished(AppImageUpdater *updater)
    
    akiraohgaki's avatar
    akiraohgaki committed
        auto itemKey = updater->id();
    
        auto metadata = metadataSet_[itemKey].toObject();
        metadataSet_.remove(itemKey);
    
        if (!updater->isFinishedWithNoError()) {
            emit updateFinished(itemKey, false);
            return;
    
    akiraohgaki's avatar
    akiraohgaki committed
        }
    
    
    akiraohgaki's avatar
    akiraohgaki committed
        auto installedItemKey = metadata["installed_item_key"].toString();
        auto installedItem = metadata["installed_item_obj"].toObject();
        auto newFilename = metadata["new_filename"].toString();
        auto filename = installedItem["filename"].toString();
    
        installedItem["filename"] = newFilename;
        QJsonArray files;
        files.append(QJsonValue(newFilename));
        installedItem["files"] = files;
        installedItem["installed_at"] = QDateTime::currentMSecsSinceEpoch();
    
        configHandler_->setUsrConfigInstalledItemsItem(installedItemKey, installedItem);
    
        if (newFilename != filename) {
            qtlib::File(updater->path()).remove();
    
    akiraohgaki's avatar
    akiraohgaki committed
        }
    
    akiraohgaki's avatar
    akiraohgaki committed
    
        configHandler_->removeUsrConfigUpdateAvailableItemsItem(itemKey);
    
        emit updateFinished(itemKey, true);
    
    akiraohgaki's avatar
    akiraohgaki committed
    #endif
    
    akiraohgaki's avatar
    akiraohgaki committed
    #ifdef QTLIB_UNIX
    
    akiraohgaki's avatar
    akiraohgaki committed
    void UpdateHandler::updateAppImage(const QString &itemKey)
    
    akiraohgaki's avatar
    akiraohgaki committed
        auto updateAvailableItem = configHandler_->getUsrConfigUpdateAvailableItems()[itemKey].toObject();
        auto installedItemKey = updateAvailableItem["installed_item"].toString();
    
    akiraohgaki's avatar
    akiraohgaki committed
        auto installedItems = configHandler_->getUsrConfigInstalledItems();
    
    akiraohgaki's avatar
    akiraohgaki committed
    
        if (!installedItems.contains(installedItemKey)) {
    
    akiraohgaki's avatar
    akiraohgaki committed
            emit updateStarted(itemKey, false);
    
    akiraohgaki's avatar
    akiraohgaki committed
            return;
        }
    
        auto installedItem = installedItems[installedItemKey].toObject();
        auto filename = installedItem["filename"].toString();
        auto installType = installedItem["install_type"].toString();
    
    akiraohgaki's avatar
    akiraohgaki committed
    
    
    akiraohgaki's avatar
    akiraohgaki committed
        auto filePath = configHandler_->getAppConfigInstallTypes()[installType].toObject()["destination"].toString() + "/" + filename;
        auto *updater = new AppImageUpdater(itemKey, filePath, this);
        connect(updater, &AppImageUpdater::updateProgress, this, &UpdateHandler::updateProgress);
        connect(updater, &AppImageUpdater::finished, this, &UpdateHandler::appImageUpdaterFinished);
    
        QJsonObject metadata;
        metadata["installed_item_key"] = installedItemKey;
        metadata["installed_item_obj"] = installedItem;
        metadata["new_filename"] = filename;
    
    akiraohgaki's avatar
    akiraohgaki committed
    
    
    akiraohgaki's avatar
    akiraohgaki committed
        auto updateInformation = updater->describeAppImage();
    
    akiraohgaki's avatar
    akiraohgaki committed
        for (const auto &info : updateInformation.split("\n")) {
            if (info.endsWith(".zsync", Qt::CaseInsensitive)) {
    
    akiraohgaki's avatar
    akiraohgaki committed
                metadata["new_filename"] = info.split("|").last().split("/").last().replace(".zsync", "", Qt::CaseInsensitive);
    
    akiraohgaki's avatar
    akiraohgaki committed
                break;
            }
        }
    
    
    akiraohgaki's avatar
    akiraohgaki committed
        metadataSet_[itemKey] = metadata;
    
    akiraohgaki's avatar
    akiraohgaki committed
    
    
    akiraohgaki's avatar
    akiraohgaki committed
        emit updateStarted(itemKey, true);
        updater->updateAppImage();
    
    akiraohgaki's avatar
    akiraohgaki committed
    }
    #endif