[libvirt] [libvirt-glib 1/2] Add more parsing helpers to GVirConfigObject

Christophe Fergeau cfergeau at redhat.com
Tue Jan 3 14:56:05 UTC 2012


Add gvir_config_object_get_node_content_genum,
gvir_config_object_get_attribute
and gvir_config_object_get_attribute_genum to complement the existing
methods. They all act on a child node of the current node. The
_get_attribute functions can also act on the root node of the
GVirConfigObject instance if it's passed NULL instead of a child name.
---
 libvirt-gconfig/libvirt-gconfig-object-private.h |   12 +++
 libvirt-gconfig/libvirt-gconfig-object.c         |   80 ++++++++++++++++++++++
 2 files changed, 92 insertions(+), 0 deletions(-)

diff --git a/libvirt-gconfig/libvirt-gconfig-object-private.h b/libvirt-gconfig/libvirt-gconfig-object-private.h
index 7c6575e..692e369 100644
--- a/libvirt-gconfig/libvirt-gconfig-object-private.h
+++ b/libvirt-gconfig/libvirt-gconfig-object-private.h
@@ -35,6 +35,18 @@ char *gvir_config_object_get_node_content(GVirConfigObject *object,
                                           const char *node_name);
 guint64 gvir_config_object_get_node_content_uint64(GVirConfigObject *object,
                                                    const char *node_name);
+gint gvir_config_object_get_node_content_genum(GVirConfigObject *object,
+                                               const char *node_name,
+                                               GType enum_type,
+                                               gint default_value);
+char *gvir_config_object_get_attribute(GVirConfigObject *object,
+                                       const char *node_name,
+                                       const char *attr_name);
+gint gvir_config_object_get_attribute_genum(GVirConfigObject *object,
+                                            const char *node_name,
+                                            const char *attr_name,
+                                            GType enum_type,
+                                            gint default_value);
 void gvir_config_object_set_node_content(GVirConfigObject *object,
                                          const char *node_name,
                                          const char *value);
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c
index 5c7639f..2b2fd55 100644
--- a/libvirt-gconfig/libvirt-gconfig-object.c
+++ b/libvirt-gconfig/libvirt-gconfig-object.c
@@ -301,6 +301,28 @@ gvir_config_object_get_node_content(GVirConfigObject *object,
     return gvir_config_xml_get_child_element_content_glib(node, node_name);
 }
 
+G_GNUC_INTERNAL char *
+gvir_config_object_get_attribute(GVirConfigObject *object,
+                                 const char *node_name,
+                                 const char *attr_name)
+{
+    xmlNodePtr node;
+
+    g_return_val_if_fail(attr_name != NULL, NULL);
+
+    node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(object));
+    if (node == NULL)
+        return NULL;
+
+    if (node_name != NULL) {
+        node = gvir_config_xml_get_element(node, node_name, NULL);
+        if (node == NULL)
+            return NULL;
+    }
+
+    return gvir_config_xml_get_attribute_content_glib(node, attr_name);
+}
+
 static xmlNodePtr
 gvir_config_object_set_child_internal(GVirConfigObject *object,
                                       xmlNodePtr child,
@@ -511,6 +533,64 @@ gvir_config_object_get_node_content_uint64(GVirConfigObject *object,
     return value;
 }
 
+G_GNUC_INTERNAL gint
+gvir_config_object_get_node_content_genum(GVirConfigObject *object,
+                                          const char *node_name,
+                                          GType enum_type,
+                                          gint default_value)
+{
+    xmlNodePtr node;
+    xmlChar *str;
+    gint value;
+
+    node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(object));
+    if (node == NULL)
+        return default_value;
+
+    str = gvir_config_xml_get_child_element_content(node, node_name);
+    if (!str)
+        return default_value;
+
+    value = gvir_config_genum_get_value(enum_type, (char *)str, default_value);
+    xmlFree(str);
+
+    return value;
+}
+
+G_GNUC_INTERNAL gint
+gvir_config_object_get_attribute_genum(GVirConfigObject *object,
+                                       const char *node_name,
+                                       const char *attr_name,
+                                       GType enum_type,
+                                       gint default_value)
+{
+    xmlNodePtr node;
+    xmlChar *attr_val;
+    gint value;
+
+    g_return_val_if_fail(attr_name != NULL, default_value);
+
+    node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(object));
+    if (node == NULL)
+        return default_value;
+
+    if (node_name != NULL) {
+        node = gvir_config_xml_get_element(node, node_name, NULL);
+        if (node == NULL)
+            return default_value;
+    }
+
+    attr_val = gvir_config_xml_get_attribute_content(node, attr_name);
+    if (attr_val == NULL)
+        return default_value;
+
+    value = gvir_config_genum_get_value(enum_type, (char *)attr_val,
+                                        default_value);
+    xmlFree(attr_val);
+
+    return value;
+}
+
 GVirConfigObject *gvir_config_object_new_from_xml(GType type,
                                                   const char *root_name,
                                                   const char *schema,
-- 
1.7.7.5




More information about the libvir-list mailing list