doubao_chat/lib/net/tencent/tvs_sdk/src/tvs_preference.c

275 lines
6.1 KiB
C

#define TVS_LOG_DEBUG 1
#define TVS_LOG_DEBUG_MODULE "PREF"
#include "tvs_log.h"
#include "tvs_jsons.h"
#include "tvs_preference.h"
#include "os_wrapper.h"
#include "tvs_preference_interface.h"
#include "tvs_threads.h"
#include "syscfg/syscfg_id.h"
cJSON *g_tvs_preference_root = NULL;
TVS_LOCKER_DEFINE
void tvs_preference_lock()
{
do_lock();
}
void tvs_preference_unlock()
{
do_unlock();
}
int tvs_preference_module_init()
{
TVS_LOCKER_INIT
return 0;
}
int tvs_preference_module_uninit()
{
TVS_LOCKER_UNINIT
if (g_tvs_preference_root) {
cJSON_Delete(g_tvs_preference_root);
g_tvs_preference_root = NULL;
}
return 0;
}
int tvs_preference_init()
{
if (g_tvs_preference_root == NULL) {
int size = 0;
const char *json = tvs_preference_load_data(&size);
TVS_LOG_PRINTF("load preference: %.*s\n", size, json);
g_tvs_preference_root = cJSON_Parse(json);
free((void *)json); //yii:释放perference字符串
}
if (g_tvs_preference_root == NULL) {
g_tvs_preference_root = cJSON_CreateObject();
TVS_LOG_PRINTF("create default\n");
}
return 0;
}
int tvs_preference_save()
{
if (g_tvs_preference_root == NULL) {
TVS_LOG_PRINTF("invalid json root\n");
return -1;
}
const char *json = cJSON_PrintUnformatted(g_tvs_preference_root);
if (NULL == json) {
TVS_LOG_PRINTF("format json error\n");
return -1;
}
int ret = tvs_preference_save_data(json, strlen(json) + 1);
TVS_LOG_PRINTF("save preference: %s, ret %d\n", json, ret);
if (json != NULL) {
TVS_FREE((char *)json);
}
return ret;
}
int tvs_preference_get_number_value(const char *name, int *value, int default_value)
{
*value = default_value;
if (!strcmp(name, TVS_PREFERENCE_VOLUME)) {
syscfg_read(CFG_MUSIC_VOL, value, sizeof(*value));
printf("-------%s-------%d---------vol = %d\r\n", __func__, __LINE__, *value);
} else {
do_lock();
tvs_preference_init();
if (g_tvs_preference_root == NULL || name == NULL || value == NULL) {
TVS_LOG_PRINTF("invalid param\n");
do_unlock();
return -1;
}
cJSON *node = cJSON_GetObjectItem(g_tvs_preference_root, name);
if (node != NULL) {
*value = node->valueint;
TVS_LOG_PRINTF("%s - %d\n", name, *value);
} else {
*value = default_value;
TVS_LOG_PRINTF("%s - default %d\n", name, *value);
}
do_unlock();
}
return 0;
}
const char *tvs_preference_get_string_value(const char *name)
{
do_lock();
tvs_preference_init();
if (g_tvs_preference_root == NULL || name == NULL) {
do_unlock();
return NULL;
}
cJSON *node = cJSON_GetObjectItem(g_tvs_preference_root, name);
if (node != NULL) {
do_unlock();
return node->valuestring;
}
do_unlock();
return NULL;
}
int tvs_preference_set_string_value(const char *name, const char *value)
{
do_lock();
tvs_preference_init();
if (g_tvs_preference_root == NULL || name == NULL) {
do_unlock();
return -1;
}
TVS_LOG_PRINTF("%s - %s\n", name, value);
cJSON *target = cJSON_GetObjectItem(g_tvs_preference_root, name);
value = (value == NULL ? "" : value);
if (target != NULL) {
if (strcmp(value, target->valuestring) == 0) {
TVS_LOG_PRINTF("the same\n");
do_unlock();
return 0;
}
cJSON_ReplaceItemInObject(g_tvs_preference_root, name, cJSON_CreateString(value));
} else {
cJSON_AddItemToObject(g_tvs_preference_root, name, cJSON_CreateString(value));
}
int ret = tvs_preference_save();
do_unlock();
return ret;
}
int tvs_preference_set_number_value(const char *name, int value)
{
do_lock();
tvs_preference_init();
if (g_tvs_preference_root == NULL || name == NULL) {
do_unlock();
return -1;
}
TVS_LOG_PRINTF("%s - %d\n", name, value);
cJSON *target = cJSON_GetObjectItem(g_tvs_preference_root, name);
if (target != NULL) {
if (target->valueint == value) {
TVS_LOG_PRINTF("the same\n");
do_unlock();
return 1;
}
cJSON_ReplaceItemInObject(g_tvs_preference_root, name, cJSON_CreateNumber(value));
} else {
cJSON_AddItemToObject(g_tvs_preference_root, name, cJSON_CreateNumber(value));
}
int ret = tvs_preference_save();
do_unlock();
return ret;
}
int tvs_preference_set_int_array_value(const char *name, const int *numbers, int count)
{
do_lock();
tvs_preference_init();
if (g_tvs_preference_root == NULL || name == NULL) {
do_unlock();
return -1;
}
cJSON *target = cJSON_GetObjectItem(g_tvs_preference_root, name);
if (target != NULL) {
cJSON_ReplaceItemInObject(g_tvs_preference_root, name, cJSON_CreateIntArray(numbers, count));
} else {
cJSON_AddItemToObject(g_tvs_preference_root, name, cJSON_CreateIntArray(numbers, count));
}
int ret = tvs_preference_save();
do_unlock();
return ret;
}
int tvs_preference_get_int_array_value(const char *name, int **array)
{
do_lock();
tvs_preference_init();
if (g_tvs_preference_root == NULL || array == NULL) {
do_unlock();
return 0;
}
cJSON *int_arr = cJSON_GetObjectItem(g_tvs_preference_root, name);
if (NULL != int_arr) {
int size = cJSON_GetArraySize(int_arr);
if (size > 0) {
int *data = TVS_MALLOC(sizeof(int) * size);
for (int i = 0; i < size; i++) {
cJSON *child = cJSON_GetArrayItem(int_arr, i);
data[i] = child->valueint;
}
*array = data;
}
do_unlock();
return size;
}
do_unlock();
return 0;
}
cJSON *tvs_preference_get_node(const char *name)
{
tvs_preference_init();
if (g_tvs_preference_root == NULL || name == NULL) {
return NULL;
}
return cJSON_GetObjectItem(g_tvs_preference_root, name);
}