]> git.mxchange.org Git - flightgear.git/commitdiff
Pkg: initial support for Variants
authorJames Turner <zakalawe@mac.com>
Sun, 15 Jun 2014 18:10:24 +0000 (20:10 +0200)
committerJames Turner <zakalawe@mac.com>
Sun, 15 Jun 2014 18:10:24 +0000 (20:10 +0200)
- aircraft init code can deal with a variant ID
- Nasal API can return a hash with variant IDs and names

src/Main/fg_init.cxx
src/Network/HTTPClient.cxx

index 40d041d252d302f845ba04c20a4586dc5663064f..fb8774f0a7129aab25d89ec6b16c5df848d5ff51 100644 (file)
@@ -523,7 +523,8 @@ int fgInitAircraft(bool reinit)
         flightgear::Options::sharedInstance()->initAircraft();
     }
 
-    PackageRef acftPackage = pkgRoot->getPackageById(aircraftProp->getStringValue());
+    string aircraftId(aircraftProp->getStringValue());
+    PackageRef acftPackage = pkgRoot->getPackageById(aircraftId);
     if (acftPackage) {
         if (acftPackage->isInstalled()) {
             SG_LOG(SG_GENERAL, SG_INFO, "Loading aircraft from package:" << acftPackage->qualifiedId());
@@ -538,15 +539,20 @@ int fgInitAircraft(bool reinit)
 
             // overwrite the fully qualified ID with the aircraft one, so the
             // code in FindAndCacheAircraft works as normal
+            // note since we may be using a variant, we can't use the package ID
+            size_t lastDot = aircraftId.rfind('.');
+            if (lastDot != std::string::npos) {
+                aircraftId = aircraftId.substr(lastDot + 1);
+                aircraftProp->setStringValue(aircraftId);
 
-            aircraftProp->setStringValue(acftPackage->id());
+            }
             // run the traditional-code path below
         } else {
 #if 0
             // naturally the better option would be to on-demand install it!
             flightgear::fatalMessageBox("Aircraft not installed",
                                         "Requested aircraft is not currently installed.",
-                                        aircraftProp->getStringValue());
+                                        aircraftId);
 
             return flightgear::FG_OPTIONS_ERROR;
 #endif
index 00bd0b3c155d319f00216870a145004439c3ddce..bfab8284f96506c66527f0a2654fbc80723701b6 100644 (file)
@@ -207,6 +207,17 @@ static naRef f_catalog_search(pkg::Catalog& cat, const nasal::CallContext& ctx)
     return ctx.to_nasal(result);
 }
 
+static naRef f_package_variants(pkg::Package& pack, naContext c)
+{
+    nasal::Hash h(c);
+    string_list vars(pack.variants());
+    for (string_list_iterator it  = vars.begin(); it != vars.end(); ++it) {
+        h.set(*it, pack.nameForVariant(*it));
+    }
+
+    return h.get_naRef();
+}
+
 void FGHTTPClient::postinit()
 {
 #ifdef ENABLE_PACKAGE_SYSTEM
@@ -237,6 +248,7 @@ void FGHTTPClient::postinit()
   .member("description", &pkg::Package::description)
   .member("installed", &pkg::Package::isInstalled)
   .member("thumbnails", &pkg::Package::thumbnailUrls)
+  .member("variants", &f_package_variants)
   .member("revision", &pkg::Package::revision)
   .member("catalog", &pkg::Package::catalog)
   .method("install", &pkg::Package::install)