275 lines
6.1 KiB
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);
|
|
}
|
|
|