6#ifndef CARLA_ROS2_MIDDLEWARE_TESTING
7#ifdef CARLA_ROS2_MIDDLEWARE_CYCLONEDDS
13#include <dds/ddsi/q_radmin.h>
26struct ddsi_serdata* carla_cdr_alloc_serdata(
27 const struct ddsi_sertype* type,
28 enum ddsi_serdata_kind kind,
31 void* mem = malloc(
sizeof(
struct carla_cdr_serdata) +
static_cast<size_t>(cdr_size));
32 if (!mem) {
return nullptr; }
33 struct carla_cdr_serdata*
csd =
reinterpret_cast<struct carla_cdr_serdata*
>(mem);
34 ddsi_serdata_init(&
csd->sd, type, kind);
35 csd->cdr_size = cdr_size;
43static bool carla_cdr_serdata_eqkey(
44 const struct ddsi_serdata* ,
45 const struct ddsi_serdata* )
50static uint32_t carla_cdr_serdata_get_size(
const struct ddsi_serdata* d) {
51 return reinterpret_cast<const struct carla_cdr_serdata*
>(d)->cdr_size;
54static struct ddsi_serdata* carla_cdr_from_ser(
55 const struct ddsi_sertype* type,
56 enum ddsi_serdata_kind kind,
57 const struct nn_rdata* fragchain,
60 struct ddsi_serdata*
sd =
61 carla_cdr_alloc_serdata(type, kind,
static_cast<uint32_t
>(size));
62 if (!
sd) {
return nullptr; }
63 uint8_t* dest =
reinterpret_cast<uint8_t*
>(
64 reinterpret_cast<struct carla_cdr_serdata*
>(
sd) + 1);
65 const size_t gathered = carla_cdr_gather_fragments(
66 dest, size, fragchain,
67 [](
const struct nn_rdata* f) ->
const uint8_t* {
68 return NN_RMSG_PAYLOADOFF(f->rmsg, NN_RDATA_PAYLOAD_OFF(f));
70 if (gathered != size) {
72 "carla_cdr_from_ser: incomplete fragment chain (",
73 gathered,
" of ", size,
" bytes); dropping sample");
74 ddsi_serdata_unref(
sd);
80static struct ddsi_serdata* carla_cdr_from_ser_iov(
81 const struct ddsi_sertype* type,
82 enum ddsi_serdata_kind kind,
83 ddsrt_msg_iovlen_t niov,
84 const ddsrt_iovec_t* iov,
87 struct ddsi_serdata*
sd =
88 carla_cdr_alloc_serdata(type, kind,
static_cast<uint32_t
>(size));
89 if (!
sd) {
return nullptr; }
90 uint8_t* dest =
reinterpret_cast<uint8_t*
>(
91 reinterpret_cast<struct carla_cdr_serdata*
>(
sd) + 1);
93 for (ddsrt_msg_iovlen_t i = 0; i < niov && off < size; ++i) {
94 const size_t avail =
static_cast<size_t>(iov[i].iov_len);
95 const size_t copy = (off + avail > size) ? (size - off) : avail;
96 memcpy(dest + off, iov[i].iov_base, copy);
102static struct ddsi_serdata* carla_cdr_from_keyhash(
103 const struct ddsi_sertype* type,
104 const struct ddsi_keyhash* )
106 return carla_cdr_alloc_serdata(type, SDK_KEY, 0u);
109static struct ddsi_serdata* carla_cdr_from_sample(
110 const struct ddsi_sertype* ,
111 enum ddsi_serdata_kind ,
117 "carla_cdr_from_sample: dds_write() is not supported; "
118 "use dds_writecdr() instead");
122static void carla_cdr_to_ser(
123 const struct ddsi_serdata* d,
128 memcpy(buf, carla_cdr_data(d) + off, sz);
131static struct ddsi_serdata* carla_cdr_to_ser_ref(
132 const struct ddsi_serdata* d,
138 ref->iov_base =
const_cast<void*
>(
139 static_cast<const void*
>(carla_cdr_data(d) + off));
140 ref->iov_len =
static_cast<ddsrt_iov_len_t
>(sz);
141 return ddsi_serdata_ref(d);
144static void carla_cdr_to_ser_unref(
145 struct ddsi_serdata* d,
146 const ddsrt_iovec_t* )
148 ddsi_serdata_unref(d);
151static bool carla_cdr_to_sample(
152 const struct ddsi_serdata* ,
161static struct ddsi_serdata* carla_cdr_to_untyped(
const struct ddsi_serdata* d) {
162 return ddsi_serdata_ref(d);
165static bool carla_cdr_untyped_to_sample(
166 const struct ddsi_sertype* ,
167 const struct ddsi_serdata* ,
175static void carla_cdr_serdata_free(
struct ddsi_serdata* d) {
181static size_t carla_cdr_serdata_print(
182 const struct ddsi_sertype* ,
183 const struct ddsi_serdata* d,
187 if (size == 0u) {
return 0u; }
188 int n = snprintf(buf, size,
"<carla_cdr %u bytes>", carla_cdr_size(d));
189 return static_cast<size_t>(n < 0 ? 0 : n);
192static void carla_cdr_serdata_get_keyhash(
193 const struct ddsi_serdata* ,
194 struct ddsi_keyhash* buf,
197 memset(buf, 0,
sizeof(*buf));
200const struct ddsi_serdata_ops carla_cdr_serdata_ops = {
201 carla_cdr_serdata_eqkey,
202 carla_cdr_serdata_get_size,
204 carla_cdr_from_ser_iov,
205 carla_cdr_from_keyhash,
206 carla_cdr_from_sample,
208 carla_cdr_to_ser_ref,
209 carla_cdr_to_ser_unref,
211 carla_cdr_to_untyped,
212 carla_cdr_untyped_to_sample,
213 carla_cdr_serdata_free,
214 carla_cdr_serdata_print,
215 carla_cdr_serdata_get_keyhash
222static void carla_cdr_sertype_free(
struct ddsi_sertype* tp) {
223 ddsi_sertype_fini(tp);
227static void carla_cdr_sertype_zero_samples(
228 const struct ddsi_sertype* ,
235static void carla_cdr_sertype_realloc_samples(
237 const struct ddsi_sertype* ,
242 for (
size_t i = 0u; i < count; ++i) {
247static void carla_cdr_sertype_free_samples(
248 const struct ddsi_sertype* ,
253 for (
size_t i = 0u; i < count; ++i) {
258static bool carla_cdr_sertype_equal(
259 const struct ddsi_sertype* ,
260 const struct ddsi_sertype* )
267static uint32_t carla_cdr_sertype_hash(
const struct ddsi_sertype* ) {
271const struct ddsi_sertype_ops carla_cdr_sertype_ops = {
274 carla_cdr_sertype_free,
275 carla_cdr_sertype_zero_samples,
276 carla_cdr_sertype_realloc_samples,
277 carla_cdr_sertype_free_samples,
278 carla_cdr_sertype_equal,
279 carla_cdr_sertype_hash,
292dds_entity_t carla_cdr_get_participant() {
298 static dds_entity_t participant = []() {
299 const dds_domainid_t domain_id =
301 return dds_create_participant(domain_id,
nullptr,
nullptr);
static int GetEffectiveDomainId()
This file contains definitions of common data structures used in traffic manager.
static void log_error(Args &&... args)