On Wed, May 09, 2012 at 03:54:35AM +0300, Zeeshan Ali (Khattak) wrote: > From: "Zeeshan Ali (Khattak)" <zeeshanak@xxxxxxxxx> > > - 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 > libvir-list@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/libvir-list
Attachment:
pgpXWlZqk_AFM.pgp
Description: PGP signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list