Added 7za for Windows + work on updating.

This commit is contained in:
Martin Rotter 2014-04-10 20:10:05 +02:00
parent 163ec6f0f8
commit ef873433e8
9 changed files with 551 additions and 24 deletions

View File

@ -161,6 +161,13 @@ Status auto-aktualizace: %5</translation>
</translation> </translation>
</message> </message>
</context> </context>
<context>
<name>FeedsToolBar</name>
<message>
<source>Toolbar spacer</source>
<translation>Mezera</translation>
</message>
</context>
<context> <context>
<name>FeedsView</name> <name>FeedsView</name>
<message> <message>
@ -1176,6 +1183,22 @@ Autoři této aplikace nenesou žádnou odpovědnost za ztrátu Vašich dat.</tr
<source>custom external browser is not set correctly</source> <source>custom external browser is not set correctly</source>
<translation>vlastní externí prohlížeč není správně nastaven</translation> <translation>vlastní externí prohlížeč není správně nastaven</translation>
</message> </message>
<message>
<source>Toolbars</source>
<translation>Nástrojové lišty</translation>
</message>
<message>
<source>Toolbar for feeds list</source>
<translation>Lišta seznamu kanálů</translation>
</message>
<message>
<source>Toolbar for messages list</source>
<translation>Lišta seznamu zpráv</translation>
</message>
<message>
<source>Select toolbar to edit</source>
<translation>Zvolte lištu, kterou chcete upravit</translation>
</message>
</context> </context>
<context> <context>
<name>FormStandardCategoryDetails</name> <name>FormStandardCategoryDetails</name>
@ -1762,6 +1785,45 @@ Přejít na web aplikace a stáhnout jej ručně.</translation>
<translation>Obsah zprávy.</translation> <translation>Obsah zprávy.</translation>
</message> </message>
</context> </context>
<context>
<name>MessagesToolBar</name>
<message>
<source>Search messages</source>
<translation>Hledat zprávy</translation>
</message>
<message>
<source>Message search box</source>
<translation>Hledací panel zpráv</translation>
</message>
<message>
<source>Menu for highlighting messages</source>
<translation>Menu pro zvýrazňování zpráv</translation>
</message>
<message>
<source>No extra highlighting</source>
<translation>Nic nezvýrazňovat</translation>
</message>
<message>
<source>Highlight unread messages</source>
<translation>Zvýraznit nepřečtené zprávy</translation>
</message>
<message>
<source>Highlight important messages</source>
<translation>Zvýraznit důležité zprávy</translation>
</message>
<message>
<source>Display all messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Message highlighter</source>
<translation>Zvýrazňovač zpráv</translation>
</message>
<message>
<source>Toolbar spacer</source>
<translation>Mezera</translation>
</message>
</context>
<context> <context>
<name>MessagesView</name> <name>MessagesView</name>
<message> <message>
@ -1951,6 +2013,37 @@ Přejít na web aplikace a stáhnout jej ručně.</translation>
<translation>Otevřít nový tab webového prohlížeče.</translation> <translation>Otevřít nový tab webového prohlížeče.</translation>
</message> </message>
</context> </context>
<context>
<name>ToolBarEditor</name>
<message>
<source>Dialog</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Activated actions</source>
<translation>Aktivované akce</translation>
</message>
<message>
<source>Available actions</source>
<translation>Dostupné akce</translation>
</message>
<message>
<source>Insert separator</source>
<translation>Vložit oddělovač</translation>
</message>
<message>
<source>Insert spacer</source>
<translation>Vložit mezeru</translation>
</message>
<message>
<source>Separator</source>
<translation>Oddělovač</translation>
</message>
<message>
<source>Toolbar spacer</source>
<translation>Mezera</translation>
</message>
</context>
<context> <context>
<name>TrayIconMenu</name> <name>TrayIconMenu</name>
<message> <message>

View File

@ -151,6 +151,13 @@ Auto-update status: %5</source>
</translation> </translation>
</message> </message>
</context> </context>
<context>
<name>FeedsToolBar</name>
<message>
<source>Toolbar spacer</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>FeedsView</name> <name>FeedsView</name>
<message> <message>
@ -1150,6 +1157,22 @@ Authors of this application are NOT responsible for lost data.</source>
<source>custom external browser is not set correctly</source> <source>custom external browser is not set correctly</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Toolbars</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toolbar for feeds list</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toolbar for messages list</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select toolbar to edit</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>FormStandardCategoryDetails</name> <name>FormStandardCategoryDetails</name>
@ -1738,6 +1761,45 @@ Go to application website to obtain it manually.</source>
<translation>Inhalt der Nachricht.</translation> <translation>Inhalt der Nachricht.</translation>
</message> </message>
</context> </context>
<context>
<name>MessagesToolBar</name>
<message>
<source>Search messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Message search box</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Menu for highlighting messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>No extra highlighting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Highlight unread messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Highlight important messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display all messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Message highlighter</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toolbar spacer</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>MessagesView</name> <name>MessagesView</name>
<message> <message>
@ -1927,6 +1989,37 @@ Go to application website to obtain it manually.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>ToolBarEditor</name>
<message>
<source>Dialog</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Activated actions</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Available actions</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Insert separator</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Insert spacer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Separator</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toolbar spacer</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>TrayIconMenu</name> <name>TrayIconMenu</name>
<message> <message>

View File

@ -151,6 +151,13 @@ Auto-update status: %5</source>
</translation> </translation>
</message> </message>
</context> </context>
<context>
<name>FeedsToolBar</name>
<message>
<source>Toolbar spacer</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>FeedsView</name> <name>FeedsView</name>
<message> <message>
@ -1148,6 +1155,22 @@ Authors of this application are NOT responsible for lost data.</source>
<source>custom external browser is not set correctly</source> <source>custom external browser is not set correctly</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Toolbars</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toolbar for feeds list</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toolbar for messages list</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select toolbar to edit</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>FormStandardCategoryDetails</name> <name>FormStandardCategoryDetails</name>
@ -1733,6 +1756,45 @@ Go to application website to obtain it manually.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>MessagesToolBar</name>
<message>
<source>Search messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Message search box</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Menu for highlighting messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>No extra highlighting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Highlight unread messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Highlight important messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display all messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Message highlighter</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toolbar spacer</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>MessagesView</name> <name>MessagesView</name>
<message> <message>
@ -1922,6 +1984,37 @@ Go to application website to obtain it manually.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>ToolBarEditor</name>
<message>
<source>Dialog</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Activated actions</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Available actions</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Insert separator</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Insert spacer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Separator</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toolbar spacer</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>TrayIconMenu</name> <name>TrayIconMenu</name>
<message> <message>

View File

@ -157,6 +157,13 @@ Statut de la mise à jour automatique : %5</translation>
</translation> </translation>
</message> </message>
</context> </context>
<context>
<name>FeedsToolBar</name>
<message>
<source>Toolbar spacer</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>FeedsView</name> <name>FeedsView</name>
<message> <message>
@ -1172,6 +1179,22 @@ Les auteurs de cette application NE sont PAS responsable de la perte de données
<source>custom external browser is not set correctly</source> <source>custom external browser is not set correctly</source>
<translation>Le navigateur externe n&apos;a pas é correctement défini</translation> <translation>Le navigateur externe n&apos;a pas é correctement défini</translation>
</message> </message>
<message>
<source>Toolbars</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toolbar for feeds list</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toolbar for messages list</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select toolbar to edit</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>FormStandardCategoryDetails</name> <name>FormStandardCategoryDetails</name>
@ -1761,6 +1784,45 @@ Aller sur le site de l&apos;application pour les obtenir manuellement.</translat
<translation>Contenu du message.</translation> <translation>Contenu du message.</translation>
</message> </message>
</context> </context>
<context>
<name>MessagesToolBar</name>
<message>
<source>Search messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Message search box</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Menu for highlighting messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>No extra highlighting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Highlight unread messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Highlight important messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display all messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Message highlighter</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toolbar spacer</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>MessagesView</name> <name>MessagesView</name>
<message> <message>
@ -1950,6 +2012,37 @@ Aller sur le site de l&apos;application pour les obtenir manuellement.</translat
<translation type="unfinished">Ouvrir un nouvel onglet de navigation web.</translation> <translation type="unfinished">Ouvrir un nouvel onglet de navigation web.</translation>
</message> </message>
</context> </context>
<context>
<name>ToolBarEditor</name>
<message>
<source>Dialog</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Activated actions</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Available actions</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Insert separator</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Insert spacer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Separator</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toolbar spacer</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>TrayIconMenu</name> <name>TrayIconMenu</name>
<message> <message>

View File

@ -158,6 +158,13 @@ Status automatisch bijwerken: %5</translation>
</translation> </translation>
</message> </message>
</context> </context>
<context>
<name>FeedsToolBar</name>
<message>
<source>Toolbar spacer</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>FeedsView</name> <name>FeedsView</name>
<message> <message>
@ -1174,6 +1181,22 @@ Auteurs van Rssguard zijn NIET verantwoordelijk voor verlies van gegevens.</tran
<source>custom external browser is not set correctly</source> <source>custom external browser is not set correctly</source>
<translation>Aangepaste externe browser in niet correct ingesteld</translation> <translation>Aangepaste externe browser in niet correct ingesteld</translation>
</message> </message>
<message>
<source>Toolbars</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toolbar for feeds list</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toolbar for messages list</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select toolbar to edit</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>FormStandardCategoryDetails</name> <name>FormStandardCategoryDetails</name>
@ -1763,6 +1786,45 @@ Ga naar RRSguard website en download het handmatig.</translation>
<translation>Inhoud van het bericht.</translation> <translation>Inhoud van het bericht.</translation>
</message> </message>
</context> </context>
<context>
<name>MessagesToolBar</name>
<message>
<source>Search messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Message search box</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Menu for highlighting messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>No extra highlighting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Highlight unread messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Highlight important messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display all messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Message highlighter</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toolbar spacer</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>MessagesView</name> <name>MessagesView</name>
<message> <message>
@ -1952,6 +2014,37 @@ Ga naar RRSguard website en download het handmatig.</translation>
<translation>Open een nieuw webbrowser tabblad.</translation> <translation>Open een nieuw webbrowser tabblad.</translation>
</message> </message>
</context> </context>
<context>
<name>ToolBarEditor</name>
<message>
<source>Dialog</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Activated actions</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Available actions</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Insert separator</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Insert spacer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Separator</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toolbar spacer</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>TrayIconMenu</name> <name>TrayIconMenu</name>
<message> <message>

BIN
resources/7za/7za.exe Normal file

Binary file not shown.

View File

@ -29,7 +29,7 @@
#include <QDesktopServices> #include <QDesktopServices>
#include <QProcess> #include <QProcess>
#if defined(Q_OS_WIN32) #if defined(Q_OS_WIN)
#include "qt_windows.h" #include "qt_windows.h"
#endif #endif
@ -82,7 +82,7 @@ void FormUpdate::checkForUpdates() {
m_ui->m_lblAvailableRelease->setText(update.first.m_availableVersion); m_ui->m_lblAvailableRelease->setText(update.first.m_availableVersion);
m_ui->m_txtChanges->setText(update.first.m_changes); m_ui->m_txtChanges->setText(update.first.m_changes);
if (update.first.m_availableVersion >= APP_VERSION) { if (update.first.m_availableVersion > APP_VERSION) {
m_ui->m_lblStatus->setStatus(WidgetWithStatus::Ok, m_ui->m_lblStatus->setStatus(WidgetWithStatus::Ok,
tr("New release available."), tr("New release available."),
tr("This is new version which can be\ndownloaded and installed.")); tr("This is new version which can be\ndownloaded and installed."));
@ -116,7 +116,9 @@ void FormUpdate::startUpdate() {
// On Windows/OS2 we can update the application right away. // On Windows/OS2 we can update the application right away.
// Download the files. // Download the files.
QByteArray output; QByteArray output;
//NetworkFactory::downloadFile(url_file, DOWNLOAD_TIMEOUT, output); QNetworkReply::NetworkError download_result = NetworkFactory::downloadFile(url_file,
10 * DOWNLOAD_TIMEOUT,
output);
#if QT_VERSION >= 0x050000 #if QT_VERSION >= 0x050000
QString temp_directory = QStandardPaths::writableLocation(QStandardPaths::TempLocation); QString temp_directory = QStandardPaths::writableLocation(QStandardPaths::TempLocation);
@ -128,11 +130,7 @@ void FormUpdate::startUpdate() {
QString output_file_name = url_file.mid(url_file.lastIndexOf('/') + 1); QString output_file_name = url_file.mid(url_file.lastIndexOf('/') + 1);
QFile output_file(temp_directory + QDir::separator() + output_file_name); QFile output_file(temp_directory + QDir::separator() + output_file_name);
if (output_file.exists()) { if (output_file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
output_file.remove();
}
if (output_file.open(QIODevice::WriteOnly)) {
output_file.write(output); output_file.write(output);
output_file.flush(); output_file.flush();
output_file.close(); output_file.close();
@ -147,8 +145,9 @@ void FormUpdate::startUpdate() {
#if defined(Q_OS_WIN32) #if defined(Q_OS_WIN32)
ShellExecute(0, ShellExecute(0,
0, 0,
(wchar_t *)QString("updater.exe").utf16(), (wchar_t *) QString("updater.exe").utf16(),
(wchar_t *) QString("\"%1\" \"%2\"").arg(qApp->applicationFilePath(), (wchar_t *) QString("\"%1\" \"%2\" \"%3\"").arg(temp_directory,
qApp->applicationFilePath(),
output_file.fileName()).utf16(), output_file.fileName()).utf16(),
0, 0,
SW_SHOWNORMAL); SW_SHOWNORMAL);

View File

@ -6,7 +6,7 @@ Detector::Detector(QObject *parent) : QObject(parent) {
void Detector::handleMessage(const QString &message) { void Detector::handleMessage(const QString &message) {
if (message == "app_is_running") { if (message == "app_is_running") {
qDebug("Detected another instance of RSS Guard/Updater was starting..."); qDebug("Another instance of RSS Guard/Updater was starting...");
} }
else if (message == "app_quit") { else if (message == "app_quit") {
// zprava na vypnuti, tu ignorujeme. // zprava na vypnuti, tu ignorujeme.

View File

@ -22,21 +22,55 @@
#include <QDebug> #include <QDebug>
#include <QThread> #include <QThread>
#include <QProcess> #include <QProcess>
#include <QFileInfo>
#include <QDir>
bool removeDir(const QString & dirName) {
bool result = true;
QDir dir(dirName);
if (dir.exists(dirName)) {
foreach (QFileInfo info, dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst)) {
if (info.isDir()) {
result = removeDir(info.absoluteFilePath());
}
else {
result = QFile::remove(info.absoluteFilePath());
}
if (!result) {
return result;
}
}
result = dir.rmdir(dirName);
}
return result;
}
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
// Instantiate base application object. // Instantiate base application object.
QtSingleCoreApplication application("rssguard", argc, argv); QtSingleCoreApplication application("rssguard", argc, argv);
qDebug("Instantiated QtSingleApplication class.");
if (argc != 3) { if (argc != 4) {
qDebug("Insufficient arguments passed. Quitting updater..."); qDebug("Insufficient arguments passed. Quitting RSS Guard updater...");
return EXIT_FAILURE;
} }
else {
QString temp_directory = QDir::toNativeSeparators(argv[1]);
QString rssguard_executable = QDir::toNativeSeparators(argv[2]);
QString rssguard_path = QDir::toNativeSeparators(QFileInfo(rssguard_executable).absolutePath());
QString update_archive = QDir::toNativeSeparators(argv[3]);
// Print input data. // Print input data.
qDebug("RSS Guard application executable: %s", argv[1]); qDebug("\n===== directories & files =====");
qDebug("File with update to be installed: %s", argv[2]); qDebug("TEMP folder:\n\t %s", qPrintable(temp_directory));
} qDebug("RSS Guard application executable:\n\t %s", qPrintable(rssguard_executable));
qDebug("RSS Guard application path:\n\t %s", qPrintable(rssguard_path));
qDebug("File with update to be installed:\n\t %s", qPrintable(update_archive));
qDebug("===== directories & files =====\n");
// Check if main RSS Guard instance is running. // Check if main RSS Guard instance is running.
if (application.sendMessage("app_quit")) { if (application.sendMessage("app_quit")) {
@ -52,10 +86,39 @@ int main(int argc, char *argv[]) {
QObject::connect(&application, SIGNAL(messageReceived(QString)), QObject::connect(&application, SIGNAL(messageReceived(QString)),
&detector, SLOT(handleMessage(QString))); &detector, SLOT(handleMessage(QString)));
// Everything is set up, file is downloaded, RSS Guard is not running. QString extractor_program("7za.exe");
// TODO: nahradit spravne "/" > "\\" v argumentech pro 7za QStringList arguments;
// https://code.google.com/p/quite-rss/source/browse/src/mainwindow.cpp?repo=updater#393 QString output_temp_directory = temp_directory + QDir::separator() + "rssguard";
QProcess::startDetached("7za", QStringList() << "e" << argv[2]);
// Remove old folders.
if (QDir(output_temp_directory).exists()) {
removeDir(output_temp_directory);
}
arguments << "x" << update_archive << "-r" <<
"-y" << QString("-o%1").arg(output_temp_directory);
switch (QProcess::execute(extractor_program, arguments)) {
case -1:
qDebug("\nDecompressor crashed. Upgrading process failed.");
return EXIT_FAILURE;
case -2:
qDebug("\nDecompressor was not started successfully. Upgrading process failed.");
return EXIT_FAILURE;
case 0:
qDebug("\nDecompression is done.");
break;
default:
qDebug("\nUnspecified error occured.");
return EXIT_FAILURE;
}
// All needed files are now decompressed in temporary directory.
// Copy all possible files to RSS Guard application path and
// do final cleanup.
// Enter global event loop. // Enter global event loop.
return QtSingleCoreApplication::exec(); return QtSingleCoreApplication::exec();