# HG changeset patch # User Andre Heinecke # Date 1416843968 -3600 # Node ID 00fcb9c4d16b9f3fc26e3533dfc7eae4f9051a39 # Parent 96f640c88d10a8e566765ea59cbf32b94f5ff47c (issue179) Handle SW verify failures and try to redownload the update diff -r 96f640c88d10 -r 00fcb9c4d16b ui/mainwindow.cpp --- a/ui/mainwindow.cpp Mon Nov 24 15:49:18 2014 +0100 +++ b/ui/mainwindow.cpp Mon Nov 24 16:46:08 2014 +0100 @@ -128,7 +128,8 @@ mTrayMode(trayMode), mManualDetailsShown(false), mFailedConnections(0), - mSigDt(sigDt) + mSigDt(sigDt), + mDownloadSWAccepted(false) { createActions(); createTrayIcon(); @@ -175,15 +176,21 @@ void MainWindow::messageClicked() { if (mCurState == NewSoftwareAvailable) { + mDownloadSWAccepted = true; verifySWData(); - QString swFileName = mSettings.value("Software/available").toString(); - if (swFileName.isEmpty()) { - checkUpdates(true); - mCurState = DownloadingSW; - return; + if (mFailedConnections == 0) { + /* If we have a failed connection cound verifySWData has + * triggered an invalid software recovery and an update is already + * scheduled. */ + QString swFileName = mSettings.value("Software/available").toString(); + if (swFileName.isEmpty()) { + checkUpdates(); + mCurState = DownloadingSW; + return; + } + installNewSW(swFileName, + mSettings.value("Software/availableDate").toDateTime()); } - installNewSW(swFileName, - mSettings.value("Software/availableDate").toDateTime()); } else { show(); } @@ -293,6 +300,7 @@ if (verifyResult.fptr) { fclose(verifyResult.fptr); } + scheduleFailureRetryOrClose(!isVisible()); } QFile::remove(swFileName); mSettings.remove("Software/available"); @@ -436,6 +444,7 @@ if (vres.fptr) { fclose(vres.fptr); } + scheduleFailureRetryOrClose(!isVisible()); } QFile::remove(filePath); mSettings.remove("Software/available"); @@ -547,9 +556,14 @@ #endif } -void MainWindow::checkUpdates(bool downloadSW) +void MainWindow::checkUpdates() { verifyListData(); + bool downloadSW = false; + + if (mDownloadSWAccepted == true) { + downloadSW = true; + } /* Delete old temporary installers if they exist */ QString oldUpdater = mSettings.value("Software/Updater").toString(); @@ -1790,6 +1804,18 @@ return closeApp(); } +void MainWindow::scheduleFailureRetryOrClose(bool close) { + int waitInterval = getNextUpdateInterval(mFailedConnections++); + if (waitInterval <= 0 && close) { + qDebug() << "Shutting down after " << mFailedConnections << + " tries to get an update connection."; + closeApp(); + } else if (waitInterval > 0) { + qDebug() << "Waiting for " << waitInterval / 1000 << " seconds until the next try."; + QTimer::singleShot(waitInterval, this, SLOT(checkUpdates())); + } +} + void MainWindow::updateCheckSuccess() { if (getState() != TransferError) { @@ -1802,17 +1828,8 @@ handleLTE(lteNoConnection, true); /* Reset error state */ handleLTE(lteInvalidCertificate, true); mFailedConnections = 0; - } else if (!isVisible()) { - int waitInterval = getNextUpdateInterval(mFailedConnections++); - if (waitInterval < 0) { - qDebug() << "Shutting down after " << mFailedConnections << - " tries to get an update connection."; - closeApp(); - return; - } - qDebug() << "Waiting for " << waitInterval / 1000 << " seconds until the next try."; - QTimer::singleShot(waitInterval, this, SLOT(checkUpdates())); - return; + } else { + scheduleFailureRetryOrClose(!isVisible()); } if ((getState() != NewSoftwareAvailable && getState() != NewListAvailable && mTrayMode) && !isVisible()) { diff -r 96f640c88d10 -r 00fcb9c4d16b ui/mainwindow.h --- a/ui/mainwindow.h Mon Nov 24 15:49:18 2014 +0100 +++ b/ui/mainwindow.h Mon Nov 24 16:46:08 2014 +0100 @@ -120,9 +120,10 @@ void iconActivated(QSystemTrayIcon::ActivationReason reason); /** @brief Check if new updates are available. * - * @param[in] downloadSW wether or not new software should be downloaded. + * Wether the software should be downloaded or not is determined by + * the mDownloadSWAccepted value. */ - void checkUpdates(bool downloadSW = false); + void checkUpdates(); /**@brief parse a new certificate list and update the UI*/ void handleNewList(const QString& fileName, const QDateTime& modDate); /**@brief handle a Software update, update state and inform the user */ @@ -294,6 +295,16 @@ **/ void handleLTE(LongTimeErrors lte, bool reset = false); + /** @brief schedule an update check retry or close the application. + * + * An update check retry is scheduled base on getNextUpdateInterval. + * If getNextUpdateInterval returns a negative value the application + * is closed if the parameter close is true. + * + * This function also increases the failed connection count. + */ + void scheduleFailureRetryOrClose(bool close); + /** @brief note a verify error in the settings and show a message * * Saves a software verify error in the settings and notifies the @@ -386,6 +397,7 @@ bool mManualDetailsShown; int mFailedConnections; QDateTime mSigDt; + bool mDownloadSWAccepted; }; #endif // MAINWINDOW_H