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 */ 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; } -- 1.7.6.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list