2
0

NanoPBHelper.cpp 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include "NanoPBHelper.h"
  2. static bool vectorWrite(pb_ostream_t *stream, const pb_byte_t *buf, size_t count)
  3. {
  4. size_t i;
  5. auto *dest = reinterpret_cast<std::vector<uint8_t> *>(stream->state);
  6. dest->insert(dest->end(), buf, buf + count);
  7. return true;
  8. }
  9. pb_ostream_t pb_ostream_from_vector(std::vector<uint8_t> &vec)
  10. {
  11. pb_ostream_t stream;
  12. stream.callback = &vectorWrite;
  13. stream.state = &vec;
  14. stream.max_size = 100000;
  15. stream.bytes_written = 0;
  16. return stream;
  17. }
  18. std::vector<uint8_t> pbEncode(const pb_msgdesc_t *fields, const void *src_struct)
  19. {
  20. std::vector<uint8_t> vecData(0);
  21. pb_ostream_t stream = pb_ostream_from_vector(vecData);
  22. pb_encode(&stream, fields, src_struct);
  23. return vecData;
  24. }
  25. void packString(char *&dst, std::string stringToPack)
  26. {
  27. dst = (char *)malloc((strlen(stringToPack.c_str()) + 1) * sizeof(char));
  28. strcpy(dst, stringToPack.c_str());
  29. }
  30. pb_bytes_array_t* vectorToPbArray(const std::vector<uint8_t>& vectorToPack)
  31. {
  32. auto size = static_cast<pb_size_t>(vectorToPack.size());
  33. auto result = static_cast<pb_bytes_array_t *>(
  34. malloc(PB_BYTES_ARRAY_T_ALLOCSIZE(size)));
  35. result->size = size;
  36. memcpy(result->bytes, vectorToPack.data(), size);
  37. return result;
  38. }
  39. void pbPutString(const std::string &stringToPack, char* dst) {
  40. stringToPack.copy(dst, stringToPack.size());
  41. dst[stringToPack.size()] = '\0';
  42. }
  43. void pbPutCharArray(const char * stringToPack, char* dst) {
  44. // copy stringToPack into dst
  45. strcpy(dst, stringToPack);
  46. //dst[sizeof(stringToPack)-1] = '\0';
  47. }
  48. void pbPutBytes(const std::vector<uint8_t> &data, pb_bytes_array_t &dst) {
  49. dst.size = data.size();
  50. std::copy(data.begin(), data.end(), dst.bytes);
  51. }
  52. std::vector<uint8_t> pbArrayToVector(pb_bytes_array_t* pbArray) {
  53. return std::vector<uint8_t>(pbArray->bytes, pbArray->bytes + pbArray->size);
  54. }
  55. const char *pb_encode_to_string(const pb_msgdesc_t *fields, const void *data) {
  56. size_t len;
  57. pb_get_encoded_size(&len, fields, data);
  58. auto *buf = static_cast<uint8_t *>(malloc(len + 1));
  59. auto ostream = pb_ostream_from_buffer(buf, len);
  60. pb_encode(&ostream, fields, data);
  61. buf[len] = '\0';
  62. return reinterpret_cast<const char *>(buf);
  63. }
  64. static bool pb_read_from_http(pb_istream_t *stream, pb_byte_t *buf, size_t count) {
  65. auto *response = (bell::HTTPClient::HTTPResponse *)stream->state;
  66. size_t len = response->read(buf, count, /* wait */ true);
  67. if (response->isComplete)
  68. stream->bytes_left = count; // count is subtracted after the callback
  69. return len == count;
  70. }
  71. pb_istream_t pb_istream_from_http(bell::HTTPClient::HTTPResponse *response, size_t length) {
  72. if (!length)
  73. length = response->contentLength;
  74. if (!length)
  75. length = SIZE_MAX;
  76. return {
  77. .callback = &pb_read_from_http,
  78. .state = response,
  79. .bytes_left = length,
  80. };
  81. }