]> git.mxchange.org Git - simgear.git/blobdiff - simgear/props/props_io.cxx
warning fix
[simgear.git] / simgear / props / props_io.cxx
index df68d58505c67866227083ced3c5b95aa7a298f1..232e3c2c79f4b2c4c4da20d00fa2c54e1c00d5f7 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <simgear/sg_inlines.h>
 #include <simgear/debug/logstream.hxx>
+#include <simgear/math/SGMath.hxx>
 #include <simgear/misc/sg_path.hxx>
 #include <simgear/xml/easyxml.hxx>
 
@@ -27,6 +28,7 @@
 #include <iostream>
 #include <fstream>
 #include <string>
+#include <cstring>             // strcmp()
 #include <vector>
 #include <map>
 
@@ -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<SGVec3d>(_data));
+    } else if (st.type == "vec4d" && _extended) {
+      ret = st.node
+        ->setValue(simgear::parseString<SGVec4d>(_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<SGVec3d>()))
+        retval = false;
+      break;
+    case props::VEC4D:
+      if (!out->setValue(in->getValue<SGVec4d>()))
+        retval = false;
+      break;
     default:
       if (in->isAlias())
        break;