Skip to content

Commit d2ada6e

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 1dc4fc2 commit d2ada6e

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 {
@@ -165,18 +168,6 @@ bool OptionsModel::Init(bilingual_str& error)
165168
#endif
166169

167170
// Network
168-
if (!settings.contains("fUseUPnP"))
169-
settings.setValue("fUseUPnP", DEFAULT_UPNP);
170-
if (!gArgs.SoftSetBoolArg("-upnp", settings.value("fUseUPnP").toBool()))
171-
addOverriddenOption("-upnp");
172-
173-
if (!settings.contains("fUseNatpmp")) {
174-
settings.setValue("fUseNatpmp", DEFAULT_NATPMP);
175-
}
176-
if (!gArgs.SoftSetBoolArg("-natpmp", settings.value("fUseNatpmp").toBool())) {
177-
addOverriddenOption("-natpmp");
178-
}
179-
180171
if (!settings.contains("fListen"))
181172
settings.setValue("fListen", DEFAULT_LISTEN);
182173
const bool listen{settings.value("fListen").toBool()};
@@ -390,13 +381,13 @@ QVariant OptionsModel::getOption(OptionID option) const
390381
return fMinimizeToTray;
391382
case MapPortUPnP:
392383
#ifdef USE_UPNP
393-
return settings.value("fUseUPnP");
384+
return SettingToBool(setting(), DEFAULT_UPNP);
394385
#else
395386
return false;
396387
#endif // USE_UPNP
397388
case MapPortNatpmp:
398389
#ifdef USE_NATPMP
399-
return settings.value("fUseNatpmp");
390+
return SettingToBool(setting(), DEFAULT_NATPMP);
400391
#else
401392
return false;
402393
#endif // USE_NATPMP
@@ -478,10 +469,16 @@ bool OptionsModel::setOption(OptionID option, const QVariant& value)
478469
settings.setValue("fMinimizeToTray", fMinimizeToTray);
479470
break;
480471
case MapPortUPnP: // core option - can be changed on-the-fly
481-
settings.setValue("fUseUPnP", value.toBool());
472+
if (changed()) {
473+
update(value.toBool());
474+
node().mapPort(value.toBool(), getOption(MapPortNatpmp).toBool());
475+
}
482476
break;
483477
case MapPortNatpmp: // core option - can be changed on-the-fly
484-
settings.setValue("fUseNatpmp", value.toBool());
478+
if (changed()) {
479+
update(value.toBool());
480+
node().mapPort(getOption(MapPortUPnP).toBool(), value.toBool());
481+
}
485482
break;
486483
case MinimizeOnClose:
487484
fMinimizeOnClose = value.toBool();
@@ -698,4 +695,6 @@ void OptionsModel::checkAndMigrate()
698695
migrate_setting(SpendZeroConfChange, "bSpendZeroConfChange");
699696
migrate_setting(ExternalSignerPath, "external_signer_path");
700697
#endif
698+
migrate_setting(MapPortUPnP, "fUseUPnP");
699+
migrate_setting(MapPortNatpmp, "fUseNatpmp");
701700
}

src/qt/test/optiontests.cpp

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

3839
settings.sync();
3940

@@ -42,6 +43,7 @@ void OptionTests::migrateSettings()
4243
QVERIFY(options.Init(error));
4344
QVERIFY(!settings.contains("nDatabaseCache"));
4445
QVERIFY(!settings.contains("nThreadsScriptVerif"));
46+
QVERIFY(!settings.contains("fUseUPnP"));
4547

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

0 commit comments

Comments
 (0)