On Wed, May 09, 2012 at 03:54:35AM +0300, Zeeshan Ali (Khattak) wrote: > From: "Zeeshan Ali (Khattak)" <[email protected]> > > - gvir_config_object_add_child_with_type() > - gvir_config_object_get_child() > - gvir_config_object_get_child_with_type() > --- > libvirt-gconfig/libvirt-gconfig-object-private.h | 8 ++++ > libvirt-gconfig/libvirt-gconfig-object.c | 47 > ++++++++++++++++++++-- > 2 files changed, 51 insertions(+), 4 deletions(-) > > diff --git a/libvirt-gconfig/libvirt-gconfig-object-private.h > b/libvirt-gconfig/libvirt-gconfig-object-private.h > index a6b7395..eb2cc09 100644 > --- a/libvirt-gconfig/libvirt-gconfig-object-private.h > +++ b/libvirt-gconfig/libvirt-gconfig-object-private.h > @@ -55,6 +55,9 @@ void > gvir_config_object_set_node_content_uint64(GVirConfigObject *object, > guint64 value); > GVirConfigObject *gvir_config_object_add_child(GVirConfigObject *object, > const char *child_name); > +GVirConfigObject *gvir_config_object_add_child_with_type(GVirConfigObject > *object, > + const char > *child_name, > + GType child_type);
This API is not used at all, just drop it
> void gvir_config_object_add_child_with_attribute(GVirConfigObject *object,
> const char *child_name,
> const char *attr_name,
> @@ -96,6 +99,11 @@ void gvir_config_object_foreach_child(GVirConfigObject
> *object,
> gboolean gvir_config_object_set_namespace(GVirConfigObject *object,
> const char *ns,
> const char *ns_uri);
> +GVirConfigObject *gvir_config_object_get_child(GVirConfigObject *object,
> + const gchar *child_name);
> +GVirConfigObject *gvir_config_object_get_child_with_type(GVirConfigObject
> *object,
> + const gchar
> *child_name,
> + GType child_type);
>
> G_END_DECLS
>
> diff --git a/libvirt-gconfig/libvirt-gconfig-object.c
> b/libvirt-gconfig/libvirt-gconfig-object.c
> index ee3584a..3dac59a 100644
> --- a/libvirt-gconfig/libvirt-gconfig-object.c
> +++ b/libvirt-gconfig/libvirt-gconfig-object.c
> @@ -366,8 +366,9 @@ gvir_config_object_foreach_child(GVirConfigObject *object,
> }
>
> G_GNUC_INTERNAL GVirConfigObject *
> -gvir_config_object_add_child(GVirConfigObject *object,
> - const char *child_name)
> +gvir_config_object_add_child_with_type(GVirConfigObject *object,
> + const char *child_name,
> + GType child_type)
> {
> xmlNodePtr new_node;
> xmlNodePtr old_node;
> @@ -380,18 +381,27 @@ gvir_config_object_add_child(GVirConfigObject *object,
> FALSE);
> if (old_node != NULL) {
> xmlFreeNode(new_node);
> - return GVIR_CONFIG_OBJECT(g_object_new(GVIR_CONFIG_TYPE_OBJECT,
> + return GVIR_CONFIG_OBJECT(g_object_new(child_type,
> "doc", object->priv->doc,
> "node", old_node,
> NULL));
> }
>
> - return GVIR_CONFIG_OBJECT(g_object_new(GVIR_CONFIG_TYPE_OBJECT,
> + return GVIR_CONFIG_OBJECT(g_object_new(child_type,
> "doc", object->priv->doc,
> "node", new_node,
> NULL));
> }
>
> +G_GNUC_INTERNAL GVirConfigObject *
> +gvir_config_object_add_child(GVirConfigObject *object,
> + const char *child_name)
> +{
> + return gvir_config_object_add_child_with_type(object,
> + child_name,
> + GVIR_CONFIG_TYPE_OBJECT);
> +}
> +
> G_GNUC_INTERNAL void
> gvir_config_object_add_child_with_attribute(GVirConfigObject *object,
> const char *child_name,
> @@ -865,3 +875,32 @@ gvir_config_object_set_namespace(GVirConfigObject
> *object, const char *ns,
>
> return TRUE;
> }
> +
> +G_GNUC_INTERNAL GVirConfigObject *
> +gvir_config_object_get_child_with_type(GVirConfigObject *object,
> + const gchar *child_name,
> + GType child_type)
> +{
> + xmlNodePtr node;
> +
> + g_return_val_if_fail(GVIR_CONFIG_IS_OBJECT(object), NULL);
> + g_return_val_if_fail(child_name != NULL, NULL);
> +
> + node = gvir_config_xml_get_element(object->priv->node, child_name, NULL);
> + g_return_val_if_fail(node != NULL, NULL);
Do we want to be extra paranoid and check that node->name is child_name?
> +
> + return gvir_config_object_new_from_tree(child_type,
> + object->priv->doc,
> + object->priv->schema,
> + node);
So I think this API is a bit too limited, and a bit dangerous, but I'm not
sure what the best forward is. What I'm worried about is that it's
basically casting a random xml node to an arbitrary type, and we don't
really have a way to let the class it's being cast to make some sanity
checks first. Maybe we could have a new_from_tree function pointer on
GVirObjectClass and use that to create new instances of GVirObject. Child
classes would be able to override it. Maybe we could use a GInitable. Maybe
we should do something totally different, I don't really know, just random
thinking ;)
ACK with the add_child_with_type changes removed.
Christophe
> +}
> +
> +G_GNUC_INTERNAL GVirConfigObject *
> +gvir_config_object_get_child(GVirConfigObject *object,
> + const gchar *child_name)
> +{
> + return gvir_config_object_get_child_with_type(object,
> + child_name,
> + GVIR_CONFIG_TYPE_OBJECT);
> +}
> +
> --
> 1.7.7.6
>
> --
> libvir-list mailing list
> [email protected]
> https://www.redhat.com/mailman/listinfo/libvir-list
pgpmOTBrFIgXq.pgp
Description: PGP signature
-- libvir-list mailing list [email protected] https://www.redhat.com/mailman/listinfo/libvir-list
