1
0
Fork 0

Convert --show-aircraft to use simgear::Dir

This commit is contained in:
James Turner 2010-07-05 08:03:29 +01:00 committed by James Turner
parent 913726cb0e
commit 2c90eb8370

View file

@ -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);
} }
/* /*