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

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. // system
  36. // include
  37. #include "hxtypes.h"
  38. #include "hxwintyp.h"
  39. #include "hxcom.h"
  40. #include "hxengin.h"
  41. #include "smiltype.h"
  42. #include "hxvport.h"
  43. #include "hxcore.h"
  44. #include "hxclsnk.h"
  45. #include "hxgroup.h"
  46. #include "hxmmrkr.h"
  47. #include "ihxpckts.h"
  48. #include "hxsite2.h"
  49. #include "hxerror.h"
  50. // pncont
  51. #include "hxstring.h"
  52. #include "hxslist.h"
  53. // rmasmil
  54. #include "smlelem.h"
  55. // smlrendr
  56. #include "evnthook.h"
  57. #include "siteuser.h"
  58. #include "passivsw.h"
  59. #include "layout.h"
  60. #include "smcallbk.h"
  61. #include "hxinter.h" // smldoc.h dependency
  62. #include "smldoc.h"
  63. // pndebug
  64. #include "hxheap.h"
  65. #ifdef _DEBUG
  66. #undef HX_THIS_FILE
  67. static const char HX_THIS_FILE[] = __FILE__;
  68. #endif
  69. HandlePendingSchedulingCallback::HandlePendingSchedulingCallback()
  70. {
  71.     m_lRefCount             = 0;
  72.     m_pSmilDocumentRenderer = NULL;
  73.     m_PendingHandle         = 0;
  74.     m_bIsCallbackPending    = FALSE;
  75. }
  76. HandlePendingSchedulingCallback::~HandlePendingSchedulingCallback()
  77. {
  78. }
  79. STDMETHODIMP HandlePendingSchedulingCallback::QueryInterface(REFIID riid, void** ppvObj)
  80. {
  81.     HX_RESULT retVal = HXR_OK;
  82.     if (ppvObj)
  83.     {
  84.         if (IsEqualIID(riid, IID_IUnknown))
  85.         {
  86.             AddRef();
  87.             *ppvObj = this;
  88.         }
  89.         else if (IsEqualIID(riid, IID_IHXCallback))
  90.         {
  91.     AddRef();
  92.     *ppvObj = (IHXCallback*)this;
  93.         }
  94.         else
  95.         {
  96.             *ppvObj = NULL;
  97.             retVal  = HXR_NOINTERFACE;
  98.         }
  99.     }
  100.     else
  101.     {
  102.         retVal = HXR_FAIL;
  103.     }
  104.     return retVal;
  105. }
  106. STDMETHODIMP_(ULONG32) HandlePendingSchedulingCallback::AddRef()
  107. {
  108.     return InterlockedIncrement(&m_lRefCount);
  109. }
  110. STDMETHODIMP_(ULONG32) HandlePendingSchedulingCallback::Release()
  111. {
  112.     if (InterlockedDecrement(&m_lRefCount) > 0)
  113.     {
  114. return m_lRefCount;
  115.     }
  116.     delete this;
  117.     return 0;
  118. }
  119. STDMETHODIMP HandlePendingSchedulingCallback::Func(void)
  120. {
  121.     HX_RESULT retVal = HXR_OK;
  122.     m_PendingHandle      = 0;
  123.     m_bIsCallbackPending = FALSE;
  124.     if (m_pSmilDocumentRenderer)
  125.     {
  126. m_pSmilDocumentRenderer->handlePendingScheduling();
  127.     }
  128.     return retVal;
  129. }
  130. CHyperlinkCallback::CHyperlinkCallback(CSmilDocumentRenderer* pDocRend)
  131. {
  132.     m_lRefCount          = 0;
  133.     m_pDocRend           = pDocRend;
  134.     m_bIsCallbackPending = FALSE;
  135.     m_PendingHandle      = 0;
  136.     m_pAnchor            = NULL;
  137.     m_pExtraAnchorsList  = NULL;
  138. }
  139. CHyperlinkCallback::~CHyperlinkCallback()
  140. {
  141.     if (m_pExtraAnchorsList)
  142.     {
  143. HX_ASSERT(m_pExtraAnchorsList->GetCount() == 0);
  144. m_pExtraAnchorsList->RemoveAll();
  145. HX_DELETE(m_pExtraAnchorsList);
  146.     }
  147. }
  148. STDMETHODIMP CHyperlinkCallback::QueryInterface(REFIID riid, void** ppvObj)
  149. {
  150.     HX_RESULT retVal = HXR_OK;
  151.     if (ppvObj)
  152.     {
  153.         if (IsEqualIID(riid, IID_IUnknown))
  154.         {
  155.             AddRef();
  156.             *ppvObj = (IUnknown*) (IHXCallback*) this;
  157.         }
  158.         else if (IsEqualIID(riid, IID_IHXCallback))
  159.         {
  160.             AddRef();
  161.             *ppvObj = (IHXCallback*) this;
  162.         }
  163.         else
  164.         {
  165.             *ppvObj = NULL;
  166.             retVal  = HXR_NOINTERFACE;
  167.         }
  168.     }
  169.     else
  170.     {
  171.         retVal = HXR_FAIL;
  172.     }
  173.     return retVal;
  174. }
  175. STDMETHODIMP_(ULONG32) CHyperlinkCallback::AddRef()
  176. {
  177.     return InterlockedIncrement(&m_lRefCount);
  178. }
  179. STDMETHODIMP_(ULONG32) CHyperlinkCallback::Release()
  180. {
  181.     if (InterlockedDecrement(&m_lRefCount) > 0)
  182.     {
  183.         return m_lRefCount;
  184.     }
  185.     delete this;
  186.     return 0;
  187. }
  188. STDMETHODIMP CHyperlinkCallback::Func(void)
  189. {
  190.     HX_RESULT retVal = HXR_OK;
  191.     
  192.     m_PendingHandle      = 0;
  193.     m_bIsCallbackPending = FALSE;
  194.     if (m_pDocRend)
  195.     {
  196.         m_pDocRend->handleHyperlinkTraversal(m_pAnchor, TRUE);
  197. // /Allow for multiple simultaneous onLoad URLs to be fired after a
  198. // seek forward, related to fix for PR 67170 and PR 67536:
  199. // go through list of extra anchors, if any, and hurl them too:
  200. if (m_pExtraAnchorsList)
  201. {
  202.     LISTPOSITION lPos = m_pExtraAnchorsList->GetHeadPosition();
  203.     while (lPos)
  204.     {
  205. LISTPOSITION lPosOfCurTmpVal = lPos;
  206. // /Gets val at lPos and then moves lPos to next node in list:
  207. CSmilAAnchorElement* pNextAnchor = (CSmilAAnchorElement*)
  208. m_pExtraAnchorsList->GetNext(lPos);
  209. // /Remove it from the list so it won't hurl in next callback:
  210. m_pExtraAnchorsList->RemoveAt(lPosOfCurTmpVal);
  211. if (pNextAnchor)
  212. {
  213.     m_pDocRend->handleHyperlinkTraversal(pNextAnchor, TRUE);
  214. }
  215.     }
  216.     HX_DELETE(m_pExtraAnchorsList);
  217. }
  218.     }
  219.     return retVal;
  220. }
  221. HX_RESULT
  222. CHyperlinkCallback::AddAdditionalAnchor(CSmilAAnchorElement* pAnchor)
  223. {
  224.     HX_RESULT pnrslt = pAnchor? HXR_OK : HXR_INVALID_PARAMETER;
  225.     if (pAnchor)
  226.     {
  227. if (!m_pExtraAnchorsList)
  228. {
  229.     m_pExtraAnchorsList = new CHXSimpleList;
  230. }
  231. if (m_pExtraAnchorsList)
  232. {
  233.     m_pExtraAnchorsList->AddTail((void*)pAnchor);
  234. }
  235. else
  236. {
  237.     pnrslt = HXR_OUTOFMEMORY;
  238. }
  239.     }
  240.     return pnrslt;
  241. }
  242. HX_RESULT
  243. CHyperlinkCallback::ClearExtraAnchorList()
  244. {
  245.     HX_RESULT hxrslt = HXR_OK;
  246.     if (m_pExtraAnchorsList)
  247.     {
  248. LISTPOSITION lPos =
  249. m_pExtraAnchorsList->GetHeadPosition();
  250. while (lPos)
  251. {
  252.     LISTPOSITION lPosOfCurTmpVal = lPos;
  253.     CSmilAAnchorElement* pNextAnchor =
  254.     (CSmilAAnchorElement*)m_pExtraAnchorsList->GetNext(lPos);
  255.     // /Remove it from the list so it won't hurl:
  256.     m_pExtraAnchorsList->RemoveAt(lPosOfCurTmpVal);
  257. }
  258. HX_DELETE(m_pExtraAnchorsList);
  259.     }
  260.     return hxrslt;
  261. }