[libvirt] [libvirt-gconfig PATCHv2 22/32] Add gvir_config_object_add_child

Christophe Fergeau cfergeau at redhat.com
Mon Nov 21 18:04:19 UTC 2011


It's similar to gvir_config_object_replace_child except that if the
current node already has a child with the correct name, it returns
the existing child instead of replacing it.

--
v2: instead of adding an argument to gvir_config_object_new_child,
split the function in 2 separate ones, gvir_config_object_add_child
and gvir_config_object_replace_child.
    use g_return_if_fail to test function args for sanity
---
 libvirt-gconfig/libvirt-gconfig-object-private.h |    2 ++
 libvirt-gconfig/libvirt-gconfig-object.c         |   20 ++++++++++++++++++++
 2 files changed, 22 insertions(+), 0 deletions(-)

diff --git a/libvirt-gconfig/libvirt-gconfig-object-private.h b/libvirt-gconfig/libvirt-gconfig-object-private.h
index a14a792..0cedaef 100644
--- a/libvirt-gconfig/libvirt-gconfig-object-private.h
+++ b/libvirt-gconfig/libvirt-gconfig-object-private.h
@@ -35,6 +35,8 @@ void gvir_config_object_set_node_content(GVirConfigObject *object,
 void gvir_config_object_set_node_content_uint64(GVirConfigObject *object,
                                                 const char *node_name,
                                                 guint64 value);
+xmlNodePtr gvir_config_object_add_child(GVirConfigObject *object,
+                                        const char *child_name);
 xmlNodePtr gvir_config_object_replace_child(GVirConfigObject *object,
                                             const char *child_name);
 void gvir_config_object_set_child(GVirConfigObject *object,
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c
index ac10e88..142d714 100644
--- a/libvirt-gconfig/libvirt-gconfig-object.c
+++ b/libvirt-gconfig/libvirt-gconfig-object.c
@@ -333,6 +333,26 @@ gvir_config_object_set_child(GVirConfigObject *object, xmlNodePtr child)
 }
 
 G_GNUC_INTERNAL xmlNodePtr
+gvir_config_object_add_child(GVirConfigObject *object,
+                             const char *child_name)
+{
+    xmlNodePtr new_node;
+    xmlNodePtr old_node;
+
+    g_return_val_if_fail(GVIR_IS_CONFIG_OBJECT(object), NULL);
+
+    new_node = xmlNewDocNode(NULL, NULL, (xmlChar *)child_name, NULL);
+    old_node = gvir_config_object_set_child_internal(object, new_node,
+                                                     FALSE);
+    if (old_node != NULL) {
+        xmlFreeNode(new_node);
+        return old_node;
+    }
+
+    return new_node;
+}
+
+G_GNUC_INTERNAL xmlNodePtr
 gvir_config_object_replace_child(GVirConfigObject *object,
                                  const char *child_name)
 {
-- 
1.7.7.3




More information about the libvir-list mailing list