Remove UPNP support & do some cleanup.
[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.value("fTorOnly").toBool() && settings.contains("addrTor")) ) {
82         if (settings.contains("addrProxy") && settings.value("fUseProxy").toBool())
83             SoftSetArg("-proxy", settings.value("addrProxy").toString().toStdString());
84         if (settings.contains("nSocksVersion") && settings.value("fUseProxy").toBool())
85             SoftSetArg("-socks", settings.value("nSocksVersion").toString().toStdString());
86     }
87
88     if (settings.contains("addrTor") && settings.value("fUseTor").toBool()) {
89         SoftSetArg("-tor", settings.value("addrTor").toString().toStdString());
90         if (settings.value("fTorOnly").toBool())
91             SoftSetArg("-onlynet", "tor");
92
93         if (settings.value("TorName").toString().length() == 22) {
94             std::string strTorName = settings.value("TorName").toString().toStdString();
95
96             CService addrTorName(strTorName, GetListenPort());
97             if (addrTorName.IsValid())
98                 SoftSetArg("-torname", strTorName);
99         }
100     }
101
102     if (settings.contains("detachDB"))
103         SoftSetBoolArg("-detachdb", settings.value("detachDB").toBool());
104     if (!language.isEmpty())
105         SoftSetArg("-lang", language.toStdString());
106 }
107
108 int OptionsModel::rowCount(const QModelIndex & parent) const
109 {
110     return OptionIDRowCount;
111 }
112
113 QVariant OptionsModel::data(const QModelIndex & index, int role) const
114 {
115     if(role == Qt::EditRole)
116     {
117         QSettings settings;
118         switch(index.row())
119         {
120         case StartAtStartup:
121             return QVariant(GUIUtil::GetStartOnSystemStartup());
122         case MinimizeToTray:
123             return QVariant(fMinimizeToTray);
124         case MinimizeOnClose:
125             return QVariant(fMinimizeOnClose);
126         case ProxyUse:
127             return settings.value("fUseProxy", false);
128         case ProxyIP: {
129             proxyType proxy;
130             if (GetProxy(NET_IPV4, proxy))
131                 return QVariant(QString::fromStdString(proxy.first.ToStringIP()));
132             else
133                 return QVariant(QString::fromStdString("127.0.0.1"));
134         }
135         case ProxyPort: {
136             proxyType proxy;
137             if (GetProxy(NET_IPV4, proxy))
138                 return QVariant(proxy.first.GetPort());
139             else
140                 return QVariant(nSocksDefault);
141         }
142         case ProxySocksVersion:
143             return settings.value("nSocksVersion", 5);
144         case TorUse:
145             return settings.value("fUseTor", false);
146         case TorIP: {
147             proxyType proxy;
148             if (GetProxy(NET_TOR, proxy))
149                 return QVariant(QString::fromStdString(proxy.first.ToStringIP()));
150             else
151                 return QVariant(QString::fromStdString("127.0.0.1"));
152         }
153         case TorPort: {
154             proxyType proxy;
155             if (GetProxy(NET_TOR, proxy))
156                 return QVariant(proxy.first.GetPort());
157             else
158                 return QVariant(nSocksDefault);
159         }
160         case TorOnly:
161             return settings.value("fTorOnly", false);
162         case TorName:
163             return settings.value("TorName", "");
164         case Fee:
165             return QVariant(static_cast<qlonglong>(nTransactionFee));
166         case DisplayUnit:
167             return QVariant(nDisplayUnit);
168         case DisplayAddresses:
169             return QVariant(bDisplayAddresses);
170         case ThirdPartyTxUrls:
171             return QVariant(strThirdPartyTxUrls);
172         case DetachDatabases:
173             return QVariant(bitdb.GetDetach());
174         case Language:
175             return settings.value("language", "");
176         case CoinControlFeatures:
177             return QVariant(fCoinControlFeatures);
178         default:
179             return QVariant();
180         }
181     }
182     return QVariant();
183 }
184
185 bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, int role)
186 {
187     bool successful = true; /* set to false on parse error */
188     if(role == Qt::EditRole)
189     {
190         QSettings settings;
191         switch(index.row())
192         {
193         case StartAtStartup:
194             successful = GUIUtil::SetStartOnSystemStartup(value.toBool());
195             break;
196         case MinimizeToTray:
197             fMinimizeToTray = value.toBool();
198             settings.setValue("fMinimizeToTray", fMinimizeToTray);
199             break;
200         case MinimizeOnClose:
201             fMinimizeOnClose = value.toBool();
202             settings.setValue("fMinimizeOnClose", fMinimizeOnClose);
203             break;
204         case ProxyUse:
205             settings.setValue("fUseProxy", value.toBool());
206             ApplyProxySettings();
207             break;
208         case ProxyIP: {
209             proxyType proxy;
210             proxy.first = CService("127.0.0.1", nSocksDefault);
211             GetProxy(NET_IPV4, proxy);
212
213             CNetAddr addr(value.toString().toStdString());
214             proxy.first.SetIP(addr);
215             settings.setValue("addrProxy", proxy.first.ToStringIPPort().c_str());
216             successful = ApplyProxySettings();
217         }
218         break;
219         case ProxyPort: {
220             proxyType proxy;
221             proxy.first = CService("127.0.0.1", nSocksDefault);
222             GetProxy(NET_IPV4, proxy);
223
224             proxy.first.SetPort(value.toInt());
225             settings.setValue("addrProxy", proxy.first.ToStringIPPort().c_str());
226             successful = ApplyProxySettings();
227         }
228         break;
229         case ProxySocksVersion: {
230             proxyType proxy;
231             proxy.second = 5;
232             GetProxy(NET_IPV4, proxy);
233
234             proxy.second = value.toInt();
235             settings.setValue("nSocksVersion", proxy.second);
236             successful = ApplyProxySettings();
237         }
238         break;
239         case TorUse: {
240             settings.setValue("fUseTor", value.toBool());
241             ApplyTorSettings();
242         }
243         break;
244         case TorIP: {
245             proxyType proxy;
246             proxy.first = CService("127.0.0.1", nSocksDefault);
247             GetProxy(NET_TOR, proxy);
248
249             CNetAddr addr(value.toString().toStdString());
250             proxy.first.SetIP(addr);
251             settings.setValue("addrTor", proxy.first.ToStringIPPort().c_str());
252             successful = ApplyTorSettings();
253         }
254         break;
255         case TorPort: {
256             proxyType proxy;
257             proxy.first = CService("127.0.0.1", nSocksDefault);
258             GetProxy(NET_TOR, proxy);
259
260             proxy.first.SetPort((uint16_t)value.toUInt());
261             settings.setValue("addrTor", proxy.first.ToStringIPPort().c_str());
262             successful = ApplyTorSettings();
263         }
264         break;
265         case TorOnly: {
266             settings.setValue("fTorOnly", value.toBool());
267             ApplyTorSettings();
268         }
269         case TorName: {
270             settings.setValue("TorName", value.toString());
271         }
272         break;
273         case Fee:
274             nTransactionFee = value.toLongLong();
275             settings.setValue("nTransactionFee", static_cast<qlonglong>(nTransactionFee));
276             emit transactionFeeChanged(nTransactionFee);
277             break;
278         case DisplayUnit:
279             nDisplayUnit = value.toInt();
280             settings.setValue("nDisplayUnit", nDisplayUnit);
281             emit displayUnitChanged(nDisplayUnit);
282             break;
283         case DisplayAddresses:
284             bDisplayAddresses = value.toBool();
285             settings.setValue("bDisplayAddresses", bDisplayAddresses);
286             break;
287         case DetachDatabases: {
288             bool fDetachDB = value.toBool();
289             bitdb.SetDetach(fDetachDB);
290             settings.setValue("detachDB", fDetachDB);
291             }
292             break;
293         case ThirdPartyTxUrls:
294             if (strThirdPartyTxUrls != value.toString()) {
295                 strThirdPartyTxUrls = value.toString();
296                 settings.setValue("strThirdPartyTxUrls", strThirdPartyTxUrls);
297             }
298             break;
299         case Language:
300             settings.setValue("language", value);
301             break;
302         case CoinControlFeatures: {
303             fCoinControlFeatures = value.toBool();
304             settings.setValue("fCoinControlFeatures", fCoinControlFeatures);
305             emit coinControlFeaturesChanged(fCoinControlFeatures);
306             }
307             break;
308         default:
309             break;
310         }
311     }
312     emit dataChanged(index, index);
313
314     return successful;
315 }
316
317 qint64 OptionsModel::getTransactionFee()
318 {
319     return nTransactionFee;
320 }
321
322 bool OptionsModel::getCoinControlFeatures()
323 {
324     return fCoinControlFeatures;
325 }
326
327 bool OptionsModel::getMinimizeToTray()
328 {
329     return fMinimizeToTray;
330 }
331
332 bool OptionsModel::getMinimizeOnClose()
333 {
334     return fMinimizeOnClose;
335 }
336
337 int OptionsModel::getDisplayUnit()
338 {
339     return nDisplayUnit;
340 }
341
342 bool OptionsModel::getDisplayAddresses()
343 {
344     return bDisplayAddresses;
345 }