GVirConfigObject also contains an xmlNodePtr which is more useful
since it indicates the position of the current config object in
the source XML file. Since xmlNode has a 'doc' member, having
both an xmlNodePtr and an xmlDocPtr in GVirConfigObject is
redundant.
---
libvirt-gconfig/libvirt-gconfig-object.c | 50 +++++++++++++----------------
libvirt-gconfig/libvirt-gconfig-object.h | 1 -
libvirt-gconfig/libvirt-gconfig.sym | 1 -
3 files changed, 22 insertions(+), 30 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c
b/libvirt-gconfig/libvirt-gconfig-object.c
index 66102ec..b7829c9 100644
--- a/libvirt-gconfig/libvirt-gconfig-object.c
+++ b/libvirt-gconfig/libvirt-gconfig-object.c
@@ -43,10 +43,6 @@ 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;
};
@@ -117,15 +113,17 @@ 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;
+ case PROP_NODE: {
+ xmlNodePtr node;
+ node = g_value_get_pointer(value);
+ if ((priv->node != NULL)
+ && (priv->node->doc != NULL)
+ && (priv->node->doc != node->doc)) {
+ xmlFreeDoc(priv->node->doc);
+ }
+ priv->node = node;
break;
+ }
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
@@ -143,8 +141,12 @@ static void gvir_config_object_finalize(GObject *object)
g_free(priv->doc);
g_free(priv->schema);
- if (priv->docHandle)
- xmlFreeDoc(priv->docHandle);
+ /* FIXME: all objects describing a given XML document will share the
+ * same document so we can't destroy it here like this, we need some
+ * refcounting to know when to destroy it.
+ */
+ if (priv->node)
+ xmlFreeDoc(priv->node->doc);
G_OBJECT_CLASS(gvir_config_object_parent_class)->finalize(object);
}
@@ -212,7 +214,8 @@ gvir_config_object_parse(GVirConfigObject *config,
GError **err)
{
GVirConfigObjectPrivate *priv = config->priv;
- if (priv->docHandle)
+ xmlDocPtr doc;
+ if (priv->node)
return;
if (!priv->doc) {
@@ -223,14 +226,14 @@ gvir_config_object_parse(GVirConfigObject *config,
return;
}
- priv->docHandle = xmlParseMemory(priv->doc, strlen(priv->doc));
- if (!priv->docHandle) {
+ doc = xmlParseMemory(priv->doc, strlen(priv->doc));
+ if (!doc) {
*err = gvir_xml_error_new(GVIR_CONFIG_OBJECT_ERROR,
0,
"%s",
"Unable to parse configuration");
}
- priv->node = priv->docHandle->children;
+ priv->node = doc->children;
}
@@ -279,7 +282,7 @@ void gvir_config_object_validate(GVirConfigObject *config,
return;
}
- if (xmlRelaxNGValidateDoc(rngValid, priv->docHandle) != 0) {
+ if (xmlRelaxNGValidateDoc(rngValid, priv->node->doc) != 0) {
*err = gvir_xml_error_new(GVIR_CONFIG_OBJECT_ERROR,
0,
"%s",
@@ -324,15 +327,6 @@ const gchar *gvir_config_object_get_schema(GVirConfigObject *config)
return priv->schema;
}
-/* 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);
- return config->priv->docHandle;
-}
-
/* FIXME: will we always have one xmlNode per GConfig object? */
/* FIXME: need to return the right node from subclasses */
/* NB: the xmlNodePtr must not be freed by the caller */
diff --git a/libvirt-gconfig/libvirt-gconfig-object.h
b/libvirt-gconfig/libvirt-gconfig-object.h
index f6ac28b..40480ba 100644
--- a/libvirt-gconfig/libvirt-gconfig-object.h
+++ b/libvirt-gconfig/libvirt-gconfig-object.h
@@ -66,7 +66,6 @@ gchar *gvir_config_object_to_xml(GVirConfigObject *config);
const gchar *gvir_config_object_get_doc(GVirConfigObject *config);
const gchar *gvir_config_object_get_schema(GVirConfigObject *config);
-xmlDocPtr gvir_config_object_get_xml_doc(GVirConfigObject *config, GError **error);
xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config, GError **error);
G_END_DECLS
diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym
index 5c4492e..94e596e 100644
--- a/libvirt-gconfig/libvirt-gconfig.sym
+++ b/libvirt-gconfig/libvirt-gconfig.sym
@@ -29,7 +29,6 @@ LIBVIRT_GOBJECT_0.0.1 {
gvir_config_object_new;
gvir_config_object_get_doc;
gvir_config_object_get_schema;
- gvir_config_object_get_xml_doc;
gvir_config_object_get_xml_node;
gvir_config_object_to_xml;
gvir_config_object_validate;
--
1.7.6.4