+bool yp2::RouterFleXML::Rep::is_element_yp2(const xmlNode *ptr,
+ const std::string &name)
+{
+ return is_element(ptr, "http://indexdata.dk/yp2/config/1", name);
+}
+
+bool yp2::RouterFleXML::Rep::check_element_yp2(const xmlNode *ptr,
+ const std::string &name)
+{
+ if (!is_element_yp2(ptr, name))
+ throw XMLError("Error. Expected element name " + name);
+ return true;
+}
+
+void yp2::RouterFleXML::Rep::parse_xml_config_dom(xmlDocPtr doc)
+{
+ if (!doc)
+ throw XMLError("Empty XML Document");
+
+ const xmlNode* root = xmlDocGetRootElement(doc);
+
+ check_element_yp2(root, "yp2");
+
+ std::cout << "processing /yp2" << std::endl;
+
+ // process <start> node which is expected first element node
+ const xmlNode* node = jump_to_children(root, XML_ELEMENT_NODE);
+ //for (; node && node->type != XML_ELEMENT_NODE; node = node->next)
+ // ;
+
+ check_element_yp2(node, "start");
+
+ std::cout << "processing /yp2/start" << std::endl;
+
+ // process <filters> node which is expected second element node
+ node = jump_to_next(node, XML_ELEMENT_NODE);
+ check_element_yp2(node, "filters");
+ std::cout << "processing /yp2/filters" << std::endl;
+
+ // process <filter> nodes in next level
+ const xmlNode* node2 = jump_to_children(node, XML_ELEMENT_NODE);
+
+ unsigned int filter_nr = 0;
+ while(node2 && check_element_yp2(node2, "filter"))
+ {
+ filter_nr++;
+ std::cout << "processing /yp2/filters/filter["
+ << filter_nr << "]" << std::endl;
+ node2 = jump_to_next(node2, XML_ELEMENT_NODE);
+ }
+
+ // process <routes> node which is expected third element node
+ node = jump_to_next(node, XML_ELEMENT_NODE);
+ check_element_yp2(node, "routes");
+ std::cout << "processing /yp2/routes" << std::endl;
+
+ // process <route> nodes in next level
+ node2 = jump_to_children(node, XML_ELEMENT_NODE);
+ check_element_yp2(node2, "route");
+
+ unsigned int route_nr = 0;
+ while(is_element_yp2(node2, "router"))
+ {
+ route_nr++;
+ std::cout << "processing /yp2/routes/route["
+ << route_nr << "]" << std::endl;
+
+ // process <filter> nodes in third level
+ const xmlNode* node3 = jump_to_children(node2, XML_ELEMENT_NODE);
+
+ unsigned int filter3_nr = 0;
+ while(node3 && check_element_yp2(node3, "filter"))
+ {
+ filter3_nr++;
+
+ std::cout << "processing /yp2/routes/route["
+ << route_nr << "]/filter["
+ << filter3_nr << "]" << std::endl;
+
+ node3 = jump_to_next(node3, XML_ELEMENT_NODE);
+
+ }
+ node2 = jump_to_next(node2, XML_ELEMENT_NODE);
+ }
+}
+
+void yp2::RouterFleXML::Rep::create_filter(std::string type,
+ const xmlDoc * xmldoc,
+ std::string id)
+{
+ std::cout << "Created Filter type='" << type
+ << "' id='" << id << "'" << std::endl;
+}
+
+yp2::RouterFleXML::Rep::Rep() :
+ m_xinclude(false)