add: msgpack as binn replacement

This commit is contained in:
Tobias Reisinger 2020-04-24 01:33:34 +02:00
parent 44a83cd2c5
commit 701f01c495
9 changed files with 13658 additions and 4329 deletions

View file

@ -1,6 +1,7 @@
#include <models/controller_dbo.h>
#include <config.h>
#include <enums.h>
#include <mpack.h>
#include "api_v1_controllers.h"
using namespace api::v1;
@ -134,14 +135,28 @@ controllers::put_one_by_id(const HttpRequestPtr &req, std::function<void(const H
auto resp = HttpResponse::newHttpResponse();
if(controllers[0]->update())
{
binn *map = binn_map();
char* data;
size_t size;
mpack_writer_t writer;
mpack_writer_init_growable(&writer, &data, &size);
binn_map_set_uint8(map, COMMAND_MAPPING_CODE, config::command_code_set_name);
binn_map_set_str(map, COMMAND_MAPPING_NAME, controllers[0]->name);
// write the example on the msgpack homepage
mpack_start_map(&writer, 2);
mpack_write_uint(&writer, COMMAND_MAPPING_CODE);
mpack_write_u8(&writer, config::command_code_set_name);
mpack_write_uint(&writer, COMMAND_MAPPING_NAME);
mpack_write_cstr(&writer, controllers[0]->name);
mpack_finish_map(&writer);
controllers[0]->command(map);
binn_free(map);
// finish writing
if (mpack_writer_destroy(&writer) != mpack_ok) {
LOG_ERROR << "an error occurred encoding the data";
auto resp = HttpResponse::newHttpResponse();
resp->setStatusCode(k500InternalServerError);
callback(resp);
return;
}
controllers[0]->command(config::command_code_set_name, data, size);
resp = HttpResponse::newHttpJsonResponse(controllers[0]->to_json());
}
else

View file

@ -3,10 +3,10 @@
#include <cmath>
#include <uuid/uuid.h>
#include <mpack.h>
#include <config.h>
#include <helpers.h>
#include <models/controller_dbo.h>
#include <binn.h>
#include "api_v1_controllers.h"
using namespace api::v1;
@ -85,7 +85,7 @@ void controllers::post_discover(const HttpRequestPtr &req, std::function<void(co
continue;
}
void *answer_payload = malloc((payload_length + 1));
char *answer_payload = (char*)malloc((payload_length + 1));
ssize_t bytes_transferred;
if((bytes_transferred = recv(client_fd, answer_payload, payload_length, 0)) <= 0)
@ -105,11 +105,19 @@ void controllers::post_discover(const HttpRequestPtr &req, std::function<void(co
uuid_t discovered_id;
int id_size = sizeof(uuid_t);
memcpy(&discovered_id, binn_map_blob(answer_payload, DISCOVERY_MAPPING_ID, &id_size), id_size);
char *discovered_name = binn_map_str(answer_payload, DISCOVERY_MAPPING_NAME);
uint32_t discovered_command_port = binn_map_uint32(answer_payload, DISCOVERY_MAPPING_COMMAND_PORT);
uint8_t discovered_relay_count = binn_map_uint8(answer_payload, DISCOVERY_MAPPING_RELAY_COUNT);
mpack_tree_t tree;
mpack_tree_init_data(&tree, answer_payload, payload_length);
mpack_tree_parse(&tree);
mpack_node_t root = mpack_tree_root(&tree);
memcpy(discovered_id, mpack_node_data(mpack_node_map_uint(root, DISCOVERY_MAPPING_ID)), id_size);
uint32_t discovered_command_port = mpack_node_u16(mpack_node_map_uint(root, DISCOVERY_MAPPING_COMMAND_PORT));
uint8_t discovered_relay_count = mpack_node_u8(mpack_node_map_uint(root, DISCOVERY_MAPPING_RELAY_COUNT));
const char *discovered_name = mpack_node_str(mpack_node_map_uint(root, DISCOVERY_MAPPING_NAME));
mpack_tree_destroy(&tree);
bool found_discovered_in_list = false;

View file

@ -1,6 +1,7 @@
#include <netdb.h>
#include <models/relay_dbo.h>
#include <helpers.h>
#include <mpack.h>
#include <models/controller_dbo.h>
#include <models/schedule_dbo.h>
#include <config.h>
@ -179,20 +180,38 @@ controllers::put_relays_one_by_id_and_num(const HttpRequestPtr &req,
uint16_t *periods = schedules[0]->periods->to_blob();
uint16_t periods_count = periods[0];
binn *map = binn_map();
binn_map_set_uint8(map, COMMAND_MAPPING_CODE, config::command_code_set_schedule);
binn_map_set_uint8(map, COMMAND_MAPPING_RELAY_NUM, relay_num);
binn_map_set_blob(map, COMMAND_MAPPING_SCHEDULE_ID, schedules[0]->uid, sizeof(uuid_t));
binn_map_set_uint16(map, COMMAND_MAPPING_PERIODS_COUNT, periods_count);
char* data;
size_t size;
mpack_writer_t writer;
mpack_writer_init_growable(&writer, &data, &size);
mpack_start_map(&writer, 5);
mpack_write_uint(&writer, COMMAND_MAPPING_CODE);
mpack_write_u8(&writer, config::command_code_set_schedule);
mpack_write_uint(&writer, COMMAND_MAPPING_RELAY_NUM);
mpack_write_u8(&writer, relay_num);
mpack_write_uint(&writer, COMMAND_MAPPING_PERIODS_COUNT);
mpack_write_u16(&writer, periods_count);
mpack_write_uint(&writer, COMMAND_MAPPING_SCHEDULE_ID);
mpack_write_bin(&writer, (char*)schedules[0]->uid, sizeof(uuid_t));
mpack_write_uint(&writer, COMMAND_MAPPING_PERIODS_BLOB);
// periods + 1 to skip length in periods[0]
// periods_count * 2 because each uint16_t is a timestamp. 2 are start and end
binn_map_set_blob(map, COMMAND_MAPPING_PERIODS_BLOB, periods + 1, sizeof(uint16_t) * periods_count * 2);
mpack_write_bin(&writer, (char*)(periods + 1), sizeof(uint16_t) * periods_count * 2);
mpack_finish_map(&writer);
controllers[0]->command(map);
// finish writing
if (mpack_writer_destroy(&writer) != mpack_ok) {
LOG_ERROR << "an error occurred encoding the data";
auto resp = HttpResponse::newHttpResponse();
resp->setStatusCode(k500InternalServerError);
callback(resp);
return;
}
controllers[0]->command(config::command_code_set_name, data, size);
binn_free(map);
free(periods);
auto resp = HttpResponse::newHttpJsonResponse(relay->to_json());