From 7d145a0f591dab109eae9adcfaf59303cce0431a Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Fri, 23 Dec 2011 20:27:12 -0800 Subject: Add support for opening bitcoin: URIs directly. --- src/qt/bitcoin.cpp | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) (limited to 'src/qt/bitcoin.cpp') diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index 894bbb9d1..85ece9e2c 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -8,6 +8,7 @@ #include "headers.h" #include "init.h" +#include "qtipcserver.h" #include #include @@ -18,6 +19,8 @@ #include #include +#include + // Need a global reference for the notifications to find the GUI BitcoinGUI *guiref; QSplashScreen *splashref; @@ -79,6 +82,22 @@ bool ThreadSafeAskFee(int64 nFeeRequired, const std::string& strCaption, wxWindo return payFee; } +void ThreadSafeHandleURL(const std::string& strURL) +{ + 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, "handleURL", connectionType, + Q_ARG(QString, QString::fromStdString(strURL))); +} + void CalledSetStatusBar(const std::string& strText, int nField) { // Only used for built-in mining, which is disabled, simple ignore @@ -114,6 +133,25 @@ std::string _(const char* psz) int main(int argc, char *argv[]) { + // 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 *strURL = argv[i]; + try { + boost::interprocess::message_queue mq(boost::interprocess::open_only, "BitcoinURL"); + if(mq.try_send(strURL, strlen(strURL), 0)) + exit(0); + else + break; + } + catch (boost::interprocess::interprocess_exception &ex) { + break; + } + } + } + // Internal string conversion is all UTF-8 QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForCStrings(QTextCodec::codecForTr()); @@ -185,6 +223,23 @@ int main(int argc, char *argv[]) window.show(); } + // Place this here as guiref has to be defined if we dont want to lose URLs + ipcInit(); + // Check for URL in argv + for (int i = 1; i < argc; i++) + { + if (strlen(argv[i]) > 7 && strncasecmp(argv[i], "bitcoin:", 8) == 0) + { + const char *strURL = argv[i]; + try { + boost::interprocess::message_queue mq(boost::interprocess::open_only, "BitcoinURL"); + mq.try_send(strURL, strlen(strURL), 0); + } + catch (boost::interprocess::interprocess_exception &ex) { + } + } + } + app.exec(); guiref = 0; -- cgit v1.2.3