00001
00002 #include "XMLUtils.h"
00003 #include "IPAddressResolver.h"
00004
00005 const cXMLElement* getUniqueChild(const cXMLElement *node, const char *name)
00006 {
00007 const cXMLElement *child = getUniqueChildIfExists(node, name);
00008 if(!child)
00009 throw cRuntimeError("xml error: exactly one %s element expected", name);
00010
00011 return child;
00012 }
00013
00014 const cXMLElement* getUniqueChildIfExists(const cXMLElement *node, const char *name)
00015 {
00016 cXMLElementList list = node->getChildrenByTagName(name);
00017 if(list.size() > 1)
00018 throw cRuntimeError("xml error: at most one %s element expected", name);
00019 else if(list.size() == 1)
00020 return (*list.begin());
00021 else
00022 return NULL;
00023 }
00024
00025 bool parseBool(const char *text)
00026 {
00027 if(!strcasecmp(text, "down"))
00028 return false;
00029 else if(!strcasecmp(text, "off"))
00030 return false;
00031 else if(!strcasecmp(text, "false"))
00032 return false;
00033 else if(!strcasecmp(text, "no"))
00034 return false;
00035 else if(!strcasecmp(text, "0"))
00036 return false;
00037 else if(!strcasecmp(text, "up"))
00038 return true;
00039 else if(!strcasecmp(text, "on"))
00040 return true;
00041 else if(!strcasecmp(text, "true"))
00042 return true;
00043 else if(!strcasecmp(text, "yes"))
00044 return true;
00045 else if(!strcasecmp(text, "1"))
00046 return true;
00047 else
00048 throw cRuntimeError("unknown bool constant: %s", text);
00049 }
00050
00051 void checkTags(const cXMLElement *node, const char *allowed)
00052 {
00053 std::vector<const char *> tags;
00054
00055 cStringTokenizer st(allowed, " ");
00056 const char *nt;
00057 while((nt = st.nextToken())!=NULL)
00058 tags.push_back(nt);
00059
00060 for(cXMLElement *child=node->getFirstChild(); child; child=child->getNextSibling())
00061 {
00062 unsigned int i;
00063 for(i = 0; i < tags.size(); i++)
00064 if(!strcmp(child->getTagName(), tags[i]))
00065 break;
00066 if(i == tags.size())
00067 opp_error("subtag <%s> not expected in <%s>", child->getTagName(), node->getTagName());
00068 }
00069 }
00070
00071 const char* getParameterStrValue(const cXMLElement *ptr, const char *name, const char *def)
00072 {
00073 const cXMLElement *xvalue = getUniqueChildIfExists(ptr, name);
00074 if(xvalue)
00075 return xvalue->getNodeValue();
00076 else
00077 return def;
00078 }
00079
00080 bool getParameterBoolValue(const cXMLElement *ptr, const char *name, bool def)
00081 {
00082 const cXMLElement *xvalue = getUniqueChildIfExists(ptr, name);
00083 if(xvalue)
00084 return parseBool(xvalue->getNodeValue());
00085 else
00086 return def;
00087 }
00088
00089 bool getParameterBoolValue(const cXMLElement *ptr, const char *name)
00090 {
00091 const cXMLElement *xvalue = getUniqueChild(ptr, name);
00092 return parseBool(xvalue->getNodeValue());
00093 }
00094
00095 const char* getParameterStrValue(const cXMLElement *ptr, const char *name)
00096 {
00097 const cXMLElement *xvalue = getUniqueChild(ptr, name);
00098 return xvalue->getNodeValue();
00099 }
00100
00101 int getParameterIntValue(const cXMLElement *ptr, const char *name, int def)
00102 {
00103 const cXMLElement *xvalue = getUniqueChildIfExists(ptr, name);
00104 if(xvalue)
00105 return atoi(xvalue->getNodeValue());
00106 else
00107 return def;
00108 }
00109
00110 int getParameterIntValue(const cXMLElement *ptr, const char *name)
00111 {
00112 const cXMLElement *xvalue = getUniqueChild(ptr, name);
00113 return atoi(xvalue->getNodeValue());
00114 }
00115
00116 IPAddress getParameterIPAddressValue(const cXMLElement *ptr, const char *name, IPAddress def)
00117 {
00118 const cXMLElement *xvalue = getUniqueChildIfExists(ptr, name);
00119 if(xvalue)
00120 return IPAddress(xvalue->getNodeValue());
00121 else
00122 return def;
00123 }
00124
00125 IPAddress getParameterIPAddressValue(const cXMLElement *ptr, const char *name)
00126 {
00127 const cXMLElement *xvalue = getUniqueChild(ptr, name);
00128 return IPAddressResolver().resolve(xvalue->getNodeValue()).get4();
00129 }
00130
00131 double getParameterDoubleValue(const cXMLElement *ptr, const char *name, double def)
00132 {
00133 const cXMLElement *xvalue = getUniqueChildIfExists(ptr, name);
00134 if(xvalue)
00135 return strtod(xvalue->getNodeValue(), NULL);
00136 else
00137 return def;
00138 }
00139
00140 double getParameterDoubleValue(const cXMLElement *ptr, const char *name)
00141 {
00142 const cXMLElement *xvalue = getUniqueChild(ptr, name);
00143 return strtod(xvalue->getNodeValue(), NULL);
00144 }