Browse Source

Merge pull request #3254

4cf3411 [Qt] misc PaymentServer changes (e.g. changes to eventFilter()) (Philip Kaufmann)
0.10
Wladimir J. van der Laan 11 years ago
parent
commit
9ac11a4e1e
No known key found for this signature in database
GPG Key ID: 74810B012346C9A6
  1. 19
      src/qt/paymentserver.cpp
  2. 9
      src/qt/paymentserver.h
  3. 14
      src/qt/test/paymentservertests.cpp
  4. 2
      src/qt/test/paymentservertests.h
  5. 8
      src/qt/test/test_main.cpp

19
src/qt/paymentserver.cpp

@ -232,7 +232,10 @@ bool PaymentServer::ipcSendCommandLine(int argc, char* argv[])
QLocalSocket* socket = new QLocalSocket(); QLocalSocket* socket = new QLocalSocket();
socket->connectToServer(ipcServerName(), QIODevice::WriteOnly); socket->connectToServer(ipcServerName(), QIODevice::WriteOnly);
if (!socket->waitForConnected(BITCOIN_IPC_CONNECT_TIMEOUT)) if (!socket->waitForConnected(BITCOIN_IPC_CONNECT_TIMEOUT))
{
delete socket;
return false; return false;
}
QByteArray block; QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly); QDataStream out(&block, QIODevice::WriteOnly);
@ -277,8 +280,11 @@ PaymentServer::PaymentServer(QObject* parent, bool startLocalServer) :
{ {
uriServer = new QLocalServer(this); uriServer = new QLocalServer(this);
if (!uriServer->listen(name)) if (!uriServer->listen(name)) {
qDebug() << "PaymentServer::PaymentServer : Cannot start bitcoin: click-to-pay handler"; // 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 { else {
connect(uriServer, SIGNAL(newConnection()), this, SLOT(handleURIConnection())); connect(uriServer, SIGNAL(newConnection()), this, SLOT(handleURIConnection()));
connect(this, SIGNAL(receivedPaymentACK(QString)), this, SLOT(handlePaymentACK(QString))); connect(this, SIGNAL(receivedPaymentACK(QString)), this, SLOT(handlePaymentACK(QString)));
@ -295,9 +301,9 @@ PaymentServer::~PaymentServer()
// OSX-specific way of handling bitcoin: URIs and // OSX-specific way of handling bitcoin: URIs and
// PaymentRequest mime types // 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) if (event->type() == QEvent::FileOpen)
{ {
QFileOpenEvent *fileEvent = static_cast<QFileOpenEvent*>(event); QFileOpenEvent *fileEvent = static_cast<QFileOpenEvent*>(event);
@ -308,7 +314,8 @@ bool PaymentServer::eventFilter(QObject *, QEvent *event)
return true; return true;
} }
return false;
return QObject::eventFilter(object, event);
} }
void PaymentServer::initNetManager() void PaymentServer::initNetManager()
@ -359,7 +366,7 @@ void PaymentServer::handleURIOrFile(const QString& s)
return; return;
} }
if (s.startsWith(BITCOIN_IPC_PREFIX, Qt::CaseInsensitive)) // bitcoin: if (s.startsWith(BITCOIN_IPC_PREFIX, Qt::CaseInsensitive)) // bitcoin: URI
{ {
#if QT_VERSION < 0x050000 #if QT_VERSION < 0x050000
QUrl uri(s); QUrl uri(s);

9
src/qt/paymentserver.h

@ -77,10 +77,6 @@ public:
// Return certificate store // Return certificate store
static X509_STORE* getCertStore() { return certStore; } 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 // OptionsModel is used for getting proxy settings and display unit
void setOptionsModel(OptionsModel *optionsModel); void setOptionsModel(OptionsModel *optionsModel);
@ -111,6 +107,11 @@ private slots:
void reportSslErrors(QNetworkReply*, const QList<QSslError> &); void reportSslErrors(QNetworkReply*, const QList<QSslError> &);
void handlePaymentACK(const QString& paymentACKMsg); 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: private:
static bool readPaymentRequest(const QString& filename, PaymentRequestPlus& request); static bool readPaymentRequest(const QString& filename, PaymentRequestPlus& request);
bool processPaymentRequest(PaymentRequestPlus& request, SendCoinsRecipient& recipient); bool processPaymentRequest(PaymentRequestPlus& request, SendCoinsRecipient& recipient);

14
src/qt/test/paymentservertests.cpp

@ -7,12 +7,9 @@
#include <openssl/x509.h> #include <openssl/x509.h>
#include <openssl/x509_vfy.h> #include <openssl/x509_vfy.h>
#include <QCoreApplication>
#include <QDebug>
#include <QFileOpenEvent> #include <QFileOpenEvent>
#include <QTemporaryFile> #include <QTemporaryFile>
#include <QVariant>
X509 *parse_b64der_cert(const char* cert_data) 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.write((const char*)&data[0], data.size());
f.close(); 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()); 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)), QObject::disconnect(server, SIGNAL(receivedPaymentRequest(SendCoinsRecipient)),
&sigCatcher, SLOT(getRecipient(SendCoinsRecipient))); &sigCatcher, SLOT(getRecipient(SendCoinsRecipient)));

2
src/qt/test/paymentservertests.h

@ -20,8 +20,10 @@ private slots:
class RecipientCatcher : public QObject class RecipientCatcher : public QObject
{ {
Q_OBJECT Q_OBJECT
public slots: public slots:
void getRecipient(SendCoinsRecipient r); void getRecipient(SendCoinsRecipient r);
public: public:
SendCoinsRecipient recipient; SendCoinsRecipient recipient;
}; };

8
src/qt/test/test_main.cpp

@ -1,8 +1,7 @@
#include "paymentservertests.h" #include "paymentservertests.h"
#include "uritests.h" #include "uritests.h"
#include <QCoreApplication>
#include <QObject> #include <QObject>
#include <QTest> #include <QTest>
@ -11,6 +10,11 @@ int main(int argc, char *argv[])
{ {
bool fInvalid = false; 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; URITests test1;
if (QTest::qExec(&test1) != 0) if (QTest::qExec(&test1) != 0)
fInvalid = true; fInvalid = true;

Loading…
Cancel
Save