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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: timebuff.cpp,v 1.4.20.3 2004/07/09 01:45:59 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include "hxtypes.h"
  50. #include "hxresult.h"
  51. #include "hxcom.h"
  52. #include "ihxpckts.h"
  53. #include "hxtbuf.h"
  54. #include "chxpckts.h"
  55. #include "timebuff.h"
  56. #include "hxheap.h"
  57. #ifdef _DEBUG
  58. #undef HX_THIS_FILE
  59. static const char HX_THIS_FILE[] = __FILE__;
  60. #endif
  61. /////////////////////////////////////////////////////////////////////////
  62. // Method:
  63. // IUnknown::QueryInterface
  64. // Purpose:
  65. // Implement this to export the interfaces supported by your 
  66. // object.
  67. //
  68. STDMETHODIMP CHXTimeStampedBuffer::QueryInterface(REFIID riid, void** ppvObj)
  69. {
  70. QInterfaceList qiList[] =
  71. {
  72. { GET_IIDHANDLE(IID_IUnknown), this },
  73. { GET_IIDHANDLE(IID_IHXBuffer), (IHXBuffer*) this },
  74. { GET_IIDHANDLE(IID_IHXTimeStampedBuffer), (IHXTimeStampedBuffer*) this },
  75. };
  76.     return QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);   
  77. }
  78. /////////////////////////////////////////////////////////////////////////
  79. // Method:
  80. // IUnknown::AddRef
  81. // Purpose:
  82. // Everyone usually implements this the same... feel free to use
  83. // this implementation.
  84. //
  85. STDMETHODIMP_(ULONG32) CHXTimeStampedBuffer::AddRef()
  86. {
  87.     return InterlockedIncrement(&m_lRefCount);
  88. }
  89. /////////////////////////////////////////////////////////////////////////
  90. // Method:
  91. // IUnknown::Release
  92. // Purpose:
  93. // Everyone usually implements this the same... feel free to use
  94. // this implementation.
  95. //
  96. STDMETHODIMP_(ULONG32) CHXTimeStampedBuffer::Release()
  97. {
  98.     if (InterlockedDecrement(&m_lRefCount) > 0)
  99.     {
  100. return m_lRefCount;
  101.     }
  102.     delete this;
  103.     return 0;
  104. }
  105. STDMETHODIMP_(UINT32) CHXTimeStampedBuffer::GetTimeStamp()
  106. {
  107.     return m_ulTimeStamp;
  108. }
  109. STDMETHODIMP
  110. CHXTimeStampedBuffer::SetTimeStamp(UINT32 ulTimeStamp)
  111. {
  112.     m_ulTimeStamp = ulTimeStamp;
  113.     return HXR_OK;
  114. }
  115. CHXTimeStampedBuffer::~CHXTimeStampedBuffer()
  116. {
  117.     if (m_pData)
  118.     {
  119. delete [] m_pData;
  120.     }
  121. }
  122. /*
  123.  * IHXBuffer methods
  124.  */
  125. /************************************************************************
  126.  * Method:
  127.  * IHXBuffer::Get
  128.  * Purpose:
  129.  * TBD
  130.  */
  131. STDMETHODIMP CHXTimeStampedBuffer::Get
  132. (
  133.     REF(UCHAR*) pData, 
  134.     REF(ULONG32) ulLength
  135. )
  136. {
  137.     // Whenever a COM object is returned out of an
  138.     // interface, it should be AddRef()'d. But this is
  139.     // not a COM object, it is only a buffer...
  140.     pData    = m_pData;
  141.     ulLength = m_ulLength;
  142.     return HXR_OK;
  143. }
  144. /************************************************************************
  145.  * Method:
  146.  * IHXBuffer::Set
  147.  * Purpose:
  148.  * TBD
  149.  */
  150. STDMETHODIMP CHXTimeStampedBuffer::Set
  151. (
  152.     const UCHAR* pData, 
  153.     ULONG32 ulLength
  154. )
  155. {
  156.     /* We allow changing the packet info when it is owned
  157.      * by atmost one user.
  158.      */
  159.     if (m_lRefCount > 1)
  160.     {
  161. return HXR_UNEXPECTED;
  162.     }
  163.     if (m_pData)
  164.     {
  165. delete [] m_pData;
  166.     }
  167.     m_pData = new UCHAR[ulLength];
  168.     if (!m_pData)
  169.     {
  170. return HXR_OUTOFMEMORY;
  171.     }
  172.     memcpy(m_pData,pData,HX_SAFESIZE_T(ulLength)); /* Flawfinder: ignore */
  173.     m_ulLength = ulLength;
  174.     return HXR_OK;
  175. }
  176. /************************************************************************
  177.  * Method:
  178.  * IHXBuffer::SetSize
  179.  * Purpose:
  180.  * TBD
  181.  */
  182. STDMETHODIMP CHXTimeStampedBuffer::SetSize(ULONG32 ulLength)
  183. {
  184.     /* We allow changing the packet info when it is owned
  185.      * by atmost one user.
  186.      */
  187.     if (m_lRefCount > 1)
  188.     {
  189. return HXR_UNEXPECTED;
  190.     }
  191.     if (ulLength > m_ulLength)
  192.     {
  193. UCHAR* pTemp = NULL;
  194. if (m_pData)
  195. {
  196.     pTemp = m_pData;
  197. }
  198. m_pData = new UCHAR[ulLength];
  199. if (!m_pData)
  200. {
  201.     m_pData = pTemp;
  202.     return HXR_OUTOFMEMORY;
  203. }
  204. if (pTemp)
  205. {
  206.     memcpy(m_pData,pTemp,HX_SAFESIZE_T(m_ulLength)); /* Flawfinder: ignore */
  207.     delete [] pTemp;
  208. }
  209.     }
  210.     m_ulLength = ulLength;
  211.     return HXR_OK;
  212. }
  213. /************************************************************************
  214.  * Method:
  215.  * IHXBuffer::GetSize
  216.  * Purpose:
  217.  * TBD
  218.  */
  219. STDMETHODIMP_(ULONG32) CHXTimeStampedBuffer::GetSize()
  220. {
  221.     return m_ulLength;
  222. }
  223. /************************************************************************
  224.  * Method:
  225.  * IHXBuffer::GetBuffer
  226.  * Purpose:
  227.  * TBD
  228.  */
  229. STDMETHODIMP_(UCHAR*) CHXTimeStampedBuffer::GetBuffer()
  230. {
  231.     // Whenever a COM object is returned out of an
  232.     // interface, it should be AddRef()'d. But this is
  233.     // not a COM object, it is only a buffer...
  234.     return m_pData;
  235. }
  236. void
  237. CHXTimeStampedBuffer::Pack(IHXTimeStampedBuffer* pTimeStampedBuffer, char* pData,
  238.                            UINT32 ulDataBufSize, UINT32& ulSize)
  239. {
  240.     UINT32 ulValue = 0;
  241.     UINT32 ulBufferSize = 0;
  242.     IHXBuffer* pBuffer = NULL;
  243.     if (!pTimeStampedBuffer)
  244.     {
  245. goto cleanup;
  246.     }
  247.     if (HXR_OK != pTimeStampedBuffer->QueryInterface(IID_IHXBuffer, (void**)&pBuffer))
  248.     {
  249. goto cleanup;
  250.     }
  251.     ulValue = pTimeStampedBuffer->GetTimeStamp();
  252.     ulBufferSize = pBuffer->GetSize();
  253.     // figure out the size 
  254.     if (!pData)
  255.     {
  256. ulSize = sizeof(UINT32) + ulBufferSize;
  257.     }
  258.     // pack the data
  259.     else
  260.     {
  261.         if (ulDataBufSize >= 4)
  262.         {
  263.             *pData++ = (BYTE) ulValue;
  264.             *pData++ = (BYTE)(ulValue >> 8);
  265.     *pData++ = (BYTE)(ulValue >> 16);
  266.             *pData++ = (BYTE)(ulValue >> 24);
  267.             ulSize  += 4;
  268.         }
  269.         if (ulBufferSize <= ulDataBufSize - 4)
  270.         {
  271.             memcpy(pData, (char*)pBuffer->GetBuffer(), ulBufferSize); /* Flawfinder: ignore */
  272.             pData += ulBufferSize;
  273.             ulSize += ulBufferSize;
  274.         }
  275.     }
  276.    
  277. cleanup:
  278.     HX_RELEASE(pBuffer);
  279.     return;
  280. }   
  281.    
  282. void
  283. CHXTimeStampedBuffer::UnPack(IHXTimeStampedBuffer*& pTimeStampedBuffer, char* pData, UINT32 ulSize)
  284. {
  285.     UINT32     ulValue = 0;
  286.     IHXBuffer*     pBuffer = NULL;
  287.     pTimeStampedBuffer = NULL;
  288.     if (!pData || !ulSize)
  289.     {
  290. goto cleanup;
  291.     }
  292.     ulValue = (BYTE)*pData++; ulValue |= (((BYTE)*pData++) << 8);
  293.     ulValue |= (((BYTE)*pData++) << 16); ulValue |= (((BYTE)*pData++) << 24);
  294.     ulSize -= 4;
  295.     if (ulSize)
  296.     {
  297. pTimeStampedBuffer = new CHXTimeStampedBuffer();
  298. pTimeStampedBuffer->AddRef();
  299. pTimeStampedBuffer->SetTimeStamp(ulValue);
  300. pTimeStampedBuffer->QueryInterface(IID_IHXBuffer, (void**)&pBuffer);
  301. pBuffer->Set((const UCHAR*)pData, ulSize);
  302.     }
  303. cleanup:
  304.     HX_RELEASE(pBuffer);
  305.     return;
  306. }