Dash Core  0.12.2.1
P2P Digital Currency
optionsmodel.cpp
Go to the documentation of this file.
1 // Copyright (c) 2011-2015 The Bitcoin Core developers
2 // Copyright (c) 2014-2017 The Dash Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 
6 #if defined(HAVE_CONFIG_H)
7 #include "config/dash-config.h"
8 #endif
9 
10 #include "optionsmodel.h"
11 
12 #include "bitcoinunits.h"
13 #include "guiutil.h"
14 
15 #include "amount.h"
16 #include "init.h"
17 #include "validation.h" // For DEFAULT_SCRIPTCHECK_THREADS
18 #include "net.h"
19 #include "netbase.h"
20 #include "txdb.h" // for -dbcache defaults
21 
22 #ifdef ENABLE_WALLET
23 #include "wallet/wallet.h"
24 #include "wallet/walletdb.h"
25 #endif
26 
27 #ifdef ENABLE_WALLET
28 #include "masternodeconfig.h"
29 #endif
30 #include "privatesend-client.h"
31 
32 #include <QNetworkProxy>
33 #include <QSettings>
34 #include <QStringList>
35 
36 OptionsModel::OptionsModel(QObject *parent, bool resetSettings) :
37  QAbstractListModel(parent)
38 {
40 }
41 
42 void OptionsModel::addOverriddenOption(const std::string &option)
43 {
44  strOverriddenByCommandLine += QString::fromStdString(option) + "=" + QString::fromStdString(mapArgs[option]) + " ";
45 }
46 
47 // Writes all missing QSettings with their default values
48 void OptionsModel::Init(bool resetSettings)
49 {
50  if (resetSettings)
51  Reset();
52 
53  this->resetSettings = resetSettings;
54 
55  QSettings settings;
56 
57  // Ensure restart flag is unset on client startup
58  setRestartRequired(false);
59 
60  // These are Qt-only settings:
61 
62  // Window
63  if (!settings.contains("fHideTrayIcon"))
64  settings.setValue("fHideTrayIcon", false);
65  fHideTrayIcon = settings.value("fHideTrayIcon").toBool();
67 
68  if (!settings.contains("fMinimizeToTray"))
69  settings.setValue("fMinimizeToTray", false);
70  fMinimizeToTray = settings.value("fMinimizeToTray").toBool() && !fHideTrayIcon;
71 
72  if (!settings.contains("fMinimizeOnClose"))
73  settings.setValue("fMinimizeOnClose", false);
74  fMinimizeOnClose = settings.value("fMinimizeOnClose").toBool();
75 
76  // Display
77  if (!settings.contains("nDisplayUnit"))
78  settings.setValue("nDisplayUnit", BitcoinUnits::DASH);
79  nDisplayUnit = settings.value("nDisplayUnit").toInt();
80 
81  if (!settings.contains("strThirdPartyTxUrls"))
82  settings.setValue("strThirdPartyTxUrls", "");
83  strThirdPartyTxUrls = settings.value("strThirdPartyTxUrls", "").toString();
84 
85  if (!settings.contains("fCoinControlFeatures"))
86  settings.setValue("fCoinControlFeatures", false);
87  fCoinControlFeatures = settings.value("fCoinControlFeatures", false).toBool();
88 
89  if (!settings.contains("digits"))
90  settings.setValue("digits", "2");
91  if (!settings.contains("theme"))
92  settings.setValue("theme", "");
93 
94  if (!settings.contains("fShowMasternodesTab"))
95  settings.setValue("fShowMasternodesTab", masternodeConfig.getCount());
96 
97  if (!settings.contains("fShowAdvancedPSUI"))
98  settings.setValue("fShowAdvancedPSUI", false);
99  fShowAdvancedPSUI = settings.value("fShowAdvancedPSUI", false).toBool();
100 
101  if (!settings.contains("fLowKeysWarning"))
102  settings.setValue("fLowKeysWarning", true);
103 
104  // These are shared with the core or have a command-line parameter
105  // and we want command-line parameters to overwrite the GUI settings.
106  //
107  // If setting doesn't exist create it with defaults.
108  //
109  // If SoftSetArg() or SoftSetBoolArg() return false we were overridden
110  // by command-line and show this in the UI.
111 
112  // Main
113  if (!settings.contains("nDatabaseCache"))
114  settings.setValue("nDatabaseCache", (qint64)nDefaultDbCache);
115  if (!SoftSetArg("-dbcache", settings.value("nDatabaseCache").toString().toStdString()))
116  addOverriddenOption("-dbcache");
117 
118  if (!settings.contains("nThreadsScriptVerif"))
119  settings.setValue("nThreadsScriptVerif", DEFAULT_SCRIPTCHECK_THREADS);
120  if (!SoftSetArg("-par", settings.value("nThreadsScriptVerif").toString().toStdString()))
121  addOverriddenOption("-par");
122 
123  // Wallet
124 #ifdef ENABLE_WALLET
125  if (!settings.contains("bSpendZeroConfChange"))
126  settings.setValue("bSpendZeroConfChange", true);
127  if (!SoftSetBoolArg("-spendzeroconfchange", settings.value("bSpendZeroConfChange").toBool()))
128  addOverriddenOption("-spendzeroconfchange");
129 
130  // PrivateSend
131  if (!settings.contains("nPrivateSendRounds"))
132  settings.setValue("nPrivateSendRounds", DEFAULT_PRIVATESEND_ROUNDS);
133  if (!SoftSetArg("-privatesendrounds", settings.value("nPrivateSendRounds").toString().toStdString()))
134  addOverriddenOption("-privatesendrounds");
135  privateSendClient.nPrivateSendRounds = settings.value("nPrivateSendRounds").toInt();
136 
137  if (!settings.contains("nPrivateSendAmount")) {
138  // for migration from old settings
139  if (!settings.contains("nAnonymizeDashAmount"))
140  settings.setValue("nPrivateSendAmount", DEFAULT_PRIVATESEND_AMOUNT);
141  else
142  settings.setValue("nPrivateSendAmount", settings.value("nAnonymizeDashAmount").toInt());
143  }
144  if (!SoftSetArg("-privatesendamount", settings.value("nPrivateSendAmount").toString().toStdString()))
145  addOverriddenOption("-privatesendamount");
146  privateSendClient.nPrivateSendAmount = settings.value("nPrivateSendAmount").toInt();
147 
148  if (!settings.contains("fPrivateSendMultiSession"))
149  settings.setValue("fPrivateSendMultiSession", DEFAULT_PRIVATESEND_MULTISESSION);
150  if (!SoftSetBoolArg("-privatesendmultisession", settings.value("fPrivateSendMultiSession").toBool()))
151  addOverriddenOption("-privatesendmultisession");
152  privateSendClient.fPrivateSendMultiSession = settings.value("fPrivateSendMultiSession").toBool();
153 #endif
154 
155  // Network
156  if (!settings.contains("fUseUPnP"))
157  settings.setValue("fUseUPnP", DEFAULT_UPNP);
158  if (!SoftSetBoolArg("-upnp", settings.value("fUseUPnP").toBool()))
159  addOverriddenOption("-upnp");
160 
161  if (!settings.contains("fListen"))
162  settings.setValue("fListen", DEFAULT_LISTEN);
163  if (!SoftSetBoolArg("-listen", settings.value("fListen").toBool()))
164  addOverriddenOption("-listen");
165 
166  if (!settings.contains("fUseProxy"))
167  settings.setValue("fUseProxy", false);
168  if (!settings.contains("addrProxy"))
169  settings.setValue("addrProxy", "127.0.0.1:9050");
170  // Only try to set -proxy, if user has enabled fUseProxy
171  if (settings.value("fUseProxy").toBool() && !SoftSetArg("-proxy", settings.value("addrProxy").toString().toStdString()))
172  addOverriddenOption("-proxy");
173  else if(!settings.value("fUseProxy").toBool() && !GetArg("-proxy", "").empty())
174  addOverriddenOption("-proxy");
175 
176  if (!settings.contains("fUseSeparateProxyTor"))
177  settings.setValue("fUseSeparateProxyTor", false);
178  if (!settings.contains("addrSeparateProxyTor"))
179  settings.setValue("addrSeparateProxyTor", "127.0.0.1:9050");
180  // Only try to set -onion, if user has enabled fUseSeparateProxyTor
181  if (settings.value("fUseSeparateProxyTor").toBool() && !SoftSetArg("-onion", settings.value("addrSeparateProxyTor").toString().toStdString()))
182  addOverriddenOption("-onion");
183  else if(!settings.value("fUseSeparateProxyTor").toBool() && !GetArg("-onion", "").empty())
184  addOverriddenOption("-onion");
185 
186  // Display
187  if (!settings.contains("language"))
188  settings.setValue("language", "");
189  if (!SoftSetArg("-lang", settings.value("language").toString().toStdString()))
190  addOverriddenOption("-lang");
191 
192  language = settings.value("language").toString();
193 }
194 
196 {
197  QSettings settings;
198 
199  // Remove all entries from our QSettings object
200  settings.clear();
201  resetSettings = true; // Needed in dash.cpp during shotdown to also remove the window positions
202 
203  // default setting for OptionsModel::StartAtStartup - disabled
206 }
207 
208 int OptionsModel::rowCount(const QModelIndex & parent) const
209 {
210  return OptionIDRowCount;
211 }
212 
213 // read QSettings values and return them
214 QVariant OptionsModel::data(const QModelIndex & index, int role) const
215 {
216  if(role == Qt::EditRole)
217  {
218  QSettings settings;
219  switch(index.row())
220  {
221  case StartAtStartup:
223  case HideTrayIcon:
224  return fHideTrayIcon;
225  case MinimizeToTray:
226  return fMinimizeToTray;
227  case MapPortUPnP:
228 #ifdef USE_UPNP
229  return settings.value("fUseUPnP");
230 #else
231  return false;
232 #endif
233  case MinimizeOnClose:
234  return fMinimizeOnClose;
235 
236  // default proxy
237  case ProxyUse:
238  return settings.value("fUseProxy", false);
239  case ProxyIP: {
240  // contains IP at index 0 and port at index 1
241  QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts);
242  return strlIpPort.at(0);
243  }
244  case ProxyPort: {
245  // contains IP at index 0 and port at index 1
246  QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts);
247  return strlIpPort.at(1);
248  }
249 
250  // separate Tor proxy
251  case ProxyUseTor:
252  return settings.value("fUseSeparateProxyTor", false);
253  case ProxyIPTor: {
254  // contains IP at index 0 and port at index 1
255  QStringList strlIpPort = settings.value("addrSeparateProxyTor").toString().split(":", QString::SkipEmptyParts);
256  return strlIpPort.at(0);
257  }
258  case ProxyPortTor: {
259  // contains IP at index 0 and port at index 1
260  QStringList strlIpPort = settings.value("addrSeparateProxyTor").toString().split(":", QString::SkipEmptyParts);
261  return strlIpPort.at(1);
262  }
263 
264 #ifdef ENABLE_WALLET
265  case SpendZeroConfChange:
266  return settings.value("bSpendZeroConfChange");
267  case ShowMasternodesTab:
268  return settings.value("fShowMasternodesTab");
269  case ShowAdvancedPSUI:
270  return fShowAdvancedPSUI;
271  case LowKeysWarning:
272  return settings.value("fLowKeysWarning");
273  case PrivateSendRounds:
274  return settings.value("nPrivateSendRounds");
275  case PrivateSendAmount:
276  return settings.value("nPrivateSendAmount");
278  return settings.value("fPrivateSendMultiSession");
279 #endif
280  case DisplayUnit:
281  return nDisplayUnit;
282  case ThirdPartyTxUrls:
283  return strThirdPartyTxUrls;
284  case Digits:
285  return settings.value("digits");
286  case Theme:
287  return settings.value("theme");
288  case Language:
289  return settings.value("language");
290  case CoinControlFeatures:
291  return fCoinControlFeatures;
292  case DatabaseCache:
293  return settings.value("nDatabaseCache");
294  case ThreadsScriptVerif:
295  return settings.value("nThreadsScriptVerif");
296  case Listen:
297  return settings.value("fListen");
298  default:
299  return QVariant();
300  }
301  }
302  return QVariant();
303 }
304 
305 // write QSettings values
306 bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, int role)
307 {
308  bool successful = true; /* set to false on parse error */
309  if(role == Qt::EditRole)
310  {
311  QSettings settings;
312  switch(index.row())
313  {
314  case StartAtStartup:
315  successful = GUIUtil::SetStartOnSystemStartup(value.toBool());
316  break;
317  case HideTrayIcon:
318  fHideTrayIcon = value.toBool();
319  settings.setValue("fHideTrayIcon", fHideTrayIcon);
321  break;
322  case MinimizeToTray:
323  fMinimizeToTray = value.toBool();
324  settings.setValue("fMinimizeToTray", fMinimizeToTray);
325  break;
326  case MapPortUPnP: // core option - can be changed on-the-fly
327  settings.setValue("fUseUPnP", value.toBool());
328  MapPort(value.toBool());
329  break;
330  case MinimizeOnClose:
331  fMinimizeOnClose = value.toBool();
332  settings.setValue("fMinimizeOnClose", fMinimizeOnClose);
333  break;
334 
335  // default proxy
336  case ProxyUse:
337  if (settings.value("fUseProxy") != value) {
338  settings.setValue("fUseProxy", value.toBool());
339  setRestartRequired(true);
340  }
341  break;
342  case ProxyIP: {
343  // contains current IP at index 0 and current port at index 1
344  QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts);
345  // if that key doesn't exist or has a changed IP
346  if (!settings.contains("addrProxy") || strlIpPort.at(0) != value.toString()) {
347  // construct new value from new IP and current port
348  QString strNewValue = value.toString() + ":" + strlIpPort.at(1);
349  settings.setValue("addrProxy", strNewValue);
350  setRestartRequired(true);
351  }
352  }
353  break;
354  case ProxyPort: {
355  // contains current IP at index 0 and current port at index 1
356  QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts);
357  // if that key doesn't exist or has a changed port
358  if (!settings.contains("addrProxy") || strlIpPort.at(1) != value.toString()) {
359  // construct new value from current IP and new port
360  QString strNewValue = strlIpPort.at(0) + ":" + value.toString();
361  settings.setValue("addrProxy", strNewValue);
362  setRestartRequired(true);
363  }
364  }
365  break;
366 
367  // separate Tor proxy
368  case ProxyUseTor:
369  if (settings.value("fUseSeparateProxyTor") != value) {
370  settings.setValue("fUseSeparateProxyTor", value.toBool());
371  setRestartRequired(true);
372  }
373  break;
374  case ProxyIPTor: {
375  // contains current IP at index 0 and current port at index 1
376  QStringList strlIpPort = settings.value("addrSeparateProxyTor").toString().split(":", QString::SkipEmptyParts);
377  // if that key doesn't exist or has a changed IP
378  if (!settings.contains("addrSeparateProxyTor") || strlIpPort.at(0) != value.toString()) {
379  // construct new value from new IP and current port
380  QString strNewValue = value.toString() + ":" + strlIpPort.at(1);
381  settings.setValue("addrSeparateProxyTor", strNewValue);
382  setRestartRequired(true);
383  }
384  }
385  break;
386  case ProxyPortTor: {
387  // contains current IP at index 0 and current port at index 1
388  QStringList strlIpPort = settings.value("addrSeparateProxyTor").toString().split(":", QString::SkipEmptyParts);
389  // if that key doesn't exist or has a changed port
390  if (!settings.contains("addrSeparateProxyTor") || strlIpPort.at(1) != value.toString()) {
391  // construct new value from current IP and new port
392  QString strNewValue = strlIpPort.at(0) + ":" + value.toString();
393  settings.setValue("addrSeparateProxyTor", strNewValue);
394  setRestartRequired(true);
395  }
396  }
397  break;
398 
399 #ifdef ENABLE_WALLET
400  case SpendZeroConfChange:
401  if (settings.value("bSpendZeroConfChange") != value) {
402  settings.setValue("bSpendZeroConfChange", value);
403  setRestartRequired(true);
404  }
405  break;
406  case ShowMasternodesTab:
407  if (settings.value("fShowMasternodesTab") != value) {
408  settings.setValue("fShowMasternodesTab", value);
409  setRestartRequired(true);
410  }
411  break;
412  case ShowAdvancedPSUI:
413  fShowAdvancedPSUI = value.toBool();
414  settings.setValue("fShowAdvancedPSUI", fShowAdvancedPSUI);
416  break;
417  case LowKeysWarning:
418  settings.setValue("fLowKeysWarning", value);
419  break;
420  case PrivateSendRounds:
421  if (settings.value("nPrivateSendRounds") != value)
422  {
423  privateSendClient.nPrivateSendRounds = value.toInt();
424  settings.setValue("nPrivateSendRounds", privateSendClient.nPrivateSendRounds);
425  Q_EMIT privateSendRoundsChanged();
426  }
427  break;
428  case PrivateSendAmount:
429  if (settings.value("nPrivateSendAmount") != value)
430  {
431  privateSendClient.nPrivateSendAmount = value.toInt();
432  settings.setValue("nPrivateSendAmount", privateSendClient.nPrivateSendAmount);
433  Q_EMIT privateSentAmountChanged();
434  }
435  break;
437  if (settings.value("fPrivateSendMultiSession") != value)
438  {
440  settings.setValue("fPrivateSendMultiSession", privateSendClient.fPrivateSendMultiSession);
441  }
442  break;
443 #endif
444  case DisplayUnit:
445  setDisplayUnit(value);
446  break;
447  case ThirdPartyTxUrls:
448  if (strThirdPartyTxUrls != value.toString()) {
449  strThirdPartyTxUrls = value.toString();
450  settings.setValue("strThirdPartyTxUrls", strThirdPartyTxUrls);
451  setRestartRequired(true);
452  }
453  break;
454  case Digits:
455  if (settings.value("digits") != value) {
456  settings.setValue("digits", value);
457  setRestartRequired(true);
458  }
459  break;
460  case Theme:
461  if (settings.value("theme") != value) {
462  settings.setValue("theme", value);
463  setRestartRequired(true);
464  }
465  break;
466  case Language:
467  if (settings.value("language") != value) {
468  settings.setValue("language", value);
469  setRestartRequired(true);
470  }
471  break;
472  case CoinControlFeatures:
473  fCoinControlFeatures = value.toBool();
474  settings.setValue("fCoinControlFeatures", fCoinControlFeatures);
476  break;
477  case DatabaseCache:
478  if (settings.value("nDatabaseCache") != value) {
479  settings.setValue("nDatabaseCache", value);
480  setRestartRequired(true);
481  }
482  break;
483  case ThreadsScriptVerif:
484  if (settings.value("nThreadsScriptVerif") != value) {
485  settings.setValue("nThreadsScriptVerif", value);
486  setRestartRequired(true);
487  }
488  break;
489  case Listen:
490  if (settings.value("fListen") != value) {
491  settings.setValue("fListen", value);
492  setRestartRequired(true);
493  }
494  break;
495  default:
496  break;
497  }
498  }
499 
500  Q_EMIT dataChanged(index, index);
501 
502  return successful;
503 }
504 
506 void OptionsModel::setDisplayUnit(const QVariant &value)
507 {
508  if (!value.isNull())
509  {
510  QSettings settings;
511  nDisplayUnit = value.toInt();
512  settings.setValue("nDisplayUnit", nDisplayUnit);
514  }
515 }
516 
517 bool OptionsModel::getProxySettings(QNetworkProxy& proxy) const
518 {
519  // Directly query current base proxy, because
520  // GUI settings can be overridden with -proxy.
521  proxyType curProxy;
522  if (GetProxy(NET_IPV4, curProxy)) {
523  proxy.setType(QNetworkProxy::Socks5Proxy);
524  proxy.setHostName(QString::fromStdString(curProxy.proxy.ToStringIP()));
525  proxy.setPort(curProxy.proxy.GetPort());
526 
527  return true;
528  }
529  else
530  proxy.setType(QNetworkProxy::NoProxy);
531 
532  return false;
533 }
534 
536 {
537  QSettings settings;
538  return settings.setValue("fRestartRequired", fRequired);
539 }
540 
542 {
543  QSettings settings;
544  return settings.value("fRestartRequired", false).toBool();
545 }
static const int DEFAULT_SCRIPTCHECK_THREADS
Definition: validation.h:85
bool fMinimizeToTray
Definition: optionsmodel.h:88
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
CMasternodeConfig masternodeConfig
bool resetSettings
Definition: optionsmodel.h:83
bool isRestartRequired()
OptionsModel(QObject *parent=0, bool resetSettings=false)
QString language
Definition: optionsmodel.h:90
bool SoftSetBoolArg(const std::string &strArg, bool fValue)
Definition: util.cpp:470
std::string ToStringIP(bool fUseGetnameinfo=true) const
Definition: netaddress.cpp:241
static const int DEFAULT_PRIVATESEND_AMOUNT
void addOverriddenOption(const std::string &option)
Add option to list of GUI options overridden through command line/config file.
void setRestartRequired(bool fRequired)
static const bool DEFAULT_LISTEN
Definition: net.h:67
bool fMinimizeOnClose
Definition: optionsmodel.h:89
bool fCoinControlFeatures
Definition: optionsmodel.h:93
QString strThirdPartyTxUrls
Definition: optionsmodel.h:92
dictionary settings
void MapPort(bool)
Definition: net.cpp:1511
CService proxy
Definition: netbase.h:36
void displayUnitChanged(int unit)
unsigned short GetPort() const
Definition: netaddress.cpp:495
int rowCount(const QModelIndex &parent=QModelIndex()) const
void coinControlFeaturesChanged(bool)
static const int DEFAULT_PRIVATESEND_ROUNDS
bool SoftSetArg(const std::string &strArg, const std::string &strValue)
Definition: util.cpp:462
void setDisplayUnit(const QVariant &value)
bool getProxySettings(QNetworkProxy &proxy) const
QString strOverriddenByCommandLine
Definition: optionsmodel.h:96
static const int64_t nDefaultDbCache
-dbcache default (MiB)
Definition: txdb.h:32
bool fShowAdvancedPSUI
Definition: optionsmodel.h:94
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole)
bool GetStartOnSystemStartup()
Definition: guiutil.cpp:858
bool fHideTrayIcon
Definition: optionsmodel.h:87
bool SetStartOnSystemStartup(bool fAutoStart)
Definition: guiutil.cpp:859
CPrivateSendClient privateSendClient
void privateSendRoundsChanged()
void advancedPSUIChanged(bool)
static const bool DEFAULT_UPNP
Definition: net.h:72
bool GetProxy(enum Network net, proxyType &proxyInfoOut)
Definition: netbase.cpp:536
std::string GetArg(const std::string &strArg, const std::string &strDefault)
Definition: util.cpp:441
void Init(bool resetSettings=false)
void hideTrayIconChanged(bool)
void privateSentAmountChanged()
static const bool DEFAULT_PRIVATESEND_MULTISESSION
map< string, string > mapArgs
Definition: util.cpp:122