This allows us to factor the code to add an XML node to a config
object.
---
libvirt-gconfig/libvirt-gconfig-object.c | 72 ++++++++++++++++++------------
libvirt-gconfig/libvirt-gconfig-object.h | 4 ++
libvirt-gconfig/libvirt-gconfig.h | 2 +-
3 files changed, 49 insertions(+), 29 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c
b/libvirt-gconfig/libvirt-gconfig-object.c
index fbdbedd..598ac0c 100644
--- a/libvirt-gconfig/libvirt-gconfig-object.c
+++ b/libvirt-gconfig/libvirt-gconfig-object.c
@@ -294,35 +294,62 @@ char *gvir_config_object_get_node_content(GVirConfigObject *object,
return gvir_config_xml_get_child_element_content_glib(node, node_name);
}
-/* FIXME: if there are multiple nodes with the same name, this function
- * won't behave as expected. Should we get rid of the duplicated node names
- * here?
- */
-void gvir_config_object_set_node_content(GVirConfigObject *object,
- const char *node_name,
- const char *value)
+void
+gvir_config_object_set_child(GVirConfigObject *object, xmlNodePtr child)
{
xmlNodePtr parent_node;
xmlNodePtr old_node;
- xmlNodePtr new_node;
- xmlChar *encoded_name;
parent_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(object));
- encoded_name = xmlEncodeEntitiesReentrant(parent_node->doc,
- (xmlChar *)value);
- new_node = xmlNewDocNode(parent_node->doc, NULL,
- (xmlChar *)node_name, encoded_name);
- xmlFree(encoded_name);
+ g_return_if_fail (parent_node != NULL);
- old_node = gvir_config_xml_get_element(parent_node, node_name, NULL);
+ old_node = gvir_config_xml_get_element(parent_node, child->name, NULL);
+ /* FIXME: should we make sure there are no multiple occurrences
+ * of this node?
+ */
if (old_node) {
- old_node = xmlReplaceNode(old_node, new_node);
+ old_node = xmlReplaceNode(old_node, child);
xmlFreeNode(old_node);
} else {
- xmlAddChild(parent_node, new_node);
+ xmlAddChild(parent_node, child);
}
}
+xmlNodePtr
+gvir_config_object_new_child(GVirConfigObject *object, const char *child_name)
+{
+ xmlNodePtr new_node;
+
+ new_node = xmlNewDocNode(NULL, NULL, (xmlChar *)child_name, NULL);
+ gvir_config_object_set_child(object, new_node);
+ return new_node;
+}
+
+void gvir_config_object_set_node_content(GVirConfigObject *object,
+ const char *node_name,
+ const char *value)
+{
+ xmlNodePtr node;
+ xmlChar *encoded_data;
+
+ node = gvir_config_object_new_child(object, node_name);
+ g_return_if_fail(node != NULL);
+ encoded_data = xmlEncodeEntitiesReentrant(node->doc,
+ (xmlChar *)value);
+ xmlNodeSetContent(node, encoded_data);
+ xmlFree(encoded_data);
+}
+
+void gvir_config_object_set_node_content_uint64(GVirConfigObject *object,
+ const char *node_name,
+ guint64 value)
+{
+ char *str;
+ str = g_strdup_printf("%"G_GUINT64_FORMAT, value);
+ gvir_config_object_set_node_content(object, node_name, str);
+ g_free(str);
+}
+
/* FIXME: how to notify of errors/node not found? */
guint64 gvir_config_object_get_node_content_uint64(GVirConfigObject *object,
const char *node_name)
@@ -345,17 +372,6 @@ guint64 gvir_config_object_get_node_content_uint64(GVirConfigObject
*object,
return value;
}
-
-void gvir_config_object_set_node_content_uint64(GVirConfigObject *object,
- const char *node_name,
- guint64 value)
-{
- char *str;
- str = g_strdup_printf("%"G_GUINT64_FORMAT, value);
- gvir_config_object_set_node_content(object, node_name, str);
- g_free(str);
-}
-
GVirConfigObject *gvir_config_object_new_from_xml(GType type,
const char *root_name,
const char *schema,
diff --git a/libvirt-gconfig/libvirt-gconfig-object.h
b/libvirt-gconfig/libvirt-gconfig-object.h
index 52e4525..8e67b92 100644
--- a/libvirt-gconfig/libvirt-gconfig-object.h
+++ b/libvirt-gconfig/libvirt-gconfig-object.h
@@ -78,6 +78,10 @@ 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);
+xmlNodePtr gvir_config_object_new_child(GVirConfigObject *object,
+ const char *child_name);
+void gvir_config_object_set_child(GVirConfigObject *object,
+ xmlNodePtr child);
void gvir_config_object_set_node_content(GVirConfigObject *object,
const char *node_name,
const char *value);
diff --git a/libvirt-gconfig/libvirt-gconfig.h b/libvirt-gconfig/libvirt-gconfig.h
index fdc78a4..4e23f0d 100644
--- a/libvirt-gconfig/libvirt-gconfig.h
+++ b/libvirt-gconfig/libvirt-gconfig.h
@@ -26,11 +26,11 @@
#include <glib-object.h>
#include <libxml/tree.h>
-#include <libvirt-gconfig/libvirt-gconfig-helpers.h>
#include <libvirt-gconfig/libvirt-gconfig-object.h>
#include <libvirt-gconfig/libvirt-gconfig-capabilities.h>
#include <libvirt-gconfig/libvirt-gconfig-domain.h>
#include <libvirt-gconfig/libvirt-gconfig-domain-snapshot.h>
+#include <libvirt-gconfig/libvirt-gconfig-helpers.h>
#include <libvirt-gconfig/libvirt-gconfig-interface.h>
#include <libvirt-gconfig/libvirt-gconfig-network.h>
#include <libvirt-gconfig/libvirt-gconfig-node-device.h>
--
1.7.7