Remove direct bitcoin calls from qt/clientmodel.cpp
This commit is contained in:
parent
5fba3af21e
commit
fe6f27e6ea
9 changed files with 232 additions and 142 deletions
|
@ -4,6 +4,7 @@
|
|||
|
||||
#include <interface/node.h>
|
||||
|
||||
#include <chain.h>
|
||||
#include <chainparams.h>
|
||||
#include <init.h>
|
||||
#include <interface/handler.h>
|
||||
|
@ -11,9 +12,13 @@
|
|||
#include <net.h>
|
||||
#include <netaddress.h>
|
||||
#include <netbase.h>
|
||||
#include <primitives/block.h>
|
||||
#include <scheduler.h>
|
||||
#include <sync.h>
|
||||
#include <txmempool.h>
|
||||
#include <ui_interface.h>
|
||||
#include <util.h>
|
||||
#include <validation.h>
|
||||
#include <warnings.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.")
|
||||
#endif
|
||||
|
||||
#include <atomic>
|
||||
#include <boost/thread/thread.hpp>
|
||||
|
||||
class CWallet;
|
||||
|
@ -69,6 +75,56 @@ class NodeImpl : public Node
|
|||
}
|
||||
std::string helpMessage(HelpMessageMode mode) override { return HelpMessage(mode); }
|
||||
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
|
||||
{
|
||||
return MakeHandler(::uiInterface.InitMessage.connect(fn));
|
||||
|
@ -90,6 +146,37 @@ class NodeImpl : public Node
|
|||
CHECK_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
|
||||
|
|
|
@ -6,10 +6,13 @@
|
|||
#define BITCOIN_INTERFACE_NODE_H
|
||||
|
||||
#include <init.h> // For HelpMessageMode
|
||||
#include <net.h> // For CConnman::NumConnections
|
||||
#include <netaddress.h> // For Network
|
||||
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <string>
|
||||
|
||||
class proxyType;
|
||||
|
@ -73,6 +76,48 @@ public:
|
|||
//! Get proxy.
|
||||
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.
|
||||
using InitMessageFn = std::function<void(const std::string& message)>;
|
||||
virtual std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn) = 0;
|
||||
|
@ -96,6 +141,32 @@ public:
|
|||
//! Register handler for load wallet messages.
|
||||
using LoadWalletFn = std::function<void(std::unique_ptr<Wallet> wallet)>;
|
||||
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.
|
||||
|
|
|
@ -460,7 +460,7 @@ void BitcoinApplication::initializeResult(bool success)
|
|||
paymentServer->setOptionsModel(optionsModel);
|
||||
#endif
|
||||
|
||||
clientModel = new ClientModel(optionsModel);
|
||||
clientModel = new ClientModel(m_node, optionsModel);
|
||||
window->setClientModel(clientModel);
|
||||
|
||||
#ifdef ENABLE_WALLET
|
||||
|
|
|
@ -493,7 +493,7 @@ void BitcoinGUI::setClientModel(ClientModel *_clientModel)
|
|||
connect(_clientModel, SIGNAL(networkActiveChanged(bool)), this, SLOT(setNetworkActive(bool)));
|
||||
|
||||
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)));
|
||||
|
||||
// Receive and report messages from client model
|
||||
|
@ -751,7 +751,7 @@ void BitcoinGUI::updateNetworkState()
|
|||
|
||||
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.");
|
||||
} else {
|
||||
tooltip = tr("Network activity disabled.") + QString("<br>") + tr("Click to enable network activity again.");
|
||||
|
@ -1230,9 +1230,7 @@ void BitcoinGUI::unsubscribeFromCoreSignals()
|
|||
|
||||
void BitcoinGUI::toggleNetworkActive()
|
||||
{
|
||||
if (clientModel) {
|
||||
clientModel->setNetworkActive(!clientModel->getNetworkActive());
|
||||
}
|
||||
m_node.setNetworkActive(!m_node.getNetworkActive());
|
||||
}
|
||||
|
||||
UnitDisplayStatusBarControl::UnitDisplayStatusBarControl(const PlatformStyle *platformStyle) :
|
||||
|
|
|
@ -13,6 +13,8 @@
|
|||
#include <chainparams.h>
|
||||
#include <checkpoints.h>
|
||||
#include <clientversion.h>
|
||||
#include <interface/handler.h>
|
||||
#include <interface/node.h>
|
||||
#include <validation.h>
|
||||
#include <net.h>
|
||||
#include <txmempool.h>
|
||||
|
@ -30,8 +32,9 @@ class CBlockIndex;
|
|||
static int64_t nLastHeaderTipUpdateNotification = 0;
|
||||
static int64_t nLastBlockTipUpdateNotification = 0;
|
||||
|
||||
ClientModel::ClientModel(OptionsModel *_optionsModel, QObject *parent) :
|
||||
ClientModel::ClientModel(interface::Node& node, OptionsModel *_optionsModel, QObject *parent) :
|
||||
QObject(parent),
|
||||
m_node(node),
|
||||
optionsModel(_optionsModel),
|
||||
peerTableModel(0),
|
||||
banTableModel(0),
|
||||
|
@ -64,15 +67,7 @@ int ClientModel::getNumConnections(unsigned int flags) const
|
|||
else if (flags == CONNECTIONS_ALL)
|
||||
connections = CConnman::CONNECTIONS_ALL;
|
||||
|
||||
if(g_connman)
|
||||
return g_connman->GetNodeCount(connections);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ClientModel::getNumBlocks() const
|
||||
{
|
||||
LOCK(cs_main);
|
||||
return chainActive.Height();
|
||||
return m_node.getNodeCount(connections);
|
||||
}
|
||||
|
||||
int ClientModel::getHeaderTipHeight() const
|
||||
|
@ -80,10 +75,11 @@ int ClientModel::getHeaderTipHeight() const
|
|||
if (cachedBestHeaderHeight == -1) {
|
||||
// make sure we initially populate the cache via a cs_main lock
|
||||
// otherwise we need to wait for a tip update
|
||||
LOCK(cs_main);
|
||||
if (pindexBestHeader) {
|
||||
cachedBestHeaderHeight = pindexBestHeader->nHeight;
|
||||
cachedBestHeaderTime = pindexBestHeader->GetBlockTime();
|
||||
int height;
|
||||
int64_t blockTime;
|
||||
if (m_node.getHeaderTip(height, blockTime)) {
|
||||
cachedBestHeaderHeight = height;
|
||||
cachedBestHeaderTime = blockTime;
|
||||
}
|
||||
}
|
||||
return cachedBestHeaderHeight;
|
||||
|
@ -92,66 +88,22 @@ int ClientModel::getHeaderTipHeight() const
|
|||
int64_t ClientModel::getHeaderTipTime() const
|
||||
{
|
||||
if (cachedBestHeaderTime == -1) {
|
||||
LOCK(cs_main);
|
||||
if (pindexBestHeader) {
|
||||
cachedBestHeaderHeight = pindexBestHeader->nHeight;
|
||||
cachedBestHeaderTime = pindexBestHeader->GetBlockTime();
|
||||
int height;
|
||||
int64_t blockTime;
|
||||
if (m_node.getHeaderTip(height, blockTime)) {
|
||||
cachedBestHeaderHeight = height;
|
||||
cachedBestHeaderTime = blockTime;
|
||||
}
|
||||
}
|
||||
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()
|
||||
{
|
||||
// no locking required at this point
|
||||
// the following calls will acquire the required lock
|
||||
Q_EMIT mempoolSizeChanged(getMempoolSize(), getMempoolDynamicUsage());
|
||||
Q_EMIT bytesChanged(getTotalBytesRecv(), getTotalBytesSent());
|
||||
Q_EMIT mempoolSizeChanged(m_node.getMempoolSize(), m_node.getMempoolDynamicUsage());
|
||||
Q_EMIT bytesChanged(m_node.getTotalBytesRecv(), m_node.getTotalBytesSent());
|
||||
}
|
||||
|
||||
void ClientModel::updateNumConnections(int numConnections)
|
||||
|
@ -169,16 +121,11 @@ void ClientModel::updateAlert()
|
|||
Q_EMIT alertsChanged(getStatusBarWarnings());
|
||||
}
|
||||
|
||||
bool ClientModel::inInitialBlockDownload() const
|
||||
{
|
||||
return IsInitialBlockDownload();
|
||||
}
|
||||
|
||||
enum BlockSource ClientModel::getBlockSource() const
|
||||
{
|
||||
if (fReindex)
|
||||
if (m_node.getReindex())
|
||||
return BlockSource::REINDEX;
|
||||
else if (fImporting)
|
||||
else if (m_node.getImporting())
|
||||
return BlockSource::DISK;
|
||||
else if (getNumConnections() > 0)
|
||||
return BlockSource::NETWORK;
|
||||
|
@ -186,24 +133,9 @@ enum BlockSource ClientModel::getBlockSource() const
|
|||
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
|
||||
{
|
||||
return QString::fromStdString(GetWarnings("gui"));
|
||||
return QString::fromStdString(m_node.getWarnings("gui"));
|
||||
}
|
||||
|
||||
OptionsModel *ClientModel::getOptionsModel()
|
||||
|
@ -285,7 +217,7 @@ static void BannedListChanged(ClientModel *clientmodel)
|
|||
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
|
||||
// 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) {
|
||||
// cache best headers time and height to reduce future cs_main locks
|
||||
clientmodel->cachedBestHeaderHeight = pIndex->nHeight;
|
||||
clientmodel->cachedBestHeaderTime = pIndex->GetBlockTime();
|
||||
clientmodel->cachedBestHeaderHeight = height;
|
||||
clientmodel->cachedBestHeaderTime = blockTime;
|
||||
}
|
||||
// if we are in-sync, update the UI regardless of last update time
|
||||
if (!initialSync || now - nLastUpdateNotification > MODEL_UPDATE_DELAY) {
|
||||
//pass an async signal to the UI thread
|
||||
QMetaObject::invokeMethod(clientmodel, "numBlocksChanged", Qt::QueuedConnection,
|
||||
Q_ARG(int, pIndex->nHeight),
|
||||
Q_ARG(QDateTime, QDateTime::fromTime_t(pIndex->GetBlockTime())),
|
||||
Q_ARG(double, clientmodel->getVerificationProgress(pIndex)),
|
||||
Q_ARG(int, height),
|
||||
Q_ARG(QDateTime, QDateTime::fromTime_t(blockTime)),
|
||||
Q_ARG(double, verificationProgress),
|
||||
Q_ARG(bool, fHeader));
|
||||
nLastUpdateNotification = now;
|
||||
}
|
||||
|
@ -316,23 +248,23 @@ static void BlockTipChanged(ClientModel *clientmodel, bool initialSync, const CB
|
|||
void ClientModel::subscribeToCoreSignals()
|
||||
{
|
||||
// Connect signals to client
|
||||
uiInterface.ShowProgress.connect(boost::bind(ShowProgress, this, _1, _2));
|
||||
uiInterface.NotifyNumConnectionsChanged.connect(boost::bind(NotifyNumConnectionsChanged, this, _1));
|
||||
uiInterface.NotifyNetworkActiveChanged.connect(boost::bind(NotifyNetworkActiveChanged, this, _1));
|
||||
uiInterface.NotifyAlertChanged.connect(boost::bind(NotifyAlertChanged, this));
|
||||
uiInterface.BannedListChanged.connect(boost::bind(BannedListChanged, this));
|
||||
uiInterface.NotifyBlockTip.connect(boost::bind(BlockTipChanged, this, _1, _2, false));
|
||||
uiInterface.NotifyHeaderTip.connect(boost::bind(BlockTipChanged, this, _1, _2, true));
|
||||
m_handler_show_progress = m_node.handleShowProgress(boost::bind(ShowProgress, this, _1, _2));
|
||||
m_handler_notify_num_connections_changed = m_node.handleNotifyNumConnectionsChanged(boost::bind(NotifyNumConnectionsChanged, this, _1));
|
||||
m_handler_notify_network_active_changed = m_node.handleNotifyNetworkActiveChanged(boost::bind(NotifyNetworkActiveChanged, this, _1));
|
||||
m_handler_notify_alert_changed = m_node.handleNotifyAlertChanged(boost::bind(NotifyAlertChanged, this));
|
||||
m_handler_banned_list_changed = m_node.handleBannedListChanged(boost::bind(BannedListChanged, this));
|
||||
m_handler_notify_block_tip = m_node.handleNotifyBlockTip(boost::bind(BlockTipChanged, this, _1, _2, _3, _4, false));
|
||||
m_handler_notify_header_tip = m_node.handleNotifyHeaderTip(boost::bind(BlockTipChanged, this, _1, _2, _3, _4, true));
|
||||
}
|
||||
|
||||
void ClientModel::unsubscribeFromCoreSignals()
|
||||
{
|
||||
// Disconnect signals from client
|
||||
uiInterface.ShowProgress.disconnect(boost::bind(ShowProgress, this, _1, _2));
|
||||
uiInterface.NotifyNumConnectionsChanged.disconnect(boost::bind(NotifyNumConnectionsChanged, this, _1));
|
||||
uiInterface.NotifyNetworkActiveChanged.disconnect(boost::bind(NotifyNetworkActiveChanged, this, _1));
|
||||
uiInterface.NotifyAlertChanged.disconnect(boost::bind(NotifyAlertChanged, this));
|
||||
uiInterface.BannedListChanged.disconnect(boost::bind(BannedListChanged, this));
|
||||
uiInterface.NotifyBlockTip.disconnect(boost::bind(BlockTipChanged, this, _1, _2, false));
|
||||
uiInterface.NotifyHeaderTip.disconnect(boost::bind(BlockTipChanged, this, _1, _2, true));
|
||||
m_handler_show_progress->disconnect();
|
||||
m_handler_notify_num_connections_changed->disconnect();
|
||||
m_handler_notify_network_active_changed->disconnect();
|
||||
m_handler_notify_alert_changed->disconnect();
|
||||
m_handler_banned_list_changed->disconnect();
|
||||
m_handler_notify_block_tip->disconnect();
|
||||
m_handler_notify_header_tip->disconnect();
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include <QDateTime>
|
||||
|
||||
#include <atomic>
|
||||
#include <memory>
|
||||
|
||||
class BanTableModel;
|
||||
class OptionsModel;
|
||||
|
@ -16,6 +17,11 @@ class PeerTableModel;
|
|||
|
||||
class CBlockIndex;
|
||||
|
||||
namespace interface {
|
||||
class Handler;
|
||||
class Node;
|
||||
}
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QTimer;
|
||||
QT_END_NAMESPACE
|
||||
|
@ -40,37 +46,21 @@ class ClientModel : public QObject
|
|||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit ClientModel(OptionsModel *optionsModel, QObject *parent = 0);
|
||||
explicit ClientModel(interface::Node& node, OptionsModel *optionsModel, QObject *parent = 0);
|
||||
~ClientModel();
|
||||
|
||||
interface::Node& node() const { return m_node; }
|
||||
OptionsModel *getOptionsModel();
|
||||
PeerTableModel *getPeerTableModel();
|
||||
BanTableModel *getBanTableModel();
|
||||
|
||||
//! Return number of connections, default is in- and outbound (total)
|
||||
int getNumConnections(unsigned int flags = CONNECTIONS_ALL) const;
|
||||
int getNumBlocks() const;
|
||||
int getHeaderTipHeight() 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
|
||||
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
|
||||
QString getStatusBarWarnings() const;
|
||||
|
||||
|
@ -85,6 +75,14 @@ public:
|
|||
mutable std::atomic<int64_t> cachedBestHeaderTime;
|
||||
|
||||
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;
|
||||
PeerTableModel *peerTableModel;
|
||||
BanTableModel *banTableModel;
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include <qt/platformstyle.h>
|
||||
#include <qt/walletmodel.h>
|
||||
#include <chainparams.h>
|
||||
#include <interface/node.h>
|
||||
#include <netbase.h>
|
||||
#include <rpc/server.h>
|
||||
#include <rpc/client.h>
|
||||
|
@ -566,13 +567,14 @@ void RPCConsole::setClientModel(ClientModel *model)
|
|||
setNumConnections(model->getNumConnections());
|
||||
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)));
|
||||
|
||||
updateNetworkState();
|
||||
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(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("Out:") + " " + QString::number(clientModel->getNumConnections(CONNECTIONS_OUT)) + ")";
|
||||
|
||||
if(!clientModel->getNetworkActive()) {
|
||||
if(!clientModel->node().getNetworkActive()) {
|
||||
connections += " (" + tr("Network activity disabled") + ")";
|
||||
}
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include <interface/node.h>
|
||||
#include <qt/trafficgraphwidget.h>
|
||||
#include <qt/clientmodel.h>
|
||||
|
||||
|
@ -35,8 +36,8 @@ void TrafficGraphWidget::setClientModel(ClientModel *model)
|
|||
{
|
||||
clientModel = model;
|
||||
if(model) {
|
||||
nLastBytesIn = model->getTotalBytesRecv();
|
||||
nLastBytesOut = model->getTotalBytesSent();
|
||||
nLastBytesIn = model->node().getTotalBytesRecv();
|
||||
nLastBytesOut = model->node().getTotalBytesSent();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -123,8 +124,8 @@ void TrafficGraphWidget::updateRates()
|
|||
{
|
||||
if(!clientModel) return;
|
||||
|
||||
quint64 bytesIn = clientModel->getTotalBytesRecv(),
|
||||
bytesOut = clientModel->getTotalBytesSent();
|
||||
quint64 bytesIn = clientModel->node().getTotalBytesRecv(),
|
||||
bytesOut = clientModel->node().getTotalBytesSent();
|
||||
float inRate = (bytesIn - nLastBytesIn) / 1024.0f * 1000 / timer->interval();
|
||||
float outRate = (bytesOut - nLastBytesOut) / 1024.0f * 1000 / timer->interval();
|
||||
vSamplesIn.push_front(inRate);
|
||||
|
@ -169,8 +170,8 @@ void TrafficGraphWidget::clear()
|
|||
fMax = 0.0f;
|
||||
|
||||
if(clientModel) {
|
||||
nLastBytesIn = clientModel->getTotalBytesRecv();
|
||||
nLastBytesOut = clientModel->getTotalBytesSent();
|
||||
nLastBytesIn = clientModel->node().getTotalBytesRecv();
|
||||
nLastBytesOut = clientModel->node().getTotalBytesSent();
|
||||
}
|
||||
timer->start();
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <qt/transactionview.h>
|
||||
#include <qt/walletmodel.h>
|
||||
|
||||
#include <interface/node.h>
|
||||
#include <ui_interface.h>
|
||||
|
||||
#include <QAction>
|
||||
|
@ -158,7 +159,7 @@ void WalletView::setWalletModel(WalletModel *_walletModel)
|
|||
void WalletView::processNewTransaction(const QModelIndex& parent, int start, int /*end*/)
|
||||
{
|
||||
// Prevent balloon-spam when initial block download is in progress
|
||||
if (!walletModel || !clientModel || clientModel->inInitialBlockDownload())
|
||||
if (!walletModel || !clientModel || clientModel->node().isInitialBlockDownload())
|
||||
return;
|
||||
|
||||
TransactionTableModel *ttm = walletModel->getTransactionTableModel();
|
||||
|
|
Loading…
Reference in a new issue