diff options
author | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-16 16:36:08 +0200 |
---|---|---|
committer | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-16 16:36:08 +0200 |
commit | 9f81ab07be7ee549f5f851128e4d6a03289833ea (patch) | |
tree | 769137c36671d850aec79df4341b02e091a806ff | |
parent | c94420cdfac3cf5f4631a5eb63ca33360b719db4 (diff) |
Adding FileSystem and client to File
-rw-r--r-- | modules/remote-filesystem/c++/remote.hpp | 112 | ||||
-rw-r--r-- | modules/remote-filesystem/c++/transfer.hpp | 6 |
2 files changed, 113 insertions, 5 deletions
diff --git a/modules/remote-filesystem/c++/remote.hpp b/modules/remote-filesystem/c++/remote.hpp index 0225bc5..ebd044c 100644 --- a/modules/remote-filesystem/c++/remote.hpp +++ b/modules/remote-filesystem/c++/remote.hpp @@ -54,11 +54,121 @@ public: return dat_srv; } + template<typename Schema, typename Encode> + conveyor<own<data_client<Schema, Encode, rmt::File>>> data_connect(ref<remote_address<rmt::File>> addr){ + auto path_str = addr().get_path_string(); + auto find = registered_data_servers_.find(path_str); + if(find == registered_data_servers_.end()){ + return {make_error<err::not_found>()}; + } + + return {heap<data_client<Schema,Encode,rmt::File>>({*this},{find->second})}; + } + /** * Internal deregister function */ error_or<void> deregister_data_server(ptr<i_data_server<rmt::File>> srv){ - return make_error<err::not_implemented>(); + std::string path = addr().get_path_string(); + auto erase_op = registered_data_servers_.erase(path); + if(erase_op == 0u){ + return make_error<err::not_found>(); + } + return make_void(); + } +}; + +namespace rmt { +struct FileSystem {}; +} + +template<> +class remote_address<rmt::FileSystem> { +private: + std::filesystem::path path_; +public: + remote_address(const std::filesystem::path& path__): + path_{path__} + {} + + std::string get_path_string() const { + return path_.string(); + } + + const std::filesystem::path& get_path() const { + return path_; + } +}; + +template<> +class remote<rmt::FileSystem> { +private: + SAW_FORBID_COPY(remote); + SAW_FORBID_MOVE(remote); + + struct key_t { + std::string path; + uint32_t sch_crc32; + uint32_t enc_crc32; + + bool operator<(const key_t& rhs) const { + if(path != rhs.path){ + return path < rhs.path; + } + + if(sch_crc32 != rhs.sch_crc32 ){ + return sch_crc32 < rhs.sch_crc32; + } + + if(enc_crc32 != rhs.enc_crc32 ){ + return enc_crc32 < rhs.enc_crc32; + } + + return false; + } + }; + + std::map<key_t, ptr<i_data_server<rmt::FileSystem>>> registered_data_servers_; +public: + remote() = default; + + error_or<own<remote_address<rmt::FileSystem>>> parse_address(const std::string_view& path_v){ + return heap<remote_address<rmt::FileSystem>>(path_v); + } + + template<typename Schema, typename Encode> + error_or<own<data_server<Schema, Encode, rmt::FileSystem>>> data_listen(ref<remote_address<rmt::FileSystem>> addr){ + key_t k; + k.path = addr().get_path_string(); + constexpr auto crc_pair = data_server<Schema,Encode,rmt::FileSystem>::class_id; + k.sch_crc32 = crc_pair.first; + k.enc_crc32 = crc_pair.second; + + auto insert_res = registered_data_servers_.emplace(std::make_pair(std::move(k),ptr<i_data_server<rmt::FileSystem>>{})); + if(!insert_res.second){ + return make_error<err::already_exists>(); + } + + auto dat_srv = heap<data_server<Schema, Encode, rmt::FileSystem>>(*this, addr); + insert_res.first->second = ptr<i_data_server<rmt::FileSystem>>{*dat_srv}; + return dat_srv; + } + + /** + * Internal deregister function + */ + error_or<void> deregister_data_server(ptr<i_data_server<rmt::FileSystem>> srv){ + key_t k; + k.path = addr().get_path_string(); + constexpr auto crc_pair = data_server<Schema,Encode,rmt::FileSystem>::class_id; + k.sch_crc32 = crc_pair.first; + k.enc_crc32 = crc_pair.second; + + auto erase_op = registered_data_servers_.erase(k); + if(erase_op == 0u){ + return make_error<err::not_found>(); + } + return make_void(); } }; } diff --git a/modules/remote-filesystem/c++/transfer.hpp b/modules/remote-filesystem/c++/transfer.hpp index 6cca08b..04dc0a6 100644 --- a/modules/remote-filesystem/c++/transfer.hpp +++ b/modules/remote-filesystem/c++/transfer.hpp @@ -103,7 +103,6 @@ public: } }; -/* template <typename Schema, typename Encoding> class data_client<Schema, Encoding, rmt::File> { private: @@ -116,7 +115,7 @@ public: {} error_or<id<Schema>> send(data<Schema, Encoding>& dat){ - auto eov = srv_->send(data, {0u}); + auto eov = srv_().send(data, {0u}); if(eov.is_error()){ return std::move(eov.get_error()); } @@ -124,8 +123,7 @@ public: } error_or<data<Schema, Encoding>> receive(id<Schema> id_ = {0u}){ - return srv_->receive(id_); + return srv_().receive(id_); } }; -*/ } |