diff --git a/Userland/Libraries/LibIPC/Decoder.cpp b/Userland/Libraries/LibIPC/Decoder.cpp index 6abb1d1d7d..ea9870b812 100644 --- a/Userland/Libraries/LibIPC/Decoder.cpp +++ b/Userland/Libraries/LibIPC/Decoder.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2020, Andreas Kling + * Copyright (c) 2023, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ @@ -23,6 +24,13 @@ ErrorOr Decoder::decode_size() return static_cast(TRY(decode())); } +template<> +ErrorOr decode(Decoder& decoder) +{ + auto length = TRY(decoder.decode_size()); + return String::from_stream(decoder.stream(), length); +} + template<> ErrorOr decode(Decoder& decoder) { diff --git a/Userland/Libraries/LibIPC/Decoder.h b/Userland/Libraries/LibIPC/Decoder.h index a2f8a54956..6a5f62438c 100644 --- a/Userland/Libraries/LibIPC/Decoder.h +++ b/Userland/Libraries/LibIPC/Decoder.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2020, Andreas Kling + * Copyright (c) 2023, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ @@ -11,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -56,6 +58,7 @@ public: ErrorOr decode_size(); + Stream& stream() { return m_stream; } Core::LocalSocket& socket() { return m_socket; } private: @@ -78,6 +81,9 @@ ErrorOr decode(Decoder& decoder) return static_cast(value); } +template<> +ErrorOr decode(Decoder&); + template<> ErrorOr decode(Decoder&); diff --git a/Userland/Libraries/LibIPC/Encoder.cpp b/Userland/Libraries/LibIPC/Encoder.cpp index 358dd02cc9..d359507e2a 100644 --- a/Userland/Libraries/LibIPC/Encoder.cpp +++ b/Userland/Libraries/LibIPC/Encoder.cpp @@ -1,6 +1,7 @@ /* * Copyright (c) 2020, Andreas Kling * Copyright (c) 2021, kleines Filmröllchen + * Copyright (c) 2023, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ @@ -11,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -42,6 +44,15 @@ ErrorOr encode(Encoder& encoder, double const& value) return encoder.encode(bit_cast(value)); } +template<> +ErrorOr encode(Encoder& encoder, String const& value) +{ + auto bytes = value.bytes(); + TRY(encoder.encode_size(bytes.size())); + TRY(encoder.append(bytes.data(), bytes.size())); + return {}; +} + template<> ErrorOr encode(Encoder& encoder, StringView const& value) { diff --git a/Userland/Libraries/LibIPC/Encoder.h b/Userland/Libraries/LibIPC/Encoder.h index f379d4d417..6e90c54390 100644 --- a/Userland/Libraries/LibIPC/Encoder.h +++ b/Userland/Libraries/LibIPC/Encoder.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2018-2021, Andreas Kling + * Copyright (c) 2023, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ @@ -106,6 +107,9 @@ ErrorOr encode(Encoder&, float const&); template<> ErrorOr encode(Encoder&, double const&); +template<> +ErrorOr encode(Encoder&, String const&); + template<> ErrorOr encode(Encoder&, StringView const&);