From c36208016eefcdfdeff045f675f74fdb69dddb52 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Fri, 2 Dec 2022 17:25:53 +1100 Subject: better cbor handling --- src/audio/include/stream_message.hpp | 49 ++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'src/audio/include/stream_message.hpp') diff --git a/src/audio/include/stream_message.hpp b/src/audio/include/stream_message.hpp index 2791dcd8..cbd7c733 100644 --- a/src/audio/include/stream_message.hpp +++ b/src/audio/include/stream_message.hpp @@ -1,11 +1,60 @@ #pragma once +#include + +#include +#include + +#include "cbor.h" +#include "result.hpp" + namespace audio { +extern const int kEncoderFlags; +extern const int kDecoderFlags; + enum MessageType { TYPE_UNKNOWN, TYPE_CHUNK_HEADER, TYPE_STREAM_INFO, }; +template +auto WriteMessage(MessageType type, + Writer&& writer, + uint8_t* buffer, + size_t length) -> cpp::result { + CborEncoder root; + CborEncoder container; + + cbor_encoder_init(&root, buffer, length, kEncoderFlags); + cbor_encoder_create_array(&root, &container, 2); + cbor_encode_uint(&container, type); + + std::optional inner_err = std::invoke(writer, container); + if (inner_err) { + return cpp::fail(inner_err.value()); + } + + cbor_encoder_close_container(&root, &container); + return cbor_encoder_get_buffer_size(&root, buffer); +} + +template +auto ReadMessage(Reader&& reader, uint8_t* buffer, size_t length) + -> cpp::result { + CborParser parser; + CborValue root; + CborValue container; + + cbor_parser_init(buffer, length, kDecoderFlags, &parser, &root); + cbor_value_enter_container(&root, &container); + // Skip the type header + cbor_value_advance_fixed(&container); + + return std::invoke(reader, container); +} + +auto ReadMessageType(uint8_t* buffer, size_t length) -> MessageType; + } // namespace audio -- cgit v1.2.3