2014-07-07 00:19:45 +08:00
|
|
|
/*
|
2019-06-24 22:01:18 +08:00
|
|
|
Copyright © 2014-2019 by The qTox Project Contributors
|
2015-06-06 09:40:08 +08:00
|
|
|
|
2014-07-07 00:19:45 +08:00
|
|
|
This file is part of qTox, a Qt-based graphical interface for Tox.
|
|
|
|
|
2015-06-06 09:40:08 +08:00
|
|
|
qTox is libre software: you can redistribute it and/or modify
|
2014-07-07 00:19:45 +08:00
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
2015-06-06 09:40:08 +08:00
|
|
|
|
|
|
|
qTox is distributed in the hope that it will be useful,
|
2014-07-07 00:19:45 +08:00
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
2015-06-06 09:40:08 +08:00
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
2014-07-07 00:19:45 +08:00
|
|
|
|
2015-06-06 09:40:08 +08:00
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with qTox. If not, see <http://www.gnu.org/licenses/>.
|
2014-07-07 00:19:45 +08:00
|
|
|
*/
|
|
|
|
|
2020-04-30 02:06:41 +08:00
|
|
|
#include "audio/audio.h"
|
2016-12-19 10:26:26 +08:00
|
|
|
#include "src/ipc.h"
|
2017-02-26 19:52:45 +08:00
|
|
|
#include "src/net/toxuri.h"
|
|
|
|
#include "src/nexus.h"
|
2016-12-19 10:26:26 +08:00
|
|
|
#include "src/persistence/profile.h"
|
2019-05-19 01:08:58 +08:00
|
|
|
#include "src/persistence/settings.h"
|
2017-02-26 19:52:45 +08:00
|
|
|
#include "src/persistence/toxsave.h"
|
|
|
|
#include "src/video/camerasource.h"
|
2016-12-19 10:26:26 +08:00
|
|
|
#include "src/widget/loginscreen.h"
|
|
|
|
#include "src/widget/translator.h"
|
2022-03-13 21:04:24 +08:00
|
|
|
#include "src/widget/tool/messageboxmanager.h"
|
2017-02-26 19:52:45 +08:00
|
|
|
#include "widget/widget.h"
|
2014-06-25 04:11:11 +08:00
|
|
|
#include <QApplication>
|
2014-11-12 07:58:20 +08:00
|
|
|
#include <QCommandLineParser>
|
|
|
|
#include <QDateTime>
|
2014-09-11 21:44:34 +08:00
|
|
|
#include <QDebug>
|
2016-01-21 08:32:24 +08:00
|
|
|
#include <QDir>
|
2014-11-12 07:58:20 +08:00
|
|
|
#include <QFile>
|
|
|
|
#include <QFontDatabase>
|
2017-02-26 19:52:45 +08:00
|
|
|
#include <QMutex>
|
2014-11-07 12:53:05 +08:00
|
|
|
#include <QMutexLocker>
|
2014-11-01 13:27:10 +08:00
|
|
|
|
2019-08-13 05:07:34 +08:00
|
|
|
#include <QtWidgets/QMessageBox>
|
2017-06-01 15:50:59 +08:00
|
|
|
#include <ctime>
|
2016-03-25 21:29:48 +08:00
|
|
|
#include <stdio.h>
|
2015-03-04 11:23:54 +08:00
|
|
|
|
2017-08-19 20:35:54 +08:00
|
|
|
#if defined(Q_OS_UNIX)
|
|
|
|
#include "platform/posixsignalnotifier.h"
|
|
|
|
#endif
|
|
|
|
|
2022-03-11 18:18:35 +08:00
|
|
|
namespace {
|
2014-11-01 13:27:10 +08:00
|
|
|
#ifdef LOG_TO_FILE
|
2022-03-11 18:18:35 +08:00
|
|
|
QAtomicPointer<FILE> logFileFile = nullptr;
|
|
|
|
QList<QByteArray>* logBuffer =
|
2017-02-26 19:52:45 +08:00
|
|
|
new QList<QByteArray>(); // Store log messages until log file opened
|
2016-03-26 06:25:30 +08:00
|
|
|
QMutex* logBufferMutex = new QMutex();
|
2015-05-10 22:08:09 +08:00
|
|
|
#endif
|
2014-11-01 13:27:10 +08:00
|
|
|
|
2022-03-11 21:53:16 +08:00
|
|
|
std::unique_ptr<Settings> settings;
|
|
|
|
std::unique_ptr<ToxSave> toxSave;
|
2022-03-13 21:04:24 +08:00
|
|
|
std::unique_ptr<MessageBoxManager> messageBoxManager;
|
2022-03-11 21:53:16 +08:00
|
|
|
|
2017-06-18 19:35:31 +08:00
|
|
|
void cleanup()
|
|
|
|
{
|
2018-09-13 09:38:15 +08:00
|
|
|
// force save early even though destruction saves, because Windows OS will
|
|
|
|
// close qTox before cleanup() is finished if logging out or shutting down,
|
|
|
|
// once the top level window has exited, which occurs in ~Widget within
|
|
|
|
// ~Nexus. Re-ordering Nexus destruction is not trivial.
|
2022-03-11 21:53:16 +08:00
|
|
|
if (settings) {
|
|
|
|
settings->saveGlobal();
|
|
|
|
settings->savePersonal();
|
|
|
|
settings->sync();
|
|
|
|
}
|
2018-09-13 09:38:15 +08:00
|
|
|
|
2017-06-18 19:35:31 +08:00
|
|
|
Nexus::destroyInstance();
|
2022-03-11 21:53:16 +08:00
|
|
|
settings.reset();
|
2017-06-18 19:35:31 +08:00
|
|
|
qDebug() << "Cleanup success";
|
|
|
|
|
|
|
|
#ifdef LOG_TO_FILE
|
2019-09-25 18:23:37 +08:00
|
|
|
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
|
|
|
|
FILE* f = logFileFile.loadRelaxed();
|
|
|
|
#else
|
2017-06-18 19:35:31 +08:00
|
|
|
FILE* f = logFileFile.load();
|
2019-09-25 18:23:37 +08:00
|
|
|
#endif
|
2019-06-28 16:41:36 +08:00
|
|
|
if (f != nullptr) {
|
|
|
|
fclose(f);
|
2019-09-25 18:23:37 +08:00
|
|
|
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
|
|
|
|
logFileFile.storeRelaxed(nullptr); // atomically disable logging to file
|
|
|
|
#else
|
2019-06-28 16:41:36 +08:00
|
|
|
logFileFile.store(nullptr); // atomically disable logging to file
|
2019-09-25 18:23:37 +08:00
|
|
|
#endif
|
2019-06-28 16:41:36 +08:00
|
|
|
}
|
2017-06-18 19:35:31 +08:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2015-05-10 22:08:09 +08:00
|
|
|
void logMessageHandler(QtMsgType type, const QMessageLogContext& ctxt, const QString& msg)
|
2014-11-01 13:27:10 +08:00
|
|
|
{
|
2014-11-02 21:17:50 +08:00
|
|
|
// Silence qWarning spam due to bug in QTextBrowser (trying to open a file for base64 images)
|
2022-04-03 16:17:08 +08:00
|
|
|
if (QString::fromUtf8(ctxt.function) == QString("virtual bool QFSFileEngine::open(QIODevice::OpenMode)")
|
2022-03-06 22:49:14 +08:00
|
|
|
&& msg == QString("QFSFileEngine::open: No file name specified")) {
|
2014-11-02 21:17:50 +08:00
|
|
|
return;
|
2022-03-06 22:49:14 +08:00
|
|
|
}
|
|
|
|
if (msg.startsWith("Unable to find any suggestion for")) {
|
|
|
|
// Prevent sonnet's complaints from leaking user chat messages to logs
|
|
|
|
return;
|
|
|
|
}
|
2014-11-02 21:17:50 +08:00
|
|
|
|
2022-03-08 15:30:02 +08:00
|
|
|
if (msg == QString("attempted to send message with network family 10 (probably IPv6) on IPv4 socket")) {
|
|
|
|
// non-stop c-toxcore spam for IPv4 users: https://github.com/TokTok/c-toxcore/issues/1432
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-05-29 11:59:55 +08:00
|
|
|
QRegExp snoreFilter{QStringLiteral("Snore::Notification.*was already closed")};
|
|
|
|
if (type == QtWarningMsg
|
|
|
|
&& msg.contains(snoreFilter))
|
|
|
|
{
|
|
|
|
// snorenotify logs this when we call requestCloseNotification correctly. The behaviour still works, so we'll
|
|
|
|
// just mask the warning for now. The issue has been reported upstream:
|
|
|
|
// https://github.com/qTox/qTox/pull/6073#pullrequestreview-420748519
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-04-03 16:17:08 +08:00
|
|
|
QString file = QString::fromUtf8(ctxt.file);
|
2016-09-05 00:17:44 +08:00
|
|
|
// We're not using QT_MESSAGELOG_FILE here, because that can be 0, NULL, or
|
|
|
|
// nullptr in release builds.
|
|
|
|
QString path = QString(__FILE__);
|
|
|
|
path = path.left(path.lastIndexOf('/') + 1);
|
2017-02-26 19:52:45 +08:00
|
|
|
if (file.startsWith(path)) {
|
2016-09-05 00:17:44 +08:00
|
|
|
file = file.mid(path.length());
|
|
|
|
}
|
|
|
|
|
2016-07-26 06:47:44 +08:00
|
|
|
// Time should be in UTC to save user privacy on log sharing
|
|
|
|
QTime time = QDateTime::currentDateTime().toUTC().time();
|
2017-02-26 19:52:45 +08:00
|
|
|
QString LogMsg =
|
|
|
|
QString("[%1 UTC] %2:%3 : ").arg(time.toString("HH:mm:ss.zzz")).arg(file).arg(ctxt.line);
|
|
|
|
switch (type) {
|
|
|
|
case QtDebugMsg:
|
|
|
|
LogMsg += "Debug";
|
|
|
|
break;
|
2019-01-08 13:46:30 +08:00
|
|
|
case QtInfoMsg:
|
|
|
|
LogMsg += "Info";
|
|
|
|
break;
|
2017-02-26 19:52:45 +08:00
|
|
|
case QtWarningMsg:
|
|
|
|
LogMsg += "Warning";
|
|
|
|
break;
|
|
|
|
case QtCriticalMsg:
|
|
|
|
LogMsg += "Critical";
|
|
|
|
break;
|
|
|
|
case QtFatalMsg:
|
|
|
|
LogMsg += "Fatal";
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
2015-05-10 22:08:09 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
LogMsg += ": " + msg + "\n";
|
2016-03-25 21:29:48 +08:00
|
|
|
QByteArray LogMsgBytes = LogMsg.toUtf8();
|
|
|
|
fwrite(LogMsgBytes.constData(), 1, LogMsgBytes.size(), stderr);
|
2015-05-10 22:08:09 +08:00
|
|
|
|
|
|
|
#ifdef LOG_TO_FILE
|
2019-09-25 18:23:37 +08:00
|
|
|
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
|
|
|
|
FILE* logFilePtr = logFileFile.loadRelaxed(); // atomically load the file pointer
|
|
|
|
#else
|
2017-02-26 19:52:45 +08:00
|
|
|
FILE* logFilePtr = logFileFile.load(); // atomically load the file pointer
|
2019-09-25 18:23:37 +08:00
|
|
|
#endif
|
2017-02-26 19:52:45 +08:00
|
|
|
if (!logFilePtr) {
|
2016-03-26 06:25:30 +08:00
|
|
|
logBufferMutex->lock();
|
2016-06-29 03:42:49 +08:00
|
|
|
if (logBuffer)
|
2016-03-26 06:25:30 +08:00
|
|
|
logBuffer->append(LogMsgBytes);
|
2016-06-29 03:42:49 +08:00
|
|
|
|
2016-03-26 06:25:30 +08:00
|
|
|
logBufferMutex->unlock();
|
2017-02-26 19:52:45 +08:00
|
|
|
} else {
|
2016-03-26 06:25:30 +08:00
|
|
|
logBufferMutex->lock();
|
2017-02-26 19:52:45 +08:00
|
|
|
if (logBuffer) {
|
2016-03-26 06:25:30 +08:00
|
|
|
// empty logBuffer to file
|
2022-03-11 13:17:14 +08:00
|
|
|
foreach (QByteArray bufferedMsg, *logBuffer)
|
|
|
|
fwrite(bufferedMsg.constData(), 1, bufferedMsg.size(), logFilePtr);
|
2016-03-26 06:25:30 +08:00
|
|
|
|
2017-02-26 19:52:45 +08:00
|
|
|
delete logBuffer; // no longer needed
|
2016-03-26 06:25:30 +08:00
|
|
|
logBuffer = nullptr;
|
|
|
|
}
|
|
|
|
logBufferMutex->unlock();
|
|
|
|
|
|
|
|
fwrite(LogMsgBytes.constData(), 1, LogMsgBytes.size(), logFilePtr);
|
|
|
|
fflush(logFilePtr);
|
|
|
|
}
|
2014-11-01 13:27:10 +08:00
|
|
|
#endif
|
2015-05-10 22:08:09 +08:00
|
|
|
}
|
2014-06-25 04:11:11 +08:00
|
|
|
|
2022-03-11 18:18:35 +08:00
|
|
|
std::unique_ptr<ToxURIDialog> uriDialog;
|
2020-06-20 02:46:31 +08:00
|
|
|
|
2022-03-11 21:53:16 +08:00
|
|
|
bool toxURIEventHandler(const QByteArray& eventData, void* userData)
|
2020-06-20 02:46:31 +08:00
|
|
|
{
|
2022-03-11 21:53:16 +08:00
|
|
|
std::ignore = userData;
|
2020-06-20 02:46:31 +08:00
|
|
|
if (!eventData.startsWith("tox:")) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!uriDialog) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2022-04-03 16:17:08 +08:00
|
|
|
uriDialog->handleToxURI(QString::fromUtf8(eventData));
|
2020-06-20 02:46:31 +08:00
|
|
|
return true;
|
|
|
|
}
|
2022-03-11 21:53:16 +08:00
|
|
|
|
|
|
|
} // namespace
|
2020-06-20 02:46:31 +08:00
|
|
|
|
2017-02-26 19:52:45 +08:00
|
|
|
int main(int argc, char* argv[])
|
2014-06-25 04:11:11 +08:00
|
|
|
{
|
2016-05-04 18:31:24 +08:00
|
|
|
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
|
|
|
|
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
|
|
|
QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
|
|
|
|
#endif
|
|
|
|
|
2016-03-25 21:29:48 +08:00
|
|
|
qInstallMessageHandler(logMessageHandler);
|
|
|
|
|
2017-09-14 14:33:49 +08:00
|
|
|
std::unique_ptr<QApplication> a(new QApplication(argc, argv));
|
2017-08-19 20:35:54 +08:00
|
|
|
|
|
|
|
#if defined(Q_OS_UNIX)
|
|
|
|
// PosixSignalNotifier is used only for terminating signals,
|
|
|
|
// so it's connected directly to quit() without any filtering.
|
2018-06-30 18:10:46 +08:00
|
|
|
QObject::connect(&PosixSignalNotifier::globalInstance(), &PosixSignalNotifier::activated,
|
|
|
|
a.get(), &QApplication::quit);
|
2017-08-19 20:35:54 +08:00
|
|
|
PosixSignalNotifier::watchCommonTerminatingSignals();
|
|
|
|
#endif
|
|
|
|
|
2017-06-18 19:44:20 +08:00
|
|
|
a->setApplicationName("qTox");
|
2018-05-14 18:51:53 +08:00
|
|
|
#if QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)
|
|
|
|
a->setDesktopFileName("io.github.qtox.qTox");
|
|
|
|
#endif
|
2017-06-18 19:44:20 +08:00
|
|
|
a->setApplicationVersion("\nGit commit: " + QString(GIT_VERSION));
|
2015-06-06 09:40:08 +08:00
|
|
|
|
2016-11-14 00:16:03 +08:00
|
|
|
// Install Unicode 6.1 supporting font
|
|
|
|
// Keep this as close to the beginning of `main()` as possible, otherwise
|
|
|
|
// on systems that have poor support for Unicode qTox will look bad.
|
|
|
|
if (QFontDatabase::addApplicationFont("://font/DejaVuSans.ttf") == -1) {
|
|
|
|
qWarning() << "Couldn't load font";
|
|
|
|
}
|
|
|
|
|
2022-03-29 12:31:48 +08:00
|
|
|
messageBoxManager = std::unique_ptr<MessageBoxManager>(new MessageBoxManager(nullptr));
|
2022-03-13 21:04:24 +08:00
|
|
|
settings = std::unique_ptr<Settings>(new Settings(*messageBoxManager));
|
2022-03-11 21:53:16 +08:00
|
|
|
|
|
|
|
QString locale = settings->getTranslation();
|
2020-05-21 06:28:16 +08:00
|
|
|
// We need to init the resources in the translations_library explicitely.
|
|
|
|
// See https://doc.qt.io/qt-5/resources.html#using-resources-in-a-library
|
|
|
|
Q_INIT_RESOURCE(translations);
|
2017-04-18 05:55:23 +08:00
|
|
|
Translator::translate(locale);
|
2015-06-05 18:26:04 +08:00
|
|
|
|
2014-11-12 07:58:20 +08:00
|
|
|
// Process arguments
|
|
|
|
QCommandLineParser parser;
|
2018-03-21 21:28:00 +08:00
|
|
|
parser.setApplicationDescription("qTox, version: " + QString(GIT_VERSION));
|
2014-11-12 07:58:20 +08:00
|
|
|
parser.addHelpOption();
|
|
|
|
parser.addVersionOption();
|
|
|
|
parser.addPositionalArgument("uri", QObject::tr("Tox URI to parse"));
|
2017-02-26 19:52:45 +08:00
|
|
|
parser.addOption(
|
2018-06-30 18:10:46 +08:00
|
|
|
QCommandLineOption(QStringList() << "p"
|
|
|
|
<< "profile",
|
|
|
|
QObject::tr("Starts new instance and loads specified profile."),
|
2017-02-26 19:52:45 +08:00
|
|
|
QObject::tr("profile")));
|
2017-09-27 04:38:49 +08:00
|
|
|
parser.addOption(
|
2018-06-30 18:10:46 +08:00
|
|
|
QCommandLineOption(QStringList() << "l"
|
|
|
|
<< "login",
|
|
|
|
QObject::tr("Starts new instance and opens the login screen.")));
|
2019-08-16 22:55:29 +08:00
|
|
|
parser.addOption(QCommandLineOption(QStringList() << "I"
|
|
|
|
<< "IPv6",
|
2019-08-29 20:38:33 +08:00
|
|
|
QObject::tr("Sets IPv6 <on>/<off>. Default is ON."),
|
|
|
|
QObject::tr("on/off")));
|
2019-08-16 22:55:29 +08:00
|
|
|
parser.addOption(QCommandLineOption(QStringList() << "U"
|
|
|
|
<< "UDP",
|
2019-08-29 20:38:33 +08:00
|
|
|
QObject::tr("Sets UDP <on>/<off>. Default is ON."),
|
|
|
|
QObject::tr("on/off")));
|
2019-08-16 22:55:29 +08:00
|
|
|
parser.addOption(
|
|
|
|
QCommandLineOption(QStringList() << "L"
|
|
|
|
<< "LAN",
|
2019-08-29 20:38:33 +08:00
|
|
|
QObject::tr(
|
|
|
|
"Sets LAN discovery <on>/<off>. UDP off overrides. Default is ON."),
|
2019-08-16 22:55:29 +08:00
|
|
|
QObject::tr("on/off")));
|
|
|
|
parser.addOption(QCommandLineOption(QStringList() << "P"
|
|
|
|
<< "proxy",
|
2019-08-29 20:38:33 +08:00
|
|
|
QObject::tr("Sets proxy settings. Default is NONE."),
|
2019-08-16 22:55:29 +08:00
|
|
|
QObject::tr("(SOCKS5/HTTP/NONE):(ADDRESS):(PORT)")));
|
2017-06-18 19:44:20 +08:00
|
|
|
parser.process(*a);
|
2014-06-30 08:24:27 +08:00
|
|
|
|
2022-03-11 21:53:16 +08:00
|
|
|
uint32_t profileId = settings->getCurrentProfileId();
|
2017-04-18 04:44:58 +08:00
|
|
|
IPC ipc(profileId);
|
2019-08-29 12:47:26 +08:00
|
|
|
if (ipc.isAttached()) {
|
2022-03-11 21:53:16 +08:00
|
|
|
QObject::connect(settings.get(), &Settings::currentProfileIdChanged, &ipc, &IPC::setProfileId);
|
2019-08-29 12:47:26 +08:00
|
|
|
} else {
|
|
|
|
qWarning() << "Can't init IPC, maybe we're in a jail? Continuing with reduced multi-client functionality.";
|
2016-04-14 06:21:31 +08:00
|
|
|
}
|
2014-11-09 22:51:00 +08:00
|
|
|
|
2014-11-01 13:27:10 +08:00
|
|
|
#ifdef LOG_TO_FILE
|
2022-03-11 21:53:16 +08:00
|
|
|
QString logFileDir = settings->getPaths().getAppCacheDirPath();
|
2016-02-28 22:16:19 +08:00
|
|
|
QDir(logFileDir).mkpath(".");
|
2016-03-25 21:29:48 +08:00
|
|
|
|
|
|
|
QString logfile = logFileDir + "qtox.log";
|
2017-02-26 19:52:45 +08:00
|
|
|
FILE* mainLogFilePtr = fopen(logfile.toLocal8Bit().constData(), "a");
|
2016-01-21 08:32:24 +08:00
|
|
|
|
|
|
|
// Trim log file if over 1MB
|
2017-02-26 19:52:45 +08:00
|
|
|
if (QFileInfo(logfile).size() > 1000000) {
|
2016-01-21 08:32:24 +08:00
|
|
|
qDebug() << "Log file over 1MB, rotating...";
|
2016-06-27 02:11:19 +08:00
|
|
|
|
|
|
|
// close old logfile (need for windows)
|
2016-06-29 03:42:49 +08:00
|
|
|
if (mainLogFilePtr)
|
2016-06-27 02:11:19 +08:00
|
|
|
fclose(mainLogFilePtr);
|
|
|
|
|
2017-02-26 19:52:45 +08:00
|
|
|
QDir dir(logFileDir);
|
2016-06-27 02:11:19 +08:00
|
|
|
|
2016-01-21 08:32:24 +08:00
|
|
|
// Check if log.1 already exists, and if so, delete it
|
2016-01-21 09:22:43 +08:00
|
|
|
if (dir.remove(logFileDir + "qtox.log.1"))
|
2016-03-26 06:25:30 +08:00
|
|
|
qDebug() << "Removed old log successfully";
|
2016-01-21 09:22:43 +08:00
|
|
|
else
|
2016-03-26 06:25:30 +08:00
|
|
|
qWarning() << "Unable to remove old log file";
|
|
|
|
|
2016-06-29 03:42:49 +08:00
|
|
|
if (!dir.rename(logFileDir + "qtox.log", logFileDir + "qtox.log.1"))
|
2016-03-26 06:25:30 +08:00
|
|
|
qCritical() << "Unable to move logs";
|
2016-01-21 08:32:24 +08:00
|
|
|
|
2016-03-26 06:25:30 +08:00
|
|
|
// open a new logfile
|
2016-03-26 20:49:51 +08:00
|
|
|
mainLogFilePtr = fopen(logfile.toLocal8Bit().constData(), "a");
|
2014-11-04 09:08:02 +08:00
|
|
|
}
|
2016-03-26 06:25:30 +08:00
|
|
|
|
2016-06-29 03:42:49 +08:00
|
|
|
if (!mainLogFilePtr)
|
2016-03-26 06:25:30 +08:00
|
|
|
qCritical() << "Couldn't open logfile" << logfile;
|
|
|
|
|
2019-09-25 18:23:37 +08:00
|
|
|
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
|
|
|
|
logFileFile.storeRelaxed(mainLogFilePtr); // atomically set the logFile
|
|
|
|
#else
|
2017-02-26 19:52:45 +08:00
|
|
|
logFileFile.store(mainLogFilePtr); // atomically set the logFile
|
2019-09-25 18:23:37 +08:00
|
|
|
#endif
|
2014-11-01 13:27:10 +08:00
|
|
|
#endif
|
|
|
|
|
2014-10-01 22:49:54 +08:00
|
|
|
// Windows platform plugins DLL hell fix
|
|
|
|
QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath());
|
2017-06-18 19:44:20 +08:00
|
|
|
a->addLibraryPath("platforms");
|
2014-11-12 07:58:20 +08:00
|
|
|
|
2017-09-14 15:00:38 +08:00
|
|
|
qDebug() << "commit: " << GIT_VERSION;
|
2014-10-01 22:49:54 +08:00
|
|
|
|
2015-12-22 20:48:52 +08:00
|
|
|
QString profileName;
|
2022-03-11 21:53:16 +08:00
|
|
|
bool autoLogin = settings->getAutoLogin();
|
2014-06-25 04:11:11 +08:00
|
|
|
|
2015-12-22 20:48:52 +08:00
|
|
|
uint32_t ipcDest = 0;
|
2019-08-29 12:47:26 +08:00
|
|
|
bool doIpc = ipc.isAttached();
|
2015-12-22 20:48:52 +08:00
|
|
|
QString eventType, firstParam;
|
2017-02-26 19:52:45 +08:00
|
|
|
if (parser.isSet("p")) {
|
2015-12-22 20:48:52 +08:00
|
|
|
profileName = parser.value("p");
|
2022-03-11 21:53:16 +08:00
|
|
|
if (!Profile::exists(profileName, settings->getPaths())) {
|
2017-09-27 04:38:49 +08:00
|
|
|
qWarning() << "-p profile" << profileName + ".tox"
|
2018-06-30 18:10:46 +08:00
|
|
|
<< "doesn't exist, opening login screen";
|
2017-09-27 04:38:49 +08:00
|
|
|
doIpc = false;
|
|
|
|
autoLogin = false;
|
|
|
|
} else {
|
|
|
|
ipcDest = Settings::makeProfileId(profileName);
|
|
|
|
autoLogin = true;
|
2015-06-09 07:45:30 +08:00
|
|
|
}
|
2017-09-27 04:38:49 +08:00
|
|
|
} else if (parser.isSet("l")) {
|
|
|
|
doIpc = false;
|
|
|
|
autoLogin = false;
|
2017-02-26 19:52:45 +08:00
|
|
|
} else {
|
2022-03-11 21:53:16 +08:00
|
|
|
profileName = settings->getCurrentProfile();
|
2016-06-29 03:42:49 +08:00
|
|
|
}
|
2015-06-09 07:45:30 +08:00
|
|
|
|
2019-06-24 07:17:21 +08:00
|
|
|
if (parser.positionalArguments().empty()) {
|
2015-12-22 20:48:52 +08:00
|
|
|
eventType = "activate";
|
2017-02-26 19:52:45 +08:00
|
|
|
} else {
|
2015-12-22 20:48:52 +08:00
|
|
|
firstParam = parser.positionalArguments()[0];
|
2017-02-26 19:52:45 +08:00
|
|
|
// Tox URIs. If there's already another qTox instance running, we ask it to handle the URI
|
|
|
|
// and we exit
|
2014-11-06 22:12:10 +08:00
|
|
|
// Otherwise we start a new qTox instance and process it ourselves
|
2017-02-26 19:52:45 +08:00
|
|
|
if (firstParam.startsWith("tox:")) {
|
2015-12-22 20:48:52 +08:00
|
|
|
eventType = "uri";
|
2017-02-26 19:52:45 +08:00
|
|
|
} else if (firstParam.endsWith(".tox")) {
|
2022-03-28 22:19:16 +08:00
|
|
|
eventType = ToxSave::eventHandlerKey;
|
2017-02-26 19:52:45 +08:00
|
|
|
} else {
|
2015-12-22 20:48:52 +08:00
|
|
|
qCritical() << "Invalid argument";
|
2014-11-13 08:46:17 +08:00
|
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
2014-11-06 22:12:10 +08:00
|
|
|
}
|
2015-12-22 20:48:52 +08:00
|
|
|
|
2017-09-27 04:38:49 +08:00
|
|
|
if (doIpc && !ipc.isCurrentOwner()) {
|
2015-12-22 20:48:52 +08:00
|
|
|
time_t event = ipc.postEvent(eventType, firstParam.toUtf8(), ipcDest);
|
|
|
|
// If someone else processed it, we're done here, no need to actually start qTox
|
2017-02-26 19:52:45 +08:00
|
|
|
if (ipc.waitUntilAccepted(event, 2)) {
|
2017-09-14 15:00:38 +08:00
|
|
|
if (eventType == "activate") {
|
2018-06-30 18:10:46 +08:00
|
|
|
qDebug()
|
|
|
|
<< "Another qTox instance is already running. If you want to start a second "
|
|
|
|
"instance, please open login screen (qtox -l) or start with a profile (qtox "
|
|
|
|
"-p <profile name>).";
|
2017-09-14 15:00:38 +08:00
|
|
|
} else {
|
|
|
|
qDebug() << "Event" << eventType << "was handled by other client.";
|
|
|
|
}
|
2015-10-12 05:07:37 +08:00
|
|
|
return EXIT_SUCCESS;
|
2015-02-21 00:17:30 +08:00
|
|
|
}
|
2014-11-26 01:11:05 +08:00
|
|
|
}
|
2014-11-06 22:12:10 +08:00
|
|
|
|
2019-08-29 20:38:33 +08:00
|
|
|
if (!Settings::verifyProxySettings(parser)) {
|
2019-08-16 22:55:29 +08:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2019-06-24 07:15:33 +08:00
|
|
|
// TODO(sudden6): remove once we get rid of Nexus
|
|
|
|
Nexus& nexus = Nexus::getInstance();
|
|
|
|
// TODO(kriby): Consider moving application initializing variables into a globalSettings object
|
|
|
|
// note: Because Settings is shouldering global settings as well as model specific ones it
|
|
|
|
// cannot be integrated into a central model object yet
|
2022-03-11 21:53:16 +08:00
|
|
|
nexus.setSettings(settings.get());
|
2022-03-13 21:04:24 +08:00
|
|
|
nexus.setMessageBoxManager(messageBoxManager.get());
|
2022-03-28 22:19:16 +08:00
|
|
|
nexus.setIpc(&ipc);
|
2022-03-11 23:50:42 +08:00
|
|
|
auto& cameraSource = Nexus::getCameraSource();
|
2015-06-05 21:24:02 +08:00
|
|
|
// Autologin
|
2019-06-24 07:15:33 +08:00
|
|
|
// TODO (kriby): Shift responsibility of linking views to model objects from nexus
|
|
|
|
// Further: generate view instances separately (loginScreen, mainGUI, audio)
|
2019-08-13 03:26:57 +08:00
|
|
|
Profile* profile = nullptr;
|
2022-03-11 21:53:16 +08:00
|
|
|
if (autoLogin && Profile::exists(profileName, settings->getPaths()) && !Profile::isEncrypted(profileName, settings->getPaths())) {
|
2022-03-13 21:04:24 +08:00
|
|
|
profile = Profile::loadProfile(profileName, QString(), *settings, &parser, cameraSource, *messageBoxManager);
|
2019-08-13 05:07:34 +08:00
|
|
|
if (!profile) {
|
|
|
|
QMessageBox::information(nullptr, QObject::tr("Error"),
|
|
|
|
QObject::tr("Failed to load profile automatically."));
|
|
|
|
}
|
2019-08-13 03:26:57 +08:00
|
|
|
}
|
|
|
|
if (profile) {
|
2019-06-24 07:15:33 +08:00
|
|
|
nexus.bootstrapWithProfile(profile);
|
2018-01-09 02:49:06 +08:00
|
|
|
} else {
|
2019-08-16 22:55:29 +08:00
|
|
|
nexus.setParser(&parser);
|
2019-06-24 07:15:33 +08:00
|
|
|
int returnval = nexus.showLogin(profileName);
|
2019-10-17 01:49:30 +08:00
|
|
|
if (returnval == QDialog::Rejected) {
|
|
|
|
return -1;
|
2018-03-25 07:38:59 +08:00
|
|
|
}
|
2020-06-20 02:46:31 +08:00
|
|
|
profile = nexus.getProfile();
|
2015-06-05 21:24:02 +08:00
|
|
|
}
|
|
|
|
|
2022-03-13 21:04:24 +08:00
|
|
|
uriDialog = std::unique_ptr<ToxURIDialog>(new ToxURIDialog(nullptr, profile->getCore(), *messageBoxManager));
|
2022-03-28 22:19:16 +08:00
|
|
|
toxSave = std::unique_ptr<ToxSave>(new ToxSave{*settings, ipc});
|
2020-06-20 02:46:31 +08:00
|
|
|
|
2019-08-29 12:47:26 +08:00
|
|
|
if (ipc.isAttached()) {
|
|
|
|
// Start to accept Inter-process communication
|
2022-03-11 21:53:16 +08:00
|
|
|
ipc.registerEventHandler("uri", &toxURIEventHandler, uriDialog.get());
|
2022-03-28 22:19:16 +08:00
|
|
|
ipc.registerEventHandler(ToxSave::eventHandlerKey, &ToxSave::toxSaveEventHandler, toxSave.get());
|
|
|
|
nexus.registerActivate();
|
2019-08-29 12:47:26 +08:00
|
|
|
}
|
2018-10-31 08:46:33 +08:00
|
|
|
|
2015-12-22 20:48:52 +08:00
|
|
|
// Event was not handled by already running instance therefore we handle it ourselves
|
2020-06-20 02:46:31 +08:00
|
|
|
if (eventType == "uri") {
|
2022-04-03 16:17:08 +08:00
|
|
|
uriDialog->handleToxURI(firstParam);
|
2022-03-28 22:19:16 +08:00
|
|
|
} else if (eventType == ToxSave::eventHandlerKey) {
|
2022-04-03 16:17:08 +08:00
|
|
|
toxSave->handleToxSave(firstParam);
|
2020-06-20 02:46:31 +08:00
|
|
|
}
|
2015-12-22 20:48:52 +08:00
|
|
|
|
2017-09-14 14:33:49 +08:00
|
|
|
QObject::connect(a.get(), &QApplication::aboutToQuit, cleanup);
|
2017-06-18 19:44:20 +08:00
|
|
|
|
2018-10-31 08:46:33 +08:00
|
|
|
// Run
|
|
|
|
int errorcode = a->exec();
|
2014-06-25 04:11:11 +08:00
|
|
|
|
2017-06-18 19:35:31 +08:00
|
|
|
qDebug() << "Exit with status" << errorcode;
|
2014-06-25 04:11:11 +08:00
|
|
|
return errorcode;
|
|
|
|
}
|