mirror of
https://github.com/emqx/neuron.git
synced 2026-10-20 16:05:10 +08:00
677 lines
19 KiB
C
677 lines
19 KiB
C
/**
|
|
* NEURON IIoT System for Industry 4.0
|
|
* Copyright (C) 2020-2022 EMQ Technologies Co., Ltd All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 3 of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
**/
|
|
|
|
/*
|
|
* DO NOT EDIT THIS FILE MANUALLY!
|
|
* It was automatically generated by `json-autotype`.
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include <jansson.h>
|
|
|
|
#include "utils/log.h"
|
|
#include "json/json.h"
|
|
|
|
#include "neu_json_group_config.h"
|
|
|
|
int neu_json_decode_add_group_config_req(
|
|
char *buf, neu_json_add_group_config_req_t **result)
|
|
{
|
|
int ret = 0;
|
|
void * json_obj = NULL;
|
|
neu_json_add_group_config_req_t *req =
|
|
calloc(1, sizeof(neu_json_add_group_config_req_t));
|
|
if (req == NULL) {
|
|
return -1;
|
|
}
|
|
|
|
json_obj = neu_json_decode_new(buf);
|
|
|
|
neu_json_elem_t req_elems[] = { {
|
|
.name = "node",
|
|
.t = NEU_JSON_STR,
|
|
},
|
|
{
|
|
.name = "group",
|
|
.t = NEU_JSON_STR,
|
|
},
|
|
{
|
|
.name = "interval",
|
|
.t = NEU_JSON_INT,
|
|
} };
|
|
ret = neu_json_decode_by_json(json_obj, NEU_JSON_ELEM_SIZE(req_elems),
|
|
req_elems);
|
|
if (ret != 0) {
|
|
goto decode_fail;
|
|
}
|
|
|
|
req->node = req_elems[0].v.val_str;
|
|
req->group = req_elems[1].v.val_str;
|
|
req->interval = req_elems[2].v.val_int;
|
|
|
|
*result = req;
|
|
goto decode_exit;
|
|
|
|
decode_fail:
|
|
free(req);
|
|
ret = -1;
|
|
|
|
decode_exit:
|
|
if (json_obj != NULL) {
|
|
neu_json_decode_free(json_obj);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
void neu_json_decode_add_group_config_req_free(
|
|
neu_json_add_group_config_req_t *req)
|
|
{
|
|
free(req->node);
|
|
free(req->group);
|
|
|
|
free(req);
|
|
}
|
|
|
|
int neu_json_decode_del_group_config_req(
|
|
char *buf, neu_json_del_group_config_req_t **result)
|
|
{
|
|
int ret = 0;
|
|
void * json_obj = NULL;
|
|
neu_json_del_group_config_req_t *req =
|
|
calloc(1, sizeof(neu_json_del_group_config_req_t));
|
|
if (req == NULL) {
|
|
return -1;
|
|
}
|
|
|
|
json_obj = neu_json_decode_new(buf);
|
|
|
|
neu_json_elem_t req_elems[] = { {
|
|
.name = "node",
|
|
.t = NEU_JSON_STR,
|
|
},
|
|
{
|
|
.name = "group",
|
|
.t = NEU_JSON_STR,
|
|
} };
|
|
ret = neu_json_decode_by_json(json_obj, NEU_JSON_ELEM_SIZE(req_elems),
|
|
req_elems);
|
|
if (ret != 0) {
|
|
goto decode_fail;
|
|
}
|
|
|
|
req->node = req_elems[0].v.val_str;
|
|
req->group = req_elems[1].v.val_str;
|
|
|
|
*result = req;
|
|
goto decode_exit;
|
|
|
|
decode_fail:
|
|
free(req);
|
|
ret = -1;
|
|
|
|
decode_exit:
|
|
if (json_obj != NULL) {
|
|
neu_json_decode_free(json_obj);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
void neu_json_decode_del_group_config_req_free(
|
|
neu_json_del_group_config_req_t *req)
|
|
{
|
|
free(req->node);
|
|
free(req->group);
|
|
|
|
free(req);
|
|
}
|
|
|
|
int neu_json_encode_get_group_config_resp(void *json_object, void *param)
|
|
{
|
|
int ret = 0;
|
|
neu_json_get_group_config_resp_t *resp =
|
|
(neu_json_get_group_config_resp_t *) param;
|
|
|
|
void *group_config_array = neu_json_array();
|
|
neu_json_get_group_config_resp_group_config_t *p_group_config =
|
|
resp->group_configs;
|
|
for (int i = 0; i < resp->n_group_config; i++) {
|
|
neu_json_elem_t group_config_elems[] = {
|
|
{
|
|
.name = "tag_count",
|
|
.t = NEU_JSON_INT,
|
|
.v.val_int = p_group_config->tag_count,
|
|
},
|
|
{
|
|
.name = "name",
|
|
.t = NEU_JSON_STR,
|
|
.v.val_str = p_group_config->name,
|
|
},
|
|
{
|
|
.name = "interval",
|
|
.t = NEU_JSON_INT,
|
|
.v.val_int = p_group_config->interval,
|
|
}
|
|
};
|
|
group_config_array =
|
|
neu_json_encode_array(group_config_array, group_config_elems,
|
|
NEU_JSON_ELEM_SIZE(group_config_elems));
|
|
p_group_config++;
|
|
}
|
|
|
|
neu_json_elem_t resp_elems[] = { {
|
|
.name = "groups",
|
|
.t = NEU_JSON_OBJECT,
|
|
.v.val_object = group_config_array,
|
|
} };
|
|
ret = neu_json_encode_field(json_object, resp_elems,
|
|
NEU_JSON_ELEM_SIZE(resp_elems));
|
|
|
|
return ret;
|
|
}
|
|
|
|
int neu_json_encode_get_driver_group_resp(void *json_object, void *param)
|
|
{
|
|
int ret = 0;
|
|
neu_json_get_driver_group_resp_t *resp =
|
|
(neu_json_get_driver_group_resp_t *) param;
|
|
|
|
void * group_array = neu_json_array();
|
|
neu_json_get_driver_group_resp_group_t *p_group = resp->groups;
|
|
for (int i = 0; i < resp->n_group; i++) {
|
|
neu_json_elem_t group_elems[] = {
|
|
{
|
|
.name = "driver",
|
|
.t = NEU_JSON_STR,
|
|
.v.val_str = p_group->driver,
|
|
},
|
|
{
|
|
.name = "group",
|
|
.t = NEU_JSON_STR,
|
|
.v.val_str = p_group->group,
|
|
},
|
|
{
|
|
.name = "tag_count",
|
|
.t = NEU_JSON_INT,
|
|
.v.val_int = p_group->tag_count,
|
|
},
|
|
{
|
|
.name = "interval",
|
|
.t = NEU_JSON_INT,
|
|
.v.val_int = p_group->interval,
|
|
},
|
|
};
|
|
group_array = neu_json_encode_array(group_array, group_elems,
|
|
NEU_JSON_ELEM_SIZE(group_elems));
|
|
p_group++;
|
|
}
|
|
|
|
neu_json_elem_t resp_elems[] = { {
|
|
.name = "groups",
|
|
.t = NEU_JSON_OBJECT,
|
|
.v.val_object = group_array,
|
|
} };
|
|
ret = neu_json_encode_field(json_object, resp_elems,
|
|
NEU_JSON_ELEM_SIZE(resp_elems));
|
|
|
|
return ret;
|
|
}
|
|
|
|
int neu_json_decode_get_driver_group_resp_json(
|
|
void *json_obj, neu_json_get_driver_group_resp_t **result)
|
|
{
|
|
int ret = 0;
|
|
json_t * grp_array = NULL;
|
|
neu_json_get_driver_group_resp_t *resp = NULL;
|
|
|
|
grp_array = json_object_get(json_obj, "groups");
|
|
if (!json_is_array(grp_array)) {
|
|
goto decode_fail;
|
|
}
|
|
|
|
resp = calloc(1, sizeof(*resp));
|
|
if (resp == NULL) {
|
|
goto decode_fail;
|
|
}
|
|
|
|
resp->n_group = json_array_size(grp_array);
|
|
|
|
resp->groups = calloc(resp->n_group, sizeof(*resp->groups));
|
|
if (NULL == resp->groups) {
|
|
goto decode_fail;
|
|
}
|
|
|
|
for (int i = 0; i < resp->n_group; i++) {
|
|
neu_json_elem_t group_elems[] = {
|
|
{
|
|
.name = "driver",
|
|
.t = NEU_JSON_STR,
|
|
},
|
|
{
|
|
.name = "group",
|
|
.t = NEU_JSON_STR,
|
|
},
|
|
{
|
|
.name = "interval",
|
|
.t = NEU_JSON_INT,
|
|
},
|
|
{
|
|
.name = "tag_count",
|
|
.t = NEU_JSON_INT,
|
|
},
|
|
};
|
|
|
|
ret = neu_json_decode_by_json(json_array_get(grp_array, i),
|
|
NEU_JSON_ELEM_SIZE(group_elems),
|
|
group_elems);
|
|
|
|
// set the fields before check for easy clean up on error
|
|
resp->groups[i].driver = group_elems[0].v.val_str;
|
|
resp->groups[i].group = group_elems[1].v.val_str;
|
|
resp->groups[i].interval = group_elems[2].v.val_int;
|
|
resp->groups[i].tag_count = group_elems[3].v.val_int;
|
|
|
|
if (ret != 0) {
|
|
goto decode_fail;
|
|
}
|
|
}
|
|
|
|
*result = resp;
|
|
goto decode_exit;
|
|
|
|
decode_fail:
|
|
neu_json_decode_get_driver_group_resp_free(resp);
|
|
ret = -1;
|
|
|
|
decode_exit:
|
|
return ret;
|
|
}
|
|
|
|
void neu_json_decode_get_driver_group_resp_free(
|
|
neu_json_get_driver_group_resp_t *resp)
|
|
{
|
|
if (resp) {
|
|
for (int i = 0; i < resp->n_group; ++i) {
|
|
free(resp->groups[i].driver);
|
|
free(resp->groups[i].group);
|
|
}
|
|
free(resp->groups);
|
|
free(resp);
|
|
}
|
|
}
|
|
|
|
int neu_json_encode_get_subscribe_resp(void *object, void *param)
|
|
{
|
|
int ret = 0;
|
|
neu_json_get_subscribe_resp_t *resp =
|
|
(neu_json_get_subscribe_resp_t *) param;
|
|
|
|
void * group_array = neu_json_array();
|
|
neu_json_get_subscribe_resp_group_t *p_group = resp->groups;
|
|
for (int i = 0; i < resp->n_group; i++) {
|
|
json_t *ob = json_object();
|
|
|
|
// rely on lib jansson to check for NULL pointers
|
|
json_object_set_new(ob, "driver", json_string(p_group->driver));
|
|
json_object_set_new(ob, "group", json_string(p_group->group));
|
|
|
|
if (p_group->params) {
|
|
json_t *t = json_loads(p_group->params, 0, NULL);
|
|
json_t *p = json_object_get(t, "params");
|
|
json_object_set(ob, "params", p);
|
|
json_decref(t);
|
|
}
|
|
|
|
json_array_append_new(group_array, ob);
|
|
|
|
p_group++;
|
|
}
|
|
|
|
neu_json_elem_t resp_elems[] = { {
|
|
.name = "groups",
|
|
.t = NEU_JSON_OBJECT,
|
|
.v.val_object = group_array,
|
|
} };
|
|
ret = neu_json_encode_field(object, resp_elems,
|
|
NEU_JSON_ELEM_SIZE(resp_elems));
|
|
|
|
return ret;
|
|
}
|
|
|
|
static inline int dump_params(void *root, char **const result)
|
|
{
|
|
return neu_json_dump_key(root, "params", result, false);
|
|
}
|
|
|
|
int neu_json_decode_subscribe_req(char *buf, neu_json_subscribe_req_t **result)
|
|
{
|
|
int ret = 0;
|
|
void * json_obj = NULL;
|
|
neu_json_subscribe_req_t *req = calloc(1, sizeof(neu_json_subscribe_req_t));
|
|
if (req == NULL) {
|
|
return -1;
|
|
}
|
|
|
|
json_obj = neu_json_decode_new(buf);
|
|
|
|
neu_json_elem_t req_elems[] = { {
|
|
.name = "app",
|
|
.t = NEU_JSON_STR,
|
|
},
|
|
{
|
|
.name = "group",
|
|
.t = NEU_JSON_STR,
|
|
},
|
|
{
|
|
.name = "driver",
|
|
.t = NEU_JSON_STR,
|
|
} };
|
|
ret = neu_json_decode_by_json(json_obj, NEU_JSON_ELEM_SIZE(req_elems),
|
|
req_elems);
|
|
if (ret != 0) {
|
|
goto decode_fail;
|
|
}
|
|
|
|
req->app = req_elems[0].v.val_str;
|
|
req->group = req_elems[1].v.val_str;
|
|
req->driver = req_elems[2].v.val_str;
|
|
|
|
ret = dump_params(json_obj, &req->params);
|
|
if (0 != ret) {
|
|
goto decode_fail;
|
|
}
|
|
|
|
*result = req;
|
|
goto decode_exit;
|
|
|
|
decode_fail:
|
|
free(req);
|
|
ret = -1;
|
|
|
|
decode_exit:
|
|
if (json_obj != NULL) {
|
|
neu_json_decode_free(json_obj);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
void neu_json_decode_subscribe_req_free(neu_json_subscribe_req_t *req)
|
|
{
|
|
free(req->app);
|
|
free(req->driver);
|
|
free(req->group);
|
|
free(req->params);
|
|
|
|
free(req);
|
|
}
|
|
|
|
int neu_json_decode_unsubscribe_req(char * buf,
|
|
neu_json_unsubscribe_req_t **result)
|
|
{
|
|
int ret = 0;
|
|
void * json_obj = NULL;
|
|
neu_json_unsubscribe_req_t *req =
|
|
calloc(1, sizeof(neu_json_unsubscribe_req_t));
|
|
if (req == NULL) {
|
|
return -1;
|
|
}
|
|
|
|
json_obj = neu_json_decode_new(buf);
|
|
|
|
neu_json_elem_t req_elems[] = { {
|
|
.name = "app",
|
|
.t = NEU_JSON_STR,
|
|
},
|
|
{
|
|
.name = "group",
|
|
.t = NEU_JSON_STR,
|
|
},
|
|
{
|
|
.name = "driver",
|
|
.t = NEU_JSON_STR,
|
|
} };
|
|
ret = neu_json_decode_by_json(json_obj, NEU_JSON_ELEM_SIZE(req_elems),
|
|
req_elems);
|
|
if (ret != 0) {
|
|
goto decode_fail;
|
|
}
|
|
|
|
req->app = req_elems[0].v.val_str;
|
|
req->group = req_elems[1].v.val_str;
|
|
req->driver = req_elems[2].v.val_str;
|
|
|
|
*result = req;
|
|
goto decode_exit;
|
|
|
|
decode_fail:
|
|
free(req);
|
|
ret = -1;
|
|
|
|
decode_exit:
|
|
if (json_obj != NULL) {
|
|
neu_json_decode_free(json_obj);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
void neu_json_decode_unsubscribe_req_free(neu_json_unsubscribe_req_t *req)
|
|
{
|
|
|
|
free(req->app);
|
|
free(req->driver);
|
|
free(req->group);
|
|
|
|
free(req);
|
|
}
|
|
|
|
int neu_json_decode_update_group_config_req(
|
|
char *buf, neu_json_update_group_config_req_t **result)
|
|
{
|
|
int ret = 0;
|
|
|
|
neu_json_update_group_config_req_t *req = calloc(1, sizeof(*req));
|
|
if (req == NULL) {
|
|
return -1;
|
|
}
|
|
|
|
void *json_obj = neu_json_decode_new(buf);
|
|
if (NULL == json_obj) {
|
|
free(req);
|
|
return -1;
|
|
}
|
|
|
|
neu_json_elem_t req_elems[] = {
|
|
{
|
|
.name = "node",
|
|
.t = NEU_JSON_STR,
|
|
},
|
|
{
|
|
.name = "group",
|
|
.t = NEU_JSON_STR,
|
|
},
|
|
{
|
|
.name = "new_name",
|
|
.t = NEU_JSON_STR,
|
|
.attribute = NEU_JSON_ATTRIBUTE_OPTIONAL,
|
|
},
|
|
};
|
|
ret = neu_json_decode_by_json(json_obj, NEU_JSON_ELEM_SIZE(req_elems),
|
|
req_elems);
|
|
req->node = req_elems[0].v.val_str;
|
|
req->group = req_elems[1].v.val_str;
|
|
req->new_name = req_elems[2].v.val_str;
|
|
if (0 != ret) {
|
|
goto error;
|
|
}
|
|
|
|
json_t *json_interval = json_object_get(json_obj, "interval");
|
|
if (NULL != json_interval) {
|
|
if (!json_is_integer(json_interval)) {
|
|
nlog_error("decode interval is not integer");
|
|
goto error;
|
|
}
|
|
req->set_interval = true;
|
|
req->interval = json_integer_value(json_interval);
|
|
} else if (NULL == req->new_name) {
|
|
// at least one of `new_name` or `interval` should be provided
|
|
goto error;
|
|
}
|
|
|
|
*result = req;
|
|
neu_json_decode_free(json_obj);
|
|
return 0;
|
|
|
|
error:
|
|
neu_json_decode_update_group_config_req_free(req);
|
|
neu_json_decode_free(json_obj);
|
|
return -1;
|
|
}
|
|
|
|
void neu_json_decode_update_group_config_req_free(
|
|
neu_json_update_group_config_req_t *req)
|
|
{
|
|
free(req->node);
|
|
free(req->group);
|
|
free(req->new_name);
|
|
|
|
free(req);
|
|
}
|
|
|
|
int neu_json_decode_subscribe_groups_info_json(
|
|
void *json_obj, neu_json_subscribe_groups_info_t *info)
|
|
{
|
|
neu_json_elem_t req_elems[] = {
|
|
{
|
|
.name = "driver",
|
|
.t = NEU_JSON_STR,
|
|
},
|
|
{
|
|
.name = "group",
|
|
.t = NEU_JSON_STR,
|
|
},
|
|
};
|
|
int ret = neu_json_decode_by_json(json_obj, NEU_JSON_ELEM_SIZE(req_elems),
|
|
req_elems);
|
|
if (ret != 0) {
|
|
free(req_elems[0].v.val_str);
|
|
free(req_elems[1].v.val_str);
|
|
return -1;
|
|
}
|
|
|
|
info->driver = req_elems[0].v.val_str;
|
|
info->group = req_elems[1].v.val_str;
|
|
|
|
ret = dump_params(json_obj, &info->params);
|
|
if (0 != ret) {
|
|
free(req_elems[0].v.val_str);
|
|
free(req_elems[1].v.val_str);
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void neu_json_decode_subscribe_groups_info_fini(
|
|
neu_json_subscribe_groups_info_t *req)
|
|
{
|
|
free(req->driver);
|
|
free(req->group);
|
|
free(req->params);
|
|
}
|
|
|
|
int neu_json_decode_subscribe_groups_req(
|
|
char *buf, neu_json_subscribe_groups_req_t **result)
|
|
{
|
|
int ret = 0;
|
|
void * json_obj = NULL;
|
|
neu_json_subscribe_groups_req_t * req = NULL;
|
|
neu_json_subscribe_groups_info_t *groups = NULL;
|
|
|
|
req = calloc(1, sizeof(*req));
|
|
if (req == NULL) {
|
|
return -1;
|
|
}
|
|
|
|
json_obj = neu_json_decode_new(buf);
|
|
if (NULL == json_obj) {
|
|
free(req);
|
|
return -1;
|
|
}
|
|
|
|
neu_json_elem_t req_elems[] = {
|
|
{
|
|
.name = "app",
|
|
.t = NEU_JSON_STR,
|
|
},
|
|
{
|
|
.name = "groups",
|
|
.t = NEU_JSON_OBJECT,
|
|
},
|
|
};
|
|
ret = neu_json_decode_by_json(json_obj, NEU_JSON_ELEM_SIZE(req_elems),
|
|
req_elems);
|
|
if (0 != ret) {
|
|
goto error;
|
|
}
|
|
|
|
json_t *group_arr = req_elems[1].v.val_object;
|
|
if (!json_is_array(group_arr)) {
|
|
goto error;
|
|
}
|
|
|
|
int n_group = json_array_size(group_arr);
|
|
groups = calloc(n_group, sizeof(groups[0]));
|
|
if (NULL == groups) {
|
|
goto error;
|
|
}
|
|
|
|
for (int i = 0; i < n_group; ++i) {
|
|
void *info = json_array_get(group_arr, i);
|
|
if (0 != neu_json_decode_subscribe_groups_info_json(info, &groups[i])) {
|
|
while (--i >= 0) {
|
|
neu_json_decode_subscribe_groups_info_fini(&groups[i]);
|
|
}
|
|
goto error;
|
|
}
|
|
}
|
|
|
|
req->app = req_elems[0].v.val_str;
|
|
req->n_group = n_group;
|
|
req->groups = groups;
|
|
*result = req;
|
|
neu_json_decode_free(json_obj);
|
|
return 0;
|
|
|
|
error:
|
|
free(req_elems[0].v.val_str);
|
|
free(groups);
|
|
free(req);
|
|
neu_json_decode_free(json_obj);
|
|
return -1;
|
|
}
|
|
|
|
void neu_json_decode_subscribe_groups_req_free(
|
|
neu_json_subscribe_groups_req_t *req)
|
|
{
|
|
if (req) {
|
|
free(req);
|
|
}
|
|
}
|