#pragma once #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()}; data_server(ptr> remote__, ref> addr__): remote_{remote__}, addr_{addr__()} {} ~data_server(){ remote_().deregister_data_server(*this); } SAW_FORBID_MOVE(data_server); SAW_FORBID_COPY(data_server); std::pair get_class_id() const override { return class_id; } 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){ 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; } }; }