From 2c90eb837064ff6b11ae5d5c7ff601ccc71d1cc7 Mon Sep 17 00:00:00 2001 From: James Turner Date: Mon, 5 Jul 2010 08:03:29 +0100 Subject: [PATCH] Convert --show-aircraft to use simgear::Dir --- src/Main/options.cxx | 151 +++++++++++++++++++------------------------ 1 file changed, 67 insertions(+), 84 deletions(-) diff --git a/src/Main/options.cxx b/src/Main/options.cxx index 2263a991c..388a9c9b0 100644 --- a/src/Main/options.cxx +++ b/src/Main/options.cxx @@ -29,6 +29,7 @@ #include #include #include +#include #include // rint() #include @@ -1863,6 +1864,10 @@ unsigned int getNumMaturity(const char * str) // $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; @@ -1874,92 +1879,70 @@ unsigned int getNumMaturity(const char * str) 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 } /* -- 2.39.2