]> git.mxchange.org Git - flightgear.git/commitdiff
Convert --show-aircraft to use simgear::Dir
authorJames Turner <jmt@Dulux.local>
Mon, 5 Jul 2010 07:03:29 +0000 (08:03 +0100)
committerJames Turner <zakalawe@mac.com>
Sat, 17 Jul 2010 13:12:52 +0000 (14:12 +0100)
src/Main/options.cxx

index 2263a991ca1036e874889fa688ca235b8acdff6c..388a9c9b053dc87c08b569b31a0aabd8a0ad6488 100644 (file)
@@ -29,6 +29,7 @@
 #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>
@@ -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
 }
 
 /*