Merge pull request #4196 from arnova/sub_fallback
[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 #include "cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h"
33 #if defined(HAVE_LIBCRYSTALHD)
34 #include "cores/dvdplayer/DVDCodecs/Video/CrystalHD.h"
35 #endif // defined(HAVE_LIBCRYSTALHD)
36 #include "cores/playercorefactory/PlayerCoreFactory.h"
37 #include "cores/VideoRenderers/BaseRenderer.h"
38 #include "filesystem/File.h"
39 #include "guilib/GraphicContext.h"
40 #include "guilib/GUIAudioManager.h"
41 #include "guilib/GUIFontManager.h"
42 #include "guilib/LocalizeStrings.h"
43 #include "guilib/StereoscopicsManager.h"
44 #include "input/MouseStat.h"
45 #if defined(TARGET_WINDOWS)
46 #include "input/windows/WINJoystick.h"
47 #elif defined(HAS_SDL_JOYSTICK)
48 #include "input/SDLJoystick.h"
49 #endif // defined(HAS_SDL_JOYSTICK)
50 #if defined(TARGET_POSIX)
51 #include "linux/LinuxTimezone.h"
52 #endif // defined(TARGET_POSIX)
53 #include "network/NetworkServices.h"
54 #include "network/upnp/UPnPSettings.h"
55 #include "network/WakeOnAccess.h"
56 #if defined(TARGET_DARWIN_OSX)
57 #include "osx/XBMCHelper.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/SettingPath.h"
74 #include "settings/SkinSettings.h"
75 #include "settings/lib/SettingsManager.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 #if defined(TARGET_LINUX) && !defined(TARGET_ANDROID)
472   m_settingsManager->UnregisterSettingsHandler(&g_timezone);
473 #endif
474
475   m_initialized = false;
476 }
477
478 void CSettings::RegisterCallback(ISettingCallback *callback, const std::set<std::string> &settingList)
479 {
480   m_settingsManager->RegisterCallback(callback, settingList);
481 }
482
483 void CSettings::UnregisterCallback(ISettingCallback *callback)
484 {
485   m_settingsManager->UnregisterCallback(callback);
486 }
487
488 CSetting* CSettings::GetSetting(const std::string &id) const
489 {
490   CSingleLock lock(m_critical);
491   if (id.empty())
492     return NULL;
493
494   return m_settingsManager->GetSetting(id);
495 }
496
497 std::vector<CSettingSection*> CSettings::GetSections() const
498 {
499   CSingleLock lock(m_critical);
500   return m_settingsManager->GetSections();
501 }
502
503 CSettingSection* CSettings::GetSection(const std::string &section) const
504 {
505   CSingleLock lock(m_critical);
506   if (section.empty())
507     return NULL;
508
509   return m_settingsManager->GetSection(section);
510 }
511
512 bool CSettings::GetBool(const std::string &id) const
513 {
514   // Backward compatibility (skins use this setting)
515   if (StringUtils::EqualsNoCase(id, "lookandfeel.enablemouse"))
516     return GetBool("input.enablemouse");
517
518   return m_settingsManager->GetBool(id);
519 }
520
521 bool CSettings::SetBool(const std::string &id, bool value)
522 {
523   return m_settingsManager->SetBool(id, value);
524 }
525
526 bool CSettings::ToggleBool(const std::string &id)
527 {
528   return m_settingsManager->ToggleBool(id);
529 }
530
531 int CSettings::GetInt(const std::string &id) const
532 {
533   return m_settingsManager->GetInt(id);
534 }
535
536 bool CSettings::SetInt(const std::string &id, int value)
537 {
538   return m_settingsManager->SetInt(id, value);
539 }
540
541 double CSettings::GetNumber(const std::string &id) const
542 {
543   return m_settingsManager->GetNumber(id);
544 }
545
546 bool CSettings::SetNumber(const std::string &id, double value)
547 {
548   return m_settingsManager->SetNumber(id, value);
549 }
550
551 std::string CSettings::GetString(const std::string &id) const
552 {
553   return m_settingsManager->GetString(id);
554 }
555
556 bool CSettings::SetString(const std::string &id, const std::string &value)
557 {
558   return m_settingsManager->SetString(id, value);
559 }
560
561 std::vector<CVariant> CSettings::GetList(const std::string &id) const
562 {
563   CSetting *setting = m_settingsManager->GetSetting(id);
564   if (setting == NULL || setting->GetType() != SettingTypeList)
565     return std::vector<CVariant>();
566
567   CSettingList *listSetting = static_cast<CSettingList*>(setting);
568   return ListToValues(listSetting, listSetting->GetValue());
569 }
570
571 bool CSettings::SetList(const std::string &id, const std::vector<CVariant> &value)
572 {
573   CSetting *setting = m_settingsManager->GetSetting(id);
574   if (setting == NULL || setting->GetType() != SettingTypeList)
575     return false;
576
577   CSettingList *listSetting = static_cast<CSettingList*>(setting);
578   SettingPtrList newValues;
579   bool ret = true;
580   int index = 0;
581   for (std::vector<CVariant>::const_iterator itValue = value.begin(); itValue != value.end(); ++itValue)
582   {
583     CSetting *settingValue = listSetting->GetDefinition()->Clone(StringUtils::Format("%s.%d", listSetting->GetId().c_str(), index++));
584     if (settingValue == NULL)
585       return false;
586
587     switch (listSetting->GetElementType())
588     {
589       case SettingTypeBool:
590         if (!itValue->isBoolean())
591           return false;
592         ret = static_cast<CSettingBool*>(settingValue)->SetValue(itValue->asBoolean());
593         break;
594
595       case SettingTypeInteger:
596         if (!itValue->isInteger())
597           return false;
598         ret = static_cast<CSettingInt*>(settingValue)->SetValue((int)itValue->asInteger());
599         break;
600
601       case SettingTypeNumber:
602         if (!itValue->isDouble())
603           return false;
604         ret = static_cast<CSettingNumber*>(settingValue)->SetValue(itValue->asDouble());
605         break;
606
607       case SettingTypeString:
608         if (!itValue->isString())
609           return false;
610         ret = static_cast<CSettingString*>(settingValue)->SetValue(itValue->asString());
611         break;
612
613       default:
614         ret = false;
615         break;
616     }
617
618     if (!ret)
619     {
620       delete settingValue;
621       return false;
622     }
623
624     newValues.push_back(SettingPtr(settingValue));
625   }
626
627   return listSetting->SetValue(newValues);
628 }
629
630 bool CSettings::LoadSetting(const TiXmlNode *node, const std::string &settingId)
631 {
632   return m_settingsManager->LoadSetting(node, settingId);
633 }
634
635 std::vector<CVariant> CSettings::ListToValues(const CSettingList *setting, const std::vector< boost::shared_ptr<CSetting> > &values)
636 {
637   std::vector<CVariant> realValues;
638
639   if (setting == NULL)
640     return realValues;
641
642   for (SettingPtrList::const_iterator it = values.begin(); it != values.end(); ++it)
643   {
644     switch (setting->GetElementType())
645     {
646       case SettingTypeBool:
647         realValues.push_back(static_cast<const CSettingBool*>(it->get())->GetValue());
648         break;
649
650       case SettingTypeInteger:
651         realValues.push_back(static_cast<const CSettingInt*>(it->get())->GetValue());
652         break;
653
654       case SettingTypeNumber:
655         realValues.push_back(static_cast<const CSettingNumber*>(it->get())->GetValue());
656         break;
657
658       case SettingTypeString:
659         realValues.push_back(static_cast<const CSettingString*>(it->get())->GetValue());
660         break;
661
662       default:
663         break;
664     }
665   }
666
667   return realValues;
668 }
669
670 bool CSettings::Initialize(const std::string &file)
671 {
672   CXBMCTinyXML xmlDoc;
673   if (!xmlDoc.LoadFile(file.c_str()))
674   {
675     CLog::Log(LOGERROR, "CSettings: error loading settings definition from %s, Line %d\n%s", file.c_str(), xmlDoc.ErrorRow(), xmlDoc.ErrorDesc());
676     return false;
677   }
678
679   CLog::Log(LOGDEBUG, "CSettings: loaded settings definition from %s", file.c_str());
680   
681   TiXmlElement *root = xmlDoc.RootElement();
682   if (root == NULL)
683     return false;
684
685   return m_settingsManager->Initialize(root);
686 }
687
688 bool CSettings::InitializeDefinitions()
689 {
690   if (!Initialize(SETTINGS_XML_FOLDER "settings.xml"))
691   {
692     CLog::Log(LOGFATAL, "Unable to load settings definitions");
693     return false;
694   }
695 #if defined(TARGET_WINDOWS)
696   if (CFile::Exists(SETTINGS_XML_FOLDER "win32.xml") && !Initialize(SETTINGS_XML_FOLDER "win32.xml"))
697     CLog::Log(LOGFATAL, "Unable to load win32-specific settings definitions");
698 #elif defined(TARGET_ANDROID)
699   if (CFile::Exists(SETTINGS_XML_FOLDER "android.xml") && !Initialize(SETTINGS_XML_FOLDER "android.xml"))
700     CLog::Log(LOGFATAL, "Unable to load android-specific settings definitions");
701 #elif defined(TARGET_RASPBERRY_PI)
702   if (CFile::Exists(SETTINGS_XML_FOLDER "rbp.xml") && !Initialize(SETTINGS_XML_FOLDER "rbp.xml"))
703     CLog::Log(LOGFATAL, "Unable to load rbp-specific settings definitions");
704 #elif defined(TARGET_FREEBSD)
705   if (CFile::Exists(SETTINGS_XML_FOLDER "freebsd.xml") && !Initialize(SETTINGS_XML_FOLDER "freebsd.xml"))
706     CLog::Log(LOGFATAL, "Unable to load freebsd-specific settings definitions");
707 #elif defined(TARGET_LINUX)
708   if (CFile::Exists(SETTINGS_XML_FOLDER "linux.xml") && !Initialize(SETTINGS_XML_FOLDER "linux.xml"))
709     CLog::Log(LOGFATAL, "Unable to load linux-specific settings definitions");
710 #elif defined(TARGET_DARWIN)
711   if (CFile::Exists(SETTINGS_XML_FOLDER "darwin.xml") && !Initialize(SETTINGS_XML_FOLDER "darwin.xml"))
712     CLog::Log(LOGFATAL, "Unable to load darwin-specific settings definitions");
713 #if defined(TARGET_DARWIN_OSX)
714   if (CFile::Exists(SETTINGS_XML_FOLDER "darwin_osx.xml") && !Initialize(SETTINGS_XML_FOLDER "darwin_osx.xml"))
715     CLog::Log(LOGFATAL, "Unable to load osx-specific settings definitions");
716 #elif defined(TARGET_DARWIN_IOS)
717   if (CFile::Exists(SETTINGS_XML_FOLDER "darwin_ios.xml") && !Initialize(SETTINGS_XML_FOLDER "darwin_ios.xml"))
718     CLog::Log(LOGFATAL, "Unable to load ios-specific settings definitions");
719 #if defined(TARGET_DARWIN_IOS_ATV2)
720   if (CFile::Exists(SETTINGS_XML_FOLDER "darwin_ios_atv2.xml") && !Initialize(SETTINGS_XML_FOLDER "darwin_ios_atv2.xml"))
721     CLog::Log(LOGFATAL, "Unable to load atv2-specific settings definitions");
722 #endif
723 #endif
724 #endif
725
726   // load any custom visibility and default values before loading the special
727   // appliance.xml so that appliances are able to overwrite even those values
728   InitializeVisibility();
729   InitializeDefaults();
730
731   if (CFile::Exists(SETTINGS_XML_FOLDER "appliance.xml") && !Initialize(SETTINGS_XML_FOLDER "appliance.xml"))
732     CLog::Log(LOGFATAL, "Unable to load appliance-specific settings definitions");
733
734   return true;
735 }
736
737 void CSettings::InitializeSettingTypes()
738 {
739   // register "addon" and "path" setting types implemented by CSettingAddon
740   m_settingsManager->RegisterSettingType("addon", this);
741   m_settingsManager->RegisterSettingType("path", this);
742 }
743
744 void CSettings::InitializeControls()
745 {
746   m_settingsManager->RegisterSettingControl("toggle", this);
747   m_settingsManager->RegisterSettingControl("spinner", this);
748   m_settingsManager->RegisterSettingControl("edit", this);
749   m_settingsManager->RegisterSettingControl("button", this);
750   m_settingsManager->RegisterSettingControl("list", this);
751 }
752
753 void CSettings::InitializeVisibility()
754 {
755   // hide some settings if necessary
756 #if defined(TARGET_DARWIN)
757   CSettingString* timezonecountry = (CSettingString*)m_settingsManager->GetSetting("locale.timezonecountry");
758   CSettingString* timezone = (CSettingString*)m_settingsManager->GetSetting("locale.timezone");
759
760   if (!g_sysinfo.IsAppleTV2() || GetIOSVersion() >= 4.3)
761   {
762     timezonecountry->SetRequirementsMet(false);
763     timezone->SetRequirementsMet(false);
764   }
765 #endif
766 }
767
768 void CSettings::InitializeDefaults()
769 {
770   // set some default values if necessary
771 #if defined(HAS_SKIN_TOUCHED) && defined(TARGET_DARWIN_IOS) && !defined(TARGET_DARWIN_IOS_ATV2)
772   ((CSettingAddon*)m_settingsManager->GetSetting("lookandfeel.skin"))->SetDefault("skin.touched");
773 #endif
774
775 #if defined(TARGET_POSIX)
776   CSettingString* timezonecountry = (CSettingString*)m_settingsManager->GetSetting("locale.timezonecountry");
777   CSettingString* timezone = (CSettingString*)m_settingsManager->GetSetting("locale.timezone");
778
779   if (timezonecountry->IsVisible())
780     timezonecountry->SetDefault(g_timezone.GetCountryByTimezone(g_timezone.GetOSConfiguredTimezone()));
781   if (timezone->IsVisible())
782     timezone->SetDefault(g_timezone.GetOSConfiguredTimezone());
783 #endif // defined(TARGET_POSIX)
784
785 #if defined(TARGET_WINDOWS)
786   #if defined(HAS_DX)
787   ((CSettingString*)m_settingsManager->GetSetting("musicplayer.visualisation"))->SetDefault("visualization.milkdrop");
788   #endif
789
790   #if !defined(HAS_GL)
791   // We prefer a fake fullscreen mode (window covering the screen rather than dedicated fullscreen)
792   // as it works nicer with switching to other applications. However on some systems vsync is broken
793   // when we do this (eg non-Aero on ATI in particular) and on others (AppleTV) we can't get XBMC to
794   // the front
795   if (g_sysinfo.IsAeroDisabled())
796     ((CSettingBool*)m_settingsManager->GetSetting("videoscreen.fakefullscreen"))->SetDefault(false);
797   #endif
798 #endif
799
800 #if !defined(TARGET_WINDOWS)
801   ((CSettingString*)m_settingsManager->GetSetting("audiooutput.audiodevice"))->SetDefault(CAEFactory::GetDefaultDevice(false));
802   ((CSettingString*)m_settingsManager->GetSetting("audiooutput.passthroughdevice"))->SetDefault(CAEFactory::GetDefaultDevice(true));
803 #endif
804
805   if (g_application.IsStandAlone())
806     ((CSettingInt*)m_settingsManager->GetSetting("powermanagement.shutdownstate"))->SetDefault(POWERSTATE_SHUTDOWN);
807
808 #if defined(HAS_WEB_SERVER)
809   if (CUtil::CanBindPrivileged())
810     ((CSettingInt*)m_settingsManager->GetSetting("services.webserverport"))->SetDefault(80);
811 #endif
812 }
813
814 void CSettings::InitializeOptionFillers()
815 {
816   // register setting option fillers
817 #ifdef HAS_DVD_DRIVE
818   m_settingsManager->RegisterSettingOptionsFiller("audiocdactions", MEDIA_DETECT::CAutorun::SettingOptionAudioCdActionsFiller);
819   m_settingsManager->RegisterSettingOptionsFiller("audiocdencoders", MEDIA_DETECT::CAutorun::SettingOptionAudioCdEncodersFiller);
820 #endif
821   m_settingsManager->RegisterSettingOptionsFiller("aequalitylevels", CAEFactory::SettingOptionsAudioQualityLevelsFiller);
822   m_settingsManager->RegisterSettingOptionsFiller("audiodevices", CAEFactory::SettingOptionsAudioDevicesFiller);
823   m_settingsManager->RegisterSettingOptionsFiller("audiodevicespassthrough", CAEFactory::SettingOptionsAudioDevicesPassthroughFiller);
824   m_settingsManager->RegisterSettingOptionsFiller("audiostreamsilence", CAEFactory::SettingOptionsAudioStreamsilenceFiller);
825   m_settingsManager->RegisterSettingOptionsFiller("charsets", CCharsetConverter::SettingOptionsCharsetsFiller);
826   m_settingsManager->RegisterSettingOptionsFiller("epgguideviews", PVR::CGUIWindowPVRGuide::SettingOptionsEpgGuideViewFiller);
827   m_settingsManager->RegisterSettingOptionsFiller("fonts", GUIFontManager::SettingOptionsFontsFiller);
828   m_settingsManager->RegisterSettingOptionsFiller("languages", CLangInfo::SettingOptionsLanguagesFiller);
829   m_settingsManager->RegisterSettingOptionsFiller("pvrstartlastchannel", PVR::CPVRManager::SettingOptionsPvrStartLastChannelFiller);
830   m_settingsManager->RegisterSettingOptionsFiller("refreshchangedelays", CDisplaySettings::SettingOptionsRefreshChangeDelaysFiller);
831   m_settingsManager->RegisterSettingOptionsFiller("refreshrates", CDisplaySettings::SettingOptionsRefreshRatesFiller);
832   m_settingsManager->RegisterSettingOptionsFiller("regions", CLangInfo::SettingOptionsRegionsFiller);
833   m_settingsManager->RegisterSettingOptionsFiller("rendermethods", CBaseRenderer::SettingOptionsRenderMethodsFiller);
834   m_settingsManager->RegisterSettingOptionsFiller("resolutions", CDisplaySettings::SettingOptionsResolutionsFiller);
835   m_settingsManager->RegisterSettingOptionsFiller("screens", CDisplaySettings::SettingOptionsScreensFiller);
836   m_settingsManager->RegisterSettingOptionsFiller("stereoscopicmodes", CDisplaySettings::SettingOptionsStereoscopicModesFiller);
837   m_settingsManager->RegisterSettingOptionsFiller("preferedstereoscopicviewmodes", CDisplaySettings::SettingOptionsPreferredStereoscopicViewModesFiller);
838   m_settingsManager->RegisterSettingOptionsFiller("shutdownstates", CPowerManager::SettingOptionsShutdownStatesFiller);
839   m_settingsManager->RegisterSettingOptionsFiller("startupwindows", ADDON::CSkinInfo::SettingOptionsStartupWindowsFiller);
840   m_settingsManager->RegisterSettingOptionsFiller("streamlanguages", CLangInfo::SettingOptionsStreamLanguagesFiller);
841   m_settingsManager->RegisterSettingOptionsFiller("skincolors", ADDON::CSkinInfo::SettingOptionsSkinColorsFiller);
842   m_settingsManager->RegisterSettingOptionsFiller("skinfonts", ADDON::CSkinInfo::SettingOptionsSkinFontsFiller);
843   m_settingsManager->RegisterSettingOptionsFiller("skinsounds", ADDON::CSkinInfo::SettingOptionsSkinSoundFiller);
844   m_settingsManager->RegisterSettingOptionsFiller("skinthemes", ADDON::CSkinInfo::SettingOptionsSkinThemesFiller);
845 #ifdef TARGET_LINUX
846   m_settingsManager->RegisterSettingOptionsFiller("timezonecountries", CLinuxTimezone::SettingOptionsTimezoneCountriesFiller);
847   m_settingsManager->RegisterSettingOptionsFiller("timezones", CLinuxTimezone::SettingOptionsTimezonesFiller);
848 #endif
849   m_settingsManager->RegisterSettingOptionsFiller("verticalsyncs", CDisplaySettings::SettingOptionsVerticalSyncsFiller);
850 }
851
852 void CSettings::InitializeConditions()
853 {
854   // add basic conditions
855   m_settingsManager->AddCondition("true");
856 #ifdef HAS_AIRPLAY
857   m_settingsManager->AddCondition("has_airplay");
858 #endif
859 #ifdef HAS_EVENT_SERVER
860   m_settingsManager->AddCondition("has_event_server");
861 #endif
862 #ifdef HAVE_X11
863   m_settingsManager->AddCondition("have_x11");
864 #endif
865 #ifdef HAS_GL
866   m_settingsManager->AddCondition("has_gl");
867 #endif
868 #ifdef HAS_GLES
869   m_settingsManager->AddCondition("has_gles");
870 #endif
871 #if HAS_GLES == 2
872   m_settingsManager->AddCondition("has_glesv2");
873 #endif
874 #ifdef HAS_KARAOKE
875   m_settingsManager->AddCondition("has_karaoke");
876 #endif
877 #ifdef HAS_SDL_JOYSTICK
878   m_settingsManager->AddCondition("has_sdl_joystick");
879 #endif
880 #ifdef HAS_SKIN_TOUCHED
881   m_settingsManager->AddCondition("has_skin_touched");
882 #endif
883 #ifdef HAS_TIME_SERVER
884   m_settingsManager->AddCondition("has_time_server");
885 #endif
886 #ifdef HAS_WEB_SERVER
887   m_settingsManager->AddCondition("has_web_server");
888 #endif
889 #ifdef HAS_ZEROCONF
890   m_settingsManager->AddCondition("has_zeroconf");
891 #endif
892 #ifdef HAVE_LIBCRYSTALHD
893   m_settingsManager->AddCondition("have_libcrystalhd");
894   if (CCrystalHD::GetInstance()->DevicePresent())
895     m_settingsManager->AddCondition("hascrystalhddevice");
896 #endif
897 #ifdef HAVE_LIBOPENMAX
898   m_settingsManager->AddCondition("have_libopenmax");
899 #endif
900 #ifdef HAVE_LIBVA
901   m_settingsManager->AddCondition("have_libva");
902 #endif
903 #ifdef HAVE_LIBVDPAU
904   m_settingsManager->AddCondition("have_libvdpau");
905 #endif
906 #ifdef TARGET_ANDROID
907   if (CAndroidFeatures::GetVersion() > 15)
908     m_settingsManager->AddCondition("has_mediacodec");
909 #endif
910 #ifdef HAS_LIBSTAGEFRIGHT
911   m_settingsManager->AddCondition("have_libstagefrightdecoder");
912 #endif
913 #ifdef HAVE_VIDEOTOOLBOXDECODER
914   m_settingsManager->AddCondition("have_videotoolboxdecoder");
915   if (g_sysinfo.HasVideoToolBoxDecoder())
916     m_settingsManager->AddCondition("hasvideotoolboxdecoder");
917 #endif
918 #ifdef HAS_LIBAMCODEC
919   if (aml_present())
920     m_settingsManager->AddCondition("have_amcodec");
921 #endif
922 #ifdef TARGET_DARWIN_IOS_ATV2
923   if (g_sysinfo.IsAppleTV2())
924     m_settingsManager->AddCondition("isappletv2");
925 #endif
926 #if defined(TARGET_WINDOWS) && defined(HAS_DX)
927   m_settingsManager->AddCondition("has_dx");
928   m_settingsManager->AddCondition("hasdxva2");
929 #endif
930
931   if (g_application.IsStandAlone())
932     m_settingsManager->AddCondition("isstandalone");
933
934   if(CAEFactory::SupportsQualitySetting())
935     m_settingsManager->AddCondition("has_ae_quality_levels");
936
937   // add more complex conditions
938   m_settingsManager->AddCondition("addonhassettings", AddonHasSettings);
939   m_settingsManager->AddCondition("checkmasterlock", CheckMasterLock);
940   m_settingsManager->AddCondition("checkpvrparentalpin", CheckPVRParentalPin);
941   m_settingsManager->AddCondition("hasperipherals", HasPeripherals);
942   m_settingsManager->AddCondition("isfullscreen", IsFullscreen);
943   m_settingsManager->AddCondition("ismasteruser", IsMasterUser);
944   m_settingsManager->AddCondition("isusingttfsubtitles", IsUsingTTFSubtitles);
945   m_settingsManager->AddCondition("profilecanwritedatabase", ProfileCanWriteDatabase);
946   m_settingsManager->AddCondition("profilecanwritesources", ProfileCanWriteSources);
947   m_settingsManager->AddCondition("profilehasaddons", ProfileHasAddons);
948   m_settingsManager->AddCondition("profilehasdatabase", ProfileHasDatabase);
949   m_settingsManager->AddCondition("profilehassources", ProfileHasSources);
950   m_settingsManager->AddCondition("profilehasaddonmanagerlocked", ProfileHasAddonManagerLocked);
951   m_settingsManager->AddCondition("profilehasfileslocked", ProfileHasFilesLocked);
952   m_settingsManager->AddCondition("profilehasmusiclocked", ProfileHasMusicLocked);
953   m_settingsManager->AddCondition("profilehaspictureslocked", ProfileHasPicturesLocked);
954   m_settingsManager->AddCondition("profilehasprogramslocked", ProfileHasProgramsLocked);
955   m_settingsManager->AddCondition("profilehassettingslocked", ProfileHasSettingsLocked);
956   m_settingsManager->AddCondition("profilehasvideoslocked", ProfileHasVideosLocked);
957   m_settingsManager->AddCondition("profilelockmode", ProfileLockMode);
958   m_settingsManager->AddCondition("aesettingvisible", CAEFactory::IsSettingVisible);
959   m_settingsManager->AddCondition("codecoptionvisible", CDVDVideoCodec::IsSettingVisible);
960 }
961
962 void CSettings::InitializeISettingsHandlers()
963 {
964   // register ISettingsHandler implementations
965   // The order of these matters! Handlers are processed in the order they were registered.
966   m_settingsManager->RegisterSettingsHandler(&g_advancedSettings);
967   m_settingsManager->RegisterSettingsHandler(&CMediaSourceSettings::Get());
968   m_settingsManager->RegisterSettingsHandler(&CPlayerCoreFactory::Get());
969   m_settingsManager->RegisterSettingsHandler(&CProfilesManager::Get());
970 #ifdef HAS_UPNP
971   m_settingsManager->RegisterSettingsHandler(&CUPnPSettings::Get());
972 #endif
973   m_settingsManager->RegisterSettingsHandler(&CWakeOnAccess::Get());
974   m_settingsManager->RegisterSettingsHandler(&CRssManager::Get());
975   m_settingsManager->RegisterSettingsHandler(&g_application);
976 #if defined(TARGET_LINUX) && !defined(TARGET_ANDROID)
977   m_settingsManager->RegisterSettingsHandler(&g_timezone);
978 #endif
979 }
980
981 void CSettings::InitializeISubSettings()
982 {
983   // register ISubSettings implementations
984   m_settingsManager->RegisterSubSettings(&g_application);
985   m_settingsManager->RegisterSubSettings(&CDisplaySettings::Get());
986   m_settingsManager->RegisterSubSettings(&CMediaSettings::Get());
987   m_settingsManager->RegisterSubSettings(&CSkinSettings::Get());
988   m_settingsManager->RegisterSubSettings(&g_sysinfo);
989   m_settingsManager->RegisterSubSettings(&CViewStateSettings::Get());
990 }
991
992 void CSettings::InitializeISettingCallbacks()
993 {
994   // register any ISettingCallback implementations
995   std::set<std::string> settingSet;
996   settingSet.insert("debug.showloginfo");
997   settingSet.insert("debug.setextraloglevel");
998   m_settingsManager->RegisterCallback(&g_advancedSettings, settingSet);
999
1000   settingSet.clear();
1001   settingSet.insert("karaoke.export");
1002   settingSet.insert("karaoke.importcsv");
1003   settingSet.insert("musiclibrary.cleanup");
1004   settingSet.insert("musiclibrary.export");
1005   settingSet.insert("musiclibrary.import");
1006   settingSet.insert("musicfiles.trackformat");
1007   settingSet.insert("musicfiles.trackformatright");
1008   settingSet.insert("videolibrary.flattentvshows");
1009   settingSet.insert("videolibrary.removeduplicates");
1010   settingSet.insert("videolibrary.groupmoviesets");
1011   settingSet.insert("videolibrary.cleanup");
1012   settingSet.insert("videolibrary.import");
1013   settingSet.insert("videolibrary.export");
1014   m_settingsManager->RegisterCallback(&CMediaSettings::Get(), settingSet);
1015
1016   settingSet.clear();
1017   settingSet.insert("videoscreen.screen");
1018   settingSet.insert("videoscreen.resolution");
1019   settingSet.insert("videoscreen.screenmode");
1020   m_settingsManager->RegisterCallback(&CDisplaySettings::Get(), settingSet);
1021
1022   settingSet.clear();
1023   settingSet.insert("videoscreen.stereoscopicmode");
1024   m_settingsManager->RegisterCallback(&CStereoscopicsManager::Get(), settingSet);
1025
1026   settingSet.clear();
1027   settingSet.insert("audiooutput.config");
1028   settingSet.insert("audiooutput.samplerate");
1029   settingSet.insert("audiooutput.passthrough");
1030   settingSet.insert("audiooutput.channels");
1031   settingSet.insert("audiooutput.processquality");
1032   settingSet.insert("audiooutput.guisoundmode");
1033   settingSet.insert("audiooutput.stereoupmix");
1034   settingSet.insert("audiooutput.ac3passthrough");
1035   settingSet.insert("audiooutput.ac3transcode");
1036   settingSet.insert("audiooutput.eac3passthrough");
1037   settingSet.insert("audiooutput.dtspassthrough");
1038   settingSet.insert("audiooutput.truehdpassthrough");
1039   settingSet.insert("audiooutput.dtshdpassthrough");
1040   settingSet.insert("audiooutput.audiodevice");
1041   settingSet.insert("audiooutput.passthroughdevice");
1042   settingSet.insert("audiooutput.streamsilence");
1043   settingSet.insert("audiooutput.normalizelevels");
1044   settingSet.insert("lookandfeel.skin");
1045   settingSet.insert("lookandfeel.skinsettings");
1046   settingSet.insert("lookandfeel.font");
1047   settingSet.insert("lookandfeel.skintheme");
1048   settingSet.insert("lookandfeel.skincolors");
1049   settingSet.insert("lookandfeel.skinzoom");
1050   settingSet.insert("musicplayer.replaygainpreamp");
1051   settingSet.insert("musicplayer.replaygainnogainpreamp");
1052   settingSet.insert("musicplayer.replaygaintype");
1053   settingSet.insert("musicplayer.replaygainavoidclipping");
1054   settingSet.insert("scrapers.musicvideosdefault");
1055   settingSet.insert("screensaver.mode");
1056   settingSet.insert("screensaver.preview");
1057   settingSet.insert("screensaver.settings");
1058   settingSet.insert("videoscreen.guicalibration");
1059   settingSet.insert("videoscreen.testpattern");
1060   settingSet.insert("videoplayer.useamcodec");
1061   settingSet.insert("videoplayer.usemediacodec");
1062   m_settingsManager->RegisterCallback(&g_application, settingSet);
1063
1064   settingSet.clear();
1065   settingSet.insert("lookandfeel.soundskin");
1066   m_settingsManager->RegisterCallback(&g_audioManager, settingSet);
1067
1068   settingSet.clear();
1069   settingSet.insert("subtitles.charset");
1070   settingSet.insert("karaoke.charset");
1071   settingSet.insert("locale.charset");
1072   m_settingsManager->RegisterCallback(&g_charsetConverter, settingSet);
1073
1074   settingSet.clear();
1075   settingSet.insert("videoscreen.fakefullscreen");
1076   m_settingsManager->RegisterCallback(&g_graphicsContext, settingSet);
1077
1078   settingSet.clear();
1079   settingSet.insert("locale.audiolanguage");
1080   settingSet.insert("locale.subtitlelanguage");
1081   settingSet.insert("locale.language");
1082   settingSet.insert("locale.country");
1083   m_settingsManager->RegisterCallback(&g_langInfo, settingSet);
1084
1085 #if defined(HAS_SDL_JOYSTICK)
1086   settingSet.clear();
1087   settingSet.insert("input.enablejoystick");
1088   m_settingsManager->RegisterCallback(&g_Joystick, settingSet);
1089 #endif
1090
1091   settingSet.clear();
1092   settingSet.insert("input.enablemouse");
1093   m_settingsManager->RegisterCallback(&g_Mouse, settingSet);
1094
1095 #if defined(HAS_GL) && defined(HAVE_X11)
1096   settingSet.clear();
1097   settingSet.insert("input.enablesystemkeys");
1098   m_settingsManager->RegisterCallback(&g_Windowing, settingSet);
1099 #endif
1100
1101   settingSet.clear();
1102   settingSet.insert("services.webserver");
1103   settingSet.insert("services.webserverport");
1104   settingSet.insert("services.webserverusername");
1105   settingSet.insert("services.webserverpassword");
1106   settingSet.insert("services.zeroconf");
1107   settingSet.insert("services.airplay");
1108   settingSet.insert("services.airplayvolumecontrol");
1109   settingSet.insert("services.useairplaypassword");
1110   settingSet.insert("services.airplaypassword");
1111   settingSet.insert("services.upnpserver");
1112   settingSet.insert("services.upnprenderer");
1113   settingSet.insert("services.upnpcontroller");
1114   settingSet.insert("services.esenabled");
1115   settingSet.insert("services.esport");
1116   settingSet.insert("services.esallinterfaces");
1117   settingSet.insert("services.esinitialdelay");
1118   settingSet.insert("services.escontinuousdelay");
1119   settingSet.insert("smb.winsserver");
1120   settingSet.insert("smb.workgroup");
1121   m_settingsManager->RegisterCallback(&CNetworkServices::Get(), settingSet);
1122
1123   settingSet.clear();
1124   settingSet.insert("masterlock.lockcode");
1125   m_settingsManager->RegisterCallback(&g_passwordManager, settingSet);
1126
1127   settingSet.clear();
1128   settingSet.insert("pvrmanager.enabled");
1129   settingSet.insert("pvrmanager.channelmanager");
1130   settingSet.insert("pvrmanager.channelscan");
1131   settingSet.insert("pvrmanager.resetdb");
1132   settingSet.insert("pvrclient.menuhook");
1133   settingSet.insert("pvrmenu.searchicons");
1134   settingSet.insert("epg.resetepg");
1135   settingSet.insert("pvrparental.enabled");
1136   m_settingsManager->RegisterCallback(&PVR::g_PVRManager, settingSet);
1137
1138   settingSet.clear();
1139   settingSet.insert("lookandfeel.rssedit");
1140   m_settingsManager->RegisterCallback(&CRssManager::Get(), settingSet);
1141
1142 #if defined(TARGET_LINUX)
1143   settingSet.clear();
1144   settingSet.insert("locale.timezone");
1145   settingSet.insert("locale.timezonecountry");
1146   m_settingsManager->RegisterCallback(&g_timezone, settingSet);
1147 #endif
1148
1149   settingSet.clear();
1150   settingSet.insert("weather.addon");
1151   settingSet.insert("weather.addonsettings");
1152   m_settingsManager->RegisterCallback(&g_weatherManager, settingSet);
1153
1154   settingSet.clear();
1155   settingSet.insert("input.peripherals");
1156   settingSet.insert("locale.language");
1157   m_settingsManager->RegisterCallback(&PERIPHERALS::CPeripherals::Get(), settingSet);
1158
1159 #if defined(TARGET_DARWIN_OSX)
1160   settingSet.clear();
1161   settingSet.insert("input.appleremotemode");
1162   m_settingsManager->RegisterCallback(&XBMCHelper::GetInstance(), settingSet);
1163 #endif
1164 }
1165
1166 bool CSettings::Reset()
1167 {
1168   std::string settingsFile = CProfilesManager::Get().GetSettingsFile();
1169   // try to delete the settings file
1170   if (XFILE::CFile::Exists(settingsFile, false) && !XFILE::CFile::Delete(settingsFile))
1171     CLog::Log(LOGWARNING, "Unable to delete old settings file at %s", settingsFile.c_str());
1172   
1173   // unload any loaded settings
1174   Unload();
1175
1176   // try to save the default settings
1177   if (!Save())
1178   {
1179     CLog::Log(LOGWARNING, "Failed to save the default settings to %s", settingsFile.c_str());
1180     return false;
1181   }
1182
1183   return true;
1184 }