diff --git a/src/core/qtlibtorrent/qbtsession.cpp b/src/core/qtlibtorrent/qbtsession.cpp index dec604684..9df1dd2f5 100644 --- a/src/core/qtlibtorrent/qbtsession.cpp +++ b/src/core/qtlibtorrent/qbtsession.cpp @@ -2516,18 +2516,21 @@ void QBtSession::handleTrackerErrorAlert(libtorrent::tracker_error_alert* p) { // Level: fatal QTorrentHandle h(p->handle); if (h.is_valid()) { + const QString hash = h.hash(); // Authentication if (p->status_code != 401) { qDebug("Received a tracker error for %s: %s", p->url.c_str(), p->msg.c_str()); const QString tracker_url = misc::toQString(p->url); - QHash trackers_data = trackersInfos.value(h.hash(), QHash()); + QHash trackers_data = trackersInfos.value(hash, QHash()); TrackerInfos data = trackers_data.value(tracker_url, TrackerInfos(tracker_url)); data.last_message = misc::toQStringU(p->msg); trackers_data.insert(tracker_url, data); - trackersInfos[h.hash()] = trackers_data; - } else { + trackersInfos[hash] = trackers_data; + } + else { emit trackerAuthenticationRequired(h); } + emit trackerError(hash, misc::toQStringU(p->url)); } } @@ -2536,13 +2539,15 @@ void QBtSession::handleTrackerReplyAlert(libtorrent::tracker_reply_alert* p) { if (h.is_valid()) { qDebug("Received a tracker reply from %s (Num_peers=%d)", p->url.c_str(), p->num_peers); // Connection was successful now. Remove possible old errors - QHash trackers_data = trackersInfos.value(h.hash(), QHash()); + const QString hash = h.hash(); + QHash trackers_data = trackersInfos.value(hash, QHash()); const QString tracker_url = misc::toQString(p->url); TrackerInfos data = trackers_data.value(tracker_url, TrackerInfos(tracker_url)); data.last_message = ""; // Reset error/warning message data.num_peers = p->num_peers; trackers_data.insert(tracker_url, data); - trackersInfos[h.hash()] = trackers_data; + trackersInfos[hash] = trackers_data; + emit trackerSuccess(hash, misc::toQStringU(p->url)); } } @@ -2550,13 +2555,15 @@ void QBtSession::handleTrackerWarningAlert(libtorrent::tracker_warning_alert* p) const QTorrentHandle h(p->handle); if (h.is_valid()) { // Connection was successful now but there is a warning message - QHash trackers_data = trackersInfos.value(h.hash(), QHash()); + const QString hash = h.hash(); + QHash trackers_data = trackersInfos.value(hash, QHash()); const QString tracker_url = misc::toQString(p->url); TrackerInfos data = trackers_data.value(tracker_url, TrackerInfos(tracker_url)); data.last_message = misc::toQStringU(p->msg); // Store warning message trackers_data.insert(tracker_url, data); - trackersInfos[h.hash()] = trackers_data; + trackersInfos[hash] = trackers_data; qDebug("Received a tracker warning from %s: %s", p->url.c_str(), p->msg.c_str()); + emit trackerWarning(hash, misc::toQStringU(p->url)); } } diff --git a/src/core/qtlibtorrent/qbtsession.h b/src/core/qtlibtorrent/qbtsession.h index bf8294402..6b4afbd8c 100644 --- a/src/core/qtlibtorrent/qbtsession.h +++ b/src/core/qtlibtorrent/qbtsession.h @@ -274,7 +274,9 @@ signals: void resumedTorrent(const QTorrentHandle& h); void finishedTorrent(const QTorrentHandle& h); void fullDiskError(const QTorrentHandle& h, QString msg); - void trackerError(const QString &hash, QString time, QString msg); + void trackerSuccess(const QString &hash, const QString &tracker); + void trackerError(const QString &hash, const QString &tracker); + void trackerWarning(const QString &hash, const QString &tracker); void trackerAuthenticationRequired(const QTorrentHandle& h); void newDownloadedTorrent(QString path, QString url); void newDownloadedTorrentFromRss(QString url); diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index 60320e287..35f857183 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -220,6 +220,9 @@ MainWindow::MainWindow(QWidget *parent) connect(QBtSession::instance(), SIGNAL(trackersAdded(const QStringList &, const QString &)), transferListFilters, SLOT(addTrackers(const QStringList &, const QString &))); connect(QBtSession::instance(), SIGNAL(trackerlessChange(bool, const QString &)), transferListFilters, SLOT(changeTrackerless(bool, const QString &))); connect(QBtSession::instance(), SIGNAL(reloadTrackersAndUrlSeeds(const QTorrentHandle &)), properties, SLOT(loadTrackers(const QTorrentHandle &))); + connect(QBtSession::instance(), SIGNAL(trackerSuccess(const QString &, const QString &)), transferListFilters, SIGNAL(trackerSuccess(const QString &, const QString &))); + connect(QBtSession::instance(), SIGNAL(trackerError(const QString &, const QString &)), transferListFilters, SIGNAL(trackerError(const QString &, const QString &))); + connect(QBtSession::instance(), SIGNAL(trackerWarning(const QString &, const QString &)), transferListFilters, SIGNAL(trackerWarning(const QString &, const QString &))); vboxLayout->addWidget(tabs); diff --git a/src/gui/transferlistfilterswidget.cpp b/src/gui/transferlistfilterswidget.cpp index a74610731..c38a1d0fa 100644 --- a/src/gui/transferlistfilterswidget.cpp +++ b/src/gui/transferlistfilterswidget.cpp @@ -419,6 +419,12 @@ TrackerFiltersList::TrackerFiltersList(QWidget *parent, TransferListWidget *tran QListWidgetItem *noTracker = new QListWidgetItem(this); noTracker->setData(Qt::DisplayRole, QVariant(tr("Trackerless (0)"))); noTracker->setData(Qt::DecorationRole, IconProvider::instance()->getIcon("network-server")); + QListWidgetItem *errorTracker = new QListWidgetItem(this); + errorTracker->setData(Qt::DisplayRole, QVariant(tr("Error (0)"))); + errorTracker->setData(Qt::DecorationRole, style()->standardIcon(QStyle::SP_MessageBoxCritical)); + QListWidgetItem *warningTracker = new QListWidgetItem(this); + warningTracker->setData(Qt::DisplayRole, QVariant(tr("Warning (0)"))); + warningTracker->setData(Qt::DecorationRole, style()->standardIcon(QStyle::SP_MessageBoxWarning)); m_trackers.insert("", QStringList()); setCurrentRow(0, QItemSelectionModel::SelectCurrent); @@ -473,8 +479,8 @@ void TrackerFiltersList::addItem(const QString &tracker, const QString &hash) return; } - Q_ASSERT(count() >= 2); - for (int i = 2; i= 4); + for (int i = 4; itext(), less))) less = (host.localeAwareCompare(item(i)->text()) < 0); @@ -500,6 +506,8 @@ void TrackerFiltersList::removeItem(const QString &tracker, const QString &hash) tmp.removeAll(hash); if (host != "") { + // Remove from 'Error' and 'Warning' view + trackerSuccess(hash, tracker); row = rowFromTracker(host); trackerItem = item(row); if (tmp.empty()) { @@ -531,6 +539,62 @@ void TrackerFiltersList::changeTrackerless(bool trackerless, const QString &hash removeItem("", hash); } +void TrackerFiltersList::trackerSuccess(const QString &hash, const QString &tracker) +{ + QStringList errored = m_errors.value(hash); + QStringList warned = m_warnings.value(hash); + + if (errored.contains(tracker)) { + errored.removeAll(tracker); + if (errored.empty()) { + m_errors.remove(hash); + item(2)->setText(tr("Error (%1)").arg(m_errors.size())); + if (currentRow() == 2) + applyFilter(2); + } + } + + if (warned.contains(tracker)) { + warned.removeAll(tracker); + if (warned.empty()) { + m_warnings.remove(hash); + item(3)->setText(tr("Warning (%1)").arg(m_warnings.size())); + if (currentRow() == 3) + applyFilter(3); + } + } +} + +void TrackerFiltersList::trackerError(const QString &hash, const QString &tracker) +{ + QStringList trackers = m_errors.value(hash); + + if (trackers.contains(tracker)) + return; + + trackers.append(tracker); + m_errors.insert(hash, trackers); + item(2)->setText(tr("Error (%1)").arg(m_errors.size())); + + if (currentRow() == 2) + applyFilter(2); +} + +void TrackerFiltersList::trackerWarning(const QString &hash, const QString &tracker) +{ + QStringList trackers = m_warnings.value(hash); + + if (trackers.contains(tracker)) + return; + + trackers.append(tracker); + m_warnings.insert(hash, trackers); + item(3)->setText(tr("Warning (%1)").arg(m_warnings.size())); + + if (currentRow() == 3) + applyFilter(3); +} + void TrackerFiltersList::handleFavicoDownload(const QString& url, const QString& filePath) { QString host = getHost(url); @@ -637,7 +701,7 @@ QString TrackerFiltersList::trackerFromRow(int row) const int TrackerFiltersList::rowFromTracker(const QString &tracker) const { Q_ASSERT(!tracker.isEmpty()); - for (int i = 2; i m_trackers; + QHash m_errors; + QHash m_warnings; DownloadThread *m_downloader; QStringList m_iconPaths; int m_totalTorrents; @@ -168,6 +175,11 @@ public slots: void removeTrackers(const QStringList &trackers, const QString &hash); void changeTrackerless(bool trackerless, const QString &hash); +signals: + void trackerSuccess(const QString &hash, const QString &tracker); + void trackerError(const QString &hash, const QString &tracker); + void trackerWarning(const QString &hash, const QString &tracker); + protected: virtual void resizeEvent(QResizeEvent *event);