From fb6cd9ca585c4194a5b88053f6861151919c02df Mon Sep 17 00:00:00 2001 From: Claudius 'keldu' Holeksa Date: Wed, 14 Aug 2024 14:24:20 +0200 Subject: wip --- modules/remote-filesystem/c++/transfer.hpp | 53 +++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 4 deletions(-) (limited to 'modules/remote-filesystem/c++/transfer.hpp') diff --git a/modules/remote-filesystem/c++/transfer.hpp b/modules/remote-filesystem/c++/transfer.hpp index e3df023..1e42cf5 100644 --- a/modules/remote-filesystem/c++/transfer.hpp +++ b/modules/remote-filesystem/c++/transfer.hpp @@ -2,14 +2,21 @@ #include "remote.hpp" +#include #include +#include + namespace saw { template class data_server final : public i_data_server { private: ptr> remote_; remote_address addr_; + + static error generate_invalid_id_error() { + return make_error("rmt::File data_server only supports Id 0."); + } public: static constexpr std::pair class_id{schema_hash::apply(), schema_hash::apply()}; @@ -29,21 +36,59 @@ public: return class_id; } - error_or send(const data& dat, id store_id){ - return make_error(); + error_or send(data& dat, id store_id){ + if(store_id.get_value() > 0u){ + return generate_invalid_id_error(); + } + + std::basic_fstream s{addr_.get_path(), s.binary | s.out}; + if(!s.is_open()){ + return make_error("Couldn't open file"); + } + + auto& buff = dat.get_buffer(); + 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()); + } + return make_void(); } error_or allocate(data::MetaSchema, Encoding> meta, id store_id){ + if(store_id.get_value() > 0u){ + return generate_invalid_id_error(); + } return make_error(); } error_or erase(id store_id){ + if(store_id.get_value() > 0u){ + return generate_invalid_id_error(); + } return make_error(); } error_or> receive(id store_id){ - return make_error(); - } + if(store_id.get_value() > 0u){ + return generate_invalid_id_error(); + } + data dat{heap(1u)}; + std::basic_fstream s{addr_.get_path(), s.binary | s.in}; + if(!s.is_open()){ + return make_error("Couldn't open file"); + } + uint8_t ele{}; + while(s.readsome(&ele, 1u) > 0u){ + auto err = dat.get_buffer().push(ele); + if(err.failed()){ + return err; + } + } + + return dat; + } }; } -- cgit v1.2.3