aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortamland <thomas.amland@gmail.com>2015-04-26 15:11:35 +0200
committertamland <thomas.amland@gmail.com>2015-04-26 15:11:35 +0200
commit7dacc6e46d1b5c8c5af1edf641ff5a1b3faed9ac (patch)
tree4213dbafbffa3f2efa90d4718ce1d0b70aec7190
parentd24705108c405c7f0ea211b147979ef33b807f2a (diff)
parent1f4528d05872fe272af6e6e43929d2c2c7cee211 (diff)
Merge pull request #6681 from tamland/addon_install_fixes
Cleanup addon (un)installing and enabling/disabling
-rw-r--r--xbmc/addons/Addon.cpp79
-rw-r--r--xbmc/addons/Addon.h24
-rw-r--r--xbmc/addons/AddonDatabase.cpp43
-rw-r--r--xbmc/addons/AddonDatabase.h3
-rw-r--r--xbmc/addons/AddonInstaller.cpp50
-rw-r--r--xbmc/addons/AddonInstaller.h6
-rw-r--r--xbmc/addons/AddonManager.cpp65
-rw-r--r--xbmc/addons/AddonManager.h22
-rw-r--r--xbmc/addons/AddonStatusHandler.cpp1
-rw-r--r--xbmc/addons/ContextItemAddon.cpp34
-rw-r--r--xbmc/addons/ContextItemAddon.h6
-rw-r--r--xbmc/addons/GUIDialogAddonInfo.cpp13
-rw-r--r--xbmc/addons/GUIWindowAddonBrowser.cpp2
-rw-r--r--xbmc/addons/IAddon.h7
-rw-r--r--xbmc/addons/LanguageResource.cpp9
-rw-r--r--xbmc/addons/LanguageResource.h3
-rw-r--r--xbmc/addons/Repository.cpp8
-rw-r--r--xbmc/addons/Repository.h1
-rw-r--r--xbmc/addons/Service.cpp42
-rw-r--r--xbmc/addons/Service.h5
-rw-r--r--xbmc/addons/Skin.cpp11
-rw-r--r--xbmc/addons/Skin.h4
-rw-r--r--xbmc/addons/UISoundsResource.cpp2
-rw-r--r--xbmc/addons/UISoundsResource.h2
-rw-r--r--xbmc/interfaces/json-rpc/AddonsOperations.cpp6
-rw-r--r--xbmc/pvr/addons/PVRClient.cpp5
-rw-r--r--xbmc/pvr/addons/PVRClient.h4
-rw-r--r--xbmc/pvr/addons/PVRClients.cpp6
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 &current, void *data);
static void SettingOptionsStartupWindowsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int &current, 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 &parameterObject, 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--;
}
}