diff --git a/simgear/package/Catalog.cxx b/simgear/package/Catalog.cxx index 5092b888..5b51b60c 100644 --- a/simgear/package/Catalog.cxx +++ b/simgear/package/Catalog.cxx @@ -198,9 +198,7 @@ private: ////////////////////////////////////////////////////////////////////////////// Catalog::Catalog(Root *aRoot) : - m_root(aRoot), - m_status(Delegate::FAIL_UNKNOWN), - m_retrievedTime(0) + m_root(aRoot) { } @@ -221,7 +219,7 @@ CatalogRef Catalog::createFromPath(Root* aRoot, const SGPath& aPath) SGPath xml = aPath; xml.append("catalog.xml"); if (!xml.exists()) { - return NULL; + return nullptr; } SGPropertyNode_ptr props; @@ -229,7 +227,7 @@ CatalogRef Catalog::createFromPath(Root* aRoot, const SGPath& aPath) props = new SGPropertyNode; readProperties(xml, props); } catch (sg_exception& ) { - return NULL; + return nullptr; } bool versionCheckOk = checkVersion(aRoot->applicationVersion(), props); @@ -240,19 +238,29 @@ CatalogRef Catalog::createFromPath(Root* aRoot, const SGPath& aPath) } else { SG_LOG(SG_GENERAL, SG_DEBUG, "creating catalog from:" << aPath); } + + // check for the marker file we write, to mark a catalog as disabled + const SGPath disableMarkerFile = aPath / "_disabled_"; CatalogRef c = new Catalog(aRoot); c->m_installRoot = aPath; + + if (disableMarkerFile.exists()) { + c->m_userEnabled = false; + } + c->parseProps(props); c->parseTimestamp(); if (!c->validatePackages()) { c->changeStatus(Delegate::FAIL_VALIDATION); - } else if (versionCheckOk) { + } else if (!versionCheckOk) { + c->changeStatus(Delegate::FAIL_VERSION); + } else if (!c->m_userEnabled) { + c->changeStatus(Delegate::USER_DISABLED); + } else { // parsed XML ok, mark status as valid c->changeStatus(Delegate::STATUS_SUCCESS); - } else { - c->changeStatus(Delegate::FAIL_VERSION); } return c; @@ -592,6 +600,9 @@ Delegate::StatusCode Catalog::status() const bool Catalog::isEnabled() const { + if (!m_userEnabled) + return false; + switch (m_status) { case Delegate::STATUS_SUCCESS: case Delegate::STATUS_REFRESHED: @@ -603,6 +614,36 @@ bool Catalog::isEnabled() const return false; } } + +bool Catalog::isUserEnabled() const +{ + return m_userEnabled; +} + +void Catalog::setUserEnabled(bool b) +{ + if (m_userEnabled == b) + return; + + m_userEnabled = b; + SGPath disableMarkerFile = installRoot() / "_disabled_"; + if (m_userEnabled) { + sg_ofstream of(disableMarkerFile); + of << "1\n"; // touch the file + } else { + bool ok = disableMarkerFile.remove(); + if (!ok) { + SG_LOG(SG_GENERAL, SG_ALERT, "Failed to remove catalog-disable marker file:" << disableMarkerFile); + } + } + + Delegate::StatusCode effectiveStatus = m_status; + if ((m_status == Delegate::STATUS_SUCCESS) && !m_userEnabled) { + effectiveStatus = Delegate::USER_DISABLED; + } + + m_root->catalogRefreshStatus(this, effectiveStatus); +} void Catalog::processAlternate(SGPropertyNode_ptr alt) { diff --git a/simgear/package/Catalog.hxx b/simgear/package/Catalog.hxx index f300690a..3bfe4065 100644 --- a/simgear/package/Catalog.hxx +++ b/simgear/package/Catalog.hxx @@ -150,6 +150,9 @@ public: { return addStatusCallback(boost::bind(mem_func, instance, _1)); } + + bool isUserEnabled() const; + void setUserEnabled(bool b); private: Catalog(Root* aRoot); @@ -185,11 +188,12 @@ private: SGPropertyNode_ptr m_props; SGPath m_installRoot; std::string m_url; - Delegate::StatusCode m_status; + Delegate::StatusCode m_status = Delegate::FAIL_UNKNOWN; HTTP::Request_ptr m_refreshRequest; - + bool m_userEnabled = true; + PackageList m_packages; - time_t m_retrievedTime; + time_t m_retrievedTime = 0; typedef std::map PackageWeakMap; PackageWeakMap m_variantDict; diff --git a/simgear/package/Delegate.hxx b/simgear/package/Delegate.hxx index 4f92abca..03b262fb 100644 --- a/simgear/package/Delegate.hxx +++ b/simgear/package/Delegate.hxx @@ -56,7 +56,8 @@ public: FAIL_HTTP_FORBIDDEN, ///< URL returned a 403. Marked specially to catch rate-limiting FAIL_VALIDATION, ///< catalog or package failed to validate STATUS_REFRESHED, - USER_CANCELLED + USER_CANCELLED, + USER_DISABLED } StatusCode;