std::string make_magnet_uri(torrent_handle const& handle) { if (!handle.is_valid()) return ""; char ret[1024]; sha1_hash const& ih = handle.info_hash(); int num_chars = snprintf(ret, sizeof(ret), "magnet:?xt=urn:btih:%s" , base32encode(std::string((char const*)&ih[0], 20)).c_str()); std::string name = handle.name(); if (!name.empty()) num_chars += snprintf(ret + num_chars, sizeof(ret) - num_chars, "&dn=%s" , escape_string(name.c_str(), name.length()).c_str()); std::string tracker; torrent_status st = handle.status(); if (!st.current_tracker.empty()) { tracker = st.current_tracker; } else { std::vector<announce_entry> const& tr = handle.trackers(); if (!tr.empty()) tracker = tr[0].url; } if (!tracker.empty()) num_chars += snprintf(ret + num_chars, sizeof(ret) - num_chars, "&tr=%s" , escape_string(tracker.c_str(), tracker.size()).c_str()); return ret; }
std::string make_magnet_uri(torrent_handle const& handle) { std::stringstream ret; if (!handle.is_valid()) return ret.str(); std::string name = handle.name(); ret << "magnet:?xt=urn:btih:" << base32encode( std::string((char*)handle.info_hash().begin(), 20)); if (!name.empty()) ret << "&dn=" << escape_string(name.c_str(), name.length()); torrent_status st = handle.status(); if (!st.current_tracker.empty()) { ret << "&tr=" << escape_string(st.current_tracker.c_str() , st.current_tracker.length()); } else { std::vector<announce_entry> const& tr = handle.trackers(); if (!tr.empty()) { ret << "&tr=" << escape_string(tr[0].url.c_str() , tr[0].url.length()); } } return ret.str(); }
void TorrentDownloadManager::UnregisterHandle(torrent_handle h){ this->dlmutex.Lock(); if(!this->handle_map.erase(h)){ try{ syslog(LOG_ERR,"Erase of handle %s failed",h.name().c_str()); }catch(libtorrent::invalid_handle& err){ syslog(LOG_ERR,"Erase of invalid handle"); } } this->dlmutex.Unlock(); }
void MainWindow::realAddTorrent(QString torrentFile, QString torrentPath, QString mountPath) { if (!QFile::exists(torrentFile) && !isMagnet(torrentFile)) die("torrent file not found"); standartText = ("Torrent file: " + torrentFile + "\nDownload path: " + torrentPath + "\nMount path: " + mountPath + "\n").toLocal8Bit(); standartTextLen = standartText.size(); updateStandartText(); if (torrentPath[torrentPath.length() - 1] != QChar('/')) torrentPath += "/"; if (mountPath[mountPath.length() - 1] != QChar('/')) mountPath += "/"; resumeSavePath = torrentPath; add_torrent_params p; p.storage_mode = libtorrent::storage_mode_allocate; if (isMagnet(torrentFile)) { int i; for (i = 1; torrentFile[i] != '='; i++); for (i = i + 1; torrentFile[i] != '='; i++); QString url; for (i = i + 1; torrentFile[i] != '&'; i++) url += torrentFile[i]; #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) QString name = QUrl(url).toString().replace("+", " "); #else QString name = QUrl(url).toString(QUrl::PreferLocalFile).replace("+", " "); #endif p.save_path = (torrentPath + name + "/").toStdString(); const torrent_handle h = libtorrent::add_magnet_uri(*session, torrentFile.toStdString(), p); main = new Torrent(torrentPath + QString::fromStdString(h.name()), mountPath + QString::fromStdString(h.name()), h, this); } else { torrent_info *inf = new libtorrent::torrent_info(torrentFile.toStdString()); p.ti = inf; p.save_path = (torrentPath + QString::fromStdString(inf->name()) + "/").toStdString(); main = new Torrent(torrentPath + QString::fromStdString(inf->name()), mountPath + QString::fromStdString(inf->name()), session->add_torrent(p), this); } setupTimers(); }