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
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
{
SGPath p(m_catalog->installRoot());
p.append("Aircraft");
- p.append(id());
+ p.append(dirName());
return 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
+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
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");
}
std::string Package::description() const
{
- return getLocalisedProp("decription");
+ return getLocalisedProp("description");
+}
+
+string_set Package::tags() const
+{
+ return m_tags;
}
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());
}
// 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();
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