blob: 0003b06191be41e7ed0ca02135bc9d83e924b3e3 [file] [log] [blame]
Edric Milaret627500d2015-03-27 16:41:40 -04001/***************************************************************************
Anthony Léonard2fde81d2017-04-17 10:06:55 -04002 * Copyright (C) 2015-2017 by Savoir-faire Linux *
Edric Milaret627500d2015-03-27 16:41:40 -04003 * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>*
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 3 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
17 **************************************************************************/
18
19#include "mainwindow.h"
Andreas Traczyk43c08232018-10-31 13:42:09 -040020
Edric Milaret627500d2015-03-27 16:41:40 -040021#include <QApplication>
22#include <QFile>
23
Edric Milaret12353822015-05-14 14:41:09 -040024#include "callmodel.h"
Edric Milaret1b197eb2015-06-01 15:09:56 -040025#include "media/audio.h"
26#include "media/video.h"
27#include "media/text.h"
28#include "media/file.h"
Anthony Léonard8c136442017-04-28 11:24:14 -040029#include "globalinstances.h"
30#include "pixbufmanipulator.h"
Andreas Traczykfdc7f9b2018-08-14 18:42:03 -040031#include "lrcinstance.h"
Edric Milaret12353822015-05-14 14:41:09 -040032
Edric Milaret53ac6e52015-09-14 13:37:06 -040033#include <QTranslator>
34#include <QLibraryInfo>
Olivier SOLDANOfe18af32017-04-28 11:54:15 -040035#include <QFontDatabase>
Edric Milaret12353822015-05-14 14:41:09 -040036
Andreas Traczyke0a60b52018-07-10 18:16:15 -040037#include <ciso646>
Edric Milaretfe390942015-08-04 13:41:03 -040038
Andreas Traczyk43c08232018-10-31 13:42:09 -040039#include "utils.h"
40
Edric Milaret36587362016-02-04 12:30:52 -050041#ifdef Q_OS_WIN
Edric Milaret12353822015-05-14 14:41:09 -040042#include <windows.h>
Edric Milaretb37aa1f2015-07-09 16:39:04 -040043#endif
Edric Milaret12353822015-05-14 14:41:09 -040044
Andreas Traczyk43c08232018-10-31 13:42:09 -040045#if defined _MSC_VER && !COMPILE_ONLY
Andreas Traczyke0a60b52018-07-10 18:16:15 -040046#include <gnutls/gnutls.h>
47#endif
48
Edric Milaretfe390942015-08-04 13:41:03 -040049#ifdef URI_PROTOCOL
50#include "shmclient.h"
51#endif
52
Edric Milaret1b197eb2015-06-01 15:09:56 -040053REGISTER_MEDIA();
54
Edric Milaret5c3ff7c2015-06-22 10:30:08 -040055void
56Console()
57{
Edric Milaret36587362016-02-04 12:30:52 -050058#ifdef Q_OS_WIN
Andreas Traczykfdc7f9b2018-08-14 18:42:03 -040059#ifdef _MSC_VER
60 // Print debug to output window if using VS
61 QObject::connect(
62 &LRCInstance::behaviorController(),
63 &lrc::api::BehaviorController::debugMessageReceived,
64 [](const std::string& message) {
65 OutputDebugStringA((message + "\n").c_str());
66 });
67#else
Edric Milaret5c3ff7c2015-06-22 10:30:08 -040068 AllocConsole();
69 freopen("CONOUT$", "w", stdout);
70 freopen("CONOUT$", "w", stderr);
71
72 COORD coordInfo;
73 coordInfo.X = 130;
74 coordInfo.Y = 9000;
75
76 SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coordInfo);
77 SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE),ENABLE_QUICK_EDIT_MODE| ENABLE_EXTENDED_FLAGS);
Edric Milaretb37aa1f2015-07-09 16:39:04 -040078#endif
Andreas Traczykfdc7f9b2018-08-14 18:42:03 -040079#endif
Edric Milaret5c3ff7c2015-06-22 10:30:08 -040080}
81
Edric Milaret627500d2015-03-27 16:41:40 -040082int
83main(int argc, char *argv[])
84{
Edric Milaret5e6d6722016-09-13 12:00:42 -040085 QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
Edric Milarete7dbb522016-01-20 13:30:08 -050086
Edric Milaret627500d2015-03-27 16:41:40 -040087 QApplication a(argc, argv);
88
Sébastien Blincba5b522018-12-10 12:48:36 -050089 QCoreApplication::setOrganizationDomain("jami.net");
90 QCoreApplication::setApplicationName("Jami");
Andreas Traczyk7548e732018-12-12 10:47:21 -050091
Olivier SOLDANO41e61ab2017-08-04 16:47:16 -040092 GlobalInstances::setPixmapManipulator(std::unique_ptr<PixbufManipulator>(new PixbufManipulator()));
Anthony Léonard8c136442017-04-28 11:24:14 -040093
Edric Milaret5c3ff7c2015-06-22 10:30:08 -040094 auto startMinimized = false;
Edric Milaretfe390942015-08-04 13:41:03 -040095 QString uri = "";
Edric Milaret5c3ff7c2015-06-22 10:30:08 -040096
Andreas Traczyk43c08232018-10-31 13:42:09 -040097#if defined _MSC_VER && !COMPILE_ONLY
Andreas Traczykfdc7f9b2018-08-14 18:42:03 -040098 gnutls_global_init();
99#endif
100
101 LRCInstance::init();
102
Edric Milaret5c3ff7c2015-06-22 10:30:08 -0400103 for (auto string : QCoreApplication::arguments()) {
104 if (string == "-m" || string == "--minimized")
105 startMinimized = true;
106 if (string == "-d" || string == "--debug")
107 Console();
Edric Milaretfe390942015-08-04 13:41:03 -0400108 if (string.startsWith("ring:")) {
109 uri = string;
110 }
Edric Milaret5c3ff7c2015-06-22 10:30:08 -0400111 }
112
Edric Milaretfe390942015-08-04 13:41:03 -0400113#ifdef URI_PROTOCOL
114 QSharedMemory* shm = new QSharedMemory("RingShm");
115 QSystemSemaphore* sem = new QSystemSemaphore("RingSem", 0);
116
117 if (not shm->create(1024)) {
118 if (not uri.isEmpty()) {
119 shm->attach();
120 shm->lock();
121 char *to = (char*) shm->data();
122 QChar *data = uri.data();
123 while (!data->isNull())
124 {
125 memset(to, data->toLatin1(), 1);
126 ++data;
127 ++to;
128 }
129 memset(to, 0, 1); //null terminator
130 shm->unlock();
131 }
132 sem->release();
133
134 delete shm;
135 exit(EXIT_SUCCESS);
136 }
137 //Client listening to shm event
138 memset((char*)shm->data(), 0, shm->size());
139 ShmClient* shmClient = new ShmClient(shm, sem);
140#endif
141
Guillaume Rogueza11df1a2017-07-14 13:04:58 -0400142 const auto locale_name = QLocale::system().name();
143 const auto locale_lang = locale_name.split('_')[0];
Edric Milaret53ac6e52015-09-14 13:37:06 -0400144
Guillaume Rogueza11df1a2017-07-14 13:04:58 -0400145 QTranslator qtTranslator_lang;
146 QTranslator qtTranslator_name;
147 if (locale_name != locale_lang) {
148 qtTranslator_lang.load("qt_" + locale_lang, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
149 a.installTranslator(&qtTranslator_lang);
150 }
151 qtTranslator_name.load("qt_" + locale_name, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
152 a.installTranslator(&qtTranslator_name);
Edric Milaret53ac6e52015-09-14 13:37:06 -0400153
Guillaume Rogueza11df1a2017-07-14 13:04:58 -0400154 QTranslator lrcTranslator_lang;
155 QTranslator lrcTranslator_name;
156 if (locale_name != locale_lang) {
157 lrcTranslator_lang.load("share/libringclient/translations/lrc_" + locale_lang);
158 a.installTranslator(&lrcTranslator_lang);
159 }
160 lrcTranslator_name.load("share/libringclient/translations/lrc_" + locale_name);
161 a.installTranslator(&lrcTranslator_name);
162
163 QTranslator mainTranslator_lang;
164 QTranslator mainTranslator_name;
165 if (locale_name != locale_lang) {
166 mainTranslator_lang.load("share/ring/translations/ring_client_windows_" + locale_lang);
167 a.installTranslator(&mainTranslator_lang);
168 }
169 mainTranslator_name.load("share/ring/translations/ring_client_windows_" + locale_name);
170 a.installTranslator(&mainTranslator_name);
Edric Milaret53ac6e52015-09-14 13:37:06 -0400171
Edric Milaret627500d2015-03-27 16:41:40 -0400172 QFont font;
173 font.setFamily("Segoe UI");
174 a.setFont(font);
175
176 QFile file(":/stylesheet.css");
177 if(file.open(QIODevice::ReadOnly | QIODevice::Text))
178 {
179 a.setStyleSheet(file.readAll());
180 file.close();
181 }
182
Olivier SOLDANO2100f1c2017-09-06 16:45:20 -0400183 QFontDatabase::addApplicationFont(":/images/FontAwesome.otf");
184
Olivier SOLDANO2100f1c2017-09-06 16:45:20 -0400185 MainWindow::instance().createThumbBar();
186
Edric Milaretfe390942015-08-04 13:41:03 -0400187 if (not uri.isEmpty()) {
188 startMinimized = false;
Edric Milaret9c3e7f72016-01-27 10:48:20 -0500189 MainWindow::instance().onRingEvent(uri);
Edric Milaretfe390942015-08-04 13:41:03 -0400190 }
191
Edric Milaret90bd5a82015-06-08 10:07:59 -0400192 if (not startMinimized)
Edric Milaret9c3e7f72016-01-27 10:48:20 -0500193 MainWindow::instance().show();
Edric Milaret51011352016-09-08 11:43:05 -0400194 else {
Edric Milaret9c3e7f72016-01-27 10:48:20 -0500195 MainWindow::instance().showMinimized();
Edric Milaret51011352016-09-08 11:43:05 -0400196 MainWindow::instance().hide();
197 }
Edric Milaret627500d2015-03-27 16:41:40 -0400198
Edric Milaret2cf34292015-06-22 16:27:03 -0400199
Edric Milaretfe390942015-08-04 13:41:03 -0400200#ifdef URI_PROTOCOL
Edric Milaret9c3e7f72016-01-27 10:48:20 -0500201 QObject::connect(shmClient, SIGNAL(RingEvent(QString)), &MainWindow::instance(), SLOT(onRingEvent(QString)));
Edric Milaretfe390942015-08-04 13:41:03 -0400202
203 QObject::connect(&a, &QApplication::aboutToQuit, [&a, &shmClient, &shm, &sem]() {
204 shmClient->terminate();
205 delete shmClient;
206 delete shm;
207 delete sem;
208 });
209#endif
Andreas Traczykd063d5a2018-08-10 12:56:23 -0400210
211 auto ret = a.exec();
212
213 QCoreApplication::exit();
214 GlobalSystemTray::instance().deleteLater();
215 GlobalSystemTray::instance().hide();
216
Andreas Traczyke8cf7552018-08-02 16:28:08 -0400217 return ret;
Edric Milaret627500d2015-03-27 16:41:40 -0400218}