diff options
Diffstat (limited to 'common/ini/ini_configobj.c')
-rw-r--r-- | common/ini/ini_configobj.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/common/ini/ini_configobj.c b/common/ini/ini_configobj.c index 4da9a7c..44b8d32 100644 --- a/common/ini/ini_configobj.c +++ b/common/ini/ini_configobj.c @@ -113,3 +113,133 @@ int ini_config_create(struct ini_cfgobj **ini_config) TRACE_FLOW_EXIT(); return error; } + +/* Callback to set the boundary */ +int ini_boundary_cb(const char *property, + int property_len, + int type, + void *data, + int length, + void *custom_data, + int *dummy) +{ + int error = EOK; + struct value_obj *vo = NULL; + uint32_t boundary; + + TRACE_FLOW_ENTRY(); + + boundary = *((uint32_t *)(custom_data)); + /* Banary items are the values */ + if(type == COL_TYPE_BINARY) { + vo = *((struct value_obj **)(data)); + error = value_set_boundary(vo, boundary); + } + + TRACE_FLOW_EXIT(); + return error; +} + +/* Set the folding boundary for multiline values. + * Use before serializing and saving to a file if the + * default boundary of 80 characters does not work for you. + */ +int ini_config_set_wrap(struct ini_cfgobj *ini_config, + uint32_t boundary) +{ + int error = EOK; + + TRACE_FLOW_ENTRY(); + + if (!ini_config) { + TRACE_ERROR_NUMBER("Invalid argument", EINVAL); + return EINVAL; + } + + ini_config->boundary = boundary; + error = col_traverse_collection(ini_config->cfg, + COL_TRAVERSE_DEFAULT, + ini_boundary_cb, + (void *)(&(ini_config->boundary))); + if (error) { + TRACE_ERROR_NUMBER("Failed to set wrapping boundary", error); + return error; + } + + + TRACE_FLOW_EXIT(); + return error; +} + +/* Configuration copy callback */ +static int ini_copy_cb(struct collection_item *item, + void *ext_data, + int *skip) +{ + int error = EOK; + struct value_obj *vo = NULL; + struct value_obj *new_vo = NULL; + + TRACE_FLOW_ENTRY(); + + ext_data = NULL; + *skip = 0; + + /* Banary items are the values */ + if(type == COL_TYPE_BINARY) { + vo = *((struct value_obj **)(col_get_item_data(item))); + error = value_copy(vo, &new_vo); + if (error) { + TRACE_ERROR_NUMBER("Failed to copy value", error); + return error; + } + } + + TRACE_FLOW_EXIT(); + return error; +} + +/* Copy configuration */ +int ini_config_copy(struct ini_cfgobj *ini_config, + struct ini_cfgobj **ini_new) +{ + int error = EOK; + struct ini_cfgobj *new_co; + + TRACE_FLOW_ENTRY(); + + if ((!ini_config) || + (!ini_new)) { + TRACE_ERROR_NUMBER("Invalid argument", EINVAL); + return EINVAL; + } + + /* Create a new configuration object */ + errno = 0; + new_co = malloc(sizeof(struct ini_cfgobj)); + if (!new_co) { + error = errno; + TRACE_ERROR_NUMBER("Failed to allocate memory", ENOMEM); + return ENOMEM; + } + + new_co->cfg = NULL; + new_co->boundary = ini_config->boundary; + + error = col_copy_collection_with_cb(&(new_cfg->cfg), + ini_config->cfg, + INI_CONFIG_NAME, + COL_COPY_NORMAL, + ini_copy_cb, + NULL); + if (error) { + TRACE_ERROR_NUMBER("Failed to copy collection", error); + ini_config_destroy(new_co); + return error; + } + + *ini_new = new_co; + + TRACE_FLOW_EXIT(); + return error; +} |