added: videoplayer.originaltitle info label.
[xbmc:paulepanters-xbmc.git] / xbmc / utils / GUIInfoManager.cpp
1 #include "../stdafx.h"
2 #include "../GUIDialogSeekBar.h"
3 #include "../GUIMediaWindow.h"
4 #include "../GUIDialogFileBrowser.h"
5 #include "../GUIDialogContentSettings.h"
6 #include "../Application.h"
7 #include "../Util.h"
8 #include "../lib/libscrobbler/scrobbler.h"
9 #include "../utils/TuxBoxUtil.h"
10 #include "KaiClient.h"
11 #include "Weather.h"
12 #include "../playlistplayer.h"
13 #include "../PartyModeManager.h"
14 #include "../Visualizations/Visualisation.h"
15 #include "../ButtonTranslator.h"
16 #include "../MusicDatabase.h"
17 #include "../utils/Alarmclock.h"
18 #ifdef HAS_LCD
19 #include "../utils/lcd.h"
20 #endif
21 #include "../GUIPassword.h"
22 #ifdef HAS_XBOX_HARDWARE
23 #include "FanController.h"
24 #include "SystemInfo.h"
25 #include "HddSmart.h"
26 #endif
27 #include "GUIButtonScroller.h"
28 #include "GUIInfoManager.h"
29 #include <stack>
30 #include "../xbox/network.h"
31
32 // stuff for current song
33 #ifdef HAS_FILESYSTEM
34 #include "../filesystem/SndtrkDirectory.h"
35 #endif
36 #include "../musicInfoTagLoaderFactory.h"
37
38 #include "GUILabelControl.h"  // for CInfoPortion
39
40 using namespace XFILE;
41 using namespace DIRECTORY;
42
43 CGUIInfoManager g_infoManager;
44
45 void CGUIInfoManager::CCombinedValue::operator =(const CGUIInfoManager::CCombinedValue& mSrc)
46 {
47   this->m_info = mSrc.m_info;
48   this->m_id = mSrc.m_id;
49   this->m_postfix = mSrc.m_postfix;
50 }
51
52 CGUIInfoManager::CGUIInfoManager(void)
53 {
54   m_lastSysHeatInfoTime = 0;
55   m_lastMusicBitrateTime = 0;
56   m_fanSpeed = 0;
57   m_AfterSeekTimeout = 0;
58   m_playerSeeking = false;
59   m_performingSeek = false;
60   m_nextWindowID = WINDOW_INVALID;
61   m_prevWindowID = WINDOW_INVALID;
62   m_stringParameters.push_back("__ZZZZ__");   // to offset the string parameters by 1 to assure that all entries are non-zero
63 }
64
65 CGUIInfoManager::~CGUIInfoManager(void)
66 {
67 }
68 /// \brief Translates a string as given by the skin into an int that we use for more
69 /// efficient retrieval of data. Can handle combined strings on the form
70 /// Player.Caching + VideoPlayer.IsFullscreen (Logical and)
71 /// Player.HasVideo | Player.HasAudio (Logical or)
72 int CGUIInfoManager::TranslateString(const CStdString &strCondition)
73 {
74   if (strCondition.find_first_of("|") != strCondition.npos ||
75       strCondition.find_first_of("+") != strCondition.npos ||
76       strCondition.find_first_of("[") != strCondition.npos ||
77       strCondition.find_first_of("]") != strCondition.npos)
78   {
79     // Have a boolean expression
80     // Check if this was added before
81     std::vector<CCombinedValue>::iterator it;
82     for(it = m_CombinedValues.begin(); it != m_CombinedValues.end(); it++)
83     {
84       if(strCondition.CompareNoCase(it->m_info) == 0)
85         return it->m_id;
86     }
87     return TranslateBooleanExpression(strCondition);
88   }  
89   //Just single command.
90   return TranslateSingleString(strCondition);
91 }
92
93
94 /// \brief Translates a string as given by the skin into an int that we use for more
95 /// efficient retrieval of data.
96 int CGUIInfoManager::TranslateSingleString(const CStdString &strCondition)
97 {
98   if (strCondition.IsEmpty()) return 0;
99   CStdString strTest = strCondition;
100   strTest.ToLower();
101   strTest.TrimLeft(" ");
102   strTest.TrimRight(" ");
103   bool bNegate = strTest[0] == '!';
104   int ret = 0;
105
106   if(bNegate)
107     strTest.Delete(0, 1);
108
109   CStdString strCategory = strTest.Left(strTest.Find("."));
110
111   // translate conditions...
112   if (strTest.Equals("false") || strTest.Equals("no") || strTest.Equals("off") || strTest.Equals("disabled")) ret = SYSTEM_ALWAYS_FALSE;
113   else if (strTest.Equals("true") || strTest.Equals("yes") || strTest.Equals("on") || strTest.Equals("enabled")) ret = SYSTEM_ALWAYS_TRUE;
114   if (strCategory.Equals("player"))
115   {
116     if (strTest.Equals("player.hasmedia")) ret = PLAYER_HAS_MEDIA;
117     else if (strTest.Equals("player.hasaudio")) ret = PLAYER_HAS_AUDIO;
118     else if (strTest.Equals("player.hasvideo")) ret = PLAYER_HAS_VIDEO;
119     else if (strTest.Equals("player.playing")) ret = PLAYER_PLAYING;
120     else if (strTest.Equals("player.paused")) ret = PLAYER_PAUSED;
121     else if (strTest.Equals("player.rewinding")) ret = PLAYER_REWINDING;
122     else if (strTest.Equals("player.forwarding")) ret = PLAYER_FORWARDING;
123     else if (strTest.Equals("player.rewinding2x")) ret = PLAYER_REWINDING_2x;
124     else if (strTest.Equals("player.rewinding4x")) ret = PLAYER_REWINDING_4x;
125     else if (strTest.Equals("player.rewinding8x")) ret = PLAYER_REWINDING_8x;
126     else if (strTest.Equals("player.rewinding16x")) ret = PLAYER_REWINDING_16x;
127     else if (strTest.Equals("player.rewinding32x")) ret = PLAYER_REWINDING_32x;
128     else if (strTest.Equals("player.forwarding2x")) ret = PLAYER_FORWARDING_2x;
129     else if (strTest.Equals("player.forwarding4x")) ret = PLAYER_FORWARDING_4x;
130     else if (strTest.Equals("player.forwarding8x")) ret = PLAYER_FORWARDING_8x;
131     else if (strTest.Equals("player.forwarding16x")) ret = PLAYER_FORWARDING_16x;
132     else if (strTest.Equals("player.forwarding32x")) ret = PLAYER_FORWARDING_32x;
133     else if (strTest.Equals("player.canrecord")) ret = PLAYER_CAN_RECORD;
134     else if (strTest.Equals("player.recording")) ret = PLAYER_RECORDING;
135     else if (strTest.Equals("player.displayafterseek")) ret = PLAYER_DISPLAY_AFTER_SEEK;
136     else if (strTest.Equals("player.caching")) ret = PLAYER_CACHING;
137     else if (strTest.Equals("player.seekbar")) ret = PLAYER_SEEKBAR;
138     else if (strTest.Equals("player.seektime")) ret = PLAYER_SEEKTIME;
139     else if (strTest.Equals("player.progress")) ret = PLAYER_PROGRESS;
140     else if (strTest.Equals("player.seeking")) ret = PLAYER_SEEKING;
141     else if (strTest.Equals("player.showtime")) ret = PLAYER_SHOWTIME;
142     else if (strTest.Equals("player.showcodec")) ret = PLAYER_SHOWCODEC;
143     else if (strTest.Equals("player.showinfo")) ret = PLAYER_SHOWINFO;
144     else if (strTest.Equals("player.time")) ret = PLAYER_TIME;
145     else if (strTest.Equals("player.timeremaining")) ret = PLAYER_TIME_REMAINING;
146     else if (strTest.Equals("player.duration")) ret = PLAYER_DURATION;
147     else if (strTest.Equals("player.volume")) ret = PLAYER_VOLUME;
148     else if (strTest.Equals("player.muted")) ret = PLAYER_MUTED;
149     else if (strTest.Equals("player.hasduration")) ret = PLAYER_HASDURATION;
150   }
151   else if (strCategory.Equals("weather"))
152   {
153     if (strTest.Equals("weather.conditions")) ret = WEATHER_CONDITIONS;
154     else if (strTest.Equals("weather.temperature")) ret = WEATHER_TEMPERATURE;
155     else if (strTest.Equals("weather.location")) ret = WEATHER_LOCATION;
156     else if (strTest.Equals("weather.isfetched")) ret = WEATHER_IS_FETCHED;
157   }
158   else if (strCategory.Equals("system"))
159   {
160     if (strTest.Equals("system.date")) ret = SYSTEM_DATE;
161     else if (strTest.Equals("system.time")) ret = SYSTEM_TIME;
162     else if (strTest.Equals("system.cputemperature")) ret = SYSTEM_CPU_TEMPERATURE;
163     else if (strTest.Equals("system.gputemperature")) ret = SYSTEM_GPU_TEMPERATURE;
164     else if (strTest.Equals("system.fanspeed")) ret = SYSTEM_FAN_SPEED;
165     else if (strTest.Equals("system.freespace(c)")) ret = SYSTEM_FREE_SPACE_C;
166     else if (strTest.Equals("system.freespace(e)")) ret = SYSTEM_FREE_SPACE_E;
167     else if (strTest.Equals("system.freespace(f)")) ret = SYSTEM_FREE_SPACE_F;
168     else if (strTest.Equals("system.freespace(g)")) ret = SYSTEM_FREE_SPACE_G;
169     else if (strTest.Equals("system.buildversion")) ret = SYSTEM_BUILD_VERSION;
170     else if (strTest.Equals("system.builddate")) ret = SYSTEM_BUILD_DATE;
171     else if (strTest.Equals("system.hasnetwork")) ret = SYSTEM_ETHERNET_LINK_ACTIVE;
172     else if (strTest.Equals("system.fps")) ret = SYSTEM_FPS;
173     else if (strTest.Equals("system.kaiconnected")) ret = SYSTEM_KAI_CONNECTED;
174     else if (strTest.Equals("system.kaienabled")) ret = SYSTEM_KAI_ENABLED;
175     else if (strTest.Equals("system.hasmediadvd")) ret = SYSTEM_MEDIA_DVD;
176     else if (strTest.Equals("system.dvdready")) ret = SYSTEM_DVDREADY;
177     else if (strTest.Equals("system.trayopen")) ret = SYSTEM_TRAYOPEN;
178     else if (strTest.Equals("system.autodetection")) ret = SYSTEM_AUTODETECTION;
179     else if (strTest.Equals("system.freememory")) ret = SYSTEM_FREE_MEMORY;
180     else if (strTest.Equals("system.screenmode")) ret = SYSTEM_SCREEN_MODE;
181     else if (strTest.Equals("system.screenwidth")) ret = SYSTEM_SCREEN_WIDTH;
182     else if (strTest.Equals("system.screenheight")) ret = SYSTEM_SCREEN_HEIGHT;
183     else if (strTest.Equals("system.currentwindow")) ret = SYSTEM_CURRENT_WINDOW;
184     else if (strTest.Equals("system.currentcontrol")) ret = SYSTEM_CURRENT_CONTROL;
185     else if (strTest.Equals("system.xboxnickname")) ret = SYSTEM_XBOX_NICKNAME;
186     else if (strTest.Equals("system.dvdlabel")) ret = SYSTEM_DVD_LABEL;
187     else if (strTest.Equals("system.haslocks")) ret = SYSTEM_HASLOCKS;
188     else if (strTest.Equals("system.hasloginscreen")) ret = SYSTEM_HAS_LOGINSCREEN;
189     else if (strTest.Equals("system.ismaster")) ret = SYSTEM_ISMASTER;
190     else if (strTest.Equals("system.internetstate")) ret = SYSTEM_INTERNET_STATE;
191     else if (strTest.Equals("system.loggedon")) ret = SYSTEM_LOGGEDON;
192     else if (strTest.Equals("system.hasdrivef")) ret = SYSTEM_HAS_DRIVE_F;
193     else if (strTest.Equals("system.hasdriveg")) ret = SYSTEM_HAS_DRIVE_G;
194     else if (strTest.Left(16).Equals("system.idletime("))
195     {
196       int time = atoi((strTest.Mid(16, strTest.GetLength() - 17).c_str()));
197       if (time > SYSTEM_IDLE_TIME_FINISH - SYSTEM_IDLE_TIME_START)
198         time = SYSTEM_IDLE_TIME_FINISH - SYSTEM_IDLE_TIME_START;
199       if (time > 0)
200         ret = SYSTEM_IDLE_TIME_START + time;
201     }
202     else if (strTest.Left(16).Equals("system.hddsmart("))
203     {
204       i_SmartRequest = atoi((strTest.Mid(16, strTest.GetLength() - 17).c_str()));
205       if (i_SmartRequest <= 0) i_SmartRequest=17; //falling back to HDD temp
206       ret = SYSTEM_HDD_SMART;
207     }
208     else if (strTest.Left(16).Equals("system.hasalarm("))
209       return AddMultiInfo(GUIInfo(bNegate ? -SYSTEM_HAS_ALARM : SYSTEM_HAS_ALARM, ConditionalStringParameter(strTest.Mid(16,strTest.size()-17)), 0));
210     //else if (strTest.Left(16).Equals("system.alarmpos("))
211     else if (strTest.Equals("system.alarmpos"))
212       ret = SYSTEM_ALARM_POS;
213     else if (strTest.Equals("system.profilename"))
214       ret = SYSTEM_PROFILENAME;
215     else if (strTest.Equals("system.profilethumb"))
216       ret = SYSTEM_PROFILETHUMB;
217   }
218   else if (strCategory.Equals("xlinkkai"))
219   {
220     if (strTest.Equals("xlinkkai.username")) ret = XLINK_KAI_USERNAME;
221   }
222   else if (strCategory.Equals("lcd"))
223   {
224     if (strTest.Equals("lcd.playicon")) ret = LCD_PLAY_ICON;
225     else if (strTest.Equals("lcd.progressbar")) ret = LCD_PROGRESS_BAR;
226     else if (strTest.Equals("lcd.cputemperature")) ret = LCD_CPU_TEMPERATURE;
227     else if (strTest.Equals("lcd.gputemperature")) ret = LCD_GPU_TEMPERATURE;
228     else if (strTest.Equals("lcd.fanspeed")) ret = LCD_FAN_SPEED;
229     else if (strTest.Equals("lcd.date")) ret = LCD_DATE;
230     else if (strTest.Equals("lcd.freespace(c)")) ret = LCD_FREE_SPACE_C;
231     else if (strTest.Equals("lcd.freespace(e)")) ret = LCD_FREE_SPACE_E;
232     else if (strTest.Equals("lcd.freespace(f)")) ret = LCD_FREE_SPACE_F;
233     else if (strTest.Equals("lcd.freespace(g)")) ret = LCD_FREE_SPACE_G;
234   }
235   else if (strCategory.Equals("network"))
236   {
237     if (strTest.Equals("network.ipaddress")) ret = NETWORK_IP_ADDRESS;
238   }
239   else if (strCategory.Equals("musicplayer"))
240   {
241     if (strTest.Equals("musicplayer.title")) ret = MUSICPLAYER_TITLE;
242     else if (strTest.Equals("musicplayer.album")) ret = MUSICPLAYER_ALBUM;
243     else if (strTest.Equals("musicplayer.artist")) ret = MUSICPLAYER_ARTIST;
244     else if (strTest.Equals("musicplayer.year")) ret = MUSICPLAYER_YEAR;
245     else if (strTest.Equals("musicplayer.genre")) ret = MUSICPLAYER_GENRE;
246     else if (strTest.Equals("musicplayer.time")) ret = MUSICPLAYER_TIME;
247     else if (strTest.Equals("musicplayer.timeremaining")) ret = MUSICPLAYER_TIME_REMAINING;
248     else if (strTest.Equals("musicplayer.timespeed")) ret = MUSICPLAYER_TIME_SPEED;
249     else if (strTest.Equals("musicplayer.tracknumber")) ret = MUSICPLAYER_TRACK_NUMBER;
250     else if (strTest.Equals("musicplayer.duration")) ret = MUSICPLAYER_DURATION;
251     else if (strTest.Equals("musicplayer.cover")) ret = MUSICPLAYER_COVER;
252     else if (strTest.Equals("musicplayer.bitrate")) ret = MUSICPLAYER_BITRATE;
253     else if (strTest.Equals("musicplayer.playlistlength")) ret = MUSICPLAYER_PLAYLISTLEN;
254     else if (strTest.Equals("musicplayer.playlistposition")) ret = MUSICPLAYER_PLAYLISTPOS;
255     else if (strTest.Equals("musicplayer.channels")) ret = MUSICPLAYER_CHANNELS;
256     else if (strTest.Equals("musicplayer.bitspersample")) ret = MUSICPLAYER_BITSPERSAMPLE;
257     else if (strTest.Equals("musicplayer.samplerate")) ret = MUSICPLAYER_SAMPLERATE;
258     else if (strTest.Equals("musicplayer.codec")) ret = MUSICPLAYER_CODEC;
259     else if (strTest.Equals("musicplayer.discnumber")) ret = MUSICPLAYER_DISC_NUMBER;
260   }
261   else if (strCategory.Equals("videoplayer"))
262   {
263     if (strTest.Equals("videoplayer.title")) ret = VIDEOPLAYER_TITLE;
264     else if (strTest.Equals("videoplayer.genre")) ret = VIDEOPLAYER_GENRE;
265     else if (strTest.Equals("videoplayer.originaltitle")) ret = VIDEOPLAYER_ORIGINALTITLE;
266     else if (strTest.Equals("videoplayer.director")) ret = VIDEOPLAYER_DIRECTOR;
267     else if (strTest.Equals("videoplayer.year")) ret = VIDEOPLAYER_YEAR;
268     else if (strTest.Equals("videoplayer.time")) ret = VIDEOPLAYER_TIME;
269     else if (strTest.Equals("videoplayer.timeremaining")) ret = VIDEOPLAYER_TIME_REMAINING;
270     else if (strTest.Equals("videoplayer.timespeed")) ret = VIDEOPLAYER_TIME_SPEED;
271     else if (strTest.Equals("videoplayer.duration")) ret = VIDEOPLAYER_DURATION;
272     else if (strTest.Equals("videoplayer.cover")) ret = VIDEOPLAYER_COVER;
273     else if (strTest.Equals("videoplayer.usingoverlays")) ret = VIDEOPLAYER_USING_OVERLAYS;
274     else if (strTest.Equals("videoplayer.isfullscreen")) ret = VIDEOPLAYER_ISFULLSCREEN;
275     else if (strTest.Equals("videoplayer.hasmenu")) ret = VIDEOPLAYER_HASMENU;
276     else if (strTest.Equals("videoplayer.playlistlength")) ret = VIDEOPLAYER_PLAYLISTLEN;
277     else if (strTest.Equals("videoplayer.playlistposition")) ret = VIDEOPLAYER_PLAYLISTPOS;
278   }
279   else if (strCategory.Equals("playlist"))
280   {
281     if (strTest.Equals("playlist.length")) ret = PLAYLIST_LENGTH;
282     else if (strTest.Equals("playlist.position")) ret = PLAYLIST_POSITION;
283     else if (strTest.Equals("playlist.random")) ret = PLAYLIST_RANDOM;
284     else if (strTest.Equals("playlist.repeat")) ret = PLAYLIST_REPEAT;
285     else if (strTest.Equals("playlist.israndom")) ret = PLAYLIST_ISRANDOM;
286     else if (strTest.Equals("playlist.isrepeat")) ret = PLAYLIST_ISREPEAT;
287     else if (strTest.Equals("playlist.isrepeatone")) ret = PLAYLIST_ISREPEATONE;
288   }
289   else if (strCategory.Equals("musicpartymode"))
290   {
291     if (strTest.Equals("musicpartymode.enabled")) ret = MUSICPM_ENABLED;
292     else if (strTest.Equals("musicpartymode.songsplayed")) ret = MUSICPM_SONGSPLAYED;
293     else if (strTest.Equals("musicpartymode.matchingsongs")) ret = MUSICPM_MATCHINGSONGS;
294     else if (strTest.Equals("musicpartymode.matchingsongspicked")) ret = MUSICPM_MATCHINGSONGSPICKED;
295     else if (strTest.Equals("musicpartymode.matchingsongsleft")) ret = MUSICPM_MATCHINGSONGSLEFT;
296     else if (strTest.Equals("musicpartymode.relaxedsongspicked")) ret = MUSICPM_RELAXEDSONGSPICKED;
297     else if (strTest.Equals("musicpartymode.randomsongspicked")) ret = MUSICPM_RANDOMSONGSPICKED;
298   }
299   else if (strCategory.Equals("audioscrobbler"))
300   {
301     if (strTest.Equals("audioscrobbler.enabled")) ret = AUDIOSCROBBLER_ENABLED;
302     else if (strTest.Equals("audioscrobbler.connectstate")) ret = AUDIOSCROBBLER_CONN_STATE;
303     else if (strTest.Equals("audioscrobbler.submitinterval")) ret = AUDIOSCROBBLER_SUBMIT_INT;
304     else if (strTest.Equals("audioscrobbler.filescached")) ret = AUDIOSCROBBLER_FILES_CACHED;
305     else if (strTest.Equals("audioscrobbler.submitstate")) ret = AUDIOSCROBBLER_SUBMIT_STATE;
306   }
307   else if (strCategory.Equals("listitem"))
308   {
309     if (strTest.Equals("listitem.thumb")) ret = LISTITEM_THUMB;
310     else if (strTest.Equals("listitem.icon")) ret = LISTITEM_ICON;
311     else if (strTest.Equals("listitem.overlay")) ret = LISTITEM_OVERLAY;
312     else if (strTest.Equals("listitem.label")) ret = LISTITEM_LABEL;
313     else if (strTest.Equals("listitem.label2")) ret = LISTITEM_LABEL2;
314     else if (strTest.Equals("listitem.title")) ret = LISTITEM_TITLE;
315     else if (strTest.Equals("listitem.tracknumber")) ret = LISTITEM_TRACKNUMBER;
316     else if (strTest.Equals("listitem.artist")) ret = LISTITEM_ARTIST;
317     else if (strTest.Equals("listitem.album")) ret = LISTITEM_ALBUM;
318     else if (strTest.Equals("listitem.year")) ret = LISTITEM_YEAR;
319     else if (strTest.Equals("listitem.genre")) ret = LISTITEM_GENRE;
320     else if (strTest.Equals("listitem.director")) ret = LISTITEM_DIRECTOR;
321     else if (strTest.Equals("listitem.filename")) ret = LISTITEM_FILENAME;
322     else if (strTest.Equals("listitem.date")) ret = LISTITEM_DATE;
323     else if (strTest.Equals("listitem.size")) ret = LISTITEM_SIZE;
324     else if (strTest.Equals("listitem.rating")) ret = LISTITEM_RATING;
325     else if (strTest.Equals("listitem.programcount")) ret = LISTITEM_PROGRAM_COUNT;
326     else if (strTest.Equals("listitem.duration")) ret = LISTITEM_DURATION;
327     else if (strTest.Equals("listitem.isselected")) ret = LISTITEM_ISSELECTED;
328   }
329   else if (strCategory.Equals("visualisation"))
330   {
331     if (strTest.Equals("visualisation.locked")) ret = VISUALISATION_LOCKED;
332     else if (strTest.Equals("visualisation.preset")) ret = VISUALISATION_PRESET;
333     else if (strTest.Equals("visualisation.name")) ret = VISUALISATION_NAME;
334     else if (strTest.Equals("visualisation.enabled")) ret = VISUALISATION_ENABLED;
335   }
336   else if (strCategory.Equals("skin"))
337   {
338     if (strTest.Equals("skin.currenttheme"))
339       ret = SKIN_THEME;
340     else if (strTest.Left(12).Equals("skin.string("))
341     {
342       int pos = strTest.Find(",");
343       if (pos >= 0)
344       {
345         int skinOffset = g_settings.TranslateSkinString(strTest.Mid(12, pos - 13));
346         int compareString = ConditionalStringParameter(strTest.Mid(pos + 1, strTest.GetLength() - (pos + 2)));
347         return AddMultiInfo(GUIInfo(bNegate ? -SKIN_STRING : SKIN_STRING, skinOffset, compareString));
348       }
349       int skinOffset = g_settings.TranslateSkinString(strTest.Mid(12, strTest.GetLength() - 13));
350       return AddMultiInfo(GUIInfo(bNegate ? -SKIN_STRING : SKIN_STRING, skinOffset));
351     }
352     else if (strTest.Left(16).Equals("skin.hassetting("))
353     {
354       int skinOffset = g_settings.TranslateSkinBool(strTest.Mid(16, strTest.GetLength() - 17));
355       return AddMultiInfo(GUIInfo(bNegate ? -SKIN_BOOL : SKIN_BOOL, skinOffset));
356     }
357     else if (strTest.Left(14).Equals("skin.hastheme("))
358       ret = SKIN_HAS_THEME_START + ConditionalStringParameter(strTest.Mid(14, strTest.GetLength() -  15));
359   }
360   else if (strTest.Left(16).Equals("window.isactive("))
361   {
362     int winID = g_buttonTranslator.TranslateWindowString(strTest.Mid(16, strTest.GetLength() - 17).c_str());
363     if (winID != WINDOW_INVALID)
364       ret = winID;
365   }
366   else if (strTest.Equals("window.ismedia")) return WINDOW_IS_MEDIA;
367   else if (strTest.Left(17).Equals("window.istopmost("))
368   {
369     int winID = g_buttonTranslator.TranslateWindowString(strTest.Mid(17, strTest.GetLength() - 18).c_str());
370     if (winID != WINDOW_INVALID)
371       return AddMultiInfo(GUIInfo(bNegate ? -WINDOW_IS_TOPMOST : WINDOW_IS_TOPMOST, winID, 0));
372   }
373   else if (strTest.Left(17).Equals("window.isvisible("))
374   {
375     int winID = g_buttonTranslator.TranslateWindowString(strTest.Mid(17, strTest.GetLength() - 18).c_str());
376     if (winID != WINDOW_INVALID)
377       return AddMultiInfo(GUIInfo(bNegate ? -WINDOW_IS_VISIBLE : WINDOW_IS_VISIBLE, winID, 0));
378   }
379   else if (strTest.Left(16).Equals("window.previous("))
380   {
381     int winID = g_buttonTranslator.TranslateWindowString(strTest.Mid(16, strTest.GetLength() - 17).c_str());
382     if (winID != WINDOW_INVALID)
383       return AddMultiInfo(GUIInfo(bNegate ? -WINDOW_PREVIOUS : WINDOW_PREVIOUS, winID, 0));
384   }
385   else if (strTest.Left(12).Equals("window.next("))
386   {
387     int winID = g_buttonTranslator.TranslateWindowString(strTest.Mid(12, strTest.GetLength() - 13).c_str());
388     if (winID != WINDOW_INVALID)
389       return AddMultiInfo(GUIInfo(bNegate ? -WINDOW_NEXT : WINDOW_NEXT, winID, 0));
390   }
391   else if (strTest.Left(17).Equals("control.hasfocus("))
392   {
393     int controlID = atoi(strTest.Mid(17, strTest.GetLength() - 18).c_str());
394     if (controlID)
395       return AddMultiInfo(GUIInfo(bNegate ? -CONTROL_HAS_FOCUS : CONTROL_HAS_FOCUS, controlID, 0));
396   }
397   else if (strTest.Left(18).Equals("control.isvisible("))
398   {
399     int controlID = atoi(strTest.Mid(18, strTest.GetLength() - 19).c_str());
400     if (controlID)
401       return AddMultiInfo(GUIInfo(bNegate ? -CONTROL_IS_VISIBLE : CONTROL_IS_VISIBLE, controlID, 0));
402   }
403   else if (strTest.Left(13).Equals("controlgroup("))
404   {
405     int groupID = atoi(strTest.Mid(13).c_str());
406     int controlID = 0;
407     int controlPos = strTest.Find(".hasfocus(");
408     if (controlPos > 0)
409       controlID = atoi(strTest.Mid(controlPos + 10).c_str());
410     if (groupID)
411     {
412       return AddMultiInfo(GUIInfo(bNegate ? -CONTROL_GROUP_HAS_FOCUS : CONTROL_GROUP_HAS_FOCUS, groupID, controlID));
413     }
414   }
415   else if (strTest.Left(24).Equals("buttonscroller.hasfocus("))
416   {
417     int controlID = atoi(strTest.Mid(24, strTest.GetLength() - 24).c_str());
418     if (controlID)
419       return AddMultiInfo(GUIInfo(bNegate ? -BUTTON_SCROLLER_HAS_ICON : BUTTON_SCROLLER_HAS_ICON, controlID, 0));
420   }
421
422   return bNegate ? -ret : ret;
423 }
424
425 string CGUIInfoManager::GetLabel(int info)
426 {
427   CStdString strLabel;
428   if (info >= MULTI_INFO_START && info <= MULTI_INFO_END)
429   {
430     strLabel = GetMultiInfoLabel(m_multiInfo[info - MULTI_INFO_START]);
431   }
432   switch (info)
433   {
434   case WEATHER_CONDITIONS:
435     strLabel = g_weatherManager.GetInfo(WEATHER_LABEL_CURRENT_COND);
436     break;
437   case WEATHER_TEMPERATURE:
438     strLabel = g_weatherManager.GetInfo(WEATHER_LABEL_CURRENT_TEMP);
439     break;
440   case WEATHER_LOCATION:
441     strLabel = g_weatherManager.GetInfo(WEATHER_LABEL_LOCATION);
442     break;
443   case SYSTEM_TIME:
444     strLabel = GetTime();
445     break;
446   case SYSTEM_DATE:
447     strLabel = GetDate();
448     break;
449   case LCD_DATE:
450     strLabel = GetDate(true);
451     break;
452   case SYSTEM_FPS:
453     strLabel.Format("%02.2f", m_fps);
454     break;
455   case PLAYER_VOLUME:
456     strLabel.Format("%2.1f dB", (float)(g_stSettings.m_nVolumeLevel + g_stSettings.m_dynamicRangeCompressionLevel) * 0.01f);
457     break;
458   case PLAYER_TIME:
459     strLabel = GetCurrentPlayTime();
460     break;
461   case PLAYER_TIME_REMAINING:
462     strLabel = GetCurrentPlayTimeRemaining();
463     break;
464   case PLAYER_DURATION:
465     if (g_application.IsPlayingAudio())
466       strLabel = GetMusicLabel(info);
467     else
468       strLabel = GetVideoLabel(info);
469     break;
470   case MUSICPLAYER_TITLE:
471   case MUSICPLAYER_ALBUM:
472   case MUSICPLAYER_ARTIST:
473   case MUSICPLAYER_GENRE:
474   case MUSICPLAYER_YEAR:
475   case MUSICPLAYER_TIME:
476   case MUSICPLAYER_TIME_SPEED:
477   case MUSICPLAYER_TIME_REMAINING:
478   case MUSICPLAYER_TRACK_NUMBER:
479   case MUSICPLAYER_DURATION:
480   case MUSICPLAYER_BITRATE:
481   case MUSICPLAYER_PLAYLISTLEN:
482   case MUSICPLAYER_PLAYLISTPOS:
483   case MUSICPLAYER_CHANNELS:
484   case MUSICPLAYER_BITSPERSAMPLE:
485   case MUSICPLAYER_SAMPLERATE:
486   case MUSICPLAYER_CODEC:
487   case MUSICPLAYER_DISC_NUMBER:
488     strLabel = GetMusicLabel(info);
489   break;
490   case VIDEOPLAYER_TITLE:
491   case VIDEOPLAYER_ORIGINALTITLE:
492   case VIDEOPLAYER_GENRE:
493   case VIDEOPLAYER_DIRECTOR:
494   case VIDEOPLAYER_YEAR:
495   case VIDEOPLAYER_TIME:
496   case VIDEOPLAYER_TIME_REMAINING:
497   case VIDEOPLAYER_TIME_SPEED:
498   case VIDEOPLAYER_DURATION:
499   case VIDEOPLAYER_PLAYLISTLEN:
500   case VIDEOPLAYER_PLAYLISTPOS:
501     strLabel = GetVideoLabel(info);
502   break;
503   case PLAYLIST_LENGTH:
504   case PLAYLIST_POSITION:
505   case PLAYLIST_RANDOM:
506   case PLAYLIST_REPEAT:
507     strLabel = GetPlaylistLabel(info);
508   break;
509   case MUSICPM_SONGSPLAYED:
510   case MUSICPM_MATCHINGSONGS:
511   case MUSICPM_MATCHINGSONGSPICKED:
512   case MUSICPM_MATCHINGSONGSLEFT:
513   case MUSICPM_RELAXEDSONGSPICKED:
514   case MUSICPM_RANDOMSONGSPICKED:
515     strLabel = GetMusicPartyModeLabel(info);
516   break;
517   case SYSTEM_FREE_SPACE_C:
518   case SYSTEM_FREE_SPACE_E:
519   case SYSTEM_FREE_SPACE_F:
520   case SYSTEM_FREE_SPACE_G:
521     return GetFreeSpace(info);
522   break;
523   case LCD_FREE_SPACE_C:
524   case LCD_FREE_SPACE_E:
525   case LCD_FREE_SPACE_F:
526   case LCD_FREE_SPACE_G:
527     return GetFreeSpace(info, true);
528   break;
529   case SYSTEM_CPU_TEMPERATURE:
530     return GetSystemHeatInfo("cpu");
531     break;
532   case SYSTEM_GPU_TEMPERATURE:
533     return GetSystemHeatInfo("gpu");
534     break;
535   case SYSTEM_FAN_SPEED:
536     return GetSystemHeatInfo("fan");
537     break;
538   case LCD_CPU_TEMPERATURE:
539     return GetSystemHeatInfo("lcdcpu");
540     break;
541   case LCD_GPU_TEMPERATURE:
542     return GetSystemHeatInfo("lcdgpu");
543     break;
544   case LCD_FAN_SPEED:
545     return GetSystemHeatInfo("lcdfan");
546     break;
547   case SYSTEM_BUILD_VERSION:
548     strLabel = GetVersion();
549     break;
550   case SYSTEM_BUILD_DATE:
551     strLabel = GetBuild();
552     break;
553   case SYSTEM_FREE_MEMORY:
554     {
555       MEMORYSTATUS stat;
556       GlobalMemoryStatus(&stat);
557       strLabel.Format("%iMB", stat.dwAvailPhys / (1024 * 1024));
558     }
559     break;
560   case SYSTEM_SCREEN_MODE:
561     strLabel = g_settings.m_ResInfo[g_graphicsContext.GetVideoResolution()].strMode;
562     break;
563   case SYSTEM_SCREEN_WIDTH:
564     strLabel.Format("%i", g_settings.m_ResInfo[g_graphicsContext.GetVideoResolution()].iWidth);
565     break;
566   case SYSTEM_SCREEN_HEIGHT:
567     strLabel.Format("%i", g_settings.m_ResInfo[g_graphicsContext.GetVideoResolution()].iHeight);
568     break;
569   case SYSTEM_CURRENT_WINDOW:
570     return g_localizeStrings.Get(m_gWindowManager.GetActiveWindow());
571     break;
572   case SYSTEM_CURRENT_CONTROL:
573     {
574       CGUIWindow *window = m_gWindowManager.GetWindow(m_gWindowManager.GetActiveWindow());
575       if (window)
576       {
577         CGUIControl *control = window->GetFocusedControl();
578         if (control)
579           strLabel = control->GetDescription();
580       }
581     }
582     break;
583   case SYSTEM_XBOX_NICKNAME:
584     {
585       if (!CUtil::GetXBOXNickName(strLabel))
586         strLabel=g_localizeStrings.Get(416); // 
587       break;
588     }
589   case SYSTEM_DVD_LABEL:
590     strLabel = CDetectDVDMedia::GetDVDLabel();
591     break;
592   case SYSTEM_ALARM_POS:
593     if (g_alarmClock.GetRemaining("shutdowntimer") == 0.f)
594       strLabel = "";
595     else
596     {
597       double fTime = g_alarmClock.GetRemaining("shutdowntimer");
598       if (fTime > 60.f)
599         strLabel.Format("%2.0fm",g_alarmClock.GetRemaining("shutdowntimer")/60.f);
600       else
601         strLabel.Format("%2.0fs",g_alarmClock.GetRemaining("shutdowntimer")/60.f);
602     }
603     break;
604   case SYSTEM_PROFILENAME:
605     strLabel = g_settings.m_vecProfiles[g_settings.m_iLastLoadedProfileIndex].getName();
606     break;
607   case XLINK_KAI_USERNAME:
608     strLabel = g_guiSettings.GetString("xlinkkai.username");
609     break;
610   case LCD_PLAY_ICON:
611     {
612       int iPlaySpeed = g_application.GetPlaySpeed();
613       if (g_application.IsPaused())
614         strLabel.Format("\7");
615       else if (iPlaySpeed < 1)
616         strLabel.Format("\3:%ix", iPlaySpeed);
617       else if (iPlaySpeed > 1)
618         strLabel.Format("\4:%ix", iPlaySpeed);
619       else
620         strLabel.Format("\5");
621     }
622     break;
623   case SKIN_THEME:
624     if (g_guiSettings.GetString("lookandfeel.skintheme").Equals("skindefault"))
625       strLabel = g_localizeStrings.Get(15109);
626     else
627       strLabel = g_guiSettings.GetString("lookandfeel.skintheme");
628     break;
629 #ifdef HAS_LCD
630   case LCD_PROGRESS_BAR:
631     if (g_lcd) strLabel = g_lcd->GetProgressBar(g_application.GetTime(), g_application.GetTotalTime());
632     break;
633 #endif
634   case NETWORK_IP_ADDRESS:
635     {
636       CStdString ip;
637       ip.Format("%s: %s", g_localizeStrings.Get(150).c_str(), g_network.m_networkinfo.ip);
638       return ip;
639     }
640     break;
641   case AUDIOSCROBBLER_CONN_STATE:
642   case AUDIOSCROBBLER_SUBMIT_INT:
643   case AUDIOSCROBBLER_FILES_CACHED:
644   case AUDIOSCROBBLER_SUBMIT_STATE:
645     strLabel=GetAudioScrobblerLabel(info);
646     break;
647   case VISUALISATION_PRESET:
648     {
649       CGUIMessage msg(GUI_MSG_GET_VISUALISATION, 0, 0);
650       g_graphicsContext.SendMessage(msg);
651       if (msg.GetLPVOID())
652       {
653         CVisualisation *pVis = (CVisualisation *)msg.GetLPVOID();
654         char *preset = pVis->GetPreset();
655         if (preset)
656         {
657           strLabel = preset;
658           CUtil::RemoveExtension(strLabel);
659         }
660       }
661     }
662     break;
663   case VISUALISATION_NAME:
664     {
665       strLabel = g_guiSettings.GetString("mymusic.visualisation");
666       if (strLabel != "None" && strLabel.size() > 4)
667       { // make it look pretty
668         strLabel = strLabel.Left(strLabel.size() - 4);
669         strLabel[0] = toupper(strLabel[0]);
670       }
671     }
672     break;
673   case PLAYER_SEEKTIME:
674     {
675       CGUIDialogSeekBar *seekBar = (CGUIDialogSeekBar*)m_gWindowManager.GetWindow(WINDOW_DIALOG_SEEK_BAR);
676       if (seekBar)
677         strLabel = seekBar->GetSeekTimeLabel();
678     }
679     break;
680   case LISTITEM_LABEL:
681   case LISTITEM_LABEL2:
682   case LISTITEM_TITLE:
683   case LISTITEM_TRACKNUMBER:
684   case LISTITEM_ARTIST:
685   case LISTITEM_ALBUM:
686   case LISTITEM_YEAR:
687   case LISTITEM_GENRE:
688   case LISTITEM_DIRECTOR:
689   case LISTITEM_FILENAME:
690   case LISTITEM_DATE:
691   case LISTITEM_SIZE:
692   case LISTITEM_RATING:
693   case LISTITEM_PROGRAM_COUNT:
694   case LISTITEM_DURATION:
695     {
696       CGUIWindow *pWindow = m_gWindowManager.GetWindow(m_gWindowManager.GetActiveWindow());
697       if (pWindow && pWindow->IsMediaWindow())
698       {
699         strLabel = GetItemLabel(pWindow->GetCurrentListItem(), info);
700       }
701     }
702     break;
703
704   case SYSTEM_HDD_SMART:
705     {
706       if (i_SmartRequest == 17)
707         strLabel.Format("%s %s", g_localizeStrings.Get(13151).c_str(), GetHDDSmart(i_SmartRequest).c_str());
708       else
709         strLabel.Format("%s", GetHDDSmart(i_SmartRequest).c_str());
710     }
711     break;
712
713   case SYSTEM_INTERNET_STATE:
714     strLabel.Format("%s", SystemHasInternet_s().c_str());
715     break;
716   }
717
718   return strLabel;
719 }
720
721 // tries to get a integer value for use in progressbars/sliders and such
722 int CGUIInfoManager::GetInt(int info) const
723 {
724   if (info == PLAYER_VOLUME)
725     return g_application.GetVolume();
726   else if( g_application.IsPlaying() && g_application.m_pPlayer)
727   {
728     switch( info )
729     {
730     case PLAYER_PROGRESS:
731       return (int)(g_application.GetPercentage());
732     case PLAYER_SEEKBAR:
733       {
734         CGUIDialogSeekBar *seekBar = (CGUIDialogSeekBar*)m_gWindowManager.GetWindow(WINDOW_DIALOG_SEEK_BAR);
735         return seekBar ? (int)seekBar->GetPercentage() : 0;
736       }
737     case PLAYER_CACHING:
738       return (int)(g_application.m_pPlayer->GetCacheLevel());
739     }
740   }
741   return 0;
742 }
743 // checks the condition and returns it as necessary.  Currently used
744 // for toggle button controls and visibility of images.
745 bool CGUIInfoManager::GetBool(int condition1, DWORD dwContextWindow)
746 {
747   // check our cache
748   bool result;
749   if (IsCached(condition1, dwContextWindow, result))
750     return result;
751
752   if(  condition1 >= COMBINED_VALUES_START && (condition1 - COMBINED_VALUES_START) < (int)(m_CombinedValues.size()) )
753   {
754     const CCombinedValue &comb = m_CombinedValues[condition1 - COMBINED_VALUES_START];
755     bool result;
756     if (!EvaluateBooleanExpression(comb, result, dwContextWindow))
757       result = false;
758     CacheBool(condition1, dwContextWindow, result);
759     return result;
760   }
761
762   int condition = abs(condition1);
763   bool bReturn = false;
764
765   // GeminiServer: Ethernet Link state checking
766   // Will check if the Xbox has a Ethernet Link connection! [Cable in!]
767   // This can used for the skinner to switch off Network or Inter required functions
768   if ( condition == SYSTEM_ALWAYS_TRUE)
769     bReturn = true;
770   else if (condition == SYSTEM_ALWAYS_FALSE)
771     bReturn = false;
772   else if (condition == SYSTEM_ETHERNET_LINK_ACTIVE)
773 #ifdef HAS_XBOX_NETWORK
774     bReturn = (XNetGetEthernetLinkStatus() & XNET_ETHERNET_LINK_ACTIVE);
775 #else
776     bReturn = true;
777 #endif
778   else if (condition > SYSTEM_IDLE_TIME_START && condition <= SYSTEM_IDLE_TIME_FINISH)
779     bReturn = (g_application.GlobalIdleTime() >= condition - SYSTEM_IDLE_TIME_START);
780   else if (condition >= WINDOW_ACTIVE_START && condition <= WINDOW_ACTIVE_END)// check for Window.IsActive(window)
781     bReturn = m_gWindowManager.IsWindowActive(condition);
782   else if (condition == WINDOW_IS_MEDIA)
783   {
784     CGUIWindow *pWindow = m_gWindowManager.GetWindow(m_gWindowManager.GetActiveWindow());
785     bReturn = (pWindow && pWindow->IsMediaWindow());
786   }
787   else if (condition == SYSTEM_AUTODETECTION)
788     bReturn = HasAutodetectedXbox();
789   else if (condition == PLAYER_MUTED)
790     bReturn = g_stSettings.m_bMute;
791   else if (condition == SYSTEM_KAI_CONNECTED)
792     bReturn = g_guiSettings.GetBool("xlinkkai.enabled") && CKaiClient::GetInstance()->IsEngineConnected();
793   else if (condition == SYSTEM_KAI_ENABLED)
794     bReturn = g_guiSettings.GetBool("xlinkkai.enabled");
795   else if (condition == SYSTEM_MEDIA_DVD)
796   {
797     // we must: 1.  Check tray state.
798     //          2.  Check that we actually have a disc in the drive (detection
799     //              of disk type takes a while from a separate thread).
800     CIoSupport TrayIO;
801     int iTrayState = TrayIO.GetTrayState();
802     if ( iTrayState == DRIVE_CLOSED_MEDIA_PRESENT || iTrayState == TRAY_CLOSED_MEDIA_PRESENT )
803       bReturn = CDetectDVDMedia::IsDiscInDrive();
804     else 
805       bReturn = false;
806   }
807   else if (condition == SYSTEM_HAS_DRIVE_F)
808     bReturn = g_advancedSettings.m_useFDrive;
809   else if (condition == SYSTEM_HAS_DRIVE_G)
810     bReturn = g_advancedSettings.m_useGDrive;
811   else if (condition == SYSTEM_DVDREADY)
812           bReturn = CDetectDVDMedia::DriveReady() != DRIVE_NOT_READY;
813   else if (condition == SYSTEM_TRAYOPEN)
814         bReturn = CDetectDVDMedia::DriveReady() == DRIVE_OPEN;
815   else if (condition == PLAYER_SHOWINFO)
816     bReturn = m_playerShowInfo;
817   else if (condition == PLAYER_SHOWCODEC)
818     bReturn = m_playerShowCodec;
819   else if (condition >= SKIN_HAS_THEME_START && condition <= SKIN_HAS_THEME_END)
820   { // Note that the code used here could probably be extended to general
821     // settings conditions (parameter would need to store both the setting name and
822     // the and the comparison string)
823     CStdString theme = g_guiSettings.GetString("lookandfeel.skintheme");
824     theme.ToLower();
825     CUtil::RemoveExtension(theme);
826     bReturn = theme.Equals(m_stringParameters[condition - SKIN_HAS_THEME_START]);
827   }
828   else if (condition >= MULTI_INFO_START && condition <= MULTI_INFO_END)
829   {
830     // cache return value
831     bool result = GetMultiInfoBool(m_multiInfo[condition - MULTI_INFO_START], dwContextWindow);
832     CacheBool(condition1, dwContextWindow, result);
833     return result;
834   }
835   else if (condition == SYSTEM_HASLOCKS)  
836     bReturn = g_settings.m_vecProfiles[0].getLockMode() != LOCK_MODE_EVERYONE;
837   else if (condition == SYSTEM_ISMASTER)
838     bReturn = g_settings.m_vecProfiles[0].getLockMode() != LOCK_MODE_EVERYONE && g_passwordManager.bMasterUser;
839   else if (condition == SYSTEM_LOGGEDON)
840     bReturn = !(m_gWindowManager.GetActiveWindow() == WINDOW_LOGIN_SCREEN);
841   else if (condition == SYSTEM_HAS_LOGINSCREEN)
842     bReturn = g_settings.bUseLoginScreen;
843   else if (condition == WEATHER_IS_FETCHED)
844     bReturn = g_weatherManager.IsFetched();
845   else if (condition == SYSTEM_INTERNET_STATE)
846     bReturn = SystemHasInternet();
847   else if (condition == SKIN_HAS_VIDEO_OVERLAY)
848   {
849     bReturn = !g_application.IsInScreenSaver() && m_gWindowManager.IsOverlayAllowed() &&
850               g_application.IsPlayingVideo() && m_gWindowManager.GetActiveWindow() != WINDOW_FULLSCREEN_VIDEO;
851   }
852   else if (condition == SKIN_HAS_MUSIC_OVERLAY)
853   {
854     bReturn = !g_application.IsInScreenSaver() && m_gWindowManager.IsOverlayAllowed() &&
855               g_application.IsPlayingAudio();
856   }
857   else if (condition == LISTITEM_ISSELECTED)
858   {
859     CGUIWindow *pWindow = m_gWindowManager.GetWindow(m_gWindowManager.GetActiveWindow());
860     if (pWindow && pWindow->IsMediaWindow())
861       bReturn = GetItemBool(pWindow->GetCurrentListItem(), condition, dwContextWindow);
862   }
863   else if (g_application.IsPlaying())
864   {
865     switch (condition)
866     {
867     case PLAYER_HAS_MEDIA:
868       bReturn = true;
869       break;
870     case PLAYER_HAS_AUDIO:
871       bReturn = g_application.IsPlayingAudio();
872       break;
873     case PLAYER_HAS_VIDEO:
874       bReturn = g_application.IsPlayingVideo();
875       break;
876     case PLAYER_PLAYING:
877       bReturn = !g_application.IsPaused() && (g_application.GetPlaySpeed() == 1);
878       break;
879     case PLAYER_PAUSED:
880       bReturn = g_application.IsPaused();
881       break;
882     case PLAYER_REWINDING:
883       bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() < 1;
884       break;
885     case PLAYER_FORWARDING:
886       bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() > 1;
887       break;
888     case PLAYER_REWINDING_2x:
889       bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() == -2;
890       break;
891     case PLAYER_REWINDING_4x:
892       bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() == -4;
893       break;
894     case PLAYER_REWINDING_8x:
895       bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() == -8;
896       break;
897     case PLAYER_REWINDING_16x:
898       bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() == -16;
899       break;
900     case PLAYER_REWINDING_32x:
901       bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() == -32;
902       break;
903     case PLAYER_FORWARDING_2x:
904       bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() == 2;
905       break;
906     case PLAYER_FORWARDING_4x:
907       bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() == 4;
908       break;
909     case PLAYER_FORWARDING_8x:
910       bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() == 8;
911       break;
912     case PLAYER_FORWARDING_16x:
913       bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() == 16;
914       break;
915     case PLAYER_FORWARDING_32x:
916       bReturn = !g_application.IsPaused() && g_application.GetPlaySpeed() == 32;
917       break;
918     case PLAYER_CAN_RECORD:
919       bReturn = g_application.m_pPlayer->CanRecord();
920       break;
921     case PLAYER_RECORDING:
922       bReturn = g_application.m_pPlayer->IsRecording();
923     break;
924     case PLAYER_DISPLAY_AFTER_SEEK:
925       bReturn = GetDisplayAfterSeek();
926     break;
927     case PLAYER_CACHING:
928       bReturn = g_application.m_pPlayer->IsCaching();
929     break;
930     case PLAYER_SEEKBAR:
931       {
932         CGUIDialogSeekBar *seekBar = (CGUIDialogSeekBar*)m_gWindowManager.GetWindow(WINDOW_DIALOG_SEEK_BAR);
933         bReturn = seekBar ? seekBar->IsRunning() : false;
934       }
935     break;
936     case PLAYER_SEEKING:
937       bReturn = m_playerSeeking;
938     break;
939     case PLAYER_SHOWTIME:
940       bReturn = m_playerShowTime;
941     break;
942     case MUSICPM_ENABLED:
943       bReturn = g_partyModeManager.IsEnabled();
944     break;
945     case AUDIOSCROBBLER_ENABLED:
946       bReturn = g_guiSettings.GetBool("lastfm.enable");
947     break;
948     case VIDEOPLAYER_USING_OVERLAYS:
949       bReturn = (g_guiSettings.GetInt("videoplayer.rendermethod") == RENDER_OVERLAYS);
950     break;
951     case VIDEOPLAYER_ISFULLSCREEN:
952       bReturn = m_gWindowManager.GetActiveWindow() == WINDOW_FULLSCREEN_VIDEO;
953     break;
954     case VIDEOPLAYER_HASMENU:
955       bReturn = g_application.m_pPlayer->HasMenu();
956     break;
957     case PLAYLIST_ISRANDOM:
958       bReturn = g_playlistPlayer.IsShuffled(g_playlistPlayer.GetCurrentPlaylist());
959     break;
960     case PLAYLIST_ISREPEAT:
961       bReturn = g_playlistPlayer.GetRepeat(g_playlistPlayer.GetCurrentPlaylist()) == PLAYLIST::REPEAT_ALL;
962     break;
963     case PLAYLIST_ISREPEATONE:
964       bReturn = g_playlistPlayer.GetRepeat(g_playlistPlayer.GetCurrentPlaylist()) == PLAYLIST::REPEAT_ONE;
965     break;
966     case PLAYER_HASDURATION:
967       bReturn = g_application.GetTotalTime() > 0;
968       break;
969     case VISUALISATION_LOCKED:
970       {
971         CGUIMessage msg(GUI_MSG_GET_VISUALISATION, 0, 0);
972         g_graphicsContext.SendMessage(msg);
973         if (msg.GetLPVOID())
974         {
975           CVisualisation *pVis = (CVisualisation *)msg.GetLPVOID();
976           bReturn = pVis->IsLocked();
977         }
978       }
979     break;
980     case VISUALISATION_ENABLED:
981       bReturn = g_guiSettings.GetString("mymusic.visualisation") != "None";
982     break;
983     }
984   }
985   // cache return value
986   if (condition1 < 0) bReturn = !bReturn;
987   CacheBool(condition1, dwContextWindow, bReturn);
988   return bReturn;
989 }
990
991 /// \brief Examines the multi information sent and returns true or false accordingly.
992 bool CGUIInfoManager::GetMultiInfoBool(const GUIInfo &info, DWORD dwContextWindow) const
993 {
994   bool bReturn = false;
995   int condition = abs(info.m_info);
996   switch (condition)
997   {
998     case SKIN_BOOL:
999       {
1000         bReturn = g_settings.GetSkinBool(info.m_data1);
1001       }
1002       break;
1003     case SKIN_STRING:
1004       {
1005         if (info.m_data2)
1006           bReturn = g_settings.GetSkinString(info.m_data1).Equals(m_stringParameters[info.m_data2]);
1007         else
1008           bReturn = !g_settings.GetSkinString(info.m_data1).IsEmpty();
1009       }
1010       break;
1011     case CONTROL_GROUP_HAS_FOCUS:
1012       {
1013         CGUIWindow *pWindow = m_gWindowManager.GetWindow(dwContextWindow);
1014         if (!pWindow) pWindow = m_gWindowManager.GetWindow(m_gWindowManager.GetActiveWindow());
1015         if (pWindow) 
1016           bReturn = pWindow->ControlGroupHasFocus(info.m_data1, info.m_data2);
1017       }
1018       break;
1019     case CONTROL_IS_VISIBLE:
1020       {
1021         CGUIWindow *pWindow = m_gWindowManager.GetWindow(dwContextWindow);
1022         if (!pWindow) pWindow = m_gWindowManager.GetWindow(m_gWindowManager.GetActiveWindow());
1023         if (pWindow)
1024         {
1025           // Note: This'll only work for unique id's
1026           const CGUIControl *control = pWindow->GetControl(info.m_data1);
1027           if (control)
1028             bReturn = control->IsVisible();
1029         }
1030       }
1031       break;
1032     case CONTROL_HAS_FOCUS:
1033       {
1034         CGUIWindow *pWindow = m_gWindowManager.GetWindow(dwContextWindow);
1035         if (!pWindow) pWindow = m_gWindowManager.GetWindow(m_gWindowManager.GetActiveWindow());
1036         if (pWindow)
1037           bReturn = (pWindow->GetFocusedControlID() == info.m_data1);
1038       }
1039       break;
1040     case BUTTON_SCROLLER_HAS_ICON:
1041       {
1042         CGUIWindow *pWindow = m_gWindowManager.GetWindow(dwContextWindow);
1043         if( !pWindow ) pWindow = m_gWindowManager.GetWindow(m_gWindowManager.GetActiveWindow());
1044         if (pWindow)
1045         {
1046           CGUIControl *pControl = pWindow->GetFocusedControl();
1047           if (pControl && pControl->GetControlType() == CGUIControl::GUICONTROL_BUTTONBAR)
1048             bReturn = ((CGUIButtonScroller *)pControl)->GetActiveButtonID() == info.m_data1;
1049         }
1050       }
1051       break;
1052     case WINDOW_NEXT:
1053       bReturn = (info.m_data1 == m_nextWindowID);
1054       break;
1055     case WINDOW_PREVIOUS:
1056       bReturn = (info.m_data1 == m_prevWindowID);
1057       break;
1058     case WINDOW_IS_VISIBLE:
1059       bReturn = m_gWindowManager.IsWindowVisible(info.m_data1);
1060       break;
1061     case WINDOW_IS_TOPMOST:
1062       bReturn = m_gWindowManager.IsWindowTopMost(info.m_data1);
1063       break;
1064     case SYSTEM_HAS_ALARM:
1065       bReturn = g_alarmClock.hasAlarm(m_stringParameters[info.m_data1]);
1066       break;
1067   }
1068   return (info.m_info < 0) ? !bReturn : bReturn;
1069 }
1070
1071 /// \brief Examines the multi information sent and returns the string as appropriate
1072 const CStdString &CGUIInfoManager::GetMultiInfoLabel(const GUIInfo &info) const
1073 {
1074   if (info.m_info == SKIN_STRING)
1075   {
1076     return g_settings.GetSkinString(info.m_data1);
1077   }
1078   else if (info.m_info == SKIN_BOOL)
1079   {
1080     bool bInfo = g_settings.GetSkinBool(info.m_data1);
1081     if (bInfo)
1082       return g_localizeStrings.Get(20122);
1083   }
1084   return StringUtils::EmptyString;
1085 }
1086
1087 /// \brief Obtains the filename of the image to show from whichever subsystem is needed
1088 CStdString CGUIInfoManager::GetImage(int info, int contextWindow)
1089 {
1090   if (info >= MULTI_INFO_START && info <= MULTI_INFO_END)
1091   {
1092     return GetMultiInfoLabel(m_multiInfo[info - MULTI_INFO_START]);
1093   }
1094   else if (info == WEATHER_CONDITIONS)
1095     return g_weatherManager.GetInfo(WEATHER_IMAGE_CURRENT_ICON);
1096   else if (info == SYSTEM_PROFILETHUMB)
1097   {
1098     CStdString thumb = g_settings.m_vecProfiles[g_settings.m_iLastLoadedProfileIndex].getThumb();
1099     if (thumb.IsEmpty())
1100       thumb = "unknown-user.png";
1101     return thumb;
1102   }
1103   else if (info == MUSICPLAYER_COVER)
1104   {
1105     if (!g_application.IsPlayingAudio()) return "";
1106     return m_currentFile.HasThumbnail() ? m_currentFile.GetThumbnailImage() : "defaultAlbumCover.png";
1107   }
1108   else if (info == VIDEOPLAYER_COVER)
1109   {
1110     if (!g_application.IsPlayingVideo()) return "";
1111     if(m_currentMovieThumb.IsEmpty())
1112       return m_currentFile.HasThumbnail() ? m_currentFile.GetThumbnailImage() : "defaultVideoCover.png";
1113     else return m_currentMovieThumb;
1114   }
1115   else if (info == LISTITEM_THUMB || info == LISTITEM_ICON || info == LISTITEM_OVERLAY)
1116   {
1117     CGUIWindow *window = m_gWindowManager.GetWindow(contextWindow);
1118     if (!window || !window->IsMediaWindow())
1119       window = m_gWindowManager.GetWindow(m_gWindowManager.GetActiveWindow());
1120     if (window && window->IsMediaWindow())
1121     {
1122       CFileItem *item = window->GetCurrentListItem();
1123       if (item)
1124         return GetItemImage(item, info);
1125     }
1126   }
1127   return "";
1128 }
1129
1130 CStdString CGUIInfoManager::GetDate(bool bNumbersOnly)
1131 {
1132   CDateTime time=CDateTime::GetCurrentDateTime();
1133   return time.GetAsLocalizedDate(!bNumbersOnly);
1134 }
1135
1136 CStdString CGUIInfoManager::GetTime(bool bSeconds)
1137 {
1138   CDateTime time=CDateTime::GetCurrentDateTime();
1139   return time.GetAsLocalizedTime(bSeconds);
1140 }
1141
1142 CStdString CGUIInfoManager::GetMusicPartyModeLabel(int item)
1143 {
1144   // get song counts
1145   if (item >= MUSICPM_SONGSPLAYED && item <= MUSICPM_RANDOMSONGSPICKED)
1146   {
1147     int iSongs = -1;
1148     switch (item)
1149     {
1150     case MUSICPM_SONGSPLAYED:
1151       {
1152         iSongs = g_partyModeManager.GetSongsPlayed();
1153         break;
1154       }
1155     case MUSICPM_MATCHINGSONGS:
1156       {
1157         iSongs = g_partyModeManager.GetMatchingSongs();
1158         break;
1159       }
1160     case MUSICPM_MATCHINGSONGSPICKED:
1161       {
1162         iSongs = g_partyModeManager.GetMatchingSongsPicked();
1163         break;
1164       }
1165     case MUSICPM_MATCHINGSONGSLEFT:
1166       {
1167         iSongs = g_partyModeManager.GetMatchingSongsLeft();
1168         break;
1169       }
1170     case MUSICPM_RELAXEDSONGSPICKED:
1171       {
1172         iSongs = g_partyModeManager.GetRelaxedSongs();
1173         break;
1174       }
1175     case MUSICPM_RANDOMSONGSPICKED:
1176       {
1177         iSongs = g_partyModeManager.GetRandomSongs();
1178         break;
1179       }
1180     }
1181     if (iSongs < 0)
1182       return "";
1183     CStdString strLabel;
1184     strLabel.Format("%i", iSongs);
1185     return strLabel;
1186   }
1187   return "";
1188 }
1189
1190 CStdString CGUIInfoManager::GetPlaylistLabel(int item)
1191 {
1192   if (!g_application.IsPlaying()) return "";
1193   int iPlaylist = g_playlistPlayer.GetCurrentPlaylist();
1194   switch (item)
1195   {
1196   case PLAYLIST_LENGTH:
1197     {
1198       CStdString strLength = "";
1199                 strLength.Format("%i", g_playlistPlayer.GetPlaylist(iPlaylist).size());
1200       return strLength;
1201     }
1202   case PLAYLIST_POSITION:
1203     {
1204       CStdString strPosition = "";
1205       strPosition.Format("%i", g_playlistPlayer.GetCurrentSong() + 1);
1206       return strPosition;
1207     }
1208   case PLAYLIST_RANDOM:
1209     {
1210       if (g_playlistPlayer.IsShuffled(iPlaylist))
1211         return g_localizeStrings.Get(590); // 590: Random
1212       else
1213         return g_localizeStrings.Get(591); // 591: Off
1214     }
1215   case PLAYLIST_REPEAT:
1216     {
1217       PLAYLIST::REPEAT_STATE state = g_playlistPlayer.GetRepeat(iPlaylist);
1218       if (state == PLAYLIST::REPEAT_ONE)
1219         return g_localizeStrings.Get(592); // 592: One
1220       else if (state == PLAYLIST::REPEAT_ALL)
1221         return g_localizeStrings.Get(593); // 593: All
1222       else
1223         return g_localizeStrings.Get(594); // 594: Off
1224     }
1225   }
1226   return "";
1227 }
1228
1229
1230 CStdString CGUIInfoManager::GetMusicLabel(int item)
1231 {
1232   if (!g_application.IsPlayingAudio()) return "";
1233   CMusicInfoTag& tag = m_currentFile.m_musicInfoTag;
1234   switch (item)
1235   {
1236   case MUSICPLAYER_TITLE:
1237     if (tag.GetTitle().size()) { return tag.GetTitle(); }
1238     break;
1239   case MUSICPLAYER_ALBUM: 
1240     if (tag.GetAlbum().size()) { return tag.GetAlbum(); }
1241     break;
1242   case MUSICPLAYER_ARTIST: 
1243     if (tag.GetArtist().size()) { return tag.GetArtist(); }
1244     break;
1245   case MUSICPLAYER_YEAR: 
1246     if (tag.GetYear().size()) { return tag.GetYear(); }
1247     break;
1248   case MUSICPLAYER_GENRE: 
1249     if (tag.GetGenre().size()) { return tag.GetGenre(); }
1250     break;
1251   case MUSICPLAYER_TIME:
1252     return GetCurrentPlayTime();
1253   case MUSICPLAYER_TIME_REMAINING:
1254     return GetCurrentPlayTimeRemaining();
1255   case MUSICPLAYER_TIME_SPEED:
1256     {
1257       CStdString strTime;
1258       if (g_application.GetPlaySpeed() != 1)
1259         strTime.Format("%s (%ix)", GetCurrentPlayTime().c_str(), g_application.GetPlaySpeed());
1260       else
1261         strTime = GetCurrentPlayTime();
1262       return strTime;
1263     }
1264     break;
1265   case MUSICPLAYER_TRACK_NUMBER:
1266     {
1267       CStdString strTrack;
1268       if (tag.Loaded() && tag.GetTrackNumber() > 0)
1269       {
1270         strTrack.Format("%02i", tag.GetTrackNumber());
1271         return strTrack;
1272       }
1273     }
1274     break;
1275   case MUSICPLAYER_DURATION:
1276   case PLAYER_DURATION:
1277     {
1278       CStdString strDuration;
1279       if (tag.GetDuration() > 0)
1280         StringUtils::SecondsToTimeString(tag.GetDuration(), strDuration);
1281       else
1282       {
1283         unsigned int iTotal = (unsigned int)g_application.GetTotalTime();
1284         if (iTotal > 0)
1285           StringUtils::SecondsToTimeString(iTotal, strDuration);
1286
1287       }
1288       return strDuration;
1289     }
1290     break;
1291   case MUSICPLAYER_PLAYLISTLEN:
1292     {
1293       if (g_playlistPlayer.GetCurrentPlaylist() == PLAYLIST_MUSIC)
1294         return GetPlaylistLabel(PLAYLIST_LENGTH);
1295         }
1296           break;
1297   case MUSICPLAYER_PLAYLISTPOS:
1298     {
1299       if (g_playlistPlayer.GetCurrentPlaylist() == PLAYLIST_MUSIC)
1300         return GetPlaylistLabel(PLAYLIST_POSITION);
1301         }
1302         break;
1303   case MUSICPLAYER_BITRATE:
1304     {
1305       float fTimeSpan = (float)(timeGetTime() - m_lastMusicBitrateTime);
1306       if (fTimeSpan >= 500.0f)
1307       {
1308         m_MusicBitrate = g_application.m_pPlayer->GetBitrate();
1309         m_lastMusicBitrateTime = timeGetTime();
1310       }
1311       CStdString strBitrate = "";
1312       if (m_MusicBitrate > 0)
1313         strBitrate.Format("%i", m_MusicBitrate);
1314       return strBitrate;
1315     }
1316     break;
1317   case MUSICPLAYER_CHANNELS:
1318     {
1319       CStdString strChannels = "";
1320             if (g_application.m_pPlayer->GetChannels() > 0)
1321             {
1322               strChannels.Format("%i", g_application.m_pPlayer->GetChannels());
1323             }
1324       return strChannels;
1325     }
1326     break;
1327   case MUSICPLAYER_BITSPERSAMPLE:
1328     {
1329       CStdString strBitsPerSample = "";
1330             if (g_application.m_pPlayer->GetBitsPerSample() > 0)
1331             {
1332               strBitsPerSample.Format("%i", g_application.m_pPlayer->GetBitsPerSample());
1333             }
1334       return strBitsPerSample;
1335     }
1336     break;
1337   case MUSICPLAYER_SAMPLERATE:
1338     {
1339       CStdString strSampleRate = "";
1340             if (g_application.m_pPlayer->GetSampleRate() > 0)
1341             {
1342               strSampleRate.Format("%i",g_application.m_pPlayer->GetSampleRate());
1343             }
1344       return strSampleRate;
1345     }
1346     break;
1347   case MUSICPLAYER_CODEC:
1348     {
1349       CStdString strCodec;
1350       strCodec.Format("%s", g_application.m_pPlayer->GetCodecName().c_str());
1351       return strCodec;
1352     }
1353     break;
1354   case MUSICPLAYER_DISC_NUMBER:
1355     {
1356       CStdString strDisc;
1357       if (tag.Loaded() && tag.GetDiscNumber() > 0)
1358       {
1359         strDisc.Format("%02i", tag.GetDiscNumber());
1360         return strDisc;
1361       } 
1362     }
1363     break;
1364   }
1365   return "";
1366 }
1367
1368 CStdString CGUIInfoManager::GetVideoLabel(int item)
1369 {
1370   if (!g_application.IsPlayingVideo()) 
1371     return "";
1372
1373   bool bIsTuxBox = GetTuxBoxEvents();
1374   
1375   switch (item)
1376   {
1377   case VIDEOPLAYER_DURATION:
1378       return m_currentMovieDuration;
1379   case VIDEOPLAYER_TITLE:
1380     return m_currentMovie.m_strTitle;
1381     break;
1382   case VIDEOPLAYER_ORIGINALTITLE:
1383     return m_currentMovie.m_strOriginalTitle;
1384     break;
1385   case VIDEOPLAYER_GENRE:
1386     return m_currentMovie.m_strGenre;
1387     break;
1388   case VIDEOPLAYER_DIRECTOR:
1389     return m_currentMovie.m_strDirector;
1390     break;
1391   case VIDEOPLAYER_YEAR:
1392     if (m_currentMovie.m_iYear > 0)
1393     {
1394       CStdString strYear;
1395       strYear.Format("%i", m_currentMovie.m_iYear);
1396       return strYear;
1397     }
1398     break;
1399   case VIDEOPLAYER_TIME:
1400     return GetCurrentPlayTime();
1401   case VIDEOPLAYER_TIME_REMAINING:
1402     return GetCurrentPlayTimeRemaining();
1403   case VIDEOPLAYER_TIME_SPEED:
1404     {
1405       CStdString strTime;
1406       if (g_application.GetPlaySpeed() != 1)
1407         strTime.Format("%s (%ix)", GetCurrentPlayTime().c_str(), g_application.GetPlaySpeed());
1408       else
1409         strTime = GetCurrentPlayTime();
1410       return strTime;
1411     }
1412     break;
1413   case PLAYER_DURATION:
1414     {
1415       CStdString strDuration = "00:00:00";
1416       unsigned int iTotal = (unsigned int)g_application.GetTotalTime();
1417       if (iTotal > 0)
1418         StringUtils::SecondsToTimeString(iTotal, strDuration, true);
1419       return strDuration;
1420     }
1421     break;
1422   case VIDEOPLAYER_PLAYLISTLEN:
1423     {
1424       if (g_playlistPlayer.GetCurrentPlaylist() == PLAYLIST_VIDEO)
1425         return GetPlaylistLabel(PLAYLIST_LENGTH);
1426         }
1427           break;
1428   case VIDEOPLAYER_PLAYLISTPOS:
1429     {
1430       if (g_playlistPlayer.GetCurrentPlaylist() == PLAYLIST_VIDEO)
1431         return GetPlaylistLabel(PLAYLIST_POSITION);
1432         }
1433         break;
1434   }
1435   return "";
1436 }
1437
1438 __int64 CGUIInfoManager::GetPlayTime()
1439 {
1440   if (g_application.IsPlaying())
1441   {
1442     __int64 lPTS = (__int64)(g_application.GetTime() * 1000);
1443     if (lPTS < 0) lPTS = 0;
1444     return lPTS;
1445   }
1446   return 0;
1447 }
1448
1449 CStdString CGUIInfoManager::GetCurrentPlayTime()
1450 {
1451   CStdString strTime;
1452   if (g_application.IsPlayingAudio())
1453     StringUtils::SecondsToTimeString((int)(GetPlayTime()/1000), strTime);
1454   else if (g_application.IsPlayingVideo())
1455     StringUtils::SecondsToTimeString((int)(GetPlayTime()/1000), strTime, true);
1456   return strTime;
1457 }
1458
1459 int CGUIInfoManager::GetTotalPlayTime()
1460 {
1461   int iTotalTime = (int)g_application.GetTotalTime();
1462   return iTotalTime > 0 ? iTotalTime : 0;
1463 }
1464
1465 int CGUIInfoManager::GetPlayTimeRemaining()
1466 {
1467   int iReverse = GetTotalPlayTime() - (int)g_application.GetTime();
1468   return iReverse > 0 ? iReverse : 0;
1469 }
1470
1471 CStdString CGUIInfoManager::GetCurrentPlayTimeRemaining()
1472 {
1473   CStdString strTime;
1474   int timeRemaining = GetPlayTimeRemaining();
1475   if (timeRemaining)
1476   {
1477     if (g_application.IsPlayingAudio())
1478       StringUtils::SecondsToTimeString(timeRemaining, strTime);
1479     else if (g_application.IsPlayingVideo())
1480       StringUtils::SecondsToTimeString(timeRemaining, strTime, true);
1481   }
1482   return strTime;
1483 }
1484
1485 void CGUIInfoManager::ResetCurrentItem()
1486
1487   m_currentFile.Reset();
1488   m_currentMovie.Reset();
1489   m_currentMovie.m_strFileNameAndPath = "";
1490   m_currentMovieThumb = "";
1491   m_currentMovieDuration = "";
1492   
1493 }
1494
1495 void CGUIInfoManager::SetCurrentItem(CFileItem &item)
1496 {
1497   if (item.IsLastFM()) return; //last.fm handles it's own songinfo
1498   ResetCurrentItem();
1499
1500   if (item.IsAudio())
1501     SetCurrentSong(item);
1502   else
1503     SetCurrentMovie(item);
1504 }
1505
1506 void CGUIInfoManager::SetCurrentAlbumThumb(const CStdString thumbFileName)
1507 {
1508   if (CFile::Exists(thumbFileName))
1509     m_currentFile.SetThumbnailImage(thumbFileName);
1510   else
1511   {
1512     m_currentFile.SetThumbnailImage("");
1513     m_currentFile.FillInDefaultIcon();
1514   }
1515 }
1516
1517 void CGUIInfoManager::SetCurrentSong(CFileItem &item)
1518 {
1519   CLog::Log(LOGDEBUG,"CGUIInfoManager::SetCurrentSong(%s)",item.m_strPath.c_str());
1520   m_currentFile = item;
1521
1522   // Get a reference to the item's tag
1523   CMusicInfoTag& tag = m_currentFile.m_musicInfoTag;
1524   // check if we don't have the tag already loaded
1525   if (!tag.Loaded())
1526   {
1527     // we have a audio file.
1528     // Look if we have this file in database...
1529     bool bFound = false;
1530     CMusicDatabase musicdatabase;
1531     if (musicdatabase.Open())
1532     {
1533       CSong song;
1534       bFound = musicdatabase.GetSongByFileName(m_currentFile.m_strPath, song);
1535       m_currentFile.m_musicInfoTag.SetSong(song);
1536       musicdatabase.Close();
1537     }
1538
1539     if (!bFound)
1540     {
1541       // always get id3 info for the overlay
1542       CMusicInfoTagLoaderFactory factory;
1543       auto_ptr<IMusicInfoTagLoader> pLoader (factory.CreateLoader(m_currentFile.m_strPath));
1544       // Do we have a tag loader for this file type?
1545       if (NULL != pLoader.get())
1546         pLoader->Load(m_currentFile.m_strPath, tag);
1547     }
1548   }
1549
1550   // If we have tag information, ...
1551   if (tag.Loaded())
1552   {
1553     if (!tag.GetTitle().size())
1554     {
1555       // No title in tag, show filename only
1556 #ifdef HAS_FILESYSTEM      
1557       CSndtrkDirectory dir;
1558       char NameOfSong[64];
1559       if (dir.FindTrackName(m_currentFile.m_strPath, NameOfSong))
1560         tag.SetTitle(NameOfSong);
1561       else
1562 #endif
1563         tag.SetTitle( CUtil::GetTitleFromPath(m_currentFile.m_strPath) );
1564     }
1565   } // if (tag.Loaded())
1566   else
1567   {
1568     // If we have a cdda track without cddb information,...
1569     if (m_currentFile.IsCDDA())
1570     {
1571       // we have the tracknumber...
1572       int iTrack = tag.GetTrackNumber();
1573       if (iTrack >= 1)
1574       {
1575         CStdString strText = g_localizeStrings.Get(435); // "Track"
1576         if (strText.GetAt(strText.size() - 1) != ' ')
1577           strText += " ";
1578         CStdString strTrack;
1579         strTrack.Format(strText + "%i", iTrack);
1580         tag.SetTitle(strTrack);
1581         tag.SetLoaded(true);
1582       }
1583     } // if (!tag.Loaded() && url.GetProtocol()=="cdda" )
1584     else
1585     { // at worse, set our title as the filename
1586       tag.SetTitle( CUtil::GetTitleFromPath(m_currentFile.m_strPath) );
1587     } // we now have at least the title
1588     tag.SetLoaded(true);
1589   }
1590
1591   // find a thumb for this file.
1592   if (m_currentFile.IsInternetStream())
1593   {
1594     if (!g_application.m_strPlayListFile.IsEmpty())
1595     {
1596       CLog::Log(LOGDEBUG,"Streaming media detected... using %s to find a thumb", g_application.m_strPlayListFile.c_str());
1597       CFileItem streamingItem(g_application.m_strPlayListFile,false);
1598       streamingItem.SetMusicThumb();
1599       CStdString strThumb = streamingItem.GetThumbnailImage();
1600       if (CFile::Exists(strThumb))
1601         m_currentFile.SetThumbnailImage(strThumb);
1602     }
1603   }
1604   else
1605     m_currentFile.SetMusicThumb();
1606   m_currentFile.FillInDefaultIcon();
1607 }
1608
1609 void CGUIInfoManager::SetCurrentMovie(CFileItem &item)
1610 {
1611   CLog::Log(LOGDEBUG,"CGUIInfoManager::SetCurrentMovie(%s)",item.m_strPath.c_str());
1612   m_currentFile = item;
1613
1614   CVideoDatabase dbs;
1615   dbs.Open();
1616   if (dbs.HasMovieInfo(item.m_strPath))
1617   {
1618     dbs.GetMovieInfo(item.m_strPath, m_currentMovie);
1619     CLog::Log(LOGDEBUG,"CGUIInfoManager:SetCurrentMovie(), got movie info!");
1620     CLog::Log(LOGDEBUG,"  Title = %s", m_currentMovie.m_strTitle.c_str());
1621     CLog::Log(LOGDEBUG,"  IMDB# = %s", m_currentMovie.m_strIMDBNumber.c_str());
1622   }
1623   dbs.Close();
1624
1625   if (m_currentMovie.m_strTitle.IsEmpty())
1626   { // at least fill in the filename
1627     if (!item.GetLabel().IsEmpty())
1628       m_currentMovie.m_strTitle = item.GetLabel();
1629     else
1630       m_currentMovie.m_strTitle = CUtil::GetTitleFromPath(item.m_strPath);
1631   }
1632   
1633   //Don't check for a Empty NameAndPath Set it! Or is there a reason?
1634   if (m_currentMovie.m_strFileNameAndPath.IsEmpty())
1635   {
1636     m_currentMovie.m_strFileNameAndPath = item.m_strPath;
1637   }
1638
1639   // Find a thumb for this file.
1640   item.SetVideoThumb();
1641
1642   // find a thumb for this stream
1643   if (item.IsInternetStream())
1644   {
1645     // case where .strm is used to start an audio stream
1646     if (g_application.IsPlayingAudio())
1647     {
1648       SetCurrentSong(item);
1649       return;
1650     }
1651
1652     // else its a video
1653     if (!g_application.m_strPlayListFile.IsEmpty())
1654     {
1655       CLog::Log(LOGDEBUG,"Streaming media detected... using %s to find a thumb", g_application.m_strPlayListFile.c_str());
1656       CFileItem thumbItem(g_application.m_strPlayListFile,false);
1657       thumbItem.SetVideoThumb();
1658       if (thumbItem.HasThumbnail())
1659         item.SetThumbnailImage(thumbItem.GetThumbnailImage());
1660     }
1661   }
1662
1663   item.FillInDefaultIcon();
1664   m_currentMovieThumb = item.GetThumbnailImage();
1665 }
1666
1667 string CGUIInfoManager::GetSystemHeatInfo(const CStdString &strInfo)
1668 {
1669 #ifdef HAS_XBOX_HARDWARE
1670   if (timeGetTime() - m_lastSysHeatInfoTime >= 1000)
1671   { // update our variables
1672     m_lastSysHeatInfoTime = timeGetTime();
1673     m_fanSpeed = CFanController::Instance()->GetFanSpeed();
1674     m_gpuTemp = CFanController::Instance()->GetGPUTemp();
1675     m_cpuTemp = CFanController::Instance()->GetCPUTemp();
1676   }
1677 #endif
1678   CStdString text;
1679
1680   if (strInfo == "cpu")
1681   {
1682     text.Format("%s %s", g_localizeStrings.Get(140).c_str(), m_cpuTemp.ToString());
1683   }
1684   else if (strInfo == "lcdcpu")
1685   {
1686     text=m_cpuTemp.ToString();
1687   }
1688   else if (strInfo == "gpu")
1689   {
1690     text=m_gpuTemp.ToString();
1691     text.Format("%s %s", g_localizeStrings.Get(141).c_str(), m_gpuTemp.ToString());
1692   }
1693   else if (strInfo == "lcdgpu")
1694   {
1695     text=m_gpuTemp.ToString();
1696   }
1697   else if (strInfo == "fan")
1698   {
1699     text.Format("%s: %i%%", g_localizeStrings.Get(13300).c_str(), m_fanSpeed * 2);
1700   }
1701   else if (strInfo == "lcdfan")
1702   {
1703     text.Format("%i%%", m_fanSpeed * 2);
1704   }
1705
1706   return text;
1707 }
1708
1709 string CGUIInfoManager::GetFreeSpace(int drive, bool shortText)
1710 {
1711   ULARGE_INTEGER lTotalFreeBytes;
1712
1713   char cDrive;
1714   if (shortText)
1715     cDrive = drive - LCD_FREE_SPACE_C + 'C';
1716   else
1717     cDrive = drive - SYSTEM_FREE_SPACE_C + 'C';
1718   CStdString strDriveFind;
1719   strDriveFind.Format("%c:\\", cDrive);
1720   const char *pszDrive = g_localizeStrings.Get(155).c_str();
1721   const char *pszFree = g_localizeStrings.Get(160).c_str();
1722   const char *pszUnavailable = g_localizeStrings.Get(161).c_str();
1723   CStdString space;
1724   if (GetDiskFreeSpaceEx( strDriveFind.c_str(), NULL, NULL, &lTotalFreeBytes))
1725   {
1726     if (shortText)
1727       space.Format("%uMB", (unsigned int)(lTotalFreeBytes.QuadPart / 1024 / 1024)); //To make it MB
1728         else
1729       space.Format("%s %c: %u MB", pszDrive, cDrive, (unsigned int)(lTotalFreeBytes.QuadPart / 1048576)); //To make it MB
1730   }
1731   else
1732   {
1733     if (shortText)
1734       space = "N/A";
1735     else
1736       space.Format("%s %c: %s", pszDrive, cDrive, pszUnavailable);
1737   }
1738   return space;
1739 }
1740
1741 CStdString CGUIInfoManager::GetVersion()
1742 {
1743   CStdString tmp;
1744   tmp.Format("%s", VERSION_STRING);
1745   return tmp;
1746 }
1747
1748 CStdString CGUIInfoManager::GetBuild()
1749 {
1750   CStdString tmp;
1751   tmp.Format("%s", __DATE__);
1752   return tmp;
1753 }
1754
1755 void CGUIInfoManager::SetDisplayAfterSeek(DWORD dwTimeOut)
1756 {
1757   if(dwTimeOut>0)    
1758     m_AfterSeekTimeout = timeGetTime() +  dwTimeOut;
1759   else
1760     m_AfterSeekTimeout = 0;
1761 }
1762
1763 bool CGUIInfoManager::GetDisplayAfterSeek() const
1764 {
1765   return (timeGetTime() < m_AfterSeekTimeout);
1766 }
1767
1768 CStdString CGUIInfoManager::GetAudioScrobblerLabel(int item)
1769 {
1770   switch (item)
1771   {
1772   case AUDIOSCROBBLER_CONN_STATE:
1773     return CScrobbler::GetInstance()->GetConnectionState();
1774     break;
1775   case AUDIOSCROBBLER_SUBMIT_INT:
1776     return CScrobbler::GetInstance()->GetSubmitInterval();
1777     break;
1778   case AUDIOSCROBBLER_FILES_CACHED:
1779     return CScrobbler::GetInstance()->GetFilesCached();
1780     break;
1781   case AUDIOSCROBBLER_SUBMIT_STATE:
1782     return CScrobbler::GetInstance()->GetSubmitState();
1783     break;
1784   }
1785
1786   return "";
1787 }
1788
1789 int CGUIInfoManager::GetOperator(const char ch)
1790 {
1791   if (ch == '[')
1792     return 5;
1793   else if (ch == ']')
1794     return 4;
1795   else if (ch == '!')
1796     return OPERATOR_NOT;
1797   else if (ch == '+')
1798     return OPERATOR_AND;
1799   else if (ch == '|')
1800     return OPERATOR_OR;
1801   else
1802     return 0;
1803 }
1804
1805 bool CGUIInfoManager::EvaluateBooleanExpression(const CCombinedValue &expression, bool &result, DWORD dwContextWindow)
1806 {
1807   // stack to save our bool state as we go
1808   stack<bool> save;
1809
1810   for (list<int>::const_iterator it = expression.m_postfix.begin(); it != expression.m_postfix.end(); ++it)
1811   {
1812     int expr = *it;
1813     if (expr == -OPERATOR_NOT)
1814     { // NOT the top item on the stack
1815       if (save.size() < 1) return false;
1816       bool expr = save.top();
1817       save.pop();
1818       save.push(!expr);
1819     }
1820     else if (expr == -OPERATOR_AND)
1821     { // AND the top two items on the stack
1822       if (save.size() < 2) return false;
1823       bool right = save.top(); save.pop();
1824       bool left = save.top(); save.pop();
1825       save.push(left && right);
1826     }
1827     else if (expr == -OPERATOR_OR)
1828     { // OR the top two items on the stack
1829       if (save.size() < 2) return false;
1830       bool right = save.top(); save.pop();
1831       bool left = save.top(); save.pop();
1832       save.push(left || right);
1833     }
1834     else  // operator
1835       save.push(GetBool(expr, dwContextWindow));
1836   }
1837   if (save.size() != 1) return false;
1838   result = save.top();
1839   return true;
1840 }
1841
1842 int CGUIInfoManager::TranslateBooleanExpression(const CStdString &expression)
1843 {
1844   CCombinedValue comb;
1845   comb.m_info = expression;
1846   comb.m_id = COMBINED_VALUES_START + m_CombinedValues.size();
1847
1848   // operator stack
1849   stack<char> save;
1850
1851   CStdString operand;
1852
1853   for (unsigned int i = 0; i < expression.size(); i++)
1854   {
1855     if (GetOperator(expression[i]))
1856     {
1857       // cleanup any operand, translate and put into our expression list
1858       if (!operand.IsEmpty())
1859       {
1860         int iOp = TranslateSingleString(operand);
1861         if (iOp)
1862           comb.m_postfix.push_back(iOp);
1863         operand.clear();
1864       }
1865       // handle closing parenthesis
1866       if (expression[i] == ']')
1867       {
1868         while (save.size())
1869         {
1870           char oper = save.top();
1871           save.pop();
1872
1873           if (oper == '[')
1874             break;
1875
1876           comb.m_postfix.push_back(-GetOperator(oper));
1877         }
1878       }
1879       else
1880       {
1881         // all other operators we pop off the stack any operator
1882         // that has a higher priority than the one we have.
1883         while (!save.empty() && GetOperator(save.top()) > GetOperator(expression[i]))
1884         {
1885           // only handle parenthesis once they're closed.
1886           if (save.top() == '[' && expression[i] != ']')
1887             break;
1888
1889           comb.m_postfix.push_back(-GetOperator(save.top()));  // negative denotes operator
1890           save.pop();
1891         }
1892         save.push(expression[i]);
1893       }
1894     }
1895     else
1896     {
1897       operand += expression[i];
1898     }
1899   }
1900
1901   if (!operand.empty())
1902     comb.m_postfix.push_back(TranslateSingleString(operand));
1903
1904   // finish up by adding any operators
1905   while (!save.empty())
1906   {
1907     comb.m_postfix.push_back(-GetOperator(save.top()));
1908     save.pop();
1909   }
1910
1911   // test evaluate
1912   bool test;
1913   if (!EvaluateBooleanExpression(comb, test, WINDOW_INVALID))
1914     CLog::Log(LOGERROR, "Error evaluating boolean expression %s", expression.c_str());
1915   // success - add to our combined values
1916   m_CombinedValues.push_back(comb);
1917   return comb.m_id;
1918 }
1919
1920 void CGUIInfoManager::Clear()
1921 {
1922   m_currentFile.Reset();
1923   m_currentMovie.Reset();
1924   m_CombinedValues.clear();
1925 }
1926
1927 void CGUIInfoManager::UpdateFPS()
1928 {
1929   m_frameCounter++;
1930   float fTimeSpan = (float)(timeGetTime() - m_lastFPSTime);
1931   if (fTimeSpan >= 1000.0f)
1932   {
1933     fTimeSpan /= 1000.0f;
1934     m_fps = m_frameCounter / fTimeSpan;
1935     m_lastFPSTime = timeGetTime();
1936     m_frameCounter = 0;
1937   }
1938 }
1939
1940 int CGUIInfoManager::AddMultiInfo(const GUIInfo &info)
1941 {
1942   // check to see if we have this info already
1943   for (unsigned int i = 0; i < m_multiInfo.size(); i++)
1944     if (m_multiInfo[i] == info)
1945       return (int)i + MULTI_INFO_START;
1946   // return the new offset
1947   m_multiInfo.push_back(info);
1948   return (int)m_multiInfo.size() + MULTI_INFO_START - 1;
1949 }
1950
1951 int CGUIInfoManager::ConditionalStringParameter(const CStdString &parameter)
1952 {
1953   // check to see if we have this parameter already
1954   for (unsigned int i = 0; i < m_stringParameters.size(); i++)
1955     if (parameter.Equals(m_stringParameters[i]))
1956       return (int)i;
1957   // return the new offset
1958   m_stringParameters.push_back(parameter);
1959   return (int)m_stringParameters.size() - 1;
1960 }
1961
1962 CStdString CGUIInfoManager::GetItemMultiLabel(const CFileItem *item, const vector<CInfoPortion> &multiInfo)
1963 {
1964   CStdString label;
1965   for (unsigned int i = 0; i < multiInfo.size(); i++)
1966   {
1967     const CInfoPortion &portion = multiInfo[i];
1968     if (portion.m_info)
1969     {
1970       CStdString infoLabel = g_infoManager.GetItemLabel(item, portion.m_info);
1971       if (!infoLabel.IsEmpty())
1972       {
1973         label += portion.m_prefix;
1974         label += infoLabel;
1975         label += portion.m_postfix;
1976       }
1977     }
1978     else
1979     { // no info, so just append the prefix
1980       label += portion.m_prefix;
1981     }
1982   }
1983   return label;
1984 }
1985
1986 // This is required as in order for the "* All Albums" etc. items to sort
1987 // correctly, they must have fake artist/album etc. information generated.
1988 // This looks nasty if we attempt to render it to the GUI, thus this (further)
1989 // workaround
1990 const CStdString &CorrectAllItemsSortHack(const CStdString &item)
1991 {
1992   if (item.size() == 1 && item[0] == 0x01 || item[1] == 0xff)
1993     return StringUtils::EmptyString;
1994   return item;
1995 }
1996
1997 CStdString CGUIInfoManager::GetItemLabel(const CFileItem *item, int info)
1998 {
1999   if (!item) return "";
2000   switch (info)
2001   {
2002   case LISTITEM_LABEL:
2003     return item->GetLabel();
2004   case LISTITEM_LABEL2:
2005     return item->GetLabel2();
2006   case LISTITEM_TITLE:
2007     return CorrectAllItemsSortHack(item->m_musicInfoTag.GetTitle());
2008   case LISTITEM_TRACKNUMBER:
2009     {
2010       CStdString track;
2011       track.Format("%i", item->m_musicInfoTag.GetTrackNumber());
2012       return track;
2013     }
2014   case LISTITEM_ARTIST:
2015   case LISTITEM_DIRECTOR:// HACK - director info is injected as the artist tag
2016     return CorrectAllItemsSortHack(item->m_musicInfoTag.GetArtist());
2017   case LISTITEM_ALBUM:
2018     return CorrectAllItemsSortHack(item->m_musicInfoTag.GetAlbum());
2019   case LISTITEM_YEAR:
2020     return item->m_musicInfoTag.GetYear();
2021   case LISTITEM_GENRE:
2022     return CorrectAllItemsSortHack(item->m_musicInfoTag.GetGenre());
2023   case LISTITEM_FILENAME:
2024     return CUtil::GetFileName(item->m_strPath);
2025   case LISTITEM_DATE:
2026     if (item->m_dateTime.IsValid())
2027       return item->m_dateTime.GetAsLocalizedDate();
2028   case LISTITEM_SIZE:
2029     if (!item->m_bIsFolder || item->m_dwSize)
2030       return StringUtils::SizeToString(item->m_dwSize);
2031   case LISTITEM_RATING:
2032     {
2033       CStdString rating;
2034       rating.Format("%2.2f", item->m_fRating);
2035       return rating;
2036     }
2037   case LISTITEM_PROGRAM_COUNT:
2038     {
2039       CStdString count;
2040       count.Format("%i", item->m_iprogramCount);
2041       return count;
2042     }
2043   case LISTITEM_DURATION:
2044     {
2045       CStdString duration;
2046       if (item->m_musicInfoTag.GetDuration() > 0)
2047         StringUtils::SecondsToTimeString(item->m_musicInfoTag.GetDuration(), duration);
2048       return duration;
2049     }
2050   }
2051   return "";
2052 }
2053
2054 bool CGUIInfoManager::GetItemBool(const CFileItem *item, int info, DWORD contextWindow)
2055 {
2056   bool ret = false;
2057   int absInfo = abs(info);
2058   switch (absInfo)
2059   {
2060   case LISTITEM_ISPLAYING:
2061     if (item && !m_currentFile.m_strPath.IsEmpty())
2062       ret = m_currentFile.IsSamePath(item);
2063     break;
2064   case LISTITEM_ISSELECTED:
2065     if (item)
2066       ret = item->IsSelected();
2067     break;
2068   default:
2069     return GetBool(info, contextWindow);
2070   }
2071   return (info < 0) ? !ret : ret;
2072 }
2073
2074 CStdString CGUIInfoManager::GetMultiLabel(const vector<CInfoPortion> &multiInfo)
2075 {
2076   CStdString label;
2077   for (unsigned int i = 0; i < multiInfo.size(); i++)
2078   {
2079     const CInfoPortion &portion = multiInfo[i];
2080     if (portion.m_info)
2081     {
2082       CStdString infoLabel = g_infoManager.GetLabel(portion.m_info);
2083       if (!infoLabel.IsEmpty())
2084       {
2085         label += portion.m_prefix;
2086         label += infoLabel;
2087         label += portion.m_postfix;
2088       }
2089     }
2090     else
2091     { // no info, so just append the prefix
2092       label += portion.m_prefix;
2093     }
2094   }
2095   return label;
2096 }
2097
2098 void CGUIInfoManager::ParseLabel(const CStdString &strLabel, vector<CInfoPortion> &multiInfo)
2099 {
2100   multiInfo.clear();
2101   CStdString work(strLabel);
2102   // Step 1: Replace all $LOCALIZE[number] with the real string
2103   int pos1 = work.Find("$LOCALIZE[");
2104   while (pos1 >= 0)
2105   {
2106     int pos2 = work.Find(']', pos1);
2107     if (pos2 > pos1)
2108     {
2109       CStdString left = work.Left(pos1);
2110       CStdString right = work.Mid(pos2 + 1);
2111       CStdString replace = g_localizeStrings.Get(atoi(work.Mid(pos1 + 10).c_str()));
2112       work = left + replace + right;
2113     }
2114     else
2115     {
2116       CLog::Log(LOGERROR, "Error parsing label - missing ']'");
2117       return;
2118     }
2119     pos1 = work.Find("$LOCALIZE[", pos1);
2120   }
2121   // Step 2: Find all $INFO[info,prefix,postfix] blocks
2122   pos1 = work.Find("$INFO[");
2123   while (pos1 >= 0)
2124   {
2125     // output the first block (contents before first $INFO)
2126     if (pos1 > 0)
2127       multiInfo.push_back(CInfoPortion(0, work.Left(pos1), ""));
2128
2129     // ok, now decipher the $INFO block
2130     int pos2 = work.Find(']', pos1);
2131     if (pos2 > pos1)
2132     {
2133       // decipher the block
2134       CStdString block = work.Mid(pos1 + 6, pos2 - pos1 - 6);
2135       CStdStringArray params;
2136       StringUtils::SplitString(block, ",", params);
2137       int info = TranslateString(params[0]);
2138       CStdString prefix, postfix;
2139       if (params.size() > 1)
2140         prefix = params[1];
2141       if (params.size() > 2)
2142         postfix = params[2];
2143       multiInfo.push_back(CInfoPortion(info, prefix, postfix));
2144       // and delete it from our work string
2145       work = work.Mid(pos2 + 1);
2146     }
2147     else
2148     {
2149       CLog::Log(LOGERROR, "Error parsing label - missing ']'");
2150       return;
2151     }
2152     pos1 = work.Find("$INFO[");
2153   }
2154   // add any last block
2155   if (!work.IsEmpty())
2156     multiInfo.push_back(CInfoPortion(0, work, ""));
2157 }
2158
2159 void CGUIInfoManager::ResetCache()
2160 {
2161   CSingleLock lock(m_critInfo);
2162   m_boolCache.clear();
2163 }
2164
2165 inline void CGUIInfoManager::CacheBool(int condition, DWORD contextWindow, bool result)
2166 {
2167   // windows have id's up to 13100 or thereabouts (ie 2^14 needed)
2168   // conditionals have id's up to 100000 or thereabouts (ie 2^18 needed)
2169   CSingleLock lock(m_critInfo);
2170   int hash = ((contextWindow & 0x3fff) << 18) | (condition & 0x3ffff);
2171   m_boolCache.insert(pair<int, bool>(hash, result));
2172 }
2173
2174 bool CGUIInfoManager::IsCached(int condition, DWORD contextWindow, bool &result) const
2175 {
2176   // windows have id's up to 13100 or thereabouts (ie 2^14 needed)
2177   // conditionals have id's up to 100000 or thereabouts (ie 2^18 needed)
2178  
2179   CSingleLock lock(m_critInfo);
2180   int hash = ((contextWindow & 0x3fff) << 18) | (condition & 0x3ffff);
2181   map<int, bool>::const_iterator it = m_boolCache.find(hash);
2182   if (it != m_boolCache.end())
2183   {
2184     result = (*it).second;
2185     return true;
2186   }
2187
2188   return false;
2189 }
2190
2191
2192 CStdString CGUIInfoManager::GetHDDSmart( int iSmartRequest )
2193 {
2194 #ifdef HAS_XBOX_HARDWARE
2195   CStdString strItemhdd;
2196   if(!g_hddsmart.IsRunning())
2197     g_hddsmart.Start();
2198   g_hddsmart.SmartREQ = iSmartRequest;
2199
2200   if (iSmartRequest == 17 )
2201   {
2202     CTemperature HddTemp = CTemperature::CreateFromCelsius((double)g_hddsmart.m_HddSmarValue);
2203     if (g_hddsmart.m_HddSmarValue<=0 || g_hddsmart.m_HddSmarValue>=100)
2204       HddTemp.SetState(CTemperature::invalid);
2205     strItemhdd.Format("%s", HddTemp.ToString().c_str());
2206   }
2207   else
2208   {
2209     char buffer[10];
2210     itoa(g_hddsmart.m_HddSmarValue, buffer, 10);
2211     strItemhdd.Format("%s", buffer);
2212   }
2213   return strItemhdd;
2214 #else
2215   return "";
2216 #endif
2217 }
2218 bool CGUIInfoManager::SystemHasInternet()
2219 {
2220   CHTTP http;
2221   if (http.IsInternet()) 
2222     return true;
2223   else if (http.IsInternet(false))
2224     return true;
2225   return false;
2226 }
2227 CStdString CGUIInfoManager::SystemHasInternet_s()
2228 {
2229   CStdString StrTemp;
2230   CStdString lbl2 = g_localizeStrings.Get(13295);
2231   CStdString lbl3 = g_localizeStrings.Get(13296);
2232   CStdString lbl4 = g_localizeStrings.Get(13297);
2233
2234   if (SystemHasInternet())
2235     StrTemp.Format("%s %s",lbl2.c_str(), lbl3.c_str());
2236   else
2237     StrTemp.Format("%s %s",lbl2.c_str(), lbl4.c_str());
2238   
2239   return StrTemp;
2240 }
2241
2242 CStdString CGUIInfoManager::GetItemImage(const CFileItem *item, int info)
2243 {
2244   if (!item) return "";
2245   if (info == LISTITEM_ICON && !item->HasThumbnail() && item->HasIcon())
2246   {
2247     CStdString strThumb = item->GetIconImage();
2248     strThumb.Insert(strThumb.Find("."), "Big");
2249     return strThumb;
2250   }
2251   if (info == LISTITEM_OVERLAY)
2252     return item->GetOverlayImage();
2253   return item->GetThumbnailImage();
2254 }
2255
2256 bool CGUIInfoManager::GetTuxBoxEvents()
2257 {
2258   //Return TuxBox Mode
2259   if (m_currentFile.m_strPath.Find(":31339") > 0)
2260   {
2261     // Set Thread Informations
2262     t_tuxbox.strURL = m_currentFile.m_strPath;
2263     if(m_currentFile.m_iDriveType >0)
2264       t_tuxbox.iPort = m_currentFile.m_iDriveType;
2265     
2266     // Start Thread
2267     if(!t_tuxbox.IsRunning())
2268       t_tuxbox.Start();
2269     
2270     // Set m_currentMovieDuration
2271     if(!g_tuxbox.sCurSrvData.current_event_duration.IsEmpty() && !g_tuxbox.sCurSrvData.current_event_duration.IsEmpty() && 
2272       !g_tuxbox.sCurSrvData.current_event_duration.Equals("-") && !g_tuxbox.sCurSrvData.current_event_duration.Equals("-"))
2273     {
2274       g_tuxbox.sCurSrvData.current_event_duration.Replace("(","");
2275       g_tuxbox.sCurSrvData.current_event_duration.Replace(")","");
2276     
2277       m_currentMovieDuration.Format("%s: %s %s (%s - %s)",g_localizeStrings.Get(180),g_tuxbox.sCurSrvData.current_event_duration,
2278         g_localizeStrings.Get(12391),g_tuxbox.sCurSrvData.current_event_time, g_tuxbox.sCurSrvData.next_event_time);
2279     }
2280
2281     //Set strVideoGenre
2282     if (!g_tuxbox.sCurSrvData.current_event_description.IsEmpty() && !g_tuxbox.sCurSrvData.next_event_description.IsEmpty() &&
2283       !g_tuxbox.sCurSrvData.current_event_description.Equals("-") && !g_tuxbox.sCurSrvData.next_event_description.Equals("-"))
2284     {
2285       m_currentMovie.m_strGenre.Format("%s %s  -  (%s: %s)",g_localizeStrings.Get(143),g_tuxbox.sCurSrvData.current_event_description,
2286         g_localizeStrings.Get(209),g_tuxbox.sCurSrvData.next_event_description);
2287     }
2288
2289     //Set m_currentMovie.m_strDirector
2290     if (!g_tuxbox.sCurSrvData.current_event_details.Equals("-") && !g_tuxbox.sCurSrvData.current_event_details.IsEmpty())
2291     {
2292       m_currentMovie.m_strDirector = g_tuxbox.sCurSrvData.current_event_details;
2293     }
2294     
2295     return true;
2296   }
2297   return false;
2298 }