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