old_hxpckts.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:27k
源码类别:

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