diff --git a/src/base/addtorrentmanager.cpp b/src/base/addtorrentmanager.cpp index a094dbd85..a4bfe8047 100644 --- a/src/base/addtorrentmanager.cpp +++ b/src/base/addtorrentmanager.cpp @@ -157,10 +157,36 @@ void AddTorrentManager::handleAddTorrentFailed(const QString &source, const QStr 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") - .arg(source, torrent->name(), message)); + .arg(source, existingTorrent->name(), message)); emit addTorrentFailed(source, message); } @@ -184,32 +210,7 @@ bool AddTorrentManager::processTorrent(const QString &source, const BitTorrent:: if (BitTorrent::Torrent *torrent = btSession()->findTorrent(infoHash)) { // a duplicate torrent is being added - - 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")); + handleDuplicateTorrent(source, torrentDescr, torrent); return false; } diff --git a/src/base/addtorrentmanager.h b/src/base/addtorrentmanager.h index ef31ae4da..9f1f61039 100644 --- a/src/base/addtorrentmanager.h +++ b/src/base/addtorrentmanager.h @@ -72,7 +72,7 @@ protected: bool addTorrentToSession(const QString &source, const BitTorrent::TorrentDescriptor &torrentDescr , const BitTorrent::AddTorrentParams &addTorrentParams); 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); void releaseTorrentFileGuard(const QString &source); diff --git a/src/gui/guiaddtorrentmanager.cpp b/src/gui/guiaddtorrentmanager.cpp index 2fbebef68..c99d4afce 100644 --- a/src/gui/guiaddtorrentmanager.cpp +++ b/src/gui/guiaddtorrentmanager.cpp @@ -175,7 +175,8 @@ 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 BitTorrent::InfoHash infoHash = torrentDescr.infoHash(); @@ -183,32 +184,39 @@ bool GUIAddTorrentManager::processTorrent(const QString &source, const BitTorren // Prevent showing the dialog if download is already present if (BitTorrent::Torrent *torrent = btSession()->findTorrent(infoHash)) { - if (hasMetadata) + if (Preferences::instance()->confirmMergeTrackers()) { - // Trying to set metadata to existing torrent in case if it has none - torrent->setMetadata(*torrentDescr.info()); - } + if (hasMetadata) + { + // Trying to set metadata to existing torrent in case if it has none + torrent->setMetadata(*torrentDescr.info()); + } - if (torrent->isPrivate() || (hasMetadata && torrentDescr.info()->isPrivate())) - { - handleDuplicateTorrent(source, torrent, tr("Trackers cannot be merged because it is a private torrent")); + const bool isPrivate = torrent->isPrivate() || (hasMetadata && torrentDescr.info()->isPrivate()); + const QString dialogCaption = tr("Torrent is already present"); + if (isPrivate) + { + // 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 + { + const bool mergeTrackers = btSession()->isMergeTrackersEnabled(); + const QMessageBox::StandardButton btn = RaisedMessageBox::question(app()->mainWindow(), dialogCaption + , 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), (mergeTrackers ? QMessageBox::Yes : QMessageBox::No)); + if (btn == QMessageBox::Yes) + { + torrent->addTrackers(torrentDescr.trackers()); + torrent->addUrlSeeds(torrentDescr.urlSeeds()); + } + } } else { - bool mergeTrackers = btSession()->isMergeTrackersEnabled(); - if (Preferences::instance()->confirmMergeTrackers()) - { - 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()) - , (QMessageBox::Yes | QMessageBox::No), QMessageBox::Yes); - mergeTrackers = (btn == QMessageBox::Yes); - } - - if (mergeTrackers) - { - torrent->addTrackers(torrentDescr.trackers()); - torrent->addUrlSeeds(torrentDescr.urlSeeds()); - } + handleDuplicateTorrent(source, torrentDescr, torrent); } return false;