コード例 #1
0
ファイル: magnet_uri.cpp プロジェクト: bird1015/avplayer
	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;
	}
コード例 #2
0
ファイル: magnet_uri.cpp プロジェクト: huyang819/cdn-partner
	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();
	}
コード例 #3
0
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();
}
コード例 #4
0
ファイル: mainwindow.cpp プロジェクト: vitlav/QLiveBittorrent
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();
}