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.
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"
20 #define SETTINGS_XML_ROOT "settings"
22 CSettingsBase::CSettingsBase()
23 : m_settingsManager(new CSettingsManager())
26 CSettingsBase::~CSettingsBase()
30 delete m_settingsManager
;
33 bool CSettingsBase::Initialize()
35 std::unique_lock
<CCriticalSection
> lock(m_critical
);
39 // register custom setting types
40 InitializeSettingTypes();
41 // register custom setting controls
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())
53 InitializeVisibility();
56 m_settingsManager
->SetInitialized();
58 InitializeISettingsHandlers();
59 InitializeISubSettings();
60 InitializeISettingCallbacks();
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
)
78 return m_settingsManager
->Load(xmlRoot
, updated
);
81 bool CSettingsBase::LoadValuesFromXml(const TiXmlElement
* root
, bool& updated
)
86 return m_settingsManager
->Load(root
, updated
);
89 bool CSettingsBase::LoadHiddenValuesFromXml(const TiXmlElement
* root
)
94 std::map
<std::string
, std::shared_ptr
<CSetting
>> loadedSettings
;
97 // don't trigger events for hidden settings
98 bool success
= m_settingsManager
->Load(root
, updated
, false, &loadedSettings
);
101 for(std::map
<std::string
, std::shared_ptr
<CSetting
>>::const_iterator setting
= loadedSettings
.begin(); setting
!= loadedSettings
.end(); ++setting
)
102 setting
->second
->SetVisible(false);
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
))
125 if (!xml
.Parse(serializedSettings
))
131 void CSettingsBase::Unload()
133 m_settingsManager
->Unload();
136 void CSettingsBase::Uninitialize()
138 std::unique_lock
<CCriticalSection
> lock(m_critical
);
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
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
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
)
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();
272 return m_settingsManager
->Initialize(root
);