diff options
author | Benjamin Dauvergne <bdauvergne@entrouvert.com> | 2008-11-03 15:01:33 +0000 |
---|---|---|
committer | Benjamin Dauvergne <bdauvergne@entrouvert.com> | 2008-11-03 15:01:33 +0000 |
commit | 12afeac7164b9af7273d5e26d749b2084bc41e91 (patch) | |
tree | eecf653e82c099479b476778263085a6dbb86268 /lasso | |
parent | a8adf797fefd1440d2c421a90a4c1fee46afc317 (diff) | |
download | lasso-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.c | 42 | ||||
-rw-r--r-- | lasso/xml/xml.h | 2 |
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); |