Dogecoin Core  1.14.2
P2P Digital Currency
optionsmodel.cpp
Go to the documentation of this file.
1 // Copyright (c) 2011-2016 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #if defined(HAVE_CONFIG_H)
6 #include "config/bitcoin-config.h"
7 #endif
8 
9 #include "optionsmodel.h"
10 
11 #include "bitcoinunits.h"
12 #include "guiutil.h"
13 
14 #include "amount.h"
15 #include "init.h"
16 #include "validation.h" // For DEFAULT_SCRIPTCHECK_THREADS
17 #include "net.h"
18 #include "netbase.h"
19 #include "txdb.h" // for -dbcache defaults
20 #include "intro.h"
21 
22 #ifdef ENABLE_WALLET
23 #include "wallet/wallet.h"
24 #include "wallet/walletdb.h"
25 #endif
26 
27 #include <QNetworkProxy>
28 #include <QSettings>
29 #include <QStringList>
30 
31 OptionsModel::OptionsModel(QObject *parent, bool resetSettings) :
32  QAbstractListModel(parent)
33 {
34  Init(resetSettings);
35 }
36 
37 void OptionsModel::addOverriddenOption(const std::string &option)
38 {
39  strOverriddenByCommandLine += QString::fromStdString(option) + "=" + QString::fromStdString(GetArg(option, "")) + " ";
40 }
41 
42 // Writes all missing QSettings with their default values
43 void OptionsModel::Init(bool resetSettings)
44 {
45  if (resetSettings)
46  Reset();
47 
49 
50  QSettings settings;
51 
52  // Ensure restart flag is unset on client startup
53  setRestartRequired(false);
54 
55  // These are Qt-only settings:
56 
57  // Window
58  if (!settings.contains("fHideTrayIcon"))
59  settings.setValue("fHideTrayIcon", false);
60  fHideTrayIcon = settings.value("fHideTrayIcon").toBool();
62 
63  if (!settings.contains("fMinimizeToTray"))
64  settings.setValue("fMinimizeToTray", false);
65  fMinimizeToTray = settings.value("fMinimizeToTray").toBool() && !fHideTrayIcon;
66 
67  if (!settings.contains("fMinimizeOnClose"))
68  settings.setValue("fMinimizeOnClose", false);
69  fMinimizeOnClose = settings.value("fMinimizeOnClose").toBool();
70 
71  // Display
72  if (!settings.contains("nDisplayUnit"))
73  settings.setValue("nDisplayUnit", BitcoinUnits::BTC);
74  nDisplayUnit = settings.value("nDisplayUnit").toInt();
75 
76  if (!settings.contains("strThirdPartyTxUrls"))
77  settings.setValue("strThirdPartyTxUrls", "https://dogechain.info/tx/%s|https://chain.so/tx/DOGE/%s");
78  strThirdPartyTxUrls = settings.value("strThirdPartyTxUrls", "").toString();
79 
80  if (!settings.contains("fCoinControlFeatures"))
81  settings.setValue("fCoinControlFeatures", false);
82  fCoinControlFeatures = settings.value("fCoinControlFeatures", false).toBool();
83 
84  // These are shared with the core or have a command-line parameter
85  // and we want command-line parameters to overwrite the GUI settings.
86  //
87  // If setting doesn't exist create it with defaults.
88  //
89  // If SoftSetArg() or SoftSetBoolArg() return false we were overridden
90  // by command-line and show this in the UI.
91 
92  // Main
93  if (!settings.contains("nDatabaseCache"))
94  settings.setValue("nDatabaseCache", (qint64)nDefaultDbCache);
95  if (!SoftSetArg("-dbcache", settings.value("nDatabaseCache").toString().toStdString()))
96  addOverriddenOption("-dbcache");
97 
98  if (!settings.contains("nThreadsScriptVerif"))
99  settings.setValue("nThreadsScriptVerif", DEFAULT_SCRIPTCHECK_THREADS);
100  if (!SoftSetArg("-par", settings.value("nThreadsScriptVerif").toString().toStdString()))
101  addOverriddenOption("-par");
102 
103  if (!settings.contains("strDataDir"))
104  settings.setValue("strDataDir", Intro::getDefaultDataDirectory());
105 
106  // Wallet
107 #ifdef ENABLE_WALLET
108  if (!settings.contains("bSpendZeroConfChange"))
109  settings.setValue("bSpendZeroConfChange", true);
110  if (!SoftSetBoolArg("-spendzeroconfchange", settings.value("bSpendZeroConfChange").toBool()))
111  addOverriddenOption("-spendzeroconfchange");
112 #endif
113 
114  // Network
115  if (!settings.contains("fUseUPnP"))
116  settings.setValue("fUseUPnP", DEFAULT_UPNP);
117  if (!SoftSetBoolArg("-upnp", settings.value("fUseUPnP").toBool()))
118  addOverriddenOption("-upnp");
119 
120  if (!settings.contains("fListen"))
121  settings.setValue("fListen", DEFAULT_LISTEN);
122  if (!SoftSetBoolArg("-listen", settings.value("fListen").toBool()))
123  addOverriddenOption("-listen");
124 
125  if (!settings.contains("fUseProxy"))
126  settings.setValue("fUseProxy", false);
127  if (!settings.contains("addrProxy"))
128  settings.setValue("addrProxy", "127.0.0.1:9050");
129  // Only try to set -proxy, if user has enabled fUseProxy
130  if (settings.value("fUseProxy").toBool() && !SoftSetArg("-proxy", settings.value("addrProxy").toString().toStdString()))
131  addOverriddenOption("-proxy");
132  else if(!settings.value("fUseProxy").toBool() && !GetArg("-proxy", "").empty())
133  addOverriddenOption("-proxy");
134 
135  if (!settings.contains("fUseSeparateProxyTor"))
136  settings.setValue("fUseSeparateProxyTor", false);
137  if (!settings.contains("addrSeparateProxyTor"))
138  settings.setValue("addrSeparateProxyTor", "127.0.0.1:9050");
139  // Only try to set -onion, if user has enabled fUseSeparateProxyTor
140  if (settings.value("fUseSeparateProxyTor").toBool() && !SoftSetArg("-onion", settings.value("addrSeparateProxyTor").toString().toStdString()))
141  addOverriddenOption("-onion");
142  else if(!settings.value("fUseSeparateProxyTor").toBool() && !GetArg("-onion", "").empty())
143  addOverriddenOption("-onion");
144 
145  // Display
146  if (!settings.contains("language"))
147  settings.setValue("language", "");
148  if (!SoftSetArg("-lang", settings.value("language").toString().toStdString()))
149  addOverriddenOption("-lang");
150 
151  language = settings.value("language").toString();
152 }
153 
155 {
156  QSettings settings;
157 
158  // Save the strDataDir setting
159  QString dataDir = Intro::getDefaultDataDirectory();
160  dataDir = settings.value("strDataDir", dataDir).toString();
161 
162  // Remove all entries from our QSettings object
163  settings.clear();
164 
165  // Set strDataDir
166  settings.setValue("strDataDir", dataDir);
167 
168  // Set that this was reset
169  settings.setValue("fReset", true);
170 
171  // default setting for OptionsModel::StartAtStartup - disabled
174 }
175 
176 int OptionsModel::rowCount(const QModelIndex & parent) const
177 {
178  return OptionIDRowCount;
179 }
180 
181 // read QSettings values and return them
182 QVariant OptionsModel::data(const QModelIndex & index, int role) const
183 {
184  if(role == Qt::EditRole)
185  {
186  QSettings settings;
187  switch(index.row())
188  {
189  case StartAtStartup:
191  case HideTrayIcon:
192  return fHideTrayIcon;
193  case MinimizeToTray:
194  return fMinimizeToTray;
195  case MapPortUPnP:
196 #ifdef USE_UPNP
197  return settings.value("fUseUPnP");
198 #else
199  return false;
200 #endif
201  case MinimizeOnClose:
202  return fMinimizeOnClose;
203 
204  // default proxy
205  case ProxyUse:
206  return settings.value("fUseProxy", false);
207  case ProxyIP: {
208  // contains IP at index 0 and port at index 1
209  QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts);
210  return strlIpPort.at(0);
211  }
212  case ProxyPort: {
213  // contains IP at index 0 and port at index 1
214  QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts);
215  return strlIpPort.at(1);
216  }
217 
218  // separate Tor proxy
219  case ProxyUseTor:
220  return settings.value("fUseSeparateProxyTor", false);
221  case ProxyIPTor: {
222  // contains IP at index 0 and port at index 1
223  QStringList strlIpPort = settings.value("addrSeparateProxyTor").toString().split(":", QString::SkipEmptyParts);
224  return strlIpPort.at(0);
225  }
226  case ProxyPortTor: {
227  // contains IP at index 0 and port at index 1
228  QStringList strlIpPort = settings.value("addrSeparateProxyTor").toString().split(":", QString::SkipEmptyParts);
229  return strlIpPort.at(1);
230  }
231 
232 #ifdef ENABLE_WALLET
233  case SpendZeroConfChange:
234  return settings.value("bSpendZeroConfChange");
235 #endif
236  case DisplayUnit:
237  return nDisplayUnit;
238  case ThirdPartyTxUrls:
239  return strThirdPartyTxUrls;
240  case Language:
241  return settings.value("language");
242  case CoinControlFeatures:
243  return fCoinControlFeatures;
244  case DatabaseCache:
245  return settings.value("nDatabaseCache");
246  case ThreadsScriptVerif:
247  return settings.value("nThreadsScriptVerif");
248  case Listen:
249  return settings.value("fListen");
250  default:
251  return QVariant();
252  }
253  }
254  return QVariant();
255 }
256 
257 // write QSettings values
258 bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, int role)
259 {
260  bool successful = true; /* set to false on parse error */
261  if(role == Qt::EditRole)
262  {
263  QSettings settings;
264  switch(index.row())
265  {
266  case StartAtStartup:
267  successful = GUIUtil::SetStartOnSystemStartup(value.toBool());
268  break;
269  case HideTrayIcon:
270  fHideTrayIcon = value.toBool();
271  settings.setValue("fHideTrayIcon", fHideTrayIcon);
273  break;
274  case MinimizeToTray:
275  fMinimizeToTray = value.toBool();
276  settings.setValue("fMinimizeToTray", fMinimizeToTray);
277  break;
278  case MapPortUPnP: // core option - can be changed on-the-fly
279  settings.setValue("fUseUPnP", value.toBool());
280  MapPort(value.toBool());
281  break;
282  case MinimizeOnClose:
283  fMinimizeOnClose = value.toBool();
284  settings.setValue("fMinimizeOnClose", fMinimizeOnClose);
285  break;
286 
287  // default proxy
288  case ProxyUse:
289  if (settings.value("fUseProxy") != value) {
290  settings.setValue("fUseProxy", value.toBool());
291  setRestartRequired(true);
292  }
293  break;
294  case ProxyIP: {
295  // contains current IP at index 0 and current port at index 1
296  QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts);
297  // if that key doesn't exist or has a changed IP
298  if (!settings.contains("addrProxy") || strlIpPort.at(0) != value.toString()) {
299  // construct new value from new IP and current port
300  QString strNewValue = value.toString() + ":" + strlIpPort.at(1);
301  settings.setValue("addrProxy", strNewValue);
302  setRestartRequired(true);
303  }
304  }
305  break;
306  case ProxyPort: {
307  // contains current IP at index 0 and current port at index 1
308  QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts);
309  // if that key doesn't exist or has a changed port
310  if (!settings.contains("addrProxy") || strlIpPort.at(1) != value.toString()) {
311  // construct new value from current IP and new port
312  QString strNewValue = strlIpPort.at(0) + ":" + value.toString();
313  settings.setValue("addrProxy", strNewValue);
314  setRestartRequired(true);
315  }
316  }
317  break;
318 
319  // separate Tor proxy
320  case ProxyUseTor:
321  if (settings.value("fUseSeparateProxyTor") != value) {
322  settings.setValue("fUseSeparateProxyTor", value.toBool());
323  setRestartRequired(true);
324  }
325  break;
326  case ProxyIPTor: {
327  // contains current IP at index 0 and current port at index 1
328  QStringList strlIpPort = settings.value("addrSeparateProxyTor").toString().split(":", QString::SkipEmptyParts);
329  // if that key doesn't exist or has a changed IP
330  if (!settings.contains("addrSeparateProxyTor") || strlIpPort.at(0) != value.toString()) {
331  // construct new value from new IP and current port
332  QString strNewValue = value.toString() + ":" + strlIpPort.at(1);
333  settings.setValue("addrSeparateProxyTor", strNewValue);
334  setRestartRequired(true);
335  }
336  }
337  break;
338  case ProxyPortTor: {
339  // contains current IP at index 0 and current port at index 1
340  QStringList strlIpPort = settings.value("addrSeparateProxyTor").toString().split(":", QString::SkipEmptyParts);
341  // if that key doesn't exist or has a changed port
342  if (!settings.contains("addrSeparateProxyTor") || strlIpPort.at(1) != value.toString()) {
343  // construct new value from current IP and new port
344  QString strNewValue = strlIpPort.at(0) + ":" + value.toString();
345  settings.setValue("addrSeparateProxyTor", strNewValue);
346  setRestartRequired(true);
347  }
348  }
349  break;
350 
351 #ifdef ENABLE_WALLET
352  case SpendZeroConfChange:
353  if (settings.value("bSpendZeroConfChange") != value) {
354  settings.setValue("bSpendZeroConfChange", value);
355  setRestartRequired(true);
356  }
357  break;
358 #endif
359  case DisplayUnit:
360  setDisplayUnit(value);
361  break;
362  case ThirdPartyTxUrls:
363  if (strThirdPartyTxUrls != value.toString()) {
364  strThirdPartyTxUrls = value.toString();
365  settings.setValue("strThirdPartyTxUrls", strThirdPartyTxUrls);
366  setRestartRequired(true);
367  }
368  break;
369  case Language:
370  if (settings.value("language") != value) {
371  settings.setValue("language", value);
372  setRestartRequired(true);
373  }
374  break;
375  case CoinControlFeatures:
376  fCoinControlFeatures = value.toBool();
377  settings.setValue("fCoinControlFeatures", fCoinControlFeatures);
379  break;
380  case DatabaseCache:
381  if (settings.value("nDatabaseCache") != value) {
382  settings.setValue("nDatabaseCache", value);
383  setRestartRequired(true);
384  }
385  break;
386  case ThreadsScriptVerif:
387  if (settings.value("nThreadsScriptVerif") != value) {
388  settings.setValue("nThreadsScriptVerif", value);
389  setRestartRequired(true);
390  }
391  break;
392  case Listen:
393  if (settings.value("fListen") != value) {
394  settings.setValue("fListen", value);
395  setRestartRequired(true);
396  }
397  break;
398  default:
399  break;
400  }
401  }
402 
403  Q_EMIT dataChanged(index, index);
404 
405  return successful;
406 }
407 
409 void OptionsModel::setDisplayUnit(const QVariant &value)
410 {
411  if (!value.isNull())
412  {
413  QSettings settings;
414  nDisplayUnit = value.toInt();
415  settings.setValue("nDisplayUnit", nDisplayUnit);
417  }
418 }
419 
420 bool OptionsModel::getProxySettings(QNetworkProxy& proxy) const
421 {
422  // Directly query current base proxy, because
423  // GUI settings can be overridden with -proxy.
424  proxyType curProxy;
425  if (GetProxy(NET_IPV4, curProxy)) {
426  proxy.setType(QNetworkProxy::Socks5Proxy);
427  proxy.setHostName(QString::fromStdString(curProxy.proxy.ToStringIP()));
428  proxy.setPort(curProxy.proxy.GetPort());
429 
430  return true;
431  }
432  else
433  proxy.setType(QNetworkProxy::NoProxy);
434 
435  return false;
436 }
437 
439 {
440  QSettings settings;
441  return settings.setValue("fRestartRequired", fRequired);
442 }
443 
445 {
446  QSettings settings;
447  return settings.value("fRestartRequired", false).toBool();
448 }
449 
451 {
452  // Migration of default values
453  // Check if the QSettings container was already loaded with this client version
454  QSettings settings;
455  static const char strSettingsVersionKey[] = "nSettingsVersion";
456  int settingsVersion = settings.contains(strSettingsVersionKey) ? settings.value(strSettingsVersionKey).toInt() : 0;
457  if (settingsVersion < CLIENT_VERSION)
458  {
459  // -dbcache was bumped from 100 to 300 in 0.13
460  // see https://github.com/bitcoin/bitcoin/pull/8273
461  // force people to upgrade to the new value if they are using 100MB
462  if (settingsVersion < 130000 && settings.contains("nDatabaseCache") && settings.value("nDatabaseCache").toLongLong() == 100)
463  settings.setValue("nDatabaseCache", (qint64)nDefaultDbCache);
464 
465  settings.setValue(strSettingsVersionKey, CLIENT_VERSION);
466  }
467 }
std::string ToStringIP() const
Definition: netaddress.cpp:243
unsigned short GetPort() const
Definition: netaddress.cpp:494
static QString getDefaultDataDirectory()
Determine default data directory for operating system.
Definition: intro.cpp:168
QString strOverriddenByCommandLine
Definition: optionsmodel.h:85
bool getProxySettings(QNetworkProxy &proxy) const
void Init(bool resetSettings=false)
bool fCoinControlFeatures
Definition: optionsmodel.h:83
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole)
void setDisplayUnit(const QVariant &value)
Updates current unit in memory, settings and emits displayUnitChanged(newUnit) signal.
void coinControlFeaturesChanged(bool)
QString strThirdPartyTxUrls
Definition: optionsmodel.h:82
bool isRestartRequired()
void displayUnitChanged(int unit)
bool fHideTrayIcon
Definition: optionsmodel.h:77
bool fMinimizeToTray
Definition: optionsmodel.h:78
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
int rowCount(const QModelIndex &parent=QModelIndex()) const
OptionsModel(QObject *parent=0, bool resetSettings=false)
void checkAndMigrate()
QString language
Definition: optionsmodel.h:80
void addOverriddenOption(const std::string &option)
bool fMinimizeOnClose
Definition: optionsmodel.h:79
void setRestartRequired(bool fRequired)
void hideTrayIconChanged(bool)
CService proxy
Definition: netbase.h:36
bool SetStartOnSystemStartup(bool fAutoStart)
Definition: guiutil.cpp:825
bool GetStartOnSystemStartup()
Definition: guiutil.cpp:824
void MapPort(bool)
Definition: net.cpp:1532
@ NET_IPV4
Definition: netaddress.h:22
bool GetProxy(enum Network net, proxyType &proxyInfoOut)
Definition: netbase.cpp:514
std::string GetArg(const std::string &strArg, const std::string &strDefault)
Return string argument or default value.
Definition: util.cpp:395
bool SoftSetArg(const std::string &strArg, const std::string &strValue)
Set an argument if it doesn't already have a value.
Definition: util.cpp:419
bool SoftSetBoolArg(const std::string &strArg, bool fValue)
Set a boolean argument if it doesn't already have a value.
Definition: util.cpp:428