From da75a010c757ebf755692095d2bfd7849c58e913 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Wed, 9 May 2018 22:10:47 +0800 Subject: [PATCH 1/2] Refactor code Add const to variables. Add Logger message. Simplify code logic. --- src/base/bittorrent/torrenthandle.cpp | 76 +++++++++++++-------------- src/base/bittorrent/torrenthandle.h | 2 +- 2 files changed, 37 insertions(+), 41 deletions(-) diff --git a/src/base/bittorrent/torrenthandle.cpp b/src/base/bittorrent/torrenthandle.cpp index bc7cf1318..e9536caa0 100644 --- a/src/base/bittorrent/torrenthandle.cpp +++ b/src/base/bittorrent/torrenthandle.cpp @@ -776,28 +776,22 @@ bool TorrentHandle::hasFirstLastPiecePriority() const if (!hasMetadata()) return m_needsToSetFirstLastPiecePriority; - // Get int first media file - std::vector fp; - fp = m_nativeHandle.file_priorities(); + const std::vector filePriorities = nativeHandle().file_priorities(); + for (int i = 0; i < static_cast(filePriorities.size()); ++i) { + if (filePriorities[i] <= 0) + continue; - TorrentInfo::PieceRange extremities; - bool found = false; - int count = static_cast(fp.size()); - for (int i = 0; i < count; ++i) { const QString ext = Utils::Fs::fileExtension(filePath(i)); - if (Utils::Misc::isPreviewable(ext) && (fp[i] > 0)) { - extremities = info().filePieces(i); - found = true; - break; - } + if (!Utils::Misc::isPreviewable(ext)) + continue; + + const TorrentInfo::PieceRange extremities = info().filePieces(i); + const int firstPiecePrio = nativeHandle().piece_priority(extremities.first()); + const int lastPiecePrio = nativeHandle().piece_priority(extremities.last()); + return ((firstPiecePrio == 7) && (lastPiecePrio == 7)); } - if (!found) return false; // No media file - - int first = m_nativeHandle.piece_priority(extremities.first()); - int last = m_nativeHandle.piece_priority(extremities.last()); - - return ((first == 7) && (last == 7)); + return false; } TorrentState TorrentHandle::state() const @@ -1294,39 +1288,41 @@ void TorrentHandle::toggleSequentialDownload() setSequentialDownload(!isSequentialDownload()); } -void TorrentHandle::setFirstLastPiecePriority(bool b) +void TorrentHandle::setFirstLastPiecePriority(const bool enabled) { if (!hasMetadata()) { - m_needsToSetFirstLastPiecePriority = b; + m_needsToSetFirstLastPiecePriority = enabled; return; } - std::vector fp = m_nativeHandle.file_priorities(); - std::vector pp = m_nativeHandle.piece_priorities(); + // Download first and last pieces first for every file in the torrent + const std::vector filePriorities = nativeHandle().file_priorities(); + std::vector piecePriorities = nativeHandle().piece_priorities(); + for (int index = 0; index < static_cast(filePriorities.size()); ++index) { + const int filePrio = filePriorities[index]; + if (filePrio <= 0) + continue; - // Download first and last pieces first for all media files in the torrent - int nbfiles = static_cast(fp.size()); - for (int index = 0; index < nbfiles; ++index) { - const QString path = filePath(index); - const QString ext = Utils::Fs::fileExtension(path); - if (Utils::Misc::isPreviewable(ext) && (fp[index] > 0)) { - qDebug() << "File" << path << "is previewable, toggle downloading of first/last pieces first"; + const QString ext = Utils::Fs::fileExtension(filePath(index)); + if (!Utils::Misc::isPreviewable(ext)) + continue; - // Determine the priority to set - int prio = b ? 7 : fp[index]; + // Determine the priority to set + const int newPrio = enabled ? 7 : filePrio; + const TorrentInfo::PieceRange extremities = info().filePieces(index); - TorrentInfo::PieceRange extremities = info().filePieces(index); - - // worst case: AVI index = 1% of total file size (at the end of the file) - int nNumPieces = ceil(fileSize(index) * 0.01 / pieceLength()); - for (int i = 0; i < nNumPieces; ++i) { - pp[extremities.first() + i] = prio; - pp[extremities.last() - i] = prio; - } + // worst case: AVI index = 1% of total file size (at the end of the file) + const int nNumPieces = std::ceil(fileSize(index) * 0.01 / pieceLength()); + for (int i = 0; i < nNumPieces; ++i) { + piecePriorities[extremities.first() + i] = newPrio; + piecePriorities[extremities.last() - i] = newPrio; } } - m_nativeHandle.prioritize_pieces(pp); + m_nativeHandle.prioritize_pieces(piecePriorities); + + LogMsg(tr("Download first and last piece first: %1, torrent: '%2'") + .arg((enabled ? tr("On") : tr("Off")), name())); } void TorrentHandle::toggleFirstLastPiecePriority() diff --git a/src/base/bittorrent/torrenthandle.h b/src/base/bittorrent/torrenthandle.h index 32a6842fc..986d173bb 100644 --- a/src/base/bittorrent/torrenthandle.h +++ b/src/base/bittorrent/torrenthandle.h @@ -331,7 +331,7 @@ namespace BitTorrent void setName(const QString &name); void setSequentialDownload(bool b); void toggleSequentialDownload(); - void setFirstLastPiecePriority(bool b); + void setFirstLastPiecePriority(bool enabled); void toggleFirstLastPiecePriority(); void pause(); void resume(bool forced = false); From 95b19ec30391bbac786b7ddec6c92efef35908ab Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Thu, 10 May 2018 05:43:27 +0800 Subject: [PATCH 2/2] Relax behavior of "Download first and last piece first" Now it applies the setting to all files in torrent, no matter whether the file is previewable or not. Torrent client shouldn't be smart by deciding which file this option will be applied to, i.e. it should just follow the user's decision. --- src/base/bittorrent/torrenthandle.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/base/bittorrent/torrenthandle.cpp b/src/base/bittorrent/torrenthandle.cpp index e9536caa0..27549b36b 100644 --- a/src/base/bittorrent/torrenthandle.cpp +++ b/src/base/bittorrent/torrenthandle.cpp @@ -781,10 +781,6 @@ bool TorrentHandle::hasFirstLastPiecePriority() const if (filePriorities[i] <= 0) continue; - const QString ext = Utils::Fs::fileExtension(filePath(i)); - if (!Utils::Misc::isPreviewable(ext)) - continue; - const TorrentInfo::PieceRange extremities = info().filePieces(i); const int firstPiecePrio = nativeHandle().piece_priority(extremities.first()); const int lastPiecePrio = nativeHandle().piece_priority(extremities.last()); @@ -1303,10 +1299,6 @@ void TorrentHandle::setFirstLastPiecePriority(const bool enabled) if (filePrio <= 0) continue; - const QString ext = Utils::Fs::fileExtension(filePath(index)); - if (!Utils::Misc::isPreviewable(ext)) - continue; - // Determine the priority to set const int newPrio = enabled ? 7 : filePrio; const TorrentInfo::PieceRange extremities = info().filePieces(index);