From 94185a434270b54ca448e5009f90664aadf9eca8 Mon Sep 17 00:00:00 2001 From: Alexis Lopez Zubieta Date: Mon, 2 Sep 2019 18:20:54 -0500 Subject: [PATCH] Use killall --- app/src/updaters/appupdater.cpp.autosave | 143 +++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 app/src/updaters/appupdater.cpp.autosave diff --git a/app/src/updaters/appupdater.cpp.autosave b/app/src/updaters/appupdater.cpp.autosave new file mode 100644 index 0000000..328fa1e --- /dev/null +++ b/app/src/updaters/appupdater.cpp.autosave @@ -0,0 +1,143 @@ +#include +#include + +#include "appimage/update.h" +#include "appupdater.h" + +AppUpdater::AppUpdater(const QString &appImagePath, QObject *parent) : QObject(parent), appImagePath(appImagePath), updateHelper(nullptr) +{ + connect(this, &AppUpdater::updateAvailable, &updateDialog, &AppUpdateDialog::showUpdateConfirmationMessage); + connect(&updateDialog, &AppUpdateDialog::updateRequested, this, &AppUpdater::doUpdate); + connect(&updateDialog, &AppUpdateDialog::restartRequested, this, &AppUpdater::doRestart); + + connect(&updateDialog, &AppUpdateDialog::rejected, this, &AppUpdater::stop); +} + +void AppUpdater::setSilentLookup(bool value) +{ + silentLookup = value; +} + +void AppUpdater::doUpdateLookUp() +{ + if (appImagePath.isEmpty()) { + qWarning() << "Self-updates disabled: No app file provided."; + return; + } + + if (!silentLookup) + updateDialog.show(); + + QtConcurrent::run([=]() { + appimage::update::Updater updater(appImagePath.toStdString()); + + bool updateAvailable; // this is an output parameter!!! + updater.checkForChanges(updateAvailable); + + if (updateAvailable) { + qDebug() << "Update available"; + emit this->updateAvailable(); + } + + }); +} + +void AppUpdater::doUpdate() +{ + if (appImagePath.isEmpty()) { + qWarning() << "Self-updates disabled: No app file provided."; + return; + } + + + if (updateHelper !=nullptr) + delete updateHelper; + + updateHelper = new appimage::update::Updater(appImagePath.toStdString()); + + updateHelper->start(); + + progressCheckTimer.setInterval(200); + progressCheckTimer.start(); + + connect(&progressCheckTimer, &QTimer::timeout, this, &AppUpdater::checkUpdateProgress); +} + +void AppUpdater::doRestart() +{ + QProcess::startDetached("killall", {"pling-store"}); + + if (updateHelper != nullptr) { + std::string pathToNewFile; + updateHelper->pathToNewFile(pathToNewFile); + + if (!pathToNewFile.empty()) { + QString path = QString::fromStdString(pathToNewFile); + QFile::setPermissions(path, QFileDevice::ReadUser | QFileDevice::ExeUser); + + + QProcess proc; + proc.setEnvironment(getCleanSystemEnvironment()); + + qDebug() << proc.environment(); + if (proc.startDetached(path)) { + updateDialog.accept(); + } else + updateDialog.showErrorMessage("Unable to start: " + path); + } + } +} + +void AppUpdater::stop() +{ +} + +void AppUpdater::checkUpdateProgress() +{ + using namespace appimage::update; + auto state = updateHelper->state(); + switch (state) { + case Updater::INITIALIZED: + break; + case Updater::RUNNING: + double progress; + updateHelper->progress(progress); + updateDialog.showProgress(progress*100); + break; + case Updater::STOPPING: + break; + case Updater::SUCCESS: + updateDialog.showCompletionMessage(); + progressCheckTimer.stop(); + break; + case Updater::ERROR: + updateDialog.showErrorMessage(tr("Update failed")); + progressCheckTimer.stop(); + break; + } +} + +QStringList AppUpdater::getCleanSystemEnvironment() +{ + QString appDirPath = qgetenv("APPDIR"); + + QProcessEnvironment systenEnvironemnt = QProcessEnvironment::systemEnvironment(); + QProcessEnvironment processEnvironment; + + for (QString key: systenEnvironemnt.keys()) { + QString value = systenEnvironemnt.value(key); + + QStringList oldValue = value.split(":"); + QStringList newVaule; + for (const QString &valueSection: oldValue) + if (!valueSection.contains(appDirPath)) + newVaule << valueSection; + + if (!newVaule.empty()) + processEnvironment.insert(key, newVaule.join(":")); + } + + return processEnvironment.toStringList(); +// return {"DISPLAY=:0"}; +} + -- GitLab