diff options
author | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-10 19:03:12 +0200 |
---|---|---|
committer | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-10 19:03:12 +0200 |
commit | 5d39089e1821598bf599a67b3723509f78ebd8cd (patch) | |
tree | 2472f2a32af2e2f343f1bc2e2feee3735ed37526 | |
parent | 8f79cd24c91b5fb5d062a922ae38f14e09e17b1a (diff) |
wip
-rw-r--r-- | modules/codec/c++/transport.hpp | 57 | ||||
-rw-r--r-- | 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<uint64_t Len> class transport<trans::VarLength<Len>> final { public: error_or<buffer_view> view_slice(buffer& buff) const { - typename native_data_type<schema::Primitive<schema::UnsignedInteger, Len>>::type val{}; + using var_max_t = typename native_data_type<schema::Primitive<schema::UnsignedInteger, Len>>::type; + var_max_t val{}; buffer_view view{buff}; - auto eov = stream_value<schema::Primitive<schema::UnsignedInteger, Len>>::decode(val, view); - if(eov.is_error()){ - return std::move(eov.get_error()); + std::array<uint8_t,Len> val_array; + + for(uint64_t i = 0; i < Len && view.read_composite_length() > 0u; ++i){ + uint8_t len_byte = view.read(); + val |= static_cast<var_max_t>(len_byte & 0x7F) << i*7; + + if( (len_byte & 0x80 ) == 0 ){ + if( (i+1u) == Len ) { + return make_error<err::invalid_state>("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<err::buffer_exhausted>(); } - buff.read_advance(Len); - buffer_view data_view{buff, val, 0u}; - return data_view; + return buffer_view{buff, val, 0u}; } error_or<uint64_t> wrap(buffer& out_buff, buffer& in_buff){ - using trans_type = typename native_data_type<schema::Primitive<schema::UnsignedInteger, Len>>::type; - trans_type len{}; - len = static_cast<trans_type>(in_buff.read_composite_length()); + using var_max_t = typename native_data_type<schema::Primitive<schema::UnsignedInteger, Len>>::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<err::invalid_state>("Number too large"); } - return make_error<err::not_implemented>(); + 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<array_buffer> 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<sch::EchoArgs> dat_nat; auto eov = codec_args.decode(dat_args, dat_nat); if(eov.is_error()){ - return -1; + auto& err = eov.get_error(); + std::cout<<err.get_category(); + auto err_msg = err.get_message(); + if(err_msg.size()>0u){ + std::cout<<" - "<<err_msg; + } + std::cout<<std::endl; + return -4; } auto& tup = dat_nat.template get<"positionals">(); @@ -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<sch::Echo> 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<<nat_resp.at(i); } |