summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaudius 'keldu' Holeksa <mail@keldu.de>2024-08-10 19:03:12 +0200
committerClaudius 'keldu' Holeksa <mail@keldu.de>2024-08-10 19:03:12 +0200
commit5d39089e1821598bf599a67b3723509f78ebd8cd (patch)
tree2472f2a32af2e2f343f1bc2e2feee3735ed37526
parent8f79cd24c91b5fb5d062a922ae38f14e09e17b1a (diff)
wip
-rw-r--r--modules/codec/c++/transport.hpp57
-rw-r--r--modules/io_codec/examples/peer_echo_client.cpp15
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);
}