[libvirt] [libvirt-glib 20/37] Improve gvir_config_object_new_child

Marc-André Lureau marcandre.lureau at gmail.com
Fri Nov 11 15:52:11 UTC 2011


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



-- 
Marc-André Lureau




More information about the libvir-list mailing list