summaryrefslogtreecommitdiffstats
path: root/xbmc/settings/SettingsValueXmlSerializer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/settings/SettingsValueXmlSerializer.cpp')
-rw-r--r--xbmc/settings/SettingsValueXmlSerializer.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/xbmc/settings/SettingsValueXmlSerializer.cpp b/xbmc/settings/SettingsValueXmlSerializer.cpp
new file mode 100644
index 0000000..42f83e3
--- /dev/null
+++ b/xbmc/settings/SettingsValueXmlSerializer.cpp
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2019 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.
+ */
+
+#include "SettingsValueXmlSerializer.h"
+
+#include "settings/lib/SettingDefinitions.h"
+#include "settings/lib/SettingSection.h"
+#include "settings/lib/SettingsManager.h"
+#include "utils/XBMCTinyXML.h"
+#include "utils/XMLUtils.h"
+#include "utils/log.h"
+
+static constexpr char SETTINGS_XML_ROOT[] = "settings";
+
+std::string CSettingsValueXmlSerializer::SerializeValues(
+ const CSettingsManager* settingsManager) const
+{
+ if (settingsManager == nullptr)
+ return "";
+
+ CXBMCTinyXML xmlDoc;
+ TiXmlElement rootElement(SETTINGS_XML_ROOT);
+ rootElement.SetAttribute(SETTING_XML_ROOT_VERSION, settingsManager->GetVersion());
+ TiXmlNode* xmlRoot = xmlDoc.InsertEndChild(rootElement);
+ if (xmlRoot == nullptr)
+ return "";
+
+ const auto sections = settingsManager->GetSections();
+ for (const auto& section : sections)
+ SerializeSection(xmlRoot, section);
+
+ std::stringstream stream;
+ stream << *xmlDoc.RootElement();
+
+ return stream.str();
+}
+
+void CSettingsValueXmlSerializer::SerializeSection(
+ TiXmlNode* parent, const std::shared_ptr<CSettingSection>& section) const
+{
+ if (section == nullptr)
+ return;
+
+ const auto categories = section->GetCategories();
+ for (const auto& category : categories)
+ SerializeCategory(parent, category);
+}
+
+void CSettingsValueXmlSerializer::SerializeCategory(
+ TiXmlNode* parent, const std::shared_ptr<CSettingCategory>& category) const
+{
+ if (category == nullptr)
+ return;
+
+ const auto groups = category->GetGroups();
+ for (const auto& group : groups)
+ SerializeGroup(parent, group);
+}
+
+void CSettingsValueXmlSerializer::SerializeGroup(TiXmlNode* parent,
+ const std::shared_ptr<CSettingGroup>& group) const
+{
+ if (group == nullptr)
+ return;
+
+ const auto settings = group->GetSettings();
+ for (const auto& setting : settings)
+ SerializeSetting(parent, setting);
+}
+
+void CSettingsValueXmlSerializer::SerializeSetting(TiXmlNode* parent,
+ const std::shared_ptr<CSetting>& setting) const
+{
+ if (setting == nullptr)
+ return;
+
+ // ignore references and action settings (which don't have a value)
+ if (setting->IsReference() || setting->GetType() == SettingType::Action)
+ return;
+
+ TiXmlElement settingElement(SETTING_XML_ELM_SETTING);
+ settingElement.SetAttribute(SETTING_XML_ATTR_ID, setting->GetId());
+
+ // add the default attribute
+ if (setting->IsDefault())
+ settingElement.SetAttribute(SETTING_XML_ELM_DEFAULT, "true");
+
+ // add the value
+ TiXmlText value(setting->ToString());
+ settingElement.InsertEndChild(value);
+
+ if (parent->InsertEndChild(settingElement) == nullptr)
+ CLog::Log(LOGWARNING,
+ "CSettingsValueXmlSerializer: unable to write <" SETTING_XML_ELM_SETTING " id=\"{}\"> tag",
+ setting->GetId());
+}