prefers name.utf-8 and path.utf-8 if they exists
This commit is contained in:
parent
77956fb5a6
commit
cc1d4dfdde
|
@ -44,22 +44,24 @@ wchar_t decode_utf8(InputIterator &iter, InputIterator last)
|
|||
{
|
||||
wchar_t ret;
|
||||
|
||||
if(((*iter)&0x80) == 0) {
|
||||
ret=*iter++;
|
||||
if (((*iter)&0x80) == 0) // one byte
|
||||
{
|
||||
ret = *iter++;
|
||||
}
|
||||
else if(((*iter)&0x20) == 0) {
|
||||
ret=(
|
||||
(((wchar_t)((*iter++)&0x1F)) << 6) |
|
||||
decode_utf8_mb(iter, last)
|
||||
);
|
||||
else if (((*iter) & 0xe0) == 0xc0) // two bytes
|
||||
{
|
||||
wchar_t byte1 = (*iter++) & 0x1f;
|
||||
wchar_t byte2 = decode_utf8_mb(iter, last);
|
||||
ret = (byte1 << 6) | byte2;
|
||||
}
|
||||
else if(((*iter)&0x10) == 0) {
|
||||
ret=(
|
||||
(((wchar_t)((*iter++)&0x0F)) << 12) |
|
||||
(decode_utf8_mb(iter, last) << 6) |
|
||||
decode_utf8_mb(iter, last)
|
||||
);
|
||||
else if (((*iter) & 0xf0) == 0xe0) // three bytes
|
||||
{
|
||||
wchar_t byte1 = (*iter++) & 0x1f;
|
||||
wchar_t byte2 = decode_utf8_mb(iter, last);
|
||||
wchar_t byte3 = decode_utf8_mb(iter, last);
|
||||
ret = (byte1 << 12) | (byte2 << 6) | byte3;
|
||||
}
|
||||
// TODO: support surrogate pairs
|
||||
else throw std::runtime_error("UTF-8 not convertable to UTF-16");
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -67,12 +67,27 @@ namespace
|
|||
{
|
||||
target.size = dict["length"].integer();
|
||||
target.path = root_dir;
|
||||
const entry::list_type& list = dict["path"].list();
|
||||
for (entry::list_type::const_iterator i = list.begin();
|
||||
i != list.end(); ++i)
|
||||
|
||||
|
||||
// prefer the name.utf-8
|
||||
// because if it exists, it is more
|
||||
// likely to be correctly encoded
|
||||
|
||||
const entry::list_type* list = 0;
|
||||
if (entry const* p = dict.find_key("path.utf-8"))
|
||||
{
|
||||
list = &p->list();
|
||||
}
|
||||
else
|
||||
{
|
||||
list = &dict["path"].list();
|
||||
}
|
||||
|
||||
for (entry::list_type::const_iterator i = list->begin();
|
||||
i != list->end(); ++i)
|
||||
{
|
||||
if (i->string() != "..")
|
||||
target.path /= i->string();
|
||||
target.path /= i->string();
|
||||
}
|
||||
if (target.path.is_complete()) throw std::runtime_error("torrent contains "
|
||||
"a file with an absolute path: '"
|
||||
|
@ -187,7 +202,15 @@ namespace libtorrent
|
|||
m_piece_length = (int)info["piece length"].integer();
|
||||
|
||||
// extract file name (or the directory name if it's a multifile libtorrent)
|
||||
m_name = info["name"].string();
|
||||
if (entry const* e = info.find_key("name.utf-8"))
|
||||
{
|
||||
m_name = e->string();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_name = info["name"].string();
|
||||
}
|
||||
|
||||
path tmp = m_name;
|
||||
if (tmp.is_complete()) throw std::runtime_error("torrent contains "
|
||||
"a file with an absolute path: '" + m_name + "'");
|
||||
|
|
Loading…
Reference in New Issue