/src/serenity/Userland/Libraries/LibIPC/Message.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> |
3 | | * Copyright (c) 2022, the SerenityOS developers. |
4 | | * |
5 | | * SPDX-License-Identifier: BSD-2-Clause |
6 | | */ |
7 | | |
8 | | #pragma once |
9 | | |
10 | | #include <AK/Error.h> |
11 | | #include <AK/RefCounted.h> |
12 | | #include <AK/RefPtr.h> |
13 | | #include <AK/Vector.h> |
14 | | #include <LibCore/Forward.h> |
15 | | #include <unistd.h> |
16 | | |
17 | | namespace IPC { |
18 | | |
19 | | class AutoCloseFileDescriptor : public RefCounted<AutoCloseFileDescriptor> { |
20 | | public: |
21 | | AutoCloseFileDescriptor(int fd) |
22 | 0 | : m_fd(fd) |
23 | 0 | { |
24 | 0 | } |
25 | | |
26 | | ~AutoCloseFileDescriptor() |
27 | 0 | { |
28 | 0 | if (m_fd != -1) |
29 | 0 | close(m_fd); |
30 | 0 | } |
31 | | |
32 | 0 | int value() const { return m_fd; } |
33 | | |
34 | | private: |
35 | | int m_fd; |
36 | | }; |
37 | | |
38 | | class MessageBuffer { |
39 | | public: |
40 | | MessageBuffer(); |
41 | | |
42 | | ErrorOr<void> extend_data_capacity(size_t capacity); |
43 | | ErrorOr<void> append_data(u8 const* values, size_t count); |
44 | | |
45 | | ErrorOr<void> append_file_descriptor(int fd); |
46 | | |
47 | | ErrorOr<void> transfer_message(Core::LocalSocket& socket, bool block_event_loop = false); |
48 | | |
49 | | private: |
50 | | Vector<u8, 1024> m_data; |
51 | | Vector<NonnullRefPtr<AutoCloseFileDescriptor>, 1> m_fds; |
52 | | }; |
53 | | |
54 | | enum class ErrorCode : u32 { |
55 | | PeerDisconnected |
56 | | }; |
57 | | |
58 | | template<typename Value> |
59 | | using IPCErrorOr = ErrorOr<Value, ErrorCode>; |
60 | | |
61 | | class Message { |
62 | | public: |
63 | 0 | virtual ~Message() = default; |
64 | | |
65 | | virtual u32 endpoint_magic() const = 0; |
66 | | virtual int message_id() const = 0; |
67 | | virtual char const* message_name() const = 0; |
68 | | virtual bool valid() const = 0; |
69 | | virtual ErrorOr<MessageBuffer> encode() const = 0; |
70 | | |
71 | | protected: |
72 | 0 | Message() = default; |
73 | | }; |
74 | | |
75 | | } |