So, I added my physics classes...
[potpourri.git] / src / core / parseactor.cpp
blob8a61672f8b1830b287a3c8efbc2cd87f2885bc16
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"
24 #include <stdexcept>
25 #include <iostream>
27 namespace XMLParser{
28 namespace parseactor{
30 std::string parsename(xmlpp::Node* node)
32 std::string results;
34 results = getContents(node);
36 return results;
40 std::string XMLParser::parseactor::parsesource(xmlpp::Node* node)
42 std::string results;
44 results = getContents(node);
46 return results;
49 std::string XMLParser::parseactor::parsepair(xmlpp::Node* node)
51 std::string results;
53 results = getContents(node);
55 return results;
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;
76 return results;
79 float XMLParser::parseactor::parseangle(xmlpp::Node* node)
81 float results;
83 results = fromString<float>(getContents(node));
85 return results;
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;
119 return results;
122 float XMLParser::parseactor::parsemass(xmlpp::Node* node)
124 float results;
126 results = fromString<float>(getContents(node));
128 return results;
131 float XMLParser::parseactor::parseinertia(xmlpp::Node* node)
133 float results;
135 results = fromString<float>(getContents(node));
137 return results;
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;
173 return results;
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);
195 return results;
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;
235 return results;
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;
257 return results;
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;
296 return results;
299 float XMLParser::parseactor::parseradius(xmlpp::Node* node)
301 float results;
303 results = fromString<float>(getContents(node));
305 return results;
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);
322 results.m_a = temp;
325 if ((*iter)->get_name() == "pair")
327 std::string temp = parsepair(*iter);
328 results.m_b = temp;
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;
350 return results;
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);
390 return results;
392 std::string XMLParser::parseactor::parseevent(xmlpp::Node* node)
394 std::string results;
396 results = getContents(node);
398 return results;
401 std::string XMLParser::parseactor::parsescript(xmlpp::Node* node)
403 std::string results;
405 results = getContents(node);
407 return results;
410 namespace XMLParser{
411 namespace parseactor{
412 reaction parsereaction(xmlpp::Node* node)
414 reaction results;
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;
436 return results;
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);
477 return results;
480 namespace XMLParser{
481 namespace parseactor{
482 actor parseactorFromBuffer(std::string buffer)
484 actor results;
486 xmlpp::Node* base = 0;
490 xmlpp::DomParser parser;
491 parser.set_substitute_entities();
492 parser.set_validate();
494 parser.parse_memory(buffer);
496 if (parser)
497 base = parser.get_document()->get_root_node();
498 else
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: ") +
508 e.what());
511 return results;
515 float XMLParser::parseactor::parseelasticity(xmlpp::Node* node)
517 float results;
519 results = fromString<float>(getContents(node));
521 return results;
524 float XMLParser::parseactor::parsefriction(xmlpp::Node* node)
526 float results;
528 results = fromString<float>(getContents(node));
530 return results;