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
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);
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);
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);
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;
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<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");
}
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
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;
// 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