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 ++++++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 21 deletions(-) (limited to 'modules/codec/c++') 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 { -- cgit v1.2.3