view ui/mainwindow.cpp @ 16:225a5ec20dad

Use QSettings and manage downloader from mainwindow.
author Andre Heinecke <aheinecke@intevation.de>
date Wed, 19 Feb 2014 10:45:29 +0000
parents 7e2f14c7aba2
children c12825a651ed
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 "certificatelist.h"
#include "downloader.h"

MainWindow::MainWindow() {
    createActions();
    createTrayIcon();

    connect(mTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
            this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
}

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);
    }
}

/** @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 (readAndVerifyList(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);

    qDebug() << "Settings value: " << mSettings.value("Software/available");
    mSettings.sync();
    showMessage();
}

void MainWindow::checkUpdates()
{
    verifyAvailableData();

    QDateTime listAvailableLastMod = mSettings.value("List/availableDate").toDateTime();
    QDateTime swAvailableLastMod = mSettings.value("Software/availableDate").toDateTime();

    if (!listAvailableLastMod.isValid()) {
        listAvailableLastMod = mSettings.value("List/installedLastMod").toDateTime();
    }

    if (!swAvailableLastMod.isValid()) {
        swAvailableLastMod = mSettings.value("List/installedLastMod").toDateTime();
    }

    Downloader* downloader = new Downloader(this, QString::fromLatin1("www.files.kolab.org"),
            QByteArray(), swAvailableLastMod, listAvailableLastMod);
    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 &, Downloader::ErrorCode)),
            this, SLOT(downloaderError(const QString &, Downloader::ErrorCode)));
    downloader->start();
}


void MainWindow::downloaderError(const QString &message, Downloader::ErrorCode error)
{
    // TODO decide what to show when and how.
    mCurMessage = message;
}


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"));
}

http://wald.intevation.org/projects/trustbridge/