evnthook.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
  36. #include "hxtypes.h"
  37. #include "hxwintyp.h"
  38. #include "hxcom.h"
  39. #include "hxwin.h"
  40. #include "hxevent.h"
  41. // pncont
  42. #include "hxstring.h"
  43. #include "hxmap.h"
  44. // smlrendr
  45. #include "evnthook.h"
  46. // pndebug
  47. #include "debugout.h"
  48. #include "hxheap.h"
  49. #ifdef _DEBUG
  50. #undef HX_THIS_FILE
  51. static const char HX_THIS_FILE[] = __FILE__;
  52. #endif
  53. CSmilEventHook::CSmilEventHook(CSmilEventHookResponse* pResponse,
  54.                                const char*             pRegionName,
  55.                                const char*             pChannelName,
  56.                                BOOL                    bNoRegion,
  57.                                const char*             pszMediaID)
  58. {
  59.     m_lRefCount    = 0;
  60.     m_pResponse    = pResponse;
  61.     m_bNoRegion    = bNoRegion;
  62.     m_pSiteMap     = NULL;
  63.     m_pRegionName  = new CHXString(pRegionName);
  64.     HX_ASSERT(m_pRegionName);
  65.     m_pChannelName = new CHXString(pChannelName);
  66.     HX_ASSERT(m_pChannelName);
  67.     m_pMediaID     = new CHXString(pszMediaID);
  68.     HX_ASSERT(m_pMediaID);
  69.     if (m_pResponse)
  70.     {
  71.         m_pResponse->AddRef();
  72.     }
  73. }
  74. CSmilEventHook::~CSmilEventHook()
  75. {
  76.     HX_DELETE(m_pRegionName);
  77.     HX_DELETE(m_pChannelName);
  78.     HX_DELETE(m_pMediaID);
  79.     // Release the response interface
  80.     if (m_pResponse)
  81.     {
  82.         m_pResponse->Release();
  83.         m_pResponse = NULL;
  84.     }
  85.     // Release any remaining sites
  86.     if (m_pSiteMap)
  87.     {
  88.         POSITION pos = m_pSiteMap->GetStartPosition();
  89.         while (pos)
  90.         {
  91.             void* pKey = NULL;
  92.             void* pPtr = NULL;
  93.             m_pSiteMap->GetNextAssoc(pos, pKey, pPtr);
  94.             IHXSite* pSite = (IHXSite*) pKey;
  95.             HX_RELEASE(pSite);
  96.         }
  97.         m_pSiteMap->RemoveAll();
  98.     }
  99.     HX_DELETE(m_pSiteMap);
  100. }
  101. STDMETHODIMP CSmilEventHook::QueryInterface(REFIID riid, void** ppvObj)
  102. {
  103.     HX_RESULT retVal = HXR_OK;
  104.     if (ppvObj)
  105.     {
  106.         if(IsEqualIID(riid, IID_IUnknown))
  107.         {
  108.             AddRef();
  109.             *ppvObj = (IUnknown*) (IHXEventHook*) this;
  110.         }
  111.         else if(IsEqualIID(riid, IID_IHXEventHook))
  112.         {
  113.             AddRef();
  114.             *ppvObj = (IHXEventHook*) this;
  115.         }
  116.         else
  117.         {
  118.             *ppvObj = NULL;
  119.             retVal  = HXR_NOINTERFACE;
  120.         }
  121.     }
  122.     return retVal;
  123. }
  124. STDMETHODIMP_(ULONG32) CSmilEventHook::AddRef()
  125. {
  126.     return InterlockedIncrement(&m_lRefCount);
  127. }
  128. STDMETHODIMP_(ULONG32) CSmilEventHook::Release()
  129. {
  130.     if(InterlockedDecrement(&m_lRefCount) > 0)
  131.     {
  132.         return m_lRefCount;
  133.     }
  134.     delete this;
  135.     return 0;
  136. }
  137. STDMETHODIMP CSmilEventHook::HandleEvent(IHXSite* pSite, HXxEvent* pEvent)
  138. {
  139.     HX_RESULT rc = HXR_OK;
  140.     void* pVoid = NULL;
  141.     if(m_pResponse &&
  142.        m_pSiteMap &&
  143.        m_pSiteMap->Lookup((void*) pSite, pVoid))
  144.     {
  145.         switch(pEvent->event)
  146.         {
  147.             case HX_MOUSE_MOVE:
  148.             case HX_MOUSE_ENTER:
  149.             case HX_MOUSE_LEAVE:
  150.                 {
  151.     BOOL bIsMouseLeaveEvent =
  152.     (HX_MOUSE_LEAVE == pEvent->event);
  153.     BOOL bHandleSetCursor = FALSE;
  154.                     HXxPoint* mousePt = (HXxPoint*) pEvent->param1;
  155.                     rc = m_pResponse->HandleMouseMove(pEvent->window,
  156.                                                       GetRegionName(),
  157.                                                       GetMediaID(),
  158.                                                       (INT16) mousePt->x,
  159.                                                       (INT16) mousePt->y,
  160.       (UINT32)pEvent->event,
  161.       bHandleSetCursor);
  162.     // /In case we moved off of a hyperlink and onto an area
  163.     // not covered by media, we need to update the cursor:
  164.     if (bHandleSetCursor)
  165.     {
  166. m_pResponse->HandleSetCursor();
  167.     }
  168.                     if (SUCCEEDED(rc))
  169.                     {
  170.                         pEvent->handled = TRUE;
  171.                     }
  172.     // /Fixes PR 62047; if we return anything else, then the
  173.     // event doesn't get passed along to media, below, which
  174.     // it needs to in the case where we didn't handle this:
  175.     rc = HXR_OK;
  176.                 }
  177.                 break;
  178.             case HX_PRIMARY_BUTTON_UP:
  179.                 {
  180.                     HXxPoint* mousePt = (HXxPoint*) pEvent->param1;
  181.                     BOOL      bHandled = FALSE;
  182.                     rc = m_pResponse->HandleLButtonUp(GetRegionName(),
  183.                                                       GetMediaID(),
  184.                                                       (INT16) mousePt->x,
  185.                                                       (INT16) mousePt->y,
  186.                                                       bHandled);
  187.                     if (SUCCEEDED(rc))
  188.                     {
  189.                         pEvent->handled = bHandled;
  190.                     }
  191.     rc = HXR_OK; // /Fixes PR 62047 (see above).
  192.                 }
  193.                 break;
  194.             case HX_SET_FOCUS:
  195.                 {
  196.                     rc = m_pResponse->HandleGotFocus(GetRegionName(),
  197.                                                      GetMediaID());
  198.                     if (SUCCEEDED(rc))
  199.                     {
  200.                         pEvent->handled = TRUE;
  201.                     }
  202.                 }
  203.                 break;
  204.             case HX_LOSE_FOCUS:
  205.                 {
  206.                     rc = m_pResponse->HandleLostFocus(GetRegionName(),
  207.                                                       GetMediaID());
  208.                     if (SUCCEEDED(rc))
  209.                     {
  210.                         pEvent->handled = TRUE;
  211.                     }
  212.                 }
  213.                 break;
  214.                 // Translated key event (already accounts for shift+, CTRL+, etc.):            
  215. #if defined(_WINDOWS)
  216.                 // XXXEH- Old site implementation passes WM_CHAR message only;
  217.                 // we should remove this after HX_CHAR is being sent properly:
  218.                 // XXXMEH - Since we are going to stop claiming that
  219.                 // we handled keystrokes, then we need to only listen
  220.                 // on either WM_CHAR OR HX_CHAR, but not both. If we
  221.                 // were listening on both and not claiming that we 
  222.                 // handled the keystroke, then we would get both of
  223.                 // them and potentially try to start foo.accesskey()
  224.                 // elements twice. So we will only listen for HX_CHAR
  225. //            case WM_CHAR:
  226. #endif
  227.             case HX_CHAR:
  228.             {
  229.                 UINT16 uCharPressed = (UINT16) (UINT32)pEvent->param1;
  230.                 // XXXEH: TODO: Handle this: "The character is a single
  231.                 // character from [[ISO10646]]."
  232.                 rc = m_pResponse->HandleCharEvent(uCharPressed);
  233.                 if (SUCCEEDED(rc))
  234.                 {
  235.                     // XXXMEH - we will no longer claim that we handle
  236.                     // keystrokes. This will allow renderers such as 
  237.                     // flash to get the keystrokes for forms, etc.
  238.                     pEvent->handled = FALSE;
  239.                 }
  240. rc = HXR_OK; // /Fixes PR 62248 (see PR 62047 note, above).
  241.             }
  242.             break;
  243. #ifdef _WINDOWS
  244.             case WM_SETCURSOR:
  245.             {
  246.                 pEvent->handled = m_pResponse->HandleSetCursor();
  247.             }
  248.             break;
  249. #endif  
  250.             default:
  251.                 break;
  252.         }
  253.     }
  254.     return rc;
  255. }
  256. STDMETHODIMP CSmilEventHook::SiteAdded(IHXSite* pSite)
  257. {
  258.     HX_RESULT retVal = HXR_OK;
  259.     if (pSite)
  260.     {
  261.         // Create the site map if necessary
  262.         if (!m_pSiteMap)
  263.         {
  264.             m_pSiteMap = new CHXMapPtrToPtr();
  265.         }
  266.         if (m_pSiteMap)
  267.         {
  268.             // AddRef the site before adding it
  269.             pSite->AddRef();
  270.             // Add this site to the site map
  271.             m_pSiteMap->SetAt((void*) pSite, (void*) 0);
  272.             // Add how events if necessary
  273.             if(m_bNoRegion && m_pResponse)
  274.             {
  275.                 m_pResponse->AddShowEvents(GetRegionName(), pSite);
  276.             }
  277.         }
  278.         else
  279.         {
  280.             retVal = HXR_OUTOFMEMORY;
  281.         }
  282.     }
  283.     else
  284.     {
  285.         retVal = HXR_FAIL;
  286.     }
  287.     return retVal;
  288. }
  289. STDMETHODIMP CSmilEventHook::SiteRemoved(IHXSite* pSite)
  290. {
  291.     HX_RESULT retVal = HXR_OK;
  292.     // Check to see if this site is in the map
  293.     void* pVoid = NULL;
  294.     if (m_pSiteMap && m_pSiteMap->Lookup((void*) pSite, pVoid))
  295.     {
  296.         // Remove this site from the map
  297.         m_pSiteMap->RemoveKey((void*) pSite);
  298.         // Release our ref on the site
  299.         HX_RELEASE(pSite);
  300.     }
  301.     return retVal;
  302. }
  303. const char* CSmilEventHook::GetRegionName() const
  304. {
  305.     const char* pRet = NULL;
  306.     if (m_pRegionName)
  307.     {
  308.         pRet = (const char*) *m_pRegionName;
  309.     }
  310.     return pRet;
  311. }
  312. const char* CSmilEventHook::GetChannelName() const
  313. {
  314.     const char* pRet = NULL;
  315.     if (m_pChannelName)
  316.     {
  317.         pRet = (const char*) *m_pChannelName;
  318.     }
  319.     return pRet;
  320. }
  321. const char* CSmilEventHook::GetMediaID() const
  322. {
  323.     const char* pRet = NULL;
  324.     if (m_pMediaID)
  325.     {
  326.         pRet = (const char*) *m_pMediaID;
  327.     }
  328.     return pRet;
  329. }