Skip to content

Commit b2c8fc3

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 6f5d959 commit b2c8fc3

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
@@ -41,6 +41,8 @@ static const char* SettingName(OptionsModel::OptionID option)
4141
case OptionsModel::ThreadsScriptVerif: return "par";
4242
case OptionsModel::SpendZeroConfChange: return "spendzeroconfchange";
4343
case OptionsModel::ExternalSignerPath: return "signer";
44+
case OptionsModel::MapPortUPnP: return "upnp";
45+
case OptionsModel::MapPortNatpmp: return "natpmp";
4446
default: throw std::logic_error(strprintf("GUI option %i has no corresponding node setting.", option));
4547
}
4648
}
@@ -128,7 +130,8 @@ bool OptionsModel::Init(bilingual_str& error)
128130

129131
// These are shared with the core or have a command-line parameter
130132
// and we want command-line parameters to overwrite the GUI settings.
131-
for (OptionID option : {DatabaseCache, ThreadsScriptVerif, SpendZeroConfChange, ExternalSignerPath}) {
133+
for (OptionID option : {DatabaseCache, ThreadsScriptVerif, SpendZeroConfChange, ExternalSignerPath, MapPortUPnP,
134+
MapPortNatpmp}) {
132135
std::string setting = SettingName(option);
133136
if (node().isSettingIgnored(setting)) addOverriddenOption("-" + setting);
134137
try {
@@ -164,18 +167,6 @@ bool OptionsModel::Init(bilingual_str& error)
164167
#endif
165168

166169
// Network
167-
if (!settings.contains("fUseUPnP"))
168-
settings.setValue("fUseUPnP", DEFAULT_UPNP);
169-
if (!gArgs.SoftSetBoolArg("-upnp", settings.value("fUseUPnP").toBool()))
170-
addOverriddenOption("-upnp");
171-
172-
if (!settings.contains("fUseNatpmp")) {
173-
settings.setValue("fUseNatpmp", DEFAULT_NATPMP);
174-
}
175-
if (!gArgs.SoftSetBoolArg("-natpmp", settings.value("fUseNatpmp").toBool())) {
176-
addOverriddenOption("-natpmp");
177-
}
178-
179170
if (!settings.contains("fListen"))
180171
settings.setValue("fListen", DEFAULT_LISTEN);
181172
const bool listen{settings.value("fListen").toBool()};
@@ -389,13 +380,13 @@ QVariant OptionsModel::getOption(OptionID option) const
389380
return fMinimizeToTray;
390381
case MapPortUPnP:
391382
#ifdef USE_UPNP
392-
return settings.value("fUseUPnP");
383+
return SettingToBool(setting(), DEFAULT_UPNP);
393384
#else
394385
return false;
395386
#endif // USE_UPNP
396387
case MapPortNatpmp:
397388
#ifdef USE_NATPMP
398-
return settings.value("fUseNatpmp");
389+
return SettingToBool(setting(), DEFAULT_NATPMP);
399390
#else
400391
return false;
401392
#endif // USE_NATPMP
@@ -477,10 +468,16 @@ bool OptionsModel::setOption(OptionID option, const QVariant& value)
477468
settings.setValue("fMinimizeToTray", fMinimizeToTray);
478469
break;
479470
case MapPortUPnP: // core option - can be changed on-the-fly
480-
settings.setValue("fUseUPnP", value.toBool());
471+
if (changed()) {
472+
update(value.toBool());
473+
node().mapPort(value.toBool(), getOption(MapPortNatpmp).toBool());
474+
}
481475
break;
482476
case MapPortNatpmp: // core option - can be changed on-the-fly
483-
settings.setValue("fUseNatpmp", value.toBool());
477+
if (changed()) {
478+
update(value.toBool());
479+
node().mapPort(getOption(MapPortUPnP).toBool(), value.toBool());
480+
}
484481
break;
485482
case MinimizeOnClose:
486483
fMinimizeOnClose = value.toBool();
@@ -697,4 +694,6 @@ void OptionsModel::checkAndMigrate()
697694
migrate_setting(SpendZeroConfChange, "bSpendZeroConfChange");
698695
migrate_setting(ExternalSignerPath, "external_signer_path");
699696
#endif
697+
migrate_setting(MapPortUPnP, "fUseUPnP");
698+
migrate_setting(MapPortNatpmp, "fUseNatpmp");
700699
}

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)