1 // Copyright (C) 2006-2012 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #include "xmlrpcParsers.hxx"
21 #include "dataParsers.hxx"
26 arraytypeParser arraytypeParser::arrayParser;
27 valuetypeParser valuetypeParser::valueParser;
28 parametertypeParser parametertypeParser::parameterParser;
29 datatypeParser datatypeParser::dataParser;
30 memberdatatypeParser memberdatatypeParser::memberdataParser;
31 structdatatypeParser structdatatypeParser::structdataParser;
33 static std::string t4[]={"string","objref","double","int","boolean","array","struct",""};
35 void valuetypeParser::pre (){ }
36 void valuetypeParser::int_ (const int& d)
38 std::ostringstream os;
39 os << "<int>" << d<< "</int>";
43 void valuetypeParser::boolean (const bool& d)
45 std::ostringstream os;
46 os << "<boolean>" << d<< "</boolean>";
50 void valuetypeParser::double_ (const double& d)
52 std::ostringstream os;
53 os << "<double>"<< d<< "</double>";
57 void valuetypeParser::string(const std::string& d)
59 _data="<string>"+ d+ "</string>";
62 void valuetypeParser::objref(const std::string& d)
64 _data="<objref>"+ d+ "</objref>";
67 void valuetypeParser::array (const std::string& d)
71 void valuetypeParser::struct_ (const std::string& d)
75 std::string valuetypeParser::post()
78 std::string value="<value>"+_v.back()+"</value>\n";
83 void datatypeParser::onStart(const XML_Char* el, const XML_Char** attr)
85 std::string element(el);
86 parser* pp=&parser::main_parser;
87 if(element == "value")pp=&valuetypeParser::valueParser;
88 SetUserDataAndPush(pp);
93 void datatypeParser::onEnd(const char *el,parser* child)
95 std::string element(el);
96 if(element == "value")value(((valuetypeParser*)child)->post());
98 void datatypeParser::pre ()
100 _datas.push_back(_data);
103 void datatypeParser::value (const std::string& v){
106 std::string datatypeParser::post()
108 std::string d="<data>\n"+_data+"</data>";
114 void memberdatatypeParser::onStart(const XML_Char* el, const XML_Char** attr)
116 std::string element(el);
117 parser* pp=&parser::main_parser;
118 if(element == "name")pp=&stringtypeParser::stringParser;
119 else if(element == "value")pp=&valuetypeParser::valueParser;
120 SetUserDataAndPush(pp);
125 void memberdatatypeParser::onEnd(const char *el,parser* child)
127 std::string element(el);
128 this->maxcount("name",1,element);
129 this->maxcount("value",1,element);
130 if(element == "name")name(((stringtypeParser*)child)->post());
131 else if(element == "value")value(((valuetypeParser*)child)->post());
133 void memberdatatypeParser::pre ()
135 _datas.push_back(_data);
138 void memberdatatypeParser::name (const std::string& v)
140 _data=_data+"<name>"+v+"</name>";
142 void memberdatatypeParser::value (const std::string& v)
146 std::string memberdatatypeParser::post()
150 std::string d="<member>\n"+_data+"</member>";
156 void structdatatypeParser::onStart(const XML_Char* el, const XML_Char** attr)
158 std::string element(el);
159 parser* pp=&parser::main_parser;
160 if(element == "member")pp=&memberdatatypeParser::memberdataParser;
161 SetUserDataAndPush(pp);
166 void structdatatypeParser::onEnd(const char *el,parser* child)
168 std::string element(el);
169 if(element == "member")member(((memberdatatypeParser*)child)->post());
171 void structdatatypeParser::pre ()
173 _membersStack.push_back(_members);
176 void structdatatypeParser::member (const std::string& d)
180 std::string structdatatypeParser::post()
182 std::string value="<struct>"+_members+"</struct>";
183 _members=_membersStack.back();
184 _membersStack.pop_back();
188 void arraytypeParser::onStart(const XML_Char* el, const XML_Char** attr)
190 std::string element(el);
191 this->maxcount("data",1,element);
192 parser* pp=&parser::main_parser;
193 if(element == "data")pp=&datatypeParser::dataParser;
194 SetUserDataAndPush(pp);
199 void arraytypeParser::onEnd(const char *el,parser* child)
201 std::string element(el);
202 if(element == "data")data(((datatypeParser*)child)->post());
204 void arraytypeParser::pre (){ }
205 void arraytypeParser::data (const std::string& d)
207 _arrays.push_back(d);
209 std::string arraytypeParser::post()
212 std::string value="<array>"+_arrays.back()+"</array>";
218 void valuetypeParser::onStart(const XML_Char* el, const XML_Char** attr)
220 std::string element(el);
221 parser* pp=&parser::main_parser;
222 this->maxcount("string",1,element);
223 this->maxcount("objref",1,element);
224 this->maxcount("double",1,element);
225 this->maxcount("int",1,element);
226 this->maxcount("boolean",1,element);
227 this->maxcount("array",1,element);
228 this->maxcount("struct",1,element);
229 this->maxchoice(t4,1,element);
230 if(element == "string")pp=&stringtypeParser::stringParser;
231 else if(element == "objref")pp=&stringtypeParser::stringParser;
232 else if(element == "double")pp=&doubletypeParser::doubleParser;
233 else if(element == "int")pp=&inttypeParser::intParser;
234 else if(element == "boolean")pp=&booltypeParser::boolParser;
235 else if(element == "array")pp=&arraytypeParser::arrayParser;
236 else if(element == "struct")pp=&structdatatypeParser::structdataParser;
237 SetUserDataAndPush(pp);
243 void valuetypeParser::onEnd(const char *el,parser* child)
245 std::string element(el);
246 if(element == "string")string(((stringtypeParser*)child)->post());
247 else if(element == "objref")objref(((stringtypeParser*)child)->post());
248 else if(element == "double")double_(((doubletypeParser*)child)->post());
249 else if(element == "int")int_(((inttypeParser*)child)->post());
250 else if(element == "boolean")boolean(((booltypeParser*)child)->post());
251 else if(element == "array")array(((arraytypeParser*)child)->post());
252 else if(element == "struct")struct_(((structdatatypeParser*)child)->post());
255 void parametertypeParser::onStart(const XML_Char* el, const XML_Char** attr)
257 std::string element(el);
258 this->maxcount("tonode",1,element);
259 this->maxcount("toport",1,element);
260 this->maxcount("value",1,element);
261 parser* pp=&parser::main_parser;
262 if(element == "tonode")pp=&stringtypeParser::stringParser;
263 else if(element == "toport")pp=&stringtypeParser::stringParser;
264 else if(element == "value")pp=&valuetypeParser::valueParser;
265 SetUserDataAndPush(pp);
270 void parametertypeParser::onEnd(const char *el,parser* child)
272 std::string element(el);
273 if(element == "tonode")tonode(((stringtypeParser*)child)->post());
274 else if(element == "toport")toport(((stringtypeParser*)child)->post());
275 else if(element == "value")value(((valuetypeParser*)child)->post());
277 void parametertypeParser::pre (){}
278 void parametertypeParser::tonode (const std::string& name){
281 void parametertypeParser::toport (const std::string& name){
284 void parametertypeParser::value (const std::string& name){
287 myparam& parametertypeParser::post(){
288 mincount("tonode",1);
289 mincount("toport",1);