mirror of
https://github.com/d47081/qBittorrent.git
synced 2025-01-11 07:18:08 +00:00
Clean up metadata downloading code
This commit is contained in:
parent
82716d8014
commit
0e8feed2f2
@ -1892,12 +1892,12 @@ bool Session::deleteTorrent(const InfoHash &hash, const DeleteOption deleteOptio
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Session::cancelLoadMetadata(const InfoHash &hash)
|
bool Session::cancelDownloadMetadata(const InfoHash &hash)
|
||||||
{
|
{
|
||||||
const auto loadedMetadataIter = m_loadedMetadata.find(hash);
|
const auto downloadedMetadataIter = m_downloadedMetadata.find(hash);
|
||||||
if (loadedMetadataIter == m_loadedMetadata.end()) return false;
|
if (downloadedMetadataIter == m_downloadedMetadata.end()) return false;
|
||||||
|
|
||||||
m_loadedMetadata.erase(loadedMetadataIter);
|
m_downloadedMetadata.erase(downloadedMetadataIter);
|
||||||
--m_extraLimit;
|
--m_extraLimit;
|
||||||
adjustLimits();
|
adjustLimits();
|
||||||
m_nativeSession->remove_torrent(m_nativeSession->find_torrent(hash), lt::session::delete_files);
|
m_nativeSession->remove_torrent(m_nativeSession->find_torrent(hash), lt::session::delete_files);
|
||||||
@ -1951,7 +1951,7 @@ void Session::decreaseTorrentsQueuePos(const QVector<InfoHash> &hashes)
|
|||||||
torrentQueue.pop();
|
torrentQueue.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto i = m_loadedMetadata.cbegin(); i != m_loadedMetadata.cend(); ++i)
|
for (auto i = m_downloadedMetadata.cbegin(); i != m_downloadedMetadata.cend(); ++i)
|
||||||
torrentQueuePositionBottom(m_nativeSession->find_torrent(*i));
|
torrentQueuePositionBottom(m_nativeSession->find_torrent(*i));
|
||||||
|
|
||||||
saveTorrentsQueue();
|
saveTorrentsQueue();
|
||||||
@ -2004,7 +2004,7 @@ void Session::bottomTorrentsQueuePos(const QVector<InfoHash> &hashes)
|
|||||||
torrentQueue.pop();
|
torrentQueue.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto i = m_loadedMetadata.cbegin(); i != m_loadedMetadata.cend(); ++i)
|
for (auto i = m_downloadedMetadata.cbegin(); i != m_downloadedMetadata.cend(); ++i)
|
||||||
torrentQueuePositionBottom(m_nativeSession->find_torrent(*i));
|
torrentQueuePositionBottom(m_nativeSession->find_torrent(*i));
|
||||||
|
|
||||||
saveTorrentsQueue();
|
saveTorrentsQueue();
|
||||||
@ -2058,21 +2058,6 @@ bool Session::addTorrent(const MagnetUri &magnetUri, const AddTorrentParams &par
|
|||||||
{
|
{
|
||||||
if (!magnetUri.isValid()) return false;
|
if (!magnetUri.isValid()) return false;
|
||||||
|
|
||||||
const InfoHash hash = magnetUri.hash();
|
|
||||||
|
|
||||||
const auto it = m_loadedMetadata.constFind(hash);
|
|
||||||
if (it != m_loadedMetadata.constEnd())
|
|
||||||
{
|
|
||||||
// It looks illogical that we don't just use an existing handle,
|
|
||||||
// but as previous experience has shown, it actually creates unnecessary
|
|
||||||
// problems and unwanted behavior due to the fact that it was originally
|
|
||||||
// added with parameters other than those provided by the user.
|
|
||||||
m_loadedMetadata.erase(it);
|
|
||||||
--m_extraLimit;
|
|
||||||
adjustLimits();
|
|
||||||
m_nativeSession->remove_torrent(m_nativeSession->find_torrent(hash), lt::session::delete_files);
|
|
||||||
}
|
|
||||||
|
|
||||||
return addTorrent_impl(params, magnetUri);
|
return addTorrent_impl(params, magnetUri);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2126,9 +2111,15 @@ bool Session::addTorrent_impl(const AddTorrentParams &addTorrentParams, const Ma
|
|||||||
const bool hasMetadata = metadata.isValid();
|
const bool hasMetadata = metadata.isValid();
|
||||||
const InfoHash hash = (hasMetadata ? metadata.hash() : magnetUri.hash());
|
const InfoHash hash = (hasMetadata ? metadata.hash() : magnetUri.hash());
|
||||||
|
|
||||||
|
// It looks illogical that we don't just use an existing handle,
|
||||||
|
// but as previous experience has shown, it actually creates unnecessary
|
||||||
|
// problems and unwanted behavior due to the fact that it was originally
|
||||||
|
// added with parameters other than those provided by the user.
|
||||||
|
cancelDownloadMetadata(hash);
|
||||||
|
|
||||||
// We should not add the torrent if it is already
|
// We should not add the torrent if it is already
|
||||||
// processed or is pending to add to session
|
// processed or is pending to add to session
|
||||||
if (m_loadingTorrents.contains(hash) || m_loadedMetadata.contains(hash))
|
if (m_loadingTorrents.contains(hash))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
TorrentHandleImpl *const torrent = m_torrents.value(hash);
|
TorrentHandleImpl *const torrent = m_torrents.value(hash);
|
||||||
@ -2276,9 +2267,9 @@ bool Session::findIncompleteFiles(TorrentInfo &torrentInfo, QString &savePath) c
|
|||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add a torrent to the BitTorrent session in hidden mode
|
// Add a torrent to libtorrent session in hidden mode
|
||||||
// and force it to load its metadata
|
// and force it to download its metadata
|
||||||
bool Session::loadMetadata(const MagnetUri &magnetUri)
|
bool Session::downloadMetadata(const MagnetUri &magnetUri)
|
||||||
{
|
{
|
||||||
if (!magnetUri.isValid()) return false;
|
if (!magnetUri.isValid()) return false;
|
||||||
|
|
||||||
@ -2289,7 +2280,7 @@ bool Session::loadMetadata(const MagnetUri &magnetUri)
|
|||||||
// processed or adding to session
|
// processed or adding to session
|
||||||
if (m_torrents.contains(hash)) return false;
|
if (m_torrents.contains(hash)) return false;
|
||||||
if (m_loadingTorrents.contains(hash)) return false;
|
if (m_loadingTorrents.contains(hash)) return false;
|
||||||
if (m_loadedMetadata.contains(hash)) return false;
|
if (m_downloadedMetadata.contains(hash)) return false;
|
||||||
|
|
||||||
qDebug("Adding torrent to preload metadata...");
|
qDebug("Adding torrent to preload metadata...");
|
||||||
qDebug(" -> Hash: %s", qUtf8Printable(hash));
|
qDebug(" -> Hash: %s", qUtf8Printable(hash));
|
||||||
@ -2322,13 +2313,13 @@ bool Session::loadMetadata(const MagnetUri &magnetUri)
|
|||||||
p.storage = customStorageConstructor;
|
p.storage = customStorageConstructor;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Adding torrent to BitTorrent session
|
// Adding torrent to libtorrent session
|
||||||
lt::error_code ec;
|
lt::error_code ec;
|
||||||
lt::torrent_handle h = m_nativeSession->add_torrent(p, ec);
|
lt::torrent_handle h = m_nativeSession->add_torrent(p, ec);
|
||||||
if (ec) return false;
|
if (ec) return false;
|
||||||
|
|
||||||
// waiting for metadata...
|
// waiting for metadata...
|
||||||
m_loadedMetadata.insert(h.info_hash());
|
m_downloadedMetadata.insert(h.info_hash());
|
||||||
++m_extraLimit;
|
++m_extraLimit;
|
||||||
adjustLimits();
|
adjustLimits();
|
||||||
|
|
||||||
@ -3775,7 +3766,7 @@ bool Session::isKnownTorrent(const InfoHash &hash) const
|
|||||||
{
|
{
|
||||||
return (m_torrents.contains(hash)
|
return (m_torrents.contains(hash)
|
||||||
|| m_loadingTorrents.contains(hash)
|
|| m_loadingTorrents.contains(hash)
|
||||||
|| m_loadedMetadata.contains(hash));
|
|| m_downloadedMetadata.contains(hash));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Session::updateSeedingLimitTimer()
|
void Session::updateSeedingLimitTimer()
|
||||||
@ -4724,18 +4715,18 @@ void Session::handleTorrentDeleteFailedAlert(const lt::torrent_delete_failed_ale
|
|||||||
void Session::handleMetadataReceivedAlert(const lt::metadata_received_alert *p)
|
void Session::handleMetadataReceivedAlert(const lt::metadata_received_alert *p)
|
||||||
{
|
{
|
||||||
const InfoHash hash {p->handle.info_hash()};
|
const InfoHash hash {p->handle.info_hash()};
|
||||||
const auto loadedMetadataIter = m_loadedMetadata.find(hash);
|
const auto downloadedMetadataIter = m_downloadedMetadata.find(hash);
|
||||||
|
|
||||||
if (loadedMetadataIter != m_loadedMetadata.end())
|
if (downloadedMetadataIter != m_downloadedMetadata.end())
|
||||||
{
|
{
|
||||||
TorrentInfo metadata {p->handle.torrent_file()};
|
TorrentInfo metadata {p->handle.torrent_file()};
|
||||||
|
|
||||||
m_loadedMetadata.erase(loadedMetadataIter);
|
m_downloadedMetadata.erase(downloadedMetadataIter);
|
||||||
--m_extraLimit;
|
--m_extraLimit;
|
||||||
adjustLimits();
|
adjustLimits();
|
||||||
m_nativeSession->remove_torrent(p->handle, lt::session::delete_files);
|
m_nativeSession->remove_torrent(p->handle, lt::session::delete_files);
|
||||||
|
|
||||||
emit metadataLoaded(metadata);
|
emit metadataDownloaded(metadata);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -453,8 +453,8 @@ namespace BitTorrent
|
|||||||
bool addTorrent(const MagnetUri &magnetUri, const AddTorrentParams ¶ms = AddTorrentParams());
|
bool addTorrent(const MagnetUri &magnetUri, const AddTorrentParams ¶ms = AddTorrentParams());
|
||||||
bool addTorrent(const TorrentInfo &torrentInfo, const AddTorrentParams ¶ms = AddTorrentParams());
|
bool addTorrent(const TorrentInfo &torrentInfo, const AddTorrentParams ¶ms = AddTorrentParams());
|
||||||
bool deleteTorrent(const InfoHash &hash, DeleteOption deleteOption = Torrent);
|
bool deleteTorrent(const InfoHash &hash, DeleteOption deleteOption = Torrent);
|
||||||
bool loadMetadata(const MagnetUri &magnetUri);
|
bool downloadMetadata(const MagnetUri &magnetUri);
|
||||||
bool cancelLoadMetadata(const InfoHash &hash);
|
bool cancelDownloadMetadata(const InfoHash &hash);
|
||||||
|
|
||||||
void recursiveTorrentDownload(const InfoHash &hash);
|
void recursiveTorrentDownload(const InfoHash &hash);
|
||||||
void increaseTorrentsQueuePos(const QVector<InfoHash> &hashes);
|
void increaseTorrentsQueuePos(const QVector<InfoHash> &hashes);
|
||||||
@ -497,7 +497,7 @@ namespace BitTorrent
|
|||||||
void fullDiskError(TorrentHandle *torrent, const QString &msg);
|
void fullDiskError(TorrentHandle *torrent, const QString &msg);
|
||||||
void IPFilterParsed(bool error, int ruleCount);
|
void IPFilterParsed(bool error, int ruleCount);
|
||||||
void loadTorrentFailed(const QString &error);
|
void loadTorrentFailed(const QString &error);
|
||||||
void metadataLoaded(const TorrentInfo &info);
|
void metadataDownloaded(const TorrentInfo &info);
|
||||||
void recursiveTorrentDownloadPossible(TorrentHandle *torrent);
|
void recursiveTorrentDownloadPossible(TorrentHandle *torrent);
|
||||||
void speedLimitModeChanged(bool alternative);
|
void speedLimitModeChanged(bool alternative);
|
||||||
void statsUpdated();
|
void statsUpdated();
|
||||||
@ -764,7 +764,7 @@ namespace BitTorrent
|
|||||||
QThread *m_ioThread = nullptr;
|
QThread *m_ioThread = nullptr;
|
||||||
ResumeDataSavingManager *m_resumeDataSavingManager = nullptr;
|
ResumeDataSavingManager *m_resumeDataSavingManager = nullptr;
|
||||||
|
|
||||||
QSet<InfoHash> m_loadedMetadata;
|
QSet<InfoHash> m_downloadedMetadata;
|
||||||
|
|
||||||
QHash<InfoHash, TorrentHandleImpl *> m_torrents;
|
QHash<InfoHash, TorrentHandleImpl *> m_torrents;
|
||||||
QHash<InfoHash, LoadTorrentParams> m_loadingTorrents;
|
QHash<InfoHash, LoadTorrentParams> m_loadingTorrents;
|
||||||
|
@ -347,7 +347,7 @@ bool AddNewTorrentDialog::loadMagnet(const BitTorrent::MagnetUri &magnetUri)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
connect(BitTorrent::Session::instance(), &BitTorrent::Session::metadataLoaded, this, &AddNewTorrentDialog::updateMetadata);
|
connect(BitTorrent::Session::instance(), &BitTorrent::Session::metadataDownloaded, this, &AddNewTorrentDialog::updateMetadata);
|
||||||
|
|
||||||
// Set dialog title
|
// Set dialog title
|
||||||
const QString torrentName = magnetUri.name();
|
const QString torrentName = magnetUri.name();
|
||||||
@ -356,7 +356,7 @@ bool AddNewTorrentDialog::loadMagnet(const BitTorrent::MagnetUri &magnetUri)
|
|||||||
setupTreeview();
|
setupTreeview();
|
||||||
TMMChanged(m_ui->comboTTM->currentIndex());
|
TMMChanged(m_ui->comboTTM->currentIndex());
|
||||||
|
|
||||||
BitTorrent::Session::instance()->loadMetadata(magnetUri);
|
BitTorrent::Session::instance()->downloadMetadata(magnetUri);
|
||||||
setMetadataProgressIndicator(true, tr("Retrieving metadata..."));
|
setMetadataProgressIndicator(true, tr("Retrieving metadata..."));
|
||||||
m_ui->labelHashData->setText(infoHash);
|
m_ui->labelHashData->setText(infoHash);
|
||||||
|
|
||||||
@ -613,7 +613,7 @@ void AddNewTorrentDialog::reject()
|
|||||||
if (!m_hasMetadata)
|
if (!m_hasMetadata)
|
||||||
{
|
{
|
||||||
setMetadataProgressIndicator(false);
|
setMetadataProgressIndicator(false);
|
||||||
BitTorrent::Session::instance()->cancelLoadMetadata(m_magnetURI.hash());
|
BitTorrent::Session::instance()->cancelDownloadMetadata(m_magnetURI.hash());
|
||||||
}
|
}
|
||||||
|
|
||||||
QDialog::reject();
|
QDialog::reject();
|
||||||
@ -623,7 +623,7 @@ void AddNewTorrentDialog::updateMetadata(const BitTorrent::TorrentInfo &metadata
|
|||||||
{
|
{
|
||||||
if (metadata.hash() != m_magnetURI.hash()) return;
|
if (metadata.hash() != m_magnetURI.hash()) return;
|
||||||
|
|
||||||
disconnect(BitTorrent::Session::instance(), &BitTorrent::Session::metadataLoaded, this, &AddNewTorrentDialog::updateMetadata);
|
disconnect(BitTorrent::Session::instance(), &BitTorrent::Session::metadataDownloaded, this, &AddNewTorrentDialog::updateMetadata);
|
||||||
|
|
||||||
if (!metadata.isValid())
|
if (!metadata.isValid())
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user