]> git.mxchange.org Git - simgear.git/blobdiff - simgear/package/Package.cxx
HTTP request cancellation
[simgear.git] / simgear / package / Package.cxx
index 4e01a26034b3167ce59ad4bda3d36e6a6f3175de..b32e2fc3137a132997d95136005046b1e2043cc0 100644 (file)
@@ -46,6 +46,14 @@ void Package::initWithProps(const SGPropertyNode* aProps)
       std::string t(c->getStringValue());
       m_tags.insert(boost::to_lower_copy(t));
     }
+
+    m_id = m_props->getStringValue("id");
+}
+
+void Package::updateFromProps(const SGPropertyNode* aProps)
+{
+    m_tags.clear();
+    initWithProps(aProps);
 }
 
 bool Package::matches(const SGPropertyNode* aFilter) const
@@ -87,6 +95,11 @@ bool Package::matches(const SGPropertyNode* aFilter) const
             return false;
           }
         }
+        else if (filter_name == "installed") {
+          if (isInstalled() != c->getBoolValue()) {
+            return false;
+          }
+        }
         else
           SG_LOG(SG_GENERAL, SG_WARN, "unknown filter term:" << filter_name);
     } // of filter props iteration
@@ -104,7 +117,7 @@ SGPath Package::pathOnDisk() const
 {
     SGPath p(m_catalog->installRoot());
     p.append("Aircraft");
-    p.append(id());
+    p.append(dirName());
     return p;
 }
 
@@ -118,17 +131,35 @@ InstallRef Package::install()
   // start a new install
     ins = new Install(this, pathOnDisk());
     m_catalog->root()->scheduleToUpdate(ins);
+
+    _install_cb(this, ins);
+
     return ins;
 }
 
-InstallRef Package::existingInstall() const
+InstallRef Package::existingInstall(const InstallCallback& cb) const
 {
-    return m_catalog->installForPackage(const_cast<Package*>(this));
+    InstallRef install;
+    try {
+        install = m_catalog->root()->existingInstallForPackage(const_cast<Package*>(this));
+    } catch (std::exception& e) {
+        return InstallRef();
+    }
+
+  if( cb )
+  {
+    _install_cb.push_back(cb);
+
+    if( install )
+      cb(const_cast<Package*>(this), install);
+  }
+
+  return install;
 }
 
 std::string Package::id() const
 {
-    return m_props->getStringValue("id");
+    return m_id;
 }
 
 std::string Package::qualifiedId() const
@@ -136,13 +167,30 @@ std::string Package::qualifiedId() const
     return m_catalog->id() + "." + id();
 }
 
+std::string Package::qualifiedVariantId(const unsigned int variantIndex) const
+{
+    return m_catalog->id() + "." + variants()[variantIndex];
+}
+
 std::string Package::md5() const
 {
     return m_props->getStringValue("md5");
 }
 
+std::string Package::dirName() const
+{
+    std::string r(m_props->getStringValue("dir"));
+    if (r.empty())
+        throw sg_exception("missing dir property on catalog package entry for " + m_id);
+    return r;
+}
+
 unsigned int Package::revision() const
 {
+    if (!m_props) {
+        return 0;
+    }
+    
     return m_props->getIntValue("revision");
 }
     
@@ -158,7 +206,12 @@ size_t Package::fileSizeBytes() const
   
 std::string Package::description() const
 {
-    return getLocalisedProp("decription");
+    return getLocalisedProp("description");
+}
+
+string_set Package::tags() const
+{
+    return m_tags;
 }
     
 SGPropertyNode* Package::properties() const
@@ -169,15 +222,36 @@ SGPropertyNode* Package::properties() const
 string_list Package::thumbnailUrls() const
 {
     string_list r;
+    if (!m_props) {
+        return r;
+    }
+    
     BOOST_FOREACH(SGPropertyNode* dl, m_props->getChildren("thumbnail")) {
         r.push_back(dl->getStringValue());
     }
     return r;
 }
 
+string_list Package::thumbnails() const
+{
+    string_list r;
+    if (!m_props) {
+        return r;
+    }
+    
+    BOOST_FOREACH(SGPropertyNode* dl, m_props->getChildren("thumbnail-path")) {
+        r.push_back(dl->getStringValue());
+    }
+    return r;
+}
+    
 string_list Package::downloadUrls() const
 {
     string_list r;
+    if (!m_props) {
+        return r;
+    }
+    
     BOOST_FOREACH(SGPropertyNode* dl, m_props->getChildren("url")) {
         r.push_back(dl->getStringValue());
     }
@@ -212,7 +286,7 @@ PackageList Package::dependencies() const
         
     // prefer local hangar package if possible, in case someone does something
     // silly with naming. Of course flightgear's aircraft search doesn't know
-    // about hanagrs, so names still need to be unique.
+    // about hangars, so names still need to be unique.
         PackageRef depPkg = m_catalog->getPackageById(depName);
         if (!depPkg) {   
             Root* rt = m_catalog->root();
@@ -236,6 +310,48 @@ PackageList Package::dependencies() const
     return result;
 }
 
+string_list Package::variants() const
+{
+    string_list result;
+    result.push_back(id());
+
+    BOOST_FOREACH(SGPropertyNode* var, m_props->getChildren("variant")) {
+        result.push_back(var->getStringValue("id"));
+    }
+
+    return result;
+}
+
+std::string Package::nameForVariant(const std::string& vid) const
+{
+    if (vid == id()) {
+        return name();
+    }
+
+    BOOST_FOREACH(SGPropertyNode* var, m_props->getChildren("variant")) {
+        if (vid == var->getStringValue("id")) {
+            return var->getStringValue("name");
+        }
+    }
+
+
+    throw sg_exception("Unknow variant +" + vid + " in package " + id());
+}
+
+std::string Package::nameForVariant(const unsigned int vIndex) const
+{
+    if (vIndex == 0)
+        return name();
+
+    // offset by minus one to allow for index 0 being the primary
+    SGPropertyNode_ptr var = m_props->getChild("variant", vIndex - 1);
+    if (var)
+        return var->getStringValue("name");
+
+    throw sg_exception("Unknow variant in package " + id());
+}
+
+
 } // of namespace pkg
 
 } // of namespace simgear