From 719e4afd8c0cc1a5561e9c0e6e13f0a0a95eb5ac Mon Sep 17 00:00:00 2001 From: Vladimir Golovnev Date: Mon, 16 Jan 2023 14:43:36 +0300 Subject: [PATCH] Remove confusing helpers from Session interface Such helpers do not make practical sense, since they can be trivially implemented on top of the base interface, but at the same time they can lead to undesirable consequences when some calling code requires slightly different behavior than another. PR #18367. Fixes #18338. --- src/base/bittorrent/session.h | 3 --- src/base/bittorrent/sessionimpl.cpp | 30 +++++------------------------ src/base/bittorrent/sessionimpl.h | 3 --- src/gui/mainwindow.cpp | 20 ++++++++++++++++--- 4 files changed, 22 insertions(+), 34 deletions(-) diff --git a/src/base/bittorrent/session.h b/src/base/bittorrent/session.h index 464023f5f..f78abccf8 100644 --- a/src/base/bittorrent/session.h +++ b/src/base/bittorrent/session.h @@ -403,9 +403,6 @@ namespace BitTorrent virtual Torrent *findTorrent(const InfoHash &infoHash) const = 0; virtual QVector torrents() const = 0; virtual qsizetype torrentsCount() const = 0; - virtual bool hasActiveTorrents() const = 0; - virtual bool hasUnfinishedTorrents() const = 0; - virtual bool hasRunningSeed() const = 0; virtual const SessionStatus &status() const = 0; virtual const CacheStatus &cacheStatus() const = 0; virtual bool isListening() const = 0; diff --git a/src/base/bittorrent/sessionimpl.cpp b/src/base/bittorrent/sessionimpl.cpp index 8450b756b..14a5735fe 100644 --- a/src/base/bittorrent/sessionimpl.cpp +++ b/src/base/bittorrent/sessionimpl.cpp @@ -2228,30 +2228,6 @@ Torrent *SessionImpl::findTorrent(const InfoHash &infoHash) const return m_torrents.value(altID); } -bool SessionImpl::hasActiveTorrents() const -{ - return std::any_of(m_torrents.begin(), m_torrents.end(), [](TorrentImpl *torrent) - { - return TorrentFilter::ActiveTorrent.match(torrent); - }); -} - -bool SessionImpl::hasUnfinishedTorrents() const -{ - return std::any_of(m_torrents.begin(), m_torrents.end(), [](const TorrentImpl *torrent) - { - return (!torrent->isSeed() && !torrent->isPaused() && !torrent->isErrored() && torrent->hasMetadata()); - }); -} - -bool SessionImpl::hasRunningSeed() const -{ - return std::any_of(m_torrents.begin(), m_torrents.end(), [](const TorrentImpl *torrent) - { - return (torrent->isSeed() && !torrent->isPaused()); - }); -} - void SessionImpl::banIP(const QString &ip) { if (m_bannedIPs.get().contains(ip)) @@ -4771,7 +4747,11 @@ void SessionImpl::handleTorrentFinished(TorrentImpl *const torrent) } } - if (!hasUnfinishedTorrents()) + const bool hasUnfinishedTorrents = std::any_of(m_torrents.cbegin(), m_torrents.cend(), [](const TorrentImpl *torrent) + { + return !(torrent->isSeed() || torrent->isPaused() || torrent->isErrored()); + }); + if (!hasUnfinishedTorrents) emit allTorrentsFinished(); } diff --git a/src/base/bittorrent/sessionimpl.h b/src/base/bittorrent/sessionimpl.h index a75a47b95..e1df5ce81 100644 --- a/src/base/bittorrent/sessionimpl.h +++ b/src/base/bittorrent/sessionimpl.h @@ -380,9 +380,6 @@ namespace BitTorrent Torrent *findTorrent(const InfoHash &infoHash) const override; QVector torrents() const override; qsizetype torrentsCount() const override; - bool hasActiveTorrents() const override; - bool hasUnfinishedTorrents() const override; - bool hasRunningSeed() const override; const SessionStatus &status() const override; const CacheStatus &cacheStatus() const override; bool isListening() const override; diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index 38a2b108a..448a0ab41 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -1134,7 +1134,12 @@ void MainWindow::closeEvent(QCloseEvent *e) } #endif // Q_OS_MACOS - if (pref->confirmOnExit() && BitTorrent::Session::instance()->hasActiveTorrents()) + const QVector allTorrents = BitTorrent::Session::instance()->torrents(); + const bool hasActiveTorrents = std::any_of(allTorrents.cbegin(), allTorrents.cend(), [](BitTorrent::Torrent *torrent) + { + return torrent->isActive(); + }); + if (pref->confirmOnExit() && hasActiveTorrents) { if (e->spontaneous() || m_forceExit) { @@ -1898,8 +1903,17 @@ void MainWindow::on_actionAutoShutdown_toggled(bool enabled) void MainWindow::updatePowerManagementState() { - const bool inhibitSuspend = (Preferences::instance()->preventFromSuspendWhenDownloading() && BitTorrent::Session::instance()->hasUnfinishedTorrents()) - || (Preferences::instance()->preventFromSuspendWhenSeeding() && BitTorrent::Session::instance()->hasRunningSeed()); + const QVector allTorrents = BitTorrent::Session::instance()->torrents(); + const bool hasUnfinishedTorrents = std::any_of(allTorrents.cbegin(), allTorrents.cend(), [](const BitTorrent::Torrent *torrent) + { + return (!torrent->isSeed() && !torrent->isPaused() && !torrent->isErrored() && torrent->hasMetadata()); + }); + const bool hasRunningSeed = std::any_of(allTorrents.cbegin(), allTorrents.cend(), [](const BitTorrent::Torrent *torrent) + { + return (torrent->isSeed() && !torrent->isPaused()); + }); + const bool inhibitSuspend = (Preferences::instance()->preventFromSuspendWhenDownloading() && hasUnfinishedTorrents) + || (Preferences::instance()->preventFromSuspendWhenSeeding() && hasRunningSeed); m_pwr->setActivityState(inhibitSuspend); }