1 // Copyright (C) 2006-2008 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
19 #include "xmlrpcParsers.hxx"
20 #include "dataParsers.hxx"
25 arraytypeParser arraytypeParser::arrayParser;
26 valuetypeParser valuetypeParser::valueParser;
27 parametertypeParser parametertypeParser::parameterParser;
28 datatypeParser datatypeParser::dataParser;
29 memberdatatypeParser memberdatatypeParser::memberdataParser;
30 structdatatypeParser structdatatypeParser::structdataParser;
32 static std::string t4[]={"string","objref","double","int","boolean","array","struct",""};
34 void valuetypeParser::pre (){ }
35 void valuetypeParser::int_ (const int& d)
37 std::ostringstream os;
38 os << "<int>" << d<< "</int>";
42 void valuetypeParser::boolean (const bool& d)
44 std::ostringstream os;
45 os << "<boolean>" << d<< "</boolean>";
49 void valuetypeParser::double_ (const double& d)
51 std::ostringstream os;
52 os << "<double>"<< d<< "</double>";
56 void valuetypeParser::string(const std::string& d)
58 _data="<string>"+ d+ "</string>";
61 void valuetypeParser::objref(const std::string& d)
63 _data="<objref>"+ d+ "</objref>";
66 void valuetypeParser::array (const std::string& d)
70 void valuetypeParser::struct_ (const std::string& d)
74 std::string valuetypeParser::post()
77 std::string value="<value>"+_v.back()+"</value>\n";
82 void datatypeParser::onStart(const XML_Char* el, const XML_Char** attr)
84 std::string element(el);
85 parser* pp=&parser::main_parser;
86 if(element == "value")pp=&valuetypeParser::valueParser;
87 SetUserDataAndPush(pp);
92 void datatypeParser::onEnd(const char *el,parser* child)
94 std::string element(el);
95 if(element == "value")value(((valuetypeParser*)child)->post());
97 void datatypeParser::pre ()
99 _datas.push_back(_data);
102 void datatypeParser::value (const std::string& v){
105 std::string datatypeParser::post()
107 std::string d="<data>\n"+_data+"</data>";
113 void memberdatatypeParser::onStart(const XML_Char* el, const XML_Char** attr)
115 std::string element(el);
116 parser* pp=&parser::main_parser;
117 if(element == "name")pp=&stringtypeParser::stringParser;
118 else if(element == "value")pp=&valuetypeParser::valueParser;
119 SetUserDataAndPush(pp);
124 void memberdatatypeParser::onEnd(const char *el,parser* child)
126 std::string element(el);
127 this->maxcount("name",1,element);
128 this->maxcount("value",1,element);
129 if(element == "name")name(((stringtypeParser*)child)->post());
130 else if(element == "value")value(((valuetypeParser*)child)->post());
132 void memberdatatypeParser::pre ()
134 _datas.push_back(_data);
137 void memberdatatypeParser::name (const std::string& v)
139 _data=_data+"<name>"+v+"</name>";
141 void memberdatatypeParser::value (const std::string& v)
145 std::string memberdatatypeParser::post()
149 std::string d="<member>\n"+_data+"</member>";
155 void structdatatypeParser::onStart(const XML_Char* el, const XML_Char** attr)
157 std::string element(el);
158 parser* pp=&parser::main_parser;
159 if(element == "member")pp=&memberdatatypeParser::memberdataParser;
160 SetUserDataAndPush(pp);
165 void structdatatypeParser::onEnd(const char *el,parser* child)
167 std::string element(el);
168 if(element == "member")member(((memberdatatypeParser*)child)->post());
170 void structdatatypeParser::pre ()
172 _membersStack.push_back(_members);
175 void structdatatypeParser::member (const std::string& d)
179 std::string structdatatypeParser::post()
181 std::string value="<struct>"+_members+"</struct>";
182 _members=_membersStack.back();
183 _membersStack.pop_back();
187 void arraytypeParser::onStart(const XML_Char* el, const XML_Char** attr)
189 std::string element(el);
190 this->maxcount("data",1,element);
191 parser* pp=&parser::main_parser;
192 if(element == "data")pp=&datatypeParser::dataParser;
193 SetUserDataAndPush(pp);
198 void arraytypeParser::onEnd(const char *el,parser* child)
200 std::string element(el);
201 if(element == "data")data(((datatypeParser*)child)->post());
203 void arraytypeParser::pre (){ }
204 void arraytypeParser::data (const std::string& d)
206 _arrays.push_back(d);
208 std::string arraytypeParser::post()
211 std::string value="<array>"+_arrays.back()+"</array>";
217 void valuetypeParser::onStart(const XML_Char* el, const XML_Char** attr)
219 std::string element(el);
220 parser* pp=&parser::main_parser;
221 this->maxcount("string",1,element);
222 this->maxcount("objref",1,element);
223 this->maxcount("double",1,element);
224 this->maxcount("int",1,element);
225 this->maxcount("boolean",1,element);
226 this->maxcount("array",1,element);
227 this->maxcount("struct",1,element);
228 this->maxchoice(t4,1,element);
229 if(element == "string")pp=&stringtypeParser::stringParser;
230 else if(element == "objref")pp=&stringtypeParser::stringParser;
231 else if(element == "double")pp=&doubletypeParser::doubleParser;
232 else if(element == "int")pp=&inttypeParser::intParser;
233 else if(element == "boolean")pp=&booltypeParser::boolParser;
234 else if(element == "array")pp=&arraytypeParser::arrayParser;
235 else if(element == "struct")pp=&structdatatypeParser::structdataParser;
236 SetUserDataAndPush(pp);
242 void valuetypeParser::onEnd(const char *el,parser* child)
244 std::string element(el);
245 if(element == "string")string(((stringtypeParser*)child)->post());
246 else if(element == "objref")objref(((stringtypeParser*)child)->post());
247 else if(element == "double")double_(((doubletypeParser*)child)->post());
248 else if(element == "int")int_(((inttypeParser*)child)->post());
249 else if(element == "boolean")boolean(((booltypeParser*)child)->post());
250 else if(element == "array")array(((arraytypeParser*)child)->post());
251 else if(element == "struct")struct_(((structdatatypeParser*)child)->post());
254 void parametertypeParser::onStart(const XML_Char* el, const XML_Char** attr)
256 std::string element(el);
257 this->maxcount("tonode",1,element);
258 this->maxcount("toport",1,element);
259 this->maxcount("value",1,element);
260 parser* pp=&parser::main_parser;
261 if(element == "tonode")pp=&stringtypeParser::stringParser;
262 else if(element == "toport")pp=&stringtypeParser::stringParser;
263 else if(element == "value")pp=&valuetypeParser::valueParser;
264 SetUserDataAndPush(pp);
269 void parametertypeParser::onEnd(const char *el,parser* child)
271 std::string element(el);
272 if(element == "tonode")tonode(((stringtypeParser*)child)->post());
273 else if(element == "toport")toport(((stringtypeParser*)child)->post());
274 else if(element == "value")value(((valuetypeParser*)child)->post());
276 void parametertypeParser::pre (){}
277 void parametertypeParser::tonode (const std::string& name){
280 void parametertypeParser::toport (const std::string& name){
283 void parametertypeParser::value (const std::string& name){
286 myparam& parametertypeParser::post(){
287 mincount("tonode",1);
288 mincount("toport",1);