#include "ConfigManager.h" #include #include #include #include #include #include "file.h" typedef struct ConfigManager { cJSON *config; pthread_mutex_t config_file_mutex; char *config_file_name; } ConfigManager; ConfigManager *cm_new_config() { ConfigManager *newcm = malloc(sizeof(ConfigManager)); newcm->config_file_name = nullptr; newcm->config = nullptr; return newcm; } ConfigManager *cm_new_config_from_file(const char *filename) { ConfigManager *newcm = malloc(sizeof(ConfigManager)); newcm->config_file_name = strdup(filename); pthread_mutex_lock(&(newcm->config_file_mutex)); char *config_file_content = read_file(newcm->config_file_name); newcm->config = cJSON_Parse(config_file_content); pthread_mutex_unlock(&(newcm->config_file_mutex)); return newcm; } ConfigManager *cm_new_config_from_object(cJSON *config) { ConfigManager *newcm = malloc(sizeof(ConfigManager)); newcm->config = config; newcm->config_file_name = nullptr; return newcm; } void cm_set_config_from_file(ConfigManager *cm, const char *filename) { cm->config_file_name = strdup(filename); pthread_mutex_lock(&(cm->config_file_mutex)); char *config_file_content = read_file(cm->config_file_name); cm->config = cJSON_Parse(config_file_content); pthread_mutex_unlock(&(cm->config_file_mutex)); } void cm_set_config_from_object(ConfigManager *cm, cJSON *config) { cm->config = config; } void cm_delete_config(ConfigManager *cm) { if (!cm) { return; } if (cm->config) { cJSON_Delete(cm->config); } if (cm->config_file_name) { free(cm->config_file_name); } free(cm); } void cm_print_config(const ConfigManager *cm) { printf("Config: %s\n", cJSON_Print(cm->config)); } char *cm_get_config_filename(ConfigManager *cm) { return strdup(cm->config_file_name); } cJSON *cm_get_config(ConfigManager *cm) { return cJSON_Duplicate(cm->config, (cJSON_bool) true); } char *cm_get_parameter_as_string(ConfigManager *cm, const char *param_name) { cJSON *param = cJSON_GetObjectItem(cm->config, param_name); if (!param) return nullptr; char *param_value = strdup(param->valuestring); return param_value; } int cm_get_parameter_as_int(ConfigManager *cm, const char *param_name) { cJSON *param = cJSON_GetObjectItem(cm->config, param_name); return param->valueint; } double cm_get_parameter_as_double(ConfigManager *cm, const char *param_name) { cJSON *param = cJSON_GetObjectItem(cm->config, param_name); return param->valuedouble; } float cm_get_parameter_as_float(ConfigManager *cm, const char *param_name) { cJSON *param = cJSON_GetObjectItem(cm->config, param_name); return param->valuedouble; } bool cm_get_parameter_as_bool(ConfigManager *cm, const char *param_name) { cJSON *param = cJSON_GetObjectItem(cm->config, param_name); if (!param) return false; return param->valueint; } void cm_set_string_parameter(ConfigManager *cm, const char *name, const char *value) { cJSON *param = cJSON_GetObjectItem(cm->config, name); if (!param) { cJSON_AddStringToObject(cm->config, name, value); return; } cJSON_SetValuestring(param, value); } void cm_set_int_parameter(ConfigManager *cm, const char *name, const int value) { cJSON *param = cJSON_GetObjectItem(cm->config, name); if (!param) { cJSON_AddNumberToObject(cm->config, name, value); return; } cJSON_SetIntValue(param, value); } void cm_set_double_parameter(ConfigManager *cm, const char *name, const double value) { cJSON *param = cJSON_GetObjectItem(cm->config, name); if (!param) { cJSON_AddNumberToObject(cm->config, name, value); return; } cJSON_SetNumberValue(param, value); } void cm_set_float_parameter(ConfigManager *cm, const char *name, const float value) { cJSON *param = cJSON_GetObjectItem(cm->config, name); if (!param) { cJSON_AddNumberToObject(cm->config, name, value); return; } cJSON_SetNumberValue(param, value); } void cm_set_bool_parameter(ConfigManager *cm, const char *name, const bool value) { cJSON *param = cJSON_GetObjectItem(cm->config, name); if (!param) { cJSON_AddBoolToObject(cm->config, name, value); return; } cJSON_SetBoolValue(param, value); } void cm_set_null_parameter(ConfigManager *cm, const char *name) { cJSON *param = cJSON_GetObjectItem(cm->config, name); if (!param) { cJSON_AddNullToObject(cm->config, name); return; } cJSON_ReplaceItemInObject(cm->config, name, cJSON_CreateNull()); } void cm_save_config(ConfigManager *cm) { pthread_mutex_lock(&(cm->config_file_mutex)); FILE *configfile = fopen(cm->config_file_name, "w+"); char *configvalue = cJSON_Print(cm->config); fprintf(configfile, "%s", configvalue); fclose(configfile); free(configvalue); pthread_mutex_unlock(&(cm->config_file_mutex)); } void cm_save_config_to_file(ConfigManager *cm, const char *filename) { pthread_mutex_lock(&(cm->config_file_mutex)); FILE *configfile = fopen(filename, "w+"); char *configvalue = cJSON_Print(cm->config); fprintf(configfile, "%s", configvalue); fclose(configfile); free(configvalue); pthread_mutex_unlock(&(cm->config_file_mutex)); }