Merge #8996: Network activity toggle
19f46f1
Qt: New network_disabled icon (Luke Dashjr)54cf997
RPC/Net: Use boolean consistently for networkactive, and remove from getinfo (Luke Dashjr)b2b33d9
Overhaul network activity toggle (Jonas Schnelli)32efa79
Qt: Add GUI feedback and control of network activity state. (Jon Lund Steffensen)e38993b
RPC: Add "togglenetwork" method to toggle network activity temporarily (Jon Lund Steffensen)7c9a98a
Allow network activity to be temporarily suspended. (Jon Lund Steffensen)
This commit is contained in:
commit
ab914a6530
17 changed files with 285 additions and 13 deletions
|
@ -47,7 +47,10 @@ Comment: Site: https://github.com/stephenhutchings/typicons.font
|
||||||
|
|
||||||
Files: src/qt/res/icons/connect*.png
|
Files: src/qt/res/icons/connect*.png
|
||||||
src/qt/res/src/connect-*.svg
|
src/qt/res/src/connect-*.svg
|
||||||
|
src/qt/res/icons/network_disabled.png
|
||||||
|
src/qt/res/src/network_disabled.svg
|
||||||
Copyright: Marco Falke
|
Copyright: Marco Falke
|
||||||
|
Luke Dashjr
|
||||||
License: Expat
|
License: Expat
|
||||||
Comment: Inspired by Stephan Hutchings Typicons
|
Comment: Inspired by Stephan Hutchings Typicons
|
||||||
|
|
||||||
|
|
|
@ -271,6 +271,7 @@ RES_ICONS = \
|
||||||
qt/res/icons/key.png \
|
qt/res/icons/key.png \
|
||||||
qt/res/icons/lock_closed.png \
|
qt/res/icons/lock_closed.png \
|
||||||
qt/res/icons/lock_open.png \
|
qt/res/icons/lock_open.png \
|
||||||
|
qt/res/icons/network_disabled.png \
|
||||||
qt/res/icons/open.png \
|
qt/res/icons/open.png \
|
||||||
qt/res/icons/overview.png \
|
qt/res/icons/overview.png \
|
||||||
qt/res/icons/quit.png \
|
qt/res/icons/quit.png \
|
||||||
|
|
31
src/net.cpp
31
src/net.cpp
|
@ -985,6 +985,12 @@ void CConnman::AcceptConnection(const ListenSocket& hListenSocket) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!fNetworkActive) {
|
||||||
|
LogPrintf("connection from %s dropped: not accepting new connections\n", addr.ToString());
|
||||||
|
CloseSocket(hSocket);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!IsSelectableSocket(hSocket))
|
if (!IsSelectableSocket(hSocket))
|
||||||
{
|
{
|
||||||
LogPrintf("connection from %s dropped: non-selectable socket\n", addr.ToString());
|
LogPrintf("connection from %s dropped: non-selectable socket\n", addr.ToString());
|
||||||
|
@ -1784,6 +1790,9 @@ bool CConnman::OpenNetworkConnection(const CAddress& addrConnect, bool fCountFai
|
||||||
// Initiate outbound network connection
|
// Initiate outbound network connection
|
||||||
//
|
//
|
||||||
boost::this_thread::interruption_point();
|
boost::this_thread::interruption_point();
|
||||||
|
if (!fNetworkActive) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (!pszDest) {
|
if (!pszDest) {
|
||||||
if (IsLocal(addrConnect) ||
|
if (IsLocal(addrConnect) ||
|
||||||
FindNode((CNetAddr)addrConnect) || IsBanned(addrConnect) ||
|
FindNode((CNetAddr)addrConnect) || IsBanned(addrConnect) ||
|
||||||
|
@ -2025,8 +2034,30 @@ void Discover(boost::thread_group& threadGroup)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CConnman::SetNetworkActive(bool active)
|
||||||
|
{
|
||||||
|
if (fDebug) {
|
||||||
|
LogPrint("net", "SetNetworkActive: %s\n", active);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!active) {
|
||||||
|
fNetworkActive = false;
|
||||||
|
|
||||||
|
LOCK(cs_vNodes);
|
||||||
|
// Close sockets to all nodes
|
||||||
|
BOOST_FOREACH(CNode* pnode, vNodes) {
|
||||||
|
pnode->CloseSocketDisconnect();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fNetworkActive = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
uiInterface.NotifyNetworkActiveChanged(fNetworkActive);
|
||||||
|
}
|
||||||
|
|
||||||
CConnman::CConnman(uint64_t nSeed0In, uint64_t nSeed1In) : nSeed0(nSeed0In), nSeed1(nSeed1In)
|
CConnman::CConnman(uint64_t nSeed0In, uint64_t nSeed1In) : nSeed0(nSeed0In), nSeed1(nSeed1In)
|
||||||
{
|
{
|
||||||
|
fNetworkActive = true;
|
||||||
setBannedIsDirty = false;
|
setBannedIsDirty = false;
|
||||||
fAddressesInitialized = false;
|
fAddressesInitialized = false;
|
||||||
nLastNodeId = 0;
|
nLastNodeId = 0;
|
||||||
|
|
|
@ -131,6 +131,8 @@ public:
|
||||||
bool Start(boost::thread_group& threadGroup, CScheduler& scheduler, std::string& strNodeError, Options options);
|
bool Start(boost::thread_group& threadGroup, CScheduler& scheduler, std::string& strNodeError, Options options);
|
||||||
void Stop();
|
void Stop();
|
||||||
bool BindListenPort(const CService &bindAddr, std::string& strError, bool fWhitelisted = false);
|
bool BindListenPort(const CService &bindAddr, std::string& strError, bool fWhitelisted = false);
|
||||||
|
bool GetNetworkActive() const { return fNetworkActive; };
|
||||||
|
void SetNetworkActive(bool active);
|
||||||
bool OpenNetworkConnection(const CAddress& addrConnect, bool fCountFailure, CSemaphoreGrant *grantOutbound = NULL, const char *strDest = NULL, bool fOneShot = false, bool fFeeler = false);
|
bool OpenNetworkConnection(const CAddress& addrConnect, bool fCountFailure, CSemaphoreGrant *grantOutbound = NULL, const char *strDest = NULL, bool fOneShot = false, bool fFeeler = false);
|
||||||
bool CheckIncomingNonce(uint64_t nonce);
|
bool CheckIncomingNonce(uint64_t nonce);
|
||||||
|
|
||||||
|
@ -401,6 +403,7 @@ private:
|
||||||
unsigned int nReceiveFloodSize;
|
unsigned int nReceiveFloodSize;
|
||||||
|
|
||||||
std::vector<ListenSocket> vhListenSocket;
|
std::vector<ListenSocket> vhListenSocket;
|
||||||
|
bool fNetworkActive;
|
||||||
banmap_t setBanned;
|
banmap_t setBanned;
|
||||||
CCriticalSection cs_setBanned;
|
CCriticalSection cs_setBanned;
|
||||||
bool setBannedIsDirty;
|
bool setBannedIsDirty;
|
||||||
|
|
|
@ -52,6 +52,7 @@
|
||||||
<file alias="transaction_abandoned">res/icons/transaction_abandoned.png</file>
|
<file alias="transaction_abandoned">res/icons/transaction_abandoned.png</file>
|
||||||
<file alias="hd_enabled">res/icons/hd_enabled.png</file>
|
<file alias="hd_enabled">res/icons/hd_enabled.png</file>
|
||||||
<file alias="hd_disabled">res/icons/hd_disabled.png</file>
|
<file alias="hd_disabled">res/icons/hd_disabled.png</file>
|
||||||
|
<file alias="network_disabled">res/icons/network_disabled.png</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
<qresource prefix="/movies">
|
<qresource prefix="/movies">
|
||||||
<file alias="spinner-000">res/movies/spinner-000.png</file>
|
<file alias="spinner-000">res/movies/spinner-000.png</file>
|
||||||
|
|
|
@ -86,7 +86,7 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *_platformStyle, const NetworkStyle *
|
||||||
unitDisplayControl(0),
|
unitDisplayControl(0),
|
||||||
labelWalletEncryptionIcon(0),
|
labelWalletEncryptionIcon(0),
|
||||||
labelWalletHDStatusIcon(0),
|
labelWalletHDStatusIcon(0),
|
||||||
labelConnectionsIcon(0),
|
connectionsControl(0),
|
||||||
labelBlocksIcon(0),
|
labelBlocksIcon(0),
|
||||||
progressBarLabel(0),
|
progressBarLabel(0),
|
||||||
progressBar(0),
|
progressBar(0),
|
||||||
|
@ -199,7 +199,7 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *_platformStyle, const NetworkStyle *
|
||||||
unitDisplayControl = new UnitDisplayStatusBarControl(platformStyle);
|
unitDisplayControl = new UnitDisplayStatusBarControl(platformStyle);
|
||||||
labelWalletEncryptionIcon = new QLabel();
|
labelWalletEncryptionIcon = new QLabel();
|
||||||
labelWalletHDStatusIcon = new QLabel();
|
labelWalletHDStatusIcon = new QLabel();
|
||||||
labelConnectionsIcon = new QLabel();
|
connectionsControl = new NetworkToggleStatusBarControl();
|
||||||
labelBlocksIcon = new QLabel();
|
labelBlocksIcon = new QLabel();
|
||||||
if(enableWallet)
|
if(enableWallet)
|
||||||
{
|
{
|
||||||
|
@ -210,7 +210,7 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *_platformStyle, const NetworkStyle *
|
||||||
frameBlocksLayout->addWidget(labelWalletHDStatusIcon);
|
frameBlocksLayout->addWidget(labelWalletHDStatusIcon);
|
||||||
}
|
}
|
||||||
frameBlocksLayout->addStretch();
|
frameBlocksLayout->addStretch();
|
||||||
frameBlocksLayout->addWidget(labelConnectionsIcon);
|
frameBlocksLayout->addWidget(connectionsControl);
|
||||||
frameBlocksLayout->addStretch();
|
frameBlocksLayout->addStretch();
|
||||||
frameBlocksLayout->addWidget(labelBlocksIcon);
|
frameBlocksLayout->addWidget(labelBlocksIcon);
|
||||||
frameBlocksLayout->addStretch();
|
frameBlocksLayout->addStretch();
|
||||||
|
@ -469,8 +469,9 @@ void BitcoinGUI::setClientModel(ClientModel *_clientModel)
|
||||||
createTrayIconMenu();
|
createTrayIconMenu();
|
||||||
|
|
||||||
// Keep up to date with client
|
// Keep up to date with client
|
||||||
setNumConnections(_clientModel->getNumConnections());
|
updateNetworkState();
|
||||||
connect(_clientModel, SIGNAL(numConnectionsChanged(int)), this, SLOT(setNumConnections(int)));
|
connect(_clientModel, SIGNAL(numConnectionsChanged(int)), this, SLOT(setNumConnections(int)));
|
||||||
|
connect(_clientModel, SIGNAL(networkActiveChanged(bool)), this, SLOT(setNetworkActive(bool)));
|
||||||
|
|
||||||
setNumBlocks(_clientModel->getNumBlocks(), _clientModel->getLastBlockDate(), _clientModel->getVerificationProgress(NULL), false);
|
setNumBlocks(_clientModel->getNumBlocks(), _clientModel->getLastBlockDate(), _clientModel->getVerificationProgress(NULL), 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)));
|
||||||
|
@ -489,6 +490,7 @@ void BitcoinGUI::setClientModel(ClientModel *_clientModel)
|
||||||
}
|
}
|
||||||
#endif // ENABLE_WALLET
|
#endif // ENABLE_WALLET
|
||||||
unitDisplayControl->setOptionsModel(_clientModel->getOptionsModel());
|
unitDisplayControl->setOptionsModel(_clientModel->getOptionsModel());
|
||||||
|
connectionsControl->setClientModel(_clientModel);
|
||||||
|
|
||||||
OptionsModel* optionsModel = _clientModel->getOptionsModel();
|
OptionsModel* optionsModel = _clientModel->getOptionsModel();
|
||||||
if(optionsModel)
|
if(optionsModel)
|
||||||
|
@ -698,8 +700,9 @@ void BitcoinGUI::gotoVerifyMessageTab(QString addr)
|
||||||
}
|
}
|
||||||
#endif // ENABLE_WALLET
|
#endif // ENABLE_WALLET
|
||||||
|
|
||||||
void BitcoinGUI::setNumConnections(int count)
|
void BitcoinGUI::updateNetworkState()
|
||||||
{
|
{
|
||||||
|
int count = clientModel->getNumConnections();
|
||||||
QString icon;
|
QString icon;
|
||||||
switch(count)
|
switch(count)
|
||||||
{
|
{
|
||||||
|
@ -709,8 +712,25 @@ void BitcoinGUI::setNumConnections(int count)
|
||||||
case 7: case 8: case 9: icon = ":/icons/connect_3"; break;
|
case 7: case 8: case 9: icon = ":/icons/connect_3"; break;
|
||||||
default: icon = ":/icons/connect_4"; break;
|
default: icon = ":/icons/connect_4"; break;
|
||||||
}
|
}
|
||||||
labelConnectionsIcon->setPixmap(platformStyle->SingleColorIcon(icon).pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
|
|
||||||
labelConnectionsIcon->setToolTip(tr("%n active connection(s) to Bitcoin network", "", count));
|
if (clientModel->getNetworkActive()) {
|
||||||
|
connectionsControl->setToolTip(tr("%n active connection(s) to Bitcoin network", "", count));
|
||||||
|
} else {
|
||||||
|
connectionsControl->setToolTip(tr("Network activity disabled"));
|
||||||
|
icon = ":/icons/network_disabled";
|
||||||
|
}
|
||||||
|
|
||||||
|
connectionsControl->setPixmap(platformStyle->SingleColorIcon(icon).pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
|
||||||
|
}
|
||||||
|
|
||||||
|
void BitcoinGUI::setNumConnections(int count)
|
||||||
|
{
|
||||||
|
updateNetworkState();
|
||||||
|
}
|
||||||
|
|
||||||
|
void BitcoinGUI::setNetworkActive(bool networkActive)
|
||||||
|
{
|
||||||
|
updateNetworkState();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, bool header)
|
void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, bool header)
|
||||||
|
@ -1211,3 +1231,18 @@ void UnitDisplayStatusBarControl::onMenuSelection(QAction* action)
|
||||||
optionsModel->setDisplayUnit(action->data());
|
optionsModel->setDisplayUnit(action->data());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NetworkToggleStatusBarControl::mousePressEvent(QMouseEvent *event)
|
||||||
|
{
|
||||||
|
if (clientModel) {
|
||||||
|
clientModel->setNetworkActive(!clientModel->getNetworkActive());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Lets the control know about the Client Model */
|
||||||
|
void NetworkToggleStatusBarControl::setClientModel(ClientModel *_clientModel)
|
||||||
|
{
|
||||||
|
if (_clientModel) {
|
||||||
|
this->clientModel = _clientModel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ class PlatformStyle;
|
||||||
class RPCConsole;
|
class RPCConsole;
|
||||||
class SendCoinsRecipient;
|
class SendCoinsRecipient;
|
||||||
class UnitDisplayStatusBarControl;
|
class UnitDisplayStatusBarControl;
|
||||||
|
class NetworkToggleStatusBarControl;
|
||||||
class WalletFrame;
|
class WalletFrame;
|
||||||
class WalletModel;
|
class WalletModel;
|
||||||
class HelpMessageDialog;
|
class HelpMessageDialog;
|
||||||
|
@ -85,7 +86,7 @@ private:
|
||||||
UnitDisplayStatusBarControl *unitDisplayControl;
|
UnitDisplayStatusBarControl *unitDisplayControl;
|
||||||
QLabel *labelWalletEncryptionIcon;
|
QLabel *labelWalletEncryptionIcon;
|
||||||
QLabel *labelWalletHDStatusIcon;
|
QLabel *labelWalletHDStatusIcon;
|
||||||
QLabel *labelConnectionsIcon;
|
NetworkToggleStatusBarControl *connectionsControl;
|
||||||
QLabel *labelBlocksIcon;
|
QLabel *labelBlocksIcon;
|
||||||
QLabel *progressBarLabel;
|
QLabel *progressBarLabel;
|
||||||
QProgressBar *progressBar;
|
QProgressBar *progressBar;
|
||||||
|
@ -146,6 +147,9 @@ private:
|
||||||
/** Disconnect core signals from GUI client */
|
/** Disconnect core signals from GUI client */
|
||||||
void unsubscribeFromCoreSignals();
|
void unsubscribeFromCoreSignals();
|
||||||
|
|
||||||
|
/** Update UI with latest network info from model. */
|
||||||
|
void updateNetworkState();
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
/** Signal raised when a URI was entered or dragged to the GUI */
|
/** Signal raised when a URI was entered or dragged to the GUI */
|
||||||
void receivedURI(const QString &uri);
|
void receivedURI(const QString &uri);
|
||||||
|
@ -153,6 +157,8 @@ Q_SIGNALS:
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
/** Set number of connections shown in the UI */
|
/** Set number of connections shown in the UI */
|
||||||
void setNumConnections(int count);
|
void setNumConnections(int count);
|
||||||
|
/** Set network state shown in the UI */
|
||||||
|
void setNetworkActive(bool networkActive);
|
||||||
/** Set number of blocks and last block date shown in the UI */
|
/** Set number of blocks and last block date shown in the UI */
|
||||||
void setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, bool headers);
|
void setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, bool headers);
|
||||||
|
|
||||||
|
@ -264,4 +270,17 @@ private Q_SLOTS:
|
||||||
void onMenuSelection(QAction* action);
|
void onMenuSelection(QAction* action);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class NetworkToggleStatusBarControl : public QLabel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
void setClientModel(ClientModel *clientModel);
|
||||||
|
protected:
|
||||||
|
void mousePressEvent(QMouseEvent *event);
|
||||||
|
|
||||||
|
private:
|
||||||
|
ClientModel *clientModel;
|
||||||
|
};
|
||||||
|
|
||||||
#endif // BITCOIN_QT_BITCOINGUI_H
|
#endif // BITCOIN_QT_BITCOINGUI_H
|
||||||
|
|
|
@ -145,6 +145,11 @@ void ClientModel::updateNumConnections(int numConnections)
|
||||||
Q_EMIT numConnectionsChanged(numConnections);
|
Q_EMIT numConnectionsChanged(numConnections);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClientModel::updateNetworkActive(bool networkActive)
|
||||||
|
{
|
||||||
|
Q_EMIT networkActiveChanged(networkActive);
|
||||||
|
}
|
||||||
|
|
||||||
void ClientModel::updateAlert()
|
void ClientModel::updateAlert()
|
||||||
{
|
{
|
||||||
Q_EMIT alertsChanged(getStatusBarWarnings());
|
Q_EMIT alertsChanged(getStatusBarWarnings());
|
||||||
|
@ -167,6 +172,21 @@ enum BlockSource ClientModel::getBlockSource() const
|
||||||
return BLOCK_SOURCE_NONE;
|
return BLOCK_SOURCE_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(GetWarnings("gui"));
|
||||||
|
@ -233,6 +253,12 @@ static void NotifyNumConnectionsChanged(ClientModel *clientmodel, int newNumConn
|
||||||
Q_ARG(int, newNumConnections));
|
Q_ARG(int, newNumConnections));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void NotifyNetworkActiveChanged(ClientModel *clientmodel, bool networkActive)
|
||||||
|
{
|
||||||
|
QMetaObject::invokeMethod(clientmodel, "updateNetworkActive", Qt::QueuedConnection,
|
||||||
|
Q_ARG(bool, networkActive));
|
||||||
|
}
|
||||||
|
|
||||||
static void NotifyAlertChanged(ClientModel *clientmodel)
|
static void NotifyAlertChanged(ClientModel *clientmodel)
|
||||||
{
|
{
|
||||||
qDebug() << "NotifyAlertChanged";
|
qDebug() << "NotifyAlertChanged";
|
||||||
|
@ -273,6 +299,7 @@ void ClientModel::subscribeToCoreSignals()
|
||||||
// Connect signals to client
|
// Connect signals to client
|
||||||
uiInterface.ShowProgress.connect(boost::bind(ShowProgress, this, _1, _2));
|
uiInterface.ShowProgress.connect(boost::bind(ShowProgress, this, _1, _2));
|
||||||
uiInterface.NotifyNumConnectionsChanged.connect(boost::bind(NotifyNumConnectionsChanged, this, _1));
|
uiInterface.NotifyNumConnectionsChanged.connect(boost::bind(NotifyNumConnectionsChanged, this, _1));
|
||||||
|
uiInterface.NotifyNetworkActiveChanged.connect(boost::bind(NotifyNetworkActiveChanged, this, _1));
|
||||||
uiInterface.NotifyAlertChanged.connect(boost::bind(NotifyAlertChanged, this));
|
uiInterface.NotifyAlertChanged.connect(boost::bind(NotifyAlertChanged, this));
|
||||||
uiInterface.BannedListChanged.connect(boost::bind(BannedListChanged, this));
|
uiInterface.BannedListChanged.connect(boost::bind(BannedListChanged, this));
|
||||||
uiInterface.NotifyBlockTip.connect(boost::bind(BlockTipChanged, this, _1, _2, false));
|
uiInterface.NotifyBlockTip.connect(boost::bind(BlockTipChanged, this, _1, _2, false));
|
||||||
|
@ -284,6 +311,7 @@ void ClientModel::unsubscribeFromCoreSignals()
|
||||||
// Disconnect signals from client
|
// Disconnect signals from client
|
||||||
uiInterface.ShowProgress.disconnect(boost::bind(ShowProgress, this, _1, _2));
|
uiInterface.ShowProgress.disconnect(boost::bind(ShowProgress, this, _1, _2));
|
||||||
uiInterface.NotifyNumConnectionsChanged.disconnect(boost::bind(NotifyNumConnectionsChanged, this, _1));
|
uiInterface.NotifyNumConnectionsChanged.disconnect(boost::bind(NotifyNumConnectionsChanged, this, _1));
|
||||||
|
uiInterface.NotifyNetworkActiveChanged.disconnect(boost::bind(NotifyNetworkActiveChanged, this, _1));
|
||||||
uiInterface.NotifyAlertChanged.disconnect(boost::bind(NotifyAlertChanged, this));
|
uiInterface.NotifyAlertChanged.disconnect(boost::bind(NotifyAlertChanged, this));
|
||||||
uiInterface.BannedListChanged.disconnect(boost::bind(BannedListChanged, this));
|
uiInterface.BannedListChanged.disconnect(boost::bind(BannedListChanged, this));
|
||||||
uiInterface.NotifyBlockTip.disconnect(boost::bind(BlockTipChanged, this, _1, _2, false));
|
uiInterface.NotifyBlockTip.disconnect(boost::bind(BlockTipChanged, this, _1, _2, false));
|
||||||
|
|
|
@ -68,6 +68,10 @@ public:
|
||||||
bool inInitialBlockDownload() const;
|
bool inInitialBlockDownload() const;
|
||||||
//! Return true if core is importing blocks
|
//! Return true if core is importing blocks
|
||||||
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;
|
||||||
|
|
||||||
|
@ -91,6 +95,7 @@ Q_SIGNALS:
|
||||||
void numConnectionsChanged(int count);
|
void numConnectionsChanged(int count);
|
||||||
void numBlocksChanged(int count, const QDateTime& blockDate, double nVerificationProgress, bool header);
|
void numBlocksChanged(int count, const QDateTime& blockDate, double nVerificationProgress, bool header);
|
||||||
void mempoolSizeChanged(long count, size_t mempoolSizeInBytes);
|
void mempoolSizeChanged(long count, size_t mempoolSizeInBytes);
|
||||||
|
void networkActiveChanged(bool networkActive);
|
||||||
void alertsChanged(const QString &warnings);
|
void alertsChanged(const QString &warnings);
|
||||||
void bytesChanged(quint64 totalBytesIn, quint64 totalBytesOut);
|
void bytesChanged(quint64 totalBytesIn, quint64 totalBytesOut);
|
||||||
|
|
||||||
|
@ -103,6 +108,7 @@ Q_SIGNALS:
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
void updateTimer();
|
void updateTimer();
|
||||||
void updateNumConnections(int numConnections);
|
void updateNumConnections(int numConnections);
|
||||||
|
void updateNetworkActive(bool networkActive);
|
||||||
void updateAlert();
|
void updateAlert();
|
||||||
void updateBanlist();
|
void updateBanlist();
|
||||||
};
|
};
|
||||||
|
|
BIN
src/qt/res/icons/network_disabled.png
Normal file
BIN
src/qt/res/icons/network_disabled.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 591 B |
68
src/qt/res/src/network_disabled.svg
Normal file
68
src/qt/res/src/network_disabled.svg
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
id="svg2"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
height="24"
|
||||||
|
width="24"
|
||||||
|
version="1.2">
|
||||||
|
<metadata
|
||||||
|
id="metadata10">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs8" />
|
||||||
|
<g
|
||||||
|
id="g4142"
|
||||||
|
transform="matrix(0,-1,-1,0,23.96,24)">
|
||||||
|
<g
|
||||||
|
id="g4210"
|
||||||
|
transform="matrix(-1,0,0,1,59.86,-106.6)">
|
||||||
|
<g
|
||||||
|
id="g4289"
|
||||||
|
transform="matrix(-1,0,0,1,-16.98,0.8136)">
|
||||||
|
<g
|
||||||
|
id="g4291">
|
||||||
|
<path
|
||||||
|
id="path4293"
|
||||||
|
d="m -65.35,116.3 0,3 0.5,0 c 0.54,0 1,0.5 1,1 l 0,2.6 c -1.15,0.5 -2,1.6 -2,3 0,2 1.59,3.5 3.5,3.5 1.91,0 3.5,-1.5 3.5,-3.5 0,-1.4 -0.85,-2.5 -2,-3 l 0,-2.6 c 0,-2.3 -1.81,-4 -4,-4 z m 1,1.2 c 1.39,0.3 2.5,1.3 2.5,2.8 l 0,3.2 0.34,0.1 c 0.96,0.3 1.66,1.2 1.66,2.3 0,1.4 -1.11,2.5 -2.5,2.5 -1.39,0 -2.5,-1.1 -2.5,-2.5 0,-1.1 0.69,-2 1.66,-2.3 l 0.34,-0.1 0,-3.2 c 0,-0.9 -0.67,-1.5 -1.5,-1.8 z"
|
||||||
|
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<g
|
||||||
|
style="fill:#969696;fill-opacity:1"
|
||||||
|
id="g4295">
|
||||||
|
<path
|
||||||
|
id="path4297"
|
||||||
|
d="m -67.35,106.1 c -1.94,0 -3.5,1.6 -3.5,3.5 0,1.4 0.85,2.5 2,3 l 0,2.7 c 0,2.2 1.79,4 4,4 l 0.5,0 0,-0.5 0,-2.5 -0.5,0 c -0.55,0 -1,-0.5 -1,-1 l 0,-2.7 c 1.15,-0.5 2,-1.6 2,-3 0,-1.9 -1.57,-3.5 -3.5,-3.5 z m 0,1 c 1.37,0 2.5,1.2 2.5,2.5 0,1.1 -0.7,2 -1.66,2.3 l -0.34,0.1 0,3.3 c 0,0.9 0.67,1.5 1.5,1.8 l 0,1 c -1.38,-0.3 -2.5,-1.4 -2.5,-2.8 l 0,-3.3 -0.34,-0.1 c -0.96,-0.3 -1.66,-1.2 -1.66,-2.3 0,-1.3 1.12,-2.5 2.5,-2.5 z"
|
||||||
|
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<path
|
||||||
|
id="path4299"
|
||||||
|
d="m -57.35,106.1 c -1.93,0 -3.5,1.6 -3.5,3.5 0,1.4 0.85,2.5 2,3 l 0,2.7 c 0,0.5 -0.45,1 -1,1 l -4.85,0 3.17,3 1.68,0 c 2.21,0 4,-1.8 4,-4 l 0,-2.7 c 1.15,-0.5 2,-1.6 2,-3 0,-1.9 -1.56,-3.5 -3.5,-3.5 z m 0,1 c 1.38,0 2.5,1.2 2.5,2.5 0,1.1 -0.7,2 -1.66,2.3 l -0.34,0.1 0,3.3 c 0,1.6 -1.35,3 -3,3 l -1.81,0 -2.04,-1 3.85,0 c 1.11,0 2,-0.9 2,-2 l 0,-3.3 -0.34,-0.1 c -0.96,-0.3 -1.66,-1.2 -1.66,-2.3 0,-1.3 1.13,-2.5 2.5,-2.5 z"
|
||||||
|
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
id="path4301"
|
||||||
|
d="m -69.84,116.3 c -2.19,0 -4,1.7 -4,4 l 0,2.6 c -1.14,0.6 -1.99,1.6 -1.99,3 0,2 1.6,3.5 3.51,3.5 1.91,0 3.5,-1.5 3.5,-3.5 0,-1.4 -0.85,-2.5 -2,-3 l 0,-2.6 c 0,-0.5 0.45,-1 1,-1 l 5.01,0 -3.36,-3 z m 0,1 1.84,0 2.19,1 -4.01,0 c -1.11,0 -2,0.9 -2,2 l 0,3.2 0.34,0.1 c 0.96,0.3 1.66,1.2 1.66,2.3 0,1.4 -1.11,2.5 -2.5,2.5 -1.39,0 -2.51,-1.1 -2.51,-2.5 0,-1.1 0.7,-2 1.66,-2.3 l 0.33,-0.1 0,-0.4 0,-2.8 c 0,-1.7 1.33,-3 3,-3 z"
|
||||||
|
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
id="path4165"
|
||||||
|
d="m 12,8.77 c -0.84,0 -1.66,0.341 -2.254,0.937 -0.599,0.593 -0.942,1.403 -0.945,2.253 0,0.85 0.337,1.67 0.933,2.26 a 0.6001,0.6001 0 0 0 0,0 c 0.594,0.6 1.424,0.94 2.264,0.94 0.84,0 1.67,-0.34 2.26,-0.94 0.6,-0.59 0.94,-1.41 0.94,-2.26 0,-0.84 -0.34,-1.66 -0.95,-2.253 C 13.66,9.111 12.84,8.77 12,8.77 Z"
|
||||||
|
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||||
|
</g>
|
||||||
|
<path d="M 3,3 l 18,18" style="stroke-width: 3; stroke: #000000; stroke-linecap: round;" />
|
||||||
|
<path d="M 21,3 l -18,18" style="stroke-width: 3; stroke: #000000; stroke-linecap: round;" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 7.5 KiB |
|
@ -458,6 +458,9 @@ void RPCConsole::setClientModel(ClientModel *model)
|
||||||
setNumBlocks(model->getNumBlocks(), model->getLastBlockDate(), model->getVerificationProgress(NULL), false);
|
setNumBlocks(model->getNumBlocks(), model->getLastBlockDate(), model->getVerificationProgress(NULL), 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();
|
||||||
|
connect(model, SIGNAL(networkActiveChanged(bool)), this, SLOT(setNetworkActive(bool)));
|
||||||
|
|
||||||
updateTrafficStats(model->getTotalBytesRecv(), model->getTotalBytesSent());
|
updateTrafficStats(model->getTotalBytesRecv(), model->getTotalBytesSent());
|
||||||
connect(model, SIGNAL(bytesChanged(quint64,quint64)), this, SLOT(updateTrafficStats(quint64, quint64)));
|
connect(model, SIGNAL(bytesChanged(quint64,quint64)), this, SLOT(updateTrafficStats(quint64, quint64)));
|
||||||
|
|
||||||
|
@ -674,16 +677,30 @@ void RPCConsole::message(int category, const QString &message, bool html)
|
||||||
ui->messagesWidget->append(out);
|
ui->messagesWidget->append(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RPCConsole::updateNetworkState()
|
||||||
|
{
|
||||||
|
QString connections = QString::number(clientModel->getNumConnections()) + " (";
|
||||||
|
connections += tr("In:") + " " + QString::number(clientModel->getNumConnections(CONNECTIONS_IN)) + " / ";
|
||||||
|
connections += tr("Out:") + " " + QString::number(clientModel->getNumConnections(CONNECTIONS_OUT)) + ")";
|
||||||
|
|
||||||
|
if(!clientModel->getNetworkActive()) {
|
||||||
|
connections += " (" + tr("Network activity disabled") + ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
ui->numberOfConnections->setText(connections);
|
||||||
|
}
|
||||||
|
|
||||||
void RPCConsole::setNumConnections(int count)
|
void RPCConsole::setNumConnections(int count)
|
||||||
{
|
{
|
||||||
if (!clientModel)
|
if (!clientModel)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QString connections = QString::number(count) + " (";
|
updateNetworkState();
|
||||||
connections += tr("In:") + " " + QString::number(clientModel->getNumConnections(CONNECTIONS_IN)) + " / ";
|
}
|
||||||
connections += tr("Out:") + " " + QString::number(clientModel->getNumConnections(CONNECTIONS_OUT)) + ")";
|
|
||||||
|
|
||||||
ui->numberOfConnections->setText(connections);
|
void RPCConsole::setNetworkActive(bool networkActive)
|
||||||
|
{
|
||||||
|
updateNetworkState();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RPCConsole::setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, bool headers)
|
void RPCConsole::setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, bool headers)
|
||||||
|
@ -1069,3 +1086,8 @@ void RPCConsole::setTabFocus(enum TabTypes tabType)
|
||||||
{
|
{
|
||||||
ui->tabWidget->setCurrentIndex(tabType);
|
ui->tabWidget->setCurrentIndex(tabType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RPCConsole::on_toggleNetworkActiveButton_clicked()
|
||||||
|
{
|
||||||
|
clientModel->setNetworkActive(!clientModel->getNetworkActive());
|
||||||
|
}
|
||||||
|
|
|
@ -61,6 +61,8 @@ protected:
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void on_lineEdit_returnPressed();
|
void on_lineEdit_returnPressed();
|
||||||
void on_tabWidget_currentChanged(int index);
|
void on_tabWidget_currentChanged(int index);
|
||||||
|
/** toggle network activity */
|
||||||
|
void on_toggleNetworkActiveButton_clicked();
|
||||||
/** open the debug.log from the current datadir */
|
/** open the debug.log from the current datadir */
|
||||||
void on_openDebugLogfileButton_clicked();
|
void on_openDebugLogfileButton_clicked();
|
||||||
/** change the time range of the network traffic graph */
|
/** change the time range of the network traffic graph */
|
||||||
|
@ -88,6 +90,8 @@ public Q_SLOTS:
|
||||||
void message(int category, const QString &message, bool html = false);
|
void message(int category, const QString &message, bool html = false);
|
||||||
/** Set number of connections shown in the UI */
|
/** Set number of connections shown in the UI */
|
||||||
void setNumConnections(int count);
|
void setNumConnections(int count);
|
||||||
|
/** Set network state shown in the UI */
|
||||||
|
void setNetworkActive(bool networkActive);
|
||||||
/** Set number of blocks and last block date shown in the UI */
|
/** Set number of blocks and last block date shown in the UI */
|
||||||
void setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, bool headers);
|
void setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, bool headers);
|
||||||
/** Set size (number of transactions and memory usage) of the mempool in the UI */
|
/** Set size (number of transactions and memory usage) of the mempool in the UI */
|
||||||
|
@ -144,6 +148,9 @@ private:
|
||||||
QMenu *banTableContextMenu;
|
QMenu *banTableContextMenu;
|
||||||
int consoleFontSize;
|
int consoleFontSize;
|
||||||
QCompleter *autoCompleter;
|
QCompleter *autoCompleter;
|
||||||
|
|
||||||
|
/** Update UI with latest network info from model. */
|
||||||
|
void updateNetworkState();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // BITCOIN_QT_RPCCONSOLE_H
|
#endif // BITCOIN_QT_RPCCONSOLE_H
|
||||||
|
|
|
@ -109,6 +109,7 @@ static const CRPCConvertParam vRPCConvertParams[] =
|
||||||
{ "prioritisetransaction", 2 },
|
{ "prioritisetransaction", 2 },
|
||||||
{ "setban", 2 },
|
{ "setban", 2 },
|
||||||
{ "setban", 3 },
|
{ "setban", 3 },
|
||||||
|
{ "setnetworkactive", 0 },
|
||||||
{ "getmempoolancestors", 1 },
|
{ "getmempoolancestors", 1 },
|
||||||
{ "getmempooldescendants", 1 },
|
{ "getmempooldescendants", 1 },
|
||||||
};
|
};
|
||||||
|
|
|
@ -401,6 +401,7 @@ UniValue getnetworkinfo(const JSONRPCRequest& request)
|
||||||
" \"localrelay\": true|false, (bool) true if transaction relay is requested from peers\n"
|
" \"localrelay\": true|false, (bool) true if transaction relay is requested from peers\n"
|
||||||
" \"timeoffset\": xxxxx, (numeric) the time offset\n"
|
" \"timeoffset\": xxxxx, (numeric) the time offset\n"
|
||||||
" \"connections\": xxxxx, (numeric) the number of connections\n"
|
" \"connections\": xxxxx, (numeric) the number of connections\n"
|
||||||
|
" \"networkactive\": true|false, (bool) whether p2p networking is enabled\n"
|
||||||
" \"networks\": [ (array) information per network\n"
|
" \"networks\": [ (array) information per network\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"name\": \"xxx\", (string) network (ipv4, ipv6 or onion)\n"
|
" \"name\": \"xxx\", (string) network (ipv4, ipv6 or onion)\n"
|
||||||
|
@ -435,8 +436,10 @@ UniValue getnetworkinfo(const JSONRPCRequest& request)
|
||||||
obj.push_back(Pair("localservices", strprintf("%016x", g_connman->GetLocalServices())));
|
obj.push_back(Pair("localservices", strprintf("%016x", g_connman->GetLocalServices())));
|
||||||
obj.push_back(Pair("localrelay", fRelayTxes));
|
obj.push_back(Pair("localrelay", fRelayTxes));
|
||||||
obj.push_back(Pair("timeoffset", GetTimeOffset()));
|
obj.push_back(Pair("timeoffset", GetTimeOffset()));
|
||||||
if(g_connman)
|
if (g_connman) {
|
||||||
|
obj.push_back(Pair("networkactive", g_connman->GetNetworkActive()));
|
||||||
obj.push_back(Pair("connections", (int)g_connman->GetNodeCount(CConnman::CONNECTIONS_ALL)));
|
obj.push_back(Pair("connections", (int)g_connman->GetNodeCount(CConnman::CONNECTIONS_ALL)));
|
||||||
|
}
|
||||||
obj.push_back(Pair("networks", GetNetworksInfo()));
|
obj.push_back(Pair("networks", GetNetworksInfo()));
|
||||||
obj.push_back(Pair("relayfee", ValueFromAmount(::minRelayTxFee.GetFeePerK())));
|
obj.push_back(Pair("relayfee", ValueFromAmount(::minRelayTxFee.GetFeePerK())));
|
||||||
UniValue localAddresses(UniValue::VARR);
|
UniValue localAddresses(UniValue::VARR);
|
||||||
|
@ -571,6 +574,24 @@ UniValue clearbanned(const JSONRPCRequest& request)
|
||||||
return NullUniValue;
|
return NullUniValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UniValue setnetworkactive(const JSONRPCRequest& request)
|
||||||
|
{
|
||||||
|
if (request.fHelp || request.params.size() != 1) {
|
||||||
|
throw runtime_error(
|
||||||
|
"setnetworkactive true|false\n"
|
||||||
|
"Disable/enable all p2p network activity."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!g_connman) {
|
||||||
|
throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
|
||||||
|
}
|
||||||
|
|
||||||
|
g_connman->SetNetworkActive(request.params[0].get_bool());
|
||||||
|
|
||||||
|
return g_connman->GetNetworkActive();
|
||||||
|
}
|
||||||
|
|
||||||
static const CRPCCommand commands[] =
|
static const CRPCCommand commands[] =
|
||||||
{ // category name actor (function) okSafeMode
|
{ // category name actor (function) okSafeMode
|
||||||
// --------------------- ------------------------ ----------------------- ----------
|
// --------------------- ------------------------ ----------------------- ----------
|
||||||
|
@ -585,6 +606,7 @@ static const CRPCCommand commands[] =
|
||||||
{ "network", "setban", &setban, true },
|
{ "network", "setban", &setban, true },
|
||||||
{ "network", "listbanned", &listbanned, true },
|
{ "network", "listbanned", &listbanned, true },
|
||||||
{ "network", "clearbanned", &clearbanned, true },
|
{ "network", "clearbanned", &clearbanned, true },
|
||||||
|
{ "network", "setnetworkactive", &setnetworkactive, true, },
|
||||||
};
|
};
|
||||||
|
|
||||||
void RegisterNetRPCCommands(CRPCTable &t)
|
void RegisterNetRPCCommands(CRPCTable &t)
|
||||||
|
|
|
@ -84,6 +84,28 @@ BOOST_AUTO_TEST_CASE(rpc_rawparams)
|
||||||
BOOST_CHECK_THROW(CallRPC(string("sendrawtransaction ")+rawtx+" extra"), runtime_error);
|
BOOST_CHECK_THROW(CallRPC(string("sendrawtransaction ")+rawtx+" extra"), runtime_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(rpc_togglenetwork)
|
||||||
|
{
|
||||||
|
UniValue r;
|
||||||
|
|
||||||
|
r = CallRPC("getnetworkinfo");
|
||||||
|
bool netState = find_value(r.get_obj(), "networkactive").get_bool();
|
||||||
|
BOOST_CHECK_EQUAL(netState, true);
|
||||||
|
|
||||||
|
BOOST_CHECK_NO_THROW(CallRPC("setnetworkactive false"));
|
||||||
|
r = CallRPC("getnetworkinfo");
|
||||||
|
int numConnection = find_value(r.get_obj(), "connections").get_int();
|
||||||
|
BOOST_CHECK_EQUAL(numConnection, 0);
|
||||||
|
|
||||||
|
netState = find_value(r.get_obj(), "networkactive").get_bool();
|
||||||
|
BOOST_CHECK_EQUAL(netState, false);
|
||||||
|
|
||||||
|
BOOST_CHECK_NO_THROW(CallRPC("setnetworkactive true"));
|
||||||
|
r = CallRPC("getnetworkinfo");
|
||||||
|
netState = find_value(r.get_obj(), "networkactive").get_bool();
|
||||||
|
BOOST_CHECK_EQUAL(netState, true);
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(rpc_rawsign)
|
BOOST_AUTO_TEST_CASE(rpc_rawsign)
|
||||||
{
|
{
|
||||||
UniValue r;
|
UniValue r;
|
||||||
|
|
|
@ -85,6 +85,9 @@ public:
|
||||||
/** Number of network connections changed. */
|
/** Number of network connections changed. */
|
||||||
boost::signals2::signal<void (int newNumConnections)> NotifyNumConnectionsChanged;
|
boost::signals2::signal<void (int newNumConnections)> NotifyNumConnectionsChanged;
|
||||||
|
|
||||||
|
/** Network activity state changed. */
|
||||||
|
boost::signals2::signal<void (bool networkActive)> NotifyNetworkActiveChanged;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Status bar alerts changed.
|
* Status bar alerts changed.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Reference in a new issue