Files
amnezia-client/client/main.cpp
T

108 lines
2.9 KiB
C++
Raw Normal View History

2026-05-13 17:41:26 +03:00
#include <QByteArray>
#include <QCoreApplication>
2021-08-09 00:41:52 +07:00
#include <QDebug>
2023-06-30 00:21:56 +01:00
#include <QTimer>
2020-11-23 16:20:25 +03:00
#include "amneziaApplication.h"
#include "core/utils/osSignalHandler.h"
#include "core/utils/migrations.h"
2023-08-09 18:17:29 +05:00
#include "version.h"
2021-08-19 01:51:02 +03:00
2026-05-13 17:41:26 +03:00
#include <QLocalSocket>
2021-02-24 23:40:57 +03:00
#ifdef Q_OS_WIN
2023-08-09 18:17:29 +05:00
#include "Windows.h"
2021-02-24 23:40:57 +03:00
#endif
2022-07-11 16:08:57 +06:00
#if defined(Q_OS_IOS)
2023-08-09 18:17:29 +05:00
#include "platforms/ios/QtAppDelegate-C-Interface.h"
2022-07-11 16:08:57 +06:00
#endif
#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS) && !defined(MACOS_NE)
2026-05-13 17:41:26 +03:00
namespace {
QString findVpnDeepLinkInArguments(const QStringList &args)
{
for (const QString &arg : args) {
const QString t = arg.trimmed();
if (t.startsWith(QLatin1String("vpn://"), Qt::CaseInsensitive)) {
return t;
}
}
return {};
}
bool notifyRunningInstanceOrExit(AmneziaApplication &app, const QString &vpnPayload)
{
QLocalSocket socket;
2026-05-13 17:41:26 +03:00
socket.connectToServer(QStringLiteral("AmneziaVPNInstance"));
if (!socket.waitForConnected(500)) {
return false;
}
qWarning() << "AmneziaVPN is already running";
if (!vpnPayload.isEmpty()) {
const QByteArray msg = QByteArrayLiteral("VPN\n") + vpnPayload.toUtf8() + '\n';
socket.write(msg);
socket.waitForBytesWritten(3000);
}
2026-05-13 17:41:26 +03:00
socket.flush();
QTimer::singleShot(1000, &app, [&app]() { app.quit(); });
return true;
}
2026-05-13 17:41:26 +03:00
} // namespace
#endif
2026-05-13 17:41:26 +03:00
// Desktop (non-NE): single-instance IPC forwards vpn:// to the running process. MACOS_NE has no IPC here;
// deep links use argv / QFileOpenEvent after registration in the app bundle Info.plist.
2020-11-23 16:20:25 +03:00
int main(int argc, char *argv[])
{
Migrations migrationsManager;
migrationsManager.doMigrations();
2021-02-24 23:40:57 +03:00
#ifdef Q_OS_WIN
AllowSetForegroundWindow(ASFW_ANY);
#endif
2023-10-08 20:08:32 +03:00
#ifdef Q_OS_ANDROID
// QTBUG-95974 QTBUG-95764 QTBUG-102168
2023-10-08 20:08:32 +03:00
qputenv("QT_ANDROID_DISABLE_ACCESSIBILITY", "1");
2024-04-14 14:07:26 +03:00
qputenv("ANDROID_OPENSSL_SUFFIX", "_3");
2023-10-08 20:08:32 +03:00
#endif
2022-08-25 12:47:02 +03:00
AmneziaApplication app(argc, argv);
2025-12-01 10:45:06 +08:00
OsSignalHandler::setup();
2021-02-24 23:40:57 +03:00
#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS) && !defined(MACOS_NE)
2026-05-13 17:41:26 +03:00
const QString vpnFromArgv = findVpnDeepLinkInArguments(QCoreApplication::arguments());
if (notifyRunningInstanceOrExit(app, vpnFromArgv)) {
2021-03-06 14:59:55 +03:00
return app.exec();
}
app.startLocalServer();
2021-08-08 18:10:09 +03:00
#endif
2022-08-25 12:47:02 +03:00
// Allow to raise app window if secondary instance launched
2021-02-24 23:40:57 +03:00
#ifdef Q_OS_WIN
AllowSetForegroundWindow(0);
#endif
2020-11-23 16:20:25 +03:00
2022-08-25 12:47:02 +03:00
app.registerTypes();
2020-11-23 16:20:25 +03:00
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
2022-08-25 12:47:02 +03:00
app.loadFonts();
2021-10-26 12:59:20 +03:00
2022-08-31 16:54:46 +03:00
bool doExec = app.parseCommands();
2021-02-24 23:40:57 +03:00
2022-08-31 16:54:46 +03:00
if (doExec) {
app.init();
2023-08-09 18:17:29 +05:00
2024-03-09 00:21:57 +03:00
qInfo().noquote() << QString("Started %1 version %2 %3").arg(APPLICATION_NAME, APP_VERSION, GIT_COMMIT_HASH);
2023-08-09 18:17:29 +05:00
qInfo().noquote() << QString("%1 (%2)").arg(QSysInfo::prettyProductName(), QSysInfo::currentCpuArchitecture());
2022-08-31 16:54:46 +03:00
return app.exec();
}
return 0;
2020-11-23 16:20:25 +03:00
}