VXIvalue.h
上传用户:xqtpzdz
上传日期:2022-05-21
资源大小:1764k
文件大小:42k
源码类别:

xml/soap/webservice

开发平台:

Visual C++

  1. /****************License************************************************
  2.  * Vocalocity OpenVXI
  3.  * Copyright (C) 2004-2005 by Vocalocity, Inc. All Rights Reserved.
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *  
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  * Vocalocity, the Vocalocity logo, and VocalOS are trademarks or 
  18.  * registered trademarks of Vocalocity, Inc. 
  19.  * OpenVXI is a trademark of Scansoft, Inc. and used under license 
  20.  * by Vocalocity.
  21.  ***********************************************************************/
  22. #ifndef _VXIVALUE_H
  23. #define _VXIVALUE_H
  24. #include "VXItypes.h"                  /* For VXIchar, VXIint32, etc. */
  25. #include "VXIheaderPrefix.h"
  26. #ifdef VXIVALUE_EXPORTS
  27. #define VXIVALUE_API SYMBOL_EXPORT_DECL
  28. #else
  29. #define VXIVALUE_API SYMBOL_IMPORT_DECL
  30. #endif
  31. #ifdef __cplusplus
  32. extern "C" {
  33. #endif
  34. /** 
  35.  * defgroup VXIvalue Type library
  36.  *
  37.  * Abstract run-time types for VXI interferences and optionally
  38.  * implementation. These types mirror ECMAScript types (and could be
  39.  * implemented as such). They could also be implemented using C++ and
  40.  * STL, or using C. Using these abstract types rather than directly
  41.  * using an externally defined class library increases portability,
  42.  * and allows the implementers of each interface to independantly
  43.  * select external class libraries (or none at all) for their own
  44.  * implementation.<p>
  45.  *
  46.  * Each type is implemented as a handle that is obtained from a
  47.  * constructor and supports run-time typing. The owner (creator) of
  48.  * each type is responsible for freeing it by calling the appropriate
  49.  * destructor.<p>
  50.  *
  51.  * Note: When errors occur, constructors return a NULL object. 
  52.  * Typically this is due to running out of memory, or a type
  53.  * mismatch for copy constructors.<p>
  54.  *
  55.  * The value types are as follows, note that the naming convention is
  56.  * VXI followed by the type name starting with an uppercase letter, while
  57.  * the simple VXI types in VXIvalue.h use VXI followed by the type name
  58.  * starting with a lowercase letter:<p>
  59.  *
  60.  * <table border=0>
  61.  * <tr>
  62.  * <td valign=top> <b>VXIValue</b></td>
  63.  * <td valign=top> Abstract base type for all the rest, can cast any type to
  64.  *      this type and still determine the original type. Used
  65.  *      to provide input/return values where the actual underlying
  66.  *      type can vary. </td>
  67.  * </tr>
  68.  * <tr>
  69.  * <td valign=top><b>VXIBoolean</b></td><td>   Container for a boolean (VXIbool) </td>
  70.  * </tr>
  71.  * <tr>
  72.  * <td valign=top><b>VXIInteger</b></td><td>   Container for a 32-bit integer (VXIint32) </td>
  73.  * </tr>
  74.  * <tr>
  75.  * <td valign=top><b>VXILong</b></td><td>      Container for a 32-bit long (VXIlong) </td>
  76.  * </tr>
  77.  * <tr>
  78.  * <td valign=top><b>VXIULong</b></td><td>     Container for a 32-bit unsigned int (VXIulong) </td>
  79.  * </tr>
  80.  * <tr>
  81.  * <td valign=top><b> VXIFloat</b></td><td>     Container for a 32-bit float type (VXIflt32) </td>
  82.  * </tr>
  83.  * <tr>
  84.  * <td valign=top><b> VXIDouble</b></td><td>    Container for a 32-bit double type (VXIflt64) </td>
  85.  * </tr>
  86.  * <tr>
  87.  * <td valign=top><b> VXIString</b></td><td>    Container for a string (VXIchar) </td>
  88.  * </tr>
  89.  * <tr>
  90.  * <td valign=top><b> VXIPtr</b></td><td>       Container for a untyped pointer (VXIptr) </td>
  91.  * </tr>
  92.  * <tr>
  93.  * <td valign=top><b> VXIContent</b></td><td>   Container for MIME content typed data (VXIptr) </td>
  94.  * </tr>
  95.  * <tr>
  96.  * <td valign=top><b> VXIMap</b></td>
  97.  * <td>    Simple key/value container where the keys are of VXIchar 
  98.  *         type and the values are any of the abstract types defined 
  99.  *        here.</td>
  100.  * </tr>
  101.  * <tr>
  102.  * <td valign=top><b>  VXIVector</b></td>
  103.  *  <td>    Simple indexed vector that supports appending elements 
  104.  *          at the end, and getting and setting elements by index.
  105.  *          There is no support for removing elements or insertions. </td>
  106.  * </tr>
  107.  * </table>
  108.  */
  109. /*@{*/
  110. /* 
  111.  * 
  112.  * If real structures aren't already declared 
  113.  */
  114. #ifndef VXIVALUE_REAL_STRUCTS  
  115. /*
  116.  * Define each type as an opaque structure to get full information hiding
  117.  * while ensuring strong compiler type checks. The actual implementation
  118.  * defines these structures however it wants.
  119.  */
  120. #ifdef __cplusplus
  121. struct VXIValue;
  122. struct VXIBoolean;
  123. struct VXIInteger;
  124. struct VXIFloat;
  125. struct VXIString;
  126. struct VXIPtr;
  127. struct VXIContent;
  128. struct VXIMap;
  129. struct VXIVector;
  130. struct VXIDouble;
  131. struct VXIULong;
  132. struct VXILong;
  133.   
  134. struct VXIMapIterator;
  135. #else
  136. typedef struct VXIValue   { void * dummy; } VXIValue;
  137. typedef struct VXIBoolean { void * dummy; } VXIBoolean;
  138. typedef struct VXIInteger { void * dummy; } VXIInteger;
  139. typedef struct VXIFloat   { void * dummy; } VXIFloat;
  140. typedef struct VXIString  { void * dummy; } VXIString;
  141. typedef struct VXIPtr     { void * dummy; } VXIPtr;
  142. typedef struct VXIContent { void * dummy; } VXIContent;
  143. typedef struct VXIMap     { void * dummy; } VXIMap;
  144. typedef struct VXIVector  { void * dummy; } VXIVector;
  145. typedef struct VXIDouble  { void * dummy; } VXIDouble;
  146. typedef struct VXIULong   { void * dummy; } VXIULong;
  147. typedef struct VXILong    { void * dummy; } VXILong;
  148. typedef struct VXIMapIterator  { void * dummy; } VXIMapIterator;
  149. #endif
  150. #define VXIArgs VXIMap /* For backward compatibility use only */
  151. #endif /* VXIVALUE_REAL_STRUCTS */
  152. /*
  153.  * VXI Value types:
  154.  *  0x0000 - 0x00FF           reserved for definition in this header
  155.  *  0x0100 - 0xFFFF           reserved for implementation specific definition
  156.  */
  157. typedef VXIint32 VXIvalueType;
  158. enum {
  159.   VALUE_INTEGER    = 0,
  160.   VALUE_FLOAT      = 1,
  161.   VALUE_STRING     = 2,
  162.   VALUE_PTR        = 3,
  163.   VALUE_MAP        = 4,
  164.   VALUE_VECTOR     = 5,
  165.   VALUE_CONTENT    = 6,
  166.   VALUE_BOOLEAN    = 7,
  167.   VALUE_DOUBLE     = 8,
  168.   VALUE_LONG       = 9,
  169.   VALUE_ULONG      = 10
  170. };
  171. /**
  172.  * Result codes for function methods
  173.  * 
  174.  * Result codes less than zero are severe errors (likely to be
  175.  * platform faults), those greater than zero are warnings (likely to
  176.  * be application issues) 
  177.  */
  178. typedef enum VXIvalueResult {
  179.   /* Fatal error, terminate call    */
  180.   VXIvalue_RESULT_FATAL_ERROR       =  -100, 
  181.   /* I/O error                      */
  182.   VXIvalue_RESULT_IO_ERROR           =   -8,
  183.   /* Out of memory                  */
  184.   VXIvalue_RESULT_OUT_OF_MEMORY      =   -7, 
  185.   /* System error, out of service   */
  186.   VXIvalue_RESULT_SYSTEM_ERROR       =   -6, 
  187.   /* Errors from platform services  */
  188.   VXIvalue_RESULT_PLATFORM_ERROR     =   -5, 
  189.   /* Return buffer too small        */
  190.   VXIvalue_RESULT_BUFFER_TOO_SMALL   =   -4, 
  191.   /* Property name is not valid    */
  192.   VXIvalue_RESULT_INVALID_PROP_NAME  =   -3, 
  193.   /* Property value is not valid   */
  194.   VXIvalue_RESULT_INVALID_PROP_VALUE =   -2, 
  195.   /* Invalid function argument      */
  196.   VXIvalue_RESULT_INVALID_ARGUMENT   =   -1, 
  197.   /* Success                        */
  198.   VXIvalue_RESULT_SUCCESS            =    0,
  199.   /* Normal failure, nothing logged */
  200.   VXIvalue_RESULT_FAILURE            =    1,
  201.   /* Non-fatal non-specific error   */
  202.   VXIvalue_RESULT_NON_FATAL_ERROR    =    2, 
  203.   /* Operation is not supported     */
  204.   VXIvalue_RESULT_UNSUPPORTED        =  100
  205. } VXIvalueResult;
  206. /**
  207.  * Get the type of a Value
  208.  *
  209.  * @param   v   Value to check
  210.  * @return      Type of value
  211.  */
  212. VXIVALUE_API VXIvalueType VXIValueGetType(const VXIValue *v);
  213. /**
  214.  * Generic Value destructor
  215.  *
  216.  * This automatically invokes the appropriate type specific
  217.  * destructor.
  218.  *
  219.  * @param   v   Value to destroy
  220.  */
  221. VXIVALUE_API void VXIValueDestroy(VXIValue **v);
  222. /**
  223.  * Generic Value clone
  224.  *
  225.  * This automatically invokes the appropriate type specific clone
  226.  * operation.
  227.  *
  228.  * @param   v   Value to clone
  229.  * @return      Clone of v, NULL on error
  230.  */
  231. VXIVALUE_API VXIValue *VXIValueClone(const VXIValue *v);
  232. /**
  233.  * Create a Boolean from a VXIbool
  234.  *
  235.  * @param   n   VXIbool value, either TRUE or FALSE
  236.  * @return      Boolean with the specified value on success, 
  237.  *              NULL otherwise
  238.  */
  239. VXIVALUE_API VXIBoolean *VXIBooleanCreate(VXIbool n);
  240. /**
  241.  * Boolean destructor
  242.  *
  243.  * @param   i   Boolean to destroy
  244.  */
  245. VXIVALUE_API void VXIBooleanDestroy(VXIBoolean **i);
  246. /**
  247.  * Get the value of a Boolean
  248.  *
  249.  * @param   i   Boolean to obtain the value from
  250.  * @return      VXIbool boolean value, either TRUE or FALSE
  251.  */
  252. VXIVALUE_API VXIbool VXIBooleanValue(const VXIBoolean *i);
  253. /**
  254.  * Create an Integer from a 32 bit integer
  255.  *
  256.  * @param   n   32 bit integer value
  257.  * @return      Integer with the specified value on success, 
  258.  *              NULL otherwise
  259.  */
  260. VXIVALUE_API VXIInteger *VXIIntegerCreate(VXIint32 n);
  261. /**
  262.  * Integer destructor
  263.  *
  264.  * @param   i   Integer to destroy
  265.  */
  266. VXIVALUE_API void VXIIntegerDestroy(VXIInteger **i);
  267. /**
  268.  * Get the value of an Integer
  269.  *
  270.  * @param   i   Integer to obtain the value from
  271.  * @return      32 bit integer value
  272.  */
  273. VXIVALUE_API VXIint32 VXIIntegerValue(const VXIInteger *i);
  274. /**
  275.  * Create an Long from a 32 bit long
  276.  *
  277.  * @param   n   32 bit long value
  278.  * @return      Long with the specified value on success, 
  279.  *              NULL otherwise
  280.  */
  281. VXIVALUE_API VXILong *VXILongCreate(VXIlong n);
  282. /**
  283.  * Long destructor
  284.  *
  285.  * @param   i   Long to destroy
  286.  */
  287. VXIVALUE_API void VXILongDestroy(VXILong **i);
  288. /**
  289.  * Get the value of an Long
  290.  *
  291.  * @param   i   Long to obtain the value from
  292.  * @return      32 bit long value
  293.  */
  294. VXIVALUE_API VXIlong VXILongValue(const VXILong *i);
  295. /**
  296.  * Create an ULong from a 32 bit unsigned long
  297.  *
  298.  * @param   n   32 bit unsigned long value
  299.  * @return      ULong with the specified value on success, 
  300.  *              NULL otherwise
  301.  */
  302. VXIVALUE_API VXIULong *VXIULongCreate(VXIulong n);
  303. /**
  304.  * ULong destructor
  305.  *
  306.  * @param   i   ULong to destroy
  307.  */
  308. VXIVALUE_API void VXIULongDestroy(VXIULong **i);
  309. /**
  310.  * Get the value of an ULong
  311.  *
  312.  * @param   i   ULong to obtain the value from
  313.  * @return      32 bit unsigned long value
  314.  */
  315. VXIVALUE_API VXIulong VXIULongValue(const VXIULong *i);
  316. /**
  317.  * Create a Float from a 32 bit floating point number
  318.  *
  319.  * @param   n   32 bit floating point value
  320.  * @return      Float with the specified value on success, 
  321.  *              NULL otherwise
  322.  */
  323. VXIVALUE_API VXIFloat *VXIFloatCreate(VXIflt32 n);
  324. /**
  325.  * Float destructor
  326.  *
  327.  * @param   f   Float to destroy
  328.  */
  329. VXIVALUE_API void VXIFloatDestroy(VXIFloat **f);
  330. /**
  331.  * Get the value of a Float
  332.  *
  333.  * @param   f   Float to get the value from
  334.  * @return      32 bit floating point value
  335.  */
  336. VXIVALUE_API VXIflt32 VXIFloatValue(const VXIFloat *f);
  337. /**
  338.  * Create a Double from a 32 bit floating point number
  339.  *
  340.  * @param   n   32 bit floating point value
  341.  * @return      Double with the specified value on success, 
  342.  *              NULL otherwise
  343.  */
  344. VXIVALUE_API VXIDouble *VXIDoubleCreate(VXIflt64 n);
  345. /**
  346.  * Double destructor
  347.  *
  348.  * @param   f   Double to destroy
  349.  */
  350. VXIVALUE_API void VXIDoubleDestroy(VXIDouble **f);
  351. /**
  352.  * Get the value of a Double
  353.  *
  354.  * @param   f   Double to get the value from
  355.  * @return      32 bit floating point value
  356.  */
  357. VXIVALUE_API VXIflt64 VXIDoubleValue(const VXIDouble *f);
  358. /**
  359.  * Create a Ptr from a C pointer
  360.  *
  361.  * Note: This only stores the pointer blindly, it does not perform a
  362.  * deep copy and the reference memory is not freed on
  363.  * destruction. Thus the user is responsible for ensuring the
  364.  * referenced memory location remains valid, and for freeing memory
  365.  * when appropriate on Ptr destruction.
  366.  *
  367.  * @param   n     Pointer to memory
  368.  */
  369. VXIVALUE_API VXIPtr *VXIPtrCreate(void *n);
  370. /**
  371.  * Ptr destructor
  372.  *
  373.  * @param   p   Ptr to destroy
  374.  */
  375. VXIVALUE_API void VXIPtrDestroy(VXIPtr **p);
  376. /**
  377.  * Get the value of a Ptr
  378.  *
  379.  * @param   p   Ptr to retrieve the pointer from
  380.  * @return      Pointer to memory retrieved
  381.  */
  382. VXIVALUE_API void *VXIPtrValue(const VXIPtr *p);
  383. /**
  384.  * Create a Content from MIME content typed data
  385.  *
  386.  * Thread-safe reference counting is used to allow sharing the data
  387.  * (typically large) across multiple clones while minimizing memory
  388.  * use. The passed Destroy( ) function is only called when the
  389.  * reference count drops to zero.
  390.  *
  391.  * @param   contentType       MIME content type for the data
  392.  * @param   content           Data to store, this pointer will merely be
  393.  *                            copied (no deep copy of the data will be done)
  394.  *                            so this pointer must remain valid until the
  395.  *                            Destroy function is called.
  396.  * @param   contentSizeBytes  Size of the data, in bytes
  397.  * @param   Destroy           Destructor called to release the data when
  398.  *                            no longer needed. Since this construction
  399.  *                            merely copies the pointer, this is mandatory.
  400.  * @param   userData          Optional user data pointer passed to destroy,
  401.  *                            typically used to hold a pointer to some
  402.  *                            larger data structure that contains the
  403.  *                            content so that larger data structure can
  404.  *                            be destroyed when the content is no longer
  405.  *                            required.
  406.  */
  407. VXIVALUE_API VXIContent *
  408. VXIContentCreate(const VXIchar  *contentType,
  409.  VXIbyte        *content,
  410.  VXIulong        contentSizeBytes,
  411.  void          (*Destroy)(VXIbyte **content, void *userData),
  412.  void           *userData);
  413. /**
  414.  * Create a Content from MIME content typed data
  415.  *
  416.  * Thread-safe reference counting is used to allow sharing the data
  417.  * (typically large) across multiple clones while minimizing memory
  418.  * use. The passed Destroy( ) function is only called when the
  419.  * reference count drops to zero.
  420.  *
  421.  * @param   contentType       MIME content type for the data
  422.  * @param   content           Data to store, this pointer will merely be
  423.  *                            copied (no deep copy of the data will be done)
  424.  *                            so this pointer must remain valid until the
  425.  *                            Destroy function is called.
  426.  * @param   contentSizeBytes  Size of the data, in bytes
  427.  * @param   Destroy           Destructor called to release the data when
  428.  *                            no longer needed. Since this construction
  429.  *                            merely copies the pointer, this is mandatory.
  430.  * @param   GetValue          Method called to override the reading of the 
  431.  *                            memory stream from the content, this allows
  432.  *                            for the Content to be a place holder and the real
  433.  *                            memory content could be stored elsewhere.
  434.  * @param   userData          Optional user data pointer passed to destroy,
  435.  *                            typically used to hold a pointer to some
  436.  *                            larger data structure that contains the
  437.  *                            content so that larger data structure can
  438.  *                            be destroyed when the content is no longer
  439.  *                            required.
  440.  */
  441. VXIVALUE_API VXIContent *
  442. VXIContentCreateEx(const VXIchar  *contentType,
  443.  VXIbyte        *content,
  444.  VXIulong        contentSizeBytes,
  445.  void          (*Destroy)(VXIbyte **content, void *userData),
  446.          void          (*GetValue)(void *userData, const VXIbyte *currcontent, const VXIbyte **realcontent, VXIulong* realcontentSizeBytes),
  447.  void           *userData);
  448. /**
  449.  * Retrieve the unique data pointer they passed to VXIContentCreate
  450.  *
  451.  * @param   c       Content to retrieve the data from
  452.  * @param   u       Returns the unique pointer associated with the content
  453.  */
  454. VXIVALUE_API void VXIContentGetUserData(const VXIContent  *c, void** u);
  455. /**
  456.  * Set the Content-Transfer-Encoding for MIME
  457.  *
  458.  * @param   c       Content to retrieve the data from
  459.  * @param   e       Sets the Content-Transfer-Encoding for MIME
  460.  */
  461. VXIVALUE_API void VXIContentSetTransferEncoding(const VXIContent  *c, const VXIchar  *e);
  462. /**
  463.  * Retrieve the Content-Transfer-Encoding for MIME
  464.  *
  465.  * @param   c       Content to retrieve the data from
  466.  */
  467. VXIVALUE_API const VXIchar* VXIContentGetTransferEncoding(const VXIContent  *c);
  468. /**
  469.  * Retrieve the content size (in bytes)
  470.  *
  471.  * @param   c       Content to retrieve the data from
  472.  */
  473. VXIVALUE_API VXIulong VXIContentGetContentSizeBytes(const VXIContent *c);
  474. /**
  475.  * Content destructor
  476.  *
  477.  * @param   c   Content to destroy
  478.  */
  479. VXIVALUE_API void VXIContentDestroy(VXIContent **c);
  480. /**
  481.  * Get the value of a Content
  482.  *
  483.  * @param   c                 Content to retrieve the data from
  484.  * @param   contentType       Returns the MIME content type for the data
  485.  * @param   content           Returns the pointer to the data
  486.  * @param   contentSizeBytes  Returns the size of the data, in bytes
  487.  * @return                    VXIvalue_RESULT_SUCCESS on success 
  488.  */
  489. VXIVALUE_API VXIvalueResult 
  490. VXIContentValue(const VXIContent  *c,
  491. const VXIchar    **contentType,
  492. const VXIbyte    **content,
  493. VXIulong          *contentSizeBytes);
  494. /**
  495.  * Create a String from a null-terminated character array
  496.  *
  497.  * @param   str   NULL-terminated character array
  498.  * @return        String with the specified value on success, 
  499.  *                NULL otherwise
  500.  */
  501. VXIVALUE_API VXIString *VXIStringCreate(const VXIchar *str);
  502. /**
  503.  * Create a String from a known-length character array
  504.  *
  505.  * @param   str   Character array (null characters may be embedded in 
  506.  *                the array)
  507.  * @param   len   Number of characters which will be copied.
  508.  * @return        String with the specified value on success, 
  509.  *                NULL otherwise
  510.  */
  511. VXIVALUE_API VXIString *VXIStringCreateN(const VXIchar *str, VXIunsigned len);
  512. /**
  513.  * String destructor
  514.  *
  515.  * @param   s   String to destroy
  516.  */
  517. VXIVALUE_API void VXIStringDestroy(VXIString **s);
  518. /**
  519.  * String clone
  520.  *
  521.  * Note: functionally redundant with VXIValueClone( ), but provided to
  522.  * reduce the need for C casts for this common operation
  523.  *
  524.  * @param    s   String to clone
  525.  * @return       Clone of the string on success, NULL otherwise
  526.  */
  527. VXIVALUE_API VXIString *VXIStringClone(const VXIString *s);
  528. /**
  529.  * Set the value of a String from a null-terminated character array
  530.  *
  531.  * Note: this functionality is provided to allow defining interfaces
  532.  * where the caller passes in a VXIString from VXIStringCreate( )
  533.  * (typically with an empty string as its value) with the interface
  534.  * changing that value to return a string as output. This avoids
  535.  * having to define interfaces where the client has to provide a
  536.  * fixed length buffer (and thus worry about "buffer too small" errors
  537.  * and complicated handling).
  538.  *
  539.  * @param   s     String to change the value of
  540.  * @param   str   NULL-terminated character array
  541.  * @return        VXIvalue_RESULT_SUCCESS on success 
  542.  */
  543. VXIVALUE_API VXIvalueResult VXIStringSetValue(VXIString      *s, 
  544.                                               const VXIchar  *str);
  545. /**
  546.  * Get the value of a String
  547.  *
  548.  * @param   s     String to access
  549.  * @param   buf   Character buffer to copy the value into as a
  550.  *                NULL-terminated character array.  The buffer size must be
  551.  *                at least VXIStringLength() + 1.
  552.  * @param   len   Size of the buffer, in characters
  553.  * @return        Pointer to buf on success, NULL on failure (most likely
  554.  *                buffer too small) 
  555.  */
  556. VXIVALUE_API VXIchar *VXIStringValue(const VXIString  *s, 
  557.                                      VXIchar          *buf, 
  558.                                      VXIunsigned       len);
  559. /**
  560.  * Get direct access to the NULL-terminated character value
  561.  *
  562.  * Note: the returned buffer must never be modified, and is only
  563.  * provided for transient use (i.e. immediately logging it, comparing
  564.  * it, etc. rather than storing or returning the pointer for longer
  565.  * term access).
  566.  *
  567.  * @param   s   String to retrieve the data from
  568.  * @return      Pointer to the NULL-terminated character array retrieved
  569.  */
  570. VXIVALUE_API const VXIchar* VXIStringCStr(const VXIString *s);
  571. /**
  572.  * Get the number of characters in a String's value
  573.  *
  574.  * Note: Add one byte for the NULL terminator when using this to determine
  575.  * the length of the array required for a VXIStringValue( ) call.
  576.  *
  577.  * @param   s   String to access
  578.  * @return      Length of the string, in characters
  579.  */
  580. VXIVALUE_API VXIunsigned VXIStringLength(const VXIString *s);
  581. /**
  582.  * Compares two Strings
  583.  *
  584.  * @param   s1   First String to compare
  585.  * @param   s2   Second String to compare
  586.  * @return       Returns a value that is less than, equal to, or greater
  587.  *               than zero depending on whether s1 is lexicographically
  588.  *               less than, equal to, or greater than s2
  589.  */
  590. VXIVALUE_API VXIint VXIStringCompare(const VXIString *s1, 
  591.                                      const VXIString *s2);
  592. /**
  593.  * Compares a String to a NULL-terminated character array
  594.  *
  595.  * @param   str   String to compare
  596.  * @param   buf   NULL-terminated character array to compare
  597.  * @return        Returns a value that is less than, equal to, or greater
  598.  *                than zero depending on whether str is lexicographically
  599.  *                less than, equal to, or greater than buf
  600.  */
  601. VXIVALUE_API VXIint VXIStringCompareC(const VXIString *str, 
  602.                                       const VXIchar   *buf);
  603. /**
  604.  * Create an empty Map
  605.  *
  606.  * @return   New map on success, NULL otherwise
  607.  */
  608. VXIVALUE_API VXIMap *VXIMapCreate(void);
  609. /**
  610.  * Clear the content of the map and return an empty Map
  611.  *
  612.  * @return   None
  613.  */
  614. VXIVALUE_API void VXIMapClear(VXIMap *m);
  615. /**
  616.  * Map destructor
  617.  *
  618.  * Note: this recursively destroys all the values contained within the
  619.  * Map, including all the values of Maps and Vectors stored
  620.  * within this map. However, for Ptr values the user is
  621.  * responsible for freeing the held memory if appropriate.
  622.  *
  623.  * @param m   Map to destroy 
  624.  */
  625. VXIVALUE_API void VXIMapDestroy(VXIMap **m);
  626. /**
  627.  * Map clone
  628.  *
  629.  * Recursively copies all values contained within the map,
  630.  * including all the values of Maps and Vectors stored within this
  631.  * map.
  632.  *
  633.  * Note: functionally redundant with VXIValueClone( ), but provided to
  634.  * reduce the need for C casts for this common operation
  635.  *
  636.  * @param    m   Map to clone
  637.  * @return       Clone of the Map on success, NULL otherwise 
  638.  */
  639. VXIVALUE_API VXIMap *VXIMapClone(const VXIMap *m);
  640. /**
  641.  * Set a named property on an Map
  642.  *
  643.  * The value can be an Map so a tree can be constructed.
  644.  *
  645.  * If the property already exists, the existing value is first
  646.  * destroyed using VXIValueDestroy( ) (thus recursively deleting held
  647.  * values within it if it is an Map or Vector), then does the
  648.  * set operation with the new value.
  649.  *
  650.  * @param   m     Map to access
  651.  * @param   key   NULL terminated property name
  652.  * @param   val   Value to set the property to, ownership is passed
  653.  *                to the Map (a simple pointer copy is done), so on
  654.  *                success the user must not delete, modify, or otherwise
  655.  *                use this. Also be careful to not add a Map as a
  656.  *                property of itself (directly or indirectly), otherwise
  657.  *                infinite loops may occur on access or deletion.
  658.  * @return        VXIvalue_RESULT_SUCCESS on success
  659.  */
  660. VXIVALUE_API VXIvalueResult VXIMapSetProperty(VXIMap         *m, 
  661.                                               const VXIchar  *key,
  662.                                               VXIValue       *val);
  663. /**
  664.  * Get a named property from an Map
  665.  *
  666.  * The property value is returned for read-only access and is
  667.  * invalidated if the Map is modified. The client must clone it if
  668.  * they wish to perform modifications or wish to retain the value even
  669.  * afer modifying this Map.
  670.  *
  671.  * @param   m     Map to access
  672.  * @param   key   NULL terminated property name
  673.  * @return        On success the value of the property for read-only 
  674.  *                access (invalidated if the Map is modified), NULL
  675.  *                if the property was never set or was deleted 
  676.  */
  677. VXIVALUE_API const VXIValue *VXIMapGetProperty(const VXIMap    *m, 
  678.                                                const VXIchar   *key);
  679. /**
  680.  * Delete a named property from an Map
  681.  *
  682.  * This does a VXIValueDestroy( ) on the value for the named property
  683.  * (thus recursively deleting held values within it if it is an Map
  684.  * or Vector). However, for Ptr properties the user is responsible for
  685.  * freeing the held memory if appropriate.
  686.  *
  687.  * @param   m     Map to access
  688.  * @param   key   NULL terminated property name
  689.  * @return        VXIvalue_RESULT_SUCCESS on success 
  690.  */
  691. VXIVALUE_API VXIvalueResult VXIMapDeleteProperty(VXIMap         *m, 
  692.                                                  const VXIchar  *key);
  693. /**
  694.  * Return the number of properties for an Map
  695.  *
  696.  * Note: this only returns the number of properties that are direct
  697.  * children of the Map, it does not include the number of properties
  698.  * held in Maps and Vectors stored within this map.
  699.  *
  700.  * @param   m   Map to access
  701.  * @return      Number of properties stored in the Map
  702.  */
  703. VXIVALUE_API VXIunsigned VXIMapNumProperties(const VXIMap *m);
  704. /**
  705.  * Get the first property of an Map and an iterator
  706.  *
  707.  * Note: this is used to traverse all the properties within an map,
  708.  * there is no guarantee on what order the properties will be
  709.  * returned. The iterator must be eventually freed with
  710.  * VXIMapIteratorDestroy( ), and is invalidated if the Map is
  711.  * modified in any way.
  712.  *
  713.  * @param   m      Map to access
  714.  * @param   key    Set to point at the property name for read-only 
  715.  *                 access (must not be modified)                 
  716.  * @param   value  Set to point at the property value for read-only 
  717.  *                 access (must not be modified)
  718.  * @return         Pointer to an iterator that may be used to get
  719.  *                 additional properties via VXIMapGetNextProperty( ),
  720.  *                 or NULL on failure (typically no properties in the map)
  721.  */
  722. VXIVALUE_API 
  723. VXIMapIterator *VXIMapGetFirstProperty(const VXIMap     *m,
  724.                                        const VXIchar   **key,
  725.                                        const VXIValue  **value);
  726. /**
  727.  * Get the next property of an Map based on an iterator
  728.  *
  729.  * Note: this is used to traverse all the properties within an map,
  730.  * there is no guarantee on what order the properties will be
  731.  * returned.
  732.  *
  733.  * @param   it     Iterator used to access the map as obtained
  734.  *                 from VXIMapGetFirstProperty( ), this operation
  735.  *                 will advance the iterator to the next property on
  736.  *                 success
  737.  * @param   key    Set to point at the property name for read-only 
  738.  *                 access (must not be modified, invalidated if the
  739.  *                 Map is modified)                 
  740.  * @param   value  Set to point at the property value for read-only 
  741.  *                 access (must not be modified, invalidated if the
  742.  *                 Map is modified)
  743.  * @return         VXIvalue_RESULT_SUCCESS on success (property name 
  744.  *                 and value returned, iterator advanced), 
  745.  *                 VXIvalue_RESULT_FAILURE if there are no more properties
  746.  *                 to read, or a VXIvalueResult error code for severe errors
  747.  */
  748. VXIVALUE_API VXIvalueResult VXIMapGetNextProperty(VXIMapIterator  *it,
  749.                                                   const VXIchar  **key,
  750.                                                   const VXIValue **value);
  751. /**
  752.  * Destroy an iterator
  753.  *
  754.  * @param   it     Iterator to destroy as obtained from 
  755.  *                 VXIMapGetFirstProperty( )
  756.  */
  757. VXIVALUE_API void VXIMapIteratorDestroy(VXIMapIterator **it);
  758. /**
  759.  * Create an empty Vector
  760.  *
  761.  * @return   New vector on success, NULL otherwise
  762.  */
  763. VXIVALUE_API VXIVector *VXIVectorCreate(void);
  764. /**
  765.  * Vector destructor
  766.  *
  767.  * Note: this recursively destroys all the values contained within the
  768.  * Vector, including all the values of Vectors stored within this
  769.  * vector. However, for Ptr values the user is responsible for
  770.  * freeing the held memory if appropriate.
  771.  *
  772.  * @param   v   Vector to destroy 
  773.  */
  774. VXIVALUE_API void VXIVectorDestroy(VXIVector **v);
  775. /**
  776.  * Vector clone
  777.  *
  778.  * Recursively copies all values contained within the vector,
  779.  * including all the values of Vectors and Maps stored within this
  780.  * vector.
  781.  *
  782.  * Note: functionally redundant with VXIValueClone( ), but provided to
  783.  * reduce the need for C casts for this common operation
  784.  *
  785.  * @param    v   Vector to clone
  786.  * @return Clone of the Vector on success, NULL otherwise */
  787. VXIVALUE_API VXIVector *VXIVectorClone(const VXIVector *v);
  788. /**
  789.  * Adds an element to the end of the Vector
  790.  *
  791.  * The value can be a Vector so frames can be implemented.
  792.  *
  793.  * @param   v    Vector to access
  794.  * @param   val  Value to append to the vector, ownership is passed
  795.  *               to the Vector (a simple pointer copy is done), so on
  796.  *               success the user must not delete, modify, or otherwise
  797.  *               use this. Also be careful to not add a Vector as a
  798.  *               element of itself (directly or indirectly), otherwise
  799.  *               infinite loops may occur on access or deletion.
  800.  * @return       VXIvalue_RESULT_SUCCESS on success
  801.  */
  802. VXIVALUE_API VXIvalueResult VXIVectorAddElement(VXIVector      *v, 
  803.                                                 VXIValue       *val);
  804. /**
  805.  * Set an indexed vector element
  806.  *
  807.  * Overwrites the specified element with the new value. The existing
  808.  * value is first destroyed using VXIValueDestroy( ) (thus recursively
  809.  * deleting held values within it if it is an Map or Vector), then
  810.  * does the set operation with the new value.
  811.  *
  812.  * The value can be a Vector so frames can be implemented.
  813.  *
  814.  * @param   v     Vector to access
  815.  * @param   n     Element index to set, it is an error to pass a
  816.  *                index that is greater then the number of values
  817.  *                currently in the vector
  818.  * @param   val   Value to set the element to, ownership is passed
  819.  *                to the Vector (a simple pointer copy is done), so on
  820.  *                success the user must not delete, modify, or otherwise
  821.  *                use this. Also be careful to not add a Vector as a
  822.  *                element of itself (directly or indirectly), otherwise
  823.  *                infinite loops may occur on access or deletion.
  824.  * @return        VXIvalue_RESULT_SUCCESS on success
  825.  */
  826. VXIVALUE_API VXIvalueResult VXIVectorSetElement(VXIVector      *v, 
  827.                                                 VXIunsigned     n, 
  828.                                                 VXIValue       *val);
  829. /**
  830.  * Get an indexed vector element
  831.  *
  832.  * The element value is returned for read-only access and is
  833.  * invalidated if the Vector is modified. The client must clone it if
  834.  * they wish to perform modifications or wish to retain the value even
  835.  * after modifying this Vector.
  836.  *
  837.  * @param   v     Vector to access
  838.  * @param   n     Element index to set, it is an error to pass a
  839.  *                index that is greater or equal to then the number of values
  840.  *                currently in the vector (i.e. range is 0 to length-1)
  841.  * @return        On success the value of the property for read-only 
  842.  *                access (invalidated if the Vector is modified), NULL
  843.  *                on error 
  844.  */
  845. VXIVALUE_API const VXIValue *VXIVectorGetElement(const VXIVector *v, 
  846.                                                  VXIunsigned      n);
  847. /**
  848.  * Return number of elements in a Vector
  849.  *
  850.  * This computes only the length of the Vector, elements within
  851.  * Vectors and Maps within it are not counted.
  852.  *
  853.  * @param   v    Vector to access
  854.  * @return       Number of elements stored in the Vector
  855.  */
  856. VXIVALUE_API VXIunsigned VXIVectorLength(const VXIVector *v);
  857. /**
  858.  * Formats for the string result of VXIValueToString, currently:
  859.  *
  860.  * VALUE_FORMAT_URL_QUERY_ARGS
  861.  *
  862.  * URL query argument format as specified in IETF RFC 2396. Note: this
  863.  * encoding is not appropriate for generically serializing and later
  864.  * restoring VXIValue based types, see below.
  865.  * This will return a string of the format
  866.  * "key1=value1&key2=value2[...]" where '=' seperates keys and '&'
  867.  * seperates key/value pairs. Map keys are output by using dot
  868.  * notation such as "mymap.mymember=true" for "mymember" in "mymap".
  869.  * Similarly, vector keys are output using dot notation, such as
  870.  * "myvec.1=200" for myvec element 1. This dot notation may be
  871.  * arbitrarily deep for handling nested maps/vectors. Boolean values
  872.  * are output as "true" or "false", and VXIContent values are encoded
  873.  * by inserting the escaped bytes (see below).
  874.  *
  875.  * As required by IETF RFC 2396, all keys and values are escaped to
  876.  * ensure the resulting string is only composed of a subset of visible
  877.  * ASCII characters. All other characters/bytes (including a percent
  878.  * sign) are encoded as a percent sign followed by the byte value such
  879.  * as "%20" for a space. Since VXIMap key names and VXIStrings are
  880.  * wchar_t based data that may include Unicode characters, each
  881.  * character in those are first converted to the Unicode UTF-8
  882.  * character encoding (where each character is represented by 1 to 6
  883.  * bytes, with the UTF-8 byte code and ASCII byte codes identical for
  884.  * the ASCII character set, and Latin 1 [ISO-8859] and Unicode
  885.  * characters consuming 2 or more bytes), then each byte is escaped as
  886.  * necessary. NOTE: The use of UTF-8 to encode Latin 1 and Unicode
  887.  * characters is Vocalocity defined and thus may not seemlessly
  888.  * interoperate with other software: IETF RFC 2396 acknoledges the
  889.  * issue of the transmission of non-ASCII character set characters,
  890.  * and allows for the use of UTF-8, but does not mandate the use of
  891.  * UTF-8 to solve this problem and thus encoding choices vary between
  892.  * systems (although UTF-8 is the clearest choice).
  893.  *
  894.  * Note that with this format the types of each key is ambiguous: for
  895.  * example the VXIString "100" and the VXIInteger 100 have an
  896.  * identical representation, and VXIContent byte streams are not
  897.  * distinguishable from other types (particulary VXIStrings) unless
  898.  * they contain byte codes that are not permissable in the other
  899.  * types, such as NULL (0) bytes.  When used for HTTP operations, this
  900.  * ambiguity is not an issue, as the target CGI/servlet/etc. knows
  901.  * what data to expect and thus the appropriate data type for each
  902.  * key. Thus while useful for serializing and transmitting application
  903.  * defined data over HTTP or other ASCII based protocols for delivery
  904.  * to the application elsewhere, this encoding is not appropriate for
  905.  * generically serializing and later restoring VXIValue based types.
  906.  */
  907. typedef enum VXIValueStringFormat {
  908.   VALUE_FORMAT_URL_QUERY_ARGS
  909. } VXIValueStringFormat;
  910. /**
  911.  * Generic Value to string conversion
  912.  *
  913.  * This converts any VXIValue type to a string.
  914.  *
  915.  * @param   v       Value to convert to a string
  916.  * @param   name    Name to use for labeling the VXIValue data
  917.  * @param   format  Format to use for the string, see above
  918.  * @return          VXIString, NULL on error
  919.  */
  920. VXIVALUE_API VXIString *VXIValueToString(const VXIValue      *v,
  921.  const VXIchar       *name,
  922.  VXIValueStringFormat format);
  923. #ifdef __cplusplus
  924. } /* This ends the extern "C". */
  925. /**
  926.  * C++ wrapper class that makes it easier to work with VXIMaps
  927.  *
  928.  * Used correctly, this class can eliminate common memory leaks associated with
  929.  * VXIMap usage.  For instance:<p>
  930.  * code
  931.  *   VXIMap * GenerateMapFromParams(void)
  932.  *   { 
  933.  *     VXIMapHolder result;
  934.  *     DoStuff();  // this code may throw an exception.
  935.  *     return result.Release();
  936.  *   }
  937.  * endcode
  938.  * If an exception is raised by the DoStuff function, the map will be cleaned
  939.  * up automatically when the stack is unwound.  Likewise, the calling code may
  940.  * benefit:<p>
  941.  * code
  942.  *   int Foo(void)
  943.  *   {
  944.  *     VXIMapHolder params(GenerateMapFromParams());
  945.  *     ProcessParams(params);  // This code may throw an exception.
  946.  *     return 0;
  947.  *   }
  948.  * endcode
  949.  * If either an exception occurs or the function exits normally, the associated
  950.  * map will be freed.<p>
  951.  */
  952. class VXIMapHolder {
  953. public:
  954.   /**
  955.    * Creates an empty VXIMap.
  956.    */
  957.   VXIMapHolder() : _map(NULL)        { _map = VXIMapCreate(); }
  958.   /**
  959.    * Takes ownership of a VXIMap.
  960.    * @param m The VXIMap to own
  961.    */
  962.   VXIMapHolder(VXIMap * m) : _map(m) { }
  963.   /**
  964.    * Destorys owned VXIMap.
  965.    */
  966.   ~VXIMapHolder()                    { if (_map != NULL) VXIMapDestroy(&_map);}
  967.   /**
  968.    */
  969.   VXIMapHolder & operator=(const VXIMapHolder & x)
  970.   { if (this != &x) {
  971.       if (_map != NULL) VXIMapDestroy(&_map);
  972.       _map = VXIMapClone(x._map); }
  973.     return *this; }
  974.   /** 
  975.    * Returns the internal map.  The standard map manipulation
  976.    * functions may then be used.
  977.    */
  978.   VXIMap * GetValue() const       { return _map; }
  979.   /**
  980.    * Give up ownership of the contained VXIMap.
  981.    *
  982.    * This does not destroy the contained VXIMap.  Rather, a 
  983.    * a pointer is returned, and it is the callers responsibility
  984.    * to destroy the map.
  985.    *
  986.    * @return The contained VXIMap.
  987.    */
  988.   VXIMap * Release()              { VXIMap * m = _map; _map = NULL; return m; }
  989.   /**
  990.    * Acquires a new map, destroying the contained one first.
  991.    */
  992.   void Acquire(VXIMap * m)        { if (_map != NULL) VXIMapDestroy(&_map);
  993.                                     _map = m; }
  994.   /**
  995.    * Clones the contained map to a new VXIMapHolder.
  996.    */
  997.   VXIMapHolder(const VXIMapHolder & mh) {
  998.     if(mh._map) {
  999.       _map = VXIMapClone(mh._map);
  1000.     }
  1001.   }
  1002. private:
  1003.   VXIMap * _map;
  1004. };
  1005. /**
  1006.  * C++ wrapper class that makes it easier to work with VXIContent.
  1007.  */
  1008. class VXIContentHolder {
  1009. public:
  1010.   /**
  1011.    */
  1012.   VXIContentHolder() : _content(NULL), _contentSize(0),
  1013.                        _contentData(NULL), _contentType(NULL) { }
  1014.   /**
  1015.    * Takes ownership of an existing VXIContent.
  1016.    * @param c An existing VXIContent.
  1017.    */
  1018.   VXIContentHolder(VXIContent* c) : _content(NULL){ Acquire(c); }
  1019.   /**
  1020.    * Destroys the contained VXIContent.
  1021.    */
  1022.   virtual ~VXIContentHolder()    { if (_content) VXIContentDestroy(&_content); }
  1023.   /**
  1024.    * Returns the VXIContent content.
  1025.    * Same as would be returned by VXIContentCreate.
  1026.    */
  1027.   const VXIbyte* GetContent()    { return _contentData; }
  1028.   /**
  1029.    * Returns the VXIContent type.
  1030.    * Same as would be returned by VXIContentCreate.
  1031.    */
  1032.   const VXIchar* GetType()       { return _contentType; }
  1033.   /**
  1034.    * Returns the VXIContent size.
  1035.    * Same as would be returned by VXIContentCreate.
  1036.    */
  1037.   VXIulong GetSize()             { return _contentSize; }
  1038.   /** 
  1039.    * Returns the internal map.
  1040.    */
  1041.   const VXIContent* GetValue() { return _content; }
  1042.   /**
  1043.    * Give up ownership of the contained VXIContent.
  1044.    *
  1045.    * This does not destroy the contained VXIContent.  Rather, a 
  1046.    * a pointer is returned, and it is the callers responsibility
  1047.    * to destroy the map with a call to VXIContentDestroy.
  1048.    *
  1049.    * @return The contained VXIContent.
  1050.    */
  1051.   VXIContent* Release(void)
  1052.     { VXIContent* c = _content; _content = NULL; return c; }
  1053.   /**
  1054.    * Creates a new contained VXIContent, destroying the current
  1055.    * content if needed.
  1056.    * @param   contentType       MIME content type for the data
  1057.    * @param   content           Data to store, this pointer will merely be
  1058.    *                            copied (no deep copy of the data will be done)
  1059.    *                            so this pointer must remain valid until the
  1060.    *                            Destroy function is called.
  1061.    * @param   contentSizeBytes  Size of the data, in bytes
  1062.    * @param   Destroy           Destructor called to release the data when
  1063.    *                            no longer needed. Since this construction
  1064.    *                            merely copies the pointer, this is mandatory.
  1065.    * @param   userData          Optional user data pointer passed to destroy,
  1066.    *                            typically used to hold a pointer to some
  1067.    *                            larger data structure that contains the
  1068.    *                            content so that larger data structure can
  1069.    *                            be destroyed when the content is no longer
  1070.    *                            required.
  1071.    */
  1072.   bool Create(
  1073.       const VXIchar  *contentType,
  1074.       VXIbyte        *content,
  1075.       VXIulong        contentSizeBytes,
  1076.       void          (*Destroy)(VXIbyte **content, void *userData),
  1077.       void           *userData)
  1078.   {
  1079.     if (_content) VXIContentDestroy(&_content);
  1080. _content = VXIContentCreate(contentType, content, contentSizeBytes, Destroy, userData);
  1081. return _content != NULL;
  1082.   }
  1083.   /**
  1084.    * Acquires an existing VXIContent, destroying the contained 
  1085.    * content if needed.
  1086.    */
  1087.   void Acquire(VXIContent* content){
  1088.     if (_content) VXIContentDestroy(&_content);
  1089.     _content = content; 
  1090.     if( _content )
  1091.       VXIContentValue(_content, &_contentType, &_contentData, &_contentSize);
  1092. else {
  1093.       _contentType = NULL;
  1094.       _contentData = NULL;
  1095.       _contentSize = 0;
  1096.     }
  1097.   }
  1098.   
  1099. private:
  1100.   VXIContent* _content;
  1101.   const VXIchar* _contentType;
  1102.   const VXIbyte* _contentData;
  1103.   VXIulong _contentSize;
  1104.   
  1105.   // do not allow these operations
  1106.   VXIContentHolder(const VXIContentHolder &);
  1107.   VXIContentHolder & operator=(const VXIContentHolder &);
  1108. };
  1109. /*@}*/
  1110. #endif /* end #ifdef _cplusplus */
  1111. #include "VXIheaderSuffix.h"
  1112. #endif  /* include guard */