blob: 77a496a41c35a0a18ad3db1ba1a65ee1a3cc82aa [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);
Edric Milarete7dbb522016-01-20 13:30:08 -0500107
Edric Milaret627500d2015-03-27 16:41:40 -0400108 QApplication a(argc, argv);
109
Sébastien Blincba5b522018-12-10 12:48:36 -0500110 QCoreApplication::setOrganizationDomain("jami.net");
111 QCoreApplication::setApplicationName("Jami");
Andreas Traczyk7548e732018-12-12 10:47:21 -0500112
Edric Milaret5c3ff7c2015-06-22 10:30:08 -0400113 auto startMinimized = false;
Edric Milaretfe390942015-08-04 13:41:03 -0400114 QString uri = "";
Edric Milaret5c3ff7c2015-06-22 10:30:08 -0400115
Andreas Traczyk43c08232018-10-31 13:42:09 -0400116#if defined _MSC_VER && !COMPILE_ONLY
Andreas Traczykfdc7f9b2018-08-14 18:42:03 -0400117 gnutls_global_init();
118#endif
119
Andreas Traczyka7238ee2018-12-12 15:55:05 -0500120 GlobalInstances::setPixmapManipulator(std::unique_ptr<PixbufManipulator>(new PixbufManipulator()));
Andreas Traczykfdc7f9b2018-08-14 18:42:03 -0400121 LRCInstance::init();
122
Andreas Traczyka7238ee2018-12-12 15:55:05 -0500123 QFile debugFile("debug.log");
124
Edric Milaret5c3ff7c2015-06-22 10:30:08 -0400125 for (auto string : QCoreApplication::arguments()) {
Andreas Traczyka7238ee2018-12-12 15:55:05 -0500126 if (string == "-m" || string == "--minimized") {
Edric Milaret5c3ff7c2015-06-22 10:30:08 -0400127 startMinimized = true;
Andreas Traczyka7238ee2018-12-12 15:55:05 -0500128 }
129 if (string == "-f" || string == "--file") {
130 debugFile.open(QIODevice::WriteOnly | QIODevice::Truncate);
131 debugFile.close();
132 fileDebug(debugFile);
133 }
134 if (string == "-d" || string == "--debug") {
135 consoleDebug();
136 }
137#ifdef _MSC_VER
138 else if (string == "-c" || string == "--vsconsole") {
139 vsConsoleDebug();
140 }
141#endif
Edric Milaretfe390942015-08-04 13:41:03 -0400142 if (string.startsWith("ring:")) {
143 uri = string;
144 }
Edric Milaret5c3ff7c2015-06-22 10:30:08 -0400145 }
146
Edric Milaretfe390942015-08-04 13:41:03 -0400147#ifdef URI_PROTOCOL
148 QSharedMemory* shm = new QSharedMemory("RingShm");
149 QSystemSemaphore* sem = new QSystemSemaphore("RingSem", 0);
150
151 if (not shm->create(1024)) {
152 if (not uri.isEmpty()) {
153 shm->attach();
154 shm->lock();
155 char *to = (char*) shm->data();
156 QChar *data = uri.data();
157 while (!data->isNull())
158 {
159 memset(to, data->toLatin1(), 1);
160 ++data;
161 ++to;
162 }
163 memset(to, 0, 1); //null terminator
164 shm->unlock();
165 }
166 sem->release();
167
168 delete shm;
169 exit(EXIT_SUCCESS);
170 }
171 //Client listening to shm event
172 memset((char*)shm->data(), 0, shm->size());
173 ShmClient* shmClient = new ShmClient(shm, sem);
174#endif
175
Guillaume Rogueza11df1a2017-07-14 13:04:58 -0400176 const auto locale_name = QLocale::system().name();
177 const auto locale_lang = locale_name.split('_')[0];
Edric Milaret53ac6e52015-09-14 13:37:06 -0400178
Guillaume Rogueza11df1a2017-07-14 13:04:58 -0400179 QTranslator qtTranslator_lang;
180 QTranslator qtTranslator_name;
181 if (locale_name != locale_lang) {
182 qtTranslator_lang.load("qt_" + locale_lang, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
183 a.installTranslator(&qtTranslator_lang);
184 }
185 qtTranslator_name.load("qt_" + locale_name, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
186 a.installTranslator(&qtTranslator_name);
Edric Milaret53ac6e52015-09-14 13:37:06 -0400187
Guillaume Rogueza11df1a2017-07-14 13:04:58 -0400188 QTranslator lrcTranslator_lang;
189 QTranslator lrcTranslator_name;
190 if (locale_name != locale_lang) {
191 lrcTranslator_lang.load("share/libringclient/translations/lrc_" + locale_lang);
192 a.installTranslator(&lrcTranslator_lang);
193 }
194 lrcTranslator_name.load("share/libringclient/translations/lrc_" + locale_name);
195 a.installTranslator(&lrcTranslator_name);
196
197 QTranslator mainTranslator_lang;
198 QTranslator mainTranslator_name;
199 if (locale_name != locale_lang) {
200 mainTranslator_lang.load("share/ring/translations/ring_client_windows_" + locale_lang);
201 a.installTranslator(&mainTranslator_lang);
202 }
203 mainTranslator_name.load("share/ring/translations/ring_client_windows_" + locale_name);
204 a.installTranslator(&mainTranslator_name);
Edric Milaret53ac6e52015-09-14 13:37:06 -0400205
Edric Milaret627500d2015-03-27 16:41:40 -0400206 QFont font;
207 font.setFamily("Segoe UI");
208 a.setFont(font);
209
210 QFile file(":/stylesheet.css");
211 if(file.open(QIODevice::ReadOnly | QIODevice::Text))
212 {
213 a.setStyleSheet(file.readAll());
214 file.close();
215 }
216
Olivier SOLDANO2100f1c2017-09-06 16:45:20 -0400217 QFontDatabase::addApplicationFont(":/images/FontAwesome.otf");
218
Olivier SOLDANO2100f1c2017-09-06 16:45:20 -0400219 MainWindow::instance().createThumbBar();
220
Edric Milaretfe390942015-08-04 13:41:03 -0400221 if (not uri.isEmpty()) {
222 startMinimized = false;
Edric Milaret9c3e7f72016-01-27 10:48:20 -0500223 MainWindow::instance().onRingEvent(uri);
Edric Milaretfe390942015-08-04 13:41:03 -0400224 }
225
Edric Milaret90bd5a82015-06-08 10:07:59 -0400226 if (not startMinimized)
Edric Milaret9c3e7f72016-01-27 10:48:20 -0500227 MainWindow::instance().show();
Edric Milaret51011352016-09-08 11:43:05 -0400228 else {
Edric Milaret9c3e7f72016-01-27 10:48:20 -0500229 MainWindow::instance().showMinimized();
Edric Milaret51011352016-09-08 11:43:05 -0400230 MainWindow::instance().hide();
231 }
Edric Milaret627500d2015-03-27 16:41:40 -0400232
Edric Milaret2cf34292015-06-22 16:27:03 -0400233
Edric Milaretfe390942015-08-04 13:41:03 -0400234#ifdef URI_PROTOCOL
Edric Milaret9c3e7f72016-01-27 10:48:20 -0500235 QObject::connect(shmClient, SIGNAL(RingEvent(QString)), &MainWindow::instance(), SLOT(onRingEvent(QString)));
Edric Milaretfe390942015-08-04 13:41:03 -0400236
237 QObject::connect(&a, &QApplication::aboutToQuit, [&a, &shmClient, &shm, &sem]() {
238 shmClient->terminate();
239 delete shmClient;
240 delete shm;
241 delete sem;
242 });
243#endif
Andreas Traczykd063d5a2018-08-10 12:56:23 -0400244
245 auto ret = a.exec();
246
Andreas Traczyka7238ee2018-12-12 15:55:05 -0500247 FreeConsole();
248
Andreas Traczykd063d5a2018-08-10 12:56:23 -0400249 QCoreApplication::exit();
250 GlobalSystemTray::instance().deleteLater();
251 GlobalSystemTray::instance().hide();
252
Andreas Traczyke8cf7552018-08-02 16:28:08 -0400253 return ret;
Edric Milaret627500d2015-03-27 16:41:40 -0400254}