aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bitcoinrpc.cpp14
-rw-r--r--src/init.cpp14
-rw-r--r--src/init.h1
-rw-r--r--src/main.cpp2
-rw-r--r--src/net.cpp2
-rw-r--r--src/noui.cpp7
-rw-r--r--src/qt/bitcoin.cpp1
-rw-r--r--src/qt/bitcoingui.cpp23
-rw-r--r--src/qt/guiutil.cpp23
-rw-r--r--src/qt/sendcoinsdialog.cpp12
-rw-r--r--src/qt/sendcoinsdialog.h2
-rw-r--r--src/test/test_bitcoin.cpp6
12 files changed, 70 insertions, 37 deletions
diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp
index 999c6dda09..8c3a615fd1 100644
--- a/src/bitcoinrpc.cpp
+++ b/src/bitcoinrpc.cpp
@@ -20,7 +20,7 @@
#include <boost/iostreams/stream.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/lexical_cast.hpp>
-#include <boost/asio/ssl.hpp>
+#include <boost/asio/ssl.hpp>
#include <boost/filesystem/fstream.hpp>
typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> SSLStream;
@@ -436,7 +436,7 @@ Value stop(const Array& params, bool fHelp)
"stop\n"
"Stop Bitcoin server.");
// Shutdown will take long enough that the response should get back
- uiInterface.QueueShutdown();
+ StartShutdown();
return "Bitcoin server stopping";
}
@@ -1148,7 +1148,7 @@ Value sendmany(const Array& params, bool fHelp)
CScript scriptPubKey;
scriptPubKey.SetDestination(address.Get());
- int64 nAmount = AmountFromValue(s.value_);
+ int64 nAmount = AmountFromValue(s.value_);
totalAmount += nAmount;
vecSend.push_back(make_pair(scriptPubKey, nAmount));
@@ -1524,7 +1524,7 @@ Value listtransactions(const Array& params, bool fHelp)
if ((int)ret.size() >= (nCount+nFrom)) break;
}
// ret is newest to oldest
-
+
if (nFrom > (int)ret.size())
nFrom = ret.size();
if ((nFrom + nCount) > (int)ret.size())
@@ -1935,7 +1935,7 @@ Value encryptwallet(const Array& params, bool fHelp)
// BDB seems to have a bad habit of writing old data into
// slack space in .dat files; that is bad if the old data is
// unencrypted private keys. So:
- uiInterface.QueueShutdown();
+ StartShutdown();
return "wallet encrypted; Bitcoin server stopping, restart to run with encrypted wallet";
}
@@ -2682,7 +2682,7 @@ void ThreadRPCServer2(void* parg)
GetConfigFile().string().c_str(),
EncodeBase58(&rand_pwd[0],&rand_pwd[0]+32).c_str()),
_("Error"), CClientUIInterface::OK | CClientUIInterface::MODAL);
- uiInterface.QueueShutdown();
+ StartShutdown();
return;
}
@@ -2703,7 +2703,7 @@ void ThreadRPCServer2(void* parg)
{
uiInterface.ThreadSafeMessageBox(strprintf(_("An error occured while setting up the RPC port %i for listening: %s"), endpoint.port(), e.what()),
_("Error"), CClientUIInterface::OK | CClientUIInterface::MODAL);
- uiInterface.QueueShutdown();
+ StartShutdown();
return;
}
diff --git a/src/init.cpp b/src/init.cpp
index bf9551e858..08b594f56c 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -38,6 +38,17 @@ void ExitTimeout(void* parg)
#endif
}
+void StartShutdown()
+{
+#ifdef QT_GUI
+ // ensure we leave the Qt main loop for a clean GUI exit (Shutdown() is called in bitcoin.cpp afterwards)
+ uiInterface.QueueShutdown();
+#else
+ // Without UI, Shutdown() can simply be started in a new thread
+ CreateThread(Shutdown, NULL);
+#endif
+}
+
void Shutdown(void* parg)
{
static CCriticalSection cs_Shutdown;
@@ -66,7 +77,10 @@ void Shutdown(void* parg)
Sleep(50);
printf("Bitcoin exited\n\n");
fExit = true;
+#ifndef QT_GUI
+ // ensure non UI client get's exited here, but let Bitcoin-Qt reach return 0; in bitcoin.cpp
exit(0);
+#endif
}
else
{
diff --git a/src/init.h b/src/init.h
index 6159ededa5..8308ee648b 100644
--- a/src/init.h
+++ b/src/init.h
@@ -9,6 +9,7 @@
extern CWallet* pwalletMain;
+void StartShutdown();
void Shutdown(void* parg);
bool AppInit2();
std::string HelpMessage();
diff --git a/src/main.cpp b/src/main.cpp
index 50a740d160..fa3eb592a9 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1875,7 +1875,7 @@ bool CheckDiskSpace(uint64 nAdditionalBytes)
strMiscWarning = strMessage;
printf("*** %s\n", strMessage.c_str());
uiInterface.ThreadSafeMessageBox(strMessage, "Bitcoin", CClientUIInterface::OK | CClientUIInterface::ICON_EXCLAMATION | CClientUIInterface::MODAL);
- uiInterface.QueueShutdown();
+ StartShutdown();
return false;
}
return true;
diff --git a/src/net.cpp b/src/net.cpp
index d510709082..804cb0f543 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -1658,7 +1658,7 @@ void ThreadMessageHandler2(void* parg)
vnThreadsRunning[THREAD_MESSAGEHANDLER]--;
Sleep(100);
if (fRequestShutdown)
- Shutdown(NULL);
+ StartShutdown();
vnThreadsRunning[THREAD_MESSAGEHANDLER]++;
if (fShutdown)
return;
diff --git a/src/noui.cpp b/src/noui.cpp
index 3ba7e729f5..db25f2d285 100644
--- a/src/noui.cpp
+++ b/src/noui.cpp
@@ -20,16 +20,9 @@ static bool noui_ThreadSafeAskFee(int64 nFeeRequired, const std::string& strCapt
return true;
}
-static void noui_QueueShutdown()
-{
- // Without UI, Shutdown can simply be started in a new thread
- CreateThread(Shutdown, NULL);
-}
-
void noui_connect()
{
// Connect bitcoind signal handlers
uiInterface.ThreadSafeMessageBox.connect(noui_ThreadSafeMessageBox);
uiInterface.ThreadSafeAskFee.connect(noui_ThreadSafeAskFee);
- uiInterface.QueueShutdown.connect(noui_QueueShutdown);
}
diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp
index 2a2d200394..8c8c73f065 100644
--- a/src/qt/bitcoin.cpp
+++ b/src/qt/bitcoin.cpp
@@ -290,6 +290,7 @@ int main(int argc, char *argv[])
window.setWalletModel(0);
guiref = 0;
}
+ // Shutdown the core and it's threads, but don't exit Bitcoin-Qt here
Shutdown(NULL);
}
else
diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp
index c4cea52ee3..c642f4aa0b 100644
--- a/src/qt/bitcoingui.cpp
+++ b/src/qt/bitcoingui.cpp
@@ -744,12 +744,19 @@ void BitcoinGUI::dropEvent(QDropEvent *event)
{
if(event->mimeData()->hasUrls())
{
- gotoSendCoinsPage();
+ int nValidUrisFound = 0;
QList<QUrl> uris = event->mimeData()->urls();
foreach(const QUrl &uri, uris)
{
- sendCoinsPage->handleURI(uri.toString());
+ if (sendCoinsPage->handleURI(uri.toString()))
+ nValidUrisFound++;
}
+
+ // if valid URIs were found
+ if (nValidUrisFound)
+ gotoSendCoinsPage();
+ else
+ notificator->notify(Notificator::Warning, tr("URI handling"), tr("URI can not be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters."));
}
event->acceptProposedAction();
@@ -757,10 +764,14 @@ void BitcoinGUI::dropEvent(QDropEvent *event)
void BitcoinGUI::handleURI(QString strURI)
{
- gotoSendCoinsPage();
- sendCoinsPage->handleURI(strURI);
-
- showNormalIfMinimized();
+ // URI has to be valid
+ if (sendCoinsPage->handleURI(strURI))
+ {
+ showNormalIfMinimized();
+ gotoSendCoinsPage();
+ }
+ else
+ notificator->notify(Notificator::Warning, tr("URI handling"), tr("URI can not be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters."));
}
void BitcoinGUI::setEncryptionStatus(int status)
diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp
index 5dedc90d69..a8c2328853 100644
--- a/src/qt/guiutil.cpp
+++ b/src/qt/guiutil.cpp
@@ -4,6 +4,7 @@
#include "bitcoinunits.h"
#include "util.h"
#include "init.h"
+#include "base58.h"
#include <QString>
#include <QDateTime>
@@ -80,6 +81,11 @@ bool parseBitcoinURI(const QUrl &uri, SendCoinsRecipient *out)
if(uri.scheme() != QString("bitcoin"))
return false;
+ // check if the address is valid
+ CBitcoinAddress addressFromUri(uri.path().toStdString());
+ if (!addressFromUri.IsValid())
+ return false;
+
SendCoinsRecipient rv;
rv.address = uri.path();
rv.amount = 0;
@@ -222,19 +228,18 @@ Qt::ConnectionType blockingGUIThreadConnection()
bool checkPoint(const QPoint &p, const QWidget *w)
{
- QWidget *atW = qApp->widgetAt(w->mapToGlobal(p));
- if(!atW) return false;
- return atW->topLevelWidget() == w;
+ QWidget *atW = qApp->widgetAt(w->mapToGlobal(p));
+ if (!atW) return false;
+ return atW->topLevelWidget() == w;
}
bool isObscured(QWidget *w)
{
-
- return !(checkPoint(QPoint(0, 0), w)
- && checkPoint(QPoint(w->width() - 1, 0), w)
- && checkPoint(QPoint(0, w->height() - 1), w)
- && checkPoint(QPoint(w->width() - 1, w->height() - 1), w)
- && checkPoint(QPoint(w->width()/2, w->height()/2), w));
+ return !(checkPoint(QPoint(0, 0), w)
+ && checkPoint(QPoint(w->width() - 1, 0), w)
+ && checkPoint(QPoint(0, w->height() - 1), w)
+ && checkPoint(QPoint(w->width() - 1, w->height() - 1), w)
+ && checkPoint(QPoint(w->width() / 2, w->height() / 2), w));
}
void openDebugLogfile()
diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp
index 2eb228d1d4..76952e44ec 100644
--- a/src/qt/sendcoinsdialog.cpp
+++ b/src/qt/sendcoinsdialog.cpp
@@ -266,15 +266,17 @@ void SendCoinsDialog::pasteEntry(const SendCoinsRecipient &rv)
entry->setValue(rv);
}
-
-void SendCoinsDialog::handleURI(const QString &uri)
+bool SendCoinsDialog::handleURI(const QString &uri)
{
SendCoinsRecipient rv;
- if(!GUIUtil::parseBitcoinURI(uri, &rv))
+ // URI has to be valid
+ if (GUIUtil::parseBitcoinURI(uri, &rv))
{
- return;
+ pasteEntry(rv);
+ return true;
}
- pasteEntry(rv);
+
+ return false;
}
void SendCoinsDialog::setBalance(qint64 balance, qint64 unconfirmedBalance, qint64 immatureBalance)
diff --git a/src/qt/sendcoinsdialog.h b/src/qt/sendcoinsdialog.h
index 358c8cf85f..915b7ad465 100644
--- a/src/qt/sendcoinsdialog.h
+++ b/src/qt/sendcoinsdialog.h
@@ -30,7 +30,7 @@ public:
QWidget *setupTabChain(QWidget *prev);
void pasteEntry(const SendCoinsRecipient &rv);
- void handleURI(const QString &uri);
+ bool handleURI(const QString &uri);
public slots:
void clear();
diff --git a/src/test/test_bitcoin.cpp b/src/test/test_bitcoin.cpp
index bf597c9b73..96d63bff97 100644
--- a/src/test/test_bitcoin.cpp
+++ b/src/test/test_bitcoin.cpp
@@ -30,3 +30,9 @@ void Shutdown(void* parg)
{
exit(0);
}
+
+void StartShutdown()
+{
+ exit(0);
+}
+