view ui/mainwindow.h @ 1082:a12e6172d82c

Extend logging to all choices and SW updates.
author Andre Heinecke <andre.heinecke@intevation.de>
date Thu, 11 Sep 2014 12:05:59 +0200
parents db831a204a6b
children 75a5bfe0525e
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 <QMainWindow>
#include <QSettings>
#include <QMenuBar>
#include <QListWidget>
#include <QTextEdit>
#include <QPushButton>
#include <QLabel>
#include <QCheckBox>
#include <QScrollArea>

#include "downloader.h"
#include "certificatelist.h"
#include "certificatelistwidget.h"
#include "textoverlaybutton.h"
#include "trayicon.h"
class QMenu;
class QAction;
class QTimer;
class QPushButton;


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 installerError(const QString& errMsg);
    void installerSuccess();
    void installCerts();
    void toggleInManual(bool state, const Certificate &cert);
    void removeFromManual(bool state, const Certificate &cert);

    void togglePages(int button);
    void toggleUpdatesNew();
    void toggleUpdatesRemove();
    void toggleUpdatesManual();

    /** Reflect change list states in the UI
     *
     * This slot should be called each time the contents or selection
     * state of one of the certificate lists change to update the
     * UI elements accordingly.
     *
     * @param[in] selected unused. */
    void listChanged(int selected);

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

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

    /** @brief log / store a successful downloader run
     *
     * A downloader run is successful if the finished signal
     * is emited and the state is not TransferError
     */
    void updateCheckSuccess();

    /** @brief open the manual in an external browser window
     */
    void showHelp();

    /** @brief open the proxy settings dialog */
    void showProxySettings();

protected:
    virtual void closeEvent(QCloseEvent *event);

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

    /** @brief show an error message
     *
     * This is a wrapper around QMessageBox to allow for central
     * styling of error messages.
     */
    void showErrorMessage(const QString &msg);

signals:
    /** @brief emits the changecount as a string when it changes */
    void changesChanged(const QString& cnt);

private:
    /** @brief the combined number of changes made in all lists */
    int changeCount();

    /** @brief use this to set the change count */
    void setChangeCount(int cnt);

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

    /** @brief UI setup */
    void setupGUI();

    /** @brief create and set up the info widget (accessible via button panel) */
    QWidget *createInfoWidget();
    /** @brief create and set up the updates widget (accessible via button panel) */
    QWidget *createUpdatesWidget();
    /** @brief create and set up the certifcates to install widget
     * (accessible via button panel) */
    QWidget *createInstallWidget();
    /** @brief create and set up the certifcates to remove widget
     * (accessible via button panel) */
    QWidget *createRemoveWidget();

    /** @brief true if the software is running in tray mode*/
    const bool mTrayMode;

    /** @brief The currently shown message */
    QString mCurMessage;
    /** @brief The version the Software thinks is installed */
    QString mInstalledSWVersion;
    /** @brief The certificate list the Software thinks is installed */
    QString mInstalledListVersion;

    QSettings mSettings;

    TrayIcon *mTrayIcon;
    QTimer *mMessageTimer;
    QMenu *mTrayMenu;
    QAction *mCheckUpdates;
    QAction *mQuitAction;
    CurrentState mCurState;
    QMenuBar *mMenuBar;
    QPushButton *mQuitButton;

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

    QLabel *mCurrentListDate;
    QLabel *mNewListDate;

    QButtonGroup *mButtonGroup;
    QWidget *mUpdatesWidget;
    QWidget *mInstallWidget;
    QWidget *mRemoveWidget;
    QWidget *mInfoWidget;

    QLabel *mUpdatesHeader;
    QLabel *mLastCertUpdate;
    QLabel *mLastCertUpdateContents;
    QLabel *mSoftwareVersionLabel;
    QLabel *mSoftwareVersionContents;
    QLabel *mLastUpdateCheck;
    QLabel *mLastUpdateCheckContents;
    QLabel *mUpdatesNewCertificates;
    QLabel *mUpdatesRemoveCertificates;
    QLabel *mUpdatesManualCertificates;
    QLabel *mUpdatesTip;

    /* These are a bit of a pattern break, they should
     * be accessed over the according page widgets.
     *
     * They are initialized in the create*widget functions.*/
    CertificateListWidget *mUpdatesNew;
    CertificateListWidget *mUpdatesRemove;
    CertificateListWidget *mUpdatesManual;
    CertificateListWidget *mInstallList;
    CertificateListWidget *mRemoveList;

    QPushButton *mUpdatesDetailsNew;
    QPushButton *mUpdatesDetailsRemove;
    QPushButton *mUpdatesDetailsManual;

    QPushButton *mInstallButton;
    int mChangeCount;
};

#endif // MAINWINDOW_H

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