MeshTalos-Client/main/processor.c

68 lines
No EOL
1.7 KiB
C

#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
#include <stdio.h>
#include <stdlib.h>
#include "mpack/src/mpack/mpack.h"
#include "main.h"
request_t *client_parse_data(char *buf, size_t len) {
mpack_reader_t reader;
// initialize
mpack_reader_init_data(&reader, buf, len);
if (mpack_reader_error(&reader) != mpack_ok) {
goto parse_data_finish;
}
size_t count = mpack_expect_map_max(&reader, 100);
if (mpack_reader_error(&reader) != mpack_ok) {
goto parse_data_finish;
}
// variables
char *command = NULL;
uint64_t index = 0;
char *data = NULL;
size_t data_len = 0;
// read data
for (size_t i = 0; i < count; i++) {
char key[32] = {0};
mpack_expect_cstr(&reader, key, sizeof(key));
if (mpack_reader_error(&reader) != mpack_ok) {
goto parse_data_finish;
}
if (strcmp(key, "command") == 0) {
command = mpack_expect_cstr_alloc(&reader, 32);
} else if (strcmp(key, "index") == 0) {
index = mpack_expect_u64(&reader);
} else if (strcmp(key, "data") == 0) {
mpack_expect_bin(&reader);
data = mpack_expect_bin_alloc(&reader, CONFIG_IMAGE_BUF_SLICE_SIZE, &data_len);
} else {
mpack_discard(&reader);
}
}
parse_data_finish:
if (mpack_reader_destroy(&reader) != mpack_ok)
return NULL;
if (!command)
return NULL;
request_t *req = malloc(sizeof(request_t));
if (!req)
return NULL;
memset(req, 0, sizeof(request_t));
req->command = command;
req->index = index;
req->data = data;
req->data_len = data_len;
return req;
}