mirror of
https://github.com/RGBCube/serenity
synced 2025-05-14 07:44:59 +00:00
LibIPC+Everywhere: Change IPC::encode's return type to ErrorOr
In doing so, this removes all uses of the Encoder's stream operator, except for where it is currently still used in the generated IPC code. So the stream operator currently discards any errors, which is the existing behavior. A subsequent commit will propagate the errors.
This commit is contained in:
parent
d0f3f3d5ff
commit
ab99ed5fba
29 changed files with 224 additions and 238 deletions
|
@ -16,14 +16,14 @@
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline bool encode(Encoder& encoder, CodeComprehension::AutocompleteResultEntry const& response)
|
inline ErrorOr<void> encode(Encoder& encoder, CodeComprehension::AutocompleteResultEntry const& response)
|
||||||
{
|
{
|
||||||
encoder << response.completion;
|
TRY(encoder.encode(response.completion));
|
||||||
encoder << response.partial_input_length;
|
TRY(encoder.encode(response.partial_input_length));
|
||||||
encoder << response.language;
|
TRY(encoder.encode(response.language));
|
||||||
encoder << response.display_text;
|
TRY(encoder.encode(response.display_text));
|
||||||
encoder << response.hide_autocomplete_after_applying;
|
TRY(encoder.encode(response.hide_autocomplete_after_applying));
|
||||||
return true;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
@ -39,12 +39,12 @@ inline ErrorOr<CodeComprehension::AutocompleteResultEntry> decode(Decoder& decod
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline bool encode(Encoder& encoder, CodeComprehension::ProjectLocation const& location)
|
inline ErrorOr<void> encode(Encoder& encoder, CodeComprehension::ProjectLocation const& location)
|
||||||
{
|
{
|
||||||
encoder << location.file;
|
TRY(encoder.encode(location.file));
|
||||||
encoder << location.line;
|
TRY(encoder.encode(location.line));
|
||||||
encoder << location.column;
|
TRY(encoder.encode(location.column));
|
||||||
return true;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
@ -58,14 +58,13 @@ inline ErrorOr<CodeComprehension::ProjectLocation> decode(Decoder& decoder)
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline bool encode(Encoder& encoder, CodeComprehension::Declaration const& declaration)
|
inline ErrorOr<void> encode(Encoder& encoder, CodeComprehension::Declaration const& declaration)
|
||||||
{
|
{
|
||||||
encoder << declaration.name;
|
TRY(encoder.encode(declaration.name));
|
||||||
if (!encode(encoder, declaration.position))
|
TRY(encoder.encode(declaration.position));
|
||||||
return false;
|
TRY(encoder.encode(declaration.type));
|
||||||
encoder << declaration.type;
|
TRY(encoder.encode(declaration.scope));
|
||||||
encoder << declaration.scope;
|
return {};
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
@ -80,13 +79,13 @@ inline ErrorOr<CodeComprehension::Declaration> decode(Decoder& decoder)
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline bool encode(Encoder& encoder, CodeComprehension::TodoEntry const& entry)
|
inline ErrorOr<void> encode(Encoder& encoder, CodeComprehension::TodoEntry const& entry)
|
||||||
{
|
{
|
||||||
encoder << entry.content;
|
TRY(encoder.encode(entry.content));
|
||||||
encoder << entry.filename;
|
TRY(encoder.encode(entry.filename));
|
||||||
encoder << entry.line;
|
TRY(encoder.encode(entry.line));
|
||||||
encoder << entry.column;
|
TRY(encoder.encode(entry.column));
|
||||||
return true;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
@ -101,15 +100,14 @@ inline ErrorOr<CodeComprehension::TodoEntry> decode(Decoder& decoder)
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline bool encode(Encoder& encoder, CodeComprehension::TokenInfo const& location)
|
inline ErrorOr<void> encode(Encoder& encoder, CodeComprehension::TokenInfo const& location)
|
||||||
{
|
{
|
||||||
encoder << (u32)location.type;
|
TRY(encoder.encode(location.type));
|
||||||
static_assert(sizeof(location.type) == sizeof(u32));
|
TRY(encoder.encode(location.start_line));
|
||||||
encoder << location.start_line;
|
TRY(encoder.encode(location.start_column));
|
||||||
encoder << location.start_column;
|
TRY(encoder.encode(location.end_line));
|
||||||
encoder << location.end_line;
|
TRY(encoder.encode(location.end_column));
|
||||||
encoder << location.end_column;
|
return {};
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
|
|
@ -75,7 +75,7 @@ private:
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, Core::AnonymousBuffer const&);
|
ErrorOr<void> encode(Encoder&, Core::AnonymousBuffer const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
ErrorOr<Core::AnonymousBuffer> decode(Decoder&);
|
ErrorOr<Core::AnonymousBuffer> decode(Decoder&);
|
||||||
|
|
|
@ -69,7 +69,7 @@ struct Formatter<Core::DateTime> : StandardFormatter {
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, Core::DateTime const&);
|
ErrorOr<void> encode(Encoder&, Core::DateTime const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
ErrorOr<Core::DateTime> decode(Decoder&);
|
ErrorOr<Core::DateTime> decode(Decoder&);
|
||||||
|
|
|
@ -54,7 +54,7 @@ struct ProxyData {
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, Core::ProxyData const&);
|
ErrorOr<void> encode(Encoder&, Core::ProxyData const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
ErrorOr<Core::ProxyData> decode(Decoder&);
|
ErrorOr<Core::ProxyData> decode(Decoder&);
|
||||||
|
|
|
@ -101,10 +101,16 @@ ErrorOr<void> AK::Formatter<DNS::RecordClass>::format(AK::FormatBuilder& builder
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder& encoder, DNS::Answer const& answer)
|
ErrorOr<void> encode(Encoder& encoder, DNS::Answer const& answer)
|
||||||
{
|
{
|
||||||
encoder << answer.name().as_string() << (u16)answer.type() << (u16)answer.class_code() << answer.ttl() << answer.record_data() << answer.mdns_cache_flush();
|
TRY(encoder.encode(answer.name().as_string()));
|
||||||
return true;
|
TRY(encoder.encode(static_cast<u16>(answer.type())));
|
||||||
|
TRY(encoder.encode(static_cast<u16>(answer.class_code())));
|
||||||
|
TRY(encoder.encode(answer.ttl()));
|
||||||
|
TRY(encoder.encode(answer.record_data()));
|
||||||
|
TRY(encoder.encode(answer.mdns_cache_flush()));
|
||||||
|
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
|
|
@ -95,7 +95,7 @@ struct AK::Formatter<DNS::RecordClass> : StandardFormatter {
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, DNS::Answer const&);
|
ErrorOr<void> encode(Encoder&, DNS::Answer const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
ErrorOr<DNS::Answer> decode(Decoder&);
|
ErrorOr<DNS::Answer> decode(Decoder&);
|
||||||
|
|
|
@ -366,10 +366,9 @@ Vector<Color> Color::tints(u32 steps, float max) const
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool IPC::encode(Encoder& encoder, Color const& color)
|
ErrorOr<void> IPC::encode(Encoder& encoder, Color const& color)
|
||||||
{
|
{
|
||||||
encoder << color.value();
|
return encoder.encode(color.value());
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
|
|
@ -574,7 +574,7 @@ struct Formatter<Gfx::Color> : public Formatter<StringView> {
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, Gfx::Color const&);
|
ErrorOr<void> encode(Encoder&, Gfx::Color const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
ErrorOr<Gfx::Color> decode(Decoder&);
|
ErrorOr<Gfx::Color> decode(Decoder&);
|
||||||
|
|
|
@ -52,10 +52,11 @@ DeprecatedString FloatPoint::to_deprecated_string() const
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder& encoder, Gfx::IntPoint const& point)
|
ErrorOr<void> encode(Encoder& encoder, Gfx::IntPoint const& point)
|
||||||
{
|
{
|
||||||
encoder << point.x() << point.y();
|
TRY(encoder.encode(point.x()));
|
||||||
return true;
|
TRY(encoder.encode(point.y()));
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
|
|
@ -291,7 +291,7 @@ struct Formatter<Gfx::Point<T>> : Formatter<FormatString> {
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, Gfx::IntPoint const&);
|
ErrorOr<void> encode(Encoder&, Gfx::IntPoint const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
ErrorOr<Gfx::IntPoint> decode(Decoder&);
|
ErrorOr<Gfx::IntPoint> decode(Decoder&);
|
||||||
|
|
|
@ -30,10 +30,11 @@ DeprecatedString FloatRect::to_deprecated_string() const
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder& encoder, Gfx::IntRect const& rect)
|
ErrorOr<void> encode(Encoder& encoder, Gfx::IntRect const& rect)
|
||||||
{
|
{
|
||||||
encoder << rect.location() << rect.size();
|
TRY(encoder.encode(rect.location()));
|
||||||
return true;
|
TRY(encoder.encode(rect.size()));
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
|
|
@ -1039,7 +1039,7 @@ struct Formatter<Gfx::Rect<T>> : Formatter<FormatString> {
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, Gfx::IntRect const&);
|
ErrorOr<void> encode(Encoder&, Gfx::IntRect const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
ErrorOr<Gfx::IntRect> decode(Decoder&);
|
ErrorOr<Gfx::IntRect> decode(Decoder&);
|
||||||
|
|
|
@ -23,21 +23,23 @@ ShareableBitmap::ShareableBitmap(NonnullRefPtr<Bitmap> bitmap, Tag)
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder& encoder, Gfx::ShareableBitmap const& shareable_bitmap)
|
ErrorOr<void> encode(Encoder& encoder, Gfx::ShareableBitmap const& shareable_bitmap)
|
||||||
{
|
{
|
||||||
encoder << shareable_bitmap.is_valid();
|
TRY(encoder.encode(shareable_bitmap.is_valid()));
|
||||||
if (!shareable_bitmap.is_valid())
|
if (!shareable_bitmap.is_valid())
|
||||||
return true;
|
return {};
|
||||||
|
|
||||||
auto& bitmap = *shareable_bitmap.bitmap();
|
auto& bitmap = *shareable_bitmap.bitmap();
|
||||||
encoder << IPC::File(bitmap.anonymous_buffer().fd());
|
TRY(encoder.encode(IPC::File(bitmap.anonymous_buffer().fd())));
|
||||||
encoder << bitmap.size();
|
TRY(encoder.encode(bitmap.size()));
|
||||||
encoder << static_cast<u32>(bitmap.scale());
|
TRY(encoder.encode(static_cast<u32>(bitmap.scale())));
|
||||||
encoder << static_cast<u32>(bitmap.format());
|
TRY(encoder.encode(static_cast<u32>(bitmap.format())));
|
||||||
if (bitmap.is_indexed()) {
|
if (bitmap.is_indexed()) {
|
||||||
auto palette = bitmap.palette_to_vector();
|
auto palette = bitmap.palette_to_vector();
|
||||||
encoder << palette;
|
TRY(encoder.encode(palette));
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
|
|
@ -36,7 +36,7 @@ private:
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, Gfx::ShareableBitmap const&);
|
ErrorOr<void> encode(Encoder&, Gfx::ShareableBitmap const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
ErrorOr<Gfx::ShareableBitmap> decode(Decoder&);
|
ErrorOr<Gfx::ShareableBitmap> decode(Decoder&);
|
||||||
|
|
|
@ -28,10 +28,11 @@ DeprecatedString FloatSize::to_deprecated_string() const
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder& encoder, Gfx::IntSize const& size)
|
ErrorOr<void> encode(Encoder& encoder, Gfx::IntSize const& size)
|
||||||
{
|
{
|
||||||
encoder << size.width() << size.height();
|
TRY(encoder.encode(size.width()));
|
||||||
return true;
|
TRY(encoder.encode(size.height()));
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
|
|
@ -214,7 +214,7 @@ struct Formatter<Gfx::Size<T>> : Formatter<FormatString> {
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, Gfx::IntSize const&);
|
ErrorOr<void> encode(Encoder&, Gfx::IntSize const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
ErrorOr<Gfx::IntSize> decode(Decoder&);
|
ErrorOr<Gfx::IntSize> decode(Decoder&);
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include <LibCore/AnonymousBuffer.h>
|
#include <LibCore/AnonymousBuffer.h>
|
||||||
#include <LibCore/DateTime.h>
|
#include <LibCore/DateTime.h>
|
||||||
#include <LibCore/Proxy.h>
|
#include <LibCore/Proxy.h>
|
||||||
|
#include <LibCore/System.h>
|
||||||
#include <LibIPC/Dictionary.h>
|
#include <LibIPC/Dictionary.h>
|
||||||
#include <LibIPC/Encoder.h>
|
#include <LibIPC/Encoder.h>
|
||||||
#include <LibIPC/File.h>
|
#include <LibIPC/File.h>
|
||||||
|
@ -21,132 +22,113 @@
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder& encoder, float const& value)
|
ErrorOr<void> encode(Encoder& encoder, float const& value)
|
||||||
{
|
{
|
||||||
return encoder.encode(bit_cast<u32>(value));
|
return encoder.encode(bit_cast<u32>(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder& encoder, double const& value)
|
ErrorOr<void> encode(Encoder& encoder, double const& value)
|
||||||
{
|
{
|
||||||
return encoder.encode(bit_cast<u64>(value));
|
return encoder.encode(bit_cast<u64>(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder& encoder, StringView const& value)
|
ErrorOr<void> encode(Encoder& encoder, StringView const& value)
|
||||||
{
|
{
|
||||||
auto result = encoder.append(reinterpret_cast<u8 const*>(value.characters_without_null_termination()), value.length());
|
TRY(encoder.append(reinterpret_cast<u8 const*>(value.characters_without_null_termination()), value.length()));
|
||||||
return !result.is_error();
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder& encoder, DeprecatedString const& value)
|
ErrorOr<void> encode(Encoder& encoder, DeprecatedString const& value)
|
||||||
{
|
{
|
||||||
if (value.is_null())
|
if (value.is_null())
|
||||||
return encoder.encode(-1);
|
return encoder.encode(-1);
|
||||||
|
|
||||||
if (!encoder.encode(static_cast<i32>(value.length())))
|
TRY(encoder.encode(static_cast<i32>(value.length())));
|
||||||
return false;
|
TRY(encoder.encode(value.view()));
|
||||||
return encoder.encode(value.view());
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder& encoder, ByteBuffer const& value)
|
ErrorOr<void> encode(Encoder& encoder, ByteBuffer const& value)
|
||||||
{
|
{
|
||||||
if (!encoder.encode(static_cast<i32>(value.size())))
|
TRY(encoder.encode(static_cast<i32>(value.size())));
|
||||||
return false;
|
TRY(encoder.append(value.data(), value.size()));
|
||||||
|
return {};
|
||||||
auto result = encoder.append(value.data(), value.size());
|
|
||||||
return !result.is_error();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder& encoder, JsonValue const& value)
|
ErrorOr<void> encode(Encoder& encoder, JsonValue const& value)
|
||||||
{
|
{
|
||||||
return encoder.encode(value.serialized<StringBuilder>());
|
return encoder.encode(value.serialized<StringBuilder>());
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder& encoder, URL const& value)
|
ErrorOr<void> encode(Encoder& encoder, URL const& value)
|
||||||
{
|
{
|
||||||
return encoder.encode(value.to_deprecated_string());
|
return encoder.encode(value.to_deprecated_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder& encoder, Dictionary const& dictionary)
|
ErrorOr<void> encode(Encoder& encoder, Dictionary const& dictionary)
|
||||||
{
|
{
|
||||||
if (!encoder.encode(static_cast<u64>(dictionary.size())))
|
TRY(encoder.encode(static_cast<u64>(dictionary.size())));
|
||||||
return false;
|
|
||||||
|
|
||||||
bool had_error = false;
|
TRY(dictionary.try_for_each_entry([&](auto const& key, auto const& value) -> ErrorOr<void> {
|
||||||
|
TRY(encoder.encode(key));
|
||||||
|
TRY(encoder.encode(value));
|
||||||
|
return {};
|
||||||
|
}));
|
||||||
|
|
||||||
dictionary.for_each_entry([&](auto const& key, auto const& value) {
|
return {};
|
||||||
if (had_error)
|
|
||||||
return;
|
|
||||||
if (!encoder.encode(key) || !encoder.encode(value))
|
|
||||||
had_error = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
return !had_error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder& encoder, File const& file)
|
ErrorOr<void> encode(Encoder& encoder, File const& file)
|
||||||
{
|
{
|
||||||
int fd = file.fd();
|
int fd = file.fd();
|
||||||
|
|
||||||
if (fd != -1) {
|
if (fd != -1)
|
||||||
auto result = dup(fd);
|
fd = TRY(Core::System::dup(fd));
|
||||||
if (result < 0) {
|
|
||||||
perror("dup");
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
}
|
|
||||||
fd = result;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (encoder.append_file_descriptor(fd).is_error())
|
TRY(encoder.append_file_descriptor(fd));
|
||||||
return false;
|
return {};
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, Empty const&)
|
ErrorOr<void> encode(Encoder&, Empty const&)
|
||||||
{
|
{
|
||||||
return true;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder& encoder, Core::AnonymousBuffer const& buffer)
|
ErrorOr<void> encode(Encoder& encoder, Core::AnonymousBuffer const& buffer)
|
||||||
{
|
{
|
||||||
if (!encoder.encode(buffer.is_valid()))
|
TRY(encoder.encode(buffer.is_valid()));
|
||||||
return false;
|
|
||||||
|
|
||||||
if (buffer.is_valid()) {
|
if (buffer.is_valid()) {
|
||||||
if (!encoder.encode(static_cast<u32>(buffer.size())))
|
TRY(encoder.encode(static_cast<u32>(buffer.size())));
|
||||||
return false;
|
TRY(encoder.encode(IPC::File { buffer.fd() }));
|
||||||
if (!encoder.encode(IPC::File { buffer.fd() }))
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder& encoder, Core::DateTime const& datetime)
|
ErrorOr<void> encode(Encoder& encoder, Core::DateTime const& datetime)
|
||||||
{
|
{
|
||||||
return encoder.encode(static_cast<i64>(datetime.timestamp()));
|
return encoder.encode(static_cast<i64>(datetime.timestamp()));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder& encoder, Core::ProxyData const& proxy)
|
ErrorOr<void> encode(Encoder& encoder, Core::ProxyData const& proxy)
|
||||||
{
|
{
|
||||||
if (!encoder.encode(proxy.type))
|
TRY(encoder.encode(proxy.type));
|
||||||
return false;
|
TRY(encoder.encode(proxy.host_ipv4));
|
||||||
if (!encoder.encode(proxy.host_ipv4))
|
TRY(encoder.encode(proxy.port));
|
||||||
return false;
|
return {};
|
||||||
if (!encoder.encode(proxy.port))
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
bool encode(Encoder&, T const&)
|
ErrorOr<void> encode(Encoder&, T const&)
|
||||||
{
|
{
|
||||||
static_assert(DependentFalse<T>, "Base IPC::encode() was instantiated");
|
static_assert(DependentFalse<T>, "Base IPC::encode() was instantiated");
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
|
@ -34,12 +34,12 @@ public:
|
||||||
template<typename T>
|
template<typename T>
|
||||||
Encoder& operator<<(T const& value)
|
Encoder& operator<<(T const& value)
|
||||||
{
|
{
|
||||||
encode(value);
|
(void)encode(value);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
bool encode(T const& value);
|
ErrorOr<void> encode(T const& value);
|
||||||
|
|
||||||
ErrorOr<void> extend_capacity(size_t capacity)
|
ErrorOr<void> extend_capacity(size_t capacity)
|
||||||
{
|
{
|
||||||
|
@ -72,10 +72,9 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
template<Arithmetic T>
|
template<Arithmetic T>
|
||||||
bool encode(Encoder& encoder, T const& value)
|
ErrorOr<void> encode(Encoder& encoder, T const& value)
|
||||||
{
|
{
|
||||||
if (encoder.extend_capacity(sizeof(T)).is_error())
|
TRY(encoder.extend_capacity(sizeof(T)));
|
||||||
return false;
|
|
||||||
|
|
||||||
if constexpr (sizeof(T) == 1) {
|
if constexpr (sizeof(T) == 1) {
|
||||||
encoder.append(static_cast<u8>(value));
|
encoder.append(static_cast<u8>(value));
|
||||||
|
@ -100,97 +99,90 @@ bool encode(Encoder& encoder, T const& value)
|
||||||
static_assert(DependentFalse<T>);
|
static_assert(DependentFalse<T>);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<Enum T>
|
template<Enum T>
|
||||||
bool encode(Encoder& encoder, T const& value)
|
ErrorOr<void> encode(Encoder& encoder, T const& value)
|
||||||
{
|
{
|
||||||
return encoder.encode(to_underlying(value));
|
return encoder.encode(to_underlying(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, float const&);
|
ErrorOr<void> encode(Encoder&, float const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, double const&);
|
ErrorOr<void> encode(Encoder&, double const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, StringView const&);
|
ErrorOr<void> encode(Encoder&, StringView const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, DeprecatedString const&);
|
ErrorOr<void> encode(Encoder&, DeprecatedString const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, ByteBuffer const&);
|
ErrorOr<void> encode(Encoder&, ByteBuffer const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, JsonValue const&);
|
ErrorOr<void> encode(Encoder&, JsonValue const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, URL const&);
|
ErrorOr<void> encode(Encoder&, URL const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, Dictionary const&);
|
ErrorOr<void> encode(Encoder&, Dictionary const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, File const&);
|
ErrorOr<void> encode(Encoder&, File const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, Empty const&);
|
ErrorOr<void> encode(Encoder&, Empty const&);
|
||||||
|
|
||||||
template<Concepts::Vector T>
|
template<Concepts::Vector T>
|
||||||
bool encode(Encoder& encoder, T const& vector)
|
ErrorOr<void> encode(Encoder& encoder, T const& vector)
|
||||||
{
|
{
|
||||||
if (!encoder.encode(static_cast<u64>(vector.size())))
|
TRY(encoder.encode(static_cast<u64>(vector.size())));
|
||||||
return false;
|
|
||||||
|
|
||||||
for (auto const& value : vector) {
|
for (auto const& value : vector)
|
||||||
if (!encoder.encode(value))
|
TRY(encoder.encode(value));
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<Concepts::HashMap T>
|
template<Concepts::HashMap T>
|
||||||
bool encode(Encoder& encoder, T const& hashmap)
|
ErrorOr<void> encode(Encoder& encoder, T const& hashmap)
|
||||||
{
|
{
|
||||||
if (!encoder.encode(static_cast<u32>(hashmap.size())))
|
TRY(encoder.encode(static_cast<u32>(hashmap.size())));
|
||||||
return false;
|
|
||||||
|
|
||||||
for (auto it : hashmap) {
|
for (auto it : hashmap) {
|
||||||
if (!encoder.encode(it.key))
|
TRY(encoder.encode(it.key));
|
||||||
return false;
|
TRY(encoder.encode(it.value));
|
||||||
if (!encoder.encode(it.value))
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<Concepts::SharedSingleProducerCircularQueue T>
|
template<Concepts::SharedSingleProducerCircularQueue T>
|
||||||
bool encode(Encoder& encoder, T const& queue)
|
ErrorOr<void> encode(Encoder& encoder, T const& queue)
|
||||||
{
|
{
|
||||||
return encoder.encode(IPC::File { queue.fd() });
|
return encoder.encode(IPC::File { queue.fd() });
|
||||||
}
|
}
|
||||||
|
|
||||||
template<Concepts::Optional T>
|
template<Concepts::Optional T>
|
||||||
bool encode(Encoder& encoder, T const& optional)
|
ErrorOr<void> encode(Encoder& encoder, T const& optional)
|
||||||
{
|
{
|
||||||
if (!encoder.encode(optional.has_value()))
|
TRY(encoder.encode(optional.has_value()));
|
||||||
return false;
|
|
||||||
|
|
||||||
if (optional.has_value())
|
if (optional.has_value())
|
||||||
return encoder.encode(optional.value());
|
TRY(encoder.encode(optional.value()));
|
||||||
return true;
|
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<Concepts::Variant T>
|
template<Concepts::Variant T>
|
||||||
bool encode(Encoder& encoder, T const& variant)
|
ErrorOr<void> encode(Encoder& encoder, T const& variant)
|
||||||
{
|
{
|
||||||
if (!encoder.encode(variant.index()))
|
TRY(encoder.encode(variant.index()));
|
||||||
return false;
|
|
||||||
|
|
||||||
return variant.visit([&](auto const& value) {
|
return variant.visit([&](auto const& value) {
|
||||||
return encoder.encode(value);
|
return encoder.encode(value);
|
||||||
|
@ -199,7 +191,7 @@ bool encode(Encoder& encoder, T const& variant)
|
||||||
|
|
||||||
// This must be last so that it knows about the above specializations.
|
// This must be last so that it knows about the above specializations.
|
||||||
template<typename T>
|
template<typename T>
|
||||||
bool Encoder::encode(T const& value)
|
ErrorOr<void> Encoder::encode(T const& value)
|
||||||
{
|
{
|
||||||
return IPC::encode(*this, value);
|
return IPC::encode(*this, value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <AK/Error.h>
|
||||||
|
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
class Decoder;
|
class Decoder;
|
||||||
|
@ -16,7 +18,7 @@ class File;
|
||||||
class Stub;
|
class Stub;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
bool encode(Encoder&, T const&);
|
ErrorOr<void> encode(Encoder&, T const&);
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
ErrorOr<T> decode(Decoder&);
|
ErrorOr<T> decode(Decoder&);
|
||||||
|
|
|
@ -814,37 +814,32 @@ ResultOr<NonnullRefPtr<TupleDescriptor>> Value::infer_tuple_descriptor(Vector<Va
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool IPC::encode(Encoder& encoder, SQL::Value const& value)
|
ErrorOr<void> IPC::encode(Encoder& encoder, SQL::Value const& value)
|
||||||
{
|
{
|
||||||
auto type_flags = encode_type_flags(value);
|
auto type_flags = encode_type_flags(value);
|
||||||
encoder << type_flags;
|
TRY(encoder.encode(type_flags));
|
||||||
|
|
||||||
if (value.is_null())
|
if (value.is_null())
|
||||||
return true;
|
return {};
|
||||||
|
|
||||||
switch (value.type()) {
|
switch (value.type()) {
|
||||||
case SQL::SQLType::Null:
|
case SQL::SQLType::Null:
|
||||||
break;
|
return {};
|
||||||
case SQL::SQLType::Text:
|
case SQL::SQLType::Text:
|
||||||
encoder << value.to_deprecated_string();
|
return encoder.encode(value.to_deprecated_string());
|
||||||
break;
|
|
||||||
case SQL::SQLType::Integer:
|
case SQL::SQLType::Integer:
|
||||||
SQL::downsize_integer(value, [&](auto integer, auto) {
|
return SQL::downsize_integer(value, [&](auto integer, auto) {
|
||||||
encoder << integer;
|
return encoder.encode(integer);
|
||||||
});
|
});
|
||||||
break;
|
|
||||||
case SQL::SQLType::Float:
|
case SQL::SQLType::Float:
|
||||||
encoder << value.to_double().value();
|
return encoder.encode(value.to_double().value());
|
||||||
break;
|
|
||||||
case SQL::SQLType::Boolean:
|
case SQL::SQLType::Boolean:
|
||||||
encoder << value.to_bool().value();
|
return encoder.encode(value.to_bool().value());
|
||||||
break;
|
|
||||||
case SQL::SQLType::Tuple:
|
case SQL::SQLType::Tuple:
|
||||||
encoder << value.to_vector().value();
|
return encoder.encode(value.to_vector().value());
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
VERIFY_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
|
|
@ -191,7 +191,7 @@ struct AK::Formatter<SQL::Value> : Formatter<StringView> {
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, SQL::Value const&);
|
ErrorOr<void> encode(Encoder&, SQL::Value const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
ErrorOr<SQL::Value> decode(Decoder&);
|
ErrorOr<SQL::Value> decode(Decoder&);
|
||||||
|
|
|
@ -39,22 +39,22 @@ SameSite same_site_from_string(StringView same_site_mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool IPC::encode(Encoder& encoder, Web::Cookie::Cookie const& cookie)
|
ErrorOr<void> IPC::encode(Encoder& encoder, Web::Cookie::Cookie const& cookie)
|
||||||
{
|
{
|
||||||
encoder << cookie.name;
|
TRY(encoder.encode(cookie.name));
|
||||||
encoder << cookie.value;
|
TRY(encoder.encode(cookie.value));
|
||||||
encoder << cookie.domain;
|
TRY(encoder.encode(cookie.domain));
|
||||||
encoder << cookie.path;
|
TRY(encoder.encode(cookie.path));
|
||||||
encoder << cookie.creation_time;
|
TRY(encoder.encode(cookie.creation_time));
|
||||||
encoder << cookie.expiry_time;
|
TRY(encoder.encode(cookie.expiry_time));
|
||||||
encoder << cookie.host_only;
|
TRY(encoder.encode(cookie.host_only));
|
||||||
encoder << cookie.http_only;
|
TRY(encoder.encode(cookie.http_only));
|
||||||
encoder << cookie.last_access_time;
|
TRY(encoder.encode(cookie.last_access_time));
|
||||||
encoder << cookie.persistent;
|
TRY(encoder.encode(cookie.persistent));
|
||||||
encoder << cookie.secure;
|
TRY(encoder.encode(cookie.secure));
|
||||||
encoder << cookie.same_site;
|
TRY(encoder.encode(cookie.same_site));
|
||||||
|
|
||||||
return true;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
|
|
@ -47,7 +47,7 @@ SameSite same_site_from_string(StringView same_site_mode);
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, Web::Cookie::Cookie const&);
|
ErrorOr<void> encode(Encoder&, Web::Cookie::Cookie const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
ErrorOr<Web::Cookie::Cookie> decode(Decoder&);
|
ErrorOr<Web::Cookie::Cookie> decode(Decoder&);
|
||||||
|
|
|
@ -348,19 +348,19 @@ Optional<Core::DateTime> parse_date_time(StringView date_string)
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool IPC::encode(Encoder& encoder, Web::Cookie::ParsedCookie const& cookie)
|
ErrorOr<void> IPC::encode(Encoder& encoder, Web::Cookie::ParsedCookie const& cookie)
|
||||||
{
|
{
|
||||||
encoder << cookie.name;
|
TRY(encoder.encode(cookie.name));
|
||||||
encoder << cookie.value;
|
TRY(encoder.encode(cookie.value));
|
||||||
encoder << cookie.expiry_time_from_expires_attribute;
|
TRY(encoder.encode(cookie.expiry_time_from_expires_attribute));
|
||||||
encoder << cookie.expiry_time_from_max_age_attribute;
|
TRY(encoder.encode(cookie.expiry_time_from_max_age_attribute));
|
||||||
encoder << cookie.domain;
|
TRY(encoder.encode(cookie.domain));
|
||||||
encoder << cookie.path;
|
TRY(encoder.encode(cookie.path));
|
||||||
encoder << cookie.secure_attribute_present;
|
TRY(encoder.encode(cookie.secure_attribute_present));
|
||||||
encoder << cookie.http_only_attribute_present;
|
TRY(encoder.encode(cookie.http_only_attribute_present));
|
||||||
encoder << cookie.same_site_attribute;
|
TRY(encoder.encode(cookie.same_site_attribute));
|
||||||
|
|
||||||
return true;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
|
|
@ -33,7 +33,7 @@ Optional<ParsedCookie> parse_cookie(DeprecatedString const& cookie_string);
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, Web::Cookie::ParsedCookie const&);
|
ErrorOr<void> encode(Encoder&, Web::Cookie::ParsedCookie const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
ErrorOr<Web::Cookie::ParsedCookie> decode(Decoder&);
|
ErrorOr<Web::Cookie::ParsedCookie> decode(Decoder&);
|
||||||
|
|
|
@ -28,23 +28,23 @@ Response::Response(Error&& error)
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool IPC::encode(Encoder& encoder, Web::WebDriver::Response const& response)
|
ErrorOr<void> IPC::encode(Encoder& encoder, Web::WebDriver::Response const& response)
|
||||||
{
|
{
|
||||||
response.visit(
|
return response.visit(
|
||||||
[](Empty) { VERIFY_NOT_REACHED(); },
|
[](Empty) -> ErrorOr<void> { VERIFY_NOT_REACHED(); },
|
||||||
[&](JsonValue const& value) {
|
[&](JsonValue const& value) -> ErrorOr<void> {
|
||||||
encoder << ResponseType::Success;
|
TRY(encoder.encode(ResponseType::Success));
|
||||||
encoder << value;
|
TRY(encoder.encode(value));
|
||||||
|
return {};
|
||||||
},
|
},
|
||||||
[&](Web::WebDriver::Error const& error) {
|
[&](Web::WebDriver::Error const& error) -> ErrorOr<void> {
|
||||||
encoder << ResponseType::Error;
|
TRY(encoder.encode(ResponseType::Error));
|
||||||
encoder << error.http_status;
|
TRY(encoder.encode(error.http_status));
|
||||||
encoder << error.error;
|
TRY(encoder.encode(error.error));
|
||||||
encoder << error.message;
|
TRY(encoder.encode(error.message));
|
||||||
encoder << error.data;
|
TRY(encoder.encode(error.data));
|
||||||
|
return {};
|
||||||
});
|
});
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
|
|
@ -47,7 +47,7 @@ private:
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, Web::WebDriver::Response const&);
|
ErrorOr<void> encode(Encoder&, Web::WebDriver::Response const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
ErrorOr<Web::WebDriver::Response> decode(Decoder&);
|
ErrorOr<Web::WebDriver::Response> decode(Decoder&);
|
||||||
|
|
|
@ -74,13 +74,13 @@ public:
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, WindowServer::ScreenLayout::Screen const&);
|
ErrorOr<void> encode(Encoder&, WindowServer::ScreenLayout::Screen const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
ErrorOr<WindowServer::ScreenLayout::Screen> decode(Decoder&);
|
ErrorOr<WindowServer::ScreenLayout::Screen> decode(Decoder&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder&, WindowServer::ScreenLayout const&);
|
ErrorOr<void> encode(Encoder&, WindowServer::ScreenLayout const&);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
ErrorOr<WindowServer::ScreenLayout> decode(Decoder&);
|
ErrorOr<WindowServer::ScreenLayout> decode(Decoder&);
|
||||||
|
|
|
@ -393,10 +393,15 @@ bool ScreenLayout::try_auto_add_display_connector(DeprecatedString const& device
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder& encoder, WindowServer::ScreenLayout::Screen const& screen)
|
ErrorOr<void> encode(Encoder& encoder, WindowServer::ScreenLayout::Screen const& screen)
|
||||||
{
|
{
|
||||||
encoder << screen.mode << screen.device << screen.location << screen.resolution << screen.scale_factor;
|
TRY(encoder.encode(screen.mode));
|
||||||
return true;
|
TRY(encoder.encode(screen.device));
|
||||||
|
TRY(encoder.encode(screen.location));
|
||||||
|
TRY(encoder.encode(screen.resolution));
|
||||||
|
TRY(encoder.encode(screen.scale_factor));
|
||||||
|
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
@ -412,10 +417,12 @@ ErrorOr<WindowServer::ScreenLayout::Screen> decode(Decoder& decoder)
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
bool encode(Encoder& encoder, WindowServer::ScreenLayout const& screen_layout)
|
ErrorOr<void> encode(Encoder& encoder, WindowServer::ScreenLayout const& screen_layout)
|
||||||
{
|
{
|
||||||
encoder << screen_layout.screens << screen_layout.main_screen_index;
|
TRY(encoder.encode(screen_layout.screens));
|
||||||
return true;
|
TRY(encoder.encode(screen_layout.main_screen_index));
|
||||||
|
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue