aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormontellese <montellese@kodi.tv>2017-02-04 10:07:33 +0100
committermontellese <montellese@kodi.tv>2017-06-01 19:46:15 +0200
commit96af5c8777425223348cbb592cef029078df9098 (patch)
tree849e7da7230bd8d6818699991fd4af2041dfaa75
parenta2b4efe6d3a06c1301ac59b8146d0dbc64158a21 (diff)
[settings] add versioning support
-rw-r--r--system/settings/android.xml2
-rw-r--r--system/settings/darwin.xml2
-rw-r--r--system/settings/darwin_ios.xml2
-rw-r--r--system/settings/darwin_osx.xml2
-rw-r--r--system/settings/imx6.xml2
-rw-r--r--system/settings/linux.xml2
-rw-r--r--system/settings/rbp.xml2
-rw-r--r--system/settings/rbp2.xml2
-rwxr-xr-xsystem/settings/settings.xml2
-rw-r--r--system/settings/win32.xml2
-rw-r--r--xbmc/settings/lib/SettingDefinitions.h1
-rw-r--r--xbmc/settings/lib/SettingsManager.cpp50
-rw-r--r--xbmc/settings/lib/SettingsManager.h11
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.