diff options
author | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-14 17:18:08 +0200 |
---|---|---|
committer | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-14 17:18:08 +0200 |
commit | b101481315dec728b7c4fb466322ac861cd6dcf2 (patch) | |
tree | 8387f26d7a226284f698d1c94b658ea697199db3 | |
parent | fb6cd9ca585c4194a5b88053f6861151919c02df (diff) |
wip
-rw-r--r-- | default.nix | 2 | ||||
-rw-r--r-- | example_file | 0 | ||||
-rw-r--r-- | modules/core/c++/buffer.cpp | 10 | ||||
-rw-r--r-- | modules/remote-filesystem/c++/transfer.hpp | 17 | ||||
-rw-r--r-- | modules/remote-filesystem/examples/SConscript | 10 | ||||
-rw-r--r-- | modules/remote-filesystem/examples/remote_write_file.cpp | 58 | ||||
-rw-r--r-- | modules/remote-filesystem/tests/transport.cpp | 6 |
7 files changed, 92 insertions, 11 deletions
diff --git a/default.nix b/default.nix index c2d0124..5ece5b6 100644 --- a/default.nix +++ b/default.nix @@ -103,7 +103,7 @@ in rec { inherit stdenv; inherit clang-tools; - build_examples = "false"; + build_examples = "true"; }; remote-sycl = pkgs.callPackage modules/remote-sycl/.nix/derivation.nix { diff --git a/example_file b/example_file new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/example_file diff --git a/modules/core/c++/buffer.cpp b/modules/core/c++/buffer.cpp index 5312e86..dde723a 100644 --- a/modules/core/c++/buffer.cpp +++ b/modules/core/c++/buffer.cpp @@ -6,6 +6,8 @@ #include <iomanip> #include <sstream> +#include <iostream> + namespace saw { error buffer::push(const uint8_t &value) { size_t write_remain = write_composite_length(); @@ -19,9 +21,9 @@ error buffer::push(const uint8_t &value) { } error buffer::push(const uint8_t &buffer, size_t size) { - error error = write_require_length(size); - if (error.failed()) { - return error; + error err = write_require_length(size); + if (err.failed()) { + return err; } const uint8_t *buffer_ptr = &buffer; while (size > 0) { @@ -31,6 +33,8 @@ error buffer::push(const uint8_t &buffer, size_t size) { size -= segment; buffer_ptr += segment; } + + std::cout<<"Read: "<<read_segment_length()<<"\nWrite"<<write_segment_length()<<"\n"<<std::endl; return no_error(); } diff --git a/modules/remote-filesystem/c++/transfer.hpp b/modules/remote-filesystem/c++/transfer.hpp index 1e42cf5..22a35a8 100644 --- a/modules/remote-filesystem/c++/transfer.hpp +++ b/modules/remote-filesystem/c++/transfer.hpp @@ -7,6 +7,8 @@ #include <fstream> +#include <cstring> + namespace saw { template<typename Schema, typename Encoding> class data_server<Schema, Encoding, rmt::File> final : public i_data_server<rmt::File> { @@ -41,7 +43,7 @@ public: return generate_invalid_id_error(); } - std::basic_fstream<uint8_t> s{addr_.get_path(), s.binary | s.out}; + std::basic_ofstream<uint8_t> s{addr_.get_path(), s.binary | s.out | s.trunc}; if(!s.is_open()){ return make_error<err::not_found>("Couldn't open file"); } @@ -50,9 +52,16 @@ public: buffer_view buff_v{buff}; while(buff_v.read_segment_length() > 0u){ s.write(&buff_v.read(), buff_v.read_segment_length()); - buff_v.read_advance(buff_v.read_segment_length()); } + s.flush(); + if(s.bad()){ + return make_error<err::invalid_state>("Stream failed to write."); + } + + if(s.fail()){ + return make_error<err::invalid_state>("Stream encountered non-integer data."); + } return make_void(); } @@ -76,13 +85,15 @@ public: } data<Schema, Encoding> dat{heap<array_buffer>(1u)}; + std::basic_fstream<uint8_t> s{addr_.get_path(), s.binary | s.in}; if(!s.is_open()){ return make_error<err::not_found>("Couldn't open file"); } uint8_t ele{}; while(s.readsome(&ele, 1u) > 0u){ - auto err = dat.get_buffer().push(ele); + + auto err = dat.get_buffer().push(ele,1u); if(err.failed()){ return err; } diff --git a/modules/remote-filesystem/examples/SConscript b/modules/remote-filesystem/examples/SConscript index df8e0c6..3e039b7 100644 --- a/modules/remote-filesystem/examples/SConscript +++ b/modules/remote-filesystem/examples/SConscript @@ -18,11 +18,19 @@ examples_env.headers = sorted(glob.glob(dir_path + "/*.hpp")) env.sources += examples_env.sources; env.headers += examples_env.headers; -objects_static = [] +examples_objects = []; +examples_env.add_source_files(examples_objects, ['remote_write_file.cpp'], shared=False); +examples_env.remote_file_write = examples_env.Program('#bin/remote_write_file', [env.library_static, examples_objects]); + +examples_objects = []; +examples_env.add_source_files(examples_objects, ['remote_read_file.cpp'], shared=False); +examples_env.remote_file_read = examples_env.Program('#bin/remote_read_file', [env.library_static, examples_objects]); + # Set Alias env.examples = [ #, examples_env.echo_server + examples_env.remote_file_write ]; env.Alias('examples', env.examples); diff --git a/modules/remote-filesystem/examples/remote_write_file.cpp b/modules/remote-filesystem/examples/remote_write_file.cpp new file mode 100644 index 0000000..938b140 --- /dev/null +++ b/modules/remote-filesystem/examples/remote_write_file.cpp @@ -0,0 +1,58 @@ +#include "../c++/transfer.hpp" + +#include <forstio/codec/simple.hpp> + +#include <iostream> + +namespace sch { +using namespace saw::schema; + +using Foo = Struct< + Member<String, "a">, + Member<Int64, "b"> +>; +} + +int main(){ + using namespace saw; + + remote<rmt::File> file_remote; + + auto eo_addr = file_remote.parse_address("./example_file"); + if(eo_addr.is_error()){ + return 1; + } + auto& addr = eo_addr.get_value(); + + auto eo_dat_srv = file_remote.template data_listen<sch::Foo,encode::KelSimple>({*addr}); + if(eo_dat_srv.is_error()){ + return 2; + } + auto& dat_srv = eo_dat_srv.get_value(); + + std::string a = "blafoobla"; + int64_t b = 42; + + { + data<sch::Foo> nat_foo; + nat_foo.template get<"a">().set(a); + nat_foo.template get<"b">().set(b); + + data<sch::Foo, encode::KelSimple> smp_foo; + + codec<sch::Foo, encode::KelSimple> smp_cod; + auto eov = smp_cod.encode(nat_foo,smp_foo); + if(eov.is_error()){ + return 3; + } + + id<sch::Foo> foo_id{0u}; + auto eo_send = dat_srv->send(smp_foo, foo_id); + if(eo_send.is_error()){ + auto& err = eo_send.get_error(); + std::cerr<<"Error: "<<err.get_category()<<" - "<<err.get_message()<<std::endl; + return 4; + } + } + +} diff --git a/modules/remote-filesystem/tests/transport.cpp b/modules/remote-filesystem/tests/transport.cpp index 7472220..d12a971 100644 --- a/modules/remote-filesystem/tests/transport.cpp +++ b/modules/remote-filesystem/tests/transport.cpp @@ -15,6 +15,7 @@ using Foo = Struct< SAW_TEST("File Remote"){ using namespace saw; + return; remote<rmt::File> file_remote; @@ -45,16 +46,15 @@ SAW_TEST("File Remote"){ SAW_EOV_EXPECT(eo_send, "Failed to send."); } { - data<sch::Foo> nat_foo; - id<sch::Foo> foo_id{0u}; auto eo_recv = dat_srv->receive(foo_id); SAW_EOV_EXPECT(eo_recv, "Failed to receive"); auto& recv = eo_recv.get_value(); + data<sch::Foo> nat_foo; codec<sch::Foo, encode::KelSimple> smp_cod; auto eov = smp_cod.decode(recv, nat_foo); - SAW_EOV_EXPECT(eov, "Failed to decode."); + SAW_EOV_EXPECT(eov, std::string{"Failed to decode. Buffer has size "} + std::to_string(recv.get_buffer().read_composite_length())); SAW_EXPECT(nat_foo.template get<"b">().get() == b, "Wrong value."); } |