Having gvir_config_object_add_child() and
gvir_config_object_replace_child() would be more obvious (even the
internal code should be splitted)
On Thu, Nov 10, 2011 at 9:33 PM, Christophe Fergeau <cfergeau(a)redhat.com> wrote:
Add an "overwrite" boolean argument to indicate what to do
when
the child we are about to create already exists.
---
libvirt-gconfig/libvirt-gconfig-clock.c | 3 +-
libvirt-gconfig/libvirt-gconfig-domain.c | 2 +-
libvirt-gconfig/libvirt-gconfig-object.c | 39 +++++++++++++++++++++++------
libvirt-gconfig/libvirt-gconfig-object.h | 3 +-
libvirt-gconfig/libvirt-gconfig-os.c | 11 +++++---
5 files changed, 43 insertions(+), 15 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-clock.c
b/libvirt-gconfig/libvirt-gconfig-clock.c
index 3deb725..7cf35bb 100644
--- a/libvirt-gconfig/libvirt-gconfig-clock.c
+++ b/libvirt-gconfig/libvirt-gconfig-clock.c
@@ -119,7 +119,8 @@ void gvir_config_clock_set_variable_offset(GVirConfigClock *klock,
xmlNodePtr node;
char *offset_str;
- node = gvir_config_object_new_child(GVIR_CONFIG_OBJECT(klock), "clock");
+ node = gvir_config_object_new_child(GVIR_CONFIG_OBJECT(klock),
+ "clock", TRUE);
if (node == NULL)
return;
diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c
b/libvirt-gconfig/libvirt-gconfig-domain.c
index 41390bd..88b46fb 100644
--- a/libvirt-gconfig/libvirt-gconfig-domain.c
+++ b/libvirt-gconfig/libvirt-gconfig-domain.c
@@ -256,7 +256,7 @@ void gvir_config_domain_set_features(GVirConfigDomain *domain,
GStrv it;
features_node = gvir_config_object_new_child(GVIR_CONFIG_OBJECT(domain),
- "features");
+ "features", TRUE);
for (it = features; *it != NULL; it++) {
xmlNodePtr node;
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c
b/libvirt-gconfig/libvirt-gconfig-object.c
index 598ac0c..fd7d2d8 100644
--- a/libvirt-gconfig/libvirt-gconfig-object.c
+++ b/libvirt-gconfig/libvirt-gconfig-object.c
@@ -294,34 +294,57 @@ char *gvir_config_object_get_node_content(GVirConfigObject
*object,
return gvir_config_xml_get_child_element_content_glib(node, node_name);
}
-void
-gvir_config_object_set_child(GVirConfigObject *object, xmlNodePtr child)
+static xmlNodePtr
+gvir_config_object_set_child_internal(GVirConfigObject *object,
+ xmlNodePtr child,
+ gboolean overwrite)
{
xmlNodePtr parent_node;
xmlNodePtr old_node;
parent_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(object));
- g_return_if_fail (parent_node != NULL);
+ g_return_val_if_fail (parent_node != NULL, 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, child);
- xmlFreeNode(old_node);
+ if (overwrite) {
+ old_node = xmlReplaceNode(old_node, child);
+ xmlFreeNode(old_node);
+ } else {
+ return old_node;
+ }
} else {
xmlAddChild(parent_node, child);
}
+
+ return NULL;
+}
+
+void
+gvir_config_object_set_child(GVirConfigObject *object, xmlNodePtr child)
+{
+ gvir_config_object_set_child_internal(object, child, TRUE);
}
xmlNodePtr
-gvir_config_object_new_child(GVirConfigObject *object, const char *child_name)
+gvir_config_object_new_child(GVirConfigObject *object,
+ const char *child_name,
+ gboolean overwrite)
{
xmlNodePtr new_node;
+ xmlNodePtr old_node;
new_node = xmlNewDocNode(NULL, NULL, (xmlChar *)child_name, NULL);
- gvir_config_object_set_child(object, new_node);
+ old_node = gvir_config_object_set_child_internal(object, new_node,
+ overwrite);
+ if ((old_node != NULL) && !overwrite) {
+ xmlFreeNode(new_node);
+ return old_node;
+ }
+
return new_node;
}
@@ -332,7 +355,7 @@ void gvir_config_object_set_node_content(GVirConfigObject *object,
xmlNodePtr node;
xmlChar *encoded_data;
- node = gvir_config_object_new_child(object, node_name);
+ node = gvir_config_object_new_child(object, node_name, TRUE);
g_return_if_fail(node != NULL);
encoded_data = xmlEncodeEntitiesReentrant(node->doc,
(xmlChar *)value);
diff --git a/libvirt-gconfig/libvirt-gconfig-object.h
b/libvirt-gconfig/libvirt-gconfig-object.h
index 8e67b92..096cefb 100644
--- a/libvirt-gconfig/libvirt-gconfig-object.h
+++ b/libvirt-gconfig/libvirt-gconfig-object.h
@@ -79,7 +79,8 @@ char *gvir_config_object_get_node_content(GVirConfigObject *object,
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);
+ const char *child_name,
+ gboolean overwrite);
void gvir_config_object_set_child(GVirConfigObject *object,
xmlNodePtr child);
void gvir_config_object_set_node_content(GVirConfigObject *object,
diff --git a/libvirt-gconfig/libvirt-gconfig-os.c b/libvirt-gconfig/libvirt-gconfig-os.c
index 3e23493..394bef5 100644
--- a/libvirt-gconfig/libvirt-gconfig-os.c
+++ b/libvirt-gconfig/libvirt-gconfig-os.c
@@ -85,7 +85,7 @@ void gvir_config_os_set_os_type(GVirConfigOs *os, GVirConfigOsType
type)
xmlNodePtr node;
const char *type_str;
- node = gvir_config_object_new_child(GVIR_CONFIG_OBJECT(os), "type");
+ node = gvir_config_object_new_child(GVIR_CONFIG_OBJECT(os), "type",
TRUE);
if (node == NULL)
return;
type_str = gvir_config_genum_get_nick(GVIR_TYPE_CONFIG_OS_TYPE, type);
@@ -103,7 +103,8 @@ void gvir_config_os_enable_boot_menu(GVirConfigOs *os, gboolean
enable)
{
xmlNodePtr node;
- node = gvir_config_object_new_child(GVIR_CONFIG_OBJECT(os), "bootmenu");
+ node = gvir_config_object_new_child(GVIR_CONFIG_OBJECT(os),
+ "bootmenu", TRUE);
if (node == NULL)
return;
if (enable)
@@ -116,7 +117,8 @@ void gvir_config_os_bios_enable_serial(GVirConfigOs *os, gboolean
enable)
{
xmlNodePtr node;
- node = gvir_config_object_new_child(GVIR_CONFIG_OBJECT(os), "bios");
+ node = gvir_config_object_new_child(GVIR_CONFIG_OBJECT(os),
+ "bios", TRUE);
if (node == NULL)
return;
if (enable)
@@ -131,7 +133,8 @@ void gvir_config_os_set_smbios_mode(GVirConfigOs *os,
xmlNodePtr node;
const char *mode_str;
- node = gvir_config_object_new_child(GVIR_CONFIG_OBJECT(os), "smbios");
+ node = gvir_config_object_new_child(GVIR_CONFIG_OBJECT(os),
+ "smbios", TRUE);
if (node == NULL)
return;
mode_str = gvir_config_genum_get_nick(GVIR_TYPE_CONFIG_OS_SM_BIOS_MODE,
--
1.7.7
--
libvir-list mailing list
libvir-list(a)redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list