X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fpackage%2FPackage.cxx;h=b32e2fc3137a132997d95136005046b1e2043cc0;hb=a3f1bb546fec72b07f11f69934e6894696fea57a;hp=4e01a26034b3167ce59ad4bda3d36e6a6f3175de;hpb=edbfbd769eeee589773bdfda882223fb62cf2e6e;p=simgear.git diff --git a/simgear/package/Package.cxx b/simgear/package/Package.cxx index 4e01a260..b32e2fc3 100644 --- a/simgear/package/Package.cxx +++ b/simgear/package/Package.cxx @@ -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(this)); + InstallRef install; + try { + install = m_catalog->root()->existingInstallForPackage(const_cast(this)); + } catch (std::exception& e) { + return InstallRef(); + } + + if( cb ) + { + _install_cb.push_back(cb); + + if( install ) + cb(const_cast(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