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