Skip to content
Snippets Groups Projects
main.cpp 2.43 KiB
Newer Older
akiraohgaki's avatar
akiraohgaki committed
#include <QStringList>
akiraohgaki's avatar
akiraohgaki committed
#include <QJsonObject>
akiraohgaki's avatar
akiraohgaki committed
#include <QTranslator>
#include <QLocale>
akiraohgaki's avatar
akiraohgaki committed
#include <QCommandLineParser>
akiraohgaki's avatar
akiraohgaki committed
#include <QCommandLineOption>
akiraohgaki's avatar
akiraohgaki committed
#include <QGuiApplication>
akiraohgaki's avatar
akiraohgaki committed
#include <QIcon>
akiraohgaki's avatar
akiraohgaki committed
#include <QDebug>
akiraohgaki's avatar
akiraohgaki committed

#include "handlers/confighandler.h"
akiraohgaki's avatar
akiraohgaki committed
#include "websockets/websocketserver.h"
akiraohgaki's avatar
akiraohgaki committed

int main(int argc, char *argv[])
{
    // Init
akiraohgaki's avatar
akiraohgaki committed
    QGuiApplication app(argc, argv); // This is backend program, but need GUI module

    auto appDirPath = app.applicationDirPath();
akiraohgaki's avatar
akiraohgaki committed
    auto envPath = appDirPath + ":" + appDirPath + "/usr/bin:" + QString::fromLocal8Bit(qgetenv("PATH").constData());
akiraohgaki's avatar
akiraohgaki committed
    qputenv("PATH", envPath.toUtf8().constData());

akiraohgaki's avatar
akiraohgaki committed
    qInfo() << QString::fromLocal8Bit(qgetenv("PATH").constData());
akiraohgaki's avatar
akiraohgaki committed

akiraohgaki's avatar
akiraohgaki committed
    auto *configHandler = new ConfigHandler(&app);
akiraohgaki's avatar
akiraohgaki committed
    auto appConfigApplication = configHandler->getAppConfigApplication();
akiraohgaki's avatar
akiraohgaki committed

    app.setApplicationName(appConfigApplication["name"].toString());
    app.setApplicationVersion(appConfigApplication["version"].toString());
    app.setOrganizationName(appConfigApplication["organization"].toString());
    app.setOrganizationDomain(appConfigApplication["domain"].toString());
akiraohgaki's avatar
akiraohgaki committed
    app.setWindowIcon(QIcon::fromTheme(appConfigApplication["id"].toString(), QIcon(appConfigApplication["icon"].toString())));
akiraohgaki's avatar
akiraohgaki committed

    // Setup translator
akiraohgaki's avatar
akiraohgaki committed
    QTranslator translator;
    if (translator.load(QLocale(), "messages", ".", ":/i18n")) {
        app.installTranslator(&translator);
    }
akiraohgaki's avatar
akiraohgaki committed

    // Setup CLI
    QCommandLineParser clParser;
    clParser.setApplicationDescription(appConfigApplication["description"].toString());
    clParser.addHelpOption();
    clParser.addVersionOption();
akiraohgaki's avatar
akiraohgaki committed

    // Port 49152-61000 will available as ephemeral port
    // https://en.wikipedia.org/wiki/Ephemeral_port
    QCommandLineOption clOptionPort(QStringList() << "p" << "port", "Port for websocket server [default: 49152].", "port", "49152");
    clParser.addOption(clOptionPort);

akiraohgaki's avatar
akiraohgaki committed
    clParser.process(app);

akiraohgaki's avatar
akiraohgaki committed
    auto port = clParser.value(clOptionPort).toInt();
akiraohgaki's avatar
akiraohgaki committed

akiraohgaki's avatar
akiraohgaki committed
    // Setup websocket server
akiraohgaki's avatar
akiraohgaki committed
    auto *wsServer = new WebSocketServer(configHandler, appConfigApplication["id"].toString(), port, &app);
akiraohgaki's avatar
akiraohgaki committed
    QObject::connect(wsServer, &WebSocketServer::stopped, &app, &QGuiApplication::quit);
akiraohgaki's avatar
akiraohgaki committed

akiraohgaki's avatar
akiraohgaki committed
    if (wsServer->start()) {
akiraohgaki's avatar
akiraohgaki committed
        qInfo() << "Websocket server started at:" << wsServer->serverUrl().toString();
akiraohgaki's avatar
akiraohgaki committed
    }
    else {
akiraohgaki's avatar
akiraohgaki committed
        qCritical() << "Failed to start websocket server:" << wsServer->errorString();
akiraohgaki's avatar
akiraohgaki committed
        return 1;
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    return app.exec();
}