diff options
author | Timothy Flynn <trflynn89@pm.me> | 2023-01-01 23:58:49 -0500 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2023-01-04 11:49:15 +0100 |
commit | 8b7b03b3697cc07ea5d96b6eaa92ae93468368bf (patch) | |
tree | b643ea025dc1300b89109bb4cc34ff0acd2ba6dc | |
parent | ab99ed5fba8bf954cdd60bbc90dafbe47b29b18f (diff) | |
download | serenity-8b7b03b3697cc07ea5d96b6eaa92ae93468368bf.zip |
IPCCompiler+LibIPC: Propagate IPC encoder errors
This propagates errors from user-defined encoders up to IPC::Connection.
There, we currently just log the error, as we aren't in a position to
propagate it further (i.e. we are inside a deferred invocation).
-rw-r--r-- | Meta/Lagom/Tools/CodeGenerators/IPCCompiler/main.cpp | 20 | ||||
-rw-r--r-- | Userland/Libraries/LibIPC/Connection.cpp | 14 | ||||
-rw-r--r-- | Userland/Libraries/LibIPC/Message.h | 2 | ||||
-rw-r--r-- | Userland/Libraries/LibIPC/Stub.h | 2 |
4 files changed, 22 insertions, 16 deletions
diff --git a/Meta/Lagom/Tools/CodeGenerators/IPCCompiler/main.cpp b/Meta/Lagom/Tools/CodeGenerators/IPCCompiler/main.cpp index 5c6dabe4f7..b919e97acb 100644 --- a/Meta/Lagom/Tools/CodeGenerators/IPCCompiler/main.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/IPCCompiler/main.cpp @@ -395,21 +395,21 @@ public:)~~~"); message_generator.appendln(R"~~~( virtual bool valid() const override { return m_ipc_message_valid; } - virtual IPC::MessageBuffer encode() const override + virtual ErrorOr<IPC::MessageBuffer> encode() const override { VERIFY(valid()); IPC::MessageBuffer buffer; IPC::Encoder stream(buffer); - stream << endpoint_magic(); - stream << (int)MessageID::@message.pascal_name@;)~~~"); + TRY(stream.encode(endpoint_magic())); + TRY(stream.encode((int)MessageID::@message.pascal_name@));)~~~"); for (auto const& parameter : parameters) { auto parameter_generator = message_generator.fork(); parameter_generator.set("parameter.name", parameter.name); parameter_generator.appendln(R"~~~( - stream << m_@parameter.name@;)~~~"); + TRY(stream.encode(m_@parameter.name@));)~~~"); } message_generator.appendln(R"~~~( @@ -665,7 +665,7 @@ public: virtual u32 magic() const override { return @endpoint.magic@; } virtual DeprecatedString name() const override { return "@endpoint.name@"; } - virtual OwnPtr<IPC::MessageBuffer> handle(const IPC::Message& message) override + virtual ErrorOr<OwnPtr<IPC::MessageBuffer>> handle(const IPC::Message& message) override { switch (message.message_id()) {)~~~"); for (auto const& message : endpoint.messages) { @@ -694,20 +694,20 @@ public: [[maybe_unused]] auto& request = static_cast<const Messages::@endpoint.name@::@message.pascal_name@&>(message); @handler_name@(@arguments@); auto response = Messages::@endpoint.name@::@message.response_type@ { }; - return make<IPC::MessageBuffer>(response.encode());)~~~"); + return make<IPC::MessageBuffer>(TRY(response.encode()));)~~~"); } else { message_generator.appendln(R"~~~( [[maybe_unused]] auto& request = static_cast<const Messages::@endpoint.name@::@message.pascal_name@&>(message); auto response = @handler_name@(@arguments@); if (!response.valid()) - return {}; - return make<IPC::MessageBuffer>(response.encode());)~~~"); + return Error::from_string_literal("Failed to handle @endpoint.name@::@message.pascal_name@ message"); + return make<IPC::MessageBuffer>(TRY(response.encode()));)~~~"); } } else { message_generator.appendln(R"~~~( [[maybe_unused]] auto& request = static_cast<const Messages::@endpoint.name@::@message.pascal_name@&>(message); @handler_name@(@arguments@); - return {};)~~~"); + return nullptr;)~~~"); } message_generator.appendln(R"~~~( })~~~"); @@ -716,7 +716,7 @@ public: } generator.appendln(R"~~~( default: - return {}; + return Error::from_string_literal("Unknown message ID for @endpoint.name@ endpoint"); } })~~~"); diff --git a/Userland/Libraries/LibIPC/Connection.cpp b/Userland/Libraries/LibIPC/Connection.cpp index e6247d264c..ab36d6bc98 100644 --- a/Userland/Libraries/LibIPC/Connection.cpp +++ b/Userland/Libraries/LibIPC/Connection.cpp @@ -49,7 +49,7 @@ Core::Stream::LocalSocket& ConnectionBase::fd_passing_socket() ErrorOr<void> ConnectionBase::post_message(Message const& message) { - return post_message(message.encode()); + return post_message(TRY(message.encode())); } ErrorOr<void> ConnectionBase::post_message(MessageBuffer buffer) @@ -129,9 +129,15 @@ void ConnectionBase::handle_messages() auto messages = move(m_unprocessed_messages); for (auto& message : messages) { if (message.endpoint_magic() == m_local_endpoint_magic) { - if (auto response = m_local_stub.handle(message)) { - if (auto result = post_message(*response); result.is_error()) { - dbgln("IPC::ConnectionBase::handle_messages: {}", result.error()); + auto handler_result = m_local_stub.handle(message); + if (handler_result.is_error()) { + dbgln("IPC::ConnectionBase::handle_messages: {}", handler_result.error()); + continue; + } + + if (auto response = handler_result.release_value()) { + if (auto post_result = post_message(*response); post_result.is_error()) { + dbgln("IPC::ConnectionBase::handle_messages: {}", post_result.error()); } } } diff --git a/Userland/Libraries/LibIPC/Message.h b/Userland/Libraries/LibIPC/Message.h index 4690b1d505..a5f202ec0e 100644 --- a/Userland/Libraries/LibIPC/Message.h +++ b/Userland/Libraries/LibIPC/Message.h @@ -54,7 +54,7 @@ public: virtual int message_id() const = 0; virtual char const* message_name() const = 0; virtual bool valid() const = 0; - virtual MessageBuffer encode() const = 0; + virtual ErrorOr<MessageBuffer> encode() const = 0; protected: Message() = default; diff --git a/Userland/Libraries/LibIPC/Stub.h b/Userland/Libraries/LibIPC/Stub.h index 5e34016e45..b64afa824c 100644 --- a/Userland/Libraries/LibIPC/Stub.h +++ b/Userland/Libraries/LibIPC/Stub.h @@ -25,7 +25,7 @@ public: virtual u32 magic() const = 0; virtual DeprecatedString name() const = 0; - virtual OwnPtr<MessageBuffer> handle(Message const&) = 0; + virtual ErrorOr<OwnPtr<MessageBuffer>> handle(Message const&) = 0; protected: Stub() = default; |