X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fprops%2Fprops_io.cxx;h=232e3c2c79f4b2c4c4da20d00fa2c54e1c00d5f7;hb=07da1e7e1a753c59b805a6a071766ee08ac3c826;hp=df68d58505c67866227083ced3c5b95aa7a298f1;hpb=54065b59a1034308e86a8d9dbf0b202361074822;p=simgear.git diff --git a/simgear/props/props_io.cxx b/simgear/props/props_io.cxx index df68d585..232e3c2c 100644 --- a/simgear/props/props_io.cxx +++ b/simgear/props/props_io.cxx @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -27,6 +28,7 @@ #include #include #include +#include // strcmp() #include #include @@ -52,8 +54,11 @@ class PropsVisitor : public XMLVisitor { public: - PropsVisitor (SGPropertyNode * root, const string &base, int default_mode = 0) - : _default_mode(default_mode), _root(root), _level(0), _base(base), _hasException(false) {} + PropsVisitor (SGPropertyNode * root, const string &base, int default_mode = 0, + bool extended = false) + : _default_mode(default_mode), _root(root), _level(0), _base(base), + _hasException(false), _extended(extended) + {} virtual ~PropsVisitor () {} @@ -110,6 +115,7 @@ private: string _base; sg_io_exception _exception; bool _hasException; + bool _extended; }; void @@ -167,7 +173,7 @@ PropsVisitor::startElement (const char * name, const XMLAttributes &atts) SGPath path(SGPath(_base).dir()); path.append(attval); try { - readProperties(path.str(), _root); + readProperties(path.str(), _root, 0, _extended); } catch (sg_io_exception &e) { setException(e); } @@ -235,7 +241,7 @@ PropsVisitor::startElement (const char * name, const XMLAttributes &atts) SGPath path(SGPath(_base).dir()); path.append(attval); try { - readProperties(path.str(), node); + readProperties(path.str(), node, 0, _extended); } catch (sg_io_exception &e) { setException(e); } @@ -275,6 +281,12 @@ PropsVisitor::endElement (const char * name) ret = st.node->setDoubleValue(strtod(_data.c_str(), 0)); } else if (st.type == "string") { ret = st.node->setStringValue(_data.c_str()); + } else if (st.type == "vec3d" && _extended) { + ret = st.node + ->setValue(simgear::parseString(_data)); + } else if (st.type == "vec4d" && _extended) { + ret = st.node + ->setValue(simgear::parseString(_data)); } else if (st.type == "unspecified") { ret = st.node->setUnspecifiedValue(_data.c_str()); } else if (_level == 1) { @@ -344,9 +356,9 @@ PropsVisitor::warning (const char * message, int line, int column) */ void readProperties (istream &input, SGPropertyNode * start_node, - const string &base, int default_mode) + const string &base, int default_mode, bool extended) { - PropsVisitor visitor(start_node, base, default_mode); + PropsVisitor visitor(start_node, base, default_mode, extended); readXML(input, visitor, base); if (visitor.hasException()) throw visitor.getException(); @@ -362,9 +374,9 @@ readProperties (istream &input, SGPropertyNode * start_node, */ void readProperties (const string &file, SGPropertyNode * start_node, - int default_mode) + int default_mode, bool extended) { - PropsVisitor visitor(start_node, file, default_mode); + PropsVisitor visitor(start_node, file, default_mode, extended); readXML(file, visitor); if (visitor.hasException()) throw visitor.getException(); @@ -380,9 +392,10 @@ readProperties (const string &file, SGPropertyNode * start_node, * @return true if the read succeeded, false otherwise. */ void readProperties (const char *buf, const int size, - SGPropertyNode * start_node, int default_mode) + SGPropertyNode * start_node, int default_mode, + bool extended) { - PropsVisitor visitor(start_node, "", default_mode); + PropsVisitor visitor(start_node, "", default_mode, extended); readXML(buf, size, visitor); if (visitor.hasException()) throw visitor.getException(); @@ -399,26 +412,33 @@ void readProperties (const char *buf, const int size, * Return the type name. */ static const char * -getTypeName (SGPropertyNode::Type type) +getTypeName (simgear::props::Type type) { + using namespace simgear; switch (type) { - case SGPropertyNode::UNSPECIFIED: + case props::UNSPECIFIED: return "unspecified"; - case SGPropertyNode::BOOL: + case props::BOOL: return "bool"; - case SGPropertyNode::INT: + case props::INT: return "int"; - case SGPropertyNode::LONG: + case props::LONG: return "long"; - case SGPropertyNode::FLOAT: + case props::FLOAT: return "float"; - case SGPropertyNode::DOUBLE: + case props::DOUBLE: return "double"; - case SGPropertyNode::STRING: + case props::STRING: return "string"; - case SGPropertyNode::ALIAS: - case SGPropertyNode::NONE: + case props::VEC3D: + return "vec3d"; + case props::VEC4D: + return "vec4d"; + case props::ALIAS: + case props::NONE: return "unspecified"; + default: // avoid compiler warning + break; } // keep the compiler from squawking @@ -524,7 +544,7 @@ writeNode (ostream &output, const SGPropertyNode * node, output << " alias=\"" << node->getAliasTarget()->getPath() << "\"/>" << endl; } else { - if (node->getType() != SGPropertyNode::UNSPECIFIED) + if (node->getType() != simgear::props::UNSPECIFIED) output << " type=\"" << getTypeName(node->getType()) << '"'; output << '>'; writeData(output, node->getStringValue()); @@ -599,40 +619,49 @@ writeProperties (const string &file, const SGPropertyNode * start_node, bool copyProperties (const SGPropertyNode *in, SGPropertyNode *out) { + using namespace simgear; bool retval = true; // First, copy the actual value, // if any. if (in->hasValue()) { switch (in->getType()) { - case SGPropertyNode::BOOL: + case props::BOOL: if (!out->setBoolValue(in->getBoolValue())) retval = false; break; - case SGPropertyNode::INT: + case props::INT: if (!out->setIntValue(in->getIntValue())) retval = false; break; - case SGPropertyNode::LONG: + case props::LONG: if (!out->setLongValue(in->getLongValue())) retval = false; break; - case SGPropertyNode::FLOAT: + case props::FLOAT: if (!out->setFloatValue(in->getFloatValue())) retval = false; break; - case SGPropertyNode::DOUBLE: + case props::DOUBLE: if (!out->setDoubleValue(in->getDoubleValue())) retval = false; break; - case SGPropertyNode::STRING: + case props::STRING: if (!out->setStringValue(in->getStringValue())) retval = false; break; - case SGPropertyNode::UNSPECIFIED: + case props::UNSPECIFIED: if (!out->setUnspecifiedValue(in->getStringValue())) retval = false; break; + case props::VEC3D: + if (!out->setValue(in->getValue())) + retval = false; + break; + case props::VEC4D: + if (!out->setValue(in->getValue())) + retval = false; + break; default: if (in->isAlias()) break;