Interpret tracker "updating" status as a separate property

PR #22787.
This commit is contained in:
Vladimir Golovnev 2025-05-30 08:34:26 +03:00 committed by GitHub
parent 28c1ba869b
commit a9213627a9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 104 additions and 84 deletions

View file

@ -152,35 +152,40 @@ namespace
if (ltAnnounceInfo.updating) if (ltAnnounceInfo.updating)
{ {
trackerEndpointStatus.state = TrackerEndpointState::Updating; trackerEndpointStatus.isUpdating = true;
++numUpdating; ++numUpdating;
} }
else if (ltAnnounceInfo.fails > 0)
{
if (ltAnnounceInfo.last_error == lt::errors::tracker_failure)
{
trackerEndpointStatus.state = TrackerEndpointState::TrackerError;
++numTrackerError;
}
else if (ltAnnounceInfo.last_error == lt::errors::announce_skipped)
{
trackerEndpointStatus.state = TrackerEndpointState::Unreachable;
++numUnreachable;
}
else
{
trackerEndpointStatus.state = TrackerEndpointState::NotWorking;
++numNotWorking;
}
}
else if (nativeEntry.verified)
{
trackerEndpointStatus.state = TrackerEndpointState::Working;
++numWorking;
}
else else
{ {
trackerEndpointStatus.state = TrackerEndpointState::NotContacted; trackerEndpointStatus.isUpdating = false;
if (ltAnnounceInfo.fails > 0)
{
if (ltAnnounceInfo.last_error == lt::errors::tracker_failure)
{
trackerEndpointStatus.state = TrackerEndpointState::TrackerError;
++numTrackerError;
}
else if (ltAnnounceInfo.last_error == lt::errors::announce_skipped)
{
trackerEndpointStatus.state = TrackerEndpointState::Unreachable;
++numUnreachable;
}
else
{
trackerEndpointStatus.state = TrackerEndpointState::NotWorking;
++numNotWorking;
}
}
else if (nativeEntry.verified)
{
trackerEndpointStatus.state = TrackerEndpointState::Working;
++numWorking;
}
else
{
trackerEndpointStatus.state = TrackerEndpointState::NotContacted;
}
} }
if (!ltAnnounceInfo.message.empty()) if (!ltAnnounceInfo.message.empty())
@ -215,23 +220,28 @@ namespace
{ {
if (numUpdating > 0) if (numUpdating > 0)
{ {
trackerEntryStatus.state = TrackerEndpointState::Updating; trackerEntryStatus.isUpdating = true;
} }
else if (numWorking > 0) else
{ {
trackerEntryStatus.state = TrackerEndpointState::Working; trackerEntryStatus.isUpdating = false;
}
else if (numTrackerError > 0) if (numWorking > 0)
{ {
trackerEntryStatus.state = TrackerEndpointState::TrackerError; trackerEntryStatus.state = TrackerEndpointState::Working;
} }
else if (numUnreachable == numEndpoints) else if (numTrackerError > 0)
{ {
trackerEntryStatus.state = TrackerEndpointState::Unreachable; trackerEntryStatus.state = TrackerEndpointState::TrackerError;
} }
else if ((numUnreachable + numNotWorking) == numEndpoints) else if (numUnreachable == numEndpoints)
{ {
trackerEntryStatus.state = TrackerEndpointState::NotWorking; trackerEntryStatus.state = TrackerEndpointState::Unreachable;
}
else if ((numUnreachable + numNotWorking) == numEndpoints)
{
trackerEntryStatus.state = TrackerEndpointState::NotWorking;
}
} }
} }

View file

@ -1,6 +1,6 @@
/* /*
* Bittorrent Client using Qt and libtorrent. * Bittorrent Client using Qt and libtorrent.
* Copyright (C) 2015-2024 Vladimir Golovnev <glassez@yandex.ru> * Copyright (C) 2015-2025 Vladimir Golovnev <glassez@yandex.ru>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -41,7 +41,6 @@ namespace BitTorrent
{ {
NotContacted = 1, NotContacted = 1,
Working = 2, Working = 2,
Updating = 3,
NotWorking = 4, NotWorking = 4,
TrackerError = 5, TrackerError = 5,
Unreachable = 6 Unreachable = 6
@ -52,6 +51,7 @@ namespace BitTorrent
QString name {}; QString name {};
int btVersion = 1; int btVersion = 1;
bool isUpdating = false;
TrackerEndpointState state = TrackerEndpointState::NotContacted; TrackerEndpointState state = TrackerEndpointState::NotContacted;
QString message {}; QString message {};
@ -69,6 +69,7 @@ namespace BitTorrent
QString url {}; QString url {};
int tier = 0; int tier = 0;
bool isUpdating = false;
TrackerEndpointState state = TrackerEndpointState::NotContacted; TrackerEndpointState state = TrackerEndpointState::NotContacted;
QString message {}; QString message {};

View file

@ -73,26 +73,6 @@ namespace
return (val > -1) ? QString::number(val) : TrackerListModel::tr("N/A"); return (val > -1) ? QString::number(val) : TrackerListModel::tr("N/A");
} }
QString toString(const BitTorrent::TrackerEndpointState state)
{
switch (state)
{
case BitTorrent::TrackerEndpointState::Working:
return TrackerListModel::tr(STR_WORKING);
case BitTorrent::TrackerEndpointState::Updating:
return TrackerListModel::tr("Updating...");
case BitTorrent::TrackerEndpointState::NotWorking:
return TrackerListModel::tr("Not working");
case BitTorrent::TrackerEndpointState::TrackerError:
return TrackerListModel::tr("Tracker error");
case BitTorrent::TrackerEndpointState::Unreachable:
return TrackerListModel::tr("Unreachable");
case BitTorrent::TrackerEndpointState::NotContacted:
return TrackerListModel::tr("Not contacted yet");
}
return TrackerListModel::tr("Invalid state!");
}
QString statusDHT(const BitTorrent::Torrent *torrent) QString statusDHT(const BitTorrent::Torrent *torrent)
{ {
if (!torrent->session()->isDHTEnabled()) if (!torrent->session()->isDHTEnabled())
@ -137,6 +117,7 @@ struct TrackerListModel::Item final
QString name {}; QString name {};
int tier = -1; int tier = -1;
int btVersion = -1; int btVersion = -1;
bool isUpdating = false;
BitTorrent::TrackerEndpointState status = BitTorrent::TrackerEndpointState::NotContacted; BitTorrent::TrackerEndpointState status = BitTorrent::TrackerEndpointState::NotContacted;
QString message {}; QString message {};
@ -169,6 +150,8 @@ struct TrackerListModel::Item final
void fillFrom(const BitTorrent::TrackerEntryStatus &trackerEntryStatus); void fillFrom(const BitTorrent::TrackerEntryStatus &trackerEntryStatus);
void fillFrom(const BitTorrent::TrackerEndpointStatus &endpointStatus); void fillFrom(const BitTorrent::TrackerEndpointStatus &endpointStatus);
QString statusText() const;
}; };
class TrackerListModel::Items final : public multi_index_container< class TrackerListModel::Items final : public multi_index_container<
@ -205,6 +188,7 @@ void TrackerListModel::Item::fillFrom(const BitTorrent::TrackerEntryStatus &trac
Q_ASSERT(trackerEntryStatus.url == name); Q_ASSERT(trackerEntryStatus.url == name);
tier = trackerEntryStatus.tier; tier = trackerEntryStatus.tier;
isUpdating = trackerEntryStatus.isUpdating;
status = trackerEntryStatus.state; status = trackerEntryStatus.state;
message = trackerEntryStatus.message; message = trackerEntryStatus.message;
numPeers = trackerEntryStatus.numPeers; numPeers = trackerEntryStatus.numPeers;
@ -224,6 +208,7 @@ void TrackerListModel::Item::fillFrom(const BitTorrent::TrackerEndpointStatus &e
Q_ASSERT(endpointStatus.name == name); Q_ASSERT(endpointStatus.name == name);
Q_ASSERT(endpointStatus.btVersion == btVersion); Q_ASSERT(endpointStatus.btVersion == btVersion);
isUpdating = endpointStatus.isUpdating;
status = endpointStatus.state; status = endpointStatus.state;
message = endpointStatus.message; message = endpointStatus.message;
numPeers = endpointStatus.numPeers; numPeers = endpointStatus.numPeers;
@ -237,6 +222,28 @@ void TrackerListModel::Item::fillFrom(const BitTorrent::TrackerEndpointStatus &e
announceTimestamp = {}; announceTimestamp = {};
} }
QString TrackerListModel::Item::statusText() const
{
if (isUpdating)
return TrackerListModel::tr("Updating...");
switch (status)
{
case BitTorrent::TrackerEndpointState::Working:
return TrackerListModel::tr(STR_WORKING);
case BitTorrent::TrackerEndpointState::NotWorking:
return TrackerListModel::tr("Not working");
case BitTorrent::TrackerEndpointState::TrackerError:
return TrackerListModel::tr("Tracker error");
case BitTorrent::TrackerEndpointState::Unreachable:
return TrackerListModel::tr("Unreachable");
case BitTorrent::TrackerEndpointState::NotContacted:
return TrackerListModel::tr("Not contacted yet");
}
return TrackerListModel::tr("Invalid state!");
}
TrackerListModel::TrackerListModel(BitTorrent::Session *btSession, QObject *parent) TrackerListModel::TrackerListModel(BitTorrent::Session *btSession, QObject *parent)
: QAbstractItemModel(parent) : QAbstractItemModel(parent)
, m_btSession {btSession} , m_btSession {btSession}
@ -596,14 +603,14 @@ QVariant TrackerListModel::data(const QModelIndex &index, const int role) const
return isEndpoint ? (u'v' + QString::number(itemPtr->btVersion)) : QString(); return isEndpoint ? (u'v' + QString::number(itemPtr->btVersion)) : QString();
case COL_STATUS: case COL_STATUS:
if (isEndpoint) if (isEndpoint)
return toString(itemPtr->status); return itemPtr->statusText();
if (index.row() == ROW_DHT) if (index.row() == ROW_DHT)
return statusDHT(m_torrent); return statusDHT(m_torrent);
if (index.row() == ROW_PEX) if (index.row() == ROW_PEX)
return statusPeX(m_torrent); return statusPeX(m_torrent);
if (index.row() == ROW_LSD) if (index.row() == ROW_LSD)
return statusLSD(m_torrent); return statusLSD(m_torrent);
return toString(itemPtr->status); return itemPtr->statusText();
case COL_PEERS: case COL_PEERS:
return prettyCount(itemPtr->numPeers); return prettyCount(itemPtr->numPeers);
case COL_SEEDS: case COL_SEEDS:
@ -632,7 +639,7 @@ QVariant TrackerListModel::data(const QModelIndex &index, const int role) const
case COL_PROTOCOL: case COL_PROTOCOL:
return isEndpoint ? itemPtr->btVersion : -1; return isEndpoint ? itemPtr->btVersion : -1;
case COL_STATUS: case COL_STATUS:
return toString(itemPtr->status); return itemPtr->statusText();
case COL_PEERS: case COL_PEERS:
return itemPtr->numPeers; return itemPtr->numPeers;
case COL_SEEDS: case COL_SEEDS:

View file

@ -463,9 +463,6 @@ void TrackersFilterWidget::handleTrackerStatusesUpdated(const BitTorrent::Torren
trackerErrorHashesIt->remove(trackerEntryStatus.url); trackerErrorHashesIt->remove(trackerEntryStatus.url);
} }
break; break;
case BitTorrent::TrackerEndpointState::Updating:
break;
}; };
} }

View file

@ -64,6 +64,7 @@
// Tracker keys // Tracker keys
const QString KEY_TRACKER_URL = u"url"_s; const QString KEY_TRACKER_URL = u"url"_s;
const QString KEY_TRACKER_UPDATING = u"updating"_s;
const QString KEY_TRACKER_STATUS = u"status"_s; const QString KEY_TRACKER_STATUS = u"status"_s;
const QString KEY_TRACKER_TIER = u"tier"_s; const QString KEY_TRACKER_TIER = u"tier"_s;
const QString KEY_TRACKER_MSG = u"msg"_s; const QString KEY_TRACKER_MSG = u"msg"_s;
@ -265,6 +266,7 @@ namespace
{ {
{KEY_TRACKER_URL, tracker.url}, {KEY_TRACKER_URL, tracker.url},
{KEY_TRACKER_TIER, tracker.tier}, {KEY_TRACKER_TIER, tracker.tier},
{KEY_TRACKER_UPDATING, tracker.isUpdating},
{KEY_TRACKER_STATUS, static_cast<int>((isNotWorking ? BitTorrent::TrackerEndpointState::NotWorking : tracker.state))}, {KEY_TRACKER_STATUS, static_cast<int>((isNotWorking ? BitTorrent::TrackerEndpointState::NotWorking : tracker.state))},
{KEY_TRACKER_MSG, tracker.message}, {KEY_TRACKER_MSG, tracker.message},
{KEY_TRACKER_PEERS_COUNT, tracker.numPeers}, {KEY_TRACKER_PEERS_COUNT, tracker.numPeers},

View file

@ -81,22 +81,25 @@ window.qBittorrent.PropTrackers ??= (() => {
trackers.each((tracker) => { trackers.each((tracker) => {
let status; let status;
switch (tracker.status) {
case 0: if (tracker.updating) {
status = "QBT_TR(Disabled)QBT_TR[CONTEXT=TrackerListWidget]"; status = "QBT_TR(Updating...)QBT_TR[CONTEXT=TrackerListWidget]";
break; }
case 1: else {
status = "QBT_TR(Not contacted yet)QBT_TR[CONTEXT=TrackerListWidget]"; switch (tracker.status) {
break; case 0:
case 2: status = "QBT_TR(Disabled)QBT_TR[CONTEXT=TrackerListWidget]";
status = "QBT_TR(Working)QBT_TR[CONTEXT=TrackerListWidget]"; break;
break; case 1:
case 3: status = "QBT_TR(Not contacted yet)QBT_TR[CONTEXT=TrackerListWidget]";
status = "QBT_TR(Updating...)QBT_TR[CONTEXT=TrackerListWidget]"; break;
break; case 2:
case 4: status = "QBT_TR(Working)QBT_TR[CONTEXT=TrackerListWidget]";
status = "QBT_TR(Not working)QBT_TR[CONTEXT=TrackerListWidget]"; break;
break; case 4:
status = "QBT_TR(Not working)QBT_TR[CONTEXT=TrackerListWidget]";
break;
}
} }
const row = { const row = {