From 7e8d713b288c564c8b5f32059dd6d93a402212f9 Mon Sep 17 00:00:00 2001 From: James Turner Date: Sun, 15 Jun 2014 20:10:24 +0200 Subject: [PATCH] Pkg: initial support for Variants - 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 | 12 +++++++++--- src/Network/HTTPClient.cxx | 12 ++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx index 40d041d25..fb8774f0a 100644 --- a/src/Main/fg_init.cxx +++ b/src/Main/fg_init.cxx @@ -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 diff --git a/src/Network/HTTPClient.cxx b/src/Network/HTTPClient.cxx index 00bd0b3c1..bfab8284f 100644 --- a/src/Network/HTTPClient.cxx +++ b/src/Network/HTTPClient.cxx @@ -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) -- 2.39.5