view ui/main.cpp @ 1058:fe2c6666b462

(issue46) Add debug option to trustbridge client application
author Andre Heinecke <andre.heinecke@intevation.de>
date Tue, 09 Sep 2014 17:58:55 +0200
parents 561cc777e0b6
children 1e429faf7c84
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.
 */
#include "mainwindow.h"
#include "processhelp.h"
#include "logging.h"
#include "selftest.h"
#include "util.h"
#ifdef WIN32
#include "taskscheduler.h"
#endif

#include <QApplication>
#include <QFile>
#include <QtPlugin>
#include <QMessageBox>
#include <QSettings>
#include <QDebug>
#include <QTranslator>

#include <QStyleFactory>
#include <QFontDatabase>

#ifndef VERSION
#define VERSION "0.0.1"
#endif

#ifndef APPNAME
#define APPNAME "TrustBridge"
#endif

#ifndef STARTUP_FILE_NAME
#define STARTUP_FILE_NAME "trustbridge-tray-starter.cfg"
#endif

#ifndef ORGANIZATION
#define ORGANIZATION "BSI"
#endif

#define COPYRIGHT "Copyright (C) 2014 by Bundesamt für Sicherheit in der Informationstechnik \n" \
                  "Software engineering by Intevation GmbH \n\n" \
                  "This file is Free Software under the GNU GPL (v>=2)\n" \
                  "and comes with ABSOLUTELY NO WARRANTY!\n"

#ifdef Q_OS_WIN
 Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
#else
 Q_IMPORT_PLUGIN(QXcbIntegrationPlugin)
#endif

bool g_debug = false;
QtMessageHandler g_default_msg_handler = NULL;

void noDebugOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    if (type == QtDebugMsg) {
        return;
    }

    if (g_default_msg_handler) {
        (*g_default_msg_handler)(type, context, msg);
    }
}


int main(int argc, char **argv)
{
#ifdef WIN32
    /* First verify integrity even before calling QApplication.
     * We only do this on Windows as we have a PKCS#7 embedded
     * signature there which we check with OS methods.
     *
     * On GNU/Linux platforms you should use an IDS system to
     * monitor executable corruptions.
     */
    if (!selftest()) {
        syslog_error_printf ("Integrity check failed.");
#ifdef RELEASE_BUILD
        return -1;
#endif
    }
#endif

    QApplication app (argc, argv);

    QApplication::setQuitOnLastWindowClosed(false);
    QApplication::setOrganizationName(QString::fromLatin1(ORGANIZATION));
    QApplication::setApplicationName(QString::fromLatin1(APPNAME));
    QApplication::setApplicationVersion(QString::fromLatin1(VERSION));
    QSettings::setDefaultFormat(QSettings::IniFormat);
    QStringList arguments = QApplication::arguments();

    if (arguments.contains("--debug")) {
        g_debug = true;
    } else {
        g_debug = false;
        g_default_msg_handler = qInstallMessageHandler(noDebugOutput);
    }

    qDebug() << "Application style is: " << app.style()->metaObject()->className();
    qDebug() << "Available styles: " << QStyleFactory::keys().join(", ");
    qDebug() << "Font is: " << app.font();

    bool trayMode = arguments.contains("--tray");

    if (arguments.contains("--version")) {
        printf (APPNAME " Version: %s \n",
                QApplication::applicationVersion().toLocal8Bit().constData());
        printf (COPYRIGHT);
        return 0;
    }

    QSettings settings;
    settings.beginGroup("settings");
    bool autoStart = settings.value("autostart", true).toBool();
    settings.endGroup();

    if (trayMode && !autoStart) {
        return 0;
    }

    if (ProcessHelp::otherProcessesExist(APPNAME)) {
        qDebug() << "Another " << APPNAME << " process is already running. Exiting.";
        ProcessHelp::activateWindowForProcess(APPNAME);
        return 0;
    }

    QTranslator translator;
    if (QLocale::system().name() == "C") {
        /* Useful for testing / development as the primary target is german */
        translator.load(":/l10n/trustbridge_de_DE");
    } else {
        qDebug() << "Loading translations for: " << "trustbridge_" +
            QLocale::system().name();
        if (!translator.load(":/l10n/trustbridge_" + QLocale::system().name())) {
            qDebug() << "Failed.";
        }
    }
    app.installTranslator(&translator);
/*
    if ((!QSystemTrayIcon::isSystemTrayAvailable() ||
            !QSystemTrayIcon::supportsMessages()) && trayMode) {
        QMessageBox::critical(0, QString::fromLatin1(APPNAME),
                              QObject::tr("Couldn't detect any system tray "
                                          "on this system. This software can only "
                                          "be used in a desktop environment."));
        return 1;
    }
*/
#ifdef Q_OS_WIN
    {
        TaskScheduler taskSched;
        qDebug() << " task sched done: " << taskSched.createDailyTask(QCoreApplication::applicationFilePath(),
                QString::fromLatin1("--tray"), QTime::currentTime());
    }
#else
    /* Save the display on start so that it might later be used by the cron startup script. */
    QFile startup_file (settings.fileName().replace(APPNAME ".ini", STARTUP_FILE_NAME));
    startup_file.open(QIODevice::WriteOnly);
    startup_file.write(QString::fromLatin1("DISPLAY=%1\n").arg(qgetenv("DISPLAY").constData()).toUtf8());
    startup_file.close();
#endif

    /* Install static fonts */

    /* The putenv here works around a bug in qt (#29192). Qt thinks it is a fatal
     * error if the font directory does not exist. */
    qputenv("QT_QPA_FONTDIR", get_install_dir());
    int fontId = QFontDatabase::addApplicationFont(":/fonts/DejaVuSans.ttf");
    if (fontId != -1)
    {
        QFont font("DejaVuSans");
        font.setPointSize(9);
        app.setFont(font);
    }

    MainWindow mainWin(trayMode);

    return app.exec();
}

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