#pragma once #include #include #include #include #include #include "NomadNetMemory.h" namespace UI::LXMF::NomadNet { struct NodeRecord { std::string destination_hex; std::string name; uint64_t last_heard = 0; uint8_t hops = 0; bool saved = false; bool identify_on_connect = false; NodeRecord() = default; NodeRecord(std::string destination, std::string display_name, uint64_t heard, uint8_t hop_count, bool is_saved, bool identify = false) : destination_hex(std::move(destination)), name(std::move(display_name)), last_heard(heard), hops(hop_count), saved(is_saved), identify_on_connect(identify) {} }; struct PageRecord { std::string url; std::string title; uint64_t last_opened = 0; bool saved = false; PageRecord() = default; PageRecord(std::string page_url, std::string page_title, uint64_t opened, bool is_saved) : url(std::move(page_url)), title(std::move(page_title)), last_opened(opened), saved(is_saved) {} }; class Library { public: static constexpr std::size_t MAX_NODES = 32; static constexpr std::size_t MAX_PAGES = 16; static constexpr std::size_t MAX_NAME_BYTES = 64; static constexpr std::size_t MAX_TITLE_BYTES = 96; static constexpr std::size_t MAX_URL_BYTES = 511; static constexpr std::size_t MAX_ENCODED_BYTES = 64 * 1024; const std::vector& nodes() const { return _nodes; } const std::vector& pages() const { return _pages; } bool hear_node(const std::string& destination_hex, const std::string& name, uint64_t timestamp, uint8_t hops); bool record_page(const std::string& url, const std::string& title, uint64_t timestamp); bool set_node_saved(const std::string& destination_hex, bool saved); bool set_node_identified(const std::string& destination_hex, bool identified); bool set_page_saved(const std::string& url, bool saved); bool remove_heard_node(const std::string& destination_hex); bool node_saved(const std::string& destination_hex) const; bool node_identified(const std::string& destination_hex) const; bool page_saved(const std::string& url) const; ExternalVector encode() const; bool decode(const uint8_t* data, std::size_t size); void clear(); private: std::vector _nodes; std::vector _pages; }; std::string sanitize_directory_name(const uint8_t* data, std::size_t size); std::string page_title(const std::string& fallback, const std::vector& heading_runs); } // namespace UI::LXMF::NomadNet