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

Symbian

开发平台:

Visual 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 "hxtypes.h"
  36. #include "hxwintyp.h"
  37. #include "hxcom.h"
  38. #include "hxcomm.h"
  39. #include "hxassert.h"
  40. #include "hxslist.h"
  41. #include "hxcomm.h"
  42. #include "ihxpckts.h"
  43. #include "hxformt.h"
  44. #include "hxrendr.h"
  45. #include "hxformt.h"
  46. #include "hxengin.h"
  47. #include "smppayld.h"
  48. SimplePayloadFormat::SimplePayloadFormat()
  49.     : m_lRefCount     (0)
  50.     , m_pStreamHeader     (NULL)
  51.     , m_pInputPackets     (NULL)
  52.     , m_bFlushed     (FALSE)
  53. {
  54.     m_pInputPackets = new CHXSimpleList();
  55. }
  56. SimplePayloadFormat::~SimplePayloadFormat()
  57. {
  58.     HX_RELEASE(m_pStreamHeader);
  59.     if (!m_pInputPackets->IsEmpty())
  60.     {
  61. IHXPacket* pPacket = (IHXPacket*)m_pInputPackets->RemoveHead();
  62. HX_RELEASE(pPacket);
  63.     }
  64.     HX_DELETE(m_pInputPackets);
  65. }
  66. // *** IUnknown methods ***
  67. /////////////////////////////////////////////////////////////////////////
  68. //  Method:
  69. // IUnknown::QueryInterface
  70. //  Purpose:
  71. // Implement this to export the interfaces supported by your 
  72. // object.
  73. //
  74. STDMETHODIMP 
  75. SimplePayloadFormat::QueryInterface(REFIID riid, void** ppvObj)
  76. {
  77.     if (IsEqualIID(riid, IID_IUnknown))
  78.     {
  79. AddRef();
  80. *ppvObj = this;
  81. return HXR_OK;
  82.     }
  83.     else if (IsEqualIID(riid, IID_IHXPayloadFormatObject))
  84.     {
  85. AddRef();
  86. *ppvObj = (IHXPayloadFormatObject*)this;
  87. return HXR_OK;
  88.     }
  89.     *ppvObj = NULL;
  90.     return HXR_NOINTERFACE;
  91. }
  92. /////////////////////////////////////////////////////////////////////////
  93. //  Method:
  94. // IUnknown::AddRef
  95. //  Purpose:
  96. // Everyone usually implements this the same... feel free to use
  97. // this implementation.
  98. //
  99. STDMETHODIMP_(ULONG32) 
  100. SimplePayloadFormat::AddRef()
  101. {
  102.     return InterlockedIncrement(&m_lRefCount);
  103. }
  104. /////////////////////////////////////////////////////////////////////////
  105. //  Method:
  106. // IUnknown::Release
  107. //  Purpose:
  108. // Everyone usually implements this the same... feel free to use
  109. // this implementation.
  110. //
  111. STDMETHODIMP_(ULONG32) 
  112. SimplePayloadFormat::Release()
  113. {
  114.     if (InterlockedDecrement(&m_lRefCount) > 0)
  115.     {
  116.         return m_lRefCount;
  117.     }
  118.     delete this;
  119.     return 0;
  120. }
  121. STDMETHODIMP 
  122. SimplePayloadFormat::Init(IUnknown* pContext,
  123.   BOOL bPacketize)
  124. {
  125.     return HXR_OK;
  126. }
  127. STDMETHODIMP
  128. SimplePayloadFormat::Reset()
  129. {
  130.     // Release all input packets we have stored
  131.     if (!m_pInputPackets->IsEmpty())
  132.     {
  133. IHXPacket* pPacket = (IHXPacket*)m_pInputPackets->RemoveHead();
  134. HX_RELEASE(pPacket);
  135.     }
  136.     m_bFlushed = FALSE;
  137.     return HXR_OK;
  138. }
  139. STDMETHODIMP 
  140. SimplePayloadFormat::SetStreamHeader(IHXValues* pHeader)
  141. {
  142.     HX_ASSERT(pHeader);
  143.     m_pStreamHeader = pHeader;
  144.     m_pStreamHeader->AddRef();
  145.     return HXR_OK;
  146. }
  147. STDMETHODIMP 
  148. SimplePayloadFormat::GetStreamHeader(REF(IHXValues*) pHeader)
  149. {
  150.     HX_ASSERT(m_pStreamHeader);
  151.     pHeader = m_pStreamHeader;
  152.     pHeader->AddRef();
  153.     return HXR_OK;
  154. }
  155. STDMETHODIMP 
  156. SimplePayloadFormat::SetPacket(IHXPacket* pPacket)
  157. {
  158.     HX_ASSERT(pPacket);
  159.     // Add this packet to our list of input packets
  160.     pPacket->AddRef();
  161.     m_pInputPackets->AddTail(pPacket);
  162.     return HXR_OK;
  163. }
  164. STDMETHODIMP 
  165. SimplePayloadFormat::GetPacket(REF(IHXPacket*) pPacket)
  166. {
  167.     HX_RESULT hResult = HXR_OK;
  168.     pPacket = NULL;
  169.     if (m_pInputPackets->IsEmpty())
  170.     {
  171. if (m_bFlushed)
  172. {
  173.     // We have used up all available input
  174.     hResult = HXR_STREAM_DONE;
  175. }
  176. else
  177. {
  178.     // We don't have enough input 
  179.     // data to produce a packet
  180.     hResult = HXR_INCOMPLETE;
  181. }
  182.     }
  183.     else
  184.     {
  185. pPacket = (IHXPacket*)m_pInputPackets->RemoveHead();
  186.     }
  187.     return hResult;
  188. }
  189. STDMETHODIMP 
  190. SimplePayloadFormat::Flush()
  191. {
  192.     m_bFlushed = TRUE;
  193.     return HXR_OK;
  194. }