std::string make_magnet_uri(torrent_handle const& handle) { if (!handle.is_valid()) return ""; std::string ret; sha1_hash const& ih = handle.info_hash(); ret += "magnet:?xt=urn:btih:"; ret += to_hex(ih.to_string()); torrent_status st = handle.status(torrent_handle::query_name); if (!st.name.empty()) { ret += "&dn="; ret += escape_string(st.name.c_str(), st.name.length()); } std::vector<announce_entry> const& tr = handle.trackers(); for (std::vector<announce_entry>::const_iterator i = tr.begin(), end(tr.end()); i != end; ++i) { ret += "&tr="; ret += escape_string(i->url.c_str(), i->url.length()); } std::set<std::string> seeds = handle.url_seeds(); for (std::set<std::string>::iterator i = seeds.begin() , end(seeds.end()); i != end; ++i) { ret += "&ws="; ret += escape_string(i->c_str(), i->length()); } return ret; }
std::string make_magnet_uri(torrent_handle const& handle) { if (!handle.is_valid()) return ""; std::string ret; sha1_hash const& ih = handle.info_hash(); ret += "magnet:?xt=urn:btih:"; ret += aux::to_hex(ih); torrent_status st = handle.status(torrent_handle::query_name); if (!st.name.empty()) { ret += "&dn="; ret += escape_string(st.name); } for (auto const& tr : handle.trackers()) { ret += "&tr="; ret += escape_string(tr.url); } for (auto const& s : handle.url_seeds()) { ret += "&ws="; ret += escape_string(s); } return ret; }
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; }
torrent_alert::torrent_alert(aux::stack_allocator& alloc , torrent_handle const& h) : handle(h) , m_alloc(alloc) { std::string name_str; if (h.native_handle()) { m_name_idx = alloc.copy_string(h.native_handle()->name()); } else if (h.is_valid()) { char msg[41]; to_hex(h.native_handle()->info_hash().data(), 20, msg); m_name_idx = alloc.copy_string(msg); } else { m_name_idx = alloc.copy_string(""); } #ifndef TORRENT_NO_DEPRECATE name = torrent_name(); #endif }
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(); }
torrent_alert::torrent_alert(aux::stack_allocator& alloc , torrent_handle const& h) : handle(h) , m_alloc(alloc) { boost::shared_ptr<torrent> t = h.native_handle(); if (t) { std::string name_str = t->name(); if (!name_str.empty()) { m_name_idx = alloc.copy_string(name_str); } else { char msg[41]; to_hex(t->info_hash().data(), 20, msg); m_name_idx = alloc.copy_string(msg); } } else { m_name_idx = alloc.copy_string(""); } #ifndef TORRENT_NO_DEPRECATE name = torrent_name(); #endif }
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(); }
virtual void on_torrent_added(int idx, torrent_handle h) override { if (idx == 0) return; if (m_flags & upload_only) { h.set_upload_mode(true); } }
void session::remove_torrent(const torrent_handle& h, int options) { if (!h.is_valid()) #ifdef BOOST_NO_EXCEPTIONS return; #else throw_invalid_handle(); #endif TORRENT_ASYNC_CALL2(remove_torrent, h, options); }
boost::shared_ptr<torrent_plugin> create_ut_pex_plugin(torrent_handle const& th, void*) { torrent* t = th.native_handle().get(); if (t->torrent_file().priv() || (t->torrent_file().is_i2p() && !t->settings().get_bool(settings_pack::allow_i2p_mixed))) { return boost::shared_ptr<torrent_plugin>(); } return boost::shared_ptr<torrent_plugin>(new ut_pex_plugin(*t)); }
void session_handle::remove_torrent(const torrent_handle& h, int options) { if (!h.is_valid()) #ifdef BOOST_NO_EXCEPTIONS return; #else throw_invalid_handle(); #endif async_call(&session_impl::remove_torrent, h, options); }
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 wait_for_complete(lt::session& ses, torrent_handle h) { for (int i = 0; i < 70; ++i) { print_alerts(ses, "ses1"); torrent_status st = h.status(); fprintf(stderr, "%f %%\n", st.progress_ppm / 10000.f); if (st.progress_ppm == 1000000) return; test_sleep(500); } TEST_ERROR("torrent did not finish"); }
void wait_for_complete(lt::session& ses, torrent_handle h) { int last_progress = 0; clock_type::time_point last_change = clock_type::now(); for (int i = 0; i < 400; ++i) { print_alerts(ses, "ses1"); torrent_status st = h.status(); fprintf(stderr, "%f %%\n", st.progress_ppm / 10000.f); if (st.progress_ppm == 1000000) return; if (st.progress_ppm != last_progress) { last_progress = st.progress_ppm; last_change = clock_type::now(); } if (clock_type::now() - last_change > seconds(10)) break; test_sleep(500); } TEST_ERROR("torrent did not finish"); }