summaryrefslogtreecommitdiff
path: root/unoxml
diff options
context:
space:
mode:
authorMichael Stahl <mst@openoffice.org>2011-01-19 20:27:28 +0100
committerMichael Stahl <mst@openoffice.org>2011-01-19 20:27:28 +0100
commit75b70f1477292cf3cff3905fbcf3a3c387c17c7e (patch)
tree693db77df90750e12a652991b7056dcbb11a9796 /unoxml
parent34da472b449abca15c64f3d9254ec93fd0622898 (diff)
xmlfix3: unoxml: XPath cleanup
Diffstat (limited to 'unoxml')
-rw-r--r--unoxml/source/xpath/nodelist.hxx1
-rw-r--r--unoxml/source/xpath/xpathapi.cxx18
-rw-r--r--unoxml/source/xpath/xpathobject.cxx6
-rw-r--r--unoxml/source/xpath/xpathobject.hxx2
4 files changed, 13 insertions, 14 deletions
diff --git a/unoxml/source/xpath/nodelist.hxx b/unoxml/source/xpath/nodelist.hxx
index e191fc2a9857..fd6b428af27e 100644
--- a/unoxml/source/xpath/nodelist.hxx
+++ b/unoxml/source/xpath/nodelist.hxx
@@ -62,6 +62,7 @@ namespace XPath
/// #i115995# keep document alive
::rtl::Reference< DOM::CDocument > const m_pDocument;
::osl::Mutex & m_rMutex;
+ /// retain the result set in case the CXPathObject is released
boost::shared_ptr<xmlXPathObject> m_pXPathObj;
xmlNodeSetPtr m_pNodeSet;
diff --git a/unoxml/source/xpath/xpathapi.cxx b/unoxml/source/xpath/xpathapi.cxx
index d7e1077b5e84..d2dc86570ab9 100644
--- a/unoxml/source/xpath/xpathapi.cxx
+++ b/unoxml/source/xpath/xpathapi.cxx
@@ -353,9 +353,6 @@ namespace XPath
extensions = m_extensions;
}
- xmlXPathContextPtr xpathCtx;
- xmlXPathObjectPtr xpathObj;
-
// get the node and document
::rtl::Reference<DOM::CDocument> const pCDoc(
dynamic_cast<DOM::CDocument*>( DOM::CNode::GetImplementation(
@@ -383,8 +380,9 @@ namespace XPath
}
/* Create xpath evaluation context */
- xpathCtx = xmlXPathNewContext(pDoc);
- if (xpathCtx == NULL) throw XPathException();
+ ::boost::shared_ptr<xmlXPathContext> const xpathCtx(
+ xmlXPathNewContext(pDoc), xmlXPathFreeContext);
+ if (xpathCtx == NULL) { throw XPathException(); }
// set context node
xpathCtx->node = pNode;
@@ -393,18 +391,18 @@ namespace XPath
xmlSetGenericErrorFunc(NULL, generic_error_func);
// register namespaces and extension
- lcl_registerNamespaces(xpathCtx, nsmap);
- lcl_registerExtensions(xpathCtx, extensions);
+ lcl_registerNamespaces(xpathCtx.get(), nsmap);
+ lcl_registerExtensions(xpathCtx.get(), extensions);
/* run the query */
OString o1 = OUStringToOString(expr, RTL_TEXTENCODING_UTF8);
xmlChar *xStr = (xmlChar*)o1.getStr();
- if ((xpathObj = xmlXPathEval(xStr, xpathCtx)) == NULL) {
+ ::boost::shared_ptr<xmlXPathObject> const xpathObj(
+ xmlXPathEval(xStr, xpathCtx.get()), xmlXPathFreeObject);
+ if (0 == xpathObj) {
// OSL_ENSURE(xpathCtx->lastError == NULL, xpathCtx->lastError->message);
- xmlXPathFreeContext(xpathCtx);
throw XPathException();
}
- xmlXPathFreeContext(xpathCtx);
Reference<XXPathObject> const xObj(
new CXPathObject(pCDoc, pCDoc->GetMutex(), xpathObj));
return xObj;
diff --git a/unoxml/source/xpath/xpathobject.cxx b/unoxml/source/xpath/xpathobject.cxx
index ea63bb716736..48b680698e87 100644
--- a/unoxml/source/xpath/xpathobject.cxx
+++ b/unoxml/source/xpath/xpathobject.cxx
@@ -67,11 +67,11 @@ namespace XPath
CXPathObject::CXPathObject(
::rtl::Reference<DOM::CDocument> const& pDocument,
::osl::Mutex & rMutex,
- xmlXPathObjectPtr const xpathObj)
+ ::boost::shared_ptr<xmlXPathObject> const& pXPathObj)
: m_pDocument(pDocument)
, m_rMutex(rMutex)
- , m_pXPathObj(xpathObj, xmlXPathFreeObject)
- , m_XPathObjectType(lcl_GetType(xpathObj))
+ , m_pXPathObj(pXPathObj)
+ , m_XPathObjectType(lcl_GetType(pXPathObj.get()))
{
}
diff --git a/unoxml/source/xpath/xpathobject.hxx b/unoxml/source/xpath/xpathobject.hxx
index 56a8d65996f5..f15aed9ded95 100644
--- a/unoxml/source/xpath/xpathobject.hxx
+++ b/unoxml/source/xpath/xpathobject.hxx
@@ -66,7 +66,7 @@ namespace XPath
public:
CXPathObject( ::rtl::Reference<DOM::CDocument> const& pDocument,
::osl::Mutex & rMutex,
- xmlXPathObjectPtr const xpathObj);
+ ::boost::shared_ptr<xmlXPathObject> const& pXPathObj);
/**
get object type