added: signal dbusserver to stop before joining the thread (other servers might follow)
[xbmc:paulepanters-xbmc.git] / XBMC / xbmc / Application.h
1 #pragma once
2
3 /*
4  *      Copyright (C) 2005-2008 Team XBMC
5  *      http://xbmc.org
6  *
7  *  This Program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; either version 2, or (at your option)
10  *  any later version.
11  *
12  *  This Program is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with XBMC; see the file COPYING.  If not, write to
19  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
20  *  http://www.gnu.org/copyleft/gpl.html
21  *
22  */
23
24 #include "system.h"
25 #include "XBApplicationEx.h"
26
27 #include "IMsgTargetCallback.h"
28
29 class CFileItem;
30 class CFileItemList;
31
32 #include "GUIDialogSeekBar.h"
33 #include "GUIDialogKaiToast.h"
34 #include "GUIDialogVolumeBar.h"
35 #include "GUIDialogMuteBug.h"
36 #include "GUIWindowPointer.h"   // Mouse pointer
37
38 #include "cores/IPlayer.h"
39 #include "cores/PlayerCoreFactory.h"
40 #include "PlayListPlayer.h"
41 #if !defined(_WIN32) && defined(HAS_DVD_DRIVE)
42 #include "DetectDVDType.h"
43 #endif
44 #include "Autorun.h"
45 #include "Bookmark.h"
46 #include "utils/Stopwatch.h"
47 #include "ApplicationMessenger.h"
48 #include "utils/Network.h"
49 #include "utils/CharsetConverter.h"
50 #ifdef HAS_PERFORMANCE_SAMPLE
51 #include "utils/PerformanceStats.h"
52 #endif
53 #ifdef _LINUX
54 #include "linux/LinuxResourceCounter.h"
55 #endif
56 #ifdef _WIN32
57 #include "WIN32Util.h"
58 #endif
59 #include "XBMC_events.h"
60 #include "utils/Thread.h"
61
62 #ifdef HAS_SDL
63 #include <SDL/SDL_mutex.h>
64 #endif
65
66 class CWebServer;
67 class CXBFileZilla;
68 class CSNTPClient;
69 class CKaraokeLyricsManager;
70 class CApplicationMessenger;
71 class DPMSSupport;
72 class CProfile;
73 class CSplash;
74
75 class CBackgroundPlayer : public CThread
76 {
77 public:
78   CBackgroundPlayer(const CFileItem &item, int iPlayList);
79   virtual ~CBackgroundPlayer();
80   virtual void Process();
81 protected:
82   CFileItem *m_item;
83   int       m_iPlayList;
84 };
85
86 class CApplication : public CXBApplicationEx, public IPlayerCallback, public IMsgTargetCallback
87 {
88 public:
89   CApplication(void);
90   virtual ~CApplication(void);
91   virtual HRESULT Initialize();
92   virtual void FrameMove();
93   virtual void Render();
94   virtual void DoRender();
95   virtual void RenderNoPresent();
96   virtual void Preflight();
97   virtual HRESULT Create(HWND hWnd);
98   virtual HRESULT Cleanup();
99
100   void StartServices();
101   void StopServices();
102   void StartWebServer();
103   void StopWebServer();
104   void StartFtpServer();
105   void StopFtpServer();
106   void StartTimeServer();
107   void StopTimeServer();
108   void StartUPnP();
109   void StopUPnP();
110   void StartUPnPRenderer();
111   void StopUPnPRenderer();
112   void StartUPnPClient();
113   void StopUPnPClient();
114   void StartUPnPServer();
115   void StopUPnPServer();
116   void StartEventServer();
117   bool StopEventServer(bool promptuser=false);
118   void RefreshEventServer();
119   void StartDbusServer();
120   bool StopDbusServer(bool bWait);
121   void StartZeroconf();
122   void StopZeroconf();
123   void DimLCDOnPlayback(bool dim);
124   bool IsCurrentThread() const;
125   void Stop();
126   void RestartApp();
127   void LoadSkin(const CStdString& strSkin);
128   void UnloadSkin();
129   bool LoadUserWindows(const CStdString& strSkinPath);
130   void DelayLoadSkin();
131   void CancelDelayLoadSkin();
132   void ReloadSkin();
133   const CStdString& CurrentFile();
134   CFileItem& CurrentFileItem();
135   virtual bool OnMessage(CGUIMessage& message);
136   PLAYERCOREID GetCurrentPlayer();
137   virtual void OnPlayBackEnded();
138   virtual void OnPlayBackStarted();
139   virtual void OnPlayBackStopped();
140   virtual void OnQueueNextItem();
141   bool PlayMedia(const CFileItem& item, int iPlaylist = PLAYLIST_MUSIC);
142   bool PlayMediaSync(const CFileItem& item, int iPlaylist = PLAYLIST_MUSIC);
143   bool ProcessAndStartPlaylist(const CStdString& strPlayList, PLAYLIST::CPlayList& playlist, int iPlaylist);
144   bool PlayFile(const CFileItem& item, bool bRestart = false);
145   void SaveFileState();
146   void UpdateFileState();
147   void StopPlaying();
148   void Restart(bool bSamePosition = true);
149   void DelayedPlayerRestart();
150   void CheckDelayedPlayerRestart();
151   void RenderFullScreen();
152   void DoRenderFullScreen();
153   bool NeedRenderFullScreen();
154   bool IsPlaying() const;
155   bool IsPaused() const;
156   bool IsPlayingAudio() const;
157   bool IsPlayingVideo() const;
158   bool IsPlayingFullScreenVideo() const;
159   bool IsStartingPlayback() const { return m_bPlaybackStarting; }
160   bool OnKey(CKey& key);
161   bool OnAction(CAction &action);
162   void RenderMemoryStatus();
163   void CheckShutdown();
164   // Checks whether the screensaver and / or DPMS should become active.
165   void CheckScreenSaverAndDPMS();
166   void CheckPlayingProgress();
167   void CheckAudioScrobblerStatus();
168   void ActivateScreenSaver(bool forceType = false);
169
170   virtual void Process();
171   void ProcessSlow();
172   void ResetScreenSaver();
173   int GetVolume() const;
174   void SetVolume(int iPercent);
175   void Mute(void);
176   int GetPlaySpeed() const;
177   int GetSubtitleDelay() const;
178   int GetAudioDelay() const;
179   void SetPlaySpeed(int iSpeed);
180   void ResetScreenSaverTimer();
181   // Wakes up from the screensaver and / or DPMS. Returns true if woken up.
182   bool WakeUpScreenSaverAndDPMS();
183   bool WakeUpScreenSaver();
184   double GetTotalTime() const;
185   double GetTime() const;
186   float GetPercentage() const;
187   void SeekPercentage(float percent);
188   void SeekTime( double dTime = 0.0 );
189   void ResetPlayTime();
190
191   void SaveMusicScanSettings();
192   void RestoreMusicScanSettings();
193   void CheckMusicPlaylist();
194
195   bool ExecuteXBMCAction(std::string action);
196   bool ExecuteAction(CGUIActionDescriptor action);
197
198   static bool OnEvent(XBMC_Event& newEvent);
199   
200
201   CApplicationMessenger& getApplicationMessenger();
202 #if defined(HAS_LINUX_NETWORK)
203   CNetworkLinux& getNetwork();
204 #elif defined(HAS_WIN32_NETWORK)
205   CNetworkWin32& getNetwork();
206 #else
207   CNetwork& getNetwork();
208 #endif
209 #ifdef HAS_PERFORMANCE_SAMPLE
210   CPerformanceStats &GetPerformanceStats();
211 #endif
212
213   CGUIDialogVolumeBar m_guiDialogVolumeBar;
214   CGUIDialogSeekBar m_guiDialogSeekBar;
215   CGUIDialogKaiToast m_guiDialogKaiToast;
216   CGUIDialogMuteBug m_guiDialogMuteBug;
217   CGUIWindowPointer m_guiPointer;
218
219 #ifdef HAS_DVD_DRIVE  
220   MEDIA_DETECT::CAutorun m_Autorun;
221 #endif
222   
223 #if !defined(_WIN32) && defined(HAS_DVD_DRIVE)
224   MEDIA_DETECT::CDetectDVDMedia m_DetectDVDType;
225 #endif
226   CSNTPClient *m_psntpClient;
227   CWebServer* m_pWebServer;
228   CXBFileZilla* m_pFileZilla;
229   IPlayer* m_pPlayer;
230
231   inline bool IsInScreenSaver() { return m_bScreenSave; };
232   int m_iScreenSaveLock; // spiff: are we checking for a lock? if so, ignore the screensaver state, if -1 we have failed to input locks
233
234   DWORD m_dwSkinTime;
235   bool m_bIsPaused;
236   bool m_bPlaybackStarting;
237
238   CKaraokeLyricsManager* m_pKaraokeMgr;
239
240   PLAYERCOREID m_eForcedNextPlayer;
241   CStdString m_strPlayListFile;
242
243   int GlobalIdleTime();
244   void NewFrame();
245   bool WaitFrame(DWORD timeout);
246
247   void EnablePlatformDirectories(bool enable=true)
248   {
249     m_bPlatformDirectories = enable;
250   }
251
252   bool PlatformDirectoriesEnabled()
253   {
254     return m_bPlatformDirectories;
255   }
256
257   void SetStandAlone(bool value)
258   {
259     m_bStandalone = value;
260   }
261
262   bool IsStandAlone()
263   {
264     return m_bStandalone;
265   }
266
267   void SetEnableLegacyRes(bool value)
268   {
269     m_bEnableLegacyRes = value;
270   }
271
272   bool IsEnableLegacyRes()
273   {
274     return m_bEnableLegacyRes;
275   }
276
277   bool IsPresentFrame();
278
279   void Minimize(bool minimize = true);
280
281   bool m_bRunResumeJobs;
282
283 protected:
284   void RenderScreenSaver();
285
286   friend class CApplicationMessenger;
287   // screensaver
288   bool m_bScreenSave;
289   CStdString m_screenSaverMode;
290
291   // timer information
292   CStopWatch m_idleTimer;
293   CStopWatch m_restartPlayerTimer;
294   CStopWatch m_frameTime;
295   CStopWatch m_navigationTimer;
296   CStopWatch m_slowTimer;
297   CStopWatch m_screenSaverTimer;
298   CStopWatch m_shutdownTimer;
299
300   DPMSSupport* m_dpms;
301   bool m_dpmsIsActive;
302
303   CFileItemPtr m_itemCurrentFile;
304   CFileItemList* m_currentStack;
305   CStdString m_prevMedia;
306   CSplash* m_splash;
307   ThreadIdentifier m_threadID;       // application thread ID.  Used in applicationMessanger to know where we are firing a thread with delay from.
308   PLAYERCOREID m_eCurrentPlayer;
309   bool m_bXboxMediacenterLoaded;
310   bool m_bSettingsLoaded;
311   bool m_bAllSettingsLoaded;
312   bool m_bInitializing;
313   bool m_bPlatformDirectories;
314
315   CBookmark m_progressTrackingVideoResumeBookmark;
316   CFileItemPtr m_progressTrackingItem;
317   bool m_progressTrackingPlayCountUpdate;
318
319   int m_iPlaySpeed;
320   int m_currentStackPosition;
321   int m_nextPlaylistItem;
322
323   bool m_bPresentFrame;
324
325   bool m_bStandalone;
326   bool m_bEnableLegacyRes;
327   bool m_bWasFullScreenBeforeMinimize;
328
329 #ifdef HAS_SDL
330   int        m_frameCount;
331   SDL_mutex* m_frameMutex;
332   SDL_cond*  m_frameCond;
333 #endif
334
335   void SetHardwareVolume(long hardwareVolume);
336   void UpdateLCD();
337   void FatalErrorHandler(bool WindowSystemInitialized, bool MapDrives, bool InitNetwork);
338
339   bool PlayStack(const CFileItem& item, bool bRestart);
340   bool SwitchToFullScreen();
341   bool ProcessMouse();
342   bool ProcessHTTPApiButtons();
343   bool ProcessKeyboard();
344   bool ProcessRemote(float frameTime);
345   bool ProcessGamepad(float frameTime);
346   bool ProcessEventServer(float frameTime);
347
348   bool ProcessJoystickEvent(const std::string& joystickName, int button, bool isAxis, float fAmount);
349
350   void StartFtpEmergencyRecoveryMode();
351   float NavigationIdleTime();
352   void CheckForTitleChange();
353   static bool AlwaysProcess(const CAction& action);
354
355   void SaveCurrentFileSettings();
356
357   CProfile* InitDirectoriesLinux();
358   CProfile* InitDirectoriesOSX();
359   CProfile* InitDirectoriesWin32();
360
361   CApplicationMessenger m_applicationMessenger;
362 #if defined(HAS_LINUX_NETWORK)
363   CNetworkLinux m_network;
364 #elif defined(HAS_WIN32_NETWORK)
365   CNetworkWin32 m_network;
366 #else
367   CNetwork    m_network;
368 #endif
369 #ifdef HAS_PERFORMANCE_SAMPLE
370   CPerformanceStats m_perfStats;
371 #endif
372 #ifdef _LINUX
373   CLinuxResourceCounter m_resourceCounter;
374 #endif
375
376 #ifdef HAS_EVENT_SERVER
377   std::map<std::string, std::map<int, float> > m_lastAxisMap;
378 #endif
379 #ifdef _WIN32
380   CWIN32Util::SystemParams::SysParam *m_SSysParam;
381 #endif
382 };
383
384 extern CApplication g_application;
385 extern CStdString g_LoadErrorStr;