void CPeripheral::PersistSettings(bool bExiting /* = false */) { CXBMCTinyXML doc; TiXmlElement node("settings"); doc.InsertEndChild(node); for (map<CStdString, CSetting *>::const_iterator itr = m_settings.begin(); itr != m_settings.end(); itr++) { TiXmlElement nodeSetting("setting"); nodeSetting.SetAttribute("id", itr->first.c_str()); CStdString strValue; switch ((*itr).second->GetType()) { case SettingTypeString: { CSettingString *stringSetting = (CSettingString *) (*itr).second; if (stringSetting) strValue = stringSetting->GetValue(); } break; case SettingTypeInteger: { CSettingInt *intSetting = (CSettingInt *) (*itr).second; if (intSetting) strValue = StringUtils::Format("%d", intSetting->GetValue()); } break; case SettingTypeNumber: { CSettingNumber *floatSetting = (CSettingNumber *) (*itr).second; if (floatSetting) strValue = StringUtils::Format("%.2f", floatSetting->GetValue()); } break; case SettingTypeBool: { CSettingBool *boolSetting = (CSettingBool *) (*itr).second; if (boolSetting) strValue = StringUtils::Format("%d", boolSetting->GetValue() ? 1:0); } break; default: break; } nodeSetting.SetAttribute("value", strValue.c_str()); doc.RootElement()->InsertEndChild(nodeSetting); } doc.SaveFile(m_strSettingsFile); if (!bExiting) { for (set<CStdString>::const_iterator it = m_changedSettings.begin(); it != m_changedSettings.end(); it++) OnSettingChanged(*it); } m_changedSettings.clear(); }
bool CPeripheral::GetSettingBool(const std::string &strKey) const { std::map<std::string, PeripheralDeviceSetting>::const_iterator it = m_settings.find(strKey); if (it != m_settings.end() && (*it).second.m_setting->GetType() == SettingTypeBool) { CSettingBool *boolSetting = (CSettingBool *) (*it).second.m_setting; if (boolSetting) return boolSetting->GetValue(); } return false; }
bool CPeripheral::GetSettingBool(const CStdString &strKey) const { map<CStdString, CSetting *>::const_iterator it = m_settings.find(strKey); if (it != m_settings.end() && (*it).second->GetType() == SettingTypeBool) { CSettingBool *boolSetting = (CSettingBool *) (*it).second; if (boolSetting) return boolSetting->GetValue(); } return false; }
void CPeripheral::PersistSettings(void) const { TiXmlDocument doc; TiXmlElement node("settings"); doc.InsertEndChild(node); for (map<CStdString, CSetting *>::const_iterator itr = m_settings.begin(); itr != m_settings.end(); itr++) { TiXmlElement nodeSetting("setting"); nodeSetting.SetAttribute("id", itr->first.c_str()); CStdString strValue; switch ((*itr).second->GetType()) { case SETTINGS_TYPE_STRING: { CSettingString *stringSetting = (CSettingString *) (*itr).second; if (stringSetting) strValue = stringSetting->GetData(); } break; case SETTINGS_TYPE_INT: { CSettingInt *intSetting = (CSettingInt *) (*itr).second; if (intSetting) strValue.Format("%d", intSetting->GetData()); } break; case SETTINGS_TYPE_FLOAT: { CSettingFloat *floatSetting = (CSettingFloat *) (*itr).second; if (floatSetting) strValue.Format("%.2f", floatSetting->GetData()); } break; case SETTINGS_TYPE_BOOL: { CSettingBool *boolSetting = (CSettingBool *) (*itr).second; if (boolSetting) strValue.Format("%d", boolSetting->GetData() ? 1:0); } break; default: break; } nodeSetting.SetAttribute("value", strValue.c_str()); doc.RootElement()->InsertEndChild(nodeSetting); } doc.SaveFile(m_strSettingsFile); }
void CPeripheral::SetSetting(const CStdString &strKey, bool bValue) { map<CStdString, CSetting *>::iterator it = m_settings.find(strKey); if (it != m_settings.end() && (*it).second->GetType() == SETTINGS_TYPE_BOOL) { CSettingBool *boolSetting = (CSettingBool *) (*it).second; if (boolSetting) { bool bChanged(boolSetting->GetData() != bValue); boolSetting->SetData(bValue); if (bChanged && m_bInitialised) OnSettingChanged(strKey); } } }
bool CPeripheral::SetSetting(const CStdString &strKey, bool bValue) { bool bChanged(false); map<CStdString, CSetting *>::iterator it = m_settings.find(strKey); if (it != m_settings.end() && (*it).second->GetType() == SettingTypeBool) { CSettingBool *boolSetting = (CSettingBool *) (*it).second; if (boolSetting) { bChanged = boolSetting->GetValue() != bValue; boolSetting->SetValue(bValue); if (bChanged && m_bInitialised) m_changedSettings.insert(strKey); } } return bChanged; }
CSettingBool* CGUIDialogSettingsManualBase::AddToggle(CSettingGroup *group, const std::string &id, int label, int level, bool value, bool delayed /* = false */, bool visible /* = true */, int help /* = -1 */) { if (group == NULL || id.empty() || label < 0 || GetSetting(id) != NULL) return NULL; CSettingBool *setting = new CSettingBool(id, label, value, m_settingsManager); if (setting == NULL) return NULL; setting->SetControl(GetCheckmarkControl(delayed)); setSettingDetails(setting, level, visible, help); group->AddSetting(setting); return setting; }
void CPeripheral::AddSetting(const CStdString &strKey, const CSetting *setting) { if (!setting) { CLog::Log(LOGERROR, "%s - invalid setting", __FUNCTION__); return; } if (!HasSetting(strKey)) { switch(setting->GetType()) { case SettingTypeBool: { const CSettingBool *mappedSetting = (const CSettingBool *) setting; CSettingBool *boolSetting = new CSettingBool(strKey, *mappedSetting); if (boolSetting) { boolSetting->SetVisible(mappedSetting->IsVisible()); m_settings.insert(make_pair(strKey, boolSetting)); } } break; case SettingTypeInteger: { const CSettingInt *mappedSetting = (const CSettingInt *) setting; CSettingInt *intSetting = new CSettingInt(strKey, *mappedSetting); if (intSetting) { intSetting->SetVisible(mappedSetting->IsVisible()); m_settings.insert(make_pair(strKey, intSetting)); } } break; case SettingTypeNumber: { const CSettingNumber *mappedSetting = (const CSettingNumber *) setting; CSettingNumber *floatSetting = new CSettingNumber(strKey, *mappedSetting); if (floatSetting) { floatSetting->SetVisible(mappedSetting->IsVisible()); m_settings.insert(make_pair(strKey, floatSetting)); } } break; case SettingTypeString: { const CSettingString *mappedSetting = (const CSettingString *) setting; CSettingString *stringSetting = new CSettingString(strKey, *mappedSetting); if (stringSetting) { stringSetting->SetVisible(mappedSetting->IsVisible()); m_settings.insert(make_pair(strKey, stringSetting)); } } break; default: //TODO add more types if needed break; } } }
void CGUIDialogPeripheralSettings::InitializeSettings() { if (m_item == NULL) { m_initialising = false; return; } m_initialising = true; bool usePopup = g_SkinInfo->HasSkinFile("DialogSlider.xml"); CPeripheral *peripheral = g_peripherals.GetByPath(m_item->GetPath()); if (peripheral == NULL) { CLog::Log(LOGDEBUG, "%s - no peripheral", __FUNCTION__); m_initialising = false; return; } m_settingsMap.clear(); CGUIDialogSettingsManualBase::InitializeSettings(); CSettingCategory *category = AddCategory("peripheralsettings", -1); if (category == NULL) { CLog::Log(LOGERROR, "CGUIDialogPeripheralSettings: unable to setup settings"); return; } CSettingGroup *group = AddGroup(category); if (group == NULL) { CLog::Log(LOGERROR, "CGUIDialogPeripheralSettings: unable to setup settings"); return; } std::vector<CSetting*> settings = peripheral->GetSettings(); for (std::vector<CSetting*>::iterator itSetting = settings.begin(); itSetting != settings.end(); ++itSetting) { CSetting *setting = *itSetting; if (setting == NULL) continue; if (!setting->IsVisible()) { CLog::Log(LOGDEBUG, "%s - invisible", __FUNCTION__); continue; } // we need to create a copy of the setting because the CSetting instances // are destroyed when leaving the dialog CSetting *settingCopy = NULL; switch(setting->GetType()) { case SettingTypeBool: { CSettingBool *settingBool = new CSettingBool(setting->GetId(), *static_cast<CSettingBool*>(setting)); settingBool->SetControl(GetCheckmarkControl()); settingCopy = static_cast<CSetting*>(settingBool); break; } case SettingTypeInteger: { CSettingInt *intSetting = static_cast<CSettingInt*>(setting); if (intSetting == NULL) break; CSettingInt *settingInt = new CSettingInt(setting->GetId(), *intSetting); if (settingInt->GetOptions().empty()) settingInt->SetControl(GetSliderControl("integer", false, -1, usePopup, -1, "%i")); else settingInt->SetControl(GetSpinnerControl("string")); settingCopy = static_cast<CSetting*>(settingInt); break; } case SettingTypeNumber: { CSettingNumber *settingNumber = new CSettingNumber(setting->GetId(), *static_cast<CSettingNumber*>(setting)); settingNumber->SetControl(GetSliderControl("number", false, -1, usePopup, -1, "%2.2f")); settingCopy = static_cast<CSetting*>(settingNumber); break; } case SettingTypeString: { CSettingString *settingString = new CSettingString(setting->GetId(), *static_cast<CSettingString*>(setting)); settingString->SetControl(GetEditControl("string")); settingCopy = static_cast<CSetting*>(settingString); break; } default: // TODO: add more types if needed CLog::Log(LOGDEBUG, "%s - unknown type", __FUNCTION__); break; } if (settingCopy != NULL && settingCopy->GetControl() != NULL) { settingCopy->SetLevel(SettingLevelBasic); group->AddSetting(settingCopy); m_settingsMap.insert(std::make_pair(setting->GetId(), setting)); } } m_initialising = false; }
void CPeripheral::AddSetting(const std::string &strKey, const CSetting *setting, int order) { if (!setting) { CLog::Log(LOGERROR, "%s - invalid setting", __FUNCTION__); return; } if (!HasSetting(strKey)) { PeripheralDeviceSetting deviceSetting = { NULL, order }; switch(setting->GetType()) { case SettingTypeBool: { const CSettingBool *mappedSetting = (const CSettingBool *) setting; CSettingBool *boolSetting = new CSettingBool(strKey, *mappedSetting); if (boolSetting) { boolSetting->SetVisible(mappedSetting->IsVisible()); deviceSetting.m_setting = boolSetting; } } break; case SettingTypeInteger: { const CSettingInt *mappedSetting = (const CSettingInt *) setting; CSettingInt *intSetting = new CSettingInt(strKey, *mappedSetting); if (intSetting) { intSetting->SetVisible(mappedSetting->IsVisible()); deviceSetting.m_setting = intSetting; } } break; case SettingTypeNumber: { const CSettingNumber *mappedSetting = (const CSettingNumber *) setting; CSettingNumber *floatSetting = new CSettingNumber(strKey, *mappedSetting); if (floatSetting) { floatSetting->SetVisible(mappedSetting->IsVisible()); deviceSetting.m_setting = floatSetting; } } break; case SettingTypeString: { const CSettingString *mappedSetting = (const CSettingString *) setting; CSettingString *stringSetting = new CSettingString(strKey, *mappedSetting); if (stringSetting) { stringSetting->SetVisible(mappedSetting->IsVisible()); deviceSetting.m_setting = stringSetting; } } break; default: //! @todo add more types if needed break; } if (deviceSetting.m_setting != NULL) m_settings.insert(make_pair(strKey, deviceSetting)); } }
void CGUIDialogPeripheralSettings::CreateSettings() { m_bIsInitialising = true; m_usePopupSliders = g_SkinInfo->HasSkinFile("DialogSlider.xml"); if (m_item) { CPeripheral *peripheral = g_peripherals.GetByPath(m_item->GetPath()); if (peripheral) { vector<CSetting *> settings = peripheral->GetSettings(); for (size_t iPtr = 0; iPtr < settings.size(); iPtr++) { CSetting *setting = settings[iPtr]; if (!setting->IsVisible()) { CLog::Log(LOGDEBUG, "%s - invisible", __FUNCTION__); continue; } switch(setting->GetType()) { case SettingTypeBool: { CSettingBool *boolSetting = (CSettingBool *) setting; if (boolSetting) { m_boolSettings.insert(make_pair(CStdString(boolSetting->GetId()), boolSetting->GetValue())); AddBool(m_settingId++, boolSetting->GetLabel(), &m_boolSettings[boolSetting->GetId()], true); } } break; case SettingTypeInteger: { CSettingInt *intSetting = (CSettingInt *) setting; if (intSetting) { if (intSetting->GetControl()->GetFormat() == "integer") { m_intSettings.insert(make_pair(CStdString(intSetting->GetId()), (float) intSetting->GetValue())); AddSlider(m_settingId++, intSetting->GetLabel(), &m_intSettings[intSetting->GetId()], (float)intSetting->GetMinimum(), (float)intSetting->GetStep(), (float)intSetting->GetMaximum(), CGUIDialogVideoSettings::FormatInteger, false); } else if (intSetting->GetControl()->GetFormat() == "string") { m_intTextSettings.insert(make_pair(CStdString(intSetting->GetId()), intSetting->GetValue())); vector<pair<int, int> > entries; StaticIntegerSettingOptions::const_iterator entriesItr = intSetting->GetOptions().begin(); while (entriesItr != intSetting->GetOptions().end()) { entries.push_back(make_pair(entriesItr->first, entriesItr->second)); ++entriesItr; } AddSpin(m_settingId++, intSetting->GetLabel(), &m_intTextSettings[intSetting->GetId()], entries); } } } break; case SettingTypeNumber: { CSettingNumber *floatSetting = (CSettingNumber *) setting; if (floatSetting) { m_floatSettings.insert(make_pair(CStdString(floatSetting->GetId()), (float)floatSetting->GetValue())); AddSlider(m_settingId++, floatSetting->GetLabel(), &m_floatSettings[floatSetting->GetId()], (float)floatSetting->GetMinimum(), (float)floatSetting->GetStep(), (float)floatSetting->GetMaximum(), CGUIDialogVideoSettings::FormatFloat, false); } } break; case SettingTypeString: { CSettingString *stringSetting = (CSettingString *) setting; if (stringSetting) { m_stringSettings.insert(make_pair(CStdString(stringSetting->GetId()), stringSetting->GetValue())); AddString(m_settingId++, stringSetting->GetLabel(), &m_stringSettings[stringSetting->GetId()]); } } break; default: //TODO add more types if needed CLog::Log(LOGDEBUG, "%s - unknown type", __FUNCTION__); break; } } } else { CLog::Log(LOGDEBUG, "%s - no peripheral", __FUNCTION__); } } m_bIsInitialising = false; }
void CPeripheral::AddSetting(const CStdString &strKey, const CSetting *setting) { if (!setting) { CLog::Log(LOGERROR, "%s - invalid setting", __FUNCTION__); return; } if (!HasSetting(strKey)) { switch(setting->GetType()) { case SETTINGS_TYPE_BOOL: { const CSettingBool *mappedSetting = (const CSettingBool *) setting; CSettingBool *boolSetting = new CSettingBool(0, strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->GetControlType()); if (boolSetting) { boolSetting->SetVisible(mappedSetting->IsVisible()); m_settings.insert(make_pair(strKey, boolSetting)); } } break; case SETTINGS_TYPE_INT: { const CSettingInt *mappedSetting = (const CSettingInt *) setting; CSettingInt *intSetting = new CSettingInt(0, strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_iMin, mappedSetting->m_iStep, mappedSetting->m_iMax, mappedSetting->GetControlType(), mappedSetting->m_strFormat); if (intSetting) { intSetting->SetVisible(mappedSetting->IsVisible()); m_settings.insert(make_pair(strKey, intSetting)); } } break; case SETTINGS_TYPE_FLOAT: { const CSettingFloat *mappedSetting = (const CSettingFloat *) setting; CSettingFloat *floatSetting = new CSettingFloat(0, strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_fMin, mappedSetting->m_fStep, mappedSetting->m_fMax, mappedSetting->GetControlType()); if (floatSetting) { floatSetting->SetVisible(mappedSetting->IsVisible()); m_settings.insert(make_pair(strKey, floatSetting)); } } break; case SETTINGS_TYPE_STRING: { const CSettingString *mappedSetting = (const CSettingString *) setting; CSettingString *stringSetting = new CSettingString(0, strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData().c_str(), mappedSetting->GetControlType(), mappedSetting->m_bAllowEmpty, mappedSetting->m_iHeadingString); if (stringSetting) { stringSetting->SetVisible(mappedSetting->IsVisible()); m_settings.insert(make_pair(strKey, stringSetting)); } } break; default: //TODO add more types if needed break; } } }
bool CAdvancedSettings::Load() { // NOTE: This routine should NOT set the default of any of these parameters // it should instead use the versions of GetString/Integer/Float that // don't take defaults in. Defaults are set in the constructor above CStdString advancedSettingsXML; advancedSettingsXML = g_settings.GetUserDataItem("advancedsettings.xml"); TiXmlDocument advancedXML; if (!CFile::Exists(advancedSettingsXML)) { // tell the user it doesn't exist CLog::Log(LOGNOTICE, "No advancedsettings.xml to load (%s)", advancedSettingsXML.c_str()); return false; } if (!advancedXML.LoadFile(advancedSettingsXML)) { CLog::Log(LOGERROR, "Error loading %s, Line %d\n%s", advancedSettingsXML.c_str(), advancedXML.ErrorRow(), advancedXML.ErrorDesc()); return false; } TiXmlElement *pRootElement = advancedXML.RootElement(); if (!pRootElement || strcmpi(pRootElement->Value(),"advancedsettings") != 0) { CLog::Log(LOGERROR, "Error loading %s, no <advancedsettings> node", advancedSettingsXML.c_str()); return false; } // succeeded - tell the user it worked CLog::Log(LOGNOTICE, "Loaded advancedsettings.xml from %s", advancedSettingsXML.c_str()); // Dump contents of AS.xml to debug log TiXmlPrinter printer; printer.SetLineBreak("\n"); printer.SetIndent(" "); advancedXML.Accept(&printer); CLog::Log(LOGNOTICE, "Contents of %s are...\n%s", advancedSettingsXML.c_str(), printer.CStr()); TiXmlElement *pElement = pRootElement->FirstChildElement("audio"); if (pElement) { XMLUtils::GetFloat(pElement, "ac3downmixgain", m_ac3Gain, -96.0f, 96.0f); XMLUtils::GetInt(pElement, "headroom", m_audioHeadRoom, 0, 12); XMLUtils::GetFloat(pElement, "karaokesyncdelay", m_karaokeSyncDelay, -3.0f, 3.0f); // 101 on purpose - can be used to never automark as watched XMLUtils::GetFloat(pElement, "playcountminimumpercent", m_audioPlayCountMinimumPercent, 0.0f, 101.0f); XMLUtils::GetBoolean(pElement, "usetimeseeking", m_musicUseTimeSeeking); XMLUtils::GetInt(pElement, "timeseekforward", m_musicTimeSeekForward, 0, 6000); XMLUtils::GetInt(pElement, "timeseekbackward", m_musicTimeSeekBackward, -6000, 0); XMLUtils::GetInt(pElement, "timeseekforwardbig", m_musicTimeSeekForwardBig, 0, 6000); XMLUtils::GetInt(pElement, "timeseekbackwardbig", m_musicTimeSeekBackwardBig, -6000, 0); XMLUtils::GetInt(pElement, "percentseekforward", m_musicPercentSeekForward, 0, 100); XMLUtils::GetInt(pElement, "percentseekbackward", m_musicPercentSeekBackward, -100, 0); XMLUtils::GetInt(pElement, "percentseekforwardbig", m_musicPercentSeekForwardBig, 0, 100); XMLUtils::GetInt(pElement, "percentseekbackwardbig", m_musicPercentSeekBackwardBig, -100, 0); XMLUtils::GetInt(pElement, "resample", m_musicResample, 0, 48000); TiXmlElement* pAudioExcludes = pElement->FirstChildElement("excludefromlisting"); if (pAudioExcludes) GetCustomRegexps(pAudioExcludes, m_audioExcludeFromListingRegExps); pAudioExcludes = pElement->FirstChildElement("excludefromscan"); if (pAudioExcludes) GetCustomRegexps(pAudioExcludes, m_audioExcludeFromScanRegExps); XMLUtils::GetBoolean(pElement, "applydrc", m_audioApplyDrc); XMLUtils::GetBoolean(pElement, "dvdplayerignoredtsinwav", m_dvdplayerIgnoreDTSinWAV); } pElement = pRootElement->FirstChildElement("video"); if (pElement) { XMLUtils::GetFloat(pElement, "subsdelayrange", m_videoSubsDelayRange, 10, 600); XMLUtils::GetFloat(pElement, "audiodelayrange", m_videoAudioDelayRange, 10, 600); XMLUtils::GetInt(pElement, "blackbarcolour", m_videoBlackBarColour, 0, 255); XMLUtils::GetBoolean(pElement, "fullscreenonmoviestart", m_fullScreenOnMovieStart); // 101 on purpose - can be used to never automark as watched XMLUtils::GetFloat(pElement, "playcountminimumpercent", m_videoPlayCountMinimumPercent, 0.0f, 101.0f); XMLUtils::GetInt(pElement, "ignoresecondsatstart", m_videoIgnoreSecondsAtStart, 0, 900); XMLUtils::GetFloat(pElement, "ignorepercentatend", m_videoIgnorePercentAtEnd, 0, 100.0f); XMLUtils::GetInt(pElement, "smallstepbackseconds", m_videoSmallStepBackSeconds, 1, INT_MAX); XMLUtils::GetInt(pElement, "smallstepbacktries", m_videoSmallStepBackTries, 1, 10); XMLUtils::GetInt(pElement, "smallstepbackdelay", m_videoSmallStepBackDelay, 100, 5000); //MS XMLUtils::GetBoolean(pElement, "usetimeseeking", m_videoUseTimeSeeking); XMLUtils::GetInt(pElement, "timeseekforward", m_videoTimeSeekForward, 0, 6000); XMLUtils::GetInt(pElement, "timeseekbackward", m_videoTimeSeekBackward, -6000, 0); XMLUtils::GetInt(pElement, "timeseekforwardbig", m_videoTimeSeekForwardBig, 0, 6000); XMLUtils::GetInt(pElement, "timeseekbackwardbig", m_videoTimeSeekBackwardBig, -6000, 0); XMLUtils::GetInt(pElement, "percentseekforward", m_videoPercentSeekForward, 0, 100); XMLUtils::GetInt(pElement, "percentseekbackward", m_videoPercentSeekBackward, -100, 0); XMLUtils::GetInt(pElement, "percentseekforwardbig", m_videoPercentSeekForwardBig, 0, 100); XMLUtils::GetInt(pElement, "percentseekbackwardbig", m_videoPercentSeekBackwardBig, -100, 0); TiXmlElement* pVideoExcludes = pElement->FirstChildElement("excludefromlisting"); if (pVideoExcludes) GetCustomRegexps(pVideoExcludes, m_videoExcludeFromListingRegExps); pVideoExcludes = pElement->FirstChildElement("excludefromscan"); if (pVideoExcludes) GetCustomRegexps(pVideoExcludes, m_moviesExcludeFromScanRegExps); pVideoExcludes = pElement->FirstChildElement("excludetvshowsfromscan"); if (pVideoExcludes) GetCustomRegexps(pVideoExcludes, m_tvshowExcludeFromScanRegExps); pVideoExcludes = pElement->FirstChildElement("cleanstrings"); if (pVideoExcludes) GetCustomRegexps(pVideoExcludes, m_videoCleanStringRegExps); XMLUtils::GetString(pElement,"cleandatetime", m_videoCleanDateTimeRegExp); XMLUtils::GetString(pElement,"ppffmpegdeinterlacing",m_videoPPFFmpegDeint); XMLUtils::GetString(pElement,"ppffmpegpostprocessing",m_videoPPFFmpegPostProc); } pElement = pRootElement->FirstChildElement("musiclibrary"); if (pElement) { XMLUtils::GetBoolean(pElement, "hideallitems", m_bMusicLibraryHideAllItems); XMLUtils::GetInt(pElement, "recentlyaddeditems", m_iMusicLibraryRecentlyAddedItems, 1, INT_MAX); XMLUtils::GetBoolean(pElement, "prioritiseapetags", m_prioritiseAPEv2tags); XMLUtils::GetBoolean(pElement, "allitemsonbottom", m_bMusicLibraryAllItemsOnBottom); XMLUtils::GetBoolean(pElement, "albumssortbyartistthenyear", m_bMusicLibraryAlbumsSortByArtistThenYear); XMLUtils::GetString(pElement, "albumformat", m_strMusicLibraryAlbumFormat); XMLUtils::GetString(pElement, "albumformatright", m_strMusicLibraryAlbumFormatRight); XMLUtils::GetString(pElement, "itemseparator", m_musicItemSeparator); } pElement = pRootElement->FirstChildElement("videolibrary"); if (pElement) { XMLUtils::GetBoolean(pElement, "hideallitems", m_bVideoLibraryHideAllItems); XMLUtils::GetBoolean(pElement, "allitemsonbottom", m_bVideoLibraryAllItemsOnBottom); XMLUtils::GetInt(pElement, "recentlyaddeditems", m_iVideoLibraryRecentlyAddedItems, 1, INT_MAX); XMLUtils::GetBoolean(pElement, "hiderecentlyaddeditems", m_bVideoLibraryHideRecentlyAddedItems); XMLUtils::GetBoolean(pElement, "hideemptyseries", m_bVideoLibraryHideEmptySeries); XMLUtils::GetBoolean(pElement, "cleanonupdate", m_bVideoLibraryCleanOnUpdate); XMLUtils::GetString(pElement, "itemseparator", m_videoItemSeparator); XMLUtils::GetBoolean(pElement, "exportautothumbs", m_bVideoLibraryExportAutoThumbs); XMLUtils::GetBoolean(pElement, "importwatchedstate", m_bVideoLibraryImportWatchedState); TiXmlElement* pMyMovies = pElement->FirstChildElement("mymovies"); if (pMyMovies) XMLUtils::GetBoolean(pMyMovies, "categoriestogenres", m_bVideoLibraryMyMoviesCategoriesToGenres); } pElement = pRootElement->FirstChildElement("videoscanner"); if (pElement) { XMLUtils::GetBoolean(pElement, "ignoreerrors", m_bVideoScannerIgnoreErrors); } pElement = pRootElement->FirstChildElement("slideshow"); if (pElement) { XMLUtils::GetFloat(pElement, "panamount", m_slideshowPanAmount, 0.0f, 20.0f); XMLUtils::GetFloat(pElement, "zoomamount", m_slideshowZoomAmount, 0.0f, 20.0f); XMLUtils::GetFloat(pElement, "blackbarcompensation", m_slideshowBlackBarCompensation, 0.0f, 50.0f); } pElement = pRootElement->FirstChildElement("lcd"); if (pElement) { XMLUtils::GetInt(pElement, "rows", m_lcdRows, 1, 4); XMLUtils::GetInt(pElement, "columns", m_lcdColumns, 1, 40); XMLUtils::GetInt(pElement, "address1", m_lcdAddress1, 0, 0x100); XMLUtils::GetInt(pElement, "address2", m_lcdAddress2, 0, 0x100); XMLUtils::GetInt(pElement, "address3", m_lcdAddress3, 0, 0x100); XMLUtils::GetInt(pElement, "address4", m_lcdAddress4, 0, 0x100); } pElement = pRootElement->FirstChildElement("network"); if (pElement) { XMLUtils::GetInt(pElement, "autodetectpingtime", m_autoDetectPingTime, 1, 240); XMLUtils::GetInt(pElement, "curlclienttimeout", m_curlconnecttimeout, 1, 1000); XMLUtils::GetInt(pElement, "curllowspeedtime", m_curllowspeedtime, 1, 1000); XMLUtils::GetInt(pElement, "curlretries", m_curlretries, 0, 10); XMLUtils::GetUInt(pElement, "cachemembuffersize", m_cacheMemBufferSize); } pElement = pRootElement->FirstChildElement("samba"); if (pElement) { XMLUtils::GetString(pElement, "doscodepage", m_sambadoscodepage); XMLUtils::GetInt(pElement, "clienttimeout", m_sambaclienttimeout, 5, 100); XMLUtils::GetBoolean(pElement, "statfiles", m_sambastatfiles); } pElement = pRootElement->FirstChildElement("httpdirectory"); if (pElement) XMLUtils::GetBoolean(pElement, "statfilesize", m_bHTTPDirectoryStatFilesize); pElement = pRootElement->FirstChildElement("ftp"); if (pElement) { XMLUtils::GetBoolean(pElement, "remotethumbs", m_bFTPThumbs); } pElement = pRootElement->FirstChildElement("loglevel"); if (pElement) { // read the loglevel setting, so set the setting advanced to hide it in GUI // as altering it will do nothing - we don't write to advancedsettings.xml XMLUtils::GetInt(pRootElement, "loglevel", m_logLevelHint, LOG_LEVEL_NONE, LOG_LEVEL_MAX); CSettingBool *setting = (CSettingBool *)g_guiSettings.GetSetting("debug.showloginfo"); if (setting) { const char* hide; if (!((hide = pElement->Attribute("hide")) && strnicmp("false", hide, 4) == 0)) setting->SetAdvanced(); } g_advancedSettings.m_logLevel = std::max(g_advancedSettings.m_logLevel, g_advancedSettings.m_logLevelHint); CLog::SetLogLevel(g_advancedSettings.m_logLevel); } pElement = pRootElement->FirstChildElement("python"); if (pElement) { XMLUtils::GetBoolean(pElement, "verbose", m_bPythonVerbose); } XMLUtils::GetString(pRootElement, "cddbaddress", m_cddbAddress); XMLUtils::GetBoolean(pRootElement, "usepcdvdrom", m_usePCDVDROM); XMLUtils::GetBoolean(pRootElement, "nodvdrom", m_noDVDROM); XMLUtils::GetBoolean(pRootElement, "enableintro", m_enableintro); XMLUtils::GetBoolean(pRootElement, "fasterscanning", m_fastscanning); XMLUtils::GetBoolean(pRootElement, "slowscrolling", m_slowscrolling); XMLUtils::GetBoolean(pRootElement, "splash", m_splashImage); XMLUtils::GetBoolean(pRootElement, "disablemodchipdetection", m_DisableModChipDetection); XMLUtils::GetBoolean(pRootElement, "powersave", m_bPowerSave); XMLUtils::GetInt(pRootElement, "songinfoduration", m_songInfoDuration, 0, INT_MAX); XMLUtils::GetInt(pRootElement, "busydialogdelay", m_busyDialogDelay, 0, 5000); XMLUtils::GetInt(pRootElement, "playlistretries", m_playlistRetries, -1, 5000); XMLUtils::GetInt(pRootElement, "playlisttimeout", m_playlistTimeout, 0, 5000); XMLUtils::GetBoolean(pRootElement,"virtualshares", m_bVirtualShares); XMLUtils::GetBoolean(pRootElement,"navigatevirtualkeyboard", m_bNavVKeyboard); //Tuxbox pElement = pRootElement->FirstChildElement("tuxbox"); if (pElement) { XMLUtils::GetInt(pElement, "streamtsport", m_iTuxBoxStreamtsPort, 0, 65535); XMLUtils::GetBoolean(pElement, "audiochannelselection", m_bTuxBoxAudioChannelSelection); XMLUtils::GetBoolean(pElement, "submenuselection", m_bTuxBoxSubMenuSelection); XMLUtils::GetBoolean(pElement, "pictureicon", m_bTuxBoxPictureIcon); XMLUtils::GetBoolean(pElement, "sendallaudiopids", m_bTuxBoxSendAllAPids); XMLUtils::GetInt(pElement, "epgrequesttime", m_iTuxBoxEpgRequestTime, 0, 3600); XMLUtils::GetInt(pElement, "defaultsubmenu", m_iTuxBoxDefaultSubMenu, 1, 4); XMLUtils::GetInt(pElement, "defaultrootmenu", m_iTuxBoxDefaultRootMenu, 0, 4); XMLUtils::GetInt(pElement, "zapwaittime", m_iTuxBoxZapWaitTime, 0, 120); XMLUtils::GetBoolean(pElement, "zapstream", m_bTuxBoxZapstream); XMLUtils::GetInt(pElement, "zapstreamport", m_iTuxBoxZapstreamPort, 0, 65535); } // Myth TV pElement = pRootElement->FirstChildElement("myth"); if (pElement) { XMLUtils::GetInt(pElement, "movielength", m_iMythMovieLength); } // EDL commercial break handling pElement = pRootElement->FirstChildElement("edl"); if (pElement) { XMLUtils::GetBoolean(pElement, "mergeshortcommbreaks", m_bEdlMergeShortCommBreaks); XMLUtils::GetInt(pElement, "maxcommbreaklength", m_iEdlMaxCommBreakLength, 0, 10 * 60); // Between 0 and 10 minutes XMLUtils::GetInt(pElement, "mincommbreaklength", m_iEdlMinCommBreakLength, 0, 5 * 60); // Between 0 and 5 minutes XMLUtils::GetInt(pElement, "maxcommbreakgap", m_iEdlMaxCommBreakGap, 0, 5 * 60); // Between 0 and 5 minutes. XMLUtils::GetInt(pElement, "maxstartgap", m_iEdlMaxStartGap, 0, 10 * 60); // Between 0 and 10 minutes XMLUtils::GetInt(pElement, "commbreakautowait", m_iEdlCommBreakAutowait, 0, 10); // Between 0 and 10 seconds XMLUtils::GetInt(pElement, "commbreakautowind", m_iEdlCommBreakAutowind, 0, 10); // Between 0 and 10 seconds } // picture exclude regexps TiXmlElement* pPictureExcludes = pRootElement->FirstChildElement("pictureexcludes"); if (pPictureExcludes) GetCustomRegexps(pPictureExcludes, m_pictureExcludeFromListingRegExps); // picture extensions CStdString extraExtensions; TiXmlElement* pExts = pRootElement->FirstChildElement("pictureextensions"); if (pExts) GetCustomExtensions(pExts,g_settings.m_pictureExtensions); // music extensions pExts = pRootElement->FirstChildElement("musicextensions"); if (pExts) GetCustomExtensions(pExts,g_settings.m_musicExtensions); // video extensions pExts = pRootElement->FirstChildElement("videoextensions"); if (pExts) GetCustomExtensions(pExts,g_settings.m_videoExtensions); m_vecTokens.clear(); CLangInfo::LoadTokens(pRootElement->FirstChild("sorttokens"),m_vecTokens); XMLUtils::GetBoolean(pRootElement, "displayremotecodes", m_displayRemoteCodes); // TODO: Should cache path be given in terms of our predefined paths?? // Are we even going to have predefined paths?? CSettings::GetPath(pRootElement, "cachepath", m_cachePath); URIUtils::AddSlashAtEnd(m_cachePath); XMLUtils::GetBoolean(pRootElement, "ftpshowcache", m_FTPShowCache); g_LangCodeExpander.LoadUserCodes(pRootElement->FirstChildElement("languagecodes")); // trailer matching regexps TiXmlElement* pTrailerMatching = pRootElement->FirstChildElement("trailermatching"); if (pTrailerMatching) GetCustomRegexps(pTrailerMatching, m_trailerMatchRegExps); //everything thats a trailer is not a movie m_moviesExcludeFromScanRegExps.insert(m_moviesExcludeFromScanRegExps.end(), m_trailerMatchRegExps.begin(), m_trailerMatchRegExps.end()); // stacking regexps TiXmlElement* pVideoStacking = pRootElement->FirstChildElement("moviestacking"); if (pVideoStacking) GetCustomRegexps(pVideoStacking, m_videoStackRegExps); //tv stacking regexps TiXmlElement* pTVStacking = pRootElement->FirstChildElement("tvshowmatching"); if (pTVStacking) GetCustomTVRegexps(pTVStacking, m_tvshowStackRegExps); // path substitutions TiXmlElement* pPathSubstitution = pRootElement->FirstChildElement("pathsubstitution"); if (pPathSubstitution) { m_pathSubstitutions.clear(); CLog::Log(LOGDEBUG,"Configuring path substitutions"); TiXmlNode* pSubstitute = pPathSubstitution->FirstChildElement("substitute"); while (pSubstitute) { CStdString strFrom, strTo; TiXmlNode* pFrom = pSubstitute->FirstChild("from"); if (pFrom) strFrom = pFrom->FirstChild()->Value(); TiXmlNode* pTo = pSubstitute->FirstChild("to"); if (pTo) strTo = pTo->FirstChild()->Value(); if (!strFrom.IsEmpty() && !strTo.IsEmpty()) { CLog::Log(LOGDEBUG," Registering substition pair:"); CLog::Log(LOGDEBUG," From: [%s]", strFrom.c_str()); CLog::Log(LOGDEBUG," To: [%s]", strTo.c_str()); // keep literal commas since we use comma as a seperator strFrom.Replace(",",",,"); strTo.Replace(",",",,"); m_pathSubstitutions.push_back(strFrom + " , " + strTo); } else { // error message about missing tag if (strFrom.IsEmpty()) CLog::Log(LOGERROR," Missing <from> tag"); else CLog::Log(LOGERROR," Missing <to> tag"); } // get next one pSubstitute = pSubstitute->NextSiblingElement("substitute"); } } XMLUtils::GetInt(pRootElement, "remoterepeat", m_remoteRepeat, 1, INT_MAX); XMLUtils::GetFloat(pRootElement, "controllerdeadzone", m_controllerDeadzone, 0.0f, 1.0f); XMLUtils::GetInt(pRootElement, "thumbsize", m_thumbSize, 0, 1024); XMLUtils::GetInt(pRootElement, "fanartheight", m_fanartHeight, 0, 1080); //dds support XMLUtils::GetBoolean(pRootElement, "useddsfanart", m_useddsfanart); XMLUtils::GetBoolean(pRootElement, "playlistasfolders", m_playlistAsFolders); XMLUtils::GetBoolean(pRootElement, "detectasudf", m_detectAsUdf); // music thumbs CStdString extraThumbs; TiXmlElement* pThumbs = pRootElement->FirstChildElement("musicthumbs"); if (pThumbs) { // remove before add so that the defaults can be restored after user defined ones // (ie, the list can be:cover.jpg|cover.png|folder.jpg) CSettings::GetString(pThumbs, "remove", extraThumbs, ""); if (extraThumbs != "") { CStdStringArray thumbs; StringUtils::SplitString(extraThumbs, "|", thumbs); for (unsigned int i = 0; i < thumbs.size(); ++i) { int iPos = m_musicThumbs.Find(thumbs[i]); if (iPos == -1) continue; m_musicThumbs.erase(iPos, thumbs[i].size() + 1); } } CSettings::GetString(pThumbs, "add", extraThumbs,""); if (extraThumbs != "") { if (!m_musicThumbs.IsEmpty()) m_musicThumbs += "|"; m_musicThumbs += extraThumbs; } } // dvd thumbs pThumbs = pRootElement->FirstChildElement("dvdthumbs"); if (pThumbs) { // remove before add so that the defaults can be restored after user defined ones // (ie, the list can be:cover.jpg|cover.png|folder.jpg) CSettings::GetString(pThumbs, "remove", extraThumbs, ""); if (extraThumbs != "") { CStdStringArray thumbs; StringUtils::SplitString(extraThumbs, "|", thumbs); for (unsigned int i = 0; i < thumbs.size(); ++i) { int iPos = m_dvdThumbs.Find(thumbs[i]); if (iPos == -1) continue; m_dvdThumbs.erase(iPos, thumbs[i].size() + 1); } } CSettings::GetString(pThumbs, "add", extraThumbs,""); if (extraThumbs != "") { if (!m_dvdThumbs.IsEmpty()) m_dvdThumbs += "|"; m_dvdThumbs += extraThumbs; } } // movie fanarts TiXmlElement* pFanart = pRootElement->FirstChildElement("fanart"); if (pFanart) GetCustomExtensions(pFanart,m_fanartImages); // music filename->tag filters TiXmlElement* filters = pRootElement->FirstChildElement("musicfilenamefilters"); if (filters) { TiXmlNode* filter = filters->FirstChild("filter"); while (filter) { if (filter->FirstChild()) m_musicTagsFromFileFilters.push_back(filter->FirstChild()->ValueStr()); filter = filter->NextSibling("filter"); } } TiXmlElement* pHostEntries = pRootElement->FirstChildElement("hosts"); if (pHostEntries) { TiXmlElement* element = pHostEntries->FirstChildElement("entry"); while(element) { CStdString name = element->Attribute("name"); CStdString value; if(element->GetText()) value = element->GetText(); if(name.length() > 0 && value.length() > 0) CDNSNameCache::Add(name, value); element = element->NextSiblingElement("entry"); } } XMLUtils::GetInt(pRootElement, "bginfoloadermaxthreads", m_bgInfoLoaderMaxThreads); m_bgInfoLoaderMaxThreads = std::max(3, m_bgInfoLoaderMaxThreads); // load in the GUISettings overrides: g_guiSettings.LoadXML(pRootElement, true); // true to hide the settings we read in return true; }
void CGUIDialogPeripheralSettings::CreateSettings() { m_bIsInitialising = true; m_usePopupSliders = g_SkinInfo->HasSkinFile("DialogSlider.xml"); if (m_item) { CPeripheral *peripheral = g_peripherals.GetByPath(m_item->GetPath()); if (peripheral) { vector<CSetting *> settings = peripheral->GetSettings(); for (size_t iPtr = 0; iPtr < settings.size(); iPtr++) { CSetting *setting = settings[iPtr]; if (!setting->IsVisible()) { CLog::Log(LOGDEBUG, "%s - invisible", __FUNCTION__); continue; } switch(setting->GetType()) { case SETTINGS_TYPE_BOOL: { CSettingBool *boolSetting = (CSettingBool *) setting; if (boolSetting) { m_boolSettings.insert(make_pair(CStdString(boolSetting->GetSetting()), boolSetting->GetData())); AddBool(boolSetting->GetOrder(), boolSetting->GetLabel(), &m_boolSettings[boolSetting->GetSetting()], true); } } break; case SETTINGS_TYPE_INT: { CSettingInt *intSetting = (CSettingInt *) setting; if (intSetting) { if (intSetting->GetControlType() == SPIN_CONTROL_INT) { m_intSettings.insert(make_pair(CStdString(intSetting->GetSetting()), (float) intSetting->GetData())); AddSlider(intSetting->GetOrder(), intSetting->GetLabel(), &m_intSettings[intSetting->GetSetting()], (float)intSetting->m_iMin, (float)intSetting->m_iStep, (float)intSetting->m_iMax, CGUIDialogVideoSettings::FormatInteger, false); } else if (intSetting->GetControlType() == SPIN_CONTROL_TEXT) { m_intTextSettings.insert(make_pair(CStdString(intSetting->GetSetting()), intSetting->GetData())); vector<pair<int, int> > entries; map<int, int>::iterator entriesItr = intSetting->m_entries.begin(); while (entriesItr != intSetting->m_entries.end()) { entries.push_back(make_pair(entriesItr->first, entriesItr->second)); ++entriesItr; } AddSpin(intSetting->GetOrder(), intSetting->GetLabel(), &m_intTextSettings[intSetting->GetSetting()], entries); } } } break; case SETTINGS_TYPE_FLOAT: { CSettingFloat *floatSetting = (CSettingFloat *) setting; if (floatSetting) { m_floatSettings.insert(make_pair(CStdString(floatSetting->GetSetting()), floatSetting->GetData())); AddSlider(floatSetting->GetOrder(), floatSetting->GetLabel(), &m_floatSettings[floatSetting->GetSetting()], floatSetting->m_fMin, floatSetting->m_fStep, floatSetting->m_fMax, CGUIDialogVideoSettings::FormatFloat, false); } } break; case SETTINGS_TYPE_STRING: { CSettingString *stringSetting = (CSettingString *) setting; if (stringSetting) { m_stringSettings.insert(make_pair(CStdString(stringSetting->GetSetting()), stringSetting->GetData())); AddString(stringSetting->GetOrder(), stringSetting->GetLabel(), &m_stringSettings[stringSetting->GetSetting()]); } } break; default: //TODO add more types if needed CLog::Log(LOGDEBUG, "%s - unknown type", __FUNCTION__); break; } } } else { CLog::Log(LOGDEBUG, "%s - no peripheral", __FUNCTION__); } } m_bIsInitialising = false; }
void CGUIDialogContentSettings::InitializeSettings() { CGUIDialogSettingsManualBase::InitializeSettings(); if (m_content == CONTENT_NONE) m_showScanSettings = false; else if (m_scraper != NULL && !CAddonMgr::GetInstance().IsAddonDisabled(m_scraper->ID())) m_showScanSettings = true; CSettingCategory *category = AddCategory("contentsettings", -1); if (category == NULL) { CLog::Log(LOGERROR, "CGUIDialogContentSettings: unable to setup settings"); return; } CSettingGroup *group = AddGroup(category); if (group == NULL) { CLog::Log(LOGERROR, "CGUIDialogContentSettings: unable to setup settings"); return; } AddButton(group, SETTING_CONTENT_TYPE, 20344, 0); AddButton(group, SETTING_SCRAPER_LIST, 38025, 0); CSettingAction *subsetting = AddButton(group, SETTING_SCRAPER_SETTINGS, 10004, 0); if (subsetting != NULL) subsetting->SetParent(SETTING_SCRAPER_LIST); group = AddGroup(category, 20322); if (category == NULL) { CLog::Log(LOGERROR, "CGUIDialogContentSettings: unable to setup scanning settings"); return; } switch (m_content) { case CONTENT_TVSHOWS: { AddToggle(group, SETTING_CONTAINS_SINGLE_ITEM, 20379, 0, m_containsSingleItem, false, m_showScanSettings); AddToggle(group, SETTING_NO_UPDATING, 20432, 0, m_noUpdating, false, m_showScanSettings); break; } case CONTENT_MOVIES: case CONTENT_MUSICVIDEOS: { AddToggle(group, SETTING_USE_DIRECTORY_NAMES, m_content == CONTENT_MOVIES ? 20329 : 20330, 0, m_useDirectoryNames, false, m_showScanSettings); CSettingBool *settingScanRecursive = AddToggle(group, SETTING_SCAN_RECURSIVE, 20346, 0, m_scanRecursive, false, m_showScanSettings); CSettingBool *settingContainsSingleItem = AddToggle(group, SETTING_CONTAINS_SINGLE_ITEM, 20383, 0, m_containsSingleItem, false, m_showScanSettings); AddToggle(group, SETTING_NO_UPDATING, 20432, 0, m_noUpdating, false, m_showScanSettings); // define an enable dependency with (m_useDirectoryNames && !m_containsSingleItem) || !m_useDirectoryNames CSettingDependency dependencyScanRecursive(SettingDependencyTypeEnable, m_settingsManager); dependencyScanRecursive.Or() ->Add(CSettingDependencyConditionCombinationPtr((new CSettingDependencyConditionCombination(BooleanLogicOperationAnd, m_settingsManager)) // m_useDirectoryNames && !m_containsSingleItem ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition(SETTING_USE_DIRECTORY_NAMES, "true", SettingDependencyOperatorEquals, false, m_settingsManager))) // m_useDirectoryNames ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition(SETTING_CONTAINS_SINGLE_ITEM, "false", SettingDependencyOperatorEquals, false, m_settingsManager))))) // !m_containsSingleItem ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition(SETTING_USE_DIRECTORY_NAMES, "false", SettingDependencyOperatorEquals, false, m_settingsManager))); // !m_useDirectoryNames // define an enable dependency with m_useDirectoryNames && !m_scanRecursive CSettingDependency depdendencyContainsSingleItem(SettingDependencyTypeEnable, m_settingsManager); depdendencyContainsSingleItem.And() ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition(SETTING_USE_DIRECTORY_NAMES, "true", SettingDependencyOperatorEquals, false, m_settingsManager))) // m_useDirectoryNames ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition(SETTING_SCAN_RECURSIVE, "false", SettingDependencyOperatorEquals, false, m_settingsManager))); // !m_scanRecursive SettingDependencies deps; deps.push_back(dependencyScanRecursive); settingScanRecursive->SetDependencies(deps); deps.clear(); deps.push_back(depdendencyContainsSingleItem); settingContainsSingleItem->SetDependencies(deps); break; } case CONTENT_ALBUMS: case CONTENT_ARTISTS: break; case CONTENT_NONE: default: AddToggle(group, SETTING_EXCLUDE, 20380, 0, m_exclude, false, !m_showScanSettings); break; } }