Monado OpenXR Runtime
Loading...
Searching...
No Matches
solarxr_ipc_message.h
1// Copyright 2025, rcelyte
2// SPDX-License-Identifier: BSL-1.0
3
4#pragma once
5#include <endian.h>
6#include <string.h>
7
8#ifdef __cplusplus
9extern "C" {
10#endif
11
13{
14 uint32_t length;
15 uint8_t body[];
16};
17
18static inline struct solarxr_ipc_message *
19solarxr_ipc_message_start(uint8_t head[const], const uint8_t *const end)
20{
21 if ((size_t)(end - head) < sizeof(struct solarxr_ipc_message)) {
22 return NULL;
23 }
24
25 struct solarxr_ipc_message *const message = (struct solarxr_ipc_message *)head;
26 message->length = 0;
27 return message;
28}
29
30static inline bool
31solarxr_ipc_message_write(struct solarxr_ipc_message *const message,
32 const uint8_t *const end,
33 const uint8_t data[const],
34 const uint32_t data_len)
35{
36 if (message == NULL) {
37 return false;
38 }
39
40 if ((size_t)(end - message->body) < message->length ||
41 (size_t)(end - &message->body[message->length]) < data_len) {
42 message->length = UINT32_MAX;
43 return false;
44 }
45
46 memcpy(&message->body[message->length], data, data_len);
47 message->length += data_len;
48 return true;
49}
50
51static inline uint32_t
52solarxr_ipc_message_end(struct solarxr_ipc_message *const message, uint8_t **const end_out)
53{
54 if (message == NULL || message->length >= UINT32_MAX - sizeof(*message)) {
55 return 0;
56 }
57
58 *end_out = &message->body[message->length];
59 const uint32_t length = sizeof(*message) + message->length;
60 message->length = htole32(length);
61 return length;
62}
63
64static inline uint32_t
65solarxr_ipc_message_write_single(uint8_t **const head,
66 const uint8_t *const end,
67 const uint8_t data[const],
68 const uint32_t data_len)
69{
70 struct solarxr_ipc_message *const message = solarxr_ipc_message_start(*head, end);
71 solarxr_ipc_message_write(message, end, data, data_len);
72 return solarxr_ipc_message_end(message, head);
73}
74
75static inline uint32_t
76solarxr_ipc_message_inline(uint8_t data[const], const uint32_t data_len)
77{
78 struct solarxr_ipc_message *const message = solarxr_ipc_message_start(data, &data[data_len]);
79 if (message != NULL) {
80 message->length = &data[data_len] - message->body;
81 }
82 return solarxr_ipc_message_end(message, &(uint8_t *){NULL});
83}
84
85#ifdef __cplusplus
86}
87#endif
Definition solarxr_ipc_message.h:13