summaryrefslogtreecommitdiffstats
path: root/lasso
diff options
context:
space:
mode:
authorBenjamin Dauvergne <bdauvergne@entrouvert.com>2008-11-03 15:01:33 +0000
committerBenjamin Dauvergne <bdauvergne@entrouvert.com>2008-11-03 15:01:33 +0000
commit12afeac7164b9af7273d5e26d749b2084bc41e91 (patch)
treeeecf653e82c099479b476778263085a6dbb86268 /lasso
parenta8adf797fefd1440d2c421a90a4c1fee46afc317 (diff)
downloadlasso-12afeac7164b9af7273d5e26d749b2084bc41e91.tar.gz
lasso-12afeac7164b9af7273d5e26d749b2084bc41e91.tar.xz
lasso-12afeac7164b9af7273d5e26d749b2084bc41e91.zip
Restore ABI compatibility wrt original_xmlNode
* lasso/xml/xml.c: - use set/get_qdata to store the original xmlnode, modify init_from_xml and dispose function to cope with this new storage place. * lasso/xml/xml.h: - remove field original_xmlNode from structure LassoNode to keep ABI compatibility with previous versions. - declare new API lasso_node_get_original_xmlnode
Diffstat (limited to 'lasso')
-rw-r--r--lasso/xml/xml.c42
-rw-r--r--lasso/xml/xml.h2
2 files changed, 34 insertions, 10 deletions
diff --git a/lasso/xml/xml.c b/lasso/xml/xml.c
index a846623f..f69573a4 100644
--- a/lasso/xml/xml.c
+++ b/lasso/xml/xml.c
@@ -958,7 +958,7 @@ lasso_node_get_xmlNode(LassoNode *node, gboolean lasso_dump)
*
* @node: a #LassoNode
*
- * Traverse the #LassoNode tree starting at Node and remove original_xmlNode if found.
+ * Traverse the #LassoNode tree starting at Node and remove keeped xmlNode if one is found.
*/
void
lasso_node_cleanup_original_xmlnodes(LassoNode *node)
@@ -966,13 +966,42 @@ lasso_node_cleanup_original_xmlnodes(LassoNode *node)
lasso_node_traversal(node, lasso_node_remove_original_xmlnode);
}
+static GQuark original_xmlnode_quark;
+
+/**
+ * lasso_node_get_original_xmlnode:
+ * @node: a #LassoNode
+ *
+ * Retrieve the original xmlNode eventually associated to this #LassoNode.
+ *
+ * Return value: an #xmlNodePtr or NULL.
+ */
+xmlNodePtr
+lasso_node_get_original_xmlnode(LassoNode *node)
+{
+ return g_object_get_qdata(G_OBJECT(node), original_xmlnode_quark);
+}
+
/*****************************************************************************/
/* implementation methods */
/*****************************************************************************/
static void
+lasso_node_set_original_xmlnode(LassoNode *node, xmlNodePtr xmlNode)
+{
+ g_object_set_qdata_full(G_OBJECT(node), original_xmlnode_quark, xmlCopyNode(xmlNode, 1), (GDestroyNotify)xmlFreeNode);
+}
+
+static void
lasso_node_remove_original_xmlnode(LassoNode *node) {
- lasso_release_gobject(node->original_xmlNode);
+ LassoNodeClass *class;
+ class = LASSO_NODE_GET_CLASS(node);
+
+ // We optimize by reseting only object of classes that advertise that
+ // they could have an xmlNode associated to their instances.
+ if (class->node_data->keep_xmlnode) {
+ lasso_node_set_original_xmlnode(node, NULL);
+ }
}
static void
@@ -1042,7 +1071,7 @@ lasso_node_impl_init_from_xml(LassoNode *node, xmlNode *xmlnode)
return 0;
if (class->node_data->keep_xmlnode) {
- lasso_assign_node(node->original_xmlNode, xmlnode);
+ lasso_node_set_original_xmlnode(node, xmlnode);
}
while (class && LASSO_IS_NODE_CLASS(class) && class->node_data) {
@@ -1351,12 +1380,6 @@ lasso_node_dispose(GObject *object)
class = LASSO_NODE_GET_CLASS(object);
- if (class && class->node_data && class->node_data->keep_xmlnode) {
- LassoNode *node = LASSO_NODE(object);
-
- lasso_release_node(node->original_xmlNode);
- }
-
while (class && LASSO_IS_NODE_CLASS(class) && class->node_data) {
for (snippet = class->node_data->snippets; snippet && snippet->name; snippet++) {
void **value = G_STRUCT_MEMBER_P(object, snippet->offset);
@@ -1460,6 +1483,7 @@ class_init(LassoNodeClass *class)
gobject_class->dispose = lasso_node_dispose;
gobject_class->finalize = lasso_node_finalize;
+ original_xmlnode_quark = g_quark_from_static_string("lasso_original_xmlnode");
class->node_data = NULL;
}
diff --git a/lasso/xml/xml.h b/lasso/xml/xml.h
index 73576897..50a13f13 100644
--- a/lasso/xml/xml.h
+++ b/lasso/xml/xml.h
@@ -108,7 +108,6 @@ typedef struct _LassoNodeClassData LassoNodeClassData;
**/
struct _LassoNode {
GObject parent;
- xmlNodePtr original_xmlNode;
};
struct _LassoNodeClass {
@@ -148,6 +147,7 @@ LASSO_EXPORT char* lasso_node_export_to_ecp_soap_response(LassoNode *node,
const char *assertionConsumerURL);
LASSO_EXPORT xmlNode* lasso_node_get_xmlNode(LassoNode *node, gboolean lasso_dump);
+LASSO_EXPORT xmlNode* lasso_node_get_original_xmlnode(LassoNode *node);
LASSO_EXPORT LassoMessageFormat lasso_node_init_from_message(LassoNode *node, const char *message);
LASSO_EXPORT gboolean lasso_node_init_from_query(LassoNode *node, const char *query);