diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/qt/openuridialog.cpp | 2 | ||||
-rw-r--r-- | src/qt/paymentserver.cpp | 25 | ||||
-rw-r--r-- | src/qt/paymentserver.h | 9 | ||||
-rw-r--r-- | src/qt/test/paymentservertests.cpp | 14 | ||||
-rw-r--r-- | src/qt/test/paymentservertests.h | 2 | ||||
-rw-r--r-- | src/qt/test/test_main.cpp | 8 | ||||
-rw-r--r-- | src/rpcnet.cpp | 2 | ||||
-rw-r--r-- | src/rpcrawtransaction.cpp | 2 | ||||
-rw-r--r-- | src/wallet.cpp | 9 |
9 files changed, 48 insertions, 25 deletions
diff --git a/src/qt/openuridialog.cpp b/src/qt/openuridialog.cpp index 803a3c9ddb..06189aeaf3 100644 --- a/src/qt/openuridialog.cpp +++ b/src/qt/openuridialog.cpp @@ -48,5 +48,5 @@ void OpenURIDialog::on_selectFileButton_clicked() if(filename.isEmpty()) return; QUrl fileUri = QUrl::fromLocalFile(filename); - ui->uriEdit->setText("bitcoin:?request=" + QUrl::toPercentEncoding(fileUri.toString())); + ui->uriEdit->setText("bitcoin:?r=" + QUrl::toPercentEncoding(fileUri.toString())); } diff --git a/src/qt/paymentserver.cpp b/src/qt/paymentserver.cpp index 34da0f90ec..ba5c06064f 100644 --- a/src/qt/paymentserver.cpp +++ b/src/qt/paymentserver.cpp @@ -232,7 +232,10 @@ bool PaymentServer::ipcSendCommandLine(int argc, char* argv[]) QLocalSocket* socket = new QLocalSocket(); socket->connectToServer(ipcServerName(), QIODevice::WriteOnly); if (!socket->waitForConnected(BITCOIN_IPC_CONNECT_TIMEOUT)) + { + delete socket; return false; + } QByteArray block; QDataStream out(&block, QIODevice::WriteOnly); @@ -277,8 +280,11 @@ PaymentServer::PaymentServer(QObject* parent, bool startLocalServer) : { uriServer = new QLocalServer(this); - if (!uriServer->listen(name)) - qDebug() << "PaymentServer::PaymentServer : Cannot start bitcoin: click-to-pay handler"; + if (!uriServer->listen(name)) { + // constructor is called early in init, so don't use "emit message()" here + QMessageBox::critical(0, tr("Payment request error"), + tr("Cannot start bitcoin: click-to-pay handler")); + } else { connect(uriServer, SIGNAL(newConnection()), this, SLOT(handleURIConnection())); connect(this, SIGNAL(receivedPaymentACK(QString)), this, SLOT(handlePaymentACK(QString))); @@ -295,12 +301,12 @@ PaymentServer::~PaymentServer() // OSX-specific way of handling bitcoin: URIs and // PaymentRequest mime types // -bool PaymentServer::eventFilter(QObject *, QEvent *event) +bool PaymentServer::eventFilter(QObject *object, QEvent *event) { - // clicking on bitcoin: URIs creates FileOpen events on the Mac: + // clicking on bitcoin: URIs creates FileOpen events on the Mac if (event->type() == QEvent::FileOpen) { - QFileOpenEvent* fileEvent = static_cast<QFileOpenEvent*>(event); + QFileOpenEvent *fileEvent = static_cast<QFileOpenEvent*>(event); if (!fileEvent->file().isEmpty()) handleURIOrFile(fileEvent->file()); else if (!fileEvent->url().isEmpty()) @@ -308,7 +314,8 @@ bool PaymentServer::eventFilter(QObject *, QEvent *event) return true; } - return false; + + return QObject::eventFilter(object, event); } void PaymentServer::initNetManager() @@ -359,17 +366,17 @@ void PaymentServer::handleURIOrFile(const QString& s) return; } - if (s.startsWith(BITCOIN_IPC_PREFIX, Qt::CaseInsensitive)) // bitcoin: + if (s.startsWith(BITCOIN_IPC_PREFIX, Qt::CaseInsensitive)) // bitcoin: URI { #if QT_VERSION < 0x050000 QUrl uri(s); #else QUrlQuery uri((QUrl(s))); #endif - if (uri.hasQueryItem("request")) + if (uri.hasQueryItem("r")) { QByteArray temp; - temp.append(uri.queryItemValue("request")); + temp.append(uri.queryItemValue("r")); QString decoded = QUrl::fromPercentEncoding(temp); QUrl fetchUrl(decoded, QUrl::StrictMode); diff --git a/src/qt/paymentserver.h b/src/qt/paymentserver.h index 50f077f3bc..ab59388acc 100644 --- a/src/qt/paymentserver.h +++ b/src/qt/paymentserver.h @@ -77,10 +77,6 @@ public: // Return certificate store static X509_STORE* getCertStore() { return certStore; } - // Constructor registers this on the parent QApplication to - // receive QEvent::FileOpen events - bool eventFilter(QObject *object, QEvent *event); - // OptionsModel is used for getting proxy settings and display unit void setOptionsModel(OptionsModel *optionsModel); @@ -111,6 +107,11 @@ private slots: void reportSslErrors(QNetworkReply*, const QList<QSslError> &); void handlePaymentACK(const QString& paymentACKMsg); +protected: + // Constructor registers this on the parent QApplication to + // receive QEvent::FileOpen and QEvent:Drop events + bool eventFilter(QObject *object, QEvent *event); + private: static bool readPaymentRequest(const QString& filename, PaymentRequestPlus& request); bool processPaymentRequest(PaymentRequestPlus& request, SendCoinsRecipient& recipient); diff --git a/src/qt/test/paymentservertests.cpp b/src/qt/test/paymentservertests.cpp index b8f2cc65cb..7dee7a9cda 100644 --- a/src/qt/test/paymentservertests.cpp +++ b/src/qt/test/paymentservertests.cpp @@ -7,12 +7,9 @@ #include <openssl/x509.h> #include <openssl/x509_vfy.h> -#include <QCoreApplication> -#include <QDebug> + #include <QFileOpenEvent> #include <QTemporaryFile> -#include <QVariant> - X509 *parse_b64der_cert(const char* cert_data) { @@ -41,9 +38,14 @@ static SendCoinsRecipient handleRequest(PaymentServer* server, std::vector<unsig f.write((const char*)&data[0], data.size()); f.close(); - // Create a FileOpenEvent and send it directly to the server's event filter: + // Create a QObject, install event filter from PaymentServer + // and send a file open event to the object + QObject object; + object.installEventFilter(server); QFileOpenEvent event(f.fileName()); - server->eventFilter(NULL, &event); + // If sending the event fails, this will cause sigCatcher to be empty, + // which will lead to a test failure anyway. + QCoreApplication::sendEvent(&object, &event); QObject::disconnect(server, SIGNAL(receivedPaymentRequest(SendCoinsRecipient)), &sigCatcher, SLOT(getRecipient(SendCoinsRecipient))); diff --git a/src/qt/test/paymentservertests.h b/src/qt/test/paymentservertests.h index 0bff923ad4..884e535a60 100644 --- a/src/qt/test/paymentservertests.h +++ b/src/qt/test/paymentservertests.h @@ -20,8 +20,10 @@ private slots: class RecipientCatcher : public QObject { Q_OBJECT + public slots: void getRecipient(SendCoinsRecipient r); + public: SendCoinsRecipient recipient; }; diff --git a/src/qt/test/test_main.cpp b/src/qt/test/test_main.cpp index 5c941c6387..ae584706f1 100644 --- a/src/qt/test/test_main.cpp +++ b/src/qt/test/test_main.cpp @@ -1,8 +1,7 @@ - - #include "paymentservertests.h" #include "uritests.h" +#include <QCoreApplication> #include <QObject> #include <QTest> @@ -11,6 +10,11 @@ int main(int argc, char *argv[]) { bool fInvalid = false; + // Don't remove this, it's needed to access + // QCoreApplication:: in the tests + QCoreApplication app(argc, argv); + app.setApplicationName("Bitcoin-Qt-test"); + URITests test1; if (QTest::qExec(&test1) != 0) fInvalid = true; diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp index 89bf53060e..baa3268fb0 100644 --- a/src/rpcnet.cpp +++ b/src/rpcnet.cpp @@ -319,7 +319,7 @@ Value getnettotals(const Array& params, bool fHelp) "\nResult:\n" "{\n" " \"totalbytesrecv\": n, (numeric) Total bytes received\n" - " \"totalbytessent\": n, (numeric) Total Bytes sent\n" + " \"totalbytessent\": n, (numeric) Total bytes sent\n" " \"timemillis\": t (numeric) Total cpu time\n" "}\n" "\nExamples:\n" diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index abbc33cc56..86025918ef 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -83,7 +83,7 @@ void TxToJSON(const CTransaction& tx, const uint256 hashBlock, Object& entry) out.push_back(Pair("value", ValueFromAmount(txout.nValue))); out.push_back(Pair("n", (boost::int64_t)i)); Object o; - ScriptPubKeyToJSON(txout.scriptPubKey, o, false); + ScriptPubKeyToJSON(txout.scriptPubKey, o, true); out.push_back(Pair("scriptPubKey", o)); vout.push_back(out); } diff --git a/src/wallet.cpp b/src/wallet.cpp index 14d685d6e2..241e937b1b 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -765,6 +765,10 @@ void CWalletTx::AddSupportingTransactions() { tx = *mapWalletPrev[hash]; } + else + { + continue; + } int nDepth = tx.SetMerkleBranch(); vtxPrev.push_back(tx); @@ -895,7 +899,10 @@ void CWalletTx::RelayWalletTransaction() { BOOST_FOREACH(const CMerkleTx& tx, vtxPrev) { - if (!tx.IsCoinBase()) + // Important: versions of bitcoin before 0.8.6 had a bug that inserted + // empty transactions into the vtxPrev, which will cause the node to be + // banned when retransmitted, hence the check for !tx.vin.empty() + if (!tx.IsCoinBase() && !tx.vin.empty()) if (tx.GetDepthInMainChain() == 0) RelayTransaction((CTransaction)tx, tx.GetHash()); } |