qtbatom.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. /****************************************************************************
  36.  *  Includes
  37.  */
  38. #include "qtbatom.h"
  39. #include "mempager.h"
  40. /****************************************************************************
  41.  *  Class:
  42.  * CQTAtom
  43.  */
  44. /****************************************************************************
  45.  *  Constructors/Destructor
  46.  */
  47. CQTAtom::CQTAtom(void)
  48.     : m_ulOffset(0)
  49.     , m_ulSize(0)
  50.     , m_pParent(NULL)
  51.     , m_pChildList(NULL)
  52.     , m_pBuffer(NULL)
  53.     , m_pData(NULL)
  54.     , m_lRefCount(0)
  55. {
  56.     ;
  57. }
  58. CQTAtom::CQTAtom(ULONG32 ulOffset,
  59.  ULONG32 ulSize, 
  60.  CQTAtom *pParent)
  61.     : m_ulOffset(ulOffset)
  62.     , m_ulSize(ulSize)
  63.     , m_pParent(NULL)
  64.     , m_pChildList(NULL)
  65.     , m_pBuffer(NULL)
  66.     , m_pData(NULL)
  67.     , m_lRefCount(0)
  68. {
  69.     if (pParent != NULL)
  70.     {
  71. pParent->AddPresentChild(this);
  72.     }
  73. }
  74. CQTAtom::~CQTAtom()
  75. {
  76.     // Disown All children and release them
  77.     if (m_pChildList)
  78.     {
  79. CQTAtom *pChild;
  80. while (!m_pChildList->IsEmpty())
  81. {
  82.     pChild = (CQTAtom*) m_pChildList->RemoveHead();
  83.     pChild->m_pParent = NULL;
  84.     pChild->Release();
  85. }
  86. delete m_pChildList;
  87.     }
  88.     // If there is a parent, detach from it
  89.     if (m_pParent)
  90.     {
  91. LISTPOSITION SelfEntry;
  92. HX_ASSERT(m_pParent->m_pChildList);
  93. HX_ASSERT(!m_pParent->m_pChildList->IsEmpty());
  94. SelfEntry = m_pParent->m_pChildList->Find(this);
  95. HX_ASSERT(SelfEntry);
  96. m_pParent->m_pChildList->RemoveAt(SelfEntry);
  97.     }
  98.     HX_RELEASE(m_pBuffer);
  99. }
  100. /****************************************************************************
  101.  *  Access Functions
  102.  */
  103. void CQTAtom::SetBuffer(IHXBuffer *pBuffer)
  104. {
  105.     HX_RELEASE(m_pBuffer);
  106.     m_pData = NULL;
  107.     m_pBuffer = pBuffer;
  108.     if (pBuffer)
  109.     {
  110. pBuffer->AddRef();
  111. m_pData = pBuffer->GetBuffer();
  112.     }
  113. }
  114. HX_RESULT CQTAtom::AddPresentChild(CQTAtom *pChild)
  115. {
  116.     HX_ASSERT(pChild);
  117.     HX_ASSERT(!pChild->m_pParent);
  118.     if (m_pChildList == NULL)
  119.     {
  120. m_pChildList = new CHXSimpleList;
  121. if (m_pChildList == NULL)
  122. {
  123.     return HXR_OUTOFMEMORY;
  124. }
  125.     }
  126.     m_pChildList->AddTail(pChild);
  127.     pChild->m_pParent = this;
  128.     pChild->AddRef();
  129.     return HXR_OK;
  130. }
  131. CQTAtom* CQTAtom::GetPresentChild(UINT16 uChildIndex)
  132. {
  133.     if (m_pChildList != NULL)
  134.     {
  135. LISTPOSITION ListPosition = m_pChildList->FindIndex((int) uChildIndex);
  136. if (ListPosition != NULL)
  137. {
  138.     return (CQTAtom *) m_pChildList->GetAt(ListPosition);
  139. }
  140.     }
  141.     return NULL;
  142. }
  143. CQTAtom* CQTAtom::FindPresentChild(QTAtomType AtomType)
  144. {
  145.     UINT16 uChildIdx = 0;
  146.     UINT16 uChildCount = GetPresentChildCount();
  147.     LISTPOSITION CurrentPosition;
  148.     CQTAtom* pCurrentChild;
  149.     if (uChildCount > 0)
  150.     {
  151. CurrentPosition = m_pChildList->GetHeadPosition();
  152. do
  153. {
  154.     pCurrentChild = (CQTAtom*) m_pChildList->GetNext(CurrentPosition);
  155.     if (pCurrentChild->GetType() == AtomType)
  156.     {
  157. return pCurrentChild;
  158.     }
  159. } while ((++uChildIdx) < uChildCount);
  160.     }
  161.     return NULL;
  162. }
  163. /****************************************************************************
  164.  *  IUnknown methods
  165.  */
  166. /////////////////////////////////////////////////////////////////////////
  167. //  Method:
  168. // IUnknown::QueryInterface
  169. //  Purpose:
  170. // Implement this to export the interfaces supported by your 
  171. // object.
  172. //
  173. STDMETHODIMP CQTAtom::QueryInterface(REFIID riid, void** ppvObj)
  174. {
  175.     if (IsEqualIID(riid, IID_IUnknown))
  176.     {
  177. AddRef();
  178. *ppvObj = (IUnknown *) this;
  179. return HXR_OK;
  180.     }
  181.     *ppvObj = NULL;
  182.     return HXR_NOINTERFACE;
  183. }
  184. /////////////////////////////////////////////////////////////////////////
  185. //  Method:
  186. // IUnknown::AddRef
  187. //  Purpose:
  188. // Everyone usually implements this the same... feel free to use
  189. // this implementation.
  190. //
  191. STDMETHODIMP_(ULONG32) CQTAtom::AddRef()
  192. {
  193.     return InterlockedIncrement(&m_lRefCount);
  194. }
  195. /////////////////////////////////////////////////////////////////////////
  196. //  Method:
  197. // IUnknown::Release
  198. //  Purpose:
  199. // Everyone usually implements this the same... feel free to use
  200. // this implementation.
  201. //
  202. STDMETHODIMP_(ULONG32) CQTAtom::Release()
  203. {
  204.     if (InterlockedDecrement(&m_lRefCount) > 0)
  205.     {
  206.         return m_lRefCount;
  207.     }
  208.     delete this;
  209.     return 0;
  210. }
  211. /****************************************************************************
  212.  *  Class:
  213.  * CQTPagingAtom
  214.  */
  215. /****************************************************************************
  216.  *  Destructor
  217.  */
  218. CQTPagingAtom::~CQTPagingAtom()
  219. {
  220.     HX_RELEASE(m_pMemPager);
  221. }
  222. /****************************************************************************
  223.  *  SetMemPager
  224.  */
  225. void CQTPagingAtom::SetMemPager(CMemPager* pMemPager)
  226. {
  227.     m_pData = NULL;
  228.     HX_RELEASE(m_pBuffer);
  229.     HX_RELEASE(m_pMemPager);
  230.     m_lastStatus = HXR_OK;
  231.     m_pMemPager = pMemPager;
  232.     if (pMemPager)
  233.     {
  234. pMemPager->AddRef();
  235. m_pData = pMemPager->GetBaseVirtualAddr();
  236.     }
  237. }
  238. /****************************************************************************
  239.  *  SetBuffer
  240.  */
  241. void CQTPagingAtom::SetBuffer(IHXBuffer *pBuffer)
  242. {
  243.     HX_RELEASE(m_pMemPager);
  244.     m_lastStatus = HXR_OK;
  245.     CQTAtom::SetBuffer(pBuffer);
  246. }
  247. /****************************************************************************
  248.  *  IsFaulted
  249.  */
  250. BOOL CQTPagingAtom::IsFaulted(void)
  251.     return m_pMemPager ? m_pMemPager->IsFaulted() : FALSE;
  252. }