settings: add wrapper for GetList()/SetList() to CSettings
[vuplus_xbmc] / xbmc / settings / Settings.cpp
1 /*
2  *      Copyright (C) 2005-2013 Team XBMC
3  *      http://xbmc.org
4  *
5  *  This Program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2, or (at your option)
8  *  any later version.
9  *
10  *  This Program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with XBMC; see the file COPYING.  If not, see
17  *  <http://www.gnu.org/licenses/>.
18  *
19  */
20
21 #include "system.h"
22
23 #include "Settings.h"
24 #include "Application.h"
25 #include "Autorun.h"
26 #include "GUIPassword.h"
27 #include "LangInfo.h"
28 #include "Util.h"
29 #include "addons/AddonManager.h"
30 #include "addons/Skin.h"
31 #include "cores/AudioEngine/AEFactory.h"
32 #if defined(HAVE_LIBCRYSTALHD)
33 #include "cores/dvdplayer/DVDCodecs/Video/CrystalHD.h"
34 #endif // defined(HAVE_LIBCRYSTALHD)
35 #include "cores/playercorefactory/PlayerCoreFactory.h"
36 #include "cores/VideoRenderers/BaseRenderer.h"
37 #include "filesystem/File.h"
38 #include "guilib/GraphicContext.h"
39 #include "guilib/GUIAudioManager.h"
40 #include "guilib/GUIFontManager.h"
41 #include "guilib/LocalizeStrings.h"
42 #include "guilib/StereoscopicsManager.h"
43 #include "input/MouseStat.h"
44 #if defined(TARGET_WINDOWS)
45 #include "input/windows/WINJoystick.h"
46 #elif defined(HAS_SDL_JOYSTICK)
47 #include "input/SDLJoystick.h"
48 #endif // defined(HAS_SDL_JOYSTICK)
49 #if defined(TARGET_POSIX)
50 #include "linux/LinuxTimezone.h"
51 #endif // defined(TARGET_POSIX)
52 #include "network/NetworkServices.h"
53 #include "network/upnp/UPnPSettings.h"
54 #include "network/WakeOnAccess.h"
55 #if defined(TARGET_DARWIN_OSX)
56 #include "osx/XBMCHelper.h"
57 #include "cores/AudioEngine/Engines/CoreAudio/CoreAudioHardware.h"
58 #endif // defined(TARGET_DARWIN_OSX)
59 #if defined(TARGET_DARWIN)
60 #include "osx/DarwinUtils.h"
61 #endif
62 #include "peripherals/Peripherals.h"
63 #include "powermanagement/PowerManager.h"
64 #include "profiles/ProfilesManager.h"
65 #include "pvr/PVRManager.h"
66 #include "pvr/windows/GUIWindowPVRGuide.h"
67 #include "settings/AdvancedSettings.h"
68 #include "settings/DisplaySettings.h"
69 #include "settings/MediaSettings.h"
70 #include "settings/MediaSourceSettings.h"
71 #include "settings/SettingAddon.h"
72 #include "settings/SettingControl.h"
73 #include "settings/SettingsManager.h"
74 #include "settings/SettingPath.h"
75 #include "settings/SkinSettings.h"
76 #include "threads/SingleLock.h"
77 #include "utils/CharsetConverter.h"
78 #include "utils/log.h"
79 #include "utils/RssManager.h"
80 #include "utils/StringUtils.h"
81 #include "utils/SystemInfo.h"
82 #include "utils/Weather.h"
83 #include "utils/XBMCTinyXML.h"
84 #include "view/ViewStateSettings.h"
85 #include "windowing/WindowingFactory.h"
86 #if defined(TARGET_ANDROID)
87 #include "android/activity/AndroidFeatures.h"
88 #endif
89
90 #if defined(HAS_LIBAMCODEC)
91 #include "utils/AMLUtils.h"
92 #endif
93
94 #define SETTINGS_XML_FOLDER "special://xbmc/system/settings/"
95 #define SETTINGS_XML_ROOT   "settings"
96
97 using namespace XFILE;
98
99 bool AddonHasSettings(const std::string &condition, const std::string &value, const std::string &settingId)
100 {
101   if (settingId.empty())
102     return false;
103
104   CSettingAddon *setting = (CSettingAddon*)CSettings::Get().GetSetting(settingId);
105   if (setting == NULL)
106     return false;
107
108   ADDON::AddonPtr addon;
109   if (!ADDON::CAddonMgr::Get().GetAddon(setting->GetValue(), addon, setting->GetAddonType()) || addon == NULL)
110     return false;
111
112   if (addon->Type() == ADDON::ADDON_SKIN)
113     return ((ADDON::CSkinInfo*)addon.get())->HasSkinFile("SkinSettings.xml");
114
115   return addon->HasSettings();
116 }
117
118 bool CheckMasterLock(const std::string &condition, const std::string &value, const std::string &settingId)
119 {
120   return g_passwordManager.IsMasterLockUnlocked(StringUtils::EqualsNoCase(value, "true"));
121 }
122
123 bool CheckPVRParentalPin(const std::string &condition, const std::string &value, const std::string &settingId)
124 {
125   return PVR::g_PVRManager.CheckParentalPIN(g_localizeStrings.Get(19262).c_str());
126 }
127
128 bool HasPeripherals(const std::string &condition, const std::string &value, const std::string &settingId)
129 {
130   return PERIPHERALS::g_peripherals.GetNumberOfPeripherals() > 0;
131 }
132
133 bool IsFullscreen(const std::string &condition, const std::string &value, const std::string &settingId)
134 {
135   return g_Windowing.IsFullScreen();
136 }
137
138 bool IsMasterUser(const std::string &condition, const std::string &value, const std::string &settingId)
139 {
140   return g_passwordManager.bMasterUser;
141 }
142
143 bool IsUsingTTFSubtitles(const std::string &condition, const std::string &value, const std::string &settingId)
144 {
145   return CUtil::IsUsingTTFSubtitles();
146 }
147
148 bool ProfileCanWriteDatabase(const std::string &condition, const std::string &value, const std::string &settingId)
149 {
150   return CProfilesManager::Get().GetCurrentProfile().canWriteDatabases();
151 }
152
153 bool ProfileCanWriteSources(const std::string &condition, const std::string &value, const std::string &settingId)
154 {
155   return CProfilesManager::Get().GetCurrentProfile().canWriteSources();
156 }
157
158 bool ProfileHasAddons(const std::string &condition, const std::string &value, const std::string &settingId)
159 {
160   return CProfilesManager::Get().GetCurrentProfile().hasAddons();
161 }
162
163 bool ProfileHasDatabase(const std::string &condition, const std::string &value, const std::string &settingId)
164 {
165   return CProfilesManager::Get().GetCurrentProfile().hasDatabases();
166 }
167
168 bool ProfileHasSources(const std::string &condition, const std::string &value, const std::string &settingId)
169 {
170   return CProfilesManager::Get().GetCurrentProfile().hasSources();
171 }
172
173 bool ProfileHasAddonManagerLocked(const std::string &condition, const std::string &value, const std::string &settingId)
174 {
175   return CProfilesManager::Get().GetCurrentProfile().addonmanagerLocked();
176 }
177
178 bool ProfileHasFilesLocked(const std::string &condition, const std::string &value, const std::string &settingId)
179 {
180   return CProfilesManager::Get().GetCurrentProfile().filesLocked();
181 }
182
183 bool ProfileHasMusicLocked(const std::string &condition, const std::string &value, const std::string &settingId)
184 {
185   return CProfilesManager::Get().GetCurrentProfile().musicLocked();
186 }
187
188 bool ProfileHasPicturesLocked(const std::string &condition, const std::string &value, const std::string &settingId)
189 {
190   return CProfilesManager::Get().GetCurrentProfile().picturesLocked();
191 }
192
193 bool ProfileHasProgramsLocked(const std::string &condition, const std::string &value, const std::string &settingId)
194 {
195   return CProfilesManager::Get().GetCurrentProfile().programsLocked();
196 }
197
198 bool ProfileHasSettingsLocked(const std::string &condition, const std::string &value, const std::string &settingId)
199 {
200   LOCK_LEVEL::SETTINGS_LOCK slValue=LOCK_LEVEL::ALL;
201   if (StringUtils::EqualsNoCase(value, "none"))
202     slValue = LOCK_LEVEL::NONE;
203   else if (StringUtils::EqualsNoCase(value, "standard"))
204     slValue = LOCK_LEVEL::STANDARD;
205   else if (StringUtils::EqualsNoCase(value, "advanced"))
206     slValue = LOCK_LEVEL::ADVANCED;
207   else if (StringUtils::EqualsNoCase(value, "expert"))
208     slValue = LOCK_LEVEL::EXPERT;
209   return slValue <= CProfilesManager::Get().GetCurrentProfile().settingsLockLevel();
210 }
211
212 bool ProfileHasVideosLocked(const std::string &condition, const std::string &value, const std::string &settingId)
213 {
214   return CProfilesManager::Get().GetCurrentProfile().videoLocked();
215 }
216
217 bool ProfileLockMode(const std::string &condition, const std::string &value, const std::string &settingId)
218 {
219   char *tmp = NULL;
220   LockType lock = (LockType)strtol(value.c_str(), &tmp, 0);
221   if (tmp != NULL && *tmp != '\0')
222     return false;
223
224   return CProfilesManager::Get().GetCurrentProfile().getLockMode() == lock;
225 }
226
227 CSettings::CSettings()
228   : m_initialized(false)
229 {
230   m_settingsManager = new CSettingsManager();
231 }
232
233 CSettings::~CSettings()
234 {
235   Uninitialize();
236
237   delete m_settingsManager;
238 }
239
240 CSettings& CSettings::Get()
241 {
242   static CSettings sSettings;
243   return sSettings;
244 }
245
246 CSetting* CSettings::CreateSetting(const std::string &settingType, const std::string &settingId, CSettingsManager *settingsManager /* = NULL */) const
247 {
248   if (StringUtils::EqualsNoCase(settingType, "addon"))
249     return new CSettingAddon(settingId, settingsManager);
250   else if (StringUtils::EqualsNoCase(settingType, "path"))
251     return new CSettingPath(settingId, settingsManager);
252
253   return NULL;
254 }
255
256 ISettingControl* CSettings::CreateControl(const std::string &controlType) const
257 {
258   if (StringUtils::EqualsNoCase(controlType, "toggle"))
259     return new CSettingControlCheckmark();
260   else if (StringUtils::EqualsNoCase(controlType, "spinner"))
261     return new CSettingControlSpinner();
262   else if (StringUtils::EqualsNoCase(controlType, "edit"))
263     return new CSettingControlEdit();
264   else if (StringUtils::EqualsNoCase(controlType, "button"))
265     return new CSettingControlButton();
266   else if (StringUtils::EqualsNoCase(controlType, "list"))
267     return new CSettingControlList();
268
269   return NULL;
270 }
271
272 bool CSettings::Initialize()
273 {
274   CSingleLock lock(m_critical);
275   if (m_initialized)
276     return false;
277
278   // register custom setting types
279   InitializeSettingTypes();
280   // register custom setting controls
281   InitializeControls();
282
283   // option fillers and conditions need to be
284   // initialized before the setting definitions
285   InitializeOptionFillers();
286   InitializeConditions();
287
288   // load the settings definitions
289   if (!InitializeDefinitions())
290     return false;
291
292   m_settingsManager->SetInitialized();
293
294   InitializeISettingsHandlers();  
295   InitializeISubSettings();
296   InitializeISettingCallbacks();
297
298   m_initialized = true;
299
300   return true;
301 }
302
303 bool CSettings::Load()
304 {
305   return Load(CProfilesManager::Get().GetSettingsFile());
306 }
307
308 bool CSettings::Load(const std::string &file)
309 {
310   CXBMCTinyXML xmlDoc;
311   bool updated = false;
312   if (!XFILE::CFile::Exists(file) || !xmlDoc.LoadFile(file) ||
313       !m_settingsManager->Load(xmlDoc.RootElement(), updated))
314   {
315     CLog::Log(LOGERROR, "CSettingsManager: unable to load settings from %s, creating new default settings", file.c_str());
316     if (!Reset())
317       return false;
318
319     if (!Load(file))
320       return false;
321   }
322   // if the settings had to be updated, we need to save the changes
323   else if (updated)
324     return Save(file);
325
326   return true;
327 }
328
329 bool CSettings::Load(const TiXmlElement *root, bool hide /* = false */)
330 {
331   if (root == NULL)
332     return false;
333
334   std::map<std::string, CSetting*> *loadedSettings = NULL;
335   if (hide)
336     loadedSettings = new std::map<std::string, CSetting*>();
337
338   bool updated;
339   // only trigger settings events if hiding is disabled
340   bool success = m_settingsManager->Load(root, updated, !hide, loadedSettings);
341   // if necessary hide all the loaded settings
342   if (success && hide && loadedSettings != NULL)
343   {
344     for(std::map<std::string, CSetting*>::const_iterator setting = loadedSettings->begin(); setting != loadedSettings->end(); ++setting)
345       setting->second->SetVisible(false);
346   }
347   delete loadedSettings;
348
349   return success;
350 }
351
352 void CSettings::SetLoaded()
353 {
354   m_settingsManager->SetLoaded();
355 }
356
357 bool CSettings::Save()
358 {
359   return Save(CProfilesManager::Get().GetSettingsFile());
360 }
361
362 bool CSettings::Save(const std::string &file)
363 {
364   CXBMCTinyXML xmlDoc;
365   TiXmlElement rootElement(SETTINGS_XML_ROOT);
366   TiXmlNode *root = xmlDoc.InsertEndChild(rootElement);
367   if (root == NULL)
368     return false;
369
370   if (!m_settingsManager->Save(root))
371     return false;
372
373   return xmlDoc.SaveFile(file);
374 }
375
376 void CSettings::Unload()
377 {
378   CSingleLock lock(m_critical);
379   m_settingsManager->Unload();
380 }
381
382 void CSettings::Uninitialize()
383 {
384   CSingleLock lock(m_critical);
385   if (!m_initialized)
386     return;
387
388   // unregister setting option fillers
389   m_settingsManager->UnregisterSettingOptionsFiller("audiocdactions");
390   m_settingsManager->UnregisterSettingOptionsFiller("audiocdencoders");
391   m_settingsManager->UnregisterSettingOptionsFiller("aequalitylevels");
392   m_settingsManager->UnregisterSettingOptionsFiller("audiodevices");
393   m_settingsManager->UnregisterSettingOptionsFiller("audiodevicespassthrough");
394   m_settingsManager->UnregisterSettingOptionsFiller("audiostreamsilence");
395   m_settingsManager->UnregisterSettingOptionsFiller("charsets");
396   m_settingsManager->UnregisterSettingOptionsFiller("epgguideviews");
397   m_settingsManager->UnregisterSettingOptionsFiller("fontheights");
398   m_settingsManager->UnregisterSettingOptionsFiller("fonts");
399   m_settingsManager->UnregisterSettingOptionsFiller("languages");
400   m_settingsManager->UnregisterSettingOptionsFiller("pvrstartlastchannel");
401   m_settingsManager->UnregisterSettingOptionsFiller("refreshchangedelays");
402   m_settingsManager->UnregisterSettingOptionsFiller("refreshrates");
403   m_settingsManager->UnregisterSettingOptionsFiller("regions");
404   m_settingsManager->UnregisterSettingOptionsFiller("rendermethods");
405   m_settingsManager->UnregisterSettingOptionsFiller("resolutions");
406   m_settingsManager->UnregisterSettingOptionsFiller("screens");
407   m_settingsManager->UnregisterSettingOptionsFiller("stereoscopicmodes");
408   m_settingsManager->UnregisterSettingOptionsFiller("preferedstereoscopicviewmodes");
409   m_settingsManager->UnregisterSettingOptionsFiller("shutdownstates");
410   m_settingsManager->UnregisterSettingOptionsFiller("startupwindows");
411   m_settingsManager->UnregisterSettingOptionsFiller("streamlanguages");
412   m_settingsManager->UnregisterSettingOptionsFiller("skincolors");
413   m_settingsManager->UnregisterSettingOptionsFiller("skinfonts");
414   m_settingsManager->UnregisterSettingOptionsFiller("skinsounds");
415   m_settingsManager->UnregisterSettingOptionsFiller("skinthemes");
416 #if defined(TARGET_LINUX)
417   m_settingsManager->UnregisterSettingOptionsFiller("timezonecountries");
418   m_settingsManager->UnregisterSettingOptionsFiller("timezones");
419 #endif // defined(TARGET_LINUX)
420   m_settingsManager->UnregisterSettingOptionsFiller("verticalsyncs");
421
422   // unregister ISettingCallback implementations
423   m_settingsManager->UnregisterCallback(&g_advancedSettings);
424   m_settingsManager->UnregisterCallback(&CMediaSettings::Get());
425   m_settingsManager->UnregisterCallback(&CDisplaySettings::Get());
426   m_settingsManager->UnregisterCallback(&CStereoscopicsManager::Get());
427   m_settingsManager->UnregisterCallback(&g_application);
428   m_settingsManager->UnregisterCallback(&g_audioManager);
429   m_settingsManager->UnregisterCallback(&g_charsetConverter);
430   m_settingsManager->UnregisterCallback(&g_graphicsContext);
431   m_settingsManager->UnregisterCallback(&g_langInfo);
432 #if defined(TARGET_WINDOWS) || defined(HAS_SDL_JOYSTICK)
433   m_settingsManager->UnregisterCallback(&g_Joystick);
434 #endif
435   m_settingsManager->UnregisterCallback(&g_Mouse);
436   m_settingsManager->UnregisterCallback(&CNetworkServices::Get());
437   m_settingsManager->UnregisterCallback(&g_passwordManager);
438   m_settingsManager->UnregisterCallback(&PVR::g_PVRManager);
439   m_settingsManager->UnregisterCallback(&CRssManager::Get());
440 #if defined(TARGET_LINUX)
441   m_settingsManager->UnregisterCallback(&g_timezone);
442 #endif // defined(TARGET_LINUX)
443   m_settingsManager->UnregisterCallback(&g_weatherManager);
444   m_settingsManager->UnregisterCallback(&PERIPHERALS::CPeripherals::Get());
445 #if defined(TARGET_DARWIN_OSX)
446   m_settingsManager->UnregisterCallback(&XBMCHelper::GetInstance());
447 #endif
448
449   // cleanup the settings manager
450   m_settingsManager->Clear();
451
452   // unregister ISubSettings implementations
453   m_settingsManager->UnregisterSubSettings(&g_application);
454   m_settingsManager->UnregisterSubSettings(&CDisplaySettings::Get());
455   m_settingsManager->UnregisterSubSettings(&CMediaSettings::Get());
456   m_settingsManager->UnregisterSubSettings(&CSkinSettings::Get());
457   m_settingsManager->UnregisterSubSettings(&g_sysinfo);
458   m_settingsManager->UnregisterSubSettings(&CViewStateSettings::Get());
459
460   // unregister ISettingsHandler implementations
461   m_settingsManager->UnregisterSettingsHandler(&g_advancedSettings);
462   m_settingsManager->UnregisterSettingsHandler(&CMediaSourceSettings::Get());
463   m_settingsManager->UnregisterSettingsHandler(&CPlayerCoreFactory::Get());
464   m_settingsManager->UnregisterSettingsHandler(&CProfilesManager::Get());
465 #ifdef HAS_UPNP
466   m_settingsManager->UnregisterSettingsHandler(&CUPnPSettings::Get());
467 #endif
468   m_settingsManager->UnregisterSettingsHandler(&CWakeOnAccess::Get());
469   m_settingsManager->UnregisterSettingsHandler(&CRssManager::Get());
470   m_settingsManager->UnregisterSettingsHandler(&g_application);
471
472   m_initialized = false;
473 }
474
475 void CSettings::RegisterCallback(ISettingCallback *callback, const std::set<std::string> &settingList)
476 {
477   m_settingsManager->RegisterCallback(callback, settingList);
478 }
479
480 void CSettings::UnregisterCallback(ISettingCallback *callback)
481 {
482   m_settingsManager->UnregisterCallback(callback);
483 }
484
485 CSetting* CSettings::GetSetting(const std::string &id) const
486 {
487   CSingleLock lock(m_critical);
488   if (id.empty())
489     return NULL;
490
491   return m_settingsManager->GetSetting(id);
492 }
493
494 CSettingSection* CSettings::GetSection(const std::string &section) const
495 {
496   CSingleLock lock(m_critical);
497   if (section.empty())
498     return NULL;
499
500   return m_settingsManager->GetSection(section);
501 }
502
503 bool CSettings::GetBool(const std::string &id) const
504 {
505   // Backward compatibility (skins use this setting)
506   if (StringUtils::EqualsNoCase(id, "lookandfeel.enablemouse"))
507     return GetBool("input.enablemouse");
508
509   return m_settingsManager->GetBool(id);
510 }
511
512 bool CSettings::SetBool(const std::string &id, bool value)
513 {
514   return m_settingsManager->SetBool(id, value);
515 }
516
517 bool CSettings::ToggleBool(const std::string &id)
518 {
519   return m_settingsManager->ToggleBool(id);
520 }
521
522 int CSettings::GetInt(const std::string &id) const
523 {
524   return m_settingsManager->GetInt(id);
525 }
526
527 bool CSettings::SetInt(const std::string &id, int value)
528 {
529   return m_settingsManager->SetInt(id, value);
530 }
531
532 double CSettings::GetNumber(const std::string &id) const
533 {
534   return m_settingsManager->GetNumber(id);
535 }
536
537 bool CSettings::SetNumber(const std::string &id, double value)
538 {
539   return m_settingsManager->SetNumber(id, value);
540 }
541
542 std::string CSettings::GetString(const std::string &id) const
543 {
544   return m_settingsManager->GetString(id);
545 }
546
547 bool CSettings::SetString(const std::string &id, const std::string &value)
548 {
549   return m_settingsManager->SetString(id, value);
550 }
551
552 std::vector<CVariant> CSettings::GetList(const std::string &id) const
553 {
554   std::vector<CVariant> realValues;
555
556   CSetting *setting = m_settingsManager->GetSetting(id);
557   if (setting == NULL)
558     return realValues;
559
560   CSettingList *listSetting = static_cast<CSettingList*>(setting);
561   const SettingPtrList &values = listSetting->GetValue();
562   for (SettingPtrList::const_iterator it = values.begin(); it != values.end(); ++it)
563   {
564     switch (listSetting->GetElementType())
565     {
566       case SettingTypeBool:
567         realValues.push_back(static_cast<const CSettingBool*>(it->get())->GetValue());
568         break;
569
570       case SettingTypeInteger:
571         realValues.push_back(static_cast<const CSettingInt*>(it->get())->GetValue());
572         break;
573
574       case SettingTypeNumber:
575         realValues.push_back(static_cast<const CSettingNumber*>(it->get())->GetValue());
576         break;
577
578       case SettingTypeString:
579         realValues.push_back(static_cast<const CSettingString*>(it->get())->GetValue());
580         break;
581
582       default:
583         break;
584     }
585   }
586
587   return realValues;
588 }
589
590 bool CSettings::SetList(const std::string &id, const std::vector<CVariant> &value)
591 {
592   CSetting *setting = m_settingsManager->GetSetting(id);
593   if (setting == NULL)
594     return false;
595
596   CSettingList *listSetting = static_cast<CSettingList*>(setting);
597   SettingPtrList newValues;
598   bool ret = true;
599   int index = 0;
600   for (std::vector<CVariant>::const_iterator itValue = value.begin(); itValue != value.end(); ++itValue)
601   {
602     CSetting *settingValue = listSetting->GetDefinition()->Clone(StringUtils::Format("%s.%d", listSetting->GetId().c_str(), index++));
603     if (settingValue == NULL)
604       return false;
605
606     switch (listSetting->GetElementType())
607     {
608       case SettingTypeBool:
609         if (!itValue->isBoolean())
610           return false;
611         ret = static_cast<CSettingBool*>(settingValue)->SetValue(itValue->asBoolean());
612         break;
613
614       case SettingTypeInteger:
615         if (!itValue->isInteger())
616           return false;
617         ret = static_cast<CSettingInt*>(settingValue)->SetValue(itValue->asInteger());
618         break;
619
620       case SettingTypeNumber:
621         if (!itValue->isDouble())
622           return false;
623         ret = static_cast<CSettingNumber*>(settingValue)->SetValue(itValue->asDouble());
624         break;
625
626       case SettingTypeString:
627         if (!itValue->isString())
628           return false;
629         ret = static_cast<CSettingString*>(settingValue)->SetValue(itValue->asString());
630         break;
631
632       default:
633         ret = false;
634         break;
635     }
636
637     if (!ret)
638     {
639       delete settingValue;
640       return false;
641     }
642
643     newValues.push_back(SettingPtr(settingValue));
644   }
645
646   return listSetting->SetValue(newValues);
647 }
648
649 bool CSettings::LoadSetting(const TiXmlNode *node, const std::string &settingId)
650 {
651   return m_settingsManager->LoadSetting(node, settingId);
652 }
653
654 bool CSettings::Initialize(const std::string &file)
655 {
656   CXBMCTinyXML xmlDoc;
657   if (!xmlDoc.LoadFile(file.c_str()))
658   {
659     CLog::Log(LOGERROR, "CSettings: error loading settings definition from %s, Line %d\n%s", file.c_str(), xmlDoc.ErrorRow(), xmlDoc.ErrorDesc());
660     return false;
661   }
662
663   CLog::Log(LOGDEBUG, "CSettings: loaded settings definition from %s", file.c_str());
664   
665   TiXmlElement *root = xmlDoc.RootElement();
666   if (root == NULL)
667     return false;
668
669   return m_settingsManager->Initialize(root);
670 }
671
672 bool CSettings::InitializeDefinitions()
673 {
674   if (!Initialize(SETTINGS_XML_FOLDER "settings.xml"))
675   {
676     CLog::Log(LOGFATAL, "Unable to load settings definitions");
677     return false;
678   }
679 #if defined(TARGET_WINDOWS)
680   if (CFile::Exists(SETTINGS_XML_FOLDER "win32.xml") && !Initialize(SETTINGS_XML_FOLDER "win32.xml"))
681     CLog::Log(LOGFATAL, "Unable to load win32-specific settings definitions");
682 #elif defined(TARGET_ANDROID)
683   if (CFile::Exists(SETTINGS_XML_FOLDER "android.xml") && !Initialize(SETTINGS_XML_FOLDER "android.xml"))
684     CLog::Log(LOGFATAL, "Unable to load android-specific settings definitions");
685 #elif defined(TARGET_RASPBERRY_PI)
686   if (CFile::Exists(SETTINGS_XML_FOLDER "rbp.xml") && !Initialize(SETTINGS_XML_FOLDER "rbp.xml"))
687     CLog::Log(LOGFATAL, "Unable to load rbp-specific settings definitions");
688 #elif defined(TARGET_FREEBSD)
689   if (CFile::Exists(SETTINGS_XML_FOLDER "freebsd.xml") && !Initialize(SETTINGS_XML_FOLDER "freebsd.xml"))
690     CLog::Log(LOGFATAL, "Unable to load freebsd-specific settings definitions");
691 #elif defined(TARGET_LINUX)
692   if (CFile::Exists(SETTINGS_XML_FOLDER "linux.xml") && !Initialize(SETTINGS_XML_FOLDER "linux.xml"))
693     CLog::Log(LOGFATAL, "Unable to load linux-specific settings definitions");
694 #elif defined(TARGET_DARWIN)
695   if (CFile::Exists(SETTINGS_XML_FOLDER "darwin.xml") && !Initialize(SETTINGS_XML_FOLDER "darwin.xml"))
696     CLog::Log(LOGFATAL, "Unable to load darwin-specific settings definitions");
697 #if defined(TARGET_DARWIN_OSX)
698   if (CFile::Exists(SETTINGS_XML_FOLDER "darwin_osx.xml") && !Initialize(SETTINGS_XML_FOLDER "darwin_osx.xml"))
699     CLog::Log(LOGFATAL, "Unable to load osx-specific settings definitions");
700 #elif defined(TARGET_DARWIN_IOS)
701   if (CFile::Exists(SETTINGS_XML_FOLDER "darwin_ios.xml") && !Initialize(SETTINGS_XML_FOLDER "darwin_ios.xml"))
702     CLog::Log(LOGFATAL, "Unable to load ios-specific settings definitions");
703 #if defined(TARGET_DARWIN_IOS_ATV2)
704   if (CFile::Exists(SETTINGS_XML_FOLDER "darwin_ios_atv2.xml") && !Initialize(SETTINGS_XML_FOLDER "darwin_ios_atv2.xml"))
705     CLog::Log(LOGFATAL, "Unable to load atv2-specific settings definitions");
706 #endif
707 #endif
708 #endif
709
710   // load any custom visibility and default values before loading the special
711   // appliance.xml so that appliances are able to overwrite even those values
712   InitializeVisibility();
713   InitializeDefaults();
714
715   if (CFile::Exists(SETTINGS_XML_FOLDER "appliance.xml") && !Initialize(SETTINGS_XML_FOLDER "appliance.xml"))
716     CLog::Log(LOGFATAL, "Unable to load appliance-specific settings definitions");
717
718   return true;
719 }
720
721 void CSettings::InitializeSettingTypes()
722 {
723   // register "addon" and "path" setting types implemented by CSettingAddon
724   m_settingsManager->RegisterSettingType("addon", this);
725   m_settingsManager->RegisterSettingType("path", this);
726 }
727
728 void CSettings::InitializeControls()
729 {
730   m_settingsManager->RegisterSettingControl("toggle", this);
731   m_settingsManager->RegisterSettingControl("spinner", this);
732   m_settingsManager->RegisterSettingControl("edit", this);
733   m_settingsManager->RegisterSettingControl("button", this);
734   m_settingsManager->RegisterSettingControl("list", this);
735 }
736
737 void CSettings::InitializeVisibility()
738 {
739   // hide some settings if necessary
740 #if defined(TARGET_DARWIN)
741   CSettingString* timezonecountry = (CSettingString*)m_settingsManager->GetSetting("locale.timezonecountry");
742   CSettingString* timezone = (CSettingString*)m_settingsManager->GetSetting("locale.timezone");
743
744   if (!g_sysinfo.IsAppleTV2() || GetIOSVersion() >= 4.3)
745   {
746     timezonecountry->SetRequirementsMet(false);
747     timezone->SetRequirementsMet(false);
748   }
749 #endif
750 }
751
752 void CSettings::InitializeDefaults()
753 {
754   // set some default values if necessary
755 #if defined(HAS_SKIN_TOUCHED) && defined(TARGET_DARWIN_IOS) && !defined(TARGET_DARWIN_IOS_ATV2)
756   ((CSettingAddon*)m_settingsManager->GetSetting("lookandfeel.skin"))->SetDefault("skin.touched");
757 #endif
758
759 #if defined(TARGET_POSIX)
760   CSettingString* timezonecountry = (CSettingString*)m_settingsManager->GetSetting("locale.timezonecountry");
761   CSettingString* timezone = (CSettingString*)m_settingsManager->GetSetting("locale.timezone");
762
763   if (timezonecountry->IsVisible())
764     timezonecountry->SetDefault(g_timezone.GetCountryByTimezone(g_timezone.GetOSConfiguredTimezone()));
765   if (timezone->IsVisible())
766     timezone->SetDefault(g_timezone.GetOSConfiguredTimezone());
767 #endif // defined(TARGET_POSIX)
768
769 #if defined(TARGET_WINDOWS)
770   #if defined(HAS_DX)
771   ((CSettingString*)m_settingsManager->GetSetting("musicplayer.visualisation"))->SetDefault("visualization.milkdrop");
772   #endif
773
774   #if !defined(HAS_GL)
775   // We prefer a fake fullscreen mode (window covering the screen rather than dedicated fullscreen)
776   // as it works nicer with switching to other applications. However on some systems vsync is broken
777   // when we do this (eg non-Aero on ATI in particular) and on others (AppleTV) we can't get XBMC to
778   // the front
779   if (g_sysinfo.IsAeroDisabled())
780     ((CSettingBool*)m_settingsManager->GetSetting("videoscreen.fakefullscreen"))->SetDefault(false);
781   #endif
782 #endif
783
784 #if defined(TARGET_DARWIN)
785   #if !defined(TARGET_DARWIN_IOS)
786   CStdString defaultAudioDeviceName;
787   CCoreAudioHardware::GetOutputDeviceName(defaultAudioDeviceName);
788   ((CSettingString*)m_settingsManager->GetSetting("audiooutput.audiodevice"))->SetDefault(defaultAudioDeviceName);
789   ((CSettingString*)m_settingsManager->GetSetting("audiooutput.passthroughdevice"))->SetDefault(defaultAudioDeviceName);
790   #endif
791 #elif !defined(TARGET_WINDOWS)
792   ((CSettingString*)m_settingsManager->GetSetting("audiooutput.audiodevice"))->SetDefault(CAEFactory::GetDefaultDevice(false));
793   ((CSettingString*)m_settingsManager->GetSetting("audiooutput.passthroughdevice"))->SetDefault(CAEFactory::GetDefaultDevice(true));
794 #endif
795
796   if (g_application.IsStandAlone())
797     ((CSettingInt*)m_settingsManager->GetSetting("powermanagement.shutdownstate"))->SetDefault(POWERSTATE_SHUTDOWN);
798
799 #if defined(HAS_WEB_SERVER)
800   if (CUtil::CanBindPrivileged())
801     ((CSettingInt*)m_settingsManager->GetSetting("services.webserverport"))->SetDefault(80);
802 #endif
803 }
804
805 void CSettings::InitializeOptionFillers()
806 {
807   // register setting option fillers
808 #ifdef HAS_DVD_DRIVE
809   m_settingsManager->RegisterSettingOptionsFiller("audiocdactions", MEDIA_DETECT::CAutorun::SettingOptionAudioCdActionsFiller);
810   m_settingsManager->RegisterSettingOptionsFiller("audiocdencoders", MEDIA_DETECT::CAutorun::SettingOptionAudioCdEncodersFiller);
811 #endif
812   m_settingsManager->RegisterSettingOptionsFiller("aequalitylevels", CAEFactory::SettingOptionsAudioQualityLevelsFiller);
813   m_settingsManager->RegisterSettingOptionsFiller("audiodevices", CAEFactory::SettingOptionsAudioDevicesFiller);
814   m_settingsManager->RegisterSettingOptionsFiller("audiodevicespassthrough", CAEFactory::SettingOptionsAudioDevicesPassthroughFiller);
815   m_settingsManager->RegisterSettingOptionsFiller("audiostreamsilence", CAEFactory::SettingOptionsAudioStreamsilenceFiller);
816   m_settingsManager->RegisterSettingOptionsFiller("charsets", CCharsetConverter::SettingOptionsCharsetsFiller);
817   m_settingsManager->RegisterSettingOptionsFiller("epgguideviews", PVR::CGUIWindowPVRGuide::SettingOptionsEpgGuideViewFiller);
818   m_settingsManager->RegisterSettingOptionsFiller("fonts", GUIFontManager::SettingOptionsFontsFiller);
819   m_settingsManager->RegisterSettingOptionsFiller("languages", CLangInfo::SettingOptionsLanguagesFiller);
820   m_settingsManager->RegisterSettingOptionsFiller("pvrstartlastchannel", PVR::CPVRManager::SettingOptionsPvrStartLastChannelFiller);
821   m_settingsManager->RegisterSettingOptionsFiller("refreshchangedelays", CDisplaySettings::SettingOptionsRefreshChangeDelaysFiller);
822   m_settingsManager->RegisterSettingOptionsFiller("refreshrates", CDisplaySettings::SettingOptionsRefreshRatesFiller);
823   m_settingsManager->RegisterSettingOptionsFiller("regions", CLangInfo::SettingOptionsRegionsFiller);
824   m_settingsManager->RegisterSettingOptionsFiller("rendermethods", CBaseRenderer::SettingOptionsRenderMethodsFiller);
825   m_settingsManager->RegisterSettingOptionsFiller("resolutions", CDisplaySettings::SettingOptionsResolutionsFiller);
826   m_settingsManager->RegisterSettingOptionsFiller("screens", CDisplaySettings::SettingOptionsScreensFiller);
827   m_settingsManager->RegisterSettingOptionsFiller("stereoscopicmodes", CDisplaySettings::SettingOptionsStereoscopicModesFiller);
828   m_settingsManager->RegisterSettingOptionsFiller("preferedstereoscopicviewmodes", CDisplaySettings::SettingOptionsPreferredStereoscopicViewModesFiller);
829   m_settingsManager->RegisterSettingOptionsFiller("shutdownstates", CPowerManager::SettingOptionsShutdownStatesFiller);
830   m_settingsManager->RegisterSettingOptionsFiller("startupwindows", ADDON::CSkinInfo::SettingOptionsStartupWindowsFiller);
831   m_settingsManager->RegisterSettingOptionsFiller("streamlanguages", CLangInfo::SettingOptionsStreamLanguagesFiller);
832   m_settingsManager->RegisterSettingOptionsFiller("skincolors", ADDON::CSkinInfo::SettingOptionsSkinColorsFiller);
833   m_settingsManager->RegisterSettingOptionsFiller("skinfonts", ADDON::CSkinInfo::SettingOptionsSkinFontsFiller);
834   m_settingsManager->RegisterSettingOptionsFiller("skinsounds", ADDON::CSkinInfo::SettingOptionsSkinSoundFiller);
835   m_settingsManager->RegisterSettingOptionsFiller("skinthemes", ADDON::CSkinInfo::SettingOptionsSkinThemesFiller);
836 #ifdef TARGET_LINUX
837   m_settingsManager->RegisterSettingOptionsFiller("timezonecountries", CLinuxTimezone::SettingOptionsTimezoneCountriesFiller);
838   m_settingsManager->RegisterSettingOptionsFiller("timezones", CLinuxTimezone::SettingOptionsTimezonesFiller);
839 #endif
840   m_settingsManager->RegisterSettingOptionsFiller("verticalsyncs", CDisplaySettings::SettingOptionsVerticalSyncsFiller);
841 }
842
843 void CSettings::InitializeConditions()
844 {
845   // add basic conditions
846   m_settingsManager->AddCondition("true");
847 #ifdef HAS_AIRPLAY
848   m_settingsManager->AddCondition("has_airplay");
849 #endif
850 #ifdef HAS_EVENT_SERVER
851   m_settingsManager->AddCondition("has_event_server");
852 #endif
853 #ifdef HAVE_X11
854   m_settingsManager->AddCondition("have_x11");
855 #endif
856 #ifdef HAS_GL
857   m_settingsManager->AddCondition("has_gl");
858 #endif
859 #ifdef HAS_GLES
860   m_settingsManager->AddCondition("has_gles");
861 #endif
862 #if HAS_GLES == 2
863   m_settingsManager->AddCondition("has_glesv2");
864 #endif
865 #ifdef HAS_KARAOKE
866   m_settingsManager->AddCondition("has_karaoke");
867 #endif
868 #ifdef HAS_SDL_JOYSTICK
869   m_settingsManager->AddCondition("has_sdl_joystick");
870 #endif
871 #ifdef HAS_SKIN_TOUCHED
872   m_settingsManager->AddCondition("has_skin_touched");
873 #endif
874 #ifdef HAS_TIME_SERVER
875   m_settingsManager->AddCondition("has_time_server");
876 #endif
877 #ifdef HAS_WEB_SERVER
878   m_settingsManager->AddCondition("has_web_server");
879 #endif
880 #ifdef HAS_ZEROCONF
881   m_settingsManager->AddCondition("has_zeroconf");
882 #endif
883 #ifdef HAVE_LIBCRYSTALHD
884   m_settingsManager->AddCondition("have_libcrystalhd");
885   if (CCrystalHD::GetInstance()->DevicePresent())
886     m_settingsManager->AddCondition("hascrystalhddevice");
887 #endif
888 #ifdef HAVE_LIBOPENMAX
889   m_settingsManager->AddCondition("have_libopenmax");
890 #endif
891 #ifdef HAVE_LIBVA
892   m_settingsManager->AddCondition("have_libva");
893 #endif
894 #ifdef HAVE_LIBVDPAU
895   m_settingsManager->AddCondition("have_libvdpau");
896 #endif
897 #ifdef TARGET_ANDROID
898   if (CAndroidFeatures::GetVersion() > 15)
899     m_settingsManager->AddCondition("has_mediacodec");
900 #endif
901 #ifdef HAVE_VIDEOTOOLBOXDECODER
902   m_settingsManager->AddCondition("have_videotoolboxdecoder");
903   if (g_sysinfo.HasVideoToolBoxDecoder())
904     m_settingsManager->AddCondition("hasvideotoolboxdecoder");
905 #endif
906 #ifdef HAS_LIBAMCODEC
907   if (aml_present())
908     m_settingsManager->AddCondition("have_amcodec");
909 #endif
910 #ifdef HAS_LIBSTAGEFRIGHT
911   if (CAndroidFeatures::GetVersion() < 19)
912     m_settingsManager->AddCondition("have_libstagefrightdecoder");
913 #endif
914 #ifdef TARGET_DARWIN_IOS_ATV2
915   if (g_sysinfo.IsAppleTV2())
916     m_settingsManager->AddCondition("isappletv2");
917 #endif
918 #if defined(TARGET_WINDOWS) && defined(HAS_DX)
919   m_settingsManager->AddCondition("has_dx");
920   m_settingsManager->AddCondition("hasdxva2");
921 #endif
922
923   if (g_application.IsStandAlone())
924     m_settingsManager->AddCondition("isstandalone");
925
926   if(CAEFactory::SupportsQualitySetting())
927     m_settingsManager->AddCondition("has_ae_quality_levels");
928
929   // add more complex conditions
930   m_settingsManager->AddCondition("addonhassettings", AddonHasSettings);
931   m_settingsManager->AddCondition("checkmasterlock", CheckMasterLock);
932   m_settingsManager->AddCondition("checkpvrparentalpin", CheckPVRParentalPin);
933   m_settingsManager->AddCondition("hasperipherals", HasPeripherals);
934   m_settingsManager->AddCondition("isfullscreen", IsFullscreen);
935   m_settingsManager->AddCondition("ismasteruser", IsMasterUser);
936   m_settingsManager->AddCondition("isusingttfsubtitles", IsUsingTTFSubtitles);
937   m_settingsManager->AddCondition("profilecanwritedatabase", ProfileCanWriteDatabase);
938   m_settingsManager->AddCondition("profilecanwritesources", ProfileCanWriteSources);
939   m_settingsManager->AddCondition("profilehasaddons", ProfileHasAddons);
940   m_settingsManager->AddCondition("profilehasdatabase", ProfileHasDatabase);
941   m_settingsManager->AddCondition("profilehassources", ProfileHasSources);
942   m_settingsManager->AddCondition("profilehasaddonmanagerlocked", ProfileHasAddonManagerLocked);
943   m_settingsManager->AddCondition("profilehasfileslocked", ProfileHasFilesLocked);
944   m_settingsManager->AddCondition("profilehasmusiclocked", ProfileHasMusicLocked);
945   m_settingsManager->AddCondition("profilehaspictureslocked", ProfileHasPicturesLocked);
946   m_settingsManager->AddCondition("profilehasprogramslocked", ProfileHasProgramsLocked);
947   m_settingsManager->AddCondition("profilehassettingslocked", ProfileHasSettingsLocked);
948   m_settingsManager->AddCondition("profilehasvideoslocked", ProfileHasVideosLocked);
949   m_settingsManager->AddCondition("profilelockmode", ProfileLockMode);
950   m_settingsManager->AddCondition("aesettingvisible", CAEFactory::IsSettingVisible);
951 }
952
953 void CSettings::InitializeISettingsHandlers()
954 {
955   // register ISettingsHandler implementations
956   // The order of these matters! Handlers are processed in the order they were registered.
957   m_settingsManager->RegisterSettingsHandler(&g_advancedSettings);
958   m_settingsManager->RegisterSettingsHandler(&CMediaSourceSettings::Get());
959   m_settingsManager->RegisterSettingsHandler(&CPlayerCoreFactory::Get());
960   m_settingsManager->RegisterSettingsHandler(&CProfilesManager::Get());
961 #ifdef HAS_UPNP
962   m_settingsManager->RegisterSettingsHandler(&CUPnPSettings::Get());
963 #endif
964   m_settingsManager->RegisterSettingsHandler(&CWakeOnAccess::Get());
965   m_settingsManager->RegisterSettingsHandler(&CRssManager::Get());
966   m_settingsManager->RegisterSettingsHandler(&g_application);
967 }
968
969 void CSettings::InitializeISubSettings()
970 {
971   // register ISubSettings implementations
972   m_settingsManager->RegisterSubSettings(&g_application);
973   m_settingsManager->RegisterSubSettings(&CDisplaySettings::Get());
974   m_settingsManager->RegisterSubSettings(&CMediaSettings::Get());
975   m_settingsManager->RegisterSubSettings(&CSkinSettings::Get());
976   m_settingsManager->RegisterSubSettings(&g_sysinfo);
977   m_settingsManager->RegisterSubSettings(&CViewStateSettings::Get());
978 }
979
980 void CSettings::InitializeISettingCallbacks()
981 {
982   // register any ISettingCallback implementations
983   std::set<std::string> settingSet;
984   settingSet.insert("debug.showloginfo");
985   settingSet.insert("debug.setextraloglevel");
986   m_settingsManager->RegisterCallback(&g_advancedSettings, settingSet);
987
988   settingSet.clear();
989   settingSet.insert("karaoke.export");
990   settingSet.insert("karaoke.importcsv");
991   settingSet.insert("musiclibrary.cleanup");
992   settingSet.insert("musiclibrary.export");
993   settingSet.insert("musiclibrary.import");
994   settingSet.insert("musicfiles.trackformat");
995   settingSet.insert("musicfiles.trackformatright");
996   settingSet.insert("videolibrary.flattentvshows");
997   settingSet.insert("videolibrary.removeduplicates");
998   settingSet.insert("videolibrary.groupmoviesets");
999   settingSet.insert("videolibrary.cleanup");
1000   settingSet.insert("videolibrary.import");
1001   settingSet.insert("videolibrary.export");
1002   m_settingsManager->RegisterCallback(&CMediaSettings::Get(), settingSet);
1003
1004   settingSet.clear();
1005   settingSet.insert("videoscreen.screen");
1006   settingSet.insert("videoscreen.resolution");
1007   settingSet.insert("videoscreen.screenmode");
1008   m_settingsManager->RegisterCallback(&CDisplaySettings::Get(), settingSet);
1009
1010   settingSet.clear();
1011   settingSet.insert("videoscreen.stereoscopicmode");
1012   m_settingsManager->RegisterCallback(&CStereoscopicsManager::Get(), settingSet);
1013
1014   settingSet.clear();
1015   settingSet.insert("audiooutput.config");
1016   settingSet.insert("audiooutput.samplerate");
1017   settingSet.insert("audiooutput.passthrough");
1018   settingSet.insert("audiooutput.channels");
1019   settingSet.insert("audiooutput.processquality");
1020   settingSet.insert("audiooutput.guisoundmode");
1021   settingSet.insert("audiooutput.stereoupmix");
1022   settingSet.insert("audiooutput.ac3passthrough");
1023   settingSet.insert("audiooutput.eac3passthrough");
1024   settingSet.insert("audiooutput.dtspassthrough");
1025   settingSet.insert("audiooutput.truehdpassthrough");
1026   settingSet.insert("audiooutput.dtshdpassthrough");
1027   settingSet.insert("audiooutput.audiodevice");
1028   settingSet.insert("audiooutput.passthroughdevice");
1029   settingSet.insert("audiooutput.streamsilence");
1030   settingSet.insert("audiooutput.normalizelevels");
1031   settingSet.insert("lookandfeel.skin");
1032   settingSet.insert("lookandfeel.skinsettings");
1033   settingSet.insert("lookandfeel.font");
1034   settingSet.insert("lookandfeel.skintheme");
1035   settingSet.insert("lookandfeel.skincolors");
1036   settingSet.insert("lookandfeel.skinzoom");
1037   settingSet.insert("musicplayer.replaygainpreamp");
1038   settingSet.insert("musicplayer.replaygainnogainpreamp");
1039   settingSet.insert("musicplayer.replaygaintype");
1040   settingSet.insert("musicplayer.replaygainavoidclipping");
1041   settingSet.insert("scrapers.musicvideosdefault");
1042   settingSet.insert("screensaver.mode");
1043   settingSet.insert("screensaver.preview");
1044   settingSet.insert("screensaver.settings");
1045   settingSet.insert("videoscreen.guicalibration");
1046   settingSet.insert("videoscreen.testpattern");
1047   settingSet.insert("videoplayer.useamcodec");
1048   settingSet.insert("videoplayer.usemediacodec");
1049   m_settingsManager->RegisterCallback(&g_application, settingSet);
1050
1051   settingSet.clear();
1052   settingSet.insert("lookandfeel.soundskin");
1053   m_settingsManager->RegisterCallback(&g_audioManager, settingSet);
1054
1055   settingSet.clear();
1056   settingSet.insert("subtitles.charset");
1057   settingSet.insert("karaoke.charset");
1058   settingSet.insert("locale.charset");
1059   m_settingsManager->RegisterCallback(&g_charsetConverter, settingSet);
1060
1061   settingSet.clear();
1062   settingSet.insert("videoscreen.fakefullscreen");
1063   m_settingsManager->RegisterCallback(&g_graphicsContext, settingSet);
1064
1065   settingSet.clear();
1066   settingSet.insert("locale.audiolanguage");
1067   settingSet.insert("locale.subtitlelanguage");
1068   settingSet.insert("locale.language");
1069   settingSet.insert("locale.country");
1070   m_settingsManager->RegisterCallback(&g_langInfo, settingSet);
1071
1072 #if defined(HAS_SDL_JOYSTICK)
1073   settingSet.clear();
1074   settingSet.insert("input.enablejoystick");
1075   m_settingsManager->RegisterCallback(&g_Joystick, settingSet);
1076 #endif
1077
1078   settingSet.clear();
1079   settingSet.insert("input.enablemouse");
1080   m_settingsManager->RegisterCallback(&g_Mouse, settingSet);
1081
1082 #if defined(HAS_GL) && defined(HAVE_X11)
1083   settingSet.clear();
1084   settingSet.insert("input.enablesystemkeys");
1085   m_settingsManager->RegisterCallback(&g_Windowing, settingSet);
1086 #endif
1087
1088   settingSet.clear();
1089   settingSet.insert("services.webserver");
1090   settingSet.insert("services.webserverport");
1091   settingSet.insert("services.webserverusername");
1092   settingSet.insert("services.webserverpassword");
1093   settingSet.insert("services.zeroconf");
1094   settingSet.insert("services.airplay");
1095   settingSet.insert("services.airplayvolumecontrol");
1096   settingSet.insert("services.useairplaypassword");
1097   settingSet.insert("services.airplaypassword");
1098   settingSet.insert("services.upnpserver");
1099   settingSet.insert("services.upnprenderer");
1100   settingSet.insert("services.upnpcontroller");
1101   settingSet.insert("services.esenabled");
1102   settingSet.insert("services.esport");
1103   settingSet.insert("services.esallinterfaces");
1104   settingSet.insert("services.esinitialdelay");
1105   settingSet.insert("services.escontinuousdelay");
1106   settingSet.insert("smb.winsserver");
1107   settingSet.insert("smb.workgroup");
1108   m_settingsManager->RegisterCallback(&CNetworkServices::Get(), settingSet);
1109
1110   settingSet.clear();
1111   settingSet.insert("masterlock.lockcode");
1112   m_settingsManager->RegisterCallback(&g_passwordManager, settingSet);
1113
1114   settingSet.clear();
1115   settingSet.insert("pvrmanager.enabled");
1116   settingSet.insert("pvrmanager.channelmanager");
1117   settingSet.insert("pvrmanager.channelscan");
1118   settingSet.insert("pvrmanager.resetdb");
1119   settingSet.insert("pvrclient.menuhook");
1120   settingSet.insert("pvrmenu.searchicons");
1121   settingSet.insert("epg.resetepg");
1122   settingSet.insert("pvrparental.enabled");
1123   m_settingsManager->RegisterCallback(&PVR::g_PVRManager, settingSet);
1124
1125   settingSet.clear();
1126   settingSet.insert("lookandfeel.rssedit");
1127   m_settingsManager->RegisterCallback(&CRssManager::Get(), settingSet);
1128
1129 #if defined(TARGET_LINUX)
1130   settingSet.clear();
1131   settingSet.insert("locale.timezone");
1132   settingSet.insert("locale.timezonecountry");
1133   m_settingsManager->RegisterCallback(&g_timezone, settingSet);
1134 #endif
1135
1136   settingSet.clear();
1137   settingSet.insert("weather.addon");
1138   settingSet.insert("weather.addonsettings");
1139   m_settingsManager->RegisterCallback(&g_weatherManager, settingSet);
1140
1141   settingSet.clear();
1142   settingSet.insert("input.peripherals");
1143   settingSet.insert("locale.language");
1144   m_settingsManager->RegisterCallback(&PERIPHERALS::CPeripherals::Get(), settingSet);
1145
1146 #if defined(TARGET_DARWIN_OSX)
1147   settingSet.clear();
1148   settingSet.insert("input.appleremotemode");
1149   m_settingsManager->RegisterCallback(&XBMCHelper::GetInstance(), settingSet);
1150 #endif
1151 }
1152
1153 bool CSettings::Reset()
1154 {
1155   std::string settingsFile = CProfilesManager::Get().GetSettingsFile();
1156   // try to delete the settings file
1157   if (XFILE::CFile::Exists(settingsFile, false) && !XFILE::CFile::Delete(settingsFile))
1158     CLog::Log(LOGWARNING, "Unable to delete old settings file at %s", settingsFile.c_str());
1159   
1160   // unload any loaded settings
1161   Unload();
1162
1163   // try to save the default settings
1164   if (!Save())
1165   {
1166     CLog::Log(LOGWARNING, "Failed to save the default settings to %s", settingsFile.c_str());
1167     return false;
1168   }
1169
1170   return true;
1171 }