mirror of
https://gitee.com/Vancouver2017/luban-lite.git
synced 2025-12-24 04:58:54 +00:00
124 lines
3.8 KiB
C
124 lines
3.8 KiB
C
/**
|
|
* File: fscript_json.c
|
|
* Author: AWTK Develop Team
|
|
* Brief: json functions for fscript
|
|
*
|
|
* Copyright (c) 2020 - 2023 Guangzhou ZHIYUAN Electronics Co.,Ltd.
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* History:
|
|
* ================================================================
|
|
* 2021-01-07 Li XianJing <lixianjing@zlg.cn> created
|
|
*
|
|
*/
|
|
|
|
#include "tkc/fs.h"
|
|
#include "tkc/path.h"
|
|
#include "tkc/utils.h"
|
|
#include "tkc/fscript.h"
|
|
#include "conf_io/conf_json.h"
|
|
#include "conf_io/conf_ubjson.h"
|
|
#include "tkc/data_reader_mem.h"
|
|
#include "tkc/data_writer_wbuffer.h"
|
|
|
|
typedef tk_object_t* (*json_load_t)(const char* url, bool_t create);
|
|
typedef ret_t (*json_save_t)(tk_object_t* obj, const char* url);
|
|
|
|
static ret_t func_json_load_ex(fscript_t* fscript, fscript_args_t* args, value_t* result,
|
|
json_load_t load) {
|
|
value_t* v = NULL;
|
|
uint32_t size = 0;
|
|
tk_object_t* obj = NULL;
|
|
const void* data = NULL;
|
|
char url[MAX_PATH + 1];
|
|
FSCRIPT_FUNC_CHECK(args->size >= 1, RET_BAD_PARAMS);
|
|
|
|
v = args->args;
|
|
if (args->size == 1) {
|
|
if (v->type == VALUE_TYPE_STRING) {
|
|
data = value_str(v);
|
|
FSCRIPT_FUNC_CHECK(data != NULL, RET_BAD_PARAMS);
|
|
size = strlen(data);
|
|
} else if (v->type == VALUE_TYPE_BINARY) {
|
|
binary_data_t* bin = value_binary_data(v);
|
|
FSCRIPT_FUNC_CHECK(bin != NULL, RET_BAD_PARAMS);
|
|
data = bin->data;
|
|
size = bin->size;
|
|
}
|
|
} else {
|
|
data = value_pointer(v);
|
|
size = value_uint32(args->args + 1);
|
|
}
|
|
|
|
if (data != NULL && size > 0) {
|
|
data_reader_mem_build_url(data, size, url);
|
|
obj = load(url, FALSE);
|
|
value_set_object(result, obj);
|
|
result->free_handle = TRUE;
|
|
return RET_OK;
|
|
}
|
|
|
|
return RET_FAIL;
|
|
}
|
|
|
|
static ret_t func_json_save_ex(fscript_t* fscript, fscript_args_t* args, value_t* result,
|
|
json_save_t save, uint32_t result_type) {
|
|
wbuffer_t wb;
|
|
tk_object_t* obj = NULL;
|
|
char url[MAX_PATH + 1];
|
|
wbuffer_init_extendable(&wb);
|
|
FSCRIPT_FUNC_CHECK(args->size == 1, RET_BAD_PARAMS);
|
|
obj = value_object(args->args);
|
|
FSCRIPT_FUNC_CHECK(obj != NULL, RET_BAD_PARAMS);
|
|
FSCRIPT_FUNC_CHECK(wbuffer_extend_capacity(&wb, 256) == RET_OK, RET_OOM);
|
|
|
|
data_writer_wbuffer_build_url(&wb, url);
|
|
if (save(obj, url) == RET_OK) {
|
|
if (result_type == VALUE_TYPE_BINARY) {
|
|
value_set_binary_data(result, wb.data, wb.cursor);
|
|
} else if (result_type == VALUE_TYPE_STRING) {
|
|
wbuffer_write_uint8(&wb, 0);
|
|
value_set_str(result, (const char*)wb.data);
|
|
}
|
|
result->free_handle = TRUE;
|
|
return RET_OK;
|
|
}
|
|
wbuffer_deinit(&wb);
|
|
|
|
return RET_FAIL;
|
|
}
|
|
|
|
static ret_t func_json_load(fscript_t* fscript, fscript_args_t* args, value_t* result) {
|
|
return func_json_load_ex(fscript, args, result, conf_json_load);
|
|
}
|
|
|
|
static ret_t func_json_save(fscript_t* fscript, fscript_args_t* args, value_t* result) {
|
|
return func_json_save_ex(fscript, args, result, conf_json_save_as, VALUE_TYPE_BINARY);
|
|
}
|
|
|
|
static ret_t func_json_save_to_string(fscript_t* fscript, fscript_args_t* args, value_t* result) {
|
|
return func_json_save_ex(fscript, args, result, conf_json_save_as, VALUE_TYPE_STRING);
|
|
}
|
|
|
|
static ret_t func_ubjson_load(fscript_t* fscript, fscript_args_t* args, value_t* result) {
|
|
return func_json_load_ex(fscript, args, result, conf_ubjson_load);
|
|
}
|
|
|
|
static ret_t func_ubjson_save(fscript_t* fscript, fscript_args_t* args, value_t* result) {
|
|
return func_json_save_ex(fscript, args, result, conf_ubjson_save_as, VALUE_TYPE_BINARY);
|
|
}
|
|
|
|
FACTORY_TABLE_BEGIN(s_ext_json)
|
|
FACTORY_TABLE_ENTRY("json_load", func_json_load)
|
|
FACTORY_TABLE_ENTRY("json_save", func_json_save)
|
|
FACTORY_TABLE_ENTRY("json_save_to_string", func_json_save_to_string)
|
|
FACTORY_TABLE_ENTRY("ubjson_load", func_ubjson_load)
|
|
FACTORY_TABLE_ENTRY("ubjson_save", func_ubjson_save)
|
|
FACTORY_TABLE_END()
|
|
|
|
ret_t fscript_json_register(void) {
|
|
return fscript_register_funcs(s_ext_json);
|
|
}
|