From 16d5d29049c08e21f57f7928ceedf40586a2d294 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Sat, 3 Dec 2022 11:10:06 +1100 Subject: Use std::span (backported) and std::byte to make our buffers safer --- src/audio/stream_message.cpp | 45 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) (limited to 'src/audio/stream_message.cpp') diff --git a/src/audio/stream_message.cpp b/src/audio/stream_message.cpp index 58868ce8..055e7e96 100644 --- a/src/audio/stream_message.cpp +++ b/src/audio/stream_message.cpp @@ -3,24 +3,61 @@ #include #include "cbor.h" +#include "esp-idf/components/cbor/tinycbor/src/cbor.h" +#include "span.hpp" namespace audio { const int kEncoderFlags = 0; const int kDecoderFlags = 0; -auto ReadMessageType(uint8_t* buffer, size_t length) -> MessageType { +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(buffer, length, kDecoderFlags, &parser, &root); - cbor_value_enter_container(&root, &container); + cbor_parser_init(reinterpret_cast(msg.data()), msg.size(), + kDecoderFlags, &parser, &root); uint64_t header = 0; - cbor_value_get_uint64(&container, &header); + 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 -- cgit v1.2.3