view ui/mainwindow.h @ 611:957b28a97959

Add exclamation mark to warning message for running firefox / thunderbird instances
author Andre Heinecke <andre.heinecke@intevation.de>
date Wed, 18 Jun 2014 14:43:56 +0200
parents 292c590ba9cb
children 129e611eaf50
line wrap: on
line source
/* Copyright (C) 2014 by Bundesamt für Sicherheit in der Informationstechnik
 * Software engineering by Intevation GmbH
 *
 * This file is Free Software under the GNU GPL (v>=2)
 * and comes with ABSOLUTELY NO WARRANTY!
 * See LICENSE.txt for details.
 */
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

/**
 * @file mainwindow.h
 * @brief Main UI controller
 */

#include <QSystemTrayIcon>
#include <QMainWindow>
#include <QSettings>
#include <QMenuBar>
#include <QListWidget>
#include <QTextEdit>
#include <QPushButton>
#include <QLabel>
#include <QCheckBox>

#include "downloader.h"
#include "certificatelist.h"
class QMenu;
class QAction;
class QTimer;

Q_DECLARE_METATYPE(Certificate);

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    /**@brief create a new Main Window object
     *
     * In tray mode this window is not shown and only shows
     * notification messages if there is some actionable state
     * reached. If tray mode is true it also exits after
     * an update check.
     *
     * @param[in] trayMode set the tray mode
     * */
    MainWindow(bool trayMode);

    void setMessage(const QString message) {mCurMessage = message;}
    QString getMessage() {return mCurMessage;}

    enum CurrentState {
        BeforeDownload,
        NewListAvailable,
        NewSoftwareAvailable,
        DownloadingSW,
        TransferError,
        NothingChanged
    };
    CurrentState getState() {return mCurState;}
    void setState(CurrentState state) {mCurState = state;}

private slots:
    void showMessage();
    void iconActivated(QSystemTrayIcon::ActivationReason reason);
    void checkUpdates(bool downloadSW = false);
    void handleNewList(const QString& fileName, const QDateTime& modDate);
    void handleNewSW(const QString& fileName, const QDateTime& modDate);
    void downloaderError(const QString &message, SSLConnection::ErrorCode error);
    /** @brief Trigger the appropiate action depending on the state */
    void messageClicked();
    void showHelp();
    void showAbout();
    void showDetails(QListWidgetItem*);
    void resizeButtons();
    void installerError(const QString& errMsg);
    void installerSuccess();
    void installCerts();

    void saveAutoUpdate(int state);
    void saveAutoStart(int state);

    /** @brief check for running software that needs to close before installing
     *
     * This function calls installCerts if no software is running otherwise
     * it informs the user about the software that still needs to be closed.
     */
    void checkAndInstallCerts();

    /** @brief get the last modified date on the download server for
     * the current version.
     *
     * After the initial installation this function can be used to
     * determine the DateTime that corresponds to the currently installed
     * version on the download server.
     *
     * Calls setLastModifiedSWDate on success. Otherwise downloaderError
     * is triggered. */
    void getLastModForCurrentVersion();

    /** @brief set the last modified software date/time
     *
     * The last modifiedSWDate is the corresponding last modified
     * timestamp from the download server vor the currently installed version.
     */
    void setLastModifiedSWDate(const QDateTime &date);

    /** @brief saves the currently unselected certificates
     *
     * This creates / updates a qsettings section that
     * [unselected] that contains the certificates that
     * were unselected previously.
     *
     * Unselected are certificates that are unchecked
     * in the certListWidget
     *
     * Returns false on error.
     */
    bool saveUnselectedCertificates();

    /** @brief loads previously unselected certificates from settings
     *
     * The certificates are strored in the list mPreviouslyUnselected.
     *
     * On error mPreviouslyUnselected is empty after this call.
     */
    void loadUnselectedCertificates();

protected slots:
    /** @brief cleanup and close the main window
     *
     * Perform a clean exit (saving state etc.) and close
     * the application */
    virtual void closeApp();

    /* @brief Execute the file fileName to install the softwareupdate.
     *
     * Once the installer process is started this function terminates
     * the application. */
    void installNewSW(const QString& fileName, const QDateTime& modDate);

private:
    /** @brief check the integrity of available certificate lists.
     *
     * Note: Do not use this as a local 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. It also initializes mListToInstall
     * and mInstalledList.
     */
    void verifyListData();

    /** @brief check the integrity of available software updates.
     *
     * Note: Do not use this as a local 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 verifySWData();

    void createTrayIcon();
    void createActions();
    void createMenuBar();
    void createContent();
    void loadCertificateList();

    /** @brief Create a separator item for the certificate list.
     *
     * The item uses a SeparatorItemDelegate for layout and styling at the given
     * index.
     *
     * @param[in] text  The text for the item.
     * @param[in] index The index of the item.
     *
     * @return The new separator item.
     */
    QListWidgetItem* createSeparator(const QString &text, int index);

    /** @brief Create a certificate list item for the list.
     *
     * The item uses a CertificateItemDelegate for layout and styling.
     *
     * @param[in] text   The certificate to display.
     * @param[in] status The certificate status.
     * @param[in] index  The index of the item.
     *
     * @return The new separator item.
     */
    QListWidgetItem* createListItem(const Certificate &certificate,
        Certificate::Status status, int index);

    /* Are we running in tray mode ?*/
    const bool mTrayMode;
    /* The message currently shown at intervals */
    QString mCurMessage;
    QString mInstalledSWVersion;
    QString mInstalledListVersion;

    QSettings mSettings;

    QSystemTrayIcon *mTrayIcon;
    QTimer *mMessageTimer;
    QMenu *mTrayMenu;
    QAction *mCheckUpdates;
    QAction *mQuitAction;
    CurrentState mCurState;
    QMenuBar *mMenuBar;

    /* 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;

    QListWidget *mCertListWidget;

    QLabel *mSubjectCN;
    QLabel *mSubjectO;
    QLabel *mIssuerCN;
    QLabel *mIssuerO;
    QLabel *mValidFrom;
    QLabel *mValidTo;
    QLabel *mFingerprint;

    QLabel *mCurrentListDate;
    QLabel *mNewListDate;

    QCheckBox *mAutoUpdateOption;
    QCheckBox *mAutoStartOption;

    QPushButton *installButton;
    QPushButton *quitButton;
};

#endif // MAINWINDOW_H

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