Files
DefaultVPN/client/main.cpp

237 lines
7.9 KiB
C++
Raw Normal View History

2020-11-23 16:20:25 +03:00
#include <QApplication>
#include <QFontDatabase>
#include <QCommandLineParser>
#include <QMessageBox>
#include <QTranslator>
2021-03-06 14:59:55 +03:00
#include <QTimer>
#include <QLoggingCategory>
2021-07-28 16:13:29 +07:00
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "ui/uilogic.h"
2021-08-09 00:41:52 +07:00
#include <QDebug>
2020-11-23 16:20:25 +03:00
2021-09-03 20:17:13 +03:00
#include "ui/pages.h"
#include "ui/pages_logic/AppSettingsLogic.h"
#include "ui/pages_logic/GeneralSettingsLogic.h"
#include "ui/pages_logic/NetworkSettingsLogic.h"
#include "ui/pages_logic/NewServerProtocolsLogic.h"
2021-12-20 02:29:23 +03:00
#include "ui/pages_logic/QrDecoderLogic.h"
#include "ui/pages_logic/ServerConfiguringProgressLogic.h"
2021-09-07 21:01:56 +03:00
#include "ui/pages_logic/ServerContainersLogic.h"
2021-09-03 20:17:13 +03:00
#include "ui/pages_logic/ServerListLogic.h"
#include "ui/pages_logic/ServerSettingsLogic.h"
2021-09-07 19:26:58 +03:00
#include "ui/pages_logic/ServerContainersLogic.h"
2021-09-03 20:17:13 +03:00
#include "ui/pages_logic/ShareConnectionLogic.h"
#include "ui/pages_logic/SitesLogic.h"
2021-09-04 12:53:58 +03:00
#include "ui/pages_logic/StartPageLogic.h"
2021-09-03 20:17:13 +03:00
#include "ui/pages_logic/VpnLogic.h"
#include "ui/pages_logic/WizardLogic.h"
2021-09-06 13:41:45 +03:00
#include "ui/pages_logic/protocols/CloakLogic.h"
#include "ui/pages_logic/protocols/OpenVpnLogic.h"
#include "ui/pages_logic/protocols/ShadowSocksLogic.h"
#include "ui/uilogic.h"
2021-09-03 20:17:13 +03:00
2021-12-20 02:29:23 +03:00
#include "QZXing.h"
2020-12-04 00:45:21 +03:00
#include "debug.h"
#include "defines.h"
2021-08-19 01:51:02 +03:00
2021-08-08 18:10:09 +03:00
#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS)
2021-07-28 16:13:29 +07:00
#define QAPPLICATION_CLASS QGuiApplication
2021-02-24 13:38:23 -08:00
#include "singleapplication.h"
2021-07-28 16:13:29 +07:00
#undef QAPPLICATION_CLASS
2021-08-08 18:10:09 +03:00
#endif
2020-11-23 16:20:25 +03:00
2021-02-24 23:40:57 +03:00
#ifdef Q_OS_WIN
#include "Windows.h"
#endif
2021-12-20 02:29:23 +03:00
#if defined(Q_OS_ANDROID)
#include "native.h"
#endif
2020-12-26 15:03:51 +03:00
static void loadTranslator()
{
QTranslator* translator = new QTranslator;
if (translator->load(QLocale(), QString("amneziavpn"), QLatin1String("_"), QLatin1String(":/translations"))) {
qApp->installTranslator(translator);
}
}
2020-11-23 16:20:25 +03:00
int main(int argc, char *argv[])
{
QLoggingCategory::setFilterRules(QStringLiteral("qtc.ssh=false"));
2020-11-23 16:20:25 +03:00
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true);
2021-02-24 23:40:57 +03:00
#ifdef Q_OS_WIN
AllowSetForegroundWindow(ASFW_ANY);
#endif
2021-08-08 18:10:09 +03:00
#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS)
2021-03-06 14:59:55 +03:00
SingleApplication app(argc, argv, true, SingleApplication::Mode::User | SingleApplication::Mode::SecondaryNotification);
2021-02-24 23:40:57 +03:00
2021-03-06 14:59:55 +03:00
if (!app.isPrimary()) {
QTimer::singleShot(1000, &app, [&](){
app.quit();
});
return app.exec();
}
2021-08-08 18:10:09 +03:00
#else
QApplication app(argc, argv);
#endif
2021-12-20 02:29:23 +03:00
2021-02-24 23:40:57 +03:00
#ifdef Q_OS_WIN
AllowSetForegroundWindow(0);
#endif
2020-11-23 16:20:25 +03:00
2022-01-30 17:35:57 +03:00
#if defined(Q_OS_ANDROID)
NativeHelpers::registerApplicationInstance(&app);
#endif
2020-12-26 15:03:51 +03:00
loadTranslator();
2020-11-23 16:20:25 +03:00
QFontDatabase::addApplicationFont(":/fonts/Lato-Black.ttf");
QFontDatabase::addApplicationFont(":/fonts/Lato-BlackItalic.ttf");
QFontDatabase::addApplicationFont(":/fonts/Lato-Bold.ttf");
QFontDatabase::addApplicationFont(":/fonts/Lato-BoldItalic.ttf");
QFontDatabase::addApplicationFont(":/fonts/Lato-Italic.ttf");
QFontDatabase::addApplicationFont(":/fonts/Lato-Light.ttf");
QFontDatabase::addApplicationFont(":/fonts/Lato-LightItalic.ttf");
QFontDatabase::addApplicationFont(":/fonts/Lato-Regular.ttf");
QFontDatabase::addApplicationFont(":/fonts/Lato-Thin.ttf");
QFontDatabase::addApplicationFont(":/fonts/Lato-ThinItalic.ttf");
2020-12-04 00:45:21 +03:00
app.setApplicationName(APPLICATION_NAME);
app.setOrganizationName(ORGANIZATION_NAME);
app.setApplicationDisplayName(APPLICATION_NAME);
2020-11-23 16:20:25 +03:00
QCommandLineParser parser;
2020-12-04 00:45:21 +03:00
parser.setApplicationDescription(APPLICATION_NAME);
2020-11-23 16:20:25 +03:00
parser.addHelpOption();
parser.addVersionOption();
2021-05-11 17:04:04 +03:00
QCommandLineOption c_autostart {{"a", "autostart"}, "System autostart"};
parser.addOption(c_autostart);
2022-01-30 17:35:57 +03:00
QCommandLineOption c_cleanup {{"c", "cleanup"}, "Cleanup logs"};
parser.addOption(c_cleanup);
2021-05-11 17:04:04 +03:00
parser.process(app);
2022-01-30 17:35:57 +03:00
if (parser.isSet(c_cleanup)) {
Debug::cleanUp();
QTimer::singleShot(100,[&app]{
app.quit();
});
app.exec();
return 0;
}
Settings settings;
if (settings.isSaveLogs()) {
if (!Debug::init()) {
qWarning() << "Initialization of debug subsystem failed";
}
2020-11-23 16:20:25 +03:00
}
2021-01-09 19:55:16 +03:00
app.setQuitOnLastWindowClosed(false);
2021-12-20 02:29:23 +03:00
QZXing::registerQMLTypes();
2021-11-30 21:51:06 +03:00
qRegisterMetaType<VpnProtocol::VpnConnectionState>("VpnProtocol::VpnConnectionState");
qRegisterMetaType<ServerCredentials>("ServerCredentials");
2021-09-19 14:31:38 +03:00
qRegisterMetaType<DockerContainer>("DockerContainer");
2021-09-20 21:51:28 +03:00
qRegisterMetaType<TransportProto>("TransportProto");
2021-11-30 21:51:06 +03:00
qRegisterMetaType<Proto>("Proto");
2021-09-20 21:51:28 +03:00
qRegisterMetaType<ServiceType>("ServiceType");
2021-09-19 14:31:38 +03:00
qRegisterMetaType<Page>("Page");
qRegisterMetaType<VpnProtocol::VpnConnectionState>("ConnectionState");
2021-09-16 16:19:14 +03:00
2021-09-16 19:49:50 +03:00
qRegisterMetaType<PageProtocolLogicBase *>("PageProtocolLogicBase *");
2021-09-03 20:17:13 +03:00
UiLogic *uiLogic = new UiLogic;
QQmlApplicationEngine *engine = new QQmlApplicationEngine;
2021-09-16 16:19:14 +03:00
2021-09-16 19:49:50 +03:00
declareQmlPageEnum();
2021-09-16 16:19:14 +03:00
declareQmlProtocolEnum();
2021-09-16 19:49:50 +03:00
declareQmlContainerEnum();
2021-09-16 16:19:14 +03:00
2021-11-06 13:47:52 +03:00
qmlRegisterType<PageType>("PageType", 1, 0, "PageType");
2021-09-20 21:51:28 +03:00
QScopedPointer<ContainerProps> containerProps(new ContainerProps);
qmlRegisterSingletonInstance("ContainerProps", 1, 0, "ContainerProps", containerProps.get());
QScopedPointer<ProtocolProps> protocolProps(new ProtocolProps);
qmlRegisterSingletonInstance("ProtocolProps", 1, 0, "ProtocolProps", protocolProps.get());
2021-07-28 16:13:29 +07:00
const QUrl url(QStringLiteral("qrc:/ui/qml/main.qml"));
QObject::connect(engine, &QQmlApplicationEngine::objectCreated,
2021-07-28 16:13:29 +07:00
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
2021-09-03 20:17:13 +03:00
2022-02-04 17:49:48 +03:00
engine->rootContext()->setContextProperty("Debug", &Debug::Instance());
engine->rootContext()->setContextProperty("UiLogic", uiLogic);
engine->rootContext()->setContextProperty("AppSettingsLogic", uiLogic->appSettingsLogic());
engine->rootContext()->setContextProperty("GeneralSettingsLogic", uiLogic->generalSettingsLogic());
engine->rootContext()->setContextProperty("NetworkSettingsLogic", uiLogic->networkSettingsLogic());
engine->rootContext()->setContextProperty("NewServerProtocolsLogic", uiLogic->newServerProtocolsLogic());
2021-12-20 02:29:23 +03:00
engine->rootContext()->setContextProperty("QrDecoderLogic", uiLogic->qrDecoderLogic());
engine->rootContext()->setContextProperty("ServerConfiguringProgressLogic", uiLogic->serverConfiguringProgressLogic());
engine->rootContext()->setContextProperty("ServerListLogic", uiLogic->serverListLogic());
engine->rootContext()->setContextProperty("ServerSettingsLogic", uiLogic->serverSettingsLogic());
engine->rootContext()->setContextProperty("ServerContainersLogic", uiLogic->serverprotocolsLogic());
engine->rootContext()->setContextProperty("ShareConnectionLogic", uiLogic->shareConnectionLogic());
engine->rootContext()->setContextProperty("SitesLogic", uiLogic->sitesLogic());
engine->rootContext()->setContextProperty("StartPageLogic", uiLogic->startPageLogic());
engine->rootContext()->setContextProperty("VpnLogic", uiLogic->vpnLogic());
engine->rootContext()->setContextProperty("WizardLogic", uiLogic->wizardLogic());
engine->load(url);
QObject::connect(&app, &QCoreApplication::aboutToQuit, uiLogic, [&engine, uiLogic](){
QObject::disconnect(engine, 0,0,0);
delete engine;
QObject::disconnect(uiLogic, 0,0,0);
delete uiLogic;
});
2021-02-24 23:40:57 +03:00
2021-11-17 20:24:45 +03:00
if (engine->rootObjects().size() > 0) {
uiLogic->setQmlRoot(engine->rootObjects().at(0));
}
2022-01-23 19:16:40 +03:00
#ifdef Q_OS_WIN
if (parser.isSet("a")) uiLogic->showOnStartup();
else emit uiLogic->show();
#else
uiLogic->showOnStartup();
#endif
2021-08-19 01:51:02 +03:00
2022-01-30 17:35:57 +03:00
// TODO - fix
#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS)
if (app.isPrimary()) {
QObject::connect(&app, &SingleApplication::instanceStarted, uiLogic, [&](){
qDebug() << "Secondary instance started, showing this window instead";
emit uiLogic->show();
emit uiLogic->raise();
});
}
#endif
2021-02-24 23:40:57 +03:00
2020-11-23 16:20:25 +03:00
return app.exec();
}