diff options
author | tamland <thomas.amland@gmail.com> | 2015-04-26 15:11:35 +0200 |
---|---|---|
committer | tamland <thomas.amland@gmail.com> | 2015-04-26 15:11:35 +0200 |
commit | 7dacc6e46d1b5c8c5af1edf641ff5a1b3faed9ac (patch) | |
tree | 4213dbafbffa3f2efa90d4718ce1d0b70aec7190 | |
parent | d24705108c405c7f0ea211b147979ef33b807f2a (diff) | |
parent | 1f4528d05872fe272af6e6e43929d2c2c7cee211 (diff) |
Merge pull request #6681 from tamland/addon_install_fixes
Cleanup addon (un)installing and enabling/disabling
28 files changed, 221 insertions, 242 deletions
diff --git a/xbmc/addons/Addon.cpp b/xbmc/addons/Addon.cpp index 2dd7f245e0..bf5c584934 100644 --- a/xbmc/addons/Addon.cpp +++ b/xbmc/addons/Addon.cpp @@ -20,6 +20,8 @@ #include "Addon.h" #include "AddonManager.h" +#include "addons/Service.h" +#include "ContextMenuManager.h" #include "settings/Settings.h" #include "filesystem/Directory.h" #include "filesystem/File.h" @@ -268,7 +270,6 @@ CAddon::CAddon(const cp_extension_t *ext) Props().libname = m_strLibName; BuildProfilePath(); m_userSettingsPath = URIUtils::AddFileToFolder(Profile(), "settings.xml"); - m_enabled = true; m_hasSettings = true; m_hasStrings = false; m_checkedStrings = false; @@ -279,7 +280,6 @@ CAddon::CAddon(const cp_extension_t *ext) CAddon::CAddon(const cp_plugin_info_t *plugin) : m_props(plugin) { - m_enabled = true; m_hasSettings = false; m_hasStrings = false; m_checkedStrings = true; @@ -294,7 +294,6 @@ CAddon::CAddon(const AddonProps &props) else m_strLibName = props.libname; BuildProfilePath(); m_userSettingsPath = URIUtils::AddFileToFolder(Profile(), "settings.xml"); - m_enabled = true; m_hasSettings = true; m_hasStrings = false; m_checkedStrings = false; @@ -313,7 +312,6 @@ CAddon::CAddon(const CAddon &rhs) BuildProfilePath(); m_userSettingsPath = URIUtils::AddFileToFolder(Profile(), "settings.xml"); m_strLibName = rhs.m_strLibName; - m_enabled = rhs.Enabled(); m_hasStrings = false; m_checkedStrings = false; } @@ -624,6 +622,79 @@ AddonVersion CAddon::GetDependencyVersion(const std::string &dependencyID) const return AddonVersion("0.0.0"); } +void OnEnabled(const std::string& id) +{ + // If the addon is a special, call enabled handler + AddonPtr addon; + if (CAddonMgr::Get().GetAddon(id, addon, ADDON_PVRDLL)) + return addon->OnEnabled(); + + if (CAddonMgr::Get().GetAddon(id, addon, ADDON_SERVICE)) + std::static_pointer_cast<CService>(addon)->Start(); + + if (CAddonMgr::Get().GetAddon(id, addon, ADDON_CONTEXT_ITEM)) + CContextMenuManager::Get().Register(std::static_pointer_cast<CContextItemAddon>(addon)); +} + +void OnDisabled(const std::string& id) +{ + AddonPtr addon; + if (CAddonMgr::Get().GetAddon(id, addon, ADDON_PVRDLL, false)) + return addon->OnDisabled(); + + if (CAddonMgr::Get().GetAddon(id, addon, ADDON_SERVICE, false)) + std::static_pointer_cast<CService>(addon)->Stop(); + + if (CAddonMgr::Get().GetAddon(id, addon, ADDON_CONTEXT_ITEM, false)) + CContextMenuManager::Get().Unregister(std::static_pointer_cast<CContextItemAddon>(addon)); +} + +void OnPreInstall(const AddonPtr& addon) +{ + //Before installing we need to stop/unregister any local addon + //that have this id, regardless of what the 'new' addon is. + AddonPtr localAddon; + if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_SERVICE)) + std::static_pointer_cast<CService>(localAddon)->Stop(); + + if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_CONTEXT_ITEM)) + CContextMenuManager::Get().Unregister(std::static_pointer_cast<CContextItemAddon>(localAddon)); + + //Fallback to the pre-install callback in the addon. + //BUG: If primary extension point have changed we're calling the wrong method. + addon->OnPreInstall(); +} + +void OnPostInstall(const AddonPtr& addon, bool update, bool modal) +{ + AddonPtr localAddon; + if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_SERVICE)) + std::static_pointer_cast<CService>(localAddon)->Start(); + + if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_CONTEXT_ITEM)) + CContextMenuManager::Get().Register(std::static_pointer_cast<CContextItemAddon>(localAddon)); + + addon->OnPostInstall(update, modal); +} + +void OnPreUnInstall(const AddonPtr& addon) +{ + AddonPtr localAddon; + if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_SERVICE)) + std::static_pointer_cast<CService>(localAddon)->Stop(); + + if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_CONTEXT_ITEM)) + CContextMenuManager::Get().Unregister(std::static_pointer_cast<CContextItemAddon>(localAddon)); + + addon->OnPreUnInstall(); +} + +void OnPostUnInstall(const AddonPtr& addon) +{ + addon->OnPostUnInstall(); +} + + /** * CAddonLibrary * diff --git a/xbmc/addons/Addon.h b/xbmc/addons/Addon.h index 2b726f851a..ca9cddba79 100644 --- a/xbmc/addons/Addon.h +++ b/xbmc/addons/Addon.h @@ -42,6 +42,13 @@ const std::string TranslateType(const TYPE &type, bool pretty=false); const std::string GetIcon(const TYPE &type); TYPE TranslateType(const std::string &string); +void OnEnabled(const std::string& id); +void OnDisabled(const std::string& id); +void OnPreInstall(const AddonPtr& addon); +void OnPostInstall(const AddonPtr& addon, bool update, bool modal); +void OnPreUnInstall(const AddonPtr& addon); +void OnPostUnInstall(const AddonPtr& addon); + class AddonProps : public ISerializable { public: @@ -145,7 +152,8 @@ public: AddonProps& Props() { return m_props; } const std::string ID() const { return m_props.id; } const std::string Name() const { return m_props.name; } - bool Enabled() const { return m_enabled; } + /*! This lies. Ask CAddonMgr */ + bool Enabled() const { return true; } virtual bool IsInUse() const { return false; }; const AddonVersion Version() const { return m_props.version; } const AddonVersion MinVersion() const { return m_props.minversion; } @@ -176,8 +184,6 @@ public: bool MeetsVersion(const AddonVersion &version) const; virtual bool ReloadSettings(); - void MarkAsDisabled() { m_enabled = false; } - /*! \brief callback for when this add-on is disabled. Use to perform any needed actions (e.g. stop a service) */ @@ -192,9 +198,8 @@ public: */ virtual AddonPtr GetRunningInstance() const { return AddonPtr(); } - /*! \brief callbacks for special install/uninstall behaviour */ - virtual bool OnPreInstall() { return false; }; - virtual void OnPostInstall(bool restart, bool update, bool modal) {}; + virtual void OnPreInstall() {}; + virtual void OnPostInstall(bool update, bool modal) {}; virtual void OnPreUnInstall() {}; virtual void OnPostUnInstall() {}; virtual bool CanInstall(const std::string& referer) { return true; } @@ -242,11 +247,6 @@ private: std::string m_userSettingsPath; void BuildProfilePath(); - virtual bool IsAddonLibrary() { return false; } - - void Enable() { LoadStrings(); m_enabled = true; } - void Disable() { m_enabled = false; ClearStrings();} - virtual bool LoadStrings(); virtual void ClearStrings(); @@ -255,7 +255,6 @@ private: bool m_hasSettings; std::string m_profile; - bool m_enabled; CLocalizeStrings m_strings; std::map<std::string, std::string> m_settings; }; @@ -269,7 +268,6 @@ public: virtual AddonPtr Clone() const; private: - virtual bool IsAddonLibrary() { return true; } TYPE SetAddonType(); const TYPE m_addonType; // addon type this library enhances }; diff --git a/xbmc/addons/AddonDatabase.cpp b/xbmc/addons/AddonDatabase.cpp index 4444cb2d9b..b470e7b453 100644 --- a/xbmc/addons/AddonDatabase.cpp +++ b/xbmc/addons/AddonDatabase.cpp @@ -640,33 +640,14 @@ bool CAddonDatabase::DisableAddon(const std::string &addonID, bool disable /* = { std::string sql = PrepareSQL("insert into disabled(id, addonID) values(NULL, '%s')", addonID.c_str()); m_pDS->exec(sql); - - // If the addon is a special, call the disabled handler - AddonPtr addon; - if ((CAddonMgr::Get().GetAddon(addonID, addon, ADDON_SERVICE, false) - || CAddonMgr::Get().GetAddon(addonID, addon, ADDON_PVRDLL, false) - || CAddonMgr::Get().GetAddon(addonID, addon, ADDON_CONTEXT_ITEM, false)) && addon) - addon->OnDisabled(); - return true; } return false; // already disabled or failed query } else { - bool disabled = IsAddonDisabled(addonID); //we need to know if service addon is running std::string sql = PrepareSQL("delete from disabled where addonID='%s'", addonID.c_str()); m_pDS->exec(sql); - - if (disabled) - { - // If the addon is a special, call the enabled handler - AddonPtr addon; - if ((CAddonMgr::Get().GetAddon(addonID, addon, ADDON_SERVICE, false) - || CAddonMgr::Get().GetAddon(addonID, addon, ADDON_PVRDLL, false) - || CAddonMgr::Get().GetAddon(addonID, addon, ADDON_CONTEXT_ITEM, false)) && addon) - addon->OnEnabled(); - } } return true; } @@ -714,6 +695,30 @@ bool CAddonDatabase::IsAddonDisabled(const std::string &addonID) return false; } +bool CAddonDatabase::GetDisabled(std::vector<std::string>& addons) +{ + try + { + if (NULL == m_pDB.get()) return false; + if (NULL == m_pDS.get()) return false; + + std::string sql = PrepareSQL("SELECT addonID FROM disabled"); + m_pDS->query(sql.c_str()); + while (!m_pDS->eof()) + { + addons.push_back(m_pDS->fv(0).get_asString()); + m_pDS->next(); + } + m_pDS->close(); + return true; + } + catch (...) + { + CLog::Log(LOGERROR, "%s failed", __FUNCTION__); + } + return false; +} + bool CAddonDatabase::IsSystemPVRAddonEnabled(const std::string &addonID) { std::string strWhereClause = PrepareSQL("addonID = '%s'", addonID.c_str()); diff --git a/xbmc/addons/AddonDatabase.h b/xbmc/addons/AddonDatabase.h index 2ebbef3022..4ece768126 100644 --- a/xbmc/addons/AddonDatabase.h +++ b/xbmc/addons/AddonDatabase.h @@ -36,6 +36,9 @@ public: bool GetAddon(const std::string& addonID, ADDON::AddonPtr& addon); bool GetAddons(ADDON::VECADDONS& addons, const ADDON::TYPE &type = ADDON::ADDON_UNKNOWN); + /*! Get the addon IDs that has been set to disabled */ + bool GetDisabled(std::vector<std::string>& addons); + /*! \brief grab the (largest) add-on version for an add-on */ ADDON::AddonVersion GetAddonVersion(const std::string &id); diff --git a/xbmc/addons/AddonInstaller.cpp b/xbmc/addons/AddonInstaller.cpp index 2af33a33fb..290d491a40 100644 --- a/xbmc/addons/AddonInstaller.cpp +++ b/xbmc/addons/AddonInstaller.cpp @@ -663,14 +663,24 @@ bool CAddonInstallJob::DoWork() } // run any pre-install functions - bool reloadAddon = OnPreInstall(); + ADDON::OnPreInstall(m_addon); // perform install if (!Install(installFrom, repoPtr)) return false; // run any post-install guff - OnPostInstall(reloadAddon); + if (!IsModal() && CSettings::Get().GetBool("general.addonnotifications")) + CGUIDialogKaiToast::QueueNotification(m_addon->Icon(), m_addon->Name(), + g_localizeStrings.Get(m_update ? 24065 : 24064), + TOAST_DISPLAY_TIME, false, TOAST_DISPLAY_TIME); + + ADDON::OnPostInstall(m_addon, m_update, IsModal()); + + //Clear addon from the disabled table + CAddonDatabase database; + database.Open(); + database.DisableAddon(m_addon->ID(), false); // and we're done! MarkFinished(); @@ -727,11 +737,6 @@ bool CAddonInstallJob::DoFileOperation(FileAction action, CFileItemList &items, return result; } -bool CAddonInstallJob::OnPreInstall() -{ - return m_addon->OnPreInstall(); -} - bool CAddonInstallJob::DeleteAddon(const std::string &addonFolder) { CFileItemList list; @@ -867,15 +872,6 @@ bool CAddonInstallJob::Install(const std::string &installFrom, const AddonPtr& r return true; } -void CAddonInstallJob::OnPostInstall(bool reloadAddon) -{ - if (!IsModal() && CSettings::Get().GetBool("general.addonnotifications")) - CGUIDialogKaiToast::QueueNotification(m_addon->Icon(), m_addon->Name(), - g_localizeStrings.Get(m_update ? 24065 : 24064), - TOAST_DISPLAY_TIME, false, TOAST_DISPLAY_TIME); - - m_addon->OnPostInstall(reloadAddon, m_update, IsModal()); -} void CAddonInstallJob::ReportInstallError(const std::string& addonID, const std::string& fileName, const std::string& message /* = "" */) { @@ -924,7 +920,7 @@ CAddonUnInstallJob::CAddonUnInstallJob(const AddonPtr &addon) bool CAddonUnInstallJob::DoWork() { - m_addon->OnPreUnInstall(); + ADDON::OnPreUnInstall(m_addon); AddonPtr repoPtr = CAddonInstallJob::GetRepoForAddon(m_addon); RepositoryPtr therepo = std::dynamic_pointer_cast<CRepository>(repoPtr); @@ -935,11 +931,21 @@ bool CAddonUnInstallJob::DoWork() if (!CDirectory::GetDirectory(s, dummy)) return false; } - else if (!DeleteAddon(m_addon->Path())) - return false; + else + { + //Unregister addon with the manager to ensure nothing tries + //to interact with it while we are uninstalling. + CAddonMgr::Get().UnregisterAddon(m_addon->ID()); - OnPostUnInstall(); + if (!DeleteAddon(m_addon->Path())) + { + CLog::Log(LOGERROR, "CAddonUnInstallJob[%s]: could not delete addon data.", m_addon->ID().c_str()); + return false; + } + } + ClearFavourites(); + ADDON::OnPostUnInstall(m_addon); return true; } @@ -953,7 +959,7 @@ bool CAddonUnInstallJob::DeleteAddon(const std::string &addonFolder) return CFileOperationJob::DoWork(); } -void CAddonUnInstallJob::OnPostUnInstall() +void CAddonUnInstallJob::ClearFavourites() { bool bSave = false; CFileItemList items; @@ -969,6 +975,4 @@ void CAddonUnInstallJob::OnPostUnInstall() if (bSave) CFavouritesDirectory::Save(items); - - m_addon->OnPostUnInstall(); } diff --git a/xbmc/addons/AddonInstaller.h b/xbmc/addons/AddonInstaller.h index aca93d89be..ede0e5c8ca 100644 --- a/xbmc/addons/AddonInstaller.h +++ b/xbmc/addons/AddonInstaller.h @@ -185,8 +185,8 @@ public: static bool GetAddonWithHash(const std::string& addonID, ADDON::AddonPtr& addon, std::string& hash); private: - bool OnPreInstall(); - void OnPostInstall(bool reloadAddon); + void OnPreInstall(); + void OnPostInstall(); bool Install(const std::string &installFrom, const ADDON::AddonPtr& repo = ADDON::AddonPtr()); bool DownloadPackage(const std::string &path, const std::string &dest); @@ -223,7 +223,7 @@ private: */ bool DeleteAddon(const std::string &addonFolder); - void OnPostUnInstall(); + void ClearFavourites(); ADDON::AddonPtr m_addon; }; diff --git a/xbmc/addons/AddonManager.cpp b/xbmc/addons/AddonManager.cpp index 47ab78cc5c..6159e7d700 100644 --- a/xbmc/addons/AddonManager.cpp +++ b/xbmc/addons/AddonManager.cpp @@ -17,10 +17,12 @@ * <http://www.gnu.org/licenses/>. * */ +#include <memory> #include "AddonManager.h" #include "Addon.h" #include "AudioEncoder.h" #include "AudioDecoder.h" +#include "ContextMenuManager.h" #include "DllLibCPluff.h" #include "LanguageResource.h" #include "UISoundsResource.h" @@ -318,6 +320,10 @@ bool CAddonMgr::Init() FindAddons(); + std::vector<std::string> disabled; + m_database.GetDisabled(disabled); + m_disabled.insert(disabled.begin(), disabled.end()); + VECADDONS repos; if (GetAddons(ADDON_REPOSITORY, repos)) { @@ -623,39 +629,57 @@ void CAddonMgr::FindAddons() NotifyObservers(ObservableMessageAddons); } -void CAddonMgr::RemoveAddon(const std::string& ID) +void CAddonMgr::UnregisterAddon(const std::string& ID) { + CSingleLock lock(m_critSection); + m_disabled.erase(ID); if (m_cpluff && m_cp_context) { - m_cpluff->uninstall_plugin(m_cp_context,ID.c_str()); + m_cpluff->uninstall_plugin(m_cp_context, ID.c_str()); SetChanged(); + lock.Leave(); NotifyObservers(ObservableMessageAddons); } } -bool CAddonMgr::DisableAddon(const std::string& ID, bool disable) +bool CAddonMgr::DisableAddon(const std::string& id) { CSingleLock lock(m_critSection); - if (m_database.DisableAddon(ID, disable)) - { - m_disabled[ID] = disable; - return true; - } + if (m_disabled.find(id) != m_disabled.end()) + return true; //already disabled - return false; + if (!CanAddonBeDisabled(id)) + return false; + if (!m_database.DisableAddon(id)) + return false; + if (!m_disabled.insert(id).second) + return false; + + //success + ADDON::OnDisabled(id); + return true; } -bool CAddonMgr::IsAddonDisabled(const std::string& ID) +bool CAddonMgr::EnableAddon(const std::string& id) { CSingleLock lock(m_critSection); - std::map<std::string, bool>::const_iterator it = m_disabled.find(ID); - if (it != m_disabled.end()) - return it->second; + if (m_disabled.find(id) == m_disabled.end()) + return true; //already enabled - bool ret = m_database.IsAddonDisabled(ID); - m_disabled.insert(pair<std::string, bool>(ID, ret)); + if (!m_database.DisableAddon(id, false)) + return false; + if (m_disabled.erase(id) == 0) + return false; - return ret; + //success + ADDON::OnEnabled(id); + return true; +} + +bool CAddonMgr::IsAddonDisabled(const std::string& ID) +{ + CSingleLock lock(m_critSection); + return m_disabled.find(ID) != m_disabled.end(); } bool CAddonMgr::CanAddonBeDisabled(const std::string& ID) @@ -666,7 +690,7 @@ bool CAddonMgr::CanAddonBeDisabled(const std::string& ID) CSingleLock lock(m_critSection); AddonPtr localAddon; // can't disable an addon that isn't installed - if (!IsAddonInstalled(ID, localAddon)) + if (!GetAddon(ID, localAddon, ADDON_UNKNOWN, false)) return false; // can't disable an addon that is in use @@ -688,12 +712,7 @@ bool CAddonMgr::CanAddonBeDisabled(const std::string& ID) bool CAddonMgr::IsAddonInstalled(const std::string& ID) { AddonPtr tmp; - return IsAddonInstalled(ID, tmp); -} - -bool CAddonMgr::IsAddonInstalled(const std::string& ID, AddonPtr& addon) -{ - return GetAddon(ID, addon, ADDON_UNKNOWN, false); + return GetAddon(ID, tmp, ADDON_UNKNOWN, false); } bool CAddonMgr::CanAddonBeInstalled(const std::string& ID) diff --git a/xbmc/addons/AddonManager.h b/xbmc/addons/AddonManager.h index dde5395112..8c4c74b8b1 100644 --- a/xbmc/addons/AddonManager.h +++ b/xbmc/addons/AddonManager.h @@ -112,15 +112,13 @@ namespace ADDON std::string GetTranslatedString(const cp_cfg_element_t *root, const char *tag); static AddonPtr AddonFromProps(AddonProps& props); void FindAddons(); - void RemoveAddon(const std::string& ID); + void UnregisterAddon(const std::string& ID); - /* \brief Disable an addon - Triggers the database routine and saves the current addon state to cache. - \param ID id of the addon - \param disable whether to enable or disable. Defaults to true (disable) - \sa IsAddonDisabled, - */ - bool DisableAddon(const std::string& ID, bool disable = true); + /*! \brief Disable an addon. Returns true on success, false on failure. */ + bool DisableAddon(const std::string& ID); + + /*! \brief Enable an addon. Returns true on success, false on failure. */ + bool EnableAddon(const std::string& ID); /* \brief Check whether an addon has been disabled via DisableAddon. In case the disabled cache does not know about the current state the database routine will be used. @@ -140,12 +138,6 @@ namespace ADDON */ bool IsAddonInstalled(const std::string& ID); - /* \brief Checks whether an addon is installed. - \param ID id of the addon - \param addon Installed addon - */ - bool IsAddonInstalled(const std::string& ID, AddonPtr& addon); - /* \brief Checks whether an addon can be installed. Broken addons can't be installed. \param ID id of the addon */ @@ -251,7 +243,7 @@ namespace ADDON CAddonMgr const& operator=(CAddonMgr const&); virtual ~CAddonMgr(); - std::map<std::string, bool> m_disabled; + std::set<std::string> m_disabled; static std::map<TYPE, IAddonMgrCallback*> m_managers; CCriticalSection m_critSection; CAddonDatabase m_database; diff --git a/xbmc/addons/AddonStatusHandler.cpp b/xbmc/addons/AddonStatusHandler.cpp index 7bb874a4dd..480bab95b5 100644 --- a/xbmc/addons/AddonStatusHandler.cpp +++ b/xbmc/addons/AddonStatusHandler.cpp @@ -155,7 +155,6 @@ void CAddonStatusHandler::Process() /* A unknown event has occurred */ else if (m_status == ADDON_STATUS_UNKNOWN) { - //CAddonMgr::Get().DisableAddon(m_addon->ID()); CGUIDialogOK* pDialog = (CGUIDialogOK*)g_windowManager.GetWindow(WINDOW_DIALOG_OK); if (!pDialog) return; diff --git a/xbmc/addons/ContextItemAddon.cpp b/xbmc/addons/ContextItemAddon.cpp index ceefc4e705..d36d997229 100644 --- a/xbmc/addons/ContextItemAddon.cpp +++ b/xbmc/addons/ContextItemAddon.cpp @@ -63,40 +63,6 @@ CContextItemAddon::CContextItemAddon(const cp_extension_t *ext) } } -bool CContextItemAddon::OnPreInstall() -{ - return CContextMenuManager::Get().Unregister(std::dynamic_pointer_cast<CContextItemAddon>(shared_from_this())); -} - -void CContextItemAddon::OnPostInstall(bool restart, bool update, bool modal) -{ - if (restart) - { - // need to grab the local addon so we have the correct library path to run - AddonPtr localAddon; - if (CAddonMgr::Get().GetAddon(ID(), localAddon, ADDON_CONTEXT_ITEM)) - { - ContextItemAddonPtr contextItem = std::dynamic_pointer_cast<CContextItemAddon>(localAddon); - if (contextItem) - CContextMenuManager::Get().Register(contextItem); - } - } -} - -void CContextItemAddon::OnPreUnInstall() -{ - CContextMenuManager::Get().Unregister(std::dynamic_pointer_cast<CContextItemAddon>(shared_from_this())); -} - -void CContextItemAddon::OnDisabled() -{ - CContextMenuManager::Get().Unregister(std::dynamic_pointer_cast<CContextItemAddon>(shared_from_this())); -} -void CContextItemAddon::OnEnabled() -{ - CContextMenuManager::Get().Register(std::dynamic_pointer_cast<CContextItemAddon>(shared_from_this())); -} - bool CContextItemAddon::IsVisible(const CFileItemPtr& item) const { return item && m_visCondition->Get(item.get()); diff --git a/xbmc/addons/ContextItemAddon.h b/xbmc/addons/ContextItemAddon.h index 32b2a298eb..376405a4e8 100644 --- a/xbmc/addons/ContextItemAddon.h +++ b/xbmc/addons/ContextItemAddon.h @@ -56,12 +56,6 @@ namespace ADDON */ bool IsVisible(const CFileItemPtr& item) const; - virtual bool OnPreInstall(); - virtual void OnPostInstall(bool restart, bool update, bool modal); - virtual void OnPreUnInstall(); - virtual void OnDisabled(); - virtual void OnEnabled(); - private: std::string m_label; std::string m_parent; diff --git a/xbmc/addons/GUIDialogAddonInfo.cpp b/xbmc/addons/GUIDialogAddonInfo.cpp index bc63037171..db61b2c314 100644 --- a/xbmc/addons/GUIDialogAddonInfo.cpp +++ b/xbmc/addons/GUIDialogAddonInfo.cpp @@ -240,12 +240,8 @@ void CGUIDialogAddonInfo::OnUninstall() if (!CGUIDialogYesNo::ShowAndGetInput(24037, 750, 0, 0)) return; - // ensure the addon isn't disabled in our database - CAddonMgr::Get().DisableAddon(m_localAddon->ID(), false); - CJobManager::GetInstance().AddJob(new CAddonUnInstallJob(m_localAddon), &CAddonInstaller::Get()); - CAddonMgr::Get().RemoveAddon(m_localAddon->ID()); Close(); } @@ -260,7 +256,10 @@ void CGUIDialogAddonInfo::OnEnable(bool enable) if (!enable && PromptIfDependency(24075, 24091)) return; - CAddonMgr::Get().DisableAddon(m_localAddon->ID(), !enable); + if (enable) + CAddonMgr::Get().EnableAddon(m_localAddon->ID()); + else + CAddonMgr::Get().DisableAddon(m_localAddon->ID()); SetItem(m_item); UpdateControls(); g_windowManager.SendMessage(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE); @@ -332,10 +331,12 @@ void CGUIDialogAddonInfo::OnRollback() database.BlacklistAddon(m_localAddon->ID(),m_rollbackVersions[j]); std::string path = "special://home/addons/packages/"; path += m_localAddon->ID()+"-"+m_rollbackVersions[choice]+".zip"; + + //FIXME: this is probably broken // needed as cpluff won't downgrade if (!m_localAddon->IsType(ADDON_SERVICE)) //we will handle this for service addons in CAddonInstallJob::OnPostInstall - CAddonMgr::Get().RemoveAddon(m_localAddon->ID()); + CAddonMgr::Get().UnregisterAddon(m_localAddon->ID()); CAddonInstaller::Get().InstallFromZip(path); database.RemoveAddonFromBlacklist(m_localAddon->ID(),m_rollbackVersions[choice]); Close(); diff --git a/xbmc/addons/GUIWindowAddonBrowser.cpp b/xbmc/addons/GUIWindowAddonBrowser.cpp index 483664e314..7991871ec2 100644 --- a/xbmc/addons/GUIWindowAddonBrowser.cpp +++ b/xbmc/addons/GUIWindowAddonBrowser.cpp @@ -653,7 +653,7 @@ int CGUIWindowAddonBrowser::SelectAddonID(const vector<ADDON::TYPE> &types, vect // if the addon is disabled we need to enable it if (CAddonMgr::Get().IsAddonDisabled(addon->ID())) - CAddonMgr::Get().DisableAddon(addon->ID(), false); + CAddonMgr::Get().EnableAddon(addon->ID()); } } diff --git a/xbmc/addons/IAddon.h b/xbmc/addons/IAddon.h index 82a509cd56..7e22a1e0d6 100644 --- a/xbmc/addons/IAddon.h +++ b/xbmc/addons/IAddon.h @@ -120,8 +120,8 @@ namespace ADDON virtual void OnDisabled() =0; virtual void OnEnabled() =0; virtual AddonPtr GetRunningInstance() const=0; - virtual bool OnPreInstall() =0; - virtual void OnPostInstall(bool restart, bool update, bool modal) =0; + virtual void OnPreInstall() =0; + virtual void OnPostInstall(bool update, bool modal) =0; virtual void OnPreUnInstall() =0; virtual void OnPostUnInstall() =0; virtual bool CanInstall(const std::string& referer) =0; @@ -131,9 +131,6 @@ namespace ADDON private: friend class CAddonMgr; - virtual bool IsAddonLibrary() =0; - virtual void Enable() =0; - virtual void Disable() =0; virtual bool LoadStrings() =0; virtual void ClearStrings() =0; }; diff --git a/xbmc/addons/LanguageResource.cpp b/xbmc/addons/LanguageResource.cpp index 8d24edc6ea..6581ab63ae 100644 --- a/xbmc/addons/LanguageResource.cpp +++ b/xbmc/addons/LanguageResource.cpp @@ -108,14 +108,9 @@ bool CLanguageResource::IsInUse() const return StringUtils::EqualsNoCase(CSettings::Get().GetString(LANGUAGE_SETTING), ID()); } -bool CLanguageResource::OnPreInstall() +void CLanguageResource::OnPostInstall(bool update, bool modal) { - return IsInUse(); -} - -void CLanguageResource::OnPostInstall(bool restart, bool update, bool modal) -{ - if (restart || + if (IsInUse() || (!update && !modal && CGUIDialogYesNo::ShowAndGetInput(Name(), g_localizeStrings.Get(24132), "", ""))) { CGUIDialogKaiToast *toast = (CGUIDialogKaiToast *)g_windowManager.GetWindow(WINDOW_DIALOG_KAI_TOAST); diff --git a/xbmc/addons/LanguageResource.h b/xbmc/addons/LanguageResource.h index 840c47a77e..9cc7ea23e2 100644 --- a/xbmc/addons/LanguageResource.h +++ b/xbmc/addons/LanguageResource.h @@ -40,8 +40,7 @@ public: virtual bool IsInUse() const; - virtual bool OnPreInstall(); - virtual void OnPostInstall(bool restart, bool update, bool modal); + virtual void OnPostInstall(bool update, bool modal); virtual bool IsAllowed(const std::string &file) const; diff --git a/xbmc/addons/Repository.cpp b/xbmc/addons/Repository.cpp index e65a19595a..de08385ced 100644 --- a/xbmc/addons/Repository.cpp +++ b/xbmc/addons/Repository.cpp @@ -193,14 +193,6 @@ bool CRepository::Parse(const DirInfo& dir, VECADDONS &result) return false; } -void CRepository::OnPostInstall(bool restart, bool update, bool modal) -{ - VECADDONS addons; - AddonPtr repo(new CRepository(*this)); - addons.push_back(repo); - CJobManager::GetInstance().AddJob(new CRepositoryUpdateJob(addons), &CAddonInstaller::Get()); -} - void CRepository::OnPostUnInstall() { CAddonDatabase database; diff --git a/xbmc/addons/Repository.h b/xbmc/addons/Repository.h index 5120c38b87..a3ec1f4059 100644 --- a/xbmc/addons/Repository.h +++ b/xbmc/addons/Repository.h @@ -58,7 +58,6 @@ namespace ADDON static bool Parse(const DirInfo& dir, VECADDONS& addons); static std::string FetchChecksum(const std::string& url); - virtual void OnPostInstall(bool restart, bool update, bool modal); virtual void OnPostUnInstall(); private: diff --git a/xbmc/addons/Service.cpp b/xbmc/addons/Service.cpp index 2fc7670a14..e9827cb3a2 100644 --- a/xbmc/addons/Service.cpp +++ b/xbmc/addons/Service.cpp @@ -113,46 +113,4 @@ void CService::BuildServiceType() } } -void CService::OnDisabled() -{ - Stop(); -} - -void CService::OnEnabled() -{ - Start(); -} - -bool CService::OnPreInstall() -{ - // make sure the addon is stopped - AddonPtr localAddon; // need to grab the local addon so we have the correct library path to stop - if (CAddonMgr::Get().GetAddon(ID(), localAddon, ADDON_SERVICE, false)) - { - std::shared_ptr<CService> service = std::dynamic_pointer_cast<CService>(localAddon); - if (service) - service->Stop(); - } - return !CAddonMgr::Get().IsAddonDisabled(ID()); -} - -void CService::OnPostInstall(bool restart, bool update, bool modal) -{ - if (restart) // reload/start it if it was running - { - AddonPtr localAddon; // need to grab the local addon so we have the correct library path to stop - if (CAddonMgr::Get().GetAddon(ID(), localAddon, ADDON_SERVICE, false)) - { - std::shared_ptr<CService> service = std::dynamic_pointer_cast<CService>(localAddon); - if (service) - service->Start(); - } - } -} - -void CService::OnPreUnInstall() -{ - Stop(); -} - } diff --git a/xbmc/addons/Service.h b/xbmc/addons/Service.h index f7394de6cc..0fe62033d4 100644 --- a/xbmc/addons/Service.h +++ b/xbmc/addons/Service.h @@ -47,11 +47,6 @@ namespace ADDON bool Stop(); TYPE GetServiceType() { return m_type; } START_OPTION GetStartOption() { return m_startOption; } - virtual void OnDisabled(); - virtual void OnEnabled(); - virtual bool OnPreInstall(); - virtual void OnPostInstall(bool restart, bool update, bool modal); - virtual void OnPreUnInstall(); protected: void BuildServiceType(); diff --git a/xbmc/addons/Skin.cpp b/xbmc/addons/Skin.cpp index 366e1265ab..c68e7712f2 100644 --- a/xbmc/addons/Skin.cpp +++ b/xbmc/addons/Skin.cpp @@ -276,20 +276,15 @@ const INFO::CSkinVariableString* CSkinInfo::CreateSkinVariable(const std::string return m_includes.CreateSkinVariable(name, context); } -bool CSkinInfo::OnPreInstall() +void CSkinInfo::OnPreInstall() { - // check whether this is an active skin - we need to unload it if so if (IsInUse()) - { CApplicationMessenger::Get().ExecBuiltIn("UnloadSkin", true); - return true; - } - return false; } -void CSkinInfo::OnPostInstall(bool restart, bool update, bool modal) +void CSkinInfo::OnPostInstall(bool update, bool modal) { - if (restart || (!update && !modal && CGUIDialogYesNo::ShowAndGetInput(Name(), g_localizeStrings.Get(24099),"",""))) + if (IsInUse() || (!update && !modal && CGUIDialogYesNo::ShowAndGetInput(Name(), g_localizeStrings.Get(24099),"",""))) { CGUIDialogKaiToast *toast = (CGUIDialogKaiToast *)g_windowManager.GetWindow(WINDOW_DIALOG_KAI_TOAST); if (toast) diff --git a/xbmc/addons/Skin.h b/xbmc/addons/Skin.h index 42bddf8210..dd92a16fe4 100644 --- a/xbmc/addons/Skin.h +++ b/xbmc/addons/Skin.h @@ -118,8 +118,8 @@ public: static void SettingOptionsSkinThemesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data); static void SettingOptionsStartupWindowsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); - virtual bool OnPreInstall(); - virtual void OnPostInstall(bool restart, bool update, bool modal); + virtual void OnPreInstall(); + virtual void OnPostInstall(bool update, bool modal); protected: /*! \brief Given a resolution, retrieve the corresponding directory name \param res RESOLUTION to translate diff --git a/xbmc/addons/UISoundsResource.cpp b/xbmc/addons/UISoundsResource.cpp index a1b91ae666..840f56f22b 100644 --- a/xbmc/addons/UISoundsResource.cpp +++ b/xbmc/addons/UISoundsResource.cpp @@ -43,7 +43,7 @@ bool CUISoundsResource::IsInUse() const return CSettings::Get().GetString("lookandfeel.soundskin") == ID(); } -void CUISoundsResource::OnPostInstall(bool restart, bool update, bool modal) +void CUISoundsResource::OnPostInstall(bool update, bool modal) { if (IsInUse()) g_audioManager.Load(); diff --git a/xbmc/addons/UISoundsResource.h b/xbmc/addons/UISoundsResource.h index 68567cecd7..0e36ed4c19 100644 --- a/xbmc/addons/UISoundsResource.h +++ b/xbmc/addons/UISoundsResource.h @@ -35,7 +35,7 @@ public: virtual bool IsAllowed(const std::string &file) const; virtual bool IsInUse() const; - virtual void OnPostInstall(bool restart, bool update, bool modal); + virtual void OnPostInstall(bool update, bool modal); private: CUISoundsResource(const CUISoundsResource &rhs) : CResource(rhs) {} diff --git a/xbmc/interfaces/json-rpc/AddonsOperations.cpp b/xbmc/interfaces/json-rpc/AddonsOperations.cpp index 390351f6b7..9a13c0188a 100644 --- a/xbmc/interfaces/json-rpc/AddonsOperations.cpp +++ b/xbmc/interfaces/json-rpc/AddonsOperations.cpp @@ -152,10 +152,8 @@ JSONRPC_STATUS CAddonsOperations::SetAddonEnabled(const std::string &method, ITr else return InvalidParams; - if (!CAddonMgr::Get().DisableAddon(id, disabled)) - return InvalidParams; - - return ACK; + bool success = disabled ? CAddonMgr::Get().DisableAddon(id) : CAddonMgr::Get().EnableAddon(id); + return success ? ACK : InvalidParams; } JSONRPC_STATUS CAddonsOperations::ExecuteAddon(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) diff --git a/xbmc/pvr/addons/PVRClient.cpp b/xbmc/pvr/addons/PVRClient.cpp index 5157bda1f4..78face68bb 100644 --- a/xbmc/pvr/addons/PVRClient.cpp +++ b/xbmc/pvr/addons/PVRClient.cpp @@ -95,14 +95,13 @@ AddonPtr CPVRClient::GetRunningInstance() const return CAddon::GetRunningInstance(); } -bool CPVRClient::OnPreInstall() +void CPVRClient::OnPreInstall() { // stop the pvr manager, so running pvr add-ons are stopped and closed PVR::CPVRManager::Get().Stop(); - return false; } -void CPVRClient::OnPostInstall(bool restart, bool update, bool modal) +void CPVRClient::OnPostInstall(bool update, bool modal) { // (re)start the pvr manager PVR::CPVRManager::Get().Start(true); diff --git a/xbmc/pvr/addons/PVRClient.h b/xbmc/pvr/addons/PVRClient.h index 5229bf9c53..e5c02eaa69 100644 --- a/xbmc/pvr/addons/PVRClient.h +++ b/xbmc/pvr/addons/PVRClient.h @@ -61,8 +61,8 @@ namespace PVR virtual void OnDisabled(); virtual void OnEnabled(); virtual ADDON::AddonPtr GetRunningInstance() const; - virtual bool OnPreInstall(); - virtual void OnPostInstall(bool restart, bool update, bool modal); + virtual void OnPreInstall(); + virtual void OnPostInstall(bool update, bool modal); virtual void OnPreUnInstall(); virtual void OnPostUnInstall(); virtual bool CanInstall(const std::string &referer); diff --git a/xbmc/pvr/addons/PVRClients.cpp b/xbmc/pvr/addons/PVRClients.cpp index 63e5ac7c37..6461efef8d 100644 --- a/xbmc/pvr/addons/PVRClients.cpp +++ b/xbmc/pvr/addons/PVRClients.cpp @@ -1150,7 +1150,7 @@ bool CPVRClients::UpdateAndInitialiseClients(bool bInitialiseAllClients /* = fal for (VECADDONS::iterator it = disableAddons.begin(); it != disableAddons.end(); ++it) { // disable in the add-on db - CAddonMgr::Get().DisableAddon((*it)->ID(), true); + CAddonMgr::Get().DisableAddon((*it)->ID()); // remove from the pvr add-on list VECADDONS::iterator addonPtr = std::find(m_addons.begin(), m_addons.end(), *it); @@ -1245,7 +1245,7 @@ bool CPVRClients::AutoconfigureClients(void) progressHandle->MarkFinished(); /** enable the add-on */ - CAddonMgr::Get().DisableAddon((*it)->ID(), false); + CAddonMgr::Get().EnableAddon((*it)->ID()); CSingleLock lock(m_critSection); m_addons.push_back(*it); bReturn = true; @@ -1312,7 +1312,7 @@ bool CPVRClients::UpdateAddons(void) if (bDisable) { CLog::Log(LOGDEBUG, "%s - disabling add-on '%s'", __FUNCTION__, (*it)->Name().c_str()); - CAddonMgr::Get().DisableAddon((*it)->ID(), true); + CAddonMgr::Get().DisableAddon((*it)->ID()); usableClients--; } } |