[libvirt] [libvirt-glib 04/23] Add GVirConfigObject::node property
Daniel P. Berrange
berrange at redhat.com
Tue Oct 18 11:32:33 UTC 2011
On Fri, Oct 07, 2011 at 11:40:49AM +0200, Christophe Fergeau wrote:
> This property stores the XML node corresponding to the current
> configuration object in the XML tree. When creating configuration
> objects from a XML string, the XML file will be lazily loaded, and
> this property will be set.
> ---
> libvirt-gconfig/libvirt-gconfig-object.c | 35 +++++++++++++++++++++++++++--
> 1 files changed, 32 insertions(+), 3 deletions(-)
>
> diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c
> index 52e9be0..762baf9 100644
> --- a/libvirt-gconfig/libvirt-gconfig-object.c
> +++ b/libvirt-gconfig/libvirt-gconfig-object.c
> @@ -43,7 +43,11 @@ struct _GVirConfigObjectPrivate
> gchar *doc;
> gchar *schema;
>
> + /* FIXME: docHandle is node->doc, can probably be removed to avoid the
> + * 2 getting out of sync
> + */
> xmlDocPtr docHandle;
> + xmlNodePtr node;
> };
>
> G_DEFINE_ABSTRACT_TYPE(GVirConfigObject, gvir_config_object, G_TYPE_OBJECT);
> @@ -52,6 +56,7 @@ enum {
> PROP_0,
> PROP_DOC,
> PROP_SCHEMA,
> + PROP_NODE
> };
>
>
> @@ -83,6 +88,10 @@ static void gvir_config_object_get_property(GObject *object,
> g_value_set_string(value, priv->schema);
> break;
>
> + case PROP_NODE:
> + g_value_set_pointer(value, gvir_config_object_get_xml_node(conn, NULL));
> + break;
> +
> default:
> G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
> }
> @@ -108,6 +117,16 @@ static void gvir_config_object_set_property(GObject *object,
> priv->schema = g_value_dup_string(value);
> break;
>
> + case PROP_NODE:
> + priv->node = g_value_get_pointer(value);
> + if ((priv->docHandle != NULL) && (priv->docHandle != priv->node->doc))
> + xmlFreeDoc(priv->docHandle);
> + if (priv->node)
> + priv->docHandle = priv->node->doc;
> + else
> + priv->docHandle = NULL;
> + break;
> +
> default:
> G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
> }
> @@ -164,6 +183,15 @@ static void gvir_config_object_class_init(GVirConfigObjectClass *klass)
> G_PARAM_STATIC_NICK |
> G_PARAM_STATIC_BLURB));
>
> + g_object_class_install_property(object_class,
> + PROP_NODE,
> + g_param_spec_pointer("node",
> + "XML Node",
> + "The XML node this config object corresponds to",
> + G_PARAM_READWRITE |
> + G_PARAM_CONSTRUCT_ONLY |
> + G_PARAM_STATIC_STRINGS));
> +
> g_type_class_add_private(klass, sizeof(GVirConfigObjectPrivate));
> }
>
> @@ -202,6 +230,7 @@ gvir_config_object_parse(GVirConfigObject *config,
> "%s",
> "Unable to parse configuration");
> }
> + priv->node = priv->docHandle->children;
> }
>
>
> @@ -277,6 +306,8 @@ const gchar *gvir_config_object_get_schema(GVirConfigObject *config)
> }
>
> /* NB: the xmlDocPtr must not be freed by the caller */
> +/* gupnp has wrapped xmlDoc in a gobject */
> +/* not really useful, can be obtained from xmlNode::doc */
I guess the reason for doing that would be to avoid any libxml2 data
types in the public API. Might be worth considering in the future.
> xmlDocPtr gvir_config_object_get_xml_doc(GVirConfigObject *config, GError **error)
> {
> gvir_config_object_parse(config, error);
> @@ -290,7 +321,5 @@ xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config,
> GError **error)
> {
> gvir_config_object_parse(config, error);
> - if (error)
> - return NULL;
> - return config->priv->docHandle->children;
> + return config->priv->node;
> }
ACK
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list