From afa45240b08398bd7df66678fcd22349ceb0f3b5 Mon Sep 17 00:00:00 2001 From: James Turner Date: Tue, 10 Jun 2014 22:12:27 +0100 Subject: [PATCH] Packages: search from Nasal - also allow direct uninstallation. --- src/Network/HTTPClient.cxx | 54 +++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/src/Network/HTTPClient.cxx b/src/Network/HTTPClient.cxx index c6e2bfd7d..134c38f92 100644 --- a/src/Network/HTTPClient.cxx +++ b/src/Network/HTTPClient.cxx @@ -155,6 +155,51 @@ void FGHTTPClient::init() #endif // of ENABLE_PACKAGE_SYSTEM } +static naRef f_package_uninstall(pkg::Package& pkg, const nasal::CallContext& ctx) +{ + pkg::InstallRef ins = pkg.existingInstall(); + if (ins) { + ins->uninstall(); + } + + return naNil(); +} + +static SGPropertyNode_ptr queryPropsFromHash(const nasal::Hash& h) +{ + SGPropertyNode_ptr props(new SGPropertyNode); + string_list keys(h.keys()); + string_list::const_iterator it; + int tagCount = 0; + + for (it = keys.begin(); it != keys.end(); ++it) { + if ((*it == "name") || (*it == "description")) { + props->setStringValue(*it, h.get(*it)); + } else if (strutils::starts_with(*it, "rating-")) { + props->setIntValue(*it, h.get(*it)); + } else if (strutils::starts_with(*it, "tag-")) { + SGPropertyNode_ptr tag = props->getChild("tag", tagCount++, true); + tag->setStringValue(it->substr(4)); + } + } + + return props; +} + +static naRef f_root_search(pkg::Root& root, const nasal::CallContext& ctx) +{ + SGPropertyNode_ptr query = queryPropsFromHash(ctx.requireArg(0)); + pkg::PackageList result = root.packagesMatching(query); + return ctx.to_nasal(result); +} + +static naRef f_catalog_search(pkg::Catalog& cat, const nasal::CallContext& ctx) +{ + SGPropertyNode_ptr query = queryPropsFromHash(ctx.requireArg(0)); + pkg::PackageList result = cat.packagesMatching(query); + return ctx.to_nasal(result); +} + void FGHTTPClient::postinit() { #ifdef ENABLE_PACKAGE_SYSTEM @@ -164,8 +209,9 @@ void FGHTTPClient::postinit() .method("refresh", &pkg::Root::refresh) .method("catalogs", &pkg::Root::catalogs) .method("packageById", &pkg::Root::getPackageById) - .method("catalogById", &pkg::Root::getCatalogById); - + .method("catalogById", &pkg::Root::getCatalogById) + .method("search", &f_root_search); + NasalCatalog::init("Catalog") .member("installRoot", &pkg::Catalog::installRoot) .member("id", &pkg::Catalog::id) @@ -175,7 +221,8 @@ void FGHTTPClient::postinit() .method("packageById", &pkg::Catalog::getPackageById) .method("refresh", &pkg::Catalog::refresh) .method("needingUpdate", &pkg::Catalog::packagesNeedingUpdate) - .member("installed", &pkg::Catalog::installedPackages); + .member("installed", &pkg::Catalog::installedPackages) + .method("search", &f_catalog_search); NasalPackage::init("Package") .member("id", &pkg::Package::id) @@ -186,6 +233,7 @@ void FGHTTPClient::postinit() .member("revision", &pkg::Package::revision) .member("catalog", &pkg::Package::catalog) .method("install", &pkg::Package::install) + .method("uninstall", &f_package_uninstall) .method("lprop", &pkg::Package::getLocalisedProp); NasalInstall::init("Install")