2 * Copyright (C) 2005-2013 Team XBMC
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)
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.
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/>.
24 #include "Application.h"
26 #include "GUIPassword.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 "input/MouseStat.h"
43 #if defined(TARGET_WINDOWS)
44 #include "input/windows/WINJoystick.h"
45 #elif defined(HAS_SDL_JOYSTICK)
46 #include "input/SDLJoystick.h"
47 #endif // defined(HAS_SDL_JOYSTICK)
48 #if defined(TARGET_POSIX)
49 #include "linux/LinuxTimezone.h"
50 #endif // defined(TARGET_POSIX)
51 #include "network/NetworkServices.h"
52 #include "network/upnp/UPnPSettings.h"
53 #include "network/WakeOnAccess.h"
54 #if defined(TARGET_DARWIN_OSX)
55 #include "osx/XBMCHelper.h"
56 #include "cores/AudioEngine/Engines/CoreAudio/CoreAudioHardware.h"
57 #endif // defined(TARGET_DARWIN_OSX)
58 #if defined(TARGET_DARWIN)
59 #include "osx/DarwinUtils.h"
61 #include "peripherals/Peripherals.h"
62 #include "powermanagement/PowerManager.h"
63 #include "profiles/ProfilesManager.h"
64 #include "pvr/PVRManager.h"
65 #include "pvr/windows/GUIWindowPVRGuide.h"
66 #include "settings/AdvancedSettings.h"
67 #include "settings/DisplaySettings.h"
68 #include "settings/MediaSettings.h"
69 #include "settings/MediaSourceSettings.h"
70 #include "settings/SettingAddon.h"
71 #include "settings/SettingsManager.h"
72 #include "settings/SettingPath.h"
73 #include "settings/SkinSettings.h"
74 #include "threads/SingleLock.h"
75 #include "utils/CharsetConverter.h"
76 #include "utils/log.h"
77 #include "utils/RssManager.h"
78 #include "utils/StringUtils.h"
79 #include "utils/SystemInfo.h"
80 #include "utils/Weather.h"
81 #include "utils/XBMCTinyXML.h"
82 #include "view/ViewStateSettings.h"
83 #include "windowing/WindowingFactory.h"
85 #define SETTINGS_XML_FOLDER "special://xbmc/system/settings/"
86 #define SETTINGS_XML_ROOT "settings"
88 using namespace XFILE;
90 bool AddonHasSettings(const std::string &condition, const std::string &value, const std::string &settingId)
92 if (settingId.empty())
95 CSettingAddon *setting = (CSettingAddon*)CSettings::Get().GetSetting(settingId);
99 ADDON::AddonPtr addon;
100 if (!ADDON::CAddonMgr::Get().GetAddon(setting->GetValue(), addon, setting->GetAddonType()) || addon == NULL)
103 if (addon->Type() == ADDON::ADDON_SKIN)
104 return ((ADDON::CSkinInfo*)addon.get())->HasSkinFile("SkinSettings.xml");
106 return addon->HasSettings();
109 bool CheckMasterLock(const std::string &condition, const std::string &value, const std::string &settingId)
111 return g_passwordManager.IsMasterLockUnlocked(StringUtils::EqualsNoCase(value, "true"));
114 bool CheckPVRParentalPin(const std::string &condition, const std::string &value, const std::string &settingId)
116 return PVR::g_PVRManager.CheckParentalPIN(g_localizeStrings.Get(19262).c_str());
119 bool HasPeripherals(const std::string &condition, const std::string &value, const std::string &settingId)
121 return PERIPHERALS::g_peripherals.GetNumberOfPeripherals() > 0;
124 bool IsFullscreen(const std::string &condition, const std::string &value, const std::string &settingId)
126 return g_Windowing.IsFullScreen();
129 bool IsMasterUser(const std::string &condition, const std::string &value, const std::string &settingId)
131 return g_passwordManager.bMasterUser;
134 bool IsUsingTTFSubtitles(const std::string &condition, const std::string &value, const std::string &settingId)
136 return CUtil::IsUsingTTFSubtitles();
139 bool ProfileCanWriteDatabase(const std::string &condition, const std::string &value, const std::string &settingId)
141 return CProfilesManager::Get().GetCurrentProfile().canWriteDatabases();
144 bool ProfileCanWriteSources(const std::string &condition, const std::string &value, const std::string &settingId)
146 return CProfilesManager::Get().GetCurrentProfile().canWriteSources();
149 bool ProfileHasAddons(const std::string &condition, const std::string &value, const std::string &settingId)
151 return CProfilesManager::Get().GetCurrentProfile().hasAddons();
154 bool ProfileHasDatabase(const std::string &condition, const std::string &value, const std::string &settingId)
156 return CProfilesManager::Get().GetCurrentProfile().hasDatabases();
159 bool ProfileHasSources(const std::string &condition, const std::string &value, const std::string &settingId)
161 return CProfilesManager::Get().GetCurrentProfile().hasSources();
164 bool ProfileHasAddonManagerLocked(const std::string &condition, const std::string &value, const std::string &settingId)
166 return CProfilesManager::Get().GetCurrentProfile().addonmanagerLocked();
169 bool ProfileHasFilesLocked(const std::string &condition, const std::string &value, const std::string &settingId)
171 return CProfilesManager::Get().GetCurrentProfile().filesLocked();
174 bool ProfileHasMusicLocked(const std::string &condition, const std::string &value, const std::string &settingId)
176 return CProfilesManager::Get().GetCurrentProfile().musicLocked();
179 bool ProfileHasPicturesLocked(const std::string &condition, const std::string &value, const std::string &settingId)
181 return CProfilesManager::Get().GetCurrentProfile().picturesLocked();
184 bool ProfileHasProgramsLocked(const std::string &condition, const std::string &value, const std::string &settingId)
186 return CProfilesManager::Get().GetCurrentProfile().programsLocked();
189 bool ProfileHasSettingsLocked(const std::string &condition, const std::string &value, const std::string &settingId)
191 LOCK_LEVEL::SETTINGS_LOCK slValue=LOCK_LEVEL::ALL;
192 if (StringUtils::EqualsNoCase(value, "none"))
193 slValue = LOCK_LEVEL::NONE;
194 else if (StringUtils::EqualsNoCase(value, "standard"))
195 slValue = LOCK_LEVEL::STANDARD;
196 else if (StringUtils::EqualsNoCase(value, "advanced"))
197 slValue = LOCK_LEVEL::ADVANCED;
198 else if (StringUtils::EqualsNoCase(value, "expert"))
199 slValue = LOCK_LEVEL::EXPERT;
200 return slValue <= CProfilesManager::Get().GetCurrentProfile().settingsLockLevel();
203 bool ProfileHasVideosLocked(const std::string &condition, const std::string &value, const std::string &settingId)
205 return CProfilesManager::Get().GetCurrentProfile().videoLocked();
208 bool ProfileLockMode(const std::string &condition, const std::string &value, const std::string &settingId)
211 LockType lock = (LockType)strtol(value.c_str(), &tmp, 0);
212 if (tmp != NULL && *tmp != '\0')
215 return CProfilesManager::Get().GetCurrentProfile().getLockMode() == lock;
218 CSettings::CSettings()
219 : m_initialized(false)
221 m_settingsManager = new CSettingsManager();
224 CSettings::~CSettings()
228 delete m_settingsManager;
231 CSettings& CSettings::Get()
233 static CSettings sSettings;
237 CSetting* CSettings::CreateSetting(const std::string &settingType, const std::string &settingId, CSettingsManager *settingsManager /* = NULL */) const
239 if (StringUtils::EqualsNoCase(settingType, "addon"))
240 return new CSettingAddon(settingId, settingsManager);
241 else if (StringUtils::EqualsNoCase(settingType, "path"))
242 return new CSettingPath(settingId, settingsManager);
247 bool CSettings::Initialize()
249 CSingleLock lock(m_critical);
253 // register custom setting types
254 InitializeSettingTypes();
256 // option fillers and conditions need to be
257 // initialized before the setting definitions
258 InitializeOptionFillers();
259 InitializeConditions();
261 // load the settings definitions
262 if (!InitializeDefinitions())
265 m_settingsManager->SetInitialized();
267 InitializeISettingsHandlers();
268 InitializeISubSettings();
269 InitializeISettingCallbacks();
271 m_initialized = true;
276 bool CSettings::Load()
278 return Load(CProfilesManager::Get().GetSettingsFile());
281 bool CSettings::Load(const std::string &file)
284 bool updated = false;
285 if (!XFILE::CFile::Exists(file) || !xmlDoc.LoadFile(file) ||
286 !m_settingsManager->Load(xmlDoc.RootElement(), updated))
288 CLog::Log(LOGERROR, "CSettingsManager: unable to load settings from %s, creating new default settings", file.c_str());
295 // if the settings had to be updated, we need to save the changes
302 bool CSettings::Load(const TiXmlElement *root, bool hide /* = false */)
307 std::map<std::string, CSetting*> *loadedSettings = NULL;
309 loadedSettings = new std::map<std::string, CSetting*>();
312 // only trigger settings events if hiding is disabled
313 bool success = m_settingsManager->Load(root, updated, !hide, loadedSettings);
314 // if necessary hide all the loaded settings
315 if (success && hide && loadedSettings != NULL)
317 for(std::map<std::string, CSetting*>::const_iterator setting = loadedSettings->begin(); setting != loadedSettings->end(); ++setting)
318 setting->second->SetVisible(false);
320 delete loadedSettings;
326 void CSettings::SetLoaded()
328 m_settingsManager->SetLoaded();
331 bool CSettings::Save()
333 return Save(CProfilesManager::Get().GetSettingsFile());
336 bool CSettings::Save(const std::string &file)
339 TiXmlElement rootElement(SETTINGS_XML_ROOT);
340 TiXmlNode *root = xmlDoc.InsertEndChild(rootElement);
344 if (!m_settingsManager->Save(root))
347 return xmlDoc.SaveFile(file);
350 void CSettings::Unload()
352 CSingleLock lock(m_critical);
353 m_settingsManager->Unload();
356 void CSettings::Uninitialize()
358 CSingleLock lock(m_critical);
362 // unregister setting option fillers
363 m_settingsManager->UnregisterSettingOptionsFiller("audiocdactions");
364 m_settingsManager->UnregisterSettingOptionsFiller("audiocdencoders");
365 m_settingsManager->UnregisterSettingOptionsFiller("audiodevices");
366 m_settingsManager->UnregisterSettingOptionsFiller("audiodevicespassthrough");
367 m_settingsManager->UnregisterSettingOptionsFiller("audiooutputmodes");
368 m_settingsManager->UnregisterSettingOptionsFiller("charsets");
369 m_settingsManager->UnregisterSettingOptionsFiller("epgguideviews");
370 m_settingsManager->UnregisterSettingOptionsFiller("fontheights");
371 m_settingsManager->UnregisterSettingOptionsFiller("fonts");
372 m_settingsManager->UnregisterSettingOptionsFiller("languages");
373 m_settingsManager->UnregisterSettingOptionsFiller("pvrstartlastchannel");
374 m_settingsManager->UnregisterSettingOptionsFiller("refreshchangedelays");
375 m_settingsManager->UnregisterSettingOptionsFiller("refreshrates");
376 m_settingsManager->UnregisterSettingOptionsFiller("regions");
377 m_settingsManager->UnregisterSettingOptionsFiller("rendermethods");
378 m_settingsManager->UnregisterSettingOptionsFiller("resolutions");
379 m_settingsManager->UnregisterSettingOptionsFiller("screens");
380 m_settingsManager->UnregisterSettingOptionsFiller("shutdownstates");
381 m_settingsManager->UnregisterSettingOptionsFiller("startupwindows");
382 m_settingsManager->UnregisterSettingOptionsFiller("streamlanguages");
383 m_settingsManager->UnregisterSettingOptionsFiller("skincolors");
384 m_settingsManager->UnregisterSettingOptionsFiller("skinfonts");
385 m_settingsManager->UnregisterSettingOptionsFiller("skinsounds");
386 m_settingsManager->UnregisterSettingOptionsFiller("skinthemes");
387 #if defined(TARGET_LINUX)
388 m_settingsManager->UnregisterSettingOptionsFiller("timezonecountries");
389 m_settingsManager->UnregisterSettingOptionsFiller("timezones");
390 #endif // defined(TARGET_LINUX)
391 m_settingsManager->UnregisterSettingOptionsFiller("verticalsyncs");
393 // unregister ISettingCallback implementations
394 m_settingsManager->UnregisterCallback(&g_advancedSettings);
395 m_settingsManager->UnregisterCallback(&CMediaSettings::Get());
396 m_settingsManager->UnregisterCallback(&CDisplaySettings::Get());
397 m_settingsManager->UnregisterCallback(&g_application);
398 m_settingsManager->UnregisterCallback(&g_audioManager);
399 m_settingsManager->UnregisterCallback(&g_charsetConverter);
400 m_settingsManager->UnregisterCallback(&g_graphicsContext);
401 m_settingsManager->UnregisterCallback(&g_langInfo);
402 #if defined(TARGET_WINDOWS) || defined(HAS_SDL_JOYSTICK)
403 m_settingsManager->UnregisterCallback(&g_Joystick);
405 m_settingsManager->UnregisterCallback(&g_Mouse);
406 m_settingsManager->UnregisterCallback(&CNetworkServices::Get());
407 m_settingsManager->UnregisterCallback(&g_passwordManager);
408 m_settingsManager->UnregisterCallback(&PVR::g_PVRManager);
409 m_settingsManager->UnregisterCallback(&CRssManager::Get());
410 #if defined(TARGET_LINUX)
411 m_settingsManager->UnregisterCallback(&g_timezone);
412 #endif // defined(TARGET_LINUX)
413 m_settingsManager->UnregisterCallback(&g_weatherManager);
414 m_settingsManager->UnregisterCallback(&PERIPHERALS::CPeripherals::Get());
416 // unregister ISubSettings implementations
417 m_settingsManager->UnregisterSubSettings(&g_application);
418 m_settingsManager->UnregisterSubSettings(&CDisplaySettings::Get());
419 m_settingsManager->UnregisterSubSettings(&CMediaSettings::Get());
420 m_settingsManager->UnregisterSubSettings(&CSkinSettings::Get());
421 m_settingsManager->UnregisterSubSettings(&g_sysinfo);
422 m_settingsManager->UnregisterSubSettings(&CViewStateSettings::Get());
424 // unregister ISettingsHandler implementations
425 m_settingsManager->UnregisterSettingsHandler(&CWakeOnAccess::Get());
426 m_settingsManager->UnregisterSettingsHandler(&g_advancedSettings);
427 m_settingsManager->UnregisterSettingsHandler(&CMediaSourceSettings::Get());
428 m_settingsManager->UnregisterSettingsHandler(&CPlayerCoreFactory::Get());
429 m_settingsManager->UnregisterSettingsHandler(&CRssManager::Get());
431 m_settingsManager->UnregisterSettingsHandler(&CUPnPSettings::Get());
433 m_settingsManager->UnregisterSettingsHandler(&CProfilesManager::Get());
434 m_settingsManager->UnregisterSettingsHandler(&g_application);
436 // cleanup the settings manager
437 m_settingsManager->Clear();
439 m_initialized = false;
442 void CSettings::RegisterCallback(ISettingCallback *callback, const std::set<std::string> &settingList)
444 m_settingsManager->RegisterCallback(callback, settingList);
447 void CSettings::UnregisterCallback(ISettingCallback *callback)
449 m_settingsManager->UnregisterCallback(callback);
452 CSetting* CSettings::GetSetting(const std::string &id) const
454 CSingleLock lock(m_critical);
458 return m_settingsManager->GetSetting(id);
461 CSettingSection* CSettings::GetSection(const std::string §ion) const
463 CSingleLock lock(m_critical);
467 return m_settingsManager->GetSection(section);
470 bool CSettings::GetBool(const std::string &id) const
472 return m_settingsManager->GetBool(id);
475 bool CSettings::SetBool(const std::string &id, bool value)
477 return m_settingsManager->SetBool(id, value);
480 bool CSettings::ToggleBool(const std::string &id)
482 return m_settingsManager->ToggleBool(id);
485 int CSettings::GetInt(const std::string &id) const
487 return m_settingsManager->GetInt(id);
490 bool CSettings::SetInt(const std::string &id, int value)
492 return m_settingsManager->SetInt(id, value);
495 double CSettings::GetNumber(const std::string &id) const
497 return m_settingsManager->GetNumber(id);
500 bool CSettings::SetNumber(const std::string &id, double value)
502 return m_settingsManager->SetNumber(id, value);
505 std::string CSettings::GetString(const std::string &id) const
507 return m_settingsManager->GetString(id);
510 bool CSettings::SetString(const std::string &id, const std::string &value)
512 return m_settingsManager->SetString(id, value);
515 bool CSettings::LoadSetting(const TiXmlNode *node, const std::string &settingId)
517 return m_settingsManager->LoadSetting(node, settingId);
520 bool CSettings::Initialize(const std::string &file)
523 if (!xmlDoc.LoadFile(file.c_str()))
525 CLog::Log(LOGERROR, "CSettings: error loading settings definition from %s, Line %d\n%s", file.c_str(), xmlDoc.ErrorRow(), xmlDoc.ErrorDesc());
529 CLog::Log(LOGDEBUG, "CSettings: loaded settings definition from %s", file.c_str());
531 TiXmlElement *root = xmlDoc.RootElement();
535 return m_settingsManager->Initialize(root);
538 bool CSettings::InitializeDefinitions()
540 if (!Initialize(SETTINGS_XML_FOLDER "settings.xml"))
542 CLog::Log(LOGFATAL, "Unable to load settings definitions");
545 #if defined(TARGET_WINDOWS)
546 if (CFile::Exists(SETTINGS_XML_FOLDER "win32.xml") && !Initialize(SETTINGS_XML_FOLDER "win32.xml"))
547 CLog::Log(LOGFATAL, "Unable to load win32-specific settings definitions");
548 #elif defined(TARGET_ANDROID)
549 if (CFile::Exists(SETTINGS_XML_FOLDER "android.xml") && !Initialize(SETTINGS_XML_FOLDER "android.xml"))
550 CLog::Log(LOGFATAL, "Unable to load android-specific settings definitions");
551 #elif defined(TARGET_RASPBERRY_PI)
552 if (CFile::Exists(SETTINGS_XML_FOLDER "rbp.xml") && !Initialize(SETTINGS_XML_FOLDER "rbp.xml"))
553 CLog::Log(LOGFATAL, "Unable to load rbp-specific settings definitions");
554 #elif defined(TARGET_FREEBSD)
555 if (CFile::Exists(SETTINGS_XML_FOLDER "freebsd.xml") && !Initialize(SETTINGS_XML_FOLDER "freebsd.xml"))
556 CLog::Log(LOGFATAL, "Unable to load freebsd-specific settings definitions");
557 #elif defined(TARGET_LINUX)
558 if (CFile::Exists(SETTINGS_XML_FOLDER "linux.xml") && !Initialize(SETTINGS_XML_FOLDER "linux.xml"))
559 CLog::Log(LOGFATAL, "Unable to load linux-specific settings definitions");
560 #elif defined(TARGET_DARWIN)
561 if (CFile::Exists(SETTINGS_XML_FOLDER "darwin.xml") && !Initialize(SETTINGS_XML_FOLDER "darwin.xml"))
562 CLog::Log(LOGFATAL, "Unable to load darwin-specific settings definitions");
563 #if defined(TARGET_DARWIN_OSX)
564 if (CFile::Exists(SETTINGS_XML_FOLDER "darwin_osx.xml") && !Initialize(SETTINGS_XML_FOLDER "darwin_osx.xml"))
565 CLog::Log(LOGFATAL, "Unable to load osx-specific settings definitions");
566 #elif defined(TARGET_DARWIN_IOS)
567 if (CFile::Exists(SETTINGS_XML_FOLDER "darwin_ios.xml") && !Initialize(SETTINGS_XML_FOLDER "darwin_ios.xml"))
568 CLog::Log(LOGFATAL, "Unable to load ios-specific settings definitions");
569 #if defined(TARGET_DARWIN_IOS_ATV2)
570 if (CFile::Exists(SETTINGS_XML_FOLDER "darwin_ios_atv2.xml") && !Initialize(SETTINGS_XML_FOLDER "darwin_ios_atv2.xml"))
571 CLog::Log(LOGFATAL, "Unable to load atv2-specific settings definitions");
576 // load any custom visibility and default values before loading the special
577 // appliance.xml so that appliances are able to overwrite even those values
578 InitializeVisibility();
579 InitializeDefaults();
581 if (CFile::Exists(SETTINGS_XML_FOLDER "appliance.xml") && !Initialize(SETTINGS_XML_FOLDER "appliance.xml"))
582 CLog::Log(LOGFATAL, "Unable to load appliance-specific settings definitions");
587 void CSettings::InitializeSettingTypes()
589 // register "addon" and "path" setting types implemented by CSettingAddon
590 m_settingsManager->RegisterSettingType("addon", this);
591 m_settingsManager->RegisterSettingType("path", this);
594 void CSettings::InitializeVisibility()
596 // hide some settings if necessary
597 #if defined(TARGET_DARWIN)
598 CSettingString* timezonecountry = (CSettingString*)m_settingsManager->GetSetting("locale.timezonecountry");
599 CSettingString* timezone = (CSettingString*)m_settingsManager->GetSetting("locale.timezone");
601 if (!g_sysinfo.IsAppleTV2() || GetIOSVersion() >= 4.3)
603 timezonecountry->SetVisible(false);
604 timezone->SetVisible(false);
609 void CSettings::InitializeDefaults()
611 // set some default values if necessary
612 #if defined(HAS_SKIN_TOUCHED) && defined(TARGET_DARWIN_IOS) && !defined(TARGET_DARWIN_IOS_ATV2)
613 ((CSettingAddon*)m_settingsManager->GetSetting("lookandfeel.skin"))->SetDefault("skin.touched");
616 #if defined(TARGET_POSIX)
617 CSettingString* timezonecountry = (CSettingString*)m_settingsManager->GetSetting("locale.timezonecountry");
618 CSettingString* timezone = (CSettingString*)m_settingsManager->GetSetting("locale.timezone");
620 if (timezonecountry->IsVisible())
621 timezonecountry->SetDefault(g_timezone.GetCountryByTimezone(g_timezone.GetOSConfiguredTimezone()));
622 if (timezone->IsVisible())
623 timezone->SetDefault(g_timezone.GetOSConfiguredTimezone());
624 #endif // defined(TARGET_POSIX)
626 #if defined(TARGET_WINDOWS)
628 ((CSettingString*)m_settingsManager->GetSetting("musicplayer.visualisation"))->SetDefault("visualization.milkdrop");
632 // We prefer a fake fullscreen mode (window covering the screen rather than dedicated fullscreen)
633 // as it works nicer with switching to other applications. However on some systems vsync is broken
634 // when we do this (eg non-Aero on ATI in particular) and on others (AppleTV) we can't get XBMC to
636 if (g_sysinfo.IsAeroDisabled())
637 ((CSettingBool*)m_settingsManager->GetSetting("videoscreen.fakefullscreen"))->SetDefault(false);
641 #if defined(TARGET_DARWIN)
642 #if !defined(TARGET_DARWIN_IOS)
643 CStdString defaultAudioDeviceName;
644 CCoreAudioHardware::GetOutputDeviceName(defaultAudioDeviceName);
645 ((CSettingString*)m_settingsManager->GetSetting("audiooutput.audiodevice"))->SetDefault(defaultAudioDeviceName);
646 ((CSettingString*)m_settingsManager->GetSetting("audiooutput.passthroughdevice"))->SetDefault(defaultAudioDeviceName);
649 ((CSettingString*)m_settingsManager->GetSetting("audiooutput.audiodevice"))->SetDefault(CAEFactory::GetDefaultDevice(false));
650 ((CSettingString*)m_settingsManager->GetSetting("audiooutput.passthroughdevice"))->SetDefault(CAEFactory::GetDefaultDevice(true));
653 if (g_application.IsStandAlone())
654 ((CSettingInt*)m_settingsManager->GetSetting("powermanagement.shutdownstate"))->SetDefault(POWERSTATE_SHUTDOWN);
656 #if defined(HAS_WEB_SERVER)
657 if (CUtil::CanBindPrivileged())
658 ((CSettingInt*)m_settingsManager->GetSetting("services.webserverport"))->SetDefault(80);
662 void CSettings::InitializeOptionFillers()
664 // register setting option fillers
666 m_settingsManager->RegisterSettingOptionsFiller("audiocdactions", MEDIA_DETECT::CAutorun::SettingOptionAudioCdActionsFiller);
667 m_settingsManager->RegisterSettingOptionsFiller("audiocdencoders", MEDIA_DETECT::CAutorun::SettingOptionAudioCdEncodersFiller);
669 m_settingsManager->RegisterSettingOptionsFiller("audiodevices", CAEFactory::SettingOptionsAudioDevicesFiller);
670 m_settingsManager->RegisterSettingOptionsFiller("audiodevicespassthrough", CAEFactory::SettingOptionsAudioDevicesPassthroughFiller);
671 m_settingsManager->RegisterSettingOptionsFiller("audiooutputmodes", CAEFactory::SettingOptionsAudioOutputModesFiller);
672 m_settingsManager->RegisterSettingOptionsFiller("charsets", CCharsetConverter::SettingOptionsCharsetsFiller);
673 m_settingsManager->RegisterSettingOptionsFiller("epgguideviews", PVR::CGUIWindowPVRGuide::SettingOptionsEpgGuideViewFiller);
674 m_settingsManager->RegisterSettingOptionsFiller("fonts", GUIFontManager::SettingOptionsFontsFiller);
675 m_settingsManager->RegisterSettingOptionsFiller("languages", CLangInfo::SettingOptionsLanguagesFiller);
676 m_settingsManager->RegisterSettingOptionsFiller("pvrstartlastchannel", PVR::CPVRManager::SettingOptionsPvrStartLastChannelFiller);
677 m_settingsManager->RegisterSettingOptionsFiller("refreshchangedelays", CDisplaySettings::SettingOptionsRefreshChangeDelaysFiller);
678 m_settingsManager->RegisterSettingOptionsFiller("refreshrates", CDisplaySettings::SettingOptionsRefreshRatesFiller);
679 m_settingsManager->RegisterSettingOptionsFiller("regions", CLangInfo::SettingOptionsRegionsFiller);
680 m_settingsManager->RegisterSettingOptionsFiller("rendermethods", CBaseRenderer::SettingOptionsRenderMethodsFiller);
681 m_settingsManager->RegisterSettingOptionsFiller("resolutions", CDisplaySettings::SettingOptionsResolutionsFiller);
682 m_settingsManager->RegisterSettingOptionsFiller("screens", CDisplaySettings::SettingOptionsScreensFiller);
683 m_settingsManager->RegisterSettingOptionsFiller("shutdownstates", CPowerManager::SettingOptionsShutdownStatesFiller);
684 m_settingsManager->RegisterSettingOptionsFiller("startupwindows", ADDON::CSkinInfo::SettingOptionsStartupWindowsFiller);
685 m_settingsManager->RegisterSettingOptionsFiller("streamlanguages", CLangInfo::SettingOptionsStreamLanguagesFiller);
686 m_settingsManager->RegisterSettingOptionsFiller("skincolors", ADDON::CSkinInfo::SettingOptionsSkinColorsFiller);
687 m_settingsManager->RegisterSettingOptionsFiller("skinfonts", ADDON::CSkinInfo::SettingOptionsSkinFontsFiller);
688 m_settingsManager->RegisterSettingOptionsFiller("skinsounds", ADDON::CSkinInfo::SettingOptionsSkinSoundFiller);
689 m_settingsManager->RegisterSettingOptionsFiller("skinthemes", ADDON::CSkinInfo::SettingOptionsSkinThemesFiller);
691 m_settingsManager->RegisterSettingOptionsFiller("timezonecountries", CLinuxTimezone::SettingOptionsTimezoneCountriesFiller);
692 m_settingsManager->RegisterSettingOptionsFiller("timezones", CLinuxTimezone::SettingOptionsTimezonesFiller);
694 m_settingsManager->RegisterSettingOptionsFiller("verticalsyncs", CDisplaySettings::SettingOptionsVerticalSyncsFiller);
697 void CSettings::InitializeConditions()
699 // add basic conditions
700 m_settingsManager->AddCondition("true");
702 m_settingsManager->AddCondition("has_airplay");
704 #ifdef HAS_EVENT_SERVER
705 m_settingsManager->AddCondition("has_event_server");
708 m_settingsManager->AddCondition("has_gl");
711 m_settingsManager->AddCondition("has_gles");
714 m_settingsManager->AddCondition("has_glesv2");
717 m_settingsManager->AddCondition("has_karaoke");
719 #ifdef HAS_SDL_JOYSTICK
720 m_settingsManager->AddCondition("has_sdl_joystick");
722 #ifdef HAS_SKIN_TOUCHED
723 m_settingsManager->AddCondition("has_skin_touched");
725 #ifdef HAS_TIME_SERVER
726 m_settingsManager->AddCondition("has_time_server");
728 #ifdef HAS_WEB_SERVER
729 m_settingsManager->AddCondition("has_web_server");
732 m_settingsManager->AddCondition("has_zeroconf");
734 #ifdef HAVE_LIBCRYSTALHD
735 m_settingsManager->AddCondition("have_libcrystalhd");
736 if (CCrystalHD::GetInstance()->DevicePresent())
737 m_settingsManager->AddCondition("hascrystalhddevice");
739 #ifdef HAVE_LIBOPENMAX
740 m_settingsManager->AddCondition("have_libopenmax");
743 m_settingsManager->AddCondition("have_libva");
746 m_settingsManager->AddCondition("have_libvdpau");
748 #ifdef HAVE_VIDEOTOOLBOXDECODER
749 m_settingsManager->AddCondition("have_videotoolboxdecoder");
750 if (g_sysinfo.HasVideoToolBoxDecoder())
751 m_settingsManager->AddCondition("hasvideotoolboxdecoder");
753 #ifdef TARGET_DARWIN_IOS_ATV2
754 if (g_sysinfo.IsAppleTV2())
755 m_settingsManager->AddCondition("isappletv2");
757 #if defined(TARGET_WINDOWS) && defined(HAS_DX)
758 m_settingsManager->AddCondition("has_dx");
759 if (g_sysinfo.IsWindowsVersionAtLeast(CSysInfo::WindowsVersionVista))
760 m_settingsManager->AddCondition("hasdxva2");
763 if (g_application.IsStandAlone())
764 m_settingsManager->AddCondition("isstandalone");
766 if (CAEFactory::SupportsDrain())
767 m_settingsManager->AddCondition("audiosupportsdrain");
769 // add more complex conditions
770 m_settingsManager->AddCondition("addonhassettings", AddonHasSettings);
771 m_settingsManager->AddCondition("checkmasterlock", CheckMasterLock);
772 m_settingsManager->AddCondition("checkpvrparentalpin", CheckPVRParentalPin);
773 m_settingsManager->AddCondition("hasperipherals", HasPeripherals);
774 m_settingsManager->AddCondition("isfullscreen", IsFullscreen);
775 m_settingsManager->AddCondition("ismasteruser", IsMasterUser);
776 m_settingsManager->AddCondition("isusingttfsubtitles", IsUsingTTFSubtitles);
777 m_settingsManager->AddCondition("profilecanwritedatabase", ProfileCanWriteDatabase);
778 m_settingsManager->AddCondition("profilecanwritesources", ProfileCanWriteSources);
779 m_settingsManager->AddCondition("profilehasaddons", ProfileHasAddons);
780 m_settingsManager->AddCondition("profilehasdatabase", ProfileHasDatabase);
781 m_settingsManager->AddCondition("profilehassources", ProfileHasSources);
782 m_settingsManager->AddCondition("profilehasaddonmanagerlocked", ProfileHasAddonManagerLocked);
783 m_settingsManager->AddCondition("profilehasfileslocked", ProfileHasFilesLocked);
784 m_settingsManager->AddCondition("profilehasmusiclocked", ProfileHasMusicLocked);
785 m_settingsManager->AddCondition("profilehaspictureslocked", ProfileHasPicturesLocked);
786 m_settingsManager->AddCondition("profilehasprogramslocked", ProfileHasProgramsLocked);
787 m_settingsManager->AddCondition("profilehassettingslocked", ProfileHasSettingsLocked);
788 m_settingsManager->AddCondition("profilehasvideoslocked", ProfileHasVideosLocked);
789 m_settingsManager->AddCondition("profilelockmode", ProfileLockMode);
792 void CSettings::InitializeISettingsHandlers()
794 // register ISettingsHandler implementations
795 m_settingsManager->RegisterSettingsHandler(&g_application);
796 m_settingsManager->RegisterSettingsHandler(&CProfilesManager::Get());
797 m_settingsManager->RegisterSettingsHandler(&g_advancedSettings);
798 m_settingsManager->RegisterSettingsHandler(&CMediaSourceSettings::Get());
799 m_settingsManager->RegisterSettingsHandler(&CPlayerCoreFactory::Get());
800 m_settingsManager->RegisterSettingsHandler(&CRssManager::Get());
802 m_settingsManager->RegisterSettingsHandler(&CUPnPSettings::Get());
804 m_settingsManager->RegisterSettingsHandler(&CWakeOnAccess::Get());
807 void CSettings::InitializeISubSettings()
809 // register ISubSettings implementations
810 m_settingsManager->RegisterSubSettings(&g_application);
811 m_settingsManager->RegisterSubSettings(&CDisplaySettings::Get());
812 m_settingsManager->RegisterSubSettings(&CMediaSettings::Get());
813 m_settingsManager->RegisterSubSettings(&CSkinSettings::Get());
814 m_settingsManager->RegisterSubSettings(&g_sysinfo);
815 m_settingsManager->RegisterSubSettings(&CViewStateSettings::Get());
818 void CSettings::InitializeISettingCallbacks()
820 // register any ISettingCallback implementations
821 std::set<std::string> settingSet;
822 settingSet.insert("debug.showloginfo");
823 settingSet.insert("debug.setextraloglevel");
824 m_settingsManager->RegisterCallback(&g_advancedSettings, settingSet);
827 settingSet.insert("karaoke.export");
828 settingSet.insert("karaoke.importcsv");
829 settingSet.insert("musiclibrary.cleanup");
830 settingSet.insert("musiclibrary.export");
831 settingSet.insert("musiclibrary.import");
832 settingSet.insert("musicfiles.trackformat");
833 settingSet.insert("musicfiles.trackformatright");
834 settingSet.insert("videolibrary.flattentvshows");
835 settingSet.insert("videolibrary.removeduplicates");
836 settingSet.insert("videolibrary.groupmoviesets");
837 settingSet.insert("videolibrary.cleanup");
838 settingSet.insert("videolibrary.import");
839 settingSet.insert("videolibrary.export");
840 m_settingsManager->RegisterCallback(&CMediaSettings::Get(), settingSet);
843 settingSet.insert("videoscreen.screen");
844 settingSet.insert("videoscreen.resolution");
845 settingSet.insert("videoscreen.screenmode");
846 m_settingsManager->RegisterCallback(&CDisplaySettings::Get(), settingSet);
849 settingSet.insert("audiooutput.mode");
850 settingSet.insert("audiooutput.channels");
851 settingSet.insert("audiooutput.guisoundmode");
852 settingSet.insert("audiooutput.stereoupmix");
853 settingSet.insert("audiooutput.ac3passthrough");
854 settingSet.insert("audiooutput.dtspassthrough");
855 settingSet.insert("audiooutput.passthroughaac");
856 settingSet.insert("audiooutput.truehdpassthrough");
857 settingSet.insert("audiooutput.dtshdpassthrough");
858 settingSet.insert("audiooutput.multichannellpcm");
859 settingSet.insert("audiooutput.audiodevice");
860 settingSet.insert("audiooutput.passthroughdevice");
861 settingSet.insert("audiooutput.streamsilence");
862 settingSet.insert("lookandfeel.skin");
863 settingSet.insert("lookandfeel.skinsettings");
864 settingSet.insert("lookandfeel.font");
865 settingSet.insert("lookandfeel.skintheme");
866 settingSet.insert("lookandfeel.skincolors");
867 settingSet.insert("lookandfeel.skinzoom");
868 settingSet.insert("musicplayer.replaygainpreamp");
869 settingSet.insert("musicplayer.replaygainnogainpreamp");
870 settingSet.insert("musicplayer.replaygaintype");
871 settingSet.insert("musicplayer.replaygainavoidclipping");
872 settingSet.insert("scrapers.musicvideosdefault");
873 settingSet.insert("screensaver.mode");
874 settingSet.insert("screensaver.preview");
875 settingSet.insert("screensaver.settings");
876 settingSet.insert("videoscreen.guicalibration");
877 settingSet.insert("videoscreen.testpattern");
878 m_settingsManager->RegisterCallback(&g_application, settingSet);
881 settingSet.insert("lookandfeel.soundskin");
882 m_settingsManager->RegisterCallback(&g_audioManager, settingSet);
885 settingSet.insert("subtitles.charset");
886 settingSet.insert("karaoke.charset");
887 settingSet.insert("locale.charset");
888 m_settingsManager->RegisterCallback(&g_charsetConverter, settingSet);
891 settingSet.insert("videoscreen.fakefullscreen");
892 m_settingsManager->RegisterCallback(&g_graphicsContext, settingSet);
895 settingSet.insert("locale.audiolanguage");
896 settingSet.insert("locale.subtitlelanguage");
897 settingSet.insert("locale.language");
898 settingSet.insert("locale.country");
899 m_settingsManager->RegisterCallback(&g_langInfo, settingSet);
901 #if defined(HAS_SDL_JOYSTICK)
903 settingSet.insert("input.enablejoystick");
904 m_settingsManager->RegisterCallback(&g_Joystick, settingSet);
908 settingSet.insert("input.enablemouse");
909 m_settingsManager->RegisterCallback(&g_Mouse, settingSet);
912 settingSet.insert("services.webserver");
913 settingSet.insert("services.webserverport");
914 settingSet.insert("services.webserverusername");
915 settingSet.insert("services.webserverpassword");
916 settingSet.insert("services.zeroconf");
917 settingSet.insert("services.airplay");
918 settingSet.insert("services.useairplaypassword");
919 settingSet.insert("services.airplaypassword");
920 settingSet.insert("services.upnpserver");
921 settingSet.insert("services.upnprenderer");
922 settingSet.insert("services.upnpcontroller");
923 settingSet.insert("services.esenabled");
924 settingSet.insert("services.esport");
925 settingSet.insert("services.esallinterfaces");
926 settingSet.insert("services.esinitialdelay");
927 settingSet.insert("services.escontinuousdelay");
928 settingSet.insert("smb.winsserver");
929 settingSet.insert("smb.workgroup");
930 m_settingsManager->RegisterCallback(&CNetworkServices::Get(), settingSet);
933 settingSet.insert("masterlock.lockcode");
934 m_settingsManager->RegisterCallback(&g_passwordManager, settingSet);
937 settingSet.insert("pvrmanager.enabled");
938 settingSet.insert("pvrmanager.channelmanager");
939 settingSet.insert("pvrmanager.channelscan");
940 settingSet.insert("pvrmanager.resetdb");
941 settingSet.insert("pvrclient.menuhook");
942 settingSet.insert("pvrmenu.searchicons");
943 settingSet.insert("epg.resetepg");
944 settingSet.insert("pvrparental.enabled");
945 m_settingsManager->RegisterCallback(&PVR::g_PVRManager, settingSet);
948 settingSet.insert("lookandfeel.rssedit");
949 m_settingsManager->RegisterCallback(&CRssManager::Get(), settingSet);
951 #if defined(TARGET_LINUX)
953 settingSet.insert("locale.timezone");
954 settingSet.insert("locale.timezonecountry");
955 m_settingsManager->RegisterCallback(&g_timezone, settingSet);
959 settingSet.insert("weather.addon");
960 settingSet.insert("weather.addonsettings");
961 m_settingsManager->RegisterCallback(&g_weatherManager, settingSet);
964 settingSet.insert("input.peripherals");
965 settingSet.insert("locale.language");
966 m_settingsManager->RegisterCallback(&PERIPHERALS::CPeripherals::Get(), settingSet);
968 #if defined(TARGET_DARWIN_OSX)
970 settingSet.insert("input.appleremotemode");
971 m_settingsManager->RegisterCallback(&XBMCHelper::GetInstance(), settingSet);
975 bool CSettings::Reset()
977 std::string settingsFile = CProfilesManager::Get().GetSettingsFile();
978 // try to delete the settings file
979 if (XFILE::CFile::Exists(settingsFile, false) && !XFILE::CFile::Delete(settingsFile))
980 CLog::Log(LOGWARNING, "Unable to delete old settings file at %s", settingsFile.c_str());
982 // unload any loaded settings
985 // try to save the default settings
988 CLog::Log(LOGWARNING, "Failed to save the default settings to %s", settingsFile.c_str());