mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2024-11-25 10:46:15 +03:00
parent
b579afe1aa
commit
a3a8b15828
3 changed files with 60 additions and 51 deletions
|
@ -157,10 +157,36 @@ void AddTorrentManager::handleAddTorrentFailed(const QString &source, const QStr
|
||||||
emit addTorrentFailed(source, reason);
|
emit addTorrentFailed(source, reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddTorrentManager::handleDuplicateTorrent(const QString &source, BitTorrent::Torrent *torrent, const QString &message)
|
void AddTorrentManager::handleDuplicateTorrent(const QString &source
|
||||||
|
, const BitTorrent::TorrentDescriptor &torrentDescr, BitTorrent::Torrent *existingTorrent)
|
||||||
{
|
{
|
||||||
|
const bool hasMetadata = torrentDescr.info().has_value();
|
||||||
|
if (hasMetadata)
|
||||||
|
{
|
||||||
|
// Trying to set metadata to existing torrent in case if it has none
|
||||||
|
existingTorrent->setMetadata(*torrentDescr.info());
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool isPrivate = existingTorrent->isPrivate() || (hasMetadata && torrentDescr.info()->isPrivate());
|
||||||
|
QString message;
|
||||||
|
if (!btSession()->isMergeTrackersEnabled())
|
||||||
|
{
|
||||||
|
message = tr("Merging of trackers is disabled");
|
||||||
|
}
|
||||||
|
else if (isPrivate)
|
||||||
|
{
|
||||||
|
message = tr("Trackers cannot be merged because it is a private torrent");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// merge trackers and web seeds
|
||||||
|
existingTorrent->addTrackers(torrentDescr.trackers());
|
||||||
|
existingTorrent->addUrlSeeds(torrentDescr.urlSeeds());
|
||||||
|
message = tr("Trackers are merged from new source");
|
||||||
|
}
|
||||||
|
|
||||||
LogMsg(tr("Detected an attempt to add a duplicate torrent. Source: %1. Existing torrent: %2. Result: %3")
|
LogMsg(tr("Detected an attempt to add a duplicate torrent. Source: %1. Existing torrent: %2. Result: %3")
|
||||||
.arg(source, torrent->name(), message));
|
.arg(source, existingTorrent->name(), message));
|
||||||
emit addTorrentFailed(source, message);
|
emit addTorrentFailed(source, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -184,32 +210,7 @@ bool AddTorrentManager::processTorrent(const QString &source, const BitTorrent::
|
||||||
if (BitTorrent::Torrent *torrent = btSession()->findTorrent(infoHash))
|
if (BitTorrent::Torrent *torrent = btSession()->findTorrent(infoHash))
|
||||||
{
|
{
|
||||||
// a duplicate torrent is being added
|
// a duplicate torrent is being added
|
||||||
|
handleDuplicateTorrent(source, torrentDescr, torrent);
|
||||||
const bool hasMetadata = torrentDescr.info().has_value();
|
|
||||||
if (hasMetadata)
|
|
||||||
{
|
|
||||||
// Trying to set metadata to existing torrent in case if it has none
|
|
||||||
torrent->setMetadata(*torrentDescr.info());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!btSession()->isMergeTrackersEnabled())
|
|
||||||
{
|
|
||||||
handleDuplicateTorrent(source, torrent, tr("Merging of trackers is disabled"));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const bool isPrivate = torrent->isPrivate() || (hasMetadata && torrentDescr.info()->isPrivate());
|
|
||||||
if (isPrivate)
|
|
||||||
{
|
|
||||||
handleDuplicateTorrent(source, torrent, tr("Trackers cannot be merged because it is a private torrent"));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// merge trackers and web seeds
|
|
||||||
torrent->addTrackers(torrentDescr.trackers());
|
|
||||||
torrent->addUrlSeeds(torrentDescr.urlSeeds());
|
|
||||||
|
|
||||||
handleDuplicateTorrent(source, torrent, tr("Trackers are merged from new source"));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,7 @@ protected:
|
||||||
bool addTorrentToSession(const QString &source, const BitTorrent::TorrentDescriptor &torrentDescr
|
bool addTorrentToSession(const QString &source, const BitTorrent::TorrentDescriptor &torrentDescr
|
||||||
, const BitTorrent::AddTorrentParams &addTorrentParams);
|
, const BitTorrent::AddTorrentParams &addTorrentParams);
|
||||||
void handleAddTorrentFailed(const QString &source, const QString &reason);
|
void handleAddTorrentFailed(const QString &source, const QString &reason);
|
||||||
void handleDuplicateTorrent(const QString &source, BitTorrent::Torrent *torrent, const QString &message);
|
void handleDuplicateTorrent(const QString &source, const BitTorrent::TorrentDescriptor &torrentDescr, BitTorrent::Torrent *existingTorrent);
|
||||||
void setTorrentFileGuard(const QString &source, std::shared_ptr<TorrentFileGuard> torrentFileGuard);
|
void setTorrentFileGuard(const QString &source, std::shared_ptr<TorrentFileGuard> torrentFileGuard);
|
||||||
void releaseTorrentFileGuard(const QString &source);
|
void releaseTorrentFileGuard(const QString &source);
|
||||||
|
|
||||||
|
|
|
@ -175,13 +175,16 @@ void GUIAddTorrentManager::onMetadataDownloaded(const BitTorrent::TorrentInfo &m
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GUIAddTorrentManager::processTorrent(const QString &source, const BitTorrent::TorrentDescriptor &torrentDescr, const BitTorrent::AddTorrentParams ¶ms)
|
bool GUIAddTorrentManager::processTorrent(const QString &source
|
||||||
|
, const BitTorrent::TorrentDescriptor &torrentDescr, const BitTorrent::AddTorrentParams ¶ms)
|
||||||
{
|
{
|
||||||
const bool hasMetadata = torrentDescr.info().has_value();
|
const bool hasMetadata = torrentDescr.info().has_value();
|
||||||
const BitTorrent::InfoHash infoHash = torrentDescr.infoHash();
|
const BitTorrent::InfoHash infoHash = torrentDescr.infoHash();
|
||||||
|
|
||||||
// Prevent showing the dialog if download is already present
|
// Prevent showing the dialog if download is already present
|
||||||
if (BitTorrent::Torrent *torrent = btSession()->findTorrent(infoHash))
|
if (BitTorrent::Torrent *torrent = btSession()->findTorrent(infoHash))
|
||||||
|
{
|
||||||
|
if (Preferences::instance()->confirmMergeTrackers())
|
||||||
{
|
{
|
||||||
if (hasMetadata)
|
if (hasMetadata)
|
||||||
{
|
{
|
||||||
|
@ -189,27 +192,32 @@ bool GUIAddTorrentManager::processTorrent(const QString &source, const BitTorren
|
||||||
torrent->setMetadata(*torrentDescr.info());
|
torrent->setMetadata(*torrentDescr.info());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (torrent->isPrivate() || (hasMetadata && torrentDescr.info()->isPrivate()))
|
const bool isPrivate = torrent->isPrivate() || (hasMetadata && torrentDescr.info()->isPrivate());
|
||||||
|
const QString dialogCaption = tr("Torrent is already present");
|
||||||
|
if (isPrivate)
|
||||||
{
|
{
|
||||||
handleDuplicateTorrent(source, torrent, tr("Trackers cannot be merged because it is a private torrent"));
|
// We cannot merge trackers for private torrent but we still notify user
|
||||||
|
// about duplicate torrent if confirmation dialog is enabled.
|
||||||
|
RaisedMessageBox::warning(app()->mainWindow(), dialogCaption
|
||||||
|
, tr("Trackers cannot be merged because it is a private torrent."));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
bool mergeTrackers = btSession()->isMergeTrackersEnabled();
|
const bool mergeTrackers = btSession()->isMergeTrackersEnabled();
|
||||||
if (Preferences::instance()->confirmMergeTrackers())
|
const QMessageBox::StandardButton btn = RaisedMessageBox::question(app()->mainWindow(), dialogCaption
|
||||||
{
|
|
||||||
const QMessageBox::StandardButton btn = RaisedMessageBox::question(app()->mainWindow(), tr("Torrent is already present")
|
|
||||||
, tr("Torrent '%1' is already in the transfer list. Do you want to merge trackers from new source?").arg(torrent->name())
|
, tr("Torrent '%1' is already in the transfer list. Do you want to merge trackers from new source?").arg(torrent->name())
|
||||||
, (QMessageBox::Yes | QMessageBox::No), QMessageBox::Yes);
|
, (QMessageBox::Yes | QMessageBox::No), (mergeTrackers ? QMessageBox::Yes : QMessageBox::No));
|
||||||
mergeTrackers = (btn == QMessageBox::Yes);
|
if (btn == QMessageBox::Yes)
|
||||||
}
|
|
||||||
|
|
||||||
if (mergeTrackers)
|
|
||||||
{
|
{
|
||||||
torrent->addTrackers(torrentDescr.trackers());
|
torrent->addTrackers(torrentDescr.trackers());
|
||||||
torrent->addUrlSeeds(torrentDescr.urlSeeds());
|
torrent->addUrlSeeds(torrentDescr.urlSeeds());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
handleDuplicateTorrent(source, torrentDescr, torrent);
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue