From 6a8bb3691b9e30bcb90003eead34b287010cf17f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Tue, 2 May 2017 01:43:18 +0200 Subject: GH-1874 do not allow updating while an instance is running This is a nasty hack. Proper solution will require moving all update related functionality out of the main window. Running instances and updating should be mutually exclusive. --- application/MainWindow.cpp | 23 ++++++++++++++++++++++- application/MainWindow.h | 1 + application/MultiMC.cpp | 45 +++++++++++++++++++++++++++++++++++++++------ application/MultiMC.h | 10 ++++++++++ 4 files changed, 72 insertions(+), 7 deletions(-) diff --git a/application/MainWindow.cpp b/application/MainWindow.cpp index 08afbbb3..4ec0af86 100644 --- a/application/MainWindow.cpp +++ b/application/MainWindow.cpp @@ -561,14 +561,17 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new MainWindow updateNewsLabel(); } + if(BuildConfig.UPDATER_ENABLED) { + bool updatesAllowed = MMC->updatesAreAllowed(); + updatesAllowedChanged(updatesAllowed); // set up the updater object. auto updater = MMC->updateChecker(); connect(updater.get(), &UpdateChecker::updateAvailable, this, &MainWindow::updateAvailable); connect(updater.get(), &UpdateChecker::noUpdateFound, this, &MainWindow::updateNotAvailable); // if automatic update checks are allowed, start one. - if (MMC->settings()->get("AutoUpdate").toBool()) + if (MMC->settings()->get("AutoUpdate").toBool() && updatesAllowed) { updater->checkForUpdate(MMC->settings()->get("UpdateChannel").toString(), false); } @@ -795,6 +798,15 @@ void MainWindow::repopulateAccountsMenu() accountMenu->addAction(manageAccountsAction); } +void MainWindow::updatesAllowedChanged(bool allowed) +{ + if(!BuildConfig.UPDATER_ENABLED) + { + return; + } + ui->actionCheckUpdate->setEnabled(allowed); +} + /* * Assumes the sender is a QAction */ @@ -896,6 +908,11 @@ void MainWindow::updateNewsLabel() void MainWindow::updateAvailable(GoUpdate::Status status) { + if(!MMC->updatesAreAllowed()) + { + updateNotAvailable(); + return; + } UpdateDialog dlg; UpdateAction action = (UpdateAction)dlg.exec(); switch (action) @@ -955,6 +972,10 @@ void MainWindow::notificationsChanged() void MainWindow::downloadUpdates(GoUpdate::Status status) { + if(!MMC->updatesAreAllowed()) + { + return; + } qDebug() << "Downloading updates."; ProgressDialog updateDlg(this); status.rootPath = MMC->root(); diff --git a/application/MainWindow.h b/application/MainWindow.h index e8a22b4d..2a70f17c 100644 --- a/application/MainWindow.h +++ b/application/MainWindow.h @@ -54,6 +54,7 @@ public: void checkInstancePathForProblems(); + void updatesAllowedChanged(bool allowed); signals: void isClosing(); diff --git a/application/MultiMC.cpp b/application/MultiMC.cpp index 833efc06..6d83fd07 100644 --- a/application/MultiMC.cpp +++ b/application/MultiMC.cpp @@ -965,7 +965,7 @@ bool MultiMC::launch(InstancePtr instance, bool online, BaseProfilerFactory *pro } connect(controller.get(), &LaunchController::succeeded, this, &MultiMC::controllerSucceeded); connect(controller.get(), &LaunchController::failed, this, &MultiMC::controllerFailed); - m_runningInstances ++; + addRunningInstance(); controller->start(); return true; } @@ -994,6 +994,38 @@ bool MultiMC::kill(InstancePtr instance) return true; } +void MultiMC::addRunningInstance() +{ + m_runningInstances ++; + if(m_runningInstances == 1) + { + emit updateAllowedChanged(false); + } +} + +void MultiMC::subRunningInstance() +{ + if(m_runningInstances == 0) + { + qCritical() << "Something went really wrong and we now have less than 0 running instances... WTF"; + return; + } + m_runningInstances --; + if(m_runningInstances == 0) + { + emit updateAllowedChanged(true); + } +} + +bool MultiMC::shouldExitNow() const +{ + return m_runningInstances == 0 && m_openWindows == 0; +} + +bool MultiMC::updatesAreAllowed() +{ + return m_runningInstances == 0; +} void MultiMC::controllerSucceeded() { @@ -1012,10 +1044,10 @@ void MultiMC::controllerSucceeded() } } extras.controller.reset(); - m_runningInstances --; + subRunningInstance(); // quit when there are no more windows. - if(m_openWindows == 0 && m_runningInstances == 0) + if(shouldExitNow()) { m_status = Status::Succeeded; exit(0); @@ -1033,10 +1065,10 @@ void MultiMC::controllerFailed(const QString& error) // on failure, do... nothing extras.controller.reset(); - m_runningInstances --; + subRunningInstance(); // quit when there are no more windows. - if(m_openWindows == 0 && m_runningInstances == 0) + if(shouldExitNow()) { m_status = Status::Failed; exit(1); @@ -1066,6 +1098,7 @@ MainWindow* MultiMC::showMainWindow(bool minimized) } m_mainWindow->checkInstancePathForProblems(); + connect(this, &MultiMC::updateAllowedChanged, m_mainWindow, &MainWindow::updatesAllowedChanged); connect(m_mainWindow, &MainWindow::isClosing, this, &MultiMC::on_windowClose); m_openWindows++; } @@ -1155,7 +1188,7 @@ void MultiMC::on_windowClose() m_mainWindow = nullptr; } // quit when there are no more windows. - if(m_openWindows == 0 && m_runningInstances == 0) + if(shouldExitNow()) { exit(0); } diff --git a/application/MultiMC.h b/application/MultiMC.h index 28a9641a..48be3b22 100644 --- a/application/MultiMC.h +++ b/application/MultiMC.h @@ -151,6 +151,11 @@ public: return m_runningInstances; } + bool updatesAreAllowed(); + +signals: + void updateAllowedChanged(bool status); + public slots: bool launch(InstancePtr instance, bool online = true, BaseProfilerFactory *profiler = nullptr); bool kill(InstancePtr instance); @@ -186,6 +191,11 @@ private: // sets the fatal error message and m_status to Failed. void showFatalErrorMessage(const QString & title, const QString & content); +private: + void addRunningInstance(); + void subRunningInstance(); + bool shouldExitNow() const; + private: QDateTime startTime; -- cgit v1.2.3