123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- // ECOin - Copyright (c) - 2014/2024 - GPLv3 - epsylon@riseup.net (https://03c8.net)
- #include "ecoingui.h"
- #include "clientmodel.h"
- #include "walletmodel.h"
- #include "optionsmodel.h"
- #include "guiutil.h"
- #include "guiutil.cpp"
- #include "guiconstants.h"
- #include "init.h"
- #include "ui_interface.h"
- #include "qtipcserver.h"
- #include <QApplication>
- #include <QMessageBox>
- #include <QTextCodec>
- #include <QLocale>
- #include <QTranslator>
- #include <QSplashScreen>
- #include <QLibraryInfo>
- #if defined(ECOIN_NEED_QT_PLUGINS) && !defined(_ECOIN_QT_PLUGINS_INCLUDED)
- #define _ECOIN_QT_PLUGINS_INCLUDED
- #define __INSURE__
- #include <QtPlugin>
- Q_IMPORT_PLUGIN(qcncodecs)
- Q_IMPORT_PLUGIN(qjpcodecs)
- Q_IMPORT_PLUGIN(qtwcodecs)
- Q_IMPORT_PLUGIN(qkrcodecs)
- Q_IMPORT_PLUGIN(qtaccessiblewidgets)
- #endif
- // Need a global reference for the notifications to find the GUI
- static EcoinGUI *guiref;
- static QSplashScreen *splashref;
- static void ThreadSafeMessageBox(const std::string& message, const std::string& caption, int style)
- {
- // Message from network thread
- if(guiref)
- {
- bool modal = (style & CClientUIInterface::MODAL);
- // in case of modal message, use blocking connection to wait for user to click OK
- QMetaObject::invokeMethod(guiref, "error",
- modal ? GUIUtil::blockingGUIThreadConnection() : Qt::QueuedConnection,
- Q_ARG(QString, QString::fromStdString(caption)),
- Q_ARG(QString, QString::fromStdString(message)),
- Q_ARG(bool, modal));
- }
- else
- {
- printf("%s: %s\n", caption.c_str(), message.c_str());
- fprintf(stderr, "%s: %s\n", caption.c_str(), message.c_str());
- }
- }
- static bool ThreadSafeAskFee(int64 nFeeRequired, const std::string& strCaption)
- {
- if(!guiref)
- return false;
- if(nFeeRequired < MIN_TX_FEE || nFeeRequired <= nTransactionFee || fDaemon)
- return true;
- bool payFee = false;
- QMetaObject::invokeMethod(guiref, "askFee", GUIUtil::blockingGUIThreadConnection(),
- Q_ARG(qint64, nFeeRequired),
- Q_ARG(bool*, &payFee));
- return payFee;
- }
- static void ThreadSafeHandleURI(const std::string& strURI)
- {
- if(!guiref)
- return;
- QMetaObject::invokeMethod(guiref, "handleURI", GUIUtil::blockingGUIThreadConnection(),
- Q_ARG(QString, QString::fromStdString(strURI)));
- }
- static void InitMessage(const std::string &message)
- {
- if(splashref)
- {
- splashref->showMessage(QString::fromStdString(message), Qt::AlignBottom|Qt::AlignHCenter, QColor(255,255,200));
- QApplication::instance()->processEvents();
- }
- }
- static void QueueShutdown()
- {
- QMetaObject::invokeMethod(QCoreApplication::instance(), "quit", Qt::QueuedConnection);
- }
- /*
- Translate string to current locale using Qt.
- */
- static std::string Translate(const char* psz)
- {
- return QCoreApplication::translate("ecoin-core", psz).toStdString();
- }
- /* Handle runaway exceptions. Shows a message box with the problem and quits the program.
- */
- static void handleRunawayException(std::exception *e)
- {
- PrintExceptionContinue(e, "Runaway exception");
- QMessageBox::critical(0, "Runaway exception", EcoinGUI::tr("A fatal error occurred. Ecoin can no longer continue safely and will quit.") + QString("\n\n") + QString::fromStdString(strMiscWarning));
- exit(1);
- }
- #ifndef ECOIN_QT_TEST
- int main(int argc, char *argv[])
- {
- // Do this early as we don't want to bother initializing if we are just calling IPC
- ipcScanRelay(argc, argv);
- // Internal string conversion is all UTF-8
- QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
- Q_INIT_RESOURCE(ecoin);
- QApplication app(argc, argv);
- // Install global event filter that makes sure that long tooltips can be word-wrapped
- app.installEventFilter(new GUIUtil::ToolTipToRichTextFilter(TOOLTIP_WRAP_THRESHOLD, &app));
- // Command-line options take precedence:
- ParseParameters(argc, argv);
- if (!boost::filesystem::is_directory(GetDataDir(false)))
- {
- QMessageBox::critical(0, "Ecoin",
- QString("Error: Specified data directory \"%1\" does not exist.").arg(QString::fromStdString(mapArgs["-datadir"])));
- return 1;
- }
- ReadConfigFile(mapArgs, mapMultiArgs);
- app.setOrganizationName("Ecoin");
- app.setOrganizationDomain("ecoin.su");
- if(GetBoolArg("-testnet")) // Separate UI settings for testnet
- app.setApplicationName("Ecoin-Qt-testnet");
- else
- app.setApplicationName("Ecoin-Qt");
- OptionsModel optionsModel;
- QString lang_territory = QString::fromStdString(GetArg("-lang", QLocale::system().name().toStdString()));
- QString lang = lang_territory;
- lang.truncate(lang_territory.lastIndexOf('_'));
- QTranslator qtTranslatorBase, qtTranslator, translatorBase, translator;
- if (qtTranslatorBase.load("qt_" + lang, QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
- app.installTranslator(&qtTranslatorBase);
- if (qtTranslator.load("qt_" + lang_territory, QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
- app.installTranslator(&qtTranslator);
- if (translatorBase.load(lang, ":/translations/"))
- app.installTranslator(&translatorBase);
- if (translator.load(lang_territory, ":/translations/"))
- app.installTranslator(&translator);
- uiInterface.ThreadSafeMessageBox.connect(ThreadSafeMessageBox);
- uiInterface.ThreadSafeAskFee.connect(ThreadSafeAskFee);
- uiInterface.ThreadSafeHandleURI.connect(ThreadSafeHandleURI);
- uiInterface.InitMessage.connect(InitMessage);
- uiInterface.QueueShutdown.connect(QueueShutdown);
- uiInterface.Translate.connect(Translate);
- if (mapArgs.count("-?") || mapArgs.count("--help"))
- {
- GUIUtil::HelpMessageBox help;
- help.showOrPrint();
- return 1;
- }
- QSplashScreen splash(QPixmap(":/images/splash"), 0);
- if (GetBoolArg("-splash", true) && !GetBoolArg("-min"))
- {
- splash.show();
- splash.setAutoFillBackground(true);
- splashref = &splash;
- }
- app.processEvents();
- app.setQuitOnLastWindowClosed(false);
- try
- {
- // Regenerate startup link, to fix links to old versions
- if (GUIUtil::GetStartOnSystemStartup())
- GUIUtil::SetStartOnSystemStartup(true);
- EcoinGUI window;
- guiref = &window;
- if(AppInit2())
- {
- {
- optionsModel.Upgrade(); // Must be done after AppInit2
- if (splashref)
- splash.finish(&window);
- ClientModel clientModel(&optionsModel);
- WalletModel walletModel(pwalletMain, &optionsModel);
- window.setClientModel(&clientModel);
- window.setWalletModel(&walletModel);
- // If -min option passed, start window minimized.
- if(GetBoolArg("-min"))
- {
- window.showMinimized();
- }
- else
- {
- window.show();
- }
- // Place this here as guiref has to be defined if we don't want to lose URIs
- ipcInit(argc, argv);
- app.exec();
- window.hide();
- window.setClientModel(0);
- window.setWalletModel(0);
- guiref = 0;
- }
- // Shutdown the core and its threads, but don't exit Ecoin-Qt here
- Shutdown(NULL);
- }
- else
- {
- return 1;
- }
- } catch (std::exception& e) {
- handleRunawayException(&e);
- } catch (...) {
- handleRunawayException(NULL);
- }
- return 0;
- }
- #endif // ECOIN_QT_TEST
|