void CModListView::downloadFinished(QStringList savedFiles, QStringList failedFiles, QStringList errors) { QString title = "Download failed"; QString firstLine = "Unable to download all files.\n\nEncountered errors:\n\n"; QString lastLine = "\n\nInstall successfully downloaded?"; // if all files were d/loaded there should be no errors. And on failure there must be an error assert(failedFiles.empty() == errors.empty()); if (savedFiles.empty()) { // no successfully downloaded mods QMessageBox::warning(this, title, firstLine + errors.join("\n"), QMessageBox::Ok, QMessageBox::Ok ); } else if (!failedFiles.empty()) { // some mods were not downloaded int result = QMessageBox::warning (this, title, firstLine + errors.join("\n") + lastLine, QMessageBox::Yes | QMessageBox::No, QMessageBox::No ); if (result == QMessageBox::Yes) installFiles(savedFiles); } else { // everything OK installFiles(savedFiles); } // remove progress bar after some delay so user can see that download was complete and not interrupted. QTimer::singleShot(1000, this, SLOT(hideProgressBar())); dlManager->deleteLater(); dlManager = nullptr; }
void UpdateInstaller::run() throw () { if (!m_script || !m_script->isValid()) { reportError("Unable to read update script"); return; } if (m_installDir.empty()) { reportError("No installation directory specified"); return; } std::string updaterPath; try { updaterPath = ProcessUtils::currentProcessPath(); } catch (const FileUtils::IOException&) { LOG(Error,"error reading process path with mode " + intToStr(m_mode)); reportError("Unable to determine path of updater"); return; } if (m_mode == Setup) { if (m_waitPid != 0) { LOG(Info,"Waiting for main app process to finish"); ProcessUtils::waitForProcess(m_waitPid); } std::list<std::string> args = updaterArgs(); args.push_back("--mode"); args.push_back("main"); args.push_back("--wait"); args.push_back(intToStr(ProcessUtils::currentProcessId())); int installStatus = 0; if (m_forceElevated || !checkAccess()) { LOG(Info,"Insufficient rights to install app to " + m_installDir + " requesting elevation"); // start a copy of the updater with admin rights installStatus = ProcessUtils::runElevated(updaterPath,args,AppInfo::name()); } else { LOG(Info,"Sufficient rights to install app - restarting with same permissions"); installStatus = ProcessUtils::runSync(updaterPath,args); } if (installStatus == 0) { LOG(Info,"Update install completed"); } else { LOG(Error,"Update install failed with status " + intToStr(installStatus)); } // restart the main application - this is currently done // regardless of whether the installation succeeds or not restartMainApp(); // clean up files created by the updater cleanup(); } else if (m_mode == Main) { LOG(Info,"Starting update installation"); // the detailed error string returned by the OS std::string error; // the message to present to the user. This may be the same // as 'error' or may be different if a more helpful suggestion // can be made for a particular problem std::string friendlyError; try { LOG(Info,"Installing new and updated files"); installFiles(); LOG(Info,"Uninstalling removed files"); uninstallFiles(); LOG(Info,"Removing backups"); removeBackups(); postInstallUpdate(); } catch (const FileUtils::IOException& exception) { error = exception.what(); friendlyError = friendlyErrorForError(exception); } catch (const std::string& genericError) { error = genericError; } if (!error.empty()) { LOG(Error,std::string("Error installing update ") + error); try { revert(); } catch (const FileUtils::IOException& exception) { LOG(Error,"Error reverting partial update " + std::string(exception.what())); } if (m_observer) { if (friendlyError.empty()) { friendlyError = error; } m_observer->updateError(friendlyError); } } if (m_observer) { m_observer->updateFinished(); } } }