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.
This commit is contained in:
parent
7b24e94c66
commit
37ac409586
@ -969,9 +969,9 @@ SGPropertyNode::getPath (bool simplify) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
SGPropertyNode::Type
|
SGPropertyNode::Type
|
||||||
SGPropertyNode::getType () const
|
SGPropertyNode::getType (bool deref_alias) const
|
||||||
{
|
{
|
||||||
if (_type == ALIAS)
|
if (_type == ALIAS && deref_alias)
|
||||||
return _value.alias->getType();
|
return _value.alias->getType();
|
||||||
else
|
else
|
||||||
return _type;
|
return _type;
|
||||||
|
@ -850,8 +850,10 @@ public:
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the type of leaf value, if any, for this node.
|
* 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;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -368,6 +368,7 @@ getTypeName (SGPropertyNode::Type type)
|
|||||||
case SGPropertyNode::STRING:
|
case SGPropertyNode::STRING:
|
||||||
return "string";
|
return "string";
|
||||||
case SGPropertyNode::ALIAS:
|
case SGPropertyNode::ALIAS:
|
||||||
|
return "alias";
|
||||||
case SGPropertyNode::NONE:
|
case SGPropertyNode::NONE:
|
||||||
return "unspecified";
|
return "unspecified";
|
||||||
}
|
}
|
||||||
@ -483,7 +484,7 @@ writeNode (ostream &output, const SGPropertyNode * node,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If there are children, write them next.
|
// If there are children, write them next.
|
||||||
if (nChildren > 0 || node->isAlias()) {
|
if (nChildren > 0) {
|
||||||
doIndent(output, indent);
|
doIndent(output, indent);
|
||||||
output << '<' << name;
|
output << '<' << name;
|
||||||
writeAtts(output, node);
|
writeAtts(output, node);
|
||||||
@ -550,7 +551,7 @@ copyProperties (const SGPropertyNode *in, SGPropertyNode *out)
|
|||||||
// First, copy the actual value,
|
// First, copy the actual value,
|
||||||
// if any.
|
// if any.
|
||||||
if (in->hasValue()) {
|
if (in->hasValue()) {
|
||||||
switch (in->getType()) {
|
switch (in->getType(false)) {
|
||||||
case SGPropertyNode::BOOL:
|
case SGPropertyNode::BOOL:
|
||||||
if (!out->setBoolValue(in->getBoolValue()))
|
if (!out->setBoolValue(in->getBoolValue()))
|
||||||
retval = false;
|
retval = false;
|
||||||
@ -579,6 +580,12 @@ copyProperties (const SGPropertyNode *in, SGPropertyNode *out)
|
|||||||
if (!out->setUnspecifiedValue(in->getStringValue()))
|
if (!out->setUnspecifiedValue(in->getStringValue()))
|
||||||
retval = false;
|
retval = false;
|
||||||
break;
|
break;
|
||||||
|
case SGPropertyNode::ALIAS: {
|
||||||
|
const char *path = in->getAliasTarget()->getPath();
|
||||||
|
SGPropertyNode *node = out->getRootNode()->getNode(path, true);
|
||||||
|
out->alias(node);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
string message = "Unknown internal SGPropertyNode type";
|
string message = "Unknown internal SGPropertyNode type";
|
||||||
message += in->getType();
|
message += in->getType();
|
||||||
|
Loading…
Reference in New Issue
Block a user