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

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. #include <stdio.h>
  23. #ifdef WIN32
  24. #define WIN32_LEAN_AND_MEAN
  25. #include <windows.h>                 // For InterlockedIncrement/Decrement
  26. #else
  27. #include "VXItrd.h"                  // For VXItrdMutex
  28. #endif
  29. #define VXIVALUE_EXPORTS
  30. #include "Value.hpp"
  31. /**
  32.  * Get the type of a Value
  33.  *
  34.  * @param   v   Value to check
  35.  * @return      Type of value
  36.  */
  37. VXIVALUE_API VXIvalueType VXIValueGetType(const VXIValue *v)
  38. {
  39.   if ( v == NULL ) return (VXIvalueType) 0xFFFFFFFF;
  40.   return v->GetType( );
  41. }
  42. /**
  43.  * Generic Value destructor
  44.  *
  45.  * This automatically invokes the appropriate type specific
  46.  * destructor.
  47.  *
  48.  * @param   v   Value to destroy
  49.  */
  50. VXIVALUE_API void VXIValueDestroy(VXIValue **v)
  51. {
  52.   if (( v != NULL ) && ( *v != NULL )) {
  53.     delete *v;
  54.     *v = NULL;
  55.   }
  56. }
  57. /**
  58.  * Generic Value clone
  59.  *
  60.  * This automatically invokes the appropriate type specific clone
  61.  * operation.
  62.  *
  63.  * @param   v   Value to clone
  64.  * @return      Clone of v, NULL on error
  65.  */
  66. VXIVALUE_API VXIValue *VXIValueClone(const VXIValue *v)
  67. {
  68.   if ( v == NULL ) return NULL;
  69.   VXIValue *obj = NULL;
  70.   switch ( v->GetType( ) ) {
  71.     case VALUE_BOOLEAN:
  72.       obj = new VXIBoolean (*(const VXIBoolean *) v);
  73.       break;
  74.     case VALUE_INTEGER:
  75.       obj = new VXIInteger (*(const VXIInteger *) v);
  76.       break;
  77.     case VALUE_ULONG:
  78.       obj = new VXIULong (*(const VXIULong *) v);
  79.       break;
  80.     case VALUE_LONG:
  81.       obj = new VXILong (*(const VXILong *) v);
  82.       break;
  83.     case VALUE_FLOAT:
  84.       obj = new VXIFloat (*(const VXIFloat *) v);
  85.       break;
  86.     case VALUE_DOUBLE:
  87.       obj = new VXIDouble (*(const VXIDouble *) v);
  88.       break;
  89.     case VALUE_STRING:
  90.       obj = (VXIValue *) VXIStringClone ((const VXIString *) v);
  91.       break;
  92.     case VALUE_PTR:
  93.       obj = new VXIPtr (*(const VXIPtr *) v);
  94.       break;
  95.     case VALUE_CONTENT: {
  96.         VXIContent *c = new VXIContent (*(const VXIContent *) v);
  97. if (( c ) && ( !c->IsValid() )) {
  98.   delete c;
  99.   c = NULL;
  100. }
  101. obj = (VXIValue *) c;
  102.       } break;
  103.     case VALUE_MAP:
  104.       obj = (VXIValue *) VXIMapClone ((const VXIMap *) v);
  105.       break;
  106.     case VALUE_VECTOR:
  107.       obj = (VXIValue *) VXIVectorClone ((const VXIVector *) v);
  108.       break;
  109.     default:
  110.       ; // Error but nothing we can do
  111.   }
  112.   
  113.   return obj;
  114. }
  115. /**
  116.  * Create a Boolean from a 32 bit boolean
  117.  *
  118.  * @param   n   VXIbool boolean value, either TRUE or FALSE
  119.  * @return      Boolean with the specified value on success, 
  120.  *              NULL otherwise
  121.  */
  122. VXIVALUE_API VXIBoolean *VXIBooleanCreate(VXIbool n)
  123. {
  124.   return new VXIBoolean (n);
  125. }
  126. /**
  127.  * Boolean destructor
  128.  *
  129.  * @param   i   Boolean to destroy
  130.  */
  131. VXIVALUE_API void VXIBooleanDestroy(VXIBoolean **i)
  132. {
  133.   if (( i != NULL ) && ( *i != NULL ) && 
  134.       ( (*i)->GetType( ) == VALUE_BOOLEAN )) {
  135.     delete *i;
  136.     *i = NULL;
  137.   }
  138. }
  139. /**
  140.  * Get the value of an Boolean
  141.  *
  142.  * @param   i   Boolean to obtain the value from
  143.  * @return      VXIbool boolean value, either TRUE or FALSE
  144.  */
  145. VXIVALUE_API VXIbool VXIBooleanValue(const VXIBoolean *i)
  146. {
  147.   if (( i == NULL ) || ( i->GetType( ) != VALUE_BOOLEAN ))
  148.     return FALSE;
  149.   return i->GetValue( );
  150. }
  151. /**
  152.  * Create an Integer from a 32 bit integer
  153.  *
  154.  * @param   n   32 bit integer value
  155.  * @return      Integer with the specified value on success, 
  156.  *              NULL otherwise
  157.  */
  158. VXIVALUE_API VXIInteger *VXIIntegerCreate(VXIint32 n)
  159. {
  160.   return new VXIInteger (n);
  161. }
  162. /**
  163.  * Integer destructor
  164.  *
  165.  * @param   i   Integer to destroy
  166.  */
  167. VXIVALUE_API void VXIIntegerDestroy(VXIInteger **i)
  168. {
  169.   if (( i != NULL ) && ( *i != NULL ) && 
  170.       ( (*i)->GetType( ) == VALUE_INTEGER )) {
  171.     delete *i;
  172.     *i = NULL;
  173.   }
  174. }
  175. /**
  176.  * Get the value of an Integer
  177.  *
  178.  * @param   i   Integer to obtain the value from
  179.  * @return      32 bit integer value
  180.  */
  181. VXIVALUE_API VXIint32 VXIIntegerValue(const VXIInteger *i)
  182. {
  183.   if (( i == NULL ) || ( i->GetType( ) != VALUE_INTEGER ))
  184.     return (VXIint32) 0xFFFFFFFF;
  185.   return i->GetValue( );
  186. }
  187. /**
  188.  * Create an Long from a 32 bit long
  189.  *
  190.  * @param   n   32 bit long value
  191.  * @return      Long with the specified value on success, 
  192.  *              NULL otherwise
  193.  */
  194. VXIVALUE_API VXILong *VXILongCreate(VXIlong n)
  195. {
  196.   return new VXILong (n);
  197. }
  198. /**
  199.  * Long destructor
  200.  *
  201.  * @param   i   Long to destroy
  202.  */
  203. VXIVALUE_API void VXILongDestroy(VXILong **i)
  204. {
  205.   if (( i != NULL ) && ( *i != NULL ) && 
  206.       ( (*i)->GetType( ) == VALUE_LONG )) {
  207.     delete *i;
  208.     *i = NULL;
  209.   }
  210. }
  211. /**
  212.  * Get the value of an Long
  213.  *
  214.  * @param   i   Long to obtain the value from
  215.  * @return      32 bit long value
  216.  */
  217. VXIVALUE_API VXIlong VXILongValue(const VXILong *i)
  218. {
  219.   if (( i == NULL ) || ( i->GetType( ) != VALUE_LONG ))
  220.     return (VXIlong) 0xFFFFFFFF;
  221.   return i->GetValue( );
  222. }
  223. /**
  224.  * Create an ULong from a 32 bit unsigned long
  225.  *
  226.  * @param   n   32 bit unsigned long value
  227.  * @return      ULong with the specified value on success, 
  228.  *              NULL otherwise
  229.  */
  230. VXIVALUE_API VXIULong *VXIULongCreate(VXIulong n)
  231. {
  232.   return new VXIULong (n);
  233. }
  234. /**
  235.  * ULong destructor
  236.  *
  237.  * @param   i   ULong to destroy
  238.  */
  239. VXIVALUE_API void VXIULongDestroy(VXIULong **i)
  240. {
  241.   if (( i != NULL ) && ( *i != NULL ) && 
  242.       ( (*i)->GetType( ) == VALUE_ULONG )) {
  243.     delete *i;
  244.     *i = NULL;
  245.   }
  246. }
  247. /**
  248.  * Get the value of an ULong
  249.  *
  250.  * @param   i   ULong to obtain the value from
  251.  * @return      32 bit unsigned long value
  252.  */
  253. VXIVALUE_API VXIulong VXIULongValue(const VXIULong *i)
  254. {
  255.   if (( i == NULL ) || ( i->GetType( ) != VALUE_ULONG ))
  256.     return (VXIulong) 0xFFFFFFFF;
  257.   return i->GetValue( );
  258. }
  259. /**
  260.  * Create a Float from a 32 bit floating point number
  261.  *
  262.  * @param   n   32 bit floating point value
  263.  * @return      Float with the specified value on success, 
  264.  *              NULL otherwise
  265.  */
  266. VXIVALUE_API VXIFloat *VXIFloatCreate(VXIflt32 n)
  267. {
  268.   return new VXIFloat (n);
  269. }
  270. /**
  271.  * Float destructor
  272.  *
  273.  * @param   f   Float to destroy
  274.  */
  275. VXIVALUE_API void VXIFloatDestroy(VXIFloat **f)
  276. {
  277.   if (( f != NULL ) && ( *f != NULL ) && 
  278.       ( (*f)->GetType( ) == VALUE_FLOAT )) {
  279.     delete *f;
  280.     *f = NULL;
  281.   }
  282. }
  283. /**
  284.  * Get the value of a Float
  285.  *
  286.  * @param   f   Float to get the value from
  287.  * @return      32 bit floating point value
  288.  */
  289. VXIVALUE_API VXIflt32 VXIFloatValue(const VXIFloat *f)
  290. {
  291.   if (( f == NULL ) || ( f->GetType( ) != VALUE_FLOAT ))
  292.     return (VXIflt32) 0xFFFFFFFF;
  293.   return f->GetValue( );
  294. }
  295. /**
  296.  * Create a Double from a 32 bit floating point number
  297.  *
  298.  * @param   n   32 bit floating point value
  299.  * @return      Double with the specified value on success, 
  300.  *              NULL otherwise
  301.  */
  302. VXIVALUE_API VXIDouble *VXIDoubleCreate(VXIflt64 n)
  303. {
  304.   return new VXIDouble (n);
  305. }
  306. /**
  307.  * Double destructor
  308.  *
  309.  * @param   f   Double to destroy
  310.  */
  311. VXIVALUE_API void VXIDoubleDestroy(VXIDouble **f)
  312. {
  313.   if (( f != NULL ) && ( *f != NULL ) && 
  314.       ( (*f)->GetType( ) == VALUE_DOUBLE )) {
  315.     delete *f;
  316.     *f = NULL;
  317.   }
  318. }
  319. /**
  320.  * Get the value of a Double
  321.  *
  322.  * @param   f   Double to get the value from
  323.  * @return      32 bit floating point value
  324.  */
  325. VXIVALUE_API VXIflt64 VXIDoubleValue(const VXIDouble *f)
  326. {
  327.   if (( f == NULL ) || ( f->GetType( ) != VALUE_DOUBLE ))
  328.     return (VXIflt64) 0xFFFFFFFF;
  329.   return f->GetValue( );
  330. }
  331. /**
  332.  * Create a Ptr from a C pointer
  333.  *
  334.  * Note: This only stores the pointer blindly, it does not perform a
  335.  * deep copy and the reference memory is not freed on
  336.  * destruction. Thus the user is responsible for ensuring the
  337.  * referenced memory location remains valid, and for freeing memory
  338.  * when appropriate on Ptr destruction.
  339.  *
  340.  * @param   n     Pointer to memory
  341.  * @return        Ptr with the specified value and type on success, 
  342.  *                NULL otherwise
  343.  */
  344. VXIVALUE_API VXIPtr *VXIPtrCreate(void *n)
  345. {
  346.   return new VXIPtr (n);
  347. }
  348. /**
  349.  * Ptr destructor
  350.  *
  351.  * @param   p   Ptr to destroy
  352.  */
  353. VXIVALUE_API void VXIPtrDestroy(VXIPtr **p)
  354. {
  355.   if (( p != NULL ) && ( *p != NULL ) && ( (*p)->GetType( ) == VALUE_PTR )) {
  356.     delete *p;
  357.     *p = NULL;
  358.   }
  359. }
  360. /**
  361.  * Get the value of a Ptr
  362.  *
  363.  * @param   p   Ptr to retrieve the pointer from
  364.  * @return      Pointer to memory retrieved
  365.  */
  366. VXIVALUE_API void *VXIPtrValue(const VXIPtr *p)
  367. {
  368.   if (( p == NULL ) || ( p->GetType( ) != VALUE_PTR ))
  369.     return (void *) 0xFFFFFFFF;
  370.   return p->GetValue( );
  371. }
  372. /**
  373.  * Create a Content from MIME content typed data
  374.  *
  375.  * Thread-safe reference counting is used to allow sharing the data
  376.  * (typically large) across multiple clones while minimizing memory
  377.  * use. The passed Destroy( ) function is only called when the
  378.  * reference count drops to zero.
  379.  *
  380.  * @param   contentType       MIME content type for the data
  381.  * @param   content           Data to store
  382.  * @param   contentSizeBytes  Size of the data, in bytes
  383.  * @param   Destroy           Destructor called to release the data when
  384.  *                            no longer needed
  385.  * @param   userData          Optional user data pointer passed to destroy 
  386.  */
  387. VXIVALUE_API VXIContent *
  388. VXIContentCreate(const VXIchar  *contentType,
  389.  VXIbyte        *content,
  390.  VXIulong        contentSizeBytes,
  391.  void          (*Destroy)(VXIbyte **content, void *userData),
  392.  void           *userData)
  393. {
  394.   if (( ! contentType ) || ( ! contentType[0] ) || ( ! content ) || 
  395.       ( contentSizeBytes < 1 ) || ( ! Destroy ))
  396.     return NULL;
  397.   VXIContent *c = new VXIContent (contentType, content, contentSizeBytes,
  398.   Destroy, NULL, userData);
  399.   if (( c ) && ( !c->IsValid( ))) {
  400.     delete c;
  401.     c = NULL;
  402.   }
  403.   return c;
  404. }
  405. /**
  406.  * Create a Content from MIME content typed data
  407.  *
  408.  * Thread-safe reference counting is used to allow sharing the data
  409.  * (typically large) across multiple clones while minimizing memory
  410.  * use. The passed Destroy( ) function is only called when the
  411.  * reference count drops to zero.
  412.  *
  413.  * @param   contentType       MIME content type for the data
  414.  * @param   content           Data to store
  415.  * @param   contentSizeBytes  Size of the data, in bytes
  416.  * @param   Destroy           Destructor called to release the data when
  417.  *                            no longer needed
  418.  * @param   GetValue          Method called to override the reading of the 
  419.  *                            memory stream from the content, this allows
  420.  *                            for the Content to be a place holder and the real
  421.  *                            memory content could be stored elsewhere.
  422.  * @param   userData          Optional user data pointer passed to destroy 
  423.  */
  424. VXIVALUE_API VXIContent *
  425. VXIContentCreateEx(const VXIchar  *contentType,
  426.  VXIbyte        *content,
  427.  VXIulong        contentSizeBytes,
  428.  void          (*Destroy)(VXIbyte **content, void *userData),
  429.          void          (*GetValue)(void *userData, const VXIbyte *currcontent, const VXIbyte **realcontent, VXIulong* realcontentSizeBytes),
  430.  void           *userData)
  431. {
  432.   if (( ! contentType ) || ( ! contentType[0] ) || ( ! content ) || 
  433.       ( contentSizeBytes < 1 ) || ( ! Destroy ))
  434.     return NULL;
  435.   VXIContent *c = new VXIContent (contentType, content, contentSizeBytes,
  436.   Destroy, GetValue, userData);
  437.   if (( c ) && ( !c->IsValid( ) )) {
  438.     delete c;
  439.     c = NULL;
  440.   }
  441.   return c;
  442. }
  443. VXIVALUE_API void VXIContentGetUserData(const VXIContent  *c, void** u)
  444. {
  445.   if (( c != NULL ) && ( (c)->GetType( ) == VALUE_CONTENT ))
  446.     *u = c->GetUserData();
  447. }
  448. VXIVALUE_API void VXIContentSetTransferEncoding(const VXIContent  *c, const VXIchar  *e)
  449. {
  450.   if (( c != NULL ) && ( (c)->GetType( ) == VALUE_CONTENT ))
  451.     c->SetTransferEncoding(e);
  452. }
  453. VXIVALUE_API const VXIchar* VXIContentGetTransferEncoding(const VXIContent  *c)
  454. {
  455.   if (( c != NULL ) && ( (c)->GetType( ) == VALUE_CONTENT ))
  456.     return c->GetTransferEncoding();    
  457.   return NULL;
  458. }
  459. VXIVALUE_API VXIulong VXIContentGetContentSizeBytes(const VXIContent *c)
  460. {
  461.   if (( c != NULL ) && ( (c)->GetType( ) == VALUE_CONTENT ))
  462.     return c->GetContentSizeBytes();    
  463.   return 0;
  464. }
  465. /**
  466.  * Content destructor
  467.  *
  468.  * @param   c   Content to destroy
  469.  */
  470. VXIVALUE_API void VXIContentDestroy(VXIContent **c)
  471. {
  472.   if (( c != NULL ) && ( *c != NULL ) && 
  473.       ( (*c)->GetType( ) == VALUE_CONTENT )) {
  474.     delete *c;
  475.     *c = NULL;
  476.   }
  477. }
  478. /**
  479.  * Get the value of a Content
  480.  *
  481.  * @param   c                 Content to retrieve the data from
  482.  * @param   contentType       Returns the MIME content type for the data
  483.  * @param   content           Returns the pointer to the data
  484.  * @param   contentSizeBytes  Returns the size of the data, in bytes
  485.  * @return                    VXIvalue_RESULT_SUCCESS on success 
  486.  */
  487. VXIVALUE_API VXIvalueResult 
  488. VXIContentValue(const VXIContent  *c,
  489. const VXIchar    **contentType,
  490. const VXIbyte    **content,
  491. VXIulong          *contentSizeBytes)
  492. {
  493.   // !! content may be NULL, in which case they only want the size and contentType
  494.   if (( c == NULL ) || ( c->GetType( ) != VALUE_CONTENT ) ||
  495.       ( ! contentType ) || ( ! contentSizeBytes )) { 
  496.     if ( contentType ) *contentType = NULL;
  497.     if ( content ) *content = NULL;
  498.     if ( contentSizeBytes ) *contentSizeBytes = 0;
  499.     return VXIvalue_RESULT_INVALID_ARGUMENT;
  500.   }
  501.   
  502.   c->RetrieveContent( contentType, content, contentSizeBytes );
  503.   return VXIvalue_RESULT_SUCCESS;
  504. }
  505. // VXIContentData constructor
  506. VXIContentData::VXIContentData (const VXIchar *ct,
  507. VXIbyte       *c,
  508. VXIulong       csb,
  509. void         (*D)(VXIbyte **content, void *ud),
  510.                 void         (*G)(void *userData, const VXIbyte *currcontent, const VXIbyte **realcontent, VXIulong* realcontentSizeBytes),
  511. void          *ud) :
  512.   refCount(1), contentType(NULL), contentTransfer(NULL), content(c), contentSizeBytes(csb),
  513.   Destroy(D), userData(ud), GetValue(G)
  514. #ifndef WIN32
  515.   , mutex(NULL)
  516. #endif
  517. {
  518.   if (( ct ) && ( *ct )) {
  519.     contentType = new VXIchar [wcslen (ct) + 1];
  520.     if ( contentType )
  521.       wcscpy (contentType, ct);
  522.   }
  523.   if ( ! contentType )
  524.     content = NULL;    // Flag for failure
  525. #ifndef WIN32
  526.   if (( content ) && ( VXItrdMutexCreate (&mutex) != VXItrd_RESULT_SUCCESS ))
  527.     content = NULL;
  528. #endif
  529. }
  530. // VXIContentData destructor
  531. VXIContentData::~VXIContentData( )
  532. {
  533.   if ( contentType )
  534.     delete [] contentType;
  535.   if( contentTransfer )
  536.     delete [] contentTransfer;
  537.   if ( content )
  538.     (*Destroy)(&content, userData);
  539. #ifndef WIN32
  540.   if ( mutex )
  541.     VXItrdMutexDestroy (&mutex);
  542. #endif
  543. }
  544. // VXIContentData add reference
  545. void VXIContentData::AddRef (VXIContentData *data)
  546. {
  547.   if ( data ) {
  548. #ifdef WIN32
  549.     InterlockedIncrement (&(data->refCount));
  550. #else
  551.     if ( VXItrdMutexLock (data->mutex) == VXItrd_RESULT_SUCCESS ) {
  552.       data->refCount++;
  553.       VXItrdMutexUnlock (data->mutex);
  554.     }
  555. #endif
  556.   }
  557. }
  558. // VXIContentData release reference
  559. void VXIContentData::Release (VXIContentData **data)
  560. {
  561.   if (( data ) && ( *data )) {
  562. #ifdef WIN32
  563.     if ( InterlockedDecrement (&((*data)->refCount)) == 0L )
  564.       delete *data;
  565. #else
  566.     if ( VXItrdMutexLock ((*data)->mutex) == VXItrd_RESULT_SUCCESS ) {
  567.       (*data)->refCount--;
  568.       VXIulong refCount = (*data)->refCount;
  569.       VXItrdMutexUnlock ((*data)->mutex);
  570.       if ( refCount == 0 )
  571. delete *data;
  572.     }
  573. #endif
  574.     
  575.     *data = NULL;
  576.   }
  577. }
  578. void VXIContentData::RetrieveContent( const VXIchar **type, const VXIbyte **c, VXIulong* csize ) const
  579. {
  580.     *type = GetContentType();
  581.     if( GetValue ){     
  582.       (*GetValue)(userData, content, c, csize );
  583.     }
  584.     else{
  585.       *c = GetContent();
  586.       *csize = GetContentSizeBytes();
  587.     }
  588. }
  589. void VXIContentData::SetTransferEncoding(const VXIchar* e)
  590. {
  591.   if (( e ) && ( *e )) {
  592.     if( contentTransfer )
  593.         delete [] contentTransfer;
  594.     contentTransfer = new VXIchar [wcslen (e) + 1];
  595.     if ( contentTransfer )
  596.       wcscpy (contentTransfer, e);
  597.   }
  598. }