/*! \brief Set a skin file setting. * \param params The parameters. * \details params[0] = Name of skin setting. * params[1] = File mask or add-on type (optional). * params[2] = Extra URL to allow selection from or * content type if mask is an addon-on type (optional). */ static int SetFile(const std::vector<std::string>& params) { int string = CSkinSettings::GetInstance().TranslateString(params[0]); std::string value = CSkinSettings::GetInstance().GetString(string); VECSOURCES localShares; g_mediaManager.GetLocalDrives(localShares); // Note. can only browse one addon type from here // if browsing for addons, required param[1] is addontype string, with optional param[2] // as contenttype string see IAddon.h & ADDON::TranslateXX std::string strMask = (params.size() > 1) ? params[1] : ""; StringUtils::ToLower(strMask); ADDON::TYPE type; if ((type = TranslateType(strMask)) != ADDON_UNKNOWN) { CURL url; url.SetProtocol("addons"); url.SetHostName("enabled"); url.SetFileName(strMask+"/"); localShares.clear(); std::string content = (params.size() > 2) ? params[2] : ""; StringUtils::ToLower(content); url.SetPassword(content); std::string strMask; if (type == ADDON_SCRIPT) strMask = ".py"; std::string replace; if (CGUIDialogFileBrowser::ShowAndGetFile(url.Get(), strMask, TranslateType(type, true), replace, true, true, true)) { if (StringUtils::StartsWithNoCase(replace, "addons://")) CSkinSettings::GetInstance().SetString(string, URIUtils::GetFileName(replace)); else CSkinSettings::GetInstance().SetString(string, replace); } } else { // show all network drives g_mediaManager.GetNetworkLocations(localShares); if (params.size() > 2) { value = params[2]; URIUtils::AddSlashAtEnd(value); bool bIsSource; if (CUtil::GetMatchingSource(value,localShares,bIsSource) < 0) // path is outside shares - add it as a separate one { CMediaSource share; share.strName = g_localizeStrings.Get(13278); share.strPath = value; localShares.push_back(share); } } if (CGUIDialogFileBrowser::ShowAndGetFile(localShares, strMask, g_localizeStrings.Get(1033), value)) CSkinSettings::GetInstance().SetString(string, value); } return 0; }
void CMediaSourceSettings::GetSources(const TiXmlNode* pRootElement, const std::string& strTagName, VECSOURCES& items, std::string& strDefault) { strDefault = ""; items.clear(); const TiXmlNode *pChild = pRootElement->FirstChild(strTagName.c_str()); if (pChild == NULL) { CLog::Log(LOGDEBUG, "CMediaSourceSettings: <%s> tag is missing or sources.xml is malformed", strTagName.c_str()); return; } pChild = pChild->FirstChild(); while (pChild != NULL) { std::string strValue = pChild->ValueStr(); if (strValue == XML_SOURCE || strValue == "bookmark") // "bookmark" left in for backwards compatibility { CMediaSource share; if (GetSource(strTagName, pChild, share)) items.push_back(share); else CLog::Log(LOGERROR, "CMediaSourceSettings: Missing or invalid <name> and/or <path> in source"); } else if (strValue == "default") { const TiXmlNode *pValueNode = pChild->FirstChild(); if (pValueNode) { std::string pszText = pChild->FirstChild()->ValueStr(); if (!pszText.empty()) strDefault = pszText; CLog::Log(LOGDEBUG, "CMediaSourceSettings: Setting <default> source to : %s", strDefault.c_str()); } } pChild = pChild->NextSibling(); } }