From 5d39089e1821598bf599a67b3723509f78ebd8cd Mon Sep 17 00:00:00 2001 From: Claudius 'keldu' Holeksa Date: Sat, 10 Aug 2024 19:03:12 +0200 Subject: wip --- modules/codec/c++/transport.hpp | 57 ++++++++++++++++---------- modules/io_codec/examples/peer_echo_client.cpp | 15 +++++-- 2 files changed, 47 insertions(+), 25 deletions(-) diff --git a/modules/codec/c++/transport.hpp b/modules/codec/c++/transport.hpp index bb5019c..5eeacbb 100644 --- a/modules/codec/c++/transport.hpp +++ b/modules/codec/c++/transport.hpp @@ -64,43 +64,58 @@ template class transport> final { public: error_or view_slice(buffer& buff) const { - typename native_data_type>::type val{}; + using var_max_t = typename native_data_type>::type; + var_max_t val{}; buffer_view view{buff}; - auto eov = stream_value>::decode(val, view); - if(eov.is_error()){ - return std::move(eov.get_error()); + std::array val_array; + + for(uint64_t i = 0; i < Len && view.read_composite_length() > 0u; ++i){ + uint8_t len_byte = view.read(); + val |= static_cast(len_byte & 0x7F) << i*7; + + if( (len_byte & 0x80 ) == 0 ){ + if( (i+1u) == Len ) { + return make_error("Last VarLength Continue Bit is set."); + } + } + + view.read_advance(1u); } - if(view.read_composite_length() < val){ + if( val > view.read_composite_length() ){ return make_error(); } - buff.read_advance(Len); - buffer_view data_view{buff, val, 0u}; - return data_view; + return buffer_view{buff, val, 0u}; } error_or wrap(buffer& out_buff, buffer& in_buff){ - using trans_type = typename native_data_type>::type; - trans_type len{}; - len = static_cast(in_buff.read_composite_length()); + using var_max_t = typename native_data_type>::type; - { - auto err = out_buff.write_require_length(len); - if(err.failed()){ - return err; - } + uint64_t len = in_buff.read_composite_length(); + var_max_t val = len; + if(len != val){ + return make_error("Number too large"); } - return make_error(); + buffer_view view{out_buff}; + uint64_t i = 0u; + for(i = 0u; i < Len && view.write_composite_length() > 0u; ++i){ + view.write() = (value & 0x7F); + + if( ( val & ~0x7F ) == 0u ){ + ++i; + break; + } - for(uint8_t i = 0; i < in_buff.read_composite_length(); ++i){ - uint8_t val = in_buff.read(i); - out_buff.write(i) = val; + view.write() |= 0x80; + + value = (value >> (i * 7u)); + view.write_advance(1u); } - return Len; + return i; } error_or chain_slice(chain_array_buffer& buff) const { diff --git a/modules/io_codec/examples/peer_echo_client.cpp b/modules/io_codec/examples/peer_echo_client.cpp index 40f3aa3..16ece9b 100644 --- a/modules/io_codec/examples/peer_echo_client.cpp +++ b/modules/io_codec/examples/peer_echo_client.cpp @@ -29,7 +29,14 @@ int main(int argc, char** argv){ data dat_nat; auto eov = codec_args.decode(dat_args, dat_nat); if(eov.is_error()){ - return -1; + auto& err = eov.get_error(); + std::cout<0u){ + std::cout<<" - "<(); @@ -76,7 +83,7 @@ int main(int argc, char** argv){ { auto eov = simple_codec.encode(nat_echo, simple_echo); if(eov.is_error()){ - return ; + return; } } { @@ -91,12 +98,12 @@ int main(int argc, char** argv){ data nat_resp; auto eov = simple_codec.decode(simp_resp, nat_resp); if(nat_resp.size() != nat_echo.size()){ - exit(-1); + exit(-2); } std::cout<<"Answer:\n"; for(uint64_t i = 0u; i < nat_resp.size(); ++i){ if (nat_resp.at(i) != nat_echo.at(i)){ - exit(-2); + exit(-3); } std::cout<