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:
icex2
2024-08-15 11:34:32 +02:00
parent 8d98a38519
commit ee8f2a05fe
8 changed files with 134 additions and 106 deletions
+3 -29
View File
@@ -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(
+6 -7
View File
@@ -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",
+15 -5
View File
@@ -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)
{
+9 -6
View File
@@ -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);