pxparse.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
  36. #include "hxtypes.h"
  37. #include "hxcom.h"
  38. #include "ihxpckts.h"
  39. // hxmisc
  40. #include "baseobj.h"
  41. #include "unkimp.h"
  42. // hxcont
  43. #include "carray.h"
  44. #include "hxmap.h"
  45. // pxcomlib
  46. #include "carray.h"
  47. #include "pxmapmgr.h"
  48. #include "pxparse.h"
  49. // hxdebug
  50. #include "hxheap.h"
  51. #ifdef _DEBUG
  52. #undef HX_THIS_FILE
  53. static char HX_THIS_FILE[] = __FILE__;
  54. #endif
  55. PXParseSession::PXParseSession()
  56. {
  57.     m_lRefCount               = 0;
  58.     m_pPacketInfoArray        = NULL;
  59.     m_ulNumPackets            = 0;
  60.     m_ulMaxPacketSize         = 0;
  61.     m_ulMinPacketSize         = 0;
  62.     m_ulTotalBytes            = 0;
  63.     m_ulTotalRequiredBytes    = 0;
  64.     m_ulTotalNonRequiredBytes = 0;
  65. }
  66. PXParseSession::~PXParseSession()
  67. {
  68.     if (m_pPacketInfoArray)
  69.     {
  70.         for (UINT32 i = 0; i < (UINT32) m_pPacketInfoArray->GetSize(); i++)
  71.         {
  72.             PacketInfo* pInfo = (PacketInfo*) m_pPacketInfoArray->GetAt(i);
  73.             if (pInfo)
  74.             {
  75.                 HX_RELEASE(pInfo->m_pDataBuffer);
  76.                 HX_RELEASE(pInfo->m_pOpaqueBuffer);
  77.             }
  78.             HX_DELETE(pInfo);
  79.         }
  80.     }
  81.     HX_DELETE(m_pPacketInfoArray);
  82. }
  83. STDMETHODIMP PXParseSession::QueryInterface(REFIID riid, void** ppvObj)
  84. {
  85.     HX_RESULT retVal = HXR_OK;
  86.     if (IsEqualIID(riid, IID_IUnknown))
  87.     {
  88.         AddRef();
  89.         *ppvObj = (IUnknown *) this;
  90.     }
  91.     else
  92.     {
  93.         *ppvObj = NULL;
  94.         retVal  = HXR_NOINTERFACE;
  95.     }
  96.     return retVal;
  97. }
  98. STDMETHODIMP_(UINT32) PXParseSession::AddRef()
  99. {
  100.     return InterlockedIncrement(&m_lRefCount);
  101. }
  102. STDMETHODIMP_(UINT32) PXParseSession::Release()
  103. {
  104.     
  105.     if (InterlockedDecrement(&m_lRefCount) > 0)
  106.         return m_lRefCount;
  107.     delete this;
  108.     return 0;
  109. }
  110. HX_RESULT PXParseSession::InitSize(UINT32 ulSize)
  111. {
  112.     HX_RESULT retVal = SetSize(ulSize);
  113.     if (SUCCEEDED(retVal))
  114.     {
  115.         // NULL out all the pointers
  116.         for (UINT32 i = 0; i < (UINT32) m_pPacketInfoArray->GetSize(); i++)
  117.         {
  118.             m_pPacketInfoArray->SetAt(i, NULL);
  119.         }
  120.     }
  121.     return retVal;
  122. }
  123. HX_RESULT PXParseSession::SetSize(UINT32 ulSize)
  124. {
  125.     HX_RESULT retVal = HXR_OK;
  126.     if (ulSize)
  127.     {
  128.         // If the pointer array doesn't exist, then create it
  129.         if (!m_pPacketInfoArray)
  130.         {
  131.             m_pPacketInfoArray = new CHXPtrArray();
  132.             if (!m_pPacketInfoArray)
  133.             {
  134.                 retVal = HXR_OUTOFMEMORY;
  135.             }
  136.         }
  137.         if (SUCCEEDED(retVal))
  138.         {
  139.             UINT32 ulOldSize = m_pPacketInfoArray->GetSize();
  140.             // Set the size
  141.             m_pPacketInfoArray->SetSize(ulSize);
  142.             // If the new size is less than the old one, then
  143.             // free up the unused space
  144.             if (ulSize < ulOldSize)
  145.             {
  146.                 m_pPacketInfoArray->FreeExtra();
  147.             }
  148.         }
  149.     }
  150.     else
  151.     {
  152.         retVal = HXR_INVALID_PARAMETER;
  153.     }
  154.     return retVal;
  155. }
  156. UINT32 PXParseSession::GetSize()
  157. {
  158.     UINT32 ulNum = 0;
  159.     if (m_pPacketInfoArray)
  160.     {
  161.         ulNum = m_pPacketInfoArray->GetSize();
  162.     }
  163.     return ulNum;
  164. }
  165. HX_RESULT PXParseSession::AddPacket(IHXBuffer* pDataBuffer,
  166.                                     IHXBuffer* pOpaqueBuffer,
  167.                                     BOOL        bRequired)
  168. {
  169.     HX_RESULT retVal = HXR_OK;
  170.     if (pDataBuffer)
  171.     {
  172.         // Create a new PacketInfo struct
  173.         PacketInfo* pInfo = new PacketInfo;
  174.         if (pInfo)
  175.         {
  176.             // Set the members of the PacketInfo struct
  177.             pInfo->m_pDataBuffer   = pDataBuffer;
  178.             pInfo->m_pOpaqueBuffer = pOpaqueBuffer;
  179.             pInfo->m_bRequired     = bRequired;
  180.             // AddRef the objects
  181.             pInfo->m_pDataBuffer->AddRef();
  182.             if (pInfo->m_pOpaqueBuffer)
  183.             {
  184.                 pInfo->m_pOpaqueBuffer->AddRef();
  185.             }
  186.             // Set the struct into the array
  187.             m_pPacketInfoArray->SetAt(m_ulNumPackets, (void*) pInfo);
  188.             // Update the statistics
  189.             UINT32 ulBytes = pDataBuffer->GetSize() + (pOpaqueBuffer ? pOpaqueBuffer->GetSize() : 0);
  190.             if (m_ulNumPackets)
  191.             {
  192.                 if (ulBytes < m_ulMinPacketSize)
  193.                 {
  194.                     m_ulMinPacketSize = ulBytes;
  195.                 }
  196.                 if (ulBytes > m_ulMaxPacketSize)
  197.                 {
  198.                     m_ulMaxPacketSize = ulBytes;
  199.                 }
  200.             }
  201.             else
  202.             {
  203.                 m_ulMinPacketSize = ulBytes;
  204.                 m_ulMaxPacketSize = ulBytes;
  205.             }
  206.             m_ulTotalBytes += ulBytes;
  207.             if (bRequired)
  208.             {
  209.                 m_ulTotalRequiredBytes += ulBytes;
  210.             }
  211.             else
  212.             {
  213.                 m_ulTotalNonRequiredBytes += ulBytes;
  214.             }
  215.             m_ulNumPackets++;
  216.         }
  217.         else
  218.         {
  219.             retVal = HXR_OUTOFMEMORY;
  220.         }
  221.     }
  222.     else
  223.     {
  224.         retVal = HXR_INVALID_PARAMETER;
  225.     }
  226.     return retVal;
  227. }
  228. HX_RESULT PXParseSession::GetPacket(UINT32           ulPacketIndex,
  229.                                     REF(IHXBuffer*) rpDataBuffer,
  230.                                     REF(IHXBuffer*) rpOpaqueBuffer,
  231.                                     REF(BOOL)        rbRequired)
  232. {
  233.     HX_RESULT retVal = HXR_OK;
  234.     if (m_pPacketInfoArray)
  235.     {
  236.         if (ulPacketIndex < m_ulNumPackets)
  237.         {
  238.             PacketInfo* pInfo = (PacketInfo*) m_pPacketInfoArray->GetAt(ulPacketIndex);
  239.             if (pInfo)
  240.             {
  241.                 if (pInfo->m_pDataBuffer)
  242.                 {
  243.                     rpDataBuffer   = pInfo->m_pDataBuffer;
  244.                     rpOpaqueBuffer = pInfo->m_pOpaqueBuffer;
  245.                     rbRequired     = pInfo->m_bRequired;
  246.                     rpDataBuffer->AddRef();
  247.                     if (rpOpaqueBuffer)
  248.                     {
  249.                         rpOpaqueBuffer->AddRef();
  250.                     }
  251.                 }
  252.                 else
  253.                 {
  254.                     retVal = HXR_FAIL;
  255.                 }
  256.             }
  257.             else
  258.             {
  259.                 retVal = HXR_FAIL;
  260.             }
  261.         }
  262.         else
  263.         {
  264.             retVal = HXR_INVALID_PARAMETER;
  265.         }
  266.     }
  267.     else
  268.     {
  269.         retVal = HXR_UNEXPECTED;
  270.     }
  271.     return retVal;
  272. }