mirror of
https://github.com/qbittorrent/qBittorrent
synced 2025-08-25 07:35:24 -07:00
Properly handle metadata download for an existing torrent
This commit is contained in:
parent
6dab4615aa
commit
049e376953
1 changed files with 30 additions and 8 deletions
|
@ -236,6 +236,14 @@ namespace
|
||||||
status.pieces = params.have_pieces;
|
status.pieces = params.have_pieces;
|
||||||
status.verified_pieces = params.verified_pieces;
|
status.verified_pieces = params.verified_pieces;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Vector>
|
||||||
|
Vector resized(const Vector &inVector, const typename Vector::size_type size, const typename Vector::value_type &defaultValue)
|
||||||
|
{
|
||||||
|
Vector outVector = inVector;
|
||||||
|
outVector.resize(size, defaultValue);
|
||||||
|
return outVector;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TorrentImpl
|
// TorrentImpl
|
||||||
|
@ -1504,27 +1512,22 @@ void TorrentImpl::fileSearchFinished(const QString &savePath, const QStringList
|
||||||
void TorrentImpl::endReceivedMetadataHandling(const QString &savePath, const QStringList &fileNames)
|
void TorrentImpl::endReceivedMetadataHandling(const QString &savePath, const QStringList &fileNames)
|
||||||
{
|
{
|
||||||
Q_ASSERT(m_filePaths.isEmpty());
|
Q_ASSERT(m_filePaths.isEmpty());
|
||||||
Q_ASSERT(m_indexMap.isEmpty());
|
|
||||||
|
|
||||||
lt::add_torrent_params &p = m_ltAddTorrentParams;
|
lt::add_torrent_params &p = m_ltAddTorrentParams;
|
||||||
|
|
||||||
const std::shared_ptr<lt::torrent_info> metadata = std::const_pointer_cast<lt::torrent_info>(m_nativeHandle.torrent_file());
|
const std::shared_ptr<lt::torrent_info> metadata = std::const_pointer_cast<lt::torrent_info>(m_nativeHandle.torrent_file());
|
||||||
m_torrentInfo = TorrentInfo(*metadata);
|
m_torrentInfo = TorrentInfo(*metadata);
|
||||||
m_filePaths = fileNames;
|
m_filePaths = fileNames;
|
||||||
m_indexMap.reserve(filesCount());
|
|
||||||
const auto nativeIndexes = m_torrentInfo.nativeIndexes();
|
const auto nativeIndexes = m_torrentInfo.nativeIndexes();
|
||||||
for (int i = 0; i < fileNames.size(); ++i)
|
for (int i = 0; i < fileNames.size(); ++i)
|
||||||
{
|
{
|
||||||
const auto nativeIndex = nativeIndexes.at(i);
|
const auto nativeIndex = nativeIndexes.at(i);
|
||||||
m_indexMap[nativeIndex] = i;
|
|
||||||
p.renamed_files[nativeIndex] = fileNames[i].toStdString();
|
p.renamed_files[nativeIndex] = fileNames[i].toStdString();
|
||||||
}
|
}
|
||||||
p.save_path = Utils::Fs::toNativePath(savePath).toStdString();
|
p.save_path = Utils::Fs::toNativePath(savePath).toStdString();
|
||||||
p.ti = metadata;
|
p.ti = metadata;
|
||||||
|
p.file_priorities = resized(p.file_priorities, metadata->files().num_files()
|
||||||
const int internalFilesCount = p.ti->files().num_files(); // including .pad files
|
, LT::toNative(p.file_priorities.empty() ? DownloadPriority::Normal : DownloadPriority::Ignored));
|
||||||
// Use qBittorrent default priority rather than libtorrent's (4)
|
|
||||||
p.file_priorities = std::vector(internalFilesCount, LT::toNative(DownloadPriority::Normal));
|
|
||||||
|
|
||||||
reload();
|
reload();
|
||||||
|
|
||||||
|
@ -1566,7 +1569,8 @@ void TorrentImpl::reload()
|
||||||
}
|
}
|
||||||
|
|
||||||
m_nativeHandle = m_nativeSession->add_torrent(p);
|
m_nativeHandle = m_nativeSession->add_torrent(p);
|
||||||
m_nativeHandle.queue_position_set(queuePos);
|
if (queuePos >= lt::queue_position_t {})
|
||||||
|
m_nativeHandle.queue_position_set(queuePos);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TorrentImpl::pause()
|
void TorrentImpl::pause()
|
||||||
|
@ -1781,6 +1785,8 @@ void TorrentImpl::handleSaveResumeDataAlert(const lt::save_resume_data_alert *p)
|
||||||
{
|
{
|
||||||
if (m_maintenanceJob == MaintenanceJob::HandleMetadata)
|
if (m_maintenanceJob == MaintenanceJob::HandleMetadata)
|
||||||
{
|
{
|
||||||
|
Q_ASSERT(m_indexMap.isEmpty());
|
||||||
|
|
||||||
m_ltAddTorrentParams = p->params;
|
m_ltAddTorrentParams = p->params;
|
||||||
|
|
||||||
m_ltAddTorrentParams.have_pieces.clear();
|
m_ltAddTorrentParams.have_pieces.clear();
|
||||||
|
@ -1790,6 +1796,19 @@ void TorrentImpl::handleSaveResumeDataAlert(const lt::save_resume_data_alert *p)
|
||||||
|
|
||||||
QStringList filePaths = metadata.filePaths();
|
QStringList filePaths = metadata.filePaths();
|
||||||
applyContentLayout(filePaths, m_contentLayout);
|
applyContentLayout(filePaths, m_contentLayout);
|
||||||
|
|
||||||
|
const auto nativeIndexes = metadata.nativeIndexes();
|
||||||
|
const auto &renamedFiles = m_ltAddTorrentParams.renamed_files;
|
||||||
|
m_indexMap.reserve(filePaths.size());
|
||||||
|
for (int i = 0; i < filePaths.size(); ++i)
|
||||||
|
{
|
||||||
|
const auto nativeIndex = nativeIndexes.at(i);
|
||||||
|
m_indexMap[nativeIndex] = i;
|
||||||
|
|
||||||
|
if (const auto it = renamedFiles.find(nativeIndex); it != renamedFiles.cend())
|
||||||
|
filePaths[i] = QString::fromStdString(it->second);
|
||||||
|
}
|
||||||
|
|
||||||
m_session->findIncompleteFiles(metadata, savePath(), downloadPath(), filePaths);
|
m_session->findIncompleteFiles(metadata, savePath(), downloadPath(), filePaths);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1929,6 +1948,9 @@ void TorrentImpl::handleFileRenameFailedAlert(const lt::file_rename_failed_alert
|
||||||
|
|
||||||
void TorrentImpl::handleFileCompletedAlert(const lt::file_completed_alert *p)
|
void TorrentImpl::handleFileCompletedAlert(const lt::file_completed_alert *p)
|
||||||
{
|
{
|
||||||
|
if (m_maintenanceJob == MaintenanceJob::HandleMetadata)
|
||||||
|
return;
|
||||||
|
|
||||||
if (m_session->isAppendExtensionEnabled())
|
if (m_session->isAppendExtensionEnabled())
|
||||||
{
|
{
|
||||||
const int fileIndex = m_indexMap.value(p->index, -1);
|
const int fileIndex = m_indexMap.value(p->index, -1);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue