#include <simgear/structure/exception.hxx>
#include <simgear/debug/logstream.hxx>
#include <simgear/timing/sg_time.hxx>
+#include <simgear/misc/sg_dir.hxx>
#include <math.h> // rint()
#include <stdio.h>
// $FG_ROOT/data/Translations/string-default.xml
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++)
if (strcmp(str,levels[i])==0)
return i;
static void fgSearchAircraft(const SGPath &path, string_list &aircraft,
bool recursive)
{
-
- ulDirEnt* dire;
- 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) {
- char *ptr;
-
- if (dire->d_isdir) {
- if (recursive && strcmp("CVS", dire->d_name)
- && strcmp(".", dire->d_name) && strcmp("..", dire->d_name))
- {
- SGPath next = path;
- next.append(dire->d_name);
-
- fgSearchAircraft(next, aircraft, true);
- }
- } else if ((ptr = strstr(dire->d_name, "-set.xml")) && (ptr[8] == '\0')) {
-
- SGPath afile = path;
- afile.append(dire->d_name);
-
- *ptr = '\0';
-
- SGPropertyNode root;
- try {
- readProperties(afile.str(), &root);
- } catch (...) {
- continue;
- }
-
- SGPropertyNode *desc = NULL;
- SGPropertyNode *status = NULL;
-
- SGPropertyNode *node = root.getNode("sim");
- if (node) {
- 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
-
- string descStr(" ");
- descStr += dire->d_name;
- if (desc) {
- 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 (!path.exists()) {
+ SG_LOG(SG_GENERAL, SG_WARN, "fgSearchAircraft: no such path:" << path.str());
+ return;
+ }
- 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); }
-
- }
+ int requiredStatus = getNumMaturity(fgGetString("/sim/aircraft-min-status", "all"));
+
+ simgear::Dir dir(path);
+ 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
+
+ SGPropertyNode root;
+ try {
+ readProperties(p->str(), &root);
+ } catch (sg_exception& e) {
+ continue;
+ }
+
+ int maturity = 0;
+ string descStr(" ");
+ descStr += path.file();
-
- }
- }
-
- ulCloseDir(dirp);
+ SGPropertyNode *node = root.getNode("sim");
+ 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"));
+ }
+
+ 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
+
+ if (maturity < requiredStatus) {
+ continue;
+ }
+
+ // if we found a -set.xml at this level, don't recurse any deeper
+ recursive = false;
+
+ aircraft.push_back(descStr);
+ } // of -set.xml iteration
+
+ // 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;
+ }
+
+ fgSearchAircraft(*p, aircraft, recursive);
+ }
+ } // of recursive case
}
/*