xr_parser_lib.h

00001 /*
00002 ** $Id$
00003 **
00004 ** Copyright (C) 2001 by First Peer, Inc. All rights reserved.
00005 ** Copyright (C) 2001 by Eric Kidd. All rights reserved.
00006 **
00007 ** Redistribution and use in source and binary forms, with or without
00008 ** modification, are permitted provided that the following conditions
00009 ** are met:
00010 ** 1. Redistributions of source code must retain the above copyright
00011 **    notice, this list of conditions and the following disclaimer.
00012 ** 2. Redistributions in binary form must reproduce the above copyright
00013 **    notice, this list of conditions and the following disclaimer in the
00014 **    documentation and/or other materials provided with the distribution.
00015 ** 3. The name of the author may not be used to endorse or promote products
00016 **    derived from this software without specific prior written permission.
00017 **
00018 ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
00019 ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00020 ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00021 ** ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
00022 ** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00023 ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00024 ** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00025 ** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00026 ** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00027 ** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00028 ** SUCH DAMAGE. */
00029 
00030 /* History:
00031  * ---------
00032  *  2006-11-30  imported from xmlrpc project, file /xmlrpc-c/src/xmlrpc_data.c,
00033  *              version 1.06.06 (lavinia)
00034  *  2007-10-05  support for libxmlrpc-c3 version 1.x.x added (dragos)
00035  */
00036 
00037 
00038 #ifdef XMLRPC_OLD_VERSION
00039 
00040 #define XMLRPC_WANT_INTERNAL_DECLARATIONS
00041 #include <xmlrpc.h>
00042 
00043 static char * xmlrpc_typeName ( xmlrpc_type type ) {
00044 
00045     switch(type) {
00046 
00047     case XMLRPC_TYPE_INT:      return "INT";
00048     case XMLRPC_TYPE_BOOL:     return "BOOL";
00049     case XMLRPC_TYPE_DOUBLE:   return "DOUBLE";
00050     case XMLRPC_TYPE_DATETIME: return "DATETIME";
00051     case XMLRPC_TYPE_STRING:   return "STRING";
00052     case XMLRPC_TYPE_BASE64:   return "BASE64";
00053     case XMLRPC_TYPE_ARRAY:    return "ARRAY";
00054     case XMLRPC_TYPE_STRUCT:   return "STRUCT";
00055     case XMLRPC_TYPE_C_PTR:    return "C_PTR";
00056     case XMLRPC_TYPE_DEAD:     return "DEAD";
00057     default:                   return "Unknown";
00058     }
00059 }
00060 
00061 static void validateType ( xmlrpc_env * env, xmlrpc_value * value, xmlrpc_type expectedType ) {
00062         
00063     if ( value->_type != expectedType ) {
00064         xmlrpc_env_set_fault_formatted(
00065             env, XMLRPC_TYPE_ERROR, "Value of type %s supplied where type %s was expected.", 
00066             xmlrpc_typeName(value->_type), xmlrpc_typeName(expectedType));
00067     }
00068 }
00069 
00070 
00071 static void verifyNoNulls ( xmlrpc_env * env, char * content, unsigned int len ) {
00072 
00073     unsigned int i;
00074 
00075     for ( i = 0 ; i < len && !env->fault_occurred ; i++ )
00076         if ( content[i] == '\0' )
00077             xmlrpc_env_set_fault(env, XMLRPC_INTERNAL_ERROR, "String must not contain NULL characters");
00078 }
00079 
00080 static void accessStringValue ( xmlrpc_env * env, xmlrpc_value * value, size_t * length, char ** contents ) {
00081     
00082     validateType(env, value, XMLRPC_TYPE_STRING);
00083 
00084     if ( !env->fault_occurred ) {
00085 
00086         unsigned int size = XMLRPC_TYPED_MEM_BLOCK_SIZE(char, &value->_block);
00087         char * content = XMLRPC_TYPED_MEM_BLOCK_CONTENTS(char, &value->_block);
00088         unsigned int len = size - 1;
00089         /* The memblock has a null character added to the end */
00090                 verifyNoNulls(env, content, len);
00091                 *length = len;
00092         *contents = content;
00093     } else {
00094                 *length = 0;
00095                 *contents = NULL;
00096         }
00097 }
00098 
00099 static void xmlrpc_read_string( xmlrpc_env * env, xmlrpc_value * value, char ** stringValue ) {
00100 
00101         size_t length;
00102     char * contents, *str;
00103 
00104     accessStringValue(env, value, &length, &contents);
00105 
00106     if ( !env->fault_occurred ) {
00107                      
00108         str = (char*) pkg_malloc (length+1);
00109         if ( str == NULL ) {
00110             xmlrpc_env_set_fault_formatted(env, XMLRPC_INTERNAL_ERROR, 
00111                                         "Unable to allocate space for %u-character string", length);
00112                         LM_ERR("pkg_malloc cannot allocate any more memory!\n");
00113                 }
00114         else {
00115             memcpy(str, contents, length);
00116             str[length] = '\0';
00117                         *stringValue = str;
00118         }
00119     }
00120 }
00121 
00122 #if HAVE_UNICODE_WCHAR
00123 
00124 static void verifyNoNullsW( xmlrpc_env * env, wchar_t * contents, unsigned int len ) {
00125 
00126     unsigned int i;
00127 
00128     for (i = 0; i < len && !env->fault_occurred; i++)
00129         if ( contents[i] == '\0' )
00130             xmlrpc_env_set_fault(env, XMLRPC_INTERNAL_ERROR, 
00131                                         "String must not contain NULL characters.");
00132 }
00133 
00134 static void accessStringValueW (xmlrpc_env * env, xmlrpc_value * value, size_t * length, wchar_t ** stringValueW ) {
00135 
00136     validateType(env, value, XMLRPC_TYPE_STRING);
00137 
00138     if ( !env->fault_occurred ) {
00139       
00140         if ( !env->fault_occurred ) {
00141             wchar_t * wcontents = XMLRPC_TYPED_MEM_BLOCK_CONTENTS(wchar_t, value->_wcs_block);
00142             size_t len = XMLRPC_TYPED_MEM_BLOCK_SIZE(wchar_t, value->_wcs_block) - 1;
00143             
00144             verifyNoNullsW(env, wcontents, len);
00145             *length = len;
00146             *stringValueW = wcontents;
00147         }
00148     }
00149 }
00150 
00151 static void xmlrpc_read_string_w ( xmlrpc_env * env, xmlrpc_value * value, wchar_t ** stringValue ) {
00152 
00153     size_t length;
00154     wchar_t * wcontents, * str;
00155     
00156     accessStringValueW(env, value, &length, &wcontents);
00157 
00158     if ( !env->fault_occurred ) {
00159                 if ( !value->_wcs_block ) {
00160                 char * contents = XMLRPC_TYPED_MEM_BLOCK_CONTENTS(char, &value->_block);
00161                 size_t len = XMLRPC_TYPED_MEM_BLOCK_SIZE(char, &value->_block) - 1;
00162                 value->_wcs_block = xmlrpc_utf8_to_wcs(env, contents, len + 1);
00163         }
00164 
00165         str = (wchar_t*) pkg_malloc (length + 1);
00166         if ( str == NULL ){
00167                         xmlrpc_env_set_fault_formatted(env, XMLRPC_INTERNAL_ERROR, 
00168                                         "Unable to allocate space for %u-byte string", length);
00169                         LM_ERR("pkg_malloc cannot allocate any more memory!\n");
00170                 }
00171         else {
00172             memcpy(str, wcontents, length * sizeof(wchar_t));
00173             str[length] = '\0';
00174             *stringValue = str;
00175         }
00176     }
00177 }
00178 #endif
00179 #endif