68 lines
No EOL
1.7 KiB
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;
|
|
} |