From 9f81ab07be7ee549f5f851128e4d6a03289833ea Mon Sep 17 00:00:00 2001 From: Claudius 'keldu' Holeksa Date: Fri, 16 Aug 2024 16:36:08 +0200 Subject: Adding FileSystem and client to File --- modules/remote-filesystem/c++/remote.hpp | 112 ++++++++++++++++++++++++++++- 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 + conveyor>> data_connect(ref> 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()}; + } + + return {heap>({*this},{find->second})}; + } + /** * Internal deregister function */ error_or deregister_data_server(ptr> srv){ - return make_error(); + std::string path = addr().get_path_string(); + auto erase_op = registered_data_servers_.erase(path); + if(erase_op == 0u){ + return make_error(); + } + return make_void(); + } +}; + +namespace rmt { +struct FileSystem {}; +} + +template<> +class remote_address { +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 { +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>> registered_data_servers_; +public: + remote() = default; + + error_or>> parse_address(const std::string_view& path_v){ + return heap>(path_v); + } + + template + error_or>> data_listen(ref> addr){ + key_t k; + k.path = addr().get_path_string(); + constexpr auto crc_pair = data_server::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>{})); + if(!insert_res.second){ + return make_error(); + } + + auto dat_srv = heap>(*this, addr); + insert_res.first->second = ptr>{*dat_srv}; + return dat_srv; + } + + /** + * Internal deregister function + */ + error_or deregister_data_server(ptr> srv){ + key_t k; + k.path = addr().get_path_string(); + constexpr auto crc_pair = data_server::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(); + } + 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 class data_client { private: @@ -116,7 +115,7 @@ public: {} error_or> send(data& 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> receive(id id_ = {0u}){ - return srv_->receive(id_); + return srv_().receive(id_); } }; -*/ } -- cgit v1.2.3