Merge pull request #26350 from jjd-uk/estuary_media_align
[xbmc.git] / xbmc / settings / SettingsBase.cpp
bloba118a3652ae3af169be47d9fa1536e842caf536c
1 /*
2 * Copyright (C) 2016-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
9 #include "SettingsBase.h"
11 #include "settings/SettingUtils.h"
12 #include "settings/SettingsValueXmlSerializer.h"
13 #include "settings/lib/Setting.h"
14 #include "settings/lib/SettingsManager.h"
15 #include "utils/Variant.h"
16 #include "utils/XBMCTinyXML.h"
18 #include <mutex>
20 #define SETTINGS_XML_ROOT "settings"
22 CSettingsBase::CSettingsBase()
23 : m_settingsManager(new CSettingsManager())
24 { }
26 CSettingsBase::~CSettingsBase()
28 Uninitialize();
30 delete m_settingsManager;
33 bool CSettingsBase::Initialize()
35 std::unique_lock<CCriticalSection> lock(m_critical);
36 if (m_initialized)
37 return false;
39 // register custom setting types
40 InitializeSettingTypes();
41 // register custom setting controls
42 InitializeControls();
44 // option fillers and conditions need to be
45 // initialized before the setting definitions
46 InitializeOptionFillers();
47 InitializeConditions();
49 // load the settings definitions
50 if (!InitializeDefinitions())
51 return false;
53 InitializeVisibility();
54 InitializeDefaults();
56 m_settingsManager->SetInitialized();
58 InitializeISettingsHandlers();
59 InitializeISubSettings();
60 InitializeISettingCallbacks();
62 m_initialized = true;
64 return true;
67 bool CSettingsBase::IsInitialized() const
69 return m_initialized && m_settingsManager->IsInitialized();
72 bool CSettingsBase::LoadValuesFromXml(const CXBMCTinyXML& xml, bool& updated)
74 const TiXmlElement* xmlRoot = xml.RootElement();
75 if (xmlRoot == nullptr || xmlRoot->ValueStr() != SETTINGS_XML_ROOT)
76 return false;
78 return m_settingsManager->Load(xmlRoot, updated);
81 bool CSettingsBase::LoadValuesFromXml(const TiXmlElement* root, bool& updated)
83 if (root == nullptr)
84 return false;
86 return m_settingsManager->Load(root, updated);
89 bool CSettingsBase::LoadHiddenValuesFromXml(const TiXmlElement* root)
91 if (root == nullptr)
92 return false;
94 std::map<std::string, std::shared_ptr<CSetting>> loadedSettings;
96 bool updated;
97 // don't trigger events for hidden settings
98 bool success = m_settingsManager->Load(root, updated, false, &loadedSettings);
99 if (success)
101 for(std::map<std::string, std::shared_ptr<CSetting>>::const_iterator setting = loadedSettings.begin(); setting != loadedSettings.end(); ++setting)
102 setting->second->SetVisible(false);
105 return success;
108 void CSettingsBase::SetLoaded()
110 m_settingsManager->SetLoaded();
113 bool CSettingsBase::IsLoaded() const
115 return m_settingsManager->IsLoaded();
118 bool CSettingsBase::SaveValuesToXml(CXBMCTinyXML& xml) const
120 std::string serializedSettings;
121 auto xmlSerializer = std::make_unique<CSettingsValueXmlSerializer>();
122 if (!m_settingsManager->Save(xmlSerializer.get(), serializedSettings))
123 return false;
125 if (!xml.Parse(serializedSettings))
126 return false;
128 return true;
131 void CSettingsBase::Unload()
133 m_settingsManager->Unload();
136 void CSettingsBase::Uninitialize()
138 std::unique_lock<CCriticalSection> lock(m_critical);
139 if (!m_initialized)
140 return;
142 // unregister setting option fillers
143 UninitializeOptionFillers();
145 // unregister setting conditions
146 UninitializeConditions();
148 // unregister ISettingCallback implementations
149 UninitializeISettingCallbacks();
151 // cleanup the settings manager
152 m_settingsManager->Clear();
154 // unregister ISubSettings implementations
155 UninitializeISubSettings();
156 // unregister ISettingsHandler implementations
157 UninitializeISettingsHandlers();
159 m_initialized = false;
162 void CSettingsBase::RegisterCallback(ISettingCallback* callback, const std::set<std::string>& settingList)
164 m_settingsManager->RegisterCallback(callback, settingList);
167 void CSettingsBase::UnregisterCallback(ISettingCallback* callback)
169 m_settingsManager->UnregisterCallback(callback);
172 SettingPtr CSettingsBase::GetSetting(const std::string& id) const
174 if (id.empty())
175 return nullptr;
177 return m_settingsManager->GetSetting(id);
180 std::vector<std::shared_ptr<CSettingSection>> CSettingsBase::GetSections() const
182 return m_settingsManager->GetSections();
185 std::shared_ptr<CSettingSection> CSettingsBase::GetSection(const std::string& section) const
187 if (section.empty())
188 return nullptr;
190 return m_settingsManager->GetSection(section);
193 bool CSettingsBase::GetBool(const std::string& id) const
195 return m_settingsManager->GetBool(id);
198 bool CSettingsBase::SetBool(const std::string& id, bool value)
200 return m_settingsManager->SetBool(id, value);
203 bool CSettingsBase::ToggleBool(const std::string& id)
205 return m_settingsManager->ToggleBool(id);
208 int CSettingsBase::GetInt(const std::string& id) const
210 return m_settingsManager->GetInt(id);
213 bool CSettingsBase::SetInt(const std::string& id, int value)
215 return m_settingsManager->SetInt(id, value);
218 double CSettingsBase::GetNumber(const std::string& id) const
220 return m_settingsManager->GetNumber(id);
223 bool CSettingsBase::SetNumber(const std::string& id, double value)
225 return m_settingsManager->SetNumber(id, value);
228 std::string CSettingsBase::GetString(const std::string& id) const
230 return m_settingsManager->GetString(id);
233 bool CSettingsBase::SetString(const std::string& id, const std::string& value)
235 return m_settingsManager->SetString(id, value);
238 std::vector<CVariant> CSettingsBase::GetList(const std::string& id) const
240 std::shared_ptr<CSetting> setting = m_settingsManager->GetSetting(id);
241 if (setting == nullptr || setting->GetType() != SettingType::List)
242 return std::vector<CVariant>();
244 return CSettingUtils::GetList(std::static_pointer_cast<CSettingList>(setting));
247 bool CSettingsBase::SetList(const std::string& id, const std::vector<CVariant>& value)
249 std::shared_ptr<CSetting> setting = m_settingsManager->GetSetting(id);
250 if (setting == nullptr || setting->GetType() != SettingType::List)
251 return false;
253 return CSettingUtils::SetList(std::static_pointer_cast<CSettingList>(setting), value);
256 bool CSettingsBase::SetDefault(const std::string &id)
258 return m_settingsManager->SetDefault(id);
261 void CSettingsBase::SetDefaults()
263 m_settingsManager->SetDefaults();
266 bool CSettingsBase::InitializeDefinitionsFromXml(const CXBMCTinyXML& xml)
268 const TiXmlElement* root = xml.RootElement();
269 if (root == nullptr)
270 return false;
272 return m_settingsManager->Initialize(root);