From ba0c7334b71643d41ae154ff388e96fc41ef3153 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 3 Jan 2010 14:20:31 +0000 Subject: [PATCH] - Use torrent addition dialog for Magnet URIs too --- src/GUI.cpp | 17 +++++- src/bittorrent.cpp | 22 +++++-- src/misc.h | 13 +++++ src/torrentadditiondlg.h | 110 ++++++++++++++++++++++++----------- src/ui/torrentadditiondlg.ui | 13 +++++ 5 files changed, 132 insertions(+), 43 deletions(-) diff --git a/src/GUI.cpp b/src/GUI.cpp index 4be92608d..78248bc2c 100644 --- a/src/GUI.cpp +++ b/src/GUI.cpp @@ -651,8 +651,12 @@ void GUI::processParams(const QStringList& params) { BTSession->downloadFromUrl(param); }else{ if(param.startsWith("magnet:", Qt::CaseInsensitive)) { - // FIXME: Possibily skipped torrent addition dialog - BTSession->addMagnetUri(param); + if(useTorrentAdditionDialog) { + torrentAdditionDialog *dialog = new torrentAdditionDialog(this, BTSession); + dialog->showLoadMagnetURI(param); + } else { + BTSession->addMagnetUri(param); + } } else { if(useTorrentAdditionDialog) { torrentAdditionDialog *dialog = new torrentAdditionDialog(this, BTSession); @@ -833,9 +837,16 @@ void GUI::showNotificationBaloon(QString title, QString msg) const { *****************************************************/ void GUI::downloadFromURLList(const QStringList& url_list) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool(); foreach(const QString url, url_list) { if(url.startsWith("magnet:", Qt::CaseInsensitive)) { - BTSession->addMagnetUri(url); + if(useTorrentAdditionDialog) { + torrentAdditionDialog *dialog = new torrentAdditionDialog(this, BTSession); + dialog->showLoadMagnetURI(url); + } else { + BTSession->addMagnetUri(url); + } } else { BTSession->downloadFromUrl(url); } diff --git a/src/bittorrent.cpp b/src/bittorrent.cpp index b6f39d962..251b2ff9a 100644 --- a/src/bittorrent.cpp +++ b/src/bittorrent.cpp @@ -769,6 +769,14 @@ QTorrentHandle Bittorrent::addMagnetUri(QString magnet_uri, bool resumed) { } else { p.save_path = defaultTempPath.toLocal8Bit().data(); } +#ifdef LIBTORRENT_0_15 + // Skip checking and directly start seeding (new in libtorrent v0.15) + if(TorrentTempData::isSeedingMode(hash)){ + p.seed_mode=true; + } else { + p.seed_mode=false; + } +#endif // Preallocate all? if(preAllocateAll) p.storage_mode = storage_mode_allocate; @@ -803,17 +811,19 @@ QTorrentHandle Bittorrent::addMagnetUri(QString magnet_uri, bool resumed) { if(!resumed) { // Sequential download if(TorrentTempData::hasTempData(hash)) { - qDebug("addMagnetUri: Setting download as sequential (from tmp data)"); + qDebug("addMagnetURI Setting download as sequential (from tmp data)"); h.set_sequential_download(TorrentTempData::isSequential(hash)); } + QString label = TorrentTempData::getLabel(hash); // Save persistent data for new torrent - Q_ASSERT(h.is_valid()); - qDebug("addMagnetUri: hash: %s", h.hash().toLocal8Bit().data()); - TorrentPersistentData::saveTorrentPersistentData(h, true); - qDebug("Persistent data saved"); + TorrentPersistentData::saveTorrentPersistentData(h); + // Save Label + if(!label.isEmpty()) { + TorrentPersistentData::saveLabel(hash, label); + } // Save save_path if(!defaultTempPath.isEmpty()) { - qDebug("addMagnetUri: Saving save_path in persistent data: %s", savePath.toLocal8Bit().data()); + qDebug("addTorrent: Saving save_path in persistent data: %s", savePath.toLocal8Bit().data()); TorrentPersistentData::saveSavePath(hash, savePath); } } diff --git a/src/misc.h b/src/misc.h index 1646e479c..57473b77e 100644 --- a/src/misc.h +++ b/src/misc.h @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -435,6 +436,18 @@ public: return false; } + static QString magnetUriToName(QString magnet_uri) { + QString name = ""; + QRegExp regHex("dn=([^&]+)"); + int pos = regHex.indexIn(magnet_uri); + if(pos > -1) { + QString found = regHex.cap(1); + // URL decode + name = QUrl::fromPercentEncoding(found.toLocal8Bit()).replace("+", " "); + } + return name; + } + static QString magnetUriToHash(QString magnet_uri) { QString hash = ""; QRegExp regHex("urn:btih:([0-9A-Za-z]+)"); diff --git a/src/torrentadditiondlg.h b/src/torrentadditiondlg.h index 20f382eef..aebfb5ffb 100644 --- a/src/torrentadditiondlg.h +++ b/src/torrentadditiondlg.h @@ -69,6 +69,7 @@ private: unsigned int nbFiles; boost::intrusive_ptr t; QStringList files_path; + bool is_magnet; public: torrentAdditionDialog(QWidget *parent, Bittorrent* _BTSession) : QDialog(parent) { @@ -148,7 +149,39 @@ public: settings.setValue("TorrentAdditionDlg/pos", pos()); } + void showLoadMagnetURI(QString magnet_uri) { + is_magnet = true; + this->from_url = magnet_uri; + // Disable useless widgets + torrentContentList->setVisible(false); + torrentContentLbl->setVisible(false); + collapseAllButton->setVisible(false); + expandAllButton->setVisible(false); + // Get torrent hash + hash = misc::magnetUriToHash(magnet_uri); + if(hash.isEmpty()) { + BTSession->addConsoleMessage(tr("Unable to decode magnet link:")+QString::fromUtf8(" '")+from_url+QString::fromUtf8("'"), QString::fromUtf8("red")); + return; + } + fileName = misc::magnetUriToName(magnet_uri); + if(fileName.isEmpty()) fileName = tr("Magnet Link"); + fileNameLbl->setText(QString::fromUtf8("
")+fileName+QString::fromUtf8("
")); + // Update display + updateDiskSpaceLabels(); + // Load custom labels + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + settings.beginGroup(QString::fromUtf8("TransferListFilters")); + QStringList customLabels = settings.value("customLabels", QStringList()).toStringList(); + comboLabel->addItem(""); + foreach(const QString& label, customLabels) { + comboLabel->addItem(label); + } + // Show dialog + show(); + } + void showLoad(QString filePath, QString from_url=QString::null){ + is_magnet = false; if(!QFile::exists(filePath)) { close(); return; @@ -314,29 +347,31 @@ public slots: void updateDiskSpaceLabels() { long long available = misc::freeDiskSpaceOnPath(misc::expandPath(savePathTxt->text())); lbl_disk_space->setText(misc::friendlyUnit(available)); + if(!is_magnet) { + // Determine torrent size + qulonglong torrent_size = 0; + unsigned int nbFiles = t->num_files(); + std::vector priorities = PropListModel->getFilesPriorities(nbFiles); - // Determine torrent size - qulonglong torrent_size = 0; - unsigned int nbFiles = t->num_files(); - std::vector priorities = PropListModel->getFilesPriorities(nbFiles); - - for(unsigned int i=0; i 0) - torrent_size += t->file_at(i).size; - } - lbl_torrent_size->setText(misc::friendlyUnit(torrent_size)); - // Check if free space is sufficient - if(available > 0) { - if((unsigned long long)available > torrent_size) { - // Space is sufficient - label_space_msg->setText(tr("(%1 left after torrent download)", "e.g. (100MiB left after torrent download)").arg(misc::friendlyUnit(available-torrent_size))); - } else { - // Space is unsufficient - label_space_msg->setText(""+tr("(%1 more are required to download)", "e.g. (100MiB more are required to download)").arg(misc::friendlyUnit(torrent_size-available))+""); + for(unsigned int i=0; i 0) + torrent_size += t->file_at(i).size; + } + lbl_torrent_size->setText(misc::friendlyUnit(torrent_size)); + + // Check if free space is sufficient + if(available > 0) { + if((unsigned long long)available > torrent_size) { + // Space is sufficient + label_space_msg->setText(tr("(%1 left after torrent download)", "e.g. (100MiB left after torrent download)").arg(misc::friendlyUnit(available-torrent_size))); + } else { + // Space is unsufficient + label_space_msg->setText(""+tr("(%1 more are required to download)", "e.g. (100MiB more are required to download)").arg(misc::friendlyUnit(torrent_size-available))+""); + } + } else { + // Available disk space is unknown + label_space_msg->setText(""); } - } else { - // Available disk space is unknown - label_space_msg->setText(""); } } @@ -389,25 +424,27 @@ public slots: TorrentTempData::setSequential(hash, checkIncrementalDL->isChecked()); // Save files path // Loads files path in the torrent - bool path_changed = false; - for(uint i=0; ifile_at(i).path.string()), Qt::CaseInsensitive) != 0) { + if(files_path.at(i).compare(misc::toQString(t->file_at(i).path.string()), Qt::CaseInsensitive) != 0) { #else - if(files_path.at(i).compare(misc::toQString(t->file_at(i).path.string()), Qt::CaseSensitive) != 0) { + if(files_path.at(i).compare(misc::toQString(t->file_at(i).path.string()), Qt::CaseSensitive) != 0) { #endif - path_changed = true; - break; + path_changed = true; + break; + } + } + if(path_changed) { + TorrentTempData::setFilesPath(hash, files_path); } - } - if(path_changed) { - TorrentTempData::setFilesPath(hash, files_path); } #ifdef LIBTORRENT_0_15 // Skip file checking and directly start seeding if(addInSeed->isChecked()) { // Check if local file(s) actually exist - if(savePath.exists(misc::toQString(t->name()))) { + if(is_magnet || savePath.exists(misc::toQString(t->name()))) { TorrentTempData::setSeedingMode(hash, true); } else { QMessageBox::warning(0, tr("Seeding mode error"), tr("You chose to skip file checking. However, local files do not seem to exist in the current destionation folder. Please disable this feature or update the save path.")); @@ -416,14 +453,19 @@ public slots: } #endif // Check if there is at least one selected file - if(allFiltered()){ + if(!is_magnet && allFiltered()){ QMessageBox::warning(0, tr("Invalid file selection"), tr("You must select at least one file in the torrent")); return; } // save filtered files - savePiecesPriorities(); + if(!is_magnet) + savePiecesPriorities(); // Add to download list - QTorrentHandle h = BTSession->addTorrent(filePath, false, from_url); + QTorrentHandle h; + if(is_magnet) + h = BTSession->addMagnetUri(from_url, false); + else + h = BTSession->addTorrent(filePath, false, from_url); if(addInPause->isChecked() && h.is_valid()) h.pause(); close(); diff --git a/src/ui/torrentadditiondlg.ui b/src/ui/torrentadditiondlg.ui index acce1bb51..9773cd412 100644 --- a/src/ui/torrentadditiondlg.ui +++ b/src/ui/torrentadditiondlg.ui @@ -279,6 +279,19 @@ + + + + Qt::Vertical + + + + 20 + 40 + + + +