#include <simgear/sg_inlines.h>
#include <simgear/debug/logstream.hxx>
+#include <simgear/math/SGMath.hxx>
#include <simgear/misc/sg_path.hxx>
#include <simgear/xml/easyxml.hxx>
{
public:
- PropsVisitor (SGPropertyNode * root, const string &base, int default_mode = 0)
- : _default_mode(default_mode), _root(root), _level(0), _base(base), _hasException(false) {}
+ PropsVisitor (SGPropertyNode * root, const string &base, int default_mode = 0,
+ bool extended = false)
+ : _default_mode(default_mode), _root(root), _level(0), _base(base),
+ _hasException(false), _extended(extended)
+ {}
virtual ~PropsVisitor () {}
string _base;
sg_io_exception _exception;
bool _hasException;
+ bool _extended;
};
void
SGPath path(SGPath(_base).dir());
path.append(attval);
try {
- readProperties(path.str(), _root);
+ readProperties(path.str(), _root, 0, _extended);
} catch (sg_io_exception &e) {
setException(e);
}
// Get the index.
attval = atts.getValue("n");
int index = 0;
+ string strName(name);
if (attval != 0) {
index = atoi(attval);
- st.counters[name] = SG_MAX2(st.counters[name], index+1);
+ st.counters[strName] = SG_MAX2(st.counters[strName], index+1);
} else {
- index = st.counters[name];
- st.counters[name]++;
+ index = st.counters[strName];
+ st.counters[strName]++;
}
// Got the index, so grab the node.
- SGPropertyNode * node = st.node->getChild(name, index, true);
+ SGPropertyNode * node = st.node->getChild(strName, index, true);
if (!node->getAttribute(SGPropertyNode::WRITE)) {
SG_LOG(SG_INPUT, SG_ALERT, "Not overwriting write-protected property "
<< node->getPath(true));
SGPath path(SGPath(_base).dir());
path.append(attval);
try {
- readProperties(path.str(), node);
+ readProperties(path.str(), node, 0, _extended);
} catch (sg_io_exception &e) {
setException(e);
}
ret = st.node->setDoubleValue(strtod(_data.c_str(), 0));
} else if (st.type == "string") {
ret = st.node->setStringValue(_data.c_str());
+ } else if (st.type == "vec3d" && _extended) {
+ ret = st.node
+ ->setValue(simgear::parseString<SGVec3d>(_data));
+ } else if (st.type == "vec4d" && _extended) {
+ ret = st.node
+ ->setValue(simgear::parseString<SGVec4d>(_data));
} else if (st.type == "unspecified") {
ret = st.node->setUnspecifiedValue(_data.c_str());
} else if (_level == 1) {
*/
void
readProperties (istream &input, SGPropertyNode * start_node,
- const string &base, int default_mode)
+ const string &base, int default_mode, bool extended)
{
- PropsVisitor visitor(start_node, base, default_mode);
+ PropsVisitor visitor(start_node, base, default_mode, extended);
readXML(input, visitor, base);
if (visitor.hasException())
throw visitor.getException();
*/
void
readProperties (const string &file, SGPropertyNode * start_node,
- int default_mode)
+ int default_mode, bool extended)
{
- PropsVisitor visitor(start_node, file, default_mode);
+ PropsVisitor visitor(start_node, file, default_mode, extended);
readXML(file, visitor);
if (visitor.hasException())
throw visitor.getException();
* @return true if the read succeeded, false otherwise.
*/
void readProperties (const char *buf, const int size,
- SGPropertyNode * start_node, int default_mode)
+ SGPropertyNode * start_node, int default_mode,
+ bool extended)
{
- PropsVisitor visitor(start_node, "", default_mode);
+ PropsVisitor visitor(start_node, "", default_mode, extended);
readXML(buf, size, visitor);
if (visitor.hasException())
throw visitor.getException();
static const char *
getTypeName (simgear::props::Type type)
{
- using namespace simgear::props;
+ using namespace simgear;
switch (type) {
- case UNSPECIFIED:
+ case props::UNSPECIFIED:
return "unspecified";
- case BOOL:
+ case props::BOOL:
return "bool";
- case INT:
+ case props::INT:
return "int";
- case LONG:
+ case props::LONG:
return "long";
- case FLOAT:
+ case props::FLOAT:
return "float";
- case DOUBLE:
+ case props::DOUBLE:
return "double";
- case STRING:
+ case props::STRING:
return "string";
- case ALIAS:
- case NONE:
+ case props::VEC3D:
+ return "vec3d";
+ case props::VEC4D:
+ return "vec4d";
+ case props::ALIAS:
+ case props::NONE:
return "unspecified";
+ default: // avoid compiler warning
+ break;
}
// keep the compiler from squawking
}
}
+// Another variation, useful when called from gdb
+void
+writeProperties (const char* file, const SGPropertyNode * start_node)
+{
+ writeProperties(string(file), start_node, true);
+}
+
\f
////////////////////////////////////////////////////////////////////////
bool
copyProperties (const SGPropertyNode *in, SGPropertyNode *out)
{
- using namespace simgear::props;
+ using namespace simgear;
bool retval = true;
// First, copy the actual value,
// if any.
if (in->hasValue()) {
switch (in->getType()) {
- case BOOL:
+ case props::BOOL:
if (!out->setBoolValue(in->getBoolValue()))
retval = false;
break;
- case INT:
+ case props::INT:
if (!out->setIntValue(in->getIntValue()))
retval = false;
break;
- case LONG:
+ case props::LONG:
if (!out->setLongValue(in->getLongValue()))
retval = false;
break;
- case FLOAT:
+ case props::FLOAT:
if (!out->setFloatValue(in->getFloatValue()))
retval = false;
break;
- case DOUBLE:
+ case props::DOUBLE:
if (!out->setDoubleValue(in->getDoubleValue()))
retval = false;
break;
- case STRING:
+ case props::STRING:
if (!out->setStringValue(in->getStringValue()))
retval = false;
break;
- case UNSPECIFIED:
+ case props::UNSPECIFIED:
if (!out->setUnspecifiedValue(in->getStringValue()))
retval = false;
break;
+ case props::VEC3D:
+ if (!out->setValue(in->getValue<SGVec3d>()))
+ retval = false;
+ break;
+ case props::VEC4D:
+ if (!out->setValue(in->getValue<SGVec4d>()))
+ retval = false;
+ break;
default:
if (in->isAlias())
break;
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->getName(),
+ SGPropertyNode * out_child = out->getChild(in_child->getNameString(),
in_child->getIndex(),
true);
if (!copyProperties(in_child, out_child))