/ src / qt / paymentserver.h
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