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

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 "hxtypes.h"
  36. #include "hxcom.h"
  37. #include "hxresult.h"
  38. #include "hxstrutl.h"
  39. #include "hxstring.h"
  40. #include "hxbuffer.h"
  41. #include "hxccf.h"
  42. #include "hxassert.h"
  43. #include "packedvalues.h"
  44. inline UINT32
  45. PackedValues::size(IHXValues* pValues)
  46. {
  47.     if (!pValues)
  48.     {
  49. return 0;
  50.     }
  51.     const char* pPropName;
  52.     ULONG32 uPropValue;
  53.     IHXBuffer* pBuffer;
  54.     HX_RESULT retVal;
  55.     UINT32 ulSize = sizeof(PackedValuesHeader) + 4; //header, nitems
  56.     //ULONG32
  57.     retVal = pValues->GetFirstPropertyULONG32(pPropName, uPropValue);
  58.     while (retVal == HXR_OK)
  59.     {
  60. ulSize += 1 + 1 + (strlen(pPropName)+1) + 2 + 4;
  61. retVal = pValues->GetNextPropertyULONG32(pPropName, uPropValue);
  62.     }
  63.     //CString
  64.     retVal = pValues->GetFirstPropertyCString(pPropName, pBuffer);
  65.     while (retVal == HXR_OK)
  66.     {
  67. ulSize += 1 + 1 + (strlen(pPropName)+1) + 2 + pBuffer->GetSize();
  68. pBuffer->Release();
  69. retVal = pValues->GetNextPropertyCString(pPropName, pBuffer);
  70.     }
  71.     //Buffer
  72.     retVal = pValues->GetFirstPropertyBuffer(pPropName, pBuffer);
  73.     while (retVal == HXR_OK)
  74.     {
  75. ulSize += 1 + 1 + (strlen(pPropName)+1) + 2 + pBuffer->GetSize();
  76. pBuffer->Release();
  77. retVal = pValues->GetNextPropertyBuffer(pPropName, pBuffer);
  78.     }
  79.     return ulSize;
  80. }
  81. UINT32 PackedValues::packone(UINT8* buf, UINT8 type, UINT8 name_length, UINT8* name, UINT16 value_length, UINT8* value_data)
  82. {
  83.     UINT8* off = buf;
  84.     *off++ = type;
  85.     *off++ = name_length;
  86.     {memcpy(off, name, name_length); off += name_length; }
  87.     {*off++ = (UINT8) (value_length>>8); *off++ = (UINT8) (value_length);}
  88.     {memcpy(off, value_data, value_length); off += value_length; }
  89.     return off-buf;
  90. }
  91. HX_RESULT PackedValues::pack(UINT8* buf, UINT32 &len, IHXValues* pValues, UINT8 fourCC[4])
  92. {
  93.     HX_ASSERT(len >= size(pValues));
  94.     if (!pValues)
  95.     {
  96. len = 0;
  97. return HXR_FAIL;
  98.     }
  99.     PackedValuesHeader* pHeader = (PackedValuesHeader*)buf;
  100.     memcpy(pHeader->fourCC, fourCC, 4);
  101.     buf += sizeof(PackedValuesHeader);
  102.     UINT8* off = buf + 4; //header, nitems
  103.     const char* pPropName;
  104.     ULONG32 uPropValue;
  105.     IHXBuffer* pBuffer;
  106.     HX_RESULT retVal;
  107.     UINT32 uTotal = 0;
  108.     //pack ULONG32
  109.     retVal = pValues->GetFirstPropertyULONG32(pPropName, uPropValue);
  110.     while (retVal == HXR_OK)
  111.     {
  112. uTotal++;
  113. UINT8 pULONGBuffer[4];
  114. pULONGBuffer[0] = (UINT8)(uPropValue >> 24);pULONGBuffer[1] = (UINT8)(uPropValue >> 16);
  115. pULONGBuffer[2] = (UINT8)(uPropValue >> 8); pULONGBuffer[3] = (UINT8)(uPropValue);
  116. off += packone(off, PROP_TYPE_ULONG32, strlen(pPropName)+1, (UINT8*)pPropName, 4, pULONGBuffer);
  117. retVal = pValues->GetNextPropertyULONG32(pPropName, uPropValue);
  118.     }
  119.     //pack CString
  120.     retVal = pValues->GetFirstPropertyCString(pPropName, pBuffer);
  121.     while (retVal == HXR_OK)
  122.     {
  123. uTotal++;
  124. off += packone(off, PROP_TYPE_CSTRING, strlen(pPropName)+1, (UINT8*)pPropName, (UINT16)(pBuffer->GetSize()), pBuffer->GetBuffer());
  125. pBuffer->Release();
  126. retVal = pValues->GetNextPropertyCString(pPropName, pBuffer);
  127.     }
  128.     //pack Buffer
  129.     retVal = pValues->GetFirstPropertyBuffer(pPropName, pBuffer);
  130.     while (retVal == HXR_OK)
  131.     {
  132. uTotal++;
  133. off += packone(off, PROP_TYPE_BUFFER, strlen(pPropName)+1, (UINT8*)pPropName, (UINT16)(pBuffer->GetSize()), pBuffer->GetBuffer());
  134. pBuffer->Release();
  135. retVal = pValues->GetNextPropertyBuffer(pPropName, pBuffer);
  136.     }
  137.     //the total number of items
  138.     buf[0] = (UINT8)(uTotal >> 24); buf[1] = (UINT8)(uTotal >> 16);
  139.     buf[2] = (UINT8)(uTotal >> 8 ); buf[3] = (UINT8)(uTotal);
  140.     //header
  141.     UINT32 datasize = off - buf;
  142.     pHeader->size = datasize;
  143.     pHeader->pack();
  144.     len = off - buf + sizeof(PackedValuesHeader);
  145.     return HXR_OK;
  146. }
  147. HX_RESULT PackedValues::unpack(UINT8* buf, UINT32 len, IHXValues* pValues, IHXCommonClassFactory* pCCF)
  148. {
  149.     HX_ASSERT(buf && len > 0); HX_ASSERT(pValues);
  150.     PackedValuesHeader* pHeader = (PackedValuesHeader*)buf;
  151.     memcpy(m_fourCC, pHeader->fourCC, 4);
  152.     
  153.     buf += sizeof(PackedValuesHeader);
  154.     UINT8  type;
  155.     UINT8  name_length;
  156.     UINT8* name;
  157.     UINT16 value_length;
  158.     UINT8* value_data;
  159.     UINT8* off = buf + 4; //nitems
  160.     UINT32 uTotal = (buf[0]<<24) + (buf[1]<<16) + (buf[2]<<8) + buf[3];
  161.     HX_RESULT retVal = HXR_OK;
  162.     for (UINT32 i=0; i < uTotal && retVal == HXR_OK; i++)
  163.     {
  164. type = *off++;
  165. name_length = *off++;
  166. name = off; off += name_length;
  167. value_length = (off[0] << 8) + off[1]; off+=2;
  168. value_data = off; off += value_length;
  169. IHXBuffer* pBuffer = NULL;
  170. switch(type)
  171. {
  172.     case PROP_TYPE_ULONG32:
  173. pValues->SetPropertyULONG32((char*)name, (value_data[0]<<24) + (value_data[1]<<16) 
  174.  + (value_data[2]<<8) + value_data[3]);
  175. break;
  176.     case PROP_TYPE_CSTRING:
  177. if (pCCF)
  178. {
  179.     retVal = pCCF->CreateInstance(CLSID_IHXBuffer, (void**)&pBuffer);
  180.     if (retVal == HXR_OK)
  181.     {
  182. pBuffer->Set(value_data, value_length);
  183. pValues->SetPropertyCString((char*)name, pBuffer);
  184. pBuffer->Release();
  185.     }
  186. }
  187. break;
  188.     case PROP_TYPE_BUFFER:
  189. if (pCCF)
  190. {
  191.     retVal = pCCF->CreateInstance(CLSID_IHXBuffer, (void**)&pBuffer);
  192.     if (retVal == HXR_OK)
  193.     {
  194. pBuffer->Set(value_data, value_length);
  195. pValues->SetPropertyCString((char*)name, pBuffer);
  196. pBuffer->Release();
  197.     }
  198. }
  199. break;
  200. }
  201.     }
  202.     
  203.     return retVal;
  204. }