aboutsummaryrefslogtreecommitdiff
path: root/src/qt
diff options
context:
space:
mode:
authorRussell Yanofsky <russ@yanofsky.org>2017-04-17 15:37:36 -0400
committerJohn Newbery <john@johnnewbery.com>2018-04-04 16:52:40 -0400
commitfe6f27e6ea68a139d3a98b30a53706008ef8b132 (patch)
treeb464ec4ceb05146ccd8c2f4e7f44559546a6e72c /src/qt
parent5fba3af21e44ab7552c57782de430c1f4cfd6697 (diff)
downloadbitcoin-fe6f27e6ea68a139d3a98b30a53706008ef8b132.tar.xz
Remove direct bitcoin calls from qt/clientmodel.cpp
Diffstat (limited to 'src/qt')
-rw-r--r--src/qt/bitcoin.cpp2
-rw-r--r--src/qt/bitcoingui.cpp8
-rw-r--r--src/qt/clientmodel.cpp148
-rw-r--r--src/qt/clientmodel.h36
-rw-r--r--src/qt/rpcconsole.cpp8
-rw-r--r--src/qt/trafficgraphwidget.cpp13
-rw-r--r--src/qt/walletview.cpp3
7 files changed, 75 insertions, 143 deletions
diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp
index 07fac934fb..ba473bb4e8 100644
--- a/src/qt/bitcoin.cpp
+++ b/src/qt/bitcoin.cpp
@@ -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
diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp
index b07ff230fd..dbe8d0da69 100644
--- a/src/qt/bitcoingui.cpp
+++ b/src/qt/bitcoingui.cpp
@@ -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) :
diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp
index 40661d9ec3..213068a490 100644
--- a/src/qt/clientmodel.cpp
+++ b/src/qt/clientmodel.cpp
@@ -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();
}
diff --git a/src/qt/clientmodel.h b/src/qt/clientmodel.h
index 1118bc31b3..9faa10b87e 100644
--- a/src/qt/clientmodel.h
+++ b/src/qt/clientmodel.h
@@ -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;
diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp
index c41e19f6f5..d6cd9ef8ef 100644
--- a/src/qt/rpcconsole.cpp
+++ b/src/qt/rpcconsole.cpp
@@ -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") + ")";
}
diff --git a/src/qt/trafficgraphwidget.cpp b/src/qt/trafficgraphwidget.cpp
index f869799462..ff378ed1bf 100644
--- a/src/qt/trafficgraphwidget.cpp
+++ b/src/qt/trafficgraphwidget.cpp
@@ -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();
}
diff --git a/src/qt/walletview.cpp b/src/qt/walletview.cpp
index cc4300a7a1..e1c892f115 100644
--- a/src/qt/walletview.cpp
+++ b/src/qt/walletview.cpp
@@ -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();