diff --git a/components/spotify/cspot/bell/include/NanoPBHelper.h b/components/spotify/cspot/bell/include/NanoPBHelper.h new file mode 100644 index 00000000..cb7ba3cc --- /dev/null +++ b/components/spotify/cspot/bell/include/NanoPBHelper.h @@ -0,0 +1,46 @@ +#ifndef BELL_NANOPB_HELPER_H +#define BELL_NANOPB_HELPER_H + +#include +#include "pb_encode.h" +#include "pb_decode.h" +#include + +std::vector pbEncode(const pb_msgdesc_t *fields, const void *src_struct); + +pb_bytes_array_t* vectorToPbArray(const std::vector& vectorToPack); + +void packString(char* &dst, std::string stringToPack); + +std::vector pbArrayToVector(pb_bytes_array_t* pbArray); + +template +T pbDecode(const pb_msgdesc_t *fields, std::vector &data) +{ + + T result = {}; + // Create stream + pb_istream_t stream = pb_istream_from_buffer(&data[0], data.size()); + + // Decode the message + if (pb_decode(&stream, fields, &result) == false) { + printf("Decode failed: %s\n", PB_GET_ERROR(&stream)); + } + return result; +} + +template +void pbDecode(T &result, const pb_msgdesc_t *fields, std::vector &data) +{ + // Create stream + pb_istream_t stream = pb_istream_from_buffer(&data[0], data.size()); + + // Decode the message + if (pb_decode(&stream, fields, &result) == false) { + printf("Decode failed: %s\n", PB_GET_ERROR(&stream)); + } +} + +void pbFree(const pb_msgdesc_t *fields, void *src_struct); + +#endif \ No newline at end of file diff --git a/components/spotify/cspot/bell/src/NanoPBHelper.cpp b/components/spotify/cspot/bell/src/NanoPBHelper.cpp new file mode 100644 index 00000000..063c0211 --- /dev/null +++ b/components/spotify/cspot/bell/src/NanoPBHelper.cpp @@ -0,0 +1,56 @@ +#include "NanoPBHelper.h" + +static bool vectorWrite(pb_ostream_t *stream, const pb_byte_t *buf, size_t count) +{ + size_t i; + auto *dest = reinterpret_cast *>(stream->state); + + dest->insert(dest->end(), buf, buf + count); + + return true; +} + +pb_ostream_t pb_ostream_from_vector(std::vector &vec) +{ + pb_ostream_t stream; + + stream.callback = &vectorWrite; + stream.state = &vec; + stream.max_size = 100000; + stream.bytes_written = 0; + + return stream; +} + +std::vector pbEncode(const pb_msgdesc_t *fields, const void *src_struct) +{ + std::vector vecData(0); + pb_ostream_t stream = pb_ostream_from_vector(vecData); + pb_encode(&stream, fields, src_struct); + + return vecData; +} + +void packString(char *&dst, std::string stringToPack) +{ + dst = (char *)malloc((strlen(stringToPack.c_str()) + 1) * sizeof(char)); + strcpy(dst, stringToPack.c_str()); +} + +void pbFree(const pb_msgdesc_t *fields, void *src_struct) { + pb_release(fields, src_struct); +} + +pb_bytes_array_t* vectorToPbArray(const std::vector& vectorToPack) +{ + auto size = static_cast(vectorToPack.size()); + auto result = static_cast( + malloc(PB_BYTES_ARRAY_T_ALLOCSIZE(size))); + result->size = size; + memcpy(result->bytes, vectorToPack.data(), size); + return result; +} + +std::vector pbArrayToVector(pb_bytes_array_t* pbArray) { + return std::vector(pbArray->bytes, pbArray->bytes + pbArray->size); +} \ No newline at end of file