8 #if defined(HAVE_CONFIG_H)
55 #include <boost/thread.hpp>
57 #include <QApplication>
59 #include <QLibraryInfo>
61 #include <QMessageBox>
66 #include <QTranslator>
68 #if defined(QT_STATICPLUGIN)
70 #if defined(QT_QPA_PLATFORM_XCB)
71 Q_IMPORT_PLUGIN(QXcbIntegrationPlugin);
72 #elif defined(QT_QPA_PLATFORM_WINDOWS)
73 Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin);
74 #elif defined(QT_QPA_PLATFORM_COCOA)
75 Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin);
80 #define DEBUG_BACKTRACE 1
82 static bool needShowRecoveryDialog =
false;
85 Q_DECLARE_METATYPE(
bool*)
88 static void InitMessage(
const std::string& message)
93 static void ShowRecoveryDialog()
95 needShowRecoveryDialog =
true;
101 static std::string Translate(
const char* psz)
103 return QCoreApplication::translate(
"prcycoin-core", psz).toStdString();
106 static QString GetLangTerritory()
111 QString lang_territory = QLocale::system().name();
113 QString lang_territory_qsettings = settings.value(
"language",
"").toString();
114 if (!lang_territory_qsettings.isEmpty())
115 lang_territory = lang_territory_qsettings;
117 lang_territory = QString::fromStdString(
GetArg(
"-lang", lang_territory.toStdString()));
118 return lang_territory;
122 static void initTranslations(QTranslator& qtTranslatorBase, QTranslator& qtTranslator, QTranslator& translatorBase, QTranslator& translator)
125 QApplication::removeTranslator(&qtTranslatorBase);
126 QApplication::removeTranslator(&qtTranslator);
127 QApplication::removeTranslator(&translatorBase);
128 QApplication::removeTranslator(&translator);
132 QString lang_territory = GetLangTerritory();
135 QString lang = lang_territory;
136 lang.truncate(lang_territory.lastIndexOf(
'_'));
143 if (qtTranslatorBase.load(
"qt_" + lang, QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
144 QApplication::installTranslator(&qtTranslatorBase);
147 if (qtTranslator.load(
"qt_" + lang_territory, QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
148 QApplication::installTranslator(&qtTranslator);
151 if (translatorBase.load(lang,
":/translations/"))
152 QApplication::installTranslator(&translatorBase);
155 if (translator.load(lang_territory,
":/translations/"))
156 QApplication::installTranslator(&translator);
163 if (type == QtDebugMsg) {
166 LogPrintf(
"GUI: %s\n", msg.toStdString());
182 void restart(QStringList args);
206 void createPaymentServer();
257 #include "prcycoin.moc"
274 qDebug() << __func__ <<
": Running AppInit2 in thread";
277 }
catch (
const std::exception& e) {
289 qDebug() << __func__ <<
": Running Restart in thread";
292 qDebug() << __func__ <<
": Shutdown finished";
295 QProcess::startDetached(QApplication::applicationFilePath(), args);
296 qDebug() << __func__ <<
": Restart initiated...";
297 QApplication::quit();
298 }
catch (
const std::exception& e) {
309 qDebug() << __func__ <<
": Running Shutdown in thread";
312 qDebug() << __func__ <<
": Shutdown finished";
314 }
catch (
const std::exception& e) {
326 pollShutdownTimer(0),
333 setQuitOnLastWindowClosed(
false);
339 qDebug() << __func__ <<
": Stopping thread";
342 qDebug() << __func__ <<
": Stopped thread";
348 delete paymentServer;
362 void BitcoinApplication::createPaymentServer()
386 splash->setAttribute(Qt::WA_DeleteOnClose);
388 connect(
this, SIGNAL(
splashFinished(QWidget*)), splash, SLOT(slotFinish(QWidget*)));
407 connect(
this, SIGNAL(
stopThread()), executor, SLOT(deleteLater()));
425 qDebug() << __func__ <<
": Requesting initialize";
432 qDebug() << __func__ <<
": Requesting shutdown";
439 window->removeAllWallets();
455 qDebug() << __func__ <<
": Initialization result: " << retval;
465 bool walletUnlocked =
false;
468 if (needShowRecoveryDialog) {
471 importOrCreate.setWindowFlags(Qt::WindowStaysOnTopHint);
472 importOrCreate.exec();
477 enterMnemonics.setWindowFlags(Qt::WindowStaysOnTopHint);
478 enterMnemonics.exec();
498 connect(
window, SIGNAL(receivedURI(QString)),
499 paymentServer, SLOT(handleURIOrFile(QString)));
500 connect(paymentServer, SIGNAL(message(QString, QString,
unsigned int)),
501 window, SLOT(message(QString, QString,
unsigned int)));
502 QTimer::singleShot(100, paymentServer, SLOT(uiReady()));
507 walletUnlocked =
true;
516 dlg.setWindowTitle(
"Encrypt Wallet");
520 walletModel->updateStatus();
532 qDebug() << __func__ <<
": Shutdown result: " << retval;
538 QMessageBox::critical(0,
"Runaway exception", BitcoinGUI::tr(
"A fatal error occurred. PRCY can no longer continue safely and will quit.") + QString(
"\n\n") + message);
550 #ifdef DEBUG_BACKTRACE
557 size = backtrace(array, 50);
560 fprintf(stderr,
"Error: signal %d:\n", sig);
561 backtrace_symbols_fd(array, size, STDERR_FILENO);
567 #ifndef BITCOIN_QT_TEST
568 int main(
int argc,
char* argv[])
571 #ifdef DEBUG_BACKTRACE
584 Q_INIT_RESOURCE(prcycoin_locale);
585 Q_INIT_RESOURCE(prcycoin);
589 QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
590 #if QT_VERSION >= 0x050600
591 QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
594 QApplication::setAttribute(Qt::AA_DontShowIconsInMenus);
598 qRegisterMetaType<bool*>();
601 qRegisterMetaType<CAmount>(
"CAmount");
612 QTranslator qtTranslatorBase, qtTranslator, translatorBase, translator;
613 initTranslations(qtTranslatorBase, qtTranslator, translatorBase, translator);
632 QMessageBox::critical(0, QObject::tr(
"PRCY"),
633 QObject::tr(
"Error: Specified data directory \"%1\" does not exist.").arg(QString::fromStdString(
mapArgs[
"-datadir"])));
638 }
catch (
const std::exception& e) {
639 QMessageBox::critical(0, QObject::tr(
"PRCY"),
640 QObject::tr(
"Error: Cannot parse configuration file: %1. Only use key=value syntax.").arg(e.what()));
652 QMessageBox::critical(0, QObject::tr(
"PRCY"), QObject::tr(
"Error: Invalid combination of -regtest and -testnet."));
661 assert(!networkStyle.isNull());
663 QApplication::setApplicationName(networkStyle->getAppName());
665 initTranslations(qtTranslatorBase, qtTranslator, translatorBase, translator);
671 QMessageBox::critical(0, QObject::tr(
"PRCY"),
672 QObject::tr(
"Error reading masternode configuration file: %1").arg(strErr.c_str()));
687 app.createPaymentServer();
693 #if defined(Q_OS_WIN)
695 qApp->installNativeEventFilter(
new WinShutdownMonitor());
714 #if defined(Q_OS_WIN)
715 WinShutdownMonitor::registerShutdownBlockReason(QObject::tr(
"PRCY didn't yet exit safely..."), (HWND)app.
getMainWinId());
720 }
catch (
const std::exception& e) {
729 #endif // BITCOIN_QT_TEST