From 7144454a1fa28ef0927108ea9df081e518ea017e 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 981917dd4..79b3f47b4 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 96def934e..75feae1cb 100644 --- a/src/base/bittorrent/sessionimpl.cpp +++ b/src/base/bittorrent/sessionimpl.cpp @@ -2190,30 +2190,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) { QStringList bannedIPs = m_bannedIPs; @@ -4651,7 +4627,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 d9bbc1a7c..3d0c3b08d 100644 --- a/src/base/bittorrent/sessionimpl.h +++ b/src/base/bittorrent/sessionimpl.h @@ -376,9 +376,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 636cf78c7..2150b6f1b 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -1138,7 +1138,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) { @@ -1902,8 +1907,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); }