From cd71f3fb9b088b47950f9014be75bbc3e0ccb0c8 Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Sat, 9 Aug 2008 07:34:12 +0000 Subject: [PATCH] updated examples page --- docs/examples.html | 177 ++++++++++++++++++++------------------- docs/examples.rst | 200 ++++++++++++++++++++++++--------------------- 2 files changed, 200 insertions(+), 177 deletions(-) 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[])

simple client

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 " - " \n"; - return 1; - } + " " + "[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 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(out), e); - } - catch (std::exception& e) + ofstream out(complete(path(argv[1])), std::ios_base::binary); + bencode(std::ostream_iterator(out), t.generate()); + #ifndef BOOST_NO_EXCEPTIONS + } + catch (std::exception& e) { std::cerr << e.what() << "\n"; } + #endif return 0; } -