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