// TODO: Currently no support for "embedded thumb" as there is no easy way to grab it // without sending a file that has this as it's album to this class void CGUIWindowMusicInfo::OnGetThumb() { CFileItemList items; // Grab the thumbnail from the web CStdString thumbFromWeb; CUtil::AddFileToFolder(g_advancedSettings.m_cachePath, "allmusicThumb", thumbFromWeb); CScraperUrl url; if (m_bArtistInfo) url = m_artist.thumbURL; else url = m_album.thumbURL; for (unsigned int i = 0; i < url.m_url.size(); i++) { CStdString strThumb; strThumb.Format("thumb://Remote%i",i); CFileItemPtr item(new CFileItem(strThumb, false)); item->SetThumbnailImage("http://this.is/a/thumb/from/the/web"); item->SetIconImage("defaultPicture.png"); item->GetVideoInfoTag()->m_strPictureURL.m_url.push_back(url.m_url[i]); item->SetLabel(g_localizeStrings.Get(415)); item->SetProperty("labelonthumbload", g_localizeStrings.Get(20015)); // make sure any previously cached thumb is removed if (CFile::Exists(item->GetCachedPictureThumb())) CFile::Delete(item->GetCachedPictureThumb()); items.Add(item); } // Current thumb if (CFile::Exists(m_albumItem->GetThumbnailImage())) { CFileItemPtr item(new CFileItem("thumb://Current", false)); item->SetThumbnailImage(m_albumItem->GetThumbnailImage()); item->SetLabel(g_localizeStrings.Get(20016)); items.Add(item); } // local thumb CStdString cachedLocalThumb; CStdString localThumb; if (m_bArtistInfo) { CMusicDatabase database; database.Open(); CStdString strArtistPath; database.GetArtistPath(m_artist.idArtist,strArtistPath); CUtil::AddFileToFolder(strArtistPath,"folder.jpg",localThumb); } else CStdString localThumb = m_albumItem->GetUserMusicThumb(); if (CFile::Exists(localThumb)) { CUtil::AddFileToFolder(g_advancedSettings.m_cachePath, "localthumb.jpg", cachedLocalThumb); CPicture pic; if (pic.DoCreateThumbnail(localThumb, cachedLocalThumb)) { CFileItemPtr item(new CFileItem("thumb://Local", false)); item->SetThumbnailImage(cachedLocalThumb); item->SetLabel(g_localizeStrings.Get(20017)); items.Add(item); } } CFileItemPtr item(new CFileItem("thumb://None", false)); if (m_bArtistInfo) item->SetThumbnailImage("defaultArtistBig.png"); else item->SetThumbnailImage("defaultAlbumCover.png"); item->SetLabel(g_localizeStrings.Get(20018)); items.Add(item); CStdString result; if (!CGUIDialogFileBrowser::ShowAndGetImage(items, g_settings.m_musicSources, g_localizeStrings.Get(1030), result)) return; // user cancelled if (result == "thumb://Current") return; // user chose the one they have // delete the thumbnail if that's what the user wants, else overwrite with the // new thumbnail CStdString cachedThumb; if (m_bArtistInfo) cachedThumb = m_albumItem->GetCachedArtistThumb(); else cachedThumb = CUtil::GetCachedAlbumThumb(m_album.strAlbum, m_album.strArtist); if (result.Left(14).Equals("thumb://Remote")) { CStdString strFile; CFileItem chosen(result, false); CStdString thumb = chosen.GetCachedPictureThumb(); if (CFile::Exists(thumb)) { // NOTE: This could fail if the thumbloader was too slow and the user too impatient CFile::Cache(thumb, cachedThumb); } else result = "thumb://None"; } if (result == "thumb://None") { // cache the default thumb CPicture pic; pic.CacheSkinImage("defaultAlbumCover.png", cachedThumb); } else if (result == "thumb://Local") CFile::Cache(cachedLocalThumb, cachedThumb); else if (CFile::Exists(result)) { CPicture pic; pic.DoCreateThumbnail(result, cachedThumb); } m_albumItem->SetThumbnailImage(cachedThumb); m_hasUpdatedThumb = true; // tell our GUI to completely reload all controls (as some of them // are likely to have had this image in use so will need refreshing) CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_REFRESH_THUMBS); g_graphicsContext.SendMessage(msg); // Update our screen Update(); }
// TODO: Currently no support for "embedded thumb" as there is no easy way to grab it // without sending a file that has this as it's album to this class void CGUIDialogMusicInfo::OnGetThumb() { CFileItemList items; // Current thumb if (CFile::Exists(m_albumItem->GetArt("thumb"))) { CFileItemPtr item(new CFileItem("thumb://Current", false)); item->SetArt("thumb", m_albumItem->GetArt("thumb")); item->SetLabel(g_localizeStrings.Get(20016)); items.Add(item); } // Grab the thumbnail(s) from the web vector<CStdString> thumbs; if (m_bArtistInfo) m_artist.thumbURL.GetThumbURLs(thumbs); else m_album.thumbURL.GetThumbURLs(thumbs); for (unsigned int i = 0; i < thumbs.size(); ++i) { CStdString strItemPath; strItemPath.Format("thumb://Remote%i", i); CFileItemPtr item(new CFileItem(strItemPath, false)); item->SetArt("thumb", thumbs[i]); item->SetIconImage("DefaultPicture.png"); item->SetLabel(g_localizeStrings.Get(20015)); // TODO: Do we need to clear the cached image? // CTextureCache::Get().ClearCachedImage(thumb); items.Add(item); } // local thumb CStdString localThumb; if (m_bArtistInfo) { CMusicDatabase database; database.Open(); CStdString strArtistPath; if (database.GetArtistPath(m_artist.idArtist,strArtistPath)) localThumb = URIUtils::AddFileToFolder(strArtistPath, "folder.jpg"); } else localThumb = m_albumItem->GetUserMusicThumb(); if (CFile::Exists(localThumb)) { CFileItemPtr item(new CFileItem("thumb://Local", false)); item->SetArt("thumb", localThumb); item->SetLabel(g_localizeStrings.Get(20017)); items.Add(item); } else { CFileItemPtr item(new CFileItem("thumb://None", false)); if (m_bArtistInfo) item->SetIconImage("DefaultArtist.png"); else item->SetIconImage("DefaultAlbumCover.png"); item->SetLabel(g_localizeStrings.Get(20018)); items.Add(item); } CStdString result; bool flip=false; VECSOURCES sources(*CMediaSourceSettings::Get().GetSources("music")); AddItemPathToFileBrowserSources(sources, *m_albumItem); g_mediaManager.GetLocalDrives(sources); if (!CGUIDialogFileBrowser::ShowAndGetImage(items, sources, g_localizeStrings.Get(1030), result, &flip)) return; // user cancelled if (result == "thumb://Current") return; // user chose the one they have CStdString newThumb; if (result.Left(14) == "thumb://Remote") { int number = atoi(result.Mid(14)); newThumb = thumbs[number]; } else if (result == "thumb://Local") newThumb = localThumb; else if (CFile::Exists(result)) newThumb = result; else // none newThumb = "-"; // force local thumbs to be ignored // update thumb in the database CMusicDatabase db; if (db.Open()) { db.SetArtForItem(m_albumItem->GetMusicInfoTag()->GetDatabaseId(), m_albumItem->GetMusicInfoTag()->GetType(), "thumb", newThumb); db.Close(); } m_albumItem->SetArt("thumb", newThumb); m_hasUpdatedThumb = true; // tell our GUI to completely reload all controls (as some of them // are likely to have had this image in use so will need refreshing) CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_REFRESH_THUMBS); g_windowManager.SendMessage(msg); // Update our screen Update(); }
void XMLUtils::SetInt(TiXmlNode* pRootNode, const char *strTag, int value) { CStdString strValue; strValue.Format("%i", value); SetString(pRootNode, strTag, strValue); }
CStdString CURL::GetWithoutUserDetails() const { CStdString strURL; if (m_strProtocol.Equals("stack")) { CFileItemList items; CStdString strURL2; strURL2 = Get(); XFILE::CStackDirectory dir; dir.GetDirectory(strURL2,items); vector<CStdString> newItems; for (int i=0;i<items.Size();++i) { CURL url(items[i]->GetPath()); items[i]->SetPath(url.GetWithoutUserDetails()); newItems.push_back(items[i]->GetPath()); } dir.ConstructStackPath(newItems,strURL); return strURL; } unsigned int sizeneed = m_strProtocol.length() + m_strDomain.length() + m_strHostName.length() + m_strFileName.length() + m_strOptions.length() + m_strProtocolOptions.length() + 10; strURL.reserve(sizeneed); if (m_strProtocol == "") return m_strFileName; strURL = m_strProtocol; strURL += "://"; if (m_strHostName != "") { if (URIUtils::ProtocolHasParentInHostname(m_strProtocol)) strURL += CURL(m_strHostName).GetWithoutUserDetails(); else strURL += m_strHostName; if ( HasPort() ) { CStdString strPort; strPort.Format("%i", m_iPort); strURL += ":"; strURL += strPort; } strURL += "/"; } strURL += m_strFileName; if( m_strOptions.length() > 0 ) strURL += m_strOptions; if( m_strProtocolOptions.length() > 0 ) strURL += "|"+m_strProtocolOptions; return strURL; }
void XBPyThread::Process() { CLog::Log(LOGDEBUG,"Python thread: start processing"); int m_Py_file_input = Py_file_input; // get the global lock PyEval_AcquireLock(); PyThreadState* state = Py_NewInterpreter(); if (!state) { PyEval_ReleaseLock(); CLog::Log(LOGERROR,"Python thread: FAILED to get thread state!"); return; } // swap in my thread state PyThreadState_Swap(state); m_pExecuter->InitializeInterpreter(addon); CLog::Log(LOGDEBUG, "%s - The source file to load is %s", __FUNCTION__, m_source); // get path from script file name and add python path's // this is used for python so it will search modules from script path first CStdString scriptDir; URIUtils::GetDirectory(_P(m_source), scriptDir); URIUtils::RemoveSlashAtEnd(scriptDir); CStdString path = scriptDir; // add on any addon modules the user has installed ADDON::VECADDONS addons; ADDON::CAddonMgr::Get().GetAddons(ADDON::ADDON_SCRIPT_MODULE, addons); for (unsigned int i = 0; i < addons.size(); ++i) #ifdef TARGET_WINDOWS { CStdString strTmp(_P(addons[i]->LibPath())); g_charsetConverter.utf8ToStringCharset(strTmp); path += PY_PATH_SEP + strTmp; } #else path += PY_PATH_SEP + _P(addons[i]->LibPath()); #endif // and add on whatever our default path is path += PY_PATH_SEP; // we want to use sys.path so it includes site-packages // if this fails, default to using Py_GetPath PyObject *sysMod(PyImport_ImportModule((char*)"sys")); // must call Py_DECREF when finished PyObject *sysModDict(PyModule_GetDict(sysMod)); // borrowed ref, no need to delete PyObject *pathObj(PyDict_GetItemString(sysModDict, "path")); // borrowed ref, no need to delete if( pathObj && PyList_Check(pathObj) ) { for( int i = 0; i < PyList_Size(pathObj); i++ ) { PyObject *e = PyList_GetItem(pathObj, i); // borrowed ref, no need to delete if( e && PyString_Check(e) ) { path += PyString_AsString(e); // returns internal data, don't delete or modify path += PY_PATH_SEP; } } } else { path += Py_GetPath(); } Py_DECREF(sysMod); // release ref to sysMod // set current directory and python's path. if (m_argv != NULL) PySys_SetArgv(m_argc, m_argv); CLog::Log(LOGDEBUG, "%s - Setting the Python path to %s", __FUNCTION__, path.c_str()); PySys_SetPath((char *)path.c_str()); CLog::Log(LOGDEBUG, "%s - Entering source directory %s", __FUNCTION__, scriptDir.c_str()); PyObject* module = PyImport_AddModule((char*)"__main__"); PyObject* moduleDict = PyModule_GetDict(module); // when we are done initing we store thread state so we can be aborted PyThreadState_Swap(NULL); PyEval_ReleaseLock(); // we need to check if we was asked to abort before we had inited bool stopping = false; { CSingleLock lock(m_pExecuter->m_critSection); m_threadState = state; stopping = m_stopping; } PyEval_AcquireLock(); PyThreadState_Swap(state); if (!stopping) { if (m_type == 'F') { // run script from file // We need to have python open the file because on Windows the DLL that python // is linked against may not be the DLL that xbmc is linked against so // passing a FILE* to python from an fopen has the potential to crash. PyObject* file = PyFile_FromString((char *) _P(m_source).c_str(), (char*)"r"); FILE *fp = PyFile_AsFile(file); if (fp) { PyObject *f = PyString_FromString(_P(m_source).c_str()); PyDict_SetItemString(moduleDict, "__file__", f); if (addon.get() != NULL) { PyObject *pyaddonid = PyString_FromString(addon->ID().c_str()); PyDict_SetItemString(moduleDict, "__xbmcaddonid__", pyaddonid); CStdString version = ADDON::GetXbmcApiVersionDependency(addon); PyObject *pyxbmcapiversion = PyString_FromString(version.c_str()); PyDict_SetItemString(moduleDict, "__xbmcapiversion__", pyxbmcapiversion); CLog::Log(LOGDEBUG,"Instantiating addon using automatically obtained id of \"%s\" dependent on version %s of the xbmc.python api",addon->ID().c_str(),version.c_str()); } Py_DECREF(f); PyRun_FileExFlags(fp, _P(m_source).c_str(), m_Py_file_input, moduleDict, moduleDict,1,NULL); } else CLog::Log(LOGERROR, "%s not found!", m_source); } else { //run script PyRun_String(m_source, m_Py_file_input, moduleDict, moduleDict); } } if (!PyErr_Occurred()) CLog::Log(LOGINFO, "Scriptresult: Success"); else if (PyErr_ExceptionMatches(PyExc_SystemExit)) CLog::Log(LOGINFO, "Scriptresult: Aborted"); else { PyObject* exc_type; PyObject* exc_value; PyObject* exc_traceback; PyObject* pystring; pystring = NULL; PyErr_Fetch(&exc_type, &exc_value, &exc_traceback); if (exc_type == 0 && exc_value == 0 && exc_traceback == 0) { CLog::Log(LOGINFO, "Strange: No Python exception occured"); } else { if (exc_type != NULL && (pystring = PyObject_Str(exc_type)) != NULL && (PyString_Check(pystring))) { PyObject *tracebackModule; CLog::Log(LOGINFO, "-->Python script returned the following error<--"); CLog::Log(LOGERROR, "Error Type: %s", PyString_AsString(PyObject_Str(exc_type))); if (PyObject_Str(exc_value)) CLog::Log(LOGERROR, "Error Contents: %s", PyString_AsString(PyObject_Str(exc_value))); tracebackModule = PyImport_ImportModule((char*)"traceback"); if (tracebackModule != NULL) { PyObject *tbList, *emptyString, *strRetval; tbList = PyObject_CallMethod(tracebackModule, (char*)"format_exception", (char*)"OOO", exc_type, exc_value == NULL ? Py_None : exc_value, exc_traceback == NULL ? Py_None : exc_traceback); emptyString = PyString_FromString(""); strRetval = PyObject_CallMethod(emptyString, (char*)"join", (char*)"O", tbList); CLog::Log(LOGERROR, "%s", PyString_AsString(strRetval)); Py_DECREF(tbList); Py_DECREF(emptyString); Py_DECREF(strRetval); Py_DECREF(tracebackModule); } CLog::Log(LOGINFO, "-->End of Python script error report<--"); } else { pystring = NULL; CLog::Log(LOGINFO, "<unknown exception type>"); } CGUIDialogKaiToast *pDlgToast = (CGUIDialogKaiToast*)g_windowManager.GetWindow(WINDOW_DIALOG_KAI_TOAST); if (pDlgToast) { CStdString desc; CStdString path; CStdString script; URIUtils::Split(m_source, path, script); if (script.Equals("default.py")) { CStdString path2; URIUtils::RemoveSlashAtEnd(path); URIUtils::Split(path, path2, script); } desc.Format(g_localizeStrings.Get(2100), script); pDlgToast->QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(257), desc); } } Py_XDECREF(exc_type); Py_XDECREF(exc_value); // caller owns all 3 Py_XDECREF(exc_traceback); // already NULL'd out Py_XDECREF(pystring); } PyObject *m = PyImport_AddModule((char*)"xbmc"); if(!m || PyObject_SetAttrString(m, (char*)"abortRequested", PyBool_FromLong(1))) CLog::Log(LOGERROR, "Scriptresult: failed to set abortRequested"); // make sure all sub threads have finished for(PyThreadState* s = state->interp->tstate_head, *old = NULL; s;) { if(s == state) { s = s->next; continue; } if(old != s) { CLog::Log(LOGINFO, "Scriptresult: Waiting on thread %"PRIu64, (uint64_t)s->thread_id); old = s; } CPyThreadState pyState; Sleep(100); pyState.Restore(); s = state->interp->tstate_head; } // pending calls must be cleared out PyXBMC_ClearPendingCalls(state); PyThreadState_Swap(NULL); PyEval_ReleaseLock(); { CSingleLock lock(m_pExecuter->m_critSection); m_threadState = NULL; } PyEval_AcquireLock(); PyThreadState_Swap(state); m_pExecuter->DeInitializeInterpreter(); Py_EndInterpreter(state); PyThreadState_Swap(NULL); PyEval_ReleaseLock(); }
bool CMythDirectory::GetGuide(const CStdString& base, CFileItemList &items) { cmyth_database_t db = m_session->GetDatabase(); if (!db) return false; cmyth_chanlist_t list = m_dll->mysql_get_chanlist(db); if (!list) { CLog::Log(LOGERROR, "%s - Unable to get list of channels: %s", __FUNCTION__, base.c_str()); return false; } CURL url(base); int count = m_dll->chanlist_get_count(list); for (int i = 0; i < count; i++) { cmyth_channel_t channel = m_dll->chanlist_get_item(list, i); if (channel) { if (!m_dll->channel_visible(channel)) { m_dll->ref_release(channel); continue; } int channum = m_dll->channel_channum(channel); // e.g. 3 CStdString name = GetValue(m_dll->channel_name(channel)); // e.g. TV3 if (channum <= 0) { CLog::Log(LOGDEBUG, "%s - Skipping channel number %d as <= 0: %s", __FUNCTION__, channum, name.c_str()); m_dll->ref_release(channel); continue; } CLog::Log(LOGDEBUG, "%s - Adding channel number %d: %s", __FUNCTION__, channum, name.c_str()); CStdString number; number.Format("%d", channum); // CStdString easier for string manipulation than int. url.SetFileName("guide/" + number); CFileItemPtr item(new CFileItem(url.Get(), true)); item->m_strTitle = number; if (!name.IsEmpty()) item->m_strTitle += " - " + name; // e.g. 3 - TV3 CStdString icon = GetValue(m_dll->channel_icon(channel)); if (!icon.IsEmpty()) { url.SetFileName("files/channels/" + URIUtils::GetFileName(icon)); // e.g. files/channels/tv3.jpg item->SetThumbnailImage(url.Get()); } items.Add(item); m_dll->ref_release(channel); } } items.AddSortMethod(SORT_METHOD_LABEL, 551 /* Name */, LABEL_MASKS("", "", "%K", "")); m_dll->ref_release(list); return true; }
PVR_ERROR PVRClientMythTV::GetRecordings(ADDON_HANDLE handle) { if (g_bExtraDebug) XBMC->Log(LOG_DEBUG, "%s", __FUNCTION__); m_con.Lock(); m_recordings = m_con.GetRecordedPrograms(); m_con.Unlock(); for (ProgramInfoMap::iterator it = m_recordings.begin(); it != m_recordings.end(); ++it) { if (!it->second.IsNull() && IsRecordingVisible(it->second)) { PVR_RECORDING tag; memset(&tag, 0, sizeof(PVR_RECORDING)); tag.recordingTime = it->second.StartTime(); tag.iDuration = it->second.Duration(); tag.iPlayCount = it->second.IsWatched() ? 1 : 0; CStdString id = it->second.StrUID(); CStdString path = it->second.Path(); CStdString title = it->second.Title(true); PVR_STRCPY(tag.strRecordingId, id); PVR_STRCPY(tag.strTitle, title); PVR_STRCPY(tag.strPlot, it->second.Description()); PVR_STRCPY(tag.strChannelName, it->second.ChannelName()); int genre = m_categories.Category(it->second.Category()); tag.iGenreSubType = genre&0x0F; tag.iGenreType = genre&0xF0; // Add recording title to directory to group everything according to its name just like MythTV does CStdString strDirectory; strDirectory.Format("%s/%s", it->second.RecordingGroup(), it->second.Title(false)); PVR_STRCPY(tag.strDirectory, strDirectory); // Images CStdString strIconPath = GetArtWork(FileOps::FileTypeCoverart, title); if (strIconPath.IsEmpty()) strIconPath = m_fileOps->GetPreviewIconPath(path + ".png"); CStdString strFanartPath = GetArtWork(FileOps::FileTypeFanart, title); PVR_STRCPY(tag.strIconPath, strIconPath.c_str()); PVR_STRCPY(tag.strThumbnailPath, strIconPath.c_str()); PVR_STRCPY(tag.strFanartPath, strFanartPath.c_str()); // Unimplemented tag.iLifetime = 0; tag.iPriority = 0; PVR_STRCPY(tag.strPlotOutline, ""); PVR_STRCPY(tag.strStreamURL, ""); PVR->TransferRecordingEntry(handle, &tag); } } if (g_bExtraDebug) XBMC->Log(LOG_DEBUG, "%s - Done", __FUNCTION__); return PVR_ERROR_NO_ERROR; }
void ConfigManager::Initialize() { bool failed = false; m_configTopNode = NULL; try { char* cfgFilename = NULL; char* cfgEnvPath = ""; int cfgAlloc = 0; cfgEnvPath = ACE_OS::getenv("ORKAUDIO_CONFIG_PATH"); if(cfgEnvPath) { ACE_DIR* dir = ACE_OS::opendir(cfgEnvPath); if(dir) { int len = 0; ACE_OS::closedir(dir); len = strlen(cfgEnvPath)+1+strlen(CONFIG_FILE_NAME)+1; cfgFilename = (char*)malloc(len); if(cfgFilename) { cfgAlloc = 1; snprintf(cfgFilename, len, "%s/%s", cfgEnvPath, CONFIG_FILE_NAME); } } } if(!cfgFilename) { FILE* file = ACE_OS::fopen(CONFIG_FILE_NAME, "r"); if(file) { // config.xml exists in the current directory cfgFilename = (char*)CONFIG_FILE_NAME; fclose(file); } else { // config.xml could not be found in the current // directory, try to find it in system configuration directory cfgFilename = (char*)ETC_CONFIG_FILE_NAME; } } XMLPlatformUtils::Initialize(); // By default, the DOM document generated by the parser will be free() by the parser. // If we ever need to free the parser and the document separately, we need to do this: // DOMNode *doc = parser->getDocument(); // ... // parser->adoptDocument(); // doc->release(); // ... // delete parser; XercesDOMParser *m_parser = new XercesDOMParser; XmlErrorHandler errhandler; m_parser->setErrorHandler(&errhandler); m_parser->parse(cfgFilename); DOMNode *doc = NULL; doc = m_parser->getDocument(); // XXX is it okay to free here? if(cfgAlloc) { free(cfgFilename); } if (doc) { DOMNode *firstChild = doc->getFirstChild(); if (firstChild) { m_configTopNode = firstChild; m_config.DeSerializeDom(firstChild); /* // Write out config to a file DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(XStr("Core").unicodeForm()); XERCES_CPP_NAMESPACE::DOMDocument* myDoc; myDoc = impl->createDocument( 0, // root element namespace URI. XStr("root").unicodeForm(), // root element name 0); // document type object (DTD). m_config.SerializeDom(myDoc); CStdString toto = DomSerializer::DomNodeToString(myDoc); FILE* file = fopen("zzz.xml", "w"); fwrite((PCSTR)toto,1,toto.GetLength(),file); fclose(file); */ } else { LOG4CXX_ERROR(LOG.configLog, CStdString("Could not parse config file:") + CONFIG_FILE_NAME); failed = true; } } else { LOG4CXX_WARN(LOG.configLog, CStdString("Could not find config file:") + CONFIG_FILE_NAME); } } catch (const CStdString& e) { LOG4CXX_ERROR(LOG.configLog, e); failed = true; } catch(const XMLException& e) { LOG4CXX_ERROR(LOG.configLog, e.getMessage()); failed = true; } catch(const SAXParseException& e) { CStdString logMsg; logMsg.Format("config.xml error at line:%d, column:%d. (Use xmllint or xml editor to check the configuration)", e.getLineNumber(), e.getColumnNumber()); LOG4CXX_ERROR(LOG.configLog, logMsg); failed = true; } if (failed) { exit(0); } }
void CGUIWindowMusicInfo::Update() { if (m_bArtistInfo) { SetLabel(CONTROL_ARTIST, m_artist.strArtist ); SetLabel(CONTROL_GENRE, m_artist.strGenre); SetLabel(CONTROL_MOODS, m_artist.strMoods); SetLabel(CONTROL_STYLES, m_artist.strStyles ); if (m_bViewReview) { SET_CONTROL_VISIBLE(CONTROL_TEXTAREA); SET_CONTROL_HIDDEN(CONTROL_LIST); SetLabel(CONTROL_TEXTAREA, m_artist.strBiography); SET_CONTROL_LABEL(CONTROL_BTN_TRACKS, 21888); } else { SET_CONTROL_VISIBLE(CONTROL_LIST); if (GetControl(CONTROL_LIST)) { SET_CONTROL_HIDDEN(CONTROL_TEXTAREA); CGUIMessage message(GUI_MSG_LABEL_BIND, GetID(), CONTROL_LIST, 0, 0, m_albumSongs); OnMessage(message); } else CLog::Log(LOGERROR, "Out of date skin - needs list with id %i", CONTROL_LIST); SET_CONTROL_LABEL(CONTROL_BTN_TRACKS, 21887); } } else { SetLabel(CONTROL_ALBUM, m_album.strAlbum ); SetLabel(CONTROL_ARTIST, m_album.strArtist ); CStdString date; date.Format("%d", m_album.iYear); SetLabel(CONTROL_DATE, date ); CStdString strRating; if (m_album.iRating > 0) strRating.Format("%i/9", m_album.iRating); SetLabel(CONTROL_RATING, strRating ); SetLabel(CONTROL_GENRE, m_album.strGenre); SetLabel(CONTROL_MOODS, m_album.strMoods); SetLabel(CONTROL_STYLES, m_album.strStyles ); if (m_bViewReview) { SET_CONTROL_VISIBLE(CONTROL_TEXTAREA); SET_CONTROL_HIDDEN(CONTROL_LIST); SetLabel(CONTROL_TEXTAREA, m_album.strReview); SET_CONTROL_LABEL(CONTROL_BTN_TRACKS, 182); } else { SET_CONTROL_VISIBLE(CONTROL_LIST); if (GetControl(CONTROL_LIST)) { SET_CONTROL_HIDDEN(CONTROL_TEXTAREA); CGUIMessage message(GUI_MSG_LABEL_BIND, GetID(), CONTROL_LIST, 0, 0, m_albumSongs); OnMessage(message); } else CLog::Log(LOGERROR, "Out of date skin - needs list with id %i", CONTROL_LIST); SET_CONTROL_LABEL(CONTROL_BTN_TRACKS, 183); } } // update the thumbnail const CGUIControl* pControl = GetControl(CONTROL_IMAGE); if (pControl) { CGUIImage* pImageControl = (CGUIImage*)pControl; pImageControl->FreeResources(); pImageControl->SetFileName(m_albumItem->GetThumbnailImage()); } // disable the GetThumb button if the user isn't allowed it CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_GET_THUMB, g_settings.m_vecProfiles[g_settings.m_iLastLoadedProfileIndex].canWriteDatabases() || g_passwordManager.bMasterUser); if (!m_album.strArtist.IsEmpty() && CLastFmManager::GetInstance()->IsLastFmEnabled()) { SET_CONTROL_VISIBLE(CONTROL_BTN_LASTFM); } else { SET_CONTROL_HIDDEN(CONTROL_BTN_LASTFM); } }
bool CLastFmManager::ChangeStation(const CURL& stationUrl) { unsigned int start = CTimeUtils::GetTimeMS(); InitProgressDialog(stationUrl.Get()); StopRadio(false); if (!RadioHandShake()) { CloseProgressDialog(); CGUIDialogOK::ShowAndGetInput(15200, 15206, 0, 0); return false; } UpdateProgressDialog(15252); // Selecting station... CFileCurl http; CStdString url; CStdString html; url.Format("http://" + m_RadioBaseUrl + m_RadioBasePath + "/adjust.php?session=%s&url=%s&debug=%i", m_RadioSession, stationUrl.Get().c_str(), 0); if (!http.Get(url, html)) { CLog::Log(LOGERROR, "Connect to Last.fm to change station failed."); CloseProgressDialog(); return false; } //CLog::DebugLog("ChangeStation: %s", html.c_str()); CStdString strErrorCode; Parameter("error", html, strErrorCode); if (strErrorCode != "") { CLog::Log(LOGERROR, "Last.fm returned an error (%s) response for change station request.", strErrorCode.c_str()); CloseProgressDialog(); return false; } UpdateProgressDialog(261); //Waiting for start.... g_playlistPlayer.ClearPlaylist(PLAYLIST_MUSIC); RequestRadioTracks(); CacheTrackThumb(XBMC_LASTFM_MINTRACKS); AddToPlaylist(XBMC_LASTFM_MINTRACKS); Create(); //start thread SetEvent(m_hWorkerEvent); //kickstart the thread CSingleLock lock(m_lockPlaylist); CPlayList& playlist = g_playlistPlayer.GetPlaylist(PLAYLIST_MUSIC); if ((int)playlist.size()) { g_application.m_strPlayListFile = stationUrl.Get(); //needed to highlight the playing item g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_MUSIC); g_playlistPlayer.Play(0); CLog::Log(LOGDEBUG, "%s: Done (time: %i ms)", __FUNCTION__, (int)(CTimeUtils::GetTimeMS() - start)); CloseProgressDialog(); return true; } CloseProgressDialog(); return false; }
bool CLastFmManager::RequestRadioTracks() { unsigned int start = CTimeUtils::GetTimeMS(); CStdString url; CStdString html; url.Format("http://" + m_RadioBaseUrl + m_RadioBasePath + "/xspf.php?sk=%s&discovery=0&desktop=", m_RadioSession); { CFileCurl http; if (!http.Get(url, html)) { m_RadioSession.empty(); CLog::Log(LOGERROR, "LastFmManager: Connect to Last.fm to request tracks failed."); return false; } } //CLog::DebugLog("RequestRadioTracks: %s", html.c_str()); //parse playlist TiXmlDocument 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->m_strPath = 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)(CTimeUtils::GetTimeMS() - start)); return iNrCachedTracks > 0; }
void XMLUtils::SetHex(TiXmlNode* pRootNode, const char *strTag, uint32_t value) { CStdString strValue; strValue.Format("%x", value); SetString(pRootNode, strTag, strValue); }
int CDVDVideoCodecFFmpeg::FilterOpen(const CStdString& filters, bool scale) { int result; AVBufferSinkParams *buffersink_params; if (m_pFilterGraph) FilterClose(); if (filters.IsEmpty() && !scale) return 0; if (m_pHardware) { CLog::Log(LOGWARNING, "CDVDVideoCodecFFmpeg::FilterOpen - skipped opening filters on hardware decode"); return 0; } if (!(m_pFilterGraph = m_dllAvFilter.avfilter_graph_alloc())) { CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterOpen - unable to alloc filter graph"); return -1; } AVFilter* srcFilter = m_dllAvFilter.avfilter_get_by_name("buffer"); AVFilter* outFilter = m_dllAvFilter.avfilter_get_by_name("buffersink"); // should be last filter in the graph for now CStdString args; args.Format("%d:%d:%d:%d:%d:%d:%d", m_pCodecContext->width, m_pCodecContext->height, m_pCodecContext->pix_fmt, m_pCodecContext->time_base.num, m_pCodecContext->time_base.den, m_pCodecContext->sample_aspect_ratio.num, m_pCodecContext->sample_aspect_ratio.den); if ((result = m_dllAvFilter.avfilter_graph_create_filter(&m_pFilterIn, srcFilter, "src", args, NULL, m_pFilterGraph)) < 0) { CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterOpen - avfilter_graph_create_filter: src"); return result; } buffersink_params = m_dllAvFilter.av_buffersink_params_alloc(); buffersink_params->pixel_fmts = &m_formats[0]; #ifdef FF_API_OLD_VSINK_API if ((result = m_dllAvFilter.avfilter_graph_create_filter(&m_pFilterOut, outFilter, "out", NULL, (void*)buffersink_params->pixel_fmts, m_pFilterGraph)) < 0) #else if ((result = m_dllAvFilter.avfilter_graph_create_filter(&m_pFilterOut, outFilter, "out", NULL, buffersink_params, m_pFilterGraph)) < 0) #endif { m_dllAvUtil.av_freep(&buffersink_params); CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterOpen - avfilter_graph_create_filter: out"); return result; } m_dllAvUtil.av_freep(&buffersink_params); if (!filters.empty()) { AVFilterInOut* outputs = m_dllAvFilter.avfilter_inout_alloc(); AVFilterInOut* inputs = m_dllAvFilter.avfilter_inout_alloc(); outputs->name = m_dllAvUtil.av_strdup("in"); outputs->filter_ctx = m_pFilterIn; outputs->pad_idx = 0; outputs->next = NULL; inputs->name = m_dllAvUtil.av_strdup("out"); inputs->filter_ctx = m_pFilterOut; inputs->pad_idx = 0; inputs->next = NULL; if ((result = m_dllAvFilter.avfilter_graph_parse(m_pFilterGraph, (const char*)m_filters.c_str(), &inputs, &outputs, NULL)) < 0) { CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterOpen - avfilter_graph_parse"); return result; } m_dllAvFilter.avfilter_inout_free(&outputs); m_dllAvFilter.avfilter_inout_free(&inputs); } else { if ((result = m_dllAvFilter.avfilter_link(m_pFilterIn, 0, m_pFilterOut, 0)) < 0) { CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterOpen - avfilter_link"); return result; } } if ((result = m_dllAvFilter.avfilter_graph_config(m_pFilterGraph, NULL)) < 0) { CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterOpen - avfilter_graph_config"); return result; } return result; }
void CGUIDialogAudioSubtitleSettings::AddAudioStreams(unsigned int id) { SettingInfo setting; setting.id = id; setting.name = g_localizeStrings.Get(460); setting.type = SettingInfo::SPIN; setting.min = 0; setting.data = &m_audioStream; // get the number of audio strams for the current movie setting.max = (float)g_application.m_pPlayer->GetAudioStreamCount() - 1; m_audioStream = g_application.m_pPlayer->GetAudioStream(); if( m_audioStream < 0 ) m_audioStream = 0; // check if we have a single, stereo stream, and if so, allow us to split into // left, right or both if (!setting.max) { CStdString strAudioInfo; g_application.m_pPlayer->GetAudioInfo(strAudioInfo); int iNumChannels = atoi(strAudioInfo.Right(strAudioInfo.size() - strAudioInfo.Find("chns:") - 5).c_str()); CStdString strAudioCodec = strAudioInfo.Mid(7, strAudioInfo.Find(") VBR") - 5); bool bDTS = strstr(strAudioCodec.c_str(), "DTS") != 0; bool bAC3 = strstr(strAudioCodec.c_str(), "AC3") != 0; if (iNumChannels == 2 && !(bDTS || bAC3)) { // ok, enable these options /* if (g_stSettings.m_currentVideoSettings.m_AudioStream == -1) { // default to stereo stream g_stSettings.m_currentVideoSettings.m_AudioStream = 0; }*/ setting.max = 2; for (int i = 0; i <= setting.max; i++) setting.entry.push_back(g_localizeStrings.Get(13320 + i)); m_audioStream = -g_stSettings.m_currentVideoSettings.m_AudioStream - 1; m_settings.push_back(setting); return; } } // cycle through each audio stream and add it to our list control for (int i = 0; i <= setting.max; ++i) { CStdString strItem; CStdString strName; g_application.m_pPlayer->GetAudioStreamName(i, strName); if (strName.length() == 0) strName = "Unnamed"; strItem.Format("%s (%i/%i)", strName.c_str(), i + 1, (int)setting.max + 1); setting.entry.push_back(strItem); } if( setting.max < 0 ) { setting.max = 0; setting.entry.push_back(g_localizeStrings.Get(231).c_str()); } m_settings.push_back(setting); }
bool CVideoDatabaseDirectory::GetLabel(const CStdString& strDirectory, CStdString& strLabel) { strLabel = ""; CStdString path = CLegacyPathTranslation::TranslateVideoDbPath(strDirectory); auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(path)); if (!pNode.get() || path.IsEmpty()) return false; // first see if there's any filter criteria CQueryParams params; CDirectoryNode::GetDatabaseInfo(path, params); CVideoDatabase videodatabase; if (!videodatabase.Open()) return false; // get genre if (params.GetGenreId() != -1) strLabel += videodatabase.GetGenreById(params.GetGenreId()); // get country if (params.GetCountryId() != -1) strLabel += videodatabase.GetCountryById(params.GetCountryId()); // get set if (params.GetSetId() != -1) strLabel += videodatabase.GetSetById(params.GetSetId()); // get tag if (params.GetTagId() != -1) strLabel += videodatabase.GetTagById(params.GetTagId()); // get year if (params.GetYear() != -1) { CStdString strTemp; strTemp.Format("%i",params.GetYear()); if (!strLabel.IsEmpty()) strLabel += " / "; strLabel += strTemp; } if (strLabel.IsEmpty()) { switch (pNode->GetChildType()) { case NODE_TYPE_TITLE_MOVIES: case NODE_TYPE_TITLE_TVSHOWS: case NODE_TYPE_TITLE_MUSICVIDEOS: strLabel = g_localizeStrings.Get(369); break; case NODE_TYPE_ACTOR: // Actor strLabel = g_localizeStrings.Get(344); break; case NODE_TYPE_GENRE: // Genres strLabel = g_localizeStrings.Get(135); break; case NODE_TYPE_COUNTRY: // Countries strLabel = g_localizeStrings.Get(20451); break; case NODE_TYPE_YEAR: // Year strLabel = g_localizeStrings.Get(562); break; case NODE_TYPE_DIRECTOR: // Director strLabel = g_localizeStrings.Get(20348); break; case NODE_TYPE_SETS: // Sets strLabel = g_localizeStrings.Get(20434); break; case NODE_TYPE_TAGS: // Tags strLabel = g_localizeStrings.Get(20459); break; case NODE_TYPE_MOVIES_OVERVIEW: // Movies strLabel = g_localizeStrings.Get(342); break; case NODE_TYPE_TVSHOWS_OVERVIEW: // TV Shows strLabel = g_localizeStrings.Get(20343); break; case NODE_TYPE_RECENTLY_ADDED_MOVIES: // Recently Added Movies strLabel = g_localizeStrings.Get(20386); break; case NODE_TYPE_RECENTLY_ADDED_EPISODES: // Recently Added Episodes strLabel = g_localizeStrings.Get(20387); break; case NODE_TYPE_STUDIO: // Studios strLabel = g_localizeStrings.Get(20388); break; case NODE_TYPE_MUSICVIDEOS_OVERVIEW: // Music Videos strLabel = g_localizeStrings.Get(20389); break; case NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS: // Recently Added Music Videos strLabel = g_localizeStrings.Get(20390); break; case NODE_TYPE_SEASONS: // Seasons strLabel = g_localizeStrings.Get(33054); break; case NODE_TYPE_EPISODES: // Episodes strLabel = g_localizeStrings.Get(20360); break; default: CLog::Log(LOGWARNING, "%s - Unknown nodetype requested %d", __FUNCTION__, pNode->GetChildType()); return false; } } return true; }
// TODO: Currently no support for "embedded thumb" as there is no easy way to grab it // without sending a file that has this as it's album to this class void CGUIWindowMusicInfo::OnGetThumb() { CFileItemList items; // Grab the thumbnail from the web CStdString thumbFromWeb; CUtil::AddFileToFolder(g_advancedSettings.m_cachePath, "allmusicThumb", thumbFromWeb); int iDownloaded=DownloadThumbnail(thumbFromWeb,true); if (iDownloaded > 0) { for (int i=0;i<iDownloaded;++i) { CStdString strThumb; strThumb.Format("thumb://Remote%i",i); CFileItem *item = new CFileItem(strThumb, false); strThumb.Format("%s%i.tbn",thumbFromWeb,i); item->SetThumbnailImage(strThumb); item->SetLabel(g_localizeStrings.Get(20055)); items.Add(item); } } // Current thumb if (CFile::Exists(m_albumItem->GetThumbnailImage())) { CFileItem *item = new CFileItem("thumb://Current", false); item->SetThumbnailImage(m_albumItem->GetThumbnailImage()); item->SetLabel(g_localizeStrings.Get(20016)); items.Add(item); } // local thumb CStdString cachedLocalThumb; CStdString localThumb; if (m_bArtistInfo) { CMusicDatabase database; database.Open(); CStdString strArtistPath; database.GetArtistPath(m_artist.idArtist,strArtistPath); CUtil::AddFileToFolder(strArtistPath,"folder.jpg",localThumb); } else CStdString localThumb = m_albumItem->GetUserMusicThumb(); if (CFile::Exists(localThumb)) { CUtil::AddFileToFolder(g_advancedSettings.m_cachePath, "localthumb.jpg", cachedLocalThumb); CPicture pic; if (pic.DoCreateThumbnail(localThumb, cachedLocalThumb)) { CFileItem *item = new CFileItem("thumb://Local", false); item->SetThumbnailImage(cachedLocalThumb); item->SetLabel(g_localizeStrings.Get(20017)); items.Add(item); } } CFileItem *item = new CFileItem("thumb://None", false); if (m_bArtistInfo) item->SetThumbnailImage("defaultArtistBig.png"); else item->SetThumbnailImage("defaultAlbumCover.png"); item->SetLabel(g_localizeStrings.Get(20018)); items.Add(item); CStdString result; if (!CGUIDialogFileBrowser::ShowAndGetImage(items, g_settings.m_musicSources, g_localizeStrings.Get(1030), result)) return; // user cancelled if (result == "thumb://Current") return; // user chose the one they have // delete the thumbnail if that's what the user wants, else overwrite with the // new thumbnail CStdString cachedThumb; if (m_bArtistInfo) cachedThumb = m_albumItem->GetCachedArtistThumb(); else cachedThumb = CUtil::GetCachedAlbumThumb(m_album.strAlbum, m_album.strArtist); if (result == "thumb://None") { // cache the default thumb CPicture pic; pic.CacheSkinImage("defaultAlbumCover.png", cachedThumb); } else if (result.Left(14).Equals("thumb://Remote")) CFile::Cache(thumbFromWeb+result.Mid(14)+".tbn", cachedThumb); else if (result == "thumb://Local") CFile::Cache(cachedLocalThumb, cachedThumb); else if (CFile::Exists(result)) { CPicture pic; pic.DoCreateThumbnail(result, cachedThumb); } m_albumItem->SetThumbnailImage(cachedThumb); m_hasUpdatedThumb = true; // tell our GUI to completely reload all controls (as some of them // are likely to have had this image in use so will need refreshing) CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_REFRESH_THUMBS); g_graphicsContext.SendMessage(msg); // Update our screen Update(); }
bool CGUIWindowMusicNav::OnContextButton(int itemNumber, CONTEXT_BUTTON button) { CFileItemPtr item; if (itemNumber >= 0 && itemNumber < m_vecItems->Size()) item = m_vecItems->Get(itemNumber); switch (button) { case CONTEXT_BUTTON_INFO: { if (!item->IsVideoDb()) return CGUIWindowMusicBase::OnContextButton(itemNumber,button); // music videos - artists if (item->GetPath().Left(14).Equals("videodb://3/4/")) { long idArtist = m_musicdatabase.GetArtistByName(item->GetLabel()); if (idArtist == -1) return false; CStdString path; path.Format("musicdb://2/%ld/", idArtist); CArtist artist; m_musicdatabase.GetArtistInfo(idArtist,artist,false); *item = CFileItem(artist); item->SetPath(path); CGUIWindowMusicBase::OnContextButton(itemNumber,button); Update(m_vecItems->GetPath()); m_viewControl.SetSelectedItem(itemNumber); return true; } // music videos - albums if (item->GetPath().Left(14).Equals("videodb://3/5/")) { long idAlbum = m_musicdatabase.GetAlbumByName(item->GetLabel()); if (idAlbum == -1) return false; CStdString path; path.Format("musicdb://3/%ld/", idAlbum); CAlbum album; m_musicdatabase.GetAlbumInfo(idAlbum,album,NULL); *item = CFileItem(path,album); item->SetPath(path); CGUIWindowMusicBase::OnContextButton(itemNumber,button); Update(m_vecItems->GetPath()); m_viewControl.SetSelectedItem(itemNumber); return true; } if (item->HasVideoInfoTag() && !item->GetVideoInfoTag()->m_strTitle.IsEmpty()) { CGUIWindowVideoNav* pWindow = (CGUIWindowVideoNav*)g_windowManager.GetWindow(WINDOW_VIDEO_NAV); if (pWindow) { ADDON::ScraperPtr info; pWindow->OnInfo(item.get(),info); Update(m_vecItems->GetPath()); } } return true; } case CONTEXT_BUTTON_INFO_ALL: OnInfoAll(itemNumber); return true; case CONTEXT_BUTTON_UPDATE_LIBRARY: { g_application.StartMusicScan(""); return true; } case CONTEXT_BUTTON_SET_DEFAULT: g_settings.m_defaultMusicLibSource = GetQuickpathName(item->GetPath()); g_settings.Save(); return true; case CONTEXT_BUTTON_CLEAR_DEFAULT: g_settings.m_defaultMusicLibSource.Empty(); g_settings.Save(); return true; case CONTEXT_BUTTON_GO_TO_ARTIST: { CStdString strPath; CVideoDatabase database; database.Open(); strPath.Format("videodb://3/4/%ld/",database.GetMatchingMusicVideo(StringUtils::Join(item->GetMusicInfoTag()->GetArtist(), g_advancedSettings.m_musicItemSeparator))); g_windowManager.ActivateWindow(WINDOW_VIDEO_NAV,strPath); return true; } case CONTEXT_BUTTON_PLAY_OTHER: { CVideoDatabase database; database.Open(); CVideoInfoTag details; database.GetMusicVideoInfo("",details,database.GetMatchingMusicVideo(StringUtils::Join(item->GetMusicInfoTag()->GetArtist(), g_advancedSettings.m_musicItemSeparator),item->GetMusicInfoTag()->GetAlbum(),item->GetMusicInfoTag()->GetTitle())); g_application.getApplicationMessenger().PlayFile(CFileItem(details)); return true; } case CONTEXT_BUTTON_MARK_WATCHED: CGUIWindowVideoBase::MarkWatched(item,true); CUtil::DeleteVideoDatabaseDirectoryCache(); Update(m_vecItems->GetPath()); return true; case CONTEXT_BUTTON_MARK_UNWATCHED: CGUIWindowVideoBase::MarkWatched(item,false); CUtil::DeleteVideoDatabaseDirectoryCache(); Update(m_vecItems->GetPath()); return true; case CONTEXT_BUTTON_RENAME: CGUIWindowVideoBase::UpdateVideoTitle(item.get()); CUtil::DeleteVideoDatabaseDirectoryCache(); Update(m_vecItems->GetPath()); return true; case CONTEXT_BUTTON_DELETE: if (item->IsPlayList() || item->IsSmartPlayList()) { item->m_bIsFolder = false; CFileUtils::DeleteItem(item); } else { CGUIWindowVideoNav::DeleteItem(item.get()); CUtil::DeleteVideoDatabaseDirectoryCache(); } Update(m_vecItems->GetPath()); return true; case CONTEXT_BUTTON_SET_CONTENT: { ADDON::ScraperPtr scraper; CStdString path(item->GetPath()); CQueryParams params; CDirectoryNode::GetDatabaseInfo(item->GetPath(), params); CONTENT_TYPE content = CONTENT_ALBUMS; if (params.GetAlbumId() != -1) path.Format("musicdb://3/%i/",params.GetAlbumId()); else if (params.GetArtistId() != -1) { path.Format("musicdb://2/%i/",params.GetArtistId()); content = CONTENT_ARTISTS; } if (m_vecItems->GetPath().Equals("musicdb://1/") || item->GetPath().Equals("musicdb://2/")) { content = CONTENT_ARTISTS; } if (!m_musicdatabase.GetScraperForPath(path, scraper, ADDON::ScraperTypeFromContent(content))) { ADDON::AddonPtr defaultScraper; if (ADDON::CAddonMgr::Get().GetDefault(ADDON::ScraperTypeFromContent(content), defaultScraper)) { scraper = boost::dynamic_pointer_cast<ADDON::CScraper>(defaultScraper->Clone(defaultScraper)); } } if (CGUIDialogContentSettings::Show(scraper, content)) { m_musicdatabase.SetScraperForPath(path,scraper); if (CGUIDialogYesNo::ShowAndGetInput(20442,20443,20444,20022)) { OnInfoAll(itemNumber,true,true); } } return true; } default: break; } return CGUIWindowMusicBase::OnContextButton(itemNumber, button); }
bool CGUIWindowMusicInfo::OnMessage(CGUIMessage& message) { switch ( message.GetMessage() ) { case GUI_MSG_WINDOW_DEINIT: { CGUIMessage message(GUI_MSG_LABEL_RESET, GetID(), CONTROL_LIST); OnMessage(message); m_albumSongs->Clear(); } break; case GUI_MSG_WINDOW_INIT: { CGUIDialog::OnMessage(message); m_bViewReview = true; m_bRefresh = false; if (g_guiSettings.GetBool("network.enableinternet")) RefreshThumb(); Update(); return true; } break; case GUI_MSG_CLICKED: { int iControl = message.GetSenderId(); if (iControl == CONTROL_BTN_REFRESH) { CUtil::ClearCache(); m_bRefresh = true; Close(); return true; } else if (iControl == CONTROL_BTN_GET_THUMB) { OnGetThumb(); } else if (iControl == CONTROL_BTN_TRACKS) { m_bViewReview = !m_bViewReview; Update(); } else if (iControl == CONTROL_LIST) { int iAction = message.GetParam1(); if (ACTION_SELECT_ITEM == iAction && m_bArtistInfo) { CGUIMessage msg(GUI_MSG_ITEM_SELECTED, GetID(), iControl); g_graphicsContext.SendMessage(msg); int iItem = msg.GetParam1(); if (iItem < 0 || iItem >= (int)m_albumSongs->Size()) break; OnSearch(m_albumSongs->Get(iItem)); return true; } } else if (iControl == CONTROL_BTN_LASTFM) { CStdString strArtist = m_album.strArtist; CUtil::URLEncode(strArtist); CStdString strLink; strLink.Format("lastfm://artist/%s/similarartists", strArtist.c_str()); CURL url(strLink); CLastFmManager::GetInstance()->ChangeStation(url); } } break; } return CGUIDialog::OnMessage(message); }
bool win32_exception::write_minidump(EXCEPTION_POINTERS* pEp) { // Create the dump file where the xbmc.exe resides bool returncode = false; CStdString dumpFileName; CStdStringW dumpFileNameW; SYSTEMTIME stLocalTime; GetLocalTime(&stLocalTime); dumpFileName.Format("xbmc_crashlog-%s-%04d%02d%02d-%02d%02d%02d.dmp", mVersion.c_str(), stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay, stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond); dumpFileName.Format("%s\\%s", CWIN32Util::GetProfilePath().c_str(), CUtil::MakeLegalFileName(dumpFileName)); g_charsetConverter.utf8ToW(dumpFileName, dumpFileNameW, false); HANDLE hDumpFile = CreateFileW(dumpFileNameW.c_str(), GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0); if (hDumpFile == INVALID_HANDLE_VALUE) { LOG(LOGERROR, "CreateFile '%s' failed with error id %d", dumpFileName.c_str(), GetLastError()); goto cleanup; } // Load the DBGHELP DLL HMODULE hDbgHelpDll = ::LoadLibrary("DBGHELP.DLL"); if (!hDbgHelpDll) { LOG(LOGERROR, "LoadLibrary 'DBGHELP.DLL' failed with error id %d", GetLastError()); goto cleanup; } MINIDUMPWRITEDUMP pDump = (MINIDUMPWRITEDUMP)::GetProcAddress(hDbgHelpDll, "MiniDumpWriteDump"); if (!pDump) { LOG(LOGERROR, "Failed to locate MiniDumpWriteDump with error id %d", GetLastError()); goto cleanup; } // Initialize minidump structure MINIDUMP_EXCEPTION_INFORMATION mdei; mdei.ThreadId = GetCurrentThreadId(); mdei.ExceptionPointers = pEp; mdei.ClientPointers = FALSE; // Call the minidump api with normal dumping // We can get more detail information by using other minidump types but the dump file will be // extremely large. BOOL bMiniDumpSuccessful = pDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &mdei, 0, NULL); if( !bMiniDumpSuccessful ) { LOG(LOGERROR, "MiniDumpWriteDump failed with error id %d", GetLastError()); goto cleanup; } returncode = true; cleanup: if (hDumpFile != INVALID_HANDLE_VALUE) CloseHandle(hDumpFile); if (hDbgHelpDll) FreeLibrary(hDbgHelpDll); return returncode; }
void CWeatherJob::FormatTemperature(CStdString &text, int temp) { CTemperature temperature = CTemperature::CreateFromCelsius(temp); text.Format("%.0f", temperature.ToLocale()); }
bool CCECProcessor::RegisterClient(CCECClient *client) { if (!client) return false; libcec_configuration &configuration = *client->GetConfiguration(); if (configuration.clientVersion < CEC_CLIENT_VERSION_2_0_0) { m_libcec->AddLog(CEC_LOG_ERROR, "failed to register a new CEC client: client version %s is no longer supported", ToString((cec_client_version)configuration.clientVersion)); return false; } if (configuration.bMonitorOnly == 1) return true; if (!CECInitialised()) { m_libcec->AddLog(CEC_LOG_ERROR, "failed to register a new CEC client: CEC processor is not initialised"); return false; } // unregister the client first if it's already been marked as registered if (client->IsRegistered()) UnregisterClient(client); // ensure that controlled mode is enabled m_communication->SetControlledMode(true); m_bMonitor = false; // source logical address for requests cec_logical_address sourceAddress(CECDEVICE_UNREGISTERED); if (!m_communication->SupportsSourceLogicalAddress(CECDEVICE_UNREGISTERED)) { if (m_communication->SupportsSourceLogicalAddress(CECDEVICE_FREEUSE)) sourceAddress = CECDEVICE_FREEUSE; else { m_libcec->AddLog(CEC_LOG_ERROR, "failed to register a new CEC client: both unregistered and free use are not supported by the device"); return false; } } // ensure that we know the vendor id of the TV CCECBusDevice *tv = GetTV(); cec_vendor_id tvVendor(tv->GetVendorId(sourceAddress)); // wait until the handler is replaced, to avoid double registrations if (tvVendor != CEC_VENDOR_UNKNOWN && CCECCommandHandler::HasSpecificHandler(tvVendor)) { while (!tv->ReplaceHandler(false)) CEvent::Sleep(5); } // get the configuration from the client m_libcec->AddLog(CEC_LOG_NOTICE, "registering new CEC client - v%s", ToString((cec_client_version)configuration.clientVersion)); // get the current ackmask, so we can restore it if polling fails cec_logical_addresses previousMask = GetLogicalAddresses(); // mark as uninitialised client->SetInitialised(false); // find logical addresses for this client if (!AllocateLogicalAddresses(client)) { m_libcec->AddLog(CEC_LOG_ERROR, "failed to register the new CEC client - cannot allocate the requested device types"); SetLogicalAddresses(previousMask); return false; } // get the settings from the rom if (configuration.bGetSettingsFromROM == 1) { libcec_configuration config; config.Clear(); m_communication->GetConfiguration(config); CLockObject lock(m_mutex); if (!config.deviceTypes.IsEmpty()) configuration.deviceTypes = config.deviceTypes; if (CLibCEC::IsValidPhysicalAddress(config.iPhysicalAddress)) configuration.iPhysicalAddress = config.iPhysicalAddress; snprintf(configuration.strDeviceName, 13, "%s", config.strDeviceName); } // set the firmware version and build date configuration.serverVersion = LIBCEC_VERSION_CURRENT; configuration.iFirmwareVersion = m_communication->GetFirmwareVersion(); configuration.iFirmwareBuildDate = m_communication->GetFirmwareBuildDate(); configuration.adapterType = m_communication->GetAdapterType(); // mark the client as registered client->SetRegistered(true); sourceAddress = client->GetPrimaryLogicalAdddress(); // initialise the client bool bReturn = client->OnRegister(); // log the new registration CStdString strLog; strLog.Format("%s: %s", bReturn ? "CEC client registered" : "failed to register the CEC client", client->GetConnectionInfo().c_str()); m_libcec->AddLog(bReturn ? CEC_LOG_NOTICE : CEC_LOG_ERROR, strLog); // display a warning if the firmware can be upgraded if (bReturn && !IsRunningLatestFirmware()) { const char *strUpgradeMessage = "The firmware of this adapter can be upgraded. Please visit http://blog.pulse-eight.com/ for more information."; m_libcec->AddLog(CEC_LOG_WARNING, strUpgradeMessage); libcec_parameter param; param.paramData = (void*)strUpgradeMessage; param.paramType = CEC_PARAMETER_TYPE_STRING; client->Alert(CEC_ALERT_SERVICE_DEVICE, param); } // ensure that the command handler for the TV is initialised if (bReturn) { CCECCommandHandler *handler = GetTV()->GetHandler(); if (handler) handler->InitHandler(); GetTV()->MarkHandlerReady(); } // report our OSD name to the TV, since some TVs don't request it client->GetPrimaryDevice()->TransmitOSDName(CECDEVICE_TV, false); // request the power status of the TV tv->RequestPowerStatus(sourceAddress, true, true); return bReturn; }
void XBPyThread::Process() { CLog::Log(LOGDEBUG,"Python thread: start processing"); int m_Py_file_input = Py_file_input; // get the global lock PyEval_AcquireLock(); PyThreadState* state = Py_NewInterpreter(); if (!state) { PyEval_ReleaseLock(); CLog::Log(LOGERROR,"Python thread: FAILED to get thread state!"); return; } // swap in my thread state PyThreadState_Swap(state); XBMCAddon::AddonClass::Ref<XBMCAddon::Python::LanguageHook> languageHook(new XBMCAddon::Python::LanguageHook(state->interp)); languageHook->RegisterMe(); m_pExecuter->InitializeInterpreter(addon); CLog::Log(LOGDEBUG, "%s - The source file to load is %s", __FUNCTION__, m_source); // get path from script file name and add python path's // this is used for python so it will search modules from script path first CStdString scriptDir; URIUtils::GetDirectory(CSpecialProtocol::TranslatePath(m_source), scriptDir); URIUtils::RemoveSlashAtEnd(scriptDir); CStdString path = scriptDir; // add on any addon modules the user has installed ADDON::VECADDONS addons; ADDON::CAddonMgr::Get().GetAddons(ADDON::ADDON_SCRIPT_MODULE, addons); for (unsigned int i = 0; i < addons.size(); ++i) #ifdef TARGET_WINDOWS { CStdString strTmp(CSpecialProtocol::TranslatePath(addons[i]->LibPath())); g_charsetConverter.utf8ToSystem(strTmp); path += PY_PATH_SEP + strTmp; } #else path += PY_PATH_SEP + CSpecialProtocol::TranslatePath(addons[i]->LibPath()); #endif // and add on whatever our default path is path += PY_PATH_SEP; // we want to use sys.path so it includes site-packages // if this fails, default to using Py_GetPath PyObject *sysMod(PyImport_ImportModule((char*)"sys")); // must call Py_DECREF when finished PyObject *sysModDict(PyModule_GetDict(sysMod)); // borrowed ref, no need to delete PyObject *pathObj(PyDict_GetItemString(sysModDict, "path")); // borrowed ref, no need to delete if( pathObj && PyList_Check(pathObj) ) { for( int i = 0; i < PyList_Size(pathObj); i++ ) { PyObject *e = PyList_GetItem(pathObj, i); // borrowed ref, no need to delete if( e && PyString_Check(e) ) { path += PyString_AsString(e); // returns internal data, don't delete or modify path += PY_PATH_SEP; } } } else { path += Py_GetPath(); } Py_DECREF(sysMod); // release ref to sysMod // set current directory and python's path. if (m_argv != NULL) PySys_SetArgv(m_argc, m_argv); CLog::Log(LOGDEBUG, "%s - Setting the Python path to %s", __FUNCTION__, path.c_str()); PySys_SetPath((char *)path.c_str()); CLog::Log(LOGDEBUG, "%s - Entering source directory %s", __FUNCTION__, scriptDir.c_str()); PyObject* module = PyImport_AddModule((char*)"__main__"); PyObject* moduleDict = PyModule_GetDict(module); // when we are done initing we store thread state so we can be aborted PyThreadState_Swap(NULL); PyEval_ReleaseLock(); // we need to check if we was asked to abort before we had inited bool stopping = false; { CSingleLock lock(m_critSec); m_threadState = state; stopping = m_stopping; } PyEval_AcquireLock(); PyThreadState_Swap(state); if (!stopping) { try { if (m_type == 'F') { // run script from file // We need to have python open the file because on Windows the DLL that python // is linked against may not be the DLL that xbmc is linked against so // passing a FILE* to python from an fopen has the potential to crash. PyObject* file = PyFile_FromString((char *) CSpecialProtocol::TranslatePath(m_source).c_str(), (char*)"r"); FILE *fp = PyFile_AsFile(file); if (fp) { PyObject *f = PyString_FromString(CSpecialProtocol::TranslatePath(m_source).c_str()); PyDict_SetItemString(moduleDict, "__file__", f); if (addon.get() != NULL) { PyObject *pyaddonid = PyString_FromString(addon->ID().c_str()); PyDict_SetItemString(moduleDict, "__xbmcaddonid__", pyaddonid); CStdString version = ADDON::GetXbmcApiVersionDependency(addon); PyObject *pyxbmcapiversion = PyString_FromString(version.c_str()); PyDict_SetItemString(moduleDict, "__xbmcapiversion__", pyxbmcapiversion); CLog::Log(LOGDEBUG,"Instantiating addon using automatically obtained id of \"%s\" dependent on version %s of the xbmc.python api",addon->ID().c_str(),version.c_str()); } Py_DECREF(f); XBMCAddon::Python::PyContext pycontext; // this is a guard class that marks this callstack as being in a python context PyRun_FileExFlags(fp, CSpecialProtocol::TranslatePath(m_source).c_str(), m_Py_file_input, moduleDict, moduleDict,1,NULL); } else CLog::Log(LOGERROR, "%s not found!", m_source); } else { //run script PyRun_String(m_source, m_Py_file_input, moduleDict, moduleDict); } } catch (const XbmcCommons::Exception& e) { e.LogThrowMessage(); } catch (...) { CLog::Log(LOGERROR, "failure in %s", m_source); } } bool systemExitThrown = false; if (!PyErr_Occurred()) CLog::Log(LOGINFO, "Scriptresult: Success"); else if (PyErr_ExceptionMatches(PyExc_SystemExit)) { systemExitThrown = true; CLog::Log(LOGINFO, "Scriptresult: Aborted"); } else { PythonBindings::PythonToCppException e; e.LogThrowMessage(); { CPyThreadState releaseGil; CSingleLock gc(g_graphicsContext); CGUIDialogKaiToast *pDlgToast = (CGUIDialogKaiToast*)g_windowManager.GetWindow(WINDOW_DIALOG_KAI_TOAST); if (pDlgToast) { CStdString desc; CStdString path; CStdString script; URIUtils::Split(m_source, path, script); if (script.Equals("default.py")) { CStdString path2; URIUtils::RemoveSlashAtEnd(path); URIUtils::Split(path, path2, script); } desc.Format(g_localizeStrings.Get(2100), script); pDlgToast->QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(257), desc); } } } PyObject *m = PyImport_AddModule((char*)"xbmc"); if(!m || PyObject_SetAttrString(m, (char*)"abortRequested", PyBool_FromLong(1))) CLog::Log(LOGERROR, "Scriptresult: failed to set abortRequested"); // make sure all sub threads have finished for(PyThreadState* s = state->interp->tstate_head, *old = NULL; s;) { if(s == state) { s = s->next; continue; } if(old != s) { CLog::Log(LOGINFO, "Scriptresult: Waiting on thread %"PRIu64, (uint64_t)s->thread_id); old = s; } CPyThreadState pyState; Sleep(100); pyState.Restore(); s = state->interp->tstate_head; } // pending calls must be cleared out XBMCAddon::RetardedAsynchCallbackHandler::clearPendingCalls(state); PyThreadState_Swap(NULL); PyEval_ReleaseLock(); //set stopped event - this allows ::stop to run and kill remaining threads //this event has to be fired without holding m_critSec // //Also the GIL (PyEval_AcquireLock) must not be held //if not obeyed there is still no deadlock because ::stop waits with timeout (smart one!) stoppedEvent.Set(); { CSingleLock lock(m_critSec); m_threadState = NULL; } PyEval_AcquireLock(); PyThreadState_Swap(state); m_pExecuter->DeInitializeInterpreter(); // run the gc before finishing // // if the script exited by throwing a SystemExit excepton then going back // into the interpreter causes this python bug to get hit: // http://bugs.python.org/issue10582 // and that causes major failures. So we are not going to go back in // to run the GC if that's the case. if (!m_stopping && languageHook->HasRegisteredAddonClasses() && !systemExitThrown && PyRun_SimpleString(GC_SCRIPT) == -1) CLog::Log(LOGERROR,"Failed to run the gc to clean up after running prior to shutting down the Interpreter %s",m_source); Py_EndInterpreter(state); // If we still have objects left around, produce an error message detailing what's been left behind if (languageHook->HasRegisteredAddonClasses()) CLog::Log(LOGWARNING, "The python script \"%s\" has left several " "classes in memory that we couldn't clean up. The classes include: %s", m_source, getListOfAddonClassesAsString(languageHook).c_str()); // unregister the language hook languageHook->UnregisterMe(); PyEval_ReleaseLock(); }
CStdString CGUIProgressControl::GetDescription() const { CStdString percent; percent.Format("%2.f", m_fPercent); return percent; }
void CGUIDialogMediaFilter::OnSettingChanged(SettingInfo &setting) { map<uint32_t, Filter>::iterator it = m_filters.find(setting.id); if (it == m_filters.end()) return; bool changed = true; bool remove = false; Filter& filter = it->second; switch (filter.type) { case SettingInfo::STRING: case SettingInfo::EDIT: { CStdString *str = static_cast<CStdString*>(filter.data); if (!str->empty()) { if (filter.rule == NULL) filter.rule = AddRule(filter.field, filter.ruleOperator); filter.rule->m_parameter.clear(); filter.rule->m_parameter.push_back(*str); } else remove = true; break; } case SettingInfo::CHECK: { int choice = *(int *)setting.data; if (choice > CHECK_ALL) { CSmartPlaylistRule::SEARCH_OPERATOR ruleOperator = choice == CHECK_YES ? CSmartPlaylistRule::OPERATOR_TRUE : CSmartPlaylistRule::OPERATOR_FALSE; if (filter.rule == NULL) filter.rule = AddRule(filter.field, ruleOperator); else filter.rule->m_operator = ruleOperator; } else remove = true; break; } case SettingInfo::BUTTON: { CFileItemList items; OnBrowse(filter, items); if (items.Size() > 0) { if (filter.rule == NULL) filter.rule = AddRule(filter.field, filter.ruleOperator); filter.rule->m_parameter.clear(); for (int index = 0; index < items.Size(); index++) filter.rule->m_parameter.push_back(items[index]->GetLabel()); *(CStdString *)filter.data = filter.rule->GetLocalizedParameter(m_mediaType); } else { remove = true; *(CStdString *)filter.data = ""; } SET_CONTROL_LABEL2(filter.controlIndex, *(CStdString *)filter.data); break; } case SettingInfo::RANGE: { SettingInfo &setting = m_settings[filter.controlIndex - CONTROL_START]; float *valueLower = ((float **)filter.data)[0]; float *valueUpper = ((float **)filter.data)[1]; if (*valueLower > setting.min || *valueUpper < setting.max) { if (filter.rule == NULL) filter.rule = AddRule(filter.field, filter.ruleOperator); filter.rule->m_parameter.clear(); if (filter.field == FieldAirDate) { CDateTime lower = (time_t)*valueLower; CDateTime upper = (time_t)*valueUpper; filter.rule->m_parameter.push_back(lower.GetAsDBDate()); filter.rule->m_parameter.push_back(upper.GetAsDBDate()); } else { CStdString tmp; tmp.Format("%.1f", *valueLower); filter.rule->m_parameter.push_back(tmp); tmp.clear(); tmp.Format("%.1f", *valueUpper); filter.rule->m_parameter.push_back(tmp); } } else { remove = true; *((float **)filter.data)[0] = setting.min; *((float **)filter.data)[1] = setting.max; } break; } default: changed = false; break; } // we need to remove the existing rule for the title if (remove && filter.rule != NULL) { DeleteRule(filter.field); filter.rule = NULL; } if (changed) { CGUIMessage message(GUI_MSG_NOTIFY_ALL, GetID(), 0, GUI_MSG_FILTER_ITEMS, 10); // 10 for advanced g_windowManager.SendMessage(message); UpdateControls(); } }
LRESULT CALLBACK CWinEventsWin32::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { XBMC_Event newEvent; ZeroMemory(&newEvent, sizeof(newEvent)); static HDEVNOTIFY hDeviceNotify; if (uMsg == WM_CREATE) { g_hWnd = hWnd; SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG)(((LPCREATESTRUCT)lParam)->lpCreateParams)); DIB_InitOSKeymap(); g_uQueryCancelAutoPlay = RegisterWindowMessage(TEXT("QueryCancelAutoPlay")); shcne.pidl = NULL; shcne.fRecursive = TRUE; long fEvents = SHCNE_DRIVEADD | SHCNE_DRIVEREMOVED | SHCNE_MEDIAREMOVED | SHCNE_MEDIAINSERTED; SHChangeNotifyRegister(hWnd, SHCNRF_ShellLevel | SHCNRF_NewDelivery, fEvents, WM_MEDIA_CHANGE, 1, &shcne); RegisterDeviceInterfaceToHwnd(USB_HID_GUID, hWnd, &hDeviceNotify); return 0; } if (uMsg == WM_DESTROY) g_hWnd = NULL; m_pEventFunc = (PHANDLE_EVENT_FUNC)GetWindowLongPtr(hWnd, GWLP_USERDATA); if (!m_pEventFunc) return DefWindowProc(hWnd, uMsg, wParam, lParam); if(g_uQueryCancelAutoPlay != 0 && uMsg == g_uQueryCancelAutoPlay) return S_FALSE; switch (uMsg) { case WM_CLOSE: case WM_QUIT: case WM_DESTROY: if (hDeviceNotify) UnregisterDeviceNotification(hDeviceNotify); newEvent.type = XBMC_QUIT; m_pEventFunc(newEvent); break; case WM_SHOWWINDOW: { bool active = g_application.GetRenderGUI(); g_application.SetRenderGUI(wParam != 0); if (g_application.GetRenderGUI() != active) g_Windowing.NotifyAppActiveChange(g_application.GetRenderGUI()); CLog::Log(LOGDEBUG, __FUNCTION__"Window is %s", g_application.GetRenderGUI() ? "shown" : "hidden"); } break; case WM_ACTIVATE: { if( WA_INACTIVE != wParam ) g_Joystick.Reinitialize(); bool active = g_application.GetRenderGUI(); if (HIWORD(wParam)) { g_application.SetRenderGUI(false); } else { WINDOWPLACEMENT lpwndpl; lpwndpl.length = sizeof(lpwndpl); if (LOWORD(wParam) != WA_INACTIVE) { if (GetWindowPlacement(hWnd, &lpwndpl)) g_application.SetRenderGUI(lpwndpl.showCmd != SW_HIDE); } else { g_application.SetRenderGUI(g_Windowing.WindowedMode()); } } if (g_application.GetRenderGUI() != active) g_Windowing.NotifyAppActiveChange(g_application.GetRenderGUI()); CLog::Log(LOGDEBUG, __FUNCTION__"Window is %s", g_application.GetRenderGUI() ? "active" : "inactive"); } break; case WM_SETFOCUS: case WM_KILLFOCUS: g_application.m_AppFocused = uMsg == WM_SETFOCUS; g_Windowing.NotifyAppFocusChange(g_application.m_AppFocused); if (uMsg == WM_KILLFOCUS) { CStdString procfile; if (CWIN32Util::GetFocussedProcess(procfile)) CLog::Log(LOGDEBUG, __FUNCTION__": Focus switched to process %s", procfile.c_str()); } break; /* needs to be reviewed after frodo. we reset the system idle timer and the display timer directly now (see m_screenSaverTimer). case WM_SYSCOMMAND: switch( wParam&0xFFF0 ) { case SC_MONITORPOWER: if (g_application.IsPlaying() || g_application.IsPaused()) return 0; else if(CSettings::Get().GetInt("powermanagement.displaysoff") == 0) return 0; break; case SC_SCREENSAVE: return 0; } break;*/ case WM_SYSKEYDOWN: switch (wParam) { case VK_F4: //alt-f4, default event quit. return(DefWindowProc(hWnd, uMsg, wParam, lParam)); case VK_RETURN: //alt-return if ((lParam & REPEATED_KEYMASK) == 0) g_graphicsContext.ToggleFullScreenRoot(); return 0; } //deliberate fallthrough case WM_KEYDOWN: { switch (wParam) { case VK_V: if(GetKeyState(VK_CONTROL) & 0x8000) { // CTRL+V if(OpenClipboard(NULL)) { CStdString strtext; HANDLE htext = GetClipboardData(CF_UNICODETEXT); CStdStringW strwtext = (WCHAR*)htext; g_charsetConverter.wToUTF8(strwtext, strtext); if(!strtext.empty()) { CGUIMessage msg(GUI_MSG_INPUT_TEXT, 0, 0); msg.SetLabel(strtext); g_windowManager.SendMessage(msg, g_windowManager.GetFocusedWindow()); } CloseClipboard(); return(0); } } case VK_CONTROL: if ( lParam & EXTENDED_KEYMASK ) wParam = VK_RCONTROL; else wParam = VK_LCONTROL; break; case VK_SHIFT: /* EXTENDED trick doesn't work here */ if (GetKeyState(VK_LSHIFT) & 0x8000) wParam = VK_LSHIFT; else if (GetKeyState(VK_RSHIFT) & 0x8000) wParam = VK_RSHIFT; break; case VK_MENU: if ( lParam & EXTENDED_KEYMASK ) wParam = VK_RMENU; else wParam = VK_LMENU; break; } XBMC_keysym keysym; TranslateKey(wParam, HIWORD(lParam), &keysym, 1); newEvent.type = XBMC_KEYDOWN; newEvent.key.keysym = keysym; m_pEventFunc(newEvent); } return(0); case WM_SYSKEYUP: case WM_KEYUP: { switch (wParam) { case VK_CONTROL: if ( lParam&EXTENDED_KEYMASK ) wParam = VK_RCONTROL; else wParam = VK_LCONTROL; break; case VK_SHIFT: { uint32_t scanCodeL = MapVirtualKey(VK_LSHIFT, MAPVK_VK_TO_VSC); uint32_t scanCodeR = MapVirtualKey(VK_RSHIFT, MAPVK_VK_TO_VSC); uint32_t keyCode = (uint32_t)((lParam & 0xFF0000) >> 16); if (keyCode == scanCodeL) wParam = VK_LSHIFT; else if (keyCode == scanCodeR) wParam = VK_RSHIFT; } break; case VK_MENU: if ( lParam&EXTENDED_KEYMASK ) wParam = VK_RMENU; else wParam = VK_LMENU; break; } XBMC_keysym keysym; TranslateKey(wParam, HIWORD(lParam), &keysym, 1); if (wParam == VK_SNAPSHOT) newEvent.type = XBMC_KEYDOWN; else newEvent.type = XBMC_KEYUP; newEvent.key.keysym = keysym; m_pEventFunc(newEvent); } return(0); case WM_APPCOMMAND: // MULTIMEDIA keys are mapped to APPCOMMANDS { CLog::Log(LOGDEBUG, "WinEventsWin32.cpp: APPCOMMAND %d", GET_APPCOMMAND_LPARAM(lParam)); newEvent.appcommand.type = XBMC_APPCOMMAND; newEvent.appcommand.action = GET_APPCOMMAND_LPARAM(lParam); if (m_pEventFunc(newEvent)) return TRUE; else return DefWindowProc(hWnd, uMsg, wParam, lParam); } case WM_GESTURENOTIFY: { OnGestureNotify(hWnd, lParam); return DefWindowProc(hWnd, WM_GESTURENOTIFY, wParam, lParam); } case WM_GESTURE: { OnGesture(hWnd, lParam); return 0; } case WM_SYSCHAR: if (wParam == VK_RETURN) //stop system beep on alt-return return 0; break; case WM_SETCURSOR: if (HTCLIENT != LOWORD(lParam)) g_Windowing.ShowOSMouse(true); break; case WM_MOUSEMOVE: newEvent.type = XBMC_MOUSEMOTION; newEvent.motion.x = GET_X_LPARAM(lParam); newEvent.motion.y = GET_Y_LPARAM(lParam); newEvent.motion.state = 0; m_pEventFunc(newEvent); return(0); case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: newEvent.type = XBMC_MOUSEBUTTONDOWN; newEvent.button.state = XBMC_PRESSED; newEvent.button.x = GET_X_LPARAM(lParam); newEvent.button.y = GET_Y_LPARAM(lParam); newEvent.button.button = 0; if (uMsg == WM_LBUTTONDOWN) newEvent.button.button = XBMC_BUTTON_LEFT; else if (uMsg == WM_MBUTTONDOWN) newEvent.button.button = XBMC_BUTTON_MIDDLE; else if (uMsg == WM_RBUTTONDOWN) newEvent.button.button = XBMC_BUTTON_RIGHT; m_pEventFunc(newEvent); return(0); case WM_LBUTTONUP: case WM_MBUTTONUP: case WM_RBUTTONUP: newEvent.type = XBMC_MOUSEBUTTONUP; newEvent.button.state = XBMC_RELEASED; newEvent.button.x = GET_X_LPARAM(lParam); newEvent.button.y = GET_Y_LPARAM(lParam); newEvent.button.button = 0; if (uMsg == WM_LBUTTONUP) newEvent.button.button = XBMC_BUTTON_LEFT; else if (uMsg == WM_MBUTTONUP) newEvent.button.button = XBMC_BUTTON_MIDDLE; else if (uMsg == WM_RBUTTONUP) newEvent.button.button = XBMC_BUTTON_RIGHT; m_pEventFunc(newEvent); return(0); case WM_MOUSEWHEEL: { // SDL, which our events system is based off, sends a MOUSEBUTTONDOWN message // followed by a MOUSEBUTTONUP message. As this is a momentary event, we just // react on the MOUSEBUTTONUP message, resetting the state after processing. newEvent.type = XBMC_MOUSEBUTTONDOWN; newEvent.button.state = XBMC_PRESSED; // the coordinates in WM_MOUSEWHEEL are screen, not client coordinates POINT point; point.x = GET_X_LPARAM(lParam); point.y = GET_Y_LPARAM(lParam); WindowFromScreenCoords(hWnd, &point); newEvent.button.x = (uint16_t)point.x; newEvent.button.y = (uint16_t)point.y; newEvent.button.button = GET_Y_LPARAM(wParam) > 0 ? XBMC_BUTTON_WHEELUP : XBMC_BUTTON_WHEELDOWN; m_pEventFunc(newEvent); newEvent.type = XBMC_MOUSEBUTTONUP; newEvent.button.state = XBMC_RELEASED; m_pEventFunc(newEvent); } return(0); case WM_SIZE: newEvent.type = XBMC_VIDEORESIZE; newEvent.resize.w = GET_X_LPARAM(lParam); newEvent.resize.h = GET_Y_LPARAM(lParam); CLog::Log(LOGDEBUG, __FUNCTION__": window resize event"); if (!g_Windowing.IsAlteringWindow() && newEvent.resize.w > 0 && newEvent.resize.h > 0) m_pEventFunc(newEvent); return(0); case WM_MOVE: newEvent.type = XBMC_VIDEOMOVE; newEvent.move.x = GET_X_LPARAM(lParam); newEvent.move.y = GET_Y_LPARAM(lParam); CLog::Log(LOGDEBUG, __FUNCTION__": window move event"); if (!g_Windowing.IsAlteringWindow()) m_pEventFunc(newEvent); return(0); case WM_MEDIA_CHANGE: { // This event detects media changes of usb, sd card and optical media. // It only works if the explorer.exe process is started. Because this // isn't the case for all setups we use WM_DEVICECHANGE for usb and // optical media because this event is also triggered without the // explorer process. Since WM_DEVICECHANGE doesn't detect sd card changes // we still use this event only for sd. long lEvent; PIDLIST_ABSOLUTE *ppidl; HANDLE hLock = SHChangeNotification_Lock((HANDLE)wParam, (DWORD)lParam, &ppidl, &lEvent); if (hLock) { char drivePath[MAX_PATH+1]; if (!SHGetPathFromIDList(ppidl[0], drivePath)) break; switch(lEvent) { case SHCNE_DRIVEADD: case SHCNE_MEDIAINSERTED: if (GetDriveType(drivePath) != DRIVE_CDROM) { CLog::Log(LOGDEBUG, __FUNCTION__": Drive %s Media has arrived.", drivePath); CWin32StorageProvider::SetEvent(); } break; case SHCNE_DRIVEREMOVED: case SHCNE_MEDIAREMOVED: if (GetDriveType(drivePath) != DRIVE_CDROM) { CLog::Log(LOGDEBUG, __FUNCTION__": Drive %s Media was removed.", drivePath); CWin32StorageProvider::SetEvent(); } break; } SHChangeNotification_Unlock(hLock); } break; } case WM_POWERBROADCAST: if (wParam==PBT_APMSUSPEND) { CLog::Log(LOGDEBUG,"WM_POWERBROADCAST: PBT_APMSUSPEND event was sent"); CWin32PowerSyscall::SetOnSuspend(); } else if(wParam==PBT_APMRESUMEAUTOMATIC) { CLog::Log(LOGDEBUG,"WM_POWERBROADCAST: PBT_APMRESUMEAUTOMATIC event was sent"); CWin32PowerSyscall::SetOnResume(); } break; case WM_DEVICECHANGE: { switch(wParam) { case DBT_DEVNODES_CHANGED: g_peripherals.TriggerDeviceScan(PERIPHERAL_BUS_USB); break; case DBT_DEVICEARRIVAL: case DBT_DEVICEREMOVECOMPLETE: if (((_DEV_BROADCAST_HEADER*) lParam)->dbcd_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { g_peripherals.TriggerDeviceScan(PERIPHERAL_BUS_USB); g_Joystick.Reinitialize(); } // check if an usb or optical media was inserted or removed if (((_DEV_BROADCAST_HEADER*) lParam)->dbcd_devicetype == DBT_DEVTYP_VOLUME) { PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)((_DEV_BROADCAST_HEADER*) lParam); // optical medium if (lpdbv -> dbcv_flags & DBTF_MEDIA) { CStdString strdrive; strdrive.Format("%c:\\", CWIN32Util::FirstDriveFromMask(lpdbv ->dbcv_unitmask)); if(wParam == DBT_DEVICEARRIVAL) { CLog::Log(LOGDEBUG, __FUNCTION__": Drive %s Media has arrived.", strdrive.c_str()); CJobManager::GetInstance().AddJob(new CDetectDisc(strdrive, true), NULL); } else { CLog::Log(LOGDEBUG, __FUNCTION__": Drive %s Media was removed.", strdrive.c_str()); CMediaSource share; share.strPath = strdrive; share.strName = share.strPath; g_mediaManager.RemoveAutoSource(share); } } else CWin32StorageProvider::SetEvent(); } } break; } case WM_PAINT: //some other app has painted over our window, mark everything as dirty g_windowManager.MarkDirty(); break; case BONJOUR_EVENT: CZeroconf::GetInstance()->ProcessResults(); break; case BONJOUR_BROWSER_EVENT: CZeroconfBrowser::GetInstance()->ProcessResults(); break; } return(DefWindowProc(hWnd, uMsg, wParam, lParam)); }
void CGUIDialogMediaFilter::OnBrowse(const Filter &filter, CFileItemList &items, bool countOnly /* = false */) { CFileItemList selectItems; if (m_mediaType == "movies" || m_mediaType == "tvshows" || m_mediaType == "episodes" || m_mediaType == "musicvideos") { CVideoDatabase videodb; if (!videodb.Open()) return; CSmartPlaylist tmpFilter = *m_filter; for (vector<CSmartPlaylistRule>::iterator rule = tmpFilter.m_ruleCombination.m_rules.begin(); rule != tmpFilter.m_ruleCombination.m_rules.end(); rule++) { if (rule->m_field == filter.field) { tmpFilter.m_ruleCombination.m_rules.erase(rule); break; } } std::set<CStdString> playlists; CDatabase::Filter dbfilter; dbfilter.where = tmpFilter.GetWhereClause(videodb, playlists); VIDEODB_CONTENT_TYPE type = VIDEODB_CONTENT_MOVIES; if (m_mediaType == "tvshows") type = VIDEODB_CONTENT_TVSHOWS; else if (m_mediaType == "episodes") type = VIDEODB_CONTENT_EPISODES; else if (m_mediaType == "musicvideos") type = VIDEODB_CONTENT_MUSICVIDEOS; if (filter.field == FieldGenre) videodb.GetGenresNav(m_dbUrl->ToString(), selectItems, type, dbfilter, countOnly); else if (filter.field == FieldActor || filter.field == FieldArtist) videodb.GetActorsNav(m_dbUrl->ToString(), selectItems, type, dbfilter, countOnly); else if (filter.field == FieldDirector) videodb.GetDirectorsNav(m_dbUrl->ToString(), selectItems, type, dbfilter, countOnly); else if (filter.field == FieldStudio) videodb.GetStudiosNav(m_dbUrl->ToString(), selectItems, type, dbfilter, countOnly); else if (filter.field == FieldAlbum) videodb.GetMusicVideoAlbumsNav(m_dbUrl->ToString(), selectItems, -1, dbfilter, countOnly); else if (filter.field == FieldTag) videodb.GetTagsNav(m_dbUrl->ToString(), selectItems, type, dbfilter, countOnly); } else if (m_mediaType == "artists" || m_mediaType == "albums" || m_mediaType == "songs") { CMusicDatabase musicdb; if (!musicdb.Open()) return; CSmartPlaylist tmpFilter = *m_filter; for (vector<CSmartPlaylistRule>::iterator rule = tmpFilter.m_ruleCombination.m_rules.begin(); rule != tmpFilter.m_ruleCombination.m_rules.end(); rule++) { if (rule->m_field == filter.field) { tmpFilter.m_ruleCombination.m_rules.erase(rule); break; } } std::set<CStdString> playlists; CDatabase::Filter dbfilter; dbfilter.where = tmpFilter.GetWhereClause(musicdb, playlists); if (filter.field == FieldGenre) musicdb.GetGenresNav(m_dbUrl->ToString(), selectItems, dbfilter, countOnly); else if (filter.field == FieldArtist) musicdb.GetArtistsNav(m_dbUrl->ToString(), selectItems, m_mediaType == "albums", -1, -1, -1, dbfilter, SortDescription(), countOnly); else if (filter.field == FieldAlbum) musicdb.GetAlbumsNav(m_dbUrl->ToString(), selectItems, -1, -1, dbfilter, SortDescription(), countOnly); else if (filter.field == FieldAlbumType) musicdb.GetAlbumTypesNav(m_dbUrl->ToString(), selectItems, dbfilter, countOnly); else if (filter.field == FieldMusicLabel) musicdb.GetMusicLabelsNav(m_dbUrl->ToString(), selectItems, dbfilter, countOnly); } if (selectItems.Size() <= 0) return; if (countOnly) { items.Copy(selectItems); return; } // sort the items selectItems.Sort(SORT_METHOD_LABEL, SortOrderAscending); CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); pDialog->Reset(); pDialog->SetItems(&selectItems); CStdString strHeading; strHeading.Format(g_localizeStrings.Get(13401), g_localizeStrings.Get(filter.label)); pDialog->SetHeading(strHeading); pDialog->SetMultiSelection(true); if (filter.rule != NULL && !filter.rule->m_parameter.empty()) pDialog->SetSelected(filter.rule->m_parameter); pDialog->DoModal(); if (pDialog->IsConfirmed()) items.Copy(pDialog->GetSelectedItems()); else items.Clear(); pDialog->Reset(); }
// Allow user to select a Fanart void CGUIDialogMusicInfo::OnGetFanart() { CFileItemList items; if (m_albumItem->HasArt("fanart")) { CFileItemPtr itemCurrent(new CFileItem("fanart://Current",false)); itemCurrent->SetArt("thumb", m_albumItem->GetArt("fanart")); itemCurrent->SetLabel(g_localizeStrings.Get(20440)); items.Add(itemCurrent); } // Grab the thumbnails from the web for (unsigned int i = 0; i < m_artist.fanart.GetNumFanarts(); i++) { CStdString strItemPath; strItemPath.Format("fanart://Remote%i",i); CFileItemPtr item(new CFileItem(strItemPath, false)); CStdString thumb = m_artist.fanart.GetPreviewURL(i); item->SetArt("thumb", CTextureCache::GetWrappedThumbURL(thumb)); item->SetIconImage("DefaultPicture.png"); item->SetLabel(g_localizeStrings.Get(20441)); // TODO: Do we need to clear the cached image? // CTextureCache::Get().ClearCachedImage(thumb); items.Add(item); } // Grab a local thumb CMusicDatabase database; database.Open(); CStdString strArtistPath; database.GetArtistPath(m_artist.idArtist,strArtistPath); CFileItem item(strArtistPath,true); CStdString strLocal = item.GetLocalFanart(); if (!strLocal.IsEmpty()) { CFileItemPtr itemLocal(new CFileItem("fanart://Local",false)); itemLocal->SetArt("thumb", strLocal); itemLocal->SetLabel(g_localizeStrings.Get(20438)); // TODO: Do we need to clear the cached image? CTextureCache::Get().ClearCachedImage(strLocal); items.Add(itemLocal); } else { CFileItemPtr itemNone(new CFileItem("fanart://None", false)); itemNone->SetIconImage("DefaultArtist.png"); itemNone->SetLabel(g_localizeStrings.Get(20439)); items.Add(itemNone); } CStdString result; VECSOURCES sources = *CMediaSourceSettings::Get().GetSources("music"); g_mediaManager.GetLocalDrives(sources); bool flip=false; if (!CGUIDialogFileBrowser::ShowAndGetImage(items, sources, g_localizeStrings.Get(20437), result, &flip, 20445)) return; // user cancelled // delete the thumbnail if that's what the user wants, else overwrite with the // new thumbnail if (result.Equals("fanart://Current")) return; if (result.Equals("fanart://Local")) result = strLocal; if (result.Left(15) == "fanart://Remote") { int iFanart = atoi(result.Mid(15).c_str()); m_artist.fanart.SetPrimaryFanart(iFanart); result = m_artist.fanart.GetImageURL(); } else if (result.Equals("fanart://None") || !CFile::Exists(result)) result.clear(); if (flip && !result.empty()) result = CTextureCache::GetWrappedImageURL(result, "", "flipped"); // update thumb in the database CMusicDatabase db; if (db.Open()) { db.SetArtForItem(m_albumItem->GetMusicInfoTag()->GetDatabaseId(), m_albumItem->GetMusicInfoTag()->GetType(), "fanart", result); db.Close(); } m_albumItem->SetArt("fanart", result); m_hasUpdatedThumb = true; // tell our GUI to completely reload all controls (as some of them // are likely to have had this image in use so will need refreshing) CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_REFRESH_THUMBS); g_windowManager.SendMessage(msg); // Update our screen Update(); }
void CGUIDialogMediaFilter::GetRange(const Filter &filter, float &min, float &interval, float &max, RANGEFORMATFUNCTION &formatFunction) { if (filter.field == FieldRating) { if (m_mediaType == "movies" || m_mediaType == "tvshows" || m_mediaType == "episodes") { min = 0.0f; interval = 0.1f; max = 10.0f; formatFunction = RangeAsFloat; } else if (m_mediaType == "albums" || m_mediaType == "songs") { min = 0.0f; interval = 1.0f; max = 5.0f; formatFunction = RangeAsInt; } } else if (filter.field == FieldYear) { formatFunction = RangeAsInt; min = 0.0f; interval = 1.0f; max = 0.0f; if (m_mediaType == "movies" || m_mediaType == "tvshows" || m_mediaType == "musicvideos") { CStdString table; CStdString year; if (m_mediaType == "movies") { table = "movieview"; year.Format("c%02d", VIDEODB_ID_YEAR); } else if (m_mediaType == "tvshows") { table = "tvshowview"; year.Format("strftime(\"%%Y\", c%02d)", VIDEODB_ID_TV_PREMIERED); } else if (m_mediaType == "musicvideos") { table = "musicvideoview"; year.Format("c%02d", VIDEODB_ID_MUSICVIDEO_YEAR); } GetMinMax(table, year, min, max); } else if (m_mediaType == "albums" || m_mediaType == "songs") { CStdString table; if (m_mediaType == "albums") table = "albumview"; else if (m_mediaType == "songs") table = "songview"; CDatabase::Filter filter; filter.where = "iYear > 0"; GetMinMax(table, "iYear", min, max, filter); } } else if (filter.field == FieldAirDate) { formatFunction = RangeAsDate; min = 0.0f; interval = 1.0f; max = 0.0f; if (m_mediaType == "episodes") { CStdString field; field.Format("CAST(strftime(\"%%s\", c%02d) AS INTEGER)", VIDEODB_ID_EPISODE_AIRED); GetMinMax("episodeview", field, min, max); interval = 60 * 60 * 24 * 7; // 1 week } } else if (filter.field == FieldTime) { formatFunction = RangeAsTime; min = 0.0f; interval = 10.0f; max = 0.0f; if (m_mediaType == "songs") GetMinMax("songview", "iDuration", min, max); } else if (filter.field == FieldPlaycount) { formatFunction = RangeAsInt; min = 0.0f; interval = 1.0f; max = 0.0f; if (m_mediaType == "songs") GetMinMax("songview", "iTimesPlayed", min, max); } }
void XMLUtils::SetLong(TiXmlNode* pRootNode, const char *strTag, long value) { CStdString strValue; strValue.Format("%ld", value); SetString(pRootNode, strTag, strValue); }
CStdString CSysInfo::GetHddSpaceInfo(int& percent, int drive, bool shortText) { int total, totalFree, totalUsed, percentFree, percentused; CStdString strDrive; bool bRet=false; percent = 0; CStdString strRet; switch (drive) { case SYSTEM_FREE_SPACE: case SYSTEM_USED_SPACE: case SYSTEM_TOTAL_SPACE: case SYSTEM_FREE_SPACE_PERCENT: case SYSTEM_USED_SPACE_PERCENT: bRet = g_sysinfo.GetDiskSpace("",total, totalFree, totalUsed, percentFree, percentused); break; case LCD_FREE_SPACE_C: case SYSTEM_FREE_SPACE_C: case SYSTEM_USED_SPACE_C: case SYSTEM_TOTAL_SPACE_C: case SYSTEM_FREE_SPACE_PERCENT_C: case SYSTEM_USED_SPACE_PERCENT_C: strDrive = "C"; bRet = g_sysinfo.GetDiskSpace("C",total, totalFree, totalUsed, percentFree, percentused); break; case LCD_FREE_SPACE_E: case SYSTEM_FREE_SPACE_E: case SYSTEM_USED_SPACE_E: case SYSTEM_TOTAL_SPACE_E: case SYSTEM_FREE_SPACE_PERCENT_E: case SYSTEM_USED_SPACE_PERCENT_E: strDrive = "E"; bRet = g_sysinfo.GetDiskSpace("E",total, totalFree, totalUsed, percentFree, percentused); break; case LCD_FREE_SPACE_F: case SYSTEM_FREE_SPACE_F: case SYSTEM_USED_SPACE_F: case SYSTEM_TOTAL_SPACE_F: case SYSTEM_FREE_SPACE_PERCENT_F: case SYSTEM_USED_SPACE_PERCENT_F: strDrive = "F"; bRet = g_sysinfo.GetDiskSpace("F",total, totalFree, totalUsed, percentFree, percentused); break; case LCD_FREE_SPACE_G: case SYSTEM_FREE_SPACE_G: case SYSTEM_USED_SPACE_G: case SYSTEM_TOTAL_SPACE_G: case SYSTEM_FREE_SPACE_PERCENT_G: case SYSTEM_USED_SPACE_PERCENT_G: strDrive = "G"; bRet = g_sysinfo.GetDiskSpace("G",total, totalFree, totalUsed, percentFree, percentused); break; case SYSTEM_USED_SPACE_X: case SYSTEM_FREE_SPACE_X: case SYSTEM_TOTAL_SPACE_X: strDrive = "X"; bRet = g_sysinfo.GetDiskSpace("X",total, totalFree, totalUsed, percentFree, percentused); break; case SYSTEM_USED_SPACE_Y: case SYSTEM_FREE_SPACE_Y: case SYSTEM_TOTAL_SPACE_Y: strDrive = "Y"; bRet = g_sysinfo.GetDiskSpace("Y",total, totalFree, totalUsed, percentFree, percentused); break; case SYSTEM_USED_SPACE_Z: case SYSTEM_FREE_SPACE_Z: case SYSTEM_TOTAL_SPACE_Z: strDrive = "Z"; bRet = g_sysinfo.GetDiskSpace("Z",total, totalFree, totalUsed, percentFree, percentused); break; } if (bRet) { if (shortText) { switch(drive) { case LCD_FREE_SPACE_C: case LCD_FREE_SPACE_E: case LCD_FREE_SPACE_F: case LCD_FREE_SPACE_G: strRet.Format("%iMB", totalFree); break; case SYSTEM_FREE_SPACE: case SYSTEM_FREE_SPACE_C: case SYSTEM_FREE_SPACE_E: case SYSTEM_FREE_SPACE_F: case SYSTEM_FREE_SPACE_G: case SYSTEM_FREE_SPACE_X: case SYSTEM_FREE_SPACE_Y: case SYSTEM_FREE_SPACE_Z: percent = percentFree; break; case SYSTEM_USED_SPACE: case SYSTEM_USED_SPACE_C: case SYSTEM_USED_SPACE_E: case SYSTEM_USED_SPACE_F: case SYSTEM_USED_SPACE_G: case SYSTEM_USED_SPACE_X: case SYSTEM_USED_SPACE_Y: case SYSTEM_USED_SPACE_Z: percent = percentused; break; } } else { switch(drive) { case SYSTEM_FREE_SPACE: case SYSTEM_FREE_SPACE_C: case SYSTEM_FREE_SPACE_E: case SYSTEM_FREE_SPACE_F: case SYSTEM_FREE_SPACE_G: case SYSTEM_FREE_SPACE_X: case SYSTEM_FREE_SPACE_Y: case SYSTEM_FREE_SPACE_Z: if (strDrive.IsEmpty()) strRet.Format("%i MB %s", totalFree, g_localizeStrings.Get(160)); else strRet.Format("%s: %i MB %s", strDrive, totalFree, g_localizeStrings.Get(160)); break; case SYSTEM_USED_SPACE: case SYSTEM_USED_SPACE_C: case SYSTEM_USED_SPACE_E: case SYSTEM_USED_SPACE_F: case SYSTEM_USED_SPACE_G: case SYSTEM_USED_SPACE_X: case SYSTEM_USED_SPACE_Y: case SYSTEM_USED_SPACE_Z: if (strDrive.IsEmpty()) strRet.Format("%i MB %s", totalUsed, g_localizeStrings.Get(20162)); else strRet.Format("%s: %i MB %s", strDrive, totalUsed, g_localizeStrings.Get(20162)); break; case SYSTEM_TOTAL_SPACE: case SYSTEM_TOTAL_SPACE_C: case SYSTEM_TOTAL_SPACE_E: case SYSTEM_TOTAL_SPACE_F: case SYSTEM_TOTAL_SPACE_G: if (strDrive.IsEmpty()) strRet.Format("%i MB %s", total, g_localizeStrings.Get(20161)); else strRet.Format("%s: %i MB %s", strDrive, total, g_localizeStrings.Get(20161)); break; case SYSTEM_FREE_SPACE_PERCENT: case SYSTEM_FREE_SPACE_PERCENT_C: case SYSTEM_FREE_SPACE_PERCENT_E: case SYSTEM_FREE_SPACE_PERCENT_F: case SYSTEM_FREE_SPACE_PERCENT_G: if (strDrive.IsEmpty()) strRet.Format("%i %% %s", percentFree, g_localizeStrings.Get(160)); else strRet.Format("%s: %i %% %s", strDrive, percentFree, g_localizeStrings.Get(160)); break; case SYSTEM_USED_SPACE_PERCENT: case SYSTEM_USED_SPACE_PERCENT_C: case SYSTEM_USED_SPACE_PERCENT_E: case SYSTEM_USED_SPACE_PERCENT_F: case SYSTEM_USED_SPACE_PERCENT_G: if (strDrive.IsEmpty()) strRet.Format("%i %% %s", percentused, g_localizeStrings.Get(20162)); else strRet.Format("%s: %i %% %s", strDrive, percentused, g_localizeStrings.Get(20162)); break; } } } else { if (shortText) strRet = "N/A"; else if (strDrive.IsEmpty()) strRet = g_localizeStrings.Get(161); else strRet.Format("%s: %s", strDrive, g_localizeStrings.Get(161)); } return strRet; }