Support absolute paths for XML includes.

Use standard path resolver when searching for includes. Includes like
  <foo include="/Aircraft/Instruments/myfile.xml">
are now also supported - no need for
  <foo include="../../../Aircraft/Instruments/myfile.xml">.
This commit is contained in:
ThorstenB 2011-08-27 11:52:05 +02:00
parent c7152af191
commit 36a8243f73

View File

@ -21,6 +21,7 @@
#include <simgear/math/SGMath.hxx> #include <simgear/math/SGMath.hxx>
#include <simgear/misc/sg_path.hxx> #include <simgear/misc/sg_path.hxx>
#include <simgear/xml/easyxml.hxx> #include <simgear/xml/easyxml.hxx>
#include <simgear/misc/ResourceManager.hxx>
#include "props.hxx" #include "props.hxx"
#include "props_io.hxx" #include "props_io.hxx"
@ -170,12 +171,15 @@ PropsVisitor::startElement (const char * name, const XMLAttributes &atts)
// Check for an include. // Check for an include.
attval = atts.getValue("include"); attval = atts.getValue("include");
if (attval != 0) { if (attval != 0) {
SGPath path(SGPath(_base).dir());
path.append(attval);
try { try {
readProperties(path.str(), _root, 0, _extended); SGPath path = simgear::ResourceManager::instance()->findPath(attval, SGPath(_base).dir());
if (path.isNull())
{
throw sg_io_exception("Cannot open file", sg_location(attval));
}
readProperties(path.str(), _root, 0, _extended);
} catch (sg_io_exception &e) { } catch (sg_io_exception &e) {
setException(e); setException(e);
} }
} }
@ -242,12 +246,15 @@ PropsVisitor::startElement (const char * name, const XMLAttributes &atts)
bool omit = false; bool omit = false;
attval = atts.getValue("include"); attval = atts.getValue("include");
if (attval != 0) { if (attval != 0) {
SGPath path(SGPath(_base).dir());
path.append(attval);
try { try {
readProperties(path.str(), node, 0, _extended); SGPath path = simgear::ResourceManager::instance()->findPath(attval, SGPath(_base).dir());
if (path.isNull())
{
throw sg_io_exception("Cannot open file", sg_location(attval));
}
readProperties(path.str(), node, 0, _extended);
} catch (sg_io_exception &e) { } catch (sg_io_exception &e) {
setException(e); setException(e);
} }
attval = atts.getValue("omit-node"); attval = atts.getValue("omit-node");