71203f5ac25f2f35f220f64003b83864ce029abe
[novacoin.git] / src / qt / optionsmodel.cpp
1 #include "optionsmodel.h"
2 #include "bitcoinunits.h"
3 #include <QSettings>
4
5 #include "init.h"
6 #include "walletdb.h"
7 #include "guiutil.h"
8
9 OptionsModel::OptionsModel(QObject *parent) :
10     QAbstractListModel(parent)
11 {
12     Init();
13 }
14
15 bool static ApplyProxySettings()
16 {
17     QSettings settings;
18     CService addrProxy(settings.value("addrProxy", "127.0.0.1:9050").toString().toStdString());
19     int nSocksVersion(settings.value("nSocksVersion", 5).toInt());
20     if (!settings.value("fUseProxy", false).toBool()) {
21         addrProxy = CService();
22         nSocksVersion = 0;
23         return false;
24     }
25     if (nSocksVersion && !addrProxy.IsValid())
26         return false;
27
28     if (!IsLimited(NET_IPV4))
29         SetProxy(NET_IPV4, addrProxy, nSocksVersion);
30     if (nSocksVersion > 4) {
31 #ifdef USE_IPV6
32         if (!IsLimited(NET_IPV6))
33             SetProxy(NET_IPV6, addrProxy, nSocksVersion);
34 #endif
35     }
36
37     SetNameProxy(addrProxy, nSocksVersion);
38
39     return true;
40 }
41
42 bool static ApplyTorSettings()
43 {
44     QSettings settings;
45     CService addrTor(settings.value("addrTor", "127.0.0.1:9050").toString().toStdString());
46     if (!settings.value("fUseTor", false).toBool()) {
47         addrTor = CService();
48         return false;
49     }
50     if (!addrTor.IsValid())
51         return false;
52
53     SetProxy(NET_TOR, addrTor, 5);
54     SetReachable(NET_TOR);
55
56     return true;
57 }
58
59 void OptionsModel::Init()
60 {
61     QSettings settings;
62
63     // These are Qt-only settings:
64     nDisplayUnit = settings.value("nDisplayUnit", BitcoinUnits::BTC).toInt();
65     bDisplayAddresses = settings.value("bDisplayAddresses", false).toBool();
66     if (!settings.contains("strThirdPartyTxUrls")) {
67         if(fTestNet)
68             settings.setValue("strThirdPartyTxUrls", "");
69         else
70             settings.setValue("strThirdPartyTxUrls", "https://bitinfocharts.com/novacoin/tx/%s|https://coinplorer.com/NVC/Transactions/%s|https://explorer.novaco.in/tx/%s|https://bchain.info/NVC/tx/%s");
71     }
72     strThirdPartyTxUrls = settings.value("strThirdPartyTxUrls", "https://bitinfocharts.com/novacoin/tx/%s|https://coinplorer.com/NVC/Transactions/%s|https://explorer.novaco.in/tx/%s|https://bchain.info/NVC/tx/%s").toString();
73     fMinimizeToTray = settings.value("fMinimizeToTray", false).toBool();
74     fMinimizeOnClose = settings.value("fMinimizeOnClose", false).toBool();
75     fCoinControlFeatures = settings.value("fCoinControlFeatures", false).toBool();
76     nTransactionFee = settings.value("nTransactionFee").toLongLong();
77     language = settings.value("language", "").toString();
78
79     // These are shared with core Bitcoin; we want
80     // command-line options to override the GUI settings:
81     if (settings.contains("fUseUPnP"))
82         SoftSetBoolArg("-upnp", settings.value("fUseUPnP").toBool());
83     if ( !(settings.value("fTorOnly").toBool() && settings.contains("addrTor")) ) {
84         if (settings.contains("addrProxy") && settings.value("fUseProxy").toBool())
85             SoftSetArg("-proxy", settings.value("addrProxy").toString().toStdString());
86         if (settings.contains("nSocksVersion") && settings.value("fUseProxy").toBool())
87             SoftSetArg("-socks", settings.value("nSocksVersion").toString().toStdString());
88     }
89
90     if (settings.contains("addrTor") && settings.value("fUseTor").toBool()) {
91         SoftSetArg("-tor", settings.value("addrTor").toString().toStdString());
92         if (settings.value("fTorOnly").toBool())
93             SoftSetArg("-onlynet", "tor");
94
95         if (settings.value("TorName").toString().length() == 22) {
96             std::string strTorName = settings.value("TorName").toString().toStdString();
97
98             CService addrTorName(strTorName, GetListenPort());
99             if (addrTorName.IsValid())
100                 SoftSetArg("-torname", strTorName);
101         }
102     }
103
104     if (settings.contains("detachDB"))
105         SoftSetBoolArg("-detachdb", settings.value("detachDB").toBool());
106     if (!language.isEmpty())
107         SoftSetArg("-lang", language.toStdString());
108 }
109
110 bool OptionsModel::Upgrade()
111 {
112     QSettings settings;
113
114     if (settings.contains("bImportFinished"))
115         return false; // Already upgraded
116
117     settings.setValue("bImportFinished", true);
118
119     // Move settings from old wallet.dat (if any):
120     CWalletDB walletdb(strWalletFileName);
121
122     QList<QString> intOptions;
123     intOptions << "nDisplayUnit" << "nTransactionFee";
124     foreach(QString key, intOptions)
125     {
126         int value = 0;
127         if (walletdb.ReadSetting(key.toStdString(), value))
128         {
129             settings.setValue(key, value);
130             walletdb.EraseSetting(key.toStdString());
131         }
132     }
133     QList<QString> boolOptions;
134     boolOptions << "bDisplayAddresses" << "fMinimizeToTray" << "fMinimizeOnClose" << "fUseProxy" << "fUseTor" << "fTorOnly" << "fUseUPnP";
135     foreach(QString key, boolOptions)
136     {
137         bool value = false;
138         if (walletdb.ReadSetting(key.toStdString(), value))
139         {
140             settings.setValue(key, value);
141             walletdb.EraseSetting(key.toStdString());
142         }
143     }
144     try
145     {
146         CAddress addrProxyAddress, addrTorAddress;
147         if (walletdb.ReadSetting("addrProxy", addrProxyAddress))
148         {
149             settings.setValue("addrProxy", addrProxyAddress.ToStringIPPort().c_str());
150             walletdb.EraseSetting("addrProxy");
151         }
152
153         if (walletdb.ReadSetting("addrTor", addrTorAddress))
154         {
155             settings.setValue("addrTor", addrTorAddress.ToStringIPPort().c_str());
156             walletdb.EraseSetting("addrTor");
157         }
158     }
159     catch (std::ios_base::failure &e)
160     {
161         // 0.6.0rc1 saved this as a CService, which causes failure when parsing as a CAddress
162         CService addrProxy, addrTor;
163         if (walletdb.ReadSetting("addrProxy", addrProxy))
164         {
165             settings.setValue("addrProxy", addrProxy.ToStringIPPort().c_str());
166             walletdb.EraseSetting("addrProxy");
167         }
168
169         if (walletdb.ReadSetting("addrTor", addrTor))
170         {
171             settings.setValue("addrTor", addrTor.ToStringIPPort().c_str());
172             walletdb.EraseSetting("addrTor");
173         }
174     }
175
176     ApplyProxySettings();
177     ApplyTorSettings();
178     Init();
179
180     return true;
181 }
182
183
184 int OptionsModel::rowCount(const QModelIndex & parent) const
185 {
186     return OptionIDRowCount;
187 }
188
189 QVariant OptionsModel::data(const QModelIndex & index, int role) const
190 {
191     if(role == Qt::EditRole)
192     {
193         QSettings settings;
194         switch(index.row())
195         {
196         case StartAtStartup:
197             return QVariant(GUIUtil::GetStartOnSystemStartup());
198         case MinimizeToTray:
199             return QVariant(fMinimizeToTray);
200         case MapPortUPnP:
201             return settings.value("fUseUPnP", GetBoolArg("-upnp", true));
202         case MinimizeOnClose:
203             return QVariant(fMinimizeOnClose);
204         case ProxyUse:
205             return settings.value("fUseProxy", false);
206         case ProxyIP: {
207             proxyType proxy;
208             if (GetProxy(NET_IPV4, proxy))
209                 return QVariant(QString::fromStdString(proxy.first.ToStringIP()));
210             else
211                 return QVariant(QString::fromStdString("127.0.0.1"));
212         }
213         case ProxyPort: {
214             proxyType proxy;
215             if (GetProxy(NET_IPV4, proxy))
216                 return QVariant(proxy.first.GetPort());
217             else
218                 return QVariant(9050);
219         }
220         case ProxySocksVersion:
221             return settings.value("nSocksVersion", 5);
222         case TorUse:
223             return settings.value("fUseTor", false);
224         case TorIP: {
225             proxyType proxy;
226             if (GetProxy(NET_TOR, proxy))
227                 return QVariant(QString::fromStdString(proxy.first.ToStringIP()));
228             else
229                 return QVariant(QString::fromStdString("127.0.0.1"));
230         }
231         case TorPort: {
232             proxyType proxy;
233             if (GetProxy(NET_TOR, proxy))
234                 return QVariant(proxy.first.GetPort());
235             else
236                 return QVariant(9050);
237         }
238         case TorOnly:
239             return settings.value("fTorOnly", false);
240         case TorName:
241             return settings.value("TorName", "");
242         case Fee:
243             return QVariant(static_cast<qlonglong>(nTransactionFee));
244         case DisplayUnit:
245             return QVariant(nDisplayUnit);
246         case DisplayAddresses:
247             return QVariant(bDisplayAddresses);
248         case ThirdPartyTxUrls:
249             return QVariant(strThirdPartyTxUrls);
250         case DetachDatabases:
251             return QVariant(bitdb.GetDetach());
252         case Language:
253             return settings.value("language", "");
254         case CoinControlFeatures:
255             return QVariant(fCoinControlFeatures);
256         default:
257             return QVariant();
258         }
259     }
260     return QVariant();
261 }
262
263 bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, int role)
264 {
265     bool successful = true; /* set to false on parse error */
266     if(role == Qt::EditRole)
267     {
268         QSettings settings;
269         switch(index.row())
270         {
271         case StartAtStartup:
272             successful = GUIUtil::SetStartOnSystemStartup(value.toBool());
273             break;
274         case MinimizeToTray:
275             fMinimizeToTray = value.toBool();
276             settings.setValue("fMinimizeToTray", fMinimizeToTray);
277             break;
278         case MapPortUPnP:
279             fUseUPnP = value.toBool();
280             settings.setValue("fUseUPnP", fUseUPnP);
281             MapPort();
282             break;
283         case MinimizeOnClose:
284             fMinimizeOnClose = value.toBool();
285             settings.setValue("fMinimizeOnClose", fMinimizeOnClose);
286             break;
287         case ProxyUse:
288             settings.setValue("fUseProxy", value.toBool());
289             ApplyProxySettings();
290             break;
291         case ProxyIP: {
292             proxyType proxy;
293             proxy.first = CService("127.0.0.1", 9050);
294             GetProxy(NET_IPV4, proxy);
295
296             CNetAddr addr(value.toString().toStdString());
297             proxy.first.SetIP(addr);
298             settings.setValue("addrProxy", proxy.first.ToStringIPPort().c_str());
299             successful = ApplyProxySettings();
300         }
301         break;
302         case ProxyPort: {
303             proxyType proxy;
304             proxy.first = CService("127.0.0.1", 9050);
305             GetProxy(NET_IPV4, proxy);
306
307             proxy.first.SetPort(value.toInt());
308             settings.setValue("addrProxy", proxy.first.ToStringIPPort().c_str());
309             successful = ApplyProxySettings();
310         }
311         break;
312         case ProxySocksVersion: {
313             proxyType proxy;
314             proxy.second = 5;
315             GetProxy(NET_IPV4, proxy);
316
317             proxy.second = value.toInt();
318             settings.setValue("nSocksVersion", proxy.second);
319             successful = ApplyProxySettings();
320         }
321         break;
322         case TorUse: {
323             settings.setValue("fUseTor", value.toBool());
324             ApplyTorSettings();
325         }
326         break;
327         case TorIP: {
328             proxyType proxy;
329             proxy.first = CService("127.0.0.1", 9050);
330             GetProxy(NET_IPV4, proxy);
331
332             CNetAddr addr(value.toString().toStdString());
333             proxy.first.SetIP(addr);
334             settings.setValue("addrTor", proxy.first.ToStringIPPort().c_str());
335             successful = ApplyTorSettings();
336         }
337         break;
338         case TorPort: {
339             proxyType proxy;
340             proxy.first = CService("127.0.0.1", 9050);
341             GetProxy(NET_IPV4, proxy);
342
343             proxy.first.SetPort(value.toInt());
344             settings.setValue("addrTor", proxy.first.ToStringIPPort().c_str());
345             successful = ApplyTorSettings();
346         }
347         break;
348         case TorOnly: {
349             settings.setValue("fTorOnly", value.toBool());
350             ApplyTorSettings();
351         }
352         case TorName: {
353             settings.setValue("TorName", value.toString());
354         }
355         break;
356         case Fee:
357             nTransactionFee = value.toLongLong();
358             settings.setValue("nTransactionFee", static_cast<qlonglong>(nTransactionFee));
359             emit transactionFeeChanged(nTransactionFee);
360             break;
361         case DisplayUnit:
362             nDisplayUnit = value.toInt();
363             settings.setValue("nDisplayUnit", nDisplayUnit);
364             emit displayUnitChanged(nDisplayUnit);
365             break;
366         case DisplayAddresses:
367             bDisplayAddresses = value.toBool();
368             settings.setValue("bDisplayAddresses", bDisplayAddresses);
369             break;
370         case DetachDatabases: {
371             bool fDetachDB = value.toBool();
372             bitdb.SetDetach(fDetachDB);
373             settings.setValue("detachDB", fDetachDB);
374             }
375             break;
376         case ThirdPartyTxUrls:
377             if (strThirdPartyTxUrls != value.toString()) {
378                 strThirdPartyTxUrls = value.toString();
379                 settings.setValue("strThirdPartyTxUrls", strThirdPartyTxUrls);
380             }
381             break;
382         case Language:
383             settings.setValue("language", value);
384             break;
385         case CoinControlFeatures: {
386             fCoinControlFeatures = value.toBool();
387             settings.setValue("fCoinControlFeatures", fCoinControlFeatures);
388             emit coinControlFeaturesChanged(fCoinControlFeatures);
389             }
390             break;
391         default:
392             break;
393         }
394     }
395     emit dataChanged(index, index);
396
397     return successful;
398 }
399
400 qint64 OptionsModel::getTransactionFee()
401 {
402     return nTransactionFee;
403 }
404
405 bool OptionsModel::getCoinControlFeatures()
406 {
407     return fCoinControlFeatures;
408 }
409
410 bool OptionsModel::getMinimizeToTray()
411 {
412     return fMinimizeToTray;
413 }
414
415 bool OptionsModel::getMinimizeOnClose()
416 {
417     return fMinimizeOnClose;
418 }
419
420 int OptionsModel::getDisplayUnit()
421 {
422     return nDisplayUnit;
423 }
424
425 bool OptionsModel::getDisplayAddresses()
426 {
427     return bDisplayAddresses;
428 }