diff --git a/xbmc/addons/AddonEvents.h b/xbmc/addons/AddonEvents.h index 9ac00ab49b78f..6ada929c7b5a1 100644 --- a/xbmc/addons/AddonEvents.h +++ b/xbmc/addons/AddonEvents.h @@ -71,5 +71,17 @@ namespace ADDON * @deprecated Use Enabled, ReInstalled and UnInstalled instead. */ struct InstalledChanged : AddonEvent {}; + + struct Load : AddonEvent + { + std::string id; + explicit Load(std::string id) : id(std::move(id)) {} + }; + + struct Unload : AddonEvent + { + std::string id; + explicit Unload(std::string id) : id(std::move(id)) {} + }; }; }; diff --git a/xbmc/addons/AddonManager.cpp b/xbmc/addons/AddonManager.cpp index b68c4ab96fc4e..1620ff09b47f0 100644 --- a/xbmc/addons/AddonManager.cpp +++ b/xbmc/addons/AddonManager.cpp @@ -706,6 +706,10 @@ bool CAddonMgr::UnloadAddon(const AddonPtr& addon) if (m_cpluff->uninstall_plugin(m_cp_context, addon->ID().c_str()) == CP_OK) { CLog::Log(LOGDEBUG, "CAddonMgr: %s unloaded", addon->ID().c_str()); + + lock.Leave(); + AddonEvents::Unload event(addon->ID()); + m_unloadEvents.HandleEvent(event); return true; } } @@ -737,6 +741,11 @@ bool CAddonMgr::LoadAddon(const std::string& addonId) return false; } + lock.Leave(); + + AddonEvents::Load event(addon->ID()); + m_unloadEvents.HandleEvent(event); + if (IsAddonDisabled(addon->ID())) { EnableAddon(addon->ID()); diff --git a/xbmc/addons/AddonManager.h b/xbmc/addons/AddonManager.h index 7ea9ad808695b..c7715aa7817f3 100644 --- a/xbmc/addons/AddonManager.h +++ b/xbmc/addons/AddonManager.h @@ -82,6 +82,7 @@ namespace ADDON virtual ~CAddonMgr(); CEventStream& Events() { return m_events; } + CEventStream& UnloadEvents() { return m_unloadEvents; } IAddonMgrCallback* GetCallbackForType(TYPE type); bool RegisterAddonMgrCallback(TYPE type, IAddonMgrCallback* cb); @@ -312,6 +313,7 @@ namespace ADDON CCriticalSection m_critSection; CAddonDatabase m_database; CEventSource m_events; + CBlockingEventSource m_unloadEvents; std::set m_systemAddons; std::set m_optionalAddons; };