Log filter can be configured to write to a given file using 'filename'
[metaproxy-moved-to-github.git] / src / xmlutil.cpp
1 /* $Id: xmlutil.cpp,v 1.8 2006-06-19 13:08:00 adam Exp $
2    Copyright (c) 2005-2006, Index Data.
3
4    See the LICENSE file for details
5  */
6
7 #include <string.h>
8 #include "xmlutil.hpp"
9
10 namespace mp = metaproxy_1;
11 // Doxygen doesn't like mp::xml, so we use this instead
12 namespace mp_xml = metaproxy_1::xml;
13
14 std::string mp_xml::get_text(const xmlNode *ptr)
15 {
16     std::string c;
17     for (ptr = ptr->children; ptr; ptr = ptr->next)
18         if (ptr->type == XML_TEXT_NODE)
19             c += std::string((const char *) (ptr->content));
20     return c;
21 }
22
23 bool mp_xml::get_bool(const xmlNode *ptr, bool default_value)
24 {
25     if (ptr && ptr->type == XML_TEXT_NODE && ptr->content)
26     {
27         if (!strcmp((const char *) ptr->content, "true"))
28             return true;
29         else
30             return false;
31     }
32     return default_value;
33 }
34
35 bool mp_xml::is_element(const xmlNode *ptr, 
36                           const std::string &ns,
37                           const std::string &name)
38 {
39     if (ptr && ptr->type == XML_ELEMENT_NODE && ptr->ns && ptr->ns->href 
40         && !xmlStrcmp(BAD_CAST ns.c_str(), ptr->ns->href)
41         && !xmlStrcmp(BAD_CAST name.c_str(), ptr->name))
42         return true;
43     return false;
44 }
45
46 bool mp_xml::is_element_yp2(const xmlNode *ptr, 
47                               const std::string &name)
48 {
49     return mp::xml::is_element(ptr, "http://indexdata.dk/yp2/config/1", name);
50 }
51
52
53 bool mp_xml::check_element_yp2(const xmlNode *ptr, 
54                                  const std::string &name)
55 {
56     if (!mp::xml::is_element_yp2(ptr, name))
57         throw mp::XMLError("Expected element name " + name);
58     return true;
59 }
60
61 std::string mp_xml::get_route(const xmlNode *node)
62 {
63     std::string route_value;
64     if (node)
65     {
66         const struct _xmlAttr *attr;
67         for (attr = node->properties; attr; attr = attr->next)
68         {
69             std::string name = std::string((const char *) attr->name);
70             std::string value;
71             
72             if (attr->children && attr->children->type == XML_TEXT_NODE)
73                 value = std::string((const char *)attr->children->content);
74             
75             if (name == "route")
76                 route_value = value;
77             else
78                 throw XMLError("Only attribute route allowed"
79                                " in " + std::string((const char *)node->name)
80                                + " element. Got " + std::string(name));
81         }
82     }
83     return route_value;
84 }
85
86
87 const xmlNode* mp_xml::jump_to_children(const xmlNode* node,
88                                           int xml_node_type)
89 {
90     node = node->children;
91     for (; node && node->type != xml_node_type; node = node->next)
92         ;
93     return node;
94 }
95
96 const xmlNode* mp_xml::jump_to_next(const xmlNode* node,
97                                       int xml_node_type)
98 {
99     node = node->next;
100     for (; node && node->type != xml_node_type; node = node->next)
101         ;
102     return node;
103 }
104
105 const xmlNode* mp_xml::jump_to(const xmlNode* node,
106                                  int xml_node_type)
107 {
108     for (; node && node->type != xml_node_type; node = node->next)
109         ;
110     return node;
111 }
112
113 void mp_xml::check_empty(const xmlNode *node)
114 {
115     if (node)
116     {
117         const xmlNode *n;
118         for (n = node->children; n; n = n->next)
119             if (n->type == XML_ELEMENT_NODE)
120                 throw mp::XMLError("No child elements allowed inside element "
121                                     + std::string((const char *) node->name));
122     }
123 }
124
125 /*
126  * Local variables:
127  * c-basic-offset: 4
128  * indent-tabs-mode: nil
129  * c-file-style: "stroustrup"
130  * End:
131  * vim: shiftwidth=4 tabstop=8 expandtab
132  */