2 * Copyright (C) 2005-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.
11 #include "GUIUserMessages.h"
12 #include "LanguageHook.h"
13 #include "ServiceBroker.h"
14 #include "addons/AddonManager.h"
15 #include "addons/addoninfo/AddonInfo.h"
16 #include "addons/gui/GUIDialogAddonSettings.h"
17 #include "addons/settings/AddonSettings.h"
18 #include "guilib/GUIComponent.h"
19 #include "guilib/GUIWindowManager.h"
20 #include "guilib/LocalizeStrings.h"
21 #include "utils/StringUtils.h"
23 using namespace ADDON
;
29 String
Addon::getDefaultId() { return languageHook
== NULL
? emptyString
: languageHook
->GetAddonId(); }
31 String
Addon::getAddonVersion() { return languageHook
== NULL
? emptyString
: languageHook
->GetAddonVersion(); }
33 bool Addon::UpdateSettingInActiveDialog(const char* id
, const String
& value
)
35 ADDON::AddonPtr
addon(pAddon
);
36 if (!CServiceBroker::GetGUI()->GetWindowManager().IsWindowActive(WINDOW_DIALOG_ADDON_SETTINGS
))
39 CGUIDialogAddonSettings
* dialog
= CServiceBroker::GetGUI()->GetWindowManager().GetWindow
<CGUIDialogAddonSettings
>(WINDOW_DIALOG_ADDON_SETTINGS
);
40 if (dialog
->GetCurrentAddonID() != addon
->ID())
43 CGUIMessage
message(GUI_MSG_SETTING_UPDATED
, 0, 0);
44 std::vector
<std::string
> params
;
45 params
.emplace_back(id
);
46 params
.push_back(value
);
47 message
.SetStringParams(params
);
48 message
.SetParam1(ADDON_SETTINGS_ID
);
49 CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(message
, WINDOW_DIALOG_ADDON_SETTINGS
);
54 Addon::Addon(const char* cid
)
56 String
id(cid
? cid
: emptyString
);
58 // if the id wasn't passed then get the id from
59 // the global dictionary
63 // if we still don't have an id then bail
65 throw AddonException("No valid addon id could be obtained. None was passed and the script "
66 "wasn't executed in a normal Kodi manner.");
68 if (!CServiceBroker::GetAddonMgr().GetAddon(id
, pAddon
, OnlyEnabled::CHOICE_YES
))
69 throw AddonException("Unknown addon id '%s'.", id
.c_str());
71 CServiceBroker::GetAddonMgr().AddToUpdateableAddons(pAddon
);
76 CServiceBroker::GetAddonMgr().RemoveFromUpdateableAddons(pAddon
);
79 String
Addon::getLocalizedString(int id
)
81 return g_localizeStrings
.GetAddonString(pAddon
->ID(), id
);
84 Settings
* Addon::getSettings()
86 return new Settings(pAddon
->GetSettings());
89 String
Addon::getSetting(const char* id
)
91 return pAddon
->GetSetting(id
);
94 bool Addon::getSettingBool(const char* id
)
97 if (!pAddon
->GetSettingBool(id
, value
))
98 throw XBMCAddon::WrongTypeException("Invalid setting type");
103 int Addon::getSettingInt(const char* id
)
106 if (!pAddon
->GetSettingInt(id
, value
))
107 throw XBMCAddon::WrongTypeException("Invalid setting type");
112 double Addon::getSettingNumber(const char* id
)
115 if (!pAddon
->GetSettingNumber(id
, value
))
116 throw XBMCAddon::WrongTypeException("Invalid setting type");
121 String
Addon::getSettingString(const char* id
)
124 if (!pAddon
->GetSettingString(id
, value
))
125 throw XBMCAddon::WrongTypeException("Invalid setting type");
130 void Addon::setSetting(const char* id
, const String
& value
)
132 DelayedCallGuard
dcguard(languageHook
);
133 ADDON::AddonPtr
addon(pAddon
);
134 if (!UpdateSettingInActiveDialog(id
, value
))
136 addon
->UpdateSetting(id
, value
);
137 addon
->SaveSettings();
141 bool Addon::setSettingBool(const char* id
, bool value
)
143 DelayedCallGuard
dcguard(languageHook
);
144 ADDON::AddonPtr
addon(pAddon
);
145 if (UpdateSettingInActiveDialog(id
, value
? "true" : "false"))
148 if (!addon
->UpdateSettingBool(id
, value
))
149 throw XBMCAddon::WrongTypeException("Invalid setting type");
151 addon
->SaveSettings();
156 bool Addon::setSettingInt(const char* id
, int value
)
158 DelayedCallGuard
dcguard(languageHook
);
159 ADDON::AddonPtr
addon(pAddon
);
160 if (UpdateSettingInActiveDialog(id
, std::to_string(value
)))
163 if (!addon
->UpdateSettingInt(id
, value
))
164 throw XBMCAddon::WrongTypeException("Invalid setting type");
166 addon
->SaveSettings();
171 bool Addon::setSettingNumber(const char* id
, double value
)
173 DelayedCallGuard
dcguard(languageHook
);
174 ADDON::AddonPtr
addon(pAddon
);
175 if (UpdateSettingInActiveDialog(id
, StringUtils::Format("{:f}", value
)))
178 if (!addon
->UpdateSettingNumber(id
, value
))
179 throw XBMCAddon::WrongTypeException("Invalid setting type");
181 addon
->SaveSettings();
186 bool Addon::setSettingString(const char* id
, const String
& value
)
188 DelayedCallGuard
dcguard(languageHook
);
189 ADDON::AddonPtr
addon(pAddon
);
190 if (UpdateSettingInActiveDialog(id
, value
))
193 if (!addon
->UpdateSettingString(id
, value
))
194 throw XBMCAddon::WrongTypeException("Invalid setting type");
196 addon
->SaveSettings();
201 void Addon::openSettings()
203 DelayedCallGuard
dcguard(languageHook
);
204 // show settings dialog
205 ADDON::AddonPtr
addon(pAddon
);
206 CGUIDialogAddonSettings::ShowForAddon(addon
);
209 String
Addon::getAddonInfo(const char* id
)
211 if (StringUtils::CompareNoCase(id
, "author") == 0)
212 return pAddon
->Author();
213 else if (StringUtils::CompareNoCase(id
, "changelog") == 0)
214 return pAddon
->ChangeLog();
215 else if (StringUtils::CompareNoCase(id
, "description") == 0)
216 return pAddon
->Description();
217 else if (StringUtils::CompareNoCase(id
, "disclaimer") == 0)
218 return pAddon
->Disclaimer();
219 else if (StringUtils::CompareNoCase(id
, "fanart") == 0)
220 return pAddon
->FanArt();
221 else if (StringUtils::CompareNoCase(id
, "icon") == 0)
222 return pAddon
->Icon();
223 else if (StringUtils::CompareNoCase(id
, "id") == 0)
225 else if (StringUtils::CompareNoCase(id
, "name") == 0)
226 return pAddon
->Name();
227 else if (StringUtils::CompareNoCase(id
, "path") == 0)
228 return pAddon
->Path();
229 else if (StringUtils::CompareNoCase(id
, "profile") == 0)
230 return pAddon
->Profile();
231 else if (StringUtils::CompareNoCase(id
, "stars") == 0)
232 return StringUtils::Format("-1");
233 else if (StringUtils::CompareNoCase(id
, "summary") == 0)
234 return pAddon
->Summary();
235 else if (StringUtils::CompareNoCase(id
, "type") == 0)
236 return ADDON::CAddonInfo::TranslateType(pAddon
->Type());
237 else if (StringUtils::CompareNoCase(id
, "version") == 0)
238 return pAddon
->Version().asString();
240 throw AddonException("'%s' is an invalid Id", id
);