aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xbmc/addons/AddonInstaller.cpp21
-rw-r--r--xbmc/addons/AddonInstaller.h10
2 files changed, 24 insertions, 7 deletions
diff --git a/xbmc/addons/AddonInstaller.cpp b/xbmc/addons/AddonInstaller.cpp
index b5ba7a0088..3e655bb829 100644
--- a/xbmc/addons/AddonInstaller.cpp
+++ b/xbmc/addons/AddonInstaller.cpp
@@ -313,6 +313,14 @@ void CAddonInstaller::InstallFromXBMCRepo(const set<CStdString> &addonIDs)
bool CAddonInstaller::CheckDependencies(const AddonPtr &addon)
{
+ std::vector<std::string> preDeps;
+ preDeps.push_back(addon->ID());
+ return CheckDependencies(addon, preDeps);
+}
+
+bool CAddonInstaller::CheckDependencies(const AddonPtr &addon,
+ std::vector<std::string>& preDeps)
+{
if (!addon.get())
return true; // a NULL addon has no dependencies
ADDONDEPS deps = addon->GetDeps();
@@ -333,16 +341,15 @@ bool CAddonInstaller::CheckDependencies(const AddonPtr &addon)
return false;
}
}
- // prevent infinite loops
- if (dep && dep->ID() == addon->ID())
- {
- CLog::Log(LOGERROR, "Addon %s depends on itself, ignoring", addon->ID().c_str());
- return false;
- }
// at this point we have our dep, or the dep is optional (and we don't have it) so check that it's OK as well
// TODO: should we assume that installed deps are OK?
- if (dep && !CheckDependencies(dep))
+ if (dep &&
+ std::find(preDeps.begin(), preDeps.end(), dep->ID()) == preDeps.end() &&
+ !CheckDependencies(dep, preDeps))
+ {
return false;
+ }
+ preDeps.push_back(dep->ID());
}
return true;
}
diff --git a/xbmc/addons/AddonInstaller.h b/xbmc/addons/AddonInstaller.h
index b0ff2bd8ad..5df69fbad8 100644
--- a/xbmc/addons/AddonInstaller.h
+++ b/xbmc/addons/AddonInstaller.h
@@ -122,6 +122,16 @@ private:
*/
bool DoInstall(const ADDON::AddonPtr &addon, const CStdString &hash = "", bool update = false, const CStdString &referer = "", bool background = true);
+ /*! \brief Check whether dependencies of an addon exist or are installable.
+ Iterates through the addon's dependencies, checking they're installed or installable.
+ Each dependency must also satisfies CheckDependencies in turn.
+ \param addon the addon to check
+ \param preDeps previous dependencies encountered during recursion. aids in avoiding infinite recursion
+ \return true if dependencies are available, false otherwise.
+ */
+ bool CheckDependencies(const ADDON::AddonPtr &addon,
+ std::vector<std::string>& preDeps);
+
void PrunePackageCache();
int64_t EnumeratePackageFolder(std::map<CStdString,CFileItemList*>& result);