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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: hxsbuffer.cpp,v 1.1.32.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.  /*
  50.  *  In order to support the IHXBuffer interface, we must cast away the const
  51.  *  qualifier on our m_pData in the Get() and GetBuffer() functions.  If you
  52.  *  can think of a better way, please let me know ... TDM
  53.  */
  54. #include "hxtypes.h"
  55. #include "hxcom.h"
  56. #include "hxresult.h"
  57. #include "ihxpckts.h"
  58. #include "chxpckts.h"
  59. #include "hxsbuffer.h"
  60. //#include "rtsputil.h"
  61. #include "hxheap.h"
  62. #ifdef _DEBUG
  63. #undef HX_THIS_FILE                
  64. static char HX_THIS_FILE[] = __FILE__;
  65. #endif
  66. CHXStaticBuffer::CHXStaticBuffer(void) :
  67.     m_ulRefCount(0),
  68.     m_pbufRef(NULL),
  69.     m_pData(NULL),
  70.     m_ulLength(0)
  71. {
  72.     // Empty
  73. }
  74. CHXStaticBuffer::CHXStaticBuffer(UCHAR* pData, UINT32 ulLength) :
  75.     m_ulRefCount(0),
  76.     m_pbufRef(NULL),
  77.     m_pData(pData),
  78.     m_ulLength(ulLength)
  79. {
  80.     // Empty
  81. }
  82. CHXStaticBuffer::CHXStaticBuffer(IHXBuffer* pbuf, UINT32 pos, UINT32 len) :
  83.     m_ulRefCount(0),
  84.     m_pbufRef(pbuf),
  85.     m_pData(pbuf->GetBuffer()+pos),
  86.     m_ulLength(len)
  87. {
  88.     HX_ASSERT(pos+len <= pbuf->GetSize());
  89.     pbuf->AddRef();
  90. }
  91. CHXStaticBuffer::~CHXStaticBuffer(void)
  92. {
  93.     HX_RELEASE(m_pbufRef);
  94. }
  95. /*** IUnknown methods ***/
  96. STDMETHODIMP
  97. CHXStaticBuffer::QueryInterface(REFIID riid, void** ppvObj)
  98. {
  99.     if (IsEqualIID(riid, IID_IUnknown))
  100.     {
  101.         AddRef();
  102.         *ppvObj = this;
  103.         return HXR_OK;
  104.     }
  105.     else if (IsEqualIID(riid, IID_IHXBuffer))
  106.     {
  107.         AddRef();
  108.         *ppvObj = (IHXBuffer*)this;
  109.         return HXR_OK;
  110.     }
  111.     *ppvObj = NULL;
  112.     return HXR_NOINTERFACE;
  113. }
  114. STDMETHODIMP_(ULONG32)
  115. CHXStaticBuffer::AddRef(void)
  116. {
  117.     return InterlockedIncrement(&m_ulRefCount);
  118. }
  119. STDMETHODIMP_(ULONG32)
  120. CHXStaticBuffer::Release(void)
  121. {
  122.     HX_ASSERT(m_ulRefCount > 0);
  123.     if (InterlockedDecrement(&m_ulRefCount) > 0)
  124.     {
  125.         return m_ulRefCount;
  126.     }
  127.     delete this;
  128.     return 0;
  129. }
  130. /*** IHXBuffer methods ***/
  131. STDMETHODIMP
  132. CHXStaticBuffer::Get(REF(UCHAR*) pData, REF(ULONG32) ulLength)
  133. {
  134.     pData    = (UCHAR*)m_pData; //XXX: how to avoid discarding const?
  135.     ulLength = m_ulLength;
  136.     return HXR_OK;
  137. }
  138. STDMETHODIMP
  139. CHXStaticBuffer::Set(const UCHAR* pData, ULONG32 ulLength)
  140. {
  141.     // We allow changing the packet info when it is owned by atmost one user.
  142.     if (m_ulRefCount > 1)
  143.     {
  144.         return HXR_UNEXPECTED;
  145.     }
  146.     if (m_pbufRef != NULL)
  147.     {
  148.         // New bounds must remain within the referenced buffer
  149.         if (pData < m_pbufRef->GetBuffer() || pData + ulLength > m_pbufRef->GetBuffer() + m_pbufRef->GetSize())
  150.         {
  151.             return HXR_UNEXPECTED;
  152.         }
  153.     }
  154.     m_pData = pData;
  155.     m_ulLength = ulLength;
  156.     return HXR_OK;
  157. }
  158. STDMETHODIMP
  159. CHXStaticBuffer::SetSize(ULONG32 ulLength)
  160. {
  161.     // We allow changing the packet info when it is owned by atmost one user.
  162.     if (m_ulRefCount > 1)
  163.     {
  164.         return HXR_UNEXPECTED;
  165.     }
  166.     if (m_pbufRef != NULL)
  167.     {
  168.         // New bounds must remain within the referenced buffer
  169.         if (m_pData + ulLength > m_pbufRef->GetBuffer() + m_pbufRef->GetSize())
  170.         {
  171.             return HXR_UNEXPECTED;
  172.         }
  173.     }
  174.     m_ulLength = ulLength;
  175.     return HXR_OK;
  176. }
  177. STDMETHODIMP_(ULONG32)
  178. CHXStaticBuffer::GetSize(void)
  179. {
  180.     return m_ulLength;
  181. }
  182. STDMETHODIMP_(UCHAR*)
  183. CHXStaticBuffer::GetBuffer(void)
  184. {
  185.     return (UCHAR*)m_pData; //XXX: how to avoid discarding const?
  186. }