merged RC_1_1 into master
This commit is contained in:
commit
b3c3c2aae6
|
@ -18,6 +18,8 @@
|
||||||
#include <libtorrent/torrent_info.hpp>
|
#include <libtorrent/torrent_info.hpp>
|
||||||
#include <libtorrent/kademlia/item.hpp> // for sign_mutable_item
|
#include <libtorrent/kademlia/item.hpp> // for sign_mutable_item
|
||||||
#include <libtorrent/alert.hpp>
|
#include <libtorrent/alert.hpp>
|
||||||
|
#include <libtorrent/time.hpp>
|
||||||
|
|
||||||
#include <libtorrent/extensions/smart_ban.hpp>
|
#include <libtorrent/extensions/smart_ban.hpp>
|
||||||
#include <libtorrent/extensions/ut_metadata.hpp>
|
#include <libtorrent/extensions/ut_metadata.hpp>
|
||||||
#include <libtorrent/extensions/ut_pex.hpp>
|
#include <libtorrent/extensions/ut_pex.hpp>
|
||||||
|
@ -344,6 +346,28 @@ namespace
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
list cached_piece_info_list(std::vector<cached_piece_info> const& v)
|
||||||
|
{
|
||||||
|
list pieces;
|
||||||
|
time_point now = clock_type::now();
|
||||||
|
for (std::vector<cached_piece_info>::const_iterator i = v.begin()
|
||||||
|
, end(v.end()); i != end; ++i)
|
||||||
|
{
|
||||||
|
dict d;
|
||||||
|
d["piece"] = i->piece;
|
||||||
|
d["last_use"] = total_milliseconds(now - i->last_use) / 1000.f;
|
||||||
|
d["next_to_hash"] = i->next_to_hash;
|
||||||
|
d["kind"] = i->kind;
|
||||||
|
pieces.append(d);
|
||||||
|
}
|
||||||
|
return pieces;
|
||||||
|
}
|
||||||
|
|
||||||
|
list cache_status_pieces(cache_status const& cs)
|
||||||
|
{
|
||||||
|
return cached_piece_info_list(cs.pieces);
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef TORRENT_NO_DEPRECATE
|
#ifndef TORRENT_NO_DEPRECATE
|
||||||
cache_status get_cache_status(lt::session& s)
|
cache_status get_cache_status(lt::session& s)
|
||||||
{
|
{
|
||||||
|
@ -372,19 +396,7 @@ namespace
|
||||||
ses.get_cache_info(ih, ret);
|
ses.get_cache_info(ih, ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
list pieces;
|
return cached_piece_info_list(ret);
|
||||||
time_point now = clock_type::now();
|
|
||||||
for (std::vector<cached_piece_info>::iterator i = ret.begin()
|
|
||||||
, end(ret.end()); i != end; ++i)
|
|
||||||
{
|
|
||||||
dict d;
|
|
||||||
d["piece"] = i->piece;
|
|
||||||
d["last_use"] = total_milliseconds(now - i->last_use) / 1000.f;
|
|
||||||
d["next_to_hash"] = i->next_to_hash;
|
|
||||||
d["kind"] = i->kind;
|
|
||||||
pieces.append(d);
|
|
||||||
}
|
|
||||||
return pieces;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -646,6 +658,7 @@ void bind_session()
|
||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
class_<cache_status>("cache_status")
|
class_<cache_status>("cache_status")
|
||||||
|
.add_property("pieces", cache_status_pieces)
|
||||||
#ifndef TORRENT_NO_DEPRECATE
|
#ifndef TORRENT_NO_DEPRECATE
|
||||||
.def_readonly("blocks_written", &cache_status::blocks_written)
|
.def_readonly("blocks_written", &cache_status::blocks_written)
|
||||||
.def_readonly("writes", &cache_status::writes)
|
.def_readonly("writes", &cache_status::writes)
|
||||||
|
|
|
@ -73,6 +73,14 @@ class test_torrent_handle(unittest.TestCase):
|
||||||
# from python
|
# from python
|
||||||
h.scrape_tracker()
|
h.scrape_tracker()
|
||||||
|
|
||||||
|
def test_cache_info(self):
|
||||||
|
ses = lt.session({'alert_mask': lt.alert.category_t.all_categories, 'enable_dht': False})
|
||||||
|
ti = lt.torrent_info('url_seed_multi.torrent');
|
||||||
|
h = ses.add_torrent({'ti': ti, 'save_path': os.getcwd()})
|
||||||
|
|
||||||
|
cs = ses.get_cache_info(h)
|
||||||
|
self.assertEqual(cs.pieces, [])
|
||||||
|
|
||||||
class test_torrent_info(unittest.TestCase):
|
class test_torrent_info(unittest.TestCase):
|
||||||
|
|
||||||
def test_bencoded_constructor(self):
|
def test_bencoded_constructor(self):
|
||||||
|
|
|
@ -81,7 +81,11 @@ namespace libtorrent { namespace aux
|
||||||
#pragma clang diagnostic pop
|
#pragma clang diagnostic pop
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (len < 0) return copy_string("(format error)");
|
if (len < 0)
|
||||||
|
{
|
||||||
|
m_storage.resize(ret);
|
||||||
|
return copy_string("(format error)");
|
||||||
|
}
|
||||||
|
|
||||||
// +1 is to include the 0-terminator
|
// +1 is to include the 0-terminator
|
||||||
m_storage.resize(ret + (len > 512 ? 512 : len) + 1);
|
m_storage.resize(ret + (len > 512 ? 512 : len) + 1);
|
||||||
|
@ -92,6 +96,7 @@ namespace libtorrent { namespace aux
|
||||||
{
|
{
|
||||||
int const ret = int(m_storage.size());
|
int const ret = int(m_storage.size());
|
||||||
int const size = int(buf.size());
|
int const size = int(buf.size());
|
||||||
|
if (size < 1) return -1;
|
||||||
m_storage.resize(ret + size);
|
m_storage.resize(ret + size);
|
||||||
std::memcpy(&m_storage[ret], buf.data(), size);
|
std::memcpy(&m_storage[ret], buf.data(), size);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -99,7 +104,7 @@ namespace libtorrent { namespace aux
|
||||||
|
|
||||||
int allocate(int const bytes)
|
int allocate(int const bytes)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(bytes >= 0);
|
if (bytes < 1) return -1;
|
||||||
int const ret = int(m_storage.size());
|
int const ret = int(m_storage.size());
|
||||||
m_storage.resize(ret + bytes);
|
m_storage.resize(ret + bytes);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -107,14 +112,14 @@ namespace libtorrent { namespace aux
|
||||||
|
|
||||||
char* ptr(int const idx)
|
char* ptr(int const idx)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(idx >= 0);
|
if(idx < 0) return NULL;
|
||||||
TORRENT_ASSERT(idx < int(m_storage.size()));
|
TORRENT_ASSERT(idx < int(m_storage.size()));
|
||||||
return &m_storage[idx];
|
return &m_storage[idx];
|
||||||
}
|
}
|
||||||
|
|
||||||
char const* ptr(int const idx) const
|
char const* ptr(int const idx) const
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(idx >= 0);
|
if(idx < 0) return NULL;
|
||||||
TORRENT_ASSERT(idx < int(m_storage.size()));
|
TORRENT_ASSERT(idx < int(m_storage.size()));
|
||||||
return &m_storage[idx];
|
return &m_storage[idx];
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,6 +59,14 @@ TORRENT_TEST(copy_buffer)
|
||||||
a.allocate(100000);
|
a.allocate(100000);
|
||||||
|
|
||||||
TEST_CHECK(strcmp(a.ptr(idx1), "testing") == 0);
|
TEST_CHECK(strcmp(a.ptr(idx1), "testing") == 0);
|
||||||
|
|
||||||
|
// attempt zero size allocation
|
||||||
|
int const idx2 = a.copy_buffer("nothing", 0);
|
||||||
|
TEST_CHECK(idx2 == -1);
|
||||||
|
|
||||||
|
// attempt to get a pointer after zero allocation
|
||||||
|
char* ptr = a.ptr(idx2);
|
||||||
|
TEST_CHECK(ptr == NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
TORRENT_TEST(allocate)
|
TORRENT_TEST(allocate)
|
||||||
|
@ -75,6 +83,14 @@ TORRENT_TEST(allocate)
|
||||||
ptr = a.ptr(idx1);
|
ptr = a.ptr(idx1);
|
||||||
for (int i = 0; i < 100; ++i)
|
for (int i = 0; i < 100; ++i)
|
||||||
TEST_CHECK(ptr[i] == char(i % 256));
|
TEST_CHECK(ptr[i] == char(i % 256));
|
||||||
|
|
||||||
|
// attempt zero size allocation
|
||||||
|
int const idx2 = a.allocate(0);
|
||||||
|
TEST_CHECK(idx2 == -1);
|
||||||
|
|
||||||
|
// attempt to get a pointer after zero allocation
|
||||||
|
ptr = a.ptr(idx2);
|
||||||
|
TEST_CHECK(ptr == NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
TORRENT_TEST(swap)
|
TORRENT_TEST(swap)
|
||||||
|
|
Loading…
Reference in New Issue