wcorecom.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:11k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hlxclib/windows.h"
  36. #include "hxcom.h"
  37. #include "hxtypes.h"
  38. #include "hxresult.h"
  39. #include "hxcomm.h"
  40. #include "ihxpckts.h"
  41. #include "hxcore.h"
  42. #include "hxcleng.h"
  43. #include "hxcorcom.h"
  44. #include "platform/win/wcorecom.h"
  45. #include <tchar.h>
  46. #include "hxheap.h"
  47. #ifdef _DEBUG
  48. #undef HX_THIS_FILE
  49. static const char HX_THIS_FILE[] = __FILE__;
  50. #endif
  51. #ifndef WIN32_PLATFORM_PSPC
  52. extern HINSTANCE g_hInstance;
  53. #else
  54. extern HMODULE g_hInstance;
  55. #endif
  56. #define CORECOMM_CLASS "HXEngineCommInternal"
  57. #define CORECOMM_NAME CORECOMM_CLASS
  58. #define CORECOMM_STOPAUDIOMSG "HXEngineStopAudioInternalMsg"
  59. #define CORECOMM_RELOADPLUGINS "HXEngineReloadPlugins"
  60. #define CORECOMM_UNLOADPLUGINS "HXEngineUnloadPlugins"
  61. #define OLDWND_CLASS "RealAudioInternal"
  62. UINT32 WinCoreComm::m_uStopAudioMsg = 0;
  63. UINT32 WinCoreComm::m_uUnloadPluginsMsg = 0;
  64. UINT32 WinCoreComm::m_uReloadPluginsMsg = 0;
  65. // --------------------------------------------------------------------------
  66. //  constructor
  67. // --------------------------------------------------------------------------
  68. WinCoreComm::WinCoreComm(HXClientEngine* pEngine)
  69.     : HXCoreComm(pEngine)
  70.     , m_hWnd(NULL)
  71.     , m_bReady(FALSE)
  72. #ifdef _WIN32
  73.     , m_ulOriginalThreadId(0)
  74. #endif /* _WIN32 */
  75. {
  76.     Init();
  77. }
  78. // --------------------------------------------------------------------------
  79. //  destructor
  80. // --------------------------------------------------------------------------
  81. WinCoreComm::~WinCoreComm()
  82. {
  83.     Shutdown();
  84. }
  85. // --------------------------------------------------------------------------
  86. //  StopAllOtherAudioPlayers
  87. //
  88. //  Stop the other players in all other processes.
  89. // --------------------------------------------------------------------------
  90. STDMETHODIMP
  91. WinCoreComm::StopAllOtherAudioPlayers()
  92. {
  93.     EnumAction ea;
  94.     ea.pComm = this;
  95.     ea.uAction = WCCACTION_STOPAUDIO;
  96.     EnumWindows((WNDENUMPROC)CoreCommEnumProc, (LPARAM)&ea);
  97.     return HXR_OK;
  98. }
  99. // --------------------------------------------------------------------------
  100. //  AskAllOtherPlayersToUnload
  101. //
  102. //  Asks players in all other processes to stop and then unload all of the
  103. //  DLLs not in use.
  104. // --------------------------------------------------------------------------
  105. STDMETHODIMP
  106. WinCoreComm::AskAllOtherPlayersToUnload()
  107. {
  108.     EnumAction ea;
  109.     ea.pComm = this;
  110.     ea.uAction = WCCACTION_UNLOADPLUGINS;
  111.     EnumWindows((WNDENUMPROC)CoreCommEnumProc, (LPARAM)&ea);
  112.     return HXR_OK;
  113. }
  114. // --------------------------------------------------------------------------
  115. //  AskAllOtherPlayersToReload
  116. //
  117. //  Asks players in all other processes to reload all DLLs
  118. // --------------------------------------------------------------------------
  119. STDMETHODIMP
  120. WinCoreComm::AskAllOtherPlayersToReload()
  121. {
  122.     EnumAction ea;
  123.     ea.pComm = this;
  124.     ea.uAction = WCCACTION_RELOADPLUGINS;
  125.     EnumWindows((WNDENUMPROC)CoreCommEnumProc, (LPARAM)&ea);
  126.     return HXR_OK;
  127. }
  128. // --------------------------------------------------------------------------
  129. //  Init
  130. //
  131. //  Register the window class, create a hidden window for callbacks.
  132. // --------------------------------------------------------------------------
  133. BOOL
  134. WinCoreComm::Init()
  135. {
  136.     if (!m_bReady && !m_hWnd)
  137.     {
  138. if (!m_uStopAudioMsg)
  139. {
  140.     m_uStopAudioMsg = RegisterWindowMessage(OS_STRING(CORECOMM_STOPAUDIOMSG));
  141.     if (!m_uStopAudioMsg)
  142.     {
  143. goto exit;
  144.     }
  145. }
  146. if (!m_uUnloadPluginsMsg)
  147. {
  148.     m_uUnloadPluginsMsg = RegisterWindowMessage(OS_STRING(CORECOMM_UNLOADPLUGINS));
  149.     if (!m_uUnloadPluginsMsg)
  150.     {
  151. goto exit;
  152.     }
  153. }
  154. if (!m_uReloadPluginsMsg)
  155. {
  156.     m_uReloadPluginsMsg = RegisterWindowMessage(OS_STRING(CORECOMM_RELOADPLUGINS));
  157.     if (!m_uReloadPluginsMsg)
  158.     {
  159. goto exit;
  160.     }
  161. }
  162. WNDCLASS wc;
  163. memset(&wc, 0, sizeof(WNDCLASS));
  164. wc.lpfnWndProc     = (WNDPROC)WinCoreComm::CoreCommWndProc;
  165. wc.hInstance     = g_hInstance;
  166. wc.lpszClassName    = TEXT(CORECOMM_CLASS);
  167. if (RegisterClass(&wc))
  168. {
  169.     m_hWnd = CreateWindow(OS_STRING(CORECOMM_CLASS),  // class name
  170.   OS_STRING(CORECOMM_NAME),   // window name
  171.   WS_POPUP,     // style
  172.   CW_USEDEFAULT,    // x
  173.   CW_USEDEFAULT,    // y
  174.   CW_USEDEFAULT,    // cx
  175.   CW_USEDEFAULT,    // cy
  176.   NULL,     // parent
  177.   NULL,     // menu
  178.   g_hInstance,     // instance
  179.   NULL);    // create params
  180. #ifdef _WIN32
  181.     m_ulOriginalThreadId = GetCurrentThreadId();
  182. #endif
  183. }
  184. if (m_hWnd)
  185. {
  186.     // Store a pointer to ourself within the Window
  187. #ifdef _WIN32     
  188.     SetWindowLong(m_hWnd, GWL_USERDATA, (LONG)this);
  189. #else
  190.     SetWindowLong(m_hWnd, DWL_USER, (LONG)this);
  191. #endif /* _WIN32 */
  192.     m_bReady = TRUE;
  193. }
  194.     }
  195. exit:
  196.     return m_bReady;
  197. }
  198. // --------------------------------------------------------------------------
  199. //  Shutdown
  200. //
  201. //  Close the window and unregister the window class.
  202. // --------------------------------------------------------------------------
  203. BOOL
  204. WinCoreComm::Shutdown()
  205. {
  206.     if (m_bReady)
  207.     {
  208. if (m_hWnd)
  209. {
  210. #ifdef _WIN32
  211.     if (m_ulOriginalThreadId == GetCurrentThreadId())
  212.     {
  213. DestroyWindow(m_hWnd);
  214.     }
  215.     else
  216.     {
  217. SendMessage(m_hWnd, WM_CLOSE, 0, 0);
  218.     }
  219. #else
  220.     DestroyWindow(m_hWnd);
  221. #endif
  222.     m_hWnd = NULL;
  223. }
  224. UnregisterClass(OS_STRING(CORECOMM_CLASS), g_hInstance);
  225. m_bReady = FALSE;
  226.     }
  227.     return TRUE;
  228. }
  229. // --------------------------------------------------------------------------
  230. //  CoreCommWndProc
  231. //
  232. //  Handle messages sent to the Core comm object from other Core comm 
  233. //  objects.
  234. // --------------------------------------------------------------------------
  235. LRESULT CALLBACK
  236. WinCoreComm::CoreCommWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  237. {
  238.     if (uMsg == m_uStopAudioMsg || uMsg == m_uUnloadPluginsMsg || 
  239. uMsg == m_uReloadPluginsMsg)
  240.     {
  241. // Retrieve a pointer to the WinCoreComm from the GWL_USER area
  242. #ifdef _WIN32
  243. WinCoreComm* pComm = (WinCoreComm*)GetWindowLong(hWnd, GWL_USERDATA);
  244. #else
  245. WinCoreComm* pComm = (WinCoreComm*)GetWindowLong(hWnd, DWL_USER);
  246. #endif /* _WIN32 */
  247. if (pComm)
  248. {
  249.     if (uMsg == m_uStopAudioMsg)
  250.     {
  251. return pComm->StopAudioPlayback();
  252.     }
  253.     if (uMsg == m_uUnloadPluginsMsg)
  254.     {
  255. return pComm->UnloadPlugins();
  256.     }
  257.     if (uMsg == m_uReloadPluginsMsg)
  258.     {
  259. return pComm->ReloadPlugins();
  260.     }
  261. }
  262.     }
  263.     else if (uMsg == WM_CLOSE)
  264.     {
  265. DestroyWindow(hWnd);
  266. return 0;
  267.     }
  268.     return DefWindowProc(hWnd, uMsg, wParam, lParam);
  269. }
  270. // --------------------------------------------------------------------------
  271. //  CoreCommEnumProc
  272. //
  273. //  Enumerate windows and look for PN internal Core and Core comm windows
  274. //  to communicate with.
  275. // --------------------------------------------------------------------------
  276. BOOL CALLBACK
  277. WinCoreComm::CoreCommEnumProc(HWND hWnd, LPARAM lParam)
  278. {
  279.     EnumAction* pEa = (EnumAction*)lParam;
  280.     // Enumerate until ProcessWindow tells us to stop
  281.     return pEa->pComm->ProcessWindow(hWnd, pEa->uAction);
  282. }
  283. // --------------------------------------------------------------------------
  284. //  ProcessWindow
  285. //
  286. //  Called by the CoreCommEnumProc to handle an individual window.
  287. // --------------------------------------------------------------------------
  288. BOOL
  289. WinCoreComm::ProcessWindow(HWND hWnd, UINT32 uAction)
  290. {
  291.     if (hWnd != m_hWnd)
  292.     {
  293. // Only tell windows other than ours to perform the action
  294. switch (uAction)
  295. {
  296.     case WCCACTION_STOPAUDIO:
  297.     {
  298. StopAudioWindow(hWnd);
  299.     }
  300.     break;
  301.     case WCCACTION_UNLOADPLUGINS:
  302.     {
  303. UnloadWindowPlugins(hWnd);
  304.     }
  305.     break;
  306.     case WCCACTION_RELOADPLUGINS:
  307.     {
  308. ReloadWindowPlugins(hWnd);
  309.     }
  310.     break;
  311. default:
  312.     // Unknown action- stop enumerating.
  313.     return FALSE;
  314. }
  315.     }
  316.     // keep enumerating
  317.     return TRUE;
  318. }
  319. // --------------------------------------------------------------------------
  320. //  StopAudioWindow
  321. //
  322. //  Called by the ProcessWindow handler to direct a window to stop using the
  323. //  audio.
  324. // --------------------------------------------------------------------------
  325. void
  326. WinCoreComm::StopAudioWindow(HWND hWnd)
  327. {
  328.     char pClassName[256]; /* Flawfinder: ignore */
  329.     if (GetClassName(hWnd, OS_STRING2(pClassName, 255), 255))
  330.     {
  331. if (!strcmp(pClassName, CORECOMM_CLASS))
  332. {
  333.     // A 6.0 engine
  334.     SendMessage(hWnd, m_uStopAudioMsg, 0, 0);
  335. }
  336. else if (!strcmp(pClassName, OLDWND_CLASS))
  337. {
  338.     // a 4.0 or 5.0 audio window
  339.     SendMessage(hWnd, PWM_RELEASE_AUDIO_DEVICE, 0, 0);
  340. }
  341.     }
  342. }
  343. // --------------------------------------------------------------------------
  344. //  UnloadPlugins
  345. //
  346. //  Called by the ProcessWindow handler to direct a window to stop and then 
  347. //  unload its plugins.
  348. // --------------------------------------------------------------------------
  349. void
  350. WinCoreComm::UnloadWindowPlugins(HWND hWnd)
  351. {
  352.     char pClassName[256]; /* Flawfinder: ignore */
  353.     if (GetClassName(hWnd, OS_STRING2(pClassName, 255), 255))
  354.     {
  355. if (!strcmp(pClassName, CORECOMM_CLASS))
  356. {
  357.     // A 6.0 engine
  358.     SendMessage(hWnd, m_uUnloadPluginsMsg, 0, 0);
  359. }
  360.     }
  361. }
  362. // --------------------------------------------------------------------------
  363. //  ReloadPlugins
  364. //
  365. //  Called by the ProcessWindow handler to direct a window to reload plugins.
  366. // --------------------------------------------------------------------------
  367. void
  368. WinCoreComm::ReloadWindowPlugins(HWND hWnd)
  369. {
  370.     char pClassName[256]; /* Flawfinder: ignore */
  371.     if (GetClassName(hWnd, OS_STRING2(pClassName, 255), 255))
  372.     {
  373. if (!strcmp(pClassName, CORECOMM_CLASS))
  374. {
  375.     // A 6.0 engine
  376.     SendMessage(hWnd, m_uReloadPluginsMsg, 0, 0);
  377. }
  378.     }
  379. }