X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fpackage%2FPackage.cxx;h=b32e2fc3137a132997d95136005046b1e2043cc0;hb=a3f1bb546fec72b07f11f69934e6894696fea57a;hp=d0e8a3cb7c28bf2c15ee72ddd2eefdff3688a478;hpb=67a8d8049f20b6a11260aff1b254ec6405102a6e;p=simgear.git diff --git a/simgear/package/Package.cxx b/simgear/package/Package.cxx index d0e8a3cb..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 @@ -53,7 +61,9 @@ bool Package::matches(const SGPropertyNode* aFilter) const int nChildren = aFilter->nChildren(); for (int i = 0; i < nChildren; i++) { const SGPropertyNode* c = aFilter->getChild(i); - if (strutils::starts_with(c->getName(), "rating-")) { + const std::string& filter_name = c->getNameString(); + + if (strutils::starts_with(filter_name, "rating-")) { int minRating = c->getIntValue(); std::string rname = c->getName() + 7; int ourRating = m_props->getChild("rating")->getIntValue(rname, 0); @@ -61,17 +71,15 @@ bool Package::matches(const SGPropertyNode* aFilter) const return false; } } - - if (strcmp(c->getName(), "tag") == 0) { + else if (filter_name == "tag") { std::string tag(c->getStringValue()); boost::to_lower(tag); if (m_tags.find(tag) == m_tags.end()) { return false; } } - // substring search of name, description - if (strcmp(c->getName(), "name") == 0) { + else if (filter_name == "name") { std::string n(c->getStringValue()); boost::to_lower(n); size_t pos = boost::to_lower_copy(name()).find(n); @@ -79,8 +87,7 @@ bool Package::matches(const SGPropertyNode* aFilter) const return false; } } - - if (strcmp(c->getName(), "description") == 0) { + else if (filter_name == "description") { std::string n(c->getStringValue()); boost::to_lower(n); size_t pos = boost::to_lower_copy(description()).find(n); @@ -88,8 +95,13 @@ bool Package::matches(const SGPropertyNode* aFilter) const return false; } } - - SG_LOG(SG_GENERAL, SG_WARN, "unknown filter term:" << c->getName()); + 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 return true; @@ -97,31 +109,67 @@ bool Package::matches(const SGPropertyNode* aFilter) const bool Package::isInstalled() const { - SGPath p(m_catalog->installRoot()); - p.append("Aircraft"); - p.append(id()); - // anything to check for? look for a valid revision file? - return p.exists(); + return pathOnDisk().exists(); } -InstallRef Package::install() +SGPath Package::pathOnDisk() const { SGPath p(m_catalog->installRoot()); p.append("Aircraft"); - p.append(id()); - if (p.exists()) { - return Install::createFromPath(p, m_catalog); + p.append(dirName()); + return p; +} + +InstallRef Package::install() +{ + InstallRef ins = existingInstall(); + if (ins) { + return ins; } - - InstallRef ins(new Install(this, p)); + + // start a new install + ins = new Install(this, pathOnDisk()); m_catalog->root()->scheduleToUpdate(ins); + + _install_cb(this, ins); + return ins; } +InstallRef Package::existingInstall(const InstallCallback& cb) const +{ + 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 +{ + 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 @@ -129,8 +177,20 @@ 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"); } @@ -139,9 +199,19 @@ std::string Package::name() const return m_props->getStringValue("name"); } +size_t Package::fileSizeBytes() const +{ + return m_props->getIntValue("file-size-bytes"); +} + std::string Package::description() const { - return getLocalisedProp("decription"); + return getLocalisedProp("description"); +} + +string_set Package::tags() const +{ + return m_tags; } SGPropertyNode* Package::properties() const @@ -152,16 +222,37 @@ 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; - BOOST_FOREACH(SGPropertyNode* dl, m_props->getChildren("download")) { + if (!m_props) { + return r; + } + + BOOST_FOREACH(SGPropertyNode* dl, m_props->getChildren("url")) { r.push_back(dl->getStringValue()); } return r; @@ -195,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(); @@ -219,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