#include "propertyObject.hxx"
+#include <simgear/structure/exception.hxx>
+
namespace simgear
{
{
static_defaultRoot = aRoot;
}
+
+PropertyObjectBase::PropertyObjectBase() :
+ _path(NULL),
+ _prop(NULL)
+{
+
+}
PropertyObjectBase::PropertyObjectBase(const PropertyObjectBase& aOther) :
- _base(aOther._base),
_path(aOther._path),
_prop(aOther._prop)
{
}
PropertyObjectBase::PropertyObjectBase(const char* aChild) :
- _base(NULL),
_path(aChild),
_prop(NULL)
{
}
PropertyObjectBase::PropertyObjectBase(SGPropertyNode* aNode, const char* aChild) :
- _base(aNode),
_path(aChild),
- _prop(NULL)
+ _prop(aNode)
{
}
SGPropertyNode* PropertyObjectBase::node(bool aCreate) const
{
- if (_prop) {
+ if (_path == NULL) { // already resolved
return _prop;
}
- _prop = _base ? _base : static_defaultRoot;
- if (_path) {
- _prop = _prop->getNode(_path, aCreate);
- }
+ SGPropertyNode *r = _prop ? _prop : static_defaultRoot,
+ *prop = r->getNode(_path, aCreate);
- return _prop;
+ if( prop )
+ {
+ // resolve worked, we will cache from now on, so clear _path and cache prop
+ _path = NULL;
+ _prop = prop;
+ }
+
+ return prop;
+}
+
+SGPropertyNode* PropertyObjectBase::getOrThrow() const
+{
+ SGPropertyNode* n = node(false);
+ if (!n) {
+ std::string path;
+ if (_prop) {
+ path = _prop->getPath();
+ if (_path) {
+ path += '/';
+ }
+ }
+
+ if (_path) {
+ path += _path;
+ }
+
+ throw sg_exception("Unknown property:" + path);
+ }
+
+ return n;
}
} // of namespace simgear