2 * Copyright (C) 2013-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 "SettingsOperations.h"
11 #include "ServiceBroker.h"
12 #include "addons/Addon.h"
13 #include "addons/Skin.h"
14 #include "addons/addoninfo/AddonInfo.h"
15 #include "guilib/LocalizeStrings.h"
16 #include "settings/SettingAddon.h"
17 #include "settings/SettingControl.h"
18 #include "settings/SettingDateTime.h"
19 #include "settings/SettingPath.h"
20 #include "settings/SettingUtils.h"
21 #include "settings/Settings.h"
22 #include "settings/SettingsComponent.h"
23 #include "settings/SkinSettings.h"
24 #include "settings/lib/Setting.h"
25 #include "settings/lib/SettingDefinitions.h"
26 #include "settings/lib/SettingSection.h"
27 #include "utils/StringUtils.h"
28 #include "utils/Variant.h"
30 using namespace JSONRPC
;
32 JSONRPC_STATUS
CSettingsOperations::GetSections(const std::string
&method
, ITransportLayer
*transport
, IClient
*client
, const CVariant
¶meterObject
, CVariant
&result
)
34 SettingLevel level
= ParseSettingLevel(parameterObject
["level"].asString());
35 bool listCategories
= !parameterObject
["properties"].empty() && parameterObject
["properties"][0].asString() == "categories";
37 result
["sections"] = CVariant(CVariant::VariantTypeArray
);
39 // apply the level filter
40 SettingSectionList allSections
= CServiceBroker::GetSettingsComponent()->GetSettings()->GetSections();
41 for (const auto& itSection
: allSections
)
43 SettingCategoryList categories
= itSection
->GetCategories(level
);
44 if (categories
.empty())
47 CVariant
varSection(CVariant::VariantTypeObject
);
48 if (!SerializeSettingSection(itSection
, varSection
))
53 varSection
["categories"] = CVariant(CVariant::VariantTypeArray
);
54 for (const auto& itCategory
: categories
)
56 CVariant
varCategory(CVariant::VariantTypeObject
);
57 if (!SerializeSettingCategory(itCategory
, varCategory
))
60 varSection
["categories"].push_back(varCategory
);
64 result
["sections"].push_back(varSection
);
70 JSONRPC_STATUS
CSettingsOperations::GetCategories(const std::string
&method
, ITransportLayer
*transport
, IClient
*client
, const CVariant
¶meterObject
, CVariant
&result
)
72 SettingLevel level
= ParseSettingLevel(parameterObject
["level"].asString());
73 std::string strSection
= parameterObject
["section"].asString();
74 bool listSettings
= !parameterObject
["properties"].empty() && parameterObject
["properties"][0].asString() == "settings";
76 std::vector
<SettingSectionPtr
> sections
;
77 if (!strSection
.empty())
79 SettingSectionPtr section
= CServiceBroker::GetSettingsComponent()->GetSettings()->GetSection(strSection
);
83 sections
.push_back(section
);
86 sections
= CServiceBroker::GetSettingsComponent()->GetSettings()->GetSections();
88 result
["categories"] = CVariant(CVariant::VariantTypeArray
);
90 for (const auto& itSection
: sections
)
92 SettingCategoryList categories
= itSection
->GetCategories(level
);
93 for (const auto& itCategory
: categories
)
95 CVariant
varCategory(CVariant::VariantTypeObject
);
96 if (!SerializeSettingCategory(itCategory
, varCategory
))
101 varCategory
["groups"] = CVariant(CVariant::VariantTypeArray
);
103 SettingGroupList groups
= itCategory
->GetGroups(level
);
104 for (const auto& itGroup
: groups
)
106 CVariant
varGroup(CVariant::VariantTypeObject
);
107 if (!SerializeSettingGroup(itGroup
, varGroup
))
110 varGroup
["settings"] = CVariant(CVariant::VariantTypeArray
);
111 SettingList settings
= itGroup
->GetSettings(level
);
112 for (const auto& itSetting
: settings
)
114 if (itSetting
->IsVisible())
116 CVariant
varSetting(CVariant::VariantTypeObject
);
117 if (!SerializeSetting(itSetting
, varSetting
))
120 varGroup
["settings"].push_back(varSetting
);
124 varCategory
["groups"].push_back(varGroup
);
128 result
["categories"].push_back(varCategory
);
135 JSONRPC_STATUS
CSettingsOperations::GetSettings(const std::string
&method
, ITransportLayer
*transport
, IClient
*client
, const CVariant
¶meterObject
, CVariant
&result
)
137 SettingLevel level
= ParseSettingLevel(parameterObject
["level"].asString());
138 const CVariant
&filter
= parameterObject
["filter"];
139 bool doFilter
= filter
.isMember("section") && filter
.isMember("category");
140 std::string strSection
, strCategory
;
143 strSection
= filter
["section"].asString();
144 strCategory
= filter
["category"].asString();
147 std::vector
<SettingSectionPtr
> sections
;
151 SettingSectionPtr section
= CServiceBroker::GetSettingsComponent()->GetSettings()->GetSection(strSection
);
153 return InvalidParams
;
155 sections
.push_back(section
);
158 sections
= CServiceBroker::GetSettingsComponent()->GetSettings()->GetSections();
160 result
["settings"] = CVariant(CVariant::VariantTypeArray
);
162 for (const auto& itSection
: sections
)
164 SettingCategoryList categories
= itSection
->GetCategories(level
);
165 bool found
= !doFilter
;
166 for (const auto& itCategory
: categories
)
168 if (!doFilter
|| StringUtils::EqualsNoCase(itCategory
->GetId(), strCategory
))
170 SettingGroupList groups
= itCategory
->GetGroups(level
);
171 for (const auto& itGroup
: groups
)
173 SettingList settings
= itGroup
->GetSettings(level
);
174 for (const auto& itSetting
: settings
)
176 if (itSetting
->IsVisible())
178 CVariant
varSetting(CVariant::VariantTypeObject
);
179 if (!SerializeSetting(itSetting
, varSetting
))
182 result
["settings"].push_back(varSetting
);
193 if (doFilter
&& !found
)
194 return InvalidParams
;
200 JSONRPC_STATUS
CSettingsOperations::GetSettingValue(const std::string
&method
, ITransportLayer
*transport
, IClient
*client
, const CVariant
¶meterObject
, CVariant
&result
)
202 std::string settingId
= parameterObject
["setting"].asString();
204 SettingPtr setting
= CServiceBroker::GetSettingsComponent()->GetSettings()->GetSetting(settingId
);
205 if (setting
== NULL
||
206 !setting
->IsVisible())
207 return InvalidParams
;
210 switch (setting
->GetType())
212 case SettingType::Boolean
:
213 value
= std::static_pointer_cast
<CSettingBool
>(setting
)->GetValue();
216 case SettingType::Integer
:
217 value
= std::static_pointer_cast
<CSettingInt
>(setting
)->GetValue();
220 case SettingType::Number
:
221 value
= std::static_pointer_cast
<CSettingNumber
>(setting
)->GetValue();
224 case SettingType::String
:
225 value
= std::static_pointer_cast
<CSettingString
>(setting
)->GetValue();
228 case SettingType::List
:
230 SerializeSettingListValues(CServiceBroker::GetSettingsComponent()->GetSettings()->GetList(settingId
), value
);
234 case SettingType::Unknown
:
235 case SettingType::Action
:
237 return InvalidParams
;
240 result
["value"] = value
;
245 JSONRPC_STATUS
CSettingsOperations::SetSettingValue(const std::string
&method
, ITransportLayer
*transport
, IClient
*client
, const CVariant
¶meterObject
, CVariant
&result
)
247 std::string settingId
= parameterObject
["setting"].asString();
248 CVariant value
= parameterObject
["value"];
250 SettingPtr setting
= CServiceBroker::GetSettingsComponent()->GetSettings()->GetSetting(settingId
);
251 if (setting
== NULL
||
252 !setting
->IsVisible())
253 return InvalidParams
;
255 switch (setting
->GetType())
257 case SettingType::Boolean
:
258 if (!value
.isBoolean())
259 return InvalidParams
;
261 result
= std::static_pointer_cast
<CSettingBool
>(setting
)->SetValue(value
.asBoolean());
264 case SettingType::Integer
:
265 if (!value
.isInteger() && !value
.isUnsignedInteger())
266 return InvalidParams
;
268 result
= std::static_pointer_cast
<CSettingInt
>(setting
)->SetValue((int)value
.asInteger());
271 case SettingType::Number
:
272 if (!value
.isDouble())
273 return InvalidParams
;
275 result
= std::static_pointer_cast
<CSettingNumber
>(setting
)->SetValue(value
.asDouble());
278 case SettingType::String
:
279 if (!value
.isString())
280 return InvalidParams
;
282 result
= std::static_pointer_cast
<CSettingString
>(setting
)->SetValue(value
.asString());
285 case SettingType::List
:
287 if (!value
.isArray())
288 return InvalidParams
;
290 std::vector
<CVariant
> values
;
291 for (CVariant::const_iterator_array itValue
= value
.begin_array(); itValue
!= value
.end_array(); ++itValue
)
292 values
.push_back(*itValue
);
294 result
= CServiceBroker::GetSettingsComponent()->GetSettings()->SetList(settingId
, values
);
298 case SettingType::Unknown
:
299 case SettingType::Action
:
301 return InvalidParams
;
307 JSONRPC_STATUS
CSettingsOperations::ResetSettingValue(const std::string
&method
, ITransportLayer
*transport
, IClient
*client
, const CVariant
¶meterObject
, CVariant
&result
)
309 std::string settingId
= parameterObject
["setting"].asString();
311 SettingPtr setting
= CServiceBroker::GetSettingsComponent()->GetSettings()->GetSetting(settingId
);
312 if (setting
== NULL
||
313 !setting
->IsVisible())
314 return InvalidParams
;
316 switch (setting
->GetType())
318 case SettingType::Boolean
:
319 case SettingType::Integer
:
320 case SettingType::Number
:
321 case SettingType::String
:
322 case SettingType::List
:
326 case SettingType::Unknown
:
327 case SettingType::Action
:
329 return InvalidParams
;
335 SettingLevel
CSettingsOperations::ParseSettingLevel(const std::string
&strLevel
)
337 if (StringUtils::EqualsNoCase(strLevel
, "basic"))
338 return SettingLevel::Basic
;
339 if (StringUtils::EqualsNoCase(strLevel
, "advanced"))
340 return SettingLevel::Advanced
;
341 if (StringUtils::EqualsNoCase(strLevel
, "expert"))
342 return SettingLevel::Expert
;
344 return SettingLevel::Standard
;
347 bool CSettingsOperations::SerializeISetting(const std::shared_ptr
<const ISetting
>& setting
,
353 obj
["id"] = setting
->GetId();
358 bool CSettingsOperations::SerializeSettingSection(
359 const std::shared_ptr
<const CSettingSection
>& setting
, CVariant
& obj
)
361 if (!SerializeISetting(setting
, obj
))
364 obj
["label"] = g_localizeStrings
.Get(setting
->GetLabel());
365 if (setting
->GetHelp() >= 0)
366 obj
["help"] = g_localizeStrings
.Get(setting
->GetHelp());
371 bool CSettingsOperations::SerializeSettingCategory(
372 const std::shared_ptr
<const CSettingCategory
>& setting
, CVariant
& obj
)
374 if (!SerializeISetting(setting
, obj
))
377 obj
["label"] = g_localizeStrings
.Get(setting
->GetLabel());
378 if (setting
->GetHelp() >= 0)
379 obj
["help"] = g_localizeStrings
.Get(setting
->GetHelp());
384 bool CSettingsOperations::SerializeSettingGroup(const std::shared_ptr
<const CSettingGroup
>& setting
,
387 return SerializeISetting(setting
, obj
);
390 bool CSettingsOperations::SerializeSetting(const std::shared_ptr
<const CSetting
>& setting
,
393 if (!SerializeISetting(setting
, obj
))
396 obj
["label"] = g_localizeStrings
.Get(setting
->GetLabel());
397 if (setting
->GetHelp() >= 0)
398 obj
["help"] = g_localizeStrings
.Get(setting
->GetHelp());
400 switch (setting
->GetLevel())
402 case SettingLevel::Basic
:
403 obj
["level"] = "basic";
406 case SettingLevel::Standard
:
407 obj
["level"] = "standard";
410 case SettingLevel::Advanced
:
411 obj
["level"] = "advanced";
414 case SettingLevel::Expert
:
415 obj
["level"] = "expert";
422 obj
["enabled"] = setting
->IsEnabled();
423 obj
["parent"] = setting
->GetParent();
425 obj
["control"] = CVariant(CVariant::VariantTypeObject
);
426 if (!SerializeSettingControl(setting
->GetControl(), obj
["control"]))
429 switch (setting
->GetType())
431 case SettingType::Boolean
:
432 obj
["type"] = "boolean";
433 if (!SerializeSettingBool(std::static_pointer_cast
<const CSettingBool
>(setting
), obj
))
437 case SettingType::Integer
:
438 obj
["type"] = "integer";
439 if (!SerializeSettingInt(std::static_pointer_cast
<const CSettingInt
>(setting
), obj
))
443 case SettingType::Number
:
444 obj
["type"] = "number";
445 if (!SerializeSettingNumber(std::static_pointer_cast
<const CSettingNumber
>(setting
), obj
))
449 case SettingType::String
:
450 obj
["type"] = "string";
451 if (!SerializeSettingString(std::static_pointer_cast
<const CSettingString
>(setting
), obj
))
455 case SettingType::Action
:
456 obj
["type"] = "action";
457 if (!SerializeSettingAction(std::static_pointer_cast
<const CSettingAction
>(setting
), obj
))
461 case SettingType::List
:
462 obj
["type"] = "list";
463 if (!SerializeSettingList(std::static_pointer_cast
<const CSettingList
>(setting
), obj
))
474 bool CSettingsOperations::SerializeSettingBool(const std::shared_ptr
<const CSettingBool
>& setting
,
480 obj
["value"] = setting
->GetValue();
481 obj
["default"] = setting
->GetDefault();
486 bool CSettingsOperations::SerializeSettingInt(const std::shared_ptr
<const CSettingInt
>& setting
,
492 obj
["default"] = setting
->GetDefault();
494 switch (setting
->GetOptionsType())
496 case SettingOptionsType::StaticTranslatable
:
498 obj
["options"] = CVariant(CVariant::VariantTypeArray
);
499 const TranslatableIntegerSettingOptions
& options
= setting
->GetTranslatableOptions();
500 for (const auto& itOption
: options
)
502 CVariant
varOption(CVariant::VariantTypeObject
);
503 varOption
["label"] = g_localizeStrings
.Get(itOption
.label
);
504 varOption
["value"] = itOption
.value
;
505 obj
["options"].push_back(varOption
);
510 case SettingOptionsType::Static
:
512 obj
["options"] = CVariant(CVariant::VariantTypeArray
);
513 const IntegerSettingOptions
& options
= setting
->GetOptions();
514 for (const auto& itOption
: options
)
516 CVariant
varOption(CVariant::VariantTypeObject
);
517 varOption
["label"] = itOption
.label
;
518 varOption
["value"] = itOption
.value
;
519 obj
["options"].push_back(varOption
);
524 case SettingOptionsType::Dynamic
:
526 obj
["options"] = CVariant(CVariant::VariantTypeArray
);
527 IntegerSettingOptions options
= std::const_pointer_cast
<CSettingInt
>(setting
)->UpdateDynamicOptions();
528 for (const auto& itOption
: options
)
530 CVariant
varOption(CVariant::VariantTypeObject
);
531 varOption
["label"] = itOption
.label
;
532 varOption
["value"] = itOption
.value
;
533 obj
["options"].push_back(varOption
);
538 case SettingOptionsType::Unknown
:
540 obj
["minimum"] = setting
->GetMinimum();
541 obj
["step"] = setting
->GetStep();
542 obj
["maximum"] = setting
->GetMaximum();
546 // this must be done after potentially calling CSettingInt::UpdateDynamicOptions() because it can
547 // change the value of the setting
548 obj
["value"] = setting
->GetValue();
553 bool CSettingsOperations::SerializeSettingNumber(
554 const std::shared_ptr
<const CSettingNumber
>& setting
, CVariant
& obj
)
559 obj
["value"] = setting
->GetValue();
560 obj
["default"] = setting
->GetDefault();
562 obj
["minimum"] = setting
->GetMinimum();
563 obj
["step"] = setting
->GetStep();
564 obj
["maximum"] = setting
->GetMaximum();
569 bool CSettingsOperations::SerializeSettingString(
570 const std::shared_ptr
<const CSettingString
>& setting
, CVariant
& obj
)
575 obj
["default"] = setting
->GetDefault();
577 obj
["allowempty"] = setting
->AllowEmpty();
578 obj
["allownewoption"] = setting
->AllowNewOption();
580 switch (setting
->GetOptionsType())
582 case SettingOptionsType::StaticTranslatable
:
584 obj
["options"] = CVariant(CVariant::VariantTypeArray
);
585 const TranslatableStringSettingOptions
& options
= setting
->GetTranslatableOptions();
586 for (const auto& itOption
: options
)
588 CVariant
varOption(CVariant::VariantTypeObject
);
589 varOption
["label"] = g_localizeStrings
.Get(itOption
.first
);
590 varOption
["value"] = itOption
.second
;
591 obj
["options"].push_back(varOption
);
596 case SettingOptionsType::Static
:
598 obj
["options"] = CVariant(CVariant::VariantTypeArray
);
599 const StringSettingOptions
& options
= setting
->GetOptions();
600 for (const auto& itOption
: options
)
602 CVariant
varOption(CVariant::VariantTypeObject
);
603 varOption
["label"] = itOption
.label
;
604 varOption
["value"] = itOption
.value
;
605 obj
["options"].push_back(varOption
);
610 case SettingOptionsType::Dynamic
:
612 obj
["options"] = CVariant(CVariant::VariantTypeArray
);
613 StringSettingOptions options
= std::const_pointer_cast
<CSettingString
>(setting
)->UpdateDynamicOptions();
614 for (const auto& itOption
: options
)
616 CVariant
varOption(CVariant::VariantTypeObject
);
617 varOption
["label"] = itOption
.label
;
618 varOption
["value"] = itOption
.value
;
619 obj
["options"].push_back(varOption
);
624 case SettingOptionsType::Unknown
:
629 // this must be done after potentially calling CSettingString::UpdateDynamicOptions() because it
630 // can change the value of the setting
631 obj
["value"] = setting
->GetValue();
633 std::shared_ptr
<const ISettingControl
> control
= setting
->GetControl();
634 if (control
->GetFormat() == "path")
636 if (!SerializeSettingPath(std::static_pointer_cast
<const CSettingPath
>(setting
), obj
))
639 if (control
->GetFormat() == "addon")
641 if (!SerializeSettingAddon(std::static_pointer_cast
<const CSettingAddon
>(setting
), obj
))
644 if (control
->GetFormat() == "date")
646 if (!SerializeSettingDate(std::static_pointer_cast
<const CSettingDate
>(setting
), obj
))
649 if (control
->GetFormat() == "time")
651 if (!SerializeSettingTime(std::static_pointer_cast
<const CSettingTime
>(setting
), obj
))
658 bool CSettingsOperations::SerializeSettingAction(
659 const std::shared_ptr
<const CSettingAction
>& setting
, CVariant
& obj
)
664 obj
["data"] = setting
->GetData();
669 bool CSettingsOperations::SerializeSettingList(const std::shared_ptr
<const CSettingList
>& setting
,
672 if (setting
== NULL
||
673 !SerializeSetting(setting
->GetDefinition(), obj
["definition"]))
676 SerializeSettingListValues(CSettingUtils::GetList(setting
), obj
["value"]);
677 SerializeSettingListValues(CSettingUtils::ListToValues(setting
, setting
->GetDefault()), obj
["default"]);
679 obj
["elementtype"] = obj
["definition"]["type"];
680 obj
["delimiter"] = setting
->GetDelimiter();
681 obj
["minimumItems"] = setting
->GetMinimumItems();
682 obj
["maximumItems"] = setting
->GetMaximumItems();
687 bool CSettingsOperations::SerializeSettingPath(const std::shared_ptr
<const CSettingPath
>& setting
,
693 obj
["type"] = "path";
694 obj
["writable"] = setting
->Writable();
695 obj
["sources"] = setting
->GetSources();
700 bool CSettingsOperations::SerializeSettingAddon(const std::shared_ptr
<const CSettingAddon
>& setting
,
706 obj
["type"] = "addon";
707 obj
["addontype"] = ADDON::CAddonInfo::TranslateType(setting
->GetAddonType());
712 bool CSettingsOperations::SerializeSettingDate(const std::shared_ptr
<const CSettingDate
>& setting
,
718 obj
["type"] = "date";
723 bool CSettingsOperations::SerializeSettingTime(const std::shared_ptr
<const CSettingTime
>& setting
,
729 obj
["type"] = "time";
734 bool CSettingsOperations::SerializeSettingControl(
735 const std::shared_ptr
<const ISettingControl
>& control
, CVariant
& obj
)
740 const std::string
& type
= control
->GetType();
742 obj
["format"] = control
->GetFormat();
743 obj
["delayed"] = control
->GetDelayed();
745 if (type
== "spinner")
747 std::shared_ptr
<const CSettingControlSpinner
> spinner
= std::static_pointer_cast
<const CSettingControlSpinner
>(control
);
748 if (spinner
->GetFormatLabel() >= 0)
749 obj
["formatlabel"] = g_localizeStrings
.Get(spinner
->GetFormatLabel());
750 else if (!spinner
->GetFormatString().empty() && spinner
->GetFormatString() != "{:d}")
751 obj
["formatlabel"] = spinner
->GetFormatString();
752 if (spinner
->GetMinimumLabel() >= 0)
753 obj
["minimumlabel"] = g_localizeStrings
.Get(spinner
->GetMinimumLabel());
755 else if (type
== "edit")
757 std::shared_ptr
<const CSettingControlEdit
> edit
= std::static_pointer_cast
<const CSettingControlEdit
>(control
);
758 obj
["hidden"] = edit
->IsHidden();
759 obj
["verifynewvalue"] = edit
->VerifyNewValue();
760 if (edit
->GetHeading() >= 0)
761 obj
["heading"] = g_localizeStrings
.Get(edit
->GetHeading());
763 else if (type
== "button")
765 std::shared_ptr
<const CSettingControlButton
> button
= std::static_pointer_cast
<const CSettingControlButton
>(control
);
766 if (button
->GetHeading() >= 0)
767 obj
["heading"] = g_localizeStrings
.Get(button
->GetHeading());
769 else if (type
== "list")
771 std::shared_ptr
<const CSettingControlList
> list
= std::static_pointer_cast
<const CSettingControlList
>(control
);
772 if (list
->GetHeading() >= 0)
773 obj
["heading"] = g_localizeStrings
.Get(list
->GetHeading());
774 obj
["multiselect"] = list
->CanMultiSelect();
776 else if (type
== "slider")
778 std::shared_ptr
<const CSettingControlSlider
> slider
= std::static_pointer_cast
<const CSettingControlSlider
>(control
);
779 if (slider
->GetHeading() >= 0)
780 obj
["heading"] = g_localizeStrings
.Get(slider
->GetHeading());
781 obj
["popup"] = slider
->UsePopup();
782 if (slider
->GetFormatLabel() >= 0)
783 obj
["formatlabel"] = g_localizeStrings
.Get(slider
->GetFormatLabel());
785 obj
["formatlabel"] = slider
->GetFormatString();
787 else if (type
== "range")
789 std::shared_ptr
<const CSettingControlRange
> range
= std::static_pointer_cast
<const CSettingControlRange
>(control
);
790 if (range
->GetFormatLabel() >= 0)
791 obj
["formatlabel"] = g_localizeStrings
.Get(range
->GetFormatLabel());
793 obj
["formatlabel"] = "";
794 if (range
->GetValueFormatLabel() >= 0)
795 obj
["formatvalue"] = g_localizeStrings
.Get(range
->GetValueFormatLabel());
797 obj
["formatvalue"] = range
->GetValueFormat();
799 else if (type
!= "toggle" && type
!= "label")
805 void CSettingsOperations::SerializeSettingListValues(const std::vector
<CVariant
> &values
, CVariant
&obj
)
807 obj
= CVariant(CVariant::VariantTypeArray
);
808 for (const auto& itValue
: values
)
809 obj
.push_back(itValue
);
812 JSONRPC_STATUS
CSettingsOperations::GetSkinSettings(const std::string
& method
,
813 ITransportLayer
* transport
,
815 const CVariant
& parameterObject
,
818 const std::set
<ADDON::CSkinSettingPtr
> settings
= CSkinSettings::GetInstance().GetSettings();
819 CVariant
varSettings(CVariant::VariantTypeArray
);
821 for (const auto& setting
: settings
)
823 CVariant
varSetting(CVariant::VariantTypeObject
);
824 varSetting
["id"] = setting
->name
;
826 if (setting
->GetType() == "bool")
828 varSetting
["value"] = std::static_pointer_cast
<ADDON::CSkinSettingBool
>(setting
)->value
;
829 varSetting
["type"] = "boolean";
831 else if (setting
->GetType() == "string")
833 varSetting
["value"] = std::static_pointer_cast
<ADDON::CSkinSettingString
>(setting
)->value
;
834 varSetting
["type"] = setting
->GetType();
839 varSettings
.push_back(varSetting
);
842 result
["skin"] = CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(
843 CSettings::SETTING_LOOKANDFEEL_SKIN
);
844 result
["settings"] = varSettings
;
848 JSONRPC_STATUS
CSettingsOperations::GetSkinSettingValue(const std::string
& method
,
849 ITransportLayer
* transport
,
851 const CVariant
& parameterObject
,
854 const std::string settingId
= parameterObject
["setting"].asString();
855 ADDON::CSkinSettingPtr setting
= CSkinSettings::GetInstance().GetSetting(settingId
);
857 if (setting
== nullptr)
858 return InvalidParams
;
861 if (setting
->GetType() == "string")
862 value
= std::static_pointer_cast
<ADDON::CSkinSettingString
>(setting
)->value
;
863 else if (setting
->GetType() == "bool")
864 value
= std::static_pointer_cast
<ADDON::CSkinSettingBool
>(setting
)->value
;
866 return InvalidParams
;
868 result
["value"] = value
;
872 JSONRPC_STATUS
CSettingsOperations::SetSkinSettingValue(const std::string
& method
,
873 ITransportLayer
* transport
,
875 const CVariant
& parameterObject
,
878 const std::string settingId
= parameterObject
["setting"].asString();
879 ADDON::CSkinSettingPtr setting
= CSkinSettings::GetInstance().GetSetting(settingId
);
881 if (setting
== nullptr)
882 return InvalidParams
;
884 CVariant value
= parameterObject
["value"];
885 if (setting
->GetType() == "string")
887 if (!value
.isString())
888 return InvalidParams
;
890 result
= std::static_pointer_cast
<ADDON::CSkinSettingString
>(setting
)->value
= value
.asString();
892 else if (setting
->GetType() == "bool")
894 if (!value
.isBoolean())
895 return InvalidParams
;
897 result
= std::static_pointer_cast
<ADDON::CSkinSettingBool
>(setting
)->value
= value
.asBoolean();
901 return InvalidParams
;