2 * Copyright (C) 2005-2013 Team XBMC
5 * This Program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
10 * This Program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with XBMC; see the file COPYING. If not, see
17 * <http://www.gnu.org/licenses/>.
21 #include "network/Network.h"
23 #include "GUIInfoManager.h"
24 #include "windows/GUIMediaWindow.h"
25 #include "dialogs/GUIDialogProgress.h"
26 #include "Application.h"
28 #include "utils/URIUtils.h"
29 #include "utils/Weather.h"
30 #include "PartyModeManager.h"
31 #include "addons/Visualisation.h"
32 #include "input/ButtonTranslator.h"
33 #include "utils/AlarmClock.h"
35 #include "utils/SystemInfo.h"
36 #include "guilib/GUITextBox.h"
37 #include "pictures/GUIWindowSlideShow.h"
38 #include "pictures/PictureInfoTag.h"
39 #include "music/tags/MusicInfoTag.h"
40 #include "guilib/GUIWindowManager.h"
41 #include "playlists/PlayList.h"
42 #include "utils/TuxBoxUtil.h"
43 #include "windowing/WindowingFactory.h"
44 #include "powermanagement/PowerManager.h"
45 #include "settings/AdvancedSettings.h"
46 #include "settings/Settings.h"
47 #include "guilib/LocalizeStrings.h"
48 #include "utils/CharsetConverter.h"
49 #include "utils/CPUInfo.h"
50 #include "utils/StringUtils.h"
51 #include "utils/MathUtils.h"
52 #include "utils/SeekHandler.h"
54 #include "addons/Skin.h"
56 // stuff for current song
57 #include "music/MusicInfoLoader.h"
59 #include "GUIUserMessages.h"
60 #include "video/dialogs/GUIDialogVideoInfo.h"
61 #include "music/dialogs/GUIDialogMusicInfo.h"
62 #include "storage/MediaManager.h"
63 #include "utils/TimeUtils.h"
64 #include "threads/SingleLock.h"
65 #include "utils/log.h"
67 #include "pvr/PVRManager.h"
68 #include "pvr/channels/PVRChannelGroupsContainer.h"
69 #include "epg/EpgInfoTag.h"
70 #include "pvr/timers/PVRTimers.h"
71 #include "pvr/recordings/PVRRecording.h"
73 #include "addons/AddonManager.h"
74 #include "interfaces/info/InfoBool.h"
75 #include "video/VideoThumbLoader.h"
76 #include "music/MusicThumbLoader.h"
77 #include "video/VideoDatabase.h"
78 #include "cores/IPlayer.h"
79 #include "cores/AudioEngine/Utils/AEUtil.h"
81 #define SYSHEATUPDATEINTERVAL 60000
84 using namespace XFILE;
85 using namespace MUSIC_INFO;
86 using namespace ADDON;
91 CGUIInfoManager::CGUIInfoManager(void) :
94 m_lastSysHeatInfoTime = -SYSHEATUPDATEINTERVAL; // make sure we grab CPU temp on the first pass
95 m_lastMusicBitrateTime = 0;
97 m_AfterSeekTimeout = 0;
99 m_playerSeeking = false;
100 m_performingSeek = false;
101 m_nextWindowID = WINDOW_INVALID;
102 m_prevWindowID = WINDOW_INVALID;
103 m_stringParameters.push_back("__ZZZZ__"); // to offset the string parameters by 1 to assure that all entries are non-zero
104 m_currentFile = new CFileItem;
105 m_currentSlide = new CFileItem;
110 m_playerShowTime = false;
111 m_playerShowCodec = false;
112 m_playerShowInfo = false;
117 CGUIInfoManager::~CGUIInfoManager(void)
119 delete m_currentFile;
120 delete m_currentSlide;
123 bool CGUIInfoManager::OnMessage(CGUIMessage &message)
125 if (message.GetMessage() == GUI_MSG_NOTIFY_ALL)
127 if (message.GetParam1() == GUI_MSG_UPDATE_ITEM && message.GetItem())
129 CFileItemPtr item = boost::static_pointer_cast<CFileItem>(message.GetItem());
130 if (m_currentFile->IsSamePath(item.get()))
132 m_currentFile->UpdateInfo(*item);
140 /// \brief Translates a string as given by the skin into an int that we use for more
141 /// efficient retrieval of data. Can handle combined strings on the form
142 /// Player.Caching + VideoPlayer.IsFullscreen (Logical and)
143 /// Player.HasVideo | Player.HasAudio (Logical or)
144 int CGUIInfoManager::TranslateString(const CStdString &condition)
146 // translate $LOCALIZE as required
147 CStdString strCondition(CGUIInfoLabel::ReplaceLocalize(condition));
148 return TranslateSingleString(strCondition);
157 const infomap player_labels[] = {{ "hasmedia", PLAYER_HAS_MEDIA }, // bools from here
158 { "hasaudio", PLAYER_HAS_AUDIO },
159 { "hasvideo", PLAYER_HAS_VIDEO },
160 { "playing", PLAYER_PLAYING },
161 { "paused", PLAYER_PAUSED },
162 { "rewinding", PLAYER_REWINDING },
163 { "forwarding", PLAYER_FORWARDING },
164 { "rewinding2x", PLAYER_REWINDING_2x },
165 { "rewinding4x", PLAYER_REWINDING_4x },
166 { "rewinding8x", PLAYER_REWINDING_8x },
167 { "rewinding16x", PLAYER_REWINDING_16x },
168 { "rewinding32x", PLAYER_REWINDING_32x },
169 { "forwarding2x", PLAYER_FORWARDING_2x },
170 { "forwarding4x", PLAYER_FORWARDING_4x },
171 { "forwarding8x", PLAYER_FORWARDING_8x },
172 { "forwarding16x", PLAYER_FORWARDING_16x },
173 { "forwarding32x", PLAYER_FORWARDING_32x },
174 { "canrecord", PLAYER_CAN_RECORD },
175 { "recording", PLAYER_RECORDING },
176 { "displayafterseek", PLAYER_DISPLAY_AFTER_SEEK },
177 { "caching", PLAYER_CACHING },
178 { "seekbar", PLAYER_SEEKBAR },
179 { "seeking", PLAYER_SEEKING },
180 { "showtime", PLAYER_SHOWTIME },
181 { "showcodec", PLAYER_SHOWCODEC },
182 { "showinfo", PLAYER_SHOWINFO },
183 { "title", PLAYER_TITLE },
184 { "muted", PLAYER_MUTED },
185 { "hasduration", PLAYER_HASDURATION },
186 { "passthrough", PLAYER_PASSTHROUGH },
187 { "cachelevel", PLAYER_CACHELEVEL }, // labels from here
188 { "progress", PLAYER_PROGRESS },
189 { "progresscache", PLAYER_PROGRESS_CACHE },
190 { "volume", PLAYER_VOLUME },
191 { "subtitledelay", PLAYER_SUBTITLE_DELAY },
192 { "audiodelay", PLAYER_AUDIO_DELAY },
193 { "chapter", PLAYER_CHAPTER },
194 { "chaptercount", PLAYER_CHAPTERCOUNT },
195 { "chaptername", PLAYER_CHAPTERNAME },
196 { "starrating", PLAYER_STAR_RATING },
197 { "folderpath", PLAYER_PATH },
198 { "filenameandpath", PLAYER_FILEPATH },
199 { "pauseenabled", PLAYER_CAN_PAUSE },
200 { "seekenabled", PLAYER_CAN_SEEK }};
202 const infomap player_param[] = {{ "art", PLAYER_ITEM_ART }};
204 const infomap player_times[] = {{ "seektime", PLAYER_SEEKTIME },
205 { "seekoffset", PLAYER_SEEKOFFSET },
206 { "timeremaining", PLAYER_TIME_REMAINING },
207 { "timespeed", PLAYER_TIME_SPEED },
208 { "time", PLAYER_TIME },
209 { "duration", PLAYER_DURATION },
210 { "finishtime", PLAYER_FINISH_TIME },
211 { "starttime", PLAYER_START_TIME}};
213 const infomap weather[] = {{ "isfetched", WEATHER_IS_FETCHED },
214 { "conditions", WEATHER_CONDITIONS }, // labels from here
215 { "temperature", WEATHER_TEMPERATURE },
216 { "location", WEATHER_LOCATION },
217 { "fanartcode", WEATHER_FANART_CODE },
218 { "plugin", WEATHER_PLUGIN }};
220 const infomap system_labels[] = {{ "hasnetwork", SYSTEM_ETHERNET_LINK_ACTIVE },
221 { "hasmediadvd", SYSTEM_MEDIA_DVD },
222 { "dvdready", SYSTEM_DVDREADY },
223 { "trayopen", SYSTEM_TRAYOPEN },
224 { "haslocks", SYSTEM_HASLOCKS },
225 { "hasloginscreen", SYSTEM_HAS_LOGINSCREEN },
226 { "ismaster", SYSTEM_ISMASTER },
227 { "isfullscreen", SYSTEM_ISFULLSCREEN },
228 { "isstandalone", SYSTEM_ISSTANDALONE },
229 { "loggedon", SYSTEM_LOGGEDON },
230 { "showexitbutton", SYSTEM_SHOW_EXIT_BUTTON },
231 { "canpowerdown", SYSTEM_CAN_POWERDOWN },
232 { "cansuspend", SYSTEM_CAN_SUSPEND },
233 { "canhibernate", SYSTEM_CAN_HIBERNATE },
234 { "canreboot", SYSTEM_CAN_REBOOT },
235 { "screensaveractive",SYSTEM_SCREENSAVER_ACTIVE },
236 { "cputemperature", SYSTEM_CPU_TEMPERATURE }, // labels from here
237 { "cpuusage", SYSTEM_CPU_USAGE },
238 { "gputemperature", SYSTEM_GPU_TEMPERATURE },
239 { "fanspeed", SYSTEM_FAN_SPEED },
240 { "freespace", SYSTEM_FREE_SPACE },
241 { "usedspace", SYSTEM_USED_SPACE },
242 { "totalspace", SYSTEM_TOTAL_SPACE },
243 { "usedspacepercent", SYSTEM_USED_SPACE_PERCENT },
244 { "freespacepercent", SYSTEM_FREE_SPACE_PERCENT },
245 { "buildversion", SYSTEM_BUILD_VERSION },
246 { "builddate", SYSTEM_BUILD_DATE },
247 { "fps", SYSTEM_FPS },
248 { "dvdtraystate", SYSTEM_DVD_TRAY_STATE },
249 { "freememory", SYSTEM_FREE_MEMORY },
250 { "language", SYSTEM_LANGUAGE },
251 { "temperatureunits", SYSTEM_TEMPERATURE_UNITS },
252 { "screenmode", SYSTEM_SCREEN_MODE },
253 { "screenwidth", SYSTEM_SCREEN_WIDTH },
254 { "screenheight", SYSTEM_SCREEN_HEIGHT },
255 { "currentwindow", SYSTEM_CURRENT_WINDOW },
256 { "currentcontrol", SYSTEM_CURRENT_CONTROL },
257 { "dvdlabel", SYSTEM_DVD_LABEL },
258 { "internetstate", SYSTEM_INTERNET_STATE },
259 { "kernelversion", SYSTEM_KERNEL_VERSION },
260 { "uptime", SYSTEM_UPTIME },
261 { "totaluptime", SYSTEM_TOTALUPTIME },
262 { "cpufrequency", SYSTEM_CPUFREQUENCY },
263 { "screenresolution", SYSTEM_SCREEN_RESOLUTION },
264 { "videoencoderinfo", SYSTEM_VIDEO_ENCODER_INFO },
265 { "profilename", SYSTEM_PROFILENAME },
266 { "profilethumb", SYSTEM_PROFILETHUMB },
267 { "profilecount", SYSTEM_PROFILECOUNT },
268 { "progressbar", SYSTEM_PROGRESS_BAR },
269 { "batterylevel", SYSTEM_BATTERY_LEVEL },
270 { "friendlyname", SYSTEM_FRIENDLY_NAME },
271 { "alarmpos", SYSTEM_ALARM_POS },
272 { "isinhibit", SYSTEM_ISINHIBIT },
273 { "hasshutdown", SYSTEM_HAS_SHUTDOWN },
274 { "haspvr", SYSTEM_HAS_PVR }};
276 const infomap system_param[] = {{ "hasalarm", SYSTEM_HAS_ALARM },
277 { "hascoreid", SYSTEM_HAS_CORE_ID },
278 { "setting", SYSTEM_SETTING },
279 { "hasaddon", SYSTEM_HAS_ADDON },
280 { "coreusage", SYSTEM_GET_CORE_USAGE }};
282 const infomap network_labels[] = {{ "isdhcp", NETWORK_IS_DHCP },
283 { "ipaddress", NETWORK_IP_ADDRESS }, //labels from here
284 { "linkstate", NETWORK_LINK_STATE },
285 { "macaddress", NETWORK_MAC_ADDRESS },
286 { "subnetaddress", NETWORK_SUBNET_MASK }, //subnetaddress is misleading/wrong. should be deprecated. use subnetmask in stead
287 { "subnetmask", NETWORK_SUBNET_MASK },
288 { "gatewayaddress", NETWORK_GATEWAY_ADDRESS },
289 { "dns1address", NETWORK_DNS1_ADDRESS },
290 { "dns2address", NETWORK_DNS2_ADDRESS },
291 { "dhcpaddress", NETWORK_DHCP_ADDRESS }};
293 const infomap musicpartymode[] = {{ "enabled", MUSICPM_ENABLED },
294 { "songsplayed", MUSICPM_SONGSPLAYED },
295 { "matchingsongs", MUSICPM_MATCHINGSONGS },
296 { "matchingsongspicked", MUSICPM_MATCHINGSONGSPICKED },
297 { "matchingsongsleft", MUSICPM_MATCHINGSONGSLEFT },
298 { "relaxedsongspicked",MUSICPM_RELAXEDSONGSPICKED },
299 { "randomsongspicked", MUSICPM_RANDOMSONGSPICKED }};
301 const infomap musicplayer[] = {{ "title", MUSICPLAYER_TITLE },
302 { "album", MUSICPLAYER_ALBUM },
303 { "artist", MUSICPLAYER_ARTIST },
304 { "albumartist", MUSICPLAYER_ALBUM_ARTIST },
305 { "year", MUSICPLAYER_YEAR },
306 { "genre", MUSICPLAYER_GENRE },
307 { "duration", MUSICPLAYER_DURATION },
308 { "tracknumber", MUSICPLAYER_TRACK_NUMBER },
309 { "cover", MUSICPLAYER_COVER },
310 { "bitrate", MUSICPLAYER_BITRATE },
311 { "playlistlength", MUSICPLAYER_PLAYLISTLEN },
312 { "playlistposition", MUSICPLAYER_PLAYLISTPOS },
313 { "channels", MUSICPLAYER_CHANNELS },
314 { "bitspersample", MUSICPLAYER_BITSPERSAMPLE },
315 { "samplerate", MUSICPLAYER_SAMPLERATE },
316 { "codec", MUSICPLAYER_CODEC },
317 { "discnumber", MUSICPLAYER_DISC_NUMBER },
318 { "rating", MUSICPLAYER_RATING },
319 { "comment", MUSICPLAYER_COMMENT },
320 { "lyrics", MUSICPLAYER_LYRICS },
321 { "playlistplaying", MUSICPLAYER_PLAYLISTPLAYING },
322 { "exists", MUSICPLAYER_EXISTS },
323 { "hasprevious", MUSICPLAYER_HASPREVIOUS },
324 { "hasnext", MUSICPLAYER_HASNEXT },
325 { "playcount", MUSICPLAYER_PLAYCOUNT },
326 { "lastplayed", MUSICPLAYER_LASTPLAYED },
327 { "channelname", MUSICPLAYER_CHANNEL_NAME },
328 { "channelnumber", MUSICPLAYER_CHANNEL_NUMBER },
329 { "channelgroup", MUSICPLAYER_CHANNEL_GROUP }
332 const infomap videoplayer[] = {{ "title", VIDEOPLAYER_TITLE },
333 { "genre", VIDEOPLAYER_GENRE },
334 { "country", VIDEOPLAYER_COUNTRY },
335 { "originaltitle", VIDEOPLAYER_ORIGINALTITLE },
336 { "director", VIDEOPLAYER_DIRECTOR },
337 { "year", VIDEOPLAYER_YEAR },
338 { "cover", VIDEOPLAYER_COVER },
339 { "usingoverlays", VIDEOPLAYER_USING_OVERLAYS },
340 { "isfullscreen", VIDEOPLAYER_ISFULLSCREEN },
341 { "hasmenu", VIDEOPLAYER_HASMENU },
342 { "playlistlength", VIDEOPLAYER_PLAYLISTLEN },
343 { "playlistposition", VIDEOPLAYER_PLAYLISTPOS },
344 { "plot", VIDEOPLAYER_PLOT },
345 { "plotoutline", VIDEOPLAYER_PLOT_OUTLINE },
346 { "episode", VIDEOPLAYER_EPISODE },
347 { "season", VIDEOPLAYER_SEASON },
348 { "rating", VIDEOPLAYER_RATING },
349 { "ratingandvotes", VIDEOPLAYER_RATING_AND_VOTES },
350 { "tvshowtitle", VIDEOPLAYER_TVSHOW },
351 { "premiered", VIDEOPLAYER_PREMIERED },
352 { "studio", VIDEOPLAYER_STUDIO },
353 { "mpaa", VIDEOPLAYER_MPAA },
354 { "top250", VIDEOPLAYER_TOP250 },
355 { "cast", VIDEOPLAYER_CAST },
356 { "castandrole", VIDEOPLAYER_CAST_AND_ROLE },
357 { "artist", VIDEOPLAYER_ARTIST },
358 { "album", VIDEOPLAYER_ALBUM },
359 { "writer", VIDEOPLAYER_WRITER },
360 { "tagline", VIDEOPLAYER_TAGLINE },
361 { "hasinfo", VIDEOPLAYER_HAS_INFO },
362 { "trailer", VIDEOPLAYER_TRAILER },
363 { "videocodec", VIDEOPLAYER_VIDEO_CODEC },
364 { "videoresolution", VIDEOPLAYER_VIDEO_RESOLUTION },
365 { "videoaspect", VIDEOPLAYER_VIDEO_ASPECT },
366 { "audiocodec", VIDEOPLAYER_AUDIO_CODEC },
367 { "audiochannels", VIDEOPLAYER_AUDIO_CHANNELS },
368 { "hasteletext", VIDEOPLAYER_HASTELETEXT },
369 { "lastplayed", VIDEOPLAYER_LASTPLAYED },
370 { "playcount", VIDEOPLAYER_PLAYCOUNT },
371 { "hassubtitles", VIDEOPLAYER_HASSUBTITLES },
372 { "subtitlesenabled", VIDEOPLAYER_SUBTITLESENABLED },
373 { "endtime", VIDEOPLAYER_ENDTIME },
374 { "nexttitle", VIDEOPLAYER_NEXT_TITLE },
375 { "nextgenre", VIDEOPLAYER_NEXT_GENRE },
376 { "nextplot", VIDEOPLAYER_NEXT_PLOT },
377 { "nextplotoutline", VIDEOPLAYER_NEXT_PLOT_OUTLINE },
378 { "nextstarttime", VIDEOPLAYER_NEXT_STARTTIME },
379 { "nextendtime", VIDEOPLAYER_NEXT_ENDTIME },
380 { "nextduration", VIDEOPLAYER_NEXT_DURATION },
381 { "channelname", VIDEOPLAYER_CHANNEL_NAME },
382 { "channelnumber", VIDEOPLAYER_CHANNEL_NUMBER },
383 { "channelgroup", VIDEOPLAYER_CHANNEL_GROUP },
384 { "hasepg", VIDEOPLAYER_HAS_EPG },
385 { "parentalrating", VIDEOPLAYER_PARENTAL_RATING }};
387 const infomap mediacontainer[] = {{ "hasfiles", CONTAINER_HASFILES },
388 { "hasfolders", CONTAINER_HASFOLDERS },
389 { "isstacked", CONTAINER_STACKED },
390 { "folderthumb", CONTAINER_FOLDERTHUMB },
391 { "tvshowthumb", CONTAINER_TVSHOWTHUMB },
392 { "seasonthumb", CONTAINER_SEASONTHUMB },
393 { "folderpath", CONTAINER_FOLDERPATH },
394 { "foldername", CONTAINER_FOLDERNAME },
395 { "pluginname", CONTAINER_PLUGINNAME },
396 { "viewmode", CONTAINER_VIEWMODE },
397 { "totaltime", CONTAINER_TOTALTIME },
398 { "hasthumb", CONTAINER_HAS_THUMB },
399 { "sortmethod", CONTAINER_SORT_METHOD },
400 { "showplot", CONTAINER_SHOWPLOT }};
402 const infomap container_bools[] ={{ "onnext", CONTAINER_MOVE_NEXT },
403 { "onprevious", CONTAINER_MOVE_PREVIOUS },
404 { "onscrollnext", CONTAINER_SCROLL_NEXT },
405 { "onscrollprevious", CONTAINER_SCROLL_PREVIOUS },
406 { "numpages", CONTAINER_NUM_PAGES },
407 { "numitems", CONTAINER_NUM_ITEMS },
408 { "currentpage", CONTAINER_CURRENT_PAGE },
409 { "scrolling", CONTAINER_SCROLLING },
410 { "hasnext", CONTAINER_HAS_NEXT },
411 { "hasprevious", CONTAINER_HAS_PREVIOUS },
412 { "canfilter", CONTAINER_CAN_FILTER },
413 { "canfilteradvanced",CONTAINER_CAN_FILTERADVANCED },
414 { "filtered", CONTAINER_FILTERED }};
416 const infomap container_ints[] = {{ "row", CONTAINER_ROW },
417 { "column", CONTAINER_COLUMN },
418 { "position", CONTAINER_POSITION },
419 { "subitem", CONTAINER_SUBITEM },
420 { "hasfocus", CONTAINER_HAS_FOCUS }};
422 const infomap container_str[] = {{ "property", CONTAINER_PROPERTY },
423 { "content", CONTAINER_CONTENT }};
425 const infomap listitem_labels[]= {{ "thumb", LISTITEM_THUMB },
426 { "icon", LISTITEM_ICON },
427 { "actualicon", LISTITEM_ACTUAL_ICON },
428 { "overlay", LISTITEM_OVERLAY },
429 { "label", LISTITEM_LABEL },
430 { "label2", LISTITEM_LABEL2 },
431 { "title", LISTITEM_TITLE },
432 { "tracknumber", LISTITEM_TRACKNUMBER },
433 { "artist", LISTITEM_ARTIST },
434 { "album", LISTITEM_ALBUM },
435 { "albumartist", LISTITEM_ALBUM_ARTIST },
436 { "year", LISTITEM_YEAR },
437 { "genre", LISTITEM_GENRE },
438 { "director", LISTITEM_DIRECTOR },
439 { "filename", LISTITEM_FILENAME },
440 { "filenameandpath", LISTITEM_FILENAME_AND_PATH },
441 { "fileextension", LISTITEM_FILE_EXTENSION },
442 { "date", LISTITEM_DATE },
443 { "size", LISTITEM_SIZE },
444 { "rating", LISTITEM_RATING },
445 { "ratingandvotes", LISTITEM_RATING_AND_VOTES },
446 { "programcount", LISTITEM_PROGRAM_COUNT },
447 { "duration", LISTITEM_DURATION },
448 { "isselected", LISTITEM_ISSELECTED },
449 { "isplaying", LISTITEM_ISPLAYING },
450 { "plot", LISTITEM_PLOT },
451 { "plotoutline", LISTITEM_PLOT_OUTLINE },
452 { "episode", LISTITEM_EPISODE },
453 { "season", LISTITEM_SEASON },
454 { "tvshowtitle", LISTITEM_TVSHOW },
455 { "premiered", LISTITEM_PREMIERED },
456 { "comment", LISTITEM_COMMENT },
457 { "path", LISTITEM_PATH },
458 { "foldername", LISTITEM_FOLDERNAME },
459 { "folderpath", LISTITEM_FOLDERPATH },
460 { "picturepath", LISTITEM_PICTURE_PATH },
461 { "pictureresolution",LISTITEM_PICTURE_RESOLUTION },
462 { "picturedatetime", LISTITEM_PICTURE_DATETIME },
463 { "picturecomment", LISTITEM_PICTURE_COMMENT },
464 { "picturecaption", LISTITEM_PICTURE_CAPTION },
465 { "picturedesc", LISTITEM_PICTURE_DESC },
466 { "picturekeywords", LISTITEM_PICTURE_KEYWORDS },
467 { "picturecammake", LISTITEM_PICTURE_CAM_MAKE },
468 { "picturecammodel", LISTITEM_PICTURE_CAM_MODEL },
469 { "pictureaperture", LISTITEM_PICTURE_APERTURE },
470 { "picturefocallen", LISTITEM_PICTURE_FOCAL_LEN },
471 { "picturefocusdist", LISTITEM_PICTURE_FOCUS_DIST },
472 { "pictureexpmode", LISTITEM_PICTURE_EXP_MODE },
473 { "pictureexptime", LISTITEM_PICTURE_EXP_TIME },
474 { "pictureiso", LISTITEM_PICTURE_ISO },
475 { "picturegpslat", LISTITEM_PICTURE_GPS_LAT },
476 { "picturegpslon", LISTITEM_PICTURE_GPS_LON },
477 { "picturegpsalt", LISTITEM_PICTURE_GPS_ALT },
478 { "studio", LISTITEM_STUDIO },
479 { "country", LISTITEM_COUNTRY },
480 { "mpaa", LISTITEM_MPAA },
481 { "cast", LISTITEM_CAST },
482 { "castandrole", LISTITEM_CAST_AND_ROLE },
483 { "writer", LISTITEM_WRITER },
484 { "tagline", LISTITEM_TAGLINE },
485 { "top250", LISTITEM_TOP250 },
486 { "trailer", LISTITEM_TRAILER },
487 { "starrating", LISTITEM_STAR_RATING },
488 { "sortletter", LISTITEM_SORT_LETTER },
489 { "videocodec", LISTITEM_VIDEO_CODEC },
490 { "videoresolution", LISTITEM_VIDEO_RESOLUTION },
491 { "videoaspect", LISTITEM_VIDEO_ASPECT },
492 { "audiocodec", LISTITEM_AUDIO_CODEC },
493 { "audiochannels", LISTITEM_AUDIO_CHANNELS },
494 { "audiolanguage", LISTITEM_AUDIO_LANGUAGE },
495 { "subtitlelanguage", LISTITEM_SUBTITLE_LANGUAGE },
496 { "isresumable", LISTITEM_IS_RESUMABLE},
497 { "percentplayed", LISTITEM_PERCENT_PLAYED},
498 { "isfolder", LISTITEM_IS_FOLDER },
499 { "originaltitle", LISTITEM_ORIGINALTITLE },
500 { "lastplayed", LISTITEM_LASTPLAYED },
501 { "playcount", LISTITEM_PLAYCOUNT },
502 { "discnumber", LISTITEM_DISC_NUMBER },
503 { "starttime", LISTITEM_STARTTIME },
504 { "endtime", LISTITEM_ENDTIME },
505 { "startdate", LISTITEM_STARTDATE },
506 { "enddate", LISTITEM_ENDDATE },
507 { "nexttitle", LISTITEM_NEXT_TITLE },
508 { "nextgenre", LISTITEM_NEXT_GENRE },
509 { "nextplot", LISTITEM_NEXT_PLOT },
510 { "nextplotoutline", LISTITEM_NEXT_PLOT_OUTLINE },
511 { "nextstarttime", LISTITEM_NEXT_STARTTIME },
512 { "nextendtime", LISTITEM_NEXT_ENDTIME },
513 { "nextstartdate", LISTITEM_NEXT_STARTDATE },
514 { "nextenddate", LISTITEM_NEXT_ENDDATE },
515 { "channelname", LISTITEM_CHANNEL_NAME },
516 { "channelnumber", LISTITEM_CHANNEL_NUMBER },
517 { "channelgroup", LISTITEM_CHANNEL_GROUP },
518 { "hasepg", LISTITEM_HAS_EPG },
519 { "hastimer", LISTITEM_HASTIMER },
520 { "isrecording", LISTITEM_ISRECORDING },
521 { "isencrypted", LISTITEM_ISENCRYPTED },
522 { "progress", LISTITEM_PROGRESS },
523 { "dateadded", LISTITEM_DATE_ADDED },
524 { "dbtype", LISTITEM_DBTYPE },
525 { "dbid", LISTITEM_DBID }};
527 const infomap visualisation[] = {{ "locked", VISUALISATION_LOCKED },
528 { "preset", VISUALISATION_PRESET },
529 { "name", VISUALISATION_NAME },
530 { "enabled", VISUALISATION_ENABLED }};
532 const infomap fanart_labels[] = {{ "color1", FANART_COLOR1 },
533 { "color2", FANART_COLOR2 },
534 { "color3", FANART_COLOR3 },
535 { "image", FANART_IMAGE }};
537 const infomap skin_labels[] = {{ "currenttheme", SKIN_THEME },
538 { "currentcolourtheme",SKIN_COLOUR_THEME },
539 {"hasvideooverlay", SKIN_HAS_VIDEO_OVERLAY},
540 {"hasmusicoverlay", SKIN_HAS_MUSIC_OVERLAY},
541 {"aspectratio", SKIN_ASPECT_RATIO}};
543 const infomap window_bools[] = {{ "ismedia", WINDOW_IS_MEDIA },
544 { "isactive", WINDOW_IS_ACTIVE },
545 { "istopmost", WINDOW_IS_TOPMOST },
546 { "isvisible", WINDOW_IS_VISIBLE },
547 { "previous", WINDOW_PREVIOUS },
548 { "next", WINDOW_NEXT }};
550 const infomap control_labels[] = {{ "hasfocus", CONTROL_HAS_FOCUS },
551 { "isvisible", CONTROL_IS_VISIBLE },
552 { "isenabled", CONTROL_IS_ENABLED },
553 { "getlabel", CONTROL_GET_LABEL }};
555 const infomap playlist[] = {{ "length", PLAYLIST_LENGTH },
556 { "position", PLAYLIST_POSITION },
557 { "random", PLAYLIST_RANDOM },
558 { "repeat", PLAYLIST_REPEAT },
559 { "israndom", PLAYLIST_ISRANDOM },
560 { "isrepeat", PLAYLIST_ISREPEAT },
561 { "isrepeatone", PLAYLIST_ISREPEATONE }};
563 const infomap pvr[] = {{ "isrecording", PVR_IS_RECORDING },
564 { "hastimer", PVR_HAS_TIMER },
565 { "hasnonrecordingtimer", PVR_HAS_NONRECORDING_TIMER },
566 { "nowrecordingtitle", PVR_NOW_RECORDING_TITLE },
567 { "nowrecordingdatetime", PVR_NOW_RECORDING_DATETIME },
568 { "nowrecordingchannel", PVR_NOW_RECORDING_CHANNEL },
569 { "nowrecordingchannelicon", PVR_NOW_RECORDING_CHAN_ICO },
570 { "nextrecordingtitle", PVR_NEXT_RECORDING_TITLE },
571 { "nextrecordingdatetime", PVR_NEXT_RECORDING_DATETIME },
572 { "nextrecordingchannel", PVR_NEXT_RECORDING_CHANNEL },
573 { "nextrecordingchannelicon", PVR_NEXT_RECORDING_CHAN_ICO },
574 { "backendname", PVR_BACKEND_NAME },
575 { "backendversion", PVR_BACKEND_VERSION },
576 { "backendhost", PVR_BACKEND_HOST },
577 { "backenddiskspace", PVR_BACKEND_DISKSPACE },
578 { "backendchannels", PVR_BACKEND_CHANNELS },
579 { "backendtimers", PVR_BACKEND_TIMERS },
580 { "backendrecordings", PVR_BACKEND_RECORDINGS },
581 { "backendnumber", PVR_BACKEND_NUMBER },
582 { "hasepg", PVR_HAS_EPG },
583 { "hastxt", PVR_HAS_TXT },
584 { "hasdirector", PVR_HAS_DIRECTOR },
585 { "totaldiscspace", PVR_TOTAL_DISKSPACE },
586 { "nexttimer", PVR_NEXT_TIMER },
587 { "isplayingtv", PVR_IS_PLAYING_TV },
588 { "isplayingradio", PVR_IS_PLAYING_RADIO },
589 { "isplayingrecording", PVR_IS_PLAYING_RECORDING },
590 { "duration", PVR_PLAYING_DURATION },
591 { "time", PVR_PLAYING_TIME },
592 { "progress", PVR_PLAYING_PROGRESS },
593 { "actstreamclient", PVR_ACTUAL_STREAM_CLIENT },
594 { "actstreamdevice", PVR_ACTUAL_STREAM_DEVICE },
595 { "actstreamstatus", PVR_ACTUAL_STREAM_STATUS },
596 { "actstreamsignal", PVR_ACTUAL_STREAM_SIG },
597 { "actstreamsnr", PVR_ACTUAL_STREAM_SNR },
598 { "actstreamber", PVR_ACTUAL_STREAM_BER },
599 { "actstreamunc", PVR_ACTUAL_STREAM_UNC },
600 { "actstreamvideobitrate", PVR_ACTUAL_STREAM_VIDEO_BR },
601 { "actstreamaudiobitrate", PVR_ACTUAL_STREAM_AUDIO_BR },
602 { "actstreamdolbybitrate", PVR_ACTUAL_STREAM_DOLBY_BR },
603 { "actstreamprogrsignal", PVR_ACTUAL_STREAM_SIG_PROGR },
604 { "actstreamprogrsnr", PVR_ACTUAL_STREAM_SNR_PROGR },
605 { "actstreamisencrypted", PVR_ACTUAL_STREAM_ENCRYPTED },
606 { "actstreamencryptionname", PVR_ACTUAL_STREAM_CRYPTION }};
608 const infomap slideshow[] = {{ "ispaused", SLIDESHOW_ISPAUSED },
609 { "isactive", SLIDESHOW_ISACTIVE },
610 { "israndom", SLIDESHOW_ISRANDOM }};
612 const int picture_slide_map[] = {/* LISTITEM_PICTURE_RESOLUTION => */ SLIDE_RESOLUTION,
613 /* LISTITEM_PICTURE_DATE => */ SLIDE_EXIF_DATE,
614 /* LISTITEM_PICTURE_DATETIME => */ SLIDE_EXIF_DATE_TIME,
615 /* LISTITEM_PICTURE_COMMENT => */ SLIDE_COMMENT,
616 /* LISTITEM_PICTURE_CAPTION => */ SLIDE_IPTC_CAPTION,
617 /* LISTITEM_PICTURE_DESC => */ SLIDE_EXIF_DESCRIPTION,
618 /* LISTITEM_PICTURE_KEYWORDS => */ SLIDE_IPTC_KEYWORDS,
619 /* LISTITEM_PICTURE_CAM_MAKE => */ SLIDE_EXIF_CAMERA_MAKE,
620 /* LISTITEM_PICTURE_CAM_MODEL => */ SLIDE_EXIF_CAMERA_MODEL,
621 /* LISTITEM_PICTURE_APERTURE => */ SLIDE_EXIF_APERTURE,
622 /* LISTITEM_PICTURE_FOCAL_LEN => */ SLIDE_EXIF_FOCAL_LENGTH,
623 /* LISTITEM_PICTURE_FOCUS_DIST => */ SLIDE_EXIF_FOCUS_DIST,
624 /* LISTITEM_PICTURE_EXP_MODE => */ SLIDE_EXIF_EXPOSURE_MODE,
625 /* LISTITEM_PICTURE_EXP_TIME => */ SLIDE_EXIF_EXPOSURE_TIME,
626 /* LISTITEM_PICTURE_ISO => */ SLIDE_EXIF_ISO_EQUIV,
627 /* LISTITEM_PICTURE_GPS_LAT => */ SLIDE_EXIF_GPS_LATITUDE,
628 /* LISTITEM_PICTURE_GPS_LON => */ SLIDE_EXIF_GPS_LONGITUDE,
629 /* LISTITEM_PICTURE_GPS_ALT => */ SLIDE_EXIF_GPS_ALTITUDE };
631 CGUIInfoManager::Property::Property(const CStdString &property, const CStdString ¶meters)
634 CUtil::SplitParams(parameters, params);
637 const CStdString &CGUIInfoManager::Property::param(unsigned int n /* = 0 */) const
639 if (n < params.size())
641 return StringUtils::EmptyString;
644 unsigned int CGUIInfoManager::Property::num_params() const
646 return params.size();
649 void CGUIInfoManager::SplitInfoString(const CStdString &infoString, vector<Property> &info)
651 // our string is of the form:
652 // category[(params)][.info(params).info2(params)] ...
653 // so we need to split on . while taking into account of () pairs
654 unsigned int parentheses = 0;
657 for (size_t i = 0; i < infoString.size(); ++i)
659 if (infoString[i] == '(')
664 else if (infoString[i] == ')')
667 CLog::Log(LOGERROR, "unmatched parentheses in %s", infoString.c_str());
668 else if (!--parentheses)
671 else if (infoString[i] == '.' && !parentheses)
673 if (!property.IsEmpty()) // add our property and parameters
674 info.push_back(Property(property.ToLower(), param));
680 param += infoString[i];
682 property += infoString[i];
685 CLog::Log(LOGERROR, "unmatched parentheses in %s", infoString.c_str());
686 if (!property.IsEmpty())
687 info.push_back(Property(property.ToLower(), param));
690 /// \brief Translates a string as given by the skin into an int that we use for more
691 /// efficient retrieval of data.
692 int CGUIInfoManager::TranslateSingleString(const CStdString &strCondition)
695 CStdString strTest = strCondition;
696 strTest.TrimLeft(" \t\r\n");
697 strTest.TrimRight(" \t\r\n");
699 vector< Property> info;
700 SplitInfoString(strTest, info);
705 const Property &cat = info[0];
706 if (info.size() == 1)
708 if (cat.name == "false" || cat.name == "no" || cat.name == "off")
709 return SYSTEM_ALWAYS_FALSE;
710 else if (cat.name == "true" || cat.name == "yes" || cat.name == "on")
711 return SYSTEM_ALWAYS_TRUE;
712 if (cat.name == "isempty" && cat.num_params() == 1)
713 return AddMultiInfo(GUIInfo(STRING_IS_EMPTY, TranslateSingleString(cat.param())));
714 else if (cat.name == "stringcompare" && cat.num_params() == 2)
716 int info = TranslateSingleString(cat.param(0));
717 int info2 = TranslateSingleString(cat.param(1));
719 return AddMultiInfo(GUIInfo(STRING_COMPARE, info, -info2));
720 // pipe our original string through the localize parsing then make it lowercase (picks up $LBRACKET etc.)
721 CStdString label = CGUIInfoLabel::GetLabel(cat.param(1)).ToLower();
722 int compareString = ConditionalStringParameter(label);
723 return AddMultiInfo(GUIInfo(STRING_COMPARE, info, compareString));
725 else if (cat.name == "integergreaterthan" && cat.num_params() == 2)
727 int info = TranslateSingleString(cat.param(0));
728 int compareInt = atoi(cat.param(1).c_str());
729 return AddMultiInfo(GUIInfo(INTEGER_GREATER_THAN, info, compareInt));
731 else if (cat.name == "substring" && cat.num_params() >= 2)
733 int info = TranslateSingleString(cat.param(0));
734 CStdString label = CGUIInfoLabel::GetLabel(cat.param(1)).ToLower();
735 int compareString = ConditionalStringParameter(label);
736 if (cat.num_params() > 2)
738 if (cat.param(2).CompareNoCase("left") == 0)
739 return AddMultiInfo(GUIInfo(STRING_STR_LEFT, info, compareString));
740 else if (cat.param(2).CompareNoCase("right") == 0)
741 return AddMultiInfo(GUIInfo(STRING_STR_RIGHT, info, compareString));
743 return AddMultiInfo(GUIInfo(STRING_STR, info, compareString));
746 else if (info.size() == 2)
748 const Property &prop = info[1];
749 if (cat.name == "player")
751 for (size_t i = 0; i < sizeof(player_labels) / sizeof(infomap); i++)
753 if (prop.name == player_labels[i].str)
754 return player_labels[i].val;
756 for (size_t i = 0; i < sizeof(player_times) / sizeof(infomap); i++)
758 if (prop.name == player_times[i].str)
759 return AddMultiInfo(GUIInfo(player_times[i].val, TranslateTimeFormat(prop.param())));
761 if (prop.num_params() == 1)
763 for (size_t i = 0; i < sizeof(player_param) / sizeof(infomap); i++)
765 if (prop.name == player_param[i].str)
766 return AddMultiInfo(GUIInfo(player_param[i].val, ConditionalStringParameter(prop.param())));
770 else if (cat.name == "weather")
772 for (size_t i = 0; i < sizeof(weather) / sizeof(infomap); i++)
774 if (prop.name == weather[i].str)
775 return weather[i].val;
778 else if (cat.name == "network")
780 for (size_t i = 0; i < sizeof(network_labels) / sizeof(infomap); i++)
782 if (prop.name == network_labels[i].str)
783 return network_labels[i].val;
786 else if (cat.name == "musicpartymode")
788 for (size_t i = 0; i < sizeof(musicpartymode) / sizeof(infomap); i++)
790 if (prop.name == musicpartymode[i].str)
791 return musicpartymode[i].val;
794 else if (cat.name == "system")
796 for (size_t i = 0; i < sizeof(system_labels) / sizeof(infomap); i++)
798 if (prop.name == system_labels[i].str)
799 return system_labels[i].val;
801 if (prop.num_params() == 1)
803 const CStdString ¶m = prop.param();
804 if (prop.name == "getbool")
806 std::string paramCopy = param;
807 StringUtils::ToLower(paramCopy);
808 return AddMultiInfo(GUIInfo(SYSTEM_GET_BOOL, ConditionalStringParameter(paramCopy, true)));
810 for (size_t i = 0; i < sizeof(system_param) / sizeof(infomap); i++)
812 if (prop.name == system_param[i].str)
813 return AddMultiInfo(GUIInfo(system_param[i].val, ConditionalStringParameter(param)));
815 if (prop.name == "memory")
817 if (param == "free") return SYSTEM_FREE_MEMORY;
818 else if (param == "free.percent") return SYSTEM_FREE_MEMORY_PERCENT;
819 else if (param == "used") return SYSTEM_USED_MEMORY;
820 else if (param == "used.percent") return SYSTEM_USED_MEMORY_PERCENT;
821 else if (param == "total") return SYSTEM_TOTAL_MEMORY;
823 else if (prop.name == "addontitle")
825 int infoLabel = TranslateSingleString(param);
827 return AddMultiInfo(GUIInfo(SYSTEM_ADDON_TITLE, infoLabel, 0));
828 CStdString label = CGUIInfoLabel::GetLabel(param).ToLower();
829 return AddMultiInfo(GUIInfo(SYSTEM_ADDON_TITLE, ConditionalStringParameter(label), 1));
831 else if (prop.name == "addonicon")
833 int infoLabel = TranslateSingleString(param);
835 return AddMultiInfo(GUIInfo(SYSTEM_ADDON_ICON, infoLabel, 0));
836 CStdString label = CGUIInfoLabel::GetLabel(param).ToLower();
837 return AddMultiInfo(GUIInfo(SYSTEM_ADDON_ICON, ConditionalStringParameter(label), 1));
839 else if (prop.name == "idletime")
840 return AddMultiInfo(GUIInfo(SYSTEM_IDLE_TIME, atoi(param.c_str())));
842 if (prop.name == "alarmlessorequal" && prop.num_params() == 2)
843 return AddMultiInfo(GUIInfo(SYSTEM_ALARM_LESS_OR_EQUAL, ConditionalStringParameter(prop.param(0)), ConditionalStringParameter(prop.param(1))));
844 else if (prop.name == "date")
846 if (prop.num_params() == 2)
847 return AddMultiInfo(GUIInfo(SYSTEM_DATE, StringUtils::DateStringToYYYYMMDD(prop.param(0)) % 10000, StringUtils::DateStringToYYYYMMDD(prop.param(1)) % 10000));
848 else if (prop.num_params() == 1)
850 int dateformat = StringUtils::DateStringToYYYYMMDD(prop.param(0));
851 if (dateformat <= 0) // not concrete date
852 return AddMultiInfo(GUIInfo(SYSTEM_DATE, ConditionalStringParameter(prop.param(0), true), -1));
854 return AddMultiInfo(GUIInfo(SYSTEM_DATE, dateformat % 10000));
858 else if (prop.name == "time")
860 if (prop.num_params() == 0)
861 return AddMultiInfo(GUIInfo(SYSTEM_TIME, TIME_FORMAT_GUESS));
862 if (prop.num_params() == 1)
864 TIME_FORMAT timeFormat = TranslateTimeFormat(prop.param(0));
865 if (timeFormat == TIME_FORMAT_GUESS)
866 return AddMultiInfo(GUIInfo(SYSTEM_TIME, StringUtils::TimeStringToSeconds(prop.param(0))));
867 return AddMultiInfo(GUIInfo(SYSTEM_TIME, timeFormat));
870 return AddMultiInfo(GUIInfo(SYSTEM_TIME, StringUtils::TimeStringToSeconds(prop.param(0)), StringUtils::TimeStringToSeconds(prop.param(1))));
873 else if (cat.name == "library")
875 if (prop.name == "isscanning") return LIBRARY_IS_SCANNING;
876 else if (prop.name == "isscanningvideo") return LIBRARY_IS_SCANNING_VIDEO; // TODO: change to IsScanning(Video)
877 else if (prop.name == "isscanningmusic") return LIBRARY_IS_SCANNING_MUSIC;
878 else if (prop.name == "hascontent" && prop.num_params())
880 CStdString cat = prop.param(0); cat.ToLower();
881 if (cat == "music") return LIBRARY_HAS_MUSIC;
882 else if (cat == "video") return LIBRARY_HAS_VIDEO;
883 else if (cat == "movies") return LIBRARY_HAS_MOVIES;
884 else if (cat == "tvshows") return LIBRARY_HAS_TVSHOWS;
885 else if (cat == "musicvideos") return LIBRARY_HAS_MUSICVIDEOS;
886 else if (cat == "moviesets") return LIBRARY_HAS_MOVIE_SETS;
889 else if (cat.name == "musicplayer")
891 for (size_t i = 0; i < sizeof(player_times) / sizeof(infomap); i++) // TODO: remove these, they're repeats
893 if (prop.name == player_times[i].str)
894 return AddMultiInfo(GUIInfo(player_times[i].val, TranslateTimeFormat(prop.param())));
896 if (prop.name == "property")
898 if (prop.param().Equals("fanart_image"))
899 return AddMultiInfo(GUIInfo(PLAYER_ITEM_ART, ConditionalStringParameter("fanart")));
900 return AddListItemProp(prop.param(), MUSICPLAYER_PROPERTY_OFFSET);
902 return TranslateMusicPlayerString(prop.name);
904 else if (cat.name == "videoplayer")
906 for (size_t i = 0; i < sizeof(player_times) / sizeof(infomap); i++) // TODO: remove these, they're repeats
908 if (prop.name == player_times[i].str)
909 return AddMultiInfo(GUIInfo(player_times[i].val, TranslateTimeFormat(prop.param())));
911 if (prop.name == "content" && prop.num_params())
912 return AddMultiInfo(GUIInfo(VIDEOPLAYER_CONTENT, ConditionalStringParameter(prop.param()), 0));
913 for (size_t i = 0; i < sizeof(videoplayer) / sizeof(infomap); i++)
915 if (prop.name == videoplayer[i].str)
916 return videoplayer[i].val;
919 else if (cat.name == "slideshow")
921 for (size_t i = 0; i < sizeof(slideshow) / sizeof(infomap); i++)
923 if (prop.name == slideshow[i].str)
924 return slideshow[i].val;
926 return CPictureInfoTag::TranslateString(prop.name);
928 else if (cat.name == "container")
930 for (size_t i = 0; i < sizeof(mediacontainer) / sizeof(infomap); i++) // these ones don't have or need an id
932 if (prop.name == mediacontainer[i].str)
933 return mediacontainer[i].val;
935 int id = atoi(cat.param().c_str());
936 for (size_t i = 0; i < sizeof(container_bools) / sizeof(infomap); i++) // these ones can have an id (but don't need to?)
938 if (prop.name == container_bools[i].str)
939 return id ? AddMultiInfo(GUIInfo(container_bools[i].val, id)) : container_bools[i].val;
941 for (size_t i = 0; i < sizeof(container_ints) / sizeof(infomap); i++) // these ones can have an int param on the property
943 if (prop.name == container_ints[i].str)
944 return AddMultiInfo(GUIInfo(container_ints[i].val, id, atoi(prop.param().c_str())));
946 for (size_t i = 0; i < sizeof(container_str) / sizeof(infomap); i++) // these ones have a string param on the property
948 if (prop.name == container_str[i].str)
949 return AddMultiInfo(GUIInfo(container_str[i].val, id, ConditionalStringParameter(prop.param())));
951 if (prop.name == "sortdirection")
953 SortOrder order = SortOrderNone;
954 if (prop.param().Equals("ascending"))
955 order = SortOrderAscending;
956 else if (prop.param().Equals("descending"))
957 order = SortOrderDescending;
958 return AddMultiInfo(GUIInfo(CONTAINER_SORT_DIRECTION, order));
960 else if (prop.name == "sort")
962 SORT_METHOD sort = SORT_METHOD_NONE;
963 if (prop.param().Equals("songrating")) sort = SORT_METHOD_SONG_RATING;
964 if (sort != SORT_METHOD_NONE)
965 return AddMultiInfo(GUIInfo(CONTAINER_SORT_METHOD, sort));
968 else if (cat.name == "listitem")
970 int offset = atoi(cat.param().c_str());
971 int ret = TranslateListItem(prop);
972 if (offset || ret == LISTITEM_ISSELECTED || ret == LISTITEM_ISPLAYING || ret == LISTITEM_IS_FOLDER)
973 return AddMultiInfo(GUIInfo(ret, 0, offset, INFOFLAG_LISTITEM_WRAP));
976 else if (cat.name == "listitemposition")
978 int offset = atoi(cat.param().c_str());
979 int ret = TranslateListItem(prop);
980 if (offset || ret == LISTITEM_ISSELECTED || ret == LISTITEM_ISPLAYING || ret == LISTITEM_IS_FOLDER)
981 return AddMultiInfo(GUIInfo(ret, 0, offset, INFOFLAG_LISTITEM_POSITION));
984 else if (cat.name == "listitemnowrap")
986 int offset = atoi(cat.param().c_str());
987 int ret = TranslateListItem(prop);
988 if (offset || ret == LISTITEM_ISSELECTED || ret == LISTITEM_ISPLAYING || ret == LISTITEM_IS_FOLDER)
989 return AddMultiInfo(GUIInfo(ret, 0, offset));
992 else if (cat.name == "visualisation")
994 for (size_t i = 0; i < sizeof(visualisation) / sizeof(infomap); i++)
996 if (prop.name == visualisation[i].str)
997 return visualisation[i].val;
1000 else if (cat.name == "fanart")
1002 for (size_t i = 0; i < sizeof(fanart_labels) / sizeof(infomap); i++)
1004 if (prop.name == fanart_labels[i].str)
1005 return fanart_labels[i].val;
1008 else if (cat.name == "skin")
1010 for (size_t i = 0; i < sizeof(skin_labels) / sizeof(infomap); i++)
1012 if (prop.name == skin_labels[i].str)
1013 return skin_labels[i].val;
1015 if (prop.num_params())
1017 if (prop.name == "string")
1019 if (prop.num_params() == 2)
1020 return AddMultiInfo(GUIInfo(SKIN_STRING, g_settings.TranslateSkinString(prop.param(0)), ConditionalStringParameter(prop.param(1))));
1022 return AddMultiInfo(GUIInfo(SKIN_STRING, g_settings.TranslateSkinString(prop.param(0))));
1024 if (prop.name == "hassetting")
1025 return AddMultiInfo(GUIInfo(SKIN_BOOL, g_settings.TranslateSkinBool(prop.param(0))));
1026 else if (prop.name == "hastheme")
1027 return AddMultiInfo(GUIInfo(SKIN_HAS_THEME, ConditionalStringParameter(prop.param(0))));
1030 else if (cat.name == "window")
1032 if (prop.name == "property" && prop.num_params() == 1)
1033 { // TODO: this doesn't support foo.xml
1034 int winID = cat.param().IsEmpty() ? 0 : CButtonTranslator::TranslateWindow(cat.param());
1035 if (winID != WINDOW_INVALID)
1036 return AddMultiInfo(GUIInfo(WINDOW_PROPERTY, winID, ConditionalStringParameter(prop.param())));
1038 for (size_t i = 0; i < sizeof(window_bools) / sizeof(infomap); i++)
1040 if (prop.name == window_bools[i].str)
1041 { // TODO: The parameter for these should really be on the first not the second property
1042 if (prop.param().Find("xml") >= 0)
1043 return AddMultiInfo(GUIInfo(window_bools[i].val, 0, ConditionalStringParameter(prop.param())));
1044 int winID = prop.param().IsEmpty() ? 0 : CButtonTranslator::TranslateWindow(prop.param());
1045 if (winID != WINDOW_INVALID)
1046 return AddMultiInfo(GUIInfo(window_bools[i].val, winID, 0));
1051 else if (cat.name == "control")
1053 for (size_t i = 0; i < sizeof(control_labels) / sizeof(infomap); i++)
1055 if (prop.name == control_labels[i].str)
1056 { // TODO: The parameter for these should really be on the first not the second property
1057 int controlID = atoi(prop.param().c_str());
1059 return AddMultiInfo(GUIInfo(control_labels[i].val, controlID, 0));
1064 else if (cat.name == "controlgroup" && prop.name == "hasfocus")
1066 int groupID = atoi(cat.param().c_str());
1068 return AddMultiInfo(GUIInfo(CONTROL_GROUP_HAS_FOCUS, groupID, atoi(prop.param(0).c_str())));
1070 else if (cat.name == "playlist")
1072 for (size_t i = 0; i < sizeof(playlist) / sizeof(infomap); i++)
1074 if (prop.name == playlist[i].str)
1075 return playlist[i].val;
1078 else if (cat.name == "pvr")
1080 for (size_t i = 0; i < sizeof(pvr) / sizeof(infomap); i++)
1082 if (prop.name == pvr[i].str)
1087 else if (info.size() == 3)
1089 if (info[0].name == "system" && info[1].name == "platform")
1090 { // TODO: replace with a single system.platform
1091 CStdString platform = info[2].name;
1092 if (platform == "linux") return SYSTEM_PLATFORM_LINUX;
1093 else if (platform == "windows") return SYSTEM_PLATFORM_WINDOWS;
1094 else if (platform == "darwin") return SYSTEM_PLATFORM_DARWIN;
1095 else if (platform == "osx") return SYSTEM_PLATFORM_DARWIN_OSX;
1096 else if (platform == "ios") return SYSTEM_PLATFORM_DARWIN_IOS;
1097 else if (platform == "atv2") return SYSTEM_PLATFORM_DARWIN_ATV2;
1098 else if (platform == "android") return SYSTEM_PLATFORM_ANDROID;
1100 if (info[0].name == "musicplayer")
1101 { // TODO: these two don't allow duration(foo) and also don't allow more than this number of levels...
1102 if (info[1].name == "position")
1104 int position = atoi(info[1].param().c_str());
1105 int value = TranslateMusicPlayerString(info[2].name); // musicplayer.position(foo).bar
1106 return AddMultiInfo(GUIInfo(value, 0, position));
1108 else if (info[1].name == "offset")
1110 int position = atoi(info[1].param().c_str());
1111 int value = TranslateMusicPlayerString(info[2].name); // musicplayer.offset(foo).bar
1112 return AddMultiInfo(GUIInfo(value, 1, position));
1115 else if (info[0].name == "container")
1117 int id = atoi(info[0].param().c_str());
1118 int offset = atoi(info[1].param().c_str());
1119 if (info[1].name == "listitemnowrap")
1120 return AddMultiInfo(GUIInfo(TranslateListItem(info[2]), id, offset));
1121 else if (info[1].name == "listitemposition")
1122 return AddMultiInfo(GUIInfo(TranslateListItem(info[2]), id, offset, INFOFLAG_LISTITEM_POSITION));
1123 else if (info[1].name == "listitem")
1124 return AddMultiInfo(GUIInfo(TranslateListItem(info[2]), id, offset, INFOFLAG_LISTITEM_WRAP));
1131 int CGUIInfoManager::TranslateListItem(const Property &info)
1133 for (size_t i = 0; i < sizeof(listitem_labels) / sizeof(infomap); i++) // these ones don't have or need an id
1135 if (info.name == listitem_labels[i].str)
1136 return listitem_labels[i].val;
1138 if (info.name == "property" && info.num_params() == 1)
1140 if (info.param().Equals("fanart_image"))
1141 return AddListItemProp("fanart", LISTITEM_ART_OFFSET);
1142 return AddListItemProp(info.param());
1144 if (info.name == "art" && info.num_params() == 1)
1145 return AddListItemProp(info.param(), LISTITEM_ART_OFFSET);
1149 int CGUIInfoManager::TranslateMusicPlayerString(const CStdString &info) const
1151 for (size_t i = 0; i < sizeof(musicplayer) / sizeof(infomap); i++)
1153 if (info == musicplayer[i].str)
1154 return musicplayer[i].val;
1159 TIME_FORMAT CGUIInfoManager::TranslateTimeFormat(const CStdString &format)
1161 if (format.IsEmpty()) return TIME_FORMAT_GUESS;
1162 else if (format.Equals("hh")) return TIME_FORMAT_HH;
1163 else if (format.Equals("mm")) return TIME_FORMAT_MM;
1164 else if (format.Equals("ss")) return TIME_FORMAT_SS;
1165 else if (format.Equals("hh:mm")) return TIME_FORMAT_HH_MM;
1166 else if (format.Equals("mm:ss")) return TIME_FORMAT_MM_SS;
1167 else if (format.Equals("hh:mm:ss")) return TIME_FORMAT_HH_MM_SS;
1168 else if (format.Equals("h")) return TIME_FORMAT_H;
1169 else if (format.Equals("h:mm:ss")) return TIME_FORMAT_H_MM_SS;
1170 else if (format.Equals("xx")) return TIME_FORMAT_XX;
1171 return TIME_FORMAT_GUESS;
1174 CStdString CGUIInfoManager::GetLabel(int info, int contextWindow, CStdString *fallback)
1176 if (info >= CONDITIONAL_LABEL_START && info <= CONDITIONAL_LABEL_END)
1177 return GetSkinVariableString(info, false);
1179 CStdString strLabel;
1180 if (info >= MULTI_INFO_START && info <= MULTI_INFO_END)
1181 return GetMultiInfoLabel(m_multiInfo[info - MULTI_INFO_START], contextWindow);
1183 if (info >= SLIDE_INFO_START && info <= SLIDE_INFO_END)
1184 return GetPictureLabel(info);
1186 if (info >= LISTITEM_PROPERTY_START+MUSICPLAYER_PROPERTY_OFFSET &&
1187 info - (LISTITEM_PROPERTY_START+MUSICPLAYER_PROPERTY_OFFSET) < (int)m_listitemProperties.size())
1188 { // grab the property
1192 CStdString property = m_listitemProperties[info - LISTITEM_PROPERTY_START-MUSICPLAYER_PROPERTY_OFFSET];
1193 return m_currentFile->GetProperty(property).asString();
1196 if (info >= LISTITEM_START && info <= LISTITEM_END)
1198 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_HAS_LIST_ITEMS); // true for has list items
1201 CFileItemPtr item = window->GetCurrentListItem();
1202 strLabel = GetItemLabel(item.get(), info, fallback);
1210 case PVR_NEXT_RECORDING_CHANNEL:
1211 case PVR_NEXT_RECORDING_CHAN_ICO:
1212 case PVR_NEXT_RECORDING_DATETIME:
1213 case PVR_NEXT_RECORDING_TITLE:
1214 case PVR_NOW_RECORDING_CHANNEL:
1215 case PVR_NOW_RECORDING_CHAN_ICO:
1216 case PVR_NOW_RECORDING_DATETIME:
1217 case PVR_NOW_RECORDING_TITLE:
1218 case PVR_BACKEND_NAME:
1219 case PVR_BACKEND_VERSION:
1220 case PVR_BACKEND_HOST:
1221 case PVR_BACKEND_DISKSPACE:
1222 case PVR_BACKEND_CHANNELS:
1223 case PVR_BACKEND_TIMERS:
1224 case PVR_BACKEND_RECORDINGS:
1225 case PVR_BACKEND_NUMBER:
1226 case PVR_TOTAL_DISKSPACE:
1227 case PVR_NEXT_TIMER:
1228 case PVR_PLAYING_DURATION:
1229 case PVR_PLAYING_TIME:
1230 case PVR_PLAYING_PROGRESS:
1231 case PVR_ACTUAL_STREAM_CLIENT:
1232 case PVR_ACTUAL_STREAM_DEVICE:
1233 case PVR_ACTUAL_STREAM_STATUS:
1234 case PVR_ACTUAL_STREAM_SIG:
1235 case PVR_ACTUAL_STREAM_SNR:
1236 case PVR_ACTUAL_STREAM_SIG_PROGR:
1237 case PVR_ACTUAL_STREAM_SNR_PROGR:
1238 case PVR_ACTUAL_STREAM_BER:
1239 case PVR_ACTUAL_STREAM_UNC:
1240 case PVR_ACTUAL_STREAM_VIDEO_BR:
1241 case PVR_ACTUAL_STREAM_AUDIO_BR:
1242 case PVR_ACTUAL_STREAM_DOLBY_BR:
1243 case PVR_ACTUAL_STREAM_CRYPTION:
1244 g_PVRManager.TranslateCharInfo(info, strLabel);
1246 case WEATHER_CONDITIONS:
1247 strLabel = g_weatherManager.GetInfo(WEATHER_LABEL_CURRENT_COND);
1248 strLabel = strLabel.Trim();
1250 case WEATHER_TEMPERATURE:
1251 strLabel.Format("%s%s", g_weatherManager.GetInfo(WEATHER_LABEL_CURRENT_TEMP), g_langInfo.GetTempUnitString().c_str());
1253 case WEATHER_LOCATION:
1254 strLabel = g_weatherManager.GetInfo(WEATHER_LABEL_LOCATION);
1256 case WEATHER_FANART_CODE:
1257 strLabel = URIUtils::GetFileName(g_weatherManager.GetInfo(WEATHER_IMAGE_CURRENT_ICON));
1258 URIUtils::RemoveExtension(strLabel);
1260 case WEATHER_PLUGIN:
1261 strLabel = g_guiSettings.GetString("weather.addon");
1264 strLabel = GetDate();
1267 strLabel.Format("%02.2f", m_fps);
1270 strLabel.Format("%2.1f dB", CAEUtil::PercentToGain(g_settings.m_fVolumeLevel));
1272 case PLAYER_SUBTITLE_DELAY:
1273 strLabel.Format("%2.3f s", g_settings.m_currentVideoSettings.m_SubtitleDelay);
1275 case PLAYER_AUDIO_DELAY:
1276 strLabel.Format("%2.3f s", g_settings.m_currentVideoSettings.m_AudioDelay);
1278 case PLAYER_CHAPTER:
1279 if(g_application.IsPlaying() && g_application.m_pPlayer)
1280 strLabel.Format("%02d", g_application.m_pPlayer->GetChapter());
1282 case PLAYER_CHAPTERCOUNT:
1283 if(g_application.IsPlaying() && g_application.m_pPlayer)
1284 strLabel.Format("%02d", g_application.m_pPlayer->GetChapterCount());
1286 case PLAYER_CHAPTERNAME:
1287 if(g_application.IsPlaying() && g_application.m_pPlayer)
1288 g_application.m_pPlayer->GetChapterName(strLabel);
1290 case PLAYER_CACHELEVEL:
1293 if(g_application.IsPlaying() && GetInt(iLevel, PLAYER_CACHELEVEL) && iLevel >= 0)
1294 strLabel.Format("%i", iLevel);
1298 if(g_application.IsPlaying() && g_application.m_pPlayer)
1299 strLabel = GetCurrentPlayTime(TIME_FORMAT_HH_MM);
1301 case PLAYER_DURATION:
1302 if(g_application.IsPlaying() && g_application.m_pPlayer)
1303 strLabel = GetDuration(TIME_FORMAT_HH_MM);
1306 case PLAYER_FILEPATH:
1309 if (m_currentFile->HasMusicInfoTag())
1310 strLabel = m_currentFile->GetMusicInfoTag()->GetURL();
1311 else if (m_currentFile->HasVideoInfoTag())
1312 strLabel = m_currentFile->GetVideoInfoTag()->m_strFileNameAndPath;
1313 if (strLabel.IsEmpty())
1314 strLabel = m_currentFile->GetPath();
1316 if (info == PLAYER_PATH)
1318 // do this twice since we want the path outside the archive if this
1320 if (URIUtils::IsInArchive(strLabel))
1321 strLabel = URIUtils::GetParentPath(strLabel);
1322 strLabel = URIUtils::GetParentPath(strLabel);
1329 if (m_currentFile->HasPVRChannelInfoTag())
1332 return m_currentFile->GetPVRChannelInfoTag()->GetEPGNow(tag) ?
1334 g_guiSettings.GetBool("epg.hidenoinfoavailable") ?
1335 StringUtils::EmptyString :
1336 g_localizeStrings.Get(19055); // no information available
1338 if (m_currentFile->HasPVRRecordingInfoTag() && !m_currentFile->GetPVRRecordingInfoTag()->m_strTitle.IsEmpty())
1339 return m_currentFile->GetPVRRecordingInfoTag()->m_strTitle;
1340 if (m_currentFile->HasVideoInfoTag() && !m_currentFile->GetVideoInfoTag()->m_strTitle.IsEmpty())
1341 return m_currentFile->GetVideoInfoTag()->m_strTitle;
1342 if (m_currentFile->HasMusicInfoTag() && !m_currentFile->GetMusicInfoTag()->GetTitle().IsEmpty())
1343 return m_currentFile->GetMusicInfoTag()->GetTitle();
1344 // don't have the title, so use dvdplayer, label, or drop down to title from path
1345 if (g_application.m_pPlayer && !g_application.m_pPlayer->GetPlayingTitle().IsEmpty())
1346 return g_application.m_pPlayer->GetPlayingTitle();
1347 if (!m_currentFile->GetLabel().IsEmpty())
1348 return m_currentFile->GetLabel();
1349 return CUtil::GetTitleFromPath(m_currentFile->GetPath());
1353 if (g_application.m_pPlayer && !g_application.m_pPlayer->GetPlayingTitle().IsEmpty())
1354 return g_application.m_pPlayer->GetPlayingTitle();
1358 case MUSICPLAYER_TITLE:
1359 case MUSICPLAYER_ALBUM:
1360 case MUSICPLAYER_ARTIST:
1361 case MUSICPLAYER_ALBUM_ARTIST:
1362 case MUSICPLAYER_GENRE:
1363 case MUSICPLAYER_YEAR:
1364 case MUSICPLAYER_TRACK_NUMBER:
1365 case MUSICPLAYER_BITRATE:
1366 case MUSICPLAYER_PLAYLISTLEN:
1367 case MUSICPLAYER_PLAYLISTPOS:
1368 case MUSICPLAYER_CHANNELS:
1369 case MUSICPLAYER_BITSPERSAMPLE:
1370 case MUSICPLAYER_SAMPLERATE:
1371 case MUSICPLAYER_CODEC:
1372 case MUSICPLAYER_DISC_NUMBER:
1373 case MUSICPLAYER_RATING:
1374 case MUSICPLAYER_COMMENT:
1375 case MUSICPLAYER_LYRICS:
1376 case MUSICPLAYER_CHANNEL_NAME:
1377 case MUSICPLAYER_CHANNEL_NUMBER:
1378 case MUSICPLAYER_CHANNEL_GROUP:
1379 case MUSICPLAYER_PLAYCOUNT:
1380 case MUSICPLAYER_LASTPLAYED:
1381 strLabel = GetMusicLabel(info);
1383 case VIDEOPLAYER_TITLE:
1384 case VIDEOPLAYER_ORIGINALTITLE:
1385 case VIDEOPLAYER_GENRE:
1386 case VIDEOPLAYER_DIRECTOR:
1387 case VIDEOPLAYER_YEAR:
1388 case VIDEOPLAYER_PLAYLISTLEN:
1389 case VIDEOPLAYER_PLAYLISTPOS:
1390 case VIDEOPLAYER_PLOT:
1391 case VIDEOPLAYER_PLOT_OUTLINE:
1392 case VIDEOPLAYER_EPISODE:
1393 case VIDEOPLAYER_SEASON:
1394 case VIDEOPLAYER_RATING:
1395 case VIDEOPLAYER_RATING_AND_VOTES:
1396 case VIDEOPLAYER_TVSHOW:
1397 case VIDEOPLAYER_PREMIERED:
1398 case VIDEOPLAYER_STUDIO:
1399 case VIDEOPLAYER_COUNTRY:
1400 case VIDEOPLAYER_MPAA:
1401 case VIDEOPLAYER_TOP250:
1402 case VIDEOPLAYER_CAST:
1403 case VIDEOPLAYER_CAST_AND_ROLE:
1404 case VIDEOPLAYER_ARTIST:
1405 case VIDEOPLAYER_ALBUM:
1406 case VIDEOPLAYER_WRITER:
1407 case VIDEOPLAYER_TAGLINE:
1408 case VIDEOPLAYER_TRAILER:
1409 case VIDEOPLAYER_STARTTIME:
1410 case VIDEOPLAYER_ENDTIME:
1411 case VIDEOPLAYER_NEXT_TITLE:
1412 case VIDEOPLAYER_NEXT_GENRE:
1413 case VIDEOPLAYER_NEXT_PLOT:
1414 case VIDEOPLAYER_NEXT_PLOT_OUTLINE:
1415 case VIDEOPLAYER_NEXT_STARTTIME:
1416 case VIDEOPLAYER_NEXT_ENDTIME:
1417 case VIDEOPLAYER_NEXT_DURATION:
1418 case VIDEOPLAYER_CHANNEL_NAME:
1419 case VIDEOPLAYER_CHANNEL_NUMBER:
1420 case VIDEOPLAYER_CHANNEL_GROUP:
1421 case VIDEOPLAYER_PARENTAL_RATING:
1422 case VIDEOPLAYER_PLAYCOUNT:
1423 case VIDEOPLAYER_LASTPLAYED:
1424 strLabel = GetVideoLabel(info);
1426 case VIDEOPLAYER_VIDEO_CODEC:
1427 if(g_application.IsPlaying() && g_application.m_pPlayer)
1429 SPlayerVideoStreamInfo info;
1430 g_application.m_pPlayer->GetVideoStreamInfo(info);
1431 strLabel = info.videoCodecName;
1434 case VIDEOPLAYER_VIDEO_RESOLUTION:
1435 if(g_application.IsPlaying() && g_application.m_pPlayer)
1436 return CStreamDetails::VideoDimsToResolutionDescription(g_application.m_pPlayer->GetPictureWidth(), g_application.m_pPlayer->GetPictureHeight());
1438 case VIDEOPLAYER_AUDIO_CODEC:
1439 if(g_application.IsPlaying() && g_application.m_pPlayer)
1441 SPlayerAudioStreamInfo info;
1442 g_application.m_pPlayer->GetAudioStreamInfo(g_application.m_pPlayer->GetAudioStream(), info);
1443 strLabel = info.audioCodecName;
1446 case VIDEOPLAYER_VIDEO_ASPECT:
1447 if (g_application.IsPlaying() && g_application.m_pPlayer)
1449 SPlayerVideoStreamInfo info;
1450 g_application.m_pPlayer->GetVideoStreamInfo(info);
1451 strLabel = CStreamDetails::VideoAspectToAspectDescription(info.videoAspectRatio);
1454 case VIDEOPLAYER_AUDIO_CHANNELS:
1455 if(g_application.IsPlaying() && g_application.m_pPlayer)
1457 SPlayerAudioStreamInfo info;
1458 g_application.m_pPlayer->GetAudioStreamInfo(g_application.m_pPlayer->GetAudioStream(), info);
1459 strLabel.Format("%i", info.channels);
1462 case PLAYLIST_LENGTH:
1463 case PLAYLIST_POSITION:
1464 case PLAYLIST_RANDOM:
1465 case PLAYLIST_REPEAT:
1466 strLabel = GetPlaylistLabel(info);
1468 case MUSICPM_SONGSPLAYED:
1469 case MUSICPM_MATCHINGSONGS:
1470 case MUSICPM_MATCHINGSONGSPICKED:
1471 case MUSICPM_MATCHINGSONGSLEFT:
1472 case MUSICPM_RELAXEDSONGSPICKED:
1473 case MUSICPM_RANDOMSONGSPICKED:
1474 strLabel = GetMusicPartyModeLabel(info);
1477 case SYSTEM_FREE_SPACE:
1478 case SYSTEM_USED_SPACE:
1479 case SYSTEM_TOTAL_SPACE:
1480 case SYSTEM_FREE_SPACE_PERCENT:
1481 case SYSTEM_USED_SPACE_PERCENT:
1482 return g_sysinfo.GetHddSpaceInfo(info);
1485 case SYSTEM_CPU_TEMPERATURE:
1486 case SYSTEM_GPU_TEMPERATURE:
1487 case SYSTEM_FAN_SPEED:
1488 case SYSTEM_CPU_USAGE:
1489 return GetSystemHeatInfo(info);
1492 case SYSTEM_VIDEO_ENCODER_INFO:
1493 case NETWORK_MAC_ADDRESS:
1494 case SYSTEM_KERNEL_VERSION:
1495 case SYSTEM_CPUFREQUENCY:
1496 case SYSTEM_INTERNET_STATE:
1498 case SYSTEM_TOTALUPTIME:
1499 case SYSTEM_BATTERY_LEVEL:
1500 return g_sysinfo.GetInfo(info);
1503 case SYSTEM_SCREEN_RESOLUTION:
1504 if(g_Windowing.IsFullScreen())
1505 strLabel.Format("%ix%i@%.2fHz - %s (%02.2f fps)",
1506 g_settings.m_ResInfo[g_guiSettings.m_LookAndFeelResolution].iScreenWidth,
1507 g_settings.m_ResInfo[g_guiSettings.m_LookAndFeelResolution].iScreenHeight,
1508 g_settings.m_ResInfo[g_guiSettings.m_LookAndFeelResolution].fRefreshRate,
1509 g_localizeStrings.Get(244), GetFPS());
1511 strLabel.Format("%ix%i - %s (%02.2f fps)",
1512 g_settings.m_ResInfo[g_guiSettings.m_LookAndFeelResolution].iScreenWidth,
1513 g_settings.m_ResInfo[g_guiSettings.m_LookAndFeelResolution].iScreenHeight,
1514 g_localizeStrings.Get(242), GetFPS());
1518 case CONTAINER_FOLDERPATH:
1519 case CONTAINER_FOLDERNAME:
1521 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
1524 if (info==CONTAINER_FOLDERNAME)
1525 strLabel = ((CGUIMediaWindow*)window)->CurrentDirectory().GetLabel();
1527 strLabel = CURL(((CGUIMediaWindow*)window)->CurrentDirectory().GetPath()).GetWithoutUserDetails();
1531 case CONTAINER_PLUGINNAME:
1533 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
1536 CURL url(((CGUIMediaWindow*)window)->CurrentDirectory().GetPath());
1537 if (url.GetProtocol().Equals("plugin"))
1539 strLabel = url.GetFileName();
1540 URIUtils::RemoveSlashAtEnd(strLabel);
1545 case CONTAINER_VIEWMODE:
1547 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
1550 const CGUIControl *control = window->GetControl(window->GetViewContainerID());
1551 if (control && control->IsContainer())
1552 strLabel = ((IGUIContainer *)control)->GetLabel();
1556 case CONTAINER_SORT_METHOD:
1558 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
1561 const CGUIViewState *viewState = ((CGUIMediaWindow*)window)->GetViewState();
1563 strLabel = g_localizeStrings.Get(viewState->GetSortMethodLabel());
1567 case CONTAINER_NUM_PAGES:
1568 case CONTAINER_NUM_ITEMS:
1569 case CONTAINER_CURRENT_PAGE:
1570 return GetMultiInfoLabel(GUIInfo(info), contextWindow);
1572 case CONTAINER_SHOWPLOT:
1574 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
1576 return ((CGUIMediaWindow *)window)->CurrentDirectory().GetProperty("showplot").asString();
1579 case CONTAINER_TOTALTIME:
1581 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
1584 const CFileItemList& items=((CGUIMediaWindow *)window)->CurrentDirectory();
1586 for (int i=0;i<items.Size();++i)
1588 CFileItemPtr item=items.Get(i);
1589 if (item->HasMusicInfoTag())
1590 duration += item->GetMusicInfoTag()->GetDuration();
1591 else if (item->HasVideoInfoTag())
1592 duration += item->GetVideoInfoTag()->m_streamDetails.GetVideoDuration();
1595 return StringUtils::SecondsToTimeString(duration);
1599 case SYSTEM_BUILD_VERSION:
1600 strLabel = GetVersion();
1602 case SYSTEM_BUILD_DATE:
1603 strLabel = GetBuild();
1605 case SYSTEM_FREE_MEMORY:
1606 case SYSTEM_FREE_MEMORY_PERCENT:
1607 case SYSTEM_USED_MEMORY:
1608 case SYSTEM_USED_MEMORY_PERCENT:
1609 case SYSTEM_TOTAL_MEMORY:
1611 MEMORYSTATUSEX stat;
1612 stat.dwLength = sizeof(MEMORYSTATUSEX);
1613 GlobalMemoryStatusEx(&stat);
1614 int iMemPercentFree = 100 - ((int)( 100.0f* (stat.ullTotalPhys - stat.ullAvailPhys)/stat.ullTotalPhys + 0.5f ));
1615 int iMemPercentUsed = 100 - iMemPercentFree;
1617 if (info == SYSTEM_FREE_MEMORY)
1618 strLabel.Format("%luMB", (ULONG)(stat.ullAvailPhys/MB));
1619 else if (info == SYSTEM_FREE_MEMORY_PERCENT)
1620 strLabel.Format("%i%%", iMemPercentFree);
1621 else if (info == SYSTEM_USED_MEMORY)
1622 strLabel.Format("%luMB", (ULONG)((stat.ullTotalPhys - stat.ullAvailPhys)/MB));
1623 else if (info == SYSTEM_USED_MEMORY_PERCENT)
1624 strLabel.Format("%i%%", iMemPercentUsed);
1625 else if (info == SYSTEM_TOTAL_MEMORY)
1626 strLabel.Format("%luMB", (ULONG)(stat.ullTotalPhys/MB));
1629 case SYSTEM_SCREEN_MODE:
1630 strLabel = g_settings.m_ResInfo[g_graphicsContext.GetVideoResolution()].strMode;
1632 case SYSTEM_SCREEN_WIDTH:
1633 strLabel.Format("%i", g_settings.m_ResInfo[g_graphicsContext.GetVideoResolution()].iScreenWidth);
1635 case SYSTEM_SCREEN_HEIGHT:
1636 strLabel.Format("%i", g_settings.m_ResInfo[g_graphicsContext.GetVideoResolution()].iScreenHeight);
1638 case SYSTEM_CURRENT_WINDOW:
1639 return g_localizeStrings.Get(g_windowManager.GetFocusedWindow());
1641 case SYSTEM_CURRENT_CONTROL:
1643 CGUIWindow *window = g_windowManager.GetWindow(g_windowManager.GetFocusedWindow());
1646 CGUIControl *control = window->GetFocusedControl();
1648 strLabel = control->GetDescription();
1652 #ifdef HAS_DVD_DRIVE
1653 case SYSTEM_DVD_LABEL:
1654 strLabel = g_mediaManager.GetDiskLabel();
1657 case SYSTEM_ALARM_POS:
1658 if (g_alarmClock.GetRemaining("shutdowntimer") == 0.f)
1662 double fTime = g_alarmClock.GetRemaining("shutdowntimer");
1664 strLabel.Format(g_localizeStrings.Get(13213).c_str(),g_alarmClock.GetRemaining("shutdowntimer")/60.f);
1666 strLabel.Format(g_localizeStrings.Get(13214).c_str(),g_alarmClock.GetRemaining("shutdowntimer"));
1669 case SYSTEM_PROFILENAME:
1670 strLabel = g_settings.GetCurrentProfile().getName();
1672 case SYSTEM_PROFILECOUNT:
1673 strLabel.Format("%i", g_settings.GetNumProfiles());
1675 case SYSTEM_LANGUAGE:
1676 strLabel = g_guiSettings.GetString("locale.language");
1678 case SYSTEM_TEMPERATURE_UNITS:
1679 strLabel = g_langInfo.GetTempUnitString();
1681 case SYSTEM_PROGRESS_BAR:
1684 if (GetInt(percent, SYSTEM_PROGRESS_BAR) && percent > 0)
1685 strLabel.Format("%i", percent);
1688 case SYSTEM_FRIENDLY_NAME:
1690 CStdString friendlyName = g_guiSettings.GetString("services.devicename");
1691 if (friendlyName.Equals("XBMC"))
1692 strLabel.Format("%s (%s)", friendlyName.c_str(), g_application.getNetwork().GetHostName().c_str());
1694 strLabel = friendlyName;
1699 strLabel = g_guiSettings.GetString("lookandfeel.skintheme");
1701 case SKIN_COLOUR_THEME:
1702 strLabel = g_guiSettings.GetString("lookandfeel.skincolors");
1704 case SKIN_ASPECT_RATIO:
1706 strLabel = g_SkinInfo->GetCurrentAspect();
1708 case NETWORK_IP_ADDRESS:
1710 CNetworkInterface* iface = g_application.getNetwork().GetFirstConnectedInterface();
1712 return iface->GetCurrentIPAddress();
1715 case NETWORK_SUBNET_MASK:
1717 CNetworkInterface* iface = g_application.getNetwork().GetFirstConnectedInterface();
1719 return iface->GetCurrentNetmask();
1722 case NETWORK_GATEWAY_ADDRESS:
1724 CNetworkInterface* iface = g_application.getNetwork().GetFirstConnectedInterface();
1726 return iface->GetCurrentDefaultGateway();
1729 case NETWORK_DNS1_ADDRESS:
1731 vector<CStdString> nss = g_application.getNetwork().GetNameServers();
1732 if (nss.size() >= 1)
1736 case NETWORK_DNS2_ADDRESS:
1738 vector<CStdString> nss = g_application.getNetwork().GetNameServers();
1739 if (nss.size() >= 2)
1743 case NETWORK_DHCP_ADDRESS:
1745 CStdString dhcpserver;
1749 case NETWORK_LINK_STATE:
1751 CStdString linkStatus = g_localizeStrings.Get(151);
1753 CNetworkInterface* iface = g_application.getNetwork().GetFirstConnectedInterface();
1754 if (iface && iface->IsConnected())
1755 linkStatus += g_localizeStrings.Get(15207);
1757 linkStatus += g_localizeStrings.Get(15208);
1762 case VISUALISATION_PRESET:
1764 CGUIMessage msg(GUI_MSG_GET_VISUALISATION, 0, 0);
1765 g_windowManager.SendMessage(msg);
1766 if (msg.GetPointer())
1768 CVisualisation* viz = NULL;
1769 viz = (CVisualisation*)msg.GetPointer();
1772 strLabel = viz->GetPresetName();
1773 URIUtils::RemoveExtension(strLabel);
1778 case VISUALISATION_NAME:
1781 strLabel = g_guiSettings.GetString("musicplayer.visualisation");
1782 if (CAddonMgr::Get().GetAddon(strLabel,addon) && addon)
1783 strLabel = addon->Name();
1788 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
1790 return ((CGUIMediaWindow *)window)->CurrentDirectory().GetProperty("fanart_color1").asString();
1795 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
1797 return ((CGUIMediaWindow *)window)->CurrentDirectory().GetProperty("fanart_color2").asString();
1802 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
1804 return ((CGUIMediaWindow *)window)->CurrentDirectory().GetProperty("fanart_color3").asString();
1809 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
1811 return ((CGUIMediaWindow *)window)->CurrentDirectory().GetArt("fanart");
1814 case SYSTEM_RENDER_VENDOR:
1815 strLabel = g_Windowing.GetRenderVendor();
1817 case SYSTEM_RENDER_RENDERER:
1818 strLabel = g_Windowing.GetRenderRenderer();
1820 case SYSTEM_RENDER_VERSION:
1821 strLabel = g_Windowing.GetRenderVersionString();
1828 // tries to get a integer value for use in progressbars/sliders and such
1829 bool CGUIInfoManager::GetInt(int &value, int info, int contextWindow, const CGUIListItem *item /* = NULL */) const
1831 if (info >= MULTI_INFO_START && info <= MULTI_INFO_END)
1832 return GetMultiInfoInt(value, m_multiInfo[info - MULTI_INFO_START], contextWindow);
1834 if (info >= LISTITEM_START && info <= LISTITEM_END)
1835 return GetItemInt(value, item, info);
1841 value = g_application.GetVolume();
1843 case PLAYER_SUBTITLE_DELAY:
1844 value = g_application.GetSubtitleDelay();
1846 case PLAYER_AUDIO_DELAY:
1847 value = g_application.GetAudioDelay();
1849 case PLAYER_PROGRESS:
1850 case PLAYER_PROGRESS_CACHE:
1851 case PLAYER_SEEKBAR:
1852 case PLAYER_CACHELEVEL:
1853 case PLAYER_CHAPTER:
1854 case PLAYER_CHAPTERCOUNT:
1856 if( g_application.IsPlaying() && g_application.m_pPlayer)
1860 case PLAYER_PROGRESS:
1861 value = (int)(g_application.GetPercentage());
1863 case PLAYER_PROGRESS_CACHE:
1864 value = (int)(g_application.GetCachePercentage());
1866 case PLAYER_SEEKBAR:
1867 value = (int)g_application.GetSeekHandler()->GetPercent();
1869 case PLAYER_CACHELEVEL:
1870 value = (int)(g_application.m_pPlayer->GetCacheLevel());
1872 case PLAYER_CHAPTER:
1873 value = g_application.m_pPlayer->GetChapter();
1875 case PLAYER_CHAPTERCOUNT:
1876 value = g_application.m_pPlayer->GetChapterCount();
1882 case SYSTEM_FREE_MEMORY:
1883 case SYSTEM_USED_MEMORY:
1885 MEMORYSTATUSEX stat;
1886 stat.dwLength = sizeof(MEMORYSTATUSEX);
1887 GlobalMemoryStatusEx(&stat);
1888 int memPercentUsed = (int)( 100.0f* (stat.ullTotalPhys - stat.ullAvailPhys)/stat.ullTotalPhys + 0.5f );
1889 if (info == SYSTEM_FREE_MEMORY)
1890 value = 100 - memPercentUsed;
1892 value = memPercentUsed;
1895 case SYSTEM_PROGRESS_BAR:
1897 CGUIDialogProgress *bar = (CGUIDialogProgress *)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS);
1898 if (bar && bar->IsDialogRunning())
1899 value = bar->GetPercentage();
1902 case SYSTEM_FREE_SPACE:
1903 case SYSTEM_USED_SPACE:
1905 g_sysinfo.GetHddSpaceInfo(value, info, true);
1908 case SYSTEM_CPU_USAGE:
1909 value = g_cpuInfo.getUsedPercentage();
1911 case PVR_PLAYING_PROGRESS:
1912 case PVR_ACTUAL_STREAM_SIG_PROGR:
1913 case PVR_ACTUAL_STREAM_SNR_PROGR:
1914 value = g_PVRManager.TranslateIntInfo(info);
1916 case SYSTEM_BATTERY_LEVEL:
1917 value = g_powerManager.BatteryLevel();
1923 unsigned int CGUIInfoManager::Register(const CStdString &expression, int context)
1925 CStdString condition(CGUIInfoLabel::ReplaceLocalize(expression));
1926 condition.TrimLeft(" \t\r\n");
1927 condition.TrimRight(" \t\r\n");
1929 if (condition.IsEmpty())
1932 CSingleLock lock(m_critInfo);
1933 // do we have the boolean expression already registered?
1934 InfoBool test(condition, context);
1935 for (unsigned int i = 0; i < m_bools.size(); ++i)
1937 if (*m_bools[i] == test)
1941 if (condition.find_first_of("|+[]!") != condition.npos)
1942 m_bools.push_back(new InfoExpression(condition, context));
1944 m_bools.push_back(new InfoSingle(condition, context));
1946 return m_bools.size();
1949 bool CGUIInfoManager::EvaluateBool(const CStdString &expression, int contextWindow)
1951 bool result = false;
1952 unsigned int info = Register(expression, contextWindow);
1954 result = GetBoolValue(info);
1959 TODO: what to do with item-based infobools...
1961 1. if condition is between LISTITEM_START and LISTITEM_END
1962 2. if condition is STRING_IS_EMPTY, STRING_COMPARE, STRING_STR, INTEGER_GREATER_THAN and the
1963 corresponding label is between LISTITEM_START and LISTITEM_END
1965 In both cases they shouldn't be in our cache as they depend on items outside of our control atm.
1967 We only pass a listitem object in for controls inside a listitemlayout, so I think it's probably OK
1968 to not cache these, as they're "pushed" out anyway.
1970 The problem is how do we avoid these? The only thing we have to go on is the expression here, so I
1971 guess what we have to do is call through via Update. One thing we don't handle, however, is that the
1972 majority of conditions (even inside lists) don't depend on the listitem at all.
1974 Advantage is that we know this at creation time I think, so could perhaps signal it in IsDirty()?
1976 bool CGUIInfoManager::GetBoolValue(unsigned int expression, const CGUIListItem *item)
1978 if (expression && --expression < m_bools.size())
1979 return m_bools[expression]->Get(m_updateTime, item);
1983 // checks the condition and returns it as necessary. Currently used
1984 // for toggle button controls and visibility of images.
1985 bool CGUIInfoManager::GetBool(int condition1, int contextWindow, const CGUIListItem *item)
1987 bool bReturn = false;
1988 int condition = abs(condition1);
1990 if (item && condition >= LISTITEM_START && condition < LISTITEM_END)
1991 bReturn = GetItemBool(item, condition);
1992 // Ethernet Link state checking
1993 // Will check if system has a Ethernet Link connection! [Cable in!]
1994 // This can used for the skinner to switch off Network or Inter required functions
1995 else if ( condition == SYSTEM_ALWAYS_TRUE)
1997 else if (condition == SYSTEM_ALWAYS_FALSE)
1999 else if (condition == SYSTEM_ETHERNET_LINK_ACTIVE)
2001 else if (condition == WINDOW_IS_MEDIA)
2002 { // note: This doesn't return true for dialogs (content, favourites, login, videoinfo)
2003 CGUIWindow *pWindow = g_windowManager.GetWindow(g_windowManager.GetActiveWindow());
2004 bReturn = (pWindow && pWindow->IsMediaWindow());
2006 else if (condition == PLAYER_MUTED)
2007 bReturn = g_settings.m_bMute;
2008 else if (condition >= LIBRARY_HAS_MUSIC && condition <= LIBRARY_HAS_MUSICVIDEOS)
2009 bReturn = GetLibraryBool(condition);
2010 else if (condition == LIBRARY_IS_SCANNING)
2012 if (g_application.IsMusicScanning() || g_application.IsVideoScanning())
2017 else if (condition == LIBRARY_IS_SCANNING_VIDEO)
2019 bReturn = g_application.IsVideoScanning();
2021 else if (condition == LIBRARY_IS_SCANNING_MUSIC)
2023 bReturn = g_application.IsMusicScanning();
2025 else if (condition == SYSTEM_PLATFORM_LINUX)
2026 #if defined(_LINUX) && !defined(TARGET_DARWIN) && !defined(TARGET_ANDROID)
2031 else if (condition == SYSTEM_PLATFORM_WINDOWS)
2037 else if (condition == SYSTEM_PLATFORM_DARWIN)
2038 #ifdef TARGET_DARWIN
2043 else if (condition == SYSTEM_PLATFORM_DARWIN_OSX)
2044 #ifdef TARGET_DARWIN_OSX
2049 else if (condition == SYSTEM_PLATFORM_DARWIN_IOS)
2050 #ifdef TARGET_DARWIN_IOS
2055 else if (condition == SYSTEM_PLATFORM_DARWIN_ATV2)
2056 #ifdef TARGET_DARWIN_IOS_ATV2
2061 else if (condition == SYSTEM_PLATFORM_ANDROID)
2062 #if defined(TARGET_ANDROID)
2067 else if (condition == SYSTEM_MEDIA_DVD)
2068 bReturn = g_mediaManager.IsDiscInDrive();
2069 #ifdef HAS_DVD_DRIVE
2070 else if (condition == SYSTEM_DVDREADY)
2071 bReturn = g_mediaManager.GetDriveStatus() != DRIVE_NOT_READY;
2072 else if (condition == SYSTEM_TRAYOPEN)
2073 bReturn = g_mediaManager.GetDriveStatus() == DRIVE_OPEN;
2075 else if (condition == SYSTEM_CAN_POWERDOWN)
2076 bReturn = g_powerManager.CanPowerdown();
2077 else if (condition == SYSTEM_CAN_SUSPEND)
2078 bReturn = g_powerManager.CanSuspend();
2079 else if (condition == SYSTEM_CAN_HIBERNATE)
2080 bReturn = g_powerManager.CanHibernate();
2081 else if (condition == SYSTEM_CAN_REBOOT)
2082 bReturn = g_powerManager.CanReboot();
2083 else if (condition == SYSTEM_SCREENSAVER_ACTIVE)
2084 bReturn = g_application.IsInScreenSaver();
2086 else if (condition == PLAYER_SHOWINFO)
2087 bReturn = m_playerShowInfo;
2088 else if (condition == PLAYER_SHOWCODEC)
2089 bReturn = m_playerShowCodec;
2090 else if (condition >= MULTI_INFO_START && condition <= MULTI_INFO_END)
2092 return GetMultiInfoBool(m_multiInfo[condition - MULTI_INFO_START], contextWindow, item);
2094 else if (condition == SYSTEM_HASLOCKS)
2095 bReturn = g_settings.GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE;
2096 else if (condition == SYSTEM_HAS_PVR)
2098 else if (condition == SYSTEM_ISMASTER)
2099 bReturn = g_settings.GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && g_passwordManager.bMasterUser;
2100 else if (condition == SYSTEM_ISFULLSCREEN)
2101 bReturn = g_Windowing.IsFullScreen();
2102 else if (condition == SYSTEM_ISSTANDALONE)
2103 bReturn = g_application.IsStandAlone();
2104 else if (condition == SYSTEM_ISINHIBIT)
2105 bReturn = g_application.IsIdleShutdownInhibited();
2106 else if (condition == SYSTEM_HAS_SHUTDOWN)
2107 bReturn = (g_guiSettings.GetInt("powermanagement.shutdowntime") > 0);
2108 else if (condition == SYSTEM_LOGGEDON)
2109 bReturn = !(g_windowManager.GetActiveWindow() == WINDOW_LOGIN_SCREEN);
2110 else if (condition == SYSTEM_SHOW_EXIT_BUTTON)
2111 bReturn = g_advancedSettings.m_showExitButton;
2112 else if (condition == SYSTEM_HAS_LOGINSCREEN)
2113 bReturn = g_settings.UsingLoginScreen();
2114 else if (condition == WEATHER_IS_FETCHED)
2115 bReturn = g_weatherManager.IsFetched();
2116 else if (condition >= PVR_CONDITIONS_START && condition <= PVR_CONDITIONS_END)
2117 bReturn = g_PVRManager.TranslateBoolInfo(condition);
2119 else if (condition == SYSTEM_INTERNET_STATE)
2121 g_sysinfo.GetInfo(condition);
2122 bReturn = g_sysinfo.HasInternet();
2124 else if (condition == SKIN_HAS_VIDEO_OVERLAY)
2126 bReturn = g_windowManager.IsOverlayAllowed() && g_application.IsPlayingVideo();
2128 else if (condition == SKIN_HAS_MUSIC_OVERLAY)
2130 bReturn = g_windowManager.IsOverlayAllowed() && g_application.IsPlayingAudio();
2132 else if (condition == CONTAINER_HASFILES || condition == CONTAINER_HASFOLDERS)
2134 CGUIWindow *pWindow = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
2137 const CFileItemList& items=((CGUIMediaWindow*)pWindow)->CurrentDirectory();
2138 for (int i=0;i<items.Size();++i)
2140 CFileItemPtr item=items.Get(i);
2141 if (!item->m_bIsFolder && condition == CONTAINER_HASFILES)
2146 else if (item->m_bIsFolder && !item->IsParentFolder() && condition == CONTAINER_HASFOLDERS)
2154 else if (condition == CONTAINER_STACKED)
2156 CGUIWindow *pWindow = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
2158 bReturn = ((CGUIMediaWindow*)pWindow)->CurrentDirectory().GetProperty("isstacked").asBoolean();
2160 else if (condition == CONTAINER_HAS_THUMB)
2162 CGUIWindow *pWindow = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
2164 bReturn = ((CGUIMediaWindow*)pWindow)->CurrentDirectory().HasArt("thumb");
2166 else if (condition == CONTAINER_HAS_NEXT || condition == CONTAINER_HAS_PREVIOUS || condition == CONTAINER_SCROLLING)
2168 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
2171 const CGUIControl* control = window->GetControl(window->GetViewContainerID());
2173 bReturn = control->GetCondition(condition, 0);
2176 else if (condition == CONTAINER_CAN_FILTER)
2178 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
2180 bReturn = !((CGUIMediaWindow*)window)->CanFilterAdvanced();
2182 else if (condition == CONTAINER_CAN_FILTERADVANCED)
2184 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
2186 bReturn = ((CGUIMediaWindow*)window)->CanFilterAdvanced();
2188 else if (condition == CONTAINER_FILTERED)
2190 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
2192 bReturn = ((CGUIMediaWindow*)window)->IsFiltered();
2194 else if (condition == VIDEOPLAYER_HAS_INFO)
2195 bReturn = ((m_currentFile->HasVideoInfoTag() && !m_currentFile->GetVideoInfoTag()->IsEmpty()) ||
2196 (m_currentFile->HasPVRChannelInfoTag() && !m_currentFile->GetPVRChannelInfoTag()->IsEmpty()));
2197 else if (condition >= CONTAINER_SCROLL_PREVIOUS && condition <= CONTAINER_SCROLL_NEXT)
2199 // no parameters, so we assume it's just requested for a media window. It therefore
2200 // can only happen if the list has focus.
2201 CGUIWindow *pWindow = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
2204 map<int,int>::const_iterator it = m_containerMoves.find(pWindow->GetViewContainerID());
2205 if (it != m_containerMoves.end())
2207 if (condition > CONTAINER_STATIC) // moving up
2208 bReturn = it->second >= std::max(condition - CONTAINER_STATIC, 1);
2210 bReturn = it->second <= std::min(condition - CONTAINER_STATIC, -1);
2214 else if (condition == SLIDESHOW_ISPAUSED)
2216 CGUIWindowSlideShow *slideShow = (CGUIWindowSlideShow *)g_windowManager.GetWindow(WINDOW_SLIDESHOW);
2217 bReturn = (slideShow && slideShow->IsPaused());
2219 else if (condition == SLIDESHOW_ISRANDOM)
2221 CGUIWindowSlideShow *slideShow = (CGUIWindowSlideShow *)g_windowManager.GetWindow(WINDOW_SLIDESHOW);
2222 bReturn = (slideShow && slideShow->IsShuffled());
2224 else if (condition == SLIDESHOW_ISACTIVE)
2226 CGUIWindowSlideShow *slideShow = (CGUIWindowSlideShow *)g_windowManager.GetWindow(WINDOW_SLIDESHOW);
2227 bReturn = (slideShow && slideShow->InSlideShow());
2229 else if (g_application.IsPlaying())
2233 case PLAYER_HAS_MEDIA:
2236 case PLAYER_HAS_AUDIO:
2237 bReturn = g_application.IsPlayingAudio();
2239 case PLAYER_HAS_VIDEO:
2240 bReturn = g_application.IsPlayingVideo();
2242 case PLAYER_PLAYING:
2243 bReturn = !g_application.IsPaused() && (g_application.GetPlaySpeed() == 1);
2246 bReturn = g_application.IsPaused();
2248 case PLAYER_REWINDING:
2249 bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() < 1;
2251 case PLAYER_FORWARDING:
2252 bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() > 1;
2254 case PLAYER_REWINDING_2x:
2255 bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() == -2;
2257 case PLAYER_REWINDING_4x:
2258 bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() == -4;
2260 case PLAYER_REWINDING_8x:
2261 bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() == -8;
2263 case PLAYER_REWINDING_16x:
2264 bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() == -16;
2266 case PLAYER_REWINDING_32x:
2267 bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() == -32;
2269 case PLAYER_FORWARDING_2x:
2270 bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() == 2;
2272 case PLAYER_FORWARDING_4x:
2273 bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() == 4;
2275 case PLAYER_FORWARDING_8x:
2276 bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() == 8;
2278 case PLAYER_FORWARDING_16x:
2279 bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() == 16;
2281 case PLAYER_FORWARDING_32x:
2282 bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() == 32;
2284 case PLAYER_CAN_RECORD:
2285 bReturn = g_application.m_pPlayer->CanRecord();
2287 case PLAYER_CAN_PAUSE:
2288 bReturn = g_application.m_pPlayer->CanPause();
2290 case PLAYER_CAN_SEEK:
2291 bReturn = g_application.m_pPlayer->CanSeek();
2293 case PLAYER_RECORDING:
2294 bReturn = g_application.m_pPlayer->IsRecording();
2296 case PLAYER_DISPLAY_AFTER_SEEK:
2297 bReturn = GetDisplayAfterSeek();
2299 case PLAYER_CACHING:
2300 bReturn = g_application.m_pPlayer->IsCaching();
2302 case PLAYER_SEEKBAR:
2304 CGUIDialog *seekBar = (CGUIDialog*)g_windowManager.GetWindow(WINDOW_DIALOG_SEEK_BAR);
2305 bReturn = seekBar ? seekBar->IsDialogRunning() : false;
2308 case PLAYER_SEEKING:
2309 bReturn = m_playerSeeking;
2311 case PLAYER_SHOWTIME:
2312 bReturn = m_playerShowTime;
2314 case PLAYER_PASSTHROUGH:
2315 bReturn = g_application.m_pPlayer && g_application.m_pPlayer->IsPassthrough();
2317 case MUSICPM_ENABLED:
2318 bReturn = g_partyModeManager.IsEnabled();
2320 case MUSICPLAYER_HASPREVIOUS:
2322 // requires current playlist be PLAYLIST_MUSIC
2324 if (g_playlistPlayer.GetCurrentPlaylist() == PLAYLIST_MUSIC)
2325 bReturn = (g_playlistPlayer.GetCurrentSong() > 0); // not first song
2328 case MUSICPLAYER_HASNEXT:
2330 // requires current playlist be PLAYLIST_MUSIC
2332 if (g_playlistPlayer.GetCurrentPlaylist() == PLAYLIST_MUSIC)
2333 bReturn = (g_playlistPlayer.GetCurrentSong() < (g_playlistPlayer.GetPlaylist(PLAYLIST_MUSIC).size() - 1)); // not last song
2336 case MUSICPLAYER_PLAYLISTPLAYING:
2339 if (g_application.IsPlayingAudio() && g_playlistPlayer.GetCurrentPlaylist() == PLAYLIST_MUSIC)
2343 case VIDEOPLAYER_USING_OVERLAYS:
2344 bReturn = (g_guiSettings.GetInt("videoplayer.rendermethod") == RENDER_OVERLAYS);
2346 case VIDEOPLAYER_ISFULLSCREEN:
2347 bReturn = g_windowManager.GetActiveWindow() == WINDOW_FULLSCREEN_VIDEO;
2349 case VIDEOPLAYER_HASMENU:
2350 bReturn = g_application.m_pPlayer->HasMenu();
2352 case PLAYLIST_ISRANDOM:
2353 bReturn = g_playlistPlayer.IsShuffled(g_playlistPlayer.GetCurrentPlaylist());
2355 case PLAYLIST_ISREPEAT:
2356 bReturn = g_playlistPlayer.GetRepeat(g_playlistPlayer.GetCurrentPlaylist()) == PLAYLIST::REPEAT_ALL;
2358 case PLAYLIST_ISREPEATONE:
2359 bReturn = g_playlistPlayer.GetRepeat(g_playlistPlayer.GetCurrentPlaylist()) == PLAYLIST::REPEAT_ONE;
2361 case PLAYER_HASDURATION:
2362 bReturn = g_application.GetTotalTime() > 0;
2364 case VIDEOPLAYER_HASTELETEXT:
2365 if (g_application.m_pPlayer->GetTeletextCache())
2368 case VIDEOPLAYER_HASSUBTITLES:
2369 bReturn = g_application.m_pPlayer->GetSubtitleCount() > 0;
2371 case VIDEOPLAYER_SUBTITLESENABLED:
2372 bReturn = g_application.m_pPlayer->GetSubtitleVisible();
2374 case VISUALISATION_LOCKED:
2376 CGUIMessage msg(GUI_MSG_GET_VISUALISATION, 0, 0);
2377 g_windowManager.SendMessage(msg);
2378 if (msg.GetPointer())
2380 CVisualisation *pVis = (CVisualisation *)msg.GetPointer();
2381 bReturn = pVis->IsLocked();
2385 case VISUALISATION_ENABLED:
2386 bReturn = !g_guiSettings.GetString("musicplayer.visualisation").IsEmpty();
2388 case VIDEOPLAYER_HAS_EPG:
2389 if (m_currentFile->HasPVRChannelInfoTag())
2392 bReturn = m_currentFile->GetPVRChannelInfoTag()->GetEPGNow(epgTag);
2395 default: // default, use integer value different from 0 as true
2398 bReturn = GetInt(val, condition) && val != 0;
2407 /// \brief Examines the multi information sent and returns true or false accordingly.
2408 bool CGUIInfoManager::GetMultiInfoBool(const GUIInfo &info, int contextWindow, const CGUIListItem *item)
2410 bool bReturn = false;
2411 int condition = abs(info.m_info);
2413 if (condition >= LISTITEM_START && condition <= LISTITEM_END)
2417 CGUIWindow *window = NULL;
2418 int data1 = info.GetData1();
2419 if (!data1) // No container specified, so we lookup the current view container
2421 window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_HAS_LIST_ITEMS);
2422 if (window && window->IsMediaWindow())
2423 data1 = ((CGUIMediaWindow*)(window))->GetViewContainerID();
2426 if (!window) // If we don't have a window already (from lookup above), get one
2427 window = GetWindowWithCondition(contextWindow, 0);
2431 const CGUIControl *control = window->GetControl(data1);
2432 if (control && control->IsContainer())
2433 item = ((IGUIContainer *)control)->GetListItem(info.GetData2(), info.GetInfoFlag()).get();
2436 if (item) // If we got a valid item, do the lookup
2437 bReturn = GetItemBool(item, condition); // Image prioritizes images over labels (in the case of music item ratings for instance)
2445 bReturn = g_settings.GetSkinBool(info.GetData1());
2450 if (info.GetData2())
2451 bReturn = g_settings.GetSkinString(info.GetData1()).Equals(m_stringParameters[info.GetData2()]);
2453 bReturn = !g_settings.GetSkinString(info.GetData1()).IsEmpty();
2456 case SKIN_HAS_THEME:
2458 CStdString theme = g_guiSettings.GetString("lookandfeel.skintheme");
2460 URIUtils::RemoveExtension(theme);
2461 bReturn = theme.Equals(m_stringParameters[info.GetData1()]);
2464 case STRING_IS_EMPTY:
2465 // note: Get*Image() falls back to Get*Label(), so this should cover all of them
2466 if (item && item->IsFileItem() && info.GetData1() >= LISTITEM_START && info.GetData1() < LISTITEM_END)
2467 bReturn = GetItemImage((const CFileItem *)item, info.GetData1()).IsEmpty();
2469 bReturn = GetImage(info.GetData1(), contextWindow).IsEmpty();
2471 case STRING_COMPARE:
2474 if (info.GetData2() < 0) // info labels are stored with negative numbers
2476 int info2 = -info.GetData2();
2477 if (item && item->IsFileItem() && info2 >= LISTITEM_START && info2 < LISTITEM_END)
2478 compare = GetItemImage((const CFileItem *)item, info2);
2480 compare = GetImage(info2, contextWindow);
2482 else if (info.GetData2() < (int)m_stringParameters.size())
2483 { // conditional string
2484 compare = m_stringParameters[info.GetData2()];
2486 if (item && item->IsFileItem() && info.GetData1() >= LISTITEM_START && info.GetData1() < LISTITEM_END)
2487 bReturn = GetItemImage((const CFileItem *)item, info.GetData1()).Equals(compare);
2489 bReturn = GetImage(info.GetData1(), contextWindow).Equals(compare);
2492 case INTEGER_GREATER_THAN:
2495 if (GetInt(integer, info.GetData1(), contextWindow, item))
2496 bReturn = integer > info.GetData2();
2501 if (item && item->IsFileItem() && info.GetData1() >= LISTITEM_START && info.GetData1() < LISTITEM_END)
2502 value = GetItemImage((const CFileItem *)item, info.GetData1());
2504 value = GetImage(info.GetData1(), contextWindow);
2506 // Handle the case when a value contains time separator (:). This makes IntegerGreaterThan
2507 // useful for Player.Time* members without adding a separate set of members returning time in seconds
2508 if ( value.find_first_of( ':' ) != value.npos )
2509 bReturn = StringUtils::TimeStringToSeconds( value ) > info.GetData2();
2511 bReturn = atoi( value.c_str() ) > info.GetData2();
2516 case STRING_STR_LEFT:
2517 case STRING_STR_RIGHT:
2519 CStdString compare = m_stringParameters[info.GetData2()];
2520 // our compare string is already in lowercase, so lower case our label as well
2521 // as CStdString::Find() is case sensitive
2523 if (item && item->IsFileItem() && info.GetData1() >= LISTITEM_START && info.GetData1() < LISTITEM_END)
2524 label = GetItemImage((const CFileItem *)item, info.GetData1()).ToLower();
2526 label = GetImage(info.GetData1(), contextWindow).ToLower();
2527 if (condition == STRING_STR_LEFT)
2528 bReturn = label.Find(compare) == 0;
2529 else if (condition == STRING_STR_RIGHT)
2530 bReturn = label.Find(compare) == (int)(label.size()-compare.size());
2532 bReturn = label.Find(compare) > -1;
2535 case SYSTEM_ALARM_LESS_OR_EQUAL:
2537 int time = lrint(g_alarmClock.GetRemaining(m_stringParameters[info.GetData1()]));
2538 int timeCompare = atoi(m_stringParameters[info.GetData2()]);
2540 bReturn = timeCompare >= time;
2545 case SYSTEM_IDLE_TIME:
2546 bReturn = g_application.GlobalIdleTime() >= (int)info.GetData1();
2548 case CONTROL_GROUP_HAS_FOCUS:
2550 CGUIWindow *window = GetWindowWithCondition(contextWindow, 0);
2552 bReturn = window->ControlGroupHasFocus(info.GetData1(), info.GetData2());
2555 case CONTROL_IS_VISIBLE:
2557 CGUIWindow *window = GetWindowWithCondition(contextWindow, 0);
2560 // Note: This'll only work for unique id's
2561 const CGUIControl *control = window->GetControl(info.GetData1());
2563 bReturn = control->IsVisible();
2567 case CONTROL_IS_ENABLED:
2569 CGUIWindow *window = GetWindowWithCondition(contextWindow, 0);
2572 // Note: This'll only work for unique id's
2573 const CGUIControl *control = window->GetControl(info.GetData1());
2575 bReturn = !control->IsDisabled();
2579 case CONTROL_HAS_FOCUS:
2581 CGUIWindow *window = GetWindowWithCondition(contextWindow, 0);
2583 bReturn = (window->GetFocusedControlID() == (int)info.GetData1());
2587 if (info.GetData1())
2588 bReturn = ((int)info.GetData1() == m_nextWindowID);
2591 CGUIWindow *window = g_windowManager.GetWindow(m_nextWindowID);
2592 if (window && URIUtils::GetFileName(window->GetProperty("xmlfile").asString()).Equals(m_stringParameters[info.GetData2()]))
2596 case WINDOW_PREVIOUS:
2597 if (info.GetData1())
2598 bReturn = ((int)info.GetData1() == m_prevWindowID);
2601 CGUIWindow *window = g_windowManager.GetWindow(m_prevWindowID);
2602 if (window && URIUtils::GetFileName(window->GetProperty("xmlfile").asString()).Equals(m_stringParameters[info.GetData2()]))
2606 case WINDOW_IS_VISIBLE:
2607 if (info.GetData1())
2608 bReturn = g_windowManager.IsWindowVisible(info.GetData1());
2610 bReturn = g_windowManager.IsWindowVisible(m_stringParameters[info.GetData2()]);
2612 case WINDOW_IS_TOPMOST:
2613 if (info.GetData1())
2614 bReturn = g_windowManager.IsWindowTopMost(info.GetData1());
2616 bReturn = g_windowManager.IsWindowTopMost(m_stringParameters[info.GetData2()]);
2618 case WINDOW_IS_ACTIVE:
2619 if (info.GetData1())
2620 bReturn = g_windowManager.IsWindowActive(info.GetData1());
2622 bReturn = g_windowManager.IsWindowActive(m_stringParameters[info.GetData2()]);
2624 case SYSTEM_HAS_ALARM:
2625 bReturn = g_alarmClock.HasAlarm(m_stringParameters[info.GetData1()]);
2627 case SYSTEM_GET_BOOL:
2628 bReturn = g_guiSettings.GetBool(m_stringParameters[info.GetData1()]);
2630 case SYSTEM_HAS_CORE_ID:
2631 bReturn = g_cpuInfo.HasCoreId(info.GetData1());
2633 case SYSTEM_SETTING:
2635 if ( m_stringParameters[info.GetData1()].Equals("hidewatched") )
2637 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
2639 bReturn = g_settings.GetWatchMode(((CGUIMediaWindow *)window)->CurrentDirectory().GetContent()) == VIDEO_SHOW_UNWATCHED;
2643 case SYSTEM_HAS_ADDON:
2646 bReturn = CAddonMgr::Get().GetAddon(m_stringParameters[info.GetData1()],addon) && addon;
2649 case CONTAINER_SCROLL_PREVIOUS:
2650 case CONTAINER_MOVE_PREVIOUS:
2651 case CONTAINER_MOVE_NEXT:
2652 case CONTAINER_SCROLL_NEXT:
2654 map<int,int>::const_iterator it = m_containerMoves.find(info.GetData1());
2655 if (it != m_containerMoves.end())
2657 if (condition > CONTAINER_STATIC) // moving up
2658 bReturn = it->second >= std::max(condition - CONTAINER_STATIC, 1);
2660 bReturn = it->second <= std::min(condition - CONTAINER_STATIC, -1);
2664 case CONTAINER_CONTENT:
2667 CGUIWindow *window = GetWindowWithCondition(contextWindow, 0);
2670 if (window->GetID() == WINDOW_DIALOG_MUSIC_INFO)
2671 content = ((CGUIDialogMusicInfo *)window)->CurrentDirectory().GetContent();
2672 else if (window->GetID() == WINDOW_DIALOG_VIDEO_INFO)
2673 content = ((CGUIDialogVideoInfo *)window)->CurrentDirectory().GetContent();
2675 if (content.IsEmpty())
2677 window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
2679 content = ((CGUIMediaWindow *)window)->CurrentDirectory().GetContent();
2681 bReturn = m_stringParameters[info.GetData2()].Equals(content);
2685 case CONTAINER_COLUMN:
2686 case CONTAINER_POSITION:
2687 case CONTAINER_HAS_NEXT:
2688 case CONTAINER_HAS_PREVIOUS:
2689 case CONTAINER_SCROLLING:
2690 case CONTAINER_SUBITEM:
2692 const CGUIControl *control = NULL;
2693 if (info.GetData1())
2694 { // container specified
2695 CGUIWindow *window = GetWindowWithCondition(contextWindow, 0);
2697 control = window->GetControl(info.GetData1());
2700 { // no container specified - assume a mediawindow
2701 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
2703 control = window->GetControl(window->GetViewContainerID());
2706 bReturn = control->GetCondition(condition, info.GetData2());
2709 case CONTAINER_HAS_FOCUS:
2710 { // grab our container
2711 CGUIWindow *window = GetWindowWithCondition(contextWindow, 0);
2714 const CGUIControl *control = window->GetControl(info.GetData1());
2715 if (control && control->IsContainer())
2717 CFileItemPtr item = boost::static_pointer_cast<CFileItem>(((IGUIContainer *)control)->GetListItem(0));
2718 if (item && item->m_iprogramCount == info.GetData2()) // programcount used to store item id
2724 case VIDEOPLAYER_CONTENT:
2726 CStdString strContent="movies";
2727 if (!m_currentFile->HasVideoInfoTag() || m_currentFile->GetVideoInfoTag()->IsEmpty())
2728 strContent = "files";
2729 if (m_currentFile->HasVideoInfoTag() && m_currentFile->GetVideoInfoTag()->m_iSeason > -1) // episode
2730 strContent = "episodes";
2731 if (m_currentFile->HasVideoInfoTag() && !m_currentFile->GetVideoInfoTag()->m_artist.empty())
2732 strContent = "musicvideos";
2733 if (m_currentFile->HasVideoInfoTag() && m_currentFile->GetVideoInfoTag()->m_strStatus == "livetv")
2734 strContent = "livetv";
2735 if (m_currentFile->HasPVRChannelInfoTag())
2736 strContent = "livetv";
2737 bReturn = m_stringParameters[info.GetData1()].Equals(strContent);
2740 case CONTAINER_SORT_METHOD:
2742 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
2745 const CGUIViewState *viewState = ((CGUIMediaWindow*)window)->GetViewState();
2747 bReturn = ((unsigned int)viewState->GetSortMethod() == info.GetData1());
2751 case CONTAINER_SORT_DIRECTION:
2753 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
2756 const CGUIViewState *viewState = ((CGUIMediaWindow*)window)->GetViewState();
2758 bReturn = ((unsigned int)viewState->GetDisplaySortOrder() == info.GetData1());
2764 if (info.GetData2() == -1) // info doesn't contain valid startDate
2766 CDateTime date = CDateTime::GetCurrentDateTime();
2767 int currentDate = date.GetMonth()*100+date.GetDay();
2768 int startDate = info.GetData1();
2769 int stopDate = info.GetData2();
2771 if (stopDate < startDate)
2772 bReturn = currentDate >= startDate || currentDate < stopDate;
2774 bReturn = currentDate >= startDate && currentDate < stopDate;
2779 CDateTime time=CDateTime::GetCurrentDateTime();
2780 int currentTime = time.GetMinuteOfDay();
2781 int startTime = info.GetData1();
2782 int stopTime = info.GetData2();
2784 if (stopTime < startTime)
2785 bReturn = currentTime >= startTime || currentTime < stopTime;
2787 bReturn = currentTime >= startTime && currentTime < stopTime;
2790 case MUSICPLAYER_EXISTS:
2792 int index = info.GetData2();
2793 if (info.GetData1() == 1)
2795 if (g_playlistPlayer.GetCurrentPlaylist() != PLAYLIST_MUSIC)
2797 index += g_playlistPlayer.GetCurrentSong();
2799 if (index >= 0 && index < g_playlistPlayer.GetPlaylist(PLAYLIST_MUSIC).size())
2806 return (info.m_info < 0) ? !bReturn : bReturn;
2809 bool CGUIInfoManager::GetMultiInfoInt(int &value, const GUIInfo &info, int contextWindow) const
2811 if (info.m_info >= LISTITEM_START && info.m_info <= LISTITEM_END)
2814 CGUIWindow *window = NULL;
2816 int data1 = info.GetData1();
2817 if (!data1) // No container specified, so we lookup the current view container
2819 window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_HAS_LIST_ITEMS);
2820 if (window && window->IsMediaWindow())
2821 data1 = ((CGUIMediaWindow*)(window))->GetViewContainerID();
2824 if (!window) // If we don't have a window already (from lookup above), get one
2825 window = GetWindowWithCondition(contextWindow, 0);
2829 const CGUIControl *control = window->GetControl(data1);
2830 if (control && control->IsContainer())
2831 item = boost::static_pointer_cast<CFileItem>(((IGUIContainer *)control)->GetListItem(info.GetData2(), info.GetInfoFlag()));
2834 if (item) // If we got a valid item, do the lookup
2835 return GetItemInt(value, item.get(), info.m_info);
2841 /// \brief Examines the multi information sent and returns the string as appropriate
2842 CStdString CGUIInfoManager::GetMultiInfoLabel(const GUIInfo &info, int contextWindow, CStdString *fallback)
2844 if (info.m_info == SKIN_STRING)
2846 return g_settings.GetSkinString(info.GetData1());
2848 else if (info.m_info == SKIN_BOOL)
2850 bool bInfo = g_settings.GetSkinBool(info.GetData1());
2852 return g_localizeStrings.Get(20122);
2854 if (info.m_info >= LISTITEM_START && info.m_info <= LISTITEM_END)
2857 CGUIWindow *window = NULL;
2859 int data1 = info.GetData1();
2860 if (!data1) // No container specified, so we lookup the current view container
2862 window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_HAS_LIST_ITEMS);
2863 if (window && window->IsMediaWindow())
2864 data1 = ((CGUIMediaWindow*)(window))->GetViewContainerID();
2867 if (!window) // If we don't have a window already (from lookup above), get one
2868 window = GetWindowWithCondition(contextWindow, 0);
2872 const CGUIControl *control = window->GetControl(data1);
2873 if (control && control->IsContainer())
2874 item = boost::static_pointer_cast<CFileItem>(((IGUIContainer *)control)->GetListItem(info.GetData2(), info.GetInfoFlag()));
2877 if (item) // If we got a valid item, do the lookup
2878 return GetItemImage(item.get(), info.m_info, fallback); // Image prioritizes images over labels (in the case of music item ratings for instance)
2880 else if (info.m_info == PLAYER_TIME)
2882 return GetCurrentPlayTime((TIME_FORMAT)info.GetData1());
2884 else if (info.m_info == PLAYER_TIME_REMAINING)
2886 return GetCurrentPlayTimeRemaining((TIME_FORMAT)info.GetData1());
2888 else if (info.m_info == PLAYER_FINISH_TIME)
2891 CEpgInfoTag currentTag;
2892 if (GetEpgInfoTag(currentTag))
2893 time = currentTag.EndAsLocalTime();
2896 time = CDateTime::GetCurrentDateTime();
2897 time += CDateTimeSpan(0, 0, 0, GetPlayTimeRemaining());
2899 return LocalizeTime(time, (TIME_FORMAT)info.GetData1());
2901 else if (info.m_info == PLAYER_START_TIME)
2904 CEpgInfoTag currentTag;
2905 if (GetEpgInfoTag(currentTag))
2906 time = currentTag.StartAsLocalTime();
2909 time = CDateTime::GetCurrentDateTime();
2910 time -= CDateTimeSpan(0, 0, 0, (int)GetPlayTime());
2912 return LocalizeTime(time, (TIME_FORMAT)info.GetData1());
2914 else if (info.m_info == PLAYER_TIME_SPEED)
2917 if (g_application.GetPlaySpeed() != 1)
2918 strTime.Format("%s (%ix)", GetCurrentPlayTime((TIME_FORMAT)info.GetData1()).c_str(), g_application.GetPlaySpeed());
2920 strTime = GetCurrentPlayTime();
2923 else if (info.m_info == PLAYER_DURATION)
2925 return GetDuration((TIME_FORMAT)info.GetData1());
2927 else if (info.m_info == PLAYER_SEEKTIME)
2929 return GetCurrentSeekTime((TIME_FORMAT)info.GetData1());
2931 else if (info.m_info == PLAYER_SEEKOFFSET)
2933 CStdString seekOffset = StringUtils::SecondsToTimeString(abs(m_seekOffset), (TIME_FORMAT)info.GetData1());
2934 if (m_seekOffset < 0)
2935 return "-" + seekOffset;
2936 if (m_seekOffset > 0)
2937 return "+" + seekOffset;
2939 else if (info.m_info == PLAYER_ITEM_ART)
2941 return m_currentFile->GetArt(m_stringParameters[info.GetData1()]);
2943 else if (info.m_info == SYSTEM_TIME)
2945 return GetTime((TIME_FORMAT)info.GetData1());
2947 else if (info.m_info == SYSTEM_DATE)
2949 CDateTime time=CDateTime::GetCurrentDateTime();
2950 return time.GetAsLocalizedDate(m_stringParameters[info.GetData1()],false);
2952 else if (info.m_info == CONTAINER_NUM_PAGES || info.m_info == CONTAINER_CURRENT_PAGE ||
2953 info.m_info == CONTAINER_NUM_ITEMS || info.m_info == CONTAINER_POSITION)
2955 const CGUIControl *control = NULL;
2956 if (info.GetData1())
2957 { // container specified
2958 CGUIWindow *window = GetWindowWithCondition(contextWindow, 0);
2960 control = window->GetControl(info.GetData1());
2963 { // no container specified - assume a mediawindow
2964 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
2966 control = window->GetControl(window->GetViewContainerID());
2970 if (control->IsContainer())
2971 return ((IGUIContainer *)control)->GetLabel(info.m_info);
2972 else if (control->GetControlType() == CGUIControl::GUICONTROL_TEXTBOX)
2973 return ((CGUITextBox *)control)->GetLabel(info.m_info);
2976 else if (info.m_info == SYSTEM_GET_CORE_USAGE)
2979 strCpu.Format("%4.2f", g_cpuInfo.GetCoreInfo(atoi(m_stringParameters[info.GetData1()].c_str())).m_fPct);
2982 else if (info.m_info >= MUSICPLAYER_TITLE && info.m_info <= MUSICPLAYER_ALBUM_ARTIST)
2983 return GetMusicPlaylistInfo(info);
2984 else if (info.m_info == CONTAINER_PROPERTY)
2986 CGUIWindow *window = NULL;
2987 if (info.GetData1())
2988 { // container specified
2989 window = GetWindowWithCondition(contextWindow, 0);
2992 { // no container specified - assume a mediawindow
2993 window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
2996 return ((CGUIMediaWindow *)window)->CurrentDirectory().GetProperty(m_stringParameters[info.GetData2()]).asString();
2998 else if (info.m_info == CONTROL_GET_LABEL)
3000 CGUIWindow *window = GetWindowWithCondition(contextWindow, 0);
3003 const CGUIControl *control = window->GetControl(info.GetData1());
3005 return control->GetDescription();
3008 else if (info.m_info == WINDOW_PROPERTY)
3010 CGUIWindow *window = NULL;
3011 if (info.GetData1())
3012 { // window specified
3013 window = g_windowManager.GetWindow(info.GetData1());//GetWindowWithCondition(contextWindow, 0);
3016 { // no window specified - assume active
3017 window = GetWindowWithCondition(contextWindow, 0);
3021 return window->GetProperty(m_stringParameters[info.GetData2()]).asString();
3023 else if (info.m_info == SYSTEM_ADDON_TITLE ||
3024 info.m_info == SYSTEM_ADDON_ICON)
3026 // This logic does not check/care whether an addon has been disabled/marked as broken,
3027 // it simply retrieves it's name or icon that means if an addon is placed on the home screen it
3028 // will stay there even if it's disabled/marked as broken. This might need to be changed/fixed
3031 if (info.GetData2() == 0)
3032 CAddonMgr::Get().GetAddon(const_cast<CGUIInfoManager*>(this)->GetLabel(info.GetData1(), contextWindow),addon,ADDON_UNKNOWN,false);
3034 CAddonMgr::Get().GetAddon(m_stringParameters[info.GetData1()],addon,ADDON_UNKNOWN,false);
3035 if (addon && info.m_info == SYSTEM_ADDON_TITLE)
3036 return addon->Name();
3037 if (addon && info.m_info == SYSTEM_ADDON_ICON)
3038 return addon->Icon();
3041 return StringUtils::EmptyString;
3044 /// \brief Obtains the filename of the image to show from whichever subsystem is needed
3045 CStdString CGUIInfoManager::GetImage(int info, int contextWindow, CStdString *fallback)
3047 if (info >= CONDITIONAL_LABEL_START && info <= CONDITIONAL_LABEL_END)
3048 return GetSkinVariableString(info, true);
3050 if (info >= MULTI_INFO_START && info <= MULTI_INFO_END)
3052 return GetMultiInfoLabel(m_multiInfo[info - MULTI_INFO_START], contextWindow, fallback);
3054 else if (info == WEATHER_CONDITIONS)
3055 return g_weatherManager.GetInfo(WEATHER_IMAGE_CURRENT_ICON);
3056 else if (info == SYSTEM_PROFILETHUMB)
3058 CStdString thumb = g_settings.GetCurrentProfile().getThumb();
3059 if (thumb.IsEmpty())
3060 thumb = "unknown-user.png";
3063 else if (info == MUSICPLAYER_COVER)
3065 if (!g_application.IsPlayingAudio()) return "";
3067 *fallback = "DefaultAlbumCover.png";
3068 return m_currentFile->HasArt("thumb") ? m_currentFile->GetArt("thumb") : "DefaultAlbumCover.png";
3070 else if (info == MUSICPLAYER_RATING)
3072 if (!g_application.IsPlayingAudio()) return "";
3073 return GetItemImage(m_currentFile, LISTITEM_RATING);
3075 else if (info == PLAYER_STAR_RATING)
3077 if (!g_application.IsPlaying()) return "";
3078 return GetItemImage(m_currentFile, LISTITEM_STAR_RATING);
3080 else if (info == VIDEOPLAYER_COVER)
3082 if (!g_application.IsPlayingVideo()) return "";
3084 *fallback = "DefaultVideoCover.png";
3085 if(m_currentMovieThumb.IsEmpty())
3086 return m_currentFile->HasArt("thumb") ? m_currentFile->GetArt("thumb") : "DefaultVideoCover.png";
3087 else return m_currentMovieThumb;
3089 else if (info == CONTAINER_FOLDERTHUMB)
3091 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
3093 return GetItemImage(&const_cast<CFileItemList&>(((CGUIMediaWindow*)window)->CurrentDirectory()), LISTITEM_THUMB, fallback);
3095 else if (info == CONTAINER_TVSHOWTHUMB)
3097 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
3099 return ((CGUIMediaWindow *)window)->CurrentDirectory().GetArt("tvshow.thumb");
3101 else if (info == CONTAINER_SEASONTHUMB)
3103 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
3105 return ((CGUIMediaWindow *)window)->CurrentDirectory().GetArt("season.thumb");
3107 else if (info == LISTITEM_THUMB || info == LISTITEM_ICON || info == LISTITEM_ACTUAL_ICON ||
3108 info == LISTITEM_OVERLAY || info == LISTITEM_RATING || info == LISTITEM_STAR_RATING)
3110 CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_HAS_LIST_ITEMS);
3113 CFileItemPtr item = window->GetCurrentListItem();
3115 return GetItemImage(item.get(), info, fallback);
3118 return GetLabel(info, contextWindow, fallback);
3121 CStdString CGUIInfoManager::GetDate(bool bNumbersOnly)
3123 CDateTime time=CDateTime::GetCurrentDateTime();
3124 return time.GetAsLocalizedDate(!bNumbersOnly);
3127 CStdString CGUIInfoManager::GetTime(TIME_FORMAT format) const
3129 CDateTime time=CDateTime::GetCurrentDateTime();
3130 return LocalizeTime(time, format);
3133 CStdString CGUIInfoManager::LocalizeTime(const CDateTime &time, TIME_FORMAT format) const
3135 const CStdString timeFormat = g_langInfo.GetTimeFormat();
3136 bool use12hourclock = timeFormat.Find('h') != -1;
3139 case TIME_FORMAT_GUESS:
3140 return time.GetAsLocalizedTime("", false);
3141 case TIME_FORMAT_SS:
3142 return time.GetAsLocalizedTime("ss", true);
3143 case TIME_FORMAT_MM:
3144 return time.GetAsLocalizedTime("mm", true);
3145 case TIME_FORMAT_MM_SS:
3146 return time.GetAsLocalizedTime("mm:ss", true);
3147 case TIME_FORMAT_HH: // this forces it to a 12 hour clock
3148 return time.GetAsLocalizedTime(use12hourclock ? "h" : "HH", false);
3149 case TIME_FORMAT_HH_MM:
3150 return time.GetAsLocalizedTime(use12hourclock ? "h:mm" : "HH:mm", false);
3151 case TIME_FORMAT_HH_MM_XX:
3152 return time.GetAsLocalizedTime(use12hourclock ? "h:mm xx" : "HH:mm", false);
3153 case TIME_FORMAT_HH_MM_SS:
3154 return time.GetAsLocalizedTime("", true);
3156 return time.GetAsLocalizedTime("h", false);
3157 case TIME_FORMAT_H_MM_SS:
3158 return time.GetAsLocalizedTime("h:mm:ss", true);
3159 case TIME_FORMAT_XX:
3160 return use12hourclock ? time.GetAsLocalizedTime("xx", false) : "";
3164 return time.GetAsLocalizedTime("", false);
3167 CStdString CGUIInfoManager::GetDuration(TIME_FORMAT format) const
3169 if (g_application.IsPlayingAudio() && m_currentFile->HasMusicInfoTag())
3171 const CMusicInfoTag& tag = *m_currentFile->GetMusicInfoTag();
3172 if (tag.GetDuration() > 0)
3173 return StringUtils::SecondsToTimeString(tag.GetDuration(), format);
3175 if (g_application.IsPlayingVideo() && !m_currentMovieDuration.IsEmpty())
3176 return m_currentMovieDuration; // for tuxbox
3177 unsigned int iTotal = (unsigned int)g_application.GetTotalTime();
3179 return StringUtils::SecondsToTimeString(iTotal, format);
3183 CStdString CGUIInfoManager::GetMusicPartyModeLabel(int item)
3186 if (item >= MUSICPM_SONGSPLAYED && item <= MUSICPM_RANDOMSONGSPICKED)
3191 case MUSICPM_SONGSPLAYED:
3193 iSongs = g_partyModeManager.GetSongsPlayed();
3196 case MUSICPM_MATCHINGSONGS:
3198 iSongs = g_partyModeManager.GetMatchingSongs();
3201 case MUSICPM_MATCHINGSONGSPICKED:
3203 iSongs = g_partyModeManager.GetMatchingSongsPicked();
3206 case MUSICPM_MATCHINGSONGSLEFT:
3208 iSongs = g_partyModeManager.GetMatchingSongsLeft();
3211 case MUSICPM_RELAXEDSONGSPICKED:
3213 iSongs = g_partyModeManager.GetRelaxedSongs();
3216 case MUSICPM_RANDOMSONGSPICKED:
3218 iSongs = g_partyModeManager.GetRandomSongs();
3224 CStdString strLabel;
3225 strLabel.Format("%i", iSongs);
3231 const CStdString CGUIInfoManager::GetMusicPlaylistInfo(const GUIInfo& info)
3233 PLAYLIST::CPlayList& playlist = g_playlistPlayer.GetPlaylist(PLAYLIST_MUSIC);
3234 if (playlist.size() < 1)
3236 int index = info.GetData2();
3237 if (info.GetData1() == 1)
3238 { // relative index (requires current playlist is PLAYLIST_MUSIC)
3239 if (g_playlistPlayer.GetCurrentPlaylist() != PLAYLIST_MUSIC)
3241 index = g_playlistPlayer.GetNextSong(index);
3243 if (index < 0 || index >= playlist.size())
3245 CFileItemPtr playlistItem = playlist[index];
3246 if (!playlistItem->GetMusicInfoTag()->Loaded())
3248 playlistItem->LoadMusicTag();
3249 playlistItem->GetMusicInfoTag()->SetLoaded();
3251 // try to set a thumbnail
3252 if (!playlistItem->HasArt("thumb"))
3254 CMusicThumbLoader loader;
3255 loader.LoadItem(playlistItem.get());
3256 // still no thumb? then just the set the default cover
3257 if (!playlistItem->HasArt("thumb"))
3258 playlistItem->SetArt("thumb", "DefaultAlbumCover.png");
3260 if (info.m_info == MUSICPLAYER_PLAYLISTPOS)
3262 CStdString strPosition = "";
3263 strPosition.Format("%i", index + 1);
3266 else if (info.m_info == MUSICPLAYER_COVER)
3267 return playlistItem->GetArt("thumb");
3268 return GetMusicTagLabel(info.m_info, playlistItem.get());
3271 CStdString CGUIInfoManager::GetPlaylistLabel(int item) const
3273 if (!g_application.IsPlaying()) return "";
3274 int iPlaylist = g_playlistPlayer.GetCurrentPlaylist();
3277 case PLAYLIST_LENGTH:
3279 CStdString strLength = "";
3280 strLength.Format("%i", g_playlistPlayer.GetPlaylist(iPlaylist).size());
3283 case PLAYLIST_POSITION:
3285 CStdString strPosition = "";
3286 strPosition.Format("%i", g_playlistPlayer.GetCurrentSong() + 1);
3289 case PLAYLIST_RANDOM:
3291 if (g_playlistPlayer.IsShuffled(iPlaylist))
3292 return g_localizeStrings.Get(590); // 590: Random
3294 return g_localizeStrings.Get(591); // 591: Off
3296 case PLAYLIST_REPEAT:
3298 PLAYLIST::REPEAT_STATE state = g_playlistPlayer.GetRepeat(iPlaylist);
3299 if (state == PLAYLIST::REPEAT_ONE)
3300 return g_localizeStrings.Get(592); // 592: One
3301 else if (state == PLAYLIST::REPEAT_ALL)
3302 return g_localizeStrings.Get(593); // 593: All
3304 return g_localizeStrings.Get(594); // 594: Off
3310 CStdString CGUIInfoManager::GetMusicLabel(int item)
3312 if (!g_application.IsPlaying() || !m_currentFile->HasMusicInfoTag()) return "";
3314 SPlayerAudioStreamInfo info;
3315 g_application.m_pPlayer->GetAudioStreamInfo(g_application.m_pPlayer->GetAudioStream(), info);
3319 case MUSICPLAYER_PLAYLISTLEN:
3321 if (g_playlistPlayer.GetCurrentPlaylist() == PLAYLIST_MUSIC)
3322 return GetPlaylistLabel(PLAYLIST_LENGTH);
3325 case MUSICPLAYER_PLAYLISTPOS:
3327 if (g_playlistPlayer.GetCurrentPlaylist() == PLAYLIST_MUSIC)
3328 return GetPlaylistLabel(PLAYLIST_POSITION);
3331 case MUSICPLAYER_BITRATE:
3333 float fTimeSpan = (float)(CTimeUtils::GetFrameTime() - m_lastMusicBitrateTime);
3334 if (fTimeSpan >= 500.0f)
3336 m_MusicBitrate = info.bitrate;
3337 m_lastMusicBitrateTime = CTimeUtils::GetFrameTime();
3339 CStdString strBitrate = "";
3340 if (m_MusicBitrate > 0)
3341 strBitrate.Format("%i", MathUtils::round_int((double)m_MusicBitrate / 1000.0));
3345 case MUSICPLAYER_CHANNELS:
3347 CStdString strChannels = "";
3348 if (info.channels > 0)
3350 strChannels.Format("%i", info.channels);
3355 case MUSICPLAYER_BITSPERSAMPLE:
3357 CStdString strBitsPerSample = "";
3358 if (g_application.m_pPlayer->GetBitsPerSample() > 0)
3360 strBitsPerSample.Format("%i", g_application.m_pPlayer->GetBitsPerSample());
3362 return strBitsPerSample;
3365 case MUSICPLAYER_SAMPLERATE:
3367 CStdString strSampleRate = "";
3368 if (g_application.m_pPlayer->GetSampleRate() > 0)
3370 strSampleRate.Format("%.5g", ((double)g_application.m_pPlayer->GetSampleRate() / 1000.0));
3372 return strSampleRate;
3375 case MUSICPLAYER_CODEC:
3377 CStdString strCodec;
3378 strCodec.Format("%s", info.audioCodecName);
3382 case MUSICPLAYER_LYRICS:
3383 return GetItemLabel(m_currentFile, AddListItemProp("lyrics"));
3385 return GetMusicTagLabel(item, m_currentFile);
3388 CStdString CGUIInfoManager::GetMusicTagLabel(int info, const CFileItem *item)
3390 if (!item->HasMusicInfoTag()) return "";
3391 const CMusicInfoTag &tag = *item->GetMusicInfoTag();
3394 case MUSICPLAYER_TITLE:
3395 if (tag.GetTitle().size()) { return tag.GetTitle(); }
3397 case MUSICPLAYER_ALBUM:
3398 if (tag.GetAlbum().size()) { return tag.GetAlbum(); }
3400 case MUSICPLAYER_ARTIST:
3401 if (tag.GetArtist().size()) { return StringUtils::Join(tag.GetArtist(), g_advancedSettings.m_musicItemSeparator); }
3403 case MUSICPLAYER_ALBUM_ARTIST:
3404 if (tag.GetAlbumArtist().size()) { return StringUtils::Join(tag.GetAlbumArtist(), g_advancedSettings.m_musicItemSeparator); }
3406 case MUSICPLAYER_YEAR:
3407 if (tag.GetYear()) { return tag.GetYearString(); }
3409 case MUSICPLAYER_GENRE:
3410 if (tag.GetGenre().size()) { return StringUtils::Join(tag.GetGenre(), g_advancedSettings.m_musicItemSeparator); }
3412 case MUSICPLAYER_LYRICS:
3413 if (tag.GetLyrics().size()) { return tag.GetLyrics(); }
3415 case MUSICPLAYER_TRACK_NUMBER:
3417 CStdString strTrack;
3418 if (tag.Loaded() && tag.GetTrackNumber() > 0)
3420 strTrack.Format("%02i", tag.GetTrackNumber());
3425 case MUSICPLAYER_DISC_NUMBER:
3426 return GetItemLabel(item, LISTITEM_DISC_NUMBER);
3427 case MUSICPLAYER_RATING:
3428 return GetItemLabel(item, LISTITEM_RATING);
3429 case MUSICPLAYER_COMMENT:
3430 return GetItemLabel(item, LISTITEM_COMMENT);
3431 case MUSICPLAYER_DURATION:
3432 return GetItemLabel(item, LISTITEM_DURATION);
3433 case MUSICPLAYER_CHANNEL_NAME:
3435 CPVRChannel* channeltag = m_currentFile->GetPVRChannelInfoTag();
3437 return channeltag->ChannelName();
3440 case MUSICPLAYER_CHANNEL_NUMBER:
3442 CPVRChannel* channeltag = m_currentFile->GetPVRChannelInfoTag();
3445 CStdString strNumber;
3446 strNumber.Format("%i", channeltag->ChannelNumber());
3451 case MUSICPLAYER_CHANNEL_GROUP:
3453 CPVRChannel* channeltag = m_currentFile->GetPVRChannelInfoTag();
3454 if (channeltag && channeltag->IsRadio())
3455 return g_PVRManager.GetPlayingGroup(true)->GroupName();
3458 case MUSICPLAYER_PLAYCOUNT:
3459 return GetItemLabel(item, LISTITEM_PLAYCOUNT);
3460 case MUSICPLAYER_LASTPLAYED:
3461 return GetItemLabel(item, LISTITEM_LASTPLAYED);
3466 CStdString CGUIInfoManager::GetVideoLabel(int item)
3468 if (!g_application.IsPlaying())
3471 if (item == VIDEOPLAYER_TITLE)
3473 if(g_application.IsPlayingVideo())
3474 return GetLabel(PLAYER_TITLE);
3476 else if (item == VIDEOPLAYER_PLAYLISTLEN)
3478 if (g_playlistPlayer.GetCurrentPlaylist() == PLAYLIST_VIDEO)
3479 return GetPlaylistLabel(PLAYLIST_LENGTH);
3481 else if (item == VIDEOPLAYER_PLAYLISTPOS)
3483 if (g_playlistPlayer.GetCurrentPlaylist() == PLAYLIST_VIDEO)
3484 return GetPlaylistLabel(PLAYLIST_POSITION);
3486 else if (m_currentFile->HasPVRChannelInfoTag())
3488 CPVRChannel* tag = m_currentFile->GetPVRChannelInfoTag();
3493 /* Now playing infos */
3494 case VIDEOPLAYER_ORIGINALTITLE:
3495 return tag->GetEPGNow(epgTag) ?
3497 g_guiSettings.GetBool("epg.hidenoinfoavailable") ?
3498 StringUtils::EmptyString :
3499 g_localizeStrings.Get(19055); // no information available
3500 case VIDEOPLAYER_GENRE:
3501 return tag->GetEPGNow(epgTag) ? StringUtils::Join(epgTag.Genre(), g_advancedSettings.m_videoItemSeparator) : StringUtils::EmptyString;
3502 case VIDEOPLAYER_PLOT:
3503 return tag->GetEPGNow(epgTag) ? epgTag.Plot() : StringUtils::EmptyString;
3504 case VIDEOPLAYER_PLOT_OUTLINE:
3505 return tag->GetEPGNow(epgTag) ? epgTag.PlotOutline() : StringUtils::EmptyString;
3506 case VIDEOPLAYER_STARTTIME:
3507 return tag->GetEPGNow(epgTag) ? epgTag.StartAsLocalTime().GetAsLocalizedTime("", false) : CDateTime::GetCurrentDateTime().GetAsLocalizedTime("", false);
3508 case VIDEOPLAYER_ENDTIME:
3509 return tag->GetEPGNow(epgTag) ? epgTag.EndAsLocalTime().GetAsLocalizedTime("", false) : CDateTime::GetCurrentDateTime().GetAsLocalizedTime("", false);
3511 /* Next playing infos */
3512 case VIDEOPLAYER_NEXT_TITLE:
3513 return tag->GetEPGNext(epgTag) ?
3515 g_guiSettings.GetBool("epg.hidenoinfoavailable") ?
3516 StringUtils::EmptyString :
3517 g_localizeStrings.Get(19055); // no information available
3518 case VIDEOPLAYER_NEXT_GENRE:
3519 return tag->GetEPGNext(epgTag) ? StringUtils::Join(epgTag.Genre(), g_advancedSettings.m_videoItemSeparator) : StringUtils::EmptyString;
3520 case VIDEOPLAYER_NEXT_PLOT:
3521 return tag->GetEPGNext(epgTag) ? epgTag.Plot() : StringUtils::EmptyString;
3522 case VIDEOPLAYER_NEXT_PLOT_OUTLINE:
3523 return tag->GetEPGNext(epgTag) ? epgTag.PlotOutline() : StringUtils::EmptyString;
3524 case VIDEOPLAYER_NEXT_STARTTIME:
3525 return tag->GetEPGNext(epgTag) ? epgTag.StartAsLocalTime().GetAsLocalizedTime("", false) : CDateTime::GetCurrentDateTime().GetAsLocalizedTime("", false);
3526 case VIDEOPLAYER_NEXT_ENDTIME:
3527 return tag->GetEPGNext(epgTag) ? epgTag.EndAsLocalTime().GetAsLocalizedTime("", false) : CDateTime::GetCurrentDateTime().GetAsLocalizedTime("", false);
3528 case VIDEOPLAYER_NEXT_DURATION:
3530 CStdString duration;
3531 if (tag->GetEPGNext(epgTag) && epgTag.GetDuration() > 0)
3532 duration = StringUtils::SecondsToTimeString(epgTag.GetDuration());
3536 case VIDEOPLAYER_PARENTAL_RATING:
3539 if (tag->GetEPGNow(epgTag) && epgTag.ParentalRating() > 0)
3540 rating.Format("%i", epgTag.ParentalRating());
3545 /* General channel infos */
3546 case VIDEOPLAYER_CHANNEL_NAME:
3547 return tag->ChannelName();
3548 case VIDEOPLAYER_CHANNEL_NUMBER:
3550 CStdString strNumber;
3551 strNumber.Format("%i", tag->ChannelNumber());
3554 case VIDEOPLAYER_CHANNEL_GROUP:
3556 if (tag && !tag->IsRadio())
3557 return g_PVRManager.GetPlayingGroup(false)->GroupName();
3561 else if (m_currentFile->HasVideoInfoTag())
3565 case VIDEOPLAYER_ORIGINALTITLE:
3566 return m_currentFile->GetVideoInfoTag()->m_strOriginalTitle;
3568 case VIDEOPLAYER_GENRE:
3569 return StringUtils::Join(m_currentFile->GetVideoInfoTag()->m_genre, g_advancedSettings.m_videoItemSeparator);
3571 case VIDEOPLAYER_DIRECTOR:
3572 return StringUtils::Join(m_currentFile->GetVideoInfoTag()->m_director, g_advancedSettings.m_videoItemSeparator);
3574 case VIDEOPLAYER_RATING:
3576 CStdString strRating;
3577 if (m_currentFile->GetVideoInfoTag()->m_fRating > 0.f)
3578 strRating.Format("%.1f", m_currentFile->GetVideoInfoTag()->m_fRating);
3582 case VIDEOPLAYER_RATING_AND_VOTES:
3584 CStdString strRatingAndVotes;
3585 if (m_currentFile->GetVideoInfoTag()->m_fRating > 0.f)
3587 if (m_currentFile->GetVideoInfoTag()->m_strVotes.IsEmpty())
3588 strRatingAndVotes.Format("%.1f", m_currentFile->GetVideoInfoTag()->m_fRating);
3590 strRatingAndVotes.Format("%.1f (%s %s)", m_currentFile->GetVideoInfoTag()->m_fRating, m_currentFile->GetVideoInfoTag()->m_strVotes, g_localizeStrings.Get(20350));
3592 return strRatingAndVotes;
3595 case VIDEOPLAYER_YEAR:
3598 if (m_currentFile->GetVideoInfoTag()->m_iYear > 0)
3599 strYear.Format("%i", m_currentFile->GetVideoInfoTag()->m_iYear);
3603 case VIDEOPLAYER_PREMIERED:
3606 if (m_currentFile->GetVideoInfoTag()->m_firstAired.IsValid())
3607 dateTime = m_currentFile->GetVideoInfoTag()->m_firstAired;
3608 else if (m_currentFile->GetVideoInfoTag()->m_premiered.IsValid())
3609 dateTime = m_currentFile->GetVideoInfoTag()->m_premiered;
3611 if (dateTime.IsValid())
3612 return dateTime.GetAsLocalizedDate();
3616 case VIDEOPLAYER_PLOT:
3617 return m_currentFile->GetVideoInfoTag()->m_strPlot;
3618 case VIDEOPLAYER_TRAILER:
3619 return m_currentFile->GetVideoInfoTag()->m_strTrailer;
3620 case VIDEOPLAYER_PLOT_OUTLINE:
3621 return m_currentFile->GetVideoInfoTag()->m_strPlotOutline;
3622 case VIDEOPLAYER_EPISODE:
3624 CStdString strEpisode;
3625 if (m_currentFile->GetVideoInfoTag()->m_iSpecialSortEpisode > 0)
3626 strEpisode.Format("S%i", m_currentFile->GetVideoInfoTag()->m_iSpecialSortEpisode);
3627 else if(m_currentFile->GetVideoInfoTag()->m_iEpisode > 0)
3628 strEpisode.Format("%i", m_currentFile->GetVideoInfoTag()->m_iEpisode);
3632 case VIDEOPLAYER_SEASON:
3634 CStdString strSeason;
3635 if (m_currentFile->GetVideoInfoTag()->m_iSpecialSortSeason > 0)
3636 strSeason.Format("%i", m_currentFile->GetVideoInfoTag()->m_iSpecialSortSeason);
3637 else if(m_currentFile->GetVideoInfoTag()->m_iSeason > 0)
3638 strSeason.Format("%i", m_currentFile->GetVideoInfoTag()->m_iSeason);
3642 case VIDEOPLAYER_TVSHOW:
3643 return m_currentFile->GetVideoInfoTag()->m_strShowTitle;
3645 case VIDEOPLAYER_STUDIO:
3646 return StringUtils::Join(m_currentFile->GetVideoInfoTag()->m_studio, g_advancedSettings.m_videoItemSeparator);
3647 case VIDEOPLAYER_COUNTRY:
3648 return StringUtils::Join(m_currentFile->GetVideoInfoTag()->m_country, g_advancedSettings.m_videoItemSeparator);
3649 case VIDEOPLAYER_MPAA:
3650 return m_currentFile->GetVideoInfoTag()->m_strMPAARating;
3651 case VIDEOPLAYER_TOP250:
3653 CStdString strTop250;
3654 if (m_currentFile->GetVideoInfoTag()->m_iTop250 > 0)
3655 strTop250.Format("%i", m_currentFile->GetVideoInfoTag()->m_iTop250);
3659 case VIDEOPLAYER_CAST:
3660 return m_currentFile->GetVideoInfoTag()->GetCast();
3661 case VIDEOPLAYER_CAST_AND_ROLE:
3662 return m_currentFile->GetVideoInfoTag()->GetCast(true);
3663 case VIDEOPLAYER_ARTIST:
3664 return StringUtils::Join(m_currentFile->GetVideoInfoTag()->m_artist, g_advancedSettings.m_videoItemSeparator);
3665 case VIDEOPLAYER_ALBUM:
3666 return m_currentFile->GetVideoInfoTag()->m_strAlbum;
3667 case VIDEOPLAYER_WRITER:
3668 return StringUtils::Join(m_currentFile->GetVideoInfoTag()->m_writingCredits, g_advancedSettings.m_videoItemSeparator);
3669 case VIDEOPLAYER_TAGLINE:
3670 return m_currentFile->GetVideoInfoTag()->m_strTagLine;
3671 case VIDEOPLAYER_LASTPLAYED:
3673 if (m_currentFile->GetVideoInfoTag()->m_lastPlayed.IsValid())
3674 return m_currentFile->GetVideoInfoTag()->m_lastPlayed.GetAsLocalizedDateTime();
3677 case VIDEOPLAYER_PLAYCOUNT:
3679 CStdString strPlayCount;
3680 if (m_currentFile->GetVideoInfoTag()->m_playCount > 0)
3681 strPlayCount.Format("%i", m_currentFile->GetVideoInfoTag()->m_playCount);
3682 return strPlayCount;
3689 int64_t CGUIInfoManager::GetPlayTime() const
3691 if (g_application.IsPlaying())
3693 int64_t lPTS = (int64_t)(g_application.GetTime() * 1000);
3694 if (lPTS < 0) lPTS = 0;
3700 CStdString CGUIInfoManager::GetCurrentPlayTime(TIME_FORMAT format) const
3702 if (format == TIME_FORMAT_GUESS && GetTotalPlayTime() >= 3600)
3703 format = TIME_FORMAT_HH_MM_SS;
3704 if (g_application.IsPlaying())
3705 return StringUtils::SecondsToTimeString((int)(GetPlayTime()/1000), format);
3709 CStdString CGUIInfoManager::GetCurrentSeekTime(TIME_FORMAT format) const
3711 if (format == TIME_FORMAT_GUESS && GetTotalPlayTime() >= 3600)
3712 format = TIME_FORMAT_HH_MM_SS;
3713 float time = GetTotalPlayTime() * g_application.GetSeekHandler()->GetPercent() * 0.01f;
3714 return StringUtils::SecondsToTimeString((int)time, format);
3717 int CGUIInfoManager::GetTotalPlayTime() const
3719 int iTotalTime = (int)g_application.GetTotalTime();
3720 return iTotalTime > 0 ? iTotalTime : 0;
3723 int CGUIInfoManager::GetPlayTimeRemaining() const
3725 int iReverse = GetTotalPlayTime() - (int)g_application.GetTime();
3726 return iReverse > 0 ? iReverse : 0;
3729 CStdString CGUIInfoManager::GetCurrentPlayTimeRemaining(TIME_FORMAT format) const
3731 if (format == TIME_FORMAT_GUESS && GetTotalPlayTime() >= 3600)
3732 format = TIME_FORMAT_HH_MM_SS;
3733 int timeRemaining = GetPlayTimeRemaining();
3734 if (timeRemaining && g_application.IsPlaying())
3735 return StringUtils::SecondsToTimeString(timeRemaining, format);
3739 void CGUIInfoManager::ResetCurrentItem()
3741 m_currentFile->Reset();
3742 m_currentMovieThumb = "";
3743 m_currentMovieDuration = "";
3746 void CGUIInfoManager::SetCurrentItem(CFileItem &item)
3751 SetCurrentSong(item);
3753 SetCurrentMovie(item);
3755 if (item.HasEPGInfoTag())
3756 *m_currentFile->GetEPGInfoTag() = *item.GetEPGInfoTag();
3757 else if (item.HasPVRChannelInfoTag())
3760 if (item.GetPVRChannelInfoTag()->GetEPGNow(tag))
3761 *m_currentFile->GetEPGInfoTag() = tag;
3765 NotifyObservers(ObservableMessageCurrentItem);
3768 void CGUIInfoManager::SetCurrentAlbumThumb(const CStdString thumbFileName)
3770 if (CFile::Exists(thumbFileName))
3771 m_currentFile->SetArt("thumb", thumbFileName);
3774 m_currentFile->SetArt("thumb", "");
3775 m_currentFile->FillInDefaultIcon();
3779 void CGUIInfoManager::SetCurrentSong(CFileItem &item)
3781 CLog::Log(LOGDEBUG,"CGUIInfoManager::SetCurrentSong(%s)",item.GetPath().c_str());
3782 *m_currentFile = item;
3784 m_currentFile->LoadMusicTag();
3785 if (m_currentFile->GetMusicInfoTag()->GetTitle().IsEmpty())
3787 // No title in tag, show filename only
3788 m_currentFile->GetMusicInfoTag()->SetTitle(CUtil::GetTitleFromPath(m_currentFile->GetPath()));
3790 m_currentFile->GetMusicInfoTag()->SetLoaded(true);
3792 // find a thumb for this file.
3793 if (m_currentFile->IsInternetStream())
3795 if (!g_application.m_strPlayListFile.IsEmpty())
3797 CLog::Log(LOGDEBUG,"Streaming media detected... using %s to find a thumb", g_application.m_strPlayListFile.c_str());
3798 CFileItem streamingItem(g_application.m_strPlayListFile,false);
3799 CMusicThumbLoader::FillThumb(streamingItem);
3800 if (streamingItem.HasArt("thumb"))
3801 m_currentFile->SetArt("thumb", streamingItem.GetArt("thumb"));
3806 CMusicThumbLoader loader;
3807 loader.LoadItem(m_currentFile);
3809 m_currentFile->FillInDefaultIcon();
3811 CMusicInfoLoader::LoadAdditionalTagInfo(m_currentFile);
3814 void CGUIInfoManager::SetCurrentMovie(CFileItem &item)
3816 CLog::Log(LOGDEBUG,"CGUIInfoManager::SetCurrentMovie(%s)",item.GetPath().c_str());
3817 *m_currentFile = item;
3819 /* also call GetMovieInfo() when a VideoInfoTag is already present or additional info won't be present in the tag */
3820 if (!m_currentFile->HasPVRChannelInfoTag())
3825 dbs.LoadVideoInfo(item.GetPath(), *m_currentFile->GetVideoInfoTag());
3830 // Find a thumb for this file.
3831 if (!item.HasArt("thumb"))
3833 CVideoThumbLoader loader;
3834 loader.LoadItem(m_currentFile);
3837 // find a thumb for this stream
3838 if (item.IsInternetStream())
3840 // case where .strm is used to start an audio stream
3841 if (g_application.IsPlayingAudio())
3843 SetCurrentSong(item);
3848 if (!g_application.m_strPlayListFile.IsEmpty())
3850 CLog::Log(LOGDEBUG,"Streaming media detected... using %s to find a thumb", g_application.m_strPlayListFile.c_str());
3851 CFileItem thumbItem(g_application.m_strPlayListFile,false);
3852 if (CVideoThumbLoader::FillThumb(thumbItem))
3853 item.SetArt("thumb", thumbItem.GetArt("thumb"));
3857 item.FillInDefaultIcon();
3858 m_currentMovieThumb = item.GetArt("thumb");
3861 string CGUIInfoManager::GetSystemHeatInfo(int info)
3863 if (CTimeUtils::GetFrameTime() - m_lastSysHeatInfoTime >= SYSHEATUPDATEINTERVAL)
3864 { // update our variables
3865 m_lastSysHeatInfoTime = CTimeUtils::GetFrameTime();
3867 g_cpuInfo.getTemperature(m_cpuTemp);
3868 m_gpuTemp = GetGPUTemperature();
3875 case SYSTEM_CPU_TEMPERATURE:
3876 return m_cpuTemp.IsValid() ? m_cpuTemp.ToString() : "?";
3878 case SYSTEM_GPU_TEMPERATURE:
3879 return m_gpuTemp.IsValid() ? m_gpuTemp.ToString() : "?";
3881 case SYSTEM_FAN_SPEED:
3882 text.Format("%i%%", m_fanSpeed * 2);
3884 case SYSTEM_CPU_USAGE:
3885 #if defined(TARGET_DARWIN) || defined(_WIN32)
3886 text.Format("%d%%", g_cpuInfo.getUsedPercentage());
3888 text.Format("%s", g_cpuInfo.GetCoresUsageString());
3895 CTemperature CGUIInfoManager::GetGPUTemperature()
3897 CStdString cmd = g_advancedSettings.m_gpuTempCmd;
3903 if (cmd.IsEmpty() || !(p = popen(cmd.c_str(), "r")))
3904 return CTemperature();
3906 ret = fscanf(p, "%d %c", &value, &scale);
3910 return CTemperature();
3912 if (scale == 'C' || scale == 'c')
3913 return CTemperature::CreateFromCelsius(value);
3914 if (scale == 'F' || scale == 'f')
3915 return CTemperature::CreateFromFahrenheit(value);
3916 return CTemperature();
3919 // Version string MUST NOT contain spaces. It is used
3920 // in the HTTP request user agent.
3921 CStdString CGUIInfoManager::GetVersion()
3925 tmp.Format("%d.%d%s Git:%s", VERSION_MAJOR, VERSION_MINOR, VERSION_TAG, GIT_REV);
3927 tmp.Format("%d.%d%s", VERSION_MAJOR, VERSION_MINOR, VERSION_TAG);
3932 CStdString CGUIInfoManager::GetBuild()
3935 tmp.Format("%s", __DATE__);
3939 void CGUIInfoManager::SetDisplayAfterSeek(unsigned int timeOut, int seekOffset)
3941 g_infoManager.m_performingSeek = false;
3944 m_AfterSeekTimeout = CTimeUtils::GetFrameTime() + timeOut;
3946 m_seekOffset = seekOffset;
3949 m_AfterSeekTimeout = 0;
3952 bool CGUIInfoManager::GetDisplayAfterSeek()
3954 if (CTimeUtils::GetFrameTime() < m_AfterSeekTimeout)
3960 void CGUIInfoManager::Clear()
3962 CSingleLock lock(m_critInfo);
3963 for (unsigned int i = 0; i < m_bools.size(); ++i)
3967 m_skinVariableStrings.clear();
3970 void CGUIInfoManager::UpdateFPS()
3973 unsigned int curTime = CTimeUtils::GetFrameTime();
3975 float fTimeSpan = (float)(curTime - m_lastFPSTime);
3976 if (fTimeSpan >= 1000.0f)
3978 fTimeSpan /= 1000.0f;
3979 m_fps = m_frameCounter / fTimeSpan;
3980 m_lastFPSTime = curTime;
3985 int CGUIInfoManager::AddListItemProp(const CStdString &str, int offset)
3987 for (int i=0; i < (int)m_listitemProperties.size(); i++)
3988 if (m_listitemProperties[i] == str)
3989 return (LISTITEM_PROPERTY_START+offset + i);
3991 if (m_listitemProperties.size() < LISTITEM_PROPERTY_END - LISTITEM_PROPERTY_START)
3993 m_listitemProperties.push_back(str);
3994 return LISTITEM_PROPERTY_START + offset + m_listitemProperties.size() - 1;
3997 CLog::Log(LOGERROR,"%s - not enough listitem property space!", __FUNCTION__);
4001 int CGUIInfoManager::AddMultiInfo(const GUIInfo &info)
4003 // check to see if we have this info already
4004 for (unsigned int i = 0; i < m_multiInfo.size(); i++)
4005 if (m_multiInfo[i] == info)
4006 return (int)i + MULTI_INFO_START;
4007 // return the new offset
4008 m_multiInfo.push_back(info);
4009 int id = (int)m_multiInfo.size() + MULTI_INFO_START - 1;
4010 if (id > MULTI_INFO_END)
4011 CLog::Log(LOGERROR, "%s - too many multiinfo bool/labels in this skin", __FUNCTION__);
4015 int CGUIInfoManager::ConditionalStringParameter(const CStdString ¶meter, bool caseSensitive /*= false*/)
4017 // check to see if we have this parameter already
4018 for (unsigned int i = 0; i < m_stringParameters.size(); i++)
4019 if (parameter.Equals(m_stringParameters[i], caseSensitive))
4021 // return the new offset
4022 m_stringParameters.push_back(parameter);
4023 return (int)m_stringParameters.size() - 1;
4026 bool CGUIInfoManager::GetItemInt(int &value, const CGUIListItem *item, int info) const
4034 if (info >= LISTITEM_PROPERTY_START && info - LISTITEM_PROPERTY_START < (int)m_listitemProperties.size())
4035 { // grab the property
4036 CStdString property = m_listitemProperties[info - LISTITEM_PROPERTY_START];
4037 CStdString val = item->GetProperty(property).asString();
4044 case LISTITEM_PROGRESS:
4047 if (item->IsFileItem())
4049 const CFileItem *pItem = (const CFileItem *)item;
4050 if (pItem && pItem->HasPVRChannelInfoTag())
4053 if (pItem->GetPVRChannelInfoTag()->GetEPGNow(epgNow))
4054 value = (int) epgNow.ProgressPercentage();
4056 else if (pItem && pItem->HasEPGInfoTag())
4058 value = (int) pItem->GetEPGInfoTag()->ProgressPercentage();
4065 case LISTITEM_PERCENT_PLAYED:
4066 if (item->IsFileItem() && ((const CFileItem *)item)->HasVideoInfoTag() && ((const CFileItem *)item)->GetVideoInfoTag()->m_resumePoint.IsPartWay())
4067 value = (int)(100 * ((const CFileItem *)item)->GetVideoInfoTag()->m_resumePoint.timeInSeconds / ((const CFileItem *)item)->GetVideoInfoTag()->m_resumePoint.totalTimeInSeconds);
4068 else if (item->IsFileItem() && ((const CFileItem *)item)->HasPVRRecordingInfoTag() && ((const CFileItem *)item)->GetPVRRecordingInfoTag()->m_resumePoint.IsPartWay())
4069 value = (int)(100 * ((const CFileItem *)item)->GetPVRRecordingInfoTag()->m_resumePoint.timeInSeconds / ((const CFileItem *)item)->GetPVRRecordingInfoTag()->m_resumePoint.totalTimeInSeconds);
4079 CStdString CGUIInfoManager::GetItemLabel(const CFileItem *item, int info, CStdString *fallback)
4081 if (!item) return "";
4083 if (info >= CONDITIONAL_LABEL_START && info <= CONDITIONAL_LABEL_END)
4084 return GetSkinVariableString(info, false, item);
4086 if (info >= LISTITEM_PROPERTY_START + LISTITEM_ART_OFFSET && info - (LISTITEM_PROPERTY_START + LISTITEM_ART_OFFSET) < (int)m_listitemProperties.size())
4088 std::string art = m_listitemProperties[info - (LISTITEM_PROPERTY_START + LISTITEM_ART_OFFSET)];
4089 return item->GetArt(art);
4092 if (info >= LISTITEM_PROPERTY_START && info - LISTITEM_PROPERTY_START < (int)m_listitemProperties.size())
4093 { // grab the property
4094 CStdString property = m_listitemProperties[info - LISTITEM_PROPERTY_START];
4095 return item->GetProperty(property).asString();
4098 if (info >= LISTITEM_PICTURE_START && info <= LISTITEM_PICTURE_END && item->HasPictureInfoTag())
4099 return item->GetPictureInfoTag()->GetInfo(picture_slide_map[info - LISTITEM_PICTURE_START]);
4103 case LISTITEM_LABEL:
4104 return item->GetLabel();
4105 case LISTITEM_LABEL2:
4106 return item->GetLabel2();
4107 case LISTITEM_TITLE:
4108 if (item->HasPVRChannelInfoTag())
4111 return item->GetPVRChannelInfoTag()->GetEPGNow(epgTag) ?
4113 g_guiSettings.GetBool("epg.hidenoinfoavailable") ?
4114 StringUtils::EmptyString :
4115 g_localizeStrings.Get(19055); // no information available
4117 if (item->HasPVRRecordingInfoTag())
4118 return item->GetPVRRecordingInfoTag()->m_strTitle;
4119 if (item->HasEPGInfoTag())
4120 return item->GetEPGInfoTag()->Title();
4121 if (item->HasPVRTimerInfoTag())
4122 return item->GetPVRTimerInfoTag()->Title();
4123 if (item->HasVideoInfoTag())
4124 return item->GetVideoInfoTag()->m_strTitle;
4125 if (item->HasMusicInfoTag())
4126 return item->GetMusicInfoTag()->GetTitle();
4128 case LISTITEM_ORIGINALTITLE:
4129 if (item->HasVideoInfoTag())
4130 return item->GetVideoInfoTag()->m_strOriginalTitle;
4132 case LISTITEM_PLAYCOUNT:
4134 CStdString strPlayCount;
4135 if (item->HasVideoInfoTag() && item->GetVideoInfoTag()->m_playCount > 0)
4136 strPlayCount.Format("%i", item->GetVideoInfoTag()->m_playCount);
4137 if (item->HasMusicInfoTag() && item->GetMusicInfoTag()->GetPlayCount() > 0)
4138 strPlayCount.Format("%i", item->GetMusicInfoTag()->GetPlayCount());
4139 return strPlayCount;
4141 case LISTITEM_LASTPLAYED:
4144 if (item->HasVideoInfoTag())
4145 dateTime = item->GetVideoInfoTag()->m_lastPlayed;
4146 else if (item->HasMusicInfoTag())
4147 dateTime = item->GetMusicInfoTag()->GetLastPlayed();
4149 if (dateTime.IsValid())
4150 return dateTime.GetAsLocalizedDate();
4153 case LISTITEM_TRACKNUMBER:
4156 if (item->HasMusicInfoTag())
4157 track.Format("%i", item->GetMusicInfoTag()->GetTrackNumber());
4161 case LISTITEM_DISC_NUMBER:
4164 if (item->HasMusicInfoTag() && item->GetMusicInfoTag()->GetDiscNumber() > 0)
4165 disc.Format("%i", item->GetMusicInfoTag()->GetDiscNumber());
4168 case LISTITEM_ARTIST:
4169 if (item->HasVideoInfoTag())
4170 return StringUtils::Join(item->GetVideoInfoTag()->m_artist, g_advancedSettings.m_videoItemSeparator);
4171 if (item->HasMusicInfoTag())
4172 return StringUtils::Join(item->GetMusicInfoTag()->GetArtist(), g_advancedSettings.m_musicItemSeparator);
4174 case LISTITEM_ALBUM_ARTIST:
4175 if (item->HasMusicInfoTag())
4176 return StringUtils::Join(item->GetMusicInfoTag()->GetAlbumArtist(), g_advancedSettings.m_musicItemSeparator);
4178 case LISTITEM_DIRECTOR:
4179 if (item->HasVideoInfoTag())
4180 return StringUtils::Join(item->GetVideoInfoTag()->m_director, g_advancedSettings.m_videoItemSeparator);
4182 case LISTITEM_ALBUM:
4183 if (item->HasVideoInfoTag())
4184 return item->GetVideoInfoTag()->m_strAlbum;
4185 if (item->HasMusicInfoTag())
4186 return item->GetMusicInfoTag()->GetAlbum();
4189 if (item->HasVideoInfoTag())
4191 CStdString strResult;
4192 if (item->GetVideoInfoTag()->m_iYear > 0)
4193 strResult.Format("%i",item->GetVideoInfoTag()->m_iYear);
4196 if (item->HasMusicInfoTag())
4197 return item->GetMusicInfoTag()->GetYearString();
4199 case LISTITEM_PREMIERED:
4200 if (item->HasVideoInfoTag())
4203 if (item->GetVideoInfoTag()->m_firstAired.IsValid())
4204 dateTime = item->GetVideoInfoTag()->m_firstAired;
4205 else if (item->GetVideoInfoTag()->m_premiered.IsValid())
4206 dateTime = item->GetVideoInfoTag()->m_premiered;
4208 if (dateTime.IsValid())
4209 return dateTime.GetAsLocalizedDate();
4213 case LISTITEM_GENRE:
4214 if (item->HasVideoInfoTag())
4215 return StringUtils::Join(item->GetVideoInfoTag()->m_genre, g_advancedSettings.m_videoItemSeparator);
4216 if (item->HasMusicInfoTag())
4217 return StringUtils::Join(item->GetMusicInfoTag()->GetGenre(), g_advancedSettings.m_musicItemSeparator);
4218 if (item->HasPVRChannelInfoTag())
4221 return item->GetPVRChannelInfoTag()->GetEPGNow(epgTag) ? StringUtils::Join(epgTag.Genre(), g_advancedSettings.m_videoItemSeparator) : StringUtils::EmptyString;
4223 if (item->HasPVRRecordingInfoTag())
4224 return StringUtils::Join(item->GetPVRRecordingInfoTag()->m_genre, g_advancedSettings.m_videoItemSeparator);
4225 if (item->HasEPGInfoTag())
4226 return StringUtils::Join(item->GetEPGInfoTag()->Genre(), g_advancedSettings.m_videoItemSeparator);
4228 case LISTITEM_FILENAME:
4229 case LISTITEM_FILE_EXTENSION:
4232 if (item->IsMusicDb() && item->HasMusicInfoTag())
4233 strFile = URIUtils::GetFileName(item->GetMusicInfoTag()->GetURL());
4234 else if (item->IsVideoDb() && item->HasVideoInfoTag())
4235 strFile = URIUtils::GetFileName(item->GetVideoInfoTag()->m_strFileNameAndPath);
4237 strFile = URIUtils::GetFileName(item->GetPath());
4239 if (info==LISTITEM_FILE_EXTENSION)
4241 CStdString strExtension = URIUtils::GetExtension(strFile);
4242 return strExtension.TrimLeft(".");
4248 if (item->HasEPGInfoTag())
4249 return item->GetEPGInfoTag()->StartAsLocalTime().GetAsLocalizedDateTime(false, false);
4250 if (item->HasPVRChannelInfoTag())
4253 return item->GetPVRChannelInfoTag()->GetEPGNow(epgTag) ? epgTag.StartAsLocalTime().GetAsLocalizedDateTime(false, false) : CDateTime::GetCurrentDateTime().GetAsLocalizedDateTime(false, false);
4255 if (item->HasPVRRecordingInfoTag())
4256 return item->GetPVRRecordingInfoTag()->RecordingTimeAsLocalTime().GetAsLocalizedDateTime(false, false);
4257 if (item->HasPVRTimerInfoTag())
4258 return item->GetPVRTimerInfoTag()->Summary();
4259 if (item->m_dateTime.IsValid())
4260 return item->m_dateTime.GetAsLocalizedDate();
4263 if (!item->m_bIsFolder || item->m_dwSize)
4264 return StringUtils::SizeToString(item->m_dwSize);
4266 case LISTITEM_RATING:
4269 if (item->HasVideoInfoTag() && item->GetVideoInfoTag()->m_fRating > 0.f) // movie rating
4270 rating.Format("%.1f", item->GetVideoInfoTag()->m_fRating);
4271 else if (item->HasMusicInfoTag() && item->GetMusicInfoTag()->GetRating() > '0')
4272 { // song rating. Images will probably be better than numbers for this in the long run
4273 rating = item->GetMusicInfoTag()->GetRating();
4277 case LISTITEM_RATING_AND_VOTES:
4279 if (item->HasVideoInfoTag() && item->GetVideoInfoTag()->m_fRating > 0.f) // movie rating
4281 CStdString strRatingAndVotes;
4282 if (item->GetVideoInfoTag()->m_strVotes.IsEmpty())
4283 strRatingAndVotes.Format("%.1f", item->GetVideoInfoTag()->m_fRating);
4285 strRatingAndVotes.Format("%.1f (%s %s)", item->GetVideoInfoTag()->m_fRating, item->GetVideoInfoTag()->m_strVotes, g_localizeStrings.Get(20350));
4286 return strRatingAndVotes;
4290 case LISTITEM_PROGRAM_COUNT:
4293 count.Format("%i", item->m_iprogramCount);
4296 case LISTITEM_DURATION:
4298 CStdString duration;
4299 if (item->HasPVRChannelInfoTag())
4301 const CPVRChannel *channel = item->HasPVRChannelInfoTag() ? item->GetPVRChannelInfoTag() : NULL;
4303 if (channel && channel->GetEPGNow(tag))
4304 return StringUtils::SecondsToTimeString(tag.GetDuration());
4305 return StringUtils::EmptyString;
4307 else if (item->HasPVRRecordingInfoTag())
4309 if (item->GetPVRRecordingInfoTag()->GetDuration() > 0)
4310 duration = StringUtils::SecondsToTimeString(item->GetPVRRecordingInfoTag()->GetDuration());
4312 else if (item->HasEPGInfoTag())
4314 if (item->GetEPGInfoTag()->GetDuration() > 0)
4315 duration = StringUtils::SecondsToTimeString(item->GetEPGInfoTag()->GetDuration());
4317 else if (item->HasVideoInfoTag())
4319 if (item->GetVideoInfoTag()->GetDuration() > 0)
4320 duration.Format("%d", item->GetVideoInfoTag()->GetDuration() / 60);
4322 else if (item->HasMusicInfoTag())
4324 if (item->GetMusicInfoTag()->GetDuration() > 0)
4325 duration = StringUtils::SecondsToTimeString(item->GetMusicInfoTag()->GetDuration());
4330 if (item->HasPVRChannelInfoTag())
4332 const CPVRChannel *channel = item->HasPVRChannelInfoTag() ? item->GetPVRChannelInfoTag() : NULL;
4334 if (channel && channel->GetEPGNow(tag))
4336 return StringUtils::EmptyString;
4338 if (item->HasEPGInfoTag())
4339 return item->GetEPGInfoTag()->Plot();
4340 if (item->HasPVRRecordingInfoTag())
4341 return item->GetPVRRecordingInfoTag()->m_strPlot;
4342 if (item->HasVideoInfoTag())
4344 if (!(!item->GetVideoInfoTag()->m_strShowTitle.IsEmpty() && item->GetVideoInfoTag()->m_iSeason == -1)) // dont apply to tvshows
4345 if (item->GetVideoInfoTag()->m_playCount == 0 && !g_guiSettings.GetBool("videolibrary.showunwatchedplots"))
4346 return g_localizeStrings.Get(20370);
4348 return item->GetVideoInfoTag()->m_strPlot;
4351 case LISTITEM_PLOT_OUTLINE:
4352 if (item->HasPVRChannelInfoTag())
4354 const CPVRChannel *channel = item->HasPVRChannelInfoTag() ? item->GetPVRChannelInfoTag() : NULL;
4356 if (channel && channel->GetEPGNow(tag))
4357 return tag.PlotOutline();
4358 return StringUtils::EmptyString;
4360 if (item->HasEPGInfoTag())
4361 return item->GetEPGInfoTag()->PlotOutline();
4362 if (item->HasPVRRecordingInfoTag())
4363 return item->GetPVRRecordingInfoTag()->m_strPlotOutline;
4364 if (item->HasVideoInfoTag())
4365 return item->GetVideoInfoTag()->m_strPlotOutline;
4367 case LISTITEM_EPISODE:
4368 if (item->HasVideoInfoTag())
4370 CStdString strResult;
4371 if (item->GetVideoInfoTag()->m_iSpecialSortEpisode > 0)
4372 strResult.Format("S%d",item->GetVideoInfoTag()->m_iEpisode);
4373 else if (item->GetVideoInfoTag()->m_iEpisode > 0) // if m_iEpisode = -1 there's no episode detail
4374 strResult.Format("%d",item->GetVideoInfoTag()->m_iEpisode);
4378 case LISTITEM_SEASON:
4379 if (item->HasVideoInfoTag())
4381 CStdString strResult;
4382 if (item->GetVideoInfoTag()->m_iSpecialSortSeason > 0)
4383 strResult.Format("%d",item->GetVideoInfoTag()->m_iSpecialSortSeason);
4384 else if (item->GetVideoInfoTag()->m_iSeason > 0) // if m_iSeason = -1 there's no season detail
4385 strResult.Format("%d",item->GetVideoInfoTag()->m_iSeason);
4389 case LISTITEM_TVSHOW:
4390 if (item->HasVideoInfoTag())
4391 return item->GetVideoInfoTag()->m_strShowTitle;
4393 case LISTITEM_COMMENT:
4394 if (item->HasPVRTimerInfoTag())
4395 return item->GetPVRTimerInfoTag()->GetStatus();
4396 if (item->HasMusicInfoTag())
4397 return item->GetMusicInfoTag()->GetComment();
4399 case LISTITEM_ACTUAL_ICON:
4400 return item->GetIconImage();
4403 CStdString strThumb = item->GetArt("thumb");
4404 if (strThumb.IsEmpty())
4405 strThumb = item->GetIconImage();
4407 *fallback = item->GetIconImage();
4410 case LISTITEM_OVERLAY:
4411 return item->GetOverlayImage();
4412 case LISTITEM_THUMB:
4413 return item->GetArt("thumb");
4414 case LISTITEM_FOLDERPATH:
4415 return CURL(item->GetPath()).GetWithoutUserDetails();
4416 case LISTITEM_FOLDERNAME:
4420 if (item->IsMusicDb() && item->HasMusicInfoTag())
4421 URIUtils::GetDirectory(item->GetMusicInfoTag()->GetURL(), path);
4422 else if (item->IsVideoDb() && item->HasVideoInfoTag())
4424 if( item->m_bIsFolder )
4425 path = item->GetVideoInfoTag()->m_strPath;
4427 URIUtils::GetParentPath(item->GetVideoInfoTag()->m_strFileNameAndPath, path);
4430 URIUtils::GetParentPath(item->GetPath(), path);
4431 path = CURL(path).GetWithoutUserDetails();
4432 if (info==LISTITEM_FOLDERNAME)
4434 URIUtils::RemoveSlashAtEnd(path);
4435 path=URIUtils::GetFileName(path);
4440 case LISTITEM_FILENAME_AND_PATH:
4443 if (item->IsMusicDb() && item->HasMusicInfoTag())
4444 path = item->GetMusicInfoTag()->GetURL();
4445 else if (item->IsVideoDb() && item->HasVideoInfoTag())
4446 path = item->GetVideoInfoTag()->m_strFileNameAndPath;
4448 path = item->GetPath();
4449 path = CURL(path).GetWithoutUserDetails();
4453 case LISTITEM_PICTURE_PATH:
4454 if (item->IsPicture() && (!item->IsZIP() || item->IsRAR() || item->IsCBZ() || item->IsCBR()))
4455 return item->GetPath();
4457 case LISTITEM_STUDIO:
4458 if (item->HasVideoInfoTag())
4459 return StringUtils::Join(item->GetVideoInfoTag()->m_studio, g_advancedSettings.m_videoItemSeparator);
4461 case LISTITEM_COUNTRY:
4462 if (item->HasVideoInfoTag())
4463 return StringUtils::Join(item->GetVideoInfoTag()->m_country, g_advancedSettings.m_videoItemSeparator);
4466 if (item->HasVideoInfoTag())
4467 return item->GetVideoInfoTag()->m_strMPAARating;
4470 if (item->HasVideoInfoTag())
4471 return item->GetVideoInfoTag()->GetCast();
4473 case LISTITEM_CAST_AND_ROLE:
4474 if (item->HasVideoInfoTag())
4475 return item->GetVideoInfoTag()->GetCast(true);
4477 case LISTITEM_WRITER:
4478 if (item->HasVideoInfoTag())
4479 return StringUtils::Join(item->GetVideoInfoTag()->m_writingCredits, g_advancedSettings.m_videoItemSeparator);
4481 case LISTITEM_TAGLINE:
4482 if (item->HasVideoInfoTag())
4483 return item->GetVideoInfoTag()->m_strTagLine;
4485 case LISTITEM_TRAILER:
4486 if (item->HasVideoInfoTag())
4487 return item->GetVideoInfoTag()->m_strTrailer;
4489 case LISTITEM_TOP250:
4490 if (item->HasVideoInfoTag())
4492 CStdString strResult;
4493 if (item->GetVideoInfoTag()->m_iTop250 > 0)
4494 strResult.Format("%i",item->GetVideoInfoTag()->m_iTop250);
4498 case LISTITEM_SORT_LETTER:
4501 g_charsetConverter.wToUTF8(item->GetSortLabel().Left(1).ToUpper(), letter);
4505 case LISTITEM_VIDEO_CODEC:
4506 if (item->HasVideoInfoTag())
4507 return item->GetVideoInfoTag()->m_streamDetails.GetVideoCodec();
4509 case LISTITEM_VIDEO_RESOLUTION:
4510 if (item->HasVideoInfoTag())
4511 return CStreamDetails::VideoDimsToResolutionDescription(item->GetVideoInfoTag()->m_streamDetails.GetVideoWidth(), item->GetVideoInfoTag()->m_streamDetails.GetVideoHeight());
4513 case LISTITEM_VIDEO_ASPECT:
4514 if (item->HasVideoInfoTag())
4515 return CStreamDetails::VideoAspectToAspectDescription(item->GetVideoInfoTag()->m_streamDetails.GetVideoAspect());
4517 case LISTITEM_AUDIO_CODEC:
4518 if (item->HasVideoInfoTag())
4520 return item->GetVideoInfoTag()->m_streamDetails.GetAudioCodec();
4523 case LISTITEM_AUDIO_CHANNELS:
4524 if (item->HasVideoInfoTag())
4526 CStdString strResult;
4527 int iChannels = item->GetVideoInfoTag()->m_streamDetails.GetAudioChannels();
4529 strResult.Format("%i", iChannels);
4533 case LISTITEM_AUDIO_LANGUAGE:
4534 if (item->HasVideoInfoTag())
4535 return item->GetVideoInfoTag()->m_streamDetails.GetAudioLanguage();
4537 case LISTITEM_SUBTITLE_LANGUAGE:
4538 if (item->HasVideoInfoTag())
4539 return item->GetVideoInfoTag()->m_streamDetails.GetSubtitleLanguage();
4541 case LISTITEM_STARTTIME:
4542 if (item->HasPVRChannelInfoTag())
4544 const CPVRChannel *channel = item->HasPVRChannelInfoTag() ? item->GetPVRChannelInfoTag() : NULL;
4546 if (channel && channel->GetEPGNow(tag))
4547 return tag.StartAsLocalTime().GetAsLocalizedTime("", false);
4548 return CDateTime::GetCurrentDateTime().GetAsLocalizedTime("", false);
4550 if (item->HasEPGInfoTag())
4551 return item->GetEPGInfoTag()->StartAsLocalTime().GetAsLocalizedTime("", false);
4552 if (item->HasPVRTimerInfoTag())
4553 return item->GetPVRTimerInfoTag()->StartAsLocalTime().GetAsLocalizedTime("", false);
4554 if (item->HasPVRRecordingInfoTag())
4555 return item->GetPVRRecordingInfoTag()->RecordingTimeAsLocalTime().GetAsLocalizedTime("", false);
4556 if (item->m_dateTime.IsValid())
4557 return item->m_dateTime.GetAsLocalizedTime("", false);
4559 case LISTITEM_ENDTIME:
4560 if (item->HasPVRChannelInfoTag())
4562 const CPVRChannel *channel = item->HasPVRChannelInfoTag() ? item->GetPVRChannelInfoTag() : NULL;
4564 if (channel && channel->GetEPGNow(tag))
4565 return tag.EndAsLocalTime().GetAsLocalizedTime("", false);
4566 return CDateTime::GetCurrentDateTime().GetAsLocalizedTime("", false);
4568 if (item->HasEPGInfoTag())
4569 return item->GetEPGInfoTag()->EndAsLocalTime().GetAsLocalizedTime("", false);
4570 if (item->HasPVRTimerInfoTag())
4571 return item->GetPVRTimerInfoTag()->EndAsLocalTime().GetAsLocalizedTime("", false);
4573 case LISTITEM_STARTDATE:
4574 if (item->HasPVRChannelInfoTag())
4576 const CPVRChannel *channel = item->HasPVRChannelInfoTag() ? item->GetPVRChannelInfoTag() : NULL;
4578 if (channel && channel->GetEPGNow(tag))
4579 return tag.StartAsLocalTime().GetAsLocalizedDate(true);
4580 return CDateTime::GetCurrentDateTime().GetAsLocalizedDate(true);
4582 if (item->HasEPGInfoTag())
4583 return item->GetEPGInfoTag()->StartAsLocalTime().GetAsLocalizedDate(true);
4584 if (item->HasPVRTimerInfoTag())
4585 return item->GetPVRTimerInfoTag()->StartAsLocalTime().GetAsLocalizedDate(true);
4586 if (item->HasPVRRecordingInfoTag())
4587 return item->GetPVRRecordingInfoTag()->RecordingTimeAsLocalTime().GetAsLocalizedDate(true);
4588 if (item->m_dateTime.IsValid())
4589 return item->m_dateTime.GetAsLocalizedDate(true);
4591 case LISTITEM_ENDDATE:
4592 if (item->HasPVRChannelInfoTag())
4594 const CPVRChannel *channel = item->HasPVRChannelInfoTag() ? item->GetPVRChannelInfoTag() : NULL;
4596 if (channel && channel->GetEPGNow(tag))
4597 return tag.EndAsLocalTime().GetAsLocalizedDate(true);
4598 return CDateTime::GetCurrentDateTime().GetAsLocalizedDate(true);
4600 if (item->HasEPGInfoTag())
4601 return item->GetEPGInfoTag()->EndAsLocalTime().GetAsLocalizedDate(true);
4602 if (item->HasPVRTimerInfoTag())
4603 return item->GetPVRTimerInfoTag()->EndAsLocalTime().GetAsLocalizedDate(true);
4605 case LISTITEM_CHANNEL_NUMBER:
4608 if (item->HasPVRChannelInfoTag())
4609 number.Format("%i", item->GetPVRChannelInfoTag()->ChannelNumber());
4610 if (item->HasEPGInfoTag() && item->GetEPGInfoTag()->HasPVRChannel())
4611 number.Format("%i", item->GetEPGInfoTag()->PVRChannelNumber());
4612 if (item->HasPVRTimerInfoTag())
4613 number.Format("%i", item->GetPVRTimerInfoTag()->ChannelNumber());
4618 case LISTITEM_CHANNEL_NAME:
4619 if (item->HasPVRChannelInfoTag())
4620 return item->GetPVRChannelInfoTag()->ChannelName();
4621 if (item->HasEPGInfoTag() && item->GetEPGInfoTag()->HasPVRChannel())
4622 return item->GetEPGInfoTag()->PVRChannelName();
4623 if (item->HasPVRRecordingInfoTag())
4624 return item->GetPVRRecordingInfoTag()->m_strChannelName;
4625 if (item->HasPVRTimerInfoTag())
4626 return item->GetPVRTimerInfoTag()->ChannelName();
4628 case LISTITEM_NEXT_STARTTIME:
4630 const CPVRChannel *channel = item->HasPVRChannelInfoTag() ? item->GetPVRChannelInfoTag() : NULL;
4632 if (channel && channel->GetEPGNext(tag))
4633 return tag.StartAsLocalTime().GetAsLocalizedTime("", false);
4635 return CDateTime::GetCurrentDateTime().GetAsLocalizedTime("", false);
4636 case LISTITEM_NEXT_ENDTIME:
4638 const CPVRChannel *channel = item->HasPVRChannelInfoTag() ? item->GetPVRChannelInfoTag() : NULL;
4640 if (channel && channel->GetEPGNext(tag))
4641 return tag.EndAsLocalTime().GetAsLocalizedTime("", false);
4643 return CDateTime::GetCurrentDateTime().GetAsLocalizedTime("", false);
4644 case LISTITEM_NEXT_STARTDATE:
4646 const CPVRChannel *channel = item->HasPVRChannelInfoTag() ? item->GetPVRChannelInfoTag() : NULL;
4648 if (channel && channel->GetEPGNext(tag))
4649 return tag.StartAsLocalTime().GetAsLocalizedDate(true);
4651 return CDateTime::GetCurrentDateTime().GetAsLocalizedDate(true);
4652 case LISTITEM_NEXT_ENDDATE:
4654 const CPVRChannel *channel = item->HasPVRChannelInfoTag() ? item->GetPVRChannelInfoTag() : NULL;
4656 if (channel && channel->GetEPGNext(tag))
4657 return tag.EndAsLocalTime().GetAsLocalizedDate(true);
4659 return CDateTime::GetCurrentDateTime().GetAsLocalizedDate(true);
4660 case LISTITEM_NEXT_PLOT:
4662 const CPVRChannel *channel = item->HasPVRChannelInfoTag() ? item->GetPVRChannelInfoTag() : NULL;
4664 if (channel && channel->GetEPGNext(tag))
4667 return StringUtils::EmptyString;
4668 case LISTITEM_NEXT_PLOT_OUTLINE:
4670 const CPVRChannel *channel = item->HasPVRChannelInfoTag() ? item->GetPVRChannelInfoTag() : NULL;
4672 if (channel && channel->GetEPGNext(tag))
4673 return tag.PlotOutline();
4675 return StringUtils::EmptyString;
4676 case LISTITEM_NEXT_DURATION:
4678 const CPVRChannel *channel = item->HasPVRChannelInfoTag() ? item->GetPVRChannelInfoTag() : NULL;
4680 if (channel && channel->GetEPGNext(tag))
4681 return StringUtils::SecondsToTimeString(tag.GetDuration());
4683 return StringUtils::EmptyString;
4684 case LISTITEM_NEXT_GENRE:
4686 const CPVRChannel *channel = item->HasPVRChannelInfoTag() ? item->GetPVRChannelInfoTag() : NULL;
4688 if (channel && channel->GetEPGNext(tag))
4689 return StringUtils::Join(tag.Genre(), g_advancedSettings.m_videoItemSeparator);
4691 return StringUtils::EmptyString;
4692 case LISTITEM_NEXT_TITLE:
4694 const CPVRChannel *channel = item->HasPVRChannelInfoTag() ? item->GetPVRChannelInfoTag() : NULL;
4696 if (channel && channel->GetEPGNext(tag))
4699 return StringUtils::EmptyString;
4700 case LISTITEM_PARENTALRATING:
4703 if (item->HasEPGInfoTag() && item->GetEPGInfoTag()->ParentalRating() > 0)
4704 rating.Format("%i", item->GetEPGInfoTag()->ParentalRating());
4708 case LISTITEM_PERCENT_PLAYED:
4711 if (GetItemInt(val, item, info))
4714 str.Format("%d", val);
4719 case LISTITEM_DATE_ADDED:
4720 if (item->HasVideoInfoTag() && item->GetVideoInfoTag()->m_dateAdded.IsValid())
4721 return item->GetVideoInfoTag()->m_dateAdded.GetAsLocalizedDate();
4723 case LISTITEM_DBTYPE:
4724 if (item->HasVideoInfoTag())
4725 return item->GetVideoInfoTag()->m_type;
4728 if (item->HasVideoInfoTag())
4731 dbid.Format("%i", item->GetVideoInfoTag()->m_iDbId);
4734 if (item->HasMusicInfoTag())
4737 dbid.Format("%i", item->GetMusicInfoTag()->GetDatabaseId());
4745 CStdString CGUIInfoManager::GetItemImage(const CFileItem *item, int info, CStdString *fallback)
4747 if (info >= CONDITIONAL_LABEL_START && info <= CONDITIONAL_LABEL_END)
4748 return GetSkinVariableString(info, true, item);
4752 case LISTITEM_RATING: // old song rating format
4755 if (item->HasMusicInfoTag())
4757 rating.Format("songrating%c.png", item->GetMusicInfoTag()->GetRating());
4762 case LISTITEM_STAR_RATING:
4765 if (item->HasVideoInfoTag())
4766 { // rating for videos is assumed 0..10, so convert to 0..5
4767 rating.Format("rating%d.png", (long)((item->GetVideoInfoTag()->m_fRating * 0.5f) + 0.5f));
4769 else if (item->HasMusicInfoTag())
4771 rating.Format("rating%c.png", item->GetMusicInfoTag()->GetRating());
4776 } /* switch (info) */
4778 return GetItemLabel(item, info, fallback);
4781 bool CGUIInfoManager::GetItemBool(const CGUIListItem *item, int condition) const
4783 if (!item) return false;
4784 if (condition >= LISTITEM_PROPERTY_START && condition - LISTITEM_PROPERTY_START < (int)m_listitemProperties.size())
4785 { // grab the property
4786 CStdString property = m_listitemProperties[condition - LISTITEM_PROPERTY_START];
4787 return item->GetProperty(property).asBoolean();
4789 else if (condition == LISTITEM_ISPLAYING)
4791 if (item->HasProperty("playlistposition"))
4792 return (int)item->GetProperty("playlisttype").asInteger() == g_playlistPlayer.GetCurrentPlaylist() && (int)item->GetProperty("playlistposition").asInteger() == g_playlistPlayer.GetCurrentSong();
4793 else if (item->IsFileItem() && !m_currentFile->GetPath().IsEmpty())
4795 if (!g_application.m_strPlayListFile.IsEmpty())
4797 //playlist file that is currently playing or the playlistitem that is currently playing.
4798 return g_application.m_strPlayListFile.Equals(((const CFileItem *)item)->GetPath()) || m_currentFile->IsSamePath((const CFileItem *)item);
4800 return m_currentFile->IsSamePath((const CFileItem *)item);
4803 else if (condition == LISTITEM_ISSELECTED)
4804 return item->IsSelected();
4805 else if (condition == LISTITEM_IS_FOLDER)
4806 return item->m_bIsFolder;
4807 else if (condition == LISTITEM_IS_RESUMABLE)
4809 if (item->IsFileItem())
4811 if (((const CFileItem *)item)->HasVideoInfoTag())
4812 return ((const CFileItem *)item)->GetVideoInfoTag()->m_resumePoint.timeInSeconds > 0;
4813 else if (((const CFileItem *)item)->HasPVRRecordingInfoTag())
4814 return ((const CFileItem *)item)->GetPVRRecordingInfoTag()->m_resumePoint.timeInSeconds > 0;
4817 else if (item->IsFileItem())
4819 const CFileItem *pItem = (const CFileItem *)item;
4820 if (condition == LISTITEM_ISRECORDING)
4822 if (!g_PVRManager.IsStarted())
4825 if (pItem->HasPVRChannelInfoTag())
4827 return pItem->GetPVRChannelInfoTag()->IsRecording();
4829 else if (pItem->HasPVRTimerInfoTag())
4831 const CPVRTimerInfoTag *timer = pItem->GetPVRTimerInfoTag();
4833 return timer->IsRecording();
4835 else if (pItem->HasEPGInfoTag())
4837 CFileItemPtr timer = g_PVRTimers->GetTimerForEpgTag(pItem);
4838 if (timer && timer->HasPVRTimerInfoTag())
4839 return timer->GetPVRTimerInfoTag()->IsRecording();
4842 else if (condition == LISTITEM_HASTIMER)
4844 if (pItem->HasEPGInfoTag())
4846 CFileItemPtr timer = g_PVRTimers->GetTimerForEpgTag(pItem);
4847 if (timer && timer->HasPVRTimerInfoTag())
4848 return timer->GetPVRTimerInfoTag()->IsActive();
4851 else if (condition == LISTITEM_HAS_EPG)
4853 if (pItem->HasPVRChannelInfoTag())
4856 return pItem->GetPVRChannelInfoTag()->GetEPGNow(epgTag);
4860 return pItem->HasEPGInfoTag();
4863 else if (condition == LISTITEM_ISENCRYPTED)
4865 if (pItem->HasPVRChannelInfoTag())
4867 return pItem->GetPVRChannelInfoTag()->IsEncrypted();
4869 else if (pItem->HasEPGInfoTag() && pItem->GetEPGInfoTag()->HasPVRChannel())
4871 return pItem->GetEPGInfoTag()->ChannelTag()->IsEncrypted();
4879 void CGUIInfoManager::ResetCache()
4881 // reset any animation triggers as well
4882 m_containerMoves.clear();
4886 // Called from tuxbox service thread to update current status
4887 void CGUIInfoManager::UpdateFromTuxBox()
4889 if(g_tuxbox.vVideoSubChannel.mode)
4890 m_currentFile->GetVideoInfoTag()->m_strTitle = g_tuxbox.vVideoSubChannel.current_name;
4892 // Set m_currentMovieDuration
4893 if(!g_tuxbox.sCurSrvData.current_event_duration.IsEmpty() &&
4894 !g_tuxbox.sCurSrvData.next_event_description.IsEmpty() &&
4895 !g_tuxbox.sCurSrvData.current_event_duration.Equals("-") &&
4896 !g_tuxbox.sCurSrvData.next_event_description.Equals("-"))
4898 g_tuxbox.sCurSrvData.current_event_duration.Replace("(","");
4899 g_tuxbox.sCurSrvData.current_event_duration.Replace(")","");
4901 m_currentMovieDuration.Format("%s: %s %s (%s - %s)",
4902 g_localizeStrings.Get(180),
4903 g_tuxbox.sCurSrvData.current_event_duration,
4904 g_localizeStrings.Get(12391),
4905 g_tuxbox.sCurSrvData.current_event_time,
4906 g_tuxbox.sCurSrvData.next_event_time);
4910 if (!g_tuxbox.sCurSrvData.current_event_description.IsEmpty() &&
4911 !g_tuxbox.sCurSrvData.next_event_description.IsEmpty() &&
4912 !g_tuxbox.sCurSrvData.current_event_description.Equals("-") &&
4913 !g_tuxbox.sCurSrvData.next_event_description.Equals("-"))
4916 genre.Format("%s %s - (%s: %s)",
4917 g_localizeStrings.Get(143),
4918 g_tuxbox.sCurSrvData.current_event_description,
4919 g_localizeStrings.Get(209),
4920 g_tuxbox.sCurSrvData.next_event_description);
4921 m_currentFile->GetVideoInfoTag()->m_genre = StringUtils::Split(genre, g_advancedSettings.m_videoItemSeparator);
4924 //Set m_currentMovie.m_director
4925 if (!g_tuxbox.sCurSrvData.current_event_details.Equals("-") &&
4926 !g_tuxbox.sCurSrvData.current_event_details.IsEmpty())
4928 m_currentFile->GetVideoInfoTag()->m_director = StringUtils::Split(g_tuxbox.sCurSrvData.current_event_details, g_advancedSettings.m_videoItemSeparator);
4932 CStdString CGUIInfoManager::GetPictureLabel(int info)
4934 if (info == SLIDE_FILE_NAME)
4935 return GetItemLabel(m_currentSlide, LISTITEM_FILENAME);
4936 else if (info == SLIDE_FILE_PATH)
4939 URIUtils::GetDirectory(m_currentSlide->GetPath(), path);
4940 return CURL(path).GetWithoutUserDetails();
4942 else if (info == SLIDE_FILE_SIZE)
4943 return GetItemLabel(m_currentSlide, LISTITEM_SIZE);
4944 else if (info == SLIDE_FILE_DATE)
4945 return GetItemLabel(m_currentSlide, LISTITEM_DATE);
4946 else if (info == SLIDE_INDEX)
4948 CGUIWindowSlideShow *slideshow = (CGUIWindowSlideShow *)g_windowManager.GetWindow(WINDOW_SLIDESHOW);
4949 if (slideshow && slideshow->NumSlides())
4952 index.Format("%d/%d", slideshow->CurrentSlide(), slideshow->NumSlides());
4956 if (m_currentSlide->HasPictureInfoTag())
4957 return m_currentSlide->GetPictureInfoTag()->GetInfo(info);
4961 void CGUIInfoManager::SetCurrentSlide(CFileItem &item)
4963 if (m_currentSlide->GetPath() != item.GetPath())
4965 if (!item.GetPictureInfoTag()->Loaded()) // If picture metadata has not been loaded yet, load it now
4966 item.GetPictureInfoTag()->Load(item.GetPath());
4967 *m_currentSlide = item;
4971 void CGUIInfoManager::ResetCurrentSlide()
4973 m_currentSlide->Reset();
4976 bool CGUIInfoManager::CheckWindowCondition(CGUIWindow *window, int condition) const
4978 // check if it satisfies our condition
4979 if (!window) return false;
4980 if ((condition & WINDOW_CONDITION_HAS_LIST_ITEMS) && !window->HasListItems())
4982 if ((condition & WINDOW_CONDITION_IS_MEDIA_WINDOW) && !window->IsMediaWindow())
4987 CGUIWindow *CGUIInfoManager::GetWindowWithCondition(int contextWindow, int condition) const
4989 CGUIWindow *window = g_windowManager.GetWindow(contextWindow);
4990 if (CheckWindowCondition(window, condition))
4993 // try topmost dialog
4994 window = g_windowManager.GetWindow(g_windowManager.GetTopMostModalDialogID());
4995 if (CheckWindowCondition(window, condition))
4998 // try active window
4999 window = g_windowManager.GetWindow(g_windowManager.GetActiveWindow());
5000 if (CheckWindowCondition(window, condition))
5006 void CGUIInfoManager::SetCurrentVideoTag(const CVideoInfoTag &tag)
5008 *m_currentFile->GetVideoInfoTag() = tag;
5009 m_currentFile->m_lStartOffset = 0;
5012 void CGUIInfoManager::SetCurrentSongTag(const MUSIC_INFO::CMusicInfoTag &tag)
5014 //CLog::Log(LOGDEBUG, "Asked to SetCurrentTag");
5015 *m_currentFile->GetMusicInfoTag() = tag;
5016 m_currentFile->m_lStartOffset = 0;
5019 const CFileItem& CGUIInfoManager::GetCurrentSlide() const
5021 return *m_currentSlide;
5024 const MUSIC_INFO::CMusicInfoTag* CGUIInfoManager::GetCurrentSongTag() const
5026 if (m_currentFile->HasMusicInfoTag())
5027 return m_currentFile->GetMusicInfoTag();
5032 const CVideoInfoTag* CGUIInfoManager::GetCurrentMovieTag() const
5034 if (m_currentFile->HasVideoInfoTag())
5035 return m_currentFile->GetVideoInfoTag();
5040 void GUIInfo::SetInfoFlag(uint32_t flag)
5042 assert(flag >= (1 << 24));
5046 uint32_t GUIInfo::GetInfoFlag() const
5048 // we strip out the bottom 24 bits, where we keep data
5049 // and return the flag only
5050 return m_data1 & 0xff000000;
5053 uint32_t GUIInfo::GetData1() const
5055 // we strip out the top 8 bits, where we keep flags
5056 // and return the unflagged data
5057 return m_data1 & ((1 << 24) -1);
5060 int GUIInfo::GetData2() const
5065 void CGUIInfoManager::SetLibraryBool(int condition, bool value)
5069 case LIBRARY_HAS_MUSIC:
5070 m_libraryHasMusic = value ? 1 : 0;
5072 case LIBRARY_HAS_MOVIES:
5073 m_libraryHasMovies = value ? 1 : 0;
5075 case LIBRARY_HAS_MOVIE_SETS:
5076 m_libraryHasMovieSets = value ? 1 : 0;
5078 case LIBRARY_HAS_TVSHOWS:
5079 m_libraryHasTVShows = value ? 1 : 0;
5081 case LIBRARY_HAS_MUSICVIDEOS:
5082 m_libraryHasMusicVideos = value ? 1 : 0;
5089 void CGUIInfoManager::ResetLibraryBools()
5091 m_libraryHasMusic = -1;
5092 m_libraryHasMovies = -1;
5093 m_libraryHasTVShows = -1;
5094 m_libraryHasMusicVideos = -1;
5095 m_libraryHasMovieSets = -1;
5098 bool CGUIInfoManager::GetLibraryBool(int condition)
5100 if (condition == LIBRARY_HAS_MUSIC)
5102 if (m_libraryHasMusic < 0)
5107 m_libraryHasMusic = (db.GetSongsCount() > 0) ? 1 : 0;
5111 return m_libraryHasMusic > 0;
5113 else if (condition == LIBRARY_HAS_MOVIES)
5115 if (m_libraryHasMovies < 0)
5120 m_libraryHasMovies = db.HasContent(VIDEODB_CONTENT_MOVIES) ? 1 : 0;
5124 return m_libraryHasMovies > 0;
5126 else if (condition == LIBRARY_HAS_MOVIE_SETS)
5128 if (m_libraryHasMovieSets < 0)
5133 m_libraryHasMovieSets = db.HasSets() ? 1 : 0;
5137 return m_libraryHasMovieSets > 0;
5139 else if (condition == LIBRARY_HAS_TVSHOWS)
5141 if (m_libraryHasTVShows < 0)
5146 m_libraryHasTVShows = db.HasContent(VIDEODB_CONTENT_TVSHOWS) ? 1 : 0;
5150 return m_libraryHasTVShows > 0;
5152 else if (condition == LIBRARY_HAS_MUSICVIDEOS)
5154 if (m_libraryHasMusicVideos < 0)
5159 m_libraryHasMusicVideos = db.HasContent(VIDEODB_CONTENT_MUSICVIDEOS) ? 1 : 0;
5163 return m_libraryHasMusicVideos > 0;
5165 else if (condition == LIBRARY_HAS_VIDEO)
5167 return (GetLibraryBool(LIBRARY_HAS_MOVIES) ||
5168 GetLibraryBool(LIBRARY_HAS_TVSHOWS) ||
5169 GetLibraryBool(LIBRARY_HAS_MUSICVIDEOS));
5174 int CGUIInfoManager::RegisterSkinVariableString(const CSkinVariableString* info)
5179 CSingleLock lock(m_critInfo);
5180 m_skinVariableStrings.push_back(*info);
5182 return CONDITIONAL_LABEL_START + m_skinVariableStrings.size() - 1;
5185 int CGUIInfoManager::TranslateSkinVariableString(const CStdString& name, int context)
5187 for (vector<CSkinVariableString>::const_iterator it = m_skinVariableStrings.begin();
5188 it != m_skinVariableStrings.end(); ++it)
5190 if (it->GetName().Equals(name) && it->GetContext() == context)
5191 return it - m_skinVariableStrings.begin() + CONDITIONAL_LABEL_START;
5196 CStdString CGUIInfoManager::GetSkinVariableString(int info,
5197 bool preferImage /*= false*/,
5198 const CGUIListItem *item /*= NULL*/)
5200 info -= CONDITIONAL_LABEL_START;
5201 if (info >= 0 && info < (int)m_skinVariableStrings.size())
5202 return m_skinVariableStrings[info].GetValue(preferImage, item);
5207 bool CGUIInfoManager::ConditionsChangedValues(const std::map<int, bool>& map)
5209 for (std::map<int, bool>::const_iterator it = map.begin() ; it != map.end() ; it++)
5211 if (GetBoolValue(it->first) != it->second)
5217 bool CGUIInfoManager::GetEpgInfoTag(CEpgInfoTag& tag) const
5219 if (m_currentFile->HasEPGInfoTag())
5221 CEpgInfoTag* currentTag = m_currentFile->GetEPGInfoTag();
5222 while (currentTag && !currentTag->IsActive())
5223 currentTag = currentTag->GetNextEvent().get();