2013-11-16 14:22:34 +00:00
|
|
|
//
|
|
|
|
// AircraftDirVisitorBase.hxx - helper to traverse a heirarchy containing
|
|
|
|
// aircraft dirs
|
|
|
|
//
|
|
|
|
// Written by Curtis Olson, started August 1997.
|
|
|
|
//
|
|
|
|
// Copyright (C) 1997 Curtis L. Olson - http://www.flightgear.org/~curt
|
|
|
|
//
|
|
|
|
// This program is free software; you can redistribute it and/or
|
|
|
|
// modify it under the terms of the GNU General Public License as
|
|
|
|
// published by the Free Software Foundation; either version 2 of the
|
|
|
|
// License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful, but
|
|
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
// General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with this program; if not, write to the Free Software
|
|
|
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
//
|
|
|
|
|
|
|
|
#ifndef FG_MAIN_AIRCRAFT_DIR_VISITOR_HXX
|
|
|
|
#define FG_MAIN_AIRCRAFT_DIR_VISITOR_HXX
|
|
|
|
|
2017-02-20 00:19:13 +00:00
|
|
|
#include <simgear/misc/sg_dir.hxx>
|
|
|
|
#include <simgear/misc/sg_path.hxx>
|
|
|
|
|
|
|
|
#include <Main/globals.hxx>
|
|
|
|
|
2013-11-16 14:22:34 +00:00
|
|
|
class AircraftDirVistorBase
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
|
|
|
protected:
|
|
|
|
enum VisitResult {
|
|
|
|
VISIT_CONTINUE = 0,
|
|
|
|
VISIT_DONE,
|
|
|
|
VISIT_ERROR
|
|
|
|
};
|
|
|
|
|
|
|
|
AircraftDirVistorBase() :
|
|
|
|
_maxDepth(2)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
VisitResult visitAircraftPaths()
|
|
|
|
{
|
2017-02-20 00:19:13 +00:00
|
|
|
const simgear::PathList& paths(globals->get_aircraft_paths());
|
|
|
|
simgear::PathList::const_iterator it = paths.begin();
|
2013-11-16 14:22:34 +00:00
|
|
|
for (; it != paths.end(); ++it) {
|
2016-06-21 11:29:04 +00:00
|
|
|
VisitResult vr = visitDir(*it, 0);
|
2013-11-16 14:22:34 +00:00
|
|
|
if (vr != VISIT_CONTINUE) {
|
|
|
|
return vr;
|
|
|
|
}
|
|
|
|
} // of aircraft paths iteration
|
|
|
|
|
|
|
|
// if we reach this point, search the default location (always last)
|
|
|
|
SGPath rootAircraft(globals->get_fg_root());
|
|
|
|
rootAircraft.append("Aircraft");
|
|
|
|
return visitDir(rootAircraft, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
VisitResult visitPath(const SGPath& path, unsigned int depth)
|
|
|
|
{
|
|
|
|
if (!path.exists()) {
|
|
|
|
return VISIT_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
return visit(path);
|
|
|
|
}
|
|
|
|
|
|
|
|
VisitResult visitDir(const simgear::Dir& d, unsigned int depth)
|
|
|
|
{
|
|
|
|
if (!d.exists()) {
|
|
|
|
SG_LOG(SG_GENERAL, SG_WARN, "visitDir: no such path:" << d.path());
|
|
|
|
return VISIT_CONTINUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (depth >= _maxDepth) {
|
|
|
|
return VISIT_CONTINUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool recurse = true;
|
|
|
|
simgear::PathList setFiles(d.children(simgear::Dir::TYPE_FILE, "-set.xml"));
|
|
|
|
simgear::PathList::iterator p;
|
|
|
|
for (p = setFiles.begin(); p != setFiles.end(); ++p) {
|
|
|
|
|
|
|
|
// if we found a -set.xml at this level, don't recurse any deeper
|
|
|
|
recurse = false;
|
|
|
|
VisitResult vr = visit(*p);
|
|
|
|
if (vr != VISIT_CONTINUE) {
|
|
|
|
return vr;
|
|
|
|
}
|
|
|
|
} // of -set.xml iteration
|
|
|
|
|
|
|
|
if (!recurse) {
|
|
|
|
return VISIT_CONTINUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
simgear::PathList subdirs(d.children(simgear::Dir::TYPE_DIR | simgear::Dir::NO_DOT_OR_DOTDOT));
|
|
|
|
for (p = subdirs.begin(); p != subdirs.end(); ++p) {
|
|
|
|
VisitResult vr = visitDir(*p, depth + 1);
|
|
|
|
if (vr != VISIT_CONTINUE) {
|
|
|
|
return vr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return VISIT_CONTINUE;
|
|
|
|
} // of visitDir method
|
|
|
|
|
|
|
|
virtual VisitResult visit(const SGPath& path) = 0;
|
|
|
|
|
|
|
|
private:
|
|
|
|
unsigned int _maxDepth;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif // of FG_MAIN_AIRCRAFT_DIR_VISITOR_HXX
|