|
|
|
|
@@ -37,12 +37,12 @@
|
|
|
|
|
#pragma warning(disable : 4001)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#include <blue/object/array.h>
|
|
|
|
|
#include <blue/object/dict.h>
|
|
|
|
|
#include <blue/object/number.h>
|
|
|
|
|
#include <blue/object/object.h>
|
|
|
|
|
#include <blue/object/string.h>
|
|
|
|
|
#include <blue/object/uuid.h>
|
|
|
|
|
#include <blue/ds/array.h>
|
|
|
|
|
#include <blue/ds/dict.h>
|
|
|
|
|
#include <blue/ds/number.h>
|
|
|
|
|
#include <blue/ds/object.h>
|
|
|
|
|
#include <blue/ds/string.h>
|
|
|
|
|
#include <blue/ds/uuid.h>
|
|
|
|
|
#include <ctype.h>
|
|
|
|
|
#include <float.h>
|
|
|
|
|
#include <limits.h>
|
|
|
|
|
@@ -2933,9 +2933,9 @@ CJSON_PUBLIC(void) cJSON_free(void *object)
|
|
|
|
|
object = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static enum b_status b_object_to_cJSON(const struct b_object *object, cJSON **out);
|
|
|
|
|
static enum b_status b_dsref_to_cJSON(const struct b_dsref *object, cJSON **out);
|
|
|
|
|
|
|
|
|
|
static enum b_status serialise_array(const struct b_object *object, cJSON **out)
|
|
|
|
|
static enum b_status serialise_array(const struct b_dsref *object, cJSON **out)
|
|
|
|
|
{
|
|
|
|
|
cJSON *json_array = cJSON_CreateArray();
|
|
|
|
|
if (!json_array) {
|
|
|
|
|
@@ -2947,7 +2947,7 @@ static enum b_status serialise_array(const struct b_object *object, cJSON **out)
|
|
|
|
|
b_array_foreach(&it, array)
|
|
|
|
|
{
|
|
|
|
|
cJSON *child = NULL;
|
|
|
|
|
enum b_status status = b_object_to_cJSON(it.value, &child);
|
|
|
|
|
enum b_status status = b_dsref_to_cJSON(it.value, &child);
|
|
|
|
|
if (!B_OK(status)) {
|
|
|
|
|
cJSON_Delete(json_array);
|
|
|
|
|
return status;
|
|
|
|
|
@@ -2960,7 +2960,7 @@ static enum b_status serialise_array(const struct b_object *object, cJSON **out)
|
|
|
|
|
return B_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static enum b_status serialise_dict(const struct b_object *object, cJSON **out)
|
|
|
|
|
static enum b_status serialise_dict(const struct b_dsref *object, cJSON **out)
|
|
|
|
|
{
|
|
|
|
|
cJSON *json_dict = cJSON_CreateObject();
|
|
|
|
|
if (!json_dict) {
|
|
|
|
|
@@ -2972,7 +2972,7 @@ static enum b_status serialise_dict(const struct b_object *object, cJSON **out)
|
|
|
|
|
b_dict_foreach(&it, dict)
|
|
|
|
|
{
|
|
|
|
|
cJSON *child = NULL;
|
|
|
|
|
enum b_status status = b_object_to_cJSON(it.value, &child);
|
|
|
|
|
enum b_status status = b_dsref_to_cJSON(it.value, &child);
|
|
|
|
|
if (!B_OK(status)) {
|
|
|
|
|
cJSON_Delete(json_dict);
|
|
|
|
|
return status;
|
|
|
|
|
@@ -2985,7 +2985,7 @@ static enum b_status serialise_dict(const struct b_object *object, cJSON **out)
|
|
|
|
|
return B_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static enum b_status serialise_number(const struct b_object *object, cJSON **out)
|
|
|
|
|
static enum b_status serialise_number(const struct b_dsref *object, cJSON **out)
|
|
|
|
|
{
|
|
|
|
|
cJSON *json_number = cJSON_CreateNumber(0);
|
|
|
|
|
if (!json_number) {
|
|
|
|
|
@@ -3049,7 +3049,7 @@ static enum b_status serialise_number(const struct b_object *object, cJSON **out
|
|
|
|
|
return B_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static enum b_status serialise_string(const struct b_object *object, cJSON **out)
|
|
|
|
|
static enum b_status serialise_string(const struct b_dsref *object, cJSON **out)
|
|
|
|
|
{
|
|
|
|
|
struct b_string *string = B_STRING(object);
|
|
|
|
|
cJSON *json_string = cJSON_CreateStringReference(b_string_ptr(string));
|
|
|
|
|
@@ -3061,7 +3061,7 @@ static enum b_status serialise_string(const struct b_object *object, cJSON **out
|
|
|
|
|
return B_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static enum b_status serialise_uuid(const struct b_object *object, cJSON **out)
|
|
|
|
|
static enum b_status serialise_uuid(const struct b_dsref *object, cJSON **out)
|
|
|
|
|
{
|
|
|
|
|
struct b_uuid *uuid = B_UUID(object);
|
|
|
|
|
char s[B_UUID_STRING_MAX];
|
|
|
|
|
@@ -3077,21 +3077,21 @@ static enum b_status serialise_uuid(const struct b_object *object, cJSON **out)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
typedef enum b_status (*object_serialise_callback)(
|
|
|
|
|
const struct b_object *, cJSON **);
|
|
|
|
|
const struct b_dsref *, cJSON **);
|
|
|
|
|
|
|
|
|
|
static const object_serialise_callback object_serialise[] = {
|
|
|
|
|
[B_OBJECT_TYPE_ARRAY] = serialise_array,
|
|
|
|
|
[B_OBJECT_TYPE_DICT] = serialise_dict,
|
|
|
|
|
[B_OBJECT_TYPE_NUMBER] = serialise_number,
|
|
|
|
|
[B_OBJECT_TYPE_STRING] = serialise_string,
|
|
|
|
|
[B_OBJECT_TYPE_UUID] = serialise_uuid,
|
|
|
|
|
[B_DSREF_TYPE_ARRAY] = serialise_array,
|
|
|
|
|
[B_DSREF_TYPE_DICT] = serialise_dict,
|
|
|
|
|
[B_DSREF_TYPE_NUMBER] = serialise_number,
|
|
|
|
|
[B_DSREF_TYPE_STRING] = serialise_string,
|
|
|
|
|
[B_DSREF_TYPE_UUID] = serialise_uuid,
|
|
|
|
|
};
|
|
|
|
|
static const size_t nr_object_serialise
|
|
|
|
|
= sizeof object_serialise / sizeof object_serialise[0];
|
|
|
|
|
|
|
|
|
|
static enum b_status b_object_to_cJSON(const struct b_object *object, cJSON **out)
|
|
|
|
|
static enum b_status b_dsref_to_cJSON(const struct b_dsref *object, cJSON **out)
|
|
|
|
|
{
|
|
|
|
|
b_object_type_id type = b_typeid(object);
|
|
|
|
|
b_dsref_type_id type = b_typeid(object);
|
|
|
|
|
if (type >= nr_object_serialise) {
|
|
|
|
|
return B_ERR_NOT_SUPPORTED;
|
|
|
|
|
}
|
|
|
|
|
@@ -3104,9 +3104,9 @@ static enum b_status b_object_to_cJSON(const struct b_object *object, cJSON **ou
|
|
|
|
|
return callback(object, out);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static enum b_status cJSON_to_b_object(cJSON *json, struct b_object **out);
|
|
|
|
|
static enum b_status cJSON_to_b_dsref(cJSON *json, struct b_dsref **out);
|
|
|
|
|
|
|
|
|
|
static enum b_status deserialise_dict(cJSON *json, struct b_object **out)
|
|
|
|
|
static enum b_status deserialise_dict(cJSON *json, struct b_dsref **out)
|
|
|
|
|
{
|
|
|
|
|
struct b_dict *dict = b_dict_create();
|
|
|
|
|
if (!dict) {
|
|
|
|
|
@@ -3117,8 +3117,8 @@ static enum b_status deserialise_dict(cJSON *json, struct b_object **out)
|
|
|
|
|
enum b_status status = B_SUCCESS;
|
|
|
|
|
|
|
|
|
|
while (item) {
|
|
|
|
|
struct b_object *child = NULL;
|
|
|
|
|
status = cJSON_to_b_object(item, &child);
|
|
|
|
|
struct b_dsref *child = NULL;
|
|
|
|
|
status = cJSON_to_b_dsref(item, &child);
|
|
|
|
|
if (!B_OK(status)) {
|
|
|
|
|
b_dict_release(dict);
|
|
|
|
|
dict = NULL;
|
|
|
|
|
@@ -3133,11 +3133,11 @@ static enum b_status deserialise_dict(cJSON *json, struct b_object **out)
|
|
|
|
|
item = item->next;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*out = B_OBJECT(dict);
|
|
|
|
|
*out = B_DSREF(dict);
|
|
|
|
|
return B_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static enum b_status deserialise_array(cJSON *json, struct b_object **out)
|
|
|
|
|
static enum b_status deserialise_array(cJSON *json, struct b_dsref **out)
|
|
|
|
|
{
|
|
|
|
|
struct b_array *array = b_array_create();
|
|
|
|
|
if (!array) {
|
|
|
|
|
@@ -3148,8 +3148,8 @@ static enum b_status deserialise_array(cJSON *json, struct b_object **out)
|
|
|
|
|
enum b_status status = B_SUCCESS;
|
|
|
|
|
|
|
|
|
|
while (item) {
|
|
|
|
|
struct b_object *child = NULL;
|
|
|
|
|
status = cJSON_to_b_object(item, &child);
|
|
|
|
|
struct b_dsref *child = NULL;
|
|
|
|
|
status = cJSON_to_b_dsref(item, &child);
|
|
|
|
|
if (!B_OK(status)) {
|
|
|
|
|
b_array_release(array);
|
|
|
|
|
array = NULL;
|
|
|
|
|
@@ -3164,22 +3164,22 @@ static enum b_status deserialise_array(cJSON *json, struct b_object **out)
|
|
|
|
|
item = item->next;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*out = B_OBJECT(array);
|
|
|
|
|
*out = B_DSREF(array);
|
|
|
|
|
return B_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static enum b_status deserialise_string(cJSON *json, struct b_object **out)
|
|
|
|
|
static enum b_status deserialise_string(cJSON *json, struct b_dsref **out)
|
|
|
|
|
{
|
|
|
|
|
struct b_string *string = b_string_create_from_cstr(json->valuestring);
|
|
|
|
|
if (!string) {
|
|
|
|
|
return B_ERR_NO_MEMORY;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*out = B_OBJECT(string);
|
|
|
|
|
*out = B_DSREF(string);
|
|
|
|
|
return B_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static enum b_status deserialise_number(cJSON *json, struct b_object **out)
|
|
|
|
|
static enum b_status deserialise_number(cJSON *json, struct b_dsref **out)
|
|
|
|
|
{
|
|
|
|
|
struct b_number *number = NULL;
|
|
|
|
|
|
|
|
|
|
@@ -3193,11 +3193,11 @@ static enum b_status deserialise_number(cJSON *json, struct b_object **out)
|
|
|
|
|
return B_ERR_NO_MEMORY;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*out = B_OBJECT(number);
|
|
|
|
|
*out = B_DSREF(number);
|
|
|
|
|
return B_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static enum b_status deserialise_bool(cJSON *json, struct b_object **out)
|
|
|
|
|
static enum b_status deserialise_bool(cJSON *json, struct b_dsref **out)
|
|
|
|
|
{
|
|
|
|
|
struct b_number *number = NULL;
|
|
|
|
|
|
|
|
|
|
@@ -3211,11 +3211,11 @@ static enum b_status deserialise_bool(cJSON *json, struct b_object **out)
|
|
|
|
|
return B_ERR_NO_MEMORY;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*out = B_OBJECT(number);
|
|
|
|
|
*out = B_DSREF(number);
|
|
|
|
|
return B_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static enum b_status cJSON_to_b_object(cJSON *json, struct b_object **out)
|
|
|
|
|
static enum b_status cJSON_to_b_dsref(cJSON *json, struct b_dsref **out)
|
|
|
|
|
{
|
|
|
|
|
switch (json->type) {
|
|
|
|
|
case cJSON_True:
|
|
|
|
|
@@ -3238,11 +3238,11 @@ static enum b_status cJSON_to_b_object(cJSON *json, struct b_object **out)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static enum b_status json_serialise(
|
|
|
|
|
struct b_serial_ctx *ctx, struct b_object *src, struct b_stream *dest,
|
|
|
|
|
struct b_serial_ctx *ctx, struct b_dsref *src, struct b_stream *dest,
|
|
|
|
|
enum b_serial_flags flags)
|
|
|
|
|
{
|
|
|
|
|
cJSON *json;
|
|
|
|
|
enum b_status status = b_object_to_cJSON(src, &json);
|
|
|
|
|
enum b_status status = b_dsref_to_cJSON(src, &json);
|
|
|
|
|
|
|
|
|
|
if (!B_OK(status)) {
|
|
|
|
|
return status;
|
|
|
|
|
@@ -3269,7 +3269,7 @@ static enum b_status json_serialise(
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static enum b_status json_deserialise(
|
|
|
|
|
struct b_serial_ctx *ctx, struct b_stream *src, struct b_object **dest,
|
|
|
|
|
struct b_serial_ctx *ctx, struct b_stream *src, struct b_dsref **dest,
|
|
|
|
|
enum b_serial_flags flags)
|
|
|
|
|
{
|
|
|
|
|
struct b_string *json_string = b_string_create();
|
|
|
|
|
@@ -3294,7 +3294,7 @@ static enum b_status json_deserialise(
|
|
|
|
|
return B_ERR_BAD_FORMAT;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
status = cJSON_to_b_object(json, dest);
|
|
|
|
|
status = cJSON_to_b_dsref(json, dest);
|
|
|
|
|
|
|
|
|
|
cJSON_Delete(json);
|
|
|
|
|
|
|
|
|
|
|