forked from premiere/premiere-libtorrent
added first file abstraction interface.
This commit is contained in:
parent
da5b07ecd8
commit
85ed5e1593
|
@ -413,9 +413,9 @@ public:
|
||||||
<p>This class will need some explanation. First of all, to get a list of all files
|
<p>This class will need some explanation. First of all, to get a list of all files
|
||||||
in the torrent, you can use <tt class="literal"><span class="pre">begin_files()</span></tt>, <tt class="literal"><span class="pre">end_files()</span></tt>,
|
in the torrent, you can use <tt class="literal"><span class="pre">begin_files()</span></tt>, <tt class="literal"><span class="pre">end_files()</span></tt>,
|
||||||
<tt class="literal"><span class="pre">rbegin_files()</span></tt> and <tt class="literal"><span class="pre">rend_files()</span></tt>. These will give you standard vector
|
<tt class="literal"><span class="pre">rbegin_files()</span></tt> and <tt class="literal"><span class="pre">rend_files()</span></tt>. These will give you standard vector
|
||||||
iterators with the type <tt class="literal"><span class="pre">file</span></tt>.</p>
|
iterators with the type <tt class="literal"><span class="pre">file_entry</span></tt>.</p>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
struct file
|
struct file_entry
|
||||||
{
|
{
|
||||||
std::string path;
|
std::string path;
|
||||||
std::string filename;
|
std::string filename;
|
||||||
|
@ -548,7 +548,7 @@ struct torrent_status
|
||||||
|
|
||||||
int num_peers;
|
int num_peers;
|
||||||
|
|
||||||
std::vector<bool> pieces;
|
const std::vector<bool>* pieces;
|
||||||
std::size_t total_done;
|
std::size_t total_done;
|
||||||
};
|
};
|
||||||
</pre>
|
</pre>
|
||||||
|
@ -592,8 +592,9 @@ uploaded to all peers, accumulated, <em>this session</em> only.</p>
|
||||||
<p><tt class="literal"><span class="pre">total_payload_download</span></tt> and <tt class="literal"><span class="pre">total_payload_upload</span></tt> counts the amount of bytes
|
<p><tt class="literal"><span class="pre">total_payload_download</span></tt> and <tt class="literal"><span class="pre">total_payload_upload</span></tt> counts the amount of bytes
|
||||||
send and received this session, but only the actual oayload data (i.e the interesting
|
send and received this session, but only the actual oayload data (i.e the interesting
|
||||||
data), these counters ignore any protocol overhead.</p>
|
data), these counters ignore any protocol overhead.</p>
|
||||||
<p><tt class="literal"><span class="pre">pieces</span></tt> is the bitmask that representw which pieces we have (set to true) and
|
<p><tt class="literal"><span class="pre">pieces</span></tt> is the bitmask that represents which pieces we have (set to true) and
|
||||||
the pieces we don't have.</p>
|
the pieces we don't have. It's a pointer and may be set to 0 if the torrent isn't
|
||||||
|
downloading or seeding.</p>
|
||||||
<p><tt class="literal"><span class="pre">download_rate</span></tt> and <tt class="literal"><span class="pre">upload_rate</span></tt> are the total rates for all peers for this
|
<p><tt class="literal"><span class="pre">download_rate</span></tt> and <tt class="literal"><span class="pre">upload_rate</span></tt> are the total rates for all peers for this
|
||||||
torrent. These will usually have better precision than summing the rates from
|
torrent. These will usually have better precision than summing the rates from
|
||||||
all peers. The rates are given as the number of bytes per second.</p>
|
all peers. The rates are given as the number of bytes per second.</p>
|
||||||
|
|
|
@ -395,11 +395,11 @@ The ``torrent_info`` has the following synopsis::
|
||||||
This class will need some explanation. First of all, to get a list of all files
|
This class will need some explanation. First of all, to get a list of all files
|
||||||
in the torrent, you can use ``begin_files()``, ``end_files()``,
|
in the torrent, you can use ``begin_files()``, ``end_files()``,
|
||||||
``rbegin_files()`` and ``rend_files()``. These will give you standard vector
|
``rbegin_files()`` and ``rend_files()``. These will give you standard vector
|
||||||
iterators with the type ``file``.
|
iterators with the type ``file_entry``.
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
struct file
|
struct file_entry
|
||||||
{
|
{
|
||||||
std::string path;
|
std::string path;
|
||||||
std::string filename;
|
std::string filename;
|
||||||
|
|
|
@ -0,0 +1,99 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (c) 2003, Arvid Norberg
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in
|
||||||
|
the documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the author nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TORRENT_FILE_HPP_INCLUDED
|
||||||
|
#define TORRENT_FILE_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include <boost/noncopyable.hpp>
|
||||||
|
#include <boost/filesystem/path.hpp>
|
||||||
|
|
||||||
|
namespace libtorrent
|
||||||
|
{
|
||||||
|
|
||||||
|
struct file_error: std::runtime_error
|
||||||
|
{
|
||||||
|
file_error(std::string const& msg): std::runtime_error(msg) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class file: public boost::noncopyable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
typedef _int64 size_type;
|
||||||
|
#else
|
||||||
|
typedef long long int size_type;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class open_mode
|
||||||
|
{
|
||||||
|
friend file;
|
||||||
|
public:
|
||||||
|
|
||||||
|
open_mode operator|(open_mode m)
|
||||||
|
{ return open_mode(m.m_mask | m_mask); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
open_mode(int val): m_mask(val) {}
|
||||||
|
int m_mask;
|
||||||
|
};
|
||||||
|
|
||||||
|
static open_mode in;
|
||||||
|
static open_mode out;
|
||||||
|
|
||||||
|
file();
|
||||||
|
file(boost::filesystem::path const& p, open_mode m);
|
||||||
|
~file();
|
||||||
|
|
||||||
|
void open(boost::filesystem::path const& p, open_mode m);
|
||||||
|
void close();
|
||||||
|
|
||||||
|
size_type write(const char*, size_type num_bytes);
|
||||||
|
size_type read(char*, size_type num_bytes);
|
||||||
|
|
||||||
|
void seek(size_type pos);
|
||||||
|
size_type tell();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
struct impl;
|
||||||
|
const std::auto_ptr<impl> m_impl;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // TORRENT_FILE_HPP_INCLUDED
|
||||||
|
|
|
@ -242,5 +242,5 @@ namespace libtorrent
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // TORRENT_SOCKET_WIN_INCLUDED
|
#endif // TORRENT_SOCKET_HPP_INCLUDED
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
|
|
||||||
struct file
|
struct file_entry
|
||||||
{
|
{
|
||||||
std::string path;
|
std::string path;
|
||||||
std::string filename;
|
std::string filename;
|
||||||
|
@ -96,8 +96,8 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef std::vector<file>::const_iterator file_iterator;
|
typedef std::vector<file_entry>::const_iterator file_iterator;
|
||||||
typedef std::vector<file>::const_reverse_iterator reverse_file_iterator;
|
typedef std::vector<file_entry>::const_reverse_iterator reverse_file_iterator;
|
||||||
|
|
||||||
// list the files in the torrent file
|
// list the files in the torrent file
|
||||||
file_iterator begin_files() const { return m_files.begin(); }
|
file_iterator begin_files() const { return m_files.begin(); }
|
||||||
|
@ -106,7 +106,7 @@ namespace libtorrent
|
||||||
reverse_file_iterator rend_files() const { return m_files.rend(); }
|
reverse_file_iterator rend_files() const { return m_files.rend(); }
|
||||||
|
|
||||||
std::size_t num_files() const { return m_files.size(); }
|
std::size_t num_files() const { return m_files.size(); }
|
||||||
const file& file_at(int index) const { assert(index >= 0 && index < (int)m_files.size()); return m_files[index]; }
|
const file_entry& file_at(int index) const { assert(index >= 0 && index < (int)m_files.size()); return m_files[index]; }
|
||||||
|
|
||||||
const std::vector<announce_entry>& trackers() const { return m_urls; }
|
const std::vector<announce_entry>& trackers() const { return m_urls; }
|
||||||
|
|
||||||
|
@ -161,7 +161,7 @@ namespace libtorrent
|
||||||
std::vector<sha1_hash> m_piece_hash;
|
std::vector<sha1_hash> m_piece_hash;
|
||||||
|
|
||||||
// the list of files that this torrent consists of
|
// the list of files that this torrent consists of
|
||||||
std::vector<file> m_files;
|
std::vector<file_entry> m_files;
|
||||||
|
|
||||||
// the sum of all filesizes
|
// the sum of all filesizes
|
||||||
entry::integer_type m_total_size;
|
entry::integer_type m_total_size;
|
||||||
|
|
|
@ -1477,7 +1477,7 @@ namespace libtorrent
|
||||||
assert(r.length > 0 && r.start >= 0);
|
assert(r.length > 0 && r.start >= 0);
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
assert(m_torrent->verify_piece(r.piece) && "internal error");
|
// assert(m_torrent->verify_piece(r.piece) && "internal error");
|
||||||
#endif
|
#endif
|
||||||
const int send_buffer_offset = m_send_buffer.size();
|
const int send_buffer_offset = m_send_buffer.size();
|
||||||
const int packet_size = 4 + 5 + 4 + r.length;
|
const int packet_size = 4 + 5 + 4 + r.length;
|
||||||
|
|
|
@ -50,6 +50,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/hasher.hpp"
|
#include "libtorrent/hasher.hpp"
|
||||||
#include "libtorrent/session.hpp"
|
#include "libtorrent/session.hpp"
|
||||||
#include "libtorrent/peer_id.hpp"
|
#include "libtorrent/peer_id.hpp"
|
||||||
|
#include "libtorrent/file.hpp"
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
#define for if (false) {} else for
|
#define for if (false) {} else for
|
||||||
|
@ -185,7 +186,7 @@ namespace libtorrent {
|
||||||
|
|
||||||
// find the file iterator and file offset
|
// find the file iterator and file offset
|
||||||
size_type file_offset = start;
|
size_type file_offset = start;
|
||||||
std::vector<file>::const_iterator file_iter;
|
std::vector<file_entry>::const_iterator file_iter;
|
||||||
|
|
||||||
for (file_iter = m_pimpl->info.begin_files();;)
|
for (file_iter = m_pimpl->info.begin_files();;)
|
||||||
{
|
{
|
||||||
|
@ -261,7 +262,7 @@ namespace libtorrent {
|
||||||
|
|
||||||
// find the file iterator and file offset
|
// find the file iterator and file offset
|
||||||
size_type file_offset = start;
|
size_type file_offset = start;
|
||||||
std::vector<file>::const_iterator file_iter;
|
std::vector<file_entry>::const_iterator file_iter;
|
||||||
|
|
||||||
for (file_iter = m_pimpl->info.begin_files();;)
|
for (file_iter = m_pimpl->info.begin_files();;)
|
||||||
{
|
{
|
||||||
|
|
|
@ -50,7 +50,7 @@ using namespace libtorrent;
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
void extract_single_file(const entry::dictionary_type& dict, file& target)
|
void extract_single_file(const entry::dictionary_type& dict, file_entry& target)
|
||||||
{
|
{
|
||||||
entry::dictionary_type::const_iterator i = dict.find("length");
|
entry::dictionary_type::const_iterator i = dict.find("length");
|
||||||
if (i == dict.end()) throw invalid_torrent_file();
|
if (i == dict.end()) throw invalid_torrent_file();
|
||||||
|
@ -69,11 +69,11 @@ namespace
|
||||||
target.filename = list.back().string();
|
target.filename = list.back().string();
|
||||||
}
|
}
|
||||||
|
|
||||||
void extract_files(const entry::list_type& list, std::vector<file>& target, const std::string& root_directory)
|
void extract_files(const entry::list_type& list, std::vector<file_entry>& target, const std::string& root_directory)
|
||||||
{
|
{
|
||||||
for (entry::list_type::const_iterator i = list.begin(); i != list.end(); ++i)
|
for (entry::list_type::const_iterator i = list.begin(); i != list.end(); ++i)
|
||||||
{
|
{
|
||||||
target.push_back(file());
|
target.push_back(file_entry());
|
||||||
target.back().path = root_directory;
|
target.back().path = root_directory;
|
||||||
extract_single_file(i->dict(), target.back());
|
extract_single_file(i->dict(), target.back());
|
||||||
}
|
}
|
||||||
|
@ -161,7 +161,7 @@ namespace libtorrent
|
||||||
i = info.dict().find("length");
|
i = info.dict().find("length");
|
||||||
if (i == info.dict().end()) throw invalid_torrent_file();
|
if (i == info.dict().end()) throw invalid_torrent_file();
|
||||||
|
|
||||||
m_files.push_back(file());
|
m_files.push_back(file_entry());
|
||||||
m_files.back().filename = m_name;
|
m_files.back().filename = m_name;
|
||||||
m_files.back().size = i->second.integer();
|
m_files.back().size = i->second.integer();
|
||||||
}
|
}
|
||||||
|
@ -186,7 +186,7 @@ namespace libtorrent
|
||||||
|
|
||||||
// calculate total size of all pieces
|
// calculate total size of all pieces
|
||||||
m_total_size = 0;
|
m_total_size = 0;
|
||||||
for (std::vector<file>::iterator i = m_files.begin(); i != m_files.end(); ++i)
|
for (std::vector<file_entry>::iterator i = m_files.begin(); i != m_files.end(); ++i)
|
||||||
m_total_size += i->size;
|
m_total_size += i->size;
|
||||||
|
|
||||||
// extract sha-1 hashes for all pieces
|
// extract sha-1 hashes for all pieces
|
||||||
|
@ -206,7 +206,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void torrent_info::convert_file_names()
|
void torrent_info::convert_file_names()
|
||||||
{
|
{
|
||||||
for (std::vector<file>::iterator i = m_files.begin(); i != m_files.end(); ++i)
|
for (std::vector<file_entry>::iterator i = m_files.begin(); i != m_files.end(); ++i)
|
||||||
{
|
{
|
||||||
// replace all dots in directory names with underscores
|
// replace all dots in directory names with underscores
|
||||||
std::string& path = i->path;
|
std::string& path = i->path;
|
||||||
|
|
Loading…
Reference in New Issue