aboutsummaryrefslogtreecommitdiff
path: root/src/qt/bitcoin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qt/bitcoin.cpp')
-rw-r--r--src/qt/bitcoin.cpp124
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