view ui/mainwindow.h @ 502:e551de11d8b6

Properly handle the case that the file does not exist. TRUNCATE makes create file fail if the file does not exist but we need TRUNCATE in the case that the file already exists
author Andre Heinecke <aheinecke@intevation.de>
date Mon, 28 Apr 2014 09:18:07 +0000
parents fa56a9403939
children 3edbe1af2c85
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,
        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 showSettings();
    void showStatus();
    void showHelp();
    void showAbout();
    void showDetails(QListWidgetItem*);
    void resizeButtons();
    void installerError(const QString& errMsg);
    void installerSuccess();
    void installCerts();
    void newSWAvailable(const QString& fileName, const QDateTime& modDate);

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

    void lookUpDateForVersion();
    void setLastModifiedDate(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();

    void closeApp();

private:
    /** @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. It also initializes mListToInstall
     * and mInstalledList.
     */
    void verifyAvailableData();
    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 *mSubjectOU;
    QLabel *mIssuerCN;
    QLabel *mIssuerOU;
    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/