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

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. /* -----1=0-------2=0-------3=0-------4=0-------5=0-------6=0-------7=0-------8
  23.  */
  24. #include <stdio.h>
  25. #include <wchar.h>
  26. #include <stdlib.h>
  27. #define VXIUTIL_EXPORTS
  28. #include "VXIclientUtils.h"
  29. #ifdef WIN32
  30. #define WIN32_LEAN_AND_MEAN
  31. #include <windows.h>
  32. #else
  33. #include <unistd.h>
  34. #include <dlfcn.h>
  35. #endif
  36. #ifndef MODULE_PREFIX
  37. #define MODULE_PREFIX  COMPANY_DOMAIN L"."
  38. #endif
  39. #define MODULE_SBCLIENT MODULE_PREFIX L"VXIclient"
  40. /* -----1=0-------2=0-------3=0-------4=0-------5=0-------6=0-------7=0-------8
  41.  */
  42. /* Converts char-based string to wchar-based string
  43.  * - len is size of wstr
  44.  * - returns VXIplatform_RESULT_BUFFER_TOO_SMALL if len(str)>=len
  45.  */
  46. VXIplatformResult char2wchar(wchar_t *wstr, const char *str, int len)
  47. {
  48.   int l = strlen(str);
  49.   int i;
  50.   if (l > len)
  51.     return VXIplatform_RESULT_BUFFER_TOO_SMALL;
  52.     
  53.   memset(wstr, 0, len);
  54.   for (i = 0; i < l + 1; ++i)
  55.     wstr[i] = (wchar_t)str[i];  /* the high bit is not a sign bit */
  56.   return VXIplatform_RESULT_SUCCESS;
  57. }
  58. /* Converts wchar-based string to char-based string.
  59.  *   and each loss-affected char is 277 (upside-down question mark)
  60.  * - len is size of str
  61.  * - returns VXIplatform_RESULT_BUFFER_TOO_SMALL if len(wstr)>=len
  62. */
  63. VXIplatformResult wchar2char(char *str, const wchar_t *wstr, int len)
  64. {
  65.   int l = wcslen(wstr);
  66.   int i;
  67.   if (l > len)
  68.     return VXIplatform_RESULT_BUFFER_TOO_SMALL;
  69.   memset(str, 0, len);
  70.   for (i = 0; i < l + 1; i++)
  71.     str[i] = w2c(wstr[i]);
  72.   return VXIplatform_RESULT_SUCCESS;
  73. }
  74. #ifndef WIN32
  75. #if ! (defined(__GNUC__) && (__GNUC__ <= 2))
  76. static wchar_t* ConvertFormatForWidePrintf(const wchar_t* format)
  77. {
  78.   int formatLen = wcslen(format);
  79.   // The maximum length of the new format string is 1 and 2/3 that
  80.   //    of the original.
  81.   wchar_t* newFormat = (wchar_t*)malloc(sizeof(wchar_t) * (2 * formatLen + 1));
  82.   int nfIndex = 0, fIndex = 0;
  83.   for (fIndex = 0; fIndex < formatLen; ++fIndex)
  84.   {
  85.     // We found %s in format.
  86.     if ((format[fIndex] == L'%') && (fIndex != (formatLen - 1)))
  87.     {
  88.       newFormat[nfIndex++] = L'%';
  89.       fIndex++;
  90.       while ((fIndex < formatLen - 1) &&
  91.        ((format[fIndex] >= L'0') && (format[fIndex] <= L'9')) ||
  92.        (format[fIndex] == L'+') || (format[fIndex] == L'-') ||
  93.        (format[fIndex] == L'.') || (format[fIndex] == L'*') ||
  94.        (format[fIndex] == L'#')) {
  95.         newFormat[nfIndex++] = format[fIndex++];
  96.       }
  97.       switch(format[fIndex]) {
  98.         case L's': {
  99.           newFormat[nfIndex++] = L'l';
  100.           newFormat[nfIndex++] = L's';
  101.           break;
  102.         }
  103.         case L'S': {
  104.           newFormat[nfIndex++] = L's';
  105.           break;
  106.         }
  107.         case L'c': {
  108.           newFormat[nfIndex++] = L'l';
  109.           newFormat[nfIndex++] = L'c';
  110.           break;
  111.         }
  112.         case L'C': {
  113.           newFormat[nfIndex++] = L'c';
  114.           break;
  115.         }
  116.         default: {
  117.           newFormat[nfIndex++] = format[fIndex];
  118.           break;
  119.         }
  120.       }
  121.     }
  122.     else
  123.     {
  124.       newFormat[nfIndex++] = format[fIndex];
  125.     }
  126.   }
  127.   newFormat[nfIndex] = 0;
  128.   return newFormat;
  129. }
  130. #endif /* ! defined(__GNUC__) && (__GNUC__ <= 2) */
  131. #endif /* ! WIN32 */
  132. /* OS-independent vswprintf replacement */
  133. int VXIvswprintf
  134. (
  135.   wchar_t* wcs, 
  136.   size_t maxlen,
  137.   const wchar_t* format, 
  138.   va_list args
  139. )
  140. {
  141.   int rc;
  142.   if (maxlen < 1) return -1;
  143.   *wcs = 0;
  144. #ifdef WIN32
  145.   /* Straight-forward Win32 implementation */
  146.   rc = _vsnwprintf(wcs, maxlen, format, args);
  147.   if ((size_t) rc >= maxlen - 1) /* overflow */
  148.     wcs[maxlen - 1] = L'';
  149. #else /* ! WIN32 */
  150. #if defined(__GNUC__) && (__GNUC__ <= 2)
  151.   /* Some versions of the GNU C library do not provide the required
  152.      vswprintf( ) function, so we emulate it by converting the format
  153.      string to narrow characters, do a narrow sprintf( ), then convert
  154.      back */
  155.   char *buf = (char*)malloc(sizeof(char) * (maxlen + 512)); // want extra room
  156.   if (!buf)
  157.     return -1;
  158.   /* convert format to narrow, a bit generous compared to the ANSI/ISO
  159.      C specifications for the printf( ) family format strings but we're
  160.      not trying to do full validation here anyway */
  161.   size_t fmtlen = wcslen(format);
  162.   char *fmt = (char*)malloc(sizeof(char) * (fmtlen + 1));
  163.   if( !fmt )
  164.     return -1;
  165.   wchar2char(fmt, format, fmtlen);
  166.   /* generate the final string based on the narrow format and arguments */ 
  167.   rc = vsprintf(buf, fmt, args);
  168.   /* copy back to wide characters */
  169.   size_t finallen = strlen(buf);
  170.   if (finallen >= maxlen) finallen = maxlen - 1;
  171.   char2wchar(wcs, buf, finallen);
  172.   /* clean up */
  173.   if( buf ) free(buf);
  174.   if( fmt) free(fmt);
  175. #else /* ! defined(__GNUC__) || (__GNUC__ > 2) */
  176.   wchar_t* newFormat = ConvertFormatForWidePrintf(format);
  177.   rc = vswprintf(wcs, maxlen, newFormat, args);
  178.   if( newFormat ) free(newFormat);
  179.   if ((size_t) rc >= maxlen - 1) /* overflow */
  180.     wcs[maxlen - 1] = L'';
  181. #endif /* defined(__GNUC__) && (__GNUC__ <= 2) */
  182. #endif /* WIN32 */
  183.   return rc;
  184. }
  185. /* Convenience functions to retrieve VXI value */
  186. int GetVXIBool
  187. (
  188.   const VXIMap  *configArgs,
  189.   const VXIchar *paramName,
  190.   VXIbool       *paramValue
  191. )
  192. {
  193.   if( configArgs && paramName && paramValue ) {
  194.     const VXIValue *v = VXIMapGetProperty(configArgs, paramName);
  195.     if( v && VXIValueGetType(v) == VALUE_INTEGER) {
  196.       *paramValue = (VXIbool)VXIIntegerValue((const VXIInteger*)v);    
  197.       return 1;
  198.     }
  199.   }
  200.   return 0; 
  201. }
  202. int GetVXIInt
  203. (
  204.   const VXIMap  *configArgs,
  205.   const VXIchar *paramName,
  206.   VXIint32       *paramValue
  207. )
  208. {
  209.   if( configArgs && paramName && paramValue ) {
  210.     const VXIValue *v = VXIMapGetProperty(configArgs, paramName);
  211.     if( v && VXIValueGetType(v) == VALUE_INTEGER) {
  212.       *paramValue = VXIIntegerValue((const VXIInteger*)v);    
  213.       return 1;
  214.     }
  215.   }
  216.   return 0; 
  217. }
  218. int GetVXILong
  219. (
  220.   const VXIMap  *configArgs,
  221.   const VXIchar *paramName,
  222.   VXIlong       *paramValue
  223. )
  224. {
  225.   if( configArgs && paramName && paramValue ) {
  226.     const VXIValue *v = VXIMapGetProperty(configArgs, paramName);
  227.     if( v && VXIValueGetType(v) == VALUE_LONG) {
  228.       *paramValue = VXILongValue((const VXILong*)v);    
  229.       return 1;
  230.     }
  231.   }
  232.   return 0; 
  233. }
  234. int GetVXIULong
  235. (
  236.   const VXIMap  *configArgs,
  237.   const VXIchar *paramName,
  238.   VXIulong      *paramValue
  239. )
  240. {
  241.   if( configArgs && paramName && paramValue ) {
  242.     const VXIValue *v = VXIMapGetProperty(configArgs, paramName);
  243.     if( v && VXIValueGetType(v) == VALUE_ULONG) {
  244.       *paramValue = VXIULongValue((const VXIULong*)v);    
  245.       return 1;
  246.     }
  247.   }
  248.   return 0; 
  249. }
  250. int GetVXIFloat
  251. (
  252.   const VXIMap  *configArgs,
  253.   const VXIchar *paramName,
  254.   VXIflt32      *paramValue
  255. )
  256. {
  257.   if( configArgs && paramName && paramValue ) {
  258.     const VXIValue *v = VXIMapGetProperty(configArgs, paramName);
  259.     if( v && VXIValueGetType(v) == VALUE_FLOAT) {
  260.       *paramValue = VXIFloatValue((const VXIFloat*)v);    
  261.       return 1;
  262.     }
  263.   }
  264.   return 0; 
  265. }
  266. int GetVXIDouble
  267. (
  268.   const VXIMap  *configArgs,
  269.   const VXIchar *paramName,
  270.   VXIflt64      *paramValue
  271. )
  272. {
  273.   if( configArgs && paramName && paramValue ) {
  274.     const VXIValue *v = VXIMapGetProperty(configArgs, paramName);
  275.     if( v && VXIValueGetType(v) == VALUE_DOUBLE) {
  276.       *paramValue = VXIDoubleValue((const VXIDouble*)v);    
  277.       return 1;
  278.     }
  279.   }
  280.   return 0; 
  281. }
  282. int GetVXIString
  283. (
  284.   const VXIMap  *configArgs,
  285.   const VXIchar *paramName,
  286.   const VXIchar **paramValue
  287. )
  288. {
  289.   if( configArgs && paramName && paramValue ) {
  290.     const VXIValue *v = VXIMapGetProperty(configArgs, paramName);
  291.     if( v && VXIValueGetType(v) == VALUE_STRING) {
  292.       *paramValue = VXIStringCStr((const VXIString*)v);    
  293.       return 1;
  294.     }
  295.   }
  296.   return 0; 
  297. }
  298. int GetVXIVector
  299. (
  300.   const VXIMap     *configArgs,
  301.   const VXIchar    *paramName,
  302.   const VXIVector **paramValue
  303. )
  304. {
  305.   if( configArgs && paramName && paramValue ) {
  306.     const VXIValue *v = VXIMapGetProperty(configArgs, paramName);
  307.     if( v && VXIValueGetType(v) == VALUE_VECTOR) {
  308.       *paramValue = (const VXIVector*)v;
  309.       return 1;
  310.     }  
  311.   }
  312.   return 0;  
  313. }
  314. int GetVXIMap
  315. (
  316.   const VXIMap     *configArgs,
  317.   const VXIchar    *paramName,
  318.   const VXIMap **paramValue
  319. )
  320. {
  321.   if( configArgs && paramName && paramValue ) {
  322.     const VXIValue *v = VXIMapGetProperty(configArgs, paramName);
  323.     if( v && VXIValueGetType(v) == VALUE_MAP) {
  324.       *paramValue = (const VXIMap*)v;
  325.       return 1;
  326.     }  
  327.   }
  328.   return 0;    
  329. }
  330. /**
  331.  * Dynamic library loading
  332.  */
  333. VXIplatformResult
  334. LoadDynLibrary
  335. (
  336.   const char  *libName, 
  337.   DynLibrary  **libHandle
  338. )
  339. {
  340.   LibraryPtr libPtr;
  341.   DynLibrary *libImpl = NULL;
  342.   if ((! libName) || (! *libName) || (! libHandle))
  343.     return VXIplatform_RESULT_FATAL_ERROR;
  344. #ifdef WIN32
  345. #ifdef UNICODE
  346.   {
  347.     int len = strlen(libName);
  348.     wchar_t *wlibName = (wchar_t*)malloc(sizeof(wchar_t*)*(len+1));
  349.     if( !wlibName ) return VXIplatform_OUT_OF_MEMORY;
  350.     char2wchar(wlibName, libName, len+1);
  351.     libPtr = LoadLibrary(wlibName);
  352.     free(wlibName);
  353.   }
  354. #else
  355.   libPtr = LoadLibrary(libName);
  356. #endif
  357. #else
  358.   libPtr = dlopen(libName, RTLD_LAZY);
  359. #endif
  360.   if (libPtr) {
  361.     libImpl = (DynLibrary *) 
  362.       malloc(sizeof(DynLibrary));
  363.     if (libImpl)
  364.       libImpl->libPtr = libPtr;
  365.   } 
  366.   *libHandle = (DynLibrary *) libImpl;
  367.   return (*libHandle ? VXIplatform_RESULT_SUCCESS :
  368.                      VXIplatform_RESULT_FATAL_ERROR);
  369. }
  370. VXIplatformResult
  371. LoadDynSymbol
  372. (
  373.   DynLibrary      *libHandle, 
  374.   const char      *symName,
  375.   void            **symPtr
  376. )
  377. {
  378.   if ((! libHandle) || (! symName) || (! *symName) || (! symPtr))
  379.     return VXIplatform_RESULT_FATAL_ERROR;
  380. #ifdef WIN32
  381. #ifdef UNICODE
  382.   {
  383.     int len = strlen(symName);
  384.     wchar_t *wsymName = (wchar_t*)malloc(sizeof(wchar_t*)*(len+1));
  385.     if( !wsymName ) return VXIplatform_OUT_OF_MEMORY;
  386.     char2wchar(wsymName, libName, len+1);    
  387.     (*symPtr) = (void *) GetProcAddress(libHandle->libPtr, wsymName);
  388.     free(wsymName);
  389.   }
  390. #else
  391.   (*symPtr) = (void *) GetProcAddress(libHandle->libPtr, symName);
  392. #endif
  393. #else
  394.   (*symPtr) = (void *) dlsym(libHandle->libPtr, symName);
  395. #endif
  396.   return (*symPtr ? VXIplatform_RESULT_SUCCESS :
  397.                   VXIplatform_RESULT_FATAL_ERROR);
  398. }
  399. VXIplatformResult
  400. CloseDynLibrary
  401. (
  402.   DynLibrary      **libHandle
  403. )
  404. {
  405.   if( libHandle && *libHandle ) {
  406. #ifdef WIN32
  407.     FreeLibrary((*libHandle)->libPtr);
  408. #else
  409.     dlclose((*libHandle)->libPtr);
  410. #endif
  411.     free(*libHandle );
  412.     *libHandle = NULL;  
  413.   }
  414.   return VXIplatform_RESULT_SUCCESS;
  415. }