typedef nasal::Ghost<pkg::CatalogRef> NasalCatalog;
typedef nasal::Ghost<pkg::InstallRef> NasalInstall;
-#define ENABLE_PACKAGE_SYSTEM 1
-
namespace {
class FGDelegate : public pkg::Delegate
virtual void startInstall(pkg::Install* aInstall)
{
- SG_LOG(SG_IO, SG_INFO, "begining install of:" << aInstall->package()->id()
+ SG_LOG(SG_IO, SG_INFO, "beginning install of:" << aInstall->package()->id()
<< " to local path:" << aInstall->path());
}
} // of anonymous namespace
-FGHTTPClient::FGHTTPClient()
+FGHTTPClient::FGHTTPClient() :
+ _inited(false)
{
}
void FGHTTPClient::init()
{
+ // launcher may need to setup HTTP access abnormally early, so
+ // guard against duplicate inits
+ if (_inited) {
+ return;
+ }
+
_http.reset(new simgear::HTTP::Client);
std::string proxyHost(fgGetString("/sim/presets/proxy/host"));
_http->setProxy(proxyHost, proxyPort, proxyAuth);
}
-#ifdef ENABLE_PACKAGE_SYSTEM
pkg::Root* packageRoot = globals->packageRoot();
if (packageRoot) {
// package system needs access to the HTTP engine too
packageRoot->setHTTPClient(_http.get());
packageRoot->setDelegate(new FGDelegate);
-
+
+ const char * defaultCatalogId = fgGetString("/sim/package-system/default-catalog/id", "org.flightgear.default" );
+ const char * defaultCatalogUrl = fgGetString("/sim/package-system/default-catalog/url",
+ "http://fgfs.goneabitbursar.com/pkg/" FLIGHTGEAR_VERSION "/default-catalog.xml");
// setup default catalog if not present
- pkg::Catalog* defaultCatalog = packageRoot->getCatalogById("org.flightgear.default");
+ pkg::Catalog* defaultCatalog = packageRoot->getCatalogById( defaultCatalogId );
if (!defaultCatalog) {
// always show this message
- SG_LOG(SG_GENERAL, SG_ALERT, "default catalog not found, installing...");
- pkg::Catalog::createFromUrl(packageRoot,
- "http://fgfs.goneabitbursar.com/pkg/" FLIGHTGEAR_VERSION "/default-catalog.xml");
+ SG_LOG(SG_GENERAL, SG_ALERT, "default catalog not found, installing '"
+ << defaultCatalogId << "' from '" << defaultCatalogUrl << "'.");
+ pkg::Catalog::createFromUrl(packageRoot,defaultCatalogUrl);
}
// start a refresh now
packageRoot->refresh();
}
-#endif // of ENABLE_PACKAGE_SYSTEM
+
+ _inited = true;
+}
+
+static naRef f_package_existingInstall( pkg::Package& pkg,
+ const nasal::CallContext& ctx )
+{
+ return ctx.to_nasal(
+ pkg.existingInstall( ctx.getArg<pkg::Package::InstallCallback>(0) )
+ );
}
static naRef f_package_uninstall(pkg::Package& pkg, const nasal::CallContext& ctx)
void FGHTTPClient::postinit()
{
-#ifdef ENABLE_PACKAGE_SYSTEM
NasalPackageRoot::init("PackageRoot")
.member("path", &pkg::Root::path)
.member("version", &pkg::Root::catalogVersion)
.member("catalog", &pkg::Package::catalog)
.method("install", &pkg::Package::install)
.method("uninstall", &f_package_uninstall)
+ .method("existingInstall", &f_package_existingInstall)
.method("lprop", &pkg::Package::getLocalisedProp)
.member("fileSize", &pkg::Package::fileSizeBytes);
nasal::Hash nasalPkg = nasalGlobals.createHash("pkg"); // module
nasalPkg.set("root", packageRoot);
}
-#endif // of ENABLE_PACKAGE_SYSTEM
}
void FGHTTPClient::shutdown()