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 <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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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) :
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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") + ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue