/* * Copyright (c) 2020, Andreas Kling * Copyright (c) 2021, kleines Filmröllchen * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include #include #include #include #include #include #include #include namespace IPC { template<> ErrorOr encode(Encoder& encoder, float const& value) { return encoder.encode(bit_cast(value)); } template<> ErrorOr encode(Encoder& encoder, double const& value) { return encoder.encode(bit_cast(value)); } template<> ErrorOr encode(Encoder& encoder, StringView const& value) { TRY(encoder.append(reinterpret_cast(value.characters_without_null_termination()), value.length())); return {}; } template<> ErrorOr encode(Encoder& encoder, DeprecatedString const& value) { if (value.is_null()) return encoder.encode(-1); TRY(encoder.encode(static_cast(value.length()))); TRY(encoder.encode(value.view())); return {}; } template<> ErrorOr encode(Encoder& encoder, ByteBuffer const& value) { TRY(encoder.encode(static_cast(value.size()))); TRY(encoder.append(value.data(), value.size())); return {}; } template<> ErrorOr encode(Encoder& encoder, JsonValue const& value) { return encoder.encode(value.serialized()); } template<> ErrorOr encode(Encoder& encoder, URL const& value) { return encoder.encode(value.to_deprecated_string()); } template<> ErrorOr encode(Encoder& encoder, Dictionary const& dictionary) { TRY(encoder.encode(static_cast(dictionary.size()))); TRY(dictionary.try_for_each_entry([&](auto const& key, auto const& value) -> ErrorOr { TRY(encoder.encode(key)); TRY(encoder.encode(value)); return {}; })); return {}; } template<> ErrorOr encode(Encoder& encoder, File const& file) { int fd = file.fd(); if (fd != -1) fd = TRY(Core::System::dup(fd)); TRY(encoder.append_file_descriptor(fd)); return {}; } template<> ErrorOr encode(Encoder&, Empty const&) { return {}; } template<> ErrorOr encode(Encoder& encoder, Core::AnonymousBuffer const& buffer) { TRY(encoder.encode(buffer.is_valid())); if (buffer.is_valid()) { TRY(encoder.encode(static_cast(buffer.size()))); TRY(encoder.encode(IPC::File { buffer.fd() })); } return {}; } template<> ErrorOr encode(Encoder& encoder, Core::DateTime const& datetime) { return encoder.encode(static_cast(datetime.timestamp())); } template<> ErrorOr encode(Encoder& encoder, Core::ProxyData const& proxy) { TRY(encoder.encode(proxy.type)); TRY(encoder.encode(proxy.host_ipv4)); TRY(encoder.encode(proxy.port)); return {}; } }