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

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 "hxtypes.h"
  36. #include "hxresult.h"
  37. #include "hxcom.h"
  38. #include "ihxpckts.h"
  39. #include "hxtbuf.h"
  40. #include "chxpckts.h"
  41. #include "timebuff.h"
  42. #include "hxheap.h"
  43. #ifdef _DEBUG
  44. #undef HX_THIS_FILE
  45. static const char HX_THIS_FILE[] = __FILE__;
  46. #endif
  47. /////////////////////////////////////////////////////////////////////////
  48. // Method:
  49. // IUnknown::QueryInterface
  50. // Purpose:
  51. // Implement this to export the interfaces supported by your 
  52. // object.
  53. //
  54. STDMETHODIMP CHXTimeStampedBuffer::QueryInterface(REFIID riid, void** ppvObj)
  55. {
  56. QInterfaceList qiList[] =
  57. {
  58. { GET_IIDHANDLE(IID_IUnknown), this },
  59. { GET_IIDHANDLE(IID_IHXBuffer), (IHXBuffer*) this },
  60. { GET_IIDHANDLE(IID_IHXTimeStampedBuffer), (IHXTimeStampedBuffer*) this },
  61. };
  62.     return QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);   
  63. }
  64. /////////////////////////////////////////////////////////////////////////
  65. // Method:
  66. // IUnknown::AddRef
  67. // Purpose:
  68. // Everyone usually implements this the same... feel free to use
  69. // this implementation.
  70. //
  71. STDMETHODIMP_(ULONG32) CHXTimeStampedBuffer::AddRef()
  72. {
  73.     return InterlockedIncrement(&m_lRefCount);
  74. }
  75. /////////////////////////////////////////////////////////////////////////
  76. // Method:
  77. // IUnknown::Release
  78. // Purpose:
  79. // Everyone usually implements this the same... feel free to use
  80. // this implementation.
  81. //
  82. STDMETHODIMP_(ULONG32) CHXTimeStampedBuffer::Release()
  83. {
  84.     if (InterlockedDecrement(&m_lRefCount) > 0)
  85.     {
  86. return m_lRefCount;
  87.     }
  88.     delete this;
  89.     return 0;
  90. }
  91. STDMETHODIMP_(UINT32) CHXTimeStampedBuffer::GetTimeStamp()
  92. {
  93.     return m_ulTimeStamp;
  94. }
  95. STDMETHODIMP
  96. CHXTimeStampedBuffer::SetTimeStamp(UINT32 ulTimeStamp)
  97. {
  98.     m_ulTimeStamp = ulTimeStamp;
  99.     return HXR_OK;
  100. }
  101. CHXTimeStampedBuffer::~CHXTimeStampedBuffer()
  102. {
  103.     if (m_pData)
  104.     {
  105. delete [] m_pData;
  106.     }
  107. }
  108. /*
  109.  * IHXBuffer methods
  110.  */
  111. /************************************************************************
  112.  * Method:
  113.  * IHXBuffer::Get
  114.  * Purpose:
  115.  * TBD
  116.  */
  117. STDMETHODIMP CHXTimeStampedBuffer::Get
  118. (
  119.     REF(UCHAR*) pData, 
  120.     REF(ULONG32) ulLength
  121. )
  122. {
  123.     // Whenever a COM object is returned out of an
  124.     // interface, it should be AddRef()'d. But this is
  125.     // not a COM object, it is only a buffer...
  126.     pData    = m_pData;
  127.     ulLength = m_ulLength;
  128.     return HXR_OK;
  129. }
  130. /************************************************************************
  131.  * Method:
  132.  * IHXBuffer::Set
  133.  * Purpose:
  134.  * TBD
  135.  */
  136. STDMETHODIMP CHXTimeStampedBuffer::Set
  137. (
  138.     const UCHAR* pData, 
  139.     ULONG32 ulLength
  140. )
  141. {
  142.     /* We allow changing the packet info when it is owned
  143.      * by atmost one user.
  144.      */
  145.     if (m_lRefCount > 1)
  146.     {
  147. return HXR_UNEXPECTED;
  148.     }
  149.     if (m_pData)
  150.     {
  151. delete [] m_pData;
  152.     }
  153.     m_pData = new UCHAR[ulLength];
  154.     if (!m_pData)
  155.     {
  156. return HXR_OUTOFMEMORY;
  157.     }
  158.     memcpy(m_pData,pData,HX_SAFESIZE_T(ulLength)); /* Flawfinder: ignore */
  159.     m_ulLength = ulLength;
  160.     return HXR_OK;
  161. }
  162. /************************************************************************
  163.  * Method:
  164.  * IHXBuffer::SetSize
  165.  * Purpose:
  166.  * TBD
  167.  */
  168. STDMETHODIMP CHXTimeStampedBuffer::SetSize(ULONG32 ulLength)
  169. {
  170.     /* We allow changing the packet info when it is owned
  171.      * by atmost one user.
  172.      */
  173.     if (m_lRefCount > 1)
  174.     {
  175. return HXR_UNEXPECTED;
  176.     }
  177.     if (ulLength > m_ulLength)
  178.     {
  179. UCHAR* pTemp = NULL;
  180. if (m_pData)
  181. {
  182.     pTemp = m_pData;
  183. }
  184. m_pData = new UCHAR[ulLength];
  185. if (!m_pData)
  186. {
  187.     m_pData = pTemp;
  188.     return HXR_OUTOFMEMORY;
  189. }
  190. if (pTemp)
  191. {
  192.     memcpy(m_pData,pTemp,HX_SAFESIZE_T(m_ulLength)); /* Flawfinder: ignore */
  193.     delete [] pTemp;
  194. }
  195.     }
  196.     m_ulLength = ulLength;
  197.     return HXR_OK;
  198. }
  199. /************************************************************************
  200.  * Method:
  201.  * IHXBuffer::GetSize
  202.  * Purpose:
  203.  * TBD
  204.  */
  205. STDMETHODIMP_(ULONG32) CHXTimeStampedBuffer::GetSize()
  206. {
  207.     return m_ulLength;
  208. }
  209. /************************************************************************
  210.  * Method:
  211.  * IHXBuffer::GetBuffer
  212.  * Purpose:
  213.  * TBD
  214.  */
  215. STDMETHODIMP_(UCHAR*) CHXTimeStampedBuffer::GetBuffer()
  216. {
  217.     // Whenever a COM object is returned out of an
  218.     // interface, it should be AddRef()'d. But this is
  219.     // not a COM object, it is only a buffer...
  220.     return m_pData;
  221. }
  222. void
  223. CHXTimeStampedBuffer::Pack(IHXTimeStampedBuffer* pTimeStampedBuffer, char* pData,
  224.                            UINT32 ulDataBufSize, UINT32& ulSize)
  225. {
  226.     UINT32 ulValue = 0;
  227.     UINT32 ulBufferSize = 0;
  228.     IHXBuffer* pBuffer = NULL;
  229.     if (!pTimeStampedBuffer)
  230.     {
  231. goto cleanup;
  232.     }
  233.     if (HXR_OK != pTimeStampedBuffer->QueryInterface(IID_IHXBuffer, (void**)&pBuffer))
  234.     {
  235. goto cleanup;
  236.     }
  237.     ulValue = pTimeStampedBuffer->GetTimeStamp();
  238.     ulBufferSize = pBuffer->GetSize();
  239.     // figure out the size 
  240.     if (!pData)
  241.     {
  242. ulSize = sizeof(UINT32) + ulBufferSize;
  243.     }
  244.     // pack the data
  245.     else
  246.     {
  247.         if (ulDataBufSize >= 4)
  248.         {
  249.             *pData++ = (BYTE) ulValue;
  250.             *pData++ = (BYTE)(ulValue >> 8);
  251.     *pData++ = (BYTE)(ulValue >> 16);
  252.             *pData++ = (BYTE)(ulValue >> 24);
  253.             ulSize  += 4;
  254.         }
  255.         if (ulBufferSize <= ulDataBufSize - 4)
  256.         {
  257.             memcpy(pData, (char*)pBuffer->GetBuffer(), ulBufferSize); /* Flawfinder: ignore */
  258.             pData += ulBufferSize;
  259.             ulSize += ulBufferSize;
  260.         }
  261.     }
  262.    
  263. cleanup:
  264.     HX_RELEASE(pBuffer);
  265.     return;
  266. }   
  267.    
  268. void
  269. CHXTimeStampedBuffer::UnPack(IHXTimeStampedBuffer*& pTimeStampedBuffer, char* pData, UINT32 ulSize)
  270. {
  271.     UINT32     ulValue = 0;
  272.     IHXBuffer*     pBuffer = NULL;
  273.     pTimeStampedBuffer = NULL;
  274.     if (!pData || !ulSize)
  275.     {
  276. goto cleanup;
  277.     }
  278.     ulValue = (BYTE)*pData++; ulValue |= (((BYTE)*pData++) << 8);
  279.     ulValue |= (((BYTE)*pData++) << 16); ulValue |= (((BYTE)*pData++) << 24);
  280.     ulSize -= 4;
  281.     if (ulSize)
  282.     {
  283. pTimeStampedBuffer = new CHXTimeStampedBuffer();
  284. pTimeStampedBuffer->AddRef();
  285. pTimeStampedBuffer->SetTimeStamp(ulValue);
  286. pTimeStampedBuffer->QueryInterface(IID_IHXBuffer, (void**)&pBuffer);
  287. pBuffer->Set((const UCHAR*)pData, ulSize);
  288.     }
  289. cleanup:
  290.     HX_RELEASE(pBuffer);
  291.     return;
  292. }