lokinet/llarp/bencode.hpp
2018-05-22 11:54:19 -04:00

80 lines
1.8 KiB
C++

#ifndef LLARP_BENCODE_HPP
#define LLARP_BENCODE_HPP
#include <llarp/buffer.h>
#include <list>
#include <string>
namespace llarp
{
template < typename ValType >
bool
BEncode(const ValType &t, llarp_buffer_t *buff);
template < typename ValType >
bool
BDecode(ValType &t, llarp_buffer_t *buff);
static bool
bencodeDict(llarp_buffer_t *buff)
{
static uint8_t c = 'd';
return llarp_buffer_write(buff, &c, 1);
}
static bool
bencodeList(llarp_buffer_t *buff)
{
static uint8_t c = 'l';
return llarp_buffer_write(buff, &c, 1);
}
static bool
bencodeEnd(llarp_buffer_t *buff)
{
static char c = 'e';
return llarp_buffer_write(buff, &c, 1);
}
static bool
bencodeDictKey(llarp_buffer_t *buff, const std::string &key)
{
std::string kstr = std::to_string(key.size()) + ":" + key;
return llarp_buffer_write(buff, kstr.c_str(), kstr.size());
}
template < typename IntType >
static bool
bencodeDict_Int(llarp_buffer_t *buff, const std::string &key, IntType i)
{
std::string istr = "i" + std::to_string(i) + "e";
return bencodeDictKey(buff, key)
&& llarp_buffer_write(buff, istr.c_str(), istr.size());
}
static bool
bencodeDict_Bytes(llarp_buffer_t *buff, const std::string &key,
const void *data, size_t sz)
{
std::string sz_str = std::to_string(sz) + ":";
return bencodeDictKey(buff, key)
&& llarp_buffer_write(buff, sz_str.c_str(), sz_str.size())
&& llarp_buffer_write(buff, data, sz);
}
template < typename T >
bool
BEncode(const std::list< T > &l, llarp_buffer_t *buff)
{
if(bencodeList(buff))
{
for(const auto &itr : l)
if(!BEncode(itr, buff))
return false;
return bencodeEnd(buff);
}
return false;
}
} // namespace llarp
#endif