bool CFavouritesDirectory::LoadFavourites(const std::string& strPath, CFileItemList& items) { CXBMCTinyXML doc; if (!doc.LoadFile(strPath)) { CLog::Log(LOGERROR, "Unable to load %s (row %i column %i)", strPath.c_str(), doc.Row(), doc.Column()); return false; } TiXmlElement *root = doc.RootElement(); if (!root || strcmp(root->Value(), "favourites")) { CLog::Log(LOGERROR, "Favourites.xml doesn't contain the <favourites> root element"); return false; } TiXmlElement *favourite = root->FirstChildElement("favourite"); while (favourite) { // format: // <favourite name="Cool Video" thumb="foo.jpg">PlayMedia(c:\videos\cool_video.avi)</favourite> // <favourite name="My Album" thumb="bar.tbn">ActivateWindow(MyMusic,c:\music\my album)</favourite> // <favourite name="Apple Movie Trailers" thumb="path_to_thumb.png">RunScript(special://xbmc/scripts/apple movie trailers/default.py)</favourite> const char *name = favourite->Attribute("name"); const char *thumb = favourite->Attribute("thumb"); if (name && favourite->FirstChild()) { if(!items.Contains(favourite->FirstChild()->Value())) { CFileItemPtr item(new CFileItem(name)); item->SetPath(favourite->FirstChild()->Value()); if (thumb) item->SetArt("thumb", thumb); items.Add(item); } } favourite = favourite->NextSiblingElement("favourite"); } return true; }
bool GUIFontManager::OpenFontFile(CXBMCTinyXML& xmlDoc) { // Get the file to load fonts from: CStdString strPath = g_SkinInfo->GetSkinPath("Font.xml", &m_skinResolution); CLog::Log(LOGINFO, "Loading fonts from %s", strPath.c_str()); // first try our preferred file if ( !xmlDoc.LoadFile(strPath) ) { CLog::Log(LOGERROR, "Couldn't load %s", strPath.c_str()); return false; } TiXmlElement* pRootElement = xmlDoc.RootElement(); CStdString strValue = pRootElement->Value(); if (strValue != CStdString("fonts")) { CLog::Log(LOGERROR, "file %s doesnt start with <fonts>", strPath.c_str()); return false; } return true; }
bool CMediaManager::LoadSources() { // clear our location list m_locations.clear(); // load xml file... CXBMCTinyXML xmlDoc; if ( !xmlDoc.LoadFile( MEDIA_SOURCES_XML ) ) return false; TiXmlElement* pRootElement = xmlDoc.RootElement(); if ( !pRootElement || strcmpi(pRootElement->Value(), "mediasources") != 0) { CLog::Log(LOGERROR, "Error loading %s, Line %d (%s)", MEDIA_SOURCES_XML, xmlDoc.ErrorRow(), xmlDoc.ErrorDesc()); return false; } // load the <network> block TiXmlNode *pNetwork = pRootElement->FirstChild("network"); if (pNetwork) { TiXmlElement *pLocation = pNetwork->FirstChildElement("location"); while (pLocation) { CNetworkLocation location; pLocation->Attribute("id", &location.id); if (pLocation->FirstChild()) { location.path = pLocation->FirstChild()->Value(); m_locations.push_back(location); } pLocation = pLocation->NextSiblingElement("location"); } } return true; }
bool CAddonInstaller::InstallFromZip(const std::string &path) { if (!g_passwordManager.CheckMenuLock(WINDOW_ADDON_BROWSER)) return false; CLog::Log(LOGDEBUG, "CAddonInstaller: installing from zip '%s'", CURL::GetRedacted(path).c_str()); // grab the descriptive XML document from the zip, and read it in CFileItemList items; // BUG: some zip files return a single item (root folder) that we think is stored, so we don't use the zip:// protocol CURL pathToUrl(path); CURL zipDir = URIUtils::CreateArchivePath("zip", pathToUrl, ""); if (!CDirectory::GetDirectory(zipDir, items) || items.Size() != 1 || !items[0]->m_bIsFolder) { CEventLog::GetInstance().AddWithNotification( EventPtr(new CNotificationEvent(EventLevelError, 24045, StringUtils::Format(g_localizeStrings.Get(24143).c_str(), path.c_str()))), false); return false; } // TODO: possibly add support for github generated zips here? std::string archive = URIUtils::AddFileToFolder(items[0]->GetPath(), "addon.xml"); CXBMCTinyXML xml; AddonPtr addon; if (xml.LoadFile(archive) && CAddonMgr::GetInstance().LoadAddonDescriptionFromMemory(xml.RootElement(), addon)) { // set the correct path addon->Props().path = items[0]->GetPath(); addon->Props().icon = URIUtils::AddFileToFolder(items[0]->GetPath(), "icon.png"); // install the addon return DoInstall(addon, RepositoryPtr()); } CEventLog::GetInstance().AddWithNotification( EventPtr(new CNotificationEvent(EventLevelError, 24045, StringUtils::Format(g_localizeStrings.Get(24143).c_str(), path.c_str()))), false); return false; }
void CWakeOnAccess::LoadFromXML() { bool enabled = CSettings::Get().GetBool("powermanagement.wakeonaccess"); SetEnabled(enabled); CXBMCTinyXML xmlDoc; if (!xmlDoc.LoadFile(GetSettingFile())) { CLog::Log(LOGNOTICE, "%s - unable to load:%s", __FUNCTION__, GetSettingFile().c_str()); return; } TiXmlElement* pRootElement = xmlDoc.RootElement(); if (strcmpi(pRootElement->Value(), "onaccesswakeup")) { CLog::Log(LOGERROR, "%s - XML file %s doesnt contain <onaccesswakeup>", __FUNCTION__, GetSettingFile().c_str()); return; } m_entries.clear(); CLog::Log(LOGNOTICE,"WakeOnAccess - Load settings :"); int tmp; if (XMLUtils::GetInt(pRootElement, "netinittimeout", tmp, 0, 5 * 60)) m_netinit_sec = tmp; CLog::Log(LOGNOTICE," -Network init timeout : [%d] sec", m_netinit_sec); if (XMLUtils::GetInt(pRootElement, "netsettletime", tmp, 0, 5 * 1000)) m_netsettle_ms = tmp; CLog::Log(LOGNOTICE," -Network settle time : [%d] ms", m_netsettle_ms); const TiXmlNode* pWakeUp = pRootElement->FirstChildElement("wakeup"); while (pWakeUp) { WakeUpEntry entry; CStdString strtmp; if (XMLUtils::GetString(pWakeUp, "host", strtmp)) entry.host = strtmp; if (XMLUtils::GetString(pWakeUp, "mac", strtmp)) entry.mac = strtmp; if (entry.host.empty()) CLog::Log(LOGERROR, "%s - Missing <host> tag or it's empty", __FUNCTION__); else if (entry.mac.empty()) CLog::Log(LOGERROR, "%s - Missing <mac> tag or it's empty", __FUNCTION__); else { if (XMLUtils::GetInt(pWakeUp, "pingport", tmp, 0, USHRT_MAX)) entry.ping_port = (unsigned short) tmp; if (XMLUtils::GetInt(pWakeUp, "pingmode", tmp, 0, USHRT_MAX)) entry.ping_mode = (unsigned short) tmp; if (XMLUtils::GetInt(pWakeUp, "timeout", tmp, 10, 12 * 60 * 60)) entry.timeout.SetDateTimeSpan (0, 0, 0, tmp); if (XMLUtils::GetInt(pWakeUp, "waitonline", tmp, 0, 10 * 60)) // max 10 minutes entry.wait_online1_sec = tmp; if (XMLUtils::GetInt(pWakeUp, "waitonline2", tmp, 0, 10 * 60)) // max 10 minutes entry.wait_online2_sec = tmp; if (XMLUtils::GetInt(pWakeUp, "waitservices", tmp, 0, 5 * 60)) // max 5 minutes entry.wait_services_sec = tmp; CLog::Log(LOGNOTICE," Registering wakeup entry:"); CLog::Log(LOGNOTICE," HostName : %s", entry.host.c_str()); CLog::Log(LOGNOTICE," MacAddress : %s", entry.mac.c_str()); CLog::Log(LOGNOTICE," PingPort : %d", entry.ping_port); CLog::Log(LOGNOTICE," PingMode : %d", entry.ping_mode); CLog::Log(LOGNOTICE," Timeout : %d (sec)", GetTotalSeconds(entry.timeout)); CLog::Log(LOGNOTICE," WaitForOnline : %d (sec)", entry.wait_online1_sec); CLog::Log(LOGNOTICE," WaitForOnlineEx : %d (sec)", entry.wait_online2_sec); CLog::Log(LOGNOTICE," WaitForServices : %d (sec)", entry.wait_services_sec); m_entries.push_back(entry); } pWakeUp = pWakeUp->NextSiblingElement("wakeup"); // get next one } }
bool CScrobbler::LoadJournal() { int journalVersion = 0; SubmissionJournalEntry entry; CXBMCTinyXML xmlDoc; CStdString JournalFileName = GetJournalFileName(); CSingleLock lock(m_queueLock); m_vecSubmissionQueue.clear(); if (!xmlDoc.LoadFile(JournalFileName)) { CLog::Log(LOGDEBUG, "%s: %s, Line %d (%s)", m_strLogPrefix.c_str(), JournalFileName.c_str(), xmlDoc.ErrorRow(), xmlDoc.ErrorDesc()); return false; } TiXmlElement *pRoot = xmlDoc.RootElement(); if (strcmpi(pRoot->Value(), "asjournal") != 0) { CLog::Log(LOGDEBUG, "%s: %s missing <asjournal>", m_strLogPrefix.c_str(), JournalFileName.c_str()); return false; } if (pRoot->Attribute("version")) journalVersion = atoi(pRoot->Attribute("version")); TiXmlNode *pNode = pRoot->FirstChild("entry"); for (; pNode; pNode = pNode->NextSibling("entry")) { entry.Clear(); XMLUtils::GetString(pNode, "artist", entry.strArtist); XMLUtils::GetString(pNode, "album", entry.strAlbum); XMLUtils::GetString(pNode, "title", entry.strTitle); XMLUtils::GetString(pNode, "length", entry.strLength); entry.length = atoi(entry.strLength.c_str()); XMLUtils::GetString(pNode, "starttime", entry.strStartTime); XMLUtils::GetString(pNode, "musicbrainzid", entry.strMusicBrainzID); if (journalVersion > 0) { XMLUtils::GetString(pNode, "tracknum", entry.strTrackNum); XMLUtils::GetString(pNode, "source", entry.strSource); XMLUtils::GetString(pNode, "rating", entry.strRating); } else { // Update from journal v0 // Convert start time stamp struct tm starttm; time_t startt; if (!strptime(entry.strStartTime.c_str(), "%Y-%m-%d %H:%M:%S", &starttm)) continue; if ((startt = mktime(&starttm)) == -1) continue; entry.strStartTime.Format("%d", startt); // url encode entries CURL::Encode(entry.strArtist); CURL::Encode(entry.strTitle); CURL::Encode(entry.strAlbum); CURL::Encode(entry.strMusicBrainzID); } m_vecSubmissionQueue.push_back(entry); } CLog::Log(LOGDEBUG, "%s: Journal loaded with %"PRIuS" entries.", m_strLogPrefix.c_str(), m_vecSubmissionQueue.size()); return !m_vecSubmissionQueue.empty(); }
bool CPlayerCoreFactory::LoadConfiguration(const std::string &file, bool clear) { CSingleLock lock(m_section); CLog::Log(LOGNOTICE, "Loading player core factory settings from %s.", file.c_str()); if (!XFILE::CFile::Exists(file)) { // tell the user it doesn't exist CLog::Log(LOGNOTICE, "%s does not exist. Skipping.", file.c_str()); return false; } CXBMCTinyXML playerCoreFactoryXML; if (!playerCoreFactoryXML.LoadFile(file)) { CLog::Log(LOGERROR, "Error loading %s, Line %d (%s)", file.c_str(), playerCoreFactoryXML.ErrorRow(), playerCoreFactoryXML.ErrorDesc()); return false; } TiXmlElement *pConfig = playerCoreFactoryXML.RootElement(); if (pConfig == NULL) { CLog::Log(LOGERROR, "Error loading %s, Bad structure", file.c_str()); return false; } if (clear) { for (auto config: m_vecPlayerConfigs) delete config; m_vecPlayerConfigs.clear(); for (auto rule: m_vecCoreSelectionRules) delete rule; m_vecCoreSelectionRules.clear(); // Builtin players CPlayerCoreConfig* VideoPlayer = new CPlayerCoreConfig("VideoPlayer", "video", nullptr); VideoPlayer->m_bPlaysAudio = true; VideoPlayer->m_bPlaysVideo = true; m_vecPlayerConfigs.push_back(VideoPlayer); CPlayerCoreConfig* paplayer = new CPlayerCoreConfig("PAPlayer", "music", nullptr); paplayer->m_bPlaysAudio = true; m_vecPlayerConfigs.push_back(paplayer); } if (!pConfig || strcmpi(pConfig->Value(), "playercorefactory") != 0) { CLog::Log(LOGERROR, "Error loading configuration, no <playercorefactory> node"); return false; } TiXmlElement *pPlayers = pConfig->FirstChildElement("players"); if (pPlayers) { TiXmlElement* pPlayer = pPlayers->FirstChildElement("player"); while (pPlayer) { std::string name = XMLUtils::GetAttribute(pPlayer, "name"); std::string type = XMLUtils::GetAttribute(pPlayer, "type"); if (type.empty()) type = name; StringUtils::ToLower(type); std::string internaltype; if (type == "videoplayer") internaltype = "video"; else if (type == "paplayer") internaltype = "music"; else if (type == "externalplayer") internaltype = "external"; int count = 0; std::string playername = name; while (GetPlayerIndex(playername) >= 0) { count++; std::stringstream itoa; itoa << count; playername = name + itoa.str(); } if (!internaltype.empty()) { m_vecPlayerConfigs.push_back(new CPlayerCoreConfig(playername, internaltype, pPlayer)); } pPlayer = pPlayer->NextSiblingElement("player"); } } TiXmlElement *pRule = pConfig->FirstChildElement("rules"); while (pRule) { const char* szAction = pRule->Attribute("action"); if (szAction) { if (stricmp(szAction, "append") == 0) { m_vecCoreSelectionRules.push_back(new CPlayerSelectionRule(pRule)); } else if (stricmp(szAction, "prepend") == 0) { m_vecCoreSelectionRules.insert(m_vecCoreSelectionRules.begin(), 1, new CPlayerSelectionRule(pRule)); } else { m_vecCoreSelectionRules.clear(); m_vecCoreSelectionRules.push_back(new CPlayerSelectionRule(pRule)); } } else { m_vecCoreSelectionRules.push_back(new CPlayerSelectionRule(pRule)); } pRule = pRule->NextSiblingElement("rules"); } // succeeded - tell the user it worked CLog::Log(LOGNOTICE, "Loaded playercorefactory configuration"); return true; }
// \brief Load the config file (sounds.xml) for nav sounds // Can be located in a folder "sounds" in the skin or from a // subfolder of the folder "sounds" in the root directory of // xbmc bool CGUIAudioManager::Load() { CSingleLock lock(m_cs); UnLoad(); if (CSettings::Get().GetString("lookandfeel.soundskin")=="OFF") return true; else Enable(true); std::string soundSkin = CSettings::Get().GetString("lookandfeel.soundskin"); if (soundSkin == "SKINDEFAULT") { m_strMediaDir = URIUtils::AddFileToFolder(g_SkinInfo->Path(), "sounds"); } else { //check if sound skin is located in home, otherwise fallback to built-ins m_strMediaDir = URIUtils::AddFileToFolder("special://home/sounds", soundSkin); if (!XFILE::CDirectory::Exists(m_strMediaDir)) m_strMediaDir = URIUtils::AddFileToFolder("special://xbmc/sounds", soundSkin); } std::string strSoundsXml = URIUtils::AddFileToFolder(m_strMediaDir, "sounds.xml"); // Load our xml file CXBMCTinyXML xmlDoc; CLog::Log(LOGINFO, "Loading %s", strSoundsXml.c_str()); // Load the config file if (!xmlDoc.LoadFile(strSoundsXml)) { CLog::Log(LOGNOTICE, "%s, Line %d\n%s", strSoundsXml.c_str(), xmlDoc.ErrorRow(), xmlDoc.ErrorDesc()); return false; } TiXmlElement* pRoot = xmlDoc.RootElement(); std::string strValue = pRoot->Value(); if ( strValue != "sounds") { CLog::Log(LOGNOTICE, "%s Doesn't contain <sounds>", strSoundsXml.c_str()); return false; } // Load sounds for actions TiXmlElement* pActions = pRoot->FirstChildElement("actions"); if (pActions) { TiXmlNode* pAction = pActions->FirstChild("action"); while (pAction) { TiXmlNode* pIdNode = pAction->FirstChild("name"); int id = 0; // action identity if (pIdNode && pIdNode->FirstChild()) { CButtonTranslator::TranslateActionString(pIdNode->FirstChild()->Value(), id); } TiXmlNode* pFileNode = pAction->FirstChild("file"); std::string strFile; if (pFileNode && pFileNode->FirstChild()) strFile += pFileNode->FirstChild()->Value(); if (id > 0 && !strFile.empty()) { std::string filename = URIUtils::AddFileToFolder(m_strMediaDir, strFile); IAESound *sound = LoadSound(filename); if (sound) m_actionSoundMap.insert(pair<int, IAESound *>(id, sound)); } pAction = pAction->NextSibling(); } } // Load window specific sounds TiXmlElement* pWindows = pRoot->FirstChildElement("windows"); if (pWindows) { TiXmlNode* pWindow = pWindows->FirstChild("window"); while (pWindow) { int id = 0; TiXmlNode* pIdNode = pWindow->FirstChild("name"); if (pIdNode) { if (pIdNode->FirstChild()) id = CButtonTranslator::TranslateWindow(pIdNode->FirstChild()->Value()); } CWindowSounds sounds; sounds.initSound = LoadWindowSound(pWindow, "activate" ); sounds.deInitSound = LoadWindowSound(pWindow, "deactivate"); if (id > 0) m_windowSoundMap.insert(pair<int, CWindowSounds>(id, sounds)); pWindow = pWindow->NextSibling(); } } return true; }
bool CLangInfo::Load(const std::string& strLanguage) { SetDefaults(); std::string strFileName = GetLanguageInfoPath(strLanguage); CXBMCTinyXML xmlDoc; if (!xmlDoc.LoadFile(strFileName)) { CLog::Log(LOGERROR, "unable to load %s: %s at line %d", strFileName.c_str(), xmlDoc.ErrorDesc(), xmlDoc.ErrorRow()); return false; } // get the matching language addon m_languageAddon = GetLanguageAddon(strLanguage); if (m_languageAddon == NULL) { CLog::Log(LOGERROR, "Unknown language %s", strLanguage.c_str()); return false; } // get some language-specific information from the language addon m_strGuiCharSet = m_languageAddon->GetGuiCharset(); m_forceUnicodeFont = m_languageAddon->ForceUnicodeFont(); m_strSubtitleCharSet = m_languageAddon->GetSubtitleCharset(); m_strDVDMenuLanguage = m_languageAddon->GetDvdMenuLanguage(); m_strDVDAudioLanguage = m_languageAddon->GetDvdAudioLanguage(); m_strDVDSubtitleLanguage = m_languageAddon->GetDvdSubtitleLanguage(); m_sortTokens = m_languageAddon->GetSortTokens(); TiXmlElement* pRootElement = xmlDoc.RootElement(); if (pRootElement->ValueStr() != "language") { CLog::Log(LOGERROR, "%s Doesn't contain <language>", strFileName.c_str()); return false; } if (pRootElement->Attribute("locale")) m_defaultRegion.m_strLangLocaleName = pRootElement->Attribute("locale"); #ifdef TARGET_WINDOWS // Windows need 3 chars isolang code if (m_defaultRegion.m_strLangLocaleName.length() == 2) { if (!g_LangCodeExpander.ConvertISO6391ToISO6392T(m_defaultRegion.m_strLangLocaleName, m_defaultRegion.m_strLangLocaleName, true)) m_defaultRegion.m_strLangLocaleName = ""; } if (!g_LangCodeExpander.ConvertWindowsLanguageCodeToISO6392T(m_defaultRegion.m_strLangLocaleName, m_languageCodeGeneral)) m_languageCodeGeneral = ""; #else if (m_defaultRegion.m_strLangLocaleName.length() != 3) { if (!g_LangCodeExpander.ConvertToISO6392T(m_defaultRegion.m_strLangLocaleName, m_languageCodeGeneral)) m_languageCodeGeneral = ""; } else m_languageCodeGeneral = m_defaultRegion.m_strLangLocaleName; #endif std::string tmp; if (g_LangCodeExpander.ConvertToISO6391(m_defaultRegion.m_strLangLocaleName, tmp)) m_defaultRegion.m_strLangLocaleCodeTwoChar = tmp; const TiXmlNode *pRegions = pRootElement->FirstChild("regions"); if (pRegions && !pRegions->NoChildren()) { const TiXmlElement *pRegion=pRegions->FirstChildElement("region"); while (pRegion) { CRegion region(m_defaultRegion); region.m_strName = XMLUtils::GetAttribute(pRegion, "name"); if (region.m_strName.empty()) region.m_strName="N/A"; if (pRegion->Attribute("locale")) region.m_strRegionLocaleName = pRegion->Attribute("locale"); #ifdef TARGET_WINDOWS // Windows need 3 chars regions code if (region.m_strRegionLocaleName.length() == 2) { if (!g_LangCodeExpander.ConvertISO36111Alpha2ToISO36111Alpha3(region.m_strRegionLocaleName, region.m_strRegionLocaleName)) region.m_strRegionLocaleName = ""; } #endif const TiXmlNode *pDateLong=pRegion->FirstChild("datelong"); if (pDateLong && !pDateLong->NoChildren()) region.m_strDateFormatLong=pDateLong->FirstChild()->ValueStr(); const TiXmlNode *pDateShort=pRegion->FirstChild("dateshort"); if (pDateShort && !pDateShort->NoChildren()) region.m_strDateFormatShort=pDateShort->FirstChild()->ValueStr(); const TiXmlElement *pTime=pRegion->FirstChildElement("time"); if (pTime && !pTime->NoChildren()) { region.m_strTimeFormat=pTime->FirstChild()->Value(); region.m_strMeridiemSymbols[MeridiemSymbolAM] = XMLUtils::GetAttribute(pTime, "symbolAM"); region.m_strMeridiemSymbols[MeridiemSymbolPM] = XMLUtils::GetAttribute(pTime, "symbolPM"); } const TiXmlNode *pTempUnit=pRegion->FirstChild("tempunit"); if (pTempUnit && !pTempUnit->NoChildren()) region.SetTemperatureUnit(pTempUnit->FirstChild()->ValueStr()); const TiXmlNode *pSpeedUnit=pRegion->FirstChild("speedunit"); if (pSpeedUnit && !pSpeedUnit->NoChildren()) region.SetSpeedUnit(pSpeedUnit->FirstChild()->ValueStr()); const TiXmlNode *pTimeZone=pRegion->FirstChild("timezone"); if (pTimeZone && !pTimeZone->NoChildren()) region.SetTimeZone(pTimeZone->FirstChild()->ValueStr()); m_regions.insert(PAIR_REGIONS(region.m_strName, region)); pRegion=pRegion->NextSiblingElement("region"); } const std::string& strName = CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_COUNTRY); SetCurrentRegion(strName); } g_charsetConverter.reinitCharsetsFromSettings(); return true; }
bool CTuxBoxDirectory::GetDirectory(const CStdString& strPath, CFileItemList &items) { // so we know that we have enigma2 static bool enigma2 = false; // Detect and delete slash at end CStdString strRoot = strPath; URIUtils::RemoveSlashAtEnd(strRoot); //Get the request strings CStdString strBQRequest; CStdString strXMLRootString; CStdString strXMLChildString; if(!GetRootAndChildString(strRoot, strBQRequest, strXMLRootString, strXMLChildString)) return false; //Set url Protocol CURL url(strRoot); CStdString strFilter; CStdString protocol = url.GetProtocol(); url.SetProtocol("http"); bool bIsBouquet=false; if (url.HasOption("path")) { // send Zap! return g_tuxbox.ZapToUrl(url, url.GetOption("path")); } else { if (url.HasOption("reference") || enigma2) { //List reference strFilter = url.GetOption("reference"); bIsBouquet = false; //On Empty is Bouquet if (enigma2) { CStdString strPort; strPort.Format(":%i",url.GetPort()); if (strRoot.Right(strPort.GetLength()) != strPort) // If not root dir, enable Channels strFilter = "e2"; // Disable Bouquets for Enigma2 GetRootAndChildStringEnigma2(strBQRequest, strXMLRootString, strXMLChildString); } url.SetOptions(""); url.SetFileName(strBQRequest); } } if(strFilter.IsEmpty()) { url.SetOptions(""); url.SetFileName(strBQRequest); bIsBouquet = true; } //Open CCurlFile http; int iTryConnect = 0; int iWaitTimer = 20; bool result = false; while (iTryConnect < 4) { http.SetTimeout(iWaitTimer); if(http.Open(url)) { //We are connected! iTryConnect = 4; // restore protocol url.SetProtocol(protocol); int size_read = 0; int size_total = (int)http.GetLength(); int data_size = 0; CStdString data; data.reserve(size_total); // read response from server into string buffer char buffer[16384]; while ((size_read = http.Read(buffer, sizeof(buffer)-1)) > 0) { buffer[size_read] = 0; data += buffer; data_size += size_read; } http.Close(); // parse returned xml CXBMCTinyXML doc; data.Replace("></",">-</"); //FILL EMPTY ELEMENTS WITH "-"! doc.Parse(data.c_str()); TiXmlElement *root = doc.RootElement(); if(root == NULL) { CLog::Log(LOGERROR, "%s - Unable to parse xml", __FUNCTION__); CLog::Log(LOGERROR, "%s - Sample follows...\n%s", __FUNCTION__, data.c_str()); return false; } if( strXMLRootString.Equals(root->Value()) && bIsBouquet) { data.Empty(); if (enigma2) result = g_tuxbox.ParseBouquetsEnigma2(root, items, url, strFilter, strXMLChildString); else result = g_tuxbox.ParseBouquets(root, items, url, strFilter, strXMLChildString); } else if( strXMLRootString.Equals(root->Value()) && !strFilter.IsEmpty() ) { data.Empty(); if (enigma2) result = g_tuxbox.ParseChannelsEnigma2(root, items, url, strFilter, strXMLChildString); else result = g_tuxbox.ParseChannels(root, items, url, strFilter, strXMLChildString); } else { CLog::Log(LOGERROR, "%s - Invalid root xml element for TuxBox", __FUNCTION__); CLog::Log(LOGERROR, "%s - Sample follows...\n%s", __FUNCTION__, data.c_str()); data.Empty(); result = false; } } else { CLog::Log(LOGERROR, "%s - Unable to get XML structure! Try count:%i, Wait Timer:%is",__FUNCTION__, iTryConnect, iWaitTimer); iTryConnect++; if (iTryConnect == 2) //try enigma2 instead of enigma1, best entrypoint here i thought { enigma2 = true; GetRootAndChildStringEnigma2(strBQRequest, strXMLRootString, strXMLChildString); url.SetOptions(""); url.SetFileName(strBQRequest); // iTryConnect = 0; iWaitTimer = 20; } else iWaitTimer = iWaitTimer+10; result = false; http.Close(); // Close old connections } } items.SetContent("movies"); return result; }
bool CProfilesManager::LoadProfile(size_t index) { CSingleLock lock(m_critical); // check if the index is valid or not if (index >= m_profiles.size()) return false; // check if the profile is already active if (m_currentProfile == index) return true; // unload any old settings CSettings::Get().Unload(); SetCurrentProfileId(index); // load the new settings if (!CSettings::Get().Load()) { CLog::Log(LOGFATAL, "CProfilesManager: unable to load settings for profile \"%s\"", m_profiles.at(index).getName().c_str()); return false; } CSettings::Get().SetLoaded(); CreateProfileFolders(); // Load the langinfo to have user charset <-> utf-8 conversion string strLanguage = CSettings::Get().GetString("locale.language"); strLanguage[0] = toupper(strLanguage[0]); string strLangInfoPath = StringUtils::Format("special://xbmc/language/%s/langinfo.xml", strLanguage.c_str()); CLog::Log(LOGINFO, "CProfilesManager: load language info file: %s", strLangInfoPath.c_str()); g_langInfo.Load(strLangInfoPath); CButtonTranslator::GetInstance().Load(true); g_localizeStrings.Load("special://xbmc/language/", strLanguage); CDatabaseManager::Get().Initialize(); g_Mouse.SetEnabled(CSettings::Get().GetBool("input.enablemouse")); g_infoManager.ResetCache(); g_infoManager.ResetLibraryBools(); // always reload the skin - we need it for the new language strings g_application.ReloadSkin(); if (m_currentProfile != 0) { CXBMCTinyXML doc; if (doc.LoadFile(URIUtils::AddFileToFolder(GetUserDataFolder(), "guisettings.xml"))) { CSettings::Get().LoadSetting(doc.RootElement(), "masterlock.maxretries"); CSettings::Get().LoadSetting(doc.RootElement(), "masterlock.startuplock"); } } CPasswordManager::GetInstance().Clear(); // to set labels - shares are reloaded #if !defined(TARGET_WINDOWS) && defined(HAS_DVD_DRIVE) MEDIA_DETECT::CDetectDVDMedia::UpdateState(); #endif // init windows CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_WINDOW_RESET); g_windowManager.SendMessage(msg); CUtil::DeleteDirectoryCache(); g_directoryCache.Clear(); return true; }
bool CVideoInfoTag::Save(TiXmlNode *node, const CStdString &tag, bool savePathInfo, const TiXmlElement *additionalNode) { if (!node) return false; // we start with a <tag> tag TiXmlElement movieElement(tag.c_str()); TiXmlNode *movie = node->InsertEndChild(movieElement); if (!movie) return false; XMLUtils::SetString(movie, "title", m_strTitle); if (!m_strOriginalTitle.IsEmpty()) XMLUtils::SetString(movie, "originaltitle", m_strOriginalTitle); if (!m_strShowTitle.IsEmpty()) XMLUtils::SetString(movie, "showtitle", m_strShowTitle); if (!m_strSortTitle.IsEmpty()) XMLUtils::SetString(movie, "sorttitle", m_strSortTitle); XMLUtils::SetFloat(movie, "rating", m_fRating); XMLUtils::SetFloat(movie, "epbookmark", m_fEpBookmark); XMLUtils::SetInt(movie, "year", m_iYear); XMLUtils::SetInt(movie, "top250", m_iTop250); if (tag == "episodedetails" || tag == "tvshow") { XMLUtils::SetInt(movie, "season", m_iSeason); XMLUtils::SetInt(movie, "episode", m_iEpisode); XMLUtils::SetString(movie, "uniqueid", m_strUniqueId); XMLUtils::SetInt(movie, "displayseason",m_iSpecialSortSeason); XMLUtils::SetInt(movie, "displayepisode",m_iSpecialSortEpisode); } if (tag == "musicvideo") { XMLUtils::SetInt(movie, "track", m_iTrack); XMLUtils::SetString(movie, "album", m_strAlbum); } XMLUtils::SetString(movie, "votes", m_strVotes); XMLUtils::SetString(movie, "outline", m_strPlotOutline); XMLUtils::SetString(movie, "plot", m_strPlot); XMLUtils::SetString(movie, "tagline", m_strTagLine); XMLUtils::SetInt(movie, "runtime", GetDuration() / 60); if (!m_strPictureURL.m_xml.empty()) { CXBMCTinyXML doc; doc.Parse(m_strPictureURL.m_xml); const TiXmlNode* thumb = doc.FirstChild("thumb"); while (thumb) { movie->InsertEndChild(*thumb); thumb = thumb->NextSibling("thumb"); } } if (m_fanart.m_xml.size()) { CXBMCTinyXML doc; doc.Parse(m_fanart.m_xml); movie->InsertEndChild(*doc.RootElement()); } XMLUtils::SetString(movie, "mpaa", m_strMPAARating); XMLUtils::SetInt(movie, "playcount", m_playCount); XMLUtils::SetDate(movie, "lastplayed", m_lastPlayed); if (savePathInfo) { XMLUtils::SetString(movie, "file", m_strFile); XMLUtils::SetString(movie, "path", m_strPath); XMLUtils::SetString(movie, "filenameandpath", m_strFileNameAndPath); XMLUtils::SetString(movie, "basepath", m_basePath); } if (!m_strEpisodeGuide.IsEmpty()) { CXBMCTinyXML doc; doc.Parse(m_strEpisodeGuide); if (doc.RootElement()) movie->InsertEndChild(*doc.RootElement()); else XMLUtils::SetString(movie, "episodeguide", m_strEpisodeGuide); } XMLUtils::SetString(movie, "id", m_strIMDBNumber); XMLUtils::SetStringArray(movie, "genre", m_genre); XMLUtils::SetStringArray(movie, "country", m_country); XMLUtils::SetString(movie, "set", m_strSet); XMLUtils::SetStringArray(movie, "tag", m_tags); XMLUtils::SetStringArray(movie, "credits", m_writingCredits); XMLUtils::SetStringArray(movie, "director", m_director); XMLUtils::SetDate(movie, "premiered", m_premiered); XMLUtils::SetString(movie, "status", m_strStatus); XMLUtils::SetString(movie, "code", m_strProductionCode); XMLUtils::SetDate(movie, "aired", m_firstAired); XMLUtils::SetStringArray(movie, "studio", m_studio); XMLUtils::SetString(movie, "trailer", m_strTrailer); if (m_streamDetails.HasItems()) { // it goes fileinfo/streamdetails/[video|audio|subtitle] TiXmlElement fileinfo("fileinfo"); TiXmlElement streamdetails("streamdetails"); for (int iStream=1; iStream<=m_streamDetails.GetVideoStreamCount(); iStream++) { TiXmlElement stream("video"); XMLUtils::SetString(&stream, "codec", m_streamDetails.GetVideoCodec(iStream)); XMLUtils::SetFloat(&stream, "aspect", m_streamDetails.GetVideoAspect(iStream)); XMLUtils::SetInt(&stream, "width", m_streamDetails.GetVideoWidth(iStream)); XMLUtils::SetInt(&stream, "height", m_streamDetails.GetVideoHeight(iStream)); XMLUtils::SetInt(&stream, "durationinseconds", m_streamDetails.GetVideoDuration(iStream)); streamdetails.InsertEndChild(stream); } for (int iStream=1; iStream<=m_streamDetails.GetAudioStreamCount(); iStream++) { TiXmlElement stream("audio"); XMLUtils::SetString(&stream, "codec", m_streamDetails.GetAudioCodec(iStream)); XMLUtils::SetString(&stream, "language", m_streamDetails.GetAudioLanguage(iStream)); XMLUtils::SetInt(&stream, "channels", m_streamDetails.GetAudioChannels(iStream)); streamdetails.InsertEndChild(stream); } for (int iStream=1; iStream<=m_streamDetails.GetSubtitleStreamCount(); iStream++) { TiXmlElement stream("subtitle"); XMLUtils::SetString(&stream, "language", m_streamDetails.GetSubtitleLanguage(iStream)); streamdetails.InsertEndChild(stream); } fileinfo.InsertEndChild(streamdetails); movie->InsertEndChild(fileinfo); } /* if has stream details */ // cast for (iCast it = m_cast.begin(); it != m_cast.end(); ++it) { // add a <actor> tag TiXmlElement cast("actor"); TiXmlNode *node = movie->InsertEndChild(cast); TiXmlElement actor("name"); TiXmlNode *actorNode = node->InsertEndChild(actor); TiXmlText name(it->strName); actorNode->InsertEndChild(name); TiXmlElement role("role"); TiXmlNode *roleNode = node->InsertEndChild(role); TiXmlText character(it->strRole); roleNode->InsertEndChild(character); TiXmlElement thumb("thumb"); TiXmlNode *thumbNode = node->InsertEndChild(thumb); TiXmlText th(it->thumbUrl.GetFirstThumb().m_url); thumbNode->InsertEndChild(th); } XMLUtils::SetStringArray(movie, "artist", m_artist); XMLUtils::SetStringArray(movie, "showlink", m_showLink); TiXmlElement resume("resume"); XMLUtils::SetFloat(&resume, "position", (float)m_resumePoint.timeInSeconds); XMLUtils::SetFloat(&resume, "total", (float)m_resumePoint.totalTimeInSeconds); movie->InsertEndChild(resume); XMLUtils::SetString(movie, "dateadded", m_dateAdded.GetAsDBDateTime()); if (additionalNode) movie->InsertEndChild(*additionalNode); return true; }
bool CPlayerCoreFactory::LoadConfiguration(const std::string &file, bool clear) { CSingleLock lock(m_section); CLog::Log(LOGNOTICE, "Loading player core factory settings from %s.", file.c_str()); if (!XFILE::CFile::Exists(file)) { // tell the user it doesn't exist CLog::Log(LOGNOTICE, "%s does not exist. Skipping.", file.c_str()); return false; } CXBMCTinyXML playerCoreFactoryXML; if (!playerCoreFactoryXML.LoadFile(file)) { CLog::Log(LOGERROR, "Error loading %s, Line %d (%s)", file.c_str(), playerCoreFactoryXML.ErrorRow(), playerCoreFactoryXML.ErrorDesc()); return false; } TiXmlElement *pConfig = playerCoreFactoryXML.RootElement(); if (pConfig == NULL) { CLog::Log(LOGERROR, "Error loading %s, Bad structure", file.c_str()); return false; } if (clear) { for(std::vector<CPlayerCoreConfig *>::iterator it = m_vecCoreConfigs.begin(); it != m_vecCoreConfigs.end(); ++it) delete *it; m_vecCoreConfigs.clear(); // Builtin players; hard-coded because re-ordering them would break scripts CPlayerCoreConfig* dvdplayer = new CPlayerCoreConfig("DVDPlayer", EPC_DVDPLAYER, NULL); dvdplayer->m_bPlaysAudio = dvdplayer->m_bPlaysVideo = true; m_vecCoreConfigs.push_back(dvdplayer); // Don't remove this, its a placeholder for the old MPlayer core, it would break scripts CPlayerCoreConfig* mplayer = new CPlayerCoreConfig("oldmplayercore", EPC_DVDPLAYER, NULL); m_vecCoreConfigs.push_back(mplayer); CPlayerCoreConfig* paplayer = new CPlayerCoreConfig("PAPlayer", EPC_PAPLAYER, NULL); paplayer->m_bPlaysAudio = true; m_vecCoreConfigs.push_back(paplayer); for(std::vector<CPlayerSelectionRule *>::iterator it = m_vecCoreSelectionRules.begin(); it != m_vecCoreSelectionRules.end(); ++it) delete *it; m_vecCoreSelectionRules.clear(); } if (!pConfig || strcmpi(pConfig->Value(),"playercorefactory") != 0) { CLog::Log(LOGERROR, "Error loading configuration, no <playercorefactory> node"); return false; } TiXmlElement *pPlayers = pConfig->FirstChildElement("players"); if (pPlayers) { TiXmlElement* pPlayer = pPlayers->FirstChildElement("player"); while (pPlayer) { std::string name = XMLUtils::GetAttribute(pPlayer, "name"); std::string type = XMLUtils::GetAttribute(pPlayer, "type"); if (type.empty()) type = name; StringUtils::ToLower(type); EPLAYERCORES eCore = EPC_NONE; if (type == "dvdplayer" || type == "mplayer") eCore = EPC_DVDPLAYER; if (type == "paplayer" ) eCore = EPC_PAPLAYER; if (type == "externalplayer" ) eCore = EPC_EXTPLAYER; if (eCore != EPC_NONE) { m_vecCoreConfigs.push_back(new CPlayerCoreConfig(name, eCore, pPlayer)); } pPlayer = pPlayer->NextSiblingElement("player"); } } TiXmlElement *pRule = pConfig->FirstChildElement("rules"); while (pRule) { const char* szAction = pRule->Attribute("action"); if (szAction) { if (stricmp(szAction, "append") == 0) { m_vecCoreSelectionRules.push_back(new CPlayerSelectionRule(pRule)); } else if (stricmp(szAction, "prepend") == 0) { m_vecCoreSelectionRules.insert(m_vecCoreSelectionRules.begin(), 1, new CPlayerSelectionRule(pRule)); } else { m_vecCoreSelectionRules.clear(); m_vecCoreSelectionRules.push_back(new CPlayerSelectionRule(pRule)); } } else { m_vecCoreSelectionRules.push_back(new CPlayerSelectionRule(pRule)); } pRule = pRule->NextSiblingElement("rules"); } // succeeded - tell the user it worked CLog::Log(LOGNOTICE, "Loaded playercorefactory configuration"); return true; }
void CSlingboxFile::LoadSettings(const CStdString& strHostname) { // Load default settings m_sSlingboxSettings.strHostname = strHostname; m_sSlingboxSettings.iVideoWidth = 320; m_sSlingboxSettings.iVideoHeight = 240; m_sSlingboxSettings.iVideoResolution = (int)CSlingbox::RESOLUTION320X240; m_sSlingboxSettings.iVideoBitrate = 704; m_sSlingboxSettings.iVideoFramerate = 30; m_sSlingboxSettings.iVideoSmoothing = 50; m_sSlingboxSettings.iAudioBitrate = 64; m_sSlingboxSettings.iIFrameInterval = 10; m_sSlingboxSettings.uiCodeChannelUp = 0; m_sSlingboxSettings.uiCodeChannelDown = 0; for (unsigned int i = 0; i < 10; i++) m_sSlingboxSettings.uiCodeNumber[i] = 0; // Check if a SlingboxSettings.xml file exists CStdString slingboxXMLFile = g_settings.GetUserDataItem("SlingboxSettings.xml"); if (!CFile::Exists(slingboxXMLFile)) { CLog::Log(LOGNOTICE, "No SlingboxSettings.xml file (%s) found - using default settings", slingboxXMLFile.c_str()); return; } // Load the XML file CXBMCTinyXML slingboxXML; if (!slingboxXML.LoadFile(slingboxXMLFile)) { CLog::Log(LOGERROR, "%s - Error loading %s - line %d\n%s", __FUNCTION__, slingboxXMLFile.c_str(), slingboxXML.ErrorRow(), slingboxXML.ErrorDesc()); return; } // Check to make sure layout is correct TiXmlElement * pRootElement = slingboxXML.RootElement(); if (!pRootElement || strcmpi(pRootElement->Value(), "slingboxsettings") != 0) { CLog::Log(LOGERROR, "%s - Error loading %s - no <slingboxsettings> node found", __FUNCTION__, slingboxXMLFile.c_str()); return; } // Success so far CLog::Log(LOGNOTICE, "Loaded SlingboxSettings.xml from %s", slingboxXMLFile.c_str()); // Search for the first settings that specify no hostname or match our hostname TiXmlElement *pElement; for (pElement = pRootElement->FirstChildElement("slingbox"); pElement; pElement = pElement->NextSiblingElement("slingbox")) { if (pElement->Attribute("hostname") == NULL || !m_sSlingboxSettings.strHostname.CompareNoCase(pElement->Attribute("hostname"))) { // Load setting values XMLUtils::GetInt(pElement, "width", m_sSlingboxSettings.iVideoWidth, 0, 640); XMLUtils::GetInt(pElement, "height", m_sSlingboxSettings.iVideoHeight, 0, 480); XMLUtils::GetInt(pElement, "videobitrate", m_sSlingboxSettings.iVideoBitrate, 50, 8000); XMLUtils::GetInt(pElement, "framerate", m_sSlingboxSettings.iVideoFramerate, 1, 30); XMLUtils::GetInt(pElement, "smoothing", m_sSlingboxSettings.iVideoSmoothing, 0, 100); XMLUtils::GetInt(pElement, "audiobitrate", m_sSlingboxSettings.iAudioBitrate, 16, 96); XMLUtils::GetInt(pElement, "iframeinterval", m_sSlingboxSettings.iIFrameInterval, 1, 30); // Load any button code values TiXmlElement * pCodes = pElement->FirstChildElement("buttons"); if (pCodes) { XMLUtils::GetHex(pCodes, "channelup", m_sSlingboxSettings.uiCodeChannelUp); XMLUtils::GetHex(pCodes, "channeldown", m_sSlingboxSettings.uiCodeChannelDown); XMLUtils::GetHex(pCodes, "zero", m_sSlingboxSettings.uiCodeNumber[0]); XMLUtils::GetHex(pCodes, "one", m_sSlingboxSettings.uiCodeNumber[1]); XMLUtils::GetHex(pCodes, "two", m_sSlingboxSettings.uiCodeNumber[2]); XMLUtils::GetHex(pCodes, "three", m_sSlingboxSettings.uiCodeNumber[3]); XMLUtils::GetHex(pCodes, "four", m_sSlingboxSettings.uiCodeNumber[4]); XMLUtils::GetHex(pCodes, "five", m_sSlingboxSettings.uiCodeNumber[5]); XMLUtils::GetHex(pCodes, "six", m_sSlingboxSettings.uiCodeNumber[6]); XMLUtils::GetHex(pCodes, "seven", m_sSlingboxSettings.uiCodeNumber[7]); XMLUtils::GetHex(pCodes, "eight", m_sSlingboxSettings.uiCodeNumber[8]); XMLUtils::GetHex(pCodes, "nine", m_sSlingboxSettings.uiCodeNumber[9]); } break; } } // Prepare our resolution enum mapping array const struct { unsigned int uiWidth; unsigned int uiHeight; CSlingbox::Resolution eEnum; } m_resolutionMap[11] = { {0, 0, CSlingbox::NOVIDEO}, {128, 96, CSlingbox::RESOLUTION128X96}, {160, 120, CSlingbox::RESOLUTION160X120}, {176, 120, CSlingbox::RESOLUTION176X120}, {224, 176, CSlingbox::RESOLUTION224X176}, {256, 192, CSlingbox::RESOLUTION256X192}, {320, 240, CSlingbox::RESOLUTION320X240}, {352, 240, CSlingbox::RESOLUTION352X240}, {320, 480, CSlingbox::RESOLUTION320X480}, {640, 240, CSlingbox::RESOLUTION640X240}, {640, 480, CSlingbox::RESOLUTION640X480} }; // See if the specified resolution matches something in our mapping array and // setup things accordingly for (unsigned int i = 0; i < 11; i++) { if (m_sSlingboxSettings.iVideoWidth == (int)m_resolutionMap[i].uiWidth && m_sSlingboxSettings.iVideoHeight == (int)m_resolutionMap[i].uiHeight) { m_sSlingboxSettings.iVideoResolution = (int)m_resolutionMap[i].eEnum; return; } } // If it didn't match anything setup safe defaults CLog::Log(LOGERROR, "%s - Defaulting to 320x240 resolution due to invalid " "resolution specified in SlingboxSettings.xml for Slingbox: %s", __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); m_sSlingboxSettings.iVideoWidth = 320; m_sSlingboxSettings.iVideoHeight = 240; m_sSlingboxSettings.iVideoResolution = (int)CSlingbox::RESOLUTION320X240; }
void GUIFontManager::LoadFonts(const CStdString& strFontSet) { CXBMCTinyXML xmlDoc; if (!OpenFontFile(xmlDoc)) return; TiXmlElement* pRootElement = xmlDoc.RootElement(); const TiXmlNode *pChild = pRootElement->FirstChild(); // If there are no fontset's defined in the XML (old skin format) run in backward compatibility // and ignore the fontset request CStdString strValue = pChild->Value(); if (strValue == "fontset") { CStdString foundTTF; while (pChild) { strValue = pChild->Value(); if (strValue == "fontset") { const char* idAttr = ((TiXmlElement*) pChild)->Attribute("id"); const char* unicodeAttr = ((TiXmlElement*) pChild)->Attribute("unicode"); if (foundTTF.empty() && idAttr != NULL && unicodeAttr != NULL && stricmp(unicodeAttr, "true") == 0) foundTTF = idAttr; // Check if this is the fontset that we want if (idAttr != NULL && stricmp(strFontSet.c_str(), idAttr) == 0) { m_fontsetUnicode=false; // Check if this is the a ttf fontset if (unicodeAttr != NULL && stricmp(unicodeAttr, "true") == 0) m_fontsetUnicode=true; if (m_fontsetUnicode) { LoadFonts(pChild->FirstChild()); break; } } } pChild = pChild->NextSibling(); } // If no fontset was loaded if (pChild == NULL) { CLog::Log(LOGWARNING, "file doesnt have <fontset> with name '%s', defaulting to first fontset", strFontSet.c_str()); if (!foundTTF.empty()) LoadFonts(foundTTF); } } else { CLog::Log(LOGERROR, "file doesnt have <fontset> in <fonts>, but rather %s", strValue.c_str()); return ; } }
bool CProfilesManager::LoadProfile(unsigned int index) { PrepareLoadProfile(index); if (index == 0 && IsMasterProfile()) { CGUIWindow* pWindow = CServiceBroker::GetGUI()->GetWindowManager().GetWindow(WINDOW_HOME); if (pWindow) pWindow->ResetControlStates(); UpdateCurrentProfileDate(); Save(); FinalizeLoadProfile(); return true; } CSingleLock lock(m_critical); // check if the index is valid or not if (index >= m_profiles.size()) return false; // check if the profile is already active if (m_currentProfile == index) return true; // save any settings of the currently used skin but only if the (master) // profile hasn't just been loaded as a temporary profile for login if (g_SkinInfo != nullptr && !m_profileLoadedForLogin) g_SkinInfo->SaveSettings(); // unload any old settings CServiceBroker::GetSettings()->Unload(); SetCurrentProfileId(index); m_profileLoadedForLogin = false; // load the new settings if (!CServiceBroker::GetSettings()->Load()) { CLog::Log(LOGFATAL, "CProfilesManager: unable to load settings for profile \"%s\"", m_profiles.at(index).getName().c_str()); return false; } CServiceBroker::GetSettings()->SetLoaded(); CreateProfileFolders(); CServiceBroker::GetDatabaseManager().Initialize(); CServiceBroker::GetInputManager().LoadKeymaps(); CServiceBroker::GetInputManager().SetMouseEnabled(CServiceBroker::GetSettings()->GetBool(CSettings::SETTING_INPUT_ENABLEMOUSE)); CGUIComponent* gui = CServiceBroker::GetGUI(); if (gui) { CGUIInfoManager& infoMgr = gui->GetInfoManager(); infoMgr.ResetCache(); infoMgr.GetInfoProviders().GetGUIControlsInfoProvider().ResetContainerMovingCache(); infoMgr.GetInfoProviders().GetLibraryInfoProvider().ResetLibraryBools(); } if (m_currentProfile != 0) { CXBMCTinyXML doc; if (doc.LoadFile(URIUtils::AddFileToFolder(GetUserDataFolder(), "guisettings.xml"))) { CServiceBroker::GetSettings()->LoadSetting(doc.RootElement(), CSettings::SETTING_MASTERLOCK_MAXRETRIES); CServiceBroker::GetSettings()->LoadSetting(doc.RootElement(), CSettings::SETTING_MASTERLOCK_STARTUPLOCK); } } CPasswordManager::GetInstance().Clear(); // to set labels - shares are reloaded #if !defined(TARGET_WINDOWS) && defined(HAS_DVD_DRIVE) MEDIA_DETECT::CDetectDVDMedia::UpdateState(); #endif // init windows CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_WINDOW_RESET); CServiceBroker::GetGUI()->GetWindowManager().SendMessage(msg); CUtil::DeleteDirectoryCache(); g_directoryCache.Clear(); lock.Leave(); UpdateCurrentProfileDate(); Save(); FinalizeLoadProfile(); return true; }
bool CEdl::ReadBeyondTV(const std::string& strMovie) { Clear(); std::string beyondTVFilename(URIUtils::ReplaceExtension(strMovie, URIUtils::GetExtension(strMovie) + ".chapters.xml")); if (!CFile::Exists(beyondTVFilename)) return false; CXBMCTinyXML xmlDoc; if (!xmlDoc.LoadFile(beyondTVFilename)) { CLog::Log(LOGERROR, "%s - Could not load Beyond TV file: %s. %s", __FUNCTION__, beyondTVFilename.c_str(), xmlDoc.ErrorDesc()); return false; } if (xmlDoc.Error()) { CLog::Log(LOGERROR, "%s - Could not parse Beyond TV file: %s. %s", __FUNCTION__, beyondTVFilename.c_str(), xmlDoc.ErrorDesc()); return false; } TiXmlElement *pRoot = xmlDoc.RootElement(); if (!pRoot || strcmp(pRoot->Value(), "cutlist")) { CLog::Log(LOGERROR, "%s - Invalid Beyond TV file: %s. Expected root node to be <cutlist>", __FUNCTION__, beyondTVFilename.c_str()); return false; } bool bValid = true; TiXmlElement *pRegion = pRoot->FirstChildElement("Region"); while (bValid && pRegion) { TiXmlElement *pStart = pRegion->FirstChildElement("start"); TiXmlElement *pEnd = pRegion->FirstChildElement("end"); if (pStart && pEnd && pStart->FirstChild() && pEnd->FirstChild()) { /* * Need to divide the start and end times by a factor of 10,000 to get msec. * E.g. <start comment="00:02:44.9980867">1649980867</start> * * Use atof so doesn't overflow 32 bit float or integer / long. * E.g. <end comment="0:26:49.0000009">16090090000</end> * * Don't use atoll even though it is more correct as it isn't natively supported by * Visual Studio. * * atof() returns 0 if there were any problems and will subsequently be rejected in AddCut(). */ Cut cut; cut.start = (int64_t)(atof(pStart->FirstChild()->Value()) / 10000); cut.end = (int64_t)(atof(pEnd->FirstChild()->Value()) / 10000); cut.action = COMM_BREAK; bValid = AddCut(cut); } else bValid = false; pRegion = pRegion->NextSiblingElement("Region"); } if (!bValid) { CLog::Log(LOGERROR, "%s - Invalid Beyond TV file: %s. Clearing any valid commercial breaks found.", __FUNCTION__, beyondTVFilename.c_str()); Clear(); return false; } else if (HasCut()) { CLog::Log(LOGDEBUG, "%s - Read %" PRIuS" commercial breaks from Beyond TV file: %s", __FUNCTION__, m_vecCuts.size(), beyondTVFilename.c_str()); return true; } else { CLog::Log(LOGDEBUG, "%s - No commercial breaks found in Beyond TV file: %s", __FUNCTION__, beyondTVFilename.c_str()); return false; } }
bool CLastFmManager::RequestRadioTracks() { unsigned int start = XbmcThreads::SystemClockMillis(); CStdString url; CStdString html; url.Format("http://" + m_RadioBaseUrl + m_RadioBasePath + "/xspf.php?sk=%s&discovery=0&desktop=", m_RadioSession); { CCurlFile http; if (!http.Get(url, html)) { m_RadioSession.empty(); CLog::Log(LOGERROR, "LastFmManager: Connect to Last.fm to request tracks failed."); return false; } } //CLog::Log(LOGDEBUG, "RequestRadioTracks: %s", html.c_str()); //parse playlist CXBMCTinyXML xmlDoc; xmlDoc.Parse(html); if (xmlDoc.Error()) { m_RadioSession.empty(); CLog::Log(LOGERROR, "LastFmManager: Unable to parse tracklist Error: %s", xmlDoc.ErrorDesc()); return false; } TiXmlElement* pRootElement = xmlDoc.RootElement(); if (!pRootElement ) { CLog::Log(LOGWARNING, "LastFmManager: No more tracks received"); m_RadioSession.empty(); return false; } TiXmlElement* pBodyElement = pRootElement->FirstChildElement("trackList"); if (!pBodyElement ) { CLog::Log(LOGWARNING, "LastFmManager: No more tracks received, no tracklist"); m_RadioSession.empty(); return false; } TiXmlElement* pTrackElement = pBodyElement->FirstChildElement("track"); if (!pTrackElement) { CLog::Log(LOGWARNING, "LastFmManager: No more tracks received, empty tracklist"); m_RadioSession.empty(); return false; } while (pTrackElement) { CFileItemPtr newItem(new CFileItem); TiXmlElement* pElement = pTrackElement->FirstChildElement("location"); if (pElement) { TiXmlNode* child = pElement->FirstChild(); if (child) { CStdString url = child->Value(); url.Replace("http:", "lastfm:"); newItem->SetPath(url); } } pElement = pTrackElement->FirstChildElement("title"); if (pElement) { TiXmlNode* child = pElement->FirstChild(); if (child) { newItem->SetLabel(child->Value()); newItem->GetMusicInfoTag()->SetTitle(child->Value()); } } pElement = pTrackElement->FirstChildElement("creator"); if (pElement) { TiXmlNode* child = pElement->FirstChild(); if (child) { newItem->GetMusicInfoTag()->SetArtist(child->Value()); } } pElement = pTrackElement->FirstChildElement("album"); if (pElement) { TiXmlNode* child = pElement->FirstChild(); if (child) { newItem->GetMusicInfoTag()->SetAlbum(child->Value()); } } pElement = pTrackElement->FirstChildElement("duration"); if (pElement) { TiXmlNode* child = pElement->FirstChild(); if (child) { int iDuration = atoi(child->Value())/1000; newItem->GetMusicInfoTag()->SetDuration(iDuration); } } newItem->FillInDefaultIcon(); pElement = pTrackElement->FirstChildElement("image"); if (pElement) { TiXmlNode* child = pElement->FirstChild(); if (child) { CStdString coverUrl = child->Value(); if ((coverUrl != "") && (coverUrl.Find("noimage") == -1) && (coverUrl.Right(1) != "/")) { newItem->SetThumbnailImage(coverUrl); } } } //trackauth is needed for validating the track when scrobbling pElement = pTrackElement->FirstChildElement("lastfm:trackauth"); if (pElement) { TiXmlNode* child = pElement->FirstChild(); if (child) { CStdString trackAuth = child->Value(); //abuse comment field for the track authcode newItem->GetMusicInfoTag()->SetComment(trackAuth); } } { CSingleLock lock(m_lockCache); m_RadioTrackQueue->Add(newItem); } pTrackElement = pTrackElement->NextSiblingElement(); } //end parse CSingleLock lock(m_lockCache); int iNrCachedTracks = m_RadioTrackQueue->size(); CLog::Log(LOGDEBUG, "%s: Done (time: %i ms)", __FUNCTION__, (int)(XbmcThreads::SystemClockMillis() - start)); return iNrCachedTracks > 0; }
bool CProfilesManager::Load(const std::string &file) { CSingleLock lock(m_critical); bool ret = true; // clear out our profiles m_profiles.clear(); if (CFile::Exists(file)) { CXBMCTinyXML profilesDoc; if (profilesDoc.LoadFile(file)) { const TiXmlElement *rootElement = profilesDoc.RootElement(); if (rootElement && StringUtils::EqualsNoCase(rootElement->Value(), XML_PROFILES)) { XMLUtils::GetUInt(rootElement, XML_LAST_LOADED, m_lastUsedProfile); XMLUtils::GetBoolean(rootElement, XML_LOGIN_SCREEN, m_usingLoginScreen); XMLUtils::GetInt(rootElement, XML_AUTO_LOGIN, m_autoLoginProfile); XMLUtils::GetInt(rootElement, XML_NEXTID, m_nextProfileId); CStdString defaultDir("special://home/userdata"); if (!CDirectory::Exists(defaultDir)) defaultDir = "special://xbmc/userdata"; const TiXmlElement* pProfile = rootElement->FirstChildElement(XML_PROFILE); while (pProfile) { CProfile profile(defaultDir); profile.Load(pProfile, GetNextProfileId()); AddProfile(profile); pProfile = pProfile->NextSiblingElement(XML_PROFILE); } } else { CLog::Log(LOGERROR, "CProfilesManager: error loading %s, no <profiles> node", file.c_str()); ret = false; } } else { CLog::Log(LOGERROR, "CProfilesManager: error loading %s, Line %d\n%s", file.c_str(), profilesDoc.ErrorRow(), profilesDoc.ErrorDesc()); ret = false; } } if (m_profiles.empty()) { // add the master user CProfile profile("special://masterprofile/", "Master user", 0); AddProfile(profile); } // check the validity of the previous profile index if (m_lastUsedProfile >= m_profiles.size()) m_lastUsedProfile = 0; SetCurrentProfileId(m_lastUsedProfile); // check the validity of the auto login profile index if (m_autoLoginProfile < -1 || m_autoLoginProfile >= (int)m_profiles.size()) m_autoLoginProfile = -1; else if (m_autoLoginProfile >= 0) SetCurrentProfileId(m_autoLoginProfile); // the login screen runs as the master profile, so if we're using this, we need to ensure // we switch to the master profile if (m_usingLoginScreen) SetCurrentProfileId(0); return ret; }
bool CPlayListASX::LoadData(istream& stream) { CLog::Log(LOGNOTICE, "Parsing ASX"); if(stream.peek() == '[') { return LoadAsxIniInfo(stream); } else { CXBMCTinyXML xmlDoc; stream >> xmlDoc; if (xmlDoc.Error()) { CLog::Log(LOGERROR, "Unable to parse ASX info Error: %s", xmlDoc.ErrorDesc()); return false; } TiXmlElement *pRootElement = xmlDoc.RootElement(); // lowercase every element TiXmlNode *pNode = pRootElement; TiXmlNode *pChild = NULL; CStdString value; value = pNode->Value(); value.ToLower(); pNode->SetValue(value); while(pNode) { pChild = pNode->IterateChildren(pChild); if(pChild) { if (pChild->Type() == TiXmlNode::TINYXML_ELEMENT) { value = pChild->Value(); value.ToLower(); pChild->SetValue(value); TiXmlAttribute* pAttr = pChild->ToElement()->FirstAttribute(); while(pAttr) { value = pAttr->Name(); value.ToLower(); pAttr->SetName(value); pAttr = pAttr->Next(); } } pNode = pChild; pChild = NULL; continue; } pChild = pNode; pNode = pNode->Parent(); } CStdString roottitle = ""; TiXmlElement *pElement = pRootElement->FirstChildElement(); while (pElement) { value = pElement->Value(); if (value == "title") { roottitle = pElement->GetText(); } else if (value == "entry") { CStdString title(roottitle); TiXmlElement *pRef = pElement->FirstChildElement("ref"); TiXmlElement *pTitle = pElement->FirstChildElement("title"); if(pTitle) title = pTitle->GetText(); while (pRef) { // multiple references may apear for one entry // duration may exist on this level too value = pRef->Attribute("href"); if (value != "") { if(title.IsEmpty()) title = value; CLog::Log(LOGINFO, "Adding element %s, %s", title.c_str(), value.c_str()); CFileItemPtr newItem(new CFileItem(title)); newItem->SetPath(value); Add(newItem); } pRef = pRef->NextSiblingElement("ref"); } } else if (value == "entryref") { value = pElement->Attribute("href"); if (value != "") { // found an entryref, let's try loading that url auto_ptr<CPlayList> playlist(CPlayListFactory::Create(value)); if (NULL != playlist.get()) if (playlist->Load(value)) Add(*playlist); } } pElement = pElement->NextSiblingElement(); } } return true; }
bool CLangInfo::Load(const CStdString& strFileName) { SetDefaults(); CXBMCTinyXML xmlDoc; if (!xmlDoc.LoadFile(strFileName)) { CLog::Log(LOGERROR, "unable to load %s: %s at line %d", strFileName.c_str(), xmlDoc.ErrorDesc(), xmlDoc.ErrorRow()); return false; } TiXmlElement* pRootElement = xmlDoc.RootElement(); CStdString strValue = pRootElement->Value(); if (strValue != CStdString("language")) { CLog::Log(LOGERROR, "%s Doesn't contain <language>", strFileName.c_str()); return false; } if (pRootElement->Attribute("locale")) m_defaultRegion.m_strLangLocaleName = pRootElement->Attribute("locale"); #ifdef _WIN32 // Windows need 3 chars isolang code if (m_defaultRegion.m_strLangLocaleName.length() == 2) { if (! g_LangCodeExpander.ConvertTwoToThreeCharCode(m_defaultRegion.m_strLangLocaleName, m_defaultRegion.m_strLangLocaleName, true)) m_defaultRegion.m_strLangLocaleName = ""; } if (!g_LangCodeExpander.ConvertWindowsToGeneralCharCode(m_defaultRegion.m_strLangLocaleName, m_languageCodeGeneral)) m_languageCodeGeneral = ""; #else if (m_defaultRegion.m_strLangLocaleName.length() != 3) { if (!g_LangCodeExpander.ConvertToThreeCharCode(m_languageCodeGeneral, m_defaultRegion.m_strLangLocaleName)) m_languageCodeGeneral = ""; } else m_languageCodeGeneral = m_defaultRegion.m_strLangLocaleName; #endif const TiXmlNode *pCharSets = pRootElement->FirstChild("charsets"); if (pCharSets && !pCharSets->NoChildren()) { const TiXmlNode *pGui = pCharSets->FirstChild("gui"); if (pGui && !pGui->NoChildren()) { CStdString strForceUnicodeFont = ((TiXmlElement*) pGui)->Attribute("unicodefont"); if (strForceUnicodeFont.Equals("true")) m_defaultRegion.m_forceUnicodeFont=true; m_defaultRegion.m_strGuiCharSet=pGui->FirstChild()->Value(); } const TiXmlNode *pSubtitle = pCharSets->FirstChild("subtitle"); if (pSubtitle && !pSubtitle->NoChildren()) m_defaultRegion.m_strSubtitleCharSet=pSubtitle->FirstChild()->Value(); } const TiXmlNode *pDVD = pRootElement->FirstChild("dvd"); if (pDVD && !pDVD->NoChildren()) { const TiXmlNode *pMenu = pDVD->FirstChild("menu"); if (pMenu && !pMenu->NoChildren()) m_defaultRegion.m_strDVDMenuLanguage=pMenu->FirstChild()->Value(); const TiXmlNode *pAudio = pDVD->FirstChild("audio"); if (pAudio && !pAudio->NoChildren()) m_defaultRegion.m_strDVDAudioLanguage=pAudio->FirstChild()->Value(); const TiXmlNode *pSubtitle = pDVD->FirstChild("subtitle"); if (pSubtitle && !pSubtitle->NoChildren()) m_defaultRegion.m_strDVDSubtitleLanguage=pSubtitle->FirstChild()->Value(); } const TiXmlNode *pRegions = pRootElement->FirstChild("regions"); if (pRegions && !pRegions->NoChildren()) { const TiXmlElement *pRegion=pRegions->FirstChildElement("region"); while (pRegion) { CRegion region(m_defaultRegion); region.m_strName=pRegion->Attribute("name"); if (region.m_strName.IsEmpty()) region.m_strName="N/A"; if (pRegion->Attribute("locale")) region.m_strRegionLocaleName = pRegion->Attribute("locale"); #ifdef _WIN32 // Windows need 3 chars regions code if (region.m_strRegionLocaleName.length() == 2) { if (! g_LangCodeExpander.ConvertLinuxToWindowsRegionCodes(region.m_strRegionLocaleName, region.m_strRegionLocaleName)) region.m_strRegionLocaleName = ""; } #endif const TiXmlNode *pDateLong=pRegion->FirstChild("datelong"); if (pDateLong && !pDateLong->NoChildren()) region.m_strDateFormatLong=pDateLong->FirstChild()->Value(); const TiXmlNode *pDateShort=pRegion->FirstChild("dateshort"); if (pDateShort && !pDateShort->NoChildren()) region.m_strDateFormatShort=pDateShort->FirstChild()->Value(); const TiXmlElement *pTime=pRegion->FirstChildElement("time"); if (pTime && !pTime->NoChildren()) { region.m_strTimeFormat=pTime->FirstChild()->Value(); region.m_strMeridiemSymbols[MERIDIEM_SYMBOL_AM]=pTime->Attribute("symbolAM"); region.m_strMeridiemSymbols[MERIDIEM_SYMBOL_PM]=pTime->Attribute("symbolPM"); } const TiXmlNode *pTempUnit=pRegion->FirstChild("tempunit"); if (pTempUnit && !pTempUnit->NoChildren()) region.SetTempUnit(pTempUnit->FirstChild()->Value()); const TiXmlNode *pSpeedUnit=pRegion->FirstChild("speedunit"); if (pSpeedUnit && !pSpeedUnit->NoChildren()) region.SetSpeedUnit(pSpeedUnit->FirstChild()->Value()); const TiXmlNode *pTimeZone=pRegion->FirstChild("timezone"); if (pTimeZone && !pTimeZone->NoChildren()) region.SetTimeZone(pTimeZone->FirstChild()->Value()); m_regions.insert(PAIR_REGIONS(region.m_strName, region)); pRegion=pRegion->NextSiblingElement("region"); } const CStdString& strName=g_guiSettings.GetString("locale.country"); SetCurrentRegion(strName); } LoadTokens(pRootElement->FirstChild("sorttokens"),g_advancedSettings.m_vecTokens); return true; }
bool CDAVDirectory::GetDirectory(const CStdString& strPath, CFileItemList &items) { CCurlFile dav; CURL url(strPath); CStdString strRequest = "PROPFIND"; dav.SetCustomRequest(strRequest); dav.SetMimeType("text/xml; charset=\"utf-8\""); dav.SetRequestHeader("depth", 1); dav.SetPostData( "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" " <D:propfind xmlns:D=\"DAV:\">" " <D:prop>" " <D:resourcetype/>" " <D:getcontentlength/>" " <D:getlastmodified/>" " <D:creationdate/>" " <D:displayname/>" " </D:prop>" " </D:propfind>"); if (!dav.Open(url)) { CLog::Log(LOGERROR, "%s - Unable to get dav directory (%s)", __FUNCTION__, strPath.c_str()); return false; } CStdString strResponse; dav.ReadData(strResponse); CXBMCTinyXML davResponse; davResponse.Parse(strResponse.c_str()); if (!davResponse.Parse(strResponse)) { CLog::Log(LOGERROR, "%s - Unable to process dav directory (%s)", __FUNCTION__, strPath.c_str()); dav.Close(); return false; } TiXmlNode *pChild; // Iterate over all responses for (pChild = davResponse.RootElement()->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) { if (CDAVCommon::ValueWithoutNamespace(pChild, "response")) { CFileItem item; ParseResponse(pChild->ToElement(), item); CURL url2(strPath); CURL url3(item.GetPath()); CStdString itemPath(URIUtils::AddFileToFolder(url2.GetWithoutFilename(), url3.GetFileName())); if (item.GetLabel().IsEmpty()) { CStdString name(itemPath); URIUtils::RemoveSlashAtEnd(name); CURL::Decode(name); item.SetLabel(URIUtils::GetFileName(name)); } if (item.m_bIsFolder) URIUtils::AddSlashAtEnd(itemPath); // Add back protocol options if (!url2.GetProtocolOptions().IsEmpty()) itemPath += "|" + url2.GetProtocolOptions(); item.SetPath(itemPath); if (!item.GetPath().Equals(strPath)) { CFileItemPtr pItem(new CFileItem(item)); items.Add(pItem); } } } dav.Close(); return true; }
// \brief Load the config file (sounds.xml) for nav sounds // Can be located in a folder "sounds" in the skin or from a // subfolder of the folder "sounds" in the root directory of // xbmc bool CGUIAudioManager::Load() { CSingleLock lock(m_cs); m_actionSoundMap.clear(); m_windowSoundMap.clear(); if (g_guiSettings.GetString("lookandfeel.soundskin")=="OFF") return true; else Enable(true); if (g_guiSettings.GetString("lookandfeel.soundskin")=="SKINDEFAULT") { m_strMediaDir = URIUtils::AddFileToFolder(g_SkinInfo->Path(), "sounds"); } else m_strMediaDir = URIUtils::AddFileToFolder("special://xbmc/sounds", g_guiSettings.GetString("lookandfeel.soundskin")); CStdString strSoundsXml = URIUtils::AddFileToFolder(m_strMediaDir, "sounds.xml"); // Load our xml file CXBMCTinyXML xmlDoc; CLog::Log(LOGINFO, "Loading %s", strSoundsXml.c_str()); // Load the config file if (!xmlDoc.LoadFile(strSoundsXml)) { CLog::Log(LOGNOTICE, "%s, Line %d\n%s", strSoundsXml.c_str(), xmlDoc.ErrorRow(), xmlDoc.ErrorDesc()); return false; } TiXmlElement* pRoot = xmlDoc.RootElement(); CStdString strValue = pRoot->Value(); if ( strValue != "sounds") { CLog::Log(LOGNOTICE, "%s Doesn't contain <sounds>", strSoundsXml.c_str()); return false; } // Load sounds for actions TiXmlElement* pActions = pRoot->FirstChildElement("actions"); if (pActions) { TiXmlNode* pAction = pActions->FirstChild("action"); while (pAction) { TiXmlNode* pIdNode = pAction->FirstChild("name"); int id = 0; // action identity if (pIdNode && pIdNode->FirstChild()) { CButtonTranslator::TranslateActionString(pIdNode->FirstChild()->Value(), id); } TiXmlNode* pFileNode = pAction->FirstChild("file"); CStdString strFile; if (pFileNode && pFileNode->FirstChild()) strFile+=pFileNode->FirstChild()->Value(); if (id > 0 && !strFile.IsEmpty()) m_actionSoundMap.insert(pair<int, CStdString>(id, strFile)); pAction = pAction->NextSibling(); } } // Load window specific sounds TiXmlElement* pWindows = pRoot->FirstChildElement("windows"); if (pWindows) { TiXmlNode* pWindow = pWindows->FirstChild("window"); while (pWindow) { int id = 0; TiXmlNode* pIdNode = pWindow->FirstChild("name"); if (pIdNode) { if (pIdNode->FirstChild()) id = CButtonTranslator::TranslateWindow(pIdNode->FirstChild()->Value()); } CWindowSounds sounds; LoadWindowSound(pWindow, "activate", sounds.strInitFile); LoadWindowSound(pWindow, "deactivate", sounds.strDeInitFile); if (id > 0) m_windowSoundMap.insert(pair<int, CWindowSounds>(id, sounds)); pWindow = pWindow->NextSibling(); } } return true; }
void CWeatherJob::LoadLocalizedToken() { // We load the english strings in to get our tokens std::string language = LANGUAGE_DEFAULT; std::shared_ptr<CSettingString> languageSetting = std::static_pointer_cast<CSettingString>(CServiceBroker::GetSettings().GetSetting(CSettings::SETTING_LOCALE_LANGUAGE)); if (languageSetting != NULL) language = languageSetting->GetDefault(); // Try the strings PO file first CPODocument PODoc; if (PODoc.LoadFile(URIUtils::AddFileToFolder(CLangInfo::GetLanguagePath(language), "strings.po"))) { int counter = 0; while (PODoc.GetNextEntry()) { if (PODoc.GetEntryType() != ID_FOUND) continue; uint32_t id = PODoc.GetEntryID(); PODoc.ParseEntry(ISSOURCELANG); if (id > LOCALIZED_TOKEN_LASTID2) break; if ((LOCALIZED_TOKEN_FIRSTID <= id && id <= LOCALIZED_TOKEN_LASTID) || (LOCALIZED_TOKEN_FIRSTID2 <= id && id <= LOCALIZED_TOKEN_LASTID2) || (LOCALIZED_TOKEN_FIRSTID3 <= id && id <= LOCALIZED_TOKEN_LASTID3) || (LOCALIZED_TOKEN_FIRSTID4 <= id && id <= LOCALIZED_TOKEN_LASTID4)) { if (!PODoc.GetMsgid().empty()) { m_localizedTokens.insert(make_pair(PODoc.GetMsgid(), id)); counter++; } } } CLog::Log(LOGDEBUG, "POParser: loaded %i weather tokens", counter); return; } CLog::Log(LOGDEBUG, "Weather: no PO string file available, to load English tokens, " "fallback to strings.xml file"); // We load the tokens from the strings.xml file std::string strLanguagePath = URIUtils::AddFileToFolder(CLangInfo::GetLanguagePath(language), "strings.xml"); CXBMCTinyXML xmlDoc; if (!xmlDoc.LoadFile(strLanguagePath) || !xmlDoc.RootElement()) { CLog::Log(LOGERROR, "Weather: unable to load %s: %s at line %d", strLanguagePath.c_str(), xmlDoc.ErrorDesc(), xmlDoc.ErrorRow()); return; } TiXmlElement* pRootElement = xmlDoc.RootElement(); if (pRootElement->ValueStr() != "strings") return; const TiXmlElement *pChild = pRootElement->FirstChildElement(); while (pChild) { std::string strValue = pChild->ValueStr(); if (strValue == "string") { // Load new style language file with id as attribute const char* attrId = pChild->Attribute("id"); if (attrId && !pChild->NoChildren()) { int id = atoi(attrId); if ((LOCALIZED_TOKEN_FIRSTID <= id && id <= LOCALIZED_TOKEN_LASTID) || (LOCALIZED_TOKEN_FIRSTID2 <= id && id <= LOCALIZED_TOKEN_LASTID2) || (LOCALIZED_TOKEN_FIRSTID3 <= id && id <= LOCALIZED_TOKEN_LASTID3) || (LOCALIZED_TOKEN_FIRSTID4 <= id && id <= LOCALIZED_TOKEN_LASTID4)) { std::string utf8Label(pChild->FirstChild()->ValueStr()); if (!utf8Label.empty()) m_localizedTokens.insert(make_pair(utf8Label, id)); } } } pChild = pChild->NextSiblingElement(); } }
bool CRSSDirectory::GetDirectory(const CURL& url, CFileItemList &items) { const std::string pathToUrl(url.Get()); std::string strPath(pathToUrl); URIUtils::RemoveSlashAtEnd(strPath); std::map<std::string,CDateTime>::iterator it; items.SetPath(strPath); CSingleLock lock(m_section); if ((it=m_cache.find(strPath)) != m_cache.end()) { if (it->second > CDateTime::GetCurrentDateTime() && items.Load()) return true; m_cache.erase(it); } lock.Leave(); CXBMCTinyXML xmlDoc; if (!xmlDoc.LoadFile(strPath)) { CLog::Log(LOGERROR,"failed to load xml from <%s>. error: <%d>", strPath.c_str(), xmlDoc.ErrorId()); return false; } if (xmlDoc.Error()) { CLog::Log(LOGERROR,"error parsing xml doc from <%s>. error: <%d>", strPath.c_str(), xmlDoc.ErrorId()); return false; } TiXmlElement* rssXmlNode = xmlDoc.RootElement(); if (!rssXmlNode) return false; TiXmlHandle docHandle( &xmlDoc ); TiXmlElement* channelXmlNode = docHandle.FirstChild( "rss" ).FirstChild( "channel" ).Element(); if (channelXmlNode) ParseItem(&items, channelXmlNode, pathToUrl); else return false; TiXmlElement* child = NULL; for (child = channelXmlNode->FirstChildElement("item"); child; child = child->NextSiblingElement()) { // Create new item, CFileItemPtr item(new CFileItem()); ParseItem(item.get(), child, pathToUrl); item->SetProperty("isrss", "1"); // Use channel image if item doesn't have one if (!item->HasArt("thumb") && items.HasArt("thumb")) item->SetArt("thumb", items.GetArt("thumb")); if (!item->GetPath().empty()) items.Add(item); } items.AddSortMethod(SortByNone , 231, LABEL_MASKS("%L", "%D", "%L", "")); // FileName, Duration | Foldername, empty items.AddSortMethod(SortByLabel , 551, LABEL_MASKS("%L", "%D", "%L", "")); // FileName, Duration | Foldername, empty items.AddSortMethod(SortBySize , 553, LABEL_MASKS("%L", "%I", "%L", "%I")); // FileName, Size | Foldername, Size items.AddSortMethod(SortByDate , 552, LABEL_MASKS("%L", "%J", "%L", "%J")); // FileName, Date | Foldername, Date CDateTime time = CDateTime::GetCurrentDateTime(); int mins = 60; TiXmlElement* ttl = docHandle.FirstChild("rss").FirstChild("ttl").Element(); if (ttl) mins = strtol(ttl->FirstChild()->Value(),NULL,10); time += CDateTimeSpan(0,0,mins,0); items.SetPath(strPath); items.Save(); CSingleLock lock2(m_section); m_cache.insert(make_pair(strPath,time)); return true; }
bool CGUIWindow::Load(CXBMCTinyXML &xmlDoc) { TiXmlElement* pRootElement = xmlDoc.RootElement(); if (strcmpi(pRootElement->Value(), "window")) { CLog::Log(LOGERROR, "file : XML file doesnt contain <window>"); return false; } // set the scaling resolution so that any control creation or initialisation can // be done with respect to the correct aspect ratio g_graphicsContext.SetScalingResolution(m_coordsRes, m_needsScaling); // Resolve any includes that may be present g_SkinInfo->ResolveIncludes(pRootElement); // now load in the skin file SetDefaults(); CGUIControlFactory::GetInfoColor(pRootElement, "backgroundcolor", m_clearBackground, GetID()); CGUIControlFactory::GetActions(pRootElement, "onload", m_loadActions); CGUIControlFactory::GetActions(pRootElement, "onunload", m_unloadActions); CGUIControlFactory::GetHitRect(pRootElement, m_hitRect); TiXmlElement *pChild = pRootElement->FirstChildElement(); while (pChild) { CStdString strValue = pChild->Value(); if (strValue == "type" && pChild->FirstChild()) { // if we have are a window type (ie not a dialog), and we have <type>dialog</type> // then make this window act like a dialog if (!IsDialog() && strcmpi(pChild->FirstChild()->Value(), "dialog") == 0) m_isDialog = true; } else if (strValue == "previouswindow" && pChild->FirstChild()) { m_previousWindow = CButtonTranslator::TranslateWindow(pChild->FirstChild()->Value()); } else if (strValue == "defaultcontrol" && pChild->FirstChild()) { const char *always = pChild->Attribute("always"); if (always && strcmpi(always, "true") == 0) m_defaultAlways = true; m_defaultControl = atoi(pChild->FirstChild()->Value()); } else if (strValue == "visible" && pChild->FirstChild()) { CStdString condition; CGUIControlFactory::GetConditionalVisibility(pRootElement, condition); m_visibleCondition = g_infoManager.Register(condition, GetID()); } else if (strValue == "animation" && pChild->FirstChild()) { CRect rect(0, 0, (float)m_coordsRes.iWidth, (float)m_coordsRes.iHeight); CAnimation anim; anim.Create(pChild, rect, GetID()); m_animations.push_back(anim); } else if (strValue == "zorder" && pChild->FirstChild()) { m_renderOrder = atoi(pChild->FirstChild()->Value()); } else if (strValue == "coordinates") { XMLUtils::GetFloat(pChild, "posx", m_posX); XMLUtils::GetFloat(pChild, "posy", m_posY); TiXmlElement *originElement = pChild->FirstChildElement("origin"); while (originElement) { COrigin origin; originElement->QueryFloatAttribute("x", &origin.x); originElement->QueryFloatAttribute("y", &origin.y); if (originElement->FirstChild()) origin.condition = g_infoManager.Register(originElement->FirstChild()->Value(), GetID()); m_origins.push_back(origin); originElement = originElement->NextSiblingElement("origin"); } } else if (strValue == "camera") { // z is fixed pChild->QueryFloatAttribute("x", &m_camera.x); pChild->QueryFloatAttribute("y", &m_camera.y); m_hasCamera = true; } else if (strValue == "controls") { TiXmlElement *pControl = pChild->FirstChildElement(); while (pControl) { if (strcmpi(pControl->Value(), "control") == 0) { LoadControl(pControl, NULL); } pControl = pControl->NextSiblingElement(); } } else if (strValue == "allowoverlay") { bool overlay = false; if (XMLUtils::GetBoolean(pRootElement, "allowoverlay", overlay)) m_overlayState = overlay ? OVERLAY_STATE_SHOWN : OVERLAY_STATE_HIDDEN; } pChild = pChild->NextSiblingElement(); } LoadAdditionalTags(pRootElement); m_windowLoaded = true; OnWindowLoaded(); return true; }
bool CDAVFile::Execute(const CURL& url) { CURL url2(url); ParseAndCorrectUrl(url2); CLog::Log(LOGDEBUG, "CDAVFile::Execute(%p) %s", (void*)this, m_url.c_str()); assert(!(!m_state->m_easyHandle ^ !m_state->m_multiHandle)); if( m_state->m_easyHandle == NULL ) g_curlInterface.easy_aquire(url2.GetProtocol().c_str(), url2.GetHostName().c_str(), &m_state->m_easyHandle, &m_state->m_multiHandle); // setup common curl options SetCommonOptions(m_state); SetRequestHeaders(m_state); lastResponseCode = m_state->Connect(m_bufferSize); if( lastResponseCode < 0 || lastResponseCode >= 400) return false; char* efurl; if (CURLE_OK == g_curlInterface.easy_getinfo(m_state->m_easyHandle, CURLINFO_EFFECTIVE_URL,&efurl) && efurl) m_url = efurl; if (lastResponseCode == 207) { std::string strResponse; ReadData(strResponse); CXBMCTinyXML davResponse; davResponse.Parse(strResponse); if (!davResponse.Parse(strResponse)) { CLog::Log(LOGERROR, "%s - Unable to process dav response (%s)", __FUNCTION__, m_url.c_str()); Close(); return false; } TiXmlNode *pChild; // Iterate over all responses for (pChild = davResponse.RootElement()->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) { if (CDAVCommon::ValueWithoutNamespace(pChild, "response")) { std::string sRetCode = CDAVCommon::GetStatusTag(pChild->ToElement()); CRegExp rxCode; rxCode.RegComp("HTTP/1\\.1\\s(\\d+)\\s.*"); if (rxCode.RegFind(sRetCode) >= 0) { if (rxCode.GetSubCount()) { lastResponseCode = atoi(rxCode.GetMatch(1).c_str()); if( lastResponseCode < 0 || lastResponseCode >= 400) return false; } } } } } return true; }
bool CProfilesManager::LoadProfile(size_t index) { CSingleLock lock(m_critical); // check if the index is valid or not if (index >= m_profiles.size()) return false; // check if the profile is already active if (m_currentProfile == index) return true; // save any settings of the currently used skin if (g_SkinInfo != nullptr) g_SkinInfo->SaveSettings(); // unload any old settings CSettings::GetInstance().Unload(); SetCurrentProfileId(index); // load the new settings if (!CSettings::GetInstance().Load()) { CLog::Log(LOGFATAL, "CProfilesManager: unable to load settings for profile \"%s\"", m_profiles.at(index).getName().c_str()); return false; } CSettings::GetInstance().SetLoaded(); CreateProfileFolders(); CDatabaseManager::GetInstance().Initialize(); CButtonTranslator::GetInstance().Load(true); CInputManager::GetInstance().SetMouseEnabled(CSettings::GetInstance().GetBool(CSettings::SETTING_INPUT_ENABLEMOUSE)); g_infoManager.ResetCache(); g_infoManager.ResetLibraryBools(); if (m_currentProfile != 0) { CXBMCTinyXML doc; if (doc.LoadFile(URIUtils::AddFileToFolder(GetUserDataFolder(), "guisettings.xml"))) { CSettings::GetInstance().LoadSetting(doc.RootElement(), CSettings::SETTING_MASTERLOCK_MAXRETRIES); CSettings::GetInstance().LoadSetting(doc.RootElement(), CSettings::SETTING_MASTERLOCK_STARTUPLOCK); } } CPasswordManager::GetInstance().Clear(); // to set labels - shares are reloaded #if !defined(TARGET_WINDOWS) && defined(HAS_DVD_DRIVE) MEDIA_DETECT::CDetectDVDMedia::UpdateState(); #endif // init windows CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_WINDOW_RESET); g_windowManager.SendMessage(msg); CUtil::DeleteDirectoryCache(); g_directoryCache.Clear(); return true; }
bool CVideoInfoTag::Save(TiXmlNode *node, const std::string &tag, bool savePathInfo, const TiXmlElement *additionalNode) { if (!node) return false; // we start with a <tag> tag TiXmlElement movieElement(tag.c_str()); TiXmlNode *movie = node->InsertEndChild(movieElement); if (!movie) return false; XMLUtils::SetString(movie, "title", m_strTitle); if (!m_strOriginalTitle.empty()) XMLUtils::SetString(movie, "originaltitle", m_strOriginalTitle); if (!m_strShowTitle.empty()) XMLUtils::SetString(movie, "showtitle", m_strShowTitle); if (!m_strSortTitle.empty()) XMLUtils::SetString(movie, "sorttitle", m_strSortTitle); if (!m_ratings.empty()) { TiXmlElement ratings("ratings"); for (const auto& it : m_ratings) { TiXmlElement rating("rating"); rating.SetAttribute("name", it.first.c_str()); XMLUtils::SetFloat(&rating, "value", it.second.rating); XMLUtils::SetInt(&rating, "votes", it.second.votes); rating.SetAttribute("max", 10); if (it.first == m_strDefaultRating) rating.SetAttribute("default", "true"); ratings.InsertEndChild(rating); } movie->InsertEndChild(ratings); } XMLUtils::SetInt(movie, "userrating", m_iUserRating); if (m_EpBookmark.timeInSeconds > 0) { TiXmlElement epbookmark("episodebookmark"); XMLUtils::SetFloat(&epbookmark, "position", (float)m_EpBookmark.timeInSeconds); if (!m_EpBookmark.playerState.empty()) { TiXmlElement playerstate("playerstate"); CXBMCTinyXML doc; doc.Parse(m_EpBookmark.playerState); playerstate.InsertEndChild(*doc.RootElement()); epbookmark.InsertEndChild(playerstate); } movie->InsertEndChild(epbookmark); } XMLUtils::SetInt(movie, "top250", m_iTop250); if (tag == "episodedetails" || tag == "tvshow") { XMLUtils::SetInt(movie, "season", m_iSeason); XMLUtils::SetInt(movie, "episode", m_iEpisode); XMLUtils::SetInt(movie, "displayseason",m_iSpecialSortSeason); XMLUtils::SetInt(movie, "displayepisode",m_iSpecialSortEpisode); } if (tag == "musicvideo") { XMLUtils::SetInt(movie, "track", m_iTrack); XMLUtils::SetString(movie, "album", m_strAlbum); } XMLUtils::SetString(movie, "outline", m_strPlotOutline); XMLUtils::SetString(movie, "plot", m_strPlot); XMLUtils::SetString(movie, "tagline", m_strTagLine); XMLUtils::SetInt(movie, "runtime", GetDuration() / 60); if (!m_strPictureURL.m_xml.empty()) { CXBMCTinyXML doc; doc.Parse(m_strPictureURL.m_xml); const TiXmlNode* thumb = doc.FirstChild("thumb"); while (thumb) { movie->InsertEndChild(*thumb); thumb = thumb->NextSibling("thumb"); } } if (m_fanart.m_xml.size()) { CXBMCTinyXML doc; doc.Parse(m_fanart.m_xml); movie->InsertEndChild(*doc.RootElement()); } XMLUtils::SetString(movie, "mpaa", m_strMPAARating); XMLUtils::SetInt(movie, "playcount", m_playCount); XMLUtils::SetDate(movie, "lastplayed", m_lastPlayed); if (savePathInfo) { XMLUtils::SetString(movie, "file", m_strFile); XMLUtils::SetString(movie, "path", m_strPath); XMLUtils::SetString(movie, "filenameandpath", m_strFileNameAndPath); XMLUtils::SetString(movie, "basepath", m_basePath); } if (!m_strEpisodeGuide.empty()) { CXBMCTinyXML doc; doc.Parse(m_strEpisodeGuide); if (doc.RootElement()) movie->InsertEndChild(*doc.RootElement()); else XMLUtils::SetString(movie, "episodeguide", m_strEpisodeGuide); } XMLUtils::SetString(movie, "id", GetUniqueID()); for (const auto& uniqueid : m_uniqueIDs) { TiXmlElement uniqueID("uniqueid"); uniqueID.SetAttribute("type", uniqueid.first); if (uniqueid.first == m_strDefaultUniqueID) uniqueID.SetAttribute("default", "true"); TiXmlText value(uniqueid.second); uniqueID.InsertEndChild(value); movie->InsertEndChild(uniqueID); } XMLUtils::SetStringArray(movie, "genre", m_genre); XMLUtils::SetStringArray(movie, "country", m_country); if (!m_strSet.empty()) { TiXmlElement set("set"); XMLUtils::SetString(&set, "name", m_strSet); if (!m_strSetOverview.empty()) XMLUtils::SetString(&set, "overview", m_strSetOverview); movie->InsertEndChild(set); } XMLUtils::SetStringArray(movie, "tag", m_tags); XMLUtils::SetStringArray(movie, "credits", m_writingCredits); XMLUtils::SetStringArray(movie, "director", m_director); if (HasPremiered()) XMLUtils::SetDate(movie, "premiered", m_premiered); if (HasYear()) XMLUtils::SetInt(movie, "year", GetYear()); XMLUtils::SetString(movie, "status", m_strStatus); XMLUtils::SetString(movie, "code", m_strProductionCode); XMLUtils::SetDate(movie, "aired", m_firstAired); XMLUtils::SetStringArray(movie, "studio", m_studio); XMLUtils::SetString(movie, "trailer", m_strTrailer); if (m_streamDetails.HasItems()) { // it goes fileinfo/streamdetails/[video|audio|subtitle] TiXmlElement fileinfo("fileinfo"); TiXmlElement streamdetails("streamdetails"); for (int iStream=1; iStream<=m_streamDetails.GetVideoStreamCount(); iStream++) { TiXmlElement stream("video"); XMLUtils::SetString(&stream, "codec", m_streamDetails.GetVideoCodec(iStream)); XMLUtils::SetFloat(&stream, "aspect", m_streamDetails.GetVideoAspect(iStream)); XMLUtils::SetInt(&stream, "width", m_streamDetails.GetVideoWidth(iStream)); XMLUtils::SetInt(&stream, "height", m_streamDetails.GetVideoHeight(iStream)); XMLUtils::SetInt(&stream, "durationinseconds", m_streamDetails.GetVideoDuration(iStream)); XMLUtils::SetString(&stream, "stereomode", m_streamDetails.GetStereoMode(iStream)); streamdetails.InsertEndChild(stream); } for (int iStream=1; iStream<=m_streamDetails.GetAudioStreamCount(); iStream++) { TiXmlElement stream("audio"); XMLUtils::SetString(&stream, "codec", m_streamDetails.GetAudioCodec(iStream)); XMLUtils::SetString(&stream, "language", m_streamDetails.GetAudioLanguage(iStream)); XMLUtils::SetInt(&stream, "channels", m_streamDetails.GetAudioChannels(iStream)); streamdetails.InsertEndChild(stream); } for (int iStream=1; iStream<=m_streamDetails.GetSubtitleStreamCount(); iStream++) { TiXmlElement stream("subtitle"); XMLUtils::SetString(&stream, "language", m_streamDetails.GetSubtitleLanguage(iStream)); streamdetails.InsertEndChild(stream); } fileinfo.InsertEndChild(streamdetails); movie->InsertEndChild(fileinfo); } /* if has stream details */ // cast for (iCast it = m_cast.begin(); it != m_cast.end(); ++it) { // add a <actor> tag TiXmlElement cast("actor"); TiXmlNode *node = movie->InsertEndChild(cast); XMLUtils::SetString(node, "name", it->strName); XMLUtils::SetString(node, "role", it->strRole); XMLUtils::SetInt(node, "order", it->order); XMLUtils::SetString(node, "thumb", it->thumbUrl.GetFirstThumb().m_url); } XMLUtils::SetStringArray(movie, "artist", m_artist); XMLUtils::SetStringArray(movie, "showlink", m_showLink); for (const auto& namedSeason : m_namedSeasons) { TiXmlElement season("namedseason"); season.SetAttribute("number", namedSeason.first); season.SetValue(namedSeason.second); movie->InsertEndChild(season); } TiXmlElement resume("resume"); XMLUtils::SetFloat(&resume, "position", (float)m_resumePoint.timeInSeconds); XMLUtils::SetFloat(&resume, "total", (float)m_resumePoint.totalTimeInSeconds); movie->InsertEndChild(resume); XMLUtils::SetDateTime(movie, "dateadded", m_dateAdded); if (additionalNode) movie->InsertEndChild(*additionalNode); return true; }
void CAdvancedSettings::ParseSettingsFile(const CStdString &file) { CXBMCTinyXML advancedXML; if (!CFile::Exists(file)) { CLog::Log(LOGNOTICE, "No settings file to load (%s)", file.c_str()); return; } if (!advancedXML.LoadFile(file)) { CLog::Log(LOGERROR, "Error loading %s, Line %d\n%s", file.c_str(), advancedXML.ErrorRow(), advancedXML.ErrorDesc()); return; } TiXmlElement *pRootElement = advancedXML.RootElement(); if (!pRootElement || strcmpi(pRootElement->Value(),"advancedsettings") != 0) { CLog::Log(LOGERROR, "Error loading %s, no <advancedsettings> node", file.c_str()); return; } // succeeded - tell the user it worked CLog::Log(LOGNOTICE, "Loaded settings file from %s", file.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", file.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::GetString(pElement, "defaultplayer", m_audioDefaultPlayer); // 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, 192000); TiXmlElement* pAudioExcludes = pElement->FirstChildElement("excludefromlisting"); if (pAudioExcludes) GetCustomRegexps(pAudioExcludes, m_audioExcludeFromListingRegExps); pAudioExcludes = pElement->FirstChildElement("excludefromscan"); if (pAudioExcludes) GetCustomRegexps(pAudioExcludes, m_audioExcludeFromScanRegExps); XMLUtils::GetString(pElement, "audiohost", m_audioHost); XMLUtils::GetBoolean(pElement, "applydrc", m_audioApplyDrc); XMLUtils::GetBoolean(pElement, "dvdplayerignoredtsinwav", m_dvdplayerIgnoreDTSinWAV); XMLUtils::GetFloat(pElement, "limiterhold", m_limiterHold, 0.0f, 100.0f); XMLUtils::GetFloat(pElement, "limiterrelease", m_limiterRelease, 0.001f, 100.0f); } pElement = pRootElement->FirstChildElement("karaoke"); if (pElement) { XMLUtils::GetFloat(pElement, "syncdelaycdg", m_karaokeSyncDelayCDG, -3.0f, 3.0f); // keep the old name for comp XMLUtils::GetFloat(pElement, "syncdelaylrc", m_karaokeSyncDelayLRC, -3.0f, 3.0f); XMLUtils::GetBoolean(pElement, "alwaysreplacegenre", m_karaokeChangeGenreForKaraokeSongs ); XMLUtils::GetBoolean(pElement, "storedelay", m_karaokeKeepDelay ); XMLUtils::GetInt(pElement, "autoassignstartfrom", m_karaokeStartIndex, 1, 2000000000); XMLUtils::GetBoolean(pElement, "nocdgbackground", m_karaokeAlwaysEmptyOnCdgs ); XMLUtils::GetBoolean(pElement, "lookupsongbackground", m_karaokeUseSongSpecificBackground ); TiXmlElement* pKaraokeBackground = pElement->FirstChildElement("defaultbackground"); if (pKaraokeBackground) { const char* attr = pKaraokeBackground->Attribute("type"); if ( attr ) m_karaokeDefaultBackgroundType = attr; attr = pKaraokeBackground->Attribute("path"); if ( attr ) m_karaokeDefaultBackgroundFilePath = attr; } } 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::GetString(pElement, "defaultplayer", m_videoDefaultPlayer); XMLUtils::GetString(pElement, "defaultdvdplayer", m_videoDefaultDVDPlayer); 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); XMLUtils::GetBoolean(pElement,"vdpauscaling",m_videoVDPAUScaling); XMLUtils::GetFloat(pElement, "nonlinearstretchratio", m_videoNonLinStretchRatio, 0.01f, 1.0f); XMLUtils::GetBoolean(pElement,"enablehighqualityhwscalers", m_videoEnableHighQualityHwScalers); XMLUtils::GetFloat(pElement,"autoscalemaxfps",m_videoAutoScaleMaxFps, 0.0f, 1000.0f); XMLUtils::GetBoolean(pElement,"allowmpeg4vdpau",m_videoAllowMpeg4VDPAU); XMLUtils::GetBoolean(pElement,"allowmpeg4vaapi",m_videoAllowMpeg4VAAPI); XMLUtils::GetBoolean(pElement, "disablebackgrounddeinterlace", m_videoDisableBackgroundDeinterlace); XMLUtils::GetInt(pElement, "useocclusionquery", m_videoCaptureUseOcclusionQuery, -1, 1); TiXmlElement* pAdjustRefreshrate = pElement->FirstChildElement("adjustrefreshrate"); if (pAdjustRefreshrate) { TiXmlElement* pRefreshOverride = pAdjustRefreshrate->FirstChildElement("override"); while (pRefreshOverride) { RefreshOverride override = {0}; float fps; if (XMLUtils::GetFloat(pRefreshOverride, "fps", fps)) { override.fpsmin = fps - 0.01f; override.fpsmax = fps + 0.01f; } float fpsmin, fpsmax; if (XMLUtils::GetFloat(pRefreshOverride, "fpsmin", fpsmin) && XMLUtils::GetFloat(pRefreshOverride, "fpsmax", fpsmax)) { override.fpsmin = fpsmin; override.fpsmax = fpsmax; } float refresh; if (XMLUtils::GetFloat(pRefreshOverride, "refresh", refresh)) { override.refreshmin = refresh - 0.01f; override.refreshmax = refresh + 0.01f;