clientmodel.h raw

   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_CLIENTMODEL_H
   6  #define BITCOIN_QT_CLIENTMODEL_H
   7  
   8  #include <QObject>
   9  #include <QDateTime>
  10  
  11  #include <atomic>
  12  #include <memory>
  13  #include <sync.h>
  14  #include <uint256.h>
  15  
  16  #include <netaddress.h>
  17  
  18  class BanTableModel;
  19  class CBlockIndex;
  20  class OptionsModel;
  21  class PeerTableModel;
  22  class PeerTableSortProxy;
  23  enum class SynchronizationState;
  24  struct LocalServiceInfo;
  25  
  26  namespace interfaces {
  27  class Handler;
  28  class Node;
  29  struct BlockTip;
  30  }
  31  
  32  QT_BEGIN_NAMESPACE
  33  class QTimer;
  34  QT_END_NAMESPACE
  35  
  36  enum class BlockSource {
  37      NONE,
  38      DISK,
  39      NETWORK,
  40  };
  41  
  42  enum class SyncType {
  43      HEADER_PRESYNC,
  44      HEADER_SYNC,
  45      BLOCK_SYNC
  46  };
  47  
  48  enum NumConnections {
  49      CONNECTIONS_NONE = 0,
  50      CONNECTIONS_IN   = (1U << 0),
  51      CONNECTIONS_OUT  = (1U << 1),
  52      CONNECTIONS_ALL  = (CONNECTIONS_IN | CONNECTIONS_OUT),
  53  };
  54  
  55  /** Model for Bitcoin network client. */
  56  class ClientModel : public QObject
  57  {
  58      Q_OBJECT
  59  
  60  public:
  61      explicit ClientModel(interfaces::Node& node, OptionsModel *optionsModel, QObject *parent = nullptr);
  62      ~ClientModel();
  63  
  64      void stop();
  65  
  66      interfaces::Node& node() const { return m_node; }
  67      OptionsModel *getOptionsModel();
  68      PeerTableModel *getPeerTableModel();
  69      PeerTableSortProxy* peerTableSortProxy();
  70      BanTableModel *getBanTableModel();
  71  
  72      //! Return number of connections, default is in- and outbound (total)
  73      int getNumConnections(unsigned int flags = CONNECTIONS_ALL) const;
  74      std::map<CNetAddr, LocalServiceInfo> getNetLocalAddresses() const;
  75      int getNumBlocks() const;
  76      uint256 getBestBlockHash() EXCLUSIVE_LOCKS_REQUIRED(!m_cached_tip_mutex);
  77      int getHeaderTipHeight() const;
  78      int64_t getHeaderTipTime() const;
  79  
  80      //! Returns the block source of the current importing/syncing state
  81      BlockSource getBlockSource() const;
  82      //! Return warnings to be displayed in status bar
  83      QString getStatusBarWarnings() const;
  84  
  85      QString formatFullVersion() const;
  86      QString formatSubVersion() const;
  87      bool isReleaseVersion() const;
  88      QString formatClientStartupTime() const;
  89      QString dataDir() const;
  90      QString blocksDir() const;
  91  
  92      bool getProxyInfo(std::string& ip_port) const;
  93  
  94      // caches for the best header: hash, number of blocks and block time
  95      mutable std::atomic<int> cachedBestHeaderHeight;
  96      mutable std::atomic<int64_t> cachedBestHeaderTime;
  97      mutable std::atomic<int> m_cached_num_blocks{-1};
  98  
  99      Mutex m_cached_tip_mutex;
 100      uint256 m_cached_tip_blocks GUARDED_BY(m_cached_tip_mutex){};
 101  
 102  private:
 103      interfaces::Node& m_node;
 104      std::vector<std::unique_ptr<interfaces::Handler>> m_event_handlers;
 105      OptionsModel *optionsModel;
 106      PeerTableModel* peerTableModel{nullptr};
 107      PeerTableSortProxy* m_peer_table_sort_proxy{nullptr};
 108      BanTableModel* banTableModel{nullptr};
 109  
 110      //! A thread to interact with m_node asynchronously
 111      QThread* const m_thread;
 112  
 113      void TipChanged(SynchronizationState sync_state, interfaces::BlockTip tip, double verification_progress, SyncType synctype) EXCLUSIVE_LOCKS_REQUIRED(!m_cached_tip_mutex);
 114      void subscribeToCoreSignals();
 115      void unsubscribeFromCoreSignals();
 116  
 117  Q_SIGNALS:
 118      void numConnectionsChanged(int count);
 119      void numBlocksChanged(int count, const QDateTime& blockDate, double nVerificationProgress, SyncType header, SynchronizationState sync_state);
 120      void mempoolSizeChanged(long count, size_t mempoolSizeInBytes, size_t mempoolMaxSizeInBytes);
 121      void networkActiveChanged(bool networkActive);
 122      void alertsChanged(const QString &warnings);
 123      void bytesChanged(quint64 totalBytesIn, quint64 totalBytesOut);
 124  
 125      //! Fired when a message should be reported to the user
 126      void message(const QString &title, const QString &message, unsigned int style);
 127  
 128      // Show progress dialog e.g. for verifychain
 129      void showProgress(const QString &title, int nProgress);
 130  };
 131  
 132  #endif // BITCOIN_QT_CLIENTMODEL_H
 133