[libvirt] [libvirt-glib 4/7] Handle namespaces in gvir_config_object_delete_child{ren}

Christophe Fergeau cfergeau at redhat.com
Mon Feb 6 11:56:14 UTC 2012


These functions now take an additional argument corresponding to
a namespace href. It's optional and can be NULL when namespaces
should be ignored.
The 'child_name' argument can now be NULL in order to remove all nodes
belonging to a given namespace.
---
 libvirt-gconfig/libvirt-gconfig-domain-disk.c    |    2 +-
 libvirt-gconfig/libvirt-gconfig-domain-filesys.c |    2 +-
 libvirt-gconfig/libvirt-gconfig-object-private.h |    7 ++-
 libvirt-gconfig/libvirt-gconfig-object.c         |   50 ++++++++++++++++------
 4 files changed, 43 insertions(+), 18 deletions(-)

diff --git a/libvirt-gconfig/libvirt-gconfig-domain-disk.c b/libvirt-gconfig/libvirt-gconfig-domain-disk.c
index fb4e2b4..b2861e4 100644
--- a/libvirt-gconfig/libvirt-gconfig-domain-disk.c
+++ b/libvirt-gconfig/libvirt-gconfig-domain-disk.c
@@ -301,5 +301,5 @@ gvir_config_domain_disk_set_readonly(GVirConfigDomainDisk *disk,
         GVirConfigObject *node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(disk), "readonly");
         g_object_unref(node);
     } else
-        gvir_config_object_delete_child(GVIR_CONFIG_OBJECT(disk), "readonly");
+        gvir_config_object_delete_child(GVIR_CONFIG_OBJECT(disk), "readonly", NULL);
 }
diff --git a/libvirt-gconfig/libvirt-gconfig-domain-filesys.c b/libvirt-gconfig/libvirt-gconfig-domain-filesys.c
index 3eb96f6..904a7a3 100644
--- a/libvirt-gconfig/libvirt-gconfig-domain-filesys.c
+++ b/libvirt-gconfig/libvirt-gconfig-domain-filesys.c
@@ -156,6 +156,6 @@ void gvir_config_domain_filesys_set_readonly(GVirConfigDomainFilesys *filesys,
         GVirConfigObject *node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(filesys), "readonly");
         g_object_unref(node);
     } else {
-        gvir_config_object_delete_child(GVIR_CONFIG_OBJECT(filesys), "readonly");
+        gvir_config_object_delete_child(GVIR_CONFIG_OBJECT(filesys), "readonly", NULL);
     }
 }
diff --git a/libvirt-gconfig/libvirt-gconfig-object-private.h b/libvirt-gconfig/libvirt-gconfig-object-private.h
index 781e1a3..afd28f0 100644
--- a/libvirt-gconfig/libvirt-gconfig-object-private.h
+++ b/libvirt-gconfig/libvirt-gconfig-object-private.h
@@ -71,8 +71,11 @@ void gvir_config_object_replace_child_with_attribute(GVirConfigObject *object,
                                                      const char *attr_name,
                                                      const char *attr_value);
 void gvir_config_object_delete_child(GVirConfigObject *object,
-                                     const char *child_name);
-void gvir_config_object_delete_children(GVirConfigObject *object, const char *child_name);
+                                     const char *child_name,
+                                     const char *ns_href);
+void gvir_config_object_delete_children(GVirConfigObject *object,
+                                        const char *child_name,
+                                        const char *ns_href);
 void gvir_config_object_set_child(GVirConfigObject *object,
                                   xmlNodePtr child);
 
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c
index 7e3cb88..9d99faf 100644
--- a/libvirt-gconfig/libvirt-gconfig-object.c
+++ b/libvirt-gconfig/libvirt-gconfig-object.c
@@ -465,16 +465,29 @@ gvir_config_object_replace_child_with_attribute(GVirConfigObject *object,
     g_object_unref(G_OBJECT(child));
 }
 
-static gboolean maybe_unlink_node(xmlNodePtr node, const char *name)
+struct NodeMatch {
+    const char *name;
+    const char *ns;
+};
+
+static gboolean maybe_unlink_node(xmlNodePtr node, void *opaque)
 {
-    if (g_strcmp0((char *)node->name, name) == 0) {
+    gboolean unlink = TRUE;
+    struct NodeMatch *match = (struct NodeMatch *)opaque;
+
+    if (match->ns != NULL) {
+        unlink = unlink && (g_strcmp0(match->ns, (char *)node->ns->href) == 0);
+    }
+
+    if (match->name != NULL) {
+        unlink = unlink && (g_strcmp0(match->name, (char *)node->name) == 0);
+    }
+    if (unlink) {
         xmlUnlinkNode(node);
         xmlFreeNode(node);
-
-        return TRUE;
     }
 
-    return FALSE;
+    return unlink;
 }
 
 static gboolean remove_oneshot(xmlNodePtr node, gpointer opaque)
@@ -484,13 +497,16 @@ static gboolean remove_oneshot(xmlNodePtr node, gpointer opaque)
 
 G_GNUC_INTERNAL void
 gvir_config_object_delete_child(GVirConfigObject *object,
-                                const char *child_name)
+                                const char *child_name,
+                                const char *ns_href)
 {
+    struct NodeMatch match;
+
     g_return_if_fail(GVIR_CONFIG_IS_OBJECT(object));
-    g_return_if_fail(child_name != NULL);
 
-    gvir_config_object_foreach_child(object, NULL, remove_oneshot,
-                                     (gpointer)child_name);
+    match.name = child_name;
+    match.ns = ns_href;
+    gvir_config_object_foreach_child(object, NULL, remove_oneshot, &match);
 }
 
 static gboolean remove_always(xmlNodePtr node, gpointer opaque)
@@ -501,13 +517,18 @@ static gboolean remove_always(xmlNodePtr node, gpointer opaque)
 }
 
 G_GNUC_INTERNAL void
-gvir_config_object_delete_children(GVirConfigObject *object, const char *child_name)
+gvir_config_object_delete_children(GVirConfigObject *object,
+                                   const char *child_name,
+                                   const char *ns_href)
 {
+    struct NodeMatch match;
+
     g_return_if_fail(GVIR_CONFIG_IS_OBJECT(object));
-    g_return_if_fail(child_name != NULL);
 
-    gvir_config_object_foreach_child(object, NULL, remove_always,
-                                     (gpointer)child_name);
+    match.name = child_name;
+    match.ns = ns_href;
+
+    gvir_config_object_foreach_child(object, NULL, remove_always, &match);
 }
 
 G_GNUC_INTERNAL void
@@ -814,7 +835,8 @@ gvir_config_object_attach(GVirConfigObject *parent, GVirConfigObject *child, gbo
 
     if (replace) {
         gvir_config_object_delete_children(parent,
-                                           (char *)child->priv->node->name);
+                                           (char *)child->priv->node->name,
+                                           NULL);
     }
     xmlUnlinkNode(child->priv->node);
     xmlAddChild(parent->priv->node, child->priv->node);
-- 
1.7.7.6




More information about the libvir-list mailing list