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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: old_hxpckts.cpp,v 1.6.8.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.  *  Defines
  51.  */
  52. #define EXTREME_RTP_TIME    0xFFFFFFFF
  53. /************************************************************************
  54.  *  Includes
  55.  */
  56. #include "hxtypes.h"
  57. #include "hxresult.h"
  58. #include "hxcom.h"
  59. #include "ihxpckts.h"
  60. #include "old_hxpckts.h"
  61. #include "hlxclib/string.h"
  62. #include "hxheap.h"
  63. #ifdef _DEBUG
  64. #undef HX_THIS_FILE
  65. static const char HX_THIS_FILE[] = __FILE__;
  66. #endif
  67. /////////////////////////////////////////////////////////////////////////
  68. // CHXPacket
  69. /////////////////////////////////////////////////////////////////////////
  70. // Method:
  71. // IUnknown::QueryInterface
  72. // Purpose:
  73. // Implement this to export the interfaces supported by your 
  74. // object.
  75. //
  76. STDMETHODIMP CHXPacket::QueryInterface(REFIID riid, void** ppvObj)
  77. {
  78. QInterfaceList qiList[] =
  79. {
  80. { GET_IIDHANDLE(IID_IUnknown), this },
  81. { GET_IIDHANDLE(IID_IHXPacket), (IHXPacket*) this },
  82. };
  83.     return QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);   
  84. }
  85. /////////////////////////////////////////////////////////////////////////
  86. // Method:
  87. // IUnknown::AddRef
  88. // Purpose:
  89. // Everyone usually implements this the same... feel free to use
  90. // this implementation.
  91. //
  92. STDMETHODIMP_(ULONG32) CHXPacket::AddRef()
  93. {
  94.     return InterlockedIncrement(&m_lRefCount);
  95. }
  96. /////////////////////////////////////////////////////////////////////////
  97. // Method:
  98. // IUnknown::Release
  99. // Purpose:
  100. // Everyone usually implements this the same... feel free to use
  101. // this implementation.
  102. //
  103. STDMETHODIMP_(ULONG32) CHXPacket::Release()
  104. {
  105.     if (InterlockedDecrement(&m_lRefCount) > 0)
  106.     {
  107. return m_lRefCount;
  108.     }
  109.     delete this;
  110.     return 0;
  111. }
  112. /************************************************************************
  113.  * Method:
  114.  * IHXPacket::Get
  115.  * Purpose:
  116.  * TBD
  117.  */
  118. STDMETHODIMP CHXPacket::Get
  119. (
  120.     REF(IHXBuffer*) pBuffer, 
  121.     REF(ULONG32) ulTime,
  122.     REF(UINT16) uStreamNumber,
  123.     REF(UINT8) unASMFlags,
  124.     REF(UINT16) unASMRuleNumber
  125. )
  126. {
  127.     return _Get(pBuffer,
  128. ulTime,
  129. uStreamNumber,
  130. unASMFlags,
  131. unASMRuleNumber);
  132. }
  133. /************************************************************************
  134.  * Method:
  135.  * IHXPacket::GetBuffer
  136.  * Purpose:
  137.  * TBD
  138.  */
  139. STDMETHODIMP_(IHXBuffer*) CHXPacket::GetBuffer()
  140. {
  141.     // Whenever a COM object is returned out of an
  142.     // interface, it should be AddRef()'d.
  143.     if (m_pBuffer) m_pBuffer->AddRef();
  144.     return m_pBuffer; 
  145. }
  146. /************************************************************************
  147.  * Method:
  148.  * IHXPacket::GetTime
  149.  * Purpose:
  150.  * TBD
  151.  */
  152. STDMETHODIMP_(ULONG32) CHXPacket::GetTime()
  153. {
  154.     return m_ulTime;
  155. }
  156. /************************************************************************
  157.  * Method:
  158.  * IHXPacket::GetFlags
  159.  * Purpose:
  160.  * TBD
  161.  */
  162. STDMETHODIMP_(UINT8) CHXPacket::GetASMFlags()
  163. {
  164.     return m_unASMFlags;
  165. }
  166. /************************************************************************
  167.  * Method:
  168.  * IHXPacket::GetStreamNumber
  169.  * Purpose:
  170.  * TBD
  171.  */
  172. STDMETHODIMP_(UINT16) CHXPacket::GetStreamNumber()
  173. {
  174.     return m_uStreamNumber;
  175. }
  176. /************************************************************************
  177.  * Method:
  178.  * IHXPacket::GetASMRuleNumber
  179.  * Purpose:
  180.  * TBD
  181.  */
  182. STDMETHODIMP_(UINT16) CHXPacket::GetASMRuleNumber()
  183. {
  184.     return m_unASMRuleNumber;
  185. }
  186. /************************************************************************
  187.  * Method:
  188.  * IHXPacket::IsLost
  189.  * Purpose:
  190.  * TBD
  191.  */
  192. STDMETHODIMP_(BOOL) CHXPacket::IsLost()
  193.     return m_bIsLost;
  194. }
  195. /************************************************************************
  196.  * Method:
  197.  * IHXPacket::SetAsLost
  198.  * Purpose:
  199.  * TBD
  200.  */
  201. STDMETHODIMP CHXPacket::SetAsLost()
  202. {
  203.     HX_ASSERT(m_pBuffer == NULL);
  204.     HX_ASSERT(m_ulTime == 0);
  205.     if (m_pBuffer) return HXR_UNEXPECTED;
  206.     m_bIsLost = TRUE;
  207.     return HXR_OK; 
  208. }
  209. /************************************************************************
  210.  * Method:
  211.  * IHXPacket::Set
  212.  * Purpose:
  213.  * TBD
  214.  */
  215. STDMETHODIMP CHXPacket::Set
  216. (
  217.     IHXBuffer* pBuffer, 
  218.     ULONG32 ulTime,
  219.     UINT16 uStreamNumber,
  220.     UINT8 unASMFlags,
  221.     UINT16 unASMRuleNumber
  222. )
  223. {
  224.     return _Set(pBuffer, 
  225. ulTime,
  226. uStreamNumber,
  227. unASMFlags,
  228. unASMRuleNumber);
  229. }
  230. /************************************************************************
  231.  * Method:
  232.  * IHXRTPPacket::GetRTP
  233.  */
  234. STDMETHODIMP CHXPacket::GetRTP
  235. (
  236.     REF(IHXBuffer*) pBuffer, 
  237.     REF(ULONG32) ulTime,
  238.     REF(ULONG32) ulRTPTime,
  239.     REF(UINT16) uStreamNumber,
  240.     REF(UINT8) unASMFlags,
  241.     REF(UINT16) unASMRuleNumber
  242. )
  243. {
  244.     HX_ASSERT(HXR_UNEXPECTED == HXR_OK);
  245.     return HXR_UNEXPECTED;
  246. }
  247. /************************************************************************
  248.  * Method:
  249.  * IHXRTPPacket::GetRTPTime
  250.  */
  251. STDMETHODIMP_(ULONG32) CHXPacket::GetRTPTime()
  252. {
  253.     HX_ASSERT(HXR_UNEXPECTED == HXR_OK);
  254.     return EXTREME_RTP_TIME;
  255. }
  256. /************************************************************************
  257.  * Method:
  258.  * IHXRTPPacket::SetRTP
  259.  */
  260. STDMETHODIMP CHXPacket::SetRTP
  261. (
  262.     IHXBuffer*     pBuffer, 
  263.     ULONG32     ulTime,
  264.     ULONG32     ulRTPTime,
  265.     UINT16     uStreamNumber,
  266.     UINT8     unASMFlags,
  267.     UINT16     unASMRuleNumber
  268. )
  269. {
  270.     HX_ASSERT(HXR_UNEXPECTED == HXR_OK);
  271.     return HXR_UNEXPECTED;
  272. }
  273. inline HX_RESULT CHXPacket::_Get(IHXBuffer*   &pBuffer,
  274.  ULONG32     &ulTime,
  275.  UINT16     &uStreamNumber,
  276.  UINT8     &unASMFlags,
  277.  UINT16     &unASMRuleNumber)
  278. {
  279.     pBuffer     = m_pBuffer;
  280.     ulTime     = m_ulTime;
  281.     uStreamNumber   = m_uStreamNumber;
  282.     unASMFlags     = m_unASMFlags;
  283.     unASMRuleNumber = m_unASMRuleNumber;
  284.     // Whenever a COM object is returned out of an
  285.     // interface, it should be AddRef()'d.
  286.     if (m_pBuffer) m_pBuffer->AddRef();
  287.     return HXR_OK;
  288. }
  289. inline HX_RESULT CHXPacket::_Set(IHXBuffer*   pBuffer, 
  290.  ULONG32     ulTime,
  291.  UINT16     uStreamNumber,
  292.  UINT8     unASMFlags,
  293.  UINT16     unASMRuleNumber)
  294. {
  295.     /* We allow changing the packet info when it is owned
  296.      * by atmost one user.
  297.      */
  298.     if (m_lRefCount > 1)
  299.     {
  300. HX_ASSERT(FALSE);
  301. return HXR_UNEXPECTED;
  302.     }
  303.     if (m_pBuffer) m_pBuffer->Release();
  304.     m_pBuffer = pBuffer;
  305.     if (m_pBuffer)
  306.     {
  307. m_pBuffer->AddRef();
  308.     }
  309.     m_ulTime = ulTime;
  310.     m_uStreamNumber = uStreamNumber;
  311.     m_unASMFlags = unASMFlags;
  312.     m_unASMRuleNumber = unASMRuleNumber;
  313.     return HXR_OK;
  314. }
  315. // serialization method
  316. void
  317. CHXPacket::Pack(IHXPacket* pPacket, char* pData, UINT32& ulSize)
  318. {
  319.     UINT16 uValue = 0;
  320.     UINT32 ulValue = 0;
  321.     UINT32 ulBufferSize = 0;
  322.     IHXBuffer* pBuffer = NULL;
  323.     if (!pPacket)
  324.     {
  325. goto cleanup;
  326.     }
  327.     pBuffer = pPacket->GetBuffer();
  328.     if (pBuffer)
  329.     {
  330. ulBufferSize = pBuffer->GetSize();
  331.     }
  332.     // figure out the size 
  333.     if (!pData)
  334.     {
  335. ulSize = sizeof(HXPacketInfo) + ulBufferSize;
  336.     }
  337.     // pack the data
  338.     else
  339.     {
  340. *pData++ = (BYTE)pPacket->IsLost(); ulSize++;
  341. *pData++ = (BYTE)pPacket->GetASMFlags(); ulSize++;
  342. uValue = pPacket->GetASMRuleNumber();
  343. *pData++ = (BYTE)uValue; *pData++ = (BYTE)(uValue >> 8);  ulSize += 2;
  344. uValue = pPacket->GetStreamNumber();
  345. *pData++ = (BYTE)uValue; *pData++ = (BYTE)(uValue >> 8);  ulSize += 2;
  346. ulValue = pPacket->GetTime();
  347. *pData++ = (BYTE)ulValue; *pData++ = (BYTE)(ulValue >> 8);
  348. *pData++ = (BYTE)(ulValue >> 16); *pData++ = (BYTE)(ulValue >> 24); ulSize += 4;
  349. if (pBuffer)
  350. {
  351.     memcpy(pData, (char*)pBuffer->GetBuffer(), ulBufferSize); /* Flawfinder: ignore */
  352.     pData += ulBufferSize; ulSize += ulBufferSize;
  353. }
  354.     }
  355.    
  356. cleanup:
  357.     HX_RELEASE(pBuffer);
  358.     return;
  359. }   
  360. void
  361. CHXPacket::UnPack(IHXPacket*& pPacket, char* pData, UINT32 ulSize)
  362. {
  363.     UINT16     uValue = 0;
  364.     UINT32     ulValue = 0;
  365.     IHXBuffer*     pBuffer = NULL;
  366.     HXPacketInfo   packetInfo;
  367.     pPacket = NULL;
  368.     if (!pData || !ulSize)
  369.     {
  370. goto cleanup;
  371.     }
  372.     HX_ASSERT(ulSize >= sizeof(HXPacketInfo));
  373.     packetInfo.lost = (BYTE)*pData++;     ulSize--;
  374.     packetInfo.ASMFlags = (BYTE)*pData++;   ulSize--;
  375.     uValue = (BYTE)*pData++; uValue |= (((BYTE)*pData++) << 8);
  376.     packetInfo.ASMRuleNumber = uValue;     ulSize -= 2;
  377.     uValue = (BYTE)*pData++; uValue |= (((BYTE)*pData++) << 8);
  378.     packetInfo.streamNum = uValue;     ulSize -= 2;
  379.     ulValue = (BYTE)*pData++; ulValue |= (((BYTE)*pData++) << 8);
  380.     ulValue |= (((BYTE)*pData++) << 16); ulValue |= (((BYTE)*pData++) << 24);
  381.     packetInfo.time = ulValue;     ulSize -= 4;
  382.     if (ulSize)
  383.     {
  384. pBuffer = new CHXBuffer();
  385. pBuffer->AddRef();
  386. pBuffer->Set((const UCHAR*)pData, ulSize);
  387.     }
  388.     pPacket = new CHXPacket();
  389.     pPacket->AddRef();
  390.     pPacket->Set(pBuffer, 
  391.  packetInfo.time, 
  392.  packetInfo.streamNum,
  393.  packetInfo.ASMFlags,
  394.  packetInfo.ASMRuleNumber);
  395.     if (packetInfo.lost)
  396.     {
  397. pPacket->SetAsLost();
  398.     }
  399. cleanup:
  400.     HX_RELEASE(pBuffer);
  401.     return;
  402. }
  403. /////////////////////////////////////////////////////////////////////////
  404. // CHXRTPPacket
  405. /////////////////////////////////////////////////////////////////////////
  406. // Method:
  407. // IUnknown::QueryInterface
  408. // Purpose:
  409. // Implement this to export the interfaces supported by your 
  410. // object.
  411. //
  412. STDMETHODIMP CHXRTPPacket::QueryInterface(REFIID riid, void** ppvObj)
  413. {
  414.     if (IsEqualIID(riid, IID_IHXRTPPacket))
  415.     {
  416. AddRef();
  417. *ppvObj = (IHXRTPPacket*) this;
  418. return HXR_OK;
  419.     }
  420.     else if (IsEqualIID(riid, IID_IHXPacket))
  421.     {
  422. AddRef();
  423. *ppvObj = (IHXPacket*) this;
  424. return HXR_OK;
  425.     }
  426.     else if (IsEqualIID(riid, IID_IUnknown))
  427.     {
  428. AddRef();
  429. *ppvObj = this;
  430. return HXR_OK;
  431.     }
  432.     *ppvObj = NULL;
  433.     return HXR_NOINTERFACE;
  434. }
  435. /////////////////////////////////////////////////////////////////////////
  436. // Method:
  437. // IUnknown::Release
  438. // Purpose:
  439. // Everyone usually implements this the same... feel free to use
  440. // this implementation.
  441. //
  442. STDMETHODIMP_(ULONG32) CHXRTPPacket::Release()
  443. {
  444.     if (InterlockedDecrement(&m_lRefCount) > 0)
  445.     {
  446. return m_lRefCount;
  447.     }
  448.     delete this;
  449.     return 0;
  450. }
  451. /************************************************************************
  452.  * Method:
  453.  * IHXPacket::Set
  454.  */
  455. STDMETHODIMP CHXRTPPacket::Set
  456. (
  457.     IHXBuffer* pBuffer, 
  458.     ULONG32 ulTime,
  459.     UINT16 uStreamNumber,
  460.     UINT8 unASMFlags,
  461.     UINT16 unASMRuleNumber
  462. )
  463. {
  464.     m_ulRTPTime = ulTime;
  465.     return _Set(pBuffer, 
  466. ulTime,
  467. uStreamNumber,
  468. unASMFlags,
  469. unASMRuleNumber);
  470. }
  471. /************************************************************************
  472.  * Method:
  473.  * IHXRTPPacket::GetRTP
  474.  */
  475. STDMETHODIMP CHXRTPPacket::GetRTP
  476. (
  477.     REF(IHXBuffer*) pBuffer, 
  478.     REF(ULONG32) ulTime,
  479.     REF(ULONG32) ulRTPTime,
  480.     REF(UINT16) uStreamNumber,
  481.     REF(UINT8) unASMFlags,
  482.     REF(UINT16) unASMRuleNumber
  483. )
  484. {
  485.     ulRTPTime = m_ulRTPTime;
  486.     return _Get(pBuffer,
  487. ulTime,
  488. uStreamNumber,
  489. unASMFlags,
  490. unASMRuleNumber);
  491. }
  492. /************************************************************************
  493.  * Method:
  494.  * IHXRTPPacket::GetRTPTime
  495.  */
  496. STDMETHODIMP_(ULONG32) CHXRTPPacket::GetRTPTime()
  497. {
  498.     return m_ulRTPTime;
  499. }
  500. /************************************************************************
  501.  * Method:
  502.  * IHXRTPPacket::SetRTP
  503.  */
  504. STDMETHODIMP CHXRTPPacket::SetRTP
  505. (
  506.     IHXBuffer*     pBuffer, 
  507.     ULONG32     ulTime,
  508.     ULONG32     ulRTPTime,
  509.     UINT16     uStreamNumber,
  510.     UINT8     unASMFlags,
  511.     UINT16     unASMRuleNumber
  512. )
  513. {
  514.     m_ulRTPTime = ulRTPTime;
  515.     return _Set(pBuffer, 
  516. ulTime,
  517. uStreamNumber,
  518. unASMFlags,
  519. unASMRuleNumber);
  520. }
  521. /////////////////////////////////////////////////////////////////////////
  522. // CHXHeader
  523. //
  524. /////////////////////////////////////////////////////////////////////////
  525. // Method:
  526. // IUnknown::QueryInterface
  527. // Purpose:
  528. // Implement this to export the interfaces supported by your 
  529. // object.
  530. //
  531. STDMETHODIMP CHXHeader::QueryInterface(REFIID riid, void** ppvObj)
  532. {
  533.     if (IsEqualIID(riid, IID_IUnknown))
  534.     {
  535. AddRef();
  536. *ppvObj = this;
  537. return HXR_OK;
  538.     }
  539.     else if (IsEqualIID(riid, IID_IHXValues))
  540.     {
  541. AddRef();
  542. *ppvObj = (IHXValues*)this;
  543. return HXR_OK;
  544.     }
  545.     *ppvObj = NULL;
  546.     return HXR_NOINTERFACE;
  547. }
  548. /////////////////////////////////////////////////////////////////////////
  549. // Method:
  550. // IUnknown::AddRef
  551. // Purpose:
  552. // Everyone usually implements this the same... feel free to use
  553. // this implementation.
  554. //
  555. STDMETHODIMP_(ULONG32) CHXHeader::AddRef()
  556. {
  557.     return InterlockedIncrement(&m_lRefCount);
  558. }
  559. /////////////////////////////////////////////////////////////////////////
  560. // Method:
  561. // IUnknown::Release
  562. // Purpose:
  563. // Everyone usually implements this the same... feel free to use
  564. // this implementation.
  565. //
  566. STDMETHODIMP_(ULONG32) CHXHeader::Release()
  567. {
  568.     if (InterlockedDecrement(&m_lRefCount) > 0)
  569.     {
  570. return m_lRefCount;
  571.     }
  572.     delete this;
  573.     return 0;
  574. }
  575. CHXHeader::~CHXHeader()
  576. {
  577.     CHXMapStringToOb::Iterator i;
  578.     // clean up UINT32 properties
  579.     for (i = m_ULONG32Map.Begin(); i != m_ULONG32Map.End(); ++i)
  580.     {
  581. _CStoreNameUINT32Pair* pnupExpired = (_CStoreNameUINT32Pair*)*i;
  582. delete pnupExpired;
  583.     }
  584.     m_ULONG32Map.RemoveAll();
  585.     // clean up buffer properties
  586.     for (i = m_BufferMap.Begin(); i != m_BufferMap.End(); ++i)
  587.     {
  588. _CStoreNameBufferPair* pnbpExpired = (_CStoreNameBufferPair*)*i;
  589. delete pnbpExpired;
  590.     }
  591.     m_BufferMap.RemoveAll();
  592.     // clean up string properties
  593.     for (i = m_CStringMap.Begin(); i != m_CStringMap.End(); ++i)
  594.     {
  595. _CStoreNameBufferPair* pnbpExpired = (_CStoreNameBufferPair*)*i;
  596. delete pnbpExpired;
  597.     }
  598.     m_CStringMap.RemoveAll();
  599. }
  600. STDMETHODIMP
  601. CHXHeader::SetPropertyULONG32      (
  602. const char*          pPropertyName,
  603. ULONG32              uPropertyValue)
  604. {
  605.     _CStoreNameUINT32Pair* pnupNew = new _CStoreNameUINT32Pair;
  606.     if(!pnupNew)
  607.     {
  608.         return HXR_OUTOFMEMORY;
  609.     }
  610.     pnupNew->SetName(pPropertyName);
  611.     pnupNew->SetValue(uPropertyValue);
  612.     char* pMapString = new_string(pPropertyName);
  613.     if(!pMapString)
  614.     {
  615.         HX_DELETE(pnupNew);
  616.         return HXR_OUTOFMEMORY;
  617.     }
  618.     if(!m_bPreserveCase)
  619.     {
  620. strlwr(pMapString);
  621.     }
  622.     // First make sure there isn't already a property by that name set!
  623.     _CStoreNameUINT32Pair* pnupExpired = NULL;
  624.     if (m_ULONG32Map.Lookup(pMapString, (void*&)pnupExpired))
  625.     {
  626. /* Delete the previously added property */
  627. delete pnupExpired;
  628.     }
  629.     m_ULONG32Map[pMapString] = (void*)pnupNew;
  630.     delete [] pMapString;
  631.     return HXR_OK;
  632. }
  633. STDMETHODIMP
  634. CHXHeader::GetPropertyULONG32      (
  635. const char*          pPropertyName,
  636. REF(ULONG32)         uPropertyValue)
  637. {
  638.     HX_RESULT rc = HXR_OK;
  639.     _CStoreNameUINT32Pair* pnupData = NULL;
  640.     char* pMapString = new_string(pPropertyName);
  641.     if( !pMapString )
  642.     {
  643.         return HXR_OUTOFMEMORY;
  644.     }
  645.    
  646.     if(!m_bPreserveCase)
  647.     {
  648. strlwr(pMapString);
  649.     }
  650.     if (!m_ULONG32Map.Lookup(pMapString, (void*&)pnupData))
  651.     {
  652. rc = HXR_FAILED;
  653.     }
  654.     else
  655.     {
  656. uPropertyValue = pnupData->GetValue();
  657.     }
  658.     delete[] pMapString;
  659.     return rc;
  660. }
  661. STDMETHODIMP
  662. CHXHeader::GetFirstPropertyULONG32   (
  663. REF(const char*)     pPropertyName,
  664. REF(ULONG32)         uPropertyValue)
  665. {
  666.     if ((m_ULONG32Position = m_ULONG32Map.GetStartPosition()) == NULL)
  667. return HXR_FAILED;
  668.     _CStoreNameUINT32Pair* pnupData = NULL;
  669.     m_ULONG32Map.GetNextAssoc(m_ULONG32Position,
  670.                               pPropertyName,
  671.                               (void*&)pnupData);
  672.     pPropertyName = pnupData->GetName();
  673.     uPropertyValue = pnupData->GetValue();
  674.     return HXR_OK;
  675. }
  676. STDMETHODIMP
  677. CHXHeader::GetNextPropertyULONG32   (
  678. REF(const char*)    pPropertyName,
  679. REF(ULONG32)        uPropertyValue)
  680. {
  681.     if (!m_ULONG32Position)
  682. return HXR_FAILED;
  683.     _CStoreNameUINT32Pair* pnupData = NULL;
  684.     m_ULONG32Map.GetNextAssoc(m_ULONG32Position,
  685.                               pPropertyName,
  686.                               (void*&)pnupData);
  687.     pPropertyName = pnupData->GetName();
  688.     uPropertyValue = pnupData->GetValue();
  689.     return HXR_OK;
  690. }
  691. STDMETHODIMP
  692. CHXHeader::SetPropertyBuffer     (
  693. const char*         pPropertyName,
  694. IHXBuffer*         pPropertyValue)
  695. {
  696.     if (!pPropertyValue) return HXR_UNEXPECTED;
  697.     _CStoreNameBufferPair* pnbpNew = new _CStoreNameBufferPair;
  698.     if(!pnbpNew)
  699.     {
  700.         return HXR_OUTOFMEMORY;
  701.     }
  702.     pnbpNew->SetName(pPropertyName);
  703.     pnbpNew->SetValue(pPropertyValue);
  704.     char* pMapString = new_string(pPropertyName);
  705.     if(!pMapString)
  706.     {
  707.         HX_DELETE(pnbpNew);
  708.         return HXR_OUTOFMEMORY;
  709.     }
  710.     if(!m_bPreserveCase)
  711.     {
  712. strlwr(pMapString);
  713.     }
  714.     // First make sure there isn't already a property by that name set!
  715.     _CStoreNameBufferPair* pnbpExpired = NULL;
  716.     if (m_BufferMap.Lookup(pMapString, (void*&)pnbpExpired))
  717.     {
  718. /* Delete the previously added property */
  719. delete pnbpExpired;
  720.     }
  721.     m_BufferMap[pMapString] = (void*)pnbpNew;
  722.     delete [] pMapString;
  723.     return HXR_OK;
  724. }
  725. STDMETHODIMP
  726. CHXHeader::GetPropertyBuffer     (
  727. const char*         pPropertyName,
  728. REF(IHXBuffer*)    pPropertyValue)
  729. {
  730.     HX_RESULT rc = HXR_OK;
  731.     _CStoreNameBufferPair* pnbpData = NULL;
  732.     char* pMapString = new_string(pPropertyName);
  733.     if(!pMapString)
  734.     {
  735.         return HXR_OUTOFMEMORY;
  736.     }
  737.     if(!m_bPreserveCase)
  738.     {
  739. strlwr(pMapString);
  740.     }
  741.     if (!m_BufferMap.Lookup(pMapString, (void*&)pnbpData))
  742.     {
  743. rc = HXR_FAILED;
  744.     }
  745.     else
  746.     {
  747. pPropertyValue = pnbpData->GetValue();
  748.     }
  749.     delete [] pMapString;
  750.     return rc;
  751. }
  752. #if 0
  753. STDMETHODIMP
  754. CHXHeader::GetEncodedPropertyBuffer(
  755. const char*     pPropertyName,
  756. REF(IHXBuffer*)    pPropertyValue)
  757. {
  758.     IHXBuffer* pTempPropertyValue;
  759.     char* lwr;
  760.     lwr = new_string(pPropertyName);
  761.     strlwr(lwr);
  762.     if (!m_BufferMap.Lookup(lwr, (void*&)pTempPropertyValue))
  763.     {
  764. delete [] lwr;
  765. return HXR_FAILED;
  766.     }
  767.     pPropertyValue = encodeBuffer(pTempPropertyValue);
  768.     delete [] lwr;
  769.     return HXR_OK;
  770. #endif
  771. STDMETHODIMP
  772. CHXHeader::GetFirstPropertyBuffer   (
  773. REF(const char*)    pPropertyName,
  774. REF(IHXBuffer*)    pPropertyValue)
  775. {
  776.     if ((m_BufferPosition = m_BufferMap.GetStartPosition()) == NULL)
  777. return HXR_FAILED;
  778.     _CStoreNameBufferPair* pnbpData = NULL;
  779.     m_BufferMap.GetNextAssoc(m_BufferPosition,
  780.                              pPropertyName,
  781.                              (void*&)pnbpData);
  782.     pPropertyName = pnbpData->GetName();
  783.     pPropertyValue = pnbpData->GetValue();
  784.     return HXR_OK;
  785. }
  786. STDMETHODIMP
  787. CHXHeader::GetNextPropertyBuffer    (
  788. REF(const char*)    pPropertyName,
  789. REF(IHXBuffer*)    pPropertyValue)
  790. {
  791.     if (!m_BufferPosition)
  792. return HXR_FAILED;
  793.     _CStoreNameBufferPair* pnbpData = NULL;
  794.     m_BufferMap.GetNextAssoc(m_BufferPosition,
  795.                              pPropertyName,
  796.                              (void*&)pnbpData);
  797.     pPropertyName = pnbpData->GetName();
  798.     pPropertyValue = pnbpData->GetValue();
  799.     return HXR_OK;
  800. }
  801. STDMETHODIMP
  802. CHXHeader::SetPropertyCString     (
  803. const char*         pPropertyName,
  804. IHXBuffer*         pPropertyValue)
  805. {
  806.     if (!pPropertyValue) return HXR_UNEXPECTED;
  807.     _CStoreNameBufferPair* pnbpNew = new _CStoreNameBufferPair;
  808.     if(!pnbpNew)
  809.     {
  810.         return HXR_OUTOFMEMORY;
  811.     }
  812.     pnbpNew->SetName(pPropertyName);
  813.     pnbpNew->SetValue(pPropertyValue);
  814.     char* pMapString = new_string(pPropertyName);
  815.     if(!pMapString)
  816.     {
  817.         HX_DELETE(pnbpNew);
  818.         return HXR_OUTOFMEMORY;
  819.     }
  820.     if(!m_bPreserveCase)
  821.     {
  822. strlwr(pMapString);
  823.     }
  824.     // First make sure there isn't already a property by that name set!
  825.     _CStoreNameBufferPair* pnbpExpired = NULL;
  826.     if (m_CStringMap.Lookup(pMapString, (void*&)pnbpExpired))
  827.     {
  828. /* Delete the previously added property */
  829. delete pnbpExpired;
  830.     }
  831.     m_CStringMap[pMapString] = (void*)pnbpNew;
  832.     delete[] pMapString;
  833.     return HXR_OK;
  834. }
  835. STDMETHODIMP
  836. CHXHeader::GetPropertyCString     (
  837. const char*         pPropertyName,
  838. REF(IHXBuffer*)    pPropertyValue)
  839. {
  840.     HX_RESULT rc = HXR_OK;
  841.     _CStoreNameBufferPair* pnbpData = NULL;
  842.     char* pMapString = new_string(pPropertyName);
  843.     if(!pMapString)
  844.     {
  845.         return HXR_OUTOFMEMORY;
  846.     }
  847.     if(!m_bPreserveCase)
  848.     {
  849. strlwr(pMapString);
  850.     }
  851.     if (!m_CStringMap.Lookup(pMapString, (void*&)pnbpData))
  852.     {
  853. rc = HXR_FAILED;
  854.     }
  855.     else
  856.     {
  857. pPropertyValue = pnbpData->GetValue();
  858.     }
  859.     delete[] pMapString;
  860.     return rc;
  861. }
  862. #if 0
  863. STDMETHODIMP
  864. CHXHeader::GetEncodedPropertyCString (
  865. const char*     pPropertyName,
  866. REF(IHXBuffer*)    pPropertyValue)
  867. {
  868.     char* lwr;
  869.     lwr = new_string(pPropertyName);
  870.     strlwr(lwr);
  871.     IHXBuffer* pTempPropertyValue;
  872.     if (!m_CStringMap.Lookup(lwr, (void*&)pTempPropertyValue))
  873.     {
  874. delete[] lwr;
  875. return HXR_FAILED;
  876.     }
  877.     pPropertyValue = encodeCString(pTempPropertyValue);
  878.     delete[] lwr;
  879.     return HXR_OK;
  880. }
  881. #endif
  882. STDMETHODIMP
  883. CHXHeader::GetFirstPropertyCString   (
  884. REF(const char*)    pPropertyName,
  885. REF(IHXBuffer*)    pPropertyValue)
  886. {
  887.     if ((m_CStringPosition = m_CStringMap.GetStartPosition()) == NULL)
  888. return HXR_FAILED;
  889.     _CStoreNameBufferPair* pnbpData = NULL;
  890.     m_CStringMap.GetNextAssoc(m_CStringPosition,
  891.                               pPropertyName,
  892.                               (void*&)pnbpData);
  893.     pPropertyName = pnbpData->GetName();
  894.     pPropertyValue = pnbpData->GetValue();
  895.     return HXR_OK;
  896. }
  897. STDMETHODIMP
  898. CHXHeader::GetNextPropertyCString    (
  899. REF(const char*)    pPropertyName,
  900. REF(IHXBuffer*)    pPropertyValue)
  901. {
  902.     if (!m_CStringPosition)
  903. return HXR_FAILED;
  904.     _CStoreNameBufferPair* pnbpData = NULL;
  905.     m_CStringMap.GetNextAssoc(m_CStringPosition,
  906.                               pPropertyName,
  907.                               (void*&)pnbpData);
  908.     pPropertyName = pnbpData->GetName();
  909.     pPropertyValue = pnbpData->GetValue();
  910.     return HXR_OK;
  911. }
  912. void
  913. CHXHeader::mergeHeaders
  914. (
  915.     IHXValues* pIHXValuesDestHeaders, 
  916.     IHXValues* pIHXValuesSourceHeaders
  917. )
  918. {
  919.     if(pIHXValuesSourceHeaders && pIHXValuesDestHeaders)
  920.     {
  921. // add these headers to the existing ones
  922. //
  923. const char* pPropName = NULL;
  924. UINT32 ulPropValue = 0;
  925. HX_RESULT rc = pIHXValuesSourceHeaders->GetFirstPropertyULONG32
  926. (
  927.     pPropName, 
  928.     ulPropValue
  929. );
  930. while(SUCCEEDED(rc))
  931. {
  932.     pIHXValuesDestHeaders->SetPropertyULONG32
  933.     (
  934. pPropName, 
  935. ulPropValue
  936.     );
  937.     rc = pIHXValuesSourceHeaders->GetNextPropertyULONG32
  938.     (
  939. pPropName, 
  940. ulPropValue
  941.     );
  942. }
  943. IHXBuffer* pBuffer = NULL;
  944. rc = pIHXValuesSourceHeaders->GetFirstPropertyBuffer
  945. (
  946.     pPropName, 
  947.     pBuffer
  948. );
  949. while(SUCCEEDED(rc))
  950. {
  951.     pIHXValuesDestHeaders->SetPropertyBuffer(pPropName, pBuffer);
  952.     pBuffer->Release();
  953.     rc = pIHXValuesSourceHeaders->GetNextPropertyBuffer
  954.     (
  955. pPropName, 
  956. pBuffer
  957.     );
  958. }
  959. rc = pIHXValuesSourceHeaders->GetFirstPropertyCString
  960. (
  961.     pPropName, 
  962.     pBuffer
  963. );
  964. while(SUCCEEDED(rc))
  965. {
  966.     pIHXValuesDestHeaders->SetPropertyCString(pPropName, pBuffer);
  967.     pBuffer->Release();
  968.     rc = pIHXValuesSourceHeaders->GetNextPropertyCString
  969.     (
  970. pPropName, 
  971. pBuffer
  972.     );
  973. }
  974.     }
  975. }
  976. _CStoreName::_CStoreName() : m_strName()
  977. {
  978. }
  979. _CStoreName::~_CStoreName()
  980. {
  981. }
  982. const CHXString& _CStoreName::GetName() const
  983. {
  984.     return m_strName;
  985. }
  986. void _CStoreName::SetName(const char* szName)
  987. {
  988.     m_strName = szName;
  989. }
  990. _CStoreNameUINT32Pair::_CStoreNameUINT32Pair() : m_ulValue(0)
  991. {
  992. }
  993. _CStoreNameUINT32Pair::~_CStoreNameUINT32Pair()
  994. {
  995. }
  996. UINT32 _CStoreNameUINT32Pair::GetValue()
  997. {
  998.     return m_ulValue;
  999. }
  1000. void _CStoreNameUINT32Pair::SetValue(UINT32 ulValue)
  1001. {
  1002.     m_ulValue = ulValue;
  1003. }
  1004. _CStoreNameBufferPair::_CStoreNameBufferPair() : m_pbufValue(NULL)
  1005. {
  1006. }
  1007. _CStoreNameBufferPair::~_CStoreNameBufferPair()
  1008. {
  1009.     HX_RELEASE(m_pbufValue);
  1010. }
  1011. IHXBuffer* _CStoreNameBufferPair::GetValue()
  1012. {
  1013.     if(m_pbufValue)
  1014.     {
  1015. m_pbufValue->AddRef();
  1016.     }
  1017.     return m_pbufValue;
  1018. }
  1019. void _CStoreNameBufferPair::SetValue(IHXBuffer* pbufValue)
  1020. {
  1021.     HX_RELEASE(m_pbufValue);
  1022.     m_pbufValue = pbufValue;
  1023.     if(m_pbufValue)
  1024.     {
  1025. m_pbufValue->AddRef();
  1026.     }
  1027. }
  1028. #if 0
  1029. IHXBuffer*
  1030. CHXHeader::encodeBuffer(IHXBuffer* pBuffer)
  1031. {
  1032.     //XXXBAB - come back to this soon...
  1033.     CHXBuffer* pEncodedBuffer = new CHXBuffer;
  1034.     pEncodedBuffer->AddRef();
  1035.     pEncodedBuffer->Set(pBuffer->GetBuffer(), pBuffer->GetSize());
  1036.     return pEncodedBuffer;
  1037. }
  1038. IHXBuffer*
  1039. CHXHeader::encodeCString(IHXBuffer* pBuffer)
  1040. {
  1041.     CHXString tmp;
  1042.     const char* pStr = (const char*)pBuffer->GetBuffer();
  1043.     BOOL inEscape = FALSE;
  1044.     for(size_t i=0;i<strlen(pStr);++i)
  1045.     {
  1046. switch(pStr[i])
  1047. {
  1048.     case 'n':
  1049.     {
  1050. tmp += "\n";
  1051.     }
  1052.     break;
  1053.     case 't':
  1054.     {
  1055. tmp += "\t";
  1056.     }
  1057.     break;
  1058.     case 'r':
  1059.     {
  1060. tmp += "\r";
  1061.     }
  1062.     break;
  1063.     case '"':
  1064.     {
  1065. tmp += "\"";
  1066.     }
  1067.     break;
  1068.     case '\':
  1069.     {
  1070. tmp += "\\";
  1071.     }
  1072.     break;
  1073.     default:
  1074.     {
  1075. tmp += pStr[i];
  1076.     }
  1077. }
  1078.     }
  1079.     CHXBuffer* pEncodedBuffer = new CHXBuffer;
  1080.     pEncodedBuffer->AddRef();
  1081.     pEncodedBuffer->Set((const BYTE*)(const char*)tmp, tmp.GetLength()+1);
  1082.     return pEncodedBuffer;
  1083. }
  1084. #endif