diff options
author | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-14 14:24:20 +0200 |
---|---|---|
committer | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-14 14:24:20 +0200 |
commit | fb6cd9ca585c4194a5b88053f6861151919c02df (patch) | |
tree | 31ac3411254680d85b90ac4962b4b67e969b091b /modules/remote-filesystem/c++ | |
parent | 991a5cbfea6b4ae6551a17e3e8ec375aec1a2a62 (diff) |
wip
Diffstat (limited to 'modules/remote-filesystem/c++')
-rw-r--r-- | modules/remote-filesystem/c++/transfer.hpp | 53 |
1 files changed, 49 insertions, 4 deletions
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 <forstio/buffer.hpp> #include <forstio/remote/transfer.hpp> +#include <fstream> + namespace saw { template<typename Schema, typename Encoding> class data_server<Schema, Encoding, rmt::File> final : public i_data_server<rmt::File> { private: ptr<remote<rmt::File>> remote_; remote_address<rmt::File> addr_; + + static error generate_invalid_id_error() { + return make_error<err::invalid_state>("rmt::File data_server only supports Id 0."); + } public: static constexpr std::pair<uint32_t,uint32_t> class_id{schema_hash<Schema>::apply(), schema_hash<Encoding>::apply()}; @@ -29,21 +36,59 @@ public: return class_id; } - error_or<void> send(const data<Schema, Encoding>& dat, id<Schema> store_id){ - return make_error<err::not_implemented>(); + error_or<void> send(data<Schema, Encoding>& dat, id<Schema> store_id){ + if(store_id.get_value() > 0u){ + return generate_invalid_id_error(); + } + + std::basic_fstream<uint8_t> s{addr_.get_path(), s.binary | s.out}; + if(!s.is_open()){ + return make_error<err::not_found>("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<void> allocate(data<typename meta_schema<Schema>::MetaSchema, Encoding> meta, id<Schema> store_id){ + if(store_id.get_value() > 0u){ + return generate_invalid_id_error(); + } return make_error<err::not_implemented>(); } error_or<void> erase(id<Schema> store_id){ + if(store_id.get_value() > 0u){ + return generate_invalid_id_error(); + } return make_error<err::not_implemented>(); } error_or<data<Schema,Encoding>> receive(id<Schema> store_id){ - return make_error<err::not_implemented>(); - } + if(store_id.get_value() > 0u){ + return generate_invalid_id_error(); + } + 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); + if(err.failed()){ + return err; + } + } + + return dat; + } }; } |