1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 08:58:11 +00:00
serenity/Userland/Libraries/LibIPC/Message.h
Timothy Flynn 91558fa381 LibIPC+LibWeb: Add an IPC helper to transfer an IPC message buffer
This large block of code is repeated nearly verbatim in LibWeb. Move it
to a helper function that both LibIPC and LibWeb can defer to. This will
let us make changes to this method in a singular location going forward.

Note this is a bit of a regression for the MessagePort. It now suffers
from the same performance issue that IPC messages face - we prepend the
meessage size to the message buffer. This degredation is very temporary
though, as a fix is imminent, and this change makes that fix easier.
2024-01-03 10:17:00 +01:00

66 lines
1.3 KiB
C++

/*
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2022, the SerenityOS developers.
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/Error.h>
#include <AK/RefCounted.h>
#include <AK/RefPtr.h>
#include <AK/Vector.h>
#include <LibCore/Forward.h>
#include <unistd.h>
namespace IPC {
class AutoCloseFileDescriptor : public RefCounted<AutoCloseFileDescriptor> {
public:
AutoCloseFileDescriptor(int fd)
: m_fd(fd)
{
}
~AutoCloseFileDescriptor()
{
if (m_fd != -1)
close(m_fd);
}
int value() const { return m_fd; }
private:
int m_fd;
};
struct MessageBuffer {
ErrorOr<void> transfer_message(Core::LocalSocket& fd_passing_socket, Core::LocalSocket& data_socket);
Vector<u8, 1024> data;
Vector<NonnullRefPtr<AutoCloseFileDescriptor>, 1> fds;
};
enum class ErrorCode : u32 {
PeerDisconnected
};
template<typename Value>
using IPCErrorOr = ErrorOr<Value, ErrorCode>;
class Message {
public:
virtual ~Message() = default;
virtual u32 endpoint_magic() const = 0;
virtual int message_id() const = 0;
virtual char const* message_name() const = 0;
virtual bool valid() const = 0;
virtual ErrorOr<MessageBuffer> encode() const = 0;
protected:
Message() = default;
};
}