diff --git a/src/interfaces/trackerinterface.h b/src/interfaces/trackerinterface.h --- a/src/interfaces/trackerinterface.h +++ b/src/interfaces/trackerinterface.h @@ -52,6 +52,12 @@ /// Get a string of the current tracker status QString trackerStatusString() const; + + /// Is tracker timed out + bool timeOut() const {return time_out;} + + /// Is there any warnings + bool hasWarning() const {return !warning.isEmpty();} /** * Get the update interval in ms @@ -91,6 +97,7 @@ int total_downloaded; bool enabled; TrackerStatus status; + bool time_out; QDateTime request_time; QString error; QString warning; diff --git a/src/interfaces/trackerinterface.cpp b/src/interfaces/trackerinterface.cpp --- a/src/interfaces/trackerinterface.cpp +++ b/src/interfaces/trackerinterface.cpp @@ -30,6 +30,7 @@ enabled = true; started = false; status = TRACKER_IDLE; + time_out = false; } TrackerInterface::~TrackerInterface() diff --git a/src/interfaces/trackerslist.h b/src/interfaces/trackerslist.h --- a/src/interfaces/trackerslist.h +++ b/src/interfaces/trackerslist.h @@ -28,6 +28,13 @@ struct TrackerTier; class TrackerInterface; + struct TrackersStatusInfo { + int trackers_count; + int errors; + int timeout_errors; + int warnings; + }; + /** * @author Ivan Vasić * @@ -113,6 +120,10 @@ */ virtual bool noTrackersReachable() const = 0; + /** + * Returns true if any tracker has time out error + */ + virtual TrackersStatusInfo getTrackersStatusInfo() const = 0; }; } diff --git a/src/tracker/httptracker.cpp b/src/tracker/httptracker.cpp --- a/src/tracker/httptracker.cpp +++ b/src/tracker/httptracker.cpp @@ -558,6 +558,7 @@ } #endif + time_out = false; timer.start(60*1000); status = TRACKER_ANNOUNCING; requestPending(); @@ -567,6 +568,7 @@ { if (active_job) { + time_out = true; error = i18n("Timeout contacting tracker %1", url.toString()); active_job->kill(KJob::EmitResult); } diff --git a/src/tracker/trackermanager.h b/src/tracker/trackermanager.h --- a/src/tracker/trackermanager.h +++ b/src/tracker/trackermanager.h @@ -57,6 +57,7 @@ void restoreDefault() override; void setTrackerEnabled(const QUrl &url,bool on) override; bool noTrackersReachable() const override; + TrackersStatusInfo getTrackersStatusInfo() const override; /// Get the number of seeders Uint32 getNumSeeders() const; diff --git a/src/tracker/trackermanager.cpp b/src/tracker/trackermanager.cpp --- a/src/tracker/trackermanager.cpp +++ b/src/tracker/trackermanager.cpp @@ -102,6 +102,39 @@ } } + void addTrackerStatusToInfo(const Tracker* tr, TrackersStatusInfo& info) + { + if (tr) + { + info.trackers_count++; + + if (tr->trackerStatus() == TRACKER_ERROR) { + info.errors++; + if (tr->timeOut()) + info.timeout_errors++; + } + if (tr->hasWarning()) + info.warnings++; + } + } + + TrackersStatusInfo TrackerManager::getTrackersStatusInfo() const + { + TrackersStatusInfo tsi; + tsi.trackers_count = tsi.errors = tsi.timeout_errors = tsi.warnings = 0; + + if (tor->getStats().priv_torrent) + { + addTrackerStatusToInfo(curr, tsi); + return tsi; + } + + for (PtrMap::const_iterator i = trackers.begin();i != trackers.end();++i) + if (i->second->isEnabled()) + addTrackerStatusToInfo(i->second, tsi); + return tsi; + } + void TrackerManager::setCurrentTracker(bt::TrackerInterface* t) { diff --git a/src/tracker/udptracker.cpp b/src/tracker/udptracker.cpp --- a/src/tracker/udptracker.cpp +++ b/src/tracker/udptracker.cpp @@ -267,6 +267,7 @@ int tn = 1; for (int i = 0;i < failures;i++) tn *= 2; + time_out = false; conn_timer.start(60000 * tn); } @@ -353,6 +354,7 @@ void UDPTracker::onConnTimeout() { + time_out = true; if (connection_id) { connection_id = 0;