Remove socks4 support
[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     if (!settings.value("fUseProxy", false).toBool()) {
20         addrProxy = CService();
21         return false;
22     }
23     if (!addrProxy.IsValid())
24         return false;
25
26     if (!IsLimited(NET_IPV4))
27         SetProxy(NET_IPV4, addrProxy);
28 #ifdef USE_IPV6
29         if (!IsLimited(NET_IPV6))
30             SetProxy(NET_IPV6, addrProxy);
31 #endif
32
33     SetNameProxy(addrProxy);
34
35     return true;
36 }
37
38 bool static ApplyTorSettings()
39 {
40     QSettings settings;
41     CService addrTor(settings.value("addrTor", "127.0.0.1:9050").toString().toStdString());
42     if (!settings.value("fUseTor", false).toBool()) {
43         addrTor = CService();
44         return false;
45     }
46     if (!addrTor.IsValid())
47         return false;
48
49     SetProxy(NET_TOR, addrTor);
50     SetReachable(NET_TOR);
51
52     return true;
53 }
54
55 void OptionsModel::Init()
56 {
57     QSettings settings;
58
59     // These are Qt-only settings:
60     nDisplayUnit = settings.value("nDisplayUnit", BitcoinUnits::BTC).toInt();
61     bDisplayAddresses = settings.value("bDisplayAddresses", false).toBool();
62     if (!settings.contains("strThirdPartyTxUrls")) {
63         if(fTestNet)
64             settings.setValue("strThirdPartyTxUrls", "");
65         else
66             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");
67     }
68     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();
69     fMinimizeToTray = settings.value("fMinimizeToTray", false).toBool();
70     fMinimizeOnClose = settings.value("fMinimizeOnClose", false).toBool();
71     fCoinControlFeatures = settings.value("fCoinControlFeatures", false).toBool();
72     nTransactionFee = settings.value("nTransactionFee").toLongLong();
73     language = settings.value("language", "").toString();
74
75     // These are shared with core Bitcoin; we want
76     // command-line options to override the GUI settings:
77     if ( !(settings.value("fTorOnly").toBool() && settings.contains("addrTor")) ) {
78         if (settings.contains("addrProxy") && settings.value("fUseProxy").toBool())
79             SoftSetArg("-proxy", settings.value("addrProxy").toString().toStdString());
80         if (settings.contains("nSocksVersion") && settings.value("fUseProxy").toBool())
81             SoftSetArg("-socks", settings.value("nSocksVersion").toString().toStdString());
82     }
83
84     if (settings.contains("addrTor") && settings.value("fUseTor").toBool()) {
85         SoftSetArg("-tor", settings.value("addrTor").toString().toStdString());
86         if (settings.value("fTorOnly").toBool())
87             SoftSetArg("-onlynet", "tor");
88
89         if (settings.value("TorName").toString().length() == 22) {
90             std::string strTorName = settings.value("TorName").toString().toStdString();
91
92             CService addrTorName(strTorName, GetListenPort());
93             if (addrTorName.IsValid())
94                 SoftSetArg("-torname", strTorName);
95         }
96     }
97
98     if (!fTestNet && settings.contains("externalSeeder") && settings.value("externalSeeder").toString() != "") {
99         SoftSetArg("-peercollector", settings.value("externalSeeder").toString().toStdString());
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.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.GetPort());
139             else
140                 return QVariant(nSocksDefault);
141         }
142         case TorUse:
143             return settings.value("fUseTor", false);
144         case TorIP: {
145             proxyType proxy;
146             if (GetProxy(NET_TOR, proxy))
147                 return QVariant(QString::fromStdString(proxy.ToStringIP()));
148             else
149                 return QVariant(QString::fromStdString("127.0.0.1"));
150         }
151         case TorPort: {
152             proxyType proxy;
153             if (GetProxy(NET_TOR, proxy))
154                 return QVariant(proxy.GetPort());
155             else
156                 return QVariant(nSocksDefault);
157         }
158         case TorOnly:
159             return settings.value("fTorOnly", false);
160         case TorName:
161             return settings.value("TorName", "");
162         case ExternalSeeder:
163             return settings.value("externalSeeder", "");
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 = CService("127.0.0.1", nSocksDefault);
211             GetProxy(NET_IPV4, proxy);
212
213             CNetAddr addr(value.toString().toStdString());
214             proxy.SetIP(addr);
215             settings.setValue("addrProxy", proxy.ToStringIPPort().c_str());
216             successful = ApplyProxySettings();
217         }
218         break;
219         case ProxyPort: {
220             proxyType proxy;
221             proxy = CService("127.0.0.1", nSocksDefault);
222             GetProxy(NET_IPV4, proxy);
223
224             proxy.SetupPort(value.toInt());
225             settings.setValue("addrProxy", proxy.ToStringIPPort().c_str());
226             successful = ApplyProxySettings();
227         }
228         break;
229         case TorUse: {
230             settings.setValue("fUseTor", value.toBool());
231             ApplyTorSettings();
232         }
233         break;
234         case TorIP: {
235             proxyType proxy;
236             proxy = CService("127.0.0.1", nSocksDefault);
237             GetProxy(NET_TOR, proxy);
238
239             CNetAddr addr(value.toString().toStdString());
240             proxy.SetIP(addr);
241             settings.setValue("addrTor", proxy.ToStringIPPort().c_str());
242             successful = ApplyTorSettings();
243         }
244         break;
245         case TorPort: {
246             proxyType proxy;
247             proxy = CService("127.0.0.1", nSocksDefault);
248             GetProxy(NET_TOR, proxy);
249
250             proxy.SetupPort((uint16_t)value.toUInt());
251             settings.setValue("addrTor", proxy.ToStringIPPort().c_str());
252             successful = ApplyTorSettings();
253         }
254         break;
255         case TorOnly: {
256             settings.setValue("fTorOnly", value.toBool());
257             ApplyTorSettings();
258         }
259         case TorName: {
260             settings.setValue("TorName", value.toString());
261         }
262         break;
263         case ExternalSeeder:
264             settings.setValue("externalSeeder", value.toString());
265         break;
266         case Fee:
267             nTransactionFee = value.toLongLong();
268             settings.setValue("nTransactionFee", static_cast<qlonglong>(nTransactionFee));
269             emit transactionFeeChanged(nTransactionFee);
270             break;
271         case DisplayUnit:
272             nDisplayUnit = value.toInt();
273             settings.setValue("nDisplayUnit", nDisplayUnit);
274             emit displayUnitChanged(nDisplayUnit);
275             break;
276         case DisplayAddresses:
277             bDisplayAddresses = value.toBool();
278             settings.setValue("bDisplayAddresses", bDisplayAddresses);
279             break;
280         case DetachDatabases: {
281             bool fDetachDB = value.toBool();
282             bitdb.SetDetach(fDetachDB);
283             settings.setValue("detachDB", fDetachDB);
284             }
285             break;
286         case ThirdPartyTxUrls:
287             if (strThirdPartyTxUrls != value.toString()) {
288                 strThirdPartyTxUrls = value.toString();
289                 settings.setValue("strThirdPartyTxUrls", strThirdPartyTxUrls);
290             }
291             break;
292         case Language:
293             settings.setValue("language", value);
294             break;
295         case CoinControlFeatures: {
296             fCoinControlFeatures = value.toBool();
297             settings.setValue("fCoinControlFeatures", fCoinControlFeatures);
298             emit coinControlFeaturesChanged(fCoinControlFeatures);
299             }
300             break;
301         default:
302             break;
303         }
304     }
305     emit dataChanged(index, index);
306
307     return successful;
308 }
309
310 qint64 OptionsModel::getTransactionFee()
311 {
312     return nTransactionFee;
313 }
314
315 bool OptionsModel::getCoinControlFeatures()
316 {
317     return fCoinControlFeatures;
318 }
319
320 bool OptionsModel::getMinimizeToTray()
321 {
322     return fMinimizeToTray;
323 }
324
325 bool OptionsModel::getMinimizeOnClose()
326 {
327     return fMinimizeOnClose;
328 }
329
330 int OptionsModel::getDisplayUnit()
331 {
332     return nDisplayUnit;
333 }
334
335 bool OptionsModel::getDisplayAddresses()
336 {
337     return bDisplayAddresses;
338 }