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

Symbian

开发平台:

Visual C++

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