X-Git-Url: http://pilppa.org/gitweb/?p=libplp.git;a=blobdiff_plain;f=src%2FDeviceConfig.cc;h=18870b7473bd1ab967dde5d1ba6d8113f7e94c91;hp=b663259088aeba93fa22ff566e074dd1746989d8;hb=591e8477b0cd8a038100ac67bed042404f544fde;hpb=23a30eb765fc6aaf347da839567140ae41e8cc6b diff --git a/src/DeviceConfig.cc b/src/DeviceConfig.cc index b663259..18870b7 100644 --- a/src/DeviceConfig.cc +++ b/src/DeviceConfig.cc @@ -7,7 +7,6 @@ #include "DeviceConfig.hh" -#include #include #include @@ -21,14 +20,153 @@ using namespace plp; string DeviceConfig::store_base_dir = DEFAULT_STORAGE_BASE_DIR; -ConfigHandle::ConfigHandle(uci_context *ctx_param, uci_package *pkg_param) { - _ctx = ctx_param; - _pkg = pkg_param; +ConfigHandle::ConfigHandle(uci_context *ctx_param, + uci_package *pkg_param, + const char *short_fname_param, + const char *full_fname_param) { + _ctx = ctx_param; + _pkg = pkg_param; + short_fname = strdup(short_fname_param); + full_fname = strdup(full_fname_param); } ConfigHandle::~ConfigHandle() { uci_unload(_ctx, _pkg); uci_free_context(_ctx); + free(short_fname); + free(full_fname); +} + +static int uci_create_named_section(ConfigHandle *cfg_handle, + const char *section_type, + const char *section_name, + bool save_immediately) +{ + struct uci_ptr ptr; + int ret_val; + char *cmd_dta; + int len; + + ret_val = -1; + if ((cfg_handle != NULL) && + (cfg_handle->_ctx != NULL) && + (cfg_handle->short_fname != NULL) && + (cfg_handle->full_fname != NULL) && + (section_type != NULL) && + (section_name != NULL)) { + len = strlen(cfg_handle->short_fname); + len = len + 1; + len = len + strlen(section_type); + len = len + 1; + len = len + strlen(section_name); + len = len + 1; + cmd_dta = (char *)malloc(len); + if (cmd_dta != NULL) { + snprintf(cmd_dta, + len, + "%s.%s=%s", + cfg_handle->short_fname, + section_name, + section_type); + if (uci_lookup_ptr(cfg_handle->_ctx, &ptr, cmd_dta, true) == UCI_OK) { + ret_val = uci_set(cfg_handle->_ctx, &ptr); + if (ret_val == UCI_OK) { + if (save_immediately) { + ret_val = uci_save(cfg_handle->_ctx, ptr.p); + } + } + } + free(cmd_dta); + } + } + return ret_val; +} + +static bool set_config_value_to_section(ConfigHandle *cfg_handle, + const char *section_type, + const char *section_name, + const char *key, + const char *value) { + struct uci_section *sct; + struct uci_section *tmp_sct; + int err_flg; + struct uci_element *elem; + struct uci_ptr ptr; + bool ret_val; + + ret_val = false; + if ((cfg_handle != NULL) && + (cfg_handle->_ctx != NULL) && + (cfg_handle->_pkg != NULL) && + (section_type != NULL) && + (section_name != NULL) && + (key != NULL) && + (value != NULL)) { + sct = NULL; + uci_foreach_element(&cfg_handle->_pkg->sections, elem) { + tmp_sct = uci_to_section(elem); + if (strcmp(tmp_sct->type, section_type) == 0) { + sct = tmp_sct; + break; + } + } + if (sct == NULL) { + log_debug("Creating new section %s to configuration file: %s\n", section_name, cfg_handle->full_fname); + //err_flg = uci_add_named_section(ctx, pkg, section_type, section_name, &sct); + //err_flg = uci_add_section(ctx, pkg, section_name, &sct); + err_flg = uci_create_named_section(cfg_handle, + section_type, + section_name, + false); + if (err_flg == UCI_OK) { + uci_foreach_element(&cfg_handle->_pkg->sections, elem) { + tmp_sct = uci_to_section(elem); + if (strcmp(tmp_sct->type, section_type) == 0) { + sct = tmp_sct; + break; + } + } + } + } + if (err_flg == UCI_OK) { + memset(&ptr, 0, sizeof(ptr)); + ptr.package = cfg_handle->_pkg->e.name; + ptr.section = sct->e.name; + ptr.option = key; + err_flg = uci_lookup_ptr(cfg_handle->_ctx, &ptr, NULL, false); + if (err_flg == UCI_OK) { + ptr.value = value; + err_flg = uci_set(cfg_handle->_ctx, &ptr); + if (err_flg == UCI_OK) { + err_flg = uci_save(cfg_handle->_ctx, cfg_handle->_pkg); + if (err_flg == UCI_OK) { + ret_val = true; + log_debug("Set value to section %s in configuration file: %s\n", section_name, cfg_handle->full_fname); + } + else { + log_error("Failed to set value to configuration file: %s\n. Could not save the file\n", cfg_handle->full_fname); + } + } + else { + log_error("Failed to set value to configuration file: %s\n. Could not set new value\n", cfg_handle->full_fname); + } + } + else { + log_error("Failed to set value to configuration file: %s\n. Could not look-up pointer for package %s section %s.\n", + cfg_handle->full_fname, + cfg_handle->_pkg->e.name, + sct->e.name); + } + uci_free_context(cfg_handle->_ctx); + } + else { + log_error("Failed to set value to configuration file: %s. Could not create section %s.\n", cfg_handle->full_fname, section_name); + } + } + else { + log_error("Failed to set value to configuration file, invalid parameters\n"); + } + return ret_val; } DeviceConfig::DeviceConfig(string device_id_param) { @@ -92,7 +230,9 @@ string DeviceConfig::get_config_value(string key) { string ret_val; if (uci_handle != NULL) { - section = uci_lookup_section(uci_handle->_ctx, uci_handle->_pkg, DEVICE_CONFIG__SECTION_NAME); + section = uci_lookup_section(uci_handle->_ctx, + uci_handle->_pkg, + DEVICE_CONFIG__SECTION_NAME); if (section != NULL) { option = uci_lookup_option(uci_handle->_ctx, section, key.c_str()); if (option != NULL) { @@ -115,20 +255,17 @@ string DeviceConfig::get_config_value(string key) { } void DeviceConfig::set_config_value(string key, - string value, - bool save_immediately) { + string value) { string cfg_dir; string cfg_fl; cfg_dir = get_dir_name(device_id); cfg_fl = DEVICE_CONFIG__FILE_NAME; - set_config_value_to_section(cfg_dir.c_str(), - cfg_fl.c_str(), + set_config_value_to_section(uci_handle, DEVICE_CONFIG__SECTION_TYPE, DEVICE_CONFIG__SECTION_NAME, key.c_str(), - value.c_str(), - save_immediately); + value.c_str()); } EnumSummaryCalculationType DeviceConfig::get_summary_calculation_type() { @@ -166,17 +303,29 @@ ConfigHandle *DeviceConfig::load_device_config(string device_id_param) { err_flg = uci_load(ctx, cfg_fl.c_str(), &pkg); if (err_flg == UCI_OK) { //log_debug("Loaded device configuration: %s.\n", cfg_fl.c_str()); - ret_val = new ConfigHandle(ctx, pkg); + int b_count; + char *fname; + + b_count = strlen(cfg_dir.c_str()) + strlen(cfg_fl.c_str()) + 10; + fname = (char *)calloc(1, b_count); + if (fname != NULL) { + strncpy(fname, cfg_dir.c_str(), b_count); + strncat(fname, "/", 1); + strncat(fname, cfg_fl.c_str(), strlen(cfg_fl.c_str()) + 1); + + ret_val = new ConfigHandle(ctx, pkg, cfg_fl.c_str(), fname); + free(fname); + } } else { log_debug("Failed to load device configuration: %s, err code: %d.\n", cfg_fl.c_str(), UCI_OK); - set_config_value(DEVICE_CONFIG_VALUE_KEY__TYPE, "", true); + set_config_value(DEVICE_CONFIG_VALUE_KEY__TYPE, ""); uci_free_context(ctx); } } else { log_error("Failed to load device device configuration, memory allocation error.\n"); - set_config_value(DEVICE_CONFIG_VALUE_KEY__TYPE, "", true); + set_config_value(DEVICE_CONFIG_VALUE_KEY__TYPE, ""); } } else {