Remove direct bitcoin calls from qt/clientmodel.cpp

This commit is contained in:
Russell Yanofsky 2017-04-17 15:37:36 -04:00 committed by John Newbery
parent 5fba3af21e
commit fe6f27e6ea
9 changed files with 232 additions and 142 deletions

View file

@ -4,6 +4,7 @@
#include <interface/node.h> #include <interface/node.h>
#include <chain.h>
#include <chainparams.h> #include <chainparams.h>
#include <init.h> #include <init.h>
#include <interface/handler.h> #include <interface/handler.h>
@ -11,9 +12,13 @@
#include <net.h> #include <net.h>
#include <netaddress.h> #include <netaddress.h>
#include <netbase.h> #include <netbase.h>
#include <primitives/block.h>
#include <scheduler.h> #include <scheduler.h>
#include <sync.h>
#include <txmempool.h>
#include <ui_interface.h> #include <ui_interface.h>
#include <util.h> #include <util.h>
#include <validation.h>
#include <warnings.h> #include <warnings.h>
#if defined(HAVE_CONFIG_H) #if defined(HAVE_CONFIG_H)
@ -25,6 +30,7 @@
#define CHECK_WALLET(x) throw std::logic_error("Wallet function called in non-wallet build.") #define CHECK_WALLET(x) throw std::logic_error("Wallet function called in non-wallet build.")
#endif #endif
#include <atomic>
#include <boost/thread/thread.hpp> #include <boost/thread/thread.hpp>
class CWallet; class CWallet;
@ -69,6 +75,56 @@ class NodeImpl : public Node
} }
std::string helpMessage(HelpMessageMode mode) override { return HelpMessage(mode); } std::string helpMessage(HelpMessageMode mode) override { return HelpMessage(mode); }
bool getProxy(Network net, proxyType& proxy_info) override { return GetProxy(net, proxy_info); } bool getProxy(Network net, proxyType& proxy_info) override { return GetProxy(net, proxy_info); }
size_t getNodeCount(CConnman::NumConnections flags) override
{
return g_connman ? g_connman->GetNodeCount(flags) : 0;
}
int64_t getTotalBytesRecv() override { return g_connman ? g_connman->GetTotalBytesRecv() : 0; }
int64_t getTotalBytesSent() override { return g_connman ? g_connman->GetTotalBytesSent() : 0; }
size_t getMempoolSize() override { return ::mempool.size(); }
size_t getMempoolDynamicUsage() override { return ::mempool.DynamicMemoryUsage(); }
bool getHeaderTip(int& height, int64_t& block_time) override
{
LOCK(::cs_main);
if (::pindexBestHeader) {
height = ::pindexBestHeader->nHeight;
block_time = ::pindexBestHeader->GetBlockTime();
return true;
}
return false;
}
int getNumBlocks() override
{
LOCK(::cs_main);
return ::chainActive.Height();
}
int64_t getLastBlockTime() override
{
LOCK(::cs_main);
if (::chainActive.Tip()) {
return ::chainActive.Tip()->GetBlockTime();
}
return Params().GenesisBlock().GetBlockTime(); // Genesis block's time of current network
}
double getVerificationProgress() override
{
const CBlockIndex* tip;
{
LOCK(::cs_main);
tip = ::chainActive.Tip();
}
return GuessVerificationProgress(::Params().TxData(), tip);
}
bool isInitialBlockDownload() override { return IsInitialBlockDownload(); }
bool getReindex() override { return ::fReindex; }
bool getImporting() override { return ::fImporting; }
void setNetworkActive(bool active) override
{
if (g_connman) {
g_connman->SetNetworkActive(active);
}
}
bool getNetworkActive() override { return g_connman && g_connman->GetNetworkActive(); }
std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn) override std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn) override
{ {
return MakeHandler(::uiInterface.InitMessage.connect(fn)); return MakeHandler(::uiInterface.InitMessage.connect(fn));
@ -90,6 +146,37 @@ class NodeImpl : public Node
CHECK_WALLET( CHECK_WALLET(
return MakeHandler(::uiInterface.LoadWallet.connect([fn](CWallet* wallet) { fn(MakeWallet(*wallet)); }))); return MakeHandler(::uiInterface.LoadWallet.connect([fn](CWallet* wallet) { fn(MakeWallet(*wallet)); })));
} }
std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(NotifyNumConnectionsChangedFn fn) override
{
return MakeHandler(::uiInterface.NotifyNumConnectionsChanged.connect(fn));
}
std::unique_ptr<Handler> handleNotifyNetworkActiveChanged(NotifyNetworkActiveChangedFn fn) override
{
return MakeHandler(::uiInterface.NotifyNetworkActiveChanged.connect(fn));
}
std::unique_ptr<Handler> handleNotifyAlertChanged(NotifyAlertChangedFn fn) override
{
return MakeHandler(::uiInterface.NotifyAlertChanged.connect(fn));
}
std::unique_ptr<Handler> handleBannedListChanged(BannedListChangedFn fn) override
{
return MakeHandler(::uiInterface.BannedListChanged.connect(fn));
}
std::unique_ptr<Handler> handleNotifyBlockTip(NotifyBlockTipFn fn) override
{
return MakeHandler(::uiInterface.NotifyBlockTip.connect([fn](bool initial_download, const CBlockIndex* block) {
fn(initial_download, block->nHeight, block->GetBlockTime(),
GuessVerificationProgress(::Params().TxData(), block));
}));
}
std::unique_ptr<Handler> handleNotifyHeaderTip(NotifyHeaderTipFn fn) override
{
return MakeHandler(
::uiInterface.NotifyHeaderTip.connect([fn](bool initial_download, const CBlockIndex* block) {
fn(initial_download, block->nHeight, block->GetBlockTime(),
GuessVerificationProgress(::Params().TxData(), block));
}));
}
}; };
} // namespace } // namespace

View file

@ -6,10 +6,13 @@
#define BITCOIN_INTERFACE_NODE_H #define BITCOIN_INTERFACE_NODE_H
#include <init.h> // For HelpMessageMode #include <init.h> // For HelpMessageMode
#include <net.h> // For CConnman::NumConnections
#include <netaddress.h> // For Network #include <netaddress.h> // For Network
#include <functional> #include <functional>
#include <memory> #include <memory>
#include <stddef.h>
#include <stdint.h>
#include <string> #include <string>
class proxyType; class proxyType;
@ -73,6 +76,48 @@ public:
//! Get proxy. //! Get proxy.
virtual bool getProxy(Network net, proxyType& proxy_info) = 0; virtual bool getProxy(Network net, proxyType& proxy_info) = 0;
//! Get number of connections.
virtual size_t getNodeCount(CConnman::NumConnections flags) = 0;
//! Get total bytes recv.
virtual int64_t getTotalBytesRecv() = 0;
//! Get total bytes sent.
virtual int64_t getTotalBytesSent() = 0;
//! Get mempool size.
virtual size_t getMempoolSize() = 0;
//! Get mempool dynamic usage.
virtual size_t getMempoolDynamicUsage() = 0;
//! Get header tip height and time.
virtual bool getHeaderTip(int& height, int64_t& block_time) = 0;
//! Get num blocks.
virtual int getNumBlocks() = 0;
//! Get last block time.
virtual int64_t getLastBlockTime() = 0;
//! Get verification progress.
virtual double getVerificationProgress() = 0;
//! Is initial block download.
virtual bool isInitialBlockDownload() = 0;
//! Get reindex.
virtual bool getReindex() = 0;
//! Get importing.
virtual bool getImporting() = 0;
//! Set network active.
virtual void setNetworkActive(bool active) = 0;
//! Get network active.
virtual bool getNetworkActive() = 0;
//! Register handler for init messages. //! Register handler for init messages.
using InitMessageFn = std::function<void(const std::string& message)>; using InitMessageFn = std::function<void(const std::string& message)>;
virtual std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn) = 0; virtual std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn) = 0;
@ -96,6 +141,32 @@ public:
//! Register handler for load wallet messages. //! Register handler for load wallet messages.
using LoadWalletFn = std::function<void(std::unique_ptr<Wallet> wallet)>; using LoadWalletFn = std::function<void(std::unique_ptr<Wallet> wallet)>;
virtual std::unique_ptr<Handler> handleLoadWallet(LoadWalletFn fn) = 0; virtual std::unique_ptr<Handler> handleLoadWallet(LoadWalletFn fn) = 0;
//! Register handler for number of connections changed messages.
using NotifyNumConnectionsChangedFn = std::function<void(int new_num_connections)>;
virtual std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(NotifyNumConnectionsChangedFn fn) = 0;
//! Register handler for network active messages.
using NotifyNetworkActiveChangedFn = std::function<void(bool network_active)>;
virtual std::unique_ptr<Handler> handleNotifyNetworkActiveChanged(NotifyNetworkActiveChangedFn fn) = 0;
//! Register handler for notify alert messages.
using NotifyAlertChangedFn = std::function<void()>;
virtual std::unique_ptr<Handler> handleNotifyAlertChanged(NotifyAlertChangedFn fn) = 0;
//! Register handler for ban list messages.
using BannedListChangedFn = std::function<void()>;
virtual std::unique_ptr<Handler> handleBannedListChanged(BannedListChangedFn fn) = 0;
//! Register handler for block tip messages.
using NotifyBlockTipFn =
std::function<void(bool initial_download, int height, int64_t block_time, double verification_progress)>;
virtual std::unique_ptr<Handler> handleNotifyBlockTip(NotifyBlockTipFn fn) = 0;
//! Register handler for header tip messages.
using NotifyHeaderTipFn =
std::function<void(bool initial_download, int height, int64_t block_time, double verification_progress)>;
virtual std::unique_ptr<Handler> handleNotifyHeaderTip(NotifyHeaderTipFn fn) = 0;
}; };
//! Return implementation of Node interface. //! Return implementation of Node interface.

View file

@ -460,7 +460,7 @@ void BitcoinApplication::initializeResult(bool success)
paymentServer->setOptionsModel(optionsModel); paymentServer->setOptionsModel(optionsModel);
#endif #endif
clientModel = new ClientModel(optionsModel); clientModel = new ClientModel(m_node, optionsModel);
window->setClientModel(clientModel); window->setClientModel(clientModel);
#ifdef ENABLE_WALLET #ifdef ENABLE_WALLET

View file

@ -493,7 +493,7 @@ void BitcoinGUI::setClientModel(ClientModel *_clientModel)
connect(_clientModel, SIGNAL(networkActiveChanged(bool)), this, SLOT(setNetworkActive(bool))); connect(_clientModel, SIGNAL(networkActiveChanged(bool)), this, SLOT(setNetworkActive(bool)));
modalOverlay->setKnownBestHeight(_clientModel->getHeaderTipHeight(), QDateTime::fromTime_t(_clientModel->getHeaderTipTime())); modalOverlay->setKnownBestHeight(_clientModel->getHeaderTipHeight(), QDateTime::fromTime_t(_clientModel->getHeaderTipTime()));
setNumBlocks(_clientModel->getNumBlocks(), _clientModel->getLastBlockDate(), _clientModel->getVerificationProgress(nullptr), false); setNumBlocks(m_node.getNumBlocks(), QDateTime::fromTime_t(m_node.getLastBlockTime()), m_node.getVerificationProgress(), false);
connect(_clientModel, SIGNAL(numBlocksChanged(int,QDateTime,double,bool)), this, SLOT(setNumBlocks(int,QDateTime,double,bool))); connect(_clientModel, SIGNAL(numBlocksChanged(int,QDateTime,double,bool)), this, SLOT(setNumBlocks(int,QDateTime,double,bool)));
// Receive and report messages from client model // Receive and report messages from client model
@ -751,7 +751,7 @@ void BitcoinGUI::updateNetworkState()
QString tooltip; QString tooltip;
if (clientModel->getNetworkActive()) { if (m_node.getNetworkActive()) {
tooltip = tr("%n active connection(s) to Bitcoin network", "", count) + QString(".<br>") + tr("Click to disable network activity."); tooltip = tr("%n active connection(s) to Bitcoin network", "", count) + QString(".<br>") + tr("Click to disable network activity.");
} else { } else {
tooltip = tr("Network activity disabled.") + QString("<br>") + tr("Click to enable network activity again."); tooltip = tr("Network activity disabled.") + QString("<br>") + tr("Click to enable network activity again.");
@ -1230,9 +1230,7 @@ void BitcoinGUI::unsubscribeFromCoreSignals()
void BitcoinGUI::toggleNetworkActive() void BitcoinGUI::toggleNetworkActive()
{ {
if (clientModel) { m_node.setNetworkActive(!m_node.getNetworkActive());
clientModel->setNetworkActive(!clientModel->getNetworkActive());
}
} }
UnitDisplayStatusBarControl::UnitDisplayStatusBarControl(const PlatformStyle *platformStyle) : UnitDisplayStatusBarControl::UnitDisplayStatusBarControl(const PlatformStyle *platformStyle) :

View file

@ -13,6 +13,8 @@
#include <chainparams.h> #include <chainparams.h>
#include <checkpoints.h> #include <checkpoints.h>
#include <clientversion.h> #include <clientversion.h>
#include <interface/handler.h>
#include <interface/node.h>
#include <validation.h> #include <validation.h>
#include <net.h> #include <net.h>
#include <txmempool.h> #include <txmempool.h>
@ -30,8 +32,9 @@ class CBlockIndex;
static int64_t nLastHeaderTipUpdateNotification = 0; static int64_t nLastHeaderTipUpdateNotification = 0;
static int64_t nLastBlockTipUpdateNotification = 0; static int64_t nLastBlockTipUpdateNotification = 0;
ClientModel::ClientModel(OptionsModel *_optionsModel, QObject *parent) : ClientModel::ClientModel(interface::Node& node, OptionsModel *_optionsModel, QObject *parent) :
QObject(parent), QObject(parent),
m_node(node),
optionsModel(_optionsModel), optionsModel(_optionsModel),
peerTableModel(0), peerTableModel(0),
banTableModel(0), banTableModel(0),
@ -64,15 +67,7 @@ int ClientModel::getNumConnections(unsigned int flags) const
else if (flags == CONNECTIONS_ALL) else if (flags == CONNECTIONS_ALL)
connections = CConnman::CONNECTIONS_ALL; connections = CConnman::CONNECTIONS_ALL;
if(g_connman) return m_node.getNodeCount(connections);
return g_connman->GetNodeCount(connections);
return 0;
}
int ClientModel::getNumBlocks() const
{
LOCK(cs_main);
return chainActive.Height();
} }
int ClientModel::getHeaderTipHeight() const int ClientModel::getHeaderTipHeight() const
@ -80,10 +75,11 @@ int ClientModel::getHeaderTipHeight() const
if (cachedBestHeaderHeight == -1) { if (cachedBestHeaderHeight == -1) {
// make sure we initially populate the cache via a cs_main lock // make sure we initially populate the cache via a cs_main lock
// otherwise we need to wait for a tip update // otherwise we need to wait for a tip update
LOCK(cs_main); int height;
if (pindexBestHeader) { int64_t blockTime;
cachedBestHeaderHeight = pindexBestHeader->nHeight; if (m_node.getHeaderTip(height, blockTime)) {
cachedBestHeaderTime = pindexBestHeader->GetBlockTime(); cachedBestHeaderHeight = height;
cachedBestHeaderTime = blockTime;
} }
} }
return cachedBestHeaderHeight; return cachedBestHeaderHeight;
@ -92,66 +88,22 @@ int ClientModel::getHeaderTipHeight() const
int64_t ClientModel::getHeaderTipTime() const int64_t ClientModel::getHeaderTipTime() const
{ {
if (cachedBestHeaderTime == -1) { if (cachedBestHeaderTime == -1) {
LOCK(cs_main); int height;
if (pindexBestHeader) { int64_t blockTime;
cachedBestHeaderHeight = pindexBestHeader->nHeight; if (m_node.getHeaderTip(height, blockTime)) {
cachedBestHeaderTime = pindexBestHeader->GetBlockTime(); cachedBestHeaderHeight = height;
cachedBestHeaderTime = blockTime;
} }
} }
return cachedBestHeaderTime; return cachedBestHeaderTime;
} }
quint64 ClientModel::getTotalBytesRecv() const
{
if(!g_connman)
return 0;
return g_connman->GetTotalBytesRecv();
}
quint64 ClientModel::getTotalBytesSent() const
{
if(!g_connman)
return 0;
return g_connman->GetTotalBytesSent();
}
QDateTime ClientModel::getLastBlockDate() const
{
LOCK(cs_main);
if (chainActive.Tip())
return QDateTime::fromTime_t(chainActive.Tip()->GetBlockTime());
return QDateTime::fromTime_t(Params().GenesisBlock().GetBlockTime()); // Genesis block's time of current network
}
long ClientModel::getMempoolSize() const
{
return mempool.size();
}
size_t ClientModel::getMempoolDynamicUsage() const
{
return mempool.DynamicMemoryUsage();
}
double ClientModel::getVerificationProgress(const CBlockIndex *tipIn) const
{
CBlockIndex *tip = const_cast<CBlockIndex *>(tipIn);
LOCK(cs_main);
if (!tip)
{
tip = chainActive.Tip();
}
return GuessVerificationProgress(Params().TxData(), tip);
}
void ClientModel::updateTimer() void ClientModel::updateTimer()
{ {
// no locking required at this point // no locking required at this point
// the following calls will acquire the required lock // the following calls will acquire the required lock
Q_EMIT mempoolSizeChanged(getMempoolSize(), getMempoolDynamicUsage()); Q_EMIT mempoolSizeChanged(m_node.getMempoolSize(), m_node.getMempoolDynamicUsage());
Q_EMIT bytesChanged(getTotalBytesRecv(), getTotalBytesSent()); Q_EMIT bytesChanged(m_node.getTotalBytesRecv(), m_node.getTotalBytesSent());
} }
void ClientModel::updateNumConnections(int numConnections) void ClientModel::updateNumConnections(int numConnections)
@ -169,16 +121,11 @@ void ClientModel::updateAlert()
Q_EMIT alertsChanged(getStatusBarWarnings()); Q_EMIT alertsChanged(getStatusBarWarnings());
} }
bool ClientModel::inInitialBlockDownload() const
{
return IsInitialBlockDownload();
}
enum BlockSource ClientModel::getBlockSource() const enum BlockSource ClientModel::getBlockSource() const
{ {
if (fReindex) if (m_node.getReindex())
return BlockSource::REINDEX; return BlockSource::REINDEX;
else if (fImporting) else if (m_node.getImporting())
return BlockSource::DISK; return BlockSource::DISK;
else if (getNumConnections() > 0) else if (getNumConnections() > 0)
return BlockSource::NETWORK; return BlockSource::NETWORK;
@ -186,24 +133,9 @@ enum BlockSource ClientModel::getBlockSource() const
return BlockSource::NONE; return BlockSource::NONE;
} }
void ClientModel::setNetworkActive(bool active)
{
if (g_connman) {
g_connman->SetNetworkActive(active);
}
}
bool ClientModel::getNetworkActive() const
{
if (g_connman) {
return g_connman->GetNetworkActive();
}
return false;
}
QString ClientModel::getStatusBarWarnings() const QString ClientModel::getStatusBarWarnings() const
{ {
return QString::fromStdString(GetWarnings("gui")); return QString::fromStdString(m_node.getWarnings("gui"));
} }
OptionsModel *ClientModel::getOptionsModel() OptionsModel *ClientModel::getOptionsModel()
@ -285,7 +217,7 @@ static void BannedListChanged(ClientModel *clientmodel)
QMetaObject::invokeMethod(clientmodel, "updateBanlist", Qt::QueuedConnection); QMetaObject::invokeMethod(clientmodel, "updateBanlist", Qt::QueuedConnection);
} }
static void BlockTipChanged(ClientModel *clientmodel, bool initialSync, const CBlockIndex *pIndex, bool fHeader) static void BlockTipChanged(ClientModel *clientmodel, bool initialSync, int height, int64_t blockTime, double verificationProgress, bool fHeader)
{ {
// lock free async UI updates in case we have a new block tip // lock free async UI updates in case we have a new block tip
// during initial sync, only update the UI if the last update // during initial sync, only update the UI if the last update
@ -298,16 +230,16 @@ static void BlockTipChanged(ClientModel *clientmodel, bool initialSync, const CB
if (fHeader) { if (fHeader) {
// cache best headers time and height to reduce future cs_main locks // cache best headers time and height to reduce future cs_main locks
clientmodel->cachedBestHeaderHeight = pIndex->nHeight; clientmodel->cachedBestHeaderHeight = height;
clientmodel->cachedBestHeaderTime = pIndex->GetBlockTime(); clientmodel->cachedBestHeaderTime = blockTime;
} }
// if we are in-sync, update the UI regardless of last update time // if we are in-sync, update the UI regardless of last update time
if (!initialSync || now - nLastUpdateNotification > MODEL_UPDATE_DELAY) { if (!initialSync || now - nLastUpdateNotification > MODEL_UPDATE_DELAY) {
//pass an async signal to the UI thread //pass an async signal to the UI thread
QMetaObject::invokeMethod(clientmodel, "numBlocksChanged", Qt::QueuedConnection, QMetaObject::invokeMethod(clientmodel, "numBlocksChanged", Qt::QueuedConnection,
Q_ARG(int, pIndex->nHeight), Q_ARG(int, height),
Q_ARG(QDateTime, QDateTime::fromTime_t(pIndex->GetBlockTime())), Q_ARG(QDateTime, QDateTime::fromTime_t(blockTime)),
Q_ARG(double, clientmodel->getVerificationProgress(pIndex)), Q_ARG(double, verificationProgress),
Q_ARG(bool, fHeader)); Q_ARG(bool, fHeader));
nLastUpdateNotification = now; nLastUpdateNotification = now;
} }
@ -316,23 +248,23 @@ static void BlockTipChanged(ClientModel *clientmodel, bool initialSync, const CB
void ClientModel::subscribeToCoreSignals() void ClientModel::subscribeToCoreSignals()
{ {
// Connect signals to client // Connect signals to client
uiInterface.ShowProgress.connect(boost::bind(ShowProgress, this, _1, _2)); m_handler_show_progress = m_node.handleShowProgress(boost::bind(ShowProgress, this, _1, _2));
uiInterface.NotifyNumConnectionsChanged.connect(boost::bind(NotifyNumConnectionsChanged, this, _1)); m_handler_notify_num_connections_changed = m_node.handleNotifyNumConnectionsChanged(boost::bind(NotifyNumConnectionsChanged, this, _1));
uiInterface.NotifyNetworkActiveChanged.connect(boost::bind(NotifyNetworkActiveChanged, this, _1)); m_handler_notify_network_active_changed = m_node.handleNotifyNetworkActiveChanged(boost::bind(NotifyNetworkActiveChanged, this, _1));
uiInterface.NotifyAlertChanged.connect(boost::bind(NotifyAlertChanged, this)); m_handler_notify_alert_changed = m_node.handleNotifyAlertChanged(boost::bind(NotifyAlertChanged, this));
uiInterface.BannedListChanged.connect(boost::bind(BannedListChanged, this)); m_handler_banned_list_changed = m_node.handleBannedListChanged(boost::bind(BannedListChanged, this));
uiInterface.NotifyBlockTip.connect(boost::bind(BlockTipChanged, this, _1, _2, false)); m_handler_notify_block_tip = m_node.handleNotifyBlockTip(boost::bind(BlockTipChanged, this, _1, _2, _3, _4, false));
uiInterface.NotifyHeaderTip.connect(boost::bind(BlockTipChanged, this, _1, _2, true)); m_handler_notify_header_tip = m_node.handleNotifyHeaderTip(boost::bind(BlockTipChanged, this, _1, _2, _3, _4, true));
} }
void ClientModel::unsubscribeFromCoreSignals() void ClientModel::unsubscribeFromCoreSignals()
{ {
// Disconnect signals from client // Disconnect signals from client
uiInterface.ShowProgress.disconnect(boost::bind(ShowProgress, this, _1, _2)); m_handler_show_progress->disconnect();
uiInterface.NotifyNumConnectionsChanged.disconnect(boost::bind(NotifyNumConnectionsChanged, this, _1)); m_handler_notify_num_connections_changed->disconnect();
uiInterface.NotifyNetworkActiveChanged.disconnect(boost::bind(NotifyNetworkActiveChanged, this, _1)); m_handler_notify_network_active_changed->disconnect();
uiInterface.NotifyAlertChanged.disconnect(boost::bind(NotifyAlertChanged, this)); m_handler_notify_alert_changed->disconnect();
uiInterface.BannedListChanged.disconnect(boost::bind(BannedListChanged, this)); m_handler_banned_list_changed->disconnect();
uiInterface.NotifyBlockTip.disconnect(boost::bind(BlockTipChanged, this, _1, _2, false)); m_handler_notify_block_tip->disconnect();
uiInterface.NotifyHeaderTip.disconnect(boost::bind(BlockTipChanged, this, _1, _2, true)); m_handler_notify_header_tip->disconnect();
} }

View file

@ -9,6 +9,7 @@
#include <QDateTime> #include <QDateTime>
#include <atomic> #include <atomic>
#include <memory>
class BanTableModel; class BanTableModel;
class OptionsModel; class OptionsModel;
@ -16,6 +17,11 @@ class PeerTableModel;
class CBlockIndex; class CBlockIndex;
namespace interface {
class Handler;
class Node;
}
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QTimer; class QTimer;
QT_END_NAMESPACE QT_END_NAMESPACE
@ -40,37 +46,21 @@ class ClientModel : public QObject
Q_OBJECT Q_OBJECT
public: public:
explicit ClientModel(OptionsModel *optionsModel, QObject *parent = 0); explicit ClientModel(interface::Node& node, OptionsModel *optionsModel, QObject *parent = 0);
~ClientModel(); ~ClientModel();
interface::Node& node() const { return m_node; }
OptionsModel *getOptionsModel(); OptionsModel *getOptionsModel();
PeerTableModel *getPeerTableModel(); PeerTableModel *getPeerTableModel();
BanTableModel *getBanTableModel(); BanTableModel *getBanTableModel();
//! Return number of connections, default is in- and outbound (total) //! Return number of connections, default is in- and outbound (total)
int getNumConnections(unsigned int flags = CONNECTIONS_ALL) const; int getNumConnections(unsigned int flags = CONNECTIONS_ALL) const;
int getNumBlocks() const;
int getHeaderTipHeight() const; int getHeaderTipHeight() const;
int64_t getHeaderTipTime() const; int64_t getHeaderTipTime() const;
//! Return number of transactions in the mempool
long getMempoolSize() const;
//! Return the dynamic memory usage of the mempool
size_t getMempoolDynamicUsage() const;
quint64 getTotalBytesRecv() const;
quint64 getTotalBytesSent() const;
double getVerificationProgress(const CBlockIndex *tip) const;
QDateTime getLastBlockDate() const;
//! Return true if core is doing initial block download
bool inInitialBlockDownload() const;
//! Returns enum BlockSource of the current importing/syncing state //! Returns enum BlockSource of the current importing/syncing state
enum BlockSource getBlockSource() const; enum BlockSource getBlockSource() const;
//! Return true if network activity in core is enabled
bool getNetworkActive() const;
//! Toggle network activity state in core
void setNetworkActive(bool active);
//! Return warnings to be displayed in status bar //! Return warnings to be displayed in status bar
QString getStatusBarWarnings() const; QString getStatusBarWarnings() const;
@ -85,6 +75,14 @@ public:
mutable std::atomic<int64_t> cachedBestHeaderTime; mutable std::atomic<int64_t> cachedBestHeaderTime;
private: private:
interface::Node& m_node;
std::unique_ptr<interface::Handler> m_handler_show_progress;
std::unique_ptr<interface::Handler> m_handler_notify_num_connections_changed;
std::unique_ptr<interface::Handler> m_handler_notify_network_active_changed;
std::unique_ptr<interface::Handler> m_handler_notify_alert_changed;
std::unique_ptr<interface::Handler> m_handler_banned_list_changed;
std::unique_ptr<interface::Handler> m_handler_notify_block_tip;
std::unique_ptr<interface::Handler> m_handler_notify_header_tip;
OptionsModel *optionsModel; OptionsModel *optionsModel;
PeerTableModel *peerTableModel; PeerTableModel *peerTableModel;
BanTableModel *banTableModel; BanTableModel *banTableModel;

View file

@ -14,6 +14,7 @@
#include <qt/platformstyle.h> #include <qt/platformstyle.h>
#include <qt/walletmodel.h> #include <qt/walletmodel.h>
#include <chainparams.h> #include <chainparams.h>
#include <interface/node.h>
#include <netbase.h> #include <netbase.h>
#include <rpc/server.h> #include <rpc/server.h>
#include <rpc/client.h> #include <rpc/client.h>
@ -566,13 +567,14 @@ void RPCConsole::setClientModel(ClientModel *model)
setNumConnections(model->getNumConnections()); setNumConnections(model->getNumConnections());
connect(model, SIGNAL(numConnectionsChanged(int)), this, SLOT(setNumConnections(int))); connect(model, SIGNAL(numConnectionsChanged(int)), this, SLOT(setNumConnections(int)));
setNumBlocks(model->getNumBlocks(), model->getLastBlockDate(), model->getVerificationProgress(nullptr), false); interface::Node& node = clientModel->node();
setNumBlocks(node.getNumBlocks(), QDateTime::fromTime_t(node.getLastBlockTime()), node.getVerificationProgress(), false);
connect(model, SIGNAL(numBlocksChanged(int,QDateTime,double,bool)), this, SLOT(setNumBlocks(int,QDateTime,double,bool))); connect(model, SIGNAL(numBlocksChanged(int,QDateTime,double,bool)), this, SLOT(setNumBlocks(int,QDateTime,double,bool)));
updateNetworkState(); updateNetworkState();
connect(model, SIGNAL(networkActiveChanged(bool)), this, SLOT(setNetworkActive(bool))); connect(model, SIGNAL(networkActiveChanged(bool)), this, SLOT(setNetworkActive(bool)));
updateTrafficStats(model->getTotalBytesRecv(), model->getTotalBytesSent()); updateTrafficStats(node.getTotalBytesRecv(), node.getTotalBytesSent());
connect(model, SIGNAL(bytesChanged(quint64,quint64)), this, SLOT(updateTrafficStats(quint64, quint64))); connect(model, SIGNAL(bytesChanged(quint64,quint64)), this, SLOT(updateTrafficStats(quint64, quint64)));
connect(model, SIGNAL(mempoolSizeChanged(long,size_t)), this, SLOT(setMempoolSize(long,size_t))); connect(model, SIGNAL(mempoolSizeChanged(long,size_t)), this, SLOT(setMempoolSize(long,size_t)));
@ -835,7 +837,7 @@ void RPCConsole::updateNetworkState()
connections += tr("In:") + " " + QString::number(clientModel->getNumConnections(CONNECTIONS_IN)) + " / "; connections += tr("In:") + " " + QString::number(clientModel->getNumConnections(CONNECTIONS_IN)) + " / ";
connections += tr("Out:") + " " + QString::number(clientModel->getNumConnections(CONNECTIONS_OUT)) + ")"; connections += tr("Out:") + " " + QString::number(clientModel->getNumConnections(CONNECTIONS_OUT)) + ")";
if(!clientModel->getNetworkActive()) { if(!clientModel->node().getNetworkActive()) {
connections += " (" + tr("Network activity disabled") + ")"; connections += " (" + tr("Network activity disabled") + ")";
} }

View file

@ -2,6 +2,7 @@
// Distributed under the MIT software license, see the accompanying // Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php. // file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <interface/node.h>
#include <qt/trafficgraphwidget.h> #include <qt/trafficgraphwidget.h>
#include <qt/clientmodel.h> #include <qt/clientmodel.h>
@ -35,8 +36,8 @@ void TrafficGraphWidget::setClientModel(ClientModel *model)
{ {
clientModel = model; clientModel = model;
if(model) { if(model) {
nLastBytesIn = model->getTotalBytesRecv(); nLastBytesIn = model->node().getTotalBytesRecv();
nLastBytesOut = model->getTotalBytesSent(); nLastBytesOut = model->node().getTotalBytesSent();
} }
} }
@ -123,8 +124,8 @@ void TrafficGraphWidget::updateRates()
{ {
if(!clientModel) return; if(!clientModel) return;
quint64 bytesIn = clientModel->getTotalBytesRecv(), quint64 bytesIn = clientModel->node().getTotalBytesRecv(),
bytesOut = clientModel->getTotalBytesSent(); bytesOut = clientModel->node().getTotalBytesSent();
float inRate = (bytesIn - nLastBytesIn) / 1024.0f * 1000 / timer->interval(); float inRate = (bytesIn - nLastBytesIn) / 1024.0f * 1000 / timer->interval();
float outRate = (bytesOut - nLastBytesOut) / 1024.0f * 1000 / timer->interval(); float outRate = (bytesOut - nLastBytesOut) / 1024.0f * 1000 / timer->interval();
vSamplesIn.push_front(inRate); vSamplesIn.push_front(inRate);
@ -169,8 +170,8 @@ void TrafficGraphWidget::clear()
fMax = 0.0f; fMax = 0.0f;
if(clientModel) { if(clientModel) {
nLastBytesIn = clientModel->getTotalBytesRecv(); nLastBytesIn = clientModel->node().getTotalBytesRecv();
nLastBytesOut = clientModel->getTotalBytesSent(); nLastBytesOut = clientModel->node().getTotalBytesSent();
} }
timer->start(); timer->start();
} }

View file

@ -19,6 +19,7 @@
#include <qt/transactionview.h> #include <qt/transactionview.h>
#include <qt/walletmodel.h> #include <qt/walletmodel.h>
#include <interface/node.h>
#include <ui_interface.h> #include <ui_interface.h>
#include <QAction> #include <QAction>
@ -158,7 +159,7 @@ void WalletView::setWalletModel(WalletModel *_walletModel)
void WalletView::processNewTransaction(const QModelIndex& parent, int start, int /*end*/) void WalletView::processNewTransaction(const QModelIndex& parent, int start, int /*end*/)
{ {
// Prevent balloon-spam when initial block download is in progress // Prevent balloon-spam when initial block download is in progress
if (!walletModel || !clientModel || clientModel->inInitialBlockDownload()) if (!walletModel || !clientModel || clientModel->node().isInitialBlockDownload())
return; return;
TransactionTableModel *ttm = walletModel->getTransactionTableModel(); TransactionTableModel *ttm = walletModel->getTransactionTableModel();