aboutsummaryrefslogtreecommitdiff
path: root/lib/pbdrv/pb-msg.c
blob: ab3f5b2826799d60ca04709eec5a44cc1628a32e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <mpack.h>

#include "pb-msg.h"
#include "pb-serial.h"
#include "pb-mem.h"

pb_buf_t pb_msg_write(const pb_msg_t * msg) {
	pb_buf_t buf = { 0 };
	if (msg == NULL) return buf;

	mpack_writer_t writer;
	mpack_writer_init_growable(&writer, &buf.data, &buf.size);

	pb_ser_w(&writer, msg);

	mpack_writer_destroy(&writer);
	return buf;
}

pb_msg_t * pb_msg_read(const pb_buf_t * buf) {
	mpack_reader_t reader;
	mpack_reader_init_data(&reader, buf->data, buf->size);

	pb_msg_t * msg = pb_malloc(sizeof(pb_msg_t));

	pb_ser_r(&reader, msg);

	mpack_reader_destroy(&reader);
	return msg;
}

void pb_msg_free(pb_msg_t * msg) {
	// free message fields recursively
	pb_ser_free(msg);

	// free message container that was created in \p pb_msg_read
	pb_free(msg);
}