]> Git Repo - VerusCoin.git/blob - src/qt/clientmodel.cpp
Use the QueueShutdown signal to stop accepting new RPC connections
[VerusCoin.git] / src / qt / clientmodel.cpp
1 #include "clientmodel.h"
2 #include "guiconstants.h"
3 #include "optionsmodel.h"
4 #include "addresstablemodel.h"
5 #include "transactiontablemodel.h"
6
7 #include "main.h"
8 #include "ui_interface.h"
9
10 #include <QDateTime>
11 #include <QTimer>
12
13 static const int64 nClientStartupTime = GetTime();
14
15 ClientModel::ClientModel(OptionsModel *optionsModel, QObject *parent) :
16     QObject(parent), optionsModel(optionsModel),
17     cachedNumBlocks(0), cachedNumBlocksOfPeers(0), pollTimer(0)
18 {
19     numBlocksAtStartup = -1;
20
21     pollTimer = new QTimer();
22     pollTimer->setInterval(MODEL_UPDATE_DELAY);
23     pollTimer->start();
24     connect(pollTimer, SIGNAL(timeout()), this, SLOT(updateTimer()));
25
26     subscribeToCoreSignals();
27 }
28
29 ClientModel::~ClientModel()
30 {
31     unsubscribeFromCoreSignals();
32 }
33
34 int ClientModel::getNumConnections() const
35 {
36     return vNodes.size();
37 }
38
39 int ClientModel::getNumBlocks() const
40 {
41     return nBestHeight;
42 }
43
44 int ClientModel::getNumBlocksAtStartup()
45 {
46     if (numBlocksAtStartup == -1) numBlocksAtStartup = getNumBlocks();
47     return numBlocksAtStartup;
48 }
49
50 QDateTime ClientModel::getLastBlockDate() const
51 {
52     return QDateTime::fromTime_t(pindexBest->GetBlockTime());
53 }
54
55 void ClientModel::updateTimer()
56 {
57     // Some quantities (such as number of blocks) change so fast that we don't want to be notified for each change.
58     // Periodically check and update with a timer.
59     int newNumBlocks = getNumBlocks();
60     int newNumBlocksOfPeers = getNumBlocksOfPeers();
61
62     if(cachedNumBlocks != newNumBlocks || cachedNumBlocksOfPeers != newNumBlocksOfPeers)
63         emit numBlocksChanged(newNumBlocks, newNumBlocksOfPeers);
64
65     cachedNumBlocks = newNumBlocks;
66     cachedNumBlocksOfPeers = newNumBlocksOfPeers;
67 }
68
69 void ClientModel::updateNumConnections(int numConnections)
70 {
71     emit numConnectionsChanged(numConnections);
72 }
73
74 void ClientModel::updateAlert(const QString &hash, int status)
75 {
76     // Show error message notification for new alert
77     if(status == CT_NEW)
78     {
79         uint256 hash_256;
80         hash_256.SetHex(hash.toStdString());
81         CAlert alert = CAlert::getAlertByHash(hash_256);
82         if(!alert.IsNull())
83         {
84             emit error(tr("Network Alert"), QString::fromStdString(alert.strStatusBar), false);
85         }
86     }
87
88     // Emit a numBlocksChanged when the status message changes,
89     // so that the view recomputes and updates the status bar.
90     emit numBlocksChanged(getNumBlocks(), getNumBlocksOfPeers());
91 }
92
93 bool ClientModel::isTestNet() const
94 {
95     return fTestNet;
96 }
97
98 bool ClientModel::inInitialBlockDownload() const
99 {
100     return IsInitialBlockDownload();
101 }
102
103 int ClientModel::getNumBlocksOfPeers() const
104 {
105     return GetNumBlocksOfPeers();
106 }
107
108 QString ClientModel::getStatusBarWarnings() const
109 {
110     return QString::fromStdString(GetWarnings("statusbar"));
111 }
112
113 OptionsModel *ClientModel::getOptionsModel()
114 {
115     return optionsModel;
116 }
117
118 QString ClientModel::formatFullVersion() const
119 {
120     return QString::fromStdString(FormatFullVersion());
121 }
122
123 QString ClientModel::formatBuildDate() const
124 {
125     return QString::fromStdString(CLIENT_DATE);
126 }
127
128 QString ClientModel::clientName() const
129 {
130     return QString::fromStdString(CLIENT_NAME);
131 }
132
133 QDateTime ClientModel::formatClientStartupTime() const
134 {
135     return QDateTime::fromTime_t(nClientStartupTime);
136 }
137
138 // Handlers for core signals
139 static void NotifyBlocksChanged(ClientModel *clientmodel)
140 {
141     // This notification is too frequent. Don't trigger a signal.
142     // Don't remove it, though, as it might be useful later.
143 }
144
145 static void NotifyNumConnectionsChanged(ClientModel *clientmodel, int newNumConnections)
146 {
147     // Too noisy: OutputDebugStringF("NotifyNumConnectionsChanged %i\n", newNumConnections);
148     QMetaObject::invokeMethod(clientmodel, "updateNumConnections", Qt::QueuedConnection,
149                               Q_ARG(int, newNumConnections));
150 }
151
152 static void NotifyAlertChanged(ClientModel *clientmodel, const uint256 &hash, ChangeType status)
153 {
154     OutputDebugStringF("NotifyAlertChanged %s status=%i\n", hash.GetHex().c_str(), status);
155     QMetaObject::invokeMethod(clientmodel, "updateAlert", Qt::QueuedConnection,
156                               Q_ARG(QString, QString::fromStdString(hash.GetHex())),
157                               Q_ARG(int, status));
158 }
159
160 void ClientModel::subscribeToCoreSignals()
161 {
162     // Connect signals to client
163     uiInterface.NotifyBlocksChanged.connect(boost::bind(NotifyBlocksChanged, this));
164     uiInterface.NotifyNumConnectionsChanged.connect(boost::bind(NotifyNumConnectionsChanged, this, _1));
165     uiInterface.NotifyAlertChanged.connect(boost::bind(NotifyAlertChanged, this, _1, _2));
166 }
167
168 void ClientModel::unsubscribeFromCoreSignals()
169 {
170     // Disconnect signals from client
171     uiInterface.NotifyBlocksChanged.disconnect(boost::bind(NotifyBlocksChanged, this));
172     uiInterface.NotifyNumConnectionsChanged.disconnect(boost::bind(NotifyNumConnectionsChanged, this, _1));
173     uiInterface.NotifyAlertChanged.disconnect(boost::bind(NotifyAlertChanged, this, _1, _2));
174 }
This page took 0.03325 seconds and 4 git commands to generate.