summaryrefslogtreecommitdiff
path: root/project2/xslRows.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'project2/xslRows.cpp')
-rw-r--r--project2/xslRows.cpp24
1 files changed, 11 insertions, 13 deletions
diff --git a/project2/xslRows.cpp b/project2/xslRows.cpp
index aa53540..0b981aa 100644
--- a/project2/xslRows.cpp
+++ b/project2/xslRows.cpp
@@ -20,7 +20,7 @@ class ResourceDownloadError : public std::exception { };
XslRows::XslRows(const xmlpp::Element * p) :
SourceObject(p),
RowSet(p),
- url(p->get_attribute_value("url")),
+ url(p, "url"),
html(p->get_attribute_value("html") == "true"),
warnings(p->get_attribute_value("warnings") != "false")
{
@@ -102,17 +102,19 @@ XslRows::getDocument(const Glib::ustring & url) const
void
XslRows::execute(const RowProcessor * rp) const
{
+ typedef boost::shared_ptr<xmlXPathObject> xmlXPathObjectSPtr;
+ typedef boost::shared_ptr<xmlXPathContext> xmlXPathContextSPtr;
xmlDocPtr doc = LexicalCall<Glib::ustring, xmlDocPtr>(boost::bind(&XslRows::getDocument, this, _1), url());
- xmlXPathContextPtr xpathCtx = xmlXPathNewContext(doc);
+ xmlXPathContextSPtr xpathCtx = xmlXPathContextSPtr(xmlXPathNewContext(doc), xmlXPathFreeContext);
if (!xpathCtx) {
throw XpathInitError();
}
BOOST_FOREACH(const Namespaces::value_type & ns, namespaces) {
- xmlXPathRegisterNs(xpathCtx, BAD_CAST ns.first.c_str(), BAD_CAST ns.second.c_str());
+ xmlXPathRegisterNs(xpathCtx.get(), BAD_CAST ns.first.c_str(), BAD_CAST ns.second.c_str());
}
- xmlXPathObjectPtr xpathObj = LexicalCall<const xmlChar *, xmlXPathObjectPtr>(boost::bind(&xmlXPathEvalExpression, _1, xpathCtx), fv->root());
+ xmlXPathObjectSPtr xpathObj = xmlXPathObjectSPtr(
+ LexicalCall<const xmlChar *, xmlXPathObjectPtr>(boost::bind(&xmlXPathEvalExpression, _1, xpathCtx.get()), fv->root()), xmlXPathFreeObject);
if (!xpathObj || !xpathObj->nodesetval) {
- xmlXPathFreeContext(xpathCtx);
throw XpathEvalError();
}
rowNum = 1;
@@ -121,10 +123,9 @@ XslRows::execute(const RowProcessor * rp) const
xpathCtx->node = rowRoot;
values.clear();
BOOST_FOREACH(const FilterView::XPaths::value_type & xp, fv->xpaths) {
- xmlXPathObjectPtr xpathObjI = LexicalCall<const xmlChar *, xmlXPathObjectPtr>(boost::bind(&xmlXPathEvalExpression, _1, xpathCtx), xp.second());
+ xmlXPathObjectSPtr xpathObjI = xmlXPathObjectSPtr(LexicalCall<const xmlChar *, xmlXPathObjectPtr>(
+ boost::bind(&xmlXPathEvalExpression, _1, xpathCtx.get()), xp.second()), xmlXPathFreeObject);
if (!xpathObjI) {
- xmlXPathFreeObject(xpathObj);
- xmlXPathFreeContext(xpathCtx);
throw XpathEvalError();
}
if (xpathObjI->floatval) {
@@ -139,23 +140,20 @@ XslRows::execute(const RowProcessor * rp) const
values[xp.first] = boost::shared_ptr<const Glib::ustring>(new Glib::ustring((const char *)val));
}
}
- xmlXPathFreeObject(xpathObjI);
}
rp->rowReady();
rowNum += 1;
}
- xmlXPathFreeObject(xpathObj);
- xmlXPathFreeContext(xpathCtx);
}
XslRows::FilterView::FilterView(const xmlpp::Element * p) :
name(p->get_attribute_value("name")),
- root(p->get_attribute_value("root"))
+ root(p, "root")
{
BOOST_FOREACH(const xmlpp::Node * node, p->find("field")) {
const xmlpp::Element * elem = dynamic_cast<const xmlpp::Element *>(node);
if (elem) {
- xpaths.insert(XPaths::value_type(elem->get_attribute_value("name"), elem->get_attribute_value("xpath")));
+ xpaths.insert(XPaths::value_type(elem->get_attribute_value("name"), Variable(elem, "xpath")));
}
}
}