/* * Copyright 2023 jacqueline * * SPDX-License-Identifier: GPL-3.0-only */ #include "stream_message.hpp" #include #include "cbor.h" #include "span.hpp" namespace audio { const int kEncoderFlags = 0; const int kDecoderFlags = 0; auto WriteTypeOnlyMessage(MessageType type, cpp::span data) -> cpp::result { CborEncoder root; CborEncoder container; uint8_t* cast_data = reinterpret_cast(data.data()); cbor_encoder_init(&root, cast_data, data.size(), kEncoderFlags); cbor_encode_uint(&container, type); return cbor_encoder_get_buffer_size(&root, cast_data); } auto ReadMessageType(cpp::span msg) -> MessageType { CborParser parser; CborValue root; CborValue container; cbor_parser_init(reinterpret_cast(msg.data()), msg.size(), kDecoderFlags, &parser, &root); uint64_t header = 0; if (cbor_value_is_container(&root)) { cbor_value_enter_container(&root, &container); cbor_value_get_uint64(&container, &header); } else { cbor_value_get_uint64(&root, &header); } return static_cast(header); } auto GetAdditionalData(cpp::span msg) -> cpp::span { CborParser parser; CborValue root; uint8_t* cast_data = reinterpret_cast(msg.data()); cbor_parser_init(cast_data, msg.size(), kDecoderFlags, &parser, &root); while (!cbor_value_at_end(&root)) { cbor_value_advance(&root); } const uint8_t* remaining = cbor_value_get_next_byte(&root); size_t header_size = remaining - cast_data; return cpp::span(msg.data() + header_size, msg.size() - header_size); } } // namespace audio