From 37ac409586f564db0e487f3d5b44b3a612d62438 Mon Sep 17 00:00:00 2001 From: ehofman Date: Sun, 19 Dec 2004 10:19:14 +0000 Subject: [PATCH] Melchior FRANZ: fgLoadFlight() loads a property file ("fgfs.sav") to a new property tree, and then copies that over to the main tree. copyProperties() didn't know how to handle type SGPropertyNode::ALIAS and hence threw an exception that made fgfs abort. The attached patch adds support for ALIAS to copyProperties(): aliased nodes are created in the target tree if necessary, and then linked like in the source tree. It seemed useful to add an optional argument to props.[ch]xx/getType() that would indeed return the property type "ALIAS" for aliased nodes, and not the type of the node that it refers to. The patch also fixes a bug in writeNode() that caused extra lines after alias entries. If there's resistance to the change to getType() (David?) I can easily use isAlias(). This just makes copyProperties() a tad uglier, but I can live with it. It's useful for scanning a tree, though, if an alias node can be treated exactly like all other nodes, without automatic redirection. --- simgear/props/props.cxx | 4 ++-- simgear/props/props.hxx | 4 +++- simgear/props/props_io.cxx | 11 +++++++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/simgear/props/props.cxx b/simgear/props/props.cxx index 60a19aa4..50b412cb 100644 --- a/simgear/props/props.cxx +++ b/simgear/props/props.cxx @@ -969,9 +969,9 @@ SGPropertyNode::getPath (bool simplify) const } SGPropertyNode::Type -SGPropertyNode::getType () const +SGPropertyNode::getType (bool deref_alias) const { - if (_type == ALIAS) + if (_type == ALIAS && deref_alias) return _value.alias->getType(); else return _type; diff --git a/simgear/props/props.hxx b/simgear/props/props.hxx index a08d6ffa..c800f29d 100644 --- a/simgear/props/props.hxx +++ b/simgear/props/props.hxx @@ -850,8 +850,10 @@ public: /** * Get the type of leaf value, if any, for this node. + * When applied to an ALIAS node, deref_alias decides if the type + * of the referred node is to be returned (default), or ALIAS. */ - Type getType () const; + Type getType (bool deref_alias = true) const; /** diff --git a/simgear/props/props_io.cxx b/simgear/props/props_io.cxx index e936f5b0..ec549011 100644 --- a/simgear/props/props_io.cxx +++ b/simgear/props/props_io.cxx @@ -368,6 +368,7 @@ getTypeName (SGPropertyNode::Type type) case SGPropertyNode::STRING: return "string"; case SGPropertyNode::ALIAS: + return "alias"; case SGPropertyNode::NONE: return "unspecified"; } @@ -483,7 +484,7 @@ writeNode (ostream &output, const SGPropertyNode * node, } // If there are children, write them next. - if (nChildren > 0 || node->isAlias()) { + if (nChildren > 0) { doIndent(output, indent); output << '<' << name; writeAtts(output, node); @@ -550,7 +551,7 @@ copyProperties (const SGPropertyNode *in, SGPropertyNode *out) // First, copy the actual value, // if any. if (in->hasValue()) { - switch (in->getType()) { + switch (in->getType(false)) { case SGPropertyNode::BOOL: if (!out->setBoolValue(in->getBoolValue())) retval = false; @@ -579,6 +580,12 @@ copyProperties (const SGPropertyNode *in, SGPropertyNode *out) if (!out->setUnspecifiedValue(in->getStringValue())) retval = false; break; + case SGPropertyNode::ALIAS: { + const char *path = in->getAliasTarget()->getPath(); + SGPropertyNode *node = out->getRootNode()->getNode(path, true); + out->alias(node); + break; + } default: string message = "Unknown internal SGPropertyNode type"; message += in->getType();