blob: 51616ecfba6fbd96c2823949e2505bb98f04220a [file] [log] [blame]
Edric Milaret627500d2015-03-27 16:41:40 -04001/***************************************************************************
Andreas Traczyka7238ee2018-12-12 15:55:05 -05002 * Copyright (C) 2015-2018 by Savoir-faire Linux *
Edric Milaret627500d2015-03-27 16:41:40 -04003 * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>*
Andreas Traczyka7238ee2018-12-12 15:55:05 -05004 * Author: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com> *
Edric Milaret627500d2015-03-27 16:41:40 -04005 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 3 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
18 **************************************************************************/
19
20#include "mainwindow.h"
Andreas Traczyk43c08232018-10-31 13:42:09 -040021
Edric Milaret627500d2015-03-27 16:41:40 -040022#include <QApplication>
23#include <QFile>
24
Edric Milaret12353822015-05-14 14:41:09 -040025#include "callmodel.h"
Edric Milaret1b197eb2015-06-01 15:09:56 -040026#include "media/audio.h"
27#include "media/video.h"
28#include "media/text.h"
29#include "media/file.h"
Anthony Léonard8c136442017-04-28 11:24:14 -040030#include "globalinstances.h"
31#include "pixbufmanipulator.h"
Andreas Traczykfdc7f9b2018-08-14 18:42:03 -040032#include "lrcinstance.h"
Edric Milaret12353822015-05-14 14:41:09 -040033
Edric Milaret53ac6e52015-09-14 13:37:06 -040034#include <QTranslator>
35#include <QLibraryInfo>
Olivier SOLDANOfe18af32017-04-28 11:54:15 -040036#include <QFontDatabase>
Edric Milaret12353822015-05-14 14:41:09 -040037
Andreas Traczyke0a60b52018-07-10 18:16:15 -040038#include <ciso646>
Edric Milaretfe390942015-08-04 13:41:03 -040039
Andreas Traczyk43c08232018-10-31 13:42:09 -040040#include "utils.h"
41
Edric Milaret36587362016-02-04 12:30:52 -050042#ifdef Q_OS_WIN
Edric Milaret12353822015-05-14 14:41:09 -040043#include <windows.h>
Edric Milaretb37aa1f2015-07-09 16:39:04 -040044#endif
Edric Milaret12353822015-05-14 14:41:09 -040045
Andreas Traczyk43c08232018-10-31 13:42:09 -040046#if defined _MSC_VER && !COMPILE_ONLY
Andreas Traczyke0a60b52018-07-10 18:16:15 -040047#include <gnutls/gnutls.h>
48#endif
49
Edric Milaretfe390942015-08-04 13:41:03 -040050#ifdef URI_PROTOCOL
51#include "shmclient.h"
52#endif
53
Edric Milaret1b197eb2015-06-01 15:09:56 -040054REGISTER_MEDIA();
55
Edric Milaret5c3ff7c2015-06-22 10:30:08 -040056void
Andreas Traczyka7238ee2018-12-12 15:55:05 -050057consoleDebug()
Edric Milaret5c3ff7c2015-06-22 10:30:08 -040058{
Edric Milaret36587362016-02-04 12:30:52 -050059#ifdef Q_OS_WIN
Edric Milaret5c3ff7c2015-06-22 10:30:08 -040060 AllocConsole();
61 freopen("CONOUT$", "w", stdout);
62 freopen("CONOUT$", "w", stderr);
63
64 COORD coordInfo;
65 coordInfo.X = 130;
66 coordInfo.Y = 9000;
67
68 SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coordInfo);
69 SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE),ENABLE_QUICK_EDIT_MODE| ENABLE_EXTENDED_FLAGS);
Edric Milaretb37aa1f2015-07-09 16:39:04 -040070#endif
Andreas Traczyka7238ee2018-12-12 15:55:05 -050071}
72
73#ifdef _MSC_VER
74void
75vsConsoleDebug()
76{
77
78 // Print debug to output window if using VS
79 QObject::connect(
80 &LRCInstance::behaviorController(),
81 &lrc::api::BehaviorController::debugMessageReceived,
82 [](const std::string& message) {
83 OutputDebugStringA((message + "\n").c_str());
84 });
85}
Andreas Traczykfdc7f9b2018-08-14 18:42:03 -040086#endif
Andreas Traczyka7238ee2018-12-12 15:55:05 -050087
88void
89fileDebug(QFile& debugFile)
90{
91 QObject::connect(
92 &LRCInstance::behaviorController(),
93 &lrc::api::BehaviorController::debugMessageReceived,
94 [&debugFile](const std::string& message) {
95 if (debugFile.open(QIODevice::WriteOnly | QIODevice::Append)) {
96 auto msg = (message + "\n").c_str();
97 debugFile.write(msg, qstrlen(msg));
98 debugFile.close();
99 }
100 });
Edric Milaret5c3ff7c2015-06-22 10:30:08 -0400101}
102
Edric Milaret627500d2015-03-27 16:41:40 -0400103int
104main(int argc, char *argv[])
105{
Edric Milaret5e6d6722016-09-13 12:00:42 -0400106 QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
Andreas Traczyk6ace34f2018-12-14 14:31:23 -0500107 QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
Edric Milarete7dbb522016-01-20 13:30:08 -0500108
Andreas Traczyk7e055702018-12-27 10:01:20 -0500109 char ARG_DISABLE_WEB_SECURITY[] = "--disable-web-security";
110 int newArgc = argc + 1 + 1;
111 char** newArgv = new char*[newArgc];
112 for (int i = 0; i < argc; i++) {
113 newArgv[i] = argv[i];
114 }
115 newArgv[argc] = ARG_DISABLE_WEB_SECURITY;
116 newArgv[argc + 1] = nullptr;
117
118 QApplication a(newArgc, newArgv);
Edric Milaret627500d2015-03-27 16:41:40 -0400119
Sébastien Blincba5b522018-12-10 12:48:36 -0500120 QCoreApplication::setOrganizationDomain("jami.net");
Andreas Traczykdb63f162018-12-18 12:26:45 -0500121 QCoreApplication::setApplicationName("Ring");
Andreas Traczyk7548e732018-12-12 10:47:21 -0500122
Edric Milaret5c3ff7c2015-06-22 10:30:08 -0400123 auto startMinimized = false;
Edric Milaretfe390942015-08-04 13:41:03 -0400124 QString uri = "";
Edric Milaret5c3ff7c2015-06-22 10:30:08 -0400125
Andreas Traczyk43c08232018-10-31 13:42:09 -0400126#if defined _MSC_VER && !COMPILE_ONLY
Andreas Traczykfdc7f9b2018-08-14 18:42:03 -0400127 gnutls_global_init();
128#endif
129
Andreas Traczyka7238ee2018-12-12 15:55:05 -0500130 GlobalInstances::setPixmapManipulator(std::unique_ptr<PixbufManipulator>(new PixbufManipulator()));
Andreas Traczykfdc7f9b2018-08-14 18:42:03 -0400131 LRCInstance::init();
132
Andreas Traczyka7238ee2018-12-12 15:55:05 -0500133 QFile debugFile("debug.log");
134
Edric Milaret5c3ff7c2015-06-22 10:30:08 -0400135 for (auto string : QCoreApplication::arguments()) {
Andreas Traczyka7238ee2018-12-12 15:55:05 -0500136 if (string == "-m" || string == "--minimized") {
Edric Milaret5c3ff7c2015-06-22 10:30:08 -0400137 startMinimized = true;
Andreas Traczyka7238ee2018-12-12 15:55:05 -0500138 }
139 if (string == "-f" || string == "--file") {
140 debugFile.open(QIODevice::WriteOnly | QIODevice::Truncate);
141 debugFile.close();
142 fileDebug(debugFile);
143 }
144 if (string == "-d" || string == "--debug") {
145 consoleDebug();
146 }
147#ifdef _MSC_VER
148 else if (string == "-c" || string == "--vsconsole") {
149 vsConsoleDebug();
150 }
151#endif
Edric Milaretfe390942015-08-04 13:41:03 -0400152 if (string.startsWith("ring:")) {
153 uri = string;
154 }
Edric Milaret5c3ff7c2015-06-22 10:30:08 -0400155 }
156
Edric Milaretfe390942015-08-04 13:41:03 -0400157#ifdef URI_PROTOCOL
158 QSharedMemory* shm = new QSharedMemory("RingShm");
159 QSystemSemaphore* sem = new QSystemSemaphore("RingSem", 0);
160
161 if (not shm->create(1024)) {
162 if (not uri.isEmpty()) {
163 shm->attach();
164 shm->lock();
165 char *to = (char*) shm->data();
166 QChar *data = uri.data();
167 while (!data->isNull())
168 {
169 memset(to, data->toLatin1(), 1);
170 ++data;
171 ++to;
172 }
173 memset(to, 0, 1); //null terminator
174 shm->unlock();
175 }
176 sem->release();
177
178 delete shm;
179 exit(EXIT_SUCCESS);
180 }
181 //Client listening to shm event
182 memset((char*)shm->data(), 0, shm->size());
183 ShmClient* shmClient = new ShmClient(shm, sem);
184#endif
185
Guillaume Rogueza11df1a2017-07-14 13:04:58 -0400186 const auto locale_name = QLocale::system().name();
187 const auto locale_lang = locale_name.split('_')[0];
Edric Milaret53ac6e52015-09-14 13:37:06 -0400188
Guillaume Rogueza11df1a2017-07-14 13:04:58 -0400189 QTranslator qtTranslator_lang;
190 QTranslator qtTranslator_name;
191 if (locale_name != locale_lang) {
192 qtTranslator_lang.load("qt_" + locale_lang, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
193 a.installTranslator(&qtTranslator_lang);
194 }
195 qtTranslator_name.load("qt_" + locale_name, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
196 a.installTranslator(&qtTranslator_name);
Edric Milaret53ac6e52015-09-14 13:37:06 -0400197
Guillaume Rogueza11df1a2017-07-14 13:04:58 -0400198 QTranslator lrcTranslator_lang;
199 QTranslator lrcTranslator_name;
200 if (locale_name != locale_lang) {
201 lrcTranslator_lang.load("share/libringclient/translations/lrc_" + locale_lang);
202 a.installTranslator(&lrcTranslator_lang);
203 }
204 lrcTranslator_name.load("share/libringclient/translations/lrc_" + locale_name);
205 a.installTranslator(&lrcTranslator_name);
206
207 QTranslator mainTranslator_lang;
208 QTranslator mainTranslator_name;
209 if (locale_name != locale_lang) {
210 mainTranslator_lang.load("share/ring/translations/ring_client_windows_" + locale_lang);
211 a.installTranslator(&mainTranslator_lang);
212 }
213 mainTranslator_name.load("share/ring/translations/ring_client_windows_" + locale_name);
214 a.installTranslator(&mainTranslator_name);
Edric Milaret53ac6e52015-09-14 13:37:06 -0400215
Edric Milaret627500d2015-03-27 16:41:40 -0400216 QFont font;
217 font.setFamily("Segoe UI");
218 a.setFont(font);
219
220 QFile file(":/stylesheet.css");
221 if(file.open(QIODevice::ReadOnly | QIODevice::Text))
222 {
223 a.setStyleSheet(file.readAll());
224 file.close();
225 }
226
Olivier SOLDANO2100f1c2017-09-06 16:45:20 -0400227 QFontDatabase::addApplicationFont(":/images/FontAwesome.otf");
228
Olivier SOLDANO2100f1c2017-09-06 16:45:20 -0400229 MainWindow::instance().createThumbBar();
230
Edric Milaretfe390942015-08-04 13:41:03 -0400231 if (not uri.isEmpty()) {
232 startMinimized = false;
Edric Milaret9c3e7f72016-01-27 10:48:20 -0500233 MainWindow::instance().onRingEvent(uri);
Edric Milaretfe390942015-08-04 13:41:03 -0400234 }
235
Edric Milaret90bd5a82015-06-08 10:07:59 -0400236 if (not startMinimized)
Edric Milaret9c3e7f72016-01-27 10:48:20 -0500237 MainWindow::instance().show();
Edric Milaret51011352016-09-08 11:43:05 -0400238 else {
Edric Milaret9c3e7f72016-01-27 10:48:20 -0500239 MainWindow::instance().showMinimized();
Edric Milaret51011352016-09-08 11:43:05 -0400240 MainWindow::instance().hide();
241 }
Edric Milaret627500d2015-03-27 16:41:40 -0400242
Edric Milaret2cf34292015-06-22 16:27:03 -0400243
Edric Milaretfe390942015-08-04 13:41:03 -0400244#ifdef URI_PROTOCOL
Edric Milaret9c3e7f72016-01-27 10:48:20 -0500245 QObject::connect(shmClient, SIGNAL(RingEvent(QString)), &MainWindow::instance(), SLOT(onRingEvent(QString)));
Edric Milaretfe390942015-08-04 13:41:03 -0400246
247 QObject::connect(&a, &QApplication::aboutToQuit, [&a, &shmClient, &shm, &sem]() {
248 shmClient->terminate();
249 delete shmClient;
250 delete shm;
251 delete sem;
252 });
253#endif
Andreas Traczykd063d5a2018-08-10 12:56:23 -0400254
255 auto ret = a.exec();
256
Andreas Traczyka7238ee2018-12-12 15:55:05 -0500257 FreeConsole();
258
Andreas Traczykd063d5a2018-08-10 12:56:23 -0400259 QCoreApplication::exit();
260 GlobalSystemTray::instance().deleteLater();
261 GlobalSystemTray::instance().hide();
262
Andreas Traczyke8cf7552018-08-02 16:28:08 -0400263 return ret;
Edric Milaret627500d2015-03-27 16:41:40 -0400264}