Convert --show-aircraft to use simgear::Dir
This commit is contained in:
parent
913726cb0e
commit
2c90eb8370
1 changed files with 67 additions and 84 deletions
|
@ -29,6 +29,7 @@
|
||||||
#include <simgear/structure/exception.hxx>
|
#include <simgear/structure/exception.hxx>
|
||||||
#include <simgear/debug/logstream.hxx>
|
#include <simgear/debug/logstream.hxx>
|
||||||
#include <simgear/timing/sg_time.hxx>
|
#include <simgear/timing/sg_time.hxx>
|
||||||
|
#include <simgear/misc/sg_dir.hxx>
|
||||||
|
|
||||||
#include <math.h> // rint()
|
#include <math.h> // rint()
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -1863,6 +1864,10 @@ unsigned int getNumMaturity(const char * str)
|
||||||
// $FG_ROOT/data/Translations/string-default.xml
|
// $FG_ROOT/data/Translations/string-default.xml
|
||||||
const char* levels[] = {"alpha","beta","early-production","production"};
|
const char* levels[] = {"alpha","beta","early-production","production"};
|
||||||
|
|
||||||
|
if (!strcmp(str, "all")) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
for (size_t i=0; i<(sizeof(levels)/sizeof(levels[0]));i++)
|
for (size_t i=0; i<(sizeof(levels)/sizeof(levels[0]));i++)
|
||||||
if (strcmp(str,levels[i])==0)
|
if (strcmp(str,levels[i])==0)
|
||||||
return i;
|
return i;
|
||||||
|
@ -1874,92 +1879,70 @@ unsigned int getNumMaturity(const char * str)
|
||||||
static void fgSearchAircraft(const SGPath &path, string_list &aircraft,
|
static void fgSearchAircraft(const SGPath &path, string_list &aircraft,
|
||||||
bool recursive)
|
bool recursive)
|
||||||
{
|
{
|
||||||
|
if (!path.exists()) {
|
||||||
|
SG_LOG(SG_GENERAL, SG_WARN, "fgSearchAircraft: no such path:" << path.str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ulDirEnt* dire;
|
int requiredStatus = getNumMaturity(fgGetString("/sim/aircraft-min-status", "all"));
|
||||||
ulDir *dirp = ulOpenDir(path.str().c_str());
|
|
||||||
if (dirp == NULL) {
|
|
||||||
cerr << "Unable to open aircraft directory '" << path.str() << '\'' << endl;
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((dire = ulReadDir(dirp)) != NULL) {
|
simgear::Dir dir(path);
|
||||||
char *ptr;
|
simgear::PathList setFiles(dir.children(simgear::Dir::TYPE_FILE, "-set.xml"));
|
||||||
|
simgear::PathList::iterator p;
|
||||||
|
for (p = setFiles.begin(); p != setFiles.end(); ++p) {
|
||||||
|
// check file name ends with -set.xml
|
||||||
|
|
||||||
if (dire->d_isdir) {
|
SGPropertyNode root;
|
||||||
if (recursive && strcmp("CVS", dire->d_name)
|
try {
|
||||||
&& strcmp(".", dire->d_name) && strcmp("..", dire->d_name))
|
readProperties(p->str(), &root);
|
||||||
{
|
} catch (sg_exception& e) {
|
||||||
SGPath next = path;
|
continue;
|
||||||
next.append(dire->d_name);
|
}
|
||||||
|
|
||||||
fgSearchAircraft(next, aircraft, true);
|
int maturity = 0;
|
||||||
}
|
string descStr(" ");
|
||||||
} else if ((ptr = strstr(dire->d_name, "-set.xml")) && (ptr[8] == '\0')) {
|
descStr += path.file();
|
||||||
|
|
||||||
SGPath afile = path;
|
SGPropertyNode *node = root.getNode("sim");
|
||||||
afile.append(dire->d_name);
|
if (node) {
|
||||||
|
SGPropertyNode* desc = node->getNode("description");
|
||||||
|
// if a status tag is found, read it in
|
||||||
|
if (node->hasValue("status")) {
|
||||||
|
maturity = getNumMaturity(node->getStringValue("status"));
|
||||||
|
}
|
||||||
|
|
||||||
*ptr = '\0';
|
if (desc) {
|
||||||
|
if (descStr.size() <= 27+3) {
|
||||||
|
descStr.append(29+3-descStr.size(), ' ');
|
||||||
|
} else {
|
||||||
|
descStr += '\n';
|
||||||
|
descStr.append( 32, ' ');
|
||||||
|
}
|
||||||
|
descStr += desc->getStringValue();
|
||||||
|
}
|
||||||
|
} // of have 'sim' node
|
||||||
|
|
||||||
SGPropertyNode root;
|
if (maturity < requiredStatus) {
|
||||||
try {
|
continue;
|
||||||
readProperties(afile.str(), &root);
|
}
|
||||||
} catch (...) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
SGPropertyNode *desc = NULL;
|
// if we found a -set.xml at this level, don't recurse any deeper
|
||||||
SGPropertyNode *status = NULL;
|
recursive = false;
|
||||||
|
|
||||||
SGPropertyNode *node = root.getNode("sim");
|
aircraft.push_back(descStr);
|
||||||
if (node) {
|
} // of -set.xml iteration
|
||||||
desc = node->getNode("description");
|
|
||||||
// if a status tag is found, read it in
|
|
||||||
if (node->hasValue("status"))
|
|
||||||
status = node->getNode("status");
|
|
||||||
}
|
|
||||||
|
|
||||||
//additionally display status information where it is available
|
// recurse down if requested
|
||||||
|
if (recursive) {
|
||||||
|
simgear::PathList subdirs(dir.children(simgear::Dir::TYPE_DIR | simgear::Dir::NO_DOT_OR_DOTDOT));
|
||||||
|
for (p = subdirs.begin(); p != subdirs.end(); ++p) {
|
||||||
|
if (p->file() == "CVS") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
string descStr(" ");
|
fgSearchAircraft(*p, aircraft, recursive);
|
||||||
descStr += dire->d_name;
|
}
|
||||||
if (desc) {
|
} // of recursive case
|
||||||
if (descStr.size() <= 27+3) {
|
|
||||||
descStr.append(29+3-descStr.size(), ' ');
|
|
||||||
} else {
|
|
||||||
descStr += '\n';
|
|
||||||
descStr.append( 32, ' ');
|
|
||||||
}
|
|
||||||
descStr += desc->getStringValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
SGPropertyNode * required_status
|
|
||||||
= fgGetNode ("/sim/aircraft-min-status", true);
|
|
||||||
|
|
||||||
// If the node holds the value "all", then there wasn't any status
|
|
||||||
// level specified, so we simply go ahead and output ALL aircraft
|
|
||||||
if (strcmp(required_status->getStringValue(),"all")==0) {
|
|
||||||
aircraft.push_back(descStr);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// If the node doesn't hold "all" as its value, then we are supposed
|
|
||||||
// to show only aircraft meeting specific status (development status)
|
|
||||||
// requirements:
|
|
||||||
|
|
||||||
if (node->hasValue("status")) {
|
|
||||||
//Compare (minimally) required status level with actual aircraft status:
|
|
||||||
if ( getNumMaturity(status->getStringValue() ) >=
|
|
||||||
getNumMaturity(required_status->getStringValue() ) )
|
|
||||||
aircraft.push_back(descStr); }
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ulCloseDir(dirp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue