diff --git a/docs/examples.html b/docs/examples.html
index f7bfa1a42..682f282d5 100644
--- a/docs/examples.html
+++ b/docs/examples.html
@@ -3,7 +3,7 @@
-
+
libtorrent Examples
@@ -49,27 +49,48 @@ print information about it to std out:
#include "libtorrent/entry.hpp"
#include "libtorrent/bencode.hpp"
#include "libtorrent/torrent_info.hpp"
+#include "libtorrent/lazy_entry.hpp"
+#include <boost/filesystem/operations.hpp>
int main(int argc, char* argv[])
{
using namespace libtorrent;
+ using namespace boost::filesystem;
if (argc != 2)
{
std::cerr << "usage: dump_torrent torrent-file\n";
return 1;
}
+#if BOOST_VERSION < 103400
+ boost::filesystem::path::default_name_check(boost::filesystem::no_check);
+#endif
+#ifndef BOOST_NO_EXCEPTIONS
try
{
- std::ifstream in(argv[1], std::ios_base::binary);
- in.unsetf(std::ios_base::skipws);
- entry e = bdecode(std::istream_iterator<char>(in)
- , std::istream_iterator<char>());
+#endif
+
+ int size = file_size(argv[1]);
+ if (size > 10 * 1000000)
+ {
+ std::cerr << "file too big (" << size << "), aborting\n";
+ return 1;
+ }
+ std::vector<char> buf(size);
+ std::ifstream(argv[1], std::ios_base::binary).read(&buf[0], size);
+ lazy_entry e;
+ int ret = lazy_bdecode(&buf[0], &buf[0] + buf.size(), e);
+
+ if (ret != 0)
+ {
+ std::cerr << "invalid bencoding: " << ret << std::endl;
+ return 1;
+ }
std::cout << "\n\n----- raw info -----\n\n";
- e.print(std::cout);
+ std::cout << e << std::endl;
torrent_info t(e);
@@ -83,10 +104,9 @@ int main(int argc, char* argv[])
{
std::cout << i->first << ":" << i->second << "\n";
}
-
std::cout << "trackers:\n";
- for (std::vector<announce_entry>::const_iterator i
- = t.trackers().begin(); i != t.trackers().end(); ++i)
+ for (std::vector<announce_entry>::const_iterator i = t.trackers().begin();
+ i != t.trackers().end(); ++i)
{
std::cout << i->tier << ": " << i->url << "\n";
}
@@ -97,18 +117,24 @@ int main(int argc, char* argv[])
std::cout << "comment: " << t.comment() << "\n";
std::cout << "created by: " << t.creator() << "\n";
std::cout << "files:\n";
+ int index = 0;
for (torrent_info::file_iterator i = t.begin_files();
- i != t.end_files(); ++i)
+ i != t.end_files(); ++i, ++index)
{
+ int first = t.map_file(index, 0, 1).piece;
+ int last = t.map_file(index, i->size - 1, 1).piece;
std::cout << " " << std::setw(11) << i->size
- << " " << i->path.string() << "\n";
+ << " " << i->path.string() << "[ " << first << ", "
+ << last << " ]\n";
}
+#ifndef BOOST_NO_EXCEPTIONS
}
catch (std::exception& e)
{
std::cout << e.what() << "\n";
}
+#endif
return 0;
}
@@ -118,49 +144,43 @@ int main(int argc, char* argv[])
This is a simple client. It doesn't have much output to keep it simple:
-#include <iostream>
-#include <fstream>
-#include <iterator>
-#include <exception>
-
-#include <boost/format.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
-
-#include "libtorrent/entry.hpp"
-#include "libtorrent/bencode.hpp"
-#include "libtorrent/session.hpp"
-
int main(int argc, char* argv[])
{
using namespace libtorrent;
+#if BOOST_VERSION < 103400
+ namespace fs = boost::filesystem;
+ fs::path::default_name_check(fs::no_check);
+#endif
- if (argc != 2)
- {
- std::cerr << "usage: ./simple_cient torrent-file\n"
- "to stop the client, press return.\n";
- return 1;
- }
+if (argc != 2)
+{
+ std::cerr << "usage: ./simple_client torrent-file\n"
+ "to stop the client, press return.\n";
+ return 1;
+}
+#ifndef BOOST_NO_EXCEPTIONS
try
+#endif
{
session s;
s.listen_on(std::make_pair(6881, 6889));
-
- std::ifstream in(argv[1], std::ios_base::binary);
- in.unsetf(std::ios_base::skipws);
- entry e = bdecode(std::istream_iterator<char>(in)
- , std::istream_iterator<char>());
- s.add_torrent(torrent_info(e), "");
+ add_torrent_params p;
+ p.save_path = "./";
+ p.ti = new torrent_info(argv[1]);
+ s.add_torrent(p);
// wait for the user to end
char a;
std::cin.unsetf(std::ios_base::skipws);
std::cin >> a;
}
+#ifndef BOOST_NO_EXCEPTIONS
catch (std::exception& e)
{
std::cout << e.what() << "\n";
}
+#endif
return 0;
}
@@ -180,31 +200,28 @@ int main(int argc, char* argv[])
#include "libtorrent/file.hpp"
#include "libtorrent/storage.hpp"
#include "libtorrent/hasher.hpp"
-#include "libtorrent/file_pool.hpp"
+#include "libtorrent/create_torrent.hpp"
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/path.hpp>
#include <boost/filesystem/fstream.hpp>
+#include <boost/bind.hpp>
using namespace boost::filesystem;
using namespace libtorrent;
-void add_files(
- torrent_info& t
- , path const& p
- , path const& l)
+// do not include files and folders whose
+// name starts with a .
+bool file_filter(boost::filesystem::path const& filename)
{
- path f(p / l);
- if (is_directory(f))
- {
- for (directory_iterator i(f), end; i != end; ++i)
- add_files(t, p, l / i->leaf());
- }
- else
- {
- std::cerr << "adding \"" << l.string() << "\"\n";
- t.add_file(l, file_size(f));
- }
+ if (filename.leaf()[0] == '.') return false;
+ std::cerr << filename << std::endl;
+ return true;
+}
+
+void print_progress(int i, int num)
+{
+ std::cerr << "\r" << (i+1) << "/" << num;
}
int main(int argc, char* argv[])
@@ -212,52 +229,48 @@ int main(int argc, char* argv[])
using namespace libtorrent;
using namespace boost::filesystem;
+ int piece_size = 256 * 1024;
+ char const* creator_str = "libtorrent";
+
path::default_name_check(no_check);
- if (argc != 4)
+ if (argc != 4 && argc != 5)
{
std::cerr << "usage: make_torrent <output torrent-file> "
- "<announce url> <file or directory to create torrent from>\n";
- return 1;
- }
+ "<announce url> <file or directory to create torrent from> "
+ "[url-seed]\n";
+ return 1;
+}
+#ifndef BOOST_NO_EXCEPTIONS
try
{
- torrent_info t;
- path full_path = complete(path(argv[3]));
- ofstream out(complete(path(argv[1])), std::ios_base::binary);
-
- int piece_size = 256 * 1024;
- char const* creator_str = "libtorrent";
-
- add_files(t, full_path.branch_path(), full_path.leaf());
- t.set_piece_size(piece_size);
-
+#endif
+ file_storage fs;
file_pool fp;
- storage st(t, full_path.branch_path(), fp);
+ path full_path = complete(path(argv[3]));
+
+ add_files(fs, full_path, file_filter);
+
+ create_torrent t(fs, piece_size);
t.add_tracker(argv[2]);
-
- // calculate the hash for all pieces
- int num = t.num_pieces();
- std::vector<char> buf(piece_size);
- for (int i = 0; i < num; ++i)
- {
- st.read(&buf[0], i, 0, t.piece_size(i));
- hasher h(&buf[0], t.piece_size(i));
- t.set_hash(i, h.final());
- std::cerr << (i+1) << "/" << num << "\r";
- }
-
+ set_piece_hashes(t, full_path.branch_path()
+ , boost::bind(&print_progress, _1, t.num_pieces()));
+ std::cerr << std::endl;
t.set_creator(creator_str);
+ if (argc == 5) t.add_url_seed(argv[4]);
+
// create the torrent and print it to out
- entry e = t.create_torrent();
- libtorrent::bencode(std::ostream_iterator<char>(out), e);
- }
- catch (std::exception& e)
+ ofstream out(complete(path(argv[1])), std::ios_base::binary);
+ bencode(std::ostream_iterator<char>(out), t.generate());
+#ifndef BOOST_NO_EXCEPTIONS
+ }
+ catch (std::exception& e)
{
std::cerr << e.what() << "\n";
}
+#endif
return 0;
}
diff --git a/docs/examples.rst b/docs/examples.rst
index 4f459a1ba..1ad5aa012 100644
--- a/docs/examples.rst
+++ b/docs/examples.rst
@@ -24,37 +24,57 @@ dump_torrent
This is an example of a program that will take a torrent-file as a parameter and
print information about it to std out::
-
#include
#include
#include
#include
-
+
#include "libtorrent/entry.hpp"
#include "libtorrent/bencode.hpp"
#include "libtorrent/torrent_info.hpp"
-
-
+ #include "libtorrent/lazy_entry.hpp"
+ #include
+
+
int main(int argc, char* argv[])
{
using namespace libtorrent;
-
+ using namespace boost::filesystem;
+
if (argc != 2)
{
std::cerr << "usage: dump_torrent torrent-file\n";
return 1;
}
-
+ #if BOOST_VERSION < 103400
+ boost::filesystem::path::default_name_check(boost::filesystem::no_check);
+ #endif
+
+ #ifndef BOOST_NO_EXCEPTIONS
try
{
- std::ifstream in(argv[1], std::ios_base::binary);
- in.unsetf(std::ios_base::skipws);
- entry e = bdecode(std::istream_iterator(in)
- , std::istream_iterator());
-
+ #endif
+
+ int size = file_size(argv[1]);
+ if (size > 10 * 1000000)
+ {
+ std::cerr << "file too big (" << size << "), aborting\n";
+ return 1;
+ }
+ std::vector buf(size);
+ std::ifstream(argv[1], std::ios_base::binary).read(&buf[0], size);
+ lazy_entry e;
+ int ret = lazy_bdecode(&buf[0], &buf[0] + buf.size(), e);
+
+ if (ret != 0)
+ {
+ std::cerr << "invalid bencoding: " << ret << std::endl;
+ return 1;
+ }
+
std::cout << "\n\n----- raw info -----\n\n";
- e.print(std::cout);
-
+ std::cout << e << std::endl;
+
torrent_info t(e);
// print info about torrent
@@ -67,85 +87,83 @@ print information about it to std out::
{
std::cout << i->first << ":" << i->second << "\n";
}
-
std::cout << "trackers:\n";
- for (std::vector::const_iterator i
- = t.trackers().begin(); i != t.trackers().end(); ++i)
+ for (std::vector::const_iterator i = t.trackers().begin();
+ i != t.trackers().end(); ++i)
{
std::cout << i->tier << ": " << i->url << "\n";
}
-
+
std::cout << "number of pieces: " << t.num_pieces() << "\n";
std::cout << "piece length: " << t.piece_length() << "\n";
std::cout << "info hash: " << t.info_hash() << "\n";
std::cout << "comment: " << t.comment() << "\n";
std::cout << "created by: " << t.creator() << "\n";
std::cout << "files:\n";
+ int index = 0;
for (torrent_info::file_iterator i = t.begin_files();
- i != t.end_files(); ++i)
+ i != t.end_files(); ++i, ++index)
{
+ int first = t.map_file(index, 0, 1).piece;
+ int last = t.map_file(index, i->size - 1, 1).piece;
std::cout << " " << std::setw(11) << i->size
- << " " << i->path.string() << "\n";
+ << " " << i->path.string() << "[ " << first << ", "
+ << last << " ]\n";
}
-
+
+ #ifndef BOOST_NO_EXCEPTIONS
}
catch (std::exception& e)
{
std::cout << e.what() << "\n";
}
-
+ #endif
+
return 0;
}
-
simple client
-------------
This is a simple client. It doesn't have much output to keep it simple::
- #include
- #include
- #include
- #include
-
- #include
- #include
-
- #include "libtorrent/entry.hpp"
- #include "libtorrent/bencode.hpp"
- #include "libtorrent/session.hpp"
-
int main(int argc, char* argv[])
{
using namespace libtorrent;
+ #if BOOST_VERSION < 103400
+ namespace fs = boost::filesystem;
+ fs::path::default_name_check(fs::no_check);
+ #endif
- if (argc != 2)
- {
- std::cerr << "usage: ./simple_cient torrent-file\n"
- "to stop the client, press return.\n";
- return 1;
- }
-
+ if (argc != 2)
+ {
+ std::cerr << "usage: ./simple_client torrent-file\n"
+ "to stop the client, press return.\n";
+ return 1;
+ }
+
+ #ifndef BOOST_NO_EXCEPTIONS
try
+ #endif
{
session s;
s.listen_on(std::make_pair(6881, 6889));
+ add_torrent_params p;
+ p.save_path = "./";
+ p.ti = new torrent_info(argv[1]);
+ s.add_torrent(p);
- std::ifstream in(argv[1], std::ios_base::binary);
- in.unsetf(std::ios_base::skipws);
- entry e = bdecode(std::istream_iterator(in)
- , std::istream_iterator());
- s.add_torrent(torrent_info(e), "");
-
// wait for the user to end
char a;
std::cin.unsetf(std::ios_base::skipws);
std::cin >> a;
}
+ #ifndef BOOST_NO_EXCEPTIONS
catch (std::exception& e)
{
std::cout << e.what() << "\n";
}
+ #endif
return 0;
}
@@ -165,31 +183,28 @@ Shows how to create a torrent from a directory tree::
#include "libtorrent/file.hpp"
#include "libtorrent/storage.hpp"
#include "libtorrent/hasher.hpp"
- #include "libtorrent/file_pool.hpp"
+ #include "libtorrent/create_torrent.hpp"
#include
#include
#include
+ #include
using namespace boost::filesystem;
using namespace libtorrent;
- void add_files(
- torrent_info& t
- , path const& p
- , path const& l)
+ // do not include files and folders whose
+ // name starts with a .
+ bool file_filter(boost::filesystem::path const& filename)
{
- path f(p / l);
- if (is_directory(f))
- {
- for (directory_iterator i(f), end; i != end; ++i)
- add_files(t, p, l / i->leaf());
- }
- else
- {
- std::cerr << "adding \"" << l.string() << "\"\n";
- t.add_file(l, file_size(f));
- }
+ if (filename.leaf()[0] == '.') return false;
+ std::cerr << filename << std::endl;
+ return true;
+ }
+
+ void print_progress(int i, int num)
+ {
+ std::cerr << "\r" << (i+1) << "/" << num;
}
int main(int argc, char* argv[])
@@ -197,54 +212,49 @@ Shows how to create a torrent from a directory tree::
using namespace libtorrent;
using namespace boost::filesystem;
+ int piece_size = 256 * 1024;
+ char const* creator_str = "libtorrent";
+
path::default_name_check(no_check);
- if (argc != 4)
+ if (argc != 4 && argc != 5)
{
std::cerr << "usage: make_torrent