Mercurial > trustbridge
view ui/mainwindow.cpp @ 64:fb9f78f7ab2f
Improve error handling free memory before exiting. Include line endings in Marker lines
author | Andre Heinecke <aheinecke@intevation.de> |
---|---|
date | Tue, 18 Mar 2014 14:14:15 +0000 |
parents | c6125d73faf4 |
children | f22a99f7cb69 |
line wrap: on
line source
#include "mainwindow.h" #include <QDebug> #include <QMessageBox> #include <QSystemTrayIcon> #include <QAction> #include <QDialog> #include <QMenu> #include <QApplication> #include <QFile> #include <QTimer> // The amount of time in minutes stay silent if we have // something to say #define NAG_INTERVAL_MINUTES 2 #include "certificatelist.h" #include "downloader.h" MainWindow::MainWindow() { createActions(); createTrayIcon(); qRegisterMetaType<SSLConnection::ErrorCode>("SSLConnection::ErrorCode"); connect(mTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason))); mMessageTimer = new QTimer(this); connect(mMessageTimer, SIGNAL(timeout()), this, SLOT(showMessage())); mMessageTimer->setInterval(NAG_INTERVAL_MINUTES * 60 * 1000); mMessageTimer->start(); } void MainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason) { switch (reason) { case QSystemTrayIcon::Trigger: case QSystemTrayIcon::MiddleClick: showMessage(); break; case QSystemTrayIcon::DoubleClick: // TODO show menu break; default: ; } } void MainWindow::showMessage() { if (!mCurMessage.isEmpty()) { mTrayIcon->showMessage(QApplication::applicationName(), mCurMessage, QSystemTrayIcon::Information, 5000); mMessageTimer->start(); // Restart the timer so that we don't spam } } /** @brief check the integrity of available files. * * 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. * */ void MainWindow::verifyAvailableData() { QString listFileName = mSettings.value("List/available").toString(); QString swFileName = mSettings.value("Software/available").toString(); if (!listFileName.isEmpty()) { const char *cFileName = listFileName.toLocal8Bit().constData(); char *data = NULL; size_t size; if (read_and_verify_list(cFileName, &data, &size) != Valid) { // 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); mSettings.remove("List/available"); mSettings.remove("List/availableDate"); } free(data); // We only needed verify } else { // Make sure the available notation is also removed mSettings.remove("List/available"); mSettings.remove("List/availableDate"); } if (!swFileName.isEmpty()) { // TODO } else { mSettings.remove("Software/available"); mSettings.remove("Software/availableDate"); } } void MainWindow::handleNewList(const QString& fileName, const QDateTime& modDate) { mCurMessage = tr("An updated certificate list is available. Click here to install."); setState(NewListAvailable); mSettings.setValue("List/available", fileName); mSettings.setValue("List/availableDate", modDate); showMessage(); } void MainWindow::handleNewSW(const QString& fileName, const QDateTime& modDate) { mCurMessage = tr("An update for %1 is available. Click here to install.").arg( QApplication::applicationName()); setState(NewSoftwareAvailable); mSettings.setValue("Software/available", fileName); mSettings.setValue("Software/availableDate", modDate); mSettings.sync(); showMessage(); } void MainWindow::checkUpdates() { verifyAvailableData(); QDateTime listInstalledLastMod = mSettings.value("List/installedDate").toDateTime(); QDateTime swInstalledLastMod = mSettings.value("Software/installedDate").toDateTime(); Downloader* downloader = new Downloader(this, QString::fromLatin1("https://files.kolab.org"), QByteArray(), swInstalledLastMod, listInstalledLastMod); connect(downloader, SIGNAL(newListAvailable(const QString&, const QDateTime&)), this, SLOT(handleNewList(const QString&, const QDateTime&))); connect(downloader, SIGNAL(newSoftwareAvailable(const QString&, const QDateTime&)), this, SLOT(handleNewSW(const QString&, const QDateTime&))); connect(downloader, SIGNAL(finished()), downloader, SLOT(deleteLater())); connect(downloader, SIGNAL(error(const QString &, SSLConnection::ErrorCode)), this, SLOT(downloaderError(const QString &, SSLConnection::ErrorCode))); downloader->start(); } void MainWindow::downloaderError(const QString &message, SSLConnection::ErrorCode error) { mCurMessage = message; showMessage(); } void MainWindow::createActions() { mCheckUpdates = new QAction(tr("Check for Updates"), this); connect(mCheckUpdates, SIGNAL(triggered()), this, SLOT(checkUpdates())); mQuitAction = new QAction(tr("Quit"), this); connect(mQuitAction, SIGNAL(triggered()), qApp, SLOT(quit())); } void MainWindow::createTrayIcon() { QIcon trayImg(":/img/tray_22.png"); mTrayMenu = new QMenu(this); mTrayMenu->addAction(mCheckUpdates); mTrayMenu->addAction(mQuitAction); mTrayIcon = new QSystemTrayIcon(this); mTrayIcon->setContextMenu(mTrayMenu); mTrayIcon->setIcon(trayImg); setWindowIcon(trayImg); mTrayIcon->show(); mTrayIcon->setToolTip(tr("m13ui")); }