Skip to content

Commit 29e371d

Browse files
committed
Migrate -upnp and -natpmp settings from QSettings to settings.json
This also effectively reverts 58e8364 from #18077, applying upnp and natpmp settings from the optionsmodel class instead of the optionsdialog class. This makes sense because model code, not view code is responsible for applying all other settings, and because leaving these settings half-applied in optionsmodel seems error prone and could lead to bugs. (These things were discussed a little in bitcoin/bitcoin#18077 (comment))
1 parent 6a979b9 commit 29e371d

File tree

3 files changed

+18
-22
lines changed

3 files changed

+18
-22
lines changed

src/qt/optionsdialog.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
#include <QIntValidator>
2727
#include <QLocale>
2828
#include <QMessageBox>
29-
#include <QSettings>
3029
#include <QSystemTrayIcon>
3130
#include <QTimer>
3231

@@ -56,10 +55,6 @@ OptionsDialog::OptionsDialog(QWidget *parent, bool enableWallet) :
5655
#ifndef USE_NATPMP
5756
ui->mapPortNatpmp->setEnabled(false);
5857
#endif
59-
connect(this, &QDialog::accepted, [this](){
60-
QSettings settings;
61-
model->node().mapPort(settings.value("fUseUPnP").toBool(), settings.value("fUseNatpmp").toBool());
62-
});
6358

6459
ui->proxyIp->setEnabled(false);
6560
ui->proxyPort->setEnabled(false);

src/qt/optionsmodel.cpp

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ const char* SettingName(OptionsModel::OptionID option)
4040
case OptionsModel::ThreadsScriptVerif: return "par";
4141
case OptionsModel::SpendZeroConfChange: return "spendzeroconfchange";
4242
case OptionsModel::ExternalSignerPath: return "signer";
43+
case OptionsModel::MapPortUPnP: return "upnp";
44+
case OptionsModel::MapPortNatpmp: return "natpmp";
4345
default: throw std::logic_error(strprintf("GUI option %i has no corresponding node setting.", option));
4446
};
4547
}
@@ -123,7 +125,8 @@ bool OptionsModel::Init(bilingual_str& error)
123125

124126
// These are shared with the core or have a command-line parameter
125127
// and we want command-line parameters to overwrite the GUI settings.
126-
for (OptionID option : {DatabaseCache, ThreadsScriptVerif, SpendZeroConfChange, ExternalSignerPath}) {
128+
for (OptionID option : {DatabaseCache, ThreadsScriptVerif, SpendZeroConfChange, ExternalSignerPath, MapPortUPnP,
129+
MapPortNatpmp}) {
127130
std::string setting = SettingName(option);
128131
if (node().isSettingIgnored(setting)) addOverriddenOption("-" + setting);
129132
try {
@@ -159,18 +162,6 @@ bool OptionsModel::Init(bilingual_str& error)
159162
#endif
160163

161164
// Network
162-
if (!settings.contains("fUseUPnP"))
163-
settings.setValue("fUseUPnP", DEFAULT_UPNP);
164-
if (!gArgs.SoftSetBoolArg("-upnp", settings.value("fUseUPnP").toBool()))
165-
addOverriddenOption("-upnp");
166-
167-
if (!settings.contains("fUseNatpmp")) {
168-
settings.setValue("fUseNatpmp", DEFAULT_NATPMP);
169-
}
170-
if (!gArgs.SoftSetBoolArg("-natpmp", settings.value("fUseNatpmp").toBool())) {
171-
addOverriddenOption("-natpmp");
172-
}
173-
174165
if (!settings.contains("fListen"))
175166
settings.setValue("fListen", DEFAULT_LISTEN);
176167
const bool listen{settings.value("fListen").toBool()};
@@ -384,13 +375,13 @@ QVariant OptionsModel::getOption(OptionID option) const
384375
return fMinimizeToTray;
385376
case MapPortUPnP:
386377
#ifdef USE_UPNP
387-
return settings.value("fUseUPnP");
378+
return SettingToBool(setting(), DEFAULT_UPNP);
388379
#else
389380
return false;
390381
#endif // USE_UPNP
391382
case MapPortNatpmp:
392383
#ifdef USE_NATPMP
393-
return settings.value("fUseNatpmp");
384+
return SettingToBool(setting(), DEFAULT_NATPMP);
394385
#else
395386
return false;
396387
#endif // USE_NATPMP
@@ -472,10 +463,16 @@ bool OptionsModel::setOption(OptionID option, const QVariant& value)
472463
settings.setValue("fMinimizeToTray", fMinimizeToTray);
473464
break;
474465
case MapPortUPnP: // core option - can be changed on-the-fly
475-
settings.setValue("fUseUPnP", value.toBool());
466+
if (changed()) {
467+
update(value.toBool());
468+
node().mapPort(value.toBool(), getOption(MapPortNatpmp).toBool());
469+
}
476470
break;
477471
case MapPortNatpmp: // core option - can be changed on-the-fly
478-
settings.setValue("fUseNatpmp", value.toBool());
472+
if (changed()) {
473+
update(value.toBool());
474+
node().mapPort(getOption(MapPortUPnP).toBool(), value.toBool());
475+
}
479476
break;
480477
case MinimizeOnClose:
481478
fMinimizeOnClose = value.toBool();
@@ -692,4 +689,6 @@ void OptionsModel::checkAndMigrate()
692689
migrate_setting(SpendZeroConfChange, "bSpendZeroConfChange");
693690
migrate_setting(ExternalSignerPath, "external_signer_path");
694691
#endif
692+
migrate_setting(MapPortUPnP, "fUseUPnP");
693+
migrate_setting(MapPortNatpmp, "fUseNatpmp");
695694
}

src/qt/test/optiontests.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ void OptionTests::migrateSettings()
3535
QSettings settings;
3636
settings.setValue("nDatabaseCache", 600);
3737
settings.setValue("nThreadsScriptVerif", 12);
38+
settings.setValue("fUseUPnP", false);
3839

3940
settings.sync();
4041

@@ -43,6 +44,7 @@ void OptionTests::migrateSettings()
4344
QVERIFY(options.Init(error));
4445
QVERIFY(!settings.contains("nDatabaseCache"));
4546
QVERIFY(!settings.contains("nThreadsScriptVerif"));
47+
QVERIFY(!settings.contains("fUseUPnP"));
4648

4749
std::ifstream file(gArgs.GetDataDirNet() / "settings.json");
4850
QCOMPARE(std::string(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>()).c_str(), "{\n"

0 commit comments

Comments
 (0)