устранил некоторые предупреждения компилятора
[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         (void)e;
162         // 0.6.0rc1 saved this as a CService, which causes failure when parsing as a CAddress
163         CService addrProxy, addrTor;
164         if (walletdb.ReadSetting("addrProxy", addrProxy))
165         {
166             settings.setValue("addrProxy", addrProxy.ToStringIPPort().c_str());
167             walletdb.EraseSetting("addrProxy");
168         }
169
170         if (walletdb.ReadSetting("addrTor", addrTor))
171         {
172             settings.setValue("addrTor", addrTor.ToStringIPPort().c_str());
173             walletdb.EraseSetting("addrTor");
174         }
175     }
176
177     ApplyProxySettings();
178     ApplyTorSettings();
179     Init();
180
181     return true;
182 }
183
184
185 int OptionsModel::rowCount(const QModelIndex & parent) const
186 {
187     return OptionIDRowCount;
188 }
189
190 QVariant OptionsModel::data(const QModelIndex & index, int role) const
191 {
192     if(role == Qt::EditRole)
193     {
194         QSettings settings;
195         switch(index.row())
196         {
197         case StartAtStartup:
198             return QVariant(GUIUtil::GetStartOnSystemStartup());
199         case MinimizeToTray:
200             return QVariant(fMinimizeToTray);
201         case MapPortUPnP:
202             return settings.value("fUseUPnP", GetBoolArg("-upnp", true));
203         case MinimizeOnClose:
204             return QVariant(fMinimizeOnClose);
205         case ProxyUse:
206             return settings.value("fUseProxy", false);
207         case ProxyIP: {
208             proxyType proxy;
209             if (GetProxy(NET_IPV4, proxy))
210                 return QVariant(QString::fromStdString(proxy.first.ToStringIP()));
211             else
212                 return QVariant(QString::fromStdString("127.0.0.1"));
213         }
214         case ProxyPort: {
215             proxyType proxy;
216             if (GetProxy(NET_IPV4, proxy))
217                 return QVariant(proxy.first.GetPort());
218             else
219                 return QVariant(9050);
220         }
221         case ProxySocksVersion:
222             return settings.value("nSocksVersion", 5);
223         case TorUse:
224             return settings.value("fUseTor", false);
225         case TorIP: {
226             proxyType proxy;
227             if (GetProxy(NET_TOR, proxy))
228                 return QVariant(QString::fromStdString(proxy.first.ToStringIP()));
229             else
230                 return QVariant(QString::fromStdString("127.0.0.1"));
231         }
232         case TorPort: {
233             proxyType proxy;
234             if (GetProxy(NET_TOR, proxy))
235                 return QVariant(proxy.first.GetPort());
236             else
237                 return QVariant(9050);
238         }
239         case TorOnly:
240             return settings.value("fTorOnly", false);
241         case TorName:
242             return settings.value("TorName", "");
243         case Fee:
244             return QVariant(static_cast<qlonglong>(nTransactionFee));
245         case DisplayUnit:
246             return QVariant(nDisplayUnit);
247         case DisplayAddresses:
248             return QVariant(bDisplayAddresses);
249         case ThirdPartyTxUrls:
250             return QVariant(strThirdPartyTxUrls);
251         case DetachDatabases:
252             return QVariant(bitdb.GetDetach());
253         case Language:
254             return settings.value("language", "");
255         case CoinControlFeatures:
256             return QVariant(fCoinControlFeatures);
257         default:
258             return QVariant();
259         }
260     }
261     return QVariant();
262 }
263
264 bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, int role)
265 {
266     bool successful = true; /* set to false on parse error */
267     if(role == Qt::EditRole)
268     {
269         QSettings settings;
270         switch(index.row())
271         {
272         case StartAtStartup:
273             successful = GUIUtil::SetStartOnSystemStartup(value.toBool());
274             break;
275         case MinimizeToTray:
276             fMinimizeToTray = value.toBool();
277             settings.setValue("fMinimizeToTray", fMinimizeToTray);
278             break;
279         case MapPortUPnP:
280             fUseUPnP = value.toBool();
281             settings.setValue("fUseUPnP", fUseUPnP);
282             MapPort();
283             break;
284         case MinimizeOnClose:
285             fMinimizeOnClose = value.toBool();
286             settings.setValue("fMinimizeOnClose", fMinimizeOnClose);
287             break;
288         case ProxyUse:
289             settings.setValue("fUseProxy", value.toBool());
290             ApplyProxySettings();
291             break;
292         case ProxyIP: {
293             proxyType proxy;
294             proxy.first = CService("127.0.0.1", 9050);
295             GetProxy(NET_IPV4, proxy);
296
297             CNetAddr addr(value.toString().toStdString());
298             proxy.first.SetIP(addr);
299             settings.setValue("addrProxy", proxy.first.ToStringIPPort().c_str());
300             successful = ApplyProxySettings();
301         }
302         break;
303         case ProxyPort: {
304             proxyType proxy;
305             proxy.first = CService("127.0.0.1", 9050);
306             GetProxy(NET_IPV4, proxy);
307
308             proxy.first.SetPort(value.toInt());
309             settings.setValue("addrProxy", proxy.first.ToStringIPPort().c_str());
310             successful = ApplyProxySettings();
311         }
312         break;
313         case ProxySocksVersion: {
314             proxyType proxy;
315             proxy.second = 5;
316             GetProxy(NET_IPV4, proxy);
317
318             proxy.second = value.toInt();
319             settings.setValue("nSocksVersion", proxy.second);
320             successful = ApplyProxySettings();
321         }
322         break;
323         case TorUse: {
324             settings.setValue("fUseTor", value.toBool());
325             ApplyTorSettings();
326         }
327         break;
328         case TorIP: {
329             proxyType proxy;
330             proxy.first = CService("127.0.0.1", 9050);
331             GetProxy(NET_IPV4, proxy);
332
333             CNetAddr addr(value.toString().toStdString());
334             proxy.first.SetIP(addr);
335             settings.setValue("addrTor", proxy.first.ToStringIPPort().c_str());
336             successful = ApplyTorSettings();
337         }
338         break;
339         case TorPort: {
340             proxyType proxy;
341             proxy.first = CService("127.0.0.1", 9050);
342             GetProxy(NET_IPV4, proxy);
343
344             proxy.first.SetPort(value.toInt());
345             settings.setValue("addrTor", proxy.first.ToStringIPPort().c_str());
346             successful = ApplyTorSettings();
347         }
348         break;
349         case TorOnly: {
350             settings.setValue("fTorOnly", value.toBool());
351             ApplyTorSettings();
352         }
353         case TorName: {
354             settings.setValue("TorName", value.toString());
355         }
356         break;
357         case Fee:
358             nTransactionFee = value.toLongLong();
359             settings.setValue("nTransactionFee", static_cast<qlonglong>(nTransactionFee));
360             emit transactionFeeChanged(nTransactionFee);
361             break;
362         case DisplayUnit:
363             nDisplayUnit = value.toInt();
364             settings.setValue("nDisplayUnit", nDisplayUnit);
365             emit displayUnitChanged(nDisplayUnit);
366             break;
367         case DisplayAddresses:
368             bDisplayAddresses = value.toBool();
369             settings.setValue("bDisplayAddresses", bDisplayAddresses);
370             break;
371         case DetachDatabases: {
372             bool fDetachDB = value.toBool();
373             bitdb.SetDetach(fDetachDB);
374             settings.setValue("detachDB", fDetachDB);
375             }
376             break;
377         case ThirdPartyTxUrls:
378             if (strThirdPartyTxUrls != value.toString()) {
379                 strThirdPartyTxUrls = value.toString();
380                 settings.setValue("strThirdPartyTxUrls", strThirdPartyTxUrls);
381             }
382             break;
383         case Language:
384             settings.setValue("language", value);
385             break;
386         case CoinControlFeatures: {
387             fCoinControlFeatures = value.toBool();
388             settings.setValue("fCoinControlFeatures", fCoinControlFeatures);
389             emit coinControlFeaturesChanged(fCoinControlFeatures);
390             }
391             break;
392         default:
393             break;
394         }
395     }
396     emit dataChanged(index, index);
397
398     return successful;
399 }
400
401 qint64 OptionsModel::getTransactionFee()
402 {
403     return nTransactionFee;
404 }
405
406 bool OptionsModel::getCoinControlFeatures()
407 {
408     return fCoinControlFeatures;
409 }
410
411 bool OptionsModel::getMinimizeToTray()
412 {
413     return fMinimizeToTray;
414 }
415
416 bool OptionsModel::getMinimizeOnClose()
417 {
418     return fMinimizeOnClose;
419 }
420
421 int OptionsModel::getDisplayUnit()
422 {
423     return nDisplayUnit;
424 }
425
426 bool OptionsModel::getDisplayAddresses()
427 {
428     return bDisplayAddresses;
429 }