summaryrefslogtreecommitdiffstats
path: root/xbmc/addons/Addon.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/addons/Addon.h')
-rw-r--r--xbmc/addons/Addon.h490
1 files changed, 490 insertions, 0 deletions
diff --git a/xbmc/addons/Addon.h b/xbmc/addons/Addon.h
new file mode 100644
index 0000000..a09b8db
--- /dev/null
+++ b/xbmc/addons/Addon.h
@@ -0,0 +1,490 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#pragma once
+
+#include "addons/IAddon.h"
+
+#include <memory>
+#include <string>
+#include <unordered_map>
+#include <vector>
+
+class CXBMCTinyXML;
+
+namespace ADDON
+{
+
+enum class AddonType;
+class CAddonType;
+
+class CAddonInfo;
+using AddonInfoPtr = std::shared_ptr<CAddonInfo>;
+
+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 CAddon : public IAddon
+{
+public:
+ explicit CAddon(const AddonInfoPtr& addonInfo, AddonType addonType);
+ ~CAddon() override = default;
+
+ /**
+ * @brief To get the main type of this addon
+ *
+ * This is the first type defined in **addon.xml** and can be different to the
+ * on @ref Type() defined type.
+ *
+ * @return The used main type of addon
+ */
+ AddonType MainType() const override;
+
+ /**
+ * @brief To get the on this CAddon class processed addon type
+ *
+ * @return For this class used addon type
+ */
+ AddonType Type() const override { return m_type; }
+
+ /**
+ * @brief To check complete addon (not only this) contains a type
+ *
+ * @note This can be overridden by a child e.g. plugin to check for subtype
+ * e.g. video or music.
+ *
+ * @param[in] type The to checked type identifier
+ * @return true in case the wanted type is supported, false if not
+ */
+ bool HasType(AddonType type) const override;
+
+ /**
+ * @brief To check complete addon (not only this) has a specific type
+ * defined in its first extension point including the provided subcontent
+ * e.g. video or audio
+ *
+ * @param[in] type Type identifier to be checked
+ * @return true in case the wanted type is the main type, false if not
+ */
+ bool HasMainType(AddonType type) const override;
+
+ /**
+ * @brief The get for given addon type information and extension data
+ *
+ * @param[in] type The wanted type data
+ * @return addon type class with @ref CAddonExtensions as information
+ *
+ * @note This function return never a "nullptr", in case the wanted type is
+ * not supported, becomes a dummy of @ref CAddonType given.
+ *
+ * ------------------------------------------------------------------------
+ *
+ * **Example:**
+ * ~~~~~~~~~~~~~{.cpp}
+ * // To get e.g. <extension ... name="blablabla" /> from addon.xml
+ * std::string name = Type(ADDON_...)->GetValue("@name").asString();
+ * ~~~~~~~~~~~~~
+ *
+ */
+ const CAddonType* Type(AddonType type) const;
+
+ std::string ID() const override;
+ std::string Name() const override;
+ bool IsInUse() const override { return false; }
+ bool IsBinary() const override;
+ CAddonVersion Version() const override;
+ CAddonVersion MinVersion() const override;
+ std::string Summary() const override;
+ std::string Description() const override;
+ std::string Path() const override;
+ std::string Profile() const override;
+ std::string LibPath() const override;
+ std::string Author() const override;
+ std::string ChangeLog() const override;
+ std::string Icon() const override;
+ ArtMap Art() const override;
+ std::vector<std::string> Screenshots() const override;
+ std::string Disclaimer() const override;
+ AddonLifecycleState LifecycleState() const override;
+ std::string LifecycleStateDescription() const override;
+ CDateTime InstallDate() const override;
+ CDateTime LastUpdated() const override;
+ CDateTime LastUsed() const override;
+ std::string Origin() const override;
+ std::string OriginName() const override;
+ uint64_t PackageSize() const override;
+ const InfoMap& ExtraInfo() const override;
+ const std::vector<DependencyInfo>& GetDependencies() const override;
+ std::string FanArt() const override;
+
+ /*!
+ * \brief Check add-on for support from independent work instances.
+ *
+ * \return true if the add-on supports individual add-on instances, false otherwise
+ */
+ bool SupportsMultipleInstances() const override;
+
+ /*!
+ * \brief Return the used instance path type of the add-on type.
+ *
+ * \return The route used to instance handling, @ref AddonInstanceUse::NONE if not supported.
+ */
+ AddonInstanceSupport InstanceUseType() const override;
+
+ /*!
+ * \brief Gives active, independently working instance identifiers for this add-on.
+ *
+ * This function is supported if add-on type has defined
+ * @ref AddonInstanceUse::BY_SETTINGS and the associated settings
+ * are available.
+ *
+ * \return List of active instance identifiers.
+ */
+ std::vector<AddonInstanceId> GetKnownInstanceIds() const override;
+
+ /*!
+ * \brief Check whether the add-on supports individual settings per add-on instance.
+ *
+ * This function is supported if add-on type has defined
+ * @ref AddonInstanceUse::BY_SETTINGS
+ *
+ * \return true if the add-on supports individual settings per add-on instance, false otherwise
+ */
+ bool SupportsInstanceSettings() const override;
+
+ /*!
+ * \brief Delete selected instance settings from storage.
+ *
+ * The related instance-settings-[0-9...].xml file will be deleted by this method.
+ *
+ * \param[in] instance Instance identifier to use.
+ * \return true on success, false otherwise.
+ */
+ bool DeleteInstanceSettings(AddonInstanceId instance) override;
+
+ /*!
+ * \brief Check whether this add-on can be configured by the user.
+ *
+ * \return true if the add-on has settings, false otherwise
+ */
+ bool CanHaveAddonOrInstanceSettings() override;
+
+ /*!
+ * \brief Check whether this add-on can be configured by the user.
+ *
+ * \param[in] id Instance identifier to use, use @ref ADDON_SETTINGS_ID
+ * to denote global add-on settings from settings.xml.
+ * \return true if the add-on has settings, false otherwise
+ *
+ * \sa LoadSettings, LoadUserSettings, SaveSettings, HasUserSettings, GetSetting, UpdateSetting
+ */
+ bool HasSettings(AddonInstanceId id = ADDON_SETTINGS_ID) override;
+
+ /*!
+ * \brief Check whether the user has configured this add-on or not.
+ *
+ * \param[in] id Instance identifier to use, use @ref ADDON_SETTINGS_ID
+ * to denote global add-on settings from settings.xml.
+ * \return true if previously saved settings are found, false otherwise
+ *
+ * \sa LoadSettings, LoadUserSettings, SaveSettings, HasSettings, GetSetting, UpdateSetting
+ */
+ bool HasUserSettings(AddonInstanceId id = ADDON_SETTINGS_ID) override;
+
+ /*!
+ * \brief Save any user configured settings
+ *
+ * \param[in] instance Instance identifier to use, use @ref ADDON_SETTINGS_ID
+ * to denote global add-on settings from settings.xml.
+ *
+ * \sa LoadSettings, LoadUserSettings, HasSettings, HasUserSettings, GetSetting, UpdateSetting
+ */
+ void SaveSettings(AddonInstanceId id = ADDON_SETTINGS_ID) override;
+
+ /*!
+ * \brief Update a user-configured setting with a new value.
+ *
+ * \param[in] key the id of the setting to update
+ * \param[in] value the value that the setting should take
+ * \param[in] id Instance identifier to use, use @ref ADDON_SETTINGS_ID
+ * to denote global add-on settings from settings.xml.
+ *
+ * \sa LoadSettings, LoadUserSettings, SaveSettings, HasSettings, HasUserSettings, GetSetting
+ */
+ void UpdateSetting(const std::string& key,
+ const std::string& value,
+ AddonInstanceId id = ADDON_SETTINGS_ID) override;
+
+ /*!
+ * \brief Update a user-configured setting with a new boolean value.
+ *
+ * \param[in] key the id of the setting to update
+ * \param[in] value the value that the setting should take
+ * \param[in] id Instance identifier to use, use @ref ADDON_SETTINGS_ID
+ * to denote global add-on settings from settings.xml.
+ *
+ * \sa LoadSettings, LoadUserSettings, SaveSettings, HasSettings, HasUserSettings, GetSetting
+ */
+ bool UpdateSettingBool(const std::string& key,
+ bool value,
+ AddonInstanceId id = ADDON_SETTINGS_ID) override;
+
+ /*!
+ * \brief Update a user-configured setting with a new integer value.
+ *
+ * \param[in] key the id of the setting to update
+ * \param[in] value the value that the setting should take
+ * \param[in] id Instance identifier to use, use @ref ADDON_SETTINGS_ID
+ * to denote global add-on settings from settings.xml.
+ *
+ * \sa LoadSettings, LoadUserSettings, SaveSettings, HasSettings, HasUserSettings, GetSetting
+ */
+ bool UpdateSettingInt(const std::string& key,
+ int value,
+ AddonInstanceId id = ADDON_SETTINGS_ID) override;
+
+ /*!
+ * \brief Update a user-configured setting with a new number value.
+ *
+ * \param[in] key the id of the setting to update
+ * \param[in] value the value that the setting should take
+ * \param[in] id Instance identifier to use, use @ref ADDON_SETTINGS_ID
+ * to denote global add-on settings from settings.xml.
+ *
+ * \sa LoadSettings, LoadUserSettings, SaveSettings, HasSettings, HasUserSettings, GetSetting
+ */
+ bool UpdateSettingNumber(const std::string& key,
+ double value,
+ AddonInstanceId id = ADDON_SETTINGS_ID) override;
+
+ /*!
+ * \brief Update a user-configured setting with a new string value.
+ *
+ * \param[in] key the id of the setting to update
+ * \param[in] value the value that the setting should take
+ * \param[in] id Instance identifier to use, use @ref ADDON_SETTINGS_ID
+ * to denote global add-on settings from settings.xml.
+ *
+ * \sa LoadSettings, LoadUserSettings, SaveSettings, HasSettings, HasUserSettings, GetSetting
+ */
+ bool UpdateSettingString(const std::string& key,
+ const std::string& value,
+ AddonInstanceId id = ADDON_SETTINGS_ID) override;
+
+ /*!
+ * \brief Retrieve a particular settings value.
+ *
+ * If a previously configured user setting is available, we return it's value, else we return the default (if available).
+ *
+ * \param[in] key the id of the setting to retrieve
+ * \param[in] id Instance identifier to use, use @ref ADDON_SETTINGS_ID
+ * to denote global add-on settings from settings.xml.
+ * \return the current value of the setting, or the default if the setting has yet to be configured.
+ *
+ * \sa LoadSettings, LoadUserSettings, SaveSettings, HasSettings, HasUserSettings, UpdateSetting
+ */
+ std::string GetSetting(const std::string& key, AddonInstanceId id = ADDON_SETTINGS_ID) override;
+
+ /*!
+ * \brief Retrieve a particular settings value as boolean.
+ *
+ * If a previously configured user setting is available, we return it's value, else we return the default (if available).
+ *
+ * \param[in] key the id of the setting to retrieve
+ * \param[out] value the current value of the setting, or the default if the setting has yet to be configured
+ * \param[in] id Instance identifier to use, use @ref ADDON_SETTINGS_ID
+ * to denote global add-on settings from settings.xml.
+ * \return true if the setting's value was retrieved, false otherwise.
+ *
+ * \sa LoadSettings, LoadUserSettings, SaveSettings, HasSettings, HasUserSettings, UpdateSetting
+ */
+ bool GetSettingBool(const std::string& key,
+ bool& value,
+ AddonInstanceId id = ADDON_SETTINGS_ID) override;
+
+ /*!
+ * \brief Retrieve a particular settings value as integer.
+ *
+ * If a previously configured user setting is available, we return it's value, else we return the default (if available)
+ *
+ * \param[in] key the id of the setting to retrieve
+ * \param[out] value the current value of the setting, or the default if the setting has yet to be configured
+ * \param[in] id Instance identifier to use, use @ref ADDON_SETTINGS_ID
+ * to denote global add-on settings from settings.xml.
+ * \return true if the setting's value was retrieved, false otherwise.
+ *
+ * \sa LoadSettings, LoadUserSettings, SaveSettings, HasSettings, HasUserSettings, UpdateSetting
+ */
+ bool GetSettingInt(const std::string& key,
+ int& value,
+ AddonInstanceId id = ADDON_SETTINGS_ID) override;
+
+ /*!
+ * \brief Retrieve a particular settings value as number.
+ *
+ * If a previously configured user setting is available, we return it's value, else we return the default (if available)
+ *
+ * \param[in] key the id of the setting to retrieve
+ * \param[out] value the current value of the setting, or the default if the setting has yet to be configured
+ * \param[in] id Instance identifier to use, use @ref ADDON_SETTINGS_ID
+ * to denote global add-on settings from settings.xml.
+ * \return true if the setting's value was retrieved, false otherwise.
+ *
+ * \sa LoadSettings, LoadUserSettings, SaveSettings, HasSettings, HasUserSettings, UpdateSetting
+ */
+ bool GetSettingNumber(const std::string& key,
+ double& value,
+ AddonInstanceId id = ADDON_SETTINGS_ID) override;
+
+ /*!
+ * \brief Retrieve a particular settings value as string
+ *
+ * If a previously configured user setting is available, we return it's value, else we return the default (if available)
+ *
+ * \param[in] key the id of the setting to retrieve
+ * \param[out] value the current value of the setting, or the default if the setting has yet to be configured
+ * \param[in] id Instance identifier to use, use @ref ADDON_SETTINGS_ID
+ * to denote global add-on settings from settings.xml.
+ * \return true if the setting's value was retrieved, false otherwise.
+ *
+ * \sa LoadSettings, LoadUserSettings, SaveSettings, HasSettings, HasUserSettings, UpdateSetting
+ */
+ bool GetSettingString(const std::string& key,
+ std::string& value,
+ AddonInstanceId id = ADDON_SETTINGS_ID) override;
+
+ std::shared_ptr<CAddonSettings> GetSettings(AddonInstanceId id = ADDON_SETTINGS_ID) override;
+
+ /*! \brief get the required version of a dependency.
+ \param dependencyID the addon ID of the dependency.
+ \return the version this addon requires.
+ */
+ CAddonVersion GetDependencyVersion(const std::string& dependencyID) const override;
+
+ /*! \brief return whether or not this addon satisfies the given version requirements
+ \param version the version to meet.
+ \return true if min_version <= version <= current_version, false otherwise.
+ */
+ bool MeetsVersion(const CAddonVersion& versionMin, const CAddonVersion& version) const override;
+
+ bool ReloadSettings(AddonInstanceId id = ADDON_SETTINGS_ID) override;
+
+ void ResetSettings(AddonInstanceId id = ADDON_SETTINGS_ID) override;
+
+ /*! \brief retrieve the running instance of an add-on if it persists while running.
+ */
+ AddonPtr GetRunningInstance() const override { return AddonPtr(); }
+
+ void OnPreInstall() override{};
+ void OnPostInstall(bool update, bool modal) override{};
+ void OnPreUnInstall() override{};
+ void OnPostUnInstall() override{};
+
+protected:
+ /*!
+ * \brief Whether or not the settings have been initialized.
+ *
+ * \param[in] id Instance identifier to use, use @ref ADDON_SETTINGS_ID
+ * to denote global add-on settings from settings.xml.
+ * \return true if settings initialize was successfull
+ */
+ virtual bool SettingsInitialized(AddonInstanceId id = ADDON_SETTINGS_ID) const;
+
+ /*!
+ * \brief Whether or not the settings have been loaded.
+ *
+ * \param[in] id Instance identifier to use, use @ref ADDON_SETTINGS_ID
+ * to denote global add-on settings from settings.xml.
+ * \return true if settings are loaded correct
+ */
+ virtual bool SettingsLoaded(AddonInstanceId id = ADDON_SETTINGS_ID) const;
+
+ /*!
+ * \brief Load the default settings and override these with any previously configured user settings
+ *
+ * \param[in] bForce force the load of settings even if they are already loaded (reload)
+ * \param[in] loadUserSettings whether or not to load user settings
+ * \param[in] id Instance identifier to use, use @ref ADDON_SETTINGS_ID
+ * to denote global add-on settings from settings.xml.
+ * \return true if settings exist, false otherwise
+ *
+ * \sa LoadUserSettings, SaveSettings, HasSettings, HasUserSettings, GetSetting, UpdateSetting
+ */
+ bool LoadSettings(bool bForce, bool loadUserSettings, AddonInstanceId id = ADDON_SETTINGS_ID);
+
+ /*!
+ * \brief Load the user settings
+ *
+ * \param[in] id Instance identifier to use, use @ref ADDON_SETTINGS_ID
+ * to denote global add-on settings from settings.xml.
+ * \return true if user settings exist, false otherwise
+ *
+ * \sa LoadSettings, SaveSettings, HasSettings, HasUserSettings, GetSetting, UpdateSetting
+ */
+ virtual bool LoadUserSettings(AddonInstanceId id = ADDON_SETTINGS_ID);
+
+ /*!
+ * \brief Whether there are settings to be saved
+ *
+ * \param[in] id Instance identifier to use, use @ref ADDON_SETTINGS_ID
+ * to denote global add-on settings from settings.xml.
+ * \return true if settings has to save
+ *
+ * \sa SaveSettings
+ */
+ virtual bool HasSettingsToSave(AddonInstanceId id = ADDON_SETTINGS_ID) const;
+
+ /*!
+ * \brief Parse settings from an XML document
+ *
+ * \param[in] doc XML document to parse for settings
+ * \param[in] loadDefaults if true, the default attribute is used and settings are reset prior to parsing, else the value attribute is used.
+ * \param[in] id Instance identifier to use, use @ref ADDON_SETTINGS_ID
+ * to denote global add-on settings from settings.xml.
+ * \return true if settings are loaded, false otherwise
+ *
+ * \sa SettingsToXML
+ */
+ virtual bool SettingsFromXML(const CXBMCTinyXML& doc,
+ bool loadDefaults,
+ AddonInstanceId id = ADDON_SETTINGS_ID);
+
+ /*!
+ * \brief Write settings into an XML document
+ *
+ * \param[out] doc XML document to receive the settings
+ * \param[in] id Instance identifier to use, use @ref ADDON_SETTINGS_ID
+ * to denote global add-on settings from settings.xml.
+ * \return true if settings are saved, false otherwise
+ *
+ * \sa SettingsFromXML
+ */
+ virtual bool SettingsToXML(CXBMCTinyXML& doc, AddonInstanceId id = ADDON_SETTINGS_ID) const;
+
+ const AddonInfoPtr m_addonInfo;
+
+private:
+ struct CSettingsData
+ {
+ bool m_loadSettingsFailed{false};
+ bool m_hasUserSettings{false};
+ std::string m_addonSettingsPath;
+ std::string m_userSettingsPath;
+ std::shared_ptr<CAddonSettings> m_addonSettings;
+ };
+
+ bool InitSettings(AddonInstanceId id);
+ std::shared_ptr<CAddonSettings> FindInstanceSettings(AddonInstanceId id) const;
+
+ mutable std::unordered_map<AddonInstanceId, CSettingsData> m_settings;
+ const AddonType m_type;
+};
+
+}; // namespace ADDON