diff options
Diffstat (limited to 'project2/xslRows.cpp')
-rw-r--r-- | project2/xslRows.cpp | 24 |
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"))); } } } |