X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fprops%2Fprops_io.cxx;h=0877390e8b2387eb28db66910ea0083b5c207e4c;hb=63a8209a839fcc142ab86ef16f323bb54c37521a;hp=e3ceaddb0dcb58a75c93c20cf9d46fd0f05b7e66;hpb=edc877442fb4a8df153353568e4c8dde988e026c;p=simgear.git diff --git a/simgear/props/props_io.cxx b/simgear/props/props_io.cxx index e3ceaddb..0877390e 100644 --- a/simgear/props/props_io.cxx +++ b/simgear/props/props_io.cxx @@ -21,6 +21,7 @@ #include #include #include +#include #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;