]> git.mxchange.org Git - simgear.git/blobdiff - simgear/props/props_io.cxx
Remove using std:: from the metar header, remove HTTP support, add very basic unit...
[simgear.git] / simgear / props / props_io.cxx
index e3ceaddb0dcb58a75c93c20cf9d46fd0f05b7e66..0877390e8b2387eb28db66910ea0083b5c207e4c 100644 (file)
@@ -21,6 +21,7 @@
 #include <simgear/math/SGMath.hxx>
 #include <simgear/misc/sg_path.hxx>
 #include <simgear/xml/easyxml.hxx>
+#include <simgear/misc/ResourceManager.hxx>
 
 #include "props.hxx"
 #include "props_io.hxx"
@@ -170,12 +171,15 @@ PropsVisitor::startElement (const char * name, const XMLAttributes &atts)
                                // Check for an include.
     attval = atts.getValue("include");
     if (attval != 0) {
-      SGPath path(SGPath(_base).dir());
-      path.append(attval);
       try {
-       readProperties(path.str(), _root, 0, _extended);
+          SGPath path = simgear::ResourceManager::instance()->findPath(attval, SGPath(_base).dir());
+          if (path.isNull())
+          {
+              throw sg_io_exception("Cannot open file", sg_location(attval));
+          }
+          readProperties(path.str(), _root, 0, _extended);
       } catch (sg_io_exception &e) {
-       setException(e);
+          setException(e);
       }
     }
 
@@ -227,6 +231,9 @@ PropsVisitor::startElement (const char * name, const XMLAttributes &atts)
     attval = atts.getValue("userarchive");
     if (checkFlag(attval, false))
       mode |= SGPropertyNode::USERARCHIVE;
+    attval = atts.getValue("preserve");
+    if (checkFlag(attval, false))
+      mode |= SGPropertyNode::PRESERVE;
 
                                // Check for an alias.
     attval = atts.getValue("alias");
@@ -239,12 +246,15 @@ PropsVisitor::startElement (const char * name, const XMLAttributes &atts)
     bool omit = false;
     attval = atts.getValue("include");
     if (attval != 0) {
-      SGPath path(SGPath(_base).dir());
-      path.append(attval);
       try {
-       readProperties(path.str(), node, 0, _extended);
+          SGPath path = simgear::ResourceManager::instance()->findPath(attval, SGPath(_base).dir());
+          if (path.isNull())
+          {
+              throw sg_io_exception("Cannot open file", sg_location(attval));
+          }
+          readProperties(path.str(), node, 0, _extended);
       } catch (sg_io_exception &e) {
-       setException(e);
+          setException(e);
       }
 
       attval = atts.getValue("omit-node");
@@ -691,8 +701,12 @@ copyProperties (const SGPropertyNode *in, SGPropertyNode *out,
   int nChildren = in->nChildren();
   for (int i = 0; i < nChildren; i++) {
     const SGPropertyNode * in_child = in->getChild(i);
-    if (!in_child->hasValue() ||
-        (in_child->getAttributes() & attr_mask) == attr_value)
+    int mask = attr_mask;
+    /* attributes have no meaning for nodes without values - except
+     * the PRESERVE flag. So ignore them. */
+    if (!in_child->hasValue())
+        mask &= SGPropertyNode::PRESERVE;
+    if ((in_child->getAttributes() & mask) == (attr_value & mask))
     {
       SGPropertyNode * out_child = out->getChild(in_child->getNameString(),
                              in_child->getIndex(),
@@ -704,9 +718,13 @@ copyProperties (const SGPropertyNode *in, SGPropertyNode *out,
                                     true);
       }
       else
-      if (out_child->hasValue() &&
-          (out_child->getAttributes() & attr_mask) != attr_value)
-          out_child = NULL;
+      {
+          mask = attr_mask;
+          if (!out_child->hasValue())
+              mask &= SGPropertyNode::PRESERVE;
+          if ((out_child->getAttributes() & mask) != (attr_value & mask))
+              out_child = NULL;
+      }
       if (out_child &&
           (!copyProperties(in_child, out_child, attr_value, attr_mask)))
           retval = false;