/* * Copyright (c) 2018-2020, Andreas Kling * Copyright (c) 2022, the SerenityOS developers. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include namespace IPC { class MessageBuffer { public: MessageBuffer(); MessageBuffer(MessageDataType data, Vector attachments) : m_data(move(data)) , m_attachments(move(attachments)) { } ErrorOr extend_data_capacity(size_t capacity); ErrorOr append_data(u8 const* values, size_t count); ErrorOr append_file_descriptor(int fd); ErrorOr append_attachment(Attachment); ErrorOr extend(MessageBuffer&& buffer); ErrorOr transfer_message(Transport& transport); MessageDataType const& data() const { return m_data; } MessageDataType take_data() { return move(m_data); } Vector const& attachments() const { return m_attachments; } Vector take_attachments() { return move(m_attachments); } private: MessageDataType m_data; Vector m_attachments; }; enum class ErrorCode : u32 { PeerDisconnected }; template using IPCErrorOr = ErrorOr; class Message { public: virtual ~Message() = default; virtual u32 endpoint_magic() const = 0; virtual int message_id() const = 0; virtual StringView message_name() const = 0; virtual ErrorOr encode() const = 0; protected: Message() = default; }; }