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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: pckunpck.h,v 1.4.28.3 2004/07/09 01:48:00 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. #ifndef PCKUNPCK_H
  50. #define PCKUNPCK_H
  51. /* Unfortunate but necessary includes */
  52. #include "hxtypes.h"
  53. #include "hxwintyp.h"
  54. #include "hxcom.h"
  55. #include "hxstring.h"
  56. #include <stdarg.h> /* for va_arg */
  57. /*
  58.  * forward decls
  59.  */
  60. typedef _INTERFACE IHXBuffer IHXBuffer;
  61. typedef _INTERFACE IHXValues IHXValues;
  62. /*
  63.  * packing/unpacking functions
  64.  * NOTE: this are Nick Hart's original methods imported
  65.  * directly from chinembed/unix/bufferutils.cpp
  66.  */
  67. HX_RESULT PackBuffer(REF(IHXBuffer*) pBuffer,
  68.      const char*      pFormat,
  69.      ...);
  70. HX_RESULT PackBufferV(REF(IHXBuffer*) pBuffer,
  71.       const char*      pFormat,
  72.       va_list vargs);
  73. int UnpackBuffer(REF(const char*) pBuffer,
  74.  const char*      pFormat,
  75.  ...);
  76. int UnpackBufferV(REF(const char*) pBuffer,
  77.   const char*      pFormat,
  78.   va_list          vargs);
  79. HX_RESULT PackValues(REF(CHXString) sBuffer,
  80.                      IHXValues*    pValues);
  81. HX_RESULT UnpackValues(REF(const char*) pBuffer,
  82.                        REF(IHXValues*) pValues,
  83.                        BOOL             bCreateValues = TRUE);
  84. HX_RESULT Bufferize(REF(IHXBuffer*) pBuffer,
  85.                     void*            pData,
  86.                     UINT32           uSize);
  87. #ifdef _DEBUG
  88. void TestBufferPacking();
  89. #endif
  90. /*
  91.  * NOTE: these are methods Eric Hyche added specifically
  92.  * for packing and unpacking IHXValues. They also add two
  93.  * additional options:
  94.  * a) binary packing (as opposed to Nick's text string packing); and 
  95.  * b) if you pass in an IUnknown context, then all your IHXBuffer's
  96.  *    and IHXValues will be created by the common class factory.
  97.  *    If you leave out the IUnknown, then IHXBuffer's will be 
  98.  *    directly created from CHXBuffer's and IHXValues will be created
  99.  *    directly from CHXHeader's.
  100.  */
  101. // GetBinaryPackedSize() returns the number of
  102. // bytes required to binary pack the IHXValues
  103. // that you pass in
  104. UINT32 GetBinaryPackedSize(IHXValues* pValues);
  105. // PackValuesBinary() packs the IHXValues you provide
  106. // in the IHXBuffer you provide in binary form. It assumes
  107. // that pBuffer is at least as big as the the
  108. // number of bytes returned by GetBinaryPackedSize(). If
  109. // pBuffer is not big enough, it will return HXR_FAIL.
  110. HX_RESULT PackValuesBinary(IHXBuffer* pBuffer,
  111.                            IHXValues* pValues);
  112. // CreateBuffer() creates an IHXBuffer. If you pass in
  113. // an IUnknown context, it will QI that context for
  114. // IHXCommonClassFactory and use IHXCommonClassFactory::CreateInstance()
  115. // to create the IHXBuffer. If you don't pass in an IUnknown context, then
  116. // it will do a "new CHXBuffer()" to create the IHXBuffer.
  117. HX_RESULT CreateBuffer(REF(IHXBuffer*) rpBuffer,
  118.                        IUnknown*        pContext = NULL);
  119. // CreateValues() creates an IHXValues. If you pass in
  120. // an IUnknown context, it will QI that context for
  121. // IHXCommonClassFactory and use IHXCommonClassFactory::CreateInstance()
  122. // to create the IHXValues. If you don't pass in an IUnknown context, then
  123. // it will do a "new CHXHeader()" to create the IHXValues.
  124. HX_RESULT CreateValues(REF(IHXValues*) rpValues,
  125.                        IUnknown*        pContext = NULL);
  126. // CreateStringBuffer() creates an IHXBuffer with the
  127. // string pszStr in it. The length of rpBuffer will
  128. // be strlen(pszStr) + 1. CreateStringBuffer() calls
  129. // CreateBuffer() to create the IHXBuffer.
  130. HX_RESULT CreateStringBuffer(REF(IHXBuffer*) rpBuffer,
  131.                              const char*      pszStr,
  132.                              IUnknown*        pContext = NULL);
  133. // SetCStringProperty() sets a CString property in
  134. // pValues where pszName is the property name
  135. // and the property value is pszValue. SetCStringProperty()
  136. // calls CreateStringBuffer() to create the IHXBuffer
  137. // which holds the property value string.
  138. HX_RESULT SetCStringProperty(IHXValues* pValues,
  139.                              const char* pszName,
  140.                              const char* pszValue,
  141.                              IUnknown*   pContext = NULL,
  142.                              BOOL        bSetAsBufferProp = FALSE);
  143. // SetCStringPropertyWithNullTerm() sets a CString property in
  144. // pValues where pszName is the property name
  145. // and the property value is in pBuf and ulLen. It's assumed
  146. // that pBuf and ulLen hold a string, but the string is
  147. // not NULL-terminated. Therefore, SetCStringPropertyWithNT()
  148. // will NULL-terminate the buffer in pBuf (making the
  149. // IHXBuffer it creates ulLen + 1).
  150. HX_RESULT SetCStringPropertyWithNullTerm(IHXValues*  pValues,
  151.                                          const char* pszName,
  152.                                          BYTE*       pBuf,
  153.                                          UINT32      ulLen,
  154.                                          IUnknown*   pContext = NULL,
  155.                                          BOOL        bSetAsBufferProp = FALSE);
  156. // CreateNullTermBuffer takes pBuf and ulLen, creates a
  157. // buffer of length ulLen+1, copies ulLen bytes
  158. // of pBuf into this new buffer, and then NULL-terminates
  159. // it. It then returns this buffer as an out parameter.
  160. HX_RESULT CreateNullTermBuffer(BYTE*  pBuf,
  161.                                UINT32 ulLen,
  162.                                char** ppNTBuf);
  163. // SetBufferPropety() sets a Buffer property in pValues.
  164. // First calls CreateBuffer() (see above) to create the
  165. // IHXBuffer, then calls IHXBuffer::Set() with the
  166. // provided pBuf and ulLen, and then sets this
  167. // property into the IHXValues.
  168. HX_RESULT SetBufferProperty(IHXValues* pValues,
  169.                             const char* pszName,
  170.                             BYTE*       pBuf,
  171.                             UINT32      ulLen,
  172.                             IUnknown*   pContext = NULL);
  173. // UnpackPropertyULONG32() unpacks a ULONG32 property
  174. // from binary form, and then sets that ULONG32 property
  175. // into the provided IHXValues. Initially rpBuf should
  176. // be set to the beginning of the packed ULONG32 and 
  177. // pLimit should be set to the end of the entire packing
  178. // buffer (this provides protection against corrupt data
  179. // buffer overruns). Upon return, rpBuf will be set to
  180. // the first byte past the end of the packed ULONG32.
  181. // UnpackPropertyULONG32() is called by UnpackValuesBinary().
  182. HX_RESULT UnpackPropertyULONG32(IHXValues* pValues,
  183.                                 REF(BYTE*)  rpBuf,
  184.                                 BYTE*       pLimit,
  185.                                 IUnknown*   pContext = NULL);
  186. // UnpackPropertyCString() unpacks a CString property
  187. // from binary form, and then sets that CString property
  188. // into the provided IHXValues. Initially rpBuf should
  189. // be set to the beginning of the packed CString and 
  190. // pLimit should be set to the end of the entire packing
  191. // buffer (this provides protection against corrupt data
  192. // buffer overruns). Upon return, rpBuf will be set to
  193. // the first byte past the end of the packed CString.
  194. // UnpackPropertyCString() is called by UnpackValuesBinary().
  195. HX_RESULT UnpackPropertyCString(IHXValues* pValues,
  196.                                 REF(BYTE*)  rpBuf,
  197.                                 BYTE*       pLimit,
  198.                                 IUnknown*   pContext = NULL);
  199. // UnpackPropertyBuffer() unpacks a Buffer property
  200. // from binary form, and then sets that Buffer property
  201. // into the provided IHXValues. Initially rpBuf should
  202. // be set to the beginning of the packed CString and 
  203. // pLimit should be set to the end of the entire packing
  204. // buffer (this provides protection against corrupt data
  205. // buffer overruns). Upon return, rpBuf will be set to
  206. // the first byte past the end of the packed Buffer.
  207. // UnpackPropertyBuffer() is called by UnpackValuesBinary().
  208. HX_RESULT UnpackPropertyBuffer(IHXValues* pValues,
  209.                                REF(BYTE*)  rpBuf,
  210.                                BYTE*       pLimit,
  211.                                IUnknown*   pContext = NULL);
  212. // UnpackValuesBinary() unpacks a binary-packed pBuffer into
  213. // the provided pValues. If pBuffer is not binary-packed, then
  214. // it will return HXR_FAIL. If you pass in an IUnknown context,
  215. // then it will use the common class factory to create the
  216. // necessary IHXBuffer's. Otherwise, it will use "new CHXBuffer()".
  217. HX_RESULT UnpackValuesBinary(IHXValues* pValues,
  218.                              IHXBuffer* pBuffer,
  219.                              IUnknown*   pContext = NULL);
  220. // UnpackValuesBinary() unpacks a binary-packed pBuffer into
  221. // the provided pValues. If pBuffer is not binary-packed, then
  222. // it will return HXR_FAIL. If you pass in an IUnknown context,
  223. // then it will use the common class factory to create the
  224. // necessary IHXBuffer's. Otherwise, it will use "new CHXBuffer()".
  225. HX_RESULT UnpackValuesBinary(IHXValues* pValues,
  226.                              BYTE*       pBuf,
  227.                              UINT32      ulLen,
  228.                              IUnknown*   pContext = NULL);
  229. // PackValues() packs pValues into an IHXBuffer and returns
  230. // the packed buffer into rpBuffer. If bPackBinary is TRUE,
  231. // it will pack the IHXValues as binary; otherwise, it
  232. // will pack the IHXValues as text. If you pass in an IUnknown context,
  233. // then it will use the common class factory to create the
  234. // necessary IHXBuffer's. Otherwise, it will use "new CHXBuffer()".
  235. HX_RESULT PackValues(REF(IHXBuffer*) rpBuffer,
  236.                      IHXValues*      pValues,
  237.                      BOOL             bPackBinary = FALSE,
  238.                      IUnknown*        pContext = NULL);
  239. // UnpackValues() unpacks an IHXBuffer into rpValues. It 
  240. // automatically detects whether pBuffer is binary-packed
  241. // or text-packed (as long as PackValues() was used to pack
  242. // the IHXValues).
  243. HX_RESULT UnpackValues(REF(IHXValues*) rpValues,
  244.                        IHXBuffer*      pBuffer,
  245.                        IUnknown*        pContext = NULL);
  246. // UnpackValues() unpacks an IHXBuffer into rpValues. It 
  247. // automatically detects whether pBuffer is binary-packed
  248. // or text-packed (as long as PackValues() was used to pack
  249. // the IHXValues).
  250. HX_RESULT UnpackValues(REF(IHXValues*) rpValues,
  251.                        BYTE*            pBuf,
  252.                        UINT32           ulLen,
  253.                        IUnknown*        pContext = NULL);
  254. // AreValuesInclusiveIdentical() checks whether all the
  255. // properties in pValues1 are:
  256. // a) in pValues2; AND
  257. // b) identical to the corresponding properties in pValues2.
  258. BOOL AreValuesInclusiveIdentical(IHXValues* pValues1,
  259.                                  IHXValues* pValues2);
  260. // AreValuesIdentical() returns
  261. // AreValuesInclusiveIdentical(pValues1, pValues2) &&
  262. // AreValuesInclusiveIdentical(pValues1, pValues2).
  263. // By checking inclusive identity in both directions, this
  264. // absolutely establishes identity between the contents
  265. // of pValues1 and pValues2.
  266. BOOL AreValuesIdentical(IHXValues* pValues1,
  267.                         IHXValues* pValues2);
  268. #ifdef _DEBUG
  269. // This tests text and binary packing of IHXValues.
  270. // It is also a good place to look for examples of how
  271. // to call PackValues() and UnpackValues().
  272. HX_RESULT TestValuesPacking(IUnknown* pContext = NULL);
  273. #endif
  274. #endif