1 // Copyright 2008 Brian Caine
3 // This file is part of Potpourri.
5 // Potpourri is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
10 // Potpourri is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTIBILITY of FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with Potpourri. If not, see <http://www.gnu.org/licenses/>.
19 // Poorly implemented xml parsing
21 #include "../../include/core/parseactor.h"
22 #include "../../include/core/XmlExtra.h"
30 std::string
parsename(xmlpp::Node
* node
)
34 results
= getContents(node
);
40 std::string
XMLParser::parseactor::parsesource(xmlpp::Node
* node
)
44 results
= getContents(node
);
49 std::string
XMLParser::parseactor::parsepair(xmlpp::Node
* node
)
53 results
= getContents(node
);
58 XMLParser::parseactor::pos
XMLParser::parseactor::parsepos(xmlpp::Node
* node
)
60 XMLParser::parseactor::pos results
;
62 xmlpp::Node::NodeList list
= node
->get_children();
64 xmlpp::Node::NodeList::iterator iter
;
65 for (iter
= list
.begin(); iter
!= list
.end(); iter
++)
68 if ((*iter
)->get_name() == "pair")
70 std::string temp
= parsepair(*iter
);
71 results
.m_pair
= temp
;
79 float XMLParser::parseactor::parseangle(xmlpp::Node
* node
)
83 results
= fromString
<float>(getContents(node
));
88 XMLParser::parseactor::graphics
89 XMLParser::parseactor::parsegraphics(xmlpp::Node
* node
)
91 XMLParser::parseactor::graphics results
;
93 xmlpp::Node::NodeList list
= node
->get_children();
95 xmlpp::Node::NodeList::iterator iter
;
96 for (iter
= list
.begin(); iter
!= list
.end(); iter
++)
99 if ((*iter
)->get_name() == "source")
101 std::string temp
= parsesource(*iter
);
102 results
.m_source
= temp
;
105 if ((*iter
)->get_name() == "pos")
107 XMLParser::parseactor::pos temp
= parsepos(*iter
);
108 results
.m_pos
= temp
;
111 if ((*iter
)->get_name() == "angle")
113 float temp
= parseangle(*iter
);
114 results
.m_angle
= temp
;
122 float XMLParser::parseactor::parsemass(xmlpp::Node
* node
)
126 results
= fromString
<float>(getContents(node
));
131 float XMLParser::parseactor::parseinertia(xmlpp::Node
* node
)
135 results
= fromString
<float>(getContents(node
));
140 bool XMLParser::parseactor::parsefixed(xmlpp::Node
*){ return true; }
142 XMLParser::parseactor::body
143 XMLParser::parseactor::parsebody(xmlpp::Node
* node
)
145 XMLParser::parseactor::body results
;
147 xmlpp::Node::NodeList list
= node
->get_children();
149 xmlpp::Node::NodeList::iterator iter
;
150 for (iter
= list
.begin(); iter
!= list
.end(); iter
++)
153 if ((*iter
)->get_name() == "mass")
155 float temp
= parsemass(*iter
);
156 results
.m_mass
= temp
;
159 if ((*iter
)->get_name() == "inertia")
161 float temp
= parseinertia(*iter
);
162 results
.m_inertia
= temp
;
165 if ((*iter
)->get_name() == "fixed")
167 bool temp
= parsefixed(*iter
);
168 results
.m_fixed
= temp
;
176 XMLParser::parseactor::data
177 XMLParser::parseactor::parsedata(xmlpp::Node
* node
)
179 XMLParser::parseactor::data results
;
181 xmlpp::Node::NodeList list
= node
->get_children();
183 xmlpp::Node::NodeList::iterator iter
;
184 for (iter
= list
.begin(); iter
!= list
.end(); iter
++)
187 if ((*iter
)->get_name() == "pair")
189 std::string temp
= parsepair(*iter
);
190 results
.m_pair
.push_back(temp
);
198 XMLParser::parseactor::poly
199 XMLParser::parseactor::parsepoly(xmlpp::Node
* node
)
201 XMLParser::parseactor::poly results
;
203 xmlpp::Node::NodeList list
= node
->get_children();
205 xmlpp::Node::NodeList::iterator iter
;
206 for (iter
= list
.begin(); iter
!= list
.end(); iter
++)
209 if ((*iter
)->get_name() == "data")
211 XMLParser::parseactor::data temp
= parsedata(*iter
);
212 results
.m_data
= temp
;
215 if ((*iter
)->get_name() == "offset")
217 XMLParser::parseactor::offset temp
= parseoffset(*iter
);
218 results
.m_offset
= temp
;
221 if ((*iter
)->get_name() == "elasticity")
223 float temp
= parseelasticity(*iter
);
224 results
.m_elasticity
= temp
;
227 if ((*iter
)->get_name() == "friction")
229 float temp
= parsefriction(*iter
);
230 results
.m_friction
= temp
;
238 XMLParser::parseactor::offset
239 XMLParser::parseactor::parseoffset(xmlpp::Node
* node
)
241 XMLParser::parseactor::offset results
;
243 xmlpp::Node::NodeList list
= node
->get_children();
245 xmlpp::Node::NodeList::iterator iter
;
246 for (iter
= list
.begin(); iter
!= list
.end(); iter
++)
249 if ((*iter
)->get_name() == "pair")
251 std::string temp
= parsepair(*iter
);
252 results
.m_pair
= temp
;
260 XMLParser::parseactor::circle
261 XMLParser::parseactor::parsecircle(xmlpp::Node
* node
)
263 XMLParser::parseactor::circle results
;
265 xmlpp::Node::NodeList list
= node
->get_children();
267 xmlpp::Node::NodeList::iterator iter
;
268 for (iter
= list
.begin(); iter
!= list
.end(); iter
++)
271 if ((*iter
)->get_name() == "offset")
273 offset temp
= parseoffset(*iter
);
274 results
.m_offset
= temp
;
277 if ((*iter
)->get_name() == "radius")
279 float temp
= parseradius(*iter
);
280 results
.m_radius
= temp
;
283 if ((*iter
)->get_name() == "elasticity")
285 float temp
= parseelasticity(*iter
);
286 results
.m_elasticity
= temp
;
289 if ((*iter
)->get_name() == "friction")
291 float temp
= parsefriction(*iter
);
292 results
.m_friction
= temp
;
299 float XMLParser::parseactor::parseradius(xmlpp::Node
* node
)
303 results
= fromString
<float>(getContents(node
));
308 XMLParser::parseactor::line
309 XMLParser::parseactor::parseline(xmlpp::Node
* node
)
311 XMLParser::parseactor::line results
;
313 xmlpp::Node::NodeList list
= node
->get_children();
315 xmlpp::Node::NodeList::iterator iter
;
316 for (iter
= list
.begin(); iter
!= list
.end(); iter
++)
319 if ((*iter
)->get_name() == "pair")
321 std::string temp
= parsepair(*iter
);
325 if ((*iter
)->get_name() == "pair")
327 std::string temp
= parsepair(*iter
);
331 if ((*iter
)->get_name() == "radius")
333 float temp
= parseradius(*iter
);
334 results
.m_radius
= temp
;
337 if ((*iter
)->get_name() == "elasticity")
339 float temp
= parseelasticity(*iter
);
340 results
.m_elasticity
= temp
;
343 if ((*iter
)->get_name() == "friction")
345 float temp
= parsefriction(*iter
);
346 results
.m_friction
= temp
;
353 XMLParser::parseactor::physics
354 XMLParser::parseactor::parsephysics(xmlpp::Node
* node
)
356 XMLParser::parseactor::physics results
;
358 xmlpp::Node::NodeList list
= node
->get_children();
360 xmlpp::Node::NodeList::iterator iter
;
361 for (iter
= list
.begin(); iter
!= list
.end(); iter
++)
364 if ((*iter
)->get_name() == "body")
366 body temp
= parsebody(*iter
);
367 results
.m_body
= temp
;
370 if ((*iter
)->get_name() == "poly")
372 poly temp
= parsepoly(*iter
);
373 results
.m_poly
.push_back(temp
);
376 if ((*iter
)->get_name() == "circle")
378 circle temp
= parsecircle(*iter
);
379 results
.m_circle
.push_back(temp
);
382 if ((*iter
)->get_name() == "line")
384 line temp
= parseline(*iter
);
385 results
.m_line
.push_back(temp
);
392 std::string
XMLParser::parseactor::parseevent(xmlpp::Node
* node
)
396 results
= getContents(node
);
401 std::string
XMLParser::parseactor::parsescript(xmlpp::Node
* node
)
405 results
= getContents(node
);
411 namespace parseactor
{
412 reaction
parsereaction(xmlpp::Node
* node
)
416 xmlpp::Node::NodeList list
= node
->get_children();
418 xmlpp::Node::NodeList::iterator iter
;
419 for (iter
= list
.begin(); iter
!= list
.end(); iter
++)
422 if ((*iter
)->get_name() == "event")
424 std::string temp
= parseevent(*iter
);
425 results
.m_event
= temp
;
428 if ((*iter
)->get_name() == "script")
430 std::string temp
= parsescript(*iter
);
431 results
.m_script
= temp
;
440 XMLParser::parseactor::actor
441 XMLParser::parseactor::parseactor(xmlpp::Node
* node
)
443 XMLParser::parseactor::actor results
;
445 xmlpp::Node::NodeList list
= node
->get_children();
447 xmlpp::Node::NodeList::iterator iter
;
448 for (iter
= list
.begin(); iter
!= list
.end(); iter
++)
451 if ((*iter
)->get_name() == "name")
453 std::string temp
= parsename(*iter
);
454 results
.m_name
= temp
;
457 if ((*iter
)->get_name() == "graphics")
459 graphics temp
= parsegraphics(*iter
);
460 results
.m_graphics
.push_back(temp
);
463 if ((*iter
)->get_name() == "physics")
465 physics temp
= parsephysics(*iter
);
466 results
.m_physics
= temp
;
469 if ((*iter
)->get_name() == "reaction")
471 reaction temp
= parsereaction(*iter
);
472 results
.m_reaction
.push_back(temp
);
481 namespace parseactor
{
482 actor
parseactorFromBuffer(std::string buffer
)
486 xmlpp::Node
* base
= 0;
490 xmlpp::DomParser parser
;
491 parser
.set_substitute_entities();
492 parser
.set_validate();
494 parser
.parse_memory(buffer
);
497 base
= parser
.get_document()->get_root_node();
499 throw std::runtime_error("some weird error");
501 results
= XMLParser::parseactor::parseactor(base
);
504 catch (const std::exception
& e
)
506 throw std::runtime_error(std::string(
507 "XMLParser::parseactor::parseactorFromBuffer(): xmlpp error: ") +
515 float XMLParser::parseactor::parseelasticity(xmlpp::Node
* node
)
519 results
= fromString
<float>(getContents(node
));
524 float XMLParser::parseactor::parsefriction(xmlpp::Node
* node
)
528 results
= fromString
<float>(getContents(node
));