diff --git a/userspace/libraries/LibGUI/include/LibGUI/Packet.h b/userspace/libraries/LibGUI/include/LibGUI/Packet.h index 0ba2e5b8..26a995ca 100644 --- a/userspace/libraries/LibGUI/include/LibGUI/Packet.h +++ b/userspace/libraries/LibGUI/include/LibGUI/Packet.h @@ -75,6 +75,15 @@ namespace LibGUI { + namespace detail + { + template + concept Vector = requires { + requires BAN::same_as>; + }; + + } + static constexpr BAN::StringView s_window_server_socket = "/tmp/window-server.socket"_sv; namespace Serialize @@ -153,6 +162,40 @@ namespace LibGUI return string; } + template + inline size_t serialized_size_impl(const T& vector) + { + size_t result = sizeof(uint32_t); + for (const auto& element : vector) + result += serialized_size_impl(element); + return result; + } + + template + inline BAN::ErrorOr send_serialized_impl(int socket, const T& vector) + { + const uint32_t value_size = vector.size(); + TRY(send_raw_data(socket, BAN::ConstByteSpan::from(value_size))); + for (const auto& element : vector) + TRY(send_serialized_impl(socket, element)); + return {}; + } + + template + inline BAN::ErrorOr deserialize_impl(BAN::ConstByteSpan& buffer) + { + if (buffer.size() < sizeof(uint32_t)) + return BAN::Error::from_errno(ENOBUFS); + const uint32_t vector_size = buffer.as(); + buffer = buffer.slice(sizeof(uint32_t)); + + T vector; + TRY(vector.resize(vector_size)); + for (auto& element : vector) + element = TRY(deserialize_impl(buffer)); + + return vector; + } } enum class PacketType : uint32_t