1
0
mirror of https://github.com/d47081/qBittorrent.git synced 2025-02-08 21:04:26 +00:00

Fix wrong GUI behavior in "Optional IP address to bind to" setting

Previously the address field got erroneously reset to "All addresses"
when the network interface is down.
This commit is contained in:
Chocobo1 2022-05-14 18:13:42 +08:00
parent 114c6d36d1
commit 4ce98d57dd
No known key found for this signature in database
GPG Key ID: 210D9C873253A68C

View File

@ -249,23 +249,14 @@ void AdvancedSettings::saveAdvancedSettings() const
pref->resolvePeerCountries(m_checkBoxResolveCountries.isChecked()); pref->resolvePeerCountries(m_checkBoxResolveCountries.isChecked());
pref->resolvePeerHostNames(m_checkBoxResolveHosts.isChecked()); pref->resolvePeerHostNames(m_checkBoxResolveHosts.isChecked());
// Network interface // Network interface
if (m_comboBoxInterface.currentIndex() == 0) session->setNetworkInterface(m_comboBoxInterface.currentData().toString());
{ session->setNetworkInterfaceName((m_comboBoxInterface.currentIndex() == 0)
// All interfaces (default) ? QString()
session->setNetworkInterface(QString()); : m_comboBoxInterface.currentText());
session->setNetworkInterfaceName(QString());
}
else
{
session->setNetworkInterface(m_comboBoxInterface.itemData(m_comboBoxInterface.currentIndex()).toString());
session->setNetworkInterfaceName(m_comboBoxInterface.currentText());
}
// Interface address // Interface address
// Construct a QHostAddress to filter malformed strings // Construct a QHostAddress to filter malformed strings
const QHostAddress ifaceAddr(m_comboBoxInterfaceAddress.currentData().toString().trimmed()); const QHostAddress ifaceAddr {m_comboBoxInterfaceAddress.currentData().toString()};
session->setNetworkInterfaceAddress(ifaceAddr.toString()); session->setNetworkInterfaceAddress(ifaceAddr.toString());
// Announce IP // Announce IP
// Construct a QHostAddress to filter malformed strings // Construct a QHostAddress to filter malformed strings
const QHostAddress addr(m_lineEditAnnounceIP.text().trimmed()); const QHostAddress addr(m_lineEditAnnounceIP.text().trimmed());
@ -335,45 +326,57 @@ void AdvancedSettings::updateSaveResumeDataIntervalSuffix(const int value)
void AdvancedSettings::updateInterfaceAddressCombo() void AdvancedSettings::updateInterfaceAddressCombo()
{ {
// Try to get the currently selected interface name const auto toString = [](const QHostAddress &address) -> QString
const QString ifaceName = m_comboBoxInterface.itemData(m_comboBoxInterface.currentIndex()).toString(); // Empty string for the first element
const QString currentAddress = BitTorrent::Session::instance()->networkInterfaceAddress();
// Clear all items and reinsert them, default to all
m_comboBoxInterfaceAddress.clear();
m_comboBoxInterfaceAddress.addItem(tr("All addresses"), {});
m_comboBoxInterfaceAddress.addItem(tr("All IPv4 addresses"), u"0.0.0.0"_qs);
m_comboBoxInterfaceAddress.addItem(tr("All IPv6 addresses"), u"::"_qs);
const auto populateCombo = [this](const QHostAddress &addr)
{ {
if (addr.protocol() == QAbstractSocket::IPv4Protocol) switch (address.protocol()) {
{ case QAbstractSocket::IPv4Protocol:
const QString str = addr.toString(); return address.toString();
m_comboBoxInterfaceAddress.addItem(str, str); case QAbstractSocket::IPv6Protocol:
} return Utils::Net::canonicalIPv6Addr(address).toString();
else if (addr.protocol() == QAbstractSocket::IPv6Protocol) default:
{ Q_ASSERT(false);
const QString str = Utils::Net::canonicalIPv6Addr(addr).toString(); break;
m_comboBoxInterfaceAddress.addItem(str, str);
} }
return {};
}; };
if (ifaceName.isEmpty()) // Clear all items and reinsert them
m_comboBoxInterfaceAddress.clear();
m_comboBoxInterfaceAddress.addItem(tr("All addresses"), QString());
m_comboBoxInterfaceAddress.addItem(tr("All IPv4 addresses"), QHostAddress(QHostAddress::AnyIPv4).toString());
m_comboBoxInterfaceAddress.addItem(tr("All IPv6 addresses"), QHostAddress(QHostAddress::AnyIPv6).toString());
const QString currentIface = m_comboBoxInterface.currentData().toString();
if (currentIface.isEmpty()) // `any` interface
{ {
for (const QHostAddress &addr : asConst(QNetworkInterface::allAddresses())) for (const QHostAddress &address : asConst(QNetworkInterface::allAddresses()))
populateCombo(addr); {
const QString addressString = toString(address);
m_comboBoxInterfaceAddress.addItem(addressString, addressString);
}
} }
else else
{ {
const QNetworkInterface iface = QNetworkInterface::interfaceFromName(ifaceName); const QList<QNetworkAddressEntry> addresses = QNetworkInterface::interfaceFromName(currentIface).addressEntries();
const QList<QNetworkAddressEntry> addresses = iface.addressEntries();
for (const QNetworkAddressEntry &entry : addresses) for (const QNetworkAddressEntry &entry : addresses)
populateCombo(entry.ip()); {
const QString addressString = toString(entry.ip());
m_comboBoxInterfaceAddress.addItem(addressString, addressString);
}
} }
const QString currentAddress = BitTorrent::Session::instance()->networkInterfaceAddress();
const int index = m_comboBoxInterfaceAddress.findData(currentAddress); const int index = m_comboBoxInterfaceAddress.findData(currentAddress);
m_comboBoxInterfaceAddress.setCurrentIndex(std::max(index, 0)); if (index > -1)
{
m_comboBoxInterfaceAddress.setCurrentIndex(index);
}
else
{
// not found, for the sake of UI consistency, add such entry
m_comboBoxInterfaceAddress.addItem(currentAddress, currentAddress);
m_comboBoxInterfaceAddress.setCurrentIndex(m_comboBoxInterfaceAddress.count() - 1);
}
} }
void AdvancedSettings::loadAdvancedSettings() void AdvancedSettings::loadAdvancedSettings()
@ -627,26 +630,23 @@ void AdvancedSettings::loadAdvancedSettings()
m_checkBoxResolveHosts.setChecked(pref->resolvePeerHostNames()); m_checkBoxResolveHosts.setChecked(pref->resolvePeerHostNames());
addRow(RESOLVE_HOSTS, tr("Resolve peer host names"), &m_checkBoxResolveHosts); addRow(RESOLVE_HOSTS, tr("Resolve peer host names"), &m_checkBoxResolveHosts);
// Network interface // Network interface
m_comboBoxInterface.addItem(tr("Any interface", "i.e. Any network interface")); m_comboBoxInterface.addItem(tr("Any interface", "i.e. Any network interface"), QString());
const QString currentInterface = session->networkInterface();
bool interfaceExists = currentInterface.isEmpty();
int i = 1;
for (const QNetworkInterface &iface : asConst(QNetworkInterface::allInterfaces())) for (const QNetworkInterface &iface : asConst(QNetworkInterface::allInterfaces()))
{
m_comboBoxInterface.addItem(iface.humanReadableName(), iface.name()); m_comboBoxInterface.addItem(iface.humanReadableName(), iface.name());
if (!currentInterface.isEmpty() && (iface.name() == currentInterface))
{ const QString currentInterface = session->networkInterface();
m_comboBoxInterface.setCurrentIndex(i); const int ifaceIndex = m_comboBoxInterface.findData(currentInterface);
interfaceExists = true; if (ifaceIndex > -1)
}
++i;
}
// Saved interface does not exist, show it anyway
if (!interfaceExists)
{ {
m_comboBoxInterface.addItem(session->networkInterfaceName(), currentInterface); m_comboBoxInterface.setCurrentIndex(ifaceIndex);
m_comboBoxInterface.setCurrentIndex(i);
} }
else
{
// Saved interface does not exist, show it
m_comboBoxInterface.addItem(session->networkInterfaceName(), currentInterface);
m_comboBoxInterface.setCurrentIndex(m_comboBoxInterface.count() - 1);
}
connect(&m_comboBoxInterface, qOverload<int>(&QComboBox::currentIndexChanged) connect(&m_comboBoxInterface, qOverload<int>(&QComboBox::currentIndexChanged)
, this, &AdvancedSettings::updateInterfaceAddressCombo); , this, &AdvancedSettings::updateInterfaceAddressCombo);
addRow(NETWORK_IFACE, tr("Network interface"), &m_comboBoxInterface); addRow(NETWORK_IFACE, tr("Network interface"), &m_comboBoxInterface);