added bencoding function and updated ut_metadata extension
This commit is contained in:
@@ -103,28 +103,35 @@ namespace libtorrent
|
||||
namespace detail
|
||||
{
|
||||
template <class OutIt>
|
||||
void write_string(OutIt& out, const std::string& val)
|
||||
int write_string(OutIt& out, const std::string& val)
|
||||
{
|
||||
std::string::const_iterator end = val.begin() + val.length();
|
||||
std::copy(val.begin(), end, out);
|
||||
int ret = val.length();
|
||||
std::string::const_iterator end = val.begin() + ret;
|
||||
for (std::string::const_iterator i = val.begin()
|
||||
, end(val.begin() + ret); i != end; ++i)
|
||||
*out++ = *i;
|
||||
return ret;
|
||||
}
|
||||
|
||||
TORRENT_EXPORT char const* integer_to_str(char* buf, int size, entry::integer_type val);
|
||||
|
||||
template <class OutIt>
|
||||
void write_integer(OutIt& out, entry::integer_type val)
|
||||
int write_integer(OutIt& out, entry::integer_type val)
|
||||
{
|
||||
// the stack allocated buffer for keeping the
|
||||
// decimal representation of the number can
|
||||
// not hold number bigger than this:
|
||||
BOOST_STATIC_ASSERT(sizeof(entry::integer_type) <= 8);
|
||||
char buf[21];
|
||||
int ret = 0;
|
||||
for (char const* str = integer_to_str(buf, 21, val);
|
||||
*str != 0; ++str)
|
||||
{
|
||||
*out = *str;
|
||||
++out;
|
||||
++ret;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
template <class OutIt>
|
||||
@@ -172,26 +179,31 @@ namespace libtorrent
|
||||
}
|
||||
}
|
||||
|
||||
// returns the number of bytes written
|
||||
template<class OutIt>
|
||||
void bencode_recursive(OutIt& out, const entry& e)
|
||||
int bencode_recursive(OutIt& out, const entry& e)
|
||||
{
|
||||
int ret = 0;
|
||||
switch(e.type())
|
||||
{
|
||||
case entry::int_t:
|
||||
write_char(out, 'i');
|
||||
write_integer(out, e.integer());
|
||||
ret += write_integer(out, e.integer());
|
||||
write_char(out, 'e');
|
||||
ret += 2;
|
||||
break;
|
||||
case entry::string_t:
|
||||
write_integer(out, e.string().length());
|
||||
ret += write_integer(out, e.string().length());
|
||||
write_char(out, ':');
|
||||
write_string(out, e.string());
|
||||
ret += write_string(out, e.string());
|
||||
ret += 1;
|
||||
break;
|
||||
case entry::list_t:
|
||||
write_char(out, 'l');
|
||||
for (entry::list_type::const_iterator i = e.list().begin(); i != e.list().end(); ++i)
|
||||
bencode_recursive(out, *i);
|
||||
ret += bencode_recursive(out, *i);
|
||||
write_char(out, 'e');
|
||||
ret += 2;
|
||||
break;
|
||||
case entry::dictionary_t:
|
||||
write_char(out, 'd');
|
||||
@@ -199,18 +211,21 @@ namespace libtorrent
|
||||
i != e.dict().end(); ++i)
|
||||
{
|
||||
// write key
|
||||
write_integer(out, i->first.length());
|
||||
ret += write_integer(out, i->first.length());
|
||||
write_char(out, ':');
|
||||
write_string(out, i->first);
|
||||
ret += write_string(out, i->first);
|
||||
// write value
|
||||
bencode_recursive(out, i->second);
|
||||
ret += bencode_recursive(out, i->second);
|
||||
ret += 1;
|
||||
}
|
||||
write_char(out, 'e');
|
||||
ret += 2;
|
||||
break;
|
||||
default:
|
||||
// do nothing
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
template<class InIt>
|
||||
@@ -307,9 +322,9 @@ namespace libtorrent
|
||||
}
|
||||
|
||||
template<class OutIt>
|
||||
void bencode(OutIt out, const entry& e)
|
||||
int bencode(OutIt out, const entry& e)
|
||||
{
|
||||
detail::bencode_recursive(out, e);
|
||||
return detail::bencode_recursive(out, e);
|
||||
}
|
||||
|
||||
template<class InIt>
|
||||
@@ -329,6 +344,25 @@ namespace libtorrent
|
||||
return e;
|
||||
}
|
||||
|
||||
template<class InIt>
|
||||
entry bdecode(InIt start, InIt end, int& len)
|
||||
{
|
||||
entry e;
|
||||
bool err = false;
|
||||
InIt s = start;
|
||||
detail::bdecode_recursive(start, end, e, err);
|
||||
len = std::distance(s, start);
|
||||
TORRENT_ASSERT(len >= 0);
|
||||
if (err)
|
||||
{
|
||||
#ifdef BOOST_NO_EXCEPTIONS
|
||||
return entry();
|
||||
#else
|
||||
throw invalid_encoding();
|
||||
#endif
|
||||
}
|
||||
return e;
|
||||
}
|
||||
}
|
||||
|
||||
#endif // TORRENT_BENCODE_HPP_INCLUDED
|
||||
|
Reference in New Issue
Block a user