*** empty log message ***

This commit is contained in:
Arvid Norberg 2003-11-28 17:29:27 +00:00
parent 734ff429c2
commit 94919f9806
12 changed files with 342 additions and 160 deletions

View File

@ -35,21 +35,31 @@
<li><a class="reference" href="#status" id="id14" name="id14">status()</a></li>
<li><a class="reference" href="#get-download-queue" id="id15" name="id15">get_download_queue()</a></li>
<li><a class="reference" href="#get-peer-info" id="id16" name="id16">get_peer_info()</a></li>
<li><a class="reference" href="#get-torrent-info" id="id17" name="id17">get_torrent_info()</a></li>
<li><a class="reference" href="#is-valid" id="id18" name="id18">is_valid()</a></li>
</ul>
</li>
<li><a class="reference" href="#address" id="id17" name="id17">address</a></li>
<li><a class="reference" href="#http-settings" id="id18" name="id18">http_settings</a></li>
<li><a class="reference" href="#big-number" id="id19" name="id19">big_number</a></li>
<li><a class="reference" href="#hasher" id="id20" name="id20">hasher</a></li>
<li><a class="reference" href="#example-usage" id="id21" name="id21">example usage</a><ul>
<li><a class="reference" href="#dump-torrent" id="id22" name="id22">dump_torrent</a></li>
<li><a class="reference" href="#simple-client" id="id23" name="id23">simple client</a></li>
<li><a class="reference" href="#address" id="id19" name="id19">address</a></li>
<li><a class="reference" href="#http-settings" id="id20" name="id20">http_settings</a></li>
<li><a class="reference" href="#big-number" id="id21" name="id21">big_number</a></li>
<li><a class="reference" href="#hasher" id="id22" name="id22">hasher</a></li>
<li><a class="reference" href="#exceptions" id="id23" name="id23">exceptions</a><ul>
<li><a class="reference" href="#invalid-handle" id="id24" name="id24">invalid_handle</a></li>
<li><a class="reference" href="#duplicate-torrent" id="id25" name="id25">duplicate_torrent</a></li>
<li><a class="reference" href="#invalid-encoding" id="id26" name="id26">invalid_encoding</a></li>
<li><a class="reference" href="#type-error" id="id27" name="id27">type_error</a></li>
<li><a class="reference" href="#invalid-torrent-file" id="id28" name="id28">invalid_torrent_file</a></li>
</ul>
</li>
<li><a class="reference" href="#example-usage" id="id29" name="id29">example usage</a><ul>
<li><a class="reference" href="#dump-torrent" id="id30" name="id30">dump_torrent</a></li>
<li><a class="reference" href="#simple-client" id="id31" name="id31">simple client</a></li>
</ul>
</li>
</ul>
</li>
<li><a class="reference" href="#feedback" id="id24" name="id24">Feedback</a></li>
<li><a class="reference" href="#aknowledgements" id="id25" name="id25">Aknowledgements</a></li>
<li><a class="reference" href="#feedback" id="id32" name="id32">Feedback</a></li>
<li><a class="reference" href="#aknowledgements" id="id33" name="id33">Aknowledgements</a></li>
</ul>
</div>
<div class="section" id="introduction">
@ -159,7 +169,8 @@ The main thread will be idle as long it doesn't have any torrents to participate
You add torrents through the <tt class="literal"><span class="pre">add_torrent()</span></tt>-function where you give an
object representing the information found in the torrent file and the path where you
want to save the files. The <tt class="literal"><span class="pre">save_path</span></tt> will be prepended to the directory-
structure in the torrent-file.</p>
structure in the torrent-file. <tt class="literal"><span class="pre">add_torrent</span></tt> will throw <tt class="literal"><span class="pre">duplicate_torrent</span></tt> exception
if the torrent already exists in the session.</p>
<p><tt class="literal"><span class="pre">remove_torrent()</span></tt> will close all peer connections associated with the torrent and tell
the tracker that we've stopped participating in the swarm.</p>
<p>If the torrent you are trying to add already exists in the session (is either queued
@ -388,9 +399,11 @@ struct torrent_handle
{
torrent_handle();
torrent_status status() const;
torrent_status status();
void get_download_queue(std::vector&lt;partial_piece_info&gt;&amp; queue);
void get_peer_info(std::vector&lt;peer_info&gt;&amp; v);
const torrent_info&amp; get_torrent_info();
bool is_valid();
};
</pre>
<p>The default constructor will initialize the handle to an invalid state. Which means you cannot
@ -399,7 +412,8 @@ any operation they will simply return.</p>
<div class="section" id="status">
<h3><a class="toc-backref" href="#id14" name="status">status()</a></h3>
<p><tt class="literal"><span class="pre">status()</span></tt> will return a structure with information about the status of this
torrent. It contains the following fields:</p>
torrent. If the <tt class="literal"><span class="pre">torrent_handle</span></tt> is invalid, it will throw <tt class="literal"><span class="pre">invalid_handle</span></tt> exception.
It contains the following fields:</p>
<pre class="literal-block">
struct torrent_status
{
@ -430,11 +444,6 @@ current task is in the <tt class="literal"><span class="pre">state</span></tt> m
<col width="72%" />
</colgroup>
<tbody valign="top">
<tr><td><tt class="literal"><span class="pre">invalid_handle</span></tt></td>
<td>This will be the state if you called status on an
uninitialized handle (a handle that was constructed
with the default constructor).</td>
</tr>
<tr><td><tt class="literal"><span class="pre">queued_for_checking</span></tt></td>
<td>The torrent is in the queue for being checked. But there
currently is another torrent that are being checked.
@ -498,8 +507,10 @@ may pass then.</p>
<div class="section" id="get-peer-info">
<h3><a class="toc-backref" href="#id16" name="get-peer-info">get_peer_info()</a></h3>
<p><tt class="literal"><span class="pre">get_peer_info()</span></tt> takes a reference to a vector that will be cleared and filled
with one entry for each peer connected to this torrent. Each entry contains information about
that particular peer. It contains the following information:</p>
with one entry for each peer connected to this torrent, given the handle is valid. If the
<tt class="literal"><span class="pre">torrent_handle</span></tt> is invalid, it will throw <tt class="literal"><span class="pre">invalid_handle</span></tt> exception. Each entry in
the vector contains information about that particular peer. It contains the following
fields:</p>
<pre class="literal-block">
struct peer_info
{
@ -543,9 +554,20 @@ or if the peer miss that piece (set to false).</p>
<p><tt class="literal"><span class="pre">upload_limit</span></tt> is the number of bytes per second we are allowed to send to this
peer every second. It may be -1 if there's no limit.</p>
</div>
<div class="section" id="get-torrent-info">
<h3><a class="toc-backref" href="#id17" name="get-torrent-info">get_torrent_info()</a></h3>
<p>Returns a const reference to the <tt class="literal"><span class="pre">torrent_info</span></tt> object associated with this torrent.
This reference is valid as long as the <tt class="literal"><span class="pre">torrent_handle</span></tt> is valid, no longer. If the
<tt class="literal"><span class="pre">torrent_handle</span></tt> is invalid, <tt class="literal"><span class="pre">invalid_handle</span></tt> exception will be thrown.</p>
</div>
<div class="section" id="is-valid">
<h3><a class="toc-backref" href="#id18" name="is-valid">is_valid()</a></h3>
<p>Returns true if this handle refers to a valid torrent and false if it hasn't been initialized
or if the torrent it refers to has been aborted.</p>
</div>
</div>
<div class="section" id="address">
<h2><a class="toc-backref" href="#id17" name="address">address</a></h2>
<h2><a class="toc-backref" href="#id19" name="address">address</a></h2>
<p>The <tt class="literal"><span class="pre">address</span></tt> class represents a name of a network endpoint (usually referred to as
IP-address) and a port number. This is the same thing as a <tt class="literal"><span class="pre">sockaddr_in</span></tt> would contain.
Its declaration looks like this:</p>
@ -554,8 +576,7 @@ class address
{
public:
address();
address(
unsigned char a
address(unsigned char a
, unsigned char b
, unsigned char c
, unsigned char d
@ -579,7 +600,7 @@ while it does the DNS lookup, it returns a string that points to the address rep
<p><tt class="literal"><span class="pre">ip()</span></tt> will return the 32-bit ip-address as an integer. <tt class="literal"><span class="pre">port()</span></tt> returns the port number.</p>
</div>
<div class="section" id="http-settings">
<h2><a class="toc-backref" href="#id18" name="http-settings">http_settings</a></h2>
<h2><a class="toc-backref" href="#id20" name="http-settings">http_settings</a></h2>
<p>You have some control over tracker requests through the <tt class="literal"><span class="pre">http_settings</span></tt> object. You
create it and fill it with your settings and the use <tt class="literal"><span class="pre">session::set_http_settings()</span></tt>
to apply them. You have control over proxy and authorization settings and also the user-agent
@ -607,9 +628,10 @@ on the uncompressed data. So, if you get 20 bytes of gzip response that'll
expand to 2 megs, it will be interrupted before the entire response has been
uncompressed (given your limit is lower than 2 megs). Default limit is
1 megabyte.</p>
<p>TODO: finish document http_settings</p>
</div>
<div class="section" id="big-number">
<h2><a class="toc-backref" href="#id19" name="big-number">big_number</a></h2>
<h2><a class="toc-backref" href="#id21" name="big-number">big_number</a></h2>
<p>Both the <tt class="literal"><span class="pre">peer_id</span></tt> and <tt class="literal"><span class="pre">sha1_hash</span></tt> types are typedefs of the class
<tt class="literal"><span class="pre">big_number</span></tt>. It represents 20 bytes of data. Its synopsis follows:</p>
<pre class="literal-block">
@ -630,7 +652,7 @@ public:
<p>The iterators gives you access to individual bytes.</p>
</div>
<div class="section" id="hasher">
<h2><a class="toc-backref" href="#id20" name="hasher">hasher</a></h2>
<h2><a class="toc-backref" href="#id22" name="hasher">hasher</a></h2>
<p>This class creates sha1-hashes. Its declaration looks like this:</p>
<pre class="literal-block">
class hasher
@ -653,10 +675,69 @@ call <tt class="literal"><span class="pre">reset()</span></tt> to reinitialize i
<p>The sha1-algorithm used was implemented by Steve Reid and released as public domain.
For more info, see <tt class="literal"><span class="pre">src/sha1.c</span></tt>.</p>
</div>
<div class="section" id="exceptions">
<h2><a class="toc-backref" href="#id23" name="exceptions">exceptions</a></h2>
<p>There are a number of exceptions that can be thrown from different places in libtorrent,
here's a complete list with description.</p>
<div class="section" id="invalid-handle">
<h3><a class="toc-backref" href="#id24" name="invalid-handle">invalid_handle</a></h3>
<p>This exception is thrown when querying information from a <tt class="literal"><span class="pre">torrent_handle</span></tt> that hasn't
been initialized or that has become invalid.</p>
<pre class="literal-block">
struct invalid_handle: std::exception
{
const char* what() const throw();
};
</pre>
</div>
<div class="section" id="duplicate-torrent">
<h3><a class="toc-backref" href="#id25" name="duplicate-torrent">duplicate_torrent</a></h3>
<p>This is thrown by <tt class="literal"><span class="pre">session::add_torrent()</span></tt> if the torrent already has been added to
the session.</p>
<pre class="literal-block">
struct duplicate_torrent: std::exception
{
const char* what() const throw();
};
</pre>
</div>
<div class="section" id="invalid-encoding">
<h3><a class="toc-backref" href="#id26" name="invalid-encoding">invalid_encoding</a></h3>
<p>This is thrown by <tt class="literal"><span class="pre">bdecode()</span></tt> if the input data is not a valid bencoding.</p>
<pre class="literal-block">
struct invalid_encoding: std::exception
{
const char* what() const throw();
};
</pre>
</div>
<div class="section" id="type-error">
<h3><a class="toc-backref" href="#id27" name="type-error">type_error</a></h3>
<p>This is thrown from the accessors of <tt class="literal"><span class="pre">entry</span></tt> if the data type of the <tt class="literal"><span class="pre">entry</span></tt> doesn't
match the type you want to extract from it.</p>
<pre class="literal-block">
struct type_error: std::runtime_error
{
type_error(const char* error);
};
</pre>
</div>
<div class="section" id="invalid-torrent-file">
<h3><a class="toc-backref" href="#id28" name="invalid-torrent-file">invalid_torrent_file</a></h3>
<p>This exception is thrown from the constructor of <tt class="literal"><span class="pre">torrent_info</span></tt> if the given bencoded information
doesn't meet the requirements on what information has to be present in a torrent file.</p>
<pre class="literal-block">
struct invalid_torrent_file: std::exception
{
const char* what() const throw();
};
</pre>
</div>
</div>
<div class="section" id="example-usage">
<h2><a class="toc-backref" href="#id21" name="example-usage">example usage</a></h2>
<h2><a class="toc-backref" href="#id29" name="example-usage">example usage</a></h2>
<div class="section" id="dump-torrent">
<h3><a class="toc-backref" href="#id22" name="dump-torrent">dump_torrent</a></h3>
<h3><a class="toc-backref" href="#id30" name="dump-torrent">dump_torrent</a></h3>
<p>This is an example of a program that will take a torrent-file as a parameter and
print information about it to std out:</p>
<pre class="literal-block">
@ -664,13 +745,11 @@ print information about it to std out:</p>
#include &lt;fstream&gt;
#include &lt;iterator&gt;
#include &lt;exception&gt;
#include &lt;vector&gt;
#include &lt;iomanip&gt;
#include &quot;libtorrent/entry.hpp&quot;
#include &quot;libtorrent/bencode.hpp&quot;
#include &quot;libtorrent/session.hpp&quot;
#include &quot;libtorrent/http_settings.hpp&quot;
#include &quot;libtorrent/torrent_info.hpp&quot;
int main(int argc, char* argv[])
@ -722,7 +801,7 @@ int main(int argc, char* argv[])
</pre>
</div>
<div class="section" id="simple-client">
<h3><a class="toc-backref" href="#id23" name="simple-client">simple client</a></h3>
<h3><a class="toc-backref" href="#id31" name="simple-client">simple client</a></h3>
<p>This is a simple client. It doesn't have much output to keep it simple:</p>
<pre class="literal-block">
#include &lt;iostream&gt;
@ -775,12 +854,12 @@ int main(int argc, char* argv[])
</div>
</div>
<div class="section" id="feedback">
<h1><a class="toc-backref" href="#id24" name="feedback">Feedback</a></h1>
<h1><a class="toc-backref" href="#id32" name="feedback">Feedback</a></h1>
<p>There's a <a class="reference" href="http://lists.sourceforge.net/lists/listinfo/libtorrent-discuss">mailing list</a>.</p>
<p>You can usually find me as hydri in <tt class="literal"><span class="pre">#btports</span> <span class="pre">&#64;</span> <span class="pre">irc.freenode.net</span></tt>.</p>
</div>
<div class="section" id="aknowledgements">
<h1><a class="toc-backref" href="#id25" name="aknowledgements">Aknowledgements</a></h1>
<h1><a class="toc-backref" href="#id33" name="aknowledgements">Aknowledgements</a></h1>
<p>Written by Arvid Norberg and Daniel Wallin. Copyright (c) 2003</p>
<p>Project is hosted by sourceforge.</p>
<p><a class="reference" href="http://sourceforge.net"><img alt="sf_logo" src="http://sourceforge.net/sflogo.php?group_id=7994" /></a></p>

View File

@ -138,7 +138,8 @@ The main thread will be idle as long it doesn't have any torrents to participate
You add torrents through the ``add_torrent()``-function where you give an
object representing the information found in the torrent file and the path where you
want to save the files. The ``save_path`` will be prepended to the directory-
structure in the torrent-file.
structure in the torrent-file. ``add_torrent`` will throw ``duplicate_torrent`` exception
if the torrent already exists in the session.
``remove_torrent()`` will close all peer connections associated with the torrent and tell
the tracker that we've stopped participating in the swarm.
@ -417,9 +418,11 @@ Its declaration looks like this::
{
torrent_handle();
torrent_status status() const;
torrent_status status();
void get_download_queue(std::vector<partial_piece_info>& queue);
void get_peer_info(std::vector<peer_info>& v);
const torrent_info& get_torrent_info();
bool is_valid();
};
The default constructor will initialize the handle to an invalid state. Which means you cannot
@ -427,13 +430,12 @@ perform any operation on it, unless you first assign it a valid handle. If you t
any operation they will simply return.
status()
~~~~~~~~
``status()`` will return a structure with information about the status of this
torrent. It contains the following fields::
torrent. If the ``torrent_handle`` is invalid, it will throw ``invalid_handle`` exception.
It contains the following fields::
struct torrent_status
{
@ -459,10 +461,6 @@ torrent. It contains the following fields::
torrent's current task. It may be checking files or downloading. The torrent's
current task is in the ``state`` member, it will be one of the following:
+-----------------------+----------------------------------------------------------+
|``invalid_handle`` |This will be the state if you called status on an |
| |uninitialized handle (a handle that was constructed |
| |with the default constructor). |
+-----------------------+----------------------------------------------------------+
|``queued_for_checking``|The torrent is in the queue for being checked. But there |
| |currently is another torrent that are being checked. |
@ -526,14 +524,14 @@ When a piece fails a hash verification, single blocks may be redownloaded to see
may pass then.
get_peer_info()
~~~~~~~~~~~~~~~
``get_peer_info()`` takes a reference to a vector that will be cleared and filled
with one entry for each peer connected to this torrent. Each entry contains information about
that particular peer. It contains the following information::
with one entry for each peer connected to this torrent, given the handle is valid. If the
``torrent_handle`` is invalid, it will throw ``invalid_handle`` exception. Each entry in
the vector contains information about that particular peer. It contains the following
fields::
struct peer_info
{
@ -584,6 +582,20 @@ or if the peer miss that piece (set to false).
peer every second. It may be -1 if there's no limit.
get_torrent_info()
~~~~~~~~~~~~~~~~~~
Returns a const reference to the ``torrent_info`` object associated with this torrent.
This reference is valid as long as the ``torrent_handle`` is valid, no longer. If the
``torrent_handle`` is invalid, ``invalid_handle`` exception will be thrown.
is_valid()
~~~~~~~~~~
Returns true if this handle refers to a valid torrent and false if it hasn't been initialized
or if the torrent it refers to has been aborted.
address
-------
@ -596,8 +608,7 @@ Its declaration looks like this::
{
public:
address();
address(
unsigned char a
address(unsigned char a
, unsigned char b
, unsigned char c
, unsigned char d
@ -658,7 +669,7 @@ expand to 2 megs, it will be interrupted before the entire response has been
uncompressed (given your limit is lower than 2 megs). Default limit is
1 megabyte.
TODO: finish document http_settings
big_number
----------
@ -713,6 +724,84 @@ The sha1-algorithm used was implemented by Steve Reid and released as public dom
For more info, see ``src/sha1.c``.
exceptions
----------
There are a number of exceptions that can be thrown from different places in libtorrent,
here's a complete list with description.
invalid_handle
~~~~~~~~~~~~~~
This exception is thrown when querying information from a ``torrent_handle`` that hasn't
been initialized or that has become invalid.
::
struct invalid_handle: std::exception
{
const char* what() const throw();
};
duplicate_torrent
~~~~~~~~~~~~~~~~~
This is thrown by ``session::add_torrent()`` if the torrent already has been added to
the session.
::
struct duplicate_torrent: std::exception
{
const char* what() const throw();
};
invalid_encoding
~~~~~~~~~~~~~~~~
This is thrown by ``bdecode()`` if the input data is not a valid bencoding.
::
struct invalid_encoding: std::exception
{
const char* what() const throw();
};
type_error
~~~~~~~~~~
This is thrown from the accessors of ``entry`` if the data type of the ``entry`` doesn't
match the type you want to extract from it.
::
struct type_error: std::runtime_error
{
type_error(const char* error);
};
invalid_torrent_file
~~~~~~~~~~~~~~~~~~~~
This exception is thrown from the constructor of ``torrent_info`` if the given bencoded information
doesn't meet the requirements on what information has to be present in a torrent file.
::
struct invalid_torrent_file: std::exception
{
const char* what() const throw();
};
example usage
-------------
@ -726,13 +815,11 @@ print information about it to std out::
#include <fstream>
#include <iterator>
#include <exception>
#include <vector>
#include <iomanip>
#include "libtorrent/entry.hpp"
#include "libtorrent/bencode.hpp"
#include "libtorrent/session.hpp"
#include "libtorrent/http_settings.hpp"
#include "libtorrent/torrent_info.hpp"
int main(int argc, char* argv[])

View File

@ -33,14 +33,11 @@ POSSIBILITY OF SUCH DAMAGE.
#include <iostream>
#include <fstream>
#include <iterator>
#include <exception>
#include <vector>
#include <iomanip>
#include "libtorrent/entry.hpp"
#include "libtorrent/bencode.hpp"
#include "libtorrent/session.hpp"
#include "libtorrent/http_settings.hpp"
#include "libtorrent/torrent_info.hpp"
int main(int argc, char* argv[])

View File

@ -30,21 +30,6 @@ POSSIBILITY OF SUCH DAMAGE.
*/
/*
implemented
* http-proxy authentication for tracker requests
* multitracker support
* spawns separate temporary threads for file checking
*
missing
* endgame-mode
* correct algorithm for choking and unchoking
*/
#ifndef TORRENT_SESSION_HPP_INCLUDED
#define TORRENT_SESSION_HPP_INCLUDED
@ -74,8 +59,6 @@ POSSIBILITY OF SUCH DAMAGE.
// TODO: if we're not interested and the peer isn't interested, close the connections
// TODO: instead of implementing end-game mode, have an algorithm that
// constantly prioritizes high-bandwidth sources.
namespace libtorrent
{

View File

@ -39,7 +39,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include "libtorrent/peer_id.hpp"
#include "libtorrent/peer_info.hpp"
#include "libtorrent/piece_picker.hpp"
#include "libtorrent/torrent_info.hpp"
namespace libtorrent
{
@ -55,11 +55,16 @@ namespace libtorrent
{ return "torrent already exists in session"; }
};
struct invalid_handle: std::exception
{
virtual const char* what() const throw()
{ return "invalid torrent handle used"; }
};
struct torrent_status
{
enum state_t
{
invalid_handle,
queued_for_checking,
checking_files,
downloading,
@ -96,17 +101,20 @@ namespace libtorrent
torrent_handle(): m_ses(0) {}
void get_peer_info(std::vector<peer_info>& v);
torrent_status status() const;
void get_download_queue(std::vector<partial_piece_info>& queue) const;
torrent_status status();
void get_download_queue(std::vector<partial_piece_info>& queue);
const torrent_info& get_torrent_info();
bool is_valid();
// TODO: add force reannounce
// TODO: add torrent_info getter
// TODO: add a feature where the user can ask the torrent
// to finish all pieces currently in the pipeline, and then
// abort the torrent.
private:
// called by session::remove_torrent()
void abort() const;
torrent_handle(detail::session_impl* s,
detail::checker_impl* c,
const sha1_hash& h)

View File

@ -841,7 +841,7 @@ void libtorrent::peer_connection::receive_data()
{
// verify peer_id
// TODO: It seems like the original client ignores to check the peer id
// can this be correct?
// can that be correct?
if (!std::equal(m_recv_buffer.begin(), m_recv_buffer.begin() + 20, (const char*)m_peer_id.begin()))
{
#ifndef NDEBUG

View File

@ -305,7 +305,7 @@ namespace libtorrent
// TODO: since inc_refcount is called
// with sequential indices when peers
// connect, it will sort the pieces
// connect, the pieces will be sorted.
// that is not good. one solution is
// to insert the element at a random
// index when moving it to another

View File

@ -37,6 +37,10 @@ POSSIBILITY OF SUCH DAMAGE.
#include "libtorrent/socket.hpp"
#include "libtorrent/peer_connection.hpp"
#if defined(_MSC_VER) && _MSC_VER < 1300
# define for if (false) {} else for
#endif
namespace
{
enum
@ -189,6 +193,18 @@ namespace libtorrent
void peer_connection::unchoke();
void peer_connection::request_piece(int index);
const std::vector<int>& peer_connection::download_queue();
TODO: to implement choking/unchoking we need a list with all
connected peers. Something like this:
struct peer
{
peer_id id;
boost::posix_time::ptime last_optimistically_unchoked;
float average_down_rate;
boost::weak_ptr<peer_connection> connection;
};
*/

View File

@ -42,6 +42,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include <boost/lexical_cast.hpp>
#include <boost/filesystem/convenience.hpp>
#include <boost/filesystem/exception.hpp>
#include "libtorrent/peer_id.hpp"
#include "libtorrent/torrent_info.hpp"
@ -104,6 +105,12 @@ namespace libtorrent
std::make_pair(t->info_hash, t->torrent_ptr)).first;
}
}
catch(const boost::filesystem::filesystem_error& e)
{
#ifndef NDEBUG
std::cerr << "error while checking files: " << e.what() << "\n";
#endif
}
catch(...)
{
#ifndef NDEBUG
@ -387,6 +394,9 @@ namespace libtorrent
// will shift bandwidth from the peers that can't
// utilize all their assigned bandwidth to the peers
// that actually can maintain the upload rate.
// This should probably be done by accumulating the
// left-over bandwidth to next second. Since the
// the sockets consumes its data in rather big chunks.
if (m_upload_rate != -1 && !m_connections.empty())
{
assert(m_upload_rate >= 0);
@ -561,8 +571,6 @@ namespace libtorrent
// create the torrent and the data associated with
// the checker thread and store it before starting
// the thread
// TODO: have a queue of checking torrents instead of
// having them all run at the same time
boost::shared_ptr<torrent> torrent_ptr(new torrent(&m_impl, ti));
detail::piece_checker_data d;
@ -585,8 +593,28 @@ namespace libtorrent
void session::remove_torrent(const torrent_handle& h)
{
if (h.m_ses != &m_impl) return;
// TODO: move the code of abort() here instead of calling it
h.abort();
assert(h.m_chk == &m_checker_impl);
{
boost::mutex::scoped_lock l(m_impl.m_mutex);
torrent* t = m_impl.find_torrent(h.m_info_hash);
if (t != 0)
{
t->abort();
return;
}
}
{
boost::mutex::scoped_lock l(m_checker_impl.m_mutex);
detail::piece_checker_data* d = m_checker_impl.find_torrent(h.m_info_hash);
if (d != 0)
{
d->abort = true;
return;
}
}
}
void session::set_http_settings(const http_settings& s)

View File

@ -771,9 +771,9 @@ void libtorrent::storage::allocate_pieces(int num)
fs::ofstream out;
if (fs::exists(path))
out.open(path, std::ios_base::binary | std::ios_base::in);
out.open(path.native_file_string().c_str(), std::ios_base::binary | std::ios_base::in);
else
out.open(path, std::ios_base::binary);
out.open(path.native_file_string().c_str(), std::ios_base::binary);
// std::ofstream out((m_save_path / file_iter->path / file_iter->filename).native_file_string().c_str()
// , std::ios_base::binary | std::ios_base::in);
@ -1156,8 +1156,11 @@ void libtorrent::storage::initialize_pieces(torrent* t,
{
boost::mutex::scoped_lock lock(mutex);
// TODO: finish
// data->progress = ;
if (data->abort)
;
return;
}
fs::path path(m_save_path / file_iter->path);
@ -1173,7 +1176,7 @@ void libtorrent::storage::initialize_pieces(torrent* t,
{
in.close();
in.clear();
in.open(path, std::ios_base::binary);
in.open(path.native_file_string().c_str(), std::ios_base::binary);
changed_file = false;
@ -1311,6 +1314,7 @@ void libtorrent::storage::initialize_pieces(torrent* t,
}
#if 0 // OLD STORAGE
/*
// allocate files will create all files that are missing
// if there are some files that already exists, it checks
@ -1327,21 +1331,6 @@ void libtorrent::storage::initialize_pieces(torrent* t,
m_save_path = path;
m_torrent_file = &t->torrent_file();
// TEMPORARY!
/*
m_bytes_left = 0;
m_have_piece.resize(m_torrent_file->num_pieces());
std::fill(m_have_piece.begin(), m_have_piece.end(), true);
return;
*/
/*
m_bytes_left = m_torrent_file->total_size();
m_have_piece.resize(m_torrent_file->num_pieces());
std::fill(m_have_piece.begin(), m_have_piece.end(), false);
return;
*/
// we don't know of any piece we have right now. Initialize
// it to say we don't have anything and fill it in later on.
m_have_piece.resize(m_torrent_file->num_pieces());
@ -1476,6 +1465,6 @@ void libtorrent::storage::initialize_pieces(torrent* t,
}
}
*/
#endif

View File

@ -63,20 +63,9 @@ namespace std
namespace libtorrent
{
torrent_status torrent_handle::status() const
torrent_status torrent_handle::status()
{
if (m_ses == 0)
{
torrent_status st;
st.total_download = 0;
st.total_upload = 0;
st.progress = 0.f;
st.state = torrent_status::invalid_handle;
st.next_announce = boost::posix_time::time_duration();
st.pieces.clear();
st.total_done = 0;
return st;
}
if (m_ses == 0) throw invalid_handle();
assert(m_chk != 0);
{
@ -107,21 +96,54 @@ namespace libtorrent
}
}
torrent_status st;
st.total_download = 0;
st.total_upload = 0;
st.progress = 0.f;
st.state = torrent_status::invalid_handle;
st.pieces.clear();
st.next_announce = boost::posix_time::time_duration();
st.total_done = 0;
return st;
m_ses = 0;
throw invalid_handle();
}
const torrent_info& torrent_handle::get_torrent_info()
{
if (m_ses == 0) throw invalid_handle();
{
boost::mutex::scoped_lock l(m_ses->m_mutex);
torrent* t = m_ses->find_torrent(m_info_hash);
if (t != 0) return t->torrent_file();
}
{
boost::mutex::scoped_lock l(m_chk->m_mutex);
detail::piece_checker_data* d = m_chk->find_torrent(m_info_hash);
if (d != 0) return d->torrent_ptr->torrent_file();
}
m_ses = 0;
throw invalid_handle();
}
bool torrent_handle::is_valid()
{
if (m_ses == 0) return false;
{
boost::mutex::scoped_lock l(m_ses->m_mutex);
torrent* t = m_ses->find_torrent(m_info_hash);
if (t != 0) return true;
}
{
boost::mutex::scoped_lock l(m_chk->m_mutex);
detail::piece_checker_data* d = m_chk->find_torrent(m_info_hash);
if (d != 0) return true;
}
m_ses = 0;
return false;
}
void torrent_handle::get_peer_info(std::vector<peer_info>& v)
{
v.clear();
if (m_ses == 0) return;
if (m_ses == 0) throw invalid_handle();
assert(m_chk != 0);
boost::mutex::scoped_lock l(m_ses->m_mutex);
@ -158,11 +180,11 @@ namespace libtorrent
}
}
void torrent_handle::get_download_queue(std::vector<partial_piece_info>& queue) const
void torrent_handle::get_download_queue(std::vector<partial_piece_info>& queue)
{
queue.clear();
if (m_ses == 0) return;
if (m_ses == 0) throw invalid_handle();
assert(m_chk != 0);
boost::mutex::scoped_lock l(m_ses->m_mutex);
@ -193,31 +215,4 @@ namespace libtorrent
}
}
void torrent_handle::abort() const
{
if (m_ses == 0) return;
assert(m_chk != 0);
{
boost::mutex::scoped_lock l(m_ses->m_mutex);
torrent* t = m_ses->find_torrent(m_info_hash);
if (t != 0)
{
t->abort();
return;
}
}
{
boost::mutex::scoped_lock l(m_chk->m_mutex);
detail::piece_checker_data* d = m_chk->find_torrent(m_info_hash);
if (d != 0)
{
d->abort = true;
return;
}
}
}
}

View File

@ -228,7 +228,7 @@ namespace libtorrent
if (!m_comment.empty())
os << "comment: " << m_comment << "\n";
if (m_creation_date != boost::posix_time::ptime(boost::gregorian::date(1970, boost::gregorian::Jan, 1)))
os << "creation date: " << to_simple_string(m_creation_date) << "\n";
os << "creation date: " << boost::posix_time::to_simple_string(m_creation_date) << "\n";
os << "number of pieces: " << num_pieces() << "\n";
os << "piece length: " << piece_length() << "\n";
os << "files:\n";