Added array serialization to my DBus client library.
struct thing {
uint32_t array1[10];
uint16_t *array2;
uint8_t array2_len;
};
static const struct cdbus_serialization_info info[] = {
{
.type.sig = CDBUS_TYPE_ARRAY,
.type.struct_offset = offsetof(struct thing, array1),
.length.sig = CDBUS_TYPE_SIZE_T,
.length.flags = CDBUS_FLAG_DIRECT,
.length.direct.usize = 10,
.array_stride = sizeof(uint32_t),
.array_type = &(static const struct cdbus_serialization_info) {
.type.sig = CDBUS_TYPE_UINT32,
.type.struct_offset = 0,
},
},
{
.type.sig = CDBUS_TYPE_BYTE,
.type.struct_offset = offsetof(struct thing, array2_len),
},
{
.type.sig = CDBUS_TYPE_ARRAY,
.type.flags = CDBUS_FLAG_ARRAY_IS_POINTER,
.type.struct_offset = offsetof(struct thing, array2),
.length.sig = CDBUS_TYPE_BYTE,
.length.struct_offset = offsetof(struct thing, array2_len),
// Read every other element
.array_stride = sizeof(uint16_t) * 2,
.array_type = &(static const struct cdbus_serialization_info) {
.type.sig = CDBUS_TYPE_UINT16,
.type.struct_offset = sizeof(uint16_t),
},
},
{},
};
struct thing t = {
.array1 = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 },
.array2 = (uint16_t[]){ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 },
.array2_len = 6,
};
cdbus_serialize(info, &t);
array of 'u': length 10 {
uint32_t: 0
uint32_t: 1
uint32_t: 1
uint32_t: 2
uint32_t: 3
uint32_t: 5
uint32_t: 8
uint32_t: 13
uint32_t: 21
uint32_t: 34
}
uint8_t: 6
array of 'q': length 6 {
uint16_t: 2
uint16_t: 4
uint16_t: 6
uint16_t: 8
uint16_t: 10
uint16_t: 12
}