refactor: property_node attribute handling
The previous implementation just went along with how AVS property models and deals with attributes: attributes are just another type of node that follow the same rules as standard xml nodes/elements. This design already showed several flaws in application as these nodes always had to be referred to with an appended ‘@‘ on the attribute keys. This was mitigated with an “ext” function that hides the whole details of “find the attribute node before reading the attribute” steps. By adding another property_node implementation with mxml, the AVS style abstract layer showed incompatibilities with the “an attribute is a node” approach. mxml doesn’t treat them as a type of node and just addresses them directly using their keys. This is lot simpler and aligns with how handling attribute is done throughout the code thus far. Refactor the property_node interface and the current AVS implementation to also adapt this. Hide the detail that AVS treats attributes as nodes and also the whole “append @“ to the keys notation.
This commit is contained in:
@@ -187,26 +187,6 @@ core_property_node_result_t core_property_node_ext_str_read(
|
||||
return core_property_node_str_read(&tmp, value, len);
|
||||
}
|
||||
|
||||
core_property_node_result_t core_property_node_ext_attr_read(
|
||||
const core_property_node_t *node, const char *name, char *value, size_t len)
|
||||
{
|
||||
core_property_node_t tmp;
|
||||
core_property_node_result_t result;
|
||||
|
||||
log_assert(node);
|
||||
log_assert(name);
|
||||
log_assert(value);
|
||||
log_assert(len > 0);
|
||||
|
||||
result = core_property_node_search(node, name, &tmp);
|
||||
|
||||
if (CORE_PROPERTY_NODE_RESULT_IS_ERROR(result)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
return core_property_node_attr_read(&tmp, value, len);
|
||||
}
|
||||
|
||||
core_property_node_result_t core_property_node_ext_u8_read_or_default(
|
||||
const core_property_node_t *node,
|
||||
const char *name,
|
||||
@@ -458,27 +438,21 @@ core_property_node_result_t core_property_node_ext_bool_replace(
|
||||
core_property_node_result_t core_property_node_ext_attr_replace(
|
||||
core_property_node_t *node, const char *name, const char *val)
|
||||
{
|
||||
core_property_node_t tmp;
|
||||
core_property_node_result_t result;
|
||||
|
||||
log_assert(node);
|
||||
log_assert(name);
|
||||
log_assert(val);
|
||||
|
||||
result = core_property_node_search(node, name, &tmp);
|
||||
result = core_property_node_attr_remove(node, name);
|
||||
|
||||
if (result != CORE_PROPERTY_NODE_RESULT_NODE_NOT_FOUND) {
|
||||
if (CORE_PROPERTY_NODE_RESULT_IS_ERROR(result)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
result = core_property_node_remove(&tmp);
|
||||
|
||||
if (CORE_PROPERTY_NODE_RESULT_IS_ERROR(result)) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return core_property_node_attr_create(node, name, val, NULL);
|
||||
return core_property_node_attr_create(node, name, val);
|
||||
}
|
||||
|
||||
core_property_node_result_t core_property_node_ext_extract(
|
||||
|
||||
@@ -457,16 +457,15 @@ static core_property_node_result_t _core_property_node_trace_double_create(
|
||||
static core_property_node_result_t _core_property_node_trace_attr_create(
|
||||
const core_property_node_t *parent_node,
|
||||
const char *key,
|
||||
const char *value,
|
||||
core_property_node_t *node_out)
|
||||
const char *value)
|
||||
{
|
||||
core_property_node_result_t result;
|
||||
|
||||
log_misc(
|
||||
">>> attr_create(%p, %s, %s, %p)", parent_node, key, value, node_out);
|
||||
">>> attr_create(%p, %s, %s, %p)", parent_node, key, value);
|
||||
|
||||
result = _core_property_node_trace_target_api.v1.attr_create(
|
||||
parent_node, key, value, node_out);
|
||||
parent_node, key, value);
|
||||
|
||||
log_misc(
|
||||
"<<< attr_create(%p, %s): %s",
|
||||
@@ -747,14 +746,14 @@ static core_property_node_result_t _core_property_node_trace_double_read(
|
||||
}
|
||||
|
||||
static core_property_node_result_t _core_property_node_trace_attr_read(
|
||||
const core_property_node_t *parent_node, char *value, size_t len)
|
||||
const core_property_node_t *parent_node, const char *key, char *value, size_t len)
|
||||
{
|
||||
core_property_node_result_t result;
|
||||
|
||||
log_misc(">>> attr_read(%p, %p, %d)", parent_node, value, len);
|
||||
log_misc(">>> attr_read(%p, %s, %p, %d)", parent_node, key, value, len);
|
||||
|
||||
result = _core_property_node_trace_target_api.v1.attr_read(
|
||||
parent_node, value, len);
|
||||
parent_node, key, value, len);
|
||||
|
||||
log_misc(
|
||||
"<<< attr_read(%p, %s): %s",
|
||||
|
||||
@@ -409,8 +409,7 @@ core_property_node_result_t core_property_node_double_create(
|
||||
core_property_node_result_t core_property_node_attr_create(
|
||||
const core_property_node_t *parent_node,
|
||||
const char *key,
|
||||
const char *value,
|
||||
core_property_node_t *node_out)
|
||||
const char *value)
|
||||
{
|
||||
log_assert(_core_property_node_api_is_valid());
|
||||
log_assert(parent_node);
|
||||
@@ -418,7 +417,7 @@ core_property_node_result_t core_property_node_attr_create(
|
||||
log_assert(value);
|
||||
|
||||
return _core_property_node_api.v1.attr_create(
|
||||
parent_node, key, value, node_out);
|
||||
parent_node, key, value);
|
||||
}
|
||||
|
||||
core_property_node_result_t core_property_node_bool_create(
|
||||
@@ -566,13 +565,14 @@ core_property_node_result_t core_property_node_double_read(
|
||||
}
|
||||
|
||||
core_property_node_result_t core_property_node_attr_read(
|
||||
const core_property_node_t *parent_node, char *value, size_t len)
|
||||
const core_property_node_t *parent_node, const char *key, char *value, size_t len)
|
||||
{
|
||||
log_assert(_core_property_node_api_is_valid());
|
||||
log_assert(parent_node);
|
||||
log_assert(key);
|
||||
log_assert(value);
|
||||
|
||||
return _core_property_node_api.v1.attr_read(parent_node, value, len);
|
||||
return _core_property_node_api.v1.attr_read(parent_node, key, value, len);
|
||||
}
|
||||
|
||||
core_property_node_result_t core_property_node_bool_read(
|
||||
@@ -594,6 +594,16 @@ core_property_node_remove(const core_property_node_t *node)
|
||||
return _core_property_node_api.v1.remove(node);
|
||||
}
|
||||
|
||||
core_property_node_result_t core_property_node_attr_remove(
|
||||
const core_property_node_t *parent_node, const char *key)
|
||||
{
|
||||
log_assert(_core_property_node_api_is_valid());
|
||||
log_assert(parent_node);
|
||||
log_assert(key);
|
||||
|
||||
return _core_property_node_api.v1.attr_remove(parent_node, key);
|
||||
}
|
||||
|
||||
core_property_node_result_t core_property_node_copy(
|
||||
core_property_node_t *dst_node, const core_property_node_t *src_node)
|
||||
{
|
||||
|
||||
@@ -115,8 +115,7 @@ typedef core_property_node_result_t (*core_property_node_double_create_t)(
|
||||
typedef core_property_node_result_t (*core_property_node_attr_create_t)(
|
||||
const core_property_node_t *parent_node,
|
||||
const char *key,
|
||||
const char *value,
|
||||
core_property_node_t *node_out);
|
||||
const char *value);
|
||||
typedef core_property_node_result_t (*core_property_node_bool_create_t)(
|
||||
const core_property_node_t *parent_node,
|
||||
const char *key,
|
||||
@@ -149,11 +148,13 @@ typedef core_property_node_result_t (*core_property_node_float_read_t)(
|
||||
typedef core_property_node_result_t (*core_property_node_double_read_t)(
|
||||
const core_property_node_t *parent_node, double *value);
|
||||
typedef core_property_node_result_t (*core_property_node_attr_read_t)(
|
||||
const core_property_node_t *parent_node, char *value, size_t len);
|
||||
const core_property_node_t *parent_node, const char *key, char *value, size_t len);
|
||||
typedef core_property_node_result_t (*core_property_node_bool_read_t)(
|
||||
const core_property_node_t *parent_node, bool *value);
|
||||
typedef core_property_node_result_t (*core_property_node_remove_t)(
|
||||
const core_property_node_t *node);
|
||||
typedef core_property_node_result_t (*core_property_node_attr_remove_t)(
|
||||
const core_property_node_t *parent_node, const char *key);
|
||||
typedef core_property_node_result_t (*core_property_node_copy_t)(
|
||||
core_property_node_t *dst_node, const core_property_node_t *src_node);
|
||||
|
||||
@@ -200,6 +201,7 @@ typedef struct core_property_node_api {
|
||||
core_property_node_attr_read_t attr_read;
|
||||
core_property_node_bool_read_t bool_read;
|
||||
core_property_node_remove_t remove;
|
||||
core_property_node_attr_remove_t attr_remove;
|
||||
core_property_node_copy_t copy;
|
||||
} v1;
|
||||
} core_property_node_api_t;
|
||||
@@ -302,8 +304,7 @@ core_property_node_result_t core_property_node_double_create(
|
||||
core_property_node_result_t core_property_node_attr_create(
|
||||
const core_property_node_t *parent_node,
|
||||
const char *key,
|
||||
const char *value,
|
||||
core_property_node_t *node_out);
|
||||
const char *value);
|
||||
core_property_node_result_t core_property_node_bool_create(
|
||||
const core_property_node_t *parent_node,
|
||||
const char *key,
|
||||
@@ -336,11 +337,13 @@ core_property_node_result_t core_property_node_float_read(
|
||||
core_property_node_result_t core_property_node_double_read(
|
||||
const core_property_node_t *parent_node, double *value);
|
||||
core_property_node_result_t core_property_node_attr_read(
|
||||
const core_property_node_t *parent_node, char *value, size_t len);
|
||||
const core_property_node_t *parent_node, const char *key, char *value, size_t len);
|
||||
core_property_node_result_t core_property_node_bool_read(
|
||||
const core_property_node_t *parent_node, bool *value);
|
||||
core_property_node_result_t
|
||||
core_property_node_remove(const core_property_node_t *node);
|
||||
core_property_node_result_t core_property_node_attr_remove(
|
||||
const core_property_node_t *parent_node, const char *key);
|
||||
core_property_node_result_t core_property_node_copy(
|
||||
core_property_node_t *dst_node, const core_property_node_t *src_node);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user