]> pilppa.org Git - libplp.git/blobdiff - src/DeviceConfig.cc
revert previous save_immediately flag
[libplp.git] / src / DeviceConfig.cc
index b663259088aeba93fa22ff566e074dd1746989d8..18870b7473bd1ab967dde5d1ba6d8113f7e94c91 100644 (file)
@@ -7,7 +7,6 @@
 
 #include "DeviceConfig.hh"
 
-#include <stdbool.h>
 #include <string.h>
 #include <malloc.h>
 
@@ -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 {