# HG changeset patch # User Andre Heinecke # Date 1397581549 -7200 # Node ID 3be838c3e4d83cc3ab1bc2974faf98dc51a070bd # Parent a507e5f1b9991152d7f95012d253c013980bc19c Handle installation success. Save / load last installed list. This also adds a feature that you can specifiy the download resource when release build is not set so that you can update a list without modifying the server data. diff -r a507e5f1b999 -r 3be838c3e4d8 ui/mainwindow.cpp --- a/ui/mainwindow.cpp Tue Apr 15 19:03:56 2014 +0200 +++ b/ui/mainwindow.cpp Tue Apr 15 19:05:49 2014 +0200 @@ -53,10 +53,11 @@ mMessageTimer->setInterval(NAG_INTERVAL_MINUTES * 60 * 1000); mMessageTimer->start(); checkUpdates(); + loadUnselectedCertificates(); + loadCertificateList(); if (!trayMode) { show(); } - loadUnselectedCertificates(); } void MainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason) @@ -92,17 +93,18 @@ void MainWindow::verifyAvailableData() { - QString listFileName = mSettings.value("List/available").toString(); + QString availableFileName = mSettings.value("List/available").toString(); + QString installedFileName = mSettings.value("List/installed").toString(); QString swFileName = mSettings.value("Software/available").toString(); - if (!listFileName.isEmpty()) { - mListToInstall.readList(listFileName.toLocal8Bit().constData()); + if (!availableFileName.isEmpty()) { + mListToInstall.readList(availableFileName.toLocal8Bit().constData()); if (!mListToInstall.isValid()) { mCurState = TransferError; // Probably a bug when Qt fileName is encoded and cFileName // fails because of this. This needs a unit test! // Maybe check that the file is in our data directory - QFile::remove(listFileName); + QFile::remove(availableFileName); mSettings.remove("List/available"); mSettings.remove("List/availableDate"); } @@ -112,6 +114,22 @@ mSettings.remove("List/availableDate"); } + if (!installedFileName.isEmpty()) { + mInstalledList.readList(installedFileName.toLocal8Bit().constData()); + if (!mInstalledList.isValid()) { + // Probably a bug when Qt fileName is encoded and cFileName + // fails because of this. This needs a unit test! + // Maybe check that the file is in our data directory + QFile::remove(installedFileName); + mSettings.remove("List/installed"); + mSettings.remove("List/installedDate"); + } + } else { + // Make sure the available notation is also removed + mSettings.remove("List/installed"); + mSettings.remove("List/installedDate"); + } + if (!swFileName.isEmpty()) { // TODO } else { @@ -158,11 +176,21 @@ QDateTime listInstalledLastMod = mSettings.value("List/installedDate").toDateTime(); QDateTime swInstalledLastMod = mSettings.value("Software/installedDate").toDateTime(); + QString listResource = QString::fromLatin1(LIST_RESOURCE); + QString swResource = QString::fromLatin1(SW_RESOURCE); + +#ifndef RELEASE_BUILD + /* Use this for testing to specify another file name for updates */ + listResource = mSettings.value("List/resource", listResource).toString(); + swResource = mSettings.value("Software/resource", swResource).toString(); +#endif + + Downloader* downloader = new Downloader(this, QString::fromLatin1(SERVER_URL), QByteArray(), QDateTime::currentDateTime(), -// swInstalledLastMod, +// TODO swInstalledLastMod, listInstalledLastMod, QString::fromLatin1(SW_RESOURCE), QString::fromLatin1(LIST_RESOURCE)); @@ -319,7 +347,13 @@ { mCertListWidget->clear(); int i = 0; - foreach (const Certificate &cert, mListToInstall.getCertificates()) { + + /* TODO: if nothing is available (neither old nor new) add some progress + * indication */ + + foreach (const Certificate &cert, mListToInstall.isValid() ? + mListToInstall.getCertificates() : + mInstalledList.getCertificates()) { if (!cert.isValid()) { qWarning() << "Invalid certificate in list"; continue; @@ -330,9 +364,14 @@ item->setData(CertificateItemDelegate::B64LineRole, cert.base64Line()); Qt::CheckState checkedState = mPreviouslyUnselected.contains(cert.base64Line()) ? Qt::Unchecked : Qt::Checked; + + bool isOld = mInstalledList.getCertificates().contains(cert); + qDebug() << "Found old certificate."; + /* TODO properly work with that information. */ + if (cert.isInstallCert()) { // This if statements is for testing! @TODO Remove this! - if (i <= 2) { + if (isOld) { item->setData(CertificateItemDelegate::StatusRole, Certificate::InstallOld); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); } @@ -407,6 +446,27 @@ QMessageBox::warning(this, tr("Error executing update"), errMsg); } +void MainWindow::installerSuccess() { + if (mCurState == NewListAvailable) { + mCurState = NothingChanged; + mCurMessage = QString(); + + QString listFileName = mSettings.value("List/available").toString(); + QDateTime listFileDate = mSettings.value("List/availableDate").toDateTime(); + + mSettings.remove("List/available"); + mSettings.remove("List/availableDate"); + + if (listFileName.isEmpty() || !listFileDate.isValid()) { + qWarning() << "Error accessing settings"; + return; /* Try again with next check */ + } + + mSettings.setValue("List/installed", listFileName); + mSettings.setValue("List/installedDate", listFileDate); + } +} + void MainWindow::installCerts() { QStringList choices; @@ -438,8 +498,10 @@ connect(instWrap, SIGNAL(finished()), instWrap, SLOT(deleteLater())); connect(instWrap, SIGNAL(finished()), progress, SLOT(deleteLater())); connect(instWrap, SIGNAL(finished()), progress, SLOT(cancel())); + connect(instWrap, SIGNAL(installationSuccessful()), + this, SLOT(installerSuccess())); connect(instWrap, SIGNAL(error(const QString &)), - this, SLOT(installerError(const QString &))); + this, SLOT(installerError(const QString &))); instWrap->start(); if (!saveUnselectedCertificates()) { diff -r a507e5f1b999 -r 3be838c3e4d8 ui/mainwindow.h --- a/ui/mainwindow.h Tue Apr 15 19:03:56 2014 +0200 +++ b/ui/mainwindow.h Tue Apr 15 19:05:49 2014 +0200 @@ -43,7 +43,8 @@ BeforeDownload, NewListAvailable, NewSoftwareAvailable, - TransferError + TransferError, + NothingChanged }; CurrentState getState() {return mCurState;} void setState(CurrentState state) {mCurState = state;} @@ -64,6 +65,7 @@ void showDetails(QListWidgetItem*); void resizeButtons(); void installerError(const QString& errMsg); + void installerSuccess(); void installCerts(); /** @brief saves the currently unselected certificates @@ -93,8 +95,8 @@ * Do not use this as a trust check as this only works on * FileNames where the underlying files can change. This * is just meant to check if the downloaded data was somehow - * removed or corrupted. - * + * removed or corrupted. It also initializes mListToInstall + * and mInstalledList. */ void verifyAvailableData(); void createTrayIcon(); @@ -122,6 +124,8 @@ /* The current list that should be installed */ CertificateList mListToInstall; + /* The last list that we installed */ + CertificateList mInstalledList; /* Previously made "unselect" choices in the form of * base64lines with I:/R: prefix */ QStringList mPreviouslyUnselected;