diff options
author | montellese <montellese@kodi.tv> | 2017-02-04 10:07:33 +0100 |
---|---|---|
committer | montellese <montellese@kodi.tv> | 2017-06-01 19:46:15 +0200 |
commit | 96af5c8777425223348cbb592cef029078df9098 (patch) | |
tree | 849e7da7230bd8d6818699991fd4af2041dfaa75 | |
parent | a2b4efe6d3a06c1301ac59b8146d0dbc64158a21 (diff) |
[settings] add versioning support
-rw-r--r-- | system/settings/android.xml | 2 | ||||
-rw-r--r-- | system/settings/darwin.xml | 2 | ||||
-rw-r--r-- | system/settings/darwin_ios.xml | 2 | ||||
-rw-r--r-- | system/settings/darwin_osx.xml | 2 | ||||
-rw-r--r-- | system/settings/imx6.xml | 2 | ||||
-rw-r--r-- | system/settings/linux.xml | 2 | ||||
-rw-r--r-- | system/settings/rbp.xml | 2 | ||||
-rw-r--r-- | system/settings/rbp2.xml | 2 | ||||
-rwxr-xr-x | system/settings/settings.xml | 2 | ||||
-rw-r--r-- | system/settings/win32.xml | 2 | ||||
-rw-r--r-- | xbmc/settings/lib/SettingDefinitions.h | 1 | ||||
-rw-r--r-- | xbmc/settings/lib/SettingsManager.cpp | 50 | ||||
-rw-r--r-- | xbmc/settings/lib/SettingsManager.h | 11 |
13 files changed, 72 insertions, 10 deletions
diff --git a/system/settings/android.xml b/system/settings/android.xml index dab3be1c0a..53d2c10650 100644 --- a/system/settings/android.xml +++ b/system/settings/android.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" ?> -<settings> +<settings version="1"> <section id="system"> <category id="display"> <group id="1"> diff --git a/system/settings/darwin.xml b/system/settings/darwin.xml index b948ed843d..e18be78430 100644 --- a/system/settings/darwin.xml +++ b/system/settings/darwin.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" ?> -<settings> +<settings version="1"> <section id="system"> <category id="display"> <group id="1"> diff --git a/system/settings/darwin_ios.xml b/system/settings/darwin_ios.xml index e7c41543ce..329a9c9a5f 100644 --- a/system/settings/darwin_ios.xml +++ b/system/settings/darwin_ios.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" ?> -<settings> +<settings version="1"> <section id="player" label="14200" help=""> <category id="videoplayer"> <group id="2"> diff --git a/system/settings/darwin_osx.xml b/system/settings/darwin_osx.xml index a81fe9a80a..852f524618 100644 --- a/system/settings/darwin_osx.xml +++ b/system/settings/darwin_osx.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" ?> -<settings> +<settings version="1"> <section id="system"> <category id="display"> <group id="1"> diff --git a/system/settings/imx6.xml b/system/settings/imx6.xml index 3af9b3f9d2..a1cac3abaa 100644 --- a/system/settings/imx6.xml +++ b/system/settings/imx6.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" ?> -<settings> +<settings version="1"> <section id="player"> <category id="videoplayer"> <group id="3"> diff --git a/system/settings/linux.xml b/system/settings/linux.xml index dee93a61d8..7456a57982 100644 --- a/system/settings/linux.xml +++ b/system/settings/linux.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" ?> -<settings> +<settings version="1"> <section id="system"> <category id="display"> <group id="1"> diff --git a/system/settings/rbp.xml b/system/settings/rbp.xml index 62e9c8ed21..7337d13f4c 100644 --- a/system/settings/rbp.xml +++ b/system/settings/rbp.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" ?> -<settings> +<settings version="1"> <section id="player"> <category id="videoplayer"> <group id="3"> diff --git a/system/settings/rbp2.xml b/system/settings/rbp2.xml index 50bd55e9c9..15b98bd07c 100644 --- a/system/settings/rbp2.xml +++ b/system/settings/rbp2.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" ?> -<settings> +<settings version="1"> <section id="player"> <category id="videoplayer"> <group id="3"> diff --git a/system/settings/settings.xml b/system/settings/settings.xml index f0b3e25bfb..c036bc0807 100755 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" ?> -<settings> +<settings version="1"> <section id="player" label="14200" help="38100"> <category id="videoplayer" label="14215" help="38103"> <group id="1" label="14230"> diff --git a/system/settings/win32.xml b/system/settings/win32.xml index a017d30c24..da1e9a0f25 100644 --- a/system/settings/win32.xml +++ b/system/settings/win32.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" ?> -<settings> +<settings version="1"> <section id="services"> <category id="general"> <group id="2"> diff --git a/xbmc/settings/lib/SettingDefinitions.h b/xbmc/settings/lib/SettingDefinitions.h index 2b35def865..51a337b9d9 100644 --- a/xbmc/settings/lib/SettingDefinitions.h +++ b/xbmc/settings/lib/SettingDefinitions.h @@ -24,6 +24,7 @@ #include <vector> #define SETTING_XML_ROOT "settings" +#define SETTING_XML_ROOT_VERSION "version" #define SETTING_XML_ELM_SECTION "section" #define SETTING_XML_ELM_CATEGORY "category" diff --git a/xbmc/settings/lib/SettingsManager.cpp b/xbmc/settings/lib/SettingsManager.cpp index 9b8d5f1aed..f7dbbd0070 100644 --- a/xbmc/settings/lib/SettingsManager.cpp +++ b/xbmc/settings/lib/SettingsManager.cpp @@ -73,6 +73,15 @@ CSettingsManager::~CSettingsManager() Clear(); } +uint32_t CSettingsManager::ParseVersion(const TiXmlElement* root) const +{ + // try to get and check the version + uint32_t version = 0; + root->QueryUnsignedAttribute(SETTING_XML_ROOT_VERSION, &version); + + return version; +} + bool CSettingsManager::Initialize(const TiXmlElement *root) { CExclusiveLock lock(m_critical); @@ -86,6 +95,22 @@ bool CSettingsManager::Initialize(const TiXmlElement *root) return false; } + // try to get and check the version + uint32_t version = ParseVersion(root); + if (version == 0) + CLog::Log(LOGWARNING, "CSettingsManager: missing " SETTING_XML_ROOT_VERSION " attribute"); + + if (version < MinimumSupportedVersion) + { + CLog::Log(LOGERROR, "CSettingsManager: unable to read setting definitions from version %u (minimum version: %u)", version, MinimumSupportedVersion); + return false; + } + if (version > Version) + { + CLog::Log(LOGERROR, "CSettingsManager: unable to read setting definitions from version %u (current version: %u)", version, Version); + return false; + } + const TiXmlNode *sectionNode = root->FirstChild(SETTING_XML_ELM_SECTION); while (sectionNode != NULL) { @@ -126,6 +151,22 @@ bool CSettingsManager::Load(const TiXmlElement *root, bool &updated, bool trigge if (triggerEvents && !OnSettingsLoading()) return false; + // try to get and check the version + uint32_t version = ParseVersion(root); + if (version == 0) + CLog::Log(LOGWARNING, "CSettingsManager: missing " SETTING_XML_ROOT_VERSION " attribute"); + + if (version < MinimumSupportedVersion) + { + CLog::Log(LOGERROR, "CSettingsManager: unable to read setting values from version %u (minimum version: %u)", version, MinimumSupportedVersion); + return false; + } + if (version > Version) + { + CLog::Log(LOGERROR, "CSettingsManager: unable to read setting values from version %u (current version: %u)", version, Version); + return false; + } + if (!Deserialize(root, updated, loadedSettings)) return false; @@ -150,6 +191,15 @@ bool CSettingsManager::Save(TiXmlNode *root) const if (!OnSettingsSaving()) return false; + // save the current version + TiXmlElement* rootElement = root->ToElement(); + if (rootElement == nullptr) + { + CLog::Log(LOGERROR, "CSettingsManager: failed to save settings"); + return false; + } + rootElement->SetAttribute(SETTING_XML_ROOT_VERSION, Version); + if (!Serialize(root)) { CLog::Log(LOGERROR, "CSettingsManager: failed to save settings"); diff --git a/xbmc/settings/lib/SettingsManager.h b/xbmc/settings/lib/SettingsManager.h index f9faba21e6..2e644be13f 100644 --- a/xbmc/settings/lib/SettingsManager.h +++ b/xbmc/settings/lib/SettingsManager.h @@ -56,6 +56,9 @@ public: CSettingsManager(); virtual ~CSettingsManager(); + static const uint32_t Version = 1; + static const uint32_t MinimumSupportedVersion = 0; + // implementation of ISettingCreator virtual CSetting* CreateSetting(const std::string &settingType, const std::string &settingId, CSettingsManager *settingsManager = NULL) const override; @@ -63,6 +66,14 @@ public: virtual ISettingControl* CreateControl(const std::string &controlType) const override; /*! + \brief Try to get the version of the setting definitions/values represented by the given XML element. + + \param root XML element representing setting definitions/values + \return Version of the setting definitions/values or 0 if no version has been specified + */ + uint32_t ParseVersion(const TiXmlElement* root) const; + + /*! \brief Initializes the settings manager using the setting definitions represented by the given XML element. |