]> git.mxchange.org Git - flightgear.git/blobdiff - src/Network/HTTPClient.cxx
New PathsDialog, for managing locations.
[flightgear.git] / src / Network / HTTPClient.cxx
index 9e6e07dedd7e15d4df3987eb0d9add0ad9203586..f60817877fa7018995dccb722039d5d79059ffda 100644 (file)
@@ -47,8 +47,6 @@ typedef nasal::Ghost<pkg::PackageRef> NasalPackage;
 typedef nasal::Ghost<pkg::CatalogRef> NasalCatalog;
 typedef nasal::Ghost<pkg::InstallRef> NasalInstall;
 
-// #define ENABLE_PACKAGE_SYSTEM 1
-
 namespace {
   
   class FGDelegate : public pkg::Delegate
@@ -84,7 +82,7 @@ public:
   
   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());
 
   }
@@ -112,7 +110,8 @@ public:
 
 } // of anonymous namespace
 
-FGHTTPClient::FGHTTPClient()
+FGHTTPClient::FGHTTPClient() :
+    _inited(false)
 {
 }
 
@@ -122,6 +121,12 @@ FGHTTPClient::~FGHTTPClient()
 
 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"));
@@ -132,27 +137,38 @@ void FGHTTPClient::init()
     _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)
@@ -183,6 +199,8 @@ static SGPropertyNode_ptr queryPropsFromHash(const nasal::Hash& h)
                 SGPropertyNode_ptr tag = props->getChild("tag", tagCount++, true);
                 tag->setStringValue(*tagIt);
             }
+        } else if (key == "installed") {
+            props->setBoolValue(key, it->getValue<bool>());
         } else {
             SG_LOG(SG_GENERAL, SG_WARN, "unknown filter term in hash:" << key);
         }
@@ -205,9 +223,19 @@ 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
   NasalPackageRoot::init("PackageRoot")
   .member("path", &pkg::Root::path)
   .member("version", &pkg::Root::catalogVersion)
@@ -235,11 +263,14 @@ 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)
   .method("uninstall", &f_package_uninstall)
-  .method("lprop", &pkg::Package::getLocalisedProp);
+  .method("existingInstall", &f_package_existingInstall)
+  .method("lprop", &pkg::Package::getLocalisedProp)
+  .member("fileSize", &pkg::Package::fileSizeBytes);
   
   typedef pkg::Install* (pkg::Install::*InstallCallback)
                         (const pkg::Install::Callback&);
@@ -264,7 +295,6 @@ void FGHTTPClient::postinit()
     nasal::Hash nasalPkg = nasalGlobals.createHash("pkg"); // module
     nasalPkg.set("root", packageRoot);
   }
-#endif // of ENABLE_PACKAGE_SYSTEM
 }
 
 void FGHTTPClient::shutdown()