[libgovirt] utils: Support G_TYPE_STRV in _set_property_value_from_type()



commit 30a8f1565a0360966bb547c8865b27376417837f
Author: Eduardo Lima (Etrunko) <etrunko redhat com>
Date:   Thu May 11 17:31:43 2017 -0300

    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 files 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);
     }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]