paymentserver.h
1 // Copyright (c) 2011-present The Bitcoin Core developers 2 // Distributed under the MIT software license, see the accompanying 3 // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 5 #ifndef BITCOIN_QT_PAYMENTSERVER_H 6 #define BITCOIN_QT_PAYMENTSERVER_H 7 8 // This class handles payment requests from clicking on 9 // bitcoin: URIs 10 // 11 // This is somewhat tricky, because we have to deal with 12 // the situation where the user clicks on a link during 13 // startup/initialization, when the splash-screen is up 14 // but the main window (and the Send Coins tab) is not. 15 // 16 // So, the strategy is: 17 // 18 // Create the server, and register the event handler, 19 // when the application is created. Save any URIs 20 // received at or during startup in a list. 21 // 22 // When startup is finished and the main window is 23 // shown, a signal is sent to slot uiReady(), which 24 // emits a receivedURI() signal for any payment 25 // requests that happened during startup. 26 // 27 // After startup, receivedURI() happens as usual. 28 // 29 // This class has one more feature: a static 30 // method that finds URIs passed in the command line 31 // and, if a server is running in another process, 32 // sends them to the server. 33 // 34 35 #include <qt/sendcoinsrecipient.h> 36 37 #include <QObject> 38 #include <QString> 39 40 class OptionsModel; 41 42 namespace interfaces { 43 class Node; 44 } // namespace interfaces 45 46 QT_BEGIN_NAMESPACE 47 class QApplication; 48 class QByteArray; 49 class QLocalServer; 50 class QUrl; 51 QT_END_NAMESPACE 52 53 extern const QString BITCOIN_IPC_PREFIX; 54 55 class PaymentServer : public QObject 56 { 57 Q_OBJECT 58 59 public: 60 // Parse URIs on command line 61 // Returns false on error 62 static void ipcParseCommandLine(int argc, char *argv[]); 63 64 // Returns true if there were URIs on the command line 65 // which were successfully sent to an already-running 66 // process. 67 // Note: if a payment request is given, SelectParams(MAIN/TESTNET) 68 // will be called so we startup in the right mode. 69 static bool ipcSendCommandLine(); 70 71 // parent should be QApplication object 72 explicit PaymentServer(QObject* parent, bool startLocalServer = true); 73 ~PaymentServer(); 74 75 // OptionsModel is used for getting proxy settings and display unit 76 void setOptionsModel(OptionsModel *optionsModel); 77 78 Q_SIGNALS: 79 // Fired when a valid payment request is received 80 void receivedPaymentRequest(SendCoinsRecipient); 81 82 // Fired when a message should be reported to the user 83 void message(const QString &title, const QString &message, unsigned int style); 84 85 public Q_SLOTS: 86 // Signal this when the main window's UI is ready 87 // to display payment requests to the user 88 void uiReady(); 89 90 // Handle an incoming URI, URI with local file scheme or file 91 void handleURIOrFile(const QString& s); 92 93 private Q_SLOTS: 94 void handleURIConnection(); 95 96 protected: 97 // Constructor registers this on the parent QApplication to 98 // receive QEvent::FileOpen and QEvent:Drop events 99 bool eventFilter(QObject *object, QEvent *event) override; 100 101 private: 102 bool saveURIs{true}; // true during startup 103 QLocalServer* uriServer{nullptr}; 104 OptionsModel* optionsModel{nullptr}; 105 }; 106 107 #endif // BITCOIN_QT_PAYMENTSERVER_H