2 #include "xmlrpcParsers.hxx"
3 #include "dataParsers.hxx"
8 arraytypeParser arraytypeParser::arrayParser;
9 valuetypeParser valuetypeParser::valueParser;
10 parametertypeParser parametertypeParser::parameterParser;
11 datatypeParser datatypeParser::dataParser;
12 memberdatatypeParser memberdatatypeParser::memberdataParser;
13 structdatatypeParser structdatatypeParser::structdataParser;
15 static std::string t4[]={"string","objref","double","int","boolean","array","struct",""};
17 void valuetypeParser::pre (){ }
18 void valuetypeParser::int_ (const int& d)
20 std::ostringstream os;
21 os << "<int>" << d<< "</int>";
25 void valuetypeParser::boolean (const bool& d)
27 std::ostringstream os;
28 os << "<boolean>" << d<< "</boolean>";
32 void valuetypeParser::double_ (const double& d)
34 std::ostringstream os;
35 os << "<double>"<< d<< "</double>";
39 void valuetypeParser::string(const std::string& d)
41 _data="<string>"+ d+ "</string>";
44 void valuetypeParser::objref(const std::string& d)
46 _data="<objref>"+ d+ "</objref>";
49 void valuetypeParser::array (const std::string& d)
53 void valuetypeParser::struct_ (const std::string& d)
57 std::string valuetypeParser::post()
60 std::string value="<value>"+_v.back()+"</value>\n";
65 void datatypeParser::onStart(const XML_Char* el, const XML_Char** attr)
67 std::string element(el);
68 parser* pp=&parser::main_parser;
69 if(element == "value")pp=&valuetypeParser::valueParser;
70 SetUserDataAndPush(pp);
75 void datatypeParser::onEnd(const char *el,parser* child)
77 std::string element(el);
78 if(element == "value")value(((valuetypeParser*)child)->post());
80 void datatypeParser::pre ()
82 _datas.push_back(_data);
85 void datatypeParser::value (const std::string& v){
88 std::string datatypeParser::post()
91 std::string d="<data>\n"+_data+"</data>";
97 void memberdatatypeParser::onStart(const XML_Char* el, const XML_Char** attr)
99 std::string element(el);
100 parser* pp=&parser::main_parser;
101 if(element == "name")pp=&stringtypeParser::stringParser;
102 else if(element == "value")pp=&valuetypeParser::valueParser;
103 SetUserDataAndPush(pp);
108 void memberdatatypeParser::onEnd(const char *el,parser* child)
110 std::string element(el);
111 this->maxcount("name",1,element);
112 this->maxcount("value",1,element);
113 if(element == "name")name(((stringtypeParser*)child)->post());
114 else if(element == "value")value(((valuetypeParser*)child)->post());
116 void memberdatatypeParser::pre ()
118 _datas.push_back(_data);
121 void memberdatatypeParser::name (const std::string& v)
123 _data=_data+"<name>"+v+"</name>";
125 void memberdatatypeParser::value (const std::string& v)
129 std::string memberdatatypeParser::post()
133 std::string d="<member>\n"+_data+"</member>";
139 void structdatatypeParser::onStart(const XML_Char* el, const XML_Char** attr)
141 std::string element(el);
142 parser* pp=&parser::main_parser;
143 if(element == "member")pp=&memberdatatypeParser::memberdataParser;
144 SetUserDataAndPush(pp);
149 void structdatatypeParser::onEnd(const char *el,parser* child)
151 std::string element(el);
152 if(element == "member")member(((memberdatatypeParser*)child)->post());
154 void structdatatypeParser::pre ()
156 _membersStack.push_back(_members);
159 void structdatatypeParser::member (const std::string& d)
163 std::string structdatatypeParser::post()
165 mincount("member",1);
166 std::string value="<struct>"+_members+"</struct>";
167 _members=_membersStack.back();
168 _membersStack.pop_back();
172 void arraytypeParser::onStart(const XML_Char* el, const XML_Char** attr)
174 std::string element(el);
175 this->maxcount("data",1,element);
176 parser* pp=&parser::main_parser;
177 if(element == "data")pp=&datatypeParser::dataParser;
178 SetUserDataAndPush(pp);
183 void arraytypeParser::onEnd(const char *el,parser* child)
185 std::string element(el);
186 if(element == "data")data(((datatypeParser*)child)->post());
188 void arraytypeParser::pre (){ }
189 void arraytypeParser::data (const std::string& d)
191 _arrays.push_back(d);
193 std::string arraytypeParser::post()
196 std::string value="<array>"+_arrays.back()+"</array>";
202 void valuetypeParser::onStart(const XML_Char* el, const XML_Char** attr)
204 std::string element(el);
205 parser* pp=&parser::main_parser;
206 this->maxcount("string",1,element);
207 this->maxcount("objref",1,element);
208 this->maxcount("double",1,element);
209 this->maxcount("int",1,element);
210 this->maxcount("boolean",1,element);
211 this->maxcount("array",1,element);
212 this->maxcount("struct",1,element);
213 this->maxchoice(t4,1,element);
214 if(element == "string")pp=&stringtypeParser::stringParser;
215 else if(element == "objref")pp=&stringtypeParser::stringParser;
216 else if(element == "double")pp=&doubletypeParser::doubleParser;
217 else if(element == "int")pp=&inttypeParser::intParser;
218 else if(element == "boolean")pp=&booltypeParser::boolParser;
219 else if(element == "array")pp=&arraytypeParser::arrayParser;
220 else if(element == "struct")pp=&structdatatypeParser::structdataParser;
221 SetUserDataAndPush(pp);
227 void valuetypeParser::onEnd(const char *el,parser* child)
229 std::string element(el);
230 if(element == "string")string(((stringtypeParser*)child)->post());
231 else if(element == "objref")objref(((stringtypeParser*)child)->post());
232 else if(element == "double")double_(((doubletypeParser*)child)->post());
233 else if(element == "int")int_(((inttypeParser*)child)->post());
234 else if(element == "boolean")boolean(((booltypeParser*)child)->post());
235 else if(element == "array")array(((arraytypeParser*)child)->post());
236 else if(element == "struct")struct_(((structdatatypeParser*)child)->post());
239 void parametertypeParser::onStart(const XML_Char* el, const XML_Char** attr)
241 std::string element(el);
242 this->maxcount("tonode",1,element);
243 this->maxcount("toport",1,element);
244 this->maxcount("value",1,element);
245 parser* pp=&parser::main_parser;
246 if(element == "tonode")pp=&stringtypeParser::stringParser;
247 else if(element == "toport")pp=&stringtypeParser::stringParser;
248 else if(element == "value")pp=&valuetypeParser::valueParser;
249 SetUserDataAndPush(pp);
254 void parametertypeParser::onEnd(const char *el,parser* child)
256 std::string element(el);
257 if(element == "tonode")tonode(((stringtypeParser*)child)->post());
258 else if(element == "toport")toport(((stringtypeParser*)child)->post());
259 else if(element == "value")value(((valuetypeParser*)child)->post());
261 void parametertypeParser::pre (){}
262 void parametertypeParser::tonode (const std::string& name){
265 void parametertypeParser::toport (const std::string& name){
268 void parametertypeParser::value (const std::string& name){
271 myparam& parametertypeParser::post(){
272 mincount("tonode",1);
273 mincount("toport",1);