You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
3.8 KiB
111 lines
3.8 KiB
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
|
From: "Eduardo Lima (Etrunko)" <etrunko@redhat.com> |
|
Date: Thu, 11 May 2017 17:31:43 -0300 |
|
Subject: [PATCH] utils: Support G_TYPE_STRV in _set_property_value_from_type() |
|
|
|
Because user can require either the attribute or the node content, it |
|
was necessary to change the function signature to receive both |
|
parameters. |
|
|
|
Signed-off-by: Eduardo Lima (Etrunko) <etrunko@redhat.com> |
|
--- |
|
govirt/ovirt-utils.c | 63 ++++++++++++++++++++++++++++++++++++++------ |
|
1 file changed, 55 insertions(+), 8 deletions(-) |
|
|
|
diff --git a/govirt/ovirt-utils.c b/govirt/ovirt-utils.c |
|
index fafb9ec..a200e48 100644 |
|
--- a/govirt/ovirt-utils.c |
|
+++ b/govirt/ovirt-utils.c |
|
@@ -94,20 +94,73 @@ ovirt_rest_xml_node_get_attr_from_path(RestXmlNode *node, const char *path, cons |
|
return rest_xml_node_get_attr(node, attr); |
|
} |
|
|
|
+static GStrv |
|
+ovirt_rest_xml_node_get_str_array_from_path(RestXmlNode *node, const char *path, const char *attr) |
|
+{ |
|
+ GArray *array; |
|
+ GHashTableIter iter; |
|
+ gpointer sub_node; |
|
+ |
|
+ node = ovirt_rest_xml_node_find(node, path); |
|
+ if (node == NULL) |
|
+ return NULL; |
|
+ |
|
+ array = g_array_new(TRUE, FALSE, sizeof(gchar *)); |
|
+ |
|
+ g_hash_table_iter_init(&iter, node->children); |
|
+ while (g_hash_table_iter_next(&iter, NULL, &sub_node)) { |
|
+ const char *value; |
|
+ char *array_value; |
|
+ |
|
+ node = (RestXmlNode *) sub_node; |
|
+ |
|
+ if (attr != NULL) |
|
+ value = rest_xml_node_get_attr(node, attr); |
|
+ else |
|
+ value = node->content; |
|
+ |
|
+ if (value == NULL) { |
|
+ g_warning("node %s%s is NULL", attr ? "attribute:" : "content", attr ? attr : "" ); |
|
+ continue; |
|
+ } |
|
+ |
|
+ array_value = g_strdup(value); |
|
+ g_array_append_val(array, array_value); |
|
+ } |
|
+ |
|
+ return (GStrv) g_array_free(array, FALSE); |
|
+} |
|
+ |
|
static gboolean |
|
_set_property_value_from_type(GValue *value, |
|
GType type, |
|
- const char *value_str, |
|
+ const char *path, |
|
+ const char *attr, |
|
RestXmlNode *node) |
|
{ |
|
gboolean ret = TRUE; |
|
+ const char *value_str; |
|
|
|
if (g_type_is_a(type, OVIRT_TYPE_RESOURCE)) { |
|
GObject *resource_value = g_initable_new(type, NULL, NULL, "xml-node", node, NULL); |
|
g_value_set_object(value, resource_value); |
|
goto end; |
|
+ } else if (g_type_is_a(type, G_TYPE_STRV)) { |
|
+ GStrv strv_value = ovirt_rest_xml_node_get_str_array_from_path(node, path, attr); |
|
+ if (strv_value == NULL) { |
|
+ ret = FALSE; |
|
+ goto end; |
|
+ } |
|
+ |
|
+ g_value_take_boxed(value, strv_value); |
|
+ goto end; |
|
} |
|
|
|
+ if (attr != NULL) |
|
+ value_str = ovirt_rest_xml_node_get_attr_from_path(node, path, attr); |
|
+ else |
|
+ value_str = ovirt_rest_xml_node_get_content_from_path(node, path); |
|
+ |
|
/* All other types require valid value_str */ |
|
if (value_str == NULL) |
|
return FALSE; |
|
@@ -152,16 +205,10 @@ ovirt_rest_xml_node_parse(RestXmlNode *node, |
|
g_return_val_if_fail(elements != NULL, FALSE); |
|
|
|
for (;elements->xml_path != NULL; elements++) { |
|
- const char *value_str; |
|
GValue value = { 0, }; |
|
|
|
- if (elements->xml_attr != NULL) |
|
- value_str = ovirt_rest_xml_node_get_attr_from_path(node, elements->xml_path, elements->xml_attr); |
|
- else |
|
- value_str = ovirt_rest_xml_node_get_content_from_path(node, elements->xml_path); |
|
- |
|
g_value_init(&value, elements->type); |
|
- if (_set_property_value_from_type(&value, elements->type, value_str, node)) |
|
+ if (_set_property_value_from_type(&value, elements->type, elements->xml_path, elements->xml_attr, node)) |
|
g_object_set_property(object, elements->prop_name, &value); |
|
g_value_unset(&value); |
|
}
|
|
|