Swiftray  1.0
svgpp-doc.h
Go to the documentation of this file.
1 #include <parser/svgpp-common.h>
2 #include <libxml/xpath.h>
3 #include <set>
4 
5 #ifndef SVGPP_DOC_H
6 #define SVGPP_DOC_H
7 
8 namespace Parser {
9 
10 class SVGPPDoc {
11 public:
12  class FollowRef;
13 
14  SVGPPDoc(xmlDocPtr xml_doc) : xml_(xml_doc) {
15  xml_context_ = xmlXPathNewContext(xml_doc);
16  }
17 
19  qDebug() << "[Memory] ~SVGPPDoc(" << this << ")";
20  xmlFreeDoc(xml_);
21  xmlXPathFreeContext(xml_context_);
22  }
23 
24  xmlNodePtr root() { return xmlDocGetRootElement(xml_); }
25 
26  xmlNodePtr getElementById(std::string id) {
27  std::string query = QString("//*[@id='" + QString::fromStdString(id) + "']").toStdString();
28  xmlXPathObjectPtr result = xmlXPathEval(
29  (const xmlChar *) query.c_str(),
30  xml_context_);
31  if (result == nullptr || result->nodesetval == nullptr) return nullptr;
32 
33  for (int i = 0; i < result->nodesetval->nodeNr; i++) {
34  xmlNodePtr node = result->nodesetval->nodeTab[i];
35  if (node->type == XML_ELEMENT_NODE) {
36  xmlFree(result);
37  return node;
38  }
39  }
40  return nullptr;
41  }
42 
43  xmlDocPtr xml_;
44  xmlXPathContextPtr xml_context_;
45  typedef std::set<xmlNodePtr> followed_refs_t;
47 };
48 
50 public:
51  FollowRef(SVGPPDoc &svgpp_doc, xmlNodePtr el) : svgpp_doc_(svgpp_doc) {
52  std::pair<SVGPPDoc::followed_refs_t::iterator, bool> ins = svgpp_doc.followed_refs_.insert(el);
53  if (!ins.second)
54  throw std::runtime_error("Cyclic reference found");
55  lock_ = ins.first;
56  }
57 
58  ~FollowRef() { svgpp_doc_.followed_refs_.erase(lock_); }
59 
60 private:
61  SVGPPDoc &svgpp_doc_;
62  SVGPPDoc::followed_refs_t::iterator lock_;
63 };
64 
65 }
66 
67 #endif
Definition: svgpp-doc.h:49
FollowRef(SVGPPDoc &svgpp_doc, xmlNodePtr el)
Definition: svgpp-doc.h:51
~FollowRef()
Definition: svgpp-doc.h:58
Definition: svgpp-doc.h:10
followed_refs_t followed_refs_
Definition: svgpp-doc.h:46
SVGPPDoc(xmlDocPtr xml_doc)
Definition: svgpp-doc.h:14
xmlNodePtr getElementById(std::string id)
Definition: svgpp-doc.h:26
xmlDocPtr xml_
Definition: svgpp-doc.h:43
xmlXPathContextPtr xml_context_
Definition: svgpp-doc.h:44
xmlNodePtr root()
Definition: svgpp-doc.h:24
std::set< xmlNodePtr > followed_refs_t
Definition: svgpp-doc.h:45
~SVGPPDoc()
Definition: svgpp-doc.h:18
Definition: base-context.h:8