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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list