NSISUpdater::UpdateState NSISUpdater::updateStateOnStart() { MirallConfigFile cfg; QSettings settings(cfg.configFile(), QSettings::IniFormat); QString updateFileName = settings.value(updateAvailableC).toString(); // has the previous run downloaded an update? if (!updateFileName.isEmpty() && QFile(updateFileName).exists()) { // did it try to execute the update? if (settings.value(autoUpdateAttemptedC, false).toBool()) { // clean up settings.remove(autoUpdateAttemptedC); settings.remove(updateAvailableC); QFile::remove(updateFileName); if (updateSucceeded()) { // success: clean up even more settings.remove(updateTargetVersionC); settings.remove(autoUpdateFailedVersionC); return NoUpdate; } else { // auto update failed. Set autoUpdateFailedVersion as a hint // for visual fallback notification QString targetVersion = settings.value(updateTargetVersionC).toString(); settings.setValue(autoUpdateFailedVersionC, targetVersion); settings.remove(updateTargetVersionC); return UpdateFailed; } } else { if (!settings.contains(autoUpdateFailedVersionC)) { return UpdateAvailable; } } } return NoUpdate; }
bool OCUpdater::updateSucceeded() const { MirallConfigFile cfg; QSettings settings(cfg.configFile(), QSettings::IniFormat); qint64 targetVersionInt = Helper::stringVersionToInt(settings.value(updateTargetVersionC).toString()); qint64 currentVersion = Helper::currentVersionToInt(); return currentVersion >= targetVersionInt; }
void OCUpdater::slotStartInstaller() { MirallConfigFile cfg; QSettings settings(cfg.configFile(), QSettings::IniFormat); QString updateFile = settings.value(updateAvailableC).toString(); settings.setValue(autoUpdateAttemptedC, true); settings.sync(); qDebug() << "Running updater" << updateFile; QProcess::startDetached(updateFile, QStringList() << "/S" << "/launch"); }
bool OCUpdater::performUpdate() { MirallConfigFile cfg; QSettings settings(cfg.configFile(), QSettings::IniFormat); QString updateFile = settings.value(updateAvailableC).toString(); if (!updateFile.isEmpty() && QFile(updateFile).exists()) { if (QMessageBox::information(0, tr("New Update Ready"), tr("A new update is about to be installed. The updater may ask\n" "for additional privileges during the process."), QMessageBox::Ok)) { slotStartInstaller(); return true; } } return false; }
void NSISUpdater::slotDownloadFinished() { QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender()); if (reply->error() != QNetworkReply::NoError) { setDownloadState(DownloadFailed); return; } QUrl url(reply->url()); _file->close(); QFile::copy(_file->fileName(), _targetFile); setDownloadState(DownloadComplete); qDebug() << "Downloaded" << url.toString() << "to" << _targetFile; MirallConfigFile cfg; QSettings settings(cfg.configFile(), QSettings::IniFormat); settings.setValue(updateTargetVersionC, updateInfo().version()); settings.setValue(updateAvailableC, _targetFile); }
void NSISUpdater::versionInfoArrived(const UpdateInfo &info) { MirallConfigFile cfg; QSettings settings(cfg.configFile(), QSettings::IniFormat); qint64 infoVersion = Helper::stringVersionToInt(info.version()); qint64 seenVersion = Helper::stringVersionToInt(settings.value(seenVersionC).toString()); qint64 currVersion = Helper::currentVersionToInt(); if(info.version().isEmpty() || infoVersion <= currVersion || infoVersion <= seenVersion) { qDebug() << "Client is on latest version!"; setDownloadState(UpToDate); } else { QString url = info.downloadUrl(); qint64 autoUpdateFailedVersion = Helper::stringVersionToInt(settings.value(autoUpdateFailedVersionC).toString()); if (url.isEmpty() || _showFallbackMessage || infoVersion == autoUpdateFailedVersion) { showDialog(info); } if (!url.isEmpty()) { _targetFile = cfg.configPath() + url.mid(url.lastIndexOf('/')); if (QFile(_targetFile).exists()) { setDownloadState(DownloadComplete); } else { QNetworkReply *reply = qnam()->get(QNetworkRequest(QUrl(url))); connect(reply, SIGNAL(readyRead()), SLOT(slotWriteFile())); connect(reply, SIGNAL(finished()), SLOT(slotDownloadFinished())); setDownloadState(Downloading); _file.reset(new QTemporaryFile); _file->setAutoRemove(true); _file->open(); } } } }
void NSISUpdater::slotSetSeenVersion() { MirallConfigFile cfg; QSettings settings(cfg.configFile(), QSettings::IniFormat); settings.setValue(seenVersionC, updateInfo().version()); }