diff options
Diffstat (limited to 'src/qt/bitcoin.cpp')
-rw-r--r-- | src/qt/bitcoin.cpp | 124 |
1 files changed, 105 insertions, 19 deletions
diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index debd280509..d71073324d 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -1,5 +1,5 @@ /* - * W.J. van der Laan 2011 + * W.J. van der Laan 2011-2012 */ #include "bitcoingui.h" #include "clientmodel.h" @@ -8,6 +8,7 @@ #include "headers.h" #include "init.h" +#include "qtipcserver.h" #include "util.h" #include <QApplication> @@ -19,24 +20,18 @@ #include <QSplashScreen> #include <QLibraryInfo> +#include <boost/interprocess/ipc/message_queue.hpp> + // Need a global reference for the notifications to find the GUI BitcoinGUI *guiref; QSplashScreen *splashref; int MyMessageBox(const std::string& message, const std::string& caption, int style, wxWindow* parent, int x, int y) { - // Message from main thread - if(guiref) - { - guiref->error(QString::fromStdString(caption), - QString::fromStdString(message)); - } - else - { - QMessageBox::critical(0, QString::fromStdString(caption), - QString::fromStdString(message), - QMessageBox::Ok, QMessageBox::Ok); - } + // Message from AppInit2(), always in main thread before main window is constructed + QMessageBox::critical(0, QString::fromStdString(caption), + QString::fromStdString(message), + QMessageBox::Ok, QMessageBox::Ok); return 4; } @@ -87,6 +82,22 @@ bool ThreadSafeAskFee(int64 nFeeRequired, const std::string& strCaption, wxWindo return payFee; } +void ThreadSafeHandleURI(const std::string& strURI) +{ + if(!guiref) + return; + + // Call slot on GUI thread. + // If called from another thread, use a blocking QueuedConnection. + Qt::ConnectionType connectionType = Qt::DirectConnection; + if(QThread::currentThread() != QCoreApplication::instance()->thread()) + { + connectionType = Qt::BlockingQueuedConnection; + } + QMetaObject::invokeMethod(guiref, "handleURI", connectionType, + Q_ARG(QString, QString::fromStdString(strURI))); +} + void CalledSetStatusBar(const std::string& strText, int nField) { // Only used for built-in mining, which is disabled, simple ignore @@ -134,19 +145,71 @@ static void handleRunawayException(std::exception *e) exit(1); } +#ifndef BITCOIN_QT_TEST int main(int argc, char *argv[]) { +#if !defined(MAC_OSX) && !defined(WIN32) && !defined(__FreeBSD__) +// TODO: implement qtipcserver.cpp for Mac and Windows + + // Do this early as we don't want to bother initializing if we are just calling IPC + for (int i = 1; i < argc; i++) + { + if (strlen(argv[i]) > 7 && strncasecmp(argv[i], "bitcoin:", 8) == 0) + { + const char *strURI = argv[i]; + try { + boost::interprocess::message_queue mq(boost::interprocess::open_only, BITCOINURI_QUEUE_NAME); + if(mq.try_send(strURI, strlen(strURI), 0)) + exit(0); + else + break; + } + catch (boost::interprocess::interprocess_exception &ex) { + break; + } + } + } +#endif + + // Internal string conversion is all UTF-8 QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForCStrings(QTextCodec::codecForTr()); Q_INIT_RESOURCE(bitcoin); QApplication app(argc, argv); - // Load language files for system locale: + // Command-line options take precedence: + ParseParameters(argc, argv); + + // ... then bitcoin.conf: + if (!ReadConfigFile(mapArgs, mapMultiArgs)) + { + // This message can not be translated, as translation is not initialized yet + // (which not yet possible because lang=XX can be overridden in bitcoin.conf in the data directory) + QMessageBox::critical(0, "Bitcoin", + QString("Error: Specified data directory \"%1\" does not exist.").arg(QString::fromStdString(mapArgs["-datadir"]))); + return 1; + } + + // Application identification (must be set before OptionsModel is initialized, + // as it is used to locate QSettings) + app.setOrganizationName("Bitcoin"); + app.setOrganizationDomain("bitcoin.org"); + if(GetBoolArg("-testnet")) // Separate UI settings for testnet + app.setApplicationName("Bitcoin-Qt-testnet"); + else + app.setApplicationName("Bitcoin-Qt"); + + // ... then GUI settings: + OptionsModel optionsModel; + + // Get desired locale ("en_US") from command line or system locale + QString lang_territory = QString::fromStdString(GetArg("-lang", QLocale::system().name().toStdString())); + // Load language files for configured locale: // - First load the translator for the base language, without territory // - Then load the more specific locale translator - QString lang_territory = QLocale::system().name(); // "en_US" QString lang = lang_territory; + lang.truncate(lang_territory.lastIndexOf('_')); // "en" QTranslator qtTranslatorBase, qtTranslator, translatorBase, translator; @@ -166,10 +229,8 @@ int main(int argc, char *argv[]) if (!translator.isEmpty()) app.installTranslator(&translator); - app.setApplicationName(QApplication::translate("main", "Bitcoin-Qt")); - QSplashScreen splash(QPixmap(":/images/splash"), 0); - if (!GetBoolArg("-min")) + if (GetBoolArg("-splash", true) && !GetBoolArg("-min")) { splash.show(); splash.setAutoFillBackground(true); @@ -187,10 +248,13 @@ int main(int argc, char *argv[]) { // Put this in a block, so that BitcoinGUI is cleaned up properly before // calling Shutdown() in case of exceptions. + + optionsModel.Upgrade(); // Must be done after AppInit2 + BitcoinGUI window; if (splashref) splash.finish(&window); - OptionsModel optionsModel(pwalletMain); + ClientModel clientModel(&optionsModel); WalletModel walletModel(pwalletMain, &optionsModel); @@ -208,6 +272,27 @@ int main(int argc, char *argv[]) window.show(); } + // Place this here as guiref has to be defined if we don't want to lose URIs + ipcInit(); + +#if !defined(MAC_OSX) && !defined(WIN32) && !defined(__FreeBSD__) +// TODO: implement qtipcserver.cpp for Mac and Windows + + // Check for URI in argv + for (int i = 1; i < argc; i++) + { + if (strlen(argv[i]) > 7 && strncasecmp(argv[i], "bitcoin:", 8) == 0) + { + const char *strURI = argv[i]; + try { + boost::interprocess::message_queue mq(boost::interprocess::open_only, BITCOINURI_QUEUE_NAME); + mq.try_send(strURI, strlen(strURI), 0); + } + catch (boost::interprocess::interprocess_exception &ex) { + } + } + } +#endif app.exec(); window.hide(); @@ -227,3 +312,4 @@ int main(int argc, char *argv[]) } return 0; } +#endif // BITCOIN_QT_TEST |