X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fprops%2Fprops_io.cxx;h=9fea449730bf94122e3eea9c23c826b4eae5de68;hb=708ae35068499af33329f9db91f55441f4956acb;hp=48244c7b11ee7cea442681e0944638cd6828cbd0;hpb=430c60ed1ac8d1c1ee79cdd45f6540d6dc8a5996;p=simgear.git diff --git a/simgear/props/props_io.cxx b/simgear/props/props_io.cxx index 48244c7b..9fea4497 100644 --- a/simgear/props/props_io.cxx +++ b/simgear/props/props_io.cxx @@ -227,6 +227,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"); @@ -621,11 +624,16 @@ writeProperties (const char* file, const SGPropertyNode * start_node) * * @param in The source property tree. * @param out The destination property tree. + * @param attr_value Only copy properties with given attribute values. + * @param attr_mask Mask for attributes to be considered by attr_value + * (default is 0 = attributes not considered, all + * properties copied). * @return true if all properties were copied, false if some failed * (for example, if the property's value is tied read-only). */ bool -copyProperties (const SGPropertyNode *in, SGPropertyNode *out) +copyProperties (const SGPropertyNode *in, SGPropertyNode *out, + int attr_value, int attr_mask) { using namespace simgear; bool retval = true; @@ -679,18 +687,41 @@ copyProperties (const SGPropertyNode *in, SGPropertyNode *out) } } - // copy the attributes. + // copy the attributes. out->setAttributes( in->getAttributes() ); - // Next, copy the children. + // Next, copy the children. int nChildren = in->nChildren(); for (int i = 0; i < nChildren; i++) { const SGPropertyNode * in_child = in->getChild(i); - SGPropertyNode * out_child = out->getChild(in_child->getNameString(), - in_child->getIndex(), - true); - if (!copyProperties(in_child, out_child)) - retval = false; + 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(), + false); + if (!out_child) + { + out_child = out->getChild(in_child->getNameString(), + in_child->getIndex(), + true); + } + else + { + 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; + } } return retval;