1 /*
2  *  Copyright (C) 2005-2018 Team Kodi
3  *  This file is part of Kodi - https://kodi.tv
4  *
5  *  SPDX-License-Identifier: GPL-2.0-or-later
6  *  See LICENSES/README.md for more information.
7  */
8 
9 #include "Settings.h"
10 #include "Application.h"
11 #include "Autorun.h"
12 #include "LangInfo.h"
13 #include "Util.h"
14 #include "addons/AddonSystemSettings.h"
15 #include "addons/Skin.h"
16 #include "cores/VideoPlayer/VideoRenderers/BaseRenderer.h"
17 #include "filesystem/File.h"
18 #include "guilib/GUIFontManager.h"
19 #include "guilib/StereoscopicsManager.h"
20 #include "GUIPassword.h"
21 #include "input/KeyboardLayoutManager.h"
22 #if defined(TARGET_POSIX)
23 #include "platform/posix/PosixTimezone.h"
24 #endif // defined(TARGET_POSIX)
25 #include "network/upnp/UPnPSettings.h"
26 #include "network/WakeOnAccess.h"
27 #if defined(TARGET_DARWIN_OSX)
28 #include "platform/darwin/osx/XBMCHelper.h"
29 #endif // defined(TARGET_DARWIN_OSX)
30 #if defined(TARGET_DARWIN_TVOS)
31 #include "platform/darwin/tvos/TVOSSettingsHandler.h"
32 #endif // defined(TARGET_DARWIN_TVOS)
33 #if defined(TARGET_DARWIN_EMBEDDED)
34 #include "SettingAddon.h"
35 #endif
36 #include "powermanagement/PowerTypes.h"
37 #include "profiles/ProfileManager.h"
38 #include "ServiceBroker.h"
39 #include "settings/DisplaySettings.h"
40 #include "settings/MediaSettings.h"
41 #include "settings/MediaSourceSettings.h"
42 #include "settings/SettingsComponent.h"
43 #include "settings/SettingConditions.h"
44 #include "settings/SkinSettings.h"
45 #include "settings/lib/SettingsManager.h"
46 #include "threads/SingleLock.h"
47 #include "utils/CharsetConverter.h"
48 #include "utils/log.h"
49 #include "utils/RssManager.h"
50 #include "utils/StringUtils.h"
51 #include "utils/SystemInfo.h"
52 #include "utils/XBMCTinyXML.h"
53 #include "SeekHandler.h"
54 #include "utils/Variant.h"
55 #include "view/ViewStateSettings.h"
56 #include "DiscSettings.h"
57 
58 #define SETTINGS_XML_FOLDER "special://xbmc/system/settings/"
59 
60 using namespace KODI;
61 using namespace XFILE;
62 
63 //! @todo: remove in c++17
64 constexpr const char* CSettings::SETTING_LOOKANDFEEL_SKIN;
65 constexpr const char* CSettings::SETTING_LOOKANDFEEL_SKINSETTINGS;
66 constexpr const char* CSettings::SETTING_LOOKANDFEEL_SKINTHEME;
67 constexpr const char* CSettings::SETTING_LOOKANDFEEL_SKINCOLORS;
68 constexpr const char* CSettings::SETTING_LOOKANDFEEL_FONT;
69 constexpr const char* CSettings::SETTING_LOOKANDFEEL_SKINZOOM;
70 constexpr const char* CSettings::SETTING_LOOKANDFEEL_STARTUPACTION;
71 constexpr const char* CSettings::SETTING_LOOKANDFEEL_STARTUPWINDOW;
72 constexpr const char* CSettings::SETTING_LOOKANDFEEL_SOUNDSKIN;
73 constexpr const char* CSettings::SETTING_LOOKANDFEEL_ENABLERSSFEEDS;
74 constexpr const char* CSettings::SETTING_LOOKANDFEEL_RSSEDIT;
75 constexpr const char* CSettings::SETTING_LOOKANDFEEL_STEREOSTRENGTH;
76 constexpr const char* CSettings::SETTING_LOCALE_LANGUAGE;
77 constexpr const char* CSettings::SETTING_LOCALE_COUNTRY;
78 constexpr const char* CSettings::SETTING_LOCALE_CHARSET;
79 constexpr const char* CSettings::SETTING_LOCALE_KEYBOARDLAYOUTS;
80 constexpr const char* CSettings::SETTING_LOCALE_ACTIVEKEYBOARDLAYOUT;
81 constexpr const char* CSettings::SETTING_LOCALE_TIMEZONECOUNTRY;
82 constexpr const char* CSettings::SETTING_LOCALE_TIMEZONE;
83 constexpr const char* CSettings::SETTING_LOCALE_SHORTDATEFORMAT;
84 constexpr const char* CSettings::SETTING_LOCALE_LONGDATEFORMAT;
85 constexpr const char* CSettings::SETTING_LOCALE_TIMEFORMAT;
86 constexpr const char* CSettings::SETTING_LOCALE_USE24HOURCLOCK;
87 constexpr const char* CSettings::SETTING_LOCALE_TEMPERATUREUNIT;
88 constexpr const char* CSettings::SETTING_LOCALE_SPEEDUNIT;
89 constexpr const char* CSettings::SETTING_FILELISTS_SHOWPARENTDIRITEMS;
90 constexpr const char* CSettings::SETTING_FILELISTS_SHOWEXTENSIONS;
91 constexpr const char* CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING;
92 constexpr const char* CSettings::SETTING_FILELISTS_ALLOWFILEDELETION;
93 constexpr const char* CSettings::SETTING_FILELISTS_SHOWADDSOURCEBUTTONS;
94 constexpr const char* CSettings::SETTING_FILELISTS_SHOWHIDDEN;
95 constexpr const char* CSettings::SETTING_SCREENSAVER_MODE;
96 constexpr const char* CSettings::SETTING_SCREENSAVER_SETTINGS;
97 constexpr const char* CSettings::SETTING_SCREENSAVER_PREVIEW;
98 constexpr const char* CSettings::SETTING_SCREENSAVER_TIME;
99 constexpr const char* CSettings::SETTING_SCREENSAVER_USEMUSICVISINSTEAD;
100 constexpr const char* CSettings::SETTING_SCREENSAVER_USEDIMONPAUSE;
101 constexpr const char* CSettings::SETTING_WINDOW_WIDTH;
102 constexpr const char* CSettings::SETTING_WINDOW_HEIGHT;
103 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_SHOWUNWATCHEDPLOTS;
104 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_ACTORTHUMBS;
105 constexpr const char* CSettings::SETTING_MYVIDEOS_FLATTEN;
106 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_FLATTENTVSHOWS;
107 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_TVSHOWSSELECTFIRSTUNWATCHEDITEM;
108 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_TVSHOWSINCLUDEALLSEASONSANDSPECIALS;
109 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_SHOWALLITEMS;
110 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_GROUPMOVIESETS;
111 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_GROUPSINGLEITEMSETS;
112 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_UPDATEONSTARTUP;
113 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_BACKGROUNDUPDATE;
114 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_CLEANUP;
115 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_EXPORT;
116 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_IMPORT;
117 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_SHOWEMPTYTVSHOWS;
118 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_MOVIESETSFOLDER;
119 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_ARTWORK_LEVEL;
120 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_MOVIEART_WHITELIST;
121 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_TVSHOWART_WHITELIST;
122 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_EPISODEART_WHITELIST;
123 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_MUSICVIDEOART_WHITELIST;
124 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_ARTSETTINGS_UPDATED;
125 constexpr const char* CSettings::SETTING_VIDEOLIBRARY_SHOWPERFORMERS;
126 constexpr const char* CSettings::SETTING_LOCALE_AUDIOLANGUAGE;
127 constexpr const char* CSettings::SETTING_VIDEOPLAYER_PREFERDEFAULTFLAG;
128 constexpr const char* CSettings::SETTING_VIDEOPLAYER_AUTOPLAYNEXTITEM;
129 constexpr const char* CSettings::SETTING_VIDEOPLAYER_SEEKSTEPS;
130 constexpr const char* CSettings::SETTING_VIDEOPLAYER_SEEKDELAY;
131 constexpr const char* CSettings::SETTING_VIDEOPLAYER_ADJUSTREFRESHRATE;
132 constexpr const char* CSettings::SETTING_VIDEOPLAYER_USEDISPLAYASCLOCK;
133 constexpr const char* CSettings::SETTING_VIDEOPLAYER_ERRORINASPECT;
134 constexpr const char* CSettings::SETTING_VIDEOPLAYER_STRETCH43;
135 constexpr const char* CSettings::SETTING_VIDEOPLAYER_TELETEXTENABLED;
136 constexpr const char* CSettings::SETTING_VIDEOPLAYER_TELETEXTSCALE;
137 constexpr const char* CSettings::SETTING_VIDEOPLAYER_STEREOSCOPICPLAYBACKMODE;
138 constexpr const char* CSettings::SETTING_VIDEOPLAYER_QUITSTEREOMODEONSTOP;
139 constexpr const char* CSettings::SETTING_VIDEOPLAYER_RENDERMETHOD;
140 constexpr const char* CSettings::SETTING_VIDEOPLAYER_HQSCALERS;
141 constexpr const char* CSettings::SETTING_VIDEOPLAYER_USEMEDIACODEC;
142 constexpr const char* CSettings::SETTING_VIDEOPLAYER_USEMEDIACODECSURFACE;
143 constexpr const char* CSettings::SETTING_VIDEOPLAYER_USEVDPAU;
144 constexpr const char* CSettings::SETTING_VIDEOPLAYER_USEVDPAUMIXER;
145 constexpr const char* CSettings::SETTING_VIDEOPLAYER_USEVDPAUMPEG2;
146 constexpr const char* CSettings::SETTING_VIDEOPLAYER_USEVDPAUMPEG4;
147 constexpr const char* CSettings::SETTING_VIDEOPLAYER_USEVDPAUVC1;
148 constexpr const char* CSettings::SETTING_VIDEOPLAYER_USEDXVA2;
149 constexpr const char* CSettings::SETTING_VIDEOPLAYER_USEVTB;
150 constexpr const char* CSettings::SETTING_VIDEOPLAYER_USEPRIMEDECODER;
151 constexpr const char* CSettings::SETTING_VIDEOPLAYER_USESTAGEFRIGHT;
152 constexpr const char* CSettings::SETTING_VIDEOPLAYER_LIMITGUIUPDATE;
153 constexpr const char* CSettings::SETTING_VIDEOPLAYER_SUPPORTMVC;
154 constexpr const char* CSettings::SETTING_MYVIDEOS_SELECTACTION;
155 constexpr const char* CSettings::SETTING_MYVIDEOS_USETAGS;
156 constexpr const char* CSettings::SETTING_MYVIDEOS_EXTRACTFLAGS;
157 constexpr const char* CSettings::SETTING_MYVIDEOS_EXTRACTCHAPTERTHUMBS;
158 constexpr const char* CSettings::SETTING_MYVIDEOS_REPLACELABELS;
159 constexpr const char* CSettings::SETTING_MYVIDEOS_EXTRACTTHUMB;
160 constexpr const char* CSettings::SETTING_MYVIDEOS_STACKVIDEOS;
161 constexpr const char* CSettings::SETTING_LOCALE_SUBTITLELANGUAGE;
162 constexpr const char* CSettings::SETTING_SUBTITLES_PARSECAPTIONS;
163 constexpr const char* CSettings::SETTING_SUBTITLES_ALIGN;
164 constexpr const char* CSettings::SETTING_SUBTITLES_STEREOSCOPICDEPTH;
165 constexpr const char* CSettings::SETTING_SUBTITLES_FONT;
166 constexpr const char* CSettings::SETTING_SUBTITLES_HEIGHT;
167 constexpr const char* CSettings::SETTING_SUBTITLES_STYLE;
168 constexpr const char* CSettings::SETTING_SUBTITLES_COLOR;
169 constexpr const char* CSettings::SETTING_SUBTITLES_BGCOLOR;
170 constexpr const char* CSettings::SETTING_SUBTITLES_BGOPACITY;
171 constexpr const char* CSettings::SETTING_SUBTITLES_CHARSET;
172 constexpr const char* CSettings::SETTING_SUBTITLES_OVERRIDEASSFONTS;
173 constexpr const char* CSettings::SETTING_SUBTITLES_LANGUAGES;
174 constexpr const char* CSettings::SETTING_SUBTITLES_STORAGEMODE;
175 constexpr const char* CSettings::SETTING_SUBTITLES_CUSTOMPATH;
176 constexpr const char* CSettings::SETTING_SUBTITLES_PAUSEONSEARCH;
177 constexpr const char* CSettings::SETTING_SUBTITLES_DOWNLOADFIRST;
178 constexpr const char* CSettings::SETTING_SUBTITLES_TV;
179 constexpr const char* CSettings::SETTING_SUBTITLES_MOVIE;
180 constexpr const char* CSettings::SETTING_DVDS_AUTORUN;
181 constexpr const char* CSettings::SETTING_DVDS_PLAYERREGION;
182 constexpr const char* CSettings::SETTING_DVDS_AUTOMENU;
183 constexpr const char* CSettings::SETTING_DISC_PLAYBACK;
184 constexpr const char* CSettings::SETTING_BLURAY_PLAYERREGION;
185 constexpr const char* CSettings::SETTING_ACCESSIBILITY_AUDIOVISUAL;
186 constexpr const char* CSettings::SETTING_ACCESSIBILITY_AUDIOHEARING;
187 constexpr const char* CSettings::SETTING_ACCESSIBILITY_SUBHEARING;
188 constexpr const char* CSettings::SETTING_SCRAPERS_MOVIESDEFAULT;
189 constexpr const char* CSettings::SETTING_SCRAPERS_TVSHOWSDEFAULT;
190 constexpr const char* CSettings::SETTING_SCRAPERS_MUSICVIDEOSDEFAULT;
191 constexpr const char* CSettings::SETTING_PVRMANAGER_PRESELECTPLAYINGCHANNEL;
192 constexpr const char* CSettings::SETTING_PVRMANAGER_SYNCCHANNELGROUPS;
193 constexpr const char* CSettings::SETTING_PVRMANAGER_BACKENDCHANNELORDER;
194 constexpr const char* CSettings::SETTING_PVRMANAGER_USEBACKENDCHANNELNUMBERS;
195 constexpr const char* CSettings::SETTING_PVRMANAGER_USEBACKENDCHANNELNUMBERSALWAYS;
196 constexpr const char* CSettings::SETTING_PVRMANAGER_STARTGROUPCHANNELNUMBERSFROMONE;
197 constexpr const char* CSettings::SETTING_PVRMANAGER_CLIENTPRIORITIES;
198 constexpr const char* CSettings::SETTING_PVRMANAGER_CHANNELMANAGER;
199 constexpr const char* CSettings::SETTING_PVRMANAGER_GROUPMANAGER;
200 constexpr const char* CSettings::SETTING_PVRMANAGER_CHANNELSCAN;
201 constexpr const char* CSettings::SETTING_PVRMANAGER_RESETDB;
202 constexpr const char* CSettings::SETTING_PVRMENU_DISPLAYCHANNELINFO;
203 constexpr const char* CSettings::SETTING_PVRMENU_CLOSECHANNELOSDONSWITCH;
204 constexpr const char* CSettings::SETTING_PVRMENU_ICONPATH;
205 constexpr const char* CSettings::SETTING_PVRMENU_SEARCHICONS;
206 constexpr const char* CSettings::SETTING_EPG_PAST_DAYSTODISPLAY;
207 constexpr const char* CSettings::SETTING_EPG_FUTURE_DAYSTODISPLAY;
208 constexpr const char* CSettings::SETTING_EPG_SELECTACTION;
209 constexpr const char* CSettings::SETTING_EPG_HIDENOINFOAVAILABLE;
210 constexpr const char* CSettings::SETTING_EPG_EPGUPDATE;
211 constexpr const char* CSettings::SETTING_EPG_PREVENTUPDATESWHILEPLAYINGTV;
212 constexpr const char* CSettings::SETTING_EPG_RESETEPG;
213 constexpr const char* CSettings::SETTING_PVRPLAYBACK_SWITCHTOFULLSCREENCHANNELTYPES;
214 constexpr const char* CSettings::SETTING_PVRPLAYBACK_SIGNALQUALITY;
215 constexpr const char* CSettings::SETTING_PVRPLAYBACK_CONFIRMCHANNELSWITCH;
216 constexpr const char* CSettings::SETTING_PVRPLAYBACK_CHANNELENTRYTIMEOUT;
217 constexpr const char* CSettings::SETTING_PVRPLAYBACK_DELAYMARKLASTWATCHED;
218 constexpr const char* CSettings::SETTING_PVRPLAYBACK_FPS;
219 constexpr const char* CSettings::SETTING_PVRRECORD_INSTANTRECORDACTION;
220 constexpr const char* CSettings::SETTING_PVRRECORD_INSTANTRECORDTIME;
221 constexpr const char* CSettings::SETTING_PVRRECORD_MARGINSTART;
222 constexpr const char* CSettings::SETTING_PVRRECORD_MARGINEND;
223 constexpr const char* CSettings::SETTING_PVRRECORD_TIMERNOTIFICATIONS;
224 constexpr const char* CSettings::SETTING_PVRRECORD_GROUPRECORDINGS;
225 constexpr const char* CSettings::SETTING_PVRREMINDERS_AUTOCLOSEDELAY;
226 constexpr const char* CSettings::SETTING_PVRREMINDERS_AUTORECORD;
227 constexpr const char* CSettings::SETTING_PVRREMINDERS_AUTOSWITCH;
228 constexpr const char* CSettings::SETTING_PVRPOWERMANAGEMENT_ENABLED;
229 constexpr const char* CSettings::SETTING_PVRPOWERMANAGEMENT_BACKENDIDLETIME;
230 constexpr const char* CSettings::SETTING_PVRPOWERMANAGEMENT_SETWAKEUPCMD;
231 constexpr const char* CSettings::SETTING_PVRPOWERMANAGEMENT_PREWAKEUP;
232 constexpr const char* CSettings::SETTING_PVRPOWERMANAGEMENT_DAILYWAKEUP;
233 constexpr const char* CSettings::SETTING_PVRPOWERMANAGEMENT_DAILYWAKEUPTIME;
234 constexpr const char* CSettings::SETTING_PVRPARENTAL_ENABLED;
235 constexpr const char* CSettings::SETTING_PVRPARENTAL_PIN;
236 constexpr const char* CSettings::SETTING_PVRPARENTAL_DURATION;
237 constexpr const char* CSettings::SETTING_PVRCLIENT_MENUHOOK;
238 constexpr const char* CSettings::SETTING_PVRTIMERS_HIDEDISABLEDTIMERS;
239 constexpr const char* CSettings::SETTING_MUSICLIBRARY_SHOWCOMPILATIONARTISTS;
240 constexpr const char* CSettings::SETTING_MUSICLIBRARY_SHOWDISCS;
241 constexpr const char* CSettings::SETTING_MUSICLIBRARY_USEORIGINALDATE;
242 constexpr const char* CSettings::SETTING_MUSICLIBRARY_USEARTISTSORTNAME;
243 constexpr const char* CSettings::SETTING_MUSICLIBRARY_DOWNLOADINFO;
244 constexpr const char* CSettings::SETTING_MUSICLIBRARY_ARTISTSFOLDER;
245 constexpr const char* CSettings::SETTING_MUSICLIBRARY_PREFERONLINEALBUMART;
246 constexpr const char* CSettings::SETTING_MUSICLIBRARY_ARTWORKLEVEL;
247 constexpr const char* CSettings::SETTING_MUSICLIBRARY_USEALLLOCALART;
248 constexpr const char* CSettings::SETTING_MUSICLIBRARY_USEALLREMOTEART;
249 constexpr const char* CSettings::SETTING_MUSICLIBRARY_ARTISTART_WHITELIST;
250 constexpr const char* CSettings::SETTING_MUSICLIBRARY_ALBUMART_WHITELIST;
251 constexpr const char* CSettings::SETTING_MUSICLIBRARY_MUSICTHUMBS;
252 constexpr const char* CSettings::SETTING_MUSICLIBRARY_ARTSETTINGS_UPDATED;
253 constexpr const char* CSettings::SETTING_MUSICLIBRARY_ALBUMSSCRAPER;
254 constexpr const char* CSettings::SETTING_MUSICLIBRARY_ARTISTSSCRAPER;
255 constexpr const char* CSettings::SETTING_MUSICLIBRARY_OVERRIDETAGS;
256 constexpr const char* CSettings::SETTING_MUSICLIBRARY_SHOWALLITEMS;
257 constexpr const char* CSettings::SETTING_MUSICLIBRARY_UPDATEONSTARTUP;
258 constexpr const char* CSettings::SETTING_MUSICLIBRARY_BACKGROUNDUPDATE;
259 constexpr const char* CSettings::SETTING_MUSICLIBRARY_CLEANUP;
260 constexpr const char* CSettings::SETTING_MUSICLIBRARY_EXPORT;
261 constexpr const char* CSettings::SETTING_MUSICLIBRARY_EXPORT_FILETYPE;
262 constexpr const char* CSettings::SETTING_MUSICLIBRARY_EXPORT_FOLDER;
263 constexpr const char* CSettings::SETTING_MUSICLIBRARY_EXPORT_ITEMS;
264 constexpr const char* CSettings::SETTING_MUSICLIBRARY_EXPORT_UNSCRAPED;
265 constexpr const char* CSettings::SETTING_MUSICLIBRARY_EXPORT_OVERWRITE;
266 constexpr const char* CSettings::SETTING_MUSICLIBRARY_EXPORT_ARTWORK;
267 constexpr const char* CSettings::SETTING_MUSICLIBRARY_EXPORT_SKIPNFO;
268 constexpr const char* CSettings::SETTING_MUSICLIBRARY_IMPORT;
269 constexpr const char* CSettings::SETTING_MUSICPLAYER_AUTOPLAYNEXTITEM;
270 constexpr const char* CSettings::SETTING_MUSICPLAYER_QUEUEBYDEFAULT;
271 constexpr const char* CSettings::SETTING_MUSICPLAYER_SEEKSTEPS;
272 constexpr const char* CSettings::SETTING_MUSICPLAYER_SEEKDELAY;
273 constexpr const char* CSettings::SETTING_MUSICPLAYER_REPLAYGAINTYPE;
274 constexpr const char* CSettings::SETTING_MUSICPLAYER_REPLAYGAINPREAMP;
275 constexpr const char* CSettings::SETTING_MUSICPLAYER_REPLAYGAINNOGAINPREAMP;
276 constexpr const char* CSettings::SETTING_MUSICPLAYER_REPLAYGAINAVOIDCLIPPING;
277 constexpr const char* CSettings::SETTING_MUSICPLAYER_CROSSFADE;
278 constexpr const char* CSettings::SETTING_MUSICPLAYER_CROSSFADEALBUMTRACKS;
279 constexpr const char* CSettings::SETTING_MUSICPLAYER_VISUALISATION;
280 constexpr const char* CSettings::SETTING_MUSICFILES_SELECTACTION;
281 constexpr const char* CSettings::SETTING_MUSICFILES_USETAGS;
282 constexpr const char* CSettings::SETTING_MUSICFILES_TRACKFORMAT;
283 constexpr const char* CSettings::SETTING_MUSICFILES_NOWPLAYINGTRACKFORMAT;
284 constexpr const char* CSettings::SETTING_MUSICFILES_LIBRARYTRACKFORMAT;
285 constexpr const char* CSettings::SETTING_MUSICFILES_FINDREMOTETHUMBS;
286 constexpr const char* CSettings::SETTING_AUDIOCDS_AUTOACTION;
287 constexpr const char* CSettings::SETTING_AUDIOCDS_USECDDB;
288 constexpr const char* CSettings::SETTING_AUDIOCDS_RECORDINGPATH;
289 constexpr const char* CSettings::SETTING_AUDIOCDS_TRACKPATHFORMAT;
290 constexpr const char* CSettings::SETTING_AUDIOCDS_ENCODER;
291 constexpr const char* CSettings::SETTING_AUDIOCDS_SETTINGS;
292 constexpr const char* CSettings::SETTING_AUDIOCDS_EJECTONRIP;
293 constexpr const char* CSettings::SETTING_MYMUSIC_SONGTHUMBINVIS;
294 constexpr const char* CSettings::SETTING_MYMUSIC_DEFAULTLIBVIEW;
295 constexpr const char* CSettings::SETTING_PICTURES_USETAGS;
296 constexpr const char* CSettings::SETTING_PICTURES_GENERATETHUMBS;
297 constexpr const char* CSettings::SETTING_PICTURES_SHOWVIDEOS;
298 constexpr const char* CSettings::SETTING_PICTURES_DISPLAYRESOLUTION;
299 constexpr const char* CSettings::SETTING_SLIDESHOW_STAYTIME;
300 constexpr const char* CSettings::SETTING_SLIDESHOW_DISPLAYEFFECTS;
301 constexpr const char* CSettings::SETTING_SLIDESHOW_SHUFFLE;
302 constexpr const char* CSettings::SETTING_SLIDESHOW_HIGHQUALITYDOWNSCALING;
303 constexpr const char* CSettings::SETTING_WEATHER_CURRENTLOCATION;
304 constexpr const char* CSettings::SETTING_WEATHER_ADDON;
305 constexpr const char* CSettings::SETTING_WEATHER_ADDONSETTINGS;
306 constexpr const char* CSettings::SETTING_SERVICES_DEVICENAME;
307 constexpr const char* CSettings::SETTING_SERVICES_DEVICEUUID;
308 constexpr const char* CSettings::SETTING_SERVICES_UPNP;
309 constexpr const char* CSettings::SETTING_SERVICES_UPNPSERVER;
310 constexpr const char* CSettings::SETTING_SERVICES_UPNPANNOUNCE;
311 constexpr const char* CSettings::SETTING_SERVICES_UPNPLOOKFOREXTERNALSUBTITLES;
312 constexpr const char* CSettings::SETTING_SERVICES_UPNPCONTROLLER;
313 constexpr const char* CSettings::SETTING_SERVICES_UPNPRENDERER;
314 constexpr const char* CSettings::SETTING_SERVICES_WEBSERVER;
315 constexpr const char* CSettings::SETTING_SERVICES_WEBSERVERPORT;
316 constexpr const char* CSettings::SETTING_SERVICES_WEBSERVERAUTHENTICATION;
317 constexpr const char* CSettings::SETTING_SERVICES_WEBSERVERUSERNAME;
318 constexpr const char* CSettings::SETTING_SERVICES_WEBSERVERPASSWORD;
319 constexpr const char* CSettings::SETTING_SERVICES_WEBSERVERSSL;
320 constexpr const char* CSettings::SETTING_SERVICES_WEBSKIN;
321 constexpr const char* CSettings::SETTING_SERVICES_ESENABLED;
322 constexpr const char* CSettings::SETTING_SERVICES_ESPORT;
323 constexpr const char* CSettings::SETTING_SERVICES_ESPORTRANGE;
324 constexpr const char* CSettings::SETTING_SERVICES_ESMAXCLIENTS;
325 constexpr const char* CSettings::SETTING_SERVICES_ESALLINTERFACES;
326 constexpr const char* CSettings::SETTING_SERVICES_ESINITIALDELAY;
327 constexpr const char* CSettings::SETTING_SERVICES_ESCONTINUOUSDELAY;
328 constexpr const char* CSettings::SETTING_SERVICES_ZEROCONF;
329 constexpr const char* CSettings::SETTING_SERVICES_AIRPLAY;
330 constexpr const char* CSettings::SETTING_SERVICES_AIRPLAYVOLUMECONTROL;
331 constexpr const char* CSettings::SETTING_SERVICES_USEAIRPLAYPASSWORD;
332 constexpr const char* CSettings::SETTING_SERVICES_AIRPLAYPASSWORD;
333 constexpr const char* CSettings::SETTING_SERVICES_AIRPLAYVIDEOSUPPORT;
334 constexpr const char* CSettings::SETTING_SMB_WINSSERVER;
335 constexpr const char* CSettings::SETTING_SMB_WORKGROUP;
336 constexpr const char* CSettings::SETTING_SMB_MINPROTOCOL;
337 constexpr const char* CSettings::SETTING_SMB_MAXPROTOCOL;
338 constexpr const char* CSettings::SETTING_SMB_LEGACYSECURITY;
339 constexpr const char* CSettings::SETTING_VIDEOSCREEN_MONITOR;
340 constexpr const char* CSettings::SETTING_VIDEOSCREEN_SCREEN;
341 constexpr const char* CSettings::SETTING_VIDEOSCREEN_WHITELIST;
342 constexpr const char* CSettings::SETTING_VIDEOSCREEN_RESOLUTION;
343 constexpr const char* CSettings::SETTING_VIDEOSCREEN_SCREENMODE;
344 constexpr const char* CSettings::SETTING_VIDEOSCREEN_FAKEFULLSCREEN;
345 constexpr const char* CSettings::SETTING_VIDEOSCREEN_BLANKDISPLAYS;
346 constexpr const char* CSettings::SETTING_VIDEOSCREEN_STEREOSCOPICMODE;
347 constexpr const char* CSettings::SETTING_VIDEOSCREEN_PREFEREDSTEREOSCOPICMODE;
348 constexpr const char* CSettings::SETTING_VIDEOSCREEN_NOOFBUFFERS;
349 constexpr const char* CSettings::SETTING_VIDEOSCREEN_3DLUT;
350 constexpr const char* CSettings::SETTING_VIDEOSCREEN_DISPLAYPROFILE;
351 constexpr const char* CSettings::SETTING_VIDEOSCREEN_GUICALIBRATION;
352 constexpr const char* CSettings::SETTING_VIDEOSCREEN_TESTPATTERN;
353 constexpr const char* CSettings::SETTING_VIDEOSCREEN_LIMITEDRANGE;
354 constexpr const char* CSettings::SETTING_VIDEOSCREEN_FRAMEPACKING;
355 constexpr const char* CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE;
356 constexpr const char* CSettings::SETTING_AUDIOOUTPUT_CHANNELS;
357 constexpr const char* CSettings::SETTING_AUDIOOUTPUT_CONFIG;
358 constexpr const char* CSettings::SETTING_AUDIOOUTPUT_SAMPLERATE;
359 constexpr const char* CSettings::SETTING_AUDIOOUTPUT_STEREOUPMIX;
360 constexpr const char* CSettings::SETTING_AUDIOOUTPUT_MAINTAINORIGINALVOLUME;
361 constexpr const char* CSettings::SETTING_AUDIOOUTPUT_PROCESSQUALITY;
362 constexpr const char* CSettings::SETTING_AUDIOOUTPUT_ATEMPOTHRESHOLD;
363 constexpr const char* CSettings::SETTING_AUDIOOUTPUT_STREAMSILENCE;
364 constexpr const char* CSettings::SETTING_AUDIOOUTPUT_STREAMNOISE;
365 constexpr const char* CSettings::SETTING_AUDIOOUTPUT_GUISOUNDMODE;
366 constexpr const char* CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGH;
367 constexpr const char* CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGHDEVICE;
368 constexpr const char* CSettings::SETTING_AUDIOOUTPUT_AC3PASSTHROUGH;
369 constexpr const char* CSettings::SETTING_AUDIOOUTPUT_AC3TRANSCODE;
370 constexpr const char* CSettings::SETTING_AUDIOOUTPUT_EAC3PASSTHROUGH;
371 constexpr const char* CSettings::SETTING_AUDIOOUTPUT_DTSPASSTHROUGH;
372 constexpr const char* CSettings::SETTING_AUDIOOUTPUT_TRUEHDPASSTHROUGH;
373 constexpr const char* CSettings::SETTING_AUDIOOUTPUT_DTSHDPASSTHROUGH;
374 constexpr const char* CSettings::SETTING_AUDIOOUTPUT_VOLUMESTEPS;
375 constexpr const char* CSettings::SETTING_INPUT_PERIPHERALS;
376 constexpr const char* CSettings::SETTING_INPUT_PERIPHERALLIBRARIES;
377 constexpr const char* CSettings::SETTING_INPUT_ENABLEMOUSE;
378 constexpr const char* CSettings::SETTING_INPUT_ASKNEWCONTROLLERS;
379 constexpr const char* CSettings::SETTING_INPUT_CONTROLLERCONFIG;
380 constexpr const char* CSettings::SETTING_INPUT_RUMBLENOTIFY;
381 constexpr const char* CSettings::SETTING_INPUT_TESTRUMBLE;
382 constexpr const char* CSettings::SETTING_INPUT_CONTROLLERPOWEROFF;
383 constexpr const char* CSettings::SETTING_INPUT_APPLEREMOTEMODE;
384 constexpr const char* CSettings::SETTING_INPUT_APPLEREMOTEALWAYSON;
385 constexpr const char* CSettings::SETTING_INPUT_APPLEREMOTESEQUENCETIME;
386 constexpr const char* CSettings::SETTING_INPUT_APPLESIRI;
387 constexpr const char* CSettings::SETTING_INPUT_APPLESIRITIMEOUT;
388 constexpr const char* CSettings::SETTING_INPUT_APPLESIRITIMEOUTENABLED;
389 constexpr const char* CSettings::SETTING_INPUT_APPLEUSEKODIKEYBOARD;
390 constexpr const char* CSettings::SETTING_NETWORK_USEHTTPPROXY;
391 constexpr const char* CSettings::SETTING_NETWORK_HTTPPROXYTYPE;
392 constexpr const char* CSettings::SETTING_NETWORK_HTTPPROXYSERVER;
393 constexpr const char* CSettings::SETTING_NETWORK_HTTPPROXYPORT;
394 constexpr const char* CSettings::SETTING_NETWORK_HTTPPROXYUSERNAME;
395 constexpr const char* CSettings::SETTING_NETWORK_HTTPPROXYPASSWORD;
396 constexpr const char* CSettings::SETTING_NETWORK_BANDWIDTH;
397 constexpr const char* CSettings::SETTING_POWERMANAGEMENT_DISPLAYSOFF;
398 constexpr const char* CSettings::SETTING_POWERMANAGEMENT_SHUTDOWNTIME;
399 constexpr const char* CSettings::SETTING_POWERMANAGEMENT_SHUTDOWNSTATE;
400 constexpr const char* CSettings::SETTING_POWERMANAGEMENT_WAKEONACCESS;
401 constexpr const char* CSettings::SETTING_POWERMANAGEMENT_WAITFORNETWORK;
402 constexpr const char* CSettings::SETTING_DEBUG_SHOWLOGINFO;
403 constexpr const char* CSettings::SETTING_DEBUG_EXTRALOGGING;
404 constexpr const char* CSettings::SETTING_DEBUG_SETEXTRALOGLEVEL;
405 constexpr const char* CSettings::SETTING_DEBUG_SCREENSHOTPATH;
406 constexpr const char* CSettings::SETTING_DEBUG_SHARE_LOG;
407 constexpr const char* CSettings::SETTING_EVENTLOG_ENABLED;
408 constexpr const char* CSettings::SETTING_EVENTLOG_ENABLED_NOTIFICATIONS;
409 constexpr const char* CSettings::SETTING_EVENTLOG_SHOW;
410 constexpr const char* CSettings::SETTING_MASTERLOCK_LOCKCODE;
411 constexpr const char* CSettings::SETTING_MASTERLOCK_STARTUPLOCK;
412 constexpr const char* CSettings::SETTING_MASTERLOCK_MAXRETRIES;
413 constexpr const char* CSettings::SETTING_CACHE_HARDDISK;
414 constexpr const char* CSettings::SETTING_CACHEVIDEO_DVDROM;
415 constexpr const char* CSettings::SETTING_CACHEVIDEO_LAN;
416 constexpr const char* CSettings::SETTING_CACHEVIDEO_INTERNET;
417 constexpr const char* CSettings::SETTING_CACHEAUDIO_DVDROM;
418 constexpr const char* CSettings::SETTING_CACHEAUDIO_LAN;
419 constexpr const char* CSettings::SETTING_CACHEAUDIO_INTERNET;
420 constexpr const char* CSettings::SETTING_CACHEDVD_DVDROM;
421 constexpr const char* CSettings::SETTING_CACHEDVD_LAN;
422 constexpr const char* CSettings::SETTING_CACHEUNKNOWN_INTERNET;
423 constexpr const char* CSettings::SETTING_SYSTEM_PLAYLISTSPATH;
424 constexpr const char* CSettings::SETTING_ADDONS_AUTOUPDATES;
425 constexpr const char* CSettings::SETTING_ADDONS_NOTIFICATIONS;
426 constexpr const char* CSettings::SETTING_ADDONS_SHOW_RUNNING;
427 constexpr const char* CSettings::SETTING_ADDONS_ALLOW_UNKNOWN_SOURCES;
428 constexpr const char* CSettings::SETTING_ADDONS_UPDATEMODE;
429 constexpr const char* CSettings::SETTING_ADDONS_MANAGE_DEPENDENCIES;
430 constexpr const char* CSettings::SETTING_GENERAL_ADDONFOREIGNFILTER;
431 constexpr const char* CSettings::SETTING_GENERAL_ADDONBROKENFILTER;
432 constexpr const char* CSettings::SETTING_SOURCE_VIDEOS;
433 constexpr const char* CSettings::SETTING_SOURCE_MUSIC;
434 constexpr const char* CSettings::SETTING_SOURCE_PICTURES;
435 //! @todo: remove in c++17
436 
Initialize()437 bool CSettings::Initialize()
438 {
439   CSingleLock lock(m_critical);
440   if (m_initialized)
441     return false;
442 
443   // register custom setting types
444   InitializeSettingTypes();
445   // register custom setting controls
446   InitializeControls();
447 
448   // option fillers and conditions need to be
449   // initialized before the setting definitions
450   InitializeOptionFillers();
451   InitializeConditions();
452 
453   // load the settings definitions
454   if (!InitializeDefinitions())
455     return false;
456 
457   GetSettingsManager()->SetInitialized();
458 
459   InitializeISettingsHandlers();
460   InitializeISubSettings();
461   InitializeISettingCallbacks();
462 
463   m_initialized = true;
464 
465   return true;
466 }
467 
RegisterSubSettings(ISubSettings * subSettings)468 void CSettings::RegisterSubSettings(ISubSettings* subSettings)
469 {
470   if (subSettings == nullptr)
471     return;
472 
473   CSingleLock lock(m_critical);
474   m_subSettings.insert(subSettings);
475 }
476 
UnregisterSubSettings(ISubSettings * subSettings)477 void CSettings::UnregisterSubSettings(ISubSettings* subSettings)
478 {
479   if (subSettings == nullptr)
480     return;
481 
482   CSingleLock lock(m_critical);
483   m_subSettings.erase(subSettings);
484 }
485 
Load()486 bool CSettings::Load()
487 {
488   const std::shared_ptr<CProfileManager> profileManager = CServiceBroker::GetSettingsComponent()->GetProfileManager();
489 
490   return Load(profileManager->GetSettingsFile());
491 }
492 
Load(const std::string & file)493 bool CSettings::Load(const std::string &file)
494 {
495   CXBMCTinyXML xmlDoc;
496   bool updated = false;
497   if (!XFILE::CFile::Exists(file) || !xmlDoc.LoadFile(file) ||
498       !Load(xmlDoc.RootElement(), updated))
499   {
500     CLog::Log(LOGERROR, "CSettings: unable to load settings from %s, creating new default settings", file.c_str());
501     if (!Reset())
502       return false;
503 
504     if (!Load(file))
505       return false;
506   }
507   // if the settings had to be updated, we need to save the changes
508   else if (updated)
509     return Save(file);
510 
511   return true;
512 }
513 
Load(const TiXmlElement * root)514 bool CSettings::Load(const TiXmlElement* root)
515 {
516   bool updated = false;
517   return Load(root, updated);
518 }
519 
Save()520 bool CSettings::Save()
521 {
522   const std::shared_ptr<CProfileManager> profileManager = CServiceBroker::GetSettingsComponent()->GetProfileManager();
523 
524   return Save(profileManager->GetSettingsFile());
525 }
526 
Save(const std::string & file)527 bool CSettings::Save(const std::string &file)
528 {
529   CXBMCTinyXML xmlDoc;
530   if (!SaveValuesToXml(xmlDoc))
531     return false;
532 
533   TiXmlElement* root = xmlDoc.RootElement();
534   if (root == nullptr)
535     return false;
536 
537   if (!Save(root))
538     return false;
539 
540   return xmlDoc.SaveFile(file);
541 }
542 
Save(TiXmlNode * root) const543 bool CSettings::Save(TiXmlNode* root) const
544 {
545   CSingleLock lock(m_critical);
546   // save any ISubSettings implementations
547   for (const auto& subSetting : m_subSettings)
548   {
549     if (!subSetting->Save(root))
550       return false;
551   }
552 
553   return true;
554 }
555 
LoadSetting(const TiXmlNode * node,const std::string & settingId)556 bool CSettings::LoadSetting(const TiXmlNode *node, const std::string &settingId)
557 {
558   return GetSettingsManager()->LoadSetting(node, settingId);
559 }
560 
GetBool(const std::string & id) const561 bool CSettings::GetBool(const std::string& id) const
562 {
563   // Backward compatibility (skins use this setting)
564   if (StringUtils::EqualsNoCase(id, "lookandfeel.enablemouse"))
565     return CSettingsBase::GetBool(CSettings::SETTING_INPUT_ENABLEMOUSE);
566 
567   return CSettingsBase::GetBool(id);
568 }
569 
Clear()570 void CSettings::Clear()
571 {
572   CSingleLock lock(m_critical);
573   if (!m_initialized)
574     return;
575 
576   GetSettingsManager()->Clear();
577 
578   for (auto& subSetting : m_subSettings)
579     subSetting->Clear();
580 
581   m_initialized = false;
582 }
583 
Load(const TiXmlElement * root,bool & updated)584 bool CSettings::Load(const TiXmlElement* root, bool& updated)
585 {
586   if (root == nullptr)
587     return false;
588 
589   if (!CSettingsBase::LoadValuesFromXml(root, updated))
590     return false;
591 
592   return Load(static_cast<const TiXmlNode*>(root));
593 }
594 
Load(const TiXmlNode * settings)595 bool CSettings::Load(const TiXmlNode* settings)
596 {
597   bool ok = true;
598   CSingleLock lock(m_critical);
599   for (const auto& subSetting : m_subSettings)
600     ok &= subSetting->Load(settings);
601 
602   return ok;
603 }
604 
Initialize(const std::string & file)605 bool CSettings::Initialize(const std::string &file)
606 {
607   CXBMCTinyXML xmlDoc;
608   if (!xmlDoc.LoadFile(file.c_str()))
609   {
610     CLog::Log(LOGERROR, "CSettings: error loading settings definition from %s, Line %d\n%s", file.c_str(), xmlDoc.ErrorRow(), xmlDoc.ErrorDesc());
611     return false;
612   }
613 
614   CLog::Log(LOGDEBUG, "CSettings: loaded settings definition from %s", file.c_str());
615 
616   return InitializeDefinitionsFromXml(xmlDoc);
617 }
618 
InitializeDefinitions()619 bool CSettings::InitializeDefinitions()
620 {
621   if (!Initialize(SETTINGS_XML_FOLDER "settings.xml"))
622   {
623     CLog::Log(LOGFATAL, "Unable to load settings definitions");
624     return false;
625   }
626 #if defined(TARGET_WINDOWS)
627   if (CFile::Exists(SETTINGS_XML_FOLDER "windows.xml") && !Initialize(SETTINGS_XML_FOLDER "windows.xml"))
628     CLog::Log(LOGFATAL, "Unable to load windows-specific settings definitions");
629 #if defined(TARGET_WINDOWS_DESKTOP)
630   if (CFile::Exists(SETTINGS_XML_FOLDER "win32.xml") && !Initialize(SETTINGS_XML_FOLDER "win32.xml"))
631     CLog::Log(LOGFATAL, "Unable to load win32-specific settings definitions");
632 #elif defined(TARGET_WINDOWS_STORE)
633   if (CFile::Exists(SETTINGS_XML_FOLDER "win10.xml") && !Initialize(SETTINGS_XML_FOLDER "win10.xml"))
634     CLog::Log(LOGFATAL, "Unable to load win10-specific settings definitions");
635 #endif
636 #elif defined(TARGET_ANDROID)
637   if (CFile::Exists(SETTINGS_XML_FOLDER "android.xml") && !Initialize(SETTINGS_XML_FOLDER "android.xml"))
638     CLog::Log(LOGFATAL, "Unable to load android-specific settings definitions");
639 #elif defined(TARGET_FREEBSD)
640   if (CFile::Exists(SETTINGS_XML_FOLDER "freebsd.xml") && !Initialize(SETTINGS_XML_FOLDER "freebsd.xml"))
641     CLog::Log(LOGFATAL, "Unable to load freebsd-specific settings definitions");
642 #elif defined(TARGET_DRAGONFLY)
643   if (CFile::Exists(SETTINGS_XML_FOLDER "dragonfly.xml") && !Initialize(SETTINGS_XML_FOLDER "dragonfly.xml"))
644     CLog::Log(LOGFATAL, "Unable to load dragonfly-specific settings definitions");
645 #elif defined(TARGET_LINUX)
646   if (CFile::Exists(SETTINGS_XML_FOLDER "linux.xml") && !Initialize(SETTINGS_XML_FOLDER "linux.xml"))
647     CLog::Log(LOGFATAL, "Unable to load linux-specific settings definitions");
648 #elif defined(TARGET_DARWIN)
649   if (CFile::Exists(SETTINGS_XML_FOLDER "darwin.xml") && !Initialize(SETTINGS_XML_FOLDER "darwin.xml"))
650     CLog::Log(LOGFATAL, "Unable to load darwin-specific settings definitions");
651 #if defined(TARGET_DARWIN_OSX)
652   if (CFile::Exists(SETTINGS_XML_FOLDER "darwin_osx.xml") && !Initialize(SETTINGS_XML_FOLDER "darwin_osx.xml"))
653     CLog::Log(LOGFATAL, "Unable to load osx-specific settings definitions");
654 #elif defined(TARGET_DARWIN_IOS)
655   if (CFile::Exists(SETTINGS_XML_FOLDER "darwin_ios.xml") && !Initialize(SETTINGS_XML_FOLDER "darwin_ios.xml"))
656     CLog::Log(LOGFATAL, "Unable to load ios-specific settings definitions");
657 #elif defined(TARGET_DARWIN_TVOS)
658   if (CFile::Exists(SETTINGS_XML_FOLDER "darwin_tvos.xml") &&
659       !Initialize(SETTINGS_XML_FOLDER "darwin_tvos.xml"))
660     CLog::Log(LOGFATAL, "Unable to load tvos-specific settings definitions");
661 #endif
662 #endif
663 
664 #if defined(PLATFORM_SETTINGS_FILE)
665   if (CFile::Exists(SETTINGS_XML_FOLDER DEF_TO_STR_VALUE(PLATFORM_SETTINGS_FILE)) && !Initialize(SETTINGS_XML_FOLDER DEF_TO_STR_VALUE(PLATFORM_SETTINGS_FILE)))
666     CLog::Log(LOGFATAL, "Unable to load platform-specific settings definitions (%s)", DEF_TO_STR_VALUE(PLATFORM_SETTINGS_FILE));
667 #endif
668 
669   // load any custom visibility and default values before loading the special
670   // appliance.xml so that appliances are able to overwrite even those values
671   InitializeVisibility();
672   InitializeDefaults();
673 
674   if (CFile::Exists(SETTINGS_XML_FOLDER "appliance.xml") && !Initialize(SETTINGS_XML_FOLDER "appliance.xml"))
675     CLog::Log(LOGFATAL, "Unable to load appliance-specific settings definitions");
676 
677   return true;
678 }
679 
InitializeSettingTypes()680 void CSettings::InitializeSettingTypes()
681 {
682   GetSettingsManager()->RegisterSettingType("addon", this);
683   GetSettingsManager()->RegisterSettingType("date", this);
684   GetSettingsManager()->RegisterSettingType("path", this);
685   GetSettingsManager()->RegisterSettingType("time", this);
686 }
687 
InitializeControls()688 void CSettings::InitializeControls()
689 {
690   GetSettingsManager()->RegisterSettingControl("toggle", this);
691   GetSettingsManager()->RegisterSettingControl("spinner", this);
692   GetSettingsManager()->RegisterSettingControl("edit", this);
693   GetSettingsManager()->RegisterSettingControl("button", this);
694   GetSettingsManager()->RegisterSettingControl("list", this);
695   GetSettingsManager()->RegisterSettingControl("slider", this);
696   GetSettingsManager()->RegisterSettingControl("range", this);
697   GetSettingsManager()->RegisterSettingControl("title", this);
698 }
699 
InitializeVisibility()700 void CSettings::InitializeVisibility()
701 {
702   // hide some settings if necessary
703 #if defined(TARGET_DARWIN_EMBEDDED)
704   std::shared_ptr<CSettingString> timezonecountry = std::static_pointer_cast<CSettingString>(GetSettingsManager()->GetSetting(CSettings::SETTING_LOCALE_TIMEZONECOUNTRY));
705   std::shared_ptr<CSettingString> timezone = std::static_pointer_cast<CSettingString>(GetSettingsManager()->GetSetting(CSettings::SETTING_LOCALE_TIMEZONE));
706 
707   timezonecountry->SetRequirementsMet(false);
708   timezone->SetRequirementsMet(false);
709 #endif
710 }
711 
InitializeDefaults()712 void CSettings::InitializeDefaults()
713 {
714   // set some default values if necessary
715 #if defined(TARGET_POSIX)
716   std::shared_ptr<CSettingString> timezonecountry = std::static_pointer_cast<CSettingString>(GetSettingsManager()->GetSetting(CSettings::SETTING_LOCALE_TIMEZONECOUNTRY));
717   std::shared_ptr<CSettingString> timezone = std::static_pointer_cast<CSettingString>(GetSettingsManager()->GetSetting(CSettings::SETTING_LOCALE_TIMEZONE));
718 
719   if (timezonecountry->IsVisible())
720     timezonecountry->SetDefault(g_timezone.GetCountryByTimezone(g_timezone.GetOSConfiguredTimezone()));
721   if (timezone->IsVisible())
722     timezone->SetDefault(g_timezone.GetOSConfiguredTimezone());
723 #endif // defined(TARGET_POSIX)
724 
725 #if defined(TARGET_WINDOWS)
726   // We prefer a fake fullscreen mode (window covering the screen rather than dedicated fullscreen)
727   // as it works nicer with switching to other applications. However on some systems vsync is broken
728   // when we do this (eg non-Aero on ATI in particular) and on others (AppleTV) we can't get XBMC to
729   // the front
730   if (g_sysinfo.IsAeroDisabled())
731   {
732     auto setting = GetSettingsManager()->GetSetting(CSettings::SETTING_VIDEOSCREEN_FAKEFULLSCREEN);
733     if (!setting)
734       CLog::Log(LOGERROR, "Failed to load setting for: {}",
735                 CSettings::SETTING_VIDEOSCREEN_FAKEFULLSCREEN);
736     else
737       std::static_pointer_cast<CSettingBool>(setting)->SetDefault(false);
738   }
739 #endif
740 
741   if (g_application.IsStandAlone())
742   {
743     auto setting =
744         GetSettingsManager()->GetSetting(CSettings::SETTING_POWERMANAGEMENT_SHUTDOWNSTATE);
745     if (!setting)
746       CLog::Log(LOGERROR, "Failed to load setting for: {}",
747                 CSettings::SETTING_POWERMANAGEMENT_SHUTDOWNSTATE);
748     else
749       std::static_pointer_cast<CSettingInt>(setting)->SetDefault(POWERSTATE_SHUTDOWN);
750   }
751 
752   // Initialize deviceUUID if not already set, used in zeroconf advertisements.
753   std::shared_ptr<CSettingString> deviceUUID = std::static_pointer_cast<CSettingString>(GetSettingsManager()->GetSetting(CSettings::SETTING_SERVICES_DEVICEUUID));
754   if (deviceUUID->GetValue().empty())
755   {
756     const std::string& uuid = StringUtils::CreateUUID();
757     auto setting = GetSettingsManager()->GetSetting(CSettings::SETTING_SERVICES_DEVICEUUID);
758     if (!setting)
759       CLog::Log(LOGERROR, "Failed to load setting for: {}", CSettings::SETTING_SERVICES_DEVICEUUID);
760     else
761       std::static_pointer_cast<CSettingString>(setting)->SetValue(uuid);
762   }
763 }
764 
InitializeOptionFillers()765 void CSettings::InitializeOptionFillers()
766 {
767   // register setting option fillers
768 #ifdef HAS_DVD_DRIVE
769   GetSettingsManager()->RegisterSettingOptionsFiller("audiocdactions", MEDIA_DETECT::CAutorun::SettingOptionAudioCdActionsFiller);
770 #endif
771   GetSettingsManager()->RegisterSettingOptionsFiller("charsets", CCharsetConverter::SettingOptionsCharsetsFiller);
772   GetSettingsManager()->RegisterSettingOptionsFiller("fonts", GUIFontManager::SettingOptionsFontsFiller);
773   GetSettingsManager()->RegisterSettingOptionsFiller("languagenames", CLangInfo::SettingOptionsLanguageNamesFiller);
774   GetSettingsManager()->RegisterSettingOptionsFiller("refreshchangedelays", CDisplaySettings::SettingOptionsRefreshChangeDelaysFiller);
775   GetSettingsManager()->RegisterSettingOptionsFiller("refreshrates", CDisplaySettings::SettingOptionsRefreshRatesFiller);
776   GetSettingsManager()->RegisterSettingOptionsFiller("regions", CLangInfo::SettingOptionsRegionsFiller);
777   GetSettingsManager()->RegisterSettingOptionsFiller("shortdateformats", CLangInfo::SettingOptionsShortDateFormatsFiller);
778   GetSettingsManager()->RegisterSettingOptionsFiller("longdateformats", CLangInfo::SettingOptionsLongDateFormatsFiller);
779   GetSettingsManager()->RegisterSettingOptionsFiller("timeformats", CLangInfo::SettingOptionsTimeFormatsFiller);
780   GetSettingsManager()->RegisterSettingOptionsFiller("24hourclockformats", CLangInfo::SettingOptions24HourClockFormatsFiller);
781   GetSettingsManager()->RegisterSettingOptionsFiller("speedunits", CLangInfo::SettingOptionsSpeedUnitsFiller);
782   GetSettingsManager()->RegisterSettingOptionsFiller("temperatureunits", CLangInfo::SettingOptionsTemperatureUnitsFiller);
783   GetSettingsManager()->RegisterSettingOptionsFiller("rendermethods", CBaseRenderer::SettingOptionsRenderMethodsFiller);
784   GetSettingsManager()->RegisterSettingOptionsFiller("modes", CDisplaySettings::SettingOptionsModesFiller);
785   GetSettingsManager()->RegisterSettingOptionsFiller("resolutions", CDisplaySettings::SettingOptionsResolutionsFiller);
786   GetSettingsManager()->RegisterSettingOptionsFiller("screens", CDisplaySettings::SettingOptionsDispModeFiller);
787   GetSettingsManager()->RegisterSettingOptionsFiller("stereoscopicmodes", CDisplaySettings::SettingOptionsStereoscopicModesFiller);
788   GetSettingsManager()->RegisterSettingOptionsFiller("preferedstereoscopicviewmodes", CDisplaySettings::SettingOptionsPreferredStereoscopicViewModesFiller);
789   GetSettingsManager()->RegisterSettingOptionsFiller("monitors", CDisplaySettings::SettingOptionsMonitorsFiller);
790   GetSettingsManager()->RegisterSettingOptionsFiller("cmsmodes", CDisplaySettings::SettingOptionsCmsModesFiller);
791   GetSettingsManager()->RegisterSettingOptionsFiller("cmswhitepoints", CDisplaySettings::SettingOptionsCmsWhitepointsFiller);
792   GetSettingsManager()->RegisterSettingOptionsFiller("cmsprimaries", CDisplaySettings::SettingOptionsCmsPrimariesFiller);
793   GetSettingsManager()->RegisterSettingOptionsFiller("cmsgammamodes", CDisplaySettings::SettingOptionsCmsGammaModesFiller);
794   GetSettingsManager()->RegisterSettingOptionsFiller("videoseeksteps", CSeekHandler::SettingOptionsSeekStepsFiller);
795   GetSettingsManager()->RegisterSettingOptionsFiller("startupwindows", ADDON::CSkinInfo::SettingOptionsStartupWindowsFiller);
796   GetSettingsManager()->RegisterSettingOptionsFiller("audiostreamlanguages", CLangInfo::SettingOptionsAudioStreamLanguagesFiller);
797   GetSettingsManager()->RegisterSettingOptionsFiller("subtitlestreamlanguages", CLangInfo::SettingOptionsSubtitleStreamLanguagesFiller);
798   GetSettingsManager()->RegisterSettingOptionsFiller("subtitledownloadlanguages", CLangInfo::SettingOptionsSubtitleDownloadlanguagesFiller);
799   GetSettingsManager()->RegisterSettingOptionsFiller("iso6391languages", CLangInfo::SettingOptionsISO6391LanguagesFiller);
800   GetSettingsManager()->RegisterSettingOptionsFiller("skincolors", ADDON::CSkinInfo::SettingOptionsSkinColorsFiller);
801   GetSettingsManager()->RegisterSettingOptionsFiller("skinfonts", ADDON::CSkinInfo::SettingOptionsSkinFontsFiller);
802   GetSettingsManager()->RegisterSettingOptionsFiller("skinthemes", ADDON::CSkinInfo::SettingOptionsSkinThemesFiller);
803 #ifdef TARGET_LINUX
804   GetSettingsManager()->RegisterSettingOptionsFiller("timezonecountries", CPosixTimezone::SettingOptionsTimezoneCountriesFiller);
805   GetSettingsManager()->RegisterSettingOptionsFiller("timezones", CPosixTimezone::SettingOptionsTimezonesFiller);
806 #endif
807   GetSettingsManager()->RegisterSettingOptionsFiller("keyboardlayouts", CKeyboardLayoutManager::SettingOptionsKeyboardLayoutsFiller);
808 }
809 
UninitializeOptionFillers()810 void CSettings::UninitializeOptionFillers()
811 {
812   GetSettingsManager()->UnregisterSettingOptionsFiller("audiocdactions");
813   GetSettingsManager()->UnregisterSettingOptionsFiller("audiocdencoders");
814   GetSettingsManager()->UnregisterSettingOptionsFiller("charsets");
815   GetSettingsManager()->UnregisterSettingOptionsFiller("fontheights");
816   GetSettingsManager()->UnregisterSettingOptionsFiller("fonts");
817   GetSettingsManager()->UnregisterSettingOptionsFiller("languagenames");
818   GetSettingsManager()->UnregisterSettingOptionsFiller("refreshchangedelays");
819   GetSettingsManager()->UnregisterSettingOptionsFiller("refreshrates");
820   GetSettingsManager()->UnregisterSettingOptionsFiller("regions");
821   GetSettingsManager()->UnregisterSettingOptionsFiller("shortdateformats");
822   GetSettingsManager()->UnregisterSettingOptionsFiller("longdateformats");
823   GetSettingsManager()->UnregisterSettingOptionsFiller("timeformats");
824   GetSettingsManager()->UnregisterSettingOptionsFiller("24hourclockformats");
825   GetSettingsManager()->UnregisterSettingOptionsFiller("speedunits");
826   GetSettingsManager()->UnregisterSettingOptionsFiller("temperatureunits");
827   GetSettingsManager()->UnregisterSettingOptionsFiller("rendermethods");
828   GetSettingsManager()->UnregisterSettingOptionsFiller("resolutions");
829   GetSettingsManager()->UnregisterSettingOptionsFiller("screens");
830   GetSettingsManager()->UnregisterSettingOptionsFiller("stereoscopicmodes");
831   GetSettingsManager()->UnregisterSettingOptionsFiller("preferedstereoscopicviewmodes");
832   GetSettingsManager()->UnregisterSettingOptionsFiller("monitors");
833   GetSettingsManager()->UnregisterSettingOptionsFiller("cmsmodes");
834   GetSettingsManager()->UnregisterSettingOptionsFiller("cmswhitepoints");
835   GetSettingsManager()->UnregisterSettingOptionsFiller("cmsprimaries");
836   GetSettingsManager()->UnregisterSettingOptionsFiller("cmsgammamodes");
837   GetSettingsManager()->UnregisterSettingOptionsFiller("videoseeksteps");
838   GetSettingsManager()->UnregisterSettingOptionsFiller("shutdownstates");
839   GetSettingsManager()->UnregisterSettingOptionsFiller("startupwindows");
840   GetSettingsManager()->UnregisterSettingOptionsFiller("audiostreamlanguages");
841   GetSettingsManager()->UnregisterSettingOptionsFiller("subtitlestreamlanguages");
842   GetSettingsManager()->UnregisterSettingOptionsFiller("subtitledownloadlanguages");
843   GetSettingsManager()->UnregisterSettingOptionsFiller("iso6391languages");
844   GetSettingsManager()->UnregisterSettingOptionsFiller("skincolors");
845   GetSettingsManager()->UnregisterSettingOptionsFiller("skinfonts");
846   GetSettingsManager()->UnregisterSettingOptionsFiller("skinthemes");
847 #if defined(TARGET_LINUX)
848   GetSettingsManager()->UnregisterSettingOptionsFiller("timezonecountries");
849   GetSettingsManager()->UnregisterSettingOptionsFiller("timezones");
850 #endif // defined(TARGET_LINUX)
851   GetSettingsManager()->UnregisterSettingOptionsFiller("verticalsyncs");
852   GetSettingsManager()->UnregisterSettingOptionsFiller("keyboardlayouts");
853 }
854 
InitializeConditions()855 void CSettings::InitializeConditions()
856 {
857   CSettingConditions::Initialize();
858 
859   // add basic conditions
860   const std::set<std::string> &simpleConditions = CSettingConditions::GetSimpleConditions();
861   for (std::set<std::string>::const_iterator itCondition = simpleConditions.begin(); itCondition != simpleConditions.end(); ++itCondition)
862     GetSettingsManager()->AddCondition(*itCondition);
863 
864   // add more complex conditions
865   const std::map<std::string, SettingConditionCheck> &complexConditions = CSettingConditions::GetComplexConditions();
866   for (std::map<std::string, SettingConditionCheck>::const_iterator itCondition = complexConditions.begin(); itCondition != complexConditions.end(); ++itCondition)
867     GetSettingsManager()->AddDynamicCondition(itCondition->first, itCondition->second);
868 }
869 
UninitializeConditions()870 void CSettings::UninitializeConditions()
871 {
872   CSettingConditions::Deinitialize();
873 }
874 
InitializeISettingsHandlers()875 void CSettings::InitializeISettingsHandlers()
876 {
877   // register ISettingsHandler implementations
878   // The order of these matters! Handlers are processed in the order they were registered.
879   GetSettingsManager()->RegisterSettingsHandler(&CMediaSourceSettings::GetInstance());
880 #ifdef HAS_UPNP
881   GetSettingsManager()->RegisterSettingsHandler(&CUPnPSettings::GetInstance());
882 #endif
883   GetSettingsManager()->RegisterSettingsHandler(&CWakeOnAccess::GetInstance());
884   GetSettingsManager()->RegisterSettingsHandler(&CRssManager::GetInstance());
885   GetSettingsManager()->RegisterSettingsHandler(&g_langInfo);
886   GetSettingsManager()->RegisterSettingsHandler(&g_application);
887 #if defined(TARGET_LINUX) && !defined(TARGET_ANDROID) && !defined(__UCLIBC__)
888   GetSettingsManager()->RegisterSettingsHandler(&g_timezone);
889 #endif
890   GetSettingsManager()->RegisterSettingsHandler(&CMediaSettings::GetInstance());
891 }
892 
UninitializeISettingsHandlers()893 void CSettings::UninitializeISettingsHandlers()
894 {
895   // unregister ISettingsHandler implementations
896   GetSettingsManager()->UnregisterSettingsHandler(&CMediaSettings::GetInstance());
897 #if defined(TARGET_LINUX)
898   GetSettingsManager()->UnregisterSettingsHandler(&g_timezone);
899 #endif // defined(TARGET_LINUX)
900   GetSettingsManager()->UnregisterSettingsHandler(&g_application);
901   GetSettingsManager()->UnregisterSettingsHandler(&g_langInfo);
902   GetSettingsManager()->UnregisterSettingsHandler(&CRssManager::GetInstance());
903   GetSettingsManager()->UnregisterSettingsHandler(&CWakeOnAccess::GetInstance());
904 #ifdef HAS_UPNP
905   GetSettingsManager()->UnregisterSettingsHandler(&CUPnPSettings::GetInstance());
906 #endif
907   GetSettingsManager()->UnregisterSettingsHandler(&CMediaSourceSettings::GetInstance());
908 }
909 
InitializeISubSettings()910 void CSettings::InitializeISubSettings()
911 {
912   // register ISubSettings implementations
913   RegisterSubSettings(&g_application);
914   RegisterSubSettings(&CDisplaySettings::GetInstance());
915   RegisterSubSettings(&CMediaSettings::GetInstance());
916   RegisterSubSettings(&CSkinSettings::GetInstance());
917   RegisterSubSettings(&g_sysinfo);
918   RegisterSubSettings(&CViewStateSettings::GetInstance());
919 }
920 
UninitializeISubSettings()921 void CSettings::UninitializeISubSettings()
922 {
923   // unregister ISubSettings implementations
924   UnregisterSubSettings(&g_application);
925   UnregisterSubSettings(&CDisplaySettings::GetInstance());
926   UnregisterSubSettings(&CMediaSettings::GetInstance());
927   UnregisterSubSettings(&CSkinSettings::GetInstance());
928   UnregisterSubSettings(&g_sysinfo);
929   UnregisterSubSettings(&CViewStateSettings::GetInstance());
930 }
931 
InitializeISettingCallbacks()932 void CSettings::InitializeISettingCallbacks()
933 {
934   // register any ISettingCallback implementations
935   std::set<std::string> settingSet;
936   settingSet.insert(CSettings::SETTING_MUSICLIBRARY_CLEANUP);
937   settingSet.insert(CSettings::SETTING_MUSICLIBRARY_EXPORT);
938   settingSet.insert(CSettings::SETTING_MUSICLIBRARY_IMPORT);
939   settingSet.insert(CSettings::SETTING_MUSICFILES_TRACKFORMAT);
940   settingSet.insert(CSettings::SETTING_VIDEOLIBRARY_FLATTENTVSHOWS);
941   settingSet.insert(CSettings::SETTING_VIDEOLIBRARY_GROUPMOVIESETS);
942   settingSet.insert(CSettings::SETTING_VIDEOLIBRARY_CLEANUP);
943   settingSet.insert(CSettings::SETTING_VIDEOLIBRARY_IMPORT);
944   settingSet.insert(CSettings::SETTING_VIDEOLIBRARY_EXPORT);
945   settingSet.insert(CSettings::SETTING_VIDEOLIBRARY_SHOWUNWATCHEDPLOTS);
946   GetSettingsManager()->RegisterCallback(&CMediaSettings::GetInstance(), settingSet);
947 
948   settingSet.clear();
949   settingSet.insert(CSettings::SETTING_VIDEOSCREEN_SCREEN);
950   settingSet.insert(CSettings::SETTING_VIDEOSCREEN_RESOLUTION);
951   settingSet.insert(CSettings::SETTING_VIDEOSCREEN_SCREENMODE);
952   settingSet.insert(CSettings::SETTING_VIDEOSCREEN_MONITOR);
953   settingSet.insert(CSettings::SETTING_VIDEOSCREEN_PREFEREDSTEREOSCOPICMODE);
954   settingSet.insert(CSettings::SETTING_VIDEOSCREEN_3DLUT);
955   settingSet.insert(CSettings::SETTING_VIDEOSCREEN_DISPLAYPROFILE);
956   settingSet.insert(CSettings::SETTING_VIDEOSCREEN_BLANKDISPLAYS);
957   settingSet.insert(CSettings::SETTING_VIDEOSCREEN_WHITELIST);
958   GetSettingsManager()->RegisterCallback(&CDisplaySettings::GetInstance(), settingSet);
959 
960   settingSet.clear();
961   settingSet.insert(CSettings::SETTING_VIDEOPLAYER_SEEKDELAY);
962   settingSet.insert(CSettings::SETTING_VIDEOPLAYER_SEEKSTEPS);
963   settingSet.insert(CSettings::SETTING_MUSICPLAYER_SEEKDELAY);
964   settingSet.insert(CSettings::SETTING_MUSICPLAYER_SEEKSTEPS);
965   GetSettingsManager()->RegisterCallback(&g_application.GetAppPlayer().GetSeekHandler(), settingSet);
966 
967   settingSet.clear();
968   settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGH);
969   settingSet.insert(CSettings::SETTING_LOOKANDFEEL_SKIN);
970   settingSet.insert(CSettings::SETTING_LOOKANDFEEL_SKINSETTINGS);
971   settingSet.insert(CSettings::SETTING_LOOKANDFEEL_FONT);
972   settingSet.insert(CSettings::SETTING_LOOKANDFEEL_SKINTHEME);
973   settingSet.insert(CSettings::SETTING_LOOKANDFEEL_SKINCOLORS);
974   settingSet.insert(CSettings::SETTING_LOOKANDFEEL_SKINZOOM);
975   settingSet.insert(CSettings::SETTING_MUSICPLAYER_REPLAYGAINPREAMP);
976   settingSet.insert(CSettings::SETTING_MUSICPLAYER_REPLAYGAINNOGAINPREAMP);
977   settingSet.insert(CSettings::SETTING_MUSICPLAYER_REPLAYGAINTYPE);
978   settingSet.insert(CSettings::SETTING_MUSICPLAYER_REPLAYGAINAVOIDCLIPPING);
979   settingSet.insert(CSettings::SETTING_SCRAPERS_MUSICVIDEOSDEFAULT);
980   settingSet.insert(CSettings::SETTING_SCREENSAVER_MODE);
981   settingSet.insert(CSettings::SETTING_SCREENSAVER_PREVIEW);
982   settingSet.insert(CSettings::SETTING_SCREENSAVER_SETTINGS);
983   settingSet.insert(CSettings::SETTING_AUDIOCDS_SETTINGS);
984   settingSet.insert(CSettings::SETTING_VIDEOSCREEN_GUICALIBRATION);
985   settingSet.insert(CSettings::SETTING_VIDEOSCREEN_TESTPATTERN);
986   settingSet.insert(CSettings::SETTING_VIDEOPLAYER_USEMEDIACODEC);
987   settingSet.insert(CSettings::SETTING_VIDEOPLAYER_USEMEDIACODECSURFACE);
988   settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_VOLUMESTEPS);
989   settingSet.insert(CSettings::SETTING_SOURCE_VIDEOS);
990   settingSet.insert(CSettings::SETTING_SOURCE_MUSIC);
991   settingSet.insert(CSettings::SETTING_SOURCE_PICTURES);
992   settingSet.insert(CSettings::SETTING_VIDEOSCREEN_FAKEFULLSCREEN);
993   GetSettingsManager()->RegisterCallback(&g_application, settingSet);
994 
995   settingSet.clear();
996   settingSet.insert(CSettings::SETTING_SUBTITLES_CHARSET);
997   settingSet.insert(CSettings::SETTING_LOCALE_CHARSET);
998   GetSettingsManager()->RegisterCallback(&g_charsetConverter, settingSet);
999 
1000   settingSet.clear();
1001   settingSet.insert(CSettings::SETTING_LOCALE_AUDIOLANGUAGE);
1002   settingSet.insert(CSettings::SETTING_LOCALE_SUBTITLELANGUAGE);
1003   settingSet.insert(CSettings::SETTING_LOCALE_LANGUAGE);
1004   settingSet.insert(CSettings::SETTING_LOCALE_COUNTRY);
1005   settingSet.insert(CSettings::SETTING_LOCALE_SHORTDATEFORMAT);
1006   settingSet.insert(CSettings::SETTING_LOCALE_LONGDATEFORMAT);
1007   settingSet.insert(CSettings::SETTING_LOCALE_TIMEFORMAT);
1008   settingSet.insert(CSettings::SETTING_LOCALE_USE24HOURCLOCK);
1009   settingSet.insert(CSettings::SETTING_LOCALE_TEMPERATUREUNIT);
1010   settingSet.insert(CSettings::SETTING_LOCALE_SPEEDUNIT);
1011   GetSettingsManager()->RegisterCallback(&g_langInfo, settingSet);
1012 
1013   settingSet.clear();
1014   settingSet.insert(CSettings::SETTING_MASTERLOCK_LOCKCODE);
1015   GetSettingsManager()->RegisterCallback(&g_passwordManager, settingSet);
1016 
1017   settingSet.clear();
1018   settingSet.insert(CSettings::SETTING_LOOKANDFEEL_RSSEDIT);
1019   GetSettingsManager()->RegisterCallback(&CRssManager::GetInstance(), settingSet);
1020 
1021 #if defined(TARGET_LINUX)
1022   settingSet.clear();
1023   settingSet.insert(CSettings::SETTING_LOCALE_TIMEZONE);
1024   settingSet.insert(CSettings::SETTING_LOCALE_TIMEZONECOUNTRY);
1025   GetSettingsManager()->RegisterCallback(&g_timezone, settingSet);
1026 #endif
1027 
1028 #if defined(TARGET_DARWIN_OSX)
1029   settingSet.clear();
1030   settingSet.insert(CSettings::SETTING_INPUT_APPLEREMOTEMODE);
1031   settingSet.insert(CSettings::SETTING_INPUT_APPLEREMOTEALWAYSON);
1032   GetSettingsManager()->RegisterCallback(&XBMCHelper::GetInstance(), settingSet);
1033 #endif
1034 
1035 #if defined(TARGET_DARWIN_TVOS)
1036   settingSet.clear();
1037   settingSet.insert(CSettings::SETTING_INPUT_APPLESIRI);
1038   settingSet.insert(CSettings::SETTING_INPUT_APPLESIRITIMEOUT);
1039   settingSet.insert(CSettings::SETTING_INPUT_APPLESIRITIMEOUTENABLED);
1040   GetSettingsManager()->RegisterCallback(&CTVOSInputSettings::GetInstance(), settingSet);
1041 #endif
1042 
1043   settingSet.clear();
1044   settingSet.insert(CSettings::SETTING_ADDONS_SHOW_RUNNING);
1045   settingSet.insert(CSettings::SETTING_ADDONS_MANAGE_DEPENDENCIES);
1046   settingSet.insert(CSettings::SETTING_ADDONS_ALLOW_UNKNOWN_SOURCES);
1047   GetSettingsManager()->RegisterCallback(&ADDON::CAddonSystemSettings::GetInstance(), settingSet);
1048 
1049   settingSet.clear();
1050   settingSet.insert(CSettings::SETTING_POWERMANAGEMENT_WAKEONACCESS);
1051   GetSettingsManager()->RegisterCallback(&CWakeOnAccess::GetInstance(), settingSet);
1052 
1053 #ifdef HAVE_LIBBLURAY
1054   settingSet.clear();
1055   settingSet.insert(CSettings::SETTING_DISC_PLAYBACK);
1056   GetSettingsManager()->RegisterCallback(&CDiscSettings::GetInstance(), settingSet);
1057 #endif
1058 }
1059 
UninitializeISettingCallbacks()1060 void CSettings::UninitializeISettingCallbacks()
1061 {
1062   GetSettingsManager()->UnregisterCallback(&CMediaSettings::GetInstance());
1063   GetSettingsManager()->UnregisterCallback(&CDisplaySettings::GetInstance());
1064   GetSettingsManager()->UnregisterCallback(&g_application.GetAppPlayer().GetSeekHandler());
1065   GetSettingsManager()->UnregisterCallback(&g_application);
1066   GetSettingsManager()->UnregisterCallback(&g_charsetConverter);
1067   GetSettingsManager()->UnregisterCallback(&g_langInfo);
1068   GetSettingsManager()->UnregisterCallback(&g_passwordManager);
1069   GetSettingsManager()->UnregisterCallback(&CRssManager::GetInstance());
1070 #if defined(TARGET_LINUX)
1071   GetSettingsManager()->UnregisterCallback(&g_timezone);
1072 #endif // defined(TARGET_LINUX)
1073 #if defined(TARGET_DARWIN_OSX)
1074   GetSettingsManager()->UnregisterCallback(&XBMCHelper::GetInstance());
1075 #endif
1076   GetSettingsManager()->UnregisterCallback(&CWakeOnAccess::GetInstance());
1077 #ifdef HAVE_LIBBLURAY
1078   GetSettingsManager()->UnregisterCallback(&CDiscSettings::GetInstance());
1079 #endif
1080 }
1081 
Reset()1082 bool CSettings::Reset()
1083 {
1084   const std::shared_ptr<CProfileManager> profileManager = CServiceBroker::GetSettingsComponent()->GetProfileManager();
1085 
1086   const std::string settingsFile = profileManager->GetSettingsFile();
1087 
1088   // try to delete the settings file
1089   if (XFILE::CFile::Exists(settingsFile, false) && !XFILE::CFile::Delete(settingsFile))
1090     CLog::Log(LOGWARNING, "Unable to delete old settings file at %s", settingsFile.c_str());
1091 
1092   // unload any loaded settings
1093   Unload();
1094 
1095   // try to save the default settings
1096   if (!Save())
1097   {
1098     CLog::Log(LOGWARNING, "Failed to save the default settings to %s", settingsFile.c_str());
1099     return false;
1100   }
1101 
1102   return true;
1103 }
1104