vbasernd.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:16k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: vbasernd.cpp,v 1.5.24.2 2004/07/09 12:53:26 pankajgupta Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. // include
  50. #include "hxtypes.h"
  51. #include "hxwintyp.h"
  52. #include "hxcom.h"
  53. #include "hxassert.h"
  54. #ifdef _WINDOWS
  55. #include <windows.h>
  56. #include "resource.h"
  57. #elif defined(_UNIX) && defined(USE_XWINDOWS)
  58. #include <X11/cursorfont.h>
  59. #include <X11/Intrinsic.h>
  60. #elif defined(_MACINTOSH) || defined(_MAC_UNIX)
  61. #include <ctype.h>
  62. #include "platform/mac/cresload.h"
  63. extern FSSpec g_DLLFSpec;
  64. //CResourceLoader* CResourceLoader::zm_theResourceLoader = NULL;
  65. #endif
  66. #include "hxcomm.h"
  67. #include "ihxpckts.h"
  68. #include "hxhyper.h"
  69. #include "hxupgrd.h"
  70. #include "hxprefs.h"
  71. #include "hxplugn.h"
  72. #include "hxengin.h"
  73. #include "hxrendr.h"
  74. #include "hxwin.h"
  75. #include "hxmon.h"
  76. #include "hxcore.h"
  77. #include "hxasm.h"
  78. #include "hxvsurf.h"
  79. #include "hxevent.h"
  80. #include "hxerror.h"
  81. // pncont
  82. #include "hxbuffer.h"
  83. // pnmisc
  84. #include "unkimp.h"
  85. #include "baseobj.h"
  86. // baserend
  87. #include "baserend.h"
  88. #include "vbasernd.h"
  89. #ifdef _WINDOWS
  90. extern HINSTANCE g_hInstance;
  91. #endif
  92. CRNVisualBaseRenderer::CRNVisualBaseRenderer()
  93.     : CRNBaseRenderer()
  94. {
  95.     m_cWindowSize.cx        = 0;
  96.     m_cWindowSize.cy        = 0;
  97.     m_pMISUS                = NULL;
  98.     m_pSite                 = NULL;
  99.     m_pStatusMessage        = NULL;
  100.     m_sOldMouseX            = -1;
  101.     m_sOldMouseY            = -1;
  102.     m_bStatusMsgWillNeedErasing = FALSE;
  103.     m_bSetHyperlinkCursor   = FALSE;
  104. #if defined(_WINDOWS)
  105.     m_hPreHyperlinkCursor   = NULL;
  106.     m_hHyperlinkCursor      = NULL;
  107. #elif defined(_MACINTOSH)
  108.     const short HAND_CURSOR = 1313;
  109.     m_eCurrentCursor        = CURSOR_ARROW;
  110.     m_pResourceLoader = CResourceLoader::CreateInstance(g_DLLFSpec);
  111.     m_hHyperlinkCursor = (CursHandle)m_pResourceLoader->LoadResource('CURS', HAND_CURSOR);
  112. #elif defined(_UNIX) && defined(USE_XWINDOWS)
  113.     m_pDisplay             = 0;
  114.     m_Window               = 0;
  115.     m_hHyperlinkCursor     = 0;
  116.     m_hCurrentCursor       = 0;
  117. #endif
  118. }
  119. CRNVisualBaseRenderer::~CRNVisualBaseRenderer()
  120. {
  121.     HX_RELEASE(m_pMISUS);
  122.     HX_RELEASE(m_pSite);
  123.     HX_RELEASE(m_pStatusMessage);
  124. #if defined(_MACINTOSH)
  125.     if (m_hHyperlinkCursor)
  126.     {
  127.      m_pResourceLoader->UnloadResource((Handle)m_hHyperlinkCursor);
  128.      m_hHyperlinkCursor = NULL;
  129.     
  130.      HX_RELEASE(m_pResourceLoader);
  131.     }
  132. #endif
  133. #if defined(_UNIX) && defined(USE_XWINDOWS)
  134.     if (m_pDisplay && m_hHyperlinkCursor)
  135.     {
  136. XLockDisplay(m_pDisplay);
  137. XFreeCursor(m_pDisplay, m_hHyperlinkCursor);
  138. XUnlockDisplay(m_pDisplay);
  139. m_hHyperlinkCursor = 0;
  140.     }
  141. #endif    
  142. }
  143. STDMETHODIMP CRNVisualBaseRenderer::QueryInterface(REFIID riid, void** ppvObj)
  144. {
  145.     HX_RESULT retVal = HXR_OK;
  146.     if (ppvObj)
  147.     {
  148.         // Set default
  149.         *ppvObj = NULL;
  150.         // Check for IID type
  151.         if (IsEqualIID(riid, IID_IHXSiteUser))
  152.         {
  153.             AddRef();
  154.             *ppvObj = (IHXSiteUser*) this;
  155.         }
  156.         else if (IsEqualIID(riid, IID_IHXSiteUserSupplier))
  157.         {
  158.             if (m_pMISUS)
  159.             {
  160.                 return m_pMISUS->QueryInterface(IID_IHXSiteUserSupplier, ppvObj);
  161.             }
  162.             else
  163.             {
  164.                 retVal = HXR_UNEXPECTED;
  165.             }
  166.         }
  167.         else
  168.         {
  169.             // If we don't support it, then QI our
  170.             // base class for this interface
  171.             retVal = CRNBaseRenderer::QueryInterface(riid, ppvObj);
  172.         }
  173.     }
  174.     else
  175.     {
  176.         retVal = HXR_FAIL;
  177.     }
  178.     return retVal;
  179. }
  180. STDMETHODIMP_(UINT32) CRNVisualBaseRenderer::AddRef()
  181. {
  182.     return CRNBaseRenderer::AddRef();
  183. }
  184. STDMETHODIMP_(UINT32) CRNVisualBaseRenderer::Release()
  185. {
  186.     return CRNBaseRenderer::Release();
  187. }
  188. STDMETHODIMP CRNVisualBaseRenderer::InitPlugin(IUnknown *pContext)
  189. {
  190.     HX_RESULT retVal = CRNBaseRenderer::InitPlugin(pContext);
  191.     if (SUCCEEDED(retVal))
  192.     {
  193.         // Now we need to get IHXStatusMessage - OK if TLC doesn't support it
  194.         HX_RELEASE(m_pStatusMessage);
  195.         pContext->QueryInterface(IID_IHXStatusMessage, (void**) &m_pStatusMessage);
  196.     }
  197.     return retVal;
  198. }
  199. STDMETHODIMP CRNVisualBaseRenderer::StartStream(IHXStream* pStream, IHXPlayer* pPlayer)
  200. {
  201.     HX_RESULT retVal   = HXR_OK;
  202.     // Call the super-class's StartStream()
  203.     retVal = CRNBaseRenderer::StartStream(pStream, pPlayer);
  204. #if defined (HELIX_FEATURE_MISU)
  205.     if (SUCCEEDED(retVal))
  206.     {
  207.         // Create a IHXMultiInstanceSiteUserSupplier interface
  208.         HX_RELEASE(m_pMISUS);
  209.         retVal = m_pCommonClassFactory->CreateInstance(CLSID_IHXMultiInstanceSiteUserSupplier,
  210.                                                        (void**) &m_pMISUS);
  211.         if (SUCCEEDED(retVal))
  212.         {
  213.             // Register ourselves as a site user
  214.             retVal = m_pMISUS->SetSingleSiteUser((IUnknown*) (IHXSiteUser*) this);
  215.         }
  216.     }
  217. #endif
  218.     // Clean up the state if there was an error
  219.     if (FAILED(retVal))
  220.     {
  221.         HX_RELEASE(m_pStream);
  222.         HX_RELEASE(m_pPlayer);
  223.         HX_RELEASE(m_pBackChannel);
  224.         HX_RELEASE(m_pASMStream);
  225.         HX_RELEASE(m_pMISUS);
  226.     }
  227.     return retVal;
  228. }
  229. STDMETHODIMP CRNVisualBaseRenderer::AttachSite(IHXSite *pSite)
  230. {
  231.     HX_RESULT retVal = HXR_OK;
  232.     if (pSite)
  233.     {
  234.         // Check to see if we alredy have a site interface
  235.         if (!m_pSite)
  236.         {
  237.             // Save a copy of the IHXSite interface
  238.             m_pSite = pSite;
  239.             m_pSite->AddRef();
  240.             // Get the window size from the sub-class
  241.             retVal = GetWindowSize(m_cWindowSize);
  242.             if (SUCCEEDED(retVal))
  243.             {
  244.                 // Inform the site of our size
  245.                 retVal = m_pSite->SetSize(m_cWindowSize);
  246.             }
  247.             //Give sub class a change to set up site.
  248.             _AttachSite();
  249.         }
  250.         else
  251.         {
  252.             retVal = HXR_UNEXPECTED;
  253.         }
  254.     }
  255.     else
  256.     {
  257.         retVal = HXR_FAIL;
  258.     }
  259.     if (FAILED(retVal))
  260.     {
  261.         HX_RELEASE(m_pSite);
  262.     }
  263.     return retVal;
  264. }
  265. STDMETHODIMP CRNVisualBaseRenderer::DetachSite()
  266. {
  267.     // Release our IHXSite interface
  268.     HX_RELEASE(m_pSite);
  269.     // Now we're done with the MISUS
  270.     if (m_pMISUS)
  271.     {
  272.         m_pMISUS->ReleaseSingleSiteUser();
  273.     }
  274.     HX_RELEASE(m_pMISUS);
  275.     return HXR_OK;
  276. }
  277. HX_RESULT CRNVisualBaseRenderer::RMASurfaceUpdate2(IHXSubRectVideoSurface* pSurface,
  278.                                                    HXxRect*                 pExtents,
  279.                                                    HXxBoxRegion*              pDirtyRegion)
  280. {
  281.     //Base impl. Should never be called except by those renderers that
  282.     //subscribe to the sub rect messages and implemnet this themselves.
  283.     HX_ASSERT( "Should Never be called."==NULL );
  284.     return HXR_OK;
  285. }
  286. STDMETHODIMP CRNVisualBaseRenderer::HandleEvent(HXxEvent *pEvent)
  287. {
  288.     // Check for input error
  289.     if (!pEvent)
  290.     {
  291.         return HXR_FAIL;
  292.     }
  293.     // Set the defaults
  294.     pEvent->handled = FALSE;
  295.     pEvent->result  = 0;
  296.     switch (pEvent->event)
  297.     {
  298.        case HX_SURFACE_UPDATE2:
  299.        {
  300.            
  301.            HXxExposeInfo* pExpose = (HXxExposeInfo*)pEvent->param2;
  302.            IHXSubRectVideoSurface *pSurface = (IHXSubRectVideoSurface*) (pEvent->param1);
  303.            if (pSurface)
  304.            {
  305.                pSurface->AddRef();
  306.                RMASurfaceUpdate2(pSurface, &pExpose->extents, pExpose->pRegion);
  307.                HX_RELEASE(pSurface);
  308.            }
  309.            pEvent->handled = TRUE;           
  310.        }
  311.        break;
  312.            
  313.        case HX_SURFACE_UPDATE:
  314.        {
  315.             IHXVideoSurface *pSurface = (IHXVideoSurface *) (pEvent->param1);
  316.             if (pSurface)
  317.             {
  318.                 pSurface->AddRef();
  319.                 RMASurfaceUpdate(pSurface);
  320.                 HX_RELEASE(pSurface);
  321.             }
  322. #if defined(_UNIX) && defined(USE_XWINDOWS)
  323.     //
  324.     // Create a "hand" cursor for hyperlinks
  325.     //
  326.     {
  327. //
  328. // free previously allocated cursor
  329. //
  330. if (m_pDisplay && m_hHyperlinkCursor)
  331. {
  332.     XLockDisplay(m_pDisplay);
  333.     XFreeCursor(m_pDisplay, m_hHyperlinkCursor);
  334.     XUnlockDisplay(m_pDisplay);
  335.     m_hHyperlinkCursor = 0;
  336. }
  337. // 
  338. // get new display/window parameters and 
  339. // allocate a new cursor
  340. //
  341. HXxWindow *pWnd = (HXxWindow*)pEvent->param2;
  342. m_pDisplay = (Display*)pWnd->display;
  343. m_Window = (Window)pWnd->window;
  344. if (m_pDisplay)
  345.     m_hHyperlinkCursor = XCreateFontCursor(m_pDisplay, XC_hand2);
  346.     }     
  347. #endif
  348.             pEvent->handled = TRUE;
  349.         }
  350.         break;
  351.         case HX_MOUSE_ENTER:
  352.         case HX_MOUSE_LEAVE:
  353.         case HX_MOUSE_MOVE:
  354.         {
  355.             HXxPoint* mousePt = (HXxPoint*) pEvent->param1;
  356.             OnMouseMove(0, (INT16) mousePt->x, (INT16) mousePt->y);
  357.             pEvent->handled = TRUE;
  358.         }
  359.         break;
  360.         case HX_PRIMARY_BUTTON_UP:
  361.         {
  362.             HXxPoint* mousePt = (HXxPoint*) pEvent->param1;
  363.             HandleClick((INT16) mousePt->x, (INT16) mousePt->y);
  364.             pEvent->handled = TRUE;
  365.         }
  366.         break;
  367. #ifdef _WINDOWS
  368.         case WM_SETCURSOR:
  369.         {
  370.             if(m_bSetHyperlinkCursor)
  371.             {
  372.                 pEvent->handled       = TRUE;
  373.                 m_hPreHyperlinkCursor = SetCursor(m_hHyperlinkCursor);
  374.             }
  375.             else
  376.             {
  377.                 // pngui will handle the setting of the cursor (back to arrow cursor)
  378.                 pEvent->handled       = FALSE;
  379.             }
  380.         }
  381.         break;
  382. #endif
  383.         default:
  384.             break;
  385.     }
  386.     return HXR_OK;
  387. }
  388. STDMETHODIMP_(BOOL) CRNVisualBaseRenderer::NeedsWindowedSites()
  389. {
  390.     return FALSE;
  391. }
  392. STDMETHODIMP CRNVisualBaseRenderer::OnMouseMove(INT16 fwKeys, INT16 xPos, INT16 yPos)
  393. {
  394.     // Make sure we're up and running
  395.     if (!m_pPlayer)
  396.     {
  397.         return HXR_OK;
  398.     }
  399.     // Don't do anything if the x/y coordinates have changed from the
  400.     // last call to OnMouseMove - this is needed because the call to
  401.     // IHXStatusMessage::SetStatus() results in a WM_MOUSEMOVE event
  402.     if(xPos == m_sOldMouseX && yPos == m_sOldMouseY)
  403.     {
  404.         return HXR_OK;
  405.     }
  406.     m_sOldMouseX = xPos;
  407.     m_sOldMouseY = yPos;
  408. #if defined(_WINDOWS)
  409.     HCURSOR hCurrentCursor = GetCursor();
  410. #endif
  411.     // Find out from the sub-class if we're over an active hyperlink
  412.     IHXBuffer* pStatusStr     = NULL;
  413.     BOOL        bOverHyperlink = FALSE;
  414.     HX_RESULT   retVal         = IsMouseOverActiveLink(xPos, yPos, bOverHyperlink, pStatusStr);
  415.     if (FAILED(retVal))
  416.     {
  417.         return retVal;
  418.     }
  419.     if (bOverHyperlink)
  420.     {
  421.         // Set the status bar
  422.         if (m_pStatusMessage)
  423.         {
  424.     m_bStatusMsgWillNeedErasing = TRUE;
  425.             m_pStatusMessage->SetStatus((const char*) pStatusStr->GetBuffer());
  426.         }
  427.         HX_RELEASE(pStatusStr);
  428.         // Set the cursor
  429. #if defined(_WINDOWS)
  430.         if(!m_hHyperlinkCursor)
  431.         {
  432.             m_hHyperlinkCursor = LoadCursor(g_hInstance, MAKEINTRESOURCE(HANDCURSOR));
  433.             if(!m_hHyperlinkCursor)
  434.             {
  435.                 m_hHyperlinkCursor = LoadCursor(NULL, IDC_UPARROW);
  436.             }
  437.         }
  438.         if(m_hHyperlinkCursor && hCurrentCursor != m_hHyperlinkCursor)
  439.         {
  440.             // We're over a link and the cursor is NOT already the hyperlink cursor,
  441.             // so change it. This will happen when we get a WM_SETCURSOR event
  442.             m_bSetHyperlinkCursor = TRUE;
  443.         }
  444. #elif defined(_MACINTOSH)
  445.         if (m_hHyperlinkCursor)
  446.         {
  447.             ::SetCursor(*m_hHyperlinkCursor);
  448.             m_eCurrentCursor = CURSOR_HYPERLINK;
  449.         }
  450. #elif defined(_UNIX) && defined(USE_XWINDOWS)
  451. if (m_pDisplay && m_hCurrentCursor != m_hHyperlinkCursor)
  452. {
  453.     XLockDisplay(m_pDisplay);
  454.     XDefineCursor(m_pDisplay, m_Window, m_hHyperlinkCursor);
  455.     XUnlockDisplay(m_pDisplay);
  456.     m_hCurrentCursor = m_hHyperlinkCursor;
  457. }
  458. #endif
  459.     }
  460.     else // if (bOverHyperlink)
  461.     {
  462.         // Clear the status bar
  463. if (m_pStatusMessage  &&
  464. // /Fixes PR 65008 (JPG, PNG versions): only set this to NULL
  465. // if we have recently set the status message, otherwise we
  466. // may cause SMIL's setting of the status message to be
  467. // overwritten with NULL, i.e., erased:
  468. m_bStatusMsgWillNeedErasing)
  469. {
  470.     m_bStatusMsgWillNeedErasing = FALSE;
  471.             m_pStatusMessage->SetStatus(NULL);
  472.         }
  473.         // Reset the cursor
  474. #if defined(_WINDOWS)
  475.         if(hCurrentCursor == m_hHyperlinkCursor)
  476.         {
  477.             // We are not over a hyperlink and out cursor IS the hyperlink cursor,
  478.             // so we need to change it back. This will happen when we get a WM_SETCURSOR event
  479.             m_bSetHyperlinkCursor = FALSE;
  480.         }
  481. #elif defined(_MACINTOSH)
  482.         if (m_eCurrentCursor == CURSOR_HYPERLINK)
  483.         {
  484.             ::InitCursor();
  485.             m_eCurrentCursor = CURSOR_ARROW;
  486.         }
  487. #elif defined(_UNIX) && defined(USE_XWINDOWS)
  488. if (m_pDisplay && m_hCurrentCursor == m_hHyperlinkCursor)
  489. {
  490.     XLockDisplay(m_pDisplay);
  491.     XUndefineCursor(m_pDisplay, m_Window);
  492.     XUnlockDisplay(m_pDisplay);
  493.     m_hCurrentCursor = 0;
  494. }
  495. #endif
  496.     }
  497.     return HXR_OK;
  498. }
  499. BOOL CRNVisualBaseRenderer::_IsValidRendererSurface()
  500. {
  501.     return m_pSite!=NULL;
  502. }
  503. void CRNVisualBaseRenderer::_AttachSite()
  504. {
  505.     //Empty base impl.
  506. }