IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 19542


Ignore:
Timestamp:
Sep 12, 2008, 3:15:59 PM (18 years ago)
Author:
jhoblitt
Message:

update to gSOAP 2.7.11

Location:
trunk/Nebulous/nebclient/src
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Nebulous/nebclient/src/nebulous.h

    r13096 r19542  
    11/* src/nebulous.h
    2    Generated by wsdl2h 1.2.1 from nebulous.wsdl and typemap.dat
    3    2007-05-01 02:53:36 GMT
    4    Copyright (C) 2001-2005 Robert van Engelen, Genivia Inc. All Rights Reserved.
     2   Generated by wsdl2h 1.2.11 from nebulous.wsdl and typemap.dat
     3   2008-09-13 01:14:23 GMT
     4   Copyright (C) 2001-2008 Robert van Engelen, Genivia Inc. All Rights Reserved.
    55   This part of the software is released under one of the following licenses:
    66   GPL or Genivia's license for commercial use.
     
    1010
    1111 - Compile this file with soapcpp2 to complete the code generation process.
    12  - Use wsdl2h option -l to view the software license terms.
     12 - Use soapcpp2 option -I to specify paths for #import
     13   To build with STL, 'stlvector.h' is imported from 'import' dir in package.
    1314 - Use wsdl2h options -c and -s to generate pure C code or C++ code without STL.
    14  - To build with STL, stlvector.h from the gSOAP distribution must be in the
    15    current directory. Or use soapcpp2 option -I<path> with path to stlvector.h.
    16  - Use typemap.dat to control schema namespace bindings and type mappings.
     15 - Use 'typemap.dat' to control namespace bindings and type mappings.
    1716   It is strongly recommended to customize the names of the namespace prefixes
    1817   generated by wsdl2h. To do so, modify the prefix bindings in the Namespaces
    19    section below and add the modified lines to typemap.dat to rerun wsdl2h.
     18   section below and add the modified lines to 'typemap.dat' to rerun wsdl2h.
    2019 - Use Doxygen (www.doxygen.org) to browse this file.
    21 
    22 */
     20 - Use wsdl2h option -l to view the software license terms.
     21
     22   DO NOT include this file directly into your project.
     23   Include only the soapcpp2-generated headers and source code files.
     24*/
     25
     26//gsoapopt cw
    2327
    2428/******************************************************************************\
     
    2832\******************************************************************************/
    2933
    30 //gsoapopt cw
     34
     35/******************************************************************************\
     36 *                                                                            *
     37 * Import                                                                     *
     38 *                                                                            *
     39\******************************************************************************/
    3140
    3241
     
    5867
    5968
    60 /// Built-in attribute "SOAP-ENC:arrayType"
    61 typedef char* SOAP_ENC__arrayType;
    62 
    63 
    64 /// Schema urn:Nebulous/Server/SOAP:"ArrayOfString"
    65 
     69
     70/// "urn:Nebulous/Server/SOAP":ArrayOfString is a complexType with complexContent restriction of SOAP-ENC:Array.
    6671/// SOAP encoded array of xs:string
    6772struct ArrayOfString
    6873{
    69 /// Pointer to an array of char*
     74/// Pointer to array of char*.
    7075    char*                               *__ptr                         ;
    71 /// Size of the dynamic array
     76/// Size of the dynamic array.
    7277    int                                  __size                        ;
     78/// Offset for partially transmitted arrays (uncomment only when required).
     79//  int                                  __offset                      ;
    7380};
    7481
     
    7885 *                                                                            *
    7986\******************************************************************************/
     87
    8088
    8189//gsoap ns1  service name:      SOAP
     
    111119  - http://localhost:80/nebulous
    112120
     121Note: use wsdl2h option -N to change the service binding prefix name
     122
    113123*/
    114124
     
    136146  - SOAP action="urn:Nebulous/Server/SOAP#create_object"
    137147
    138 C stub function (defined in soapClient.c[pp]):
    139 @code
    140   int soap_call_ns1__create_USCOREobject(struct soap *soap,
    141     NULL, // char *endpoint = NULL selects default endpoint for this operation
    142     NULL, // char *action = NULL selects default action for this operation
     148C stub function (defined in soapClient.c[pp] generated by soapcpp2):
     149@code
     150  int soap_call_ns1__create_USCOREobject(
     151    struct soap *soap,
     152    NULL, // char *endpoint = NULL selects default endpoint for this operation
     153    NULL, // char *action = NULL selects default action for this operation
     154    // request parameters:
     155    char*                               key,
     156    char*                               volume,
     157    // response parameters:
     158    char*                              *result
     159  );
     160@endcode
     161
     162C server function (called from the service dispatcher defined in soapServer.c[pp]):
     163@code
     164  int ns1__create_USCOREobject(
     165    struct soap *soap,
    143166    // request parameters:
    144167    char*                               key,
     
    155178//gsoap ns1  service method-action:     create_USCOREobject urn:Nebulous/Server/SOAP#create_object
    156179int ns1__create_USCOREobject(
    157     char*                               key,
    158     char*                               volume,
    159     char*                              *result ///< response parameter
     180    char*                               key,    ///< Request parameter
     181    char*                               volume, ///< Request parameter
     182    char*                              *result  ///< Response parameter
    160183);
    161184
     
    176199  - SOAP action="urn:Nebulous/Server/SOAP#create_object"
    177200
    178 C stub function (defined in soapClient.c[pp]):
    179 @code
    180   int soap_call_ns1__rename_USCOREobject(struct soap *soap,
    181     NULL, // char *endpoint = NULL selects default endpoint for this operation
    182     NULL, // char *action = NULL selects default action for this operation
     201C stub function (defined in soapClient.c[pp] generated by soapcpp2):
     202@code
     203  int soap_call_ns1__rename_USCOREobject(
     204    struct soap *soap,
     205    NULL, // char *endpoint = NULL selects default endpoint for this operation
     206    NULL, // char *action = NULL selects default action for this operation
     207    // request parameters:
     208    char*                               key,
     209    char*                               newkey,
     210    // response parameters:
     211    char*                              *result
     212  );
     213@endcode
     214
     215C server function (called from the service dispatcher defined in soapServer.c[pp]):
     216@code
     217  int ns1__rename_USCOREobject(
     218    struct soap *soap,
    183219    // request parameters:
    184220    char*                               key,
     
    195231//gsoap ns1  service method-action:     rename_USCOREobject urn:Nebulous/Server/SOAP#create_object
    196232int ns1__rename_USCOREobject(
     233    char*                               key,    ///< Request parameter
     234    char*                               newkey, ///< Request parameter
     235    char*                              *result  ///< Response parameter
     236);
     237
     238/******************************************************************************\
     239 *                                                                            *
     240 * ns1__rename_USCOREobject_                                                  *
     241 *                                                                            *
     242\******************************************************************************/
     243
     244
     245/// Operation "ns1__rename_USCOREobject_" of service binding "SOAP"
     246
     247/**
     248
     249Operation details:
     250
     251  - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
     252  - SOAP action="urn:Nebulous/Server/SOAP#rename_object"
     253
     254C stub function (defined in soapClient.c[pp] generated by soapcpp2):
     255@code
     256  int soap_call_ns1__rename_USCOREobject_(
     257    struct soap *soap,
     258    NULL, // char *endpoint = NULL selects default endpoint for this operation
     259    NULL, // char *action = NULL selects default action for this operation
     260    // request parameters:
    197261    char*                               key,
    198262    char*                               newkey,
    199     char*                              *result ///< response parameter
    200 );
    201 
    202 /******************************************************************************\
    203  *                                                                            *
    204  * ns1__rename_USCOREobject_                                                  *
    205  *                                                                            *
    206 \******************************************************************************/
    207 
    208 
    209 /// Operation "ns1__rename_USCOREobject_" of service binding "SOAP"
    210 
    211 /**
    212 
    213 Operation details:
    214 
    215   - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
    216   - SOAP action="urn:Nebulous/Server/SOAP#rename_object"
    217 
    218 C stub function (defined in soapClient.c[pp]):
    219 @code
    220   int soap_call_ns1__rename_USCOREobject_(struct soap *soap,
    221     NULL, // char *endpoint = NULL selects default endpoint for this operation
    222     NULL, // char *action = NULL selects default action for this operation
     263    // response parameters:
     264    char*                              *result
     265  );
     266@endcode
     267
     268C server function (called from the service dispatcher defined in soapServer.c[pp]):
     269@code
     270  int ns1__rename_USCOREobject_(
     271    struct soap *soap,
    223272    // request parameters:
    224273    char*                               key,
     
    235284//gsoap ns1  service method-action:     rename_USCOREobject_ urn:Nebulous/Server/SOAP#rename_object
    236285int ns1__rename_USCOREobject_(
    237     char*                               key,
    238     char*                               newkey,
    239     char*                              *result ///< response parameter
     286    char*                               key,    ///< Request parameter
     287    char*                               newkey, ///< Request parameter
     288    char*                              *result  ///< Response parameter
    240289);
    241290
     
    256305  - SOAP action="urn:Nebulous/Server/SOAP#replicate_object"
    257306
    258 C stub function (defined in soapClient.c[pp]):
    259 @code
    260   int soap_call_ns1__replicate_USCOREobject(struct soap *soap,
    261     NULL, // char *endpoint = NULL selects default endpoint for this operation
    262     NULL, // char *action = NULL selects default action for this operation
     307C stub function (defined in soapClient.c[pp] generated by soapcpp2):
     308@code
     309  int soap_call_ns1__replicate_USCOREobject(
     310    struct soap *soap,
     311    NULL, // char *endpoint = NULL selects default endpoint for this operation
     312    NULL, // char *action = NULL selects default action for this operation
     313    // request parameters:
     314    char*                               key,
     315    char*                               volume,
     316    // response parameters:
     317    char*                              *result
     318  );
     319@endcode
     320
     321C server function (called from the service dispatcher defined in soapServer.c[pp]):
     322@code
     323  int ns1__replicate_USCOREobject(
     324    struct soap *soap,
    263325    // request parameters:
    264326    char*                               key,
     
    275337//gsoap ns1  service method-action:     replicate_USCOREobject urn:Nebulous/Server/SOAP#replicate_object
    276338int ns1__replicate_USCOREobject(
    277     char*                               key,
    278     char*                               volume,
    279     char*                              *result ///< response parameter
     339    char*                               key,    ///< Request parameter
     340    char*                               volume, ///< Request parameter
     341    char*                              *result  ///< Response parameter
    280342);
    281343
     
    296358  - SOAP action="urn:Nebulous/Server/SOAP#lock_object"
    297359
    298 C stub function (defined in soapClient.c[pp]):
    299 @code
    300   int soap_call_ns1__lock_USCOREobject(struct soap *soap,
    301     NULL, // char *endpoint = NULL selects default endpoint for this operation
    302     NULL, // char *action = NULL selects default action for this operation
     360C stub function (defined in soapClient.c[pp] generated by soapcpp2):
     361@code
     362  int soap_call_ns1__lock_USCOREobject(
     363    struct soap *soap,
     364    NULL, // char *endpoint = NULL selects default endpoint for this operation
     365    NULL, // char *action = NULL selects default action for this operation
     366    // request parameters:
     367    char*                               key,
     368    char*                               type,
     369    // response parameters:
     370    int                                *result
     371  );
     372@endcode
     373
     374C server function (called from the service dispatcher defined in soapServer.c[pp]):
     375@code
     376  int ns1__lock_USCOREobject(
     377    struct soap *soap,
    303378    // request parameters:
    304379    char*                               key,
     
    315390//gsoap ns1  service method-action:     lock_USCOREobject urn:Nebulous/Server/SOAP#lock_object
    316391int ns1__lock_USCOREobject(
     392    char*                               key,    ///< Request parameter
     393    char*                               type,   ///< Request parameter
     394    int                                *result  ///< Response parameter
     395);
     396
     397/******************************************************************************\
     398 *                                                                            *
     399 * ns1__unlock_USCOREobject                                                   *
     400 *                                                                            *
     401\******************************************************************************/
     402
     403
     404/// Operation "ns1__unlock_USCOREobject" of service binding "SOAP"
     405
     406/**
     407
     408Operation details:
     409
     410  - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
     411  - SOAP action="urn:Nebulous/Server/SOAP#unlock_object"
     412
     413C stub function (defined in soapClient.c[pp] generated by soapcpp2):
     414@code
     415  int soap_call_ns1__unlock_USCOREobject(
     416    struct soap *soap,
     417    NULL, // char *endpoint = NULL selects default endpoint for this operation
     418    NULL, // char *action = NULL selects default action for this operation
     419    // request parameters:
    317420    char*                               key,
    318421    char*                               type,
    319     int                                *result ///< response parameter
    320 );
    321 
    322 /******************************************************************************\
    323  *                                                                            *
    324  * ns1__unlock_USCOREobject                                                   *
    325  *                                                                            *
    326 \******************************************************************************/
    327 
    328 
    329 /// Operation "ns1__unlock_USCOREobject" of service binding "SOAP"
    330 
    331 /**
    332 
    333 Operation details:
    334 
    335   - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
    336   - SOAP action="urn:Nebulous/Server/SOAP#unlock_object"
    337 
    338 C stub function (defined in soapClient.c[pp]):
    339 @code
    340   int soap_call_ns1__unlock_USCOREobject(struct soap *soap,
    341     NULL, // char *endpoint = NULL selects default endpoint for this operation
    342     NULL, // char *action = NULL selects default action for this operation
     422    // response parameters:
     423    int                                *result
     424  );
     425@endcode
     426
     427C server function (called from the service dispatcher defined in soapServer.c[pp]):
     428@code
     429  int ns1__unlock_USCOREobject(
     430    struct soap *soap,
    343431    // request parameters:
    344432    char*                               key,
     
    355443//gsoap ns1  service method-action:     unlock_USCOREobject urn:Nebulous/Server/SOAP#unlock_object
    356444int ns1__unlock_USCOREobject(
    357     char*                               key,
    358     char*                               type,
    359     int                                *result ///< response parameter
     445    char*                               key,    ///< Request parameter
     446    char*                               type,   ///< Request parameter
     447    int                                *result  ///< Response parameter
    360448);
    361449
     
    381469  - SOAP action="urn:Nebulous/Server/SOAP#find_objects"
    382470
    383 C stub function (defined in soapClient.c[pp]):
    384 @code
    385   int soap_call_ns1__find_USCOREobjects(struct soap *soap,
    386     NULL, // char *endpoint = NULL selects default endpoint for this operation
    387     NULL, // char *action = NULL selects default action for this operation
     471C stub function (defined in soapClient.c[pp] generated by soapcpp2):
     472@code
     473  int soap_call_ns1__find_USCOREobjects(
     474    struct soap *soap,
     475    NULL, // char *endpoint = NULL selects default endpoint for this operation
     476    NULL, // char *action = NULL selects default action for this operation
     477    // request parameters:
     478    char*                               pattern,
     479    // response parameters:
     480    struct ns1__find_USCOREobjectsResponse*
     481  );
     482@endcode
     483
     484C server function (called from the service dispatcher defined in soapServer.c[pp]):
     485@code
     486  int ns1__find_USCOREobjects(
     487    struct soap *soap,
    388488    // request parameters:
    389489    char*                               pattern,
     
    399499//gsoap ns1  service method-action:     find_USCOREobjects urn:Nebulous/Server/SOAP#find_objects
    400500int ns1__find_USCOREobjects(
    401     char*                               pattern,
    402     struct ns1__find_USCOREobjectsResponse* ///< response parameter
     501    char*                               pattern,        ///< Request parameter
     502    struct ns1__find_USCOREobjectsResponse*     ///< Response struct parameter
    403503);
    404504
     
    424524  - SOAP action="urn:Nebulous/Server/SOAP#find_instances"
    425525
    426 C stub function (defined in soapClient.c[pp]):
    427 @code
    428   int soap_call_ns1__find_USCOREinstances(struct soap *soap,
    429     NULL, // char *endpoint = NULL selects default endpoint for this operation
    430     NULL, // char *action = NULL selects default action for this operation
     526C stub function (defined in soapClient.c[pp] generated by soapcpp2):
     527@code
     528  int soap_call_ns1__find_USCOREinstances(
     529    struct soap *soap,
     530    NULL, // char *endpoint = NULL selects default endpoint for this operation
     531    NULL, // char *action = NULL selects default action for this operation
     532    // request parameters:
     533    char*                               key,
     534    char*                               volume,
     535    // response parameters:
     536    struct ns1__find_USCOREinstancesResponse*
     537  );
     538@endcode
     539
     540C server function (called from the service dispatcher defined in soapServer.c[pp]):
     541@code
     542  int ns1__find_USCOREinstances(
     543    struct soap *soap,
    431544    // request parameters:
    432545    char*                               key,
     
    443556//gsoap ns1  service method-action:     find_USCOREinstances urn:Nebulous/Server/SOAP#find_instances
    444557int ns1__find_USCOREinstances(
    445     char*                               key,
    446     char*                               volume,
    447     struct ns1__find_USCOREinstancesResponse* ///< response parameter
     558    char*                               key,    ///< Request parameter
     559    char*                               volume, ///< Request parameter
     560    struct ns1__find_USCOREinstancesResponse*   ///< Response struct parameter
    448561);
    449562
     
    464577  - SOAP action="urn:Nebulous/Server/SOAP#delete_instance"
    465578
    466 C stub function (defined in soapClient.c[pp]):
    467 @code
    468   int soap_call_ns1__delete_USCOREinstance(struct soap *soap,
    469     NULL, // char *endpoint = NULL selects default endpoint for this operation
    470     NULL, // char *action = NULL selects default action for this operation
     579C stub function (defined in soapClient.c[pp] generated by soapcpp2):
     580@code
     581  int soap_call_ns1__delete_USCOREinstance(
     582    struct soap *soap,
     583    NULL, // char *endpoint = NULL selects default endpoint for this operation
     584    NULL, // char *action = NULL selects default action for this operation
     585    // request parameters:
     586    char*                               uri,
     587    // response parameters:
     588    int                                *result
     589  );
     590@endcode
     591
     592C server function (called from the service dispatcher defined in soapServer.c[pp]):
     593@code
     594  int ns1__delete_USCOREinstance(
     595    struct soap *soap,
    471596    // request parameters:
    472597    char*                               uri,
     
    482607//gsoap ns1  service method-action:     delete_USCOREinstance urn:Nebulous/Server/SOAP#delete_instance
    483608int ns1__delete_USCOREinstance(
    484     char*                               uri,
    485     int                                *result ///< response parameter
     609    char*                               uri,    ///< Request parameter
     610    int                                *result  ///< Response parameter
    486611);
    487612
     
    507632  - SOAP action="urn:Nebulous/Server/SOAP#stat_object"
    508633
    509 C stub function (defined in soapClient.c[pp]):
    510 @code
    511   int soap_call_ns1__stat_USCOREobject(struct soap *soap,
    512     NULL, // char *endpoint = NULL selects default endpoint for this operation
    513     NULL, // char *action = NULL selects default action for this operation
     634C stub function (defined in soapClient.c[pp] generated by soapcpp2):
     635@code
     636  int soap_call_ns1__stat_USCOREobject(
     637    struct soap *soap,
     638    NULL, // char *endpoint = NULL selects default endpoint for this operation
     639    NULL, // char *action = NULL selects default action for this operation
     640    // request parameters:
     641    char*                               key,
     642    // response parameters:
     643    struct ns1__stat_USCOREobjectResponse*
     644  );
     645@endcode
     646
     647C server function (called from the service dispatcher defined in soapServer.c[pp]):
     648@code
     649  int ns1__stat_USCOREobject(
     650    struct soap *soap,
    514651    // request parameters:
    515652    char*                               key,
     
    525662//gsoap ns1  service method-action:     stat_USCOREobject urn:Nebulous/Server/SOAP#stat_object
    526663int ns1__stat_USCOREobject(
    527     char*                               key,
    528     struct ns1__stat_USCOREobjectResponse* ///< response parameter
     664    char*                               key,    ///< Request parameter
     665    struct ns1__stat_USCOREobjectResponse*      ///< Response struct parameter
    529666);
    530667
  • trunk/Nebulous/nebclient/src/soapC.c

    r13096 r19542  
    11/* soapC.c
    2    Generated by gSOAP 2.7.2 from src/nebulous.h
    3    Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc. All Rights Reserved.
     2   Generated by gSOAP 2.7.11 from src/nebulous.h
     3   Copyright(C) 2000-2008, Robert van Engelen, Genivia Inc. All Rights Reserved.
    44   This part of the software is released under one of the following licenses:
    55   GPL, the gSOAP public license, or Genivia's license for commercial use.
    66*/
     7
    78#include "soapH.h"
     9
    810#ifdef __cplusplus
    911extern "C" {
    1012#endif
    1113
    12 SOAP_BEGIN_NAMESPACE(soap)
    13 
    14 SOAP_SOURCE_STAMP("@(#) soapC.c ver 2.7.2 2007-05-01 02:53:36 GMT")
     14SOAP_SOURCE_STAMP("@(#) soapC.c ver 2.7.11 2008-09-13 01:14:40 GMT")
    1515
    1616
     
    2727        if (soap->header)
    2828        {       soap->part = SOAP_IN_HEADER;
    29                 soap_out_SOAP_ENV__Header(soap, "SOAP-ENV:Header", 0, soap->header, NULL);
     29                if (soap_out_SOAP_ENV__Header(soap, "SOAP-ENV:Header", 0, soap->header, NULL))
     30                        return soap->error;
    3031                soap->part = SOAP_END_HEADER;
    3132        }
     
    4142}
    4243
     44SOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap)
     45{
     46        if (!soap->header)
     47        {       soap->header = (struct SOAP_ENV__Header*)soap_malloc(soap, sizeof(struct SOAP_ENV__Header));
     48                soap_default_SOAP_ENV__Header(soap, soap->header);
     49        }
     50}
     51
    4352SOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap)
    4453{
    4554        if (!soap->fault)
    4655        {       soap->fault = (struct SOAP_ENV__Fault*)soap_malloc(soap, sizeof(struct SOAP_ENV__Fault));
     56                if (!soap->fault)
     57                        return;
    4758                soap_default_SOAP_ENV__Fault(soap, soap->fault);
    4859        }
    49         if (soap->version != 1 && !soap->fault->SOAP_ENV__Code)
     60        if (soap->version == 2 && !soap->fault->SOAP_ENV__Code)
    5061        {       soap->fault->SOAP_ENV__Code = (struct SOAP_ENV__Code*)soap_malloc(soap, sizeof(struct SOAP_ENV__Code));
    5162                soap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code);
     63        }
     64        if (soap->version == 2 && !soap->fault->SOAP_ENV__Reason)
     65        {       soap->fault->SOAP_ENV__Reason = (struct SOAP_ENV__Reason*)soap_malloc(soap, sizeof(struct SOAP_ENV__Reason));
     66                soap_default_SOAP_ENV__Reason(soap, soap->fault->SOAP_ENV__Reason);
    5267        }
    5368}
     
    7994}
    8095
    81 SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultstring(struct soap *soap)
     96SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultsubcode(struct soap *soap)
    8297{
    8398        soap_fault(soap);
    8499        if (soap->version == 2)
    85                 return (const char**)&soap->fault->SOAP_ENV__Reason;
     100        {       if (!soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode)
     101                {       soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode = (struct SOAP_ENV__Code*)soap_malloc(soap, sizeof(struct SOAP_ENV__Code));
     102                        soap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode);
     103                }
     104                return (const char**)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value;
     105        }
     106        return (const char**)&soap->fault->faultcode;
     107}
     108
     109SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultstring(struct soap *soap)
     110{
     111        soap_fault(soap);
     112        if (soap->version == 2)
     113                return (const char**)&soap->fault->SOAP_ENV__Reason->SOAP_ENV__Text;
    86114        return (const char**)&soap->fault->faultstring;
    87115}
     
    187215        case SOAP_TYPE_PointerTostring:
    188216                return soap_in_PointerTostring(soap, NULL, NULL, "xsd:string");
    189         case SOAP_TYPE_SOAP_ENC__arrayType:
    190         {       char **s;
    191                 s = soap_in_SOAP_ENC__arrayType(soap, NULL, NULL, "SOAP-ENC:arrayType");
    192                 return s ? *s : NULL;
    193         }
    194         case SOAP_TYPE__QName:
    195         {       char **s;
    196                 s = soap_in__QName(soap, NULL, NULL, "QName");
    197                 return s ? *s : NULL;
    198         }
    199217        case SOAP_TYPE_string:
    200218        {       char **s;
     
    298316                        return soap_in_ArrayOfString(soap, NULL, NULL, NULL);
    299317                }
    300                 if (!soap_match_tag(soap, t, "SOAP-ENC:arrayType"))
    301                 {       char **s;
    302                         *type = SOAP_TYPE_SOAP_ENC__arrayType;
    303                         s = soap_in_SOAP_ENC__arrayType(soap, NULL, NULL, NULL);
    304                         return s ? *s : NULL;
    305                 }
    306                 if (!soap_match_tag(soap, t, "QName"))
    307                 {       char **s;
    308                         *type = SOAP_TYPE__QName;
    309                         s = soap_in__QName(soap, NULL, NULL, NULL);
    310                         return s ? *s : NULL;
    311                 }
    312318                if (!soap_match_tag(soap, t, "xsd:string"))
    313319                {       char **s;
     
    316322                        return s ? *s : NULL;
    317323                }
     324                t = soap->tag;
     325                if (!soap_match_tag(soap, t, "xsd:QName"))
     326                {       char **s;
     327                        *type = SOAP_TYPE__QName;
     328                        s = soap_in__QName(soap, NULL, NULL, NULL);
     329                        return s ? *s : NULL;
     330                }
    318331        }
    319332        }
     
    324337
    325338SOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap *soap)
    326 {       if (!soap_peek_element(soap))
     339{
     340        if (!soap_peek_element(soap))
    327341        {       int t;
     342                DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unexpected element '%s' in input (level=%u, %d)\n", soap->tag, soap->level, soap->body));
    328343                if (soap->mustUnderstand && !soap->other)
    329344                        return soap->error = SOAP_MUSTUNDERSTAND;
    330345                if (((soap->mode & SOAP_XML_STRICT) && soap->part != SOAP_IN_HEADER) || !soap_match_tag(soap, soap->tag, "SOAP-ENV:"))
     346                {       DBGLOG(TEST, SOAP_MESSAGE(fdebug, "REJECTING element '%s'\n", soap->tag));
    331347                        return soap->error = SOAP_TAG_MISMATCH;
     348                }
    332349                if (!*soap->id || !soap_getelement(soap, &t))
    333350                {       soap->peeked = 0;
    334                         DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unknown element '%s' (level=%u, %d)\n", soap->tag, soap->level, soap->body));
    335351                        if (soap->fignore)
    336352                                soap->error = soap->fignore(soap, soap->tag);
     
    428444        case SOAP_TYPE_PointerTostring:
    429445                return soap_out_PointerTostring(soap, tag, id, (char **const*)ptr, "xsd:string");
    430         case SOAP_TYPE_SOAP_ENC__arrayType:
    431                 return soap_out_string(soap, tag, id, (char**)&ptr, "SOAP-ENC:arrayType");
    432446        case SOAP_TYPE__QName:
    433                 return soap_out_string(soap, "QName", id, (char**)&ptr, NULL);
     447                return soap_out_string(soap, "xsd:QName", id, (char*const*)&ptr, NULL);
    434448        case SOAP_TYPE_string:
    435                 return soap_out_string(soap, tag, id, (char**)&ptr, "xsd:string");
     449                return soap_out_string(soap, tag, id, (char*const*)&ptr, "xsd:string");
    436450        }
    437451        return SOAP_OK;
     
    526540                soap_serialize_PointerTostring(soap, (char **const*)ptr);
    527541                break;
    528         case SOAP_TYPE_SOAP_ENC__arrayType:
    529                 soap_serialize_string(soap, (char**)&ptr);
    530                 break;
    531542        case SOAP_TYPE__QName:
    532                 soap_serialize_string(soap, (char**)&ptr);
     543                soap_serialize_string(soap, (char*const*)&ptr);
    533544                break;
    534545        case SOAP_TYPE_string:
    535                 soap_serialize_string(soap, (char**)&ptr);
     546                soap_serialize_string(soap, (char*const*)&ptr);
    536547                break;
    537548        }
     
    539550#endif
    540551
    541 #ifndef WITH_LEANER
    542 SOAP_FMAC3 int SOAP_FMAC4 soap_resolve_attachments(struct soap *soap)
    543 {
    544         if (!(soap->mode & SOAP_ENC_DIME))
    545                 return SOAP_OK;
    546         while (soap->dime.flags & SOAP_DIME_CF)
    547         {       if (soap_getdimehdr(soap))
    548                         return soap->error;
    549                 if (soap_move(soap, soap->dime.size))
    550                         return soap->error = SOAP_EOF;
    551         }
    552         if (soap_move(soap, ((soap->dime.size+3)&(~3))-soap_tell(soap)))
    553                 return soap->error = SOAP_EOF;
    554         for (;;)
    555         {       if (soap_getdime(soap))
    556                         break;
    557                 switch (soap_lookup_type(soap, soap->dime.id))
    558                 {
    559                 }
    560         }
    561         if (soap->error == SOAP_DIME_END)
    562                 soap->error = SOAP_OK;
    563         return soap->error;
    564 }
    565 #endif
    566 
    567552SOAP_FMAC3 void SOAP_FMAC4 soap_default_byte(struct soap *soap, char *a)
    568 {
    569 (void)soap; /* appease -Wall -Werror */
     553{       (void)soap; /* appease -Wall -Werror */
    570554#ifdef SOAP_DEFAULT_byte
    571555        *a = SOAP_DEFAULT_byte;
     
    591575{
    592576        if ((p = soap_in_byte(soap, tag, p, type)))
    593                 soap_getindependent(soap);
     577                if (soap_getindependent(soap))
     578                        return NULL;
    594579        return p;
    595580}
     
    601586
    602587SOAP_FMAC3 void SOAP_FMAC4 soap_default_int(struct soap *soap, int *a)
    603 {
    604 (void)soap; /* appease -Wall -Werror */
     588{       (void)soap; /* appease -Wall -Werror */
    605589#ifdef SOAP_DEFAULT_int
    606590        *a = SOAP_DEFAULT_int;
     
    626610{
    627611        if ((p = soap_in_int(soap, tag, p, type)))
    628                 soap_getindependent(soap);
     612                if (soap_getindependent(soap))
     613                        return NULL;
    629614        return p;
    630615}
     
    636621
    637622#ifndef WITH_NOGLOBAL
    638 
    639 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Fault(struct soap *soap, const struct SOAP_ENV__Fault *a)
    640 {
    641         (void)soap; (void)a; /* appease -Wall -Werror */
    642         soap_embedded(soap, &a->faultcode, SOAP_TYPE__QName);
    643         soap_serialize__QName(soap, &a->faultcode);
    644         soap_embedded(soap, &a->faultstring, SOAP_TYPE_string);
    645         soap_serialize_string(soap, &a->faultstring);
    646         soap_embedded(soap, &a->faultactor, SOAP_TYPE_string);
    647         soap_serialize_string(soap, &a->faultactor);
    648         soap_embedded(soap, &a->detail, SOAP_TYPE_PointerToSOAP_ENV__Detail);
    649         soap_serialize_PointerToSOAP_ENV__Detail(soap, &a->detail);
    650         soap_embedded(soap, &a->SOAP_ENV__Code, SOAP_TYPE_PointerToSOAP_ENV__Code);
    651         soap_serialize_PointerToSOAP_ENV__Code(soap, &a->SOAP_ENV__Code);
    652         soap_embedded(soap, &a->SOAP_ENV__Reason, SOAP_TYPE_string);
    653         soap_serialize_string(soap, &a->SOAP_ENV__Reason);
    654         soap_embedded(soap, &a->SOAP_ENV__Node, SOAP_TYPE_string);
    655         soap_serialize_string(soap, &a->SOAP_ENV__Node);
    656         soap_embedded(soap, &a->SOAP_ENV__Role, SOAP_TYPE_string);
    657         soap_serialize_string(soap, &a->SOAP_ENV__Role);
    658         soap_embedded(soap, &a->SOAP_ENV__Detail, SOAP_TYPE_PointerToSOAP_ENV__Detail);
    659         soap_serialize_PointerToSOAP_ENV__Detail(soap, &a->SOAP_ENV__Detail);
    660 }
    661623
    662624SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Fault(struct soap *soap, struct SOAP_ENV__Fault *a)
     
    668630        a->detail = NULL;
    669631        a->SOAP_ENV__Code = NULL;
    670         soap_default_string(soap, &a->SOAP_ENV__Reason);
     632        a->SOAP_ENV__Reason = NULL;
    671633        soap_default_string(soap, &a->SOAP_ENV__Node);
    672634        soap_default_string(soap, &a->SOAP_ENV__Role);
     
    674636}
    675637
     638SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Fault(struct soap *soap, const struct SOAP_ENV__Fault *a)
     639{
     640        (void)soap; (void)a; /* appease -Wall -Werror */
     641        soap_serialize__QName(soap, &a->faultcode);
     642        soap_serialize_string(soap, &a->faultstring);
     643        soap_serialize_string(soap, &a->faultactor);
     644        soap_serialize_PointerToSOAP_ENV__Detail(soap, &a->detail);
     645        soap_serialize_PointerToSOAP_ENV__Code(soap, &a->SOAP_ENV__Code);
     646        soap_serialize_PointerToSOAP_ENV__Reason(soap, &a->SOAP_ENV__Reason);
     647        soap_serialize_string(soap, &a->SOAP_ENV__Node);
     648        soap_serialize_string(soap, &a->SOAP_ENV__Role);
     649        soap_serialize_PointerToSOAP_ENV__Detail(soap, &a->SOAP_ENV__Detail);
     650}
     651
    676652SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Fault(struct soap *soap, const struct SOAP_ENV__Fault *a, const char *tag, const char *type)
    677653{
     
    685661{
    686662        const char *soap_tmp_faultcode = soap_QName2s(soap, a->faultcode);
    687         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Fault), type);
    688         soap_out__QName(soap, "faultcode", -1, (char*const*)&soap_tmp_faultcode, "");
    689         soap_out_string(soap, "faultstring", -1, &a->faultstring, "");
    690         soap_out_string(soap, "faultactor", -1, &a->faultactor, "");
    691         soap_out_PointerToSOAP_ENV__Detail(soap, "detail", -1, &a->detail, "");
    692         soap_out_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Code", -1, &a->SOAP_ENV__Code, "");
    693         soap_out_string(soap, "SOAP-ENV:Reason", -1, &a->SOAP_ENV__Reason, "");
    694         soap_out_string(soap, "SOAP-ENV:Node", -1, &a->SOAP_ENV__Node, "");
    695         soap_out_string(soap, "SOAP-ENV:Role", -1, &a->SOAP_ENV__Role, "");
    696         soap_out_PointerToSOAP_ENV__Detail(soap, "SOAP-ENV:Detail", -1, &a->SOAP_ENV__Detail, "");
    697         soap_element_end_out(soap, tag);
    698         return SOAP_OK;
     663        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Fault), type))
     664                return soap->error;
     665        if (soap_out__QName(soap, "faultcode", -1, (char*const*)&soap_tmp_faultcode, ""))
     666                return soap->error;
     667        if (soap_out_string(soap, "faultstring", -1, &a->faultstring, ""))
     668                return soap->error;
     669        if (soap_out_string(soap, "faultactor", -1, &a->faultactor, ""))
     670                return soap->error;
     671        if (soap_out_PointerToSOAP_ENV__Detail(soap, "detail", -1, &a->detail, ""))
     672                return soap->error;
     673        if (soap_out_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Code", -1, &a->SOAP_ENV__Code, ""))
     674                return soap->error;
     675        if (soap_out_PointerToSOAP_ENV__Reason(soap, "SOAP-ENV:Reason", -1, &a->SOAP_ENV__Reason, ""))
     676                return soap->error;
     677        if (soap_out_string(soap, "SOAP-ENV:Node", -1, &a->SOAP_ENV__Node, ""))
     678                return soap->error;
     679        if (soap_out_string(soap, "SOAP-ENV:Role", -1, &a->SOAP_ENV__Role, ""))
     680                return soap->error;
     681        if (soap_out_PointerToSOAP_ENV__Detail(soap, "SOAP-ENV:Detail", -1, &a->SOAP_ENV__Detail, ""))
     682                return soap->error;
     683        return soap_element_end_out(soap, tag);
    699684}
    700685
     
    702687{
    703688        if ((p = soap_in_SOAP_ENV__Fault(soap, tag, p, type)))
    704                 soap_getindependent(soap);
     689                if (soap_getindependent(soap))
     690                        return NULL;
    705691        return p;
    706692}
     
    708694SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_in_SOAP_ENV__Fault(struct soap *soap, const char *tag, struct SOAP_ENV__Fault *a, const char *type)
    709695{
    710         short soap_flag_faultcode = 1, soap_flag_faultstring = 1, soap_flag_faultactor = 1, soap_flag_detail = 1, soap_flag_SOAP_ENV__Code = 1, soap_flag_SOAP_ENV__Reason = 1, soap_flag_SOAP_ENV__Node = 1, soap_flag_SOAP_ENV__Role = 1, soap_flag_SOAP_ENV__Detail = 1;
    711         if (soap_element_begin_in(soap, tag, 0))
    712                 return NULL;
    713         if (*soap->type && soap_match_tag(soap, soap->type, type))
    714         {       soap->error = SOAP_TYPE;
    715                 return NULL;
    716         }
     696        size_t soap_flag_faultcode = 1;
     697        size_t soap_flag_faultstring = 1;
     698        size_t soap_flag_faultactor = 1;
     699        size_t soap_flag_detail = 1;
     700        size_t soap_flag_SOAP_ENV__Code = 1;
     701        size_t soap_flag_SOAP_ENV__Reason = 1;
     702        size_t soap_flag_SOAP_ENV__Node = 1;
     703        size_t soap_flag_SOAP_ENV__Role = 1;
     704        size_t soap_flag_SOAP_ENV__Detail = 1;
     705        if (soap_element_begin_in(soap, tag, 0, type))
     706                return NULL;
    717707        a = (struct SOAP_ENV__Fault *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Fault, sizeof(struct SOAP_ENV__Fault), 0, NULL, NULL, NULL);
    718708        if (!a)
    719709                return NULL;
    720         if (soap->alloced)
    721                 soap_default_SOAP_ENV__Fault(soap, a);
     710        soap_default_SOAP_ENV__Fault(soap, a);
    722711        if (soap->body && !*soap->href)
    723         {       for (;;)
     712        {
     713                for (;;)
    724714                {       soap->error = SOAP_TAG_MISMATCH;
    725715                        if (soap_flag_faultcode && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    726716                                if (soap_in__QName(soap, "faultcode", &a->faultcode, ""))
    727                                 {       soap_flag_faultcode = 0;
     717                                {       soap_flag_faultcode--;
    728718                                        continue;
    729719                                }
    730720                        if (soap_flag_faultstring && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    731                                 if (soap_in_string(soap, "faultstring", &a->faultstring, ""))
    732                                 {       soap_flag_faultstring = 0;
     721                                if (soap_in_string(soap, "faultstring", &a->faultstring, "xsd:string"))
     722                                {       soap_flag_faultstring--;
    733723                                        continue;
    734724                                }
    735725                        if (soap_flag_faultactor && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    736                                 if (soap_in_string(soap, "faultactor", &a->faultactor, ""))
    737                                 {       soap_flag_faultactor = 0;
     726                                if (soap_in_string(soap, "faultactor", &a->faultactor, "xsd:string"))
     727                                {       soap_flag_faultactor--;
    738728                                        continue;
    739729                                }
    740730                        if (soap_flag_detail && soap->error == SOAP_TAG_MISMATCH)
    741731                                if (soap_in_PointerToSOAP_ENV__Detail(soap, "detail", &a->detail, ""))
    742                                 {       soap_flag_detail = 0;
     732                                {       soap_flag_detail--;
    743733                                        continue;
    744734                                }
    745735                        if (soap_flag_SOAP_ENV__Code && soap->error == SOAP_TAG_MISMATCH)
    746736                                if (soap_in_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Code", &a->SOAP_ENV__Code, ""))
    747                                 {       soap_flag_SOAP_ENV__Code = 0;
    748                                         continue;
    749                                 }
    750                         if (soap_flag_SOAP_ENV__Reason && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    751                                 if (soap_in_string(soap, "SOAP-ENV:Reason", &a->SOAP_ENV__Reason, ""))
    752                                 {       soap_flag_SOAP_ENV__Reason = 0;
     737                                {       soap_flag_SOAP_ENV__Code--;
     738                                        continue;
     739                                }
     740                        if (soap_flag_SOAP_ENV__Reason && soap->error == SOAP_TAG_MISMATCH)
     741                                if (soap_in_PointerToSOAP_ENV__Reason(soap, "SOAP-ENV:Reason", &a->SOAP_ENV__Reason, ""))
     742                                {       soap_flag_SOAP_ENV__Reason--;
    753743                                        continue;
    754744                                }
    755745                        if (soap_flag_SOAP_ENV__Node && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    756                                 if (soap_in_string(soap, "SOAP-ENV:Node", &a->SOAP_ENV__Node, ""))
    757                                 {       soap_flag_SOAP_ENV__Node = 0;
     746                                if (soap_in_string(soap, "SOAP-ENV:Node", &a->SOAP_ENV__Node, "xsd:string"))
     747                                {       soap_flag_SOAP_ENV__Node--;
    758748                                        continue;
    759749                                }
    760750                        if (soap_flag_SOAP_ENV__Role && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    761                                 if (soap_in_string(soap, "SOAP-ENV:Role", &a->SOAP_ENV__Role, ""))
    762                                 {       soap_flag_SOAP_ENV__Role = 0;
     751                                if (soap_in_string(soap, "SOAP-ENV:Role", &a->SOAP_ENV__Role, "xsd:string"))
     752                                {       soap_flag_SOAP_ENV__Role--;
    763753                                        continue;
    764754                                }
    765755                        if (soap_flag_SOAP_ENV__Detail && soap->error == SOAP_TAG_MISMATCH)
    766756                                if (soap_in_PointerToSOAP_ENV__Detail(soap, "SOAP-ENV:Detail", &a->SOAP_ENV__Detail, ""))
    767                                 {       soap_flag_SOAP_ENV__Detail = 0;
     757                                {       soap_flag_SOAP_ENV__Detail--;
    768758                                        continue;
    769759                                }
     
    779769        }
    780770        else
    781         {       a = (struct SOAP_ENV__Fault *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Fault, 0, sizeof(struct SOAP_ENV__Fault), 0, NULL);
     771        {       a = (struct SOAP_ENV__Fault *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Fault, 0, sizeof(struct SOAP_ENV__Fault), 0, NULL);
    782772                if (soap->body && soap_element_end_in(soap, tag))
    783773                        return NULL;
     
    790780#ifndef WITH_NOGLOBAL
    791781
    792 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Detail(struct soap *soap, const struct SOAP_ENV__Detail *a)
    793 {
    794         (void)soap; (void)a; /* appease -Wall -Werror */
    795         soap_markelement(soap, a->fault, a->__type);
    796 }
    797 
    798 SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *a)
    799 {
    800         (void)soap; (void)a; /* appease -Wall -Werror */
    801         a->__type = 0;
    802         a->fault = NULL;
    803         a->__any = NULL;
    804 }
    805 
    806 SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Detail(struct soap *soap, const struct SOAP_ENV__Detail *a, const char *tag, const char *type)
    807 {
    808         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Detail);
    809         if (soap_out_SOAP_ENV__Detail(soap, tag, id, a, type))
    810                 return soap->error;
    811         return soap_putindependent(soap);
    812 }
    813 
    814 SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Detail(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Detail *a, const char *type)
    815 {
    816         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Detail), type);
    817         soap_putelement(soap, a->fault, "fault", -1, a->__type);
    818         soap_outliteral(soap, "-any", &a->__any);
    819         soap_element_end_out(soap, tag);
    820         return SOAP_OK;
    821 }
    822 
    823 SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_get_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *p, const char *tag, const char *type)
    824 {
    825         if ((p = soap_in_SOAP_ENV__Detail(soap, tag, p, type)))
    826                 soap_getindependent(soap);
    827         return p;
    828 }
    829 
    830 SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_in_SOAP_ENV__Detail(struct soap *soap, const char *tag, struct SOAP_ENV__Detail *a, const char *type)
    831 {
    832         short soap_flag_fault = 1, soap_flag___any = 1;
    833         if (soap_element_begin_in(soap, tag, 0))
    834                 return NULL;
    835         if (*soap->type && soap_match_tag(soap, soap->type, type))
    836         {       soap->error = SOAP_TYPE;
    837                 return NULL;
    838         }
    839         a = (struct SOAP_ENV__Detail *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Detail, sizeof(struct SOAP_ENV__Detail), 0, NULL, NULL, NULL);
    840         if (!a)
    841                 return NULL;
    842         if (soap->alloced)
    843                 soap_default_SOAP_ENV__Detail(soap, a);
     782SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *a)
     783{
     784        (void)soap; (void)a; /* appease -Wall -Werror */
     785        soap_default_string(soap, &a->SOAP_ENV__Text);
     786}
     787
     788SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Reason(struct soap *soap, const struct SOAP_ENV__Reason *a)
     789{
     790        (void)soap; (void)a; /* appease -Wall -Werror */
     791        soap_serialize_string(soap, &a->SOAP_ENV__Text);
     792}
     793
     794SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Reason(struct soap *soap, const struct SOAP_ENV__Reason *a, const char *tag, const char *type)
     795{
     796        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Reason);
     797        if (soap_out_SOAP_ENV__Reason(soap, tag, id, a, type))
     798                return soap->error;
     799        return soap_putindependent(soap);
     800}
     801
     802SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Reason(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Reason *a, const char *type)
     803{
     804        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Reason), type))
     805                return soap->error;
     806        if (soap->lang)
     807                soap_set_attr(soap, "xml:lang", soap->lang);
     808        if (soap_out_string(soap, "SOAP-ENV:Text", -1, &a->SOAP_ENV__Text, ""))
     809                return soap->error;
     810        return soap_element_end_out(soap, tag);
     811}
     812
     813SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_get_SOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *p, const char *tag, const char *type)
     814{
     815        if ((p = soap_in_SOAP_ENV__Reason(soap, tag, p, type)))
     816                if (soap_getindependent(soap))
     817                        return NULL;
     818        return p;
     819}
     820
     821SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_in_SOAP_ENV__Reason(struct soap *soap, const char *tag, struct SOAP_ENV__Reason *a, const char *type)
     822{
     823        size_t soap_flag_SOAP_ENV__Text = 1;
     824        if (soap_element_begin_in(soap, tag, 0, type))
     825                return NULL;
     826        a = (struct SOAP_ENV__Reason *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Reason, sizeof(struct SOAP_ENV__Reason), 0, NULL, NULL, NULL);
     827        if (!a)
     828                return NULL;
     829        soap_default_SOAP_ENV__Reason(soap, a);
    844830        if (soap->body && !*soap->href)
    845         {       for (;;)
     831        {
     832                for (;;)
    846833                {       soap->error = SOAP_TAG_MISMATCH;
    847                         if (soap_flag_fault && soap->error == SOAP_TAG_MISMATCH)
    848                                 if ((a->fault = soap_getelement(soap, &a->__type)))
    849                                 {       soap_flag_fault = 0;
    850                                         continue;
    851                                 }
    852                         if (soap_flag___any && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    853                                 if (soap_inliteral(soap, "-any", &a->__any))
    854                                 {       soap_flag___any = 0;
     834                        if (soap_flag_SOAP_ENV__Text && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
     835                                if (soap_in_string(soap, "SOAP-ENV:Text", &a->SOAP_ENV__Text, "xsd:string"))
     836                                {       soap_flag_SOAP_ENV__Text--;
    855837                                        continue;
    856838                                }
     
    866848        }
    867849        else
    868         {       a = (struct SOAP_ENV__Detail *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Detail, 0, sizeof(struct SOAP_ENV__Detail), 0, NULL);
     850        {       a = (struct SOAP_ENV__Reason *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Reason, 0, sizeof(struct SOAP_ENV__Reason), 0, NULL);
    869851                if (soap->body && soap_element_end_in(soap, tag))
    870852                        return NULL;
     
    877859#ifndef WITH_NOGLOBAL
    878860
    879 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Code(struct soap *soap, const struct SOAP_ENV__Code *a)
    880 {
    881         (void)soap; (void)a; /* appease -Wall -Werror */
    882         soap_embedded(soap, &a->SOAP_ENV__Value, SOAP_TYPE__QName);
    883         soap_serialize__QName(soap, &a->SOAP_ENV__Value);
    884         soap_embedded(soap, &a->SOAP_ENV__Subcode, SOAP_TYPE_PointerToSOAP_ENV__Code);
    885         soap_serialize_PointerToSOAP_ENV__Code(soap, &a->SOAP_ENV__Subcode);
    886 }
    887 
    888 SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *a)
    889 {
    890         (void)soap; (void)a; /* appease -Wall -Werror */
    891         soap_default__QName(soap, &a->SOAP_ENV__Value);
    892         a->SOAP_ENV__Subcode = NULL;
    893 }
    894 
    895 SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Code(struct soap *soap, const struct SOAP_ENV__Code *a, const char *tag, const char *type)
    896 {
    897         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Code);
    898         if (soap_out_SOAP_ENV__Code(soap, tag, id, a, type))
    899                 return soap->error;
    900         return soap_putindependent(soap);
    901 }
    902 
    903 SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Code(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Code *a, const char *type)
    904 {
    905         const char *soap_tmp_SOAP_ENV__Value = soap_QName2s(soap, a->SOAP_ENV__Value);
    906         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Code), type);
    907         soap_out__QName(soap, "SOAP-ENV:Value", -1, (char*const*)&soap_tmp_SOAP_ENV__Value, "");
    908         soap_out_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Subcode", -1, &a->SOAP_ENV__Subcode, "");
    909         soap_element_end_out(soap, tag);
    910         return SOAP_OK;
    911 }
    912 
    913 SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_get_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *p, const char *tag, const char *type)
    914 {
    915         if ((p = soap_in_SOAP_ENV__Code(soap, tag, p, type)))
    916                 soap_getindependent(soap);
    917         return p;
    918 }
    919 
    920 SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_in_SOAP_ENV__Code(struct soap *soap, const char *tag, struct SOAP_ENV__Code *a, const char *type)
    921 {
    922         short soap_flag_SOAP_ENV__Value = 1, soap_flag_SOAP_ENV__Subcode = 1;
    923         if (soap_element_begin_in(soap, tag, 0))
    924                 return NULL;
    925         if (*soap->type && soap_match_tag(soap, soap->type, type))
    926         {       soap->error = SOAP_TYPE;
    927                 return NULL;
    928         }
    929         a = (struct SOAP_ENV__Code *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Code, sizeof(struct SOAP_ENV__Code), 0, NULL, NULL, NULL);
    930         if (!a)
    931                 return NULL;
    932         if (soap->alloced)
    933                 soap_default_SOAP_ENV__Code(soap, a);
     861SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *a)
     862{
     863        (void)soap; (void)a; /* appease -Wall -Werror */
     864        a->__type = 0;
     865        a->fault = NULL;
     866        a->__any = NULL;
     867}
     868
     869SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Detail(struct soap *soap, const struct SOAP_ENV__Detail *a)
     870{
     871        (void)soap; (void)a; /* appease -Wall -Werror */
     872        soap_markelement(soap, a->fault, a->__type);
     873}
     874
     875SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Detail(struct soap *soap, const struct SOAP_ENV__Detail *a, const char *tag, const char *type)
     876{
     877        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Detail);
     878        if (soap_out_SOAP_ENV__Detail(soap, tag, id, a, type))
     879                return soap->error;
     880        return soap_putindependent(soap);
     881}
     882
     883SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Detail(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Detail *a, const char *type)
     884{
     885        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Detail), type))
     886                return soap->error;
     887        if (soap_putelement(soap, a->fault, "fault", -1, a->__type))
     888                return soap->error;
     889        soap_outliteral(soap, "-any", &a->__any, NULL);
     890        return soap_element_end_out(soap, tag);
     891}
     892
     893SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_get_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *p, const char *tag, const char *type)
     894{
     895        if ((p = soap_in_SOAP_ENV__Detail(soap, tag, p, type)))
     896                if (soap_getindependent(soap))
     897                        return NULL;
     898        return p;
     899}
     900
     901SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_in_SOAP_ENV__Detail(struct soap *soap, const char *tag, struct SOAP_ENV__Detail *a, const char *type)
     902{
     903        size_t soap_flag_fault = 1;
     904        size_t soap_flag___any = 1;
     905        if (soap_element_begin_in(soap, tag, 0, type))
     906                return NULL;
     907        a = (struct SOAP_ENV__Detail *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Detail, sizeof(struct SOAP_ENV__Detail), 0, NULL, NULL, NULL);
     908        if (!a)
     909                return NULL;
     910        soap_default_SOAP_ENV__Detail(soap, a);
    934911        if (soap->body && !*soap->href)
    935         {       for (;;)
     912        {
     913                for (;;)
    936914                {       soap->error = SOAP_TAG_MISMATCH;
    937                         if (soap_flag_SOAP_ENV__Value && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    938                                 if (soap_in__QName(soap, "SOAP-ENV:Value", &a->SOAP_ENV__Value, ""))
    939                                 {       soap_flag_SOAP_ENV__Value = 0;
    940                                         continue;
    941                                 }
    942                         if (soap_flag_SOAP_ENV__Subcode && soap->error == SOAP_TAG_MISMATCH)
    943                                 if (soap_in_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Subcode", &a->SOAP_ENV__Subcode, ""))
    944                                 {       soap_flag_SOAP_ENV__Subcode = 0;
     915                        if (soap_flag_fault && soap->error == SOAP_TAG_MISMATCH)
     916                                if ((a->fault = soap_getelement(soap, &a->__type)))
     917                                {       soap_flag_fault = 0;
     918                                        continue;
     919                                }
     920                        if (soap_flag___any && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
     921                                if (soap_inliteral(soap, "-any", &a->__any))
     922                                {       soap_flag___any--;
    945923                                        continue;
    946924                                }
     
    956934        }
    957935        else
    958         {       a = (struct SOAP_ENV__Code *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Code, 0, sizeof(struct SOAP_ENV__Code), 0, NULL);
     936        {       a = (struct SOAP_ENV__Detail *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Detail, 0, sizeof(struct SOAP_ENV__Detail), 0, NULL);
    959937                if (soap->body && soap_element_end_in(soap, tag))
    960938                        return NULL;
     
    967945#ifndef WITH_NOGLOBAL
    968946
    969 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Header(struct soap *soap, const struct SOAP_ENV__Header *a)
    970 {
    971         (void)soap; (void)a; /* appease -Wall -Werror */
    972         /* transient dummy skipped */
    973 }
    974 
    975 SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header *a)
    976 {
    977         (void)soap; (void)a; /* appease -Wall -Werror */
    978         /* transient dummy skipped */
    979 }
    980 
    981 SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Header(struct soap *soap, const struct SOAP_ENV__Header *a, const char *tag, const char *type)
    982 {
    983         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Header);
    984         if (soap_out_SOAP_ENV__Header(soap, tag, id, a, type))
    985                 return soap->error;
    986         return soap_putindependent(soap);
    987 }
    988 
    989 SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Header(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Header *a, const char *type)
    990 {
    991         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Header), type);
    992         /* transient dummy skipped */
    993         soap_element_end_out(soap, tag);
    994         return SOAP_OK;
    995 }
    996 
    997 SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_get_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header *p, const char *tag, const char *type)
    998 {
    999         if ((p = soap_in_SOAP_ENV__Header(soap, tag, p, type)))
    1000                 soap_getindependent(soap);
    1001         return p;
    1002 }
    1003 
    1004 SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_in_SOAP_ENV__Header(struct soap *soap, const char *tag, struct SOAP_ENV__Header *a, const char *type)
    1005 {;
    1006         if (soap_element_begin_in(soap, tag, 0))
    1007                 return NULL;
    1008         if (*soap->type && soap_match_tag(soap, soap->type, type))
    1009         {       soap->error = SOAP_TYPE;
    1010                 return NULL;
    1011         }
    1012         a = (struct SOAP_ENV__Header *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Header, sizeof(struct SOAP_ENV__Header), 0, NULL, NULL, NULL);
    1013         if (!a)
    1014                 return NULL;
    1015         if (soap->alloced)
    1016                 soap_default_SOAP_ENV__Header(soap, a);
     947SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *a)
     948{
     949        (void)soap; (void)a; /* appease -Wall -Werror */
     950        soap_default__QName(soap, &a->SOAP_ENV__Value);
     951        a->SOAP_ENV__Subcode = NULL;
     952}
     953
     954SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Code(struct soap *soap, const struct SOAP_ENV__Code *a)
     955{
     956        (void)soap; (void)a; /* appease -Wall -Werror */
     957        soap_serialize__QName(soap, &a->SOAP_ENV__Value);
     958        soap_serialize_PointerToSOAP_ENV__Code(soap, &a->SOAP_ENV__Subcode);
     959}
     960
     961SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Code(struct soap *soap, const struct SOAP_ENV__Code *a, const char *tag, const char *type)
     962{
     963        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Code);
     964        if (soap_out_SOAP_ENV__Code(soap, tag, id, a, type))
     965                return soap->error;
     966        return soap_putindependent(soap);
     967}
     968
     969SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Code(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Code *a, const char *type)
     970{
     971        const char *soap_tmp_SOAP_ENV__Value = soap_QName2s(soap, a->SOAP_ENV__Value);
     972        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Code), type))
     973                return soap->error;
     974        if (soap_out__QName(soap, "SOAP-ENV:Value", -1, (char*const*)&soap_tmp_SOAP_ENV__Value, ""))
     975                return soap->error;
     976        if (soap_out_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Subcode", -1, &a->SOAP_ENV__Subcode, ""))
     977                return soap->error;
     978        return soap_element_end_out(soap, tag);
     979}
     980
     981SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_get_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *p, const char *tag, const char *type)
     982{
     983        if ((p = soap_in_SOAP_ENV__Code(soap, tag, p, type)))
     984                if (soap_getindependent(soap))
     985                        return NULL;
     986        return p;
     987}
     988
     989SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_in_SOAP_ENV__Code(struct soap *soap, const char *tag, struct SOAP_ENV__Code *a, const char *type)
     990{
     991        size_t soap_flag_SOAP_ENV__Value = 1;
     992        size_t soap_flag_SOAP_ENV__Subcode = 1;
     993        if (soap_element_begin_in(soap, tag, 0, type))
     994                return NULL;
     995        a = (struct SOAP_ENV__Code *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Code, sizeof(struct SOAP_ENV__Code), 0, NULL, NULL, NULL);
     996        if (!a)
     997                return NULL;
     998        soap_default_SOAP_ENV__Code(soap, a);
    1017999        if (soap->body && !*soap->href)
    1018         {       for (;;)
     1000        {
     1001                for (;;)
    10191002                {       soap->error = SOAP_TAG_MISMATCH;
    1020                 /* transient dummy skipped */
     1003                        if (soap_flag_SOAP_ENV__Value && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
     1004                                if (soap_in__QName(soap, "SOAP-ENV:Value", &a->SOAP_ENV__Value, ""))
     1005                                {       soap_flag_SOAP_ENV__Value--;
     1006                                        continue;
     1007                                }
     1008                        if (soap_flag_SOAP_ENV__Subcode && soap->error == SOAP_TAG_MISMATCH)
     1009                                if (soap_in_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Subcode", &a->SOAP_ENV__Subcode, ""))
     1010                                {       soap_flag_SOAP_ENV__Subcode--;
     1011                                        continue;
     1012                                }
    10211013                        if (soap->error == SOAP_TAG_MISMATCH)
    10221014                                soap->error = soap_ignore_element(soap);
     
    10301022        }
    10311023        else
    1032         {       a = (struct SOAP_ENV__Header *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Header, 0, sizeof(struct SOAP_ENV__Header), 0, NULL);
     1024        {       a = (struct SOAP_ENV__Code *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Code, 0, sizeof(struct SOAP_ENV__Code), 0, NULL);
    10331025                if (soap->body && soap_element_end_in(soap, tag))
    10341026                        return NULL;
     
    10391031#endif
    10401032
    1041 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__stat_USCOREobject(struct soap *soap, const struct ns1__stat_USCOREobject *a)
    1042 {
    1043         (void)soap; (void)a; /* appease -Wall -Werror */
    1044         soap_embedded(soap, &a->key, SOAP_TYPE_string);
    1045         soap_serialize_string(soap, &a->key);
    1046 }
    1047 
    1048 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__stat_USCOREobject(struct soap *soap, struct ns1__stat_USCOREobject *a)
    1049 {
    1050         (void)soap; (void)a; /* appease -Wall -Werror */
    1051         soap_default_string(soap, &a->key);
    1052 }
    1053 
    1054 SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__stat_USCOREobject(struct soap *soap, const struct ns1__stat_USCOREobject *a, const char *tag, const char *type)
    1055 {
    1056         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__stat_USCOREobject);
    1057         if (soap_out_ns1__stat_USCOREobject(soap, tag, id, a, type))
    1058                 return soap->error;
    1059         return soap_putindependent(soap);
    1060 }
    1061 
    1062 SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__stat_USCOREobject(struct soap *soap, const char *tag, int id, const struct ns1__stat_USCOREobject *a, const char *type)
    1063 {
    1064         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__stat_USCOREobject), type);
    1065         soap_out_string(soap, "key", -1, &a->key, "");
    1066         soap_element_end_out(soap, tag);
    1067         return SOAP_OK;
    1068 }
    1069 
    1070 SOAP_FMAC3 struct ns1__stat_USCOREobject * SOAP_FMAC4 soap_get_ns1__stat_USCOREobject(struct soap *soap, struct ns1__stat_USCOREobject *p, const char *tag, const char *type)
    1071 {
    1072         if ((p = soap_in_ns1__stat_USCOREobject(soap, tag, p, type)))
    1073                 soap_getindependent(soap);
    1074         return p;
    1075 }
    1076 
    1077 SOAP_FMAC3 struct ns1__stat_USCOREobject * SOAP_FMAC4 soap_in_ns1__stat_USCOREobject(struct soap *soap, const char *tag, struct ns1__stat_USCOREobject *a, const char *type)
    1078 {
    1079         short soap_flag_key = 1;
    1080         if (soap_element_begin_in(soap, tag, 0))
    1081                 return NULL;
    1082         if (*soap->type && soap_match_tag(soap, soap->type, type))
    1083         {       soap->error = SOAP_TYPE;
    1084                 return NULL;
    1085         }
    1086         a = (struct ns1__stat_USCOREobject *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__stat_USCOREobject, sizeof(struct ns1__stat_USCOREobject), 0, NULL, NULL, NULL);
    1087         if (!a)
    1088                 return NULL;
    1089         if (soap->alloced)
    1090                 soap_default_ns1__stat_USCOREobject(soap, a);
     1033#ifndef WITH_NOGLOBAL
     1034
     1035SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header *a)
     1036{
     1037        (void)soap; (void)a; /* appease -Wall -Werror */
     1038}
     1039
     1040SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Header(struct soap *soap, const struct SOAP_ENV__Header *a)
     1041{
     1042        (void)soap; (void)a; /* appease -Wall -Werror */
     1043}
     1044
     1045SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Header(struct soap *soap, const struct SOAP_ENV__Header *a, const char *tag, const char *type)
     1046{
     1047        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Header);
     1048        if (soap_out_SOAP_ENV__Header(soap, tag, id, a, type))
     1049                return soap->error;
     1050        return soap_putindependent(soap);
     1051}
     1052
     1053SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Header(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Header *a, const char *type)
     1054{
     1055        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Header), type))
     1056                return soap->error;
     1057        return soap_element_end_out(soap, tag);
     1058}
     1059
     1060SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_get_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header *p, const char *tag, const char *type)
     1061{
     1062        if ((p = soap_in_SOAP_ENV__Header(soap, tag, p, type)))
     1063                if (soap_getindependent(soap))
     1064                        return NULL;
     1065        return p;
     1066}
     1067
     1068SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_in_SOAP_ENV__Header(struct soap *soap, const char *tag, struct SOAP_ENV__Header *a, const char *type)
     1069{
     1070        if (soap_element_begin_in(soap, tag, 0, type))
     1071                return NULL;
     1072        a = (struct SOAP_ENV__Header *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Header, sizeof(struct SOAP_ENV__Header), 0, NULL, NULL, NULL);
     1073        if (!a)
     1074                return NULL;
     1075        soap_default_SOAP_ENV__Header(soap, a);
    10911076        if (soap->body && !*soap->href)
    1092         {       for (;;)
     1077        {
     1078                for (;;)
    10931079                {       soap->error = SOAP_TAG_MISMATCH;
    1094                         if (soap_flag_key && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    1095                                 if (soap_in_string(soap, "key", &a->key, ""))
    1096                                 {       soap_flag_key = 0;
    1097                                         continue;
    1098                                 }
    10991080                        if (soap->error == SOAP_TAG_MISMATCH)
    11001081                                soap->error = soap_ignore_element(soap);
     
    11081089        }
    11091090        else
    1110         {       a = (struct ns1__stat_USCOREobject *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_ns1__stat_USCOREobject, 0, sizeof(struct ns1__stat_USCOREobject), 0, NULL);
    1111                 if (soap->body && soap_element_end_in(soap, tag))
    1112                         return NULL;
    1113         }
    1114         return a;
    1115 }
    1116 
    1117 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__stat_USCOREobjectResponse(struct soap *soap, const struct ns1__stat_USCOREobjectResponse *a)
    1118 {
    1119         (void)soap; (void)a; /* appease -Wall -Werror */
    1120         soap_embedded(soap, &a->result, SOAP_TYPE_PointerToArrayOfString);
    1121         soap_serialize_PointerToArrayOfString(soap, &a->result);
    1122 }
    1123 
    1124 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__stat_USCOREobjectResponse(struct soap *soap, struct ns1__stat_USCOREobjectResponse *a)
    1125 {
    1126         (void)soap; (void)a; /* appease -Wall -Werror */
    1127         a->result = NULL;
    1128 }
    1129 
    1130 SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__stat_USCOREobjectResponse(struct soap *soap, const struct ns1__stat_USCOREobjectResponse *a, const char *tag, const char *type)
    1131 {
    1132         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__stat_USCOREobjectResponse);
    1133         if (soap_out_ns1__stat_USCOREobjectResponse(soap, tag, id, a, type))
    1134                 return soap->error;
    1135         return soap_putindependent(soap);
    1136 }
    1137 
    1138 SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__stat_USCOREobjectResponse(struct soap *soap, const char *tag, int id, const struct ns1__stat_USCOREobjectResponse *a, const char *type)
    1139 {
    1140         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__stat_USCOREobjectResponse), type);
    1141         if (a->result)
    1142                 soap_element_result(soap, "result");
    1143         soap_out_PointerToArrayOfString(soap, "result", -1, &a->result, "");
    1144         soap_element_end_out(soap, tag);
    1145         return SOAP_OK;
    1146 }
    1147 
    1148 SOAP_FMAC3 struct ns1__stat_USCOREobjectResponse * SOAP_FMAC4 soap_get_ns1__stat_USCOREobjectResponse(struct soap *soap, struct ns1__stat_USCOREobjectResponse *p, const char *tag, const char *type)
    1149 {
    1150         if ((p = soap_in_ns1__stat_USCOREobjectResponse(soap, tag, p, type)))
    1151                 soap_getindependent(soap);
    1152         return p;
    1153 }
    1154 
    1155 SOAP_FMAC3 struct ns1__stat_USCOREobjectResponse * SOAP_FMAC4 soap_in_ns1__stat_USCOREobjectResponse(struct soap *soap, const char *tag, struct ns1__stat_USCOREobjectResponse *a, const char *type)
    1156 {
    1157         short soap_flag_result = 1;
    1158         if (soap_element_begin_in(soap, tag, 0))
    1159                 return NULL;
    1160         if (*soap->type && soap_match_tag(soap, soap->type, type))
    1161         {       soap->error = SOAP_TYPE;
    1162                 return NULL;
    1163         }
    1164         a = (struct ns1__stat_USCOREobjectResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__stat_USCOREobjectResponse, sizeof(struct ns1__stat_USCOREobjectResponse), 0, NULL, NULL, NULL);
    1165         if (!a)
    1166                 return NULL;
    1167         if (soap->alloced)
    1168                 soap_default_ns1__stat_USCOREobjectResponse(soap, a);
     1091        {       a = (struct SOAP_ENV__Header *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Header, 0, sizeof(struct SOAP_ENV__Header), 0, NULL);
     1092                if (soap->body && soap_element_end_in(soap, tag))
     1093                        return NULL;
     1094        }
     1095        return a;
     1096}
     1097
     1098#endif
     1099
     1100SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__stat_USCOREobject(struct soap *soap, struct ns1__stat_USCOREobject *a)
     1101{
     1102        (void)soap; (void)a; /* appease -Wall -Werror */
     1103        soap_default_string(soap, &a->key);
     1104}
     1105
     1106SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__stat_USCOREobject(struct soap *soap, const struct ns1__stat_USCOREobject *a)
     1107{
     1108        (void)soap; (void)a; /* appease -Wall -Werror */
     1109        soap_serialize_string(soap, &a->key);
     1110}
     1111
     1112SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__stat_USCOREobject(struct soap *soap, const struct ns1__stat_USCOREobject *a, const char *tag, const char *type)
     1113{
     1114        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__stat_USCOREobject);
     1115        if (soap_out_ns1__stat_USCOREobject(soap, tag, id, a, type))
     1116                return soap->error;
     1117        return soap_putindependent(soap);
     1118}
     1119
     1120SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__stat_USCOREobject(struct soap *soap, const char *tag, int id, const struct ns1__stat_USCOREobject *a, const char *type)
     1121{
     1122        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__stat_USCOREobject), type))
     1123                return soap->error;
     1124        if (soap_out_string(soap, "key", -1, &a->key, ""))
     1125                return soap->error;
     1126        return soap_element_end_out(soap, tag);
     1127}
     1128
     1129SOAP_FMAC3 struct ns1__stat_USCOREobject * SOAP_FMAC4 soap_get_ns1__stat_USCOREobject(struct soap *soap, struct ns1__stat_USCOREobject *p, const char *tag, const char *type)
     1130{
     1131        if ((p = soap_in_ns1__stat_USCOREobject(soap, tag, p, type)))
     1132                if (soap_getindependent(soap))
     1133                        return NULL;
     1134        return p;
     1135}
     1136
     1137SOAP_FMAC3 struct ns1__stat_USCOREobject * SOAP_FMAC4 soap_in_ns1__stat_USCOREobject(struct soap *soap, const char *tag, struct ns1__stat_USCOREobject *a, const char *type)
     1138{
     1139        size_t soap_flag_key = 1;
     1140        if (soap_element_begin_in(soap, tag, 0, type))
     1141                return NULL;
     1142        a = (struct ns1__stat_USCOREobject *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__stat_USCOREobject, sizeof(struct ns1__stat_USCOREobject), 0, NULL, NULL, NULL);
     1143        if (!a)
     1144                return NULL;
     1145        soap_default_ns1__stat_USCOREobject(soap, a);
    11691146        if (soap->body && !*soap->href)
    1170         {       for (;;)
     1147        {
     1148                for (;;)
    11711149                {       soap->error = SOAP_TAG_MISMATCH;
    1172                         if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH)
    1173                                 if (soap_in_PointerToArrayOfString(soap, "result", &a->result, "xsd:string"))
    1174                                 {       soap_flag_result = 0;
     1150                        if (soap_flag_key && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
     1151                                if (soap_in_string(soap, "key", &a->key, "xsd:string"))
     1152                                {       soap_flag_key--;
    11751153                                        continue;
    11761154                                }
     
    11861164        }
    11871165        else
    1188         {       a = (struct ns1__stat_USCOREobjectResponse *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_ns1__stat_USCOREobjectResponse, 0, sizeof(struct ns1__stat_USCOREobjectResponse), 0, NULL);
    1189                 if (soap->body && soap_element_end_in(soap, tag))
    1190                         return NULL;
    1191         }
    1192         return a;
    1193 }
    1194 
    1195 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__delete_USCOREinstance(struct soap *soap, const struct ns1__delete_USCOREinstance *a)
    1196 {
    1197         (void)soap; (void)a; /* appease -Wall -Werror */
    1198         soap_embedded(soap, &a->uri, SOAP_TYPE_string);
    1199         soap_serialize_string(soap, &a->uri);
    1200 }
    1201 
    1202 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__delete_USCOREinstance(struct soap *soap, struct ns1__delete_USCOREinstance *a)
    1203 {
    1204         (void)soap; (void)a; /* appease -Wall -Werror */
    1205         soap_default_string(soap, &a->uri);
    1206 }
    1207 
    1208 SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__delete_USCOREinstance(struct soap *soap, const struct ns1__delete_USCOREinstance *a, const char *tag, const char *type)
    1209 {
    1210         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__delete_USCOREinstance);
    1211         if (soap_out_ns1__delete_USCOREinstance(soap, tag, id, a, type))
    1212                 return soap->error;
    1213         return soap_putindependent(soap);
    1214 }
    1215 
    1216 SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__delete_USCOREinstance(struct soap *soap, const char *tag, int id, const struct ns1__delete_USCOREinstance *a, const char *type)
    1217 {
    1218         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__delete_USCOREinstance), type);
    1219         soap_out_string(soap, "uri", -1, &a->uri, "");
    1220         soap_element_end_out(soap, tag);
    1221         return SOAP_OK;
    1222 }
    1223 
    1224 SOAP_FMAC3 struct ns1__delete_USCOREinstance * SOAP_FMAC4 soap_get_ns1__delete_USCOREinstance(struct soap *soap, struct ns1__delete_USCOREinstance *p, const char *tag, const char *type)
    1225 {
    1226         if ((p = soap_in_ns1__delete_USCOREinstance(soap, tag, p, type)))
    1227                 soap_getindependent(soap);
    1228         return p;
    1229 }
    1230 
    1231 SOAP_FMAC3 struct ns1__delete_USCOREinstance * SOAP_FMAC4 soap_in_ns1__delete_USCOREinstance(struct soap *soap, const char *tag, struct ns1__delete_USCOREinstance *a, const char *type)
    1232 {
    1233         short soap_flag_uri = 1;
    1234         if (soap_element_begin_in(soap, tag, 0))
    1235                 return NULL;
    1236         if (*soap->type && soap_match_tag(soap, soap->type, type))
    1237         {       soap->error = SOAP_TYPE;
    1238                 return NULL;
    1239         }
    1240         a = (struct ns1__delete_USCOREinstance *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__delete_USCOREinstance, sizeof(struct ns1__delete_USCOREinstance), 0, NULL, NULL, NULL);
    1241         if (!a)
    1242                 return NULL;
    1243         if (soap->alloced)
    1244                 soap_default_ns1__delete_USCOREinstance(soap, a);
     1166        {       a = (struct ns1__stat_USCOREobject *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns1__stat_USCOREobject, 0, sizeof(struct ns1__stat_USCOREobject), 0, NULL);
     1167                if (soap->body && soap_element_end_in(soap, tag))
     1168                        return NULL;
     1169        }
     1170        return a;
     1171}
     1172
     1173SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__stat_USCOREobjectResponse(struct soap *soap, struct ns1__stat_USCOREobjectResponse *a)
     1174{
     1175        (void)soap; (void)a; /* appease -Wall -Werror */
     1176        a->result = NULL;
     1177}
     1178
     1179SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__stat_USCOREobjectResponse(struct soap *soap, const struct ns1__stat_USCOREobjectResponse *a)
     1180{
     1181        (void)soap; (void)a; /* appease -Wall -Werror */
     1182        soap_serialize_PointerToArrayOfString(soap, &a->result);
     1183}
     1184
     1185SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__stat_USCOREobjectResponse(struct soap *soap, const struct ns1__stat_USCOREobjectResponse *a, const char *tag, const char *type)
     1186{
     1187        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__stat_USCOREobjectResponse);
     1188        if (soap_out_ns1__stat_USCOREobjectResponse(soap, tag, id, a, type))
     1189                return soap->error;
     1190        return soap_putindependent(soap);
     1191}
     1192
     1193SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__stat_USCOREobjectResponse(struct soap *soap, const char *tag, int id, const struct ns1__stat_USCOREobjectResponse *a, const char *type)
     1194{
     1195        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__stat_USCOREobjectResponse), type))
     1196                return soap->error;
     1197        if (soap_out_PointerToArrayOfString(soap, "result", -1, &a->result, ""))
     1198                return soap->error;
     1199        return soap_element_end_out(soap, tag);
     1200}
     1201
     1202SOAP_FMAC3 struct ns1__stat_USCOREobjectResponse * SOAP_FMAC4 soap_get_ns1__stat_USCOREobjectResponse(struct soap *soap, struct ns1__stat_USCOREobjectResponse *p, const char *tag, const char *type)
     1203{
     1204        if ((p = soap_in_ns1__stat_USCOREobjectResponse(soap, tag, p, type)))
     1205                if (soap_getindependent(soap))
     1206                        return NULL;
     1207        return p;
     1208}
     1209
     1210SOAP_FMAC3 struct ns1__stat_USCOREobjectResponse * SOAP_FMAC4 soap_in_ns1__stat_USCOREobjectResponse(struct soap *soap, const char *tag, struct ns1__stat_USCOREobjectResponse *a, const char *type)
     1211{
     1212        size_t soap_flag_result = 1;
     1213        if (soap_element_begin_in(soap, tag, 0, type))
     1214                return NULL;
     1215        a = (struct ns1__stat_USCOREobjectResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__stat_USCOREobjectResponse, sizeof(struct ns1__stat_USCOREobjectResponse), 0, NULL, NULL, NULL);
     1216        if (!a)
     1217                return NULL;
     1218        soap_default_ns1__stat_USCOREobjectResponse(soap, a);
    12451219        if (soap->body && !*soap->href)
    1246         {       for (;;)
     1220        {
     1221                for (;;)
    12471222                {       soap->error = SOAP_TAG_MISMATCH;
    1248                         if (soap_flag_uri && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    1249                                 if (soap_in_string(soap, "uri", &a->uri, ""))
    1250                                 {       soap_flag_uri = 0;
     1223                        if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH)
     1224                                if (soap_in_PointerToArrayOfString(soap, "result", &a->result, "xsd:string"))
     1225                                {       soap_flag_result--;
    12511226                                        continue;
    12521227                                }
     
    12621237        }
    12631238        else
    1264         {       a = (struct ns1__delete_USCOREinstance *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_ns1__delete_USCOREinstance, 0, sizeof(struct ns1__delete_USCOREinstance), 0, NULL);
    1265                 if (soap->body && soap_element_end_in(soap, tag))
    1266                         return NULL;
    1267         }
    1268         return a;
    1269 }
    1270 
    1271 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__delete_USCOREinstanceResponse(struct soap *soap, const struct ns1__delete_USCOREinstanceResponse *a)
    1272 {
    1273         (void)soap; (void)a; /* appease -Wall -Werror */
    1274         soap_embedded(soap, &a->result, SOAP_TYPE_PointerToint);
    1275         soap_serialize_PointerToint(soap, &a->result);
    1276 }
    1277 
    1278 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__delete_USCOREinstanceResponse(struct soap *soap, struct ns1__delete_USCOREinstanceResponse *a)
    1279 {
    1280         (void)soap; (void)a; /* appease -Wall -Werror */
    1281         a->result = NULL;
    1282 }
    1283 
    1284 SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__delete_USCOREinstanceResponse(struct soap *soap, const struct ns1__delete_USCOREinstanceResponse *a, const char *tag, const char *type)
    1285 {
    1286         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__delete_USCOREinstanceResponse);
    1287         if (soap_out_ns1__delete_USCOREinstanceResponse(soap, tag, id, a, type))
    1288                 return soap->error;
    1289         return soap_putindependent(soap);
    1290 }
    1291 
    1292 SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__delete_USCOREinstanceResponse(struct soap *soap, const char *tag, int id, const struct ns1__delete_USCOREinstanceResponse *a, const char *type)
    1293 {
    1294         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__delete_USCOREinstanceResponse), type);
    1295         if (a->result)
    1296                 soap_element_result(soap, "result");
    1297         soap_out_PointerToint(soap, "result", -1, &a->result, "");
    1298         soap_element_end_out(soap, tag);
    1299         return SOAP_OK;
    1300 }
    1301 
    1302 SOAP_FMAC3 struct ns1__delete_USCOREinstanceResponse * SOAP_FMAC4 soap_get_ns1__delete_USCOREinstanceResponse(struct soap *soap, struct ns1__delete_USCOREinstanceResponse *p, const char *tag, const char *type)
    1303 {
    1304         if ((p = soap_in_ns1__delete_USCOREinstanceResponse(soap, tag, p, type)))
    1305                 soap_getindependent(soap);
    1306         return p;
    1307 }
    1308 
    1309 SOAP_FMAC3 struct ns1__delete_USCOREinstanceResponse * SOAP_FMAC4 soap_in_ns1__delete_USCOREinstanceResponse(struct soap *soap, const char *tag, struct ns1__delete_USCOREinstanceResponse *a, const char *type)
    1310 {
    1311         short soap_flag_result = 1;
    1312         if (soap_element_begin_in(soap, tag, 0))
    1313                 return NULL;
    1314         if (*soap->type && soap_match_tag(soap, soap->type, type))
    1315         {       soap->error = SOAP_TYPE;
    1316                 return NULL;
    1317         }
    1318         a = (struct ns1__delete_USCOREinstanceResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__delete_USCOREinstanceResponse, sizeof(struct ns1__delete_USCOREinstanceResponse), 0, NULL, NULL, NULL);
    1319         if (!a)
    1320                 return NULL;
    1321         if (soap->alloced)
    1322                 soap_default_ns1__delete_USCOREinstanceResponse(soap, a);
     1239        {       a = (struct ns1__stat_USCOREobjectResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns1__stat_USCOREobjectResponse, 0, sizeof(struct ns1__stat_USCOREobjectResponse), 0, NULL);
     1240                if (soap->body && soap_element_end_in(soap, tag))
     1241                        return NULL;
     1242        }
     1243        return a;
     1244}
     1245
     1246SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__delete_USCOREinstance(struct soap *soap, struct ns1__delete_USCOREinstance *a)
     1247{
     1248        (void)soap; (void)a; /* appease -Wall -Werror */
     1249        soap_default_string(soap, &a->uri);
     1250}
     1251
     1252SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__delete_USCOREinstance(struct soap *soap, const struct ns1__delete_USCOREinstance *a)
     1253{
     1254        (void)soap; (void)a; /* appease -Wall -Werror */
     1255        soap_serialize_string(soap, &a->uri);
     1256}
     1257
     1258SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__delete_USCOREinstance(struct soap *soap, const struct ns1__delete_USCOREinstance *a, const char *tag, const char *type)
     1259{
     1260        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__delete_USCOREinstance);
     1261        if (soap_out_ns1__delete_USCOREinstance(soap, tag, id, a, type))
     1262                return soap->error;
     1263        return soap_putindependent(soap);
     1264}
     1265
     1266SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__delete_USCOREinstance(struct soap *soap, const char *tag, int id, const struct ns1__delete_USCOREinstance *a, const char *type)
     1267{
     1268        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__delete_USCOREinstance), type))
     1269                return soap->error;
     1270        if (soap_out_string(soap, "uri", -1, &a->uri, ""))
     1271                return soap->error;
     1272        return soap_element_end_out(soap, tag);
     1273}
     1274
     1275SOAP_FMAC3 struct ns1__delete_USCOREinstance * SOAP_FMAC4 soap_get_ns1__delete_USCOREinstance(struct soap *soap, struct ns1__delete_USCOREinstance *p, const char *tag, const char *type)
     1276{
     1277        if ((p = soap_in_ns1__delete_USCOREinstance(soap, tag, p, type)))
     1278                if (soap_getindependent(soap))
     1279                        return NULL;
     1280        return p;
     1281}
     1282
     1283SOAP_FMAC3 struct ns1__delete_USCOREinstance * SOAP_FMAC4 soap_in_ns1__delete_USCOREinstance(struct soap *soap, const char *tag, struct ns1__delete_USCOREinstance *a, const char *type)
     1284{
     1285        size_t soap_flag_uri = 1;
     1286        if (soap_element_begin_in(soap, tag, 0, type))
     1287                return NULL;
     1288        a = (struct ns1__delete_USCOREinstance *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__delete_USCOREinstance, sizeof(struct ns1__delete_USCOREinstance), 0, NULL, NULL, NULL);
     1289        if (!a)
     1290                return NULL;
     1291        soap_default_ns1__delete_USCOREinstance(soap, a);
    13231292        if (soap->body && !*soap->href)
    1324         {       for (;;)
     1293        {
     1294                for (;;)
    13251295                {       soap->error = SOAP_TAG_MISMATCH;
    1326                         if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH)
    1327                                 if (soap_in_PointerToint(soap, "result", &a->result, ""))
    1328                                 {       soap_flag_result = 0;
     1296                        if (soap_flag_uri && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
     1297                                if (soap_in_string(soap, "uri", &a->uri, "xsd:string"))
     1298                                {       soap_flag_uri--;
    13291299                                        continue;
    13301300                                }
     
    13401310        }
    13411311        else
    1342         {       a = (struct ns1__delete_USCOREinstanceResponse *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_ns1__delete_USCOREinstanceResponse, 0, sizeof(struct ns1__delete_USCOREinstanceResponse), 0, NULL);
    1343                 if (soap->body && soap_element_end_in(soap, tag))
    1344                         return NULL;
    1345         }
    1346         return a;
    1347 }
    1348 
    1349 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__find_USCOREinstances(struct soap *soap, const struct ns1__find_USCOREinstances *a)
    1350 {
    1351         (void)soap; (void)a; /* appease -Wall -Werror */
    1352         soap_embedded(soap, &a->key, SOAP_TYPE_string);
    1353         soap_serialize_string(soap, &a->key);
    1354         soap_embedded(soap, &a->volume, SOAP_TYPE_string);
    1355         soap_serialize_string(soap, &a->volume);
    1356 }
    1357 
    1358 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__find_USCOREinstances(struct soap *soap, struct ns1__find_USCOREinstances *a)
    1359 {
    1360         (void)soap; (void)a; /* appease -Wall -Werror */
    1361         soap_default_string(soap, &a->key);
    1362         soap_default_string(soap, &a->volume);
    1363 }
    1364 
    1365 SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__find_USCOREinstances(struct soap *soap, const struct ns1__find_USCOREinstances *a, const char *tag, const char *type)
    1366 {
    1367         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__find_USCOREinstances);
    1368         if (soap_out_ns1__find_USCOREinstances(soap, tag, id, a, type))
    1369                 return soap->error;
    1370         return soap_putindependent(soap);
    1371 }
    1372 
    1373 SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__find_USCOREinstances(struct soap *soap, const char *tag, int id, const struct ns1__find_USCOREinstances *a, const char *type)
    1374 {
    1375         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__find_USCOREinstances), type);
    1376         soap_out_string(soap, "key", -1, &a->key, "");
    1377         soap_out_string(soap, "volume", -1, &a->volume, "");
    1378         soap_element_end_out(soap, tag);
    1379         return SOAP_OK;
    1380 }
    1381 
    1382 SOAP_FMAC3 struct ns1__find_USCOREinstances * SOAP_FMAC4 soap_get_ns1__find_USCOREinstances(struct soap *soap, struct ns1__find_USCOREinstances *p, const char *tag, const char *type)
    1383 {
    1384         if ((p = soap_in_ns1__find_USCOREinstances(soap, tag, p, type)))
    1385                 soap_getindependent(soap);
    1386         return p;
    1387 }
    1388 
    1389 SOAP_FMAC3 struct ns1__find_USCOREinstances * SOAP_FMAC4 soap_in_ns1__find_USCOREinstances(struct soap *soap, const char *tag, struct ns1__find_USCOREinstances *a, const char *type)
    1390 {
    1391         short soap_flag_key = 1, soap_flag_volume = 1;
    1392         if (soap_element_begin_in(soap, tag, 0))
    1393                 return NULL;
    1394         if (*soap->type && soap_match_tag(soap, soap->type, type))
    1395         {       soap->error = SOAP_TYPE;
    1396                 return NULL;
    1397         }
    1398         a = (struct ns1__find_USCOREinstances *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__find_USCOREinstances, sizeof(struct ns1__find_USCOREinstances), 0, NULL, NULL, NULL);
    1399         if (!a)
    1400                 return NULL;
    1401         if (soap->alloced)
    1402                 soap_default_ns1__find_USCOREinstances(soap, a);
     1312        {       a = (struct ns1__delete_USCOREinstance *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns1__delete_USCOREinstance, 0, sizeof(struct ns1__delete_USCOREinstance), 0, NULL);
     1313                if (soap->body && soap_element_end_in(soap, tag))
     1314                        return NULL;
     1315        }
     1316        return a;
     1317}
     1318
     1319SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__delete_USCOREinstanceResponse(struct soap *soap, struct ns1__delete_USCOREinstanceResponse *a)
     1320{
     1321        (void)soap; (void)a; /* appease -Wall -Werror */
     1322        a->result = NULL;
     1323}
     1324
     1325SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__delete_USCOREinstanceResponse(struct soap *soap, const struct ns1__delete_USCOREinstanceResponse *a)
     1326{
     1327        (void)soap; (void)a; /* appease -Wall -Werror */
     1328        soap_serialize_PointerToint(soap, &a->result);
     1329}
     1330
     1331SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__delete_USCOREinstanceResponse(struct soap *soap, const struct ns1__delete_USCOREinstanceResponse *a, const char *tag, const char *type)
     1332{
     1333        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__delete_USCOREinstanceResponse);
     1334        if (soap_out_ns1__delete_USCOREinstanceResponse(soap, tag, id, a, type))
     1335                return soap->error;
     1336        return soap_putindependent(soap);
     1337}
     1338
     1339SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__delete_USCOREinstanceResponse(struct soap *soap, const char *tag, int id, const struct ns1__delete_USCOREinstanceResponse *a, const char *type)
     1340{
     1341        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__delete_USCOREinstanceResponse), type))
     1342                return soap->error;
     1343        if (soap_out_PointerToint(soap, "result", -1, &a->result, ""))
     1344                return soap->error;
     1345        return soap_element_end_out(soap, tag);
     1346}
     1347
     1348SOAP_FMAC3 struct ns1__delete_USCOREinstanceResponse * SOAP_FMAC4 soap_get_ns1__delete_USCOREinstanceResponse(struct soap *soap, struct ns1__delete_USCOREinstanceResponse *p, const char *tag, const char *type)
     1349{
     1350        if ((p = soap_in_ns1__delete_USCOREinstanceResponse(soap, tag, p, type)))
     1351                if (soap_getindependent(soap))
     1352                        return NULL;
     1353        return p;
     1354}
     1355
     1356SOAP_FMAC3 struct ns1__delete_USCOREinstanceResponse * SOAP_FMAC4 soap_in_ns1__delete_USCOREinstanceResponse(struct soap *soap, const char *tag, struct ns1__delete_USCOREinstanceResponse *a, const char *type)
     1357{
     1358        size_t soap_flag_result = 1;
     1359        if (soap_element_begin_in(soap, tag, 0, type))
     1360                return NULL;
     1361        a = (struct ns1__delete_USCOREinstanceResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__delete_USCOREinstanceResponse, sizeof(struct ns1__delete_USCOREinstanceResponse), 0, NULL, NULL, NULL);
     1362        if (!a)
     1363                return NULL;
     1364        soap_default_ns1__delete_USCOREinstanceResponse(soap, a);
    14031365        if (soap->body && !*soap->href)
    1404         {       for (;;)
     1366        {
     1367                for (;;)
    14051368                {       soap->error = SOAP_TAG_MISMATCH;
    1406                         if (soap_flag_key && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    1407                                 if (soap_in_string(soap, "key", &a->key, ""))
    1408                                 {       soap_flag_key = 0;
    1409                                         continue;
    1410                                 }
    1411                         if (soap_flag_volume && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    1412                                 if (soap_in_string(soap, "volume", &a->volume, ""))
    1413                                 {       soap_flag_volume = 0;
     1369                        if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH)
     1370                                if (soap_in_PointerToint(soap, "result", &a->result, "xsd:int"))
     1371                                {       soap_flag_result--;
    14141372                                        continue;
    14151373                                }
     
    14251383        }
    14261384        else
    1427         {       a = (struct ns1__find_USCOREinstances *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_ns1__find_USCOREinstances, 0, sizeof(struct ns1__find_USCOREinstances), 0, NULL);
    1428                 if (soap->body && soap_element_end_in(soap, tag))
    1429                         return NULL;
    1430         }
    1431         return a;
    1432 }
    1433 
    1434 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__find_USCOREinstancesResponse(struct soap *soap, const struct ns1__find_USCOREinstancesResponse *a)
    1435 {
    1436         (void)soap; (void)a; /* appease -Wall -Werror */
    1437         soap_embedded(soap, &a->result, SOAP_TYPE_PointerToArrayOfString);
    1438         soap_serialize_PointerToArrayOfString(soap, &a->result);
    1439 }
    1440 
    1441 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__find_USCOREinstancesResponse(struct soap *soap, struct ns1__find_USCOREinstancesResponse *a)
    1442 {
    1443         (void)soap; (void)a; /* appease -Wall -Werror */
    1444         a->result = NULL;
    1445 }
    1446 
    1447 SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__find_USCOREinstancesResponse(struct soap *soap, const struct ns1__find_USCOREinstancesResponse *a, const char *tag, const char *type)
    1448 {
    1449         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__find_USCOREinstancesResponse);
    1450         if (soap_out_ns1__find_USCOREinstancesResponse(soap, tag, id, a, type))
    1451                 return soap->error;
    1452         return soap_putindependent(soap);
    1453 }
    1454 
    1455 SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__find_USCOREinstancesResponse(struct soap *soap, const char *tag, int id, const struct ns1__find_USCOREinstancesResponse *a, const char *type)
    1456 {
    1457         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__find_USCOREinstancesResponse), type);
    1458         if (a->result)
    1459                 soap_element_result(soap, "result");
    1460         soap_out_PointerToArrayOfString(soap, "result", -1, &a->result, "");
    1461         soap_element_end_out(soap, tag);
    1462         return SOAP_OK;
    1463 }
    1464 
    1465 SOAP_FMAC3 struct ns1__find_USCOREinstancesResponse * SOAP_FMAC4 soap_get_ns1__find_USCOREinstancesResponse(struct soap *soap, struct ns1__find_USCOREinstancesResponse *p, const char *tag, const char *type)
    1466 {
    1467         if ((p = soap_in_ns1__find_USCOREinstancesResponse(soap, tag, p, type)))
    1468                 soap_getindependent(soap);
    1469         return p;
    1470 }
    1471 
    1472 SOAP_FMAC3 struct ns1__find_USCOREinstancesResponse * SOAP_FMAC4 soap_in_ns1__find_USCOREinstancesResponse(struct soap *soap, const char *tag, struct ns1__find_USCOREinstancesResponse *a, const char *type)
    1473 {
    1474         short soap_flag_result = 1;
    1475         if (soap_element_begin_in(soap, tag, 0))
    1476                 return NULL;
    1477         if (*soap->type && soap_match_tag(soap, soap->type, type))
    1478         {       soap->error = SOAP_TYPE;
    1479                 return NULL;
    1480         }
    1481         a = (struct ns1__find_USCOREinstancesResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__find_USCOREinstancesResponse, sizeof(struct ns1__find_USCOREinstancesResponse), 0, NULL, NULL, NULL);
    1482         if (!a)
    1483                 return NULL;
    1484         if (soap->alloced)
    1485                 soap_default_ns1__find_USCOREinstancesResponse(soap, a);
     1385        {       a = (struct ns1__delete_USCOREinstanceResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns1__delete_USCOREinstanceResponse, 0, sizeof(struct ns1__delete_USCOREinstanceResponse), 0, NULL);
     1386                if (soap->body && soap_element_end_in(soap, tag))
     1387                        return NULL;
     1388        }
     1389        return a;
     1390}
     1391
     1392SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__find_USCOREinstances(struct soap *soap, struct ns1__find_USCOREinstances *a)
     1393{
     1394        (void)soap; (void)a; /* appease -Wall -Werror */
     1395        soap_default_string(soap, &a->key);
     1396        soap_default_string(soap, &a->volume);
     1397}
     1398
     1399SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__find_USCOREinstances(struct soap *soap, const struct ns1__find_USCOREinstances *a)
     1400{
     1401        (void)soap; (void)a; /* appease -Wall -Werror */
     1402        soap_serialize_string(soap, &a->key);
     1403        soap_serialize_string(soap, &a->volume);
     1404}
     1405
     1406SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__find_USCOREinstances(struct soap *soap, const struct ns1__find_USCOREinstances *a, const char *tag, const char *type)
     1407{
     1408        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__find_USCOREinstances);
     1409        if (soap_out_ns1__find_USCOREinstances(soap, tag, id, a, type))
     1410                return soap->error;
     1411        return soap_putindependent(soap);
     1412}
     1413
     1414SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__find_USCOREinstances(struct soap *soap, const char *tag, int id, const struct ns1__find_USCOREinstances *a, const char *type)
     1415{
     1416        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__find_USCOREinstances), type))
     1417                return soap->error;
     1418        if (soap_out_string(soap, "key", -1, &a->key, ""))
     1419                return soap->error;
     1420        if (soap_out_string(soap, "volume", -1, &a->volume, ""))
     1421                return soap->error;
     1422        return soap_element_end_out(soap, tag);
     1423}
     1424
     1425SOAP_FMAC3 struct ns1__find_USCOREinstances * SOAP_FMAC4 soap_get_ns1__find_USCOREinstances(struct soap *soap, struct ns1__find_USCOREinstances *p, const char *tag, const char *type)
     1426{
     1427        if ((p = soap_in_ns1__find_USCOREinstances(soap, tag, p, type)))
     1428                if (soap_getindependent(soap))
     1429                        return NULL;
     1430        return p;
     1431}
     1432
     1433SOAP_FMAC3 struct ns1__find_USCOREinstances * SOAP_FMAC4 soap_in_ns1__find_USCOREinstances(struct soap *soap, const char *tag, struct ns1__find_USCOREinstances *a, const char *type)
     1434{
     1435        size_t soap_flag_key = 1;
     1436        size_t soap_flag_volume = 1;
     1437        if (soap_element_begin_in(soap, tag, 0, type))
     1438                return NULL;
     1439        a = (struct ns1__find_USCOREinstances *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__find_USCOREinstances, sizeof(struct ns1__find_USCOREinstances), 0, NULL, NULL, NULL);
     1440        if (!a)
     1441                return NULL;
     1442        soap_default_ns1__find_USCOREinstances(soap, a);
    14861443        if (soap->body && !*soap->href)
    1487         {       for (;;)
     1444        {
     1445                for (;;)
    14881446                {       soap->error = SOAP_TAG_MISMATCH;
    1489                         if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH)
    1490                                 if (soap_in_PointerToArrayOfString(soap, "result", &a->result, "xsd:string"))
    1491                                 {       soap_flag_result = 0;
     1447                        if (soap_flag_key && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
     1448                                if (soap_in_string(soap, "key", &a->key, "xsd:string"))
     1449                                {       soap_flag_key--;
     1450                                        continue;
     1451                                }
     1452                        if (soap_flag_volume && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
     1453                                if (soap_in_string(soap, "volume", &a->volume, "xsd:string"))
     1454                                {       soap_flag_volume--;
    14921455                                        continue;
    14931456                                }
     
    15031466        }
    15041467        else
    1505         {       a = (struct ns1__find_USCOREinstancesResponse *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_ns1__find_USCOREinstancesResponse, 0, sizeof(struct ns1__find_USCOREinstancesResponse), 0, NULL);
    1506                 if (soap->body && soap_element_end_in(soap, tag))
    1507                         return NULL;
    1508         }
    1509         return a;
    1510 }
    1511 
    1512 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__find_USCOREobjects(struct soap *soap, const struct ns1__find_USCOREobjects *a)
    1513 {
    1514         (void)soap; (void)a; /* appease -Wall -Werror */
    1515         soap_embedded(soap, &a->pattern, SOAP_TYPE_string);
    1516         soap_serialize_string(soap, &a->pattern);
    1517 }
    1518 
    1519 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__find_USCOREobjects(struct soap *soap, struct ns1__find_USCOREobjects *a)
    1520 {
    1521         (void)soap; (void)a; /* appease -Wall -Werror */
    1522         soap_default_string(soap, &a->pattern);
    1523 }
    1524 
    1525 SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__find_USCOREobjects(struct soap *soap, const struct ns1__find_USCOREobjects *a, const char *tag, const char *type)
    1526 {
    1527         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__find_USCOREobjects);
    1528         if (soap_out_ns1__find_USCOREobjects(soap, tag, id, a, type))
    1529                 return soap->error;
    1530         return soap_putindependent(soap);
    1531 }
    1532 
    1533 SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__find_USCOREobjects(struct soap *soap, const char *tag, int id, const struct ns1__find_USCOREobjects *a, const char *type)
    1534 {
    1535         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__find_USCOREobjects), type);
    1536         soap_out_string(soap, "pattern", -1, &a->pattern, "");
    1537         soap_element_end_out(soap, tag);
    1538         return SOAP_OK;
    1539 }
    1540 
    1541 SOAP_FMAC3 struct ns1__find_USCOREobjects * SOAP_FMAC4 soap_get_ns1__find_USCOREobjects(struct soap *soap, struct ns1__find_USCOREobjects *p, const char *tag, const char *type)
    1542 {
    1543         if ((p = soap_in_ns1__find_USCOREobjects(soap, tag, p, type)))
    1544                 soap_getindependent(soap);
    1545         return p;
    1546 }
    1547 
    1548 SOAP_FMAC3 struct ns1__find_USCOREobjects * SOAP_FMAC4 soap_in_ns1__find_USCOREobjects(struct soap *soap, const char *tag, struct ns1__find_USCOREobjects *a, const char *type)
    1549 {
    1550         short soap_flag_pattern = 1;
    1551         if (soap_element_begin_in(soap, tag, 0))
    1552                 return NULL;
    1553         if (*soap->type && soap_match_tag(soap, soap->type, type))
    1554         {       soap->error = SOAP_TYPE;
    1555                 return NULL;
    1556         }
    1557         a = (struct ns1__find_USCOREobjects *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__find_USCOREobjects, sizeof(struct ns1__find_USCOREobjects), 0, NULL, NULL, NULL);
    1558         if (!a)
    1559                 return NULL;
    1560         if (soap->alloced)
    1561                 soap_default_ns1__find_USCOREobjects(soap, a);
     1468        {       a = (struct ns1__find_USCOREinstances *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns1__find_USCOREinstances, 0, sizeof(struct ns1__find_USCOREinstances), 0, NULL);
     1469                if (soap->body && soap_element_end_in(soap, tag))
     1470                        return NULL;
     1471        }
     1472        return a;
     1473}
     1474
     1475SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__find_USCOREinstancesResponse(struct soap *soap, struct ns1__find_USCOREinstancesResponse *a)
     1476{
     1477        (void)soap; (void)a; /* appease -Wall -Werror */
     1478        a->result = NULL;
     1479}
     1480
     1481SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__find_USCOREinstancesResponse(struct soap *soap, const struct ns1__find_USCOREinstancesResponse *a)
     1482{
     1483        (void)soap; (void)a; /* appease -Wall -Werror */
     1484        soap_serialize_PointerToArrayOfString(soap, &a->result);
     1485}
     1486
     1487SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__find_USCOREinstancesResponse(struct soap *soap, const struct ns1__find_USCOREinstancesResponse *a, const char *tag, const char *type)
     1488{
     1489        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__find_USCOREinstancesResponse);
     1490        if (soap_out_ns1__find_USCOREinstancesResponse(soap, tag, id, a, type))
     1491                return soap->error;
     1492        return soap_putindependent(soap);
     1493}
     1494
     1495SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__find_USCOREinstancesResponse(struct soap *soap, const char *tag, int id, const struct ns1__find_USCOREinstancesResponse *a, const char *type)
     1496{
     1497        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__find_USCOREinstancesResponse), type))
     1498                return soap->error;
     1499        if (soap_out_PointerToArrayOfString(soap, "result", -1, &a->result, ""))
     1500                return soap->error;
     1501        return soap_element_end_out(soap, tag);
     1502}
     1503
     1504SOAP_FMAC3 struct ns1__find_USCOREinstancesResponse * SOAP_FMAC4 soap_get_ns1__find_USCOREinstancesResponse(struct soap *soap, struct ns1__find_USCOREinstancesResponse *p, const char *tag, const char *type)
     1505{
     1506        if ((p = soap_in_ns1__find_USCOREinstancesResponse(soap, tag, p, type)))
     1507                if (soap_getindependent(soap))
     1508                        return NULL;
     1509        return p;
     1510}
     1511
     1512SOAP_FMAC3 struct ns1__find_USCOREinstancesResponse * SOAP_FMAC4 soap_in_ns1__find_USCOREinstancesResponse(struct soap *soap, const char *tag, struct ns1__find_USCOREinstancesResponse *a, const char *type)
     1513{
     1514        size_t soap_flag_result = 1;
     1515        if (soap_element_begin_in(soap, tag, 0, type))
     1516                return NULL;
     1517        a = (struct ns1__find_USCOREinstancesResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__find_USCOREinstancesResponse, sizeof(struct ns1__find_USCOREinstancesResponse), 0, NULL, NULL, NULL);
     1518        if (!a)
     1519                return NULL;
     1520        soap_default_ns1__find_USCOREinstancesResponse(soap, a);
    15621521        if (soap->body && !*soap->href)
    1563         {       for (;;)
     1522        {
     1523                for (;;)
    15641524                {       soap->error = SOAP_TAG_MISMATCH;
    1565                         if (soap_flag_pattern && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    1566                                 if (soap_in_string(soap, "pattern", &a->pattern, ""))
    1567                                 {       soap_flag_pattern = 0;
     1525                        if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH)
     1526                                if (soap_in_PointerToArrayOfString(soap, "result", &a->result, "xsd:string"))
     1527                                {       soap_flag_result--;
    15681528                                        continue;
    15691529                                }
     
    15791539        }
    15801540        else
    1581         {       a = (struct ns1__find_USCOREobjects *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_ns1__find_USCOREobjects, 0, sizeof(struct ns1__find_USCOREobjects), 0, NULL);
    1582                 if (soap->body && soap_element_end_in(soap, tag))
    1583                         return NULL;
    1584         }
    1585         return a;
    1586 }
    1587 
    1588 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__find_USCOREobjectsResponse(struct soap *soap, const struct ns1__find_USCOREobjectsResponse *a)
    1589 {
    1590         (void)soap; (void)a; /* appease -Wall -Werror */
    1591         soap_embedded(soap, &a->result, SOAP_TYPE_PointerToArrayOfString);
    1592         soap_serialize_PointerToArrayOfString(soap, &a->result);
    1593 }
    1594 
    1595 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__find_USCOREobjectsResponse(struct soap *soap, struct ns1__find_USCOREobjectsResponse *a)
    1596 {
    1597         (void)soap; (void)a; /* appease -Wall -Werror */
    1598         a->result = NULL;
    1599 }
    1600 
    1601 SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__find_USCOREobjectsResponse(struct soap *soap, const struct ns1__find_USCOREobjectsResponse *a, const char *tag, const char *type)
    1602 {
    1603         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__find_USCOREobjectsResponse);
    1604         if (soap_out_ns1__find_USCOREobjectsResponse(soap, tag, id, a, type))
    1605                 return soap->error;
    1606         return soap_putindependent(soap);
    1607 }
    1608 
    1609 SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__find_USCOREobjectsResponse(struct soap *soap, const char *tag, int id, const struct ns1__find_USCOREobjectsResponse *a, const char *type)
    1610 {
    1611         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__find_USCOREobjectsResponse), type);
    1612         if (a->result)
    1613                 soap_element_result(soap, "result");
    1614         soap_out_PointerToArrayOfString(soap, "result", -1, &a->result, "");
    1615         soap_element_end_out(soap, tag);
    1616         return SOAP_OK;
    1617 }
    1618 
    1619 SOAP_FMAC3 struct ns1__find_USCOREobjectsResponse * SOAP_FMAC4 soap_get_ns1__find_USCOREobjectsResponse(struct soap *soap, struct ns1__find_USCOREobjectsResponse *p, const char *tag, const char *type)
    1620 {
    1621         if ((p = soap_in_ns1__find_USCOREobjectsResponse(soap, tag, p, type)))
    1622                 soap_getindependent(soap);
    1623         return p;
    1624 }
    1625 
    1626 SOAP_FMAC3 struct ns1__find_USCOREobjectsResponse * SOAP_FMAC4 soap_in_ns1__find_USCOREobjectsResponse(struct soap *soap, const char *tag, struct ns1__find_USCOREobjectsResponse *a, const char *type)
    1627 {
    1628         short soap_flag_result = 1;
    1629         if (soap_element_begin_in(soap, tag, 0))
    1630                 return NULL;
    1631         if (*soap->type && soap_match_tag(soap, soap->type, type))
    1632         {       soap->error = SOAP_TYPE;
    1633                 return NULL;
    1634         }
    1635         a = (struct ns1__find_USCOREobjectsResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__find_USCOREobjectsResponse, sizeof(struct ns1__find_USCOREobjectsResponse), 0, NULL, NULL, NULL);
    1636         if (!a)
    1637                 return NULL;
    1638         if (soap->alloced)
    1639                 soap_default_ns1__find_USCOREobjectsResponse(soap, a);
     1541        {       a = (struct ns1__find_USCOREinstancesResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns1__find_USCOREinstancesResponse, 0, sizeof(struct ns1__find_USCOREinstancesResponse), 0, NULL);
     1542                if (soap->body && soap_element_end_in(soap, tag))
     1543                        return NULL;
     1544        }
     1545        return a;
     1546}
     1547
     1548SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__find_USCOREobjects(struct soap *soap, struct ns1__find_USCOREobjects *a)
     1549{
     1550        (void)soap; (void)a; /* appease -Wall -Werror */
     1551        soap_default_string(soap, &a->pattern);
     1552}
     1553
     1554SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__find_USCOREobjects(struct soap *soap, const struct ns1__find_USCOREobjects *a)
     1555{
     1556        (void)soap; (void)a; /* appease -Wall -Werror */
     1557        soap_serialize_string(soap, &a->pattern);
     1558}
     1559
     1560SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__find_USCOREobjects(struct soap *soap, const struct ns1__find_USCOREobjects *a, const char *tag, const char *type)
     1561{
     1562        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__find_USCOREobjects);
     1563        if (soap_out_ns1__find_USCOREobjects(soap, tag, id, a, type))
     1564                return soap->error;
     1565        return soap_putindependent(soap);
     1566}
     1567
     1568SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__find_USCOREobjects(struct soap *soap, const char *tag, int id, const struct ns1__find_USCOREobjects *a, const char *type)
     1569{
     1570        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__find_USCOREobjects), type))
     1571                return soap->error;
     1572        if (soap_out_string(soap, "pattern", -1, &a->pattern, ""))
     1573                return soap->error;
     1574        return soap_element_end_out(soap, tag);
     1575}
     1576
     1577SOAP_FMAC3 struct ns1__find_USCOREobjects * SOAP_FMAC4 soap_get_ns1__find_USCOREobjects(struct soap *soap, struct ns1__find_USCOREobjects *p, const char *tag, const char *type)
     1578{
     1579        if ((p = soap_in_ns1__find_USCOREobjects(soap, tag, p, type)))
     1580                if (soap_getindependent(soap))
     1581                        return NULL;
     1582        return p;
     1583}
     1584
     1585SOAP_FMAC3 struct ns1__find_USCOREobjects * SOAP_FMAC4 soap_in_ns1__find_USCOREobjects(struct soap *soap, const char *tag, struct ns1__find_USCOREobjects *a, const char *type)
     1586{
     1587        size_t soap_flag_pattern = 1;
     1588        if (soap_element_begin_in(soap, tag, 0, type))
     1589                return NULL;
     1590        a = (struct ns1__find_USCOREobjects *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__find_USCOREobjects, sizeof(struct ns1__find_USCOREobjects), 0, NULL, NULL, NULL);
     1591        if (!a)
     1592                return NULL;
     1593        soap_default_ns1__find_USCOREobjects(soap, a);
    16401594        if (soap->body && !*soap->href)
    1641         {       for (;;)
     1595        {
     1596                for (;;)
    16421597                {       soap->error = SOAP_TAG_MISMATCH;
    1643                         if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH)
    1644                                 if (soap_in_PointerToArrayOfString(soap, "result", &a->result, "xsd:string"))
    1645                                 {       soap_flag_result = 0;
     1598                        if (soap_flag_pattern && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
     1599                                if (soap_in_string(soap, "pattern", &a->pattern, "xsd:string"))
     1600                                {       soap_flag_pattern--;
    16461601                                        continue;
    16471602                                }
     
    16571612        }
    16581613        else
    1659         {       a = (struct ns1__find_USCOREobjectsResponse *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_ns1__find_USCOREobjectsResponse, 0, sizeof(struct ns1__find_USCOREobjectsResponse), 0, NULL);
    1660                 if (soap->body && soap_element_end_in(soap, tag))
    1661                         return NULL;
    1662         }
    1663         return a;
    1664 }
    1665 
    1666 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__unlock_USCOREobject(struct soap *soap, const struct ns1__unlock_USCOREobject *a)
    1667 {
    1668         (void)soap; (void)a; /* appease -Wall -Werror */
    1669         soap_embedded(soap, &a->key, SOAP_TYPE_string);
    1670         soap_serialize_string(soap, &a->key);
    1671         soap_embedded(soap, &a->type, SOAP_TYPE_string);
    1672         soap_serialize_string(soap, &a->type);
    1673 }
    1674 
    1675 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__unlock_USCOREobject(struct soap *soap, struct ns1__unlock_USCOREobject *a)
    1676 {
    1677         (void)soap; (void)a; /* appease -Wall -Werror */
    1678         soap_default_string(soap, &a->key);
    1679         soap_default_string(soap, &a->type);
    1680 }
    1681 
    1682 SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__unlock_USCOREobject(struct soap *soap, const struct ns1__unlock_USCOREobject *a, const char *tag, const char *type)
    1683 {
    1684         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__unlock_USCOREobject);
    1685         if (soap_out_ns1__unlock_USCOREobject(soap, tag, id, a, type))
    1686                 return soap->error;
    1687         return soap_putindependent(soap);
    1688 }
    1689 
    1690 SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__unlock_USCOREobject(struct soap *soap, const char *tag, int id, const struct ns1__unlock_USCOREobject *a, const char *type)
    1691 {
    1692         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__unlock_USCOREobject), type);
    1693         soap_out_string(soap, "key", -1, &a->key, "");
    1694         soap_out_string(soap, "type", -1, &a->type, "");
    1695         soap_element_end_out(soap, tag);
    1696         return SOAP_OK;
    1697 }
    1698 
    1699 SOAP_FMAC3 struct ns1__unlock_USCOREobject * SOAP_FMAC4 soap_get_ns1__unlock_USCOREobject(struct soap *soap, struct ns1__unlock_USCOREobject *p, const char *tag, const char *type)
    1700 {
    1701         if ((p = soap_in_ns1__unlock_USCOREobject(soap, tag, p, type)))
    1702                 soap_getindependent(soap);
    1703         return p;
    1704 }
    1705 
    1706 SOAP_FMAC3 struct ns1__unlock_USCOREobject * SOAP_FMAC4 soap_in_ns1__unlock_USCOREobject(struct soap *soap, const char *tag, struct ns1__unlock_USCOREobject *a, const char *type)
    1707 {
    1708         short soap_flag_key = 1, soap_flag_type = 1;
    1709         if (soap_element_begin_in(soap, tag, 0))
    1710                 return NULL;
    1711         if (*soap->type && soap_match_tag(soap, soap->type, type))
    1712         {       soap->error = SOAP_TYPE;
    1713                 return NULL;
    1714         }
    1715         a = (struct ns1__unlock_USCOREobject *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__unlock_USCOREobject, sizeof(struct ns1__unlock_USCOREobject), 0, NULL, NULL, NULL);
    1716         if (!a)
    1717                 return NULL;
    1718         if (soap->alloced)
    1719                 soap_default_ns1__unlock_USCOREobject(soap, a);
     1614        {       a = (struct ns1__find_USCOREobjects *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns1__find_USCOREobjects, 0, sizeof(struct ns1__find_USCOREobjects), 0, NULL);
     1615                if (soap->body && soap_element_end_in(soap, tag))
     1616                        return NULL;
     1617        }
     1618        return a;
     1619}
     1620
     1621SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__find_USCOREobjectsResponse(struct soap *soap, struct ns1__find_USCOREobjectsResponse *a)
     1622{
     1623        (void)soap; (void)a; /* appease -Wall -Werror */
     1624        a->result = NULL;
     1625}
     1626
     1627SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__find_USCOREobjectsResponse(struct soap *soap, const struct ns1__find_USCOREobjectsResponse *a)
     1628{
     1629        (void)soap; (void)a; /* appease -Wall -Werror */
     1630        soap_serialize_PointerToArrayOfString(soap, &a->result);
     1631}
     1632
     1633SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__find_USCOREobjectsResponse(struct soap *soap, const struct ns1__find_USCOREobjectsResponse *a, const char *tag, const char *type)
     1634{
     1635        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__find_USCOREobjectsResponse);
     1636        if (soap_out_ns1__find_USCOREobjectsResponse(soap, tag, id, a, type))
     1637                return soap->error;
     1638        return soap_putindependent(soap);
     1639}
     1640
     1641SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__find_USCOREobjectsResponse(struct soap *soap, const char *tag, int id, const struct ns1__find_USCOREobjectsResponse *a, const char *type)
     1642{
     1643        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__find_USCOREobjectsResponse), type))
     1644                return soap->error;
     1645        if (soap_out_PointerToArrayOfString(soap, "result", -1, &a->result, ""))
     1646                return soap->error;
     1647        return soap_element_end_out(soap, tag);
     1648}
     1649
     1650SOAP_FMAC3 struct ns1__find_USCOREobjectsResponse * SOAP_FMAC4 soap_get_ns1__find_USCOREobjectsResponse(struct soap *soap, struct ns1__find_USCOREobjectsResponse *p, const char *tag, const char *type)
     1651{
     1652        if ((p = soap_in_ns1__find_USCOREobjectsResponse(soap, tag, p, type)))
     1653                if (soap_getindependent(soap))
     1654                        return NULL;
     1655        return p;
     1656}
     1657
     1658SOAP_FMAC3 struct ns1__find_USCOREobjectsResponse * SOAP_FMAC4 soap_in_ns1__find_USCOREobjectsResponse(struct soap *soap, const char *tag, struct ns1__find_USCOREobjectsResponse *a, const char *type)
     1659{
     1660        size_t soap_flag_result = 1;
     1661        if (soap_element_begin_in(soap, tag, 0, type))
     1662                return NULL;
     1663        a = (struct ns1__find_USCOREobjectsResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__find_USCOREobjectsResponse, sizeof(struct ns1__find_USCOREobjectsResponse), 0, NULL, NULL, NULL);
     1664        if (!a)
     1665                return NULL;
     1666        soap_default_ns1__find_USCOREobjectsResponse(soap, a);
    17201667        if (soap->body && !*soap->href)
    1721         {       for (;;)
     1668        {
     1669                for (;;)
    17221670                {       soap->error = SOAP_TAG_MISMATCH;
    1723                         if (soap_flag_key && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    1724                                 if (soap_in_string(soap, "key", &a->key, ""))
    1725                                 {       soap_flag_key = 0;
    1726                                         continue;
    1727                                 }
    1728                         if (soap_flag_type && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    1729                                 if (soap_in_string(soap, "type", &a->type, ""))
    1730                                 {       soap_flag_type = 0;
     1671                        if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH)
     1672                                if (soap_in_PointerToArrayOfString(soap, "result", &a->result, "xsd:string"))
     1673                                {       soap_flag_result--;
    17311674                                        continue;
    17321675                                }
     
    17421685        }
    17431686        else
    1744         {       a = (struct ns1__unlock_USCOREobject *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_ns1__unlock_USCOREobject, 0, sizeof(struct ns1__unlock_USCOREobject), 0, NULL);
    1745                 if (soap->body && soap_element_end_in(soap, tag))
    1746                         return NULL;
    1747         }
    1748         return a;
    1749 }
    1750 
    1751 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__unlock_USCOREobjectResponse(struct soap *soap, const struct ns1__unlock_USCOREobjectResponse *a)
    1752 {
    1753         (void)soap; (void)a; /* appease -Wall -Werror */
    1754         soap_embedded(soap, &a->result, SOAP_TYPE_PointerToint);
    1755         soap_serialize_PointerToint(soap, &a->result);
    1756 }
    1757 
    1758 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__unlock_USCOREobjectResponse(struct soap *soap, struct ns1__unlock_USCOREobjectResponse *a)
    1759 {
    1760         (void)soap; (void)a; /* appease -Wall -Werror */
    1761         a->result = NULL;
    1762 }
    1763 
    1764 SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__unlock_USCOREobjectResponse(struct soap *soap, const struct ns1__unlock_USCOREobjectResponse *a, const char *tag, const char *type)
    1765 {
    1766         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__unlock_USCOREobjectResponse);
    1767         if (soap_out_ns1__unlock_USCOREobjectResponse(soap, tag, id, a, type))
    1768                 return soap->error;
    1769         return soap_putindependent(soap);
    1770 }
    1771 
    1772 SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__unlock_USCOREobjectResponse(struct soap *soap, const char *tag, int id, const struct ns1__unlock_USCOREobjectResponse *a, const char *type)
    1773 {
    1774         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__unlock_USCOREobjectResponse), type);
    1775         if (a->result)
    1776                 soap_element_result(soap, "result");
    1777         soap_out_PointerToint(soap, "result", -1, &a->result, "");
    1778         soap_element_end_out(soap, tag);
    1779         return SOAP_OK;
    1780 }
    1781 
    1782 SOAP_FMAC3 struct ns1__unlock_USCOREobjectResponse * SOAP_FMAC4 soap_get_ns1__unlock_USCOREobjectResponse(struct soap *soap, struct ns1__unlock_USCOREobjectResponse *p, const char *tag, const char *type)
    1783 {
    1784         if ((p = soap_in_ns1__unlock_USCOREobjectResponse(soap, tag, p, type)))
    1785                 soap_getindependent(soap);
    1786         return p;
    1787 }
    1788 
    1789 SOAP_FMAC3 struct ns1__unlock_USCOREobjectResponse * SOAP_FMAC4 soap_in_ns1__unlock_USCOREobjectResponse(struct soap *soap, const char *tag, struct ns1__unlock_USCOREobjectResponse *a, const char *type)
    1790 {
    1791         short soap_flag_result = 1;
    1792         if (soap_element_begin_in(soap, tag, 0))
    1793                 return NULL;
    1794         if (*soap->type && soap_match_tag(soap, soap->type, type))
    1795         {       soap->error = SOAP_TYPE;
    1796                 return NULL;
    1797         }
    1798         a = (struct ns1__unlock_USCOREobjectResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__unlock_USCOREobjectResponse, sizeof(struct ns1__unlock_USCOREobjectResponse), 0, NULL, NULL, NULL);
    1799         if (!a)
    1800                 return NULL;
    1801         if (soap->alloced)
    1802                 soap_default_ns1__unlock_USCOREobjectResponse(soap, a);
     1687        {       a = (struct ns1__find_USCOREobjectsResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns1__find_USCOREobjectsResponse, 0, sizeof(struct ns1__find_USCOREobjectsResponse), 0, NULL);
     1688                if (soap->body && soap_element_end_in(soap, tag))
     1689                        return NULL;
     1690        }
     1691        return a;
     1692}
     1693
     1694SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__unlock_USCOREobject(struct soap *soap, struct ns1__unlock_USCOREobject *a)
     1695{
     1696        (void)soap; (void)a; /* appease -Wall -Werror */
     1697        soap_default_string(soap, &a->key);
     1698        soap_default_string(soap, &a->type);
     1699}
     1700
     1701SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__unlock_USCOREobject(struct soap *soap, const struct ns1__unlock_USCOREobject *a)
     1702{
     1703        (void)soap; (void)a; /* appease -Wall -Werror */
     1704        soap_serialize_string(soap, &a->key);
     1705        soap_serialize_string(soap, &a->type);
     1706}
     1707
     1708SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__unlock_USCOREobject(struct soap *soap, const struct ns1__unlock_USCOREobject *a, const char *tag, const char *type)
     1709{
     1710        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__unlock_USCOREobject);
     1711        if (soap_out_ns1__unlock_USCOREobject(soap, tag, id, a, type))
     1712                return soap->error;
     1713        return soap_putindependent(soap);
     1714}
     1715
     1716SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__unlock_USCOREobject(struct soap *soap, const char *tag, int id, const struct ns1__unlock_USCOREobject *a, const char *type)
     1717{
     1718        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__unlock_USCOREobject), type))
     1719                return soap->error;
     1720        if (soap_out_string(soap, "key", -1, &a->key, ""))
     1721                return soap->error;
     1722        if (soap_out_string(soap, "type", -1, &a->type, ""))
     1723                return soap->error;
     1724        return soap_element_end_out(soap, tag);
     1725}
     1726
     1727SOAP_FMAC3 struct ns1__unlock_USCOREobject * SOAP_FMAC4 soap_get_ns1__unlock_USCOREobject(struct soap *soap, struct ns1__unlock_USCOREobject *p, const char *tag, const char *type)
     1728{
     1729        if ((p = soap_in_ns1__unlock_USCOREobject(soap, tag, p, type)))
     1730                if (soap_getindependent(soap))
     1731                        return NULL;
     1732        return p;
     1733}
     1734
     1735SOAP_FMAC3 struct ns1__unlock_USCOREobject * SOAP_FMAC4 soap_in_ns1__unlock_USCOREobject(struct soap *soap, const char *tag, struct ns1__unlock_USCOREobject *a, const char *type)
     1736{
     1737        size_t soap_flag_key = 1;
     1738        size_t soap_flag_type = 1;
     1739        if (soap_element_begin_in(soap, tag, 0, type))
     1740                return NULL;
     1741        a = (struct ns1__unlock_USCOREobject *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__unlock_USCOREobject, sizeof(struct ns1__unlock_USCOREobject), 0, NULL, NULL, NULL);
     1742        if (!a)
     1743                return NULL;
     1744        soap_default_ns1__unlock_USCOREobject(soap, a);
    18031745        if (soap->body && !*soap->href)
    1804         {       for (;;)
     1746        {
     1747                for (;;)
    18051748                {       soap->error = SOAP_TAG_MISMATCH;
    1806                         if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH)
    1807                                 if (soap_in_PointerToint(soap, "result", &a->result, ""))
    1808                                 {       soap_flag_result = 0;
     1749                        if (soap_flag_key && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
     1750                                if (soap_in_string(soap, "key", &a->key, "xsd:string"))
     1751                                {       soap_flag_key--;
     1752                                        continue;
     1753                                }
     1754                        if (soap_flag_type && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
     1755                                if (soap_in_string(soap, "type", &a->type, "xsd:string"))
     1756                                {       soap_flag_type--;
    18091757                                        continue;
    18101758                                }
     
    18201768        }
    18211769        else
    1822         {       a = (struct ns1__unlock_USCOREobjectResponse *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_ns1__unlock_USCOREobjectResponse, 0, sizeof(struct ns1__unlock_USCOREobjectResponse), 0, NULL);
    1823                 if (soap->body && soap_element_end_in(soap, tag))
    1824                         return NULL;
    1825         }
    1826         return a;
    1827 }
    1828 
    1829 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__lock_USCOREobject(struct soap *soap, const struct ns1__lock_USCOREobject *a)
    1830 {
    1831         (void)soap; (void)a; /* appease -Wall -Werror */
    1832         soap_embedded(soap, &a->key, SOAP_TYPE_string);
    1833         soap_serialize_string(soap, &a->key);
    1834         soap_embedded(soap, &a->type, SOAP_TYPE_string);
    1835         soap_serialize_string(soap, &a->type);
    1836 }
    1837 
    1838 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__lock_USCOREobject(struct soap *soap, struct ns1__lock_USCOREobject *a)
    1839 {
    1840         (void)soap; (void)a; /* appease -Wall -Werror */
    1841         soap_default_string(soap, &a->key);
    1842         soap_default_string(soap, &a->type);
    1843 }
    1844 
    1845 SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__lock_USCOREobject(struct soap *soap, const struct ns1__lock_USCOREobject *a, const char *tag, const char *type)
    1846 {
    1847         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__lock_USCOREobject);
    1848         if (soap_out_ns1__lock_USCOREobject(soap, tag, id, a, type))
    1849                 return soap->error;
    1850         return soap_putindependent(soap);
    1851 }
    1852 
    1853 SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__lock_USCOREobject(struct soap *soap, const char *tag, int id, const struct ns1__lock_USCOREobject *a, const char *type)
    1854 {
    1855         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__lock_USCOREobject), type);
    1856         soap_out_string(soap, "key", -1, &a->key, "");
    1857         soap_out_string(soap, "type", -1, &a->type, "");
    1858         soap_element_end_out(soap, tag);
    1859         return SOAP_OK;
    1860 }
    1861 
    1862 SOAP_FMAC3 struct ns1__lock_USCOREobject * SOAP_FMAC4 soap_get_ns1__lock_USCOREobject(struct soap *soap, struct ns1__lock_USCOREobject *p, const char *tag, const char *type)
    1863 {
    1864         if ((p = soap_in_ns1__lock_USCOREobject(soap, tag, p, type)))
    1865                 soap_getindependent(soap);
    1866         return p;
    1867 }
    1868 
    1869 SOAP_FMAC3 struct ns1__lock_USCOREobject * SOAP_FMAC4 soap_in_ns1__lock_USCOREobject(struct soap *soap, const char *tag, struct ns1__lock_USCOREobject *a, const char *type)
    1870 {
    1871         short soap_flag_key = 1, soap_flag_type = 1;
    1872         if (soap_element_begin_in(soap, tag, 0))
    1873                 return NULL;
    1874         if (*soap->type && soap_match_tag(soap, soap->type, type))
    1875         {       soap->error = SOAP_TYPE;
    1876                 return NULL;
    1877         }
    1878         a = (struct ns1__lock_USCOREobject *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__lock_USCOREobject, sizeof(struct ns1__lock_USCOREobject), 0, NULL, NULL, NULL);
    1879         if (!a)
    1880                 return NULL;
    1881         if (soap->alloced)
    1882                 soap_default_ns1__lock_USCOREobject(soap, a);
     1770        {       a = (struct ns1__unlock_USCOREobject *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns1__unlock_USCOREobject, 0, sizeof(struct ns1__unlock_USCOREobject), 0, NULL);
     1771                if (soap->body && soap_element_end_in(soap, tag))
     1772                        return NULL;
     1773        }
     1774        return a;
     1775}
     1776
     1777SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__unlock_USCOREobjectResponse(struct soap *soap, struct ns1__unlock_USCOREobjectResponse *a)
     1778{
     1779        (void)soap; (void)a; /* appease -Wall -Werror */
     1780        a->result = NULL;
     1781}
     1782
     1783SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__unlock_USCOREobjectResponse(struct soap *soap, const struct ns1__unlock_USCOREobjectResponse *a)
     1784{
     1785        (void)soap; (void)a; /* appease -Wall -Werror */
     1786        soap_serialize_PointerToint(soap, &a->result);
     1787}
     1788
     1789SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__unlock_USCOREobjectResponse(struct soap *soap, const struct ns1__unlock_USCOREobjectResponse *a, const char *tag, const char *type)
     1790{
     1791        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__unlock_USCOREobjectResponse);
     1792        if (soap_out_ns1__unlock_USCOREobjectResponse(soap, tag, id, a, type))
     1793                return soap->error;
     1794        return soap_putindependent(soap);
     1795}
     1796
     1797SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__unlock_USCOREobjectResponse(struct soap *soap, const char *tag, int id, const struct ns1__unlock_USCOREobjectResponse *a, const char *type)
     1798{
     1799        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__unlock_USCOREobjectResponse), type))
     1800                return soap->error;
     1801        if (soap_out_PointerToint(soap, "result", -1, &a->result, ""))
     1802                return soap->error;
     1803        return soap_element_end_out(soap, tag);
     1804}
     1805
     1806SOAP_FMAC3 struct ns1__unlock_USCOREobjectResponse * SOAP_FMAC4 soap_get_ns1__unlock_USCOREobjectResponse(struct soap *soap, struct ns1__unlock_USCOREobjectResponse *p, const char *tag, const char *type)
     1807{
     1808        if ((p = soap_in_ns1__unlock_USCOREobjectResponse(soap, tag, p, type)))
     1809                if (soap_getindependent(soap))
     1810                        return NULL;
     1811        return p;
     1812}
     1813
     1814SOAP_FMAC3 struct ns1__unlock_USCOREobjectResponse * SOAP_FMAC4 soap_in_ns1__unlock_USCOREobjectResponse(struct soap *soap, const char *tag, struct ns1__unlock_USCOREobjectResponse *a, const char *type)
     1815{
     1816        size_t soap_flag_result = 1;
     1817        if (soap_element_begin_in(soap, tag, 0, type))
     1818                return NULL;
     1819        a = (struct ns1__unlock_USCOREobjectResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__unlock_USCOREobjectResponse, sizeof(struct ns1__unlock_USCOREobjectResponse), 0, NULL, NULL, NULL);
     1820        if (!a)
     1821                return NULL;
     1822        soap_default_ns1__unlock_USCOREobjectResponse(soap, a);
    18831823        if (soap->body && !*soap->href)
    1884         {       for (;;)
     1824        {
     1825                for (;;)
    18851826                {       soap->error = SOAP_TAG_MISMATCH;
    1886                         if (soap_flag_key && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    1887                                 if (soap_in_string(soap, "key", &a->key, ""))
    1888                                 {       soap_flag_key = 0;
    1889                                         continue;
    1890                                 }
    1891                         if (soap_flag_type && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    1892                                 if (soap_in_string(soap, "type", &a->type, ""))
    1893                                 {       soap_flag_type = 0;
     1827                        if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH)
     1828                                if (soap_in_PointerToint(soap, "result", &a->result, "xsd:int"))
     1829                                {       soap_flag_result--;
    18941830                                        continue;
    18951831                                }
     
    19051841        }
    19061842        else
    1907         {       a = (struct ns1__lock_USCOREobject *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_ns1__lock_USCOREobject, 0, sizeof(struct ns1__lock_USCOREobject), 0, NULL);
    1908                 if (soap->body && soap_element_end_in(soap, tag))
    1909                         return NULL;
    1910         }
    1911         return a;
    1912 }
    1913 
    1914 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__lock_USCOREobjectResponse(struct soap *soap, const struct ns1__lock_USCOREobjectResponse *a)
    1915 {
    1916         (void)soap; (void)a; /* appease -Wall -Werror */
    1917         soap_embedded(soap, &a->result, SOAP_TYPE_PointerToint);
    1918         soap_serialize_PointerToint(soap, &a->result);
    1919 }
    1920 
    1921 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__lock_USCOREobjectResponse(struct soap *soap, struct ns1__lock_USCOREobjectResponse *a)
    1922 {
    1923         (void)soap; (void)a; /* appease -Wall -Werror */
    1924         a->result = NULL;
    1925 }
    1926 
    1927 SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__lock_USCOREobjectResponse(struct soap *soap, const struct ns1__lock_USCOREobjectResponse *a, const char *tag, const char *type)
    1928 {
    1929         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__lock_USCOREobjectResponse);
    1930         if (soap_out_ns1__lock_USCOREobjectResponse(soap, tag, id, a, type))
    1931                 return soap->error;
    1932         return soap_putindependent(soap);
    1933 }
    1934 
    1935 SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__lock_USCOREobjectResponse(struct soap *soap, const char *tag, int id, const struct ns1__lock_USCOREobjectResponse *a, const char *type)
    1936 {
    1937         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__lock_USCOREobjectResponse), type);
    1938         if (a->result)
    1939                 soap_element_result(soap, "result");
    1940         soap_out_PointerToint(soap, "result", -1, &a->result, "");
    1941         soap_element_end_out(soap, tag);
    1942         return SOAP_OK;
    1943 }
    1944 
    1945 SOAP_FMAC3 struct ns1__lock_USCOREobjectResponse * SOAP_FMAC4 soap_get_ns1__lock_USCOREobjectResponse(struct soap *soap, struct ns1__lock_USCOREobjectResponse *p, const char *tag, const char *type)
    1946 {
    1947         if ((p = soap_in_ns1__lock_USCOREobjectResponse(soap, tag, p, type)))
    1948                 soap_getindependent(soap);
    1949         return p;
    1950 }
    1951 
    1952 SOAP_FMAC3 struct ns1__lock_USCOREobjectResponse * SOAP_FMAC4 soap_in_ns1__lock_USCOREobjectResponse(struct soap *soap, const char *tag, struct ns1__lock_USCOREobjectResponse *a, const char *type)
    1953 {
    1954         short soap_flag_result = 1;
    1955         if (soap_element_begin_in(soap, tag, 0))
    1956                 return NULL;
    1957         if (*soap->type && soap_match_tag(soap, soap->type, type))
    1958         {       soap->error = SOAP_TYPE;
    1959                 return NULL;
    1960         }
    1961         a = (struct ns1__lock_USCOREobjectResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__lock_USCOREobjectResponse, sizeof(struct ns1__lock_USCOREobjectResponse), 0, NULL, NULL, NULL);
    1962         if (!a)
    1963                 return NULL;
    1964         if (soap->alloced)
    1965                 soap_default_ns1__lock_USCOREobjectResponse(soap, a);
     1843        {       a = (struct ns1__unlock_USCOREobjectResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns1__unlock_USCOREobjectResponse, 0, sizeof(struct ns1__unlock_USCOREobjectResponse), 0, NULL);
     1844                if (soap->body && soap_element_end_in(soap, tag))
     1845                        return NULL;
     1846        }
     1847        return a;
     1848}
     1849
     1850SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__lock_USCOREobject(struct soap *soap, struct ns1__lock_USCOREobject *a)
     1851{
     1852        (void)soap; (void)a; /* appease -Wall -Werror */
     1853        soap_default_string(soap, &a->key);
     1854        soap_default_string(soap, &a->type);
     1855}
     1856
     1857SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__lock_USCOREobject(struct soap *soap, const struct ns1__lock_USCOREobject *a)
     1858{
     1859        (void)soap; (void)a; /* appease -Wall -Werror */
     1860        soap_serialize_string(soap, &a->key);
     1861        soap_serialize_string(soap, &a->type);
     1862}
     1863
     1864SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__lock_USCOREobject(struct soap *soap, const struct ns1__lock_USCOREobject *a, const char *tag, const char *type)
     1865{
     1866        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__lock_USCOREobject);
     1867        if (soap_out_ns1__lock_USCOREobject(soap, tag, id, a, type))
     1868                return soap->error;
     1869        return soap_putindependent(soap);
     1870}
     1871
     1872SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__lock_USCOREobject(struct soap *soap, const char *tag, int id, const struct ns1__lock_USCOREobject *a, const char *type)
     1873{
     1874        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__lock_USCOREobject), type))
     1875                return soap->error;
     1876        if (soap_out_string(soap, "key", -1, &a->key, ""))
     1877                return soap->error;
     1878        if (soap_out_string(soap, "type", -1, &a->type, ""))
     1879                return soap->error;
     1880        return soap_element_end_out(soap, tag);
     1881}
     1882
     1883SOAP_FMAC3 struct ns1__lock_USCOREobject * SOAP_FMAC4 soap_get_ns1__lock_USCOREobject(struct soap *soap, struct ns1__lock_USCOREobject *p, const char *tag, const char *type)
     1884{
     1885        if ((p = soap_in_ns1__lock_USCOREobject(soap, tag, p, type)))
     1886                if (soap_getindependent(soap))
     1887                        return NULL;
     1888        return p;
     1889}
     1890
     1891SOAP_FMAC3 struct ns1__lock_USCOREobject * SOAP_FMAC4 soap_in_ns1__lock_USCOREobject(struct soap *soap, const char *tag, struct ns1__lock_USCOREobject *a, const char *type)
     1892{
     1893        size_t soap_flag_key = 1;
     1894        size_t soap_flag_type = 1;
     1895        if (soap_element_begin_in(soap, tag, 0, type))
     1896                return NULL;
     1897        a = (struct ns1__lock_USCOREobject *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__lock_USCOREobject, sizeof(struct ns1__lock_USCOREobject), 0, NULL, NULL, NULL);
     1898        if (!a)
     1899                return NULL;
     1900        soap_default_ns1__lock_USCOREobject(soap, a);
    19661901        if (soap->body && !*soap->href)
    1967         {       for (;;)
     1902        {
     1903                for (;;)
    19681904                {       soap->error = SOAP_TAG_MISMATCH;
    1969                         if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH)
    1970                                 if (soap_in_PointerToint(soap, "result", &a->result, ""))
    1971                                 {       soap_flag_result = 0;
     1905                        if (soap_flag_key && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
     1906                                if (soap_in_string(soap, "key", &a->key, "xsd:string"))
     1907                                {       soap_flag_key--;
     1908                                        continue;
     1909                                }
     1910                        if (soap_flag_type && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
     1911                                if (soap_in_string(soap, "type", &a->type, "xsd:string"))
     1912                                {       soap_flag_type--;
    19721913                                        continue;
    19731914                                }
     
    19831924        }
    19841925        else
    1985         {       a = (struct ns1__lock_USCOREobjectResponse *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_ns1__lock_USCOREobjectResponse, 0, sizeof(struct ns1__lock_USCOREobjectResponse), 0, NULL);
    1986                 if (soap->body && soap_element_end_in(soap, tag))
    1987                         return NULL;
    1988         }
    1989         return a;
    1990 }
    1991 
    1992 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__replicate_USCOREobject(struct soap *soap, const struct ns1__replicate_USCOREobject *a)
    1993 {
    1994         (void)soap; (void)a; /* appease -Wall -Werror */
    1995         soap_embedded(soap, &a->key, SOAP_TYPE_string);
    1996         soap_serialize_string(soap, &a->key);
    1997         soap_embedded(soap, &a->volume, SOAP_TYPE_string);
    1998         soap_serialize_string(soap, &a->volume);
    1999 }
    2000 
    2001 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__replicate_USCOREobject(struct soap *soap, struct ns1__replicate_USCOREobject *a)
    2002 {
    2003         (void)soap; (void)a; /* appease -Wall -Werror */
    2004         soap_default_string(soap, &a->key);
    2005         soap_default_string(soap, &a->volume);
    2006 }
    2007 
    2008 SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__replicate_USCOREobject(struct soap *soap, const struct ns1__replicate_USCOREobject *a, const char *tag, const char *type)
    2009 {
    2010         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__replicate_USCOREobject);
    2011         if (soap_out_ns1__replicate_USCOREobject(soap, tag, id, a, type))
    2012                 return soap->error;
    2013         return soap_putindependent(soap);
    2014 }
    2015 
    2016 SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__replicate_USCOREobject(struct soap *soap, const char *tag, int id, const struct ns1__replicate_USCOREobject *a, const char *type)
    2017 {
    2018         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__replicate_USCOREobject), type);
    2019         soap_out_string(soap, "key", -1, &a->key, "");
    2020         soap_out_string(soap, "volume", -1, &a->volume, "");
    2021         soap_element_end_out(soap, tag);
    2022         return SOAP_OK;
    2023 }
    2024 
    2025 SOAP_FMAC3 struct ns1__replicate_USCOREobject * SOAP_FMAC4 soap_get_ns1__replicate_USCOREobject(struct soap *soap, struct ns1__replicate_USCOREobject *p, const char *tag, const char *type)
    2026 {
    2027         if ((p = soap_in_ns1__replicate_USCOREobject(soap, tag, p, type)))
    2028                 soap_getindependent(soap);
    2029         return p;
    2030 }
    2031 
    2032 SOAP_FMAC3 struct ns1__replicate_USCOREobject * SOAP_FMAC4 soap_in_ns1__replicate_USCOREobject(struct soap *soap, const char *tag, struct ns1__replicate_USCOREobject *a, const char *type)
    2033 {
    2034         short soap_flag_key = 1, soap_flag_volume = 1;
    2035         if (soap_element_begin_in(soap, tag, 0))
    2036                 return NULL;
    2037         if (*soap->type && soap_match_tag(soap, soap->type, type))
    2038         {       soap->error = SOAP_TYPE;
    2039                 return NULL;
    2040         }
    2041         a = (struct ns1__replicate_USCOREobject *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__replicate_USCOREobject, sizeof(struct ns1__replicate_USCOREobject), 0, NULL, NULL, NULL);
    2042         if (!a)
    2043                 return NULL;
    2044         if (soap->alloced)
    2045                 soap_default_ns1__replicate_USCOREobject(soap, a);
     1926        {       a = (struct ns1__lock_USCOREobject *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns1__lock_USCOREobject, 0, sizeof(struct ns1__lock_USCOREobject), 0, NULL);
     1927                if (soap->body && soap_element_end_in(soap, tag))
     1928                        return NULL;
     1929        }
     1930        return a;
     1931}
     1932
     1933SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__lock_USCOREobjectResponse(struct soap *soap, struct ns1__lock_USCOREobjectResponse *a)
     1934{
     1935        (void)soap; (void)a; /* appease -Wall -Werror */
     1936        a->result = NULL;
     1937}
     1938
     1939SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__lock_USCOREobjectResponse(struct soap *soap, const struct ns1__lock_USCOREobjectResponse *a)
     1940{
     1941        (void)soap; (void)a; /* appease -Wall -Werror */
     1942        soap_serialize_PointerToint(soap, &a->result);
     1943}
     1944
     1945SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__lock_USCOREobjectResponse(struct soap *soap, const struct ns1__lock_USCOREobjectResponse *a, const char *tag, const char *type)
     1946{
     1947        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__lock_USCOREobjectResponse);
     1948        if (soap_out_ns1__lock_USCOREobjectResponse(soap, tag, id, a, type))
     1949                return soap->error;
     1950        return soap_putindependent(soap);
     1951}
     1952
     1953SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__lock_USCOREobjectResponse(struct soap *soap, const char *tag, int id, const struct ns1__lock_USCOREobjectResponse *a, const char *type)
     1954{
     1955        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__lock_USCOREobjectResponse), type))
     1956                return soap->error;
     1957        if (soap_out_PointerToint(soap, "result", -1, &a->result, ""))
     1958                return soap->error;
     1959        return soap_element_end_out(soap, tag);
     1960}
     1961
     1962SOAP_FMAC3 struct ns1__lock_USCOREobjectResponse * SOAP_FMAC4 soap_get_ns1__lock_USCOREobjectResponse(struct soap *soap, struct ns1__lock_USCOREobjectResponse *p, const char *tag, const char *type)
     1963{
     1964        if ((p = soap_in_ns1__lock_USCOREobjectResponse(soap, tag, p, type)))
     1965                if (soap_getindependent(soap))
     1966                        return NULL;
     1967        return p;
     1968}
     1969
     1970SOAP_FMAC3 struct ns1__lock_USCOREobjectResponse * SOAP_FMAC4 soap_in_ns1__lock_USCOREobjectResponse(struct soap *soap, const char *tag, struct ns1__lock_USCOREobjectResponse *a, const char *type)
     1971{
     1972        size_t soap_flag_result = 1;
     1973        if (soap_element_begin_in(soap, tag, 0, type))
     1974                return NULL;
     1975        a = (struct ns1__lock_USCOREobjectResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__lock_USCOREobjectResponse, sizeof(struct ns1__lock_USCOREobjectResponse), 0, NULL, NULL, NULL);
     1976        if (!a)
     1977                return NULL;
     1978        soap_default_ns1__lock_USCOREobjectResponse(soap, a);
    20461979        if (soap->body && !*soap->href)
    2047         {       for (;;)
     1980        {
     1981                for (;;)
    20481982                {       soap->error = SOAP_TAG_MISMATCH;
    2049                         if (soap_flag_key && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    2050                                 if (soap_in_string(soap, "key", &a->key, ""))
    2051                                 {       soap_flag_key = 0;
    2052                                         continue;
    2053                                 }
    2054                         if (soap_flag_volume && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    2055                                 if (soap_in_string(soap, "volume", &a->volume, ""))
    2056                                 {       soap_flag_volume = 0;
     1983                        if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH)
     1984                                if (soap_in_PointerToint(soap, "result", &a->result, "xsd:int"))
     1985                                {       soap_flag_result--;
    20571986                                        continue;
    20581987                                }
     
    20681997        }
    20691998        else
    2070         {       a = (struct ns1__replicate_USCOREobject *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_ns1__replicate_USCOREobject, 0, sizeof(struct ns1__replicate_USCOREobject), 0, NULL);
    2071                 if (soap->body && soap_element_end_in(soap, tag))
    2072                         return NULL;
    2073         }
    2074         return a;
    2075 }
    2076 
    2077 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__replicate_USCOREobjectResponse(struct soap *soap, const struct ns1__replicate_USCOREobjectResponse *a)
    2078 {
    2079         (void)soap; (void)a; /* appease -Wall -Werror */
    2080         soap_embedded(soap, &a->result, SOAP_TYPE_PointerTostring);
    2081         soap_serialize_PointerTostring(soap, &a->result);
    2082 }
    2083 
    2084 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__replicate_USCOREobjectResponse(struct soap *soap, struct ns1__replicate_USCOREobjectResponse *a)
    2085 {
    2086         (void)soap; (void)a; /* appease -Wall -Werror */
    2087         a->result = NULL;
    2088 }
    2089 
    2090 SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__replicate_USCOREobjectResponse(struct soap *soap, const struct ns1__replicate_USCOREobjectResponse *a, const char *tag, const char *type)
    2091 {
    2092         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__replicate_USCOREobjectResponse);
    2093         if (soap_out_ns1__replicate_USCOREobjectResponse(soap, tag, id, a, type))
    2094                 return soap->error;
    2095         return soap_putindependent(soap);
    2096 }
    2097 
    2098 SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__replicate_USCOREobjectResponse(struct soap *soap, const char *tag, int id, const struct ns1__replicate_USCOREobjectResponse *a, const char *type)
    2099 {
    2100         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__replicate_USCOREobjectResponse), type);
    2101         if (a->result)
    2102                 soap_element_result(soap, "result");
    2103         soap_out_PointerTostring(soap, "result", -1, &a->result, "");
    2104         soap_element_end_out(soap, tag);
    2105         return SOAP_OK;
    2106 }
    2107 
    2108 SOAP_FMAC3 struct ns1__replicate_USCOREobjectResponse * SOAP_FMAC4 soap_get_ns1__replicate_USCOREobjectResponse(struct soap *soap, struct ns1__replicate_USCOREobjectResponse *p, const char *tag, const char *type)
    2109 {
    2110         if ((p = soap_in_ns1__replicate_USCOREobjectResponse(soap, tag, p, type)))
    2111                 soap_getindependent(soap);
    2112         return p;
    2113 }
    2114 
    2115 SOAP_FMAC3 struct ns1__replicate_USCOREobjectResponse * SOAP_FMAC4 soap_in_ns1__replicate_USCOREobjectResponse(struct soap *soap, const char *tag, struct ns1__replicate_USCOREobjectResponse *a, const char *type)
    2116 {
    2117         short soap_flag_result = 1;
    2118         if (soap_element_begin_in(soap, tag, 0))
    2119                 return NULL;
    2120         if (*soap->type && soap_match_tag(soap, soap->type, type))
    2121         {       soap->error = SOAP_TYPE;
    2122                 return NULL;
    2123         }
    2124         a = (struct ns1__replicate_USCOREobjectResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__replicate_USCOREobjectResponse, sizeof(struct ns1__replicate_USCOREobjectResponse), 0, NULL, NULL, NULL);
    2125         if (!a)
    2126                 return NULL;
    2127         if (soap->alloced)
    2128                 soap_default_ns1__replicate_USCOREobjectResponse(soap, a);
     1999        {       a = (struct ns1__lock_USCOREobjectResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns1__lock_USCOREobjectResponse, 0, sizeof(struct ns1__lock_USCOREobjectResponse), 0, NULL);
     2000                if (soap->body && soap_element_end_in(soap, tag))
     2001                        return NULL;
     2002        }
     2003        return a;
     2004}
     2005
     2006SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__replicate_USCOREobject(struct soap *soap, struct ns1__replicate_USCOREobject *a)
     2007{
     2008        (void)soap; (void)a; /* appease -Wall -Werror */
     2009        soap_default_string(soap, &a->key);
     2010        soap_default_string(soap, &a->volume);
     2011}
     2012
     2013SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__replicate_USCOREobject(struct soap *soap, const struct ns1__replicate_USCOREobject *a)
     2014{
     2015        (void)soap; (void)a; /* appease -Wall -Werror */
     2016        soap_serialize_string(soap, &a->key);
     2017        soap_serialize_string(soap, &a->volume);
     2018}
     2019
     2020SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__replicate_USCOREobject(struct soap *soap, const struct ns1__replicate_USCOREobject *a, const char *tag, const char *type)
     2021{
     2022        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__replicate_USCOREobject);
     2023        if (soap_out_ns1__replicate_USCOREobject(soap, tag, id, a, type))
     2024                return soap->error;
     2025        return soap_putindependent(soap);
     2026}
     2027
     2028SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__replicate_USCOREobject(struct soap *soap, const char *tag, int id, const struct ns1__replicate_USCOREobject *a, const char *type)
     2029{
     2030        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__replicate_USCOREobject), type))
     2031                return soap->error;
     2032        if (soap_out_string(soap, "key", -1, &a->key, ""))
     2033                return soap->error;
     2034        if (soap_out_string(soap, "volume", -1, &a->volume, ""))
     2035                return soap->error;
     2036        return soap_element_end_out(soap, tag);
     2037}
     2038
     2039SOAP_FMAC3 struct ns1__replicate_USCOREobject * SOAP_FMAC4 soap_get_ns1__replicate_USCOREobject(struct soap *soap, struct ns1__replicate_USCOREobject *p, const char *tag, const char *type)
     2040{
     2041        if ((p = soap_in_ns1__replicate_USCOREobject(soap, tag, p, type)))
     2042                if (soap_getindependent(soap))
     2043                        return NULL;
     2044        return p;
     2045}
     2046
     2047SOAP_FMAC3 struct ns1__replicate_USCOREobject * SOAP_FMAC4 soap_in_ns1__replicate_USCOREobject(struct soap *soap, const char *tag, struct ns1__replicate_USCOREobject *a, const char *type)
     2048{
     2049        size_t soap_flag_key = 1;
     2050        size_t soap_flag_volume = 1;
     2051        if (soap_element_begin_in(soap, tag, 0, type))
     2052                return NULL;
     2053        a = (struct ns1__replicate_USCOREobject *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__replicate_USCOREobject, sizeof(struct ns1__replicate_USCOREobject), 0, NULL, NULL, NULL);
     2054        if (!a)
     2055                return NULL;
     2056        soap_default_ns1__replicate_USCOREobject(soap, a);
    21292057        if (soap->body && !*soap->href)
    2130         {       for (;;)
     2058        {
     2059                for (;;)
    21312060                {       soap->error = SOAP_TAG_MISMATCH;
    2132                         if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH)
    2133                                 if (soap_in_PointerTostring(soap, "result", &a->result, ""))
    2134                                 {       soap_flag_result = 0;
     2061                        if (soap_flag_key && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
     2062                                if (soap_in_string(soap, "key", &a->key, "xsd:string"))
     2063                                {       soap_flag_key--;
     2064                                        continue;
     2065                                }
     2066                        if (soap_flag_volume && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
     2067                                if (soap_in_string(soap, "volume", &a->volume, "xsd:string"))
     2068                                {       soap_flag_volume--;
    21352069                                        continue;
    21362070                                }
     
    21462080        }
    21472081        else
    2148         {       a = (struct ns1__replicate_USCOREobjectResponse *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_ns1__replicate_USCOREobjectResponse, 0, sizeof(struct ns1__replicate_USCOREobjectResponse), 0, NULL);
    2149                 if (soap->body && soap_element_end_in(soap, tag))
    2150                         return NULL;
    2151         }
    2152         return a;
    2153 }
    2154 
    2155 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__rename_USCOREobject_(struct soap *soap, const struct ns1__rename_USCOREobject_ *a)
    2156 {
    2157         (void)soap; (void)a; /* appease -Wall -Werror */
    2158         soap_embedded(soap, &a->key, SOAP_TYPE_string);
    2159         soap_serialize_string(soap, &a->key);
    2160         soap_embedded(soap, &a->newkey, SOAP_TYPE_string);
    2161         soap_serialize_string(soap, &a->newkey);
    2162 }
    2163 
    2164 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__rename_USCOREobject_(struct soap *soap, struct ns1__rename_USCOREobject_ *a)
    2165 {
    2166         (void)soap; (void)a; /* appease -Wall -Werror */
    2167         soap_default_string(soap, &a->key);
    2168         soap_default_string(soap, &a->newkey);
    2169 }
    2170 
    2171 SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__rename_USCOREobject_(struct soap *soap, const struct ns1__rename_USCOREobject_ *a, const char *tag, const char *type)
    2172 {
    2173         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__rename_USCOREobject_);
    2174         if (soap_out_ns1__rename_USCOREobject_(soap, tag, id, a, type))
    2175                 return soap->error;
    2176         return soap_putindependent(soap);
    2177 }
    2178 
    2179 SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__rename_USCOREobject_(struct soap *soap, const char *tag, int id, const struct ns1__rename_USCOREobject_ *a, const char *type)
    2180 {
    2181         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__rename_USCOREobject_), type);
    2182         soap_out_string(soap, "key", -1, &a->key, "");
    2183         soap_out_string(soap, "newkey", -1, &a->newkey, "");
    2184         soap_element_end_out(soap, tag);
    2185         return SOAP_OK;
    2186 }
    2187 
    2188 SOAP_FMAC3 struct ns1__rename_USCOREobject_ * SOAP_FMAC4 soap_get_ns1__rename_USCOREobject_(struct soap *soap, struct ns1__rename_USCOREobject_ *p, const char *tag, const char *type)
    2189 {
    2190         if ((p = soap_in_ns1__rename_USCOREobject_(soap, tag, p, type)))
    2191                 soap_getindependent(soap);
    2192         return p;
    2193 }
    2194 
    2195 SOAP_FMAC3 struct ns1__rename_USCOREobject_ * SOAP_FMAC4 soap_in_ns1__rename_USCOREobject_(struct soap *soap, const char *tag, struct ns1__rename_USCOREobject_ *a, const char *type)
    2196 {
    2197         short soap_flag_key = 1, soap_flag_newkey = 1;
    2198         if (soap_element_begin_in(soap, tag, 0))
    2199                 return NULL;
    2200         if (*soap->type && soap_match_tag(soap, soap->type, type))
    2201         {       soap->error = SOAP_TYPE;
    2202                 return NULL;
    2203         }
    2204         a = (struct ns1__rename_USCOREobject_ *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__rename_USCOREobject_, sizeof(struct ns1__rename_USCOREobject_), 0, NULL, NULL, NULL);
    2205         if (!a)
    2206                 return NULL;
    2207         if (soap->alloced)
    2208                 soap_default_ns1__rename_USCOREobject_(soap, a);
     2082        {       a = (struct ns1__replicate_USCOREobject *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns1__replicate_USCOREobject, 0, sizeof(struct ns1__replicate_USCOREobject), 0, NULL);
     2083                if (soap->body && soap_element_end_in(soap, tag))
     2084                        return NULL;
     2085        }
     2086        return a;
     2087}
     2088
     2089SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__replicate_USCOREobjectResponse(struct soap *soap, struct ns1__replicate_USCOREobjectResponse *a)
     2090{
     2091        (void)soap; (void)a; /* appease -Wall -Werror */
     2092        a->result = NULL;
     2093}
     2094
     2095SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__replicate_USCOREobjectResponse(struct soap *soap, const struct ns1__replicate_USCOREobjectResponse *a)
     2096{
     2097        (void)soap; (void)a; /* appease -Wall -Werror */
     2098        soap_serialize_PointerTostring(soap, &a->result);
     2099}
     2100
     2101SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__replicate_USCOREobjectResponse(struct soap *soap, const struct ns1__replicate_USCOREobjectResponse *a, const char *tag, const char *type)
     2102{
     2103        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__replicate_USCOREobjectResponse);
     2104        if (soap_out_ns1__replicate_USCOREobjectResponse(soap, tag, id, a, type))
     2105                return soap->error;
     2106        return soap_putindependent(soap);
     2107}
     2108
     2109SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__replicate_USCOREobjectResponse(struct soap *soap, const char *tag, int id, const struct ns1__replicate_USCOREobjectResponse *a, const char *type)
     2110{
     2111        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__replicate_USCOREobjectResponse), type))
     2112                return soap->error;
     2113        if (soap_out_PointerTostring(soap, "result", -1, &a->result, ""))
     2114                return soap->error;
     2115        return soap_element_end_out(soap, tag);
     2116}
     2117
     2118SOAP_FMAC3 struct ns1__replicate_USCOREobjectResponse * SOAP_FMAC4 soap_get_ns1__replicate_USCOREobjectResponse(struct soap *soap, struct ns1__replicate_USCOREobjectResponse *p, const char *tag, const char *type)
     2119{
     2120        if ((p = soap_in_ns1__replicate_USCOREobjectResponse(soap, tag, p, type)))
     2121                if (soap_getindependent(soap))
     2122                        return NULL;
     2123        return p;
     2124}
     2125
     2126SOAP_FMAC3 struct ns1__replicate_USCOREobjectResponse * SOAP_FMAC4 soap_in_ns1__replicate_USCOREobjectResponse(struct soap *soap, const char *tag, struct ns1__replicate_USCOREobjectResponse *a, const char *type)
     2127{
     2128        size_t soap_flag_result = 1;
     2129        if (soap_element_begin_in(soap, tag, 0, type))
     2130                return NULL;
     2131        a = (struct ns1__replicate_USCOREobjectResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__replicate_USCOREobjectResponse, sizeof(struct ns1__replicate_USCOREobjectResponse), 0, NULL, NULL, NULL);
     2132        if (!a)
     2133                return NULL;
     2134        soap_default_ns1__replicate_USCOREobjectResponse(soap, a);
    22092135        if (soap->body && !*soap->href)
    2210         {       for (;;)
     2136        {
     2137                for (;;)
    22112138                {       soap->error = SOAP_TAG_MISMATCH;
    2212                         if (soap_flag_key && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    2213                                 if (soap_in_string(soap, "key", &a->key, ""))
    2214                                 {       soap_flag_key = 0;
    2215                                         continue;
    2216                                 }
    2217                         if (soap_flag_newkey && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    2218                                 if (soap_in_string(soap, "newkey", &a->newkey, ""))
    2219                                 {       soap_flag_newkey = 0;
     2139                        if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH)
     2140                                if (soap_in_PointerTostring(soap, "result", &a->result, "xsd:string"))
     2141                                {       soap_flag_result--;
    22202142                                        continue;
    22212143                                }
     
    22312153        }
    22322154        else
    2233         {       a = (struct ns1__rename_USCOREobject_ *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_ns1__rename_USCOREobject_, 0, sizeof(struct ns1__rename_USCOREobject_), 0, NULL);
    2234                 if (soap->body && soap_element_end_in(soap, tag))
    2235                         return NULL;
    2236         }
    2237         return a;
    2238 }
    2239 
    2240 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__rename_USCOREobject_Response(struct soap *soap, const struct ns1__rename_USCOREobject_Response *a)
    2241 {
    2242         (void)soap; (void)a; /* appease -Wall -Werror */
    2243         soap_embedded(soap, &a->result, SOAP_TYPE_PointerTostring);
    2244         soap_serialize_PointerTostring(soap, &a->result);
    2245 }
    2246 
    2247 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__rename_USCOREobject_Response(struct soap *soap, struct ns1__rename_USCOREobject_Response *a)
    2248 {
    2249         (void)soap; (void)a; /* appease -Wall -Werror */
    2250         a->result = NULL;
    2251 }
    2252 
    2253 SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__rename_USCOREobject_Response(struct soap *soap, const struct ns1__rename_USCOREobject_Response *a, const char *tag, const char *type)
    2254 {
    2255         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__rename_USCOREobject_Response);
    2256         if (soap_out_ns1__rename_USCOREobject_Response(soap, tag, id, a, type))
    2257                 return soap->error;
    2258         return soap_putindependent(soap);
    2259 }
    2260 
    2261 SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__rename_USCOREobject_Response(struct soap *soap, const char *tag, int id, const struct ns1__rename_USCOREobject_Response *a, const char *type)
    2262 {
    2263         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__rename_USCOREobject_Response), type);
    2264         if (a->result)
    2265                 soap_element_result(soap, "result");
    2266         soap_out_PointerTostring(soap, "result", -1, &a->result, "");
    2267         soap_element_end_out(soap, tag);
    2268         return SOAP_OK;
    2269 }
    2270 
    2271 SOAP_FMAC3 struct ns1__rename_USCOREobject_Response * SOAP_FMAC4 soap_get_ns1__rename_USCOREobject_Response(struct soap *soap, struct ns1__rename_USCOREobject_Response *p, const char *tag, const char *type)
    2272 {
    2273         if ((p = soap_in_ns1__rename_USCOREobject_Response(soap, tag, p, type)))
    2274                 soap_getindependent(soap);
    2275         return p;
    2276 }
    2277 
    2278 SOAP_FMAC3 struct ns1__rename_USCOREobject_Response * SOAP_FMAC4 soap_in_ns1__rename_USCOREobject_Response(struct soap *soap, const char *tag, struct ns1__rename_USCOREobject_Response *a, const char *type)
    2279 {
    2280         short soap_flag_result = 1;
    2281         if (soap_element_begin_in(soap, tag, 0))
    2282                 return NULL;
    2283         if (*soap->type && soap_match_tag(soap, soap->type, type))
    2284         {       soap->error = SOAP_TYPE;
    2285                 return NULL;
    2286         }
    2287         a = (struct ns1__rename_USCOREobject_Response *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__rename_USCOREobject_Response, sizeof(struct ns1__rename_USCOREobject_Response), 0, NULL, NULL, NULL);
    2288         if (!a)
    2289                 return NULL;
    2290         if (soap->alloced)
    2291                 soap_default_ns1__rename_USCOREobject_Response(soap, a);
     2155        {       a = (struct ns1__replicate_USCOREobjectResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns1__replicate_USCOREobjectResponse, 0, sizeof(struct ns1__replicate_USCOREobjectResponse), 0, NULL);
     2156                if (soap->body && soap_element_end_in(soap, tag))
     2157                        return NULL;
     2158        }
     2159        return a;
     2160}
     2161
     2162SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__rename_USCOREobject_(struct soap *soap, struct ns1__rename_USCOREobject_ *a)
     2163{
     2164        (void)soap; (void)a; /* appease -Wall -Werror */
     2165        soap_default_string(soap, &a->key);
     2166        soap_default_string(soap, &a->newkey);
     2167}
     2168
     2169SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__rename_USCOREobject_(struct soap *soap, const struct ns1__rename_USCOREobject_ *a)
     2170{
     2171        (void)soap; (void)a; /* appease -Wall -Werror */
     2172        soap_serialize_string(soap, &a->key);
     2173        soap_serialize_string(soap, &a->newkey);
     2174}
     2175
     2176SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__rename_USCOREobject_(struct soap *soap, const struct ns1__rename_USCOREobject_ *a, const char *tag, const char *type)
     2177{
     2178        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__rename_USCOREobject_);
     2179        if (soap_out_ns1__rename_USCOREobject_(soap, tag, id, a, type))
     2180                return soap->error;
     2181        return soap_putindependent(soap);
     2182}
     2183
     2184SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__rename_USCOREobject_(struct soap *soap, const char *tag, int id, const struct ns1__rename_USCOREobject_ *a, const char *type)
     2185{
     2186        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__rename_USCOREobject_), type))
     2187                return soap->error;
     2188        if (soap_out_string(soap, "key", -1, &a->key, ""))
     2189                return soap->error;
     2190        if (soap_out_string(soap, "newkey", -1, &a->newkey, ""))
     2191                return soap->error;
     2192        return soap_element_end_out(soap, tag);
     2193}
     2194
     2195SOAP_FMAC3 struct ns1__rename_USCOREobject_ * SOAP_FMAC4 soap_get_ns1__rename_USCOREobject_(struct soap *soap, struct ns1__rename_USCOREobject_ *p, const char *tag, const char *type)
     2196{
     2197        if ((p = soap_in_ns1__rename_USCOREobject_(soap, tag, p, type)))
     2198                if (soap_getindependent(soap))
     2199                        return NULL;
     2200        return p;
     2201}
     2202
     2203SOAP_FMAC3 struct ns1__rename_USCOREobject_ * SOAP_FMAC4 soap_in_ns1__rename_USCOREobject_(struct soap *soap, const char *tag, struct ns1__rename_USCOREobject_ *a, const char *type)
     2204{
     2205        size_t soap_flag_key = 1;
     2206        size_t soap_flag_newkey = 1;
     2207        if (soap_element_begin_in(soap, tag, 0, type))
     2208                return NULL;
     2209        a = (struct ns1__rename_USCOREobject_ *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__rename_USCOREobject_, sizeof(struct ns1__rename_USCOREobject_), 0, NULL, NULL, NULL);
     2210        if (!a)
     2211                return NULL;
     2212        soap_default_ns1__rename_USCOREobject_(soap, a);
    22922213        if (soap->body && !*soap->href)
    2293         {       for (;;)
     2214        {
     2215                for (;;)
    22942216                {       soap->error = SOAP_TAG_MISMATCH;
    2295                         if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH)
    2296                                 if (soap_in_PointerTostring(soap, "result", &a->result, ""))
    2297                                 {       soap_flag_result = 0;
     2217                        if (soap_flag_key && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
     2218                                if (soap_in_string(soap, "key", &a->key, "xsd:string"))
     2219                                {       soap_flag_key--;
     2220                                        continue;
     2221                                }
     2222                        if (soap_flag_newkey && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
     2223                                if (soap_in_string(soap, "newkey", &a->newkey, "xsd:string"))
     2224                                {       soap_flag_newkey--;
    22982225                                        continue;
    22992226                                }
     
    23092236        }
    23102237        else
    2311         {       a = (struct ns1__rename_USCOREobject_Response *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_ns1__rename_USCOREobject_Response, 0, sizeof(struct ns1__rename_USCOREobject_Response), 0, NULL);
    2312                 if (soap->body && soap_element_end_in(soap, tag))
    2313                         return NULL;
    2314         }
    2315         return a;
    2316 }
    2317 
    2318 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__rename_USCOREobject(struct soap *soap, const struct ns1__rename_USCOREobject *a)
    2319 {
    2320         (void)soap; (void)a; /* appease -Wall -Werror */
    2321         soap_embedded(soap, &a->key, SOAP_TYPE_string);
    2322         soap_serialize_string(soap, &a->key);
    2323         soap_embedded(soap, &a->newkey, SOAP_TYPE_string);
    2324         soap_serialize_string(soap, &a->newkey);
    2325 }
    2326 
    2327 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__rename_USCOREobject(struct soap *soap, struct ns1__rename_USCOREobject *a)
    2328 {
    2329         (void)soap; (void)a; /* appease -Wall -Werror */
    2330         soap_default_string(soap, &a->key);
    2331         soap_default_string(soap, &a->newkey);
    2332 }
    2333 
    2334 SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__rename_USCOREobject(struct soap *soap, const struct ns1__rename_USCOREobject *a, const char *tag, const char *type)
    2335 {
    2336         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__rename_USCOREobject);
    2337         if (soap_out_ns1__rename_USCOREobject(soap, tag, id, a, type))
    2338                 return soap->error;
    2339         return soap_putindependent(soap);
    2340 }
    2341 
    2342 SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__rename_USCOREobject(struct soap *soap, const char *tag, int id, const struct ns1__rename_USCOREobject *a, const char *type)
    2343 {
    2344         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__rename_USCOREobject), type);
    2345         soap_out_string(soap, "key", -1, &a->key, "");
    2346         soap_out_string(soap, "newkey", -1, &a->newkey, "");
    2347         soap_element_end_out(soap, tag);
    2348         return SOAP_OK;
    2349 }
    2350 
    2351 SOAP_FMAC3 struct ns1__rename_USCOREobject * SOAP_FMAC4 soap_get_ns1__rename_USCOREobject(struct soap *soap, struct ns1__rename_USCOREobject *p, const char *tag, const char *type)
    2352 {
    2353         if ((p = soap_in_ns1__rename_USCOREobject(soap, tag, p, type)))
    2354                 soap_getindependent(soap);
    2355         return p;
    2356 }
    2357 
    2358 SOAP_FMAC3 struct ns1__rename_USCOREobject * SOAP_FMAC4 soap_in_ns1__rename_USCOREobject(struct soap *soap, const char *tag, struct ns1__rename_USCOREobject *a, const char *type)
    2359 {
    2360         short soap_flag_key = 1, soap_flag_newkey = 1;
    2361         if (soap_element_begin_in(soap, tag, 0))
    2362                 return NULL;
    2363         if (*soap->type && soap_match_tag(soap, soap->type, type))
    2364         {       soap->error = SOAP_TYPE;
    2365                 return NULL;
    2366         }
    2367         a = (struct ns1__rename_USCOREobject *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__rename_USCOREobject, sizeof(struct ns1__rename_USCOREobject), 0, NULL, NULL, NULL);
    2368         if (!a)
    2369                 return NULL;
    2370         if (soap->alloced)
    2371                 soap_default_ns1__rename_USCOREobject(soap, a);
     2238        {       a = (struct ns1__rename_USCOREobject_ *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns1__rename_USCOREobject_, 0, sizeof(struct ns1__rename_USCOREobject_), 0, NULL);
     2239                if (soap->body && soap_element_end_in(soap, tag))
     2240                        return NULL;
     2241        }
     2242        return a;
     2243}
     2244
     2245SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__rename_USCOREobject_Response(struct soap *soap, struct ns1__rename_USCOREobject_Response *a)
     2246{
     2247        (void)soap; (void)a; /* appease -Wall -Werror */
     2248        a->result = NULL;
     2249}
     2250
     2251SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__rename_USCOREobject_Response(struct soap *soap, const struct ns1__rename_USCOREobject_Response *a)
     2252{
     2253        (void)soap; (void)a; /* appease -Wall -Werror */
     2254        soap_serialize_PointerTostring(soap, &a->result);
     2255}
     2256
     2257SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__rename_USCOREobject_Response(struct soap *soap, const struct ns1__rename_USCOREobject_Response *a, const char *tag, const char *type)
     2258{
     2259        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__rename_USCOREobject_Response);
     2260        if (soap_out_ns1__rename_USCOREobject_Response(soap, tag, id, a, type))
     2261                return soap->error;
     2262        return soap_putindependent(soap);
     2263}
     2264
     2265SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__rename_USCOREobject_Response(struct soap *soap, const char *tag, int id, const struct ns1__rename_USCOREobject_Response *a, const char *type)
     2266{
     2267        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__rename_USCOREobject_Response), type))
     2268                return soap->error;
     2269        if (soap_out_PointerTostring(soap, "result", -1, &a->result, ""))
     2270                return soap->error;
     2271        return soap_element_end_out(soap, tag);
     2272}
     2273
     2274SOAP_FMAC3 struct ns1__rename_USCOREobject_Response * SOAP_FMAC4 soap_get_ns1__rename_USCOREobject_Response(struct soap *soap, struct ns1__rename_USCOREobject_Response *p, const char *tag, const char *type)
     2275{
     2276        if ((p = soap_in_ns1__rename_USCOREobject_Response(soap, tag, p, type)))
     2277                if (soap_getindependent(soap))
     2278                        return NULL;
     2279        return p;
     2280}
     2281
     2282SOAP_FMAC3 struct ns1__rename_USCOREobject_Response * SOAP_FMAC4 soap_in_ns1__rename_USCOREobject_Response(struct soap *soap, const char *tag, struct ns1__rename_USCOREobject_Response *a, const char *type)
     2283{
     2284        size_t soap_flag_result = 1;
     2285        if (soap_element_begin_in(soap, tag, 0, type))
     2286                return NULL;
     2287        a = (struct ns1__rename_USCOREobject_Response *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__rename_USCOREobject_Response, sizeof(struct ns1__rename_USCOREobject_Response), 0, NULL, NULL, NULL);
     2288        if (!a)
     2289                return NULL;
     2290        soap_default_ns1__rename_USCOREobject_Response(soap, a);
    23722291        if (soap->body && !*soap->href)
    2373         {       for (;;)
     2292        {
     2293                for (;;)
    23742294                {       soap->error = SOAP_TAG_MISMATCH;
    2375                         if (soap_flag_key && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    2376                                 if (soap_in_string(soap, "key", &a->key, ""))
    2377                                 {       soap_flag_key = 0;
    2378                                         continue;
    2379                                 }
    2380                         if (soap_flag_newkey && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    2381                                 if (soap_in_string(soap, "newkey", &a->newkey, ""))
    2382                                 {       soap_flag_newkey = 0;
     2295                        if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH)
     2296                                if (soap_in_PointerTostring(soap, "result", &a->result, "xsd:string"))
     2297                                {       soap_flag_result--;
    23832298                                        continue;
    23842299                                }
     
    23942309        }
    23952310        else
    2396         {       a = (struct ns1__rename_USCOREobject *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_ns1__rename_USCOREobject, 0, sizeof(struct ns1__rename_USCOREobject), 0, NULL);
    2397                 if (soap->body && soap_element_end_in(soap, tag))
    2398                         return NULL;
    2399         }
    2400         return a;
    2401 }
    2402 
    2403 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__rename_USCOREobjectResponse(struct soap *soap, const struct ns1__rename_USCOREobjectResponse *a)
    2404 {
    2405         (void)soap; (void)a; /* appease -Wall -Werror */
    2406         soap_embedded(soap, &a->result, SOAP_TYPE_PointerTostring);
    2407         soap_serialize_PointerTostring(soap, &a->result);
    2408 }
    2409 
    2410 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__rename_USCOREobjectResponse(struct soap *soap, struct ns1__rename_USCOREobjectResponse *a)
    2411 {
    2412         (void)soap; (void)a; /* appease -Wall -Werror */
    2413         a->result = NULL;
    2414 }
    2415 
    2416 SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__rename_USCOREobjectResponse(struct soap *soap, const struct ns1__rename_USCOREobjectResponse *a, const char *tag, const char *type)
    2417 {
    2418         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__rename_USCOREobjectResponse);
    2419         if (soap_out_ns1__rename_USCOREobjectResponse(soap, tag, id, a, type))
    2420                 return soap->error;
    2421         return soap_putindependent(soap);
    2422 }
    2423 
    2424 SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__rename_USCOREobjectResponse(struct soap *soap, const char *tag, int id, const struct ns1__rename_USCOREobjectResponse *a, const char *type)
    2425 {
    2426         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__rename_USCOREobjectResponse), type);
    2427         if (a->result)
    2428                 soap_element_result(soap, "result");
    2429         soap_out_PointerTostring(soap, "result", -1, &a->result, "");
    2430         soap_element_end_out(soap, tag);
    2431         return SOAP_OK;
    2432 }
    2433 
    2434 SOAP_FMAC3 struct ns1__rename_USCOREobjectResponse * SOAP_FMAC4 soap_get_ns1__rename_USCOREobjectResponse(struct soap *soap, struct ns1__rename_USCOREobjectResponse *p, const char *tag, const char *type)
    2435 {
    2436         if ((p = soap_in_ns1__rename_USCOREobjectResponse(soap, tag, p, type)))
    2437                 soap_getindependent(soap);
    2438         return p;
    2439 }
    2440 
    2441 SOAP_FMAC3 struct ns1__rename_USCOREobjectResponse * SOAP_FMAC4 soap_in_ns1__rename_USCOREobjectResponse(struct soap *soap, const char *tag, struct ns1__rename_USCOREobjectResponse *a, const char *type)
    2442 {
    2443         short soap_flag_result = 1;
    2444         if (soap_element_begin_in(soap, tag, 0))
    2445                 return NULL;
    2446         if (*soap->type && soap_match_tag(soap, soap->type, type))
    2447         {       soap->error = SOAP_TYPE;
    2448                 return NULL;
    2449         }
    2450         a = (struct ns1__rename_USCOREobjectResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__rename_USCOREobjectResponse, sizeof(struct ns1__rename_USCOREobjectResponse), 0, NULL, NULL, NULL);
    2451         if (!a)
    2452                 return NULL;
    2453         if (soap->alloced)
    2454                 soap_default_ns1__rename_USCOREobjectResponse(soap, a);
     2311        {       a = (struct ns1__rename_USCOREobject_Response *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns1__rename_USCOREobject_Response, 0, sizeof(struct ns1__rename_USCOREobject_Response), 0, NULL);
     2312                if (soap->body && soap_element_end_in(soap, tag))
     2313                        return NULL;
     2314        }
     2315        return a;
     2316}
     2317
     2318SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__rename_USCOREobject(struct soap *soap, struct ns1__rename_USCOREobject *a)
     2319{
     2320        (void)soap; (void)a; /* appease -Wall -Werror */
     2321        soap_default_string(soap, &a->key);
     2322        soap_default_string(soap, &a->newkey);
     2323}
     2324
     2325SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__rename_USCOREobject(struct soap *soap, const struct ns1__rename_USCOREobject *a)
     2326{
     2327        (void)soap; (void)a; /* appease -Wall -Werror */
     2328        soap_serialize_string(soap, &a->key);
     2329        soap_serialize_string(soap, &a->newkey);
     2330}
     2331
     2332SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__rename_USCOREobject(struct soap *soap, const struct ns1__rename_USCOREobject *a, const char *tag, const char *type)
     2333{
     2334        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__rename_USCOREobject);
     2335        if (soap_out_ns1__rename_USCOREobject(soap, tag, id, a, type))
     2336                return soap->error;
     2337        return soap_putindependent(soap);
     2338}
     2339
     2340SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__rename_USCOREobject(struct soap *soap, const char *tag, int id, const struct ns1__rename_USCOREobject *a, const char *type)
     2341{
     2342        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__rename_USCOREobject), type))
     2343                return soap->error;
     2344        if (soap_out_string(soap, "key", -1, &a->key, ""))
     2345                return soap->error;
     2346        if (soap_out_string(soap, "newkey", -1, &a->newkey, ""))
     2347                return soap->error;
     2348        return soap_element_end_out(soap, tag);
     2349}
     2350
     2351SOAP_FMAC3 struct ns1__rename_USCOREobject * SOAP_FMAC4 soap_get_ns1__rename_USCOREobject(struct soap *soap, struct ns1__rename_USCOREobject *p, const char *tag, const char *type)
     2352{
     2353        if ((p = soap_in_ns1__rename_USCOREobject(soap, tag, p, type)))
     2354                if (soap_getindependent(soap))
     2355                        return NULL;
     2356        return p;
     2357}
     2358
     2359SOAP_FMAC3 struct ns1__rename_USCOREobject * SOAP_FMAC4 soap_in_ns1__rename_USCOREobject(struct soap *soap, const char *tag, struct ns1__rename_USCOREobject *a, const char *type)
     2360{
     2361        size_t soap_flag_key = 1;
     2362        size_t soap_flag_newkey = 1;
     2363        if (soap_element_begin_in(soap, tag, 0, type))
     2364                return NULL;
     2365        a = (struct ns1__rename_USCOREobject *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__rename_USCOREobject, sizeof(struct ns1__rename_USCOREobject), 0, NULL, NULL, NULL);
     2366        if (!a)
     2367                return NULL;
     2368        soap_default_ns1__rename_USCOREobject(soap, a);
    24552369        if (soap->body && !*soap->href)
    2456         {       for (;;)
     2370        {
     2371                for (;;)
    24572372                {       soap->error = SOAP_TAG_MISMATCH;
    2458                         if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH)
    2459                                 if (soap_in_PointerTostring(soap, "result", &a->result, ""))
    2460                                 {       soap_flag_result = 0;
     2373                        if (soap_flag_key && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
     2374                                if (soap_in_string(soap, "key", &a->key, "xsd:string"))
     2375                                {       soap_flag_key--;
     2376                                        continue;
     2377                                }
     2378                        if (soap_flag_newkey && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
     2379                                if (soap_in_string(soap, "newkey", &a->newkey, "xsd:string"))
     2380                                {       soap_flag_newkey--;
    24612381                                        continue;
    24622382                                }
     
    24722392        }
    24732393        else
    2474         {       a = (struct ns1__rename_USCOREobjectResponse *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_ns1__rename_USCOREobjectResponse, 0, sizeof(struct ns1__rename_USCOREobjectResponse), 0, NULL);
    2475                 if (soap->body && soap_element_end_in(soap, tag))
    2476                         return NULL;
    2477         }
    2478         return a;
    2479 }
    2480 
    2481 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__create_USCOREobject(struct soap *soap, const struct ns1__create_USCOREobject *a)
    2482 {
    2483         (void)soap; (void)a; /* appease -Wall -Werror */
    2484         soap_embedded(soap, &a->key, SOAP_TYPE_string);
    2485         soap_serialize_string(soap, &a->key);
    2486         soap_embedded(soap, &a->volume, SOAP_TYPE_string);
    2487         soap_serialize_string(soap, &a->volume);
    2488 }
    2489 
    2490 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__create_USCOREobject(struct soap *soap, struct ns1__create_USCOREobject *a)
    2491 {
    2492         (void)soap; (void)a; /* appease -Wall -Werror */
    2493         soap_default_string(soap, &a->key);
    2494         soap_default_string(soap, &a->volume);
    2495 }
    2496 
    2497 SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__create_USCOREobject(struct soap *soap, const struct ns1__create_USCOREobject *a, const char *tag, const char *type)
    2498 {
    2499         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__create_USCOREobject);
    2500         if (soap_out_ns1__create_USCOREobject(soap, tag, id, a, type))
    2501                 return soap->error;
    2502         return soap_putindependent(soap);
    2503 }
    2504 
    2505 SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__create_USCOREobject(struct soap *soap, const char *tag, int id, const struct ns1__create_USCOREobject *a, const char *type)
    2506 {
    2507         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__create_USCOREobject), type);
    2508         soap_out_string(soap, "key", -1, &a->key, "");
    2509         soap_out_string(soap, "volume", -1, &a->volume, "");
    2510         soap_element_end_out(soap, tag);
    2511         return SOAP_OK;
    2512 }
    2513 
    2514 SOAP_FMAC3 struct ns1__create_USCOREobject * SOAP_FMAC4 soap_get_ns1__create_USCOREobject(struct soap *soap, struct ns1__create_USCOREobject *p, const char *tag, const char *type)
    2515 {
    2516         if ((p = soap_in_ns1__create_USCOREobject(soap, tag, p, type)))
    2517                 soap_getindependent(soap);
    2518         return p;
    2519 }
    2520 
    2521 SOAP_FMAC3 struct ns1__create_USCOREobject * SOAP_FMAC4 soap_in_ns1__create_USCOREobject(struct soap *soap, const char *tag, struct ns1__create_USCOREobject *a, const char *type)
    2522 {
    2523         short soap_flag_key = 1, soap_flag_volume = 1;
    2524         if (soap_element_begin_in(soap, tag, 0))
    2525                 return NULL;
    2526         if (*soap->type && soap_match_tag(soap, soap->type, type))
    2527         {       soap->error = SOAP_TYPE;
    2528                 return NULL;
    2529         }
    2530         a = (struct ns1__create_USCOREobject *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__create_USCOREobject, sizeof(struct ns1__create_USCOREobject), 0, NULL, NULL, NULL);
    2531         if (!a)
    2532                 return NULL;
    2533         if (soap->alloced)
    2534                 soap_default_ns1__create_USCOREobject(soap, a);
     2394        {       a = (struct ns1__rename_USCOREobject *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns1__rename_USCOREobject, 0, sizeof(struct ns1__rename_USCOREobject), 0, NULL);
     2395                if (soap->body && soap_element_end_in(soap, tag))
     2396                        return NULL;
     2397        }
     2398        return a;
     2399}
     2400
     2401SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__rename_USCOREobjectResponse(struct soap *soap, struct ns1__rename_USCOREobjectResponse *a)
     2402{
     2403        (void)soap; (void)a; /* appease -Wall -Werror */
     2404        a->result = NULL;
     2405}
     2406
     2407SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__rename_USCOREobjectResponse(struct soap *soap, const struct ns1__rename_USCOREobjectResponse *a)
     2408{
     2409        (void)soap; (void)a; /* appease -Wall -Werror */
     2410        soap_serialize_PointerTostring(soap, &a->result);
     2411}
     2412
     2413SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__rename_USCOREobjectResponse(struct soap *soap, const struct ns1__rename_USCOREobjectResponse *a, const char *tag, const char *type)
     2414{
     2415        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__rename_USCOREobjectResponse);
     2416        if (soap_out_ns1__rename_USCOREobjectResponse(soap, tag, id, a, type))
     2417                return soap->error;
     2418        return soap_putindependent(soap);
     2419}
     2420
     2421SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__rename_USCOREobjectResponse(struct soap *soap, const char *tag, int id, const struct ns1__rename_USCOREobjectResponse *a, const char *type)
     2422{
     2423        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__rename_USCOREobjectResponse), type))
     2424                return soap->error;
     2425        if (soap_out_PointerTostring(soap, "result", -1, &a->result, ""))
     2426                return soap->error;
     2427        return soap_element_end_out(soap, tag);
     2428}
     2429
     2430SOAP_FMAC3 struct ns1__rename_USCOREobjectResponse * SOAP_FMAC4 soap_get_ns1__rename_USCOREobjectResponse(struct soap *soap, struct ns1__rename_USCOREobjectResponse *p, const char *tag, const char *type)
     2431{
     2432        if ((p = soap_in_ns1__rename_USCOREobjectResponse(soap, tag, p, type)))
     2433                if (soap_getindependent(soap))
     2434                        return NULL;
     2435        return p;
     2436}
     2437
     2438SOAP_FMAC3 struct ns1__rename_USCOREobjectResponse * SOAP_FMAC4 soap_in_ns1__rename_USCOREobjectResponse(struct soap *soap, const char *tag, struct ns1__rename_USCOREobjectResponse *a, const char *type)
     2439{
     2440        size_t soap_flag_result = 1;
     2441        if (soap_element_begin_in(soap, tag, 0, type))
     2442                return NULL;
     2443        a = (struct ns1__rename_USCOREobjectResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__rename_USCOREobjectResponse, sizeof(struct ns1__rename_USCOREobjectResponse), 0, NULL, NULL, NULL);
     2444        if (!a)
     2445                return NULL;
     2446        soap_default_ns1__rename_USCOREobjectResponse(soap, a);
    25352447        if (soap->body && !*soap->href)
    2536         {       for (;;)
     2448        {
     2449                for (;;)
    25372450                {       soap->error = SOAP_TAG_MISMATCH;
    2538                         if (soap_flag_key && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    2539                                 if (soap_in_string(soap, "key", &a->key, ""))
    2540                                 {       soap_flag_key = 0;
    2541                                         continue;
    2542                                 }
    2543                         if (soap_flag_volume && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
    2544                                 if (soap_in_string(soap, "volume", &a->volume, ""))
    2545                                 {       soap_flag_volume = 0;
     2451                        if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH)
     2452                                if (soap_in_PointerTostring(soap, "result", &a->result, "xsd:string"))
     2453                                {       soap_flag_result--;
    25462454                                        continue;
    25472455                                }
     
    25572465        }
    25582466        else
    2559         {       a = (struct ns1__create_USCOREobject *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_ns1__create_USCOREobject, 0, sizeof(struct ns1__create_USCOREobject), 0, NULL);
    2560                 if (soap->body && soap_element_end_in(soap, tag))
    2561                         return NULL;
    2562         }
    2563         return a;
    2564 }
    2565 
    2566 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__create_USCOREobjectResponse(struct soap *soap, const struct ns1__create_USCOREobjectResponse *a)
    2567 {
    2568         (void)soap; (void)a; /* appease -Wall -Werror */
    2569         soap_embedded(soap, &a->result, SOAP_TYPE_PointerTostring);
    2570         soap_serialize_PointerTostring(soap, &a->result);
    2571 }
    2572 
    2573 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__create_USCOREobjectResponse(struct soap *soap, struct ns1__create_USCOREobjectResponse *a)
    2574 {
    2575         (void)soap; (void)a; /* appease -Wall -Werror */
    2576         a->result = NULL;
    2577 }
    2578 
    2579 SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__create_USCOREobjectResponse(struct soap *soap, const struct ns1__create_USCOREobjectResponse *a, const char *tag, const char *type)
    2580 {
    2581         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__create_USCOREobjectResponse);
    2582         if (soap_out_ns1__create_USCOREobjectResponse(soap, tag, id, a, type))
    2583                 return soap->error;
    2584         return soap_putindependent(soap);
    2585 }
    2586 
    2587 SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__create_USCOREobjectResponse(struct soap *soap, const char *tag, int id, const struct ns1__create_USCOREobjectResponse *a, const char *type)
    2588 {
    2589         soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__create_USCOREobjectResponse), type);
    2590         if (a->result)
    2591                 soap_element_result(soap, "result");
    2592         soap_out_PointerTostring(soap, "result", -1, &a->result, "");
    2593         soap_element_end_out(soap, tag);
    2594         return SOAP_OK;
    2595 }
    2596 
    2597 SOAP_FMAC3 struct ns1__create_USCOREobjectResponse * SOAP_FMAC4 soap_get_ns1__create_USCOREobjectResponse(struct soap *soap, struct ns1__create_USCOREobjectResponse *p, const char *tag, const char *type)
    2598 {
    2599         if ((p = soap_in_ns1__create_USCOREobjectResponse(soap, tag, p, type)))
    2600                 soap_getindependent(soap);
    2601         return p;
    2602 }
    2603 
    2604 SOAP_FMAC3 struct ns1__create_USCOREobjectResponse * SOAP_FMAC4 soap_in_ns1__create_USCOREobjectResponse(struct soap *soap, const char *tag, struct ns1__create_USCOREobjectResponse *a, const char *type)
    2605 {
    2606         short soap_flag_result = 1;
    2607         if (soap_element_begin_in(soap, tag, 0))
    2608                 return NULL;
    2609         if (*soap->type && soap_match_tag(soap, soap->type, type))
    2610         {       soap->error = SOAP_TYPE;
    2611                 return NULL;
    2612         }
    2613         a = (struct ns1__create_USCOREobjectResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__create_USCOREobjectResponse, sizeof(struct ns1__create_USCOREobjectResponse), 0, NULL, NULL, NULL);
    2614         if (!a)
    2615                 return NULL;
    2616         if (soap->alloced)
    2617                 soap_default_ns1__create_USCOREobjectResponse(soap, a);
     2467        {       a = (struct ns1__rename_USCOREobjectResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns1__rename_USCOREobjectResponse, 0, sizeof(struct ns1__rename_USCOREobjectResponse), 0, NULL);
     2468                if (soap->body && soap_element_end_in(soap, tag))
     2469                        return NULL;
     2470        }
     2471        return a;
     2472}
     2473
     2474SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__create_USCOREobject(struct soap *soap, struct ns1__create_USCOREobject *a)
     2475{
     2476        (void)soap; (void)a; /* appease -Wall -Werror */
     2477        soap_default_string(soap, &a->key);
     2478        soap_default_string(soap, &a->volume);
     2479}
     2480
     2481SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__create_USCOREobject(struct soap *soap, const struct ns1__create_USCOREobject *a)
     2482{
     2483        (void)soap; (void)a; /* appease -Wall -Werror */
     2484        soap_serialize_string(soap, &a->key);
     2485        soap_serialize_string(soap, &a->volume);
     2486}
     2487
     2488SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__create_USCOREobject(struct soap *soap, const struct ns1__create_USCOREobject *a, const char *tag, const char *type)
     2489{
     2490        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__create_USCOREobject);
     2491        if (soap_out_ns1__create_USCOREobject(soap, tag, id, a, type))
     2492                return soap->error;
     2493        return soap_putindependent(soap);
     2494}
     2495
     2496SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__create_USCOREobject(struct soap *soap, const char *tag, int id, const struct ns1__create_USCOREobject *a, const char *type)
     2497{
     2498        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__create_USCOREobject), type))
     2499                return soap->error;
     2500        if (soap_out_string(soap, "key", -1, &a->key, ""))
     2501                return soap->error;
     2502        if (soap_out_string(soap, "volume", -1, &a->volume, ""))
     2503                return soap->error;
     2504        return soap_element_end_out(soap, tag);
     2505}
     2506
     2507SOAP_FMAC3 struct ns1__create_USCOREobject * SOAP_FMAC4 soap_get_ns1__create_USCOREobject(struct soap *soap, struct ns1__create_USCOREobject *p, const char *tag, const char *type)
     2508{
     2509        if ((p = soap_in_ns1__create_USCOREobject(soap, tag, p, type)))
     2510                if (soap_getindependent(soap))
     2511                        return NULL;
     2512        return p;
     2513}
     2514
     2515SOAP_FMAC3 struct ns1__create_USCOREobject * SOAP_FMAC4 soap_in_ns1__create_USCOREobject(struct soap *soap, const char *tag, struct ns1__create_USCOREobject *a, const char *type)
     2516{
     2517        size_t soap_flag_key = 1;
     2518        size_t soap_flag_volume = 1;
     2519        if (soap_element_begin_in(soap, tag, 0, type))
     2520                return NULL;
     2521        a = (struct ns1__create_USCOREobject *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__create_USCOREobject, sizeof(struct ns1__create_USCOREobject), 0, NULL, NULL, NULL);
     2522        if (!a)
     2523                return NULL;
     2524        soap_default_ns1__create_USCOREobject(soap, a);
    26182525        if (soap->body && !*soap->href)
    2619         {       for (;;)
     2526        {
     2527                for (;;)
    26202528                {       soap->error = SOAP_TAG_MISMATCH;
    2621                         if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH)
    2622                                 if (soap_in_PointerTostring(soap, "result", &a->result, ""))
    2623                                 {       soap_flag_result = 0;
     2529                        if (soap_flag_key && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
     2530                                if (soap_in_string(soap, "key", &a->key, "xsd:string"))
     2531                                {       soap_flag_key--;
     2532                                        continue;
     2533                                }
     2534                        if (soap_flag_volume && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
     2535                                if (soap_in_string(soap, "volume", &a->volume, "xsd:string"))
     2536                                {       soap_flag_volume--;
    26242537                                        continue;
    26252538                                }
     
    26352548        }
    26362549        else
    2637         {       a = (struct ns1__create_USCOREobjectResponse *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_ns1__create_USCOREobjectResponse, 0, sizeof(struct ns1__create_USCOREobjectResponse), 0, NULL);
    2638                 if (soap->body && soap_element_end_in(soap, tag))
    2639                         return NULL;
    2640         }
    2641         return a;
     2550        {       a = (struct ns1__create_USCOREobject *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns1__create_USCOREobject, 0, sizeof(struct ns1__create_USCOREobject), 0, NULL);
     2551                if (soap->body && soap_element_end_in(soap, tag))
     2552                        return NULL;
     2553        }
     2554        return a;
     2555}
     2556
     2557SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__create_USCOREobjectResponse(struct soap *soap, struct ns1__create_USCOREobjectResponse *a)
     2558{
     2559        (void)soap; (void)a; /* appease -Wall -Werror */
     2560        a->result = NULL;
     2561}
     2562
     2563SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__create_USCOREobjectResponse(struct soap *soap, const struct ns1__create_USCOREobjectResponse *a)
     2564{
     2565        (void)soap; (void)a; /* appease -Wall -Werror */
     2566        soap_serialize_PointerTostring(soap, &a->result);
     2567}
     2568
     2569SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__create_USCOREobjectResponse(struct soap *soap, const struct ns1__create_USCOREobjectResponse *a, const char *tag, const char *type)
     2570{
     2571        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns1__create_USCOREobjectResponse);
     2572        if (soap_out_ns1__create_USCOREobjectResponse(soap, tag, id, a, type))
     2573                return soap->error;
     2574        return soap_putindependent(soap);
     2575}
     2576
     2577SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__create_USCOREobjectResponse(struct soap *soap, const char *tag, int id, const struct ns1__create_USCOREobjectResponse *a, const char *type)
     2578{
     2579        if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__create_USCOREobjectResponse), type))
     2580                return soap->error;
     2581        if (soap_out_PointerTostring(soap, "result", -1, &a->result, ""))
     2582                return soap->error;
     2583        return soap_element_end_out(soap, tag);
     2584}
     2585
     2586SOAP_FMAC3 struct ns1__create_USCOREobjectResponse * SOAP_FMAC4 soap_get_ns1__create_USCOREobjectResponse(struct soap *soap, struct ns1__create_USCOREobjectResponse *p, const char *tag, const char *type)
     2587{
     2588        if ((p = soap_in_ns1__create_USCOREobjectResponse(soap, tag, p, type)))
     2589                if (soap_getindependent(soap))
     2590                        return NULL;
     2591        return p;
     2592}
     2593
     2594SOAP_FMAC3 struct ns1__create_USCOREobjectResponse * SOAP_FMAC4 soap_in_ns1__create_USCOREobjectResponse(struct soap *soap, const char *tag, struct ns1__create_USCOREobjectResponse *a, const char *type)
     2595{
     2596        size_t soap_flag_result = 1;
     2597        if (soap_element_begin_in(soap, tag, 0, type))
     2598                return NULL;
     2599        a = (struct ns1__create_USCOREobjectResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__create_USCOREobjectResponse, sizeof(struct ns1__create_USCOREobjectResponse), 0, NULL, NULL, NULL);
     2600        if (!a)
     2601                return NULL;
     2602        soap_default_ns1__create_USCOREobjectResponse(soap, a);
     2603        if (soap->body && !*soap->href)
     2604        {
     2605                for (;;)
     2606                {       soap->error = SOAP_TAG_MISMATCH;
     2607                        if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH)
     2608                                if (soap_in_PointerTostring(soap, "result", &a->result, "xsd:string"))
     2609                                {       soap_flag_result--;
     2610                                        continue;
     2611                                }
     2612                        if (soap->error == SOAP_TAG_MISMATCH)
     2613                                soap->error = soap_ignore_element(soap);
     2614                        if (soap->error == SOAP_NO_TAG)
     2615                                break;
     2616                        if (soap->error)
     2617                                return NULL;
     2618                }
     2619                if (soap_element_end_in(soap, tag))
     2620                        return NULL;
     2621        }
     2622        else
     2623        {       a = (struct ns1__create_USCOREobjectResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns1__create_USCOREobjectResponse, 0, sizeof(struct ns1__create_USCOREobjectResponse), 0, NULL);
     2624                if (soap->body && soap_element_end_in(soap, tag))
     2625                        return NULL;
     2626        }
     2627        return a;
     2628}
     2629
     2630SOAP_FMAC3 void SOAP_FMAC4 soap_default_ArrayOfString(struct soap *soap, struct ArrayOfString *a)
     2631{
     2632        a->__size = 0;
     2633        a->__ptr = NULL;
    26422634}
    26432635
     
    26472639        if (a->__ptr && !soap_array_reference(soap, a, (struct soap_array*)&a->__ptr, 1, SOAP_TYPE_ArrayOfString))
    26482640                for (i = 0; i < a->__size; i++)
    2649                 {       soap_embedded(soap, a->__ptr + i, SOAP_TYPE_string);
     2641                {
    26502642                        soap_serialize_string(soap, a->__ptr + i);
    26512643                }
    2652 }
    2653 
    2654 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ArrayOfString(struct soap *soap, struct ArrayOfString *a)
    2655 {
    2656         a->__size = 0;
    2657         a->__ptr = NULL;
    26582644}
    26592645
     
    26692655{
    26702656        int i, n = a->__size;
    2671         char *t = soap_putsize(soap, "xsd:string", n);
     2657        char *t = soap_putsize(soap, "xsd:string", a->__size);
    26722658        id = soap_element_id(soap, tag, id, a, (struct soap_array*)&a->__ptr, 1, type, SOAP_TYPE_ArrayOfString);
    26732659        if (id < 0)
    26742660                return soap->error;
    2675         soap_array_begin_out(soap, tag, id, t, NULL);
     2661        if (soap_array_begin_out(soap, tag, id, t, NULL))
     2662                return soap->error;
    26762663        for (i = 0; i < n; i++)
    26772664        {
     
    26812668        }
    26822669        soap->position = 0;
    2683         soap_element_end_out(soap, tag);
    2684         return SOAP_OK;
     2670        return soap_element_end_out(soap, tag);
    26852671}
    26862672
     
    26882674{
    26892675        if ((p = soap_in_ArrayOfString(soap, tag, p, type)))
    2690                 soap_getindependent(soap);
     2676                if (soap_getindependent(soap))
     2677                        return NULL;
    26912678        return p;
    26922679}
     
    26952682{       int i, j;
    26962683        char **p;
    2697         if (soap_element_begin_in(soap, tag, 1))
     2684        if (soap_element_begin_in(soap, tag, 1, NULL))
    26982685                return NULL;
    26992686        if (soap_match_array(soap, type))
     
    27042691        if (!a)
    27052692                return NULL;
    2706         if (soap->alloced)
    2707                 soap_default_ArrayOfString(soap, a);
     2693        soap_default_ArrayOfString(soap, a);
    27082694        if (soap->body && !*soap->href)
    27092695        {
     
    27222708                                        }
    27232709                                }
    2724                                 if (!soap_in_string(soap, NULL, a->__ptr + i, ""))
     2710                                if (!soap_in_string(soap, NULL, a->__ptr + i, "xsd:string"))
    27252711                                {       if (soap->error != SOAP_NO_TAG)
    27262712                                                return NULL;
     
    27312717                }
    27322718                else
    2733                 {       soap_new_block(soap);
     2719                {       if (soap_new_block(soap) == NULL)
     2720                                return NULL;
    27342721                        for (a->__size = 0; ; a->__size++)
    2735                         {       p = (char **)soap_push_block(soap, sizeof(char *));
     2722                        {       p = (char **)soap_push_block(soap, NULL, sizeof(char *));
    27362723                                if (!p)
    27372724                                        return NULL;
    27382725                                *p = NULL;
    2739                                 if (!soap_in_string(soap, NULL, p, ""))
     2726                                if (!soap_in_string(soap, NULL, p, "xsd:string"))
    27402727                                {       if (soap->error != SOAP_NO_TAG)
    27412728                                                return NULL;
     
    27442731                                }
    27452732                        }
    2746                         soap_pop_block(soap);
     2733                        soap_pop_block(soap, NULL);
    27472734                        a->__ptr = (char **)soap_malloc(soap, soap->blist->size);
    2748                         soap_save_block(soap, (char*)a->__ptr, 0);
     2735                        soap_save_block(soap, NULL, (char*)a->__ptr, 1);
    27492736                }
    27502737                if (soap_element_end_in(soap, tag))
     
    27522739        }
    27532740        else
    2754         {       a = (struct ArrayOfString *)soap_id_forward(soap, soap->href, (void**)a, SOAP_TYPE_ArrayOfString, 0, sizeof(struct ArrayOfString), 0, NULL);
    2755                 if (soap->body && soap_element_end_in(soap, tag))
    2756                         return NULL;
    2757         }
    2758         return a;
    2759 }
     2741        {       a = (struct ArrayOfString *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ArrayOfString, 0, sizeof(struct ArrayOfString), 0, NULL);
     2742                if (soap->body && soap_element_end_in(soap, tag))
     2743                        return NULL;
     2744        }
     2745        return a;
     2746}
     2747
     2748#ifndef WITH_NOGLOBAL
     2749
     2750SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *const*a)
     2751{
     2752        if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Reason))
     2753                soap_serialize_SOAP_ENV__Reason(soap, *a);
     2754}
     2755
     2756SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *const*a, const char *tag, const char *type)
     2757{
     2758        register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToSOAP_ENV__Reason);
     2759        if (soap_out_PointerToSOAP_ENV__Reason(soap, tag, id, a, type))
     2760                return soap->error;
     2761        return soap_putindependent(soap);
     2762}
     2763
     2764SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Reason(struct soap *soap, const char *tag, int id, struct SOAP_ENV__Reason *const*a, const char *type)
     2765{
     2766        id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_SOAP_ENV__Reason);
     2767        if (id < 0)
     2768                return soap->error;
     2769        return soap_out_SOAP_ENV__Reason(soap, tag, id, *a, type);
     2770}
     2771
     2772SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason **p, const char *tag, const char *type)
     2773{
     2774        if ((p = soap_in_PointerToSOAP_ENV__Reason(soap, tag, p, type)))
     2775                if (soap_getindependent(soap))
     2776                        return NULL;
     2777        return p;
     2778}
     2779
     2780SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Reason(struct soap *soap, const char *tag, struct SOAP_ENV__Reason **a, const char *type)
     2781{
     2782        if (soap_element_begin_in(soap, tag, 1, NULL))
     2783                return NULL;
     2784        if (!a)
     2785                if (!(a = (struct SOAP_ENV__Reason **)soap_malloc(soap, sizeof(struct SOAP_ENV__Reason *))))
     2786                        return NULL;
     2787        *a = NULL;
     2788        if (!soap->null && *soap->href != '#')
     2789        {       soap_revert(soap);
     2790                if (!(*a = soap_in_SOAP_ENV__Reason(soap, tag, *a, type)))
     2791                        return NULL;
     2792        }
     2793        else
     2794        {       a = (struct SOAP_ENV__Reason **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Reason, sizeof(struct SOAP_ENV__Reason), 0);
     2795                if (soap->body && soap_element_end_in(soap, tag))
     2796                        return NULL;
     2797        }
     2798        return a;
     2799}
     2800
     2801#endif
    27602802
    27612803#ifndef WITH_NOGLOBAL
     
    27862828{
    27872829        if ((p = soap_in_PointerToSOAP_ENV__Detail(soap, tag, p, type)))
    2788                 soap_getindependent(soap);
     2830                if (soap_getindependent(soap))
     2831                        return NULL;
    27892832        return p;
    27902833}
     
    27922835SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Detail(struct soap *soap, const char *tag, struct SOAP_ENV__Detail **a, const char *type)
    27932836{
    2794         if (soap_element_begin_in(soap, tag, 1))
     2837        if (soap_element_begin_in(soap, tag, 1, NULL))
    27952838                return NULL;
    27962839        if (!a)
     
    28402883{
    28412884        if ((p = soap_in_PointerToSOAP_ENV__Code(soap, tag, p, type)))
    2842                 soap_getindependent(soap);
     2885                if (soap_getindependent(soap))
     2886                        return NULL;
    28432887        return p;
    28442888}
     
    28462890SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Code(struct soap *soap, const char *tag, struct SOAP_ENV__Code **a, const char *type)
    28472891{
    2848         if (soap_element_begin_in(soap, tag, 1))
     2892        if (soap_element_begin_in(soap, tag, 1, NULL))
    28492893                return NULL;
    28502894        if (!a)
     
    28922936{
    28932937        if ((p = soap_in_PointerTons1__stat_USCOREobjectResponse(soap, tag, p, type)))
    2894                 soap_getindependent(soap);
     2938                if (soap_getindependent(soap))
     2939                        return NULL;
    28952940        return p;
    28962941}
     
    28982943SOAP_FMAC3 struct ns1__stat_USCOREobjectResponse ** SOAP_FMAC4 soap_in_PointerTons1__stat_USCOREobjectResponse(struct soap *soap, const char *tag, struct ns1__stat_USCOREobjectResponse **a, const char *type)
    28992944{
    2900         if (soap_element_begin_in(soap, tag, 1))
     2945        if (soap_element_begin_in(soap, tag, 1, NULL))
    29012946                return NULL;
    29022947        if (!a)
     
    29422987{
    29432988        if ((p = soap_in_PointerTons1__find_USCOREinstancesResponse(soap, tag, p, type)))
    2944                 soap_getindependent(soap);
     2989                if (soap_getindependent(soap))
     2990                        return NULL;
    29452991        return p;
    29462992}
     
    29482994SOAP_FMAC3 struct ns1__find_USCOREinstancesResponse ** SOAP_FMAC4 soap_in_PointerTons1__find_USCOREinstancesResponse(struct soap *soap, const char *tag, struct ns1__find_USCOREinstancesResponse **a, const char *type)
    29492995{
    2950         if (soap_element_begin_in(soap, tag, 1))
     2996        if (soap_element_begin_in(soap, tag, 1, NULL))
    29512997                return NULL;
    29522998        if (!a)
     
    29923038{
    29933039        if ((p = soap_in_PointerTons1__find_USCOREobjectsResponse(soap, tag, p, type)))
    2994                 soap_getindependent(soap);
     3040                if (soap_getindependent(soap))
     3041                        return NULL;
    29953042        return p;
    29963043}
     
    29983045SOAP_FMAC3 struct ns1__find_USCOREobjectsResponse ** SOAP_FMAC4 soap_in_PointerTons1__find_USCOREobjectsResponse(struct soap *soap, const char *tag, struct ns1__find_USCOREobjectsResponse **a, const char *type)
    29993046{
    3000         if (soap_element_begin_in(soap, tag, 1))
     3047        if (soap_element_begin_in(soap, tag, 1, NULL))
    30013048                return NULL;
    30023049        if (!a)
     
    30423089{
    30433090        if ((p = soap_in_PointerToArrayOfString(soap, tag, p, type)))
    3044                 soap_getindependent(soap);
     3091                if (soap_getindependent(soap))
     3092                        return NULL;
    30453093        return p;
    30463094}
     
    30483096SOAP_FMAC3 struct ArrayOfString ** SOAP_FMAC4 soap_in_PointerToArrayOfString(struct soap *soap, const char *tag, struct ArrayOfString **a, const char *type)
    30493097{
    3050         if (soap_element_begin_in(soap, tag, 1))
     3098        if (soap_element_begin_in(soap, tag, 1, NULL))
    30513099                return NULL;
    30523100        if (!a)
     
    30913139{
    30923140        if ((p = soap_in_PointerToint(soap, tag, p, type)))
    3093                 soap_getindependent(soap);
     3141                if (soap_getindependent(soap))
     3142                        return NULL;
    30943143        return p;
    30953144}
     
    30973146SOAP_FMAC3 int ** SOAP_FMAC4 soap_in_PointerToint(struct soap *soap, const char *tag, int **a, const char *type)
    30983147{
    3099         if (soap_element_begin_in(soap, tag, 1))
     3148        if (soap_element_begin_in(soap, tag, 1, NULL))
    31003149                return NULL;
    31013150        if (!a)
     
    31413190{
    31423191        if ((p = soap_in_PointerTostring(soap, tag, p, type)))
    3143                 soap_getindependent(soap);
     3192                if (soap_getindependent(soap))
     3193                        return NULL;
    31443194        return p;
    31453195}
     
    31473197SOAP_FMAC3 char *** SOAP_FMAC4 soap_in_PointerTostring(struct soap *soap, const char *tag, char ***a, const char *type)
    31483198{
    3149         if (soap_element_begin_in(soap, tag, 1))
     3199        if (soap_element_begin_in(soap, tag, 1, NULL))
    31503200                return NULL;
    31513201        if (!a)
     
    31663216}
    31673217
    3168 SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENC__arrayType(struct soap *soap, char **a)
    3169 {       soap_default_string(soap, a);
    3170 }
    3171 
    3172 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENC__arrayType(struct soap *soap, char *const*a)
    3173 {       soap_serialize_string(soap, a);
    3174 }
    3175 
    3176 SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENC__arrayType(struct soap *soap, char *const*a, const char *tag, const char *type)
    3177 {
    3178         register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENC__arrayType);
    3179         if (soap_out_SOAP_ENC__arrayType(soap, tag, id, a, type))
    3180                 return soap->error;
    3181         return soap_putindependent(soap);
    3182 }
    3183 
    3184 SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENC__arrayType(struct soap *soap, const char *tag, int id, char *const*a, const char *type)
    3185 {
    3186         return soap_outstring(soap, tag, id, a, type, SOAP_TYPE_SOAP_ENC__arrayType);
    3187 }
    3188 
    3189 SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_SOAP_ENC__arrayType(struct soap *soap, char **p, const char *tag, const char *type)
    3190 {
    3191         if ((p = soap_in_SOAP_ENC__arrayType(soap, tag, p, type)))
    3192                 soap_getindependent(soap);
    3193         return p;
    3194 }
    3195 
    3196 SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_SOAP_ENC__arrayType(struct soap *soap, const char *tag, char **a, const char *type)
    3197 {
    3198         return soap_instring(soap, tag, a, type, SOAP_TYPE_SOAP_ENC__arrayType, 1, 0, -1);
    3199 }
    3200 
    32013218SOAP_FMAC3 void SOAP_FMAC4 soap_default__QName(struct soap *soap, char **a)
    32023219{       soap_default_string(soap, a);
     
    32233240{
    32243241        if ((p = soap_in__QName(soap, tag, p, type)))
    3225                 soap_getindependent(soap);
     3242                if (soap_getindependent(soap))
     3243                        return NULL;
    32263244        return p;
    32273245}
     
    32293247SOAP_FMAC3 char * * SOAP_FMAC4 soap_in__QName(struct soap *soap, const char *tag, char **a, const char *type)
    32303248{
    3231         return soap_instring(soap, tag, a, type, SOAP_TYPE__QName, 2, 0, -1);
     3249        return soap_instring(soap, tag, a, type, SOAP_TYPE__QName, 2, -1, -1);
    32323250}
    32333251
    32343252SOAP_FMAC3 void SOAP_FMAC4 soap_default_string(struct soap *soap, char **a)
    3235 {
    3236 (void)soap; /* appease -Wall -Werror */
     3253{       (void)soap; /* appease -Wall -Werror */
    32373254#ifdef SOAP_DEFAULT_string
    32383255        *a = SOAP_DEFAULT_string;
     
    32633280{
    32643281        if ((p = soap_in_string(soap, tag, p, type)))
    3265                 soap_getindependent(soap);
     3282                if (soap_getindependent(soap))
     3283                        return NULL;
    32663284        return p;
    32673285}
     
    32693287SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_string(struct soap *soap, const char *tag, char **a, const char *type)
    32703288{
    3271         return soap_instring(soap, tag, a, type, SOAP_TYPE_string, 1, 0, -1);
    3272 }
    3273 
    3274 SOAP_END_NAMESPACE(soap)
     3289        return soap_instring(soap, tag, a, type, SOAP_TYPE_string, 1, -1, -1);
     3290}
    32753291
    32763292#ifdef __cplusplus
  • trunk/Nebulous/nebclient/src/soapClient.c

    r13096 r19542  
    11/* soapClient.c
    2    Generated by gSOAP 2.7.2 from src/nebulous.h
    3    Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc. All Rights Reserved.
     2   Generated by gSOAP 2.7.11 from src/nebulous.h
     3   Copyright(C) 2000-2008, Robert van Engelen, Genivia Inc. All Rights Reserved.
    44   This part of the software is released under one of the following licenses:
    55   GPL, the gSOAP public license, or Genivia's license for commercial use.
     
    1010#endif
    1111
    12 SOAP_BEGIN_NAMESPACE(soap)
    13 
    14 SOAP_SOURCE_STAMP("@(#) soapClient.c ver 2.7.2 2007-05-01 02:53:36 GMT")
     12SOAP_SOURCE_STAMP("@(#) soapClient.c ver 2.7.11 2008-09-13 01:14:39 GMT")
    1513
    1614
     
    2826        soap_serializeheader(soap);
    2927        soap_serialize_ns1__create_USCOREobject(soap, &soap_tmp_ns1__create_USCOREobject);
    30         soap_begin_count(soap);
    31         if (soap->mode & SOAP_IO_LENGTH)
    32         {       soap_envelope_begin_out(soap);
    33                 soap_putheader(soap);
    34                 soap_body_begin_out(soap);
    35                 soap_put_ns1__create_USCOREobject(soap, &soap_tmp_ns1__create_USCOREobject, "ns1:create_object", "");
    36                 soap_body_end_out(soap);
    37                 soap_envelope_end_out(soap);
    38         }
     28        if (soap_begin_count(soap))
     29                return soap->error;
     30        if (soap->mode & SOAP_IO_LENGTH)
     31        {       if (soap_envelope_begin_out(soap)
     32                 || soap_putheader(soap)
     33                 || soap_body_begin_out(soap)
     34                 || soap_put_ns1__create_USCOREobject(soap, &soap_tmp_ns1__create_USCOREobject, "ns1:create_object", "")
     35                 || soap_body_end_out(soap)
     36                 || soap_envelope_end_out(soap))
     37                         return soap->error;
     38        }
     39        if (soap_end_count(soap))
     40                return soap->error;
    3941        if (soap_connect(soap, soap_endpoint, soap_action)
    4042         || soap_envelope_begin_out(soap)
     
    4648         || soap_end_send(soap))
    4749                return soap_closesock(soap);
     50        if (!result)
     51                return soap_closesock(soap);
    4852        *result = NULL;
    4953        if (soap_begin_recv(soap)
     
    6064        if (soap_body_end_in(soap)
    6165         || soap_envelope_end_in(soap)
    62 #ifndef WITH_LEANER
    63          || soap_resolve_attachments(soap)
    64 #endif
    6566         || soap_end_recv(soap))
    6667                return soap_closesock(soap);
     
    8384        soap_serializeheader(soap);
    8485        soap_serialize_ns1__rename_USCOREobject(soap, &soap_tmp_ns1__rename_USCOREobject);
    85         soap_begin_count(soap);
    86         if (soap->mode & SOAP_IO_LENGTH)
    87         {       soap_envelope_begin_out(soap);
    88                 soap_putheader(soap);
    89                 soap_body_begin_out(soap);
    90                 soap_put_ns1__rename_USCOREobject(soap, &soap_tmp_ns1__rename_USCOREobject, "ns1:rename_object", "");
    91                 soap_body_end_out(soap);
    92                 soap_envelope_end_out(soap);
    93         }
     86        if (soap_begin_count(soap))
     87                return soap->error;
     88        if (soap->mode & SOAP_IO_LENGTH)
     89        {       if (soap_envelope_begin_out(soap)
     90                 || soap_putheader(soap)
     91                 || soap_body_begin_out(soap)
     92                 || soap_put_ns1__rename_USCOREobject(soap, &soap_tmp_ns1__rename_USCOREobject, "ns1:rename_object", "")
     93                 || soap_body_end_out(soap)
     94                 || soap_envelope_end_out(soap))
     95                         return soap->error;
     96        }
     97        if (soap_end_count(soap))
     98                return soap->error;
    9499        if (soap_connect(soap, soap_endpoint, soap_action)
    95100         || soap_envelope_begin_out(soap)
     
    101106         || soap_end_send(soap))
    102107                return soap_closesock(soap);
     108        if (!result)
     109                return soap_closesock(soap);
    103110        *result = NULL;
    104111        if (soap_begin_recv(soap)
     
    115122        if (soap_body_end_in(soap)
    116123         || soap_envelope_end_in(soap)
    117 #ifndef WITH_LEANER
    118          || soap_resolve_attachments(soap)
    119 #endif
    120124         || soap_end_recv(soap))
    121125                return soap_closesock(soap);
     
    138142        soap_serializeheader(soap);
    139143        soap_serialize_ns1__rename_USCOREobject_(soap, &soap_tmp_ns1__rename_USCOREobject_);
    140         soap_begin_count(soap);
    141         if (soap->mode & SOAP_IO_LENGTH)
    142         {       soap_envelope_begin_out(soap);
    143                 soap_putheader(soap);
    144                 soap_body_begin_out(soap);
    145                 soap_put_ns1__rename_USCOREobject_(soap, &soap_tmp_ns1__rename_USCOREobject_, "ns1:rename_object", "");
    146                 soap_body_end_out(soap);
    147                 soap_envelope_end_out(soap);
    148         }
     144        if (soap_begin_count(soap))
     145                return soap->error;
     146        if (soap->mode & SOAP_IO_LENGTH)
     147        {       if (soap_envelope_begin_out(soap)
     148                 || soap_putheader(soap)
     149                 || soap_body_begin_out(soap)
     150                 || soap_put_ns1__rename_USCOREobject_(soap, &soap_tmp_ns1__rename_USCOREobject_, "ns1:rename_object", "")
     151                 || soap_body_end_out(soap)
     152                 || soap_envelope_end_out(soap))
     153                         return soap->error;
     154        }
     155        if (soap_end_count(soap))
     156                return soap->error;
    149157        if (soap_connect(soap, soap_endpoint, soap_action)
    150158         || soap_envelope_begin_out(soap)
     
    156164         || soap_end_send(soap))
    157165                return soap_closesock(soap);
     166        if (!result)
     167                return soap_closesock(soap);
    158168        *result = NULL;
    159169        if (soap_begin_recv(soap)
     
    170180        if (soap_body_end_in(soap)
    171181         || soap_envelope_end_in(soap)
    172 #ifndef WITH_LEANER
    173          || soap_resolve_attachments(soap)
    174 #endif
    175182         || soap_end_recv(soap))
    176183                return soap_closesock(soap);
     
    193200        soap_serializeheader(soap);
    194201        soap_serialize_ns1__replicate_USCOREobject(soap, &soap_tmp_ns1__replicate_USCOREobject);
    195         soap_begin_count(soap);
    196         if (soap->mode & SOAP_IO_LENGTH)
    197         {       soap_envelope_begin_out(soap);
    198                 soap_putheader(soap);
    199                 soap_body_begin_out(soap);
    200                 soap_put_ns1__replicate_USCOREobject(soap, &soap_tmp_ns1__replicate_USCOREobject, "ns1:replicate_object", "");
    201                 soap_body_end_out(soap);
    202                 soap_envelope_end_out(soap);
    203         }
     202        if (soap_begin_count(soap))
     203                return soap->error;
     204        if (soap->mode & SOAP_IO_LENGTH)
     205        {       if (soap_envelope_begin_out(soap)
     206                 || soap_putheader(soap)
     207                 || soap_body_begin_out(soap)
     208                 || soap_put_ns1__replicate_USCOREobject(soap, &soap_tmp_ns1__replicate_USCOREobject, "ns1:replicate_object", "")
     209                 || soap_body_end_out(soap)
     210                 || soap_envelope_end_out(soap))
     211                         return soap->error;
     212        }
     213        if (soap_end_count(soap))
     214                return soap->error;
    204215        if (soap_connect(soap, soap_endpoint, soap_action)
    205216         || soap_envelope_begin_out(soap)
     
    211222         || soap_end_send(soap))
    212223                return soap_closesock(soap);
     224        if (!result)
     225                return soap_closesock(soap);
    213226        *result = NULL;
    214227        if (soap_begin_recv(soap)
     
    225238        if (soap_body_end_in(soap)
    226239         || soap_envelope_end_in(soap)
    227 #ifndef WITH_LEANER
    228          || soap_resolve_attachments(soap)
    229 #endif
    230240         || soap_end_recv(soap))
    231241                return soap_closesock(soap);
     
    248258        soap_serializeheader(soap);
    249259        soap_serialize_ns1__lock_USCOREobject(soap, &soap_tmp_ns1__lock_USCOREobject);
    250         soap_begin_count(soap);
    251         if (soap->mode & SOAP_IO_LENGTH)
    252         {       soap_envelope_begin_out(soap);
    253                 soap_putheader(soap);
    254                 soap_body_begin_out(soap);
    255                 soap_put_ns1__lock_USCOREobject(soap, &soap_tmp_ns1__lock_USCOREobject, "ns1:lock_object", "");
    256                 soap_body_end_out(soap);
    257                 soap_envelope_end_out(soap);
    258         }
     260        if (soap_begin_count(soap))
     261                return soap->error;
     262        if (soap->mode & SOAP_IO_LENGTH)
     263        {       if (soap_envelope_begin_out(soap)
     264                 || soap_putheader(soap)
     265                 || soap_body_begin_out(soap)
     266                 || soap_put_ns1__lock_USCOREobject(soap, &soap_tmp_ns1__lock_USCOREobject, "ns1:lock_object", "")
     267                 || soap_body_end_out(soap)
     268                 || soap_envelope_end_out(soap))
     269                         return soap->error;
     270        }
     271        if (soap_end_count(soap))
     272                return soap->error;
    259273        if (soap_connect(soap, soap_endpoint, soap_action)
    260274         || soap_envelope_begin_out(soap)
     
    266280         || soap_end_send(soap))
    267281                return soap_closesock(soap);
     282        if (!result)
     283                return soap_closesock(soap);
    268284        soap_default_int(soap, result);
    269285        if (soap_begin_recv(soap)
     
    280296        if (soap_body_end_in(soap)
    281297         || soap_envelope_end_in(soap)
    282 #ifndef WITH_LEANER
    283          || soap_resolve_attachments(soap)
    284 #endif
    285298         || soap_end_recv(soap))
    286299                return soap_closesock(soap);
     
    303316        soap_serializeheader(soap);
    304317        soap_serialize_ns1__unlock_USCOREobject(soap, &soap_tmp_ns1__unlock_USCOREobject);
    305         soap_begin_count(soap);
    306         if (soap->mode & SOAP_IO_LENGTH)
    307         {       soap_envelope_begin_out(soap);
    308                 soap_putheader(soap);
    309                 soap_body_begin_out(soap);
    310                 soap_put_ns1__unlock_USCOREobject(soap, &soap_tmp_ns1__unlock_USCOREobject, "ns1:unlock_object", "");
    311                 soap_body_end_out(soap);
    312                 soap_envelope_end_out(soap);
    313         }
     318        if (soap_begin_count(soap))
     319                return soap->error;
     320        if (soap->mode & SOAP_IO_LENGTH)
     321        {       if (soap_envelope_begin_out(soap)
     322                 || soap_putheader(soap)
     323                 || soap_body_begin_out(soap)
     324                 || soap_put_ns1__unlock_USCOREobject(soap, &soap_tmp_ns1__unlock_USCOREobject, "ns1:unlock_object", "")
     325                 || soap_body_end_out(soap)
     326                 || soap_envelope_end_out(soap))
     327                         return soap->error;
     328        }
     329        if (soap_end_count(soap))
     330                return soap->error;
    314331        if (soap_connect(soap, soap_endpoint, soap_action)
    315332         || soap_envelope_begin_out(soap)
     
    321338         || soap_end_send(soap))
    322339                return soap_closesock(soap);
     340        if (!result)
     341                return soap_closesock(soap);
    323342        soap_default_int(soap, result);
    324343        if (soap_begin_recv(soap)
     
    335354        if (soap_body_end_in(soap)
    336355         || soap_envelope_end_in(soap)
    337 #ifndef WITH_LEANER
    338          || soap_resolve_attachments(soap)
    339 #endif
    340356         || soap_end_recv(soap))
    341357                return soap_closesock(soap);
     
    345361}
    346362
    347 SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns1__find_USCOREobjects(struct soap *soap, const char *soap_endpoint, const char *soap_action, char *pattern, struct ns1__find_USCOREobjectsResponse *param_1)
     363SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns1__find_USCOREobjects(struct soap *soap, const char *soap_endpoint, const char *soap_action, char *pattern, struct ns1__find_USCOREobjectsResponse *_param_1)
    348364{       struct ns1__find_USCOREobjects soap_tmp_ns1__find_USCOREobjects;
    349365        if (!soap_endpoint)
     
    356372        soap_serializeheader(soap);
    357373        soap_serialize_ns1__find_USCOREobjects(soap, &soap_tmp_ns1__find_USCOREobjects);
    358         soap_begin_count(soap);
    359         if (soap->mode & SOAP_IO_LENGTH)
    360         {       soap_envelope_begin_out(soap);
    361                 soap_putheader(soap);
    362                 soap_body_begin_out(soap);
    363                 soap_put_ns1__find_USCOREobjects(soap, &soap_tmp_ns1__find_USCOREobjects, "ns1:find_objects", "");
    364                 soap_body_end_out(soap);
    365                 soap_envelope_end_out(soap);
    366         }
     374        if (soap_begin_count(soap))
     375                return soap->error;
     376        if (soap->mode & SOAP_IO_LENGTH)
     377        {       if (soap_envelope_begin_out(soap)
     378                 || soap_putheader(soap)
     379                 || soap_body_begin_out(soap)
     380                 || soap_put_ns1__find_USCOREobjects(soap, &soap_tmp_ns1__find_USCOREobjects, "ns1:find_objects", "")
     381                 || soap_body_end_out(soap)
     382                 || soap_envelope_end_out(soap))
     383                         return soap->error;
     384        }
     385        if (soap_end_count(soap))
     386                return soap->error;
    367387        if (soap_connect(soap, soap_endpoint, soap_action)
    368388         || soap_envelope_begin_out(soap)
     
    374394         || soap_end_send(soap))
    375395                return soap_closesock(soap);
    376         soap_default_ns1__find_USCOREobjectsResponse(soap, param_1);
    377         if (soap_begin_recv(soap)
    378          || soap_envelope_begin_in(soap)
    379          || soap_recv_header(soap)
    380          || soap_body_begin_in(soap))
    381                 return soap_closesock(soap);
    382         soap_get_ns1__find_USCOREobjectsResponse(soap, param_1, "ns1:find_objectsResponse", "");
    383         if (soap->error)
    384         {       if (soap->error == SOAP_TAG_MISMATCH && soap->level == 2)
    385                         return soap_recv_fault(soap);
    386                 return soap_closesock(soap);
    387         }
    388         if (soap_body_end_in(soap)
    389          || soap_envelope_end_in(soap)
    390 #ifndef WITH_LEANER
    391          || soap_resolve_attachments(soap)
    392 #endif
    393          || soap_end_recv(soap))
    394                 return soap_closesock(soap);
    395         return soap_closesock(soap);
    396 }
    397 
    398 SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns1__find_USCOREinstances(struct soap *soap, const char *soap_endpoint, const char *soap_action, char *key, char *volume, struct ns1__find_USCOREinstancesResponse *param_2)
     396        if (!_param_1)
     397                return soap_closesock(soap);
     398        soap_default_ns1__find_USCOREobjectsResponse(soap, _param_1);
     399        if (soap_begin_recv(soap)
     400         || soap_envelope_begin_in(soap)
     401         || soap_recv_header(soap)
     402         || soap_body_begin_in(soap))
     403                return soap_closesock(soap);
     404        soap_get_ns1__find_USCOREobjectsResponse(soap, _param_1, "ns1:find_objectsResponse", "");
     405        if (soap->error)
     406        {       if (soap->error == SOAP_TAG_MISMATCH && soap->level == 2)
     407                        return soap_recv_fault(soap);
     408                return soap_closesock(soap);
     409        }
     410        if (soap_body_end_in(soap)
     411         || soap_envelope_end_in(soap)
     412         || soap_end_recv(soap))
     413                return soap_closesock(soap);
     414        return soap_closesock(soap);
     415}
     416
     417SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns1__find_USCOREinstances(struct soap *soap, const char *soap_endpoint, const char *soap_action, char *key, char *volume, struct ns1__find_USCOREinstancesResponse *_param_2)
    399418{       struct ns1__find_USCOREinstances soap_tmp_ns1__find_USCOREinstances;
    400419        if (!soap_endpoint)
     
    408427        soap_serializeheader(soap);
    409428        soap_serialize_ns1__find_USCOREinstances(soap, &soap_tmp_ns1__find_USCOREinstances);
    410         soap_begin_count(soap);
    411         if (soap->mode & SOAP_IO_LENGTH)
    412         {       soap_envelope_begin_out(soap);
    413                 soap_putheader(soap);
    414                 soap_body_begin_out(soap);
    415                 soap_put_ns1__find_USCOREinstances(soap, &soap_tmp_ns1__find_USCOREinstances, "ns1:find_instances", "");
    416                 soap_body_end_out(soap);
    417                 soap_envelope_end_out(soap);
    418         }
     429        if (soap_begin_count(soap))
     430                return soap->error;
     431        if (soap->mode & SOAP_IO_LENGTH)
     432        {       if (soap_envelope_begin_out(soap)
     433                 || soap_putheader(soap)
     434                 || soap_body_begin_out(soap)
     435                 || soap_put_ns1__find_USCOREinstances(soap, &soap_tmp_ns1__find_USCOREinstances, "ns1:find_instances", "")
     436                 || soap_body_end_out(soap)
     437                 || soap_envelope_end_out(soap))
     438                         return soap->error;
     439        }
     440        if (soap_end_count(soap))
     441                return soap->error;
    419442        if (soap_connect(soap, soap_endpoint, soap_action)
    420443         || soap_envelope_begin_out(soap)
     
    426449         || soap_end_send(soap))
    427450                return soap_closesock(soap);
    428         soap_default_ns1__find_USCOREinstancesResponse(soap, param_2);
    429         if (soap_begin_recv(soap)
    430          || soap_envelope_begin_in(soap)
    431          || soap_recv_header(soap)
    432          || soap_body_begin_in(soap))
    433                 return soap_closesock(soap);
    434         soap_get_ns1__find_USCOREinstancesResponse(soap, param_2, "ns1:find_instancesResponse", "");
    435         if (soap->error)
    436         {       if (soap->error == SOAP_TAG_MISMATCH && soap->level == 2)
    437                         return soap_recv_fault(soap);
    438                 return soap_closesock(soap);
    439         }
    440         if (soap_body_end_in(soap)
    441          || soap_envelope_end_in(soap)
    442 #ifndef WITH_LEANER
    443          || soap_resolve_attachments(soap)
    444 #endif
     451        if (!_param_2)
     452                return soap_closesock(soap);
     453        soap_default_ns1__find_USCOREinstancesResponse(soap, _param_2);
     454        if (soap_begin_recv(soap)
     455         || soap_envelope_begin_in(soap)
     456         || soap_recv_header(soap)
     457         || soap_body_begin_in(soap))
     458                return soap_closesock(soap);
     459        soap_get_ns1__find_USCOREinstancesResponse(soap, _param_2, "ns1:find_instancesResponse", "");
     460        if (soap->error)
     461        {       if (soap->error == SOAP_TAG_MISMATCH && soap->level == 2)
     462                        return soap_recv_fault(soap);
     463                return soap_closesock(soap);
     464        }
     465        if (soap_body_end_in(soap)
     466         || soap_envelope_end_in(soap)
    445467         || soap_end_recv(soap))
    446468                return soap_closesock(soap);
     
    460482        soap_serializeheader(soap);
    461483        soap_serialize_ns1__delete_USCOREinstance(soap, &soap_tmp_ns1__delete_USCOREinstance);
    462         soap_begin_count(soap);
    463         if (soap->mode & SOAP_IO_LENGTH)
    464         {       soap_envelope_begin_out(soap);
    465                 soap_putheader(soap);
    466                 soap_body_begin_out(soap);
    467                 soap_put_ns1__delete_USCOREinstance(soap, &soap_tmp_ns1__delete_USCOREinstance, "ns1:delete_instance", "");
    468                 soap_body_end_out(soap);
    469                 soap_envelope_end_out(soap);
    470         }
     484        if (soap_begin_count(soap))
     485                return soap->error;
     486        if (soap->mode & SOAP_IO_LENGTH)
     487        {       if (soap_envelope_begin_out(soap)
     488                 || soap_putheader(soap)
     489                 || soap_body_begin_out(soap)
     490                 || soap_put_ns1__delete_USCOREinstance(soap, &soap_tmp_ns1__delete_USCOREinstance, "ns1:delete_instance", "")
     491                 || soap_body_end_out(soap)
     492                 || soap_envelope_end_out(soap))
     493                         return soap->error;
     494        }
     495        if (soap_end_count(soap))
     496                return soap->error;
    471497        if (soap_connect(soap, soap_endpoint, soap_action)
    472498         || soap_envelope_begin_out(soap)
     
    478504         || soap_end_send(soap))
    479505                return soap_closesock(soap);
     506        if (!result)
     507                return soap_closesock(soap);
    480508        soap_default_int(soap, result);
    481509        if (soap_begin_recv(soap)
     
    492520        if (soap_body_end_in(soap)
    493521         || soap_envelope_end_in(soap)
    494 #ifndef WITH_LEANER
    495          || soap_resolve_attachments(soap)
    496 #endif
    497522         || soap_end_recv(soap))
    498523                return soap_closesock(soap);
     
    502527}
    503528
    504 SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns1__stat_USCOREobject(struct soap *soap, const char *soap_endpoint, const char *soap_action, char *key, struct ns1__stat_USCOREobjectResponse *param_3)
     529SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns1__stat_USCOREobject(struct soap *soap, const char *soap_endpoint, const char *soap_action, char *key, struct ns1__stat_USCOREobjectResponse *_param_3)
    505530{       struct ns1__stat_USCOREobject soap_tmp_ns1__stat_USCOREobject;
    506531        if (!soap_endpoint)
     
    513538        soap_serializeheader(soap);
    514539        soap_serialize_ns1__stat_USCOREobject(soap, &soap_tmp_ns1__stat_USCOREobject);
    515         soap_begin_count(soap);
    516         if (soap->mode & SOAP_IO_LENGTH)
    517         {       soap_envelope_begin_out(soap);
    518                 soap_putheader(soap);
    519                 soap_body_begin_out(soap);
    520                 soap_put_ns1__stat_USCOREobject(soap, &soap_tmp_ns1__stat_USCOREobject, "ns1:stat_object", "");
    521                 soap_body_end_out(soap);
    522                 soap_envelope_end_out(soap);
    523         }
     540        if (soap_begin_count(soap))
     541                return soap->error;
     542        if (soap->mode & SOAP_IO_LENGTH)
     543        {       if (soap_envelope_begin_out(soap)
     544                 || soap_putheader(soap)
     545                 || soap_body_begin_out(soap)
     546                 || soap_put_ns1__stat_USCOREobject(soap, &soap_tmp_ns1__stat_USCOREobject, "ns1:stat_object", "")
     547                 || soap_body_end_out(soap)
     548                 || soap_envelope_end_out(soap))
     549                         return soap->error;
     550        }
     551        if (soap_end_count(soap))
     552                return soap->error;
    524553        if (soap_connect(soap, soap_endpoint, soap_action)
    525554         || soap_envelope_begin_out(soap)
     
    531560         || soap_end_send(soap))
    532561                return soap_closesock(soap);
    533         soap_default_ns1__stat_USCOREobjectResponse(soap, param_3);
    534         if (soap_begin_recv(soap)
    535          || soap_envelope_begin_in(soap)
    536          || soap_recv_header(soap)
    537          || soap_body_begin_in(soap))
    538                 return soap_closesock(soap);
    539         soap_get_ns1__stat_USCOREobjectResponse(soap, param_3, "ns1:stat_objectResponse", "");
    540         if (soap->error)
    541         {       if (soap->error == SOAP_TAG_MISMATCH && soap->level == 2)
    542                         return soap_recv_fault(soap);
    543                 return soap_closesock(soap);
    544         }
    545         if (soap_body_end_in(soap)
    546          || soap_envelope_end_in(soap)
    547 #ifndef WITH_LEANER
    548          || soap_resolve_attachments(soap)
     562        if (!_param_3)
     563                return soap_closesock(soap);
     564        soap_default_ns1__stat_USCOREobjectResponse(soap, _param_3);
     565        if (soap_begin_recv(soap)
     566         || soap_envelope_begin_in(soap)
     567         || soap_recv_header(soap)
     568         || soap_body_begin_in(soap))
     569                return soap_closesock(soap);
     570        soap_get_ns1__stat_USCOREobjectResponse(soap, _param_3, "ns1:stat_objectResponse", "");
     571        if (soap->error)
     572        {       if (soap->error == SOAP_TAG_MISMATCH && soap->level == 2)
     573                        return soap_recv_fault(soap);
     574                return soap_closesock(soap);
     575        }
     576        if (soap_body_end_in(soap)
     577         || soap_envelope_end_in(soap)
     578         || soap_end_recv(soap))
     579                return soap_closesock(soap);
     580        return soap_closesock(soap);
     581}
     582
     583#ifdef __cplusplus
     584}
    549585#endif
    550          || soap_end_recv(soap))
    551                 return soap_closesock(soap);
    552         return soap_closesock(soap);
    553 }
    554 
    555 SOAP_END_NAMESPACE(soap)
    556 
    557 #ifdef __cplusplus
    558 }
    559 #endif
    560586
    561587/* End of soapClient.c */
  • trunk/Nebulous/nebclient/src/soapClientLib.c

    r10631 r19542  
    11/* soapClientLib.c
    2    Generated by gSOAP 2.7.2 from src/nebulous.h
    3    Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc. All Rights Reserved.
     2   Generated by gSOAP 2.7.11 from src/nebulous.h
     3   Copyright(C) 2000-2008, Robert van Engelen, Genivia Inc. All Rights Reserved.
    44   This part of the software is released under one of the following licenses:
    55   GPL, the gSOAP public license, or Genivia's license for commercial use.
  • trunk/Nebulous/nebclient/src/soapH.h

    r13078 r19542  
    11/* soapH.h
    2    Generated by gSOAP 2.7.2 from src/nebulous.h
    3    Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc. All Rights Reserved.
     2   Generated by gSOAP 2.7.11 from src/nebulous.h
     3   Copyright(C) 2000-2008, Robert van Engelen, Genivia Inc. All Rights Reserved.
    44   This part of the software is released under one of the following licenses:
    55   GPL, the gSOAP public license, or Genivia's license for commercial use.
    66*/
     7
    78#ifndef soapH_H
    89#define soapH_H
     
    1112extern "C" {
    1213#endif
    13 
    14 SOAP_BEGIN_NAMESPACE(soap)
    15 SOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap*);
    1614#ifndef WITH_NOIDREF
     15SOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap*, const void*, int);
     16SOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap*, const void*, const char*, int, int);
     17SOAP_FMAC3 void *SOAP_FMAC4 soap_getelement(struct soap*, int*);
    1718SOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap*);
    1819SOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap*);
    19 SOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap*, const void*, int);
    20 SOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap*, const void*, const char*, int, int);
    21 SOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap*, int*);
    22 #endif
    23 SOAP_FMAC3 int SOAP_FMAC4 soap_resolve_attachments(struct soap*);
     20#endif
     21SOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap*);
    2422
    2523#ifndef SOAP_TYPE_byte
    26 #define SOAP_TYPE_byte (2)
     24#define SOAP_TYPE_byte (3)
    2725#endif
    2826SOAP_FMAC3 void SOAP_FMAC4 soap_default_byte(struct soap*, char *);
     
    4442
    4543#ifndef SOAP_TYPE_SOAP_ENV__Fault
    46 #define SOAP_TYPE_SOAP_ENV__Fault (50)
    47 #endif
     44#define SOAP_TYPE_SOAP_ENV__Fault (51)
     45#endif
     46SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Fault(struct soap*, struct SOAP_ENV__Fault *);
    4847SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Fault(struct soap*, const struct SOAP_ENV__Fault *);
    49 SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Fault(struct soap*, struct SOAP_ENV__Fault *);
    5048SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Fault(struct soap*, const struct SOAP_ENV__Fault *, const char*, const char*);
    5149SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Fault(struct soap*, const char*, int, const struct SOAP_ENV__Fault *, const char*);
     
    5755#ifndef WITH_NOGLOBAL
    5856
     57#ifndef SOAP_TYPE_SOAP_ENV__Reason
     58#define SOAP_TYPE_SOAP_ENV__Reason (50)
     59#endif
     60SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *);
     61SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Reason(struct soap*, const struct SOAP_ENV__Reason *);
     62SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Reason(struct soap*, const struct SOAP_ENV__Reason *, const char*, const char*);
     63SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Reason(struct soap*, const char*, int, const struct SOAP_ENV__Reason *, const char*);
     64SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_get_SOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *, const char*, const char*);
     65SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_in_SOAP_ENV__Reason(struct soap*, const char*, struct SOAP_ENV__Reason *, const char*);
     66
     67#endif
     68
     69#ifndef WITH_NOGLOBAL
     70
    5971#ifndef SOAP_TYPE_SOAP_ENV__Detail
    60 #define SOAP_TYPE_SOAP_ENV__Detail (49)
    61 #endif
     72#define SOAP_TYPE_SOAP_ENV__Detail (47)
     73#endif
     74SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *);
    6275SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Detail(struct soap*, const struct SOAP_ENV__Detail *);
    63 SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *);
    6476SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Detail(struct soap*, const struct SOAP_ENV__Detail *, const char*, const char*);
    6577SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Detail(struct soap*, const char*, int, const struct SOAP_ENV__Detail *, const char*);
     
    7284
    7385#ifndef SOAP_TYPE_SOAP_ENV__Code
    74 #define SOAP_TYPE_SOAP_ENV__Code (47)
    75 #endif
     86#define SOAP_TYPE_SOAP_ENV__Code (45)
     87#endif
     88SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *);
    7689SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Code(struct soap*, const struct SOAP_ENV__Code *);
    77 SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *);
    7890SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Code(struct soap*, const struct SOAP_ENV__Code *, const char*, const char*);
    7991SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Code(struct soap*, const char*, int, const struct SOAP_ENV__Code *, const char*);
     
    8698
    8799#ifndef SOAP_TYPE_SOAP_ENV__Header
    88 #define SOAP_TYPE_SOAP_ENV__Header (46)
    89 #endif
     100#define SOAP_TYPE_SOAP_ENV__Header (44)
     101#endif
     102SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Header(struct soap*, struct SOAP_ENV__Header *);
    90103SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Header(struct soap*, const struct SOAP_ENV__Header *);
    91 SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Header(struct soap*, struct SOAP_ENV__Header *);
    92104SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Header(struct soap*, const struct SOAP_ENV__Header *, const char*, const char*);
    93105SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Header(struct soap*, const char*, int, const struct SOAP_ENV__Header *, const char*);
     
    100112#define SOAP_TYPE_ns1__stat_USCOREobject (43)
    101113#endif
     114SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__stat_USCOREobject(struct soap*, struct ns1__stat_USCOREobject *);
    102115SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__stat_USCOREobject(struct soap*, const struct ns1__stat_USCOREobject *);
    103 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__stat_USCOREobject(struct soap*, struct ns1__stat_USCOREobject *);
    104116SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__stat_USCOREobject(struct soap*, const struct ns1__stat_USCOREobject *, const char*, const char*);
    105117SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__stat_USCOREobject(struct soap*, const char*, int, const struct ns1__stat_USCOREobject *, const char*);
     
    110122#define SOAP_TYPE_ns1__stat_USCOREobjectResponse (40)
    111123#endif
     124SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__stat_USCOREobjectResponse(struct soap*, struct ns1__stat_USCOREobjectResponse *);
    112125SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__stat_USCOREobjectResponse(struct soap*, const struct ns1__stat_USCOREobjectResponse *);
    113 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__stat_USCOREobjectResponse(struct soap*, struct ns1__stat_USCOREobjectResponse *);
    114126SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__stat_USCOREobjectResponse(struct soap*, const struct ns1__stat_USCOREobjectResponse *, const char*, const char*);
    115127SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__stat_USCOREobjectResponse(struct soap*, const char*, int, const struct ns1__stat_USCOREobjectResponse *, const char*);
     
    120132#define SOAP_TYPE_ns1__delete_USCOREinstance (39)
    121133#endif
     134SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__delete_USCOREinstance(struct soap*, struct ns1__delete_USCOREinstance *);
    122135SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__delete_USCOREinstance(struct soap*, const struct ns1__delete_USCOREinstance *);
    123 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__delete_USCOREinstance(struct soap*, struct ns1__delete_USCOREinstance *);
    124136SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__delete_USCOREinstance(struct soap*, const struct ns1__delete_USCOREinstance *, const char*, const char*);
    125137SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__delete_USCOREinstance(struct soap*, const char*, int, const struct ns1__delete_USCOREinstance *, const char*);
     
    130142#define SOAP_TYPE_ns1__delete_USCOREinstanceResponse (38)
    131143#endif
     144SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__delete_USCOREinstanceResponse(struct soap*, struct ns1__delete_USCOREinstanceResponse *);
    132145SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__delete_USCOREinstanceResponse(struct soap*, const struct ns1__delete_USCOREinstanceResponse *);
    133 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__delete_USCOREinstanceResponse(struct soap*, struct ns1__delete_USCOREinstanceResponse *);
    134146SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__delete_USCOREinstanceResponse(struct soap*, const struct ns1__delete_USCOREinstanceResponse *, const char*, const char*);
    135147SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__delete_USCOREinstanceResponse(struct soap*, const char*, int, const struct ns1__delete_USCOREinstanceResponse *, const char*);
     
    140152#define SOAP_TYPE_ns1__find_USCOREinstances (36)
    141153#endif
     154SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__find_USCOREinstances(struct soap*, struct ns1__find_USCOREinstances *);
    142155SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__find_USCOREinstances(struct soap*, const struct ns1__find_USCOREinstances *);
    143 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__find_USCOREinstances(struct soap*, struct ns1__find_USCOREinstances *);
    144156SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__find_USCOREinstances(struct soap*, const struct ns1__find_USCOREinstances *, const char*, const char*);
    145157SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__find_USCOREinstances(struct soap*, const char*, int, const struct ns1__find_USCOREinstances *, const char*);
     
    150162#define SOAP_TYPE_ns1__find_USCOREinstancesResponse (33)
    151163#endif
     164SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__find_USCOREinstancesResponse(struct soap*, struct ns1__find_USCOREinstancesResponse *);
    152165SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__find_USCOREinstancesResponse(struct soap*, const struct ns1__find_USCOREinstancesResponse *);
    153 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__find_USCOREinstancesResponse(struct soap*, struct ns1__find_USCOREinstancesResponse *);
    154166SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__find_USCOREinstancesResponse(struct soap*, const struct ns1__find_USCOREinstancesResponse *, const char*, const char*);
    155167SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__find_USCOREinstancesResponse(struct soap*, const char*, int, const struct ns1__find_USCOREinstancesResponse *, const char*);
     
    160172#define SOAP_TYPE_ns1__find_USCOREobjects (32)
    161173#endif
     174SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__find_USCOREobjects(struct soap*, struct ns1__find_USCOREobjects *);
    162175SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__find_USCOREobjects(struct soap*, const struct ns1__find_USCOREobjects *);
    163 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__find_USCOREobjects(struct soap*, struct ns1__find_USCOREobjects *);
    164176SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__find_USCOREobjects(struct soap*, const struct ns1__find_USCOREobjects *, const char*, const char*);
    165177SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__find_USCOREobjects(struct soap*, const char*, int, const struct ns1__find_USCOREobjects *, const char*);
     
    170182#define SOAP_TYPE_ns1__find_USCOREobjectsResponse (28)
    171183#endif
     184SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__find_USCOREobjectsResponse(struct soap*, struct ns1__find_USCOREobjectsResponse *);
    172185SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__find_USCOREobjectsResponse(struct soap*, const struct ns1__find_USCOREobjectsResponse *);
    173 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__find_USCOREobjectsResponse(struct soap*, struct ns1__find_USCOREobjectsResponse *);
    174186SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__find_USCOREobjectsResponse(struct soap*, const struct ns1__find_USCOREobjectsResponse *, const char*, const char*);
    175187SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__find_USCOREobjectsResponse(struct soap*, const char*, int, const struct ns1__find_USCOREobjectsResponse *, const char*);
     
    180192#define SOAP_TYPE_ns1__unlock_USCOREobject (27)
    181193#endif
     194SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__unlock_USCOREobject(struct soap*, struct ns1__unlock_USCOREobject *);
    182195SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__unlock_USCOREobject(struct soap*, const struct ns1__unlock_USCOREobject *);
    183 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__unlock_USCOREobject(struct soap*, struct ns1__unlock_USCOREobject *);
    184196SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__unlock_USCOREobject(struct soap*, const struct ns1__unlock_USCOREobject *, const char*, const char*);
    185197SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__unlock_USCOREobject(struct soap*, const char*, int, const struct ns1__unlock_USCOREobject *, const char*);
     
    190202#define SOAP_TYPE_ns1__unlock_USCOREobjectResponse (26)
    191203#endif
     204SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__unlock_USCOREobjectResponse(struct soap*, struct ns1__unlock_USCOREobjectResponse *);
    192205SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__unlock_USCOREobjectResponse(struct soap*, const struct ns1__unlock_USCOREobjectResponse *);
    193 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__unlock_USCOREobjectResponse(struct soap*, struct ns1__unlock_USCOREobjectResponse *);
    194206SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__unlock_USCOREobjectResponse(struct soap*, const struct ns1__unlock_USCOREobjectResponse *, const char*, const char*);
    195207SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__unlock_USCOREobjectResponse(struct soap*, const char*, int, const struct ns1__unlock_USCOREobjectResponse *, const char*);
     
    200212#define SOAP_TYPE_ns1__lock_USCOREobject (24)
    201213#endif
     214SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__lock_USCOREobject(struct soap*, struct ns1__lock_USCOREobject *);
    202215SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__lock_USCOREobject(struct soap*, const struct ns1__lock_USCOREobject *);
    203 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__lock_USCOREobject(struct soap*, struct ns1__lock_USCOREobject *);
    204216SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__lock_USCOREobject(struct soap*, const struct ns1__lock_USCOREobject *, const char*, const char*);
    205217SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__lock_USCOREobject(struct soap*, const char*, int, const struct ns1__lock_USCOREobject *, const char*);
     
    210222#define SOAP_TYPE_ns1__lock_USCOREobjectResponse (23)
    211223#endif
     224SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__lock_USCOREobjectResponse(struct soap*, struct ns1__lock_USCOREobjectResponse *);
    212225SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__lock_USCOREobjectResponse(struct soap*, const struct ns1__lock_USCOREobjectResponse *);
    213 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__lock_USCOREobjectResponse(struct soap*, struct ns1__lock_USCOREobjectResponse *);
    214226SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__lock_USCOREobjectResponse(struct soap*, const struct ns1__lock_USCOREobjectResponse *, const char*, const char*);
    215227SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__lock_USCOREobjectResponse(struct soap*, const char*, int, const struct ns1__lock_USCOREobjectResponse *, const char*);
     
    220232#define SOAP_TYPE_ns1__replicate_USCOREobject (20)
    221233#endif
     234SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__replicate_USCOREobject(struct soap*, struct ns1__replicate_USCOREobject *);
    222235SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__replicate_USCOREobject(struct soap*, const struct ns1__replicate_USCOREobject *);
    223 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__replicate_USCOREobject(struct soap*, struct ns1__replicate_USCOREobject *);
    224236SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__replicate_USCOREobject(struct soap*, const struct ns1__replicate_USCOREobject *, const char*, const char*);
    225237SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__replicate_USCOREobject(struct soap*, const char*, int, const struct ns1__replicate_USCOREobject *, const char*);
     
    230242#define SOAP_TYPE_ns1__replicate_USCOREobjectResponse (19)
    231243#endif
     244SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__replicate_USCOREobjectResponse(struct soap*, struct ns1__replicate_USCOREobjectResponse *);
    232245SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__replicate_USCOREobjectResponse(struct soap*, const struct ns1__replicate_USCOREobjectResponse *);
    233 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__replicate_USCOREobjectResponse(struct soap*, struct ns1__replicate_USCOREobjectResponse *);
    234246SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__replicate_USCOREobjectResponse(struct soap*, const struct ns1__replicate_USCOREobjectResponse *, const char*, const char*);
    235247SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__replicate_USCOREobjectResponse(struct soap*, const char*, int, const struct ns1__replicate_USCOREobjectResponse *, const char*);
     
    240252#define SOAP_TYPE_ns1__rename_USCOREobject_ (17)
    241253#endif
     254SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__rename_USCOREobject_(struct soap*, struct ns1__rename_USCOREobject_ *);
    242255SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__rename_USCOREobject_(struct soap*, const struct ns1__rename_USCOREobject_ *);
    243 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__rename_USCOREobject_(struct soap*, struct ns1__rename_USCOREobject_ *);
    244256SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__rename_USCOREobject_(struct soap*, const struct ns1__rename_USCOREobject_ *, const char*, const char*);
    245257SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__rename_USCOREobject_(struct soap*, const char*, int, const struct ns1__rename_USCOREobject_ *, const char*);
     
    250262#define SOAP_TYPE_ns1__rename_USCOREobject_Response (16)
    251263#endif
     264SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__rename_USCOREobject_Response(struct soap*, struct ns1__rename_USCOREobject_Response *);
    252265SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__rename_USCOREobject_Response(struct soap*, const struct ns1__rename_USCOREobject_Response *);
    253 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__rename_USCOREobject_Response(struct soap*, struct ns1__rename_USCOREobject_Response *);
    254266SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__rename_USCOREobject_Response(struct soap*, const struct ns1__rename_USCOREobject_Response *, const char*, const char*);
    255267SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__rename_USCOREobject_Response(struct soap*, const char*, int, const struct ns1__rename_USCOREobject_Response *, const char*);
     
    260272#define SOAP_TYPE_ns1__rename_USCOREobject (14)
    261273#endif
     274SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__rename_USCOREobject(struct soap*, struct ns1__rename_USCOREobject *);
    262275SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__rename_USCOREobject(struct soap*, const struct ns1__rename_USCOREobject *);
    263 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__rename_USCOREobject(struct soap*, struct ns1__rename_USCOREobject *);
    264276SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__rename_USCOREobject(struct soap*, const struct ns1__rename_USCOREobject *, const char*, const char*);
    265277SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__rename_USCOREobject(struct soap*, const char*, int, const struct ns1__rename_USCOREobject *, const char*);
     
    270282#define SOAP_TYPE_ns1__rename_USCOREobjectResponse (13)
    271283#endif
     284SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__rename_USCOREobjectResponse(struct soap*, struct ns1__rename_USCOREobjectResponse *);
    272285SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__rename_USCOREobjectResponse(struct soap*, const struct ns1__rename_USCOREobjectResponse *);
    273 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__rename_USCOREobjectResponse(struct soap*, struct ns1__rename_USCOREobjectResponse *);
    274286SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__rename_USCOREobjectResponse(struct soap*, const struct ns1__rename_USCOREobjectResponse *, const char*, const char*);
    275287SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__rename_USCOREobjectResponse(struct soap*, const char*, int, const struct ns1__rename_USCOREobjectResponse *, const char*);
     
    280292#define SOAP_TYPE_ns1__create_USCOREobject (11)
    281293#endif
     294SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__create_USCOREobject(struct soap*, struct ns1__create_USCOREobject *);
    282295SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__create_USCOREobject(struct soap*, const struct ns1__create_USCOREobject *);
    283 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__create_USCOREobject(struct soap*, struct ns1__create_USCOREobject *);
    284296SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__create_USCOREobject(struct soap*, const struct ns1__create_USCOREobject *, const char*, const char*);
    285297SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__create_USCOREobject(struct soap*, const char*, int, const struct ns1__create_USCOREobject *, const char*);
     
    290302#define SOAP_TYPE_ns1__create_USCOREobjectResponse (10)
    291303#endif
     304SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__create_USCOREobjectResponse(struct soap*, struct ns1__create_USCOREobjectResponse *);
    292305SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns1__create_USCOREobjectResponse(struct soap*, const struct ns1__create_USCOREobjectResponse *);
    293 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns1__create_USCOREobjectResponse(struct soap*, struct ns1__create_USCOREobjectResponse *);
    294306SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns1__create_USCOREobjectResponse(struct soap*, const struct ns1__create_USCOREobjectResponse *, const char*, const char*);
    295307SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__create_USCOREobjectResponse(struct soap*, const char*, int, const struct ns1__create_USCOREobjectResponse *, const char*);
     
    300312#define SOAP_TYPE_ArrayOfString (7)
    301313#endif
     314SOAP_FMAC3 void SOAP_FMAC4 soap_default_ArrayOfString(struct soap*, struct ArrayOfString *);
    302315SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ArrayOfString(struct soap*, struct ArrayOfString const*);
    303 SOAP_FMAC3 void SOAP_FMAC4 soap_default_ArrayOfString(struct soap*, struct ArrayOfString *);
    304316SOAP_FMAC3 int SOAP_FMAC4 soap_put_ArrayOfString(struct soap*, const struct ArrayOfString *, const char*, const char*);
    305317SOAP_FMAC3 int SOAP_FMAC4 soap_out_ArrayOfString(struct soap*, const char*, int, const struct ArrayOfString *, const char*);
     
    309321#ifndef WITH_NOGLOBAL
    310322
     323#ifndef SOAP_TYPE_PointerToSOAP_ENV__Reason
     324#define SOAP_TYPE_PointerToSOAP_ENV__Reason (53)
     325#endif
     326SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *const*);
     327SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *const*, const char*, const char*);
     328SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Reason(struct soap*, const char *, int, struct SOAP_ENV__Reason *const*, const char *);
     329SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason **, const char*, const char*);
     330SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Reason(struct soap*, const char*, struct SOAP_ENV__Reason **, const char*);
     331
     332#endif
     333
     334#ifndef WITH_NOGLOBAL
     335
    311336#ifndef SOAP_TYPE_PointerToSOAP_ENV__Detail
    312 #define SOAP_TYPE_PointerToSOAP_ENV__Detail (51)
     337#define SOAP_TYPE_PointerToSOAP_ENV__Detail (52)
    313338#endif
    314339SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *const*);
     
    323348
    324349#ifndef SOAP_TYPE_PointerToSOAP_ENV__Code
    325 #define SOAP_TYPE_PointerToSOAP_ENV__Code (48)
     350#define SOAP_TYPE_PointerToSOAP_ENV__Code (46)
    326351#endif
    327352SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *const*);
     
    386411SOAP_FMAC3 char *** SOAP_FMAC4 soap_get_PointerTostring(struct soap*, char ***, const char*, const char*);
    387412SOAP_FMAC3 char *** SOAP_FMAC4 soap_in_PointerTostring(struct soap*, const char*, char ***, const char*);
    388 
    389 #ifndef SOAP_TYPE_SOAP_ENC__arrayType
    390 #define SOAP_TYPE_SOAP_ENC__arrayType (6)
    391 #endif
    392 SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENC__arrayType(struct soap*, char **);
    393 SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENC__arrayType(struct soap*, char *const*);
    394 SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENC__arrayType(struct soap*, char *const*, const char*, const char*);
    395 SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENC__arrayType(struct soap*, const char*, int, char*const*, const char*);
    396 SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_SOAP_ENC__arrayType(struct soap*, char **, const char*, const char*);
    397 SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_SOAP_ENC__arrayType(struct soap*, const char*, char **, const char*);
    398413
    399414#ifndef SOAP_TYPE__QName
     
    408423
    409424#ifndef SOAP_TYPE_string
    410 #define SOAP_TYPE_string (3)
     425#define SOAP_TYPE_string (4)
    411426#endif
    412427SOAP_FMAC3 void SOAP_FMAC4 soap_default_string(struct soap*, char **);
     
    417432SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_string(struct soap*, const char*, char **, const char*);
    418433
    419 SOAP_END_NAMESPACE(soap)
    420 
    421434#ifdef __cplusplus
    422435}
  • trunk/Nebulous/nebclient/src/soapServer.c

    r13096 r19542  
    11/* soapServer.c
    2    Generated by gSOAP 2.7.2 from src/nebulous.h
    3    Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc. All Rights Reserved.
     2   Generated by gSOAP 2.7.11 from src/nebulous.h
     3   Copyright(C) 2000-2008, Robert van Engelen, Genivia Inc. All Rights Reserved.
    44   This part of the software is released under one of the following licenses:
    55   GPL, the gSOAP public license, or Genivia's license for commercial use.
     
    1010#endif
    1111
    12 SOAP_BEGIN_NAMESPACE(soap)
    13 
    14 SOAP_SOURCE_STAMP("@(#) soapServer.c ver 2.7.2 2007-05-01 02:53:36 GMT")
     12SOAP_SOURCE_STAMP("@(#) soapServer.c ver 2.7.11 2008-09-13 01:14:39 GMT")
    1513
    1614
    1715SOAP_FMAC5 int SOAP_FMAC6 soap_serve(struct soap *soap)
    1816{
    19         unsigned int n = soap->max_keep_alive;
     17#ifndef WITH_FASTCGI
     18        unsigned int k = soap->max_keep_alive;
     19#endif
     20
    2021        do
    21         {       soap_begin(soap);
    22                 if (!--n)
     22        {
     23#ifdef WITH_FASTCGI
     24                if (FCGI_Accept() < 0)
     25                {
     26                        soap->error = SOAP_EOF;
     27                        return soap_send_fault(soap);
     28                }
     29#endif
     30
     31                soap_begin(soap);
     32
     33#ifndef WITH_FASTCGI
     34                if (soap->max_keep_alive > 0 && !--k)
    2335                        soap->keep_alive = 0;
     36#endif
     37
    2438                if (soap_begin_recv(soap))
    2539                {       if (soap->error < SOAP_STOP)
     40                        {
     41#ifdef WITH_FASTCGI
     42                                soap_send_fault(soap);
     43#else
    2644                                return soap_send_fault(soap);
     45#endif
     46                        }
    2747                        soap_closesock(soap);
     48
    2849                        continue;
    2950                }
     51
    3052                if (soap_envelope_begin_in(soap)
    3153                 || soap_recv_header(soap)
    3254                 || soap_body_begin_in(soap)
    33                  || soap_serve_request(soap) || (soap->fserveloop && soap->fserveloop(soap)))
     55                 || soap_serve_request(soap)
     56                 || (soap->fserveloop && soap->fserveloop(soap)))
     57                {
     58#ifdef WITH_FASTCGI
     59                        soap_send_fault(soap);
     60#else
    3461                        return soap_send_fault(soap);
    35                
     62#endif
     63                }
     64
     65#ifdef WITH_FASTCGI
     66                soap_destroy(soap);
     67                soap_end(soap);
     68        } while (1);
     69#else
    3670        } while (soap->keep_alive);
     71#endif
    3772        return SOAP_OK;
    3873}
     
    79114        if (soap_body_end_in(soap)
    80115         || soap_envelope_end_in(soap)
    81 #ifndef WITH_LEANER
    82          || soap_resolve_attachments(soap)
    83 #endif
    84116         || soap_end_recv(soap))
    85117                return soap->error;
     
    89121        soap_serializeheader(soap);
    90122        soap_serialize_ns1__create_USCOREobjectResponse(soap, &soap_tmp_ns1__create_USCOREobjectResponse);
    91         soap_begin_count(soap);
    92         if (soap->mode & SOAP_IO_LENGTH)
    93         {       soap_envelope_begin_out(soap);
    94                 soap_putheader(soap);
    95                 soap_body_begin_out(soap);
    96                 soap_put_ns1__create_USCOREobjectResponse(soap, &soap_tmp_ns1__create_USCOREobjectResponse, "ns1:create_objectResponse", "");
    97                 soap_body_end_out(soap);
    98                 soap_envelope_end_out(soap);
    99         };
    100         if (soap_response(soap, SOAP_OK)
     123        if (soap_begin_count(soap))
     124                return soap->error;
     125        if (soap->mode & SOAP_IO_LENGTH)
     126        {       if (soap_envelope_begin_out(soap)
     127                 || soap_putheader(soap)
     128                 || soap_body_begin_out(soap)
     129                 || soap_put_ns1__create_USCOREobjectResponse(soap, &soap_tmp_ns1__create_USCOREobjectResponse, "ns1:create_objectResponse", "")
     130                 || soap_body_end_out(soap)
     131                 || soap_envelope_end_out(soap))
     132                         return soap->error;
     133        };
     134        if (soap_end_count(soap)
     135         || soap_response(soap, SOAP_OK)
    101136         || soap_envelope_begin_out(soap)
    102137         || soap_putheader(soap)
     
    123158        if (soap_body_end_in(soap)
    124159         || soap_envelope_end_in(soap)
    125 #ifndef WITH_LEANER
    126          || soap_resolve_attachments(soap)
    127 #endif
    128160         || soap_end_recv(soap))
    129161                return soap->error;
     
    133165        soap_serializeheader(soap);
    134166        soap_serialize_ns1__rename_USCOREobjectResponse(soap, &soap_tmp_ns1__rename_USCOREobjectResponse);
    135         soap_begin_count(soap);
    136         if (soap->mode & SOAP_IO_LENGTH)
    137         {       soap_envelope_begin_out(soap);
    138                 soap_putheader(soap);
    139                 soap_body_begin_out(soap);
    140                 soap_put_ns1__rename_USCOREobjectResponse(soap, &soap_tmp_ns1__rename_USCOREobjectResponse, "ns1:rename_objectResponse", "");
    141                 soap_body_end_out(soap);
    142                 soap_envelope_end_out(soap);
    143         };
    144         if (soap_response(soap, SOAP_OK)
     167        if (soap_begin_count(soap))
     168                return soap->error;
     169        if (soap->mode & SOAP_IO_LENGTH)
     170        {       if (soap_envelope_begin_out(soap)
     171                 || soap_putheader(soap)
     172                 || soap_body_begin_out(soap)
     173                 || soap_put_ns1__rename_USCOREobjectResponse(soap, &soap_tmp_ns1__rename_USCOREobjectResponse, "ns1:rename_objectResponse", "")
     174                 || soap_body_end_out(soap)
     175                 || soap_envelope_end_out(soap))
     176                         return soap->error;
     177        };
     178        if (soap_end_count(soap)
     179         || soap_response(soap, SOAP_OK)
    145180         || soap_envelope_begin_out(soap)
    146181         || soap_putheader(soap)
     
    167202        if (soap_body_end_in(soap)
    168203         || soap_envelope_end_in(soap)
    169 #ifndef WITH_LEANER
    170          || soap_resolve_attachments(soap)
    171 #endif
    172204         || soap_end_recv(soap))
    173205                return soap->error;
     
    177209        soap_serializeheader(soap);
    178210        soap_serialize_ns1__rename_USCOREobject_Response(soap, &soap_tmp_ns1__rename_USCOREobject_Response);
    179         soap_begin_count(soap);
    180         if (soap->mode & SOAP_IO_LENGTH)
    181         {       soap_envelope_begin_out(soap);
    182                 soap_putheader(soap);
    183                 soap_body_begin_out(soap);
    184                 soap_put_ns1__rename_USCOREobject_Response(soap, &soap_tmp_ns1__rename_USCOREobject_Response, "ns1:rename_object-Response", "");
    185                 soap_body_end_out(soap);
    186                 soap_envelope_end_out(soap);
    187         };
    188         if (soap_response(soap, SOAP_OK)
     211        if (soap_begin_count(soap))
     212                return soap->error;
     213        if (soap->mode & SOAP_IO_LENGTH)
     214        {       if (soap_envelope_begin_out(soap)
     215                 || soap_putheader(soap)
     216                 || soap_body_begin_out(soap)
     217                 || soap_put_ns1__rename_USCOREobject_Response(soap, &soap_tmp_ns1__rename_USCOREobject_Response, "ns1:rename_object-Response", "")
     218                 || soap_body_end_out(soap)
     219                 || soap_envelope_end_out(soap))
     220                         return soap->error;
     221        };
     222        if (soap_end_count(soap)
     223         || soap_response(soap, SOAP_OK)
    189224         || soap_envelope_begin_out(soap)
    190225         || soap_putheader(soap)
     
    211246        if (soap_body_end_in(soap)
    212247         || soap_envelope_end_in(soap)
    213 #ifndef WITH_LEANER
    214          || soap_resolve_attachments(soap)
    215 #endif
    216248         || soap_end_recv(soap))
    217249                return soap->error;
     
    221253        soap_serializeheader(soap);
    222254        soap_serialize_ns1__replicate_USCOREobjectResponse(soap, &soap_tmp_ns1__replicate_USCOREobjectResponse);
    223         soap_begin_count(soap);
    224         if (soap->mode & SOAP_IO_LENGTH)
    225         {       soap_envelope_begin_out(soap);
    226                 soap_putheader(soap);
    227                 soap_body_begin_out(soap);
    228                 soap_put_ns1__replicate_USCOREobjectResponse(soap, &soap_tmp_ns1__replicate_USCOREobjectResponse, "ns1:replicate_objectResponse", "");
    229                 soap_body_end_out(soap);
    230                 soap_envelope_end_out(soap);
    231         };
    232         if (soap_response(soap, SOAP_OK)
     255        if (soap_begin_count(soap))
     256                return soap->error;
     257        if (soap->mode & SOAP_IO_LENGTH)
     258        {       if (soap_envelope_begin_out(soap)
     259                 || soap_putheader(soap)
     260                 || soap_body_begin_out(soap)
     261                 || soap_put_ns1__replicate_USCOREobjectResponse(soap, &soap_tmp_ns1__replicate_USCOREobjectResponse, "ns1:replicate_objectResponse", "")
     262                 || soap_body_end_out(soap)
     263                 || soap_envelope_end_out(soap))
     264                         return soap->error;
     265        };
     266        if (soap_end_count(soap)
     267         || soap_response(soap, SOAP_OK)
    233268         || soap_envelope_begin_out(soap)
    234269         || soap_putheader(soap)
     
    255290        if (soap_body_end_in(soap)
    256291         || soap_envelope_end_in(soap)
    257 #ifndef WITH_LEANER
    258          || soap_resolve_attachments(soap)
    259 #endif
    260292         || soap_end_recv(soap))
    261293                return soap->error;
     
    265297        soap_serializeheader(soap);
    266298        soap_serialize_ns1__lock_USCOREobjectResponse(soap, &soap_tmp_ns1__lock_USCOREobjectResponse);
    267         soap_begin_count(soap);
    268         if (soap->mode & SOAP_IO_LENGTH)
    269         {       soap_envelope_begin_out(soap);
    270                 soap_putheader(soap);
    271                 soap_body_begin_out(soap);
    272                 soap_put_ns1__lock_USCOREobjectResponse(soap, &soap_tmp_ns1__lock_USCOREobjectResponse, "ns1:lock_objectResponse", "");
    273                 soap_body_end_out(soap);
    274                 soap_envelope_end_out(soap);
    275         };
    276         if (soap_response(soap, SOAP_OK)
     299        if (soap_begin_count(soap))
     300                return soap->error;
     301        if (soap->mode & SOAP_IO_LENGTH)
     302        {       if (soap_envelope_begin_out(soap)
     303                 || soap_putheader(soap)
     304                 || soap_body_begin_out(soap)
     305                 || soap_put_ns1__lock_USCOREobjectResponse(soap, &soap_tmp_ns1__lock_USCOREobjectResponse, "ns1:lock_objectResponse", "")
     306                 || soap_body_end_out(soap)
     307                 || soap_envelope_end_out(soap))
     308                         return soap->error;
     309        };
     310        if (soap_end_count(soap)
     311         || soap_response(soap, SOAP_OK)
    277312         || soap_envelope_begin_out(soap)
    278313         || soap_putheader(soap)
     
    299334        if (soap_body_end_in(soap)
    300335         || soap_envelope_end_in(soap)
    301 #ifndef WITH_LEANER
    302          || soap_resolve_attachments(soap)
    303 #endif
    304336         || soap_end_recv(soap))
    305337                return soap->error;
     
    309341        soap_serializeheader(soap);
    310342        soap_serialize_ns1__unlock_USCOREobjectResponse(soap, &soap_tmp_ns1__unlock_USCOREobjectResponse);
    311         soap_begin_count(soap);
    312         if (soap->mode & SOAP_IO_LENGTH)
    313         {       soap_envelope_begin_out(soap);
    314                 soap_putheader(soap);
    315                 soap_body_begin_out(soap);
    316                 soap_put_ns1__unlock_USCOREobjectResponse(soap, &soap_tmp_ns1__unlock_USCOREobjectResponse, "ns1:unlock_objectResponse", "");
    317                 soap_body_end_out(soap);
    318                 soap_envelope_end_out(soap);
    319         };
    320         if (soap_response(soap, SOAP_OK)
     343        if (soap_begin_count(soap))
     344                return soap->error;
     345        if (soap->mode & SOAP_IO_LENGTH)
     346        {       if (soap_envelope_begin_out(soap)
     347                 || soap_putheader(soap)
     348                 || soap_body_begin_out(soap)
     349                 || soap_put_ns1__unlock_USCOREobjectResponse(soap, &soap_tmp_ns1__unlock_USCOREobjectResponse, "ns1:unlock_objectResponse", "")
     350                 || soap_body_end_out(soap)
     351                 || soap_envelope_end_out(soap))
     352                         return soap->error;
     353        };
     354        if (soap_end_count(soap)
     355         || soap_response(soap, SOAP_OK)
    321356         || soap_envelope_begin_out(soap)
    322357         || soap_putheader(soap)
     
    332367SOAP_FMAC5 int SOAP_FMAC6 soap_serve_ns1__find_USCOREobjects(struct soap *soap)
    333368{       struct ns1__find_USCOREobjects soap_tmp_ns1__find_USCOREobjects;
    334         struct ns1__find_USCOREobjectsResponse param_1;
    335         soap_default_ns1__find_USCOREobjectsResponse(soap, &param_1);
     369        struct ns1__find_USCOREobjectsResponse _param_1;
     370        soap_default_ns1__find_USCOREobjectsResponse(soap, &_param_1);
    336371        soap_default_ns1__find_USCOREobjects(soap, &soap_tmp_ns1__find_USCOREobjects);
    337372        soap->encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/";
     
    340375        if (soap_body_end_in(soap)
    341376         || soap_envelope_end_in(soap)
    342 #ifndef WITH_LEANER
    343          || soap_resolve_attachments(soap)
    344 #endif
    345          || soap_end_recv(soap))
    346                 return soap->error;
    347         soap->error = ns1__find_USCOREobjects(soap, soap_tmp_ns1__find_USCOREobjects.pattern, &param_1);
    348         if (soap->error)
    349                 return soap->error;
    350         soap_serializeheader(soap);
    351         soap_serialize_ns1__find_USCOREobjectsResponse(soap, &param_1);
    352         soap_begin_count(soap);
    353         if (soap->mode & SOAP_IO_LENGTH)
    354         {       soap_envelope_begin_out(soap);
    355                 soap_putheader(soap);
    356                 soap_body_begin_out(soap);
    357                 soap_put_ns1__find_USCOREobjectsResponse(soap, &param_1, "ns1:find_objectsResponse", "");
    358                 soap_body_end_out(soap);
    359                 soap_envelope_end_out(soap);
    360         };
    361         if (soap_response(soap, SOAP_OK)
    362          || soap_envelope_begin_out(soap)
    363          || soap_putheader(soap)
    364          || soap_body_begin_out(soap)
    365          || soap_put_ns1__find_USCOREobjectsResponse(soap, &param_1, "ns1:find_objectsResponse", "")
     377         || soap_end_recv(soap))
     378                return soap->error;
     379        soap->error = ns1__find_USCOREobjects(soap, soap_tmp_ns1__find_USCOREobjects.pattern, &_param_1);
     380        if (soap->error)
     381                return soap->error;
     382        soap_serializeheader(soap);
     383        soap_serialize_ns1__find_USCOREobjectsResponse(soap, &_param_1);
     384        if (soap_begin_count(soap))
     385                return soap->error;
     386        if (soap->mode & SOAP_IO_LENGTH)
     387        {       if (soap_envelope_begin_out(soap)
     388                 || soap_putheader(soap)
     389                 || soap_body_begin_out(soap)
     390                 || soap_put_ns1__find_USCOREobjectsResponse(soap, &_param_1, "ns1:find_objectsResponse", "")
     391                 || soap_body_end_out(soap)
     392                 || soap_envelope_end_out(soap))
     393                         return soap->error;
     394        };
     395        if (soap_end_count(soap)
     396         || soap_response(soap, SOAP_OK)
     397         || soap_envelope_begin_out(soap)
     398         || soap_putheader(soap)
     399         || soap_body_begin_out(soap)
     400         || soap_put_ns1__find_USCOREobjectsResponse(soap, &_param_1, "ns1:find_objectsResponse", "")
    366401         || soap_body_end_out(soap)
    367402         || soap_envelope_end_out(soap)
     
    373408SOAP_FMAC5 int SOAP_FMAC6 soap_serve_ns1__find_USCOREinstances(struct soap *soap)
    374409{       struct ns1__find_USCOREinstances soap_tmp_ns1__find_USCOREinstances;
    375         struct ns1__find_USCOREinstancesResponse param_2;
    376         soap_default_ns1__find_USCOREinstancesResponse(soap, &param_2);
     410        struct ns1__find_USCOREinstancesResponse _param_2;
     411        soap_default_ns1__find_USCOREinstancesResponse(soap, &_param_2);
    377412        soap_default_ns1__find_USCOREinstances(soap, &soap_tmp_ns1__find_USCOREinstances);
    378413        soap->encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/";
     
    381416        if (soap_body_end_in(soap)
    382417         || soap_envelope_end_in(soap)
    383 #ifndef WITH_LEANER
    384          || soap_resolve_attachments(soap)
    385 #endif
    386          || soap_end_recv(soap))
    387                 return soap->error;
    388         soap->error = ns1__find_USCOREinstances(soap, soap_tmp_ns1__find_USCOREinstances.key, soap_tmp_ns1__find_USCOREinstances.volume, &param_2);
    389         if (soap->error)
    390                 return soap->error;
    391         soap_serializeheader(soap);
    392         soap_serialize_ns1__find_USCOREinstancesResponse(soap, &param_2);
    393         soap_begin_count(soap);
    394         if (soap->mode & SOAP_IO_LENGTH)
    395         {       soap_envelope_begin_out(soap);
    396                 soap_putheader(soap);
    397                 soap_body_begin_out(soap);
    398                 soap_put_ns1__find_USCOREinstancesResponse(soap, &param_2, "ns1:find_instancesResponse", "");
    399                 soap_body_end_out(soap);
    400                 soap_envelope_end_out(soap);
    401         };
    402         if (soap_response(soap, SOAP_OK)
    403          || soap_envelope_begin_out(soap)
    404          || soap_putheader(soap)
    405          || soap_body_begin_out(soap)
    406          || soap_put_ns1__find_USCOREinstancesResponse(soap, &param_2, "ns1:find_instancesResponse", "")
     418         || soap_end_recv(soap))
     419                return soap->error;
     420        soap->error = ns1__find_USCOREinstances(soap, soap_tmp_ns1__find_USCOREinstances.key, soap_tmp_ns1__find_USCOREinstances.volume, &_param_2);
     421        if (soap->error)
     422                return soap->error;
     423        soap_serializeheader(soap);
     424        soap_serialize_ns1__find_USCOREinstancesResponse(soap, &_param_2);
     425        if (soap_begin_count(soap))
     426                return soap->error;
     427        if (soap->mode & SOAP_IO_LENGTH)
     428        {       if (soap_envelope_begin_out(soap)
     429                 || soap_putheader(soap)
     430                 || soap_body_begin_out(soap)
     431                 || soap_put_ns1__find_USCOREinstancesResponse(soap, &_param_2, "ns1:find_instancesResponse", "")
     432                 || soap_body_end_out(soap)
     433                 || soap_envelope_end_out(soap))
     434                         return soap->error;
     435        };
     436        if (soap_end_count(soap)
     437         || soap_response(soap, SOAP_OK)
     438         || soap_envelope_begin_out(soap)
     439         || soap_putheader(soap)
     440         || soap_body_begin_out(soap)
     441         || soap_put_ns1__find_USCOREinstancesResponse(soap, &_param_2, "ns1:find_instancesResponse", "")
    407442         || soap_body_end_out(soap)
    408443         || soap_envelope_end_out(soap)
     
    425460        if (soap_body_end_in(soap)
    426461         || soap_envelope_end_in(soap)
    427 #ifndef WITH_LEANER
    428          || soap_resolve_attachments(soap)
    429 #endif
    430462         || soap_end_recv(soap))
    431463                return soap->error;
     
    435467        soap_serializeheader(soap);
    436468        soap_serialize_ns1__delete_USCOREinstanceResponse(soap, &soap_tmp_ns1__delete_USCOREinstanceResponse);
    437         soap_begin_count(soap);
    438         if (soap->mode & SOAP_IO_LENGTH)
    439         {       soap_envelope_begin_out(soap);
    440                 soap_putheader(soap);
    441                 soap_body_begin_out(soap);
    442                 soap_put_ns1__delete_USCOREinstanceResponse(soap, &soap_tmp_ns1__delete_USCOREinstanceResponse, "ns1:delete_instanceResponse", "");
    443                 soap_body_end_out(soap);
    444                 soap_envelope_end_out(soap);
    445         };
    446         if (soap_response(soap, SOAP_OK)
     469        if (soap_begin_count(soap))
     470                return soap->error;
     471        if (soap->mode & SOAP_IO_LENGTH)
     472        {       if (soap_envelope_begin_out(soap)
     473                 || soap_putheader(soap)
     474                 || soap_body_begin_out(soap)
     475                 || soap_put_ns1__delete_USCOREinstanceResponse(soap, &soap_tmp_ns1__delete_USCOREinstanceResponse, "ns1:delete_instanceResponse", "")
     476                 || soap_body_end_out(soap)
     477                 || soap_envelope_end_out(soap))
     478                         return soap->error;
     479        };
     480        if (soap_end_count(soap)
     481         || soap_response(soap, SOAP_OK)
    447482         || soap_envelope_begin_out(soap)
    448483         || soap_putheader(soap)
     
    458493SOAP_FMAC5 int SOAP_FMAC6 soap_serve_ns1__stat_USCOREobject(struct soap *soap)
    459494{       struct ns1__stat_USCOREobject soap_tmp_ns1__stat_USCOREobject;
    460         struct ns1__stat_USCOREobjectResponse param_3;
    461         soap_default_ns1__stat_USCOREobjectResponse(soap, &param_3);
     495        struct ns1__stat_USCOREobjectResponse _param_3;
     496        soap_default_ns1__stat_USCOREobjectResponse(soap, &_param_3);
    462497        soap_default_ns1__stat_USCOREobject(soap, &soap_tmp_ns1__stat_USCOREobject);
    463498        soap->encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/";
     
    466501        if (soap_body_end_in(soap)
    467502         || soap_envelope_end_in(soap)
    468 #ifndef WITH_LEANER
    469          || soap_resolve_attachments(soap)
    470 #endif
    471          || soap_end_recv(soap))
    472                 return soap->error;
    473         soap->error = ns1__stat_USCOREobject(soap, soap_tmp_ns1__stat_USCOREobject.key, &param_3);
    474         if (soap->error)
    475                 return soap->error;
    476         soap_serializeheader(soap);
    477         soap_serialize_ns1__stat_USCOREobjectResponse(soap, &param_3);
    478         soap_begin_count(soap);
    479         if (soap->mode & SOAP_IO_LENGTH)
    480         {       soap_envelope_begin_out(soap);
    481                 soap_putheader(soap);
    482                 soap_body_begin_out(soap);
    483                 soap_put_ns1__stat_USCOREobjectResponse(soap, &param_3, "ns1:stat_objectResponse", "");
    484                 soap_body_end_out(soap);
    485                 soap_envelope_end_out(soap);
    486         };
    487         if (soap_response(soap, SOAP_OK)
    488          || soap_envelope_begin_out(soap)
    489          || soap_putheader(soap)
    490          || soap_body_begin_out(soap)
    491          || soap_put_ns1__stat_USCOREobjectResponse(soap, &param_3, "ns1:stat_objectResponse", "")
    492          || soap_body_end_out(soap)
    493          || soap_envelope_end_out(soap)
    494          || soap_end_send(soap))
    495                 return soap->error;
    496         return soap_closesock(soap);
    497 }
    498 
    499 SOAP_END_NAMESPACE(soap)
     503         || soap_end_recv(soap))
     504                return soap->error;
     505        soap->error = ns1__stat_USCOREobject(soap, soap_tmp_ns1__stat_USCOREobject.key, &_param_3);
     506        if (soap->error)
     507                return soap->error;
     508        soap_serializeheader(soap);
     509        soap_serialize_ns1__stat_USCOREobjectResponse(soap, &_param_3);
     510        if (soap_begin_count(soap))
     511                return soap->error;
     512        if (soap->mode & SOAP_IO_LENGTH)
     513        {       if (soap_envelope_begin_out(soap)
     514                 || soap_putheader(soap)
     515                 || soap_body_begin_out(soap)
     516                 || soap_put_ns1__stat_USCOREobjectResponse(soap, &_param_3, "ns1:stat_objectResponse", "")
     517                 || soap_body_end_out(soap)
     518                 || soap_envelope_end_out(soap))
     519                         return soap->error;
     520        };
     521        if (soap_end_count(soap)
     522         || soap_response(soap, SOAP_OK)
     523         || soap_envelope_begin_out(soap)
     524         || soap_putheader(soap)
     525         || soap_body_begin_out(soap)
     526         || soap_put_ns1__stat_USCOREobjectResponse(soap, &_param_3, "ns1:stat_objectResponse", "")
     527         || soap_body_end_out(soap)
     528         || soap_envelope_end_out(soap)
     529         || soap_end_send(soap))
     530                return soap->error;
     531        return soap_closesock(soap);
     532}
    500533
    501534#ifdef __cplusplus
  • trunk/Nebulous/nebclient/src/soapServerLib.c

    r10631 r19542  
    11/* soapServerLib.c
    2    Generated by gSOAP 2.7.2 from src/nebulous.h
    3    Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc. All Rights Reserved.
     2   Generated by gSOAP 2.7.11 from src/nebulous.h
     3   Copyright(C) 2000-2008, Robert van Engelen, Genivia Inc. All Rights Reserved.
    44   This part of the software is released under one of the following licenses:
    55   GPL, the gSOAP public license, or Genivia's license for commercial use.
  • trunk/Nebulous/nebclient/src/soapStub.h

    r13096 r19542  
    11/* soapStub.h
    2    Generated by gSOAP 2.7.2 from src/nebulous.h
    3    Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc. All Rights Reserved.
     2   Generated by gSOAP 2.7.11 from src/nebulous.h
     3   Copyright(C) 2000-2008, Robert van Engelen, Genivia Inc. All Rights Reserved.
    44   This part of the software is released under one of the following licenses:
    55   GPL, the gSOAP public license, or Genivia's license for commercial use.
    66*/
     7
    78#ifndef soapStub_H
    89#define soapStub_H
     
    1213#endif
    1314
    14 SOAP_BEGIN_NAMESPACE(soap)
    15 
    1615/******************************************************************************\
    1716 *                                                                            *
     
    2827
    2928
     29#if 0 /* volatile type: do not redeclare here */
     30
     31#endif
     32
     33#ifndef SOAP_TYPE_ArrayOfString
     34#define SOAP_TYPE_ArrayOfString (7)
    3035/* SOAP encoded array of xsd:string schema type: */
    3136struct ArrayOfString
     
    3439        int __size;
    3540};
    36 
    37 /* ns1:create_objectResponse: */
     41#endif
     42
     43#ifndef SOAP_TYPE_ns1__create_USCOREobjectResponse
     44#define SOAP_TYPE_ns1__create_USCOREobjectResponse (10)
     45/* ns1:create_objectResponse */
    3846struct ns1__create_USCOREobjectResponse
    3947{
    40         char **result;  /* RPC return element */        /* optional element of type xsd:string */
    41 };
    42 
    43 /* ns1:create_object: */
     48        char **result;  /* SOAP 1.2 RPC return element (when namespace qualified) */    /* optional element of type xsd:string */
     49};
     50#endif
     51
     52#ifndef SOAP_TYPE_ns1__create_USCOREobject
     53#define SOAP_TYPE_ns1__create_USCOREobject (11)
     54/* ns1:create_object */
    4455struct ns1__create_USCOREobject
    4556{
     
    4758        char *volume;   /* optional element of type xsd:string */
    4859};
    49 
    50 /* ns1:rename_objectResponse: */
     60#endif
     61
     62#ifndef SOAP_TYPE_ns1__rename_USCOREobjectResponse
     63#define SOAP_TYPE_ns1__rename_USCOREobjectResponse (13)
     64/* ns1:rename_objectResponse */
    5165struct ns1__rename_USCOREobjectResponse
    5266{
    53         char **result;  /* RPC return element */        /* optional element of type xsd:string */
    54 };
    55 
    56 /* ns1:rename_object: */
     67        char **result;  /* SOAP 1.2 RPC return element (when namespace qualified) */    /* optional element of type xsd:string */
     68};
     69#endif
     70
     71#ifndef SOAP_TYPE_ns1__rename_USCOREobject
     72#define SOAP_TYPE_ns1__rename_USCOREobject (14)
     73/* ns1:rename_object */
    5774struct ns1__rename_USCOREobject
    5875{
     
    6077        char *newkey;   /* optional element of type xsd:string */
    6178};
    62 
    63 /* ns1:rename_object-Response: */
     79#endif
     80
     81#ifndef SOAP_TYPE_ns1__rename_USCOREobject_Response
     82#define SOAP_TYPE_ns1__rename_USCOREobject_Response (16)
     83/* ns1:rename_object-Response */
    6484struct ns1__rename_USCOREobject_Response
    6585{
    66         char **result;  /* RPC return element */        /* optional element of type xsd:string */
    67 };
    68 
    69 /* ns1:rename_object: */
     86        char **result;  /* SOAP 1.2 RPC return element (when namespace qualified) */    /* optional element of type xsd:string */
     87};
     88#endif
     89
     90#ifndef SOAP_TYPE_ns1__rename_USCOREobject_
     91#define SOAP_TYPE_ns1__rename_USCOREobject_ (17)
     92/* ns1:rename_object */
    7093struct ns1__rename_USCOREobject_
    7194{
     
    7396        char *newkey;   /* optional element of type xsd:string */
    7497};
    75 
    76 /* ns1:replicate_objectResponse: */
     98#endif
     99
     100#ifndef SOAP_TYPE_ns1__replicate_USCOREobjectResponse
     101#define SOAP_TYPE_ns1__replicate_USCOREobjectResponse (19)
     102/* ns1:replicate_objectResponse */
    77103struct ns1__replicate_USCOREobjectResponse
    78104{
    79         char **result;  /* RPC return element */        /* optional element of type xsd:string */
    80 };
    81 
    82 /* ns1:replicate_object: */
     105        char **result;  /* SOAP 1.2 RPC return element (when namespace qualified) */    /* optional element of type xsd:string */
     106};
     107#endif
     108
     109#ifndef SOAP_TYPE_ns1__replicate_USCOREobject
     110#define SOAP_TYPE_ns1__replicate_USCOREobject (20)
     111/* ns1:replicate_object */
    83112struct ns1__replicate_USCOREobject
    84113{
     
    86115        char *volume;   /* optional element of type xsd:string */
    87116};
    88 
    89 /* ns1:lock_objectResponse: */
     117#endif
     118
     119#ifndef SOAP_TYPE_ns1__lock_USCOREobjectResponse
     120#define SOAP_TYPE_ns1__lock_USCOREobjectResponse (23)
     121/* ns1:lock_objectResponse */
    90122struct ns1__lock_USCOREobjectResponse
    91123{
    92         int *result;    /* RPC return element */        /* optional element of type xsd:int */
    93 };
    94 
    95 /* ns1:lock_object: */
     124        int *result;    /* SOAP 1.2 RPC return element (when namespace qualified) */    /* optional element of type xsd:int */
     125};
     126#endif
     127
     128#ifndef SOAP_TYPE_ns1__lock_USCOREobject
     129#define SOAP_TYPE_ns1__lock_USCOREobject (24)
     130/* ns1:lock_object */
    96131struct ns1__lock_USCOREobject
    97132{
     
    99134        char *type;     /* optional element of type xsd:string */
    100135};
    101 
    102 /* ns1:unlock_objectResponse: */
     136#endif
     137
     138#ifndef SOAP_TYPE_ns1__unlock_USCOREobjectResponse
     139#define SOAP_TYPE_ns1__unlock_USCOREobjectResponse (26)
     140/* ns1:unlock_objectResponse */
    103141struct ns1__unlock_USCOREobjectResponse
    104142{
    105         int *result;    /* RPC return element */        /* optional element of type xsd:int */
    106 };
    107 
    108 /* ns1:unlock_object: */
     143        int *result;    /* SOAP 1.2 RPC return element (when namespace qualified) */    /* optional element of type xsd:int */
     144};
     145#endif
     146
     147#ifndef SOAP_TYPE_ns1__unlock_USCOREobject
     148#define SOAP_TYPE_ns1__unlock_USCOREobject (27)
     149/* ns1:unlock_object */
    109150struct ns1__unlock_USCOREobject
    110151{
     
    112153        char *type;     /* optional element of type xsd:string */
    113154};
    114 
    115 /* ns1:find_objectsResponse: */
     155#endif
     156
     157#ifndef SOAP_TYPE_ns1__find_USCOREobjectsResponse
     158#define SOAP_TYPE_ns1__find_USCOREobjectsResponse (28)
     159/* ns1:find_objectsResponse */
    116160struct ns1__find_USCOREobjectsResponse
    117161{
    118         struct ArrayOfString *result;   /* RPC return element */        /* optional element of type ArrayOfstring */
    119 };
    120 
    121 /* ns1:find_objects: */
     162        struct ArrayOfString *result;   /* SOAP 1.2 RPC return element (when namespace qualified) */    /* optional element of type ArrayOfstring */
     163};
     164#endif
     165
     166#ifndef SOAP_TYPE_ns1__find_USCOREobjects
     167#define SOAP_TYPE_ns1__find_USCOREobjects (32)
     168/* ns1:find_objects */
    122169struct ns1__find_USCOREobjects
    123170{
    124171        char *pattern;  /* optional element of type xsd:string */
    125172};
    126 
    127 /* ns1:find_instancesResponse: */
     173#endif
     174
     175#ifndef SOAP_TYPE_ns1__find_USCOREinstancesResponse
     176#define SOAP_TYPE_ns1__find_USCOREinstancesResponse (33)
     177/* ns1:find_instancesResponse */
    128178struct ns1__find_USCOREinstancesResponse
    129179{
    130         struct ArrayOfString *result;   /* RPC return element */        /* optional element of type ArrayOfstring */
    131 };
    132 
    133 /* ns1:find_instances: */
     180        struct ArrayOfString *result;   /* SOAP 1.2 RPC return element (when namespace qualified) */    /* optional element of type ArrayOfstring */
     181};
     182#endif
     183
     184#ifndef SOAP_TYPE_ns1__find_USCOREinstances
     185#define SOAP_TYPE_ns1__find_USCOREinstances (36)
     186/* ns1:find_instances */
    134187struct ns1__find_USCOREinstances
    135188{
     
    137190        char *volume;   /* optional element of type xsd:string */
    138191};
    139 
    140 /* ns1:delete_instanceResponse: */
     192#endif
     193
     194#ifndef SOAP_TYPE_ns1__delete_USCOREinstanceResponse
     195#define SOAP_TYPE_ns1__delete_USCOREinstanceResponse (38)
     196/* ns1:delete_instanceResponse */
    141197struct ns1__delete_USCOREinstanceResponse
    142198{
    143         int *result;    /* RPC return element */        /* optional element of type xsd:int */
    144 };
    145 
    146 /* ns1:delete_instance: */
     199        int *result;    /* SOAP 1.2 RPC return element (when namespace qualified) */    /* optional element of type xsd:int */
     200};
     201#endif
     202
     203#ifndef SOAP_TYPE_ns1__delete_USCOREinstance
     204#define SOAP_TYPE_ns1__delete_USCOREinstance (39)
     205/* ns1:delete_instance */
    147206struct ns1__delete_USCOREinstance
    148207{
    149208        char *uri;      /* optional element of type xsd:string */
    150209};
    151 
    152 /* ns1:stat_objectResponse: */
     210#endif
     211
     212#ifndef SOAP_TYPE_ns1__stat_USCOREobjectResponse
     213#define SOAP_TYPE_ns1__stat_USCOREobjectResponse (40)
     214/* ns1:stat_objectResponse */
    153215struct ns1__stat_USCOREobjectResponse
    154216{
    155         struct ArrayOfString *result;   /* RPC return element */        /* optional element of type ArrayOfstring */
    156 };
    157 
    158 /* ns1:stat_object: */
     217        struct ArrayOfString *result;   /* SOAP 1.2 RPC return element (when namespace qualified) */    /* optional element of type ArrayOfstring */
     218};
     219#endif
     220
     221#ifndef SOAP_TYPE_ns1__stat_USCOREobject
     222#define SOAP_TYPE_ns1__stat_USCOREobject (43)
     223/* ns1:stat_object */
    159224struct ns1__stat_USCOREobject
    160225{
    161226        char *key;      /* optional element of type xsd:string */
    162227};
    163 
     228#endif
     229
     230#ifndef SOAP_TYPE_SOAP_ENV__Header
     231#define SOAP_TYPE_SOAP_ENV__Header (44)
    164232/* SOAP Header: */
    165233struct SOAP_ENV__Header
    166234{
    167         void *dummy;    /* transient */
    168 };
    169 
     235#ifdef WITH_NOEMPTYSTRUCT
     236        char dummy;     /* dummy member to enable compilation */
     237#endif
     238};
     239#endif
     240
     241#ifndef SOAP_TYPE_SOAP_ENV__Code
     242#define SOAP_TYPE_SOAP_ENV__Code (45)
    170243/* SOAP Fault Code: */
    171244struct SOAP_ENV__Code
    172245{
    173         char *SOAP_ENV__Value;  /* optional element of type QName */
     246        char *SOAP_ENV__Value;  /* optional element of type xsd:QName */
    174247        struct SOAP_ENV__Code *SOAP_ENV__Subcode;       /* optional element of type SOAP-ENV:Code */
    175248};
    176 
    177 /* SOAP-ENV:Detail: */
     249#endif
     250
     251#ifndef SOAP_TYPE_SOAP_ENV__Detail
     252#define SOAP_TYPE_SOAP_ENV__Detail (47)
     253/* SOAP-ENV:Detail */
    178254struct SOAP_ENV__Detail
    179255{
     
    182258        char *__any;
    183259};
    184 
     260#endif
     261
     262#ifndef SOAP_TYPE_SOAP_ENV__Reason
     263#define SOAP_TYPE_SOAP_ENV__Reason (50)
     264/* SOAP-ENV:Reason */
     265struct SOAP_ENV__Reason
     266{
     267        char *SOAP_ENV__Text;   /* optional element of type xsd:string */
     268};
     269#endif
     270
     271#ifndef SOAP_TYPE_SOAP_ENV__Fault
     272#define SOAP_TYPE_SOAP_ENV__Fault (51)
    185273/* SOAP Fault: */
    186274struct SOAP_ENV__Fault
    187275{
    188         char *faultcode;        /* optional element of type QName */
     276        char *faultcode;        /* optional element of type xsd:QName */
    189277        char *faultstring;      /* optional element of type xsd:string */
    190278        char *faultactor;       /* optional element of type xsd:string */
    191279        struct SOAP_ENV__Detail *detail;        /* optional element of type SOAP-ENV:Detail */
    192280        struct SOAP_ENV__Code *SOAP_ENV__Code;  /* optional element of type SOAP-ENV:Code */
    193         char *SOAP_ENV__Reason; /* optional element of type xsd:string */
     281        struct SOAP_ENV__Reason *SOAP_ENV__Reason;      /* optional element of type SOAP-ENV:Reason */
    194282        char *SOAP_ENV__Node;   /* optional element of type xsd:string */
    195283        char *SOAP_ENV__Role;   /* optional element of type xsd:string */
    196284        struct SOAP_ENV__Detail *SOAP_ENV__Detail;      /* optional element of type SOAP-ENV:Detail */
    197285};
     286#endif
    198287
    199288/******************************************************************************\
     
    210299\******************************************************************************/
    211300
     301#ifndef SOAP_TYPE__QName
     302#define SOAP_TYPE__QName (5)
     303typedef char *_QName;
     304#endif
     305
     306#ifndef SOAP_TYPE__XML
     307#define SOAP_TYPE__XML (6)
    212308typedef char *_XML;
    213 typedef char *_QName;
    214 typedef char *SOAP_ENC__arrayType;
     309#endif
     310
     311
     312/******************************************************************************\
     313 *                                                                            *
     314 * Typedef Synonyms                                                           *
     315 *                                                                            *
     316\******************************************************************************/
     317
    215318
    216319/******************************************************************************\
     
    240343SOAP_FMAC5 int SOAP_FMAC6 ns1__unlock_USCOREobject(struct soap*, char *key, char *type, int *result);
    241344
    242 SOAP_FMAC5 int SOAP_FMAC6 ns1__find_USCOREobjects(struct soap*, char *pattern, struct ns1__find_USCOREobjectsResponse *param_1);
    243 
    244 SOAP_FMAC5 int SOAP_FMAC6 ns1__find_USCOREinstances(struct soap*, char *key, char *volume, struct ns1__find_USCOREinstancesResponse *param_2);
     345SOAP_FMAC5 int SOAP_FMAC6 ns1__find_USCOREobjects(struct soap*, char *pattern, struct ns1__find_USCOREobjectsResponse *_param_1);
     346
     347SOAP_FMAC5 int SOAP_FMAC6 ns1__find_USCOREinstances(struct soap*, char *key, char *volume, struct ns1__find_USCOREinstancesResponse *_param_2);
    245348
    246349SOAP_FMAC5 int SOAP_FMAC6 ns1__delete_USCOREinstance(struct soap*, char *uri, int *result);
    247350
    248 SOAP_FMAC5 int SOAP_FMAC6 ns1__stat_USCOREobject(struct soap*, char *key, struct ns1__stat_USCOREobjectResponse *param_3);
     351SOAP_FMAC5 int SOAP_FMAC6 ns1__stat_USCOREobject(struct soap*, char *key, struct ns1__stat_USCOREobjectResponse *_param_3);
    249352
    250353/******************************************************************************\
     
    267370SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns1__unlock_USCOREobject(struct soap *soap, const char *soap_endpoint, const char *soap_action, char *key, char *type, int *result);
    268371
    269 SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns1__find_USCOREobjects(struct soap *soap, const char *soap_endpoint, const char *soap_action, char *pattern, struct ns1__find_USCOREobjectsResponse *param_1);
    270 
    271 SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns1__find_USCOREinstances(struct soap *soap, const char *soap_endpoint, const char *soap_action, char *key, char *volume, struct ns1__find_USCOREinstancesResponse *param_2);
     372SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns1__find_USCOREobjects(struct soap *soap, const char *soap_endpoint, const char *soap_action, char *pattern, struct ns1__find_USCOREobjectsResponse *_param_1);
     373
     374SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns1__find_USCOREinstances(struct soap *soap, const char *soap_endpoint, const char *soap_action, char *key, char *volume, struct ns1__find_USCOREinstancesResponse *_param_2);
    272375
    273376SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns1__delete_USCOREinstance(struct soap *soap, const char *soap_endpoint, const char *soap_action, char *uri, int *result);
    274377
    275 SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns1__stat_USCOREobject(struct soap *soap, const char *soap_endpoint, const char *soap_action, char *key, struct ns1__stat_USCOREobjectResponse *param_3);
     378SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns1__stat_USCOREobject(struct soap *soap, const char *soap_endpoint, const char *soap_action, char *key, struct ns1__stat_USCOREobjectResponse *_param_3);
    276379
    277380/******************************************************************************\
     
    304407
    305408SOAP_FMAC5 int SOAP_FMAC6 soap_serve_ns1__stat_USCOREobject(struct soap*);
    306 
    307 SOAP_END_NAMESPACE(soap)
    308409
    309410#ifdef __cplusplus
  • trunk/Nebulous/nebclient/src/stdsoap2.c

    r3017 r19542  
    11/*
    2 
    3 stdsoap2.c[pp] 2.7.0d
    4 
    5 Runtime environment.
     2        stdsoap2.c[pp] 2.7.11-upd
     3
     4        gSOAP runtime engine
    65
    76gSOAP XML Web services tools
    8 Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc., All Rights Reserved.
    9 
     7Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved.
     8This part of the software is released under ONE of the following licenses:
     9GPL, the gSOAP public license, OR Genivia's license for commercial use.
     10--------------------------------------------------------------------------------
    1011Contributors:
    1112
    12 Wind River Systems, Inc., for the following additions (marked WR[...]):
     13Wind River Systems Inc., for the following additions under gSOAP public license:
    1314  - vxWorks compatible
    14   - Support for IPv6.
    15 
    1615--------------------------------------------------------------------------------
    1716gSOAP public license.
     
    2625
    2726The Initial Developer of the Original Code is Robert A. van Engelen.
    28 Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc., All Rights Reserved.
     27Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved.
    2928--------------------------------------------------------------------------------
    3029GPL license.
     
    4544Author contact information:
    4645engelen@genivia.com / engelen@acm.org
     46
     47This program is released under the GPL with the additional exemption that
     48compiling, linking, and/or using OpenSSL is allowed.
     49--------------------------------------------------------------------------------
     50A commercial use license is available from Genivia, Inc., contact@genivia.com
    4751--------------------------------------------------------------------------------
    4852
     
    6064*/
    6165
     66#ifdef AS400
     67# pragma convert(819)   /* EBCDIC to ASCII */
     68#endif
     69
    6270#include "stdsoap2.h"
    6371
     72#ifdef __BORLANDC__
     73# pragma warn -8060
     74#else
     75# ifdef WIN32
     76#  ifdef UNDER_CE
     77#   pragma comment(lib, "winsock.lib")
     78#  else
     79#   pragma comment(lib, "wsock32.lib")
     80#  endif
     81#  pragma warning(disable : 4996) /* disable deprecation warnings */
     82# endif
     83#endif
     84
    6485#ifdef __cplusplus
    65 SOAP_SOURCE_STAMP("@(#) stdsoap2.cpp ver 2.7.0c 2004-09-27 12:00:00 GMT")
     86SOAP_SOURCE_STAMP("@(#) stdsoap2.cpp ver 2.7.11 2008-07-26 00:00:00 GMT")
    6687extern "C" {
    6788#else
    68 SOAP_SOURCE_STAMP("@(#) stdsoap2.c ver 2.7.0c 2004-09-27 12:00:00 GMT")
    69 #endif
    70 
    71 /* 8bit character representing unknown/nonrepresentable character data (e.g. not supported by current locale) */
     89SOAP_SOURCE_STAMP("@(#) stdsoap2.c ver 2.7.11 2008-07-26 00:00:00 GMT")
     90#endif
     91
     92/* 8bit character representing unknown/nonrepresentable character data (e.g. not supported by current locale with multibyte support enabled) */
    7293#ifndef SOAP_UNKNOWN_CHAR
    7394#define SOAP_UNKNOWN_CHAR (127)
     
    83104#define soap_blank(c)           ((c) >= 0 && (c) <= 32)
    84105#define soap_notblank(c)        ((c) > 32)
    85 #define soap_hash_ptr(p)        (((unsigned long)(p) >> 3) & (SOAP_PTRHASH - 1))
    86 
     106
     107#if defined(WIN32) && !defined(UNDER_CE)
     108#define soap_hash_ptr(p)        ((PtrToUlong(p) >> 3) & (SOAP_PTRHASH - 1))
     109#else
     110#define soap_hash_ptr(p)        ((size_t)(((unsigned long)(p) >> 3) & (SOAP_PTRHASH-1)))
     111#endif
     112
     113#ifdef SOAP_DEBUG
     114static void soap_init_logs(struct soap*);
     115static void soap_close_logfile(struct soap*, int);
     116static void soap_set_logfile(struct soap*, int, const char*);
     117#endif
     118
     119#ifdef SOAP_MEM_DEBUG
     120static void soap_init_mht(struct soap*);
     121static void soap_free_mht(struct soap*);
     122static void soap_track_unlink(struct soap*, const void*);
     123#endif
     124
     125#ifndef PALM_2
     126static int soap_set_error(struct soap*, const char*, const char*, const char*, const char*, int);
     127static int soap_copy_fault(struct soap*, const char*, const char*, const char*, const char*);
     128static int soap_getattrval(struct soap*, char*, size_t, soap_wchar);
     129#endif
     130
     131#ifndef PALM_1
     132static soap_wchar soap_char(struct soap*);
     133static soap_wchar soap_get_pi(struct soap*);
    87134static int soap_isxdigit(int);
    88 static soap_wchar soap_char(struct soap*);
    89 static soap_wchar soap_getchunkchar(struct soap*);
    90 static void soap_update_ptrs(struct soap*, char*, char*, long);
     135static void *fplugin(struct soap*, const char*);
     136#ifndef WITH_NOIDREF
     137static void soap_update_ptrs(struct soap*, char*, char*, char*, char*);
    91138static int soap_has_copies(struct soap*, const char*, const char*);
    92 static struct soap_ilist *soap_hlookup(struct soap*, const char*);
    93139static void soap_init_iht(struct soap*);
    94140static void soap_free_iht(struct soap*);
    95141static void soap_init_pht(struct soap*);
    96142static void soap_free_pht(struct soap*);
    97 static int soap_set_error(struct soap*, const char*, const char*, const char*, int);
     143#endif
     144#endif
     145
     146#ifndef WITH_LEAN
    98147static const char *soap_set_validation_fault(struct soap*, const char*, const char*);
    99 static int soap_copy_fault(struct soap*, const char*, const char*, const char*);
    100 static int soap_getattrval(struct soap*, char*, size_t, soap_wchar);
    101 static void soap_set_local_namespaces(struct soap*);
    102148static int soap_isnumeric(struct soap*, const char*);
    103 static void *fplugin(struct soap*, const char*);
    104 static const char *soap_decode(char*, size_t, const char*, const char*);
    105 
    106 #ifndef WITH_LEAN
    107 static time_t soap_timegm(struct tm*);
    108 #endif
    109 
    110 #ifdef SOAP_DEBUG
    111 static void soap_init_logs(struct soap*);
    112 static void soap_close_logfile(struct soap*, int);
    113 static void soap_set_logfile(struct soap*, int, const char*);
    114 #endif
    115 
    116 #ifdef WITH_FAST
    117 static int soap_append_lab(struct soap*, const char*, size_t);
     149static struct soap_nlist *soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized);
     150static void soap_pop_ns(struct soap *soap);
     151static void soap_utilize_ns(struct soap *soap, const char *tag, size_t n);
    118152#endif
    119153
    120154#ifndef WITH_LEANER
     155#ifndef PALM_1
    121156static struct soap_multipart *soap_new_multipart(struct soap*, struct soap_multipart**, struct soap_multipart**, char*, size_t);
    122157static int soap_putdimefield(struct soap*, const char*, size_t);
     
    124159static void soap_select_mime_boundary(struct soap*);
    125160static int soap_valid_mime_boundary(struct soap*);
     161static void soap_resolve_attachment(struct soap*, struct soap_multipart*);
     162#endif
    126163#endif
    127164
     
    131168
    132169#ifdef WITH_OPENSSL
     170int soap_ssl_init_done = 0;
     171
    133172static int ssl_auth_init(struct soap*);
    134173static int ssl_verify_callback(int, X509_STORE_CTX*);
     174static int ssl_verify_callback_allow_expired_certificate(int, X509_STORE_CTX*);
    135175static int ssl_password(char*, int, int, void *);
    136 static const char *ssl_error(struct soap*, int);
    137 /* This callback is included for future references. It should not be deleted
     176/* The callback below is included for future references:
    138177static DH *ssl_tmp_dh(SSL*, int, int);
    139178*/
    140179#endif
    141180
    142 static const char *soap_strerror(struct soap*);
    143 static const char *tcp_error(struct soap*);
     181#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER)
     182#ifndef PALM_1
     183static const char *soap_decode(char*, size_t, const char*, const char*);
     184#endif
     185#endif
     186
     187#ifndef WITH_NOHTTP
     188#ifndef PALM_1
     189static soap_wchar soap_getchunkchar(struct soap*);
    144190static const char *http_error(struct soap*, int);
    145191static int http_post(struct soap*, const char*, const char*, int, const char*, const char*, size_t);
    146192static int http_get(struct soap*);
     193static int http_put(struct soap*);
     194static int http_del(struct soap*);
     195static int http_head(struct soap*);
    147196static int http_send_header(struct soap*, const char*);
    148197static int http_post_header(struct soap*, const char*, const char*);
     
    150199static int http_parse(struct soap*);
    151200static int http_parse_header(struct soap*, const char*, const char*);
    152 #ifndef MAC_CARBON
     201#endif
     202#endif
     203
     204#ifndef WITH_NOIO
     205
     206#ifndef PALM_1
     207static int fsend(struct soap*, const char*, size_t);
     208static size_t frecv(struct soap*, char*, size_t);
     209static int tcp_init(struct soap*);
     210static const char *tcp_error(struct soap*);
     211#ifndef WITH_LEAN
     212static size_t frecv_stop(struct soap*, char*, size_t);
     213#endif
     214#ifndef WITH_IPV6
    153215static int tcp_gethost(struct soap*, const char *addr, struct in_addr *inaddr);
    154 static int tcp_connect(struct soap*, const char *endpoint, const char *host, int port);
    155 static int tcp_accept(struct soap*, int, struct sockaddr*, int*);
     216#endif
     217static SOAP_SOCKET tcp_connect(struct soap*, const char *endpoint, const char *host, int port);
     218static SOAP_SOCKET tcp_accept(struct soap*, SOAP_SOCKET, struct sockaddr*, int*);
    156219static int tcp_disconnect(struct soap*);
    157220static int tcp_closesocket(struct soap*, SOAP_SOCKET);
    158221static int tcp_shutdownsocket(struct soap*, SOAP_SOCKET, int);
    159 static int fsend(struct soap*, const char*, size_t);
    160 static size_t frecv(struct soap*, char*, size_t);
    161 #endif
    162 
    163 /* WR[ */
    164 #ifdef VXWORKS
    165 static int vx_nonblocking = TRUE; /* ioctl argument */
    166 #endif
    167 /* ]WR */
     222static const char *soap_strerror(struct soap*);
     223#endif
     224
     225#if defined(WIN32)
     226  #define SOAP_SOCKBLOCK(fd) \
     227  { u_long blocking = 0; \
     228    ioctlsocket(fd, FIONBIO, &blocking); \
     229  }
     230  #define SOAP_SOCKNONBLOCK(fd) \
     231  { u_long nonblocking = 1; \
     232    ioctlsocket(fd, FIONBIO, &nonblocking); \
     233  }
     234#elif defined(VXWORKS)
     235  #define SOAP_SOCKBLOCK(fd) \
     236  { u_long blocking = 0; \
     237    ioctl(fd, FIONBIO, (int)(&blocking)); \
     238  }
     239  #define SOAP_SOCKNONBLOCK(fd) \
     240  { u_long nonblocking = 1; \
     241    ioctl(fd, FIONBIO, (int)(&nonblocking)); \
     242  }
     243#elif defined(PALM)
     244  #define SOAP_SOCKBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0)&~O_NONBLOCK);
     245  #define SOAP_SOCKNONBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0)|O_NONBLOCK);
     246#elif defined(SYMBIAN)
     247  #define SOAP_SOCKBLOCK(fd) \
     248  { long blocking = 0; \
     249    ioctl(fd, 0/*FIONBIO*/, &blocking); \
     250  }
     251  #define SOAP_SOCKNONBLOCK(fd) \
     252  { long nonblocking = 1; \
     253    ioctl(fd, 0/*FIONBIO*/, &nonblocking); \
     254  }
     255#else
     256  #define SOAP_SOCKBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)&~O_NONBLOCK);
     257  #define SOAP_SOCKNONBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)|O_NONBLOCK);
     258#endif
     259
     260#endif
    168261
    169262#if defined(PALM) && !defined(PALM_2)
     
    185278#endif
    186279
    187 static const char soap_padding[3] = "\0\0";
     280#ifndef WITH_LEAN
     281static const char soap_indent[11] = "\n\t\t\t\t\t\t\t\t\t";
     282/* Alternative indentation form for SOAP_XML_INDENT:
     283static const char soap_indent[21] = "\n                   ";
     284*/
     285#endif
     286
     287#ifndef SOAP_CANARY
     288# define SOAP_CANARY (0xC0DE)
     289#endif
     290
     291static const char soap_padding[4] = "\0\0\0";
    188292#define SOAP_STR_PADDING (soap_padding)
    189293#define SOAP_STR_EOS (soap_padding)
     294#define SOAP_NON_NULL (soap_padding)
    190295
    191296#ifndef WITH_LEAN
     
    291396#endif
    292397
     398#ifndef WITH_NOIO
    293399#ifndef WITH_LEAN
    294400static const struct soap_code_map h_error_codes[] =
     
    312418};
    313419#endif
    314 
     420#endif
     421
     422#ifndef WITH_NOHTTP
    315423#ifndef WITH_LEAN
    316424static const struct soap_code_map h_http_error_codes[] =
    317 { { 201, "Created" },
     425{ { 200, "OK" },
     426  { 201, "Created" },
    318427  { 202, "Accepted" },
    319428  { 203, "Non-Authoritative Information" },
     
    355464};
    356465#endif
     466#endif
    357467
    358468#ifdef WITH_OPENSSL
     
    388498#endif
    389499
    390 /******************************************************************************/
    391 #ifndef MAC_CARBON
     500#if defined(HP_UX) && defined(HAVE_GETHOSTBYNAME_R)
     501extern int h_errno;
     502#endif
     503
     504/******************************************************************************/
     505#ifndef WITH_NOIO
    392506#ifndef PALM_1
    393507static int
    394508fsend(struct soap *soap, const char *s, size_t n)
    395 { register int nwritten;
     509{ register int nwritten, err;
    396510#if defined(__cplusplus) && !defined(WITH_LEAN)
    397511  if (soap->os)
    398   { soap->os->write(s, n);
     512  { soap->os->write(s, (std::streamsize)n);
    399513    if (soap->os->good())
    400514      return SOAP_OK;
     515    soap->errnum = 0;
    401516    return SOAP_EOF;
    402517  }
     
    407522#ifndef WITH_LEAN
    408523      if (soap->send_timeout)
    409       { struct timeval timeout;
    410         fd_set fd;
    411         if (soap->send_timeout > 0)
    412         { timeout.tv_sec = soap->send_timeout;
    413           timeout.tv_usec = 0;
    414         }
    415         else
    416         { timeout.tv_sec = -soap->send_timeout/1000000;
    417           timeout.tv_usec = -soap->send_timeout%1000000;
    418         }
    419         FD_ZERO(&fd);
    420         FD_SET((SOAP_SOCKET)soap->socket, &fd);
     524      {
     525#ifndef WIN32
     526        if ((int)soap->socket >= (int)FD_SETSIZE)
     527          return SOAP_FD_EXCEEDED;      /* Hint: MUST increase FD_SETSIZE */
     528#endif
    421529        for (;;)
    422         { register int r = select((SOAP_SOCKET)(soap->socket + 1), NULL, &fd, &fd, &timeout);
     530        { struct timeval timeout;
     531          fd_set fd;
     532          register int r;
     533          if (soap->send_timeout > 0)
     534          { timeout.tv_sec = soap->send_timeout;
     535            timeout.tv_usec = 0;
     536          }
     537          else
     538          { timeout.tv_sec = -soap->send_timeout/1000000;
     539            timeout.tv_usec = -soap->send_timeout%1000000;
     540          }
     541          FD_ZERO(&fd);
     542          FD_SET(soap->socket, &fd);
     543#ifdef WITH_OPENSSL
     544          if (soap->ssl)
     545            r = select((int)soap->socket + 1, &fd, &fd, &fd, &timeout);
     546          else
     547#endif
     548          r = select((int)soap->socket + 1, NULL, &fd, &fd, &timeout);
    423549          if (r > 0)
    424550            break;
     
    427553            return SOAP_EOF;
    428554          }
    429           if (soap_socket_errno != SOAP_EINTR)
    430           { soap->errnum = soap_socket_errno;
     555          err = soap_socket_errno(soap->socket);
     556          if (err != SOAP_EINTR && err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK)
     557          { soap->errnum = err;
    431558            return SOAP_EOF;
    432559          }
     
    436563#ifdef WITH_OPENSSL
    437564      if (soap->ssl)
    438         nwritten = SSL_write(soap->ssl, s, n);
     565        nwritten = SSL_write(soap->ssl, s, (int)n);
     566      else if (soap->bio)
     567        nwritten = BIO_write(soap->bio, s, (int)n);
    439568      else
    440569#endif
    441 #ifndef PALM
    442         nwritten = send((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags);
     570#ifndef WITH_LEAN
     571      if ((soap->omode & SOAP_IO_UDP))
     572      { if (soap->peerlen)
     573          nwritten = sendto(soap->socket, s, (SOAP_WINSOCKINT)n, soap->socket_flags, (struct sockaddr*)&soap->peer, (SOAP_WINSOCKINT)soap->peerlen);
     574        else
     575          nwritten = send(soap->socket, s, (SOAP_WINSOCKINT)n, soap->socket_flags);
     576        /* retry and back-off algorithm */
     577        /* TODO: this is not very clear from specs so verify and limit conditions under which we should loop (e.g. ENOBUFS) */
     578        if (nwritten < 0)
     579        { struct timeval timeout;
     580          fd_set fd;
     581          int udp_repeat;
     582          int udp_delay;
     583#ifndef WIN32
     584          if ((int)soap->socket >= (int)FD_SETSIZE)
     585            return SOAP_FD_EXCEEDED;    /* Hint: MUST increase FD_SETSIZE */
     586#endif
     587          if ((soap->connect_flags & SO_BROADCAST))
     588            udp_repeat = 3; /* SOAP-over-UDP MULTICAST_UDP_REPEAT - 1 */
     589          else
     590            udp_repeat = 1; /* SOAP-over-UDP UNICAST_UDP_REPEAT - 1 */
     591          udp_delay = (soap_random % 201) + 50; /* UDP_MIN_DELAY .. UDP_MAX_DELAY */
     592          do
     593          { timeout.tv_sec = 0;
     594            timeout.tv_usec = 1000 * udp_delay; /* ms */
     595            FD_ZERO(&fd);
     596            FD_SET(soap->socket, &fd);
     597            select((int)soap->socket + 1, NULL, NULL, &fd, &timeout);
     598            if (soap->peerlen)
     599              nwritten = sendto(soap->socket, s, (SOAP_WINSOCKINT)n, soap->socket_flags, (struct sockaddr*)&soap->peer, (SOAP_WINSOCKINT)soap->peerlen);
     600            else
     601              nwritten = send(soap->socket, s, (SOAP_WINSOCKINT)n, soap->socket_flags);
     602            udp_delay <<= 1;
     603            if (udp_delay > 500) /* UDP_UPPER_DELAY */
     604              udp_delay = 500;
     605          }
     606          while (nwritten < 0 && --udp_repeat > 0);
     607        }
     608      }
     609      else
     610#endif
     611#if !defined(PALM) && !defined(AS400)
     612        nwritten = send(soap->socket, s, (int)n, soap->socket_flags);
    443613#else
    444         nwritten = send((SOAP_SOCKET)soap->socket, (void*)s, n, soap->socket_flags);
     614        nwritten = send(soap->socket, (void*)s, n, soap->socket_flags);
    445615#endif
    446616      if (nwritten <= 0)
    447617      {
     618#if defined(WITH_OPENSSL) || !defined(WITH_LEAN)
     619        register int r = 0;
     620#endif
     621        err = soap_socket_errno(soap->socket);
    448622#ifdef WITH_OPENSSL
    449         int err;
    450         if (soap->ssl && (err = SSL_get_error(soap->ssl, nwritten)) != SSL_ERROR_NONE && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE)
     623        if (soap->ssl && (r = SSL_get_error(soap->ssl, nwritten)) != SSL_ERROR_NONE && r != SSL_ERROR_WANT_READ && r != SSL_ERROR_WANT_WRITE)
     624        { soap->errnum = err;
    451625          return SOAP_EOF;
    452 #endif
    453         if (soap_socket_errno != SOAP_EINTR && soap_socket_errno != SOAP_EWOULDBLOCK && soap_socket_errno != SOAP_EAGAIN)
    454         { soap->errnum = soap_socket_errno;
     626        }
     627#endif
     628        if (err == SOAP_EWOULDBLOCK || err == SOAP_EAGAIN)
     629        {
     630#ifndef WITH_LEAN
     631          struct timeval timeout;
     632          fd_set fd;
     633#ifndef WIN32
     634          if ((int)soap->socket >= (int)FD_SETSIZE)
     635            return SOAP_FD_EXCEEDED; /* Hint: MUST increase FD_SETSIZE */
     636#endif
     637          if (soap->send_timeout > 0)
     638          { timeout.tv_sec = soap->send_timeout;
     639            timeout.tv_usec = 0;
     640          }
     641          else if (soap->send_timeout < 0)
     642          { timeout.tv_sec = -soap->send_timeout/1000000;
     643            timeout.tv_usec = -soap->send_timeout%1000000;
     644          }
     645          else
     646          { timeout.tv_sec = 0;
     647            timeout.tv_usec = 10000;
     648          }
     649          FD_ZERO(&fd);
     650          FD_SET(soap->socket, &fd);
     651#ifdef WITH_OPENSSL
     652          if (soap->ssl && r == SSL_ERROR_WANT_READ)
     653            r = select((int)soap->socket + 1, &fd, NULL, &fd, &timeout);
     654          else
     655            r = select((int)soap->socket + 1, NULL, &fd, &fd, &timeout);
     656#else
     657          r = select((int)soap->socket + 1, NULL, &fd, &fd, &timeout);
     658#endif
     659          if (r < 0 && (r = soap_socket_errno(soap->socket)) != SOAP_EINTR)
     660          { soap->errnum = r;
     661            return SOAP_EOF;
     662          }
     663#endif
     664        }
     665        else if (err && err != SOAP_EINTR)
     666        { soap->errnum = err;
    455667          return SOAP_EOF;
    456668        }
     
    467679      nwritten = fwrite(s, 1, n, soap->sendfd);
    468680#else
    469 /* WR[ */
    470681#ifdef VXWORKS
    471682#ifdef WMW_RPM_IO
    472683      if (soap->rpmreqid)
    473           {
    474           httpBlockPut(soap->rpmreqid, s, n);
    475           nwritten = n;
    476           }
     684        nwritten = (httpBlockPut(soap->rpmreqid, s, n) == 0) ? n : -1;
    477685      else
    478           {
    479           nwritten = fwrite(s, sizeof(char), n, fdopen(soap->sendfd, "w"));
    480           }
     686#endif
     687        nwritten = fwrite(s, sizeof(char), n, fdopen(soap->sendfd, "w"));
    481688#else
    482       nwritten = fwrite(s, sizeof(char), n, fdopen(soap->sendfd, "w"));
    483 #endif /* WMW_RPM_IO */
     689      nwritten = write(soap->sendfd, s, (unsigned int)n);
     690#endif
     691#endif
     692#endif
     693      if (nwritten <= 0)
     694      {
     695#ifndef WITH_FASTCGI
     696        err = soap_errno;
    484697#else
    485 /* ]WR */
    486       nwritten = write((SOAP_SOCKET)soap->sendfd, s, n);
    487 /* WR[ */
    488 #endif
    489 /* ]WR */
    490 #endif
    491 #endif
    492       if (nwritten <= 0)
    493       { if (soap_errno != SOAP_EINTR && soap_errno != SOAP_EWOULDBLOCK && soap_errno != SOAP_EAGAIN)
    494         { soap->errnum = soap_errno;
     698        err = EOF;
     699#endif
     700        if (err && err != SOAP_EINTR && err != SOAP_EWOULDBLOCK && err != SOAP_EAGAIN)
     701        { soap->errnum = err;
    495702          return SOAP_EOF;
    496703        }
     
    504711}
    505712#endif
    506 #endif
    507 
    508 /******************************************************************************/
    509 #ifndef PALM_1
    510 SOAP_FMAC1
    511 int
    512 SOAP_FMAC2
    513 soap_flush_raw(struct soap *soap, const char *s, size_t n)
    514 { if ((soap->mode & SOAP_IO) == SOAP_IO_STORE)
    515   { register char *t;
    516     if (!(t = (char*)soap_push_block(soap, n)))
    517       return soap->error = SOAP_EOM;
    518     memcpy(t, s, n);
    519     if (soap->fpreparesend)
    520       return soap->fpreparesend(soap, s, n);
    521     return SOAP_OK;
    522   }
    523   if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
    524   { char t[16];
    525     sprintf(t, "\r\n%lX\r\n" + (soap->chunksize ? 0 : 2), (unsigned long)n);
    526     DBGMSG(SENT, t, strlen(t));
    527     if ((soap->error = soap->fsend(soap, t, strlen(t))))
    528       return soap->error;
    529     soap->chunksize += n;
    530   }
    531   DBGMSG(SENT, s, n);
    532   return soap->error = soap->fsend(soap, s, n);
    533 }
    534 #endif
    535 
    536 /******************************************************************************/
    537 #ifndef PALM_1
    538 SOAP_FMAC1
    539 int
    540 SOAP_FMAC2
    541 soap_flush(struct soap *soap)
    542 { if (soap->bufidx)
    543   {
    544 #ifdef WITH_ZLIB
    545     if (soap->mode & SOAP_ENC_ZLIB)
    546     { soap->d_stream.next_in = (Byte*)soap->buf;
    547       soap->d_stream.avail_in = (unsigned int)soap->bufidx;
    548 #ifdef WITH_GZIP
    549       soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->bufidx);
    550 #endif
    551       do
    552       { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating %u bytes\n", soap->d_stream.avail_in));
    553         if (deflate(&soap->d_stream, Z_NO_FLUSH) != Z_OK)
    554         { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to deflate: %s\n", soap->d_stream.msg?soap->d_stream.msg:""));
    555           return soap->error = SOAP_ZLIB_ERROR;
    556         }
    557         if (!soap->d_stream.avail_out)
    558         { if (soap_flush_raw(soap, soap->z_buf, SOAP_BUFLEN))
    559             return soap->error;
    560           soap->d_stream.next_out = (Byte*)soap->z_buf;
    561           soap->d_stream.avail_out = SOAP_BUFLEN;
    562         }
    563       } while (soap->d_stream.avail_in);
    564     }
    565     else
    566 #endif
    567     if (soap_flush_raw(soap, soap->buf, soap->bufidx))
    568       return soap->error;
    569     soap->bufidx = 0;
    570   }
    571   return SOAP_OK;
    572 }
    573713#endif
    574714
     
    583723  if (soap->mode & SOAP_IO_LENGTH)
    584724  { soap->count += n;
     725#ifndef WITH_LEANER
    585726    if (soap->fpreparesend && (soap->mode & SOAP_IO) != SOAP_IO_STORE)
    586       return soap->fpreparesend(soap, s, n);
     727      return soap->error = soap->fpreparesend(soap, s, n);
     728#endif
    587729    return SOAP_OK;
    588730  }
     
    611753int
    612754SOAP_FMAC2
     755soap_flush(struct soap *soap)
     756{ register size_t n = soap->bufidx;
     757  if (n)
     758  { soap->bufidx = 0;
     759#ifdef WITH_ZLIB
     760    if (soap->mode & SOAP_ENC_ZLIB)
     761    { soap->d_stream->next_in = (Byte*)soap->buf;
     762      soap->d_stream->avail_in = (unsigned int)n;
     763#ifdef WITH_GZIP
     764      soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)n);
     765#endif
     766      do
     767      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating %u bytes\n", soap->d_stream->avail_in));
     768        if (deflate(soap->d_stream, Z_NO_FLUSH) != Z_OK)
     769        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to deflate: %s\n", soap->d_stream->msg?soap->d_stream->msg:SOAP_STR_EOS));
     770          return soap->error = SOAP_ZLIB_ERROR;
     771        }
     772        if (!soap->d_stream->avail_out)
     773        { if (soap_flush_raw(soap, soap->z_buf, SOAP_BUFLEN))
     774            return soap->error;
     775          soap->d_stream->next_out = (Byte*)soap->z_buf;
     776          soap->d_stream->avail_out = SOAP_BUFLEN;
     777        }
     778      } while (soap->d_stream->avail_in);
     779    }
     780    else
     781#endif
     782      return soap_flush_raw(soap, soap->buf, n);
     783  }
     784  return SOAP_OK;
     785}
     786#endif
     787
     788/******************************************************************************/
     789#ifndef PALM_1
     790SOAP_FMAC1
     791int
     792SOAP_FMAC2
     793soap_flush_raw(struct soap *soap, const char *s, size_t n)
     794{ if ((soap->mode & SOAP_IO) == SOAP_IO_STORE)
     795  { register char *t;
     796    if (!(t = (char*)soap_push_block(soap, NULL, n)))
     797      return soap->error = SOAP_EOM;
     798    memcpy(t, s, n);
     799#ifndef WITH_LEANER
     800    if (soap->fpreparesend)
     801      return soap->error = soap->fpreparesend(soap, s, n);
     802#endif
     803    return SOAP_OK;
     804  }
     805#ifndef WITH_LEANER
     806  if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
     807  { char t[16];
     808    sprintf(t, "\r\n%lX\r\n" + (soap->chunksize ? 0 : 2), (unsigned long)n);
     809    DBGMSG(SENT, t, strlen(t));
     810    if ((soap->error = soap->fsend(soap, t, strlen(t))))
     811      return soap->error;
     812    soap->chunksize += n;
     813  }
     814  DBGMSG(SENT, s, n);
     815#endif
     816  return soap->error = soap->fsend(soap, s, n);
     817}
     818#endif
     819
     820/******************************************************************************/
     821#ifndef PALM_1
     822SOAP_FMAC1
     823int
     824SOAP_FMAC2
    613825soap_send(struct soap *soap, const char *s)
    614826{ if (s)
     
    619831
    620832/******************************************************************************/
     833#ifndef WITH_LEANER
    621834#ifndef PALM_1
    622835SOAP_FMAC1
     
    629842}
    630843#endif
    631 
    632 /******************************************************************************/
     844#endif
     845
     846/******************************************************************************/
     847#ifndef WITH_LEANER
    633848#ifndef PALM_1
    634849SOAP_FMAC1
     
    642857}
    643858#endif
    644 
    645 /******************************************************************************/
    646 #ifndef MAC_CARBON
     859#endif
     860
     861/******************************************************************************/
     862#ifndef WITH_NOIO
    647863#ifndef PALM_1
    648864static size_t
    649865frecv(struct soap *soap, char *s, size_t n)
    650866{ register int r;
     867#ifndef WITH_LEAN
     868  register int retries = 100; /* max 100 retries with non-blocking sockets */
     869#endif
    651870  soap->errnum = 0;
    652871#if defined(__cplusplus) && !defined(WITH_LEAN)
    653872  if (soap->is)
    654873  { if (soap->is->good())
    655       return soap->is->read(s, n).gcount();
     874      return soap->is->read(s, (std::streamsize)n).gcount();
    656875    return 0;
    657876  }
     
    660879  { for (;;)
    661880    {
     881#ifdef WITH_OPENSSL
     882      register int err = 0;
     883#endif
    662884#ifndef WITH_LEAN
    663       struct timeval timeout;
    664       fd_set fd;
     885#ifdef WITH_OPENSSL
     886      if (soap->recv_timeout && !soap->ssl) /* SSL: sockets are nonblocking */
     887#else
    665888      if (soap->recv_timeout)
    666       { if (soap->recv_timeout > 0)
     889#endif
     890      {
     891#ifndef WIN32
     892        if ((int)soap->socket >= (int)FD_SETSIZE)
     893        { soap->error = SOAP_FD_EXCEEDED;
     894          return 0;     /* Hint: MUST increase FD_SETSIZE */
     895        }
     896#endif
     897        for (;;)
     898        { struct timeval timeout;
     899          fd_set fd;
     900          if (soap->recv_timeout > 0)
     901          { timeout.tv_sec = soap->recv_timeout;
     902            timeout.tv_usec = 0;
     903          }
     904          else
     905          { timeout.tv_sec = -soap->recv_timeout/1000000;
     906            timeout.tv_usec = -soap->recv_timeout%1000000;
     907          }
     908          FD_ZERO(&fd);
     909          FD_SET(soap->socket, &fd);
     910          r = select((int)soap->socket + 1, &fd, NULL, &fd, &timeout);
     911          if (r > 0)
     912            break;
     913          if (!r)
     914          { soap->errnum = 0;
     915            return 0;
     916          }
     917          r = soap_socket_errno(soap->socket);
     918          if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK)
     919          { soap->errnum = r;
     920            return 0;
     921          }
     922        }
     923      }
     924#endif
     925#ifdef WITH_OPENSSL
     926      if (soap->ssl)
     927      { r = SSL_read(soap->ssl, s, (int)n);
     928        if (r > 0)
     929          return (size_t)r;
     930        err = SSL_get_error(soap->ssl, r);
     931        if (err != SSL_ERROR_NONE && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE)
     932          return 0;
     933      }
     934      else if (soap->bio)
     935      { r = BIO_read(soap->bio, s, (int)n);
     936        if (r > 0)
     937          return (size_t)r;
     938        return 0;
     939      }
     940      else
     941#endif
     942      {
     943#ifndef WITH_LEAN
     944        if ((soap->omode & SOAP_IO_UDP))
     945        { SOAP_SOCKLEN_T k = (SOAP_SOCKLEN_T)sizeof(soap->peer);
     946          memset((void*)&soap->peer, 0, sizeof(soap->peer));
     947          r = recvfrom(soap->socket, s, (SOAP_WINSOCKINT)n, soap->socket_flags, (struct sockaddr*)&soap->peer, &k);     /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */
     948          soap->peerlen = (size_t)k;
     949#ifndef WITH_IPV6
     950          soap->ip = ntohl(soap->peer.sin_addr.s_addr);
     951#endif
     952        }
     953        else
     954#endif
     955          r = recv(soap->socket, s, (int)n, soap->socket_flags);
     956#ifdef PALM
     957        /* CycleSyncDisplay(curStatusMsg); */
     958#endif
     959        if (r >= 0)
     960          return (size_t)r;
     961        r = soap_socket_errno(soap->socket);
     962        if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK)
     963        { soap->errnum = r;
     964          return 0;
     965        }
     966      }
     967#ifndef WITH_LEAN
     968      { struct timeval timeout;
     969        fd_set fd;
     970        if (soap->recv_timeout > 0)
    667971        { timeout.tv_sec = soap->recv_timeout;
    668972          timeout.tv_usec = 0;
    669973        }
    670         else
     974        else if (soap->recv_timeout < 0)
    671975        { timeout.tv_sec = -soap->recv_timeout/1000000;
    672976          timeout.tv_usec = -soap->recv_timeout%1000000;
    673977        }
     978        else
     979        { timeout.tv_sec = 5;
     980          timeout.tv_usec = 0;
     981        }
     982#ifndef WIN32
     983        if ((int)soap->socket >= (int)FD_SETSIZE)
     984        { soap->error = SOAP_FD_EXCEEDED;
     985          return 0;     /* Hint: MUST increase FD_SETSIZE */
     986        }
     987#endif
    674988        FD_ZERO(&fd);
    675         FD_SET((SOAP_SOCKET)soap->socket, &fd);
    676         for (;;)
    677         { r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout);
    678           if (r > 0)
    679             break;
    680           if (r == 0)
    681             return 0;
    682           if (soap_socket_errno != SOAP_EINTR)
    683           { soap->errnum = soap_socket_errno;
     989        FD_SET(soap->socket, &fd);
     990#ifdef WITH_OPENSSL
     991        if (soap->ssl && err == SSL_ERROR_WANT_WRITE)
     992          r = select((int)soap->socket + 1, NULL, &fd, &fd, &timeout);
     993        else
     994          r = select((int)soap->socket + 1, &fd, NULL, &fd, &timeout);
     995#else
     996        r = select((int)soap->socket + 1, &fd, NULL, &fd, &timeout);
     997#endif
     998        if (!r && soap->recv_timeout)
     999        { soap->errnum = 0;
     1000          return 0;
     1001        }
     1002        if (r < 0)
     1003        { r = soap_socket_errno(soap->socket);
     1004          if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK)
     1005          { soap->errnum = r;
    6841006            return 0;
    6851007          }
    6861008        }
    687       }
    688 #endif
    689 #ifdef WITH_OPENSSL
    690       if (soap->ssl)
    691       { int err;
    692         r = SSL_read(soap->ssl, s, n);
    693         if ((err = SSL_get_error(soap->ssl, r)) == SSL_ERROR_NONE)
    694           return (size_t)r;
    695         if (err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE)
    696           return 0;
    697       }
    698       else
    699 #endif
    700       { r = recv((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags);
    701         if (r >= 0)
    702           return (size_t)r;
    703         if (soap_socket_errno != SOAP_EINTR && soap_socket_errno != SOAP_EAGAIN)
    704         { soap->errnum = soap_socket_errno;
     1009        if (retries-- <= 0)
     1010        { soap->errnum = soap_socket_errno(soap->socket);
    7051011          return 0;
    7061012        }
    7071013      }
    708 #ifndef WITH_LEAN
    709       { struct timeval timeout;
    710         fd_set fd;
    711         timeout.tv_sec = 0;
    712         timeout.tv_usec = 10000;
    713         FD_ZERO(&fd);
    714         FD_SET((SOAP_SOCKET)soap->socket, &fd);
    715         r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout);
    716         if (r < 0 && soap_socket_errno != SOAP_EINTR)
    717         { soap->errnum = soap_socket_errno;
    718           return 0;
    719         }
     1014#endif
     1015#ifdef PALM
     1016      r = soap_socket_errno(soap->socket);
     1017      if (r != SOAP_EINTR && retries-- <= 0)
     1018      { soap->errnum = r;
     1019        return 0;
    7201020      }
    7211021#endif
     
    7281028  return fread(s, 1, n, soap->recvfd);
    7291029#else
    730 /* WR[ */
    7311030#ifdef WMW_RPM_IO
    7321031  if (soap->rpmreqid)
    7331032    r = httpBlockRead(soap->rpmreqid, s, n);
    7341033  else
    735     r = read(soap->recvfd, s, n);
    736   if (r >= 0)
    737     return r;
    738   return 0;
    739 #else
    740 /* ]WR */
    741   r = read((SOAP_SOCKET)soap->recvfd, s, n);
     1034#endif
     1035    r = read(soap->recvfd, s, (unsigned int)n);
    7421036  if (r >= 0)
    7431037    return (size_t)r;
    7441038  soap->errnum = soap_errno;
    7451039  return 0;
    746 /* WR[ */
    747 #endif
    748 /* ]WR */
    749 #endif
    750 #endif
    751 }
    752 #endif
    753 #endif
    754 
    755 /******************************************************************************/
     1040#endif
     1041#endif
     1042}
     1043#endif
     1044#endif
     1045
     1046/******************************************************************************/
     1047#ifndef WITH_LEAN
     1048#ifndef WITH_NOIO
     1049#ifndef PALM_1
     1050static size_t
     1051frecv_stop(struct soap *soap, char *s, size_t n)
     1052{ return 0;
     1053}
     1054#endif
     1055#endif
     1056#endif
     1057
     1058/******************************************************************************/
     1059#ifndef WITH_NOHTTP
    7561060#ifndef PALM_1
    7571061static soap_wchar
     
    7611065  soap->bufidx = 0;
    7621066  soap->buflen = soap->chunkbuflen = soap->frecv(soap, soap->buf, SOAP_BUFLEN);
    763   DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes\n", (unsigned int)soap->buflen));
     1067  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket %d\n", (unsigned int)soap->buflen, soap->socket));
    7641068  DBGMSG(RECV, soap->buf, soap->buflen);
    7651069  if (soap->buflen)
     
    7681072}
    7691073#endif
     1074#endif
    7701075
    7711076/******************************************************************************/
     
    7731078static int
    7741079soap_isxdigit(int c)
    775 { switch (c)
    776   { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
    777     case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
    778     case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
    779       return 1;
    780   }
    781   return 0;
     1080{ return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f');
    7821081}
    7831082#endif
     
    7921091#ifdef WITH_ZLIB
    7931092  if (soap->mode & SOAP_ENC_ZLIB)
    794   { if (soap->d_stream.next_out == Z_NULL)
     1093  { if (soap->d_stream->next_out == Z_NULL)
    7951094      return EOF;
    796     if (soap->d_stream.avail_in || !soap->d_stream.avail_out)
     1095    if (soap->d_stream->avail_in || !soap->d_stream->avail_out)
    7971096    { register int r;
    7981097      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflating\n"));
    799       soap->d_stream.next_out = (Byte*)soap->buf;
    800       soap->d_stream.avail_out = SOAP_BUFLEN;
    801       r = inflate(&soap->d_stream, Z_NO_FLUSH);
     1098      soap->d_stream->next_out = (Byte*)soap->buf;
     1099      soap->d_stream->avail_out = SOAP_BUFLEN;
     1100      r = inflate(soap->d_stream, Z_NO_FLUSH);
    8021101      if (r == Z_OK || r == Z_STREAM_END)
    8031102      { soap->bufidx = 0;
    804         soap->buflen = SOAP_BUFLEN - soap->d_stream.avail_out;
     1103        ret = soap->buflen = SOAP_BUFLEN - soap->d_stream->avail_out;
    8051104        if (soap->zlib_in == SOAP_ZLIB_GZIP)
    806           soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->buflen);
     1105          soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)ret);
    8071106        if (r == Z_STREAM_END)
    808         { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %lu->%lu bytes\n", soap->d_stream.total_in, soap->d_stream.total_out));
    809           soap->z_ratio_in = (float)soap->d_stream.total_in / (float)soap->d_stream.total_out;
    810           soap->d_stream.next_out = Z_NULL;
     1107        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out));
     1108          soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out;
     1109          soap->d_stream->next_out = Z_NULL;
    8111110        }
    812         if (soap->buflen)
    813         { soap->count += soap->buflen;
     1111        if (ret)
     1112        { soap->count += ret;
     1113          DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n"));
     1114          DBGMSG(RECV, soap->buf, ret);
     1115          DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n----\n"));
    8141116          return SOAP_OK;
    8151117        }
    8161118      }
    8171119      else if (r != Z_BUF_ERROR)
    818       { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate error: %s\n", soap->d_stream.msg?soap->d_stream.msg:""));
    819         soap->d_stream.next_out = Z_NULL;
     1120      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate error: %s\n", soap->d_stream->msg?soap->d_stream->msg:SOAP_STR_EOS));
     1121        soap->d_stream->next_out = Z_NULL;
     1122        soap->error = SOAP_ZLIB_ERROR;
    8201123        return EOF;
    8211124      }
     
    8261129      soap->buflen = soap->z_buflen;
    8271130    }
    828   }
    829 #endif
     1131    DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- compressed ----\n"));
     1132  }
     1133#endif
     1134#ifndef WITH_NOHTTP
    8301135  if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) /* read HTTP chunked transfer */
    831   {
    832 chunk_again:
    833     if (soap->chunksize)
    834     { soap->buflen = ret = soap->frecv(soap, soap->buf, soap->chunksize > SOAP_BUFLEN ? SOAP_BUFLEN : soap->chunksize);
    835       DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk: read %u bytes\n", (unsigned int)ret));
    836       DBGMSG(RECV, soap->buf, ret);
    837       soap->bufidx = 0;
    838       soap->chunksize -= ret;
    839     }
    840     else
     1136  { for (;;)
    8411137    { register soap_wchar c;
    8421138      char *t, tmp[8];
     1139      if (soap->chunksize)
     1140      { soap->buflen = ret = soap->frecv(soap, soap->buf, soap->chunksize > SOAP_BUFLEN ? SOAP_BUFLEN : soap->chunksize);
     1141        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk: read %u bytes\n", (unsigned int)ret));
     1142        DBGMSG(RECV, soap->buf, ret);
     1143        soap->bufidx = 0;
     1144        soap->chunksize -= ret;
     1145        break;
     1146      }
    8431147      t = tmp;
    8441148      if (!soap->chunkbuflen)
    8451149      { soap->chunkbuflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN);
    846         DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes\n", (unsigned int)ret));
     1150        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes (chunked) from socket %d\n", (unsigned int)ret, soap->socket));
    8471151        DBGMSG(RECV, soap->buf, ret);
    8481152        soap->bufidx = 0;
    8491153        if (!ret)
    850           return EOF;
     1154          return soap->ahead = EOF;
    8511155      }
    8521156      else
    8531157        soap->bufidx = soap->buflen;
    8541158      soap->buflen = soap->chunkbuflen;
    855       DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk size (%u %u)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen));
     1159      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk size (idx=%u len=%u)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen));
    8561160      while (!soap_isxdigit((int)(c = soap_getchunkchar(soap))))
    857         if ((int)c == EOF)
    858           return EOF;
     1161      { if ((int)c == EOF)
     1162          return soap->ahead = EOF;
     1163      }
    8591164      do
    8601165        *t++ = (char)c;
     
    8631168        c = soap_getchunkchar(soap);
    8641169      if ((int)c == EOF)
    865         return EOF;
     1170        return soap->ahead = EOF;
    8661171      *t = '\0';
     1172      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunk size = %s (hex)\n", tmp));
    8671173      soap->chunksize = soap_strtoul(tmp, &t, 16);
    8681174      if (!soap->chunksize)
    8691175      { soap->chunkbuflen = 0;
    8701176        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of chunked message\n"));
    871         while ((int)c != EOF && c != '\n')
     1177        while ((int)c != EOF && c != '\n')
    8721178          c = soap_getchunkchar(soap);
    873         return EOF;
     1179        ret = 0;
     1180        soap->ahead = EOF;
     1181        break;
    8741182      }
    8751183      soap->buflen = soap->bufidx + soap->chunksize;
    876       DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving buf len to %u (%u %s)\n", (unsigned int)soap->buflen, (unsigned int)soap->bufidx, tmp));
     1184      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving buf len to idx=%u len=%u (%s)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen, tmp));
    8771185      if (soap->buflen > soap->chunkbuflen)
    8781186      { soap->buflen = soap->chunkbuflen;
    8791187        soap->chunksize -= soap->buflen - soap->bufidx;
    8801188        soap->chunkbuflen = 0;
    881         DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Passed end of buffer for chunked HTTP (%lu bytes left)\n", (unsigned long)(soap->buflen - soap->bufidx)));
     1189        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Passed end of buffer for chunked HTTP (%u bytes left)\n", (unsigned int)(soap->buflen - soap->bufidx)));
    8821190      }
    8831191      else if (soap->chunkbuflen)
    8841192        soap->chunksize = 0;
    8851193      ret = soap->buflen - soap->bufidx;
    886       if (!ret)
    887         goto chunk_again;
     1194      if (ret)
     1195        break;
    8881196    }
    8891197  }
    8901198  else
     1199#endif
    8911200  { soap->bufidx = 0;
    8921201    soap->buflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN);
    893     DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes\n", (unsigned int)ret));
     1202    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket %d\n", (unsigned int)ret, soap->socket));
    8941203    DBGMSG(RECV, soap->buf, ret);
    8951204  }
     1205#ifndef WITH_LEANER
    8961206  if (soap->fpreparerecv && (soap->error = soap->fpreparerecv(soap, soap->buf, ret)))
    8971207    return soap->error;
     1208#endif
    8981209#ifdef WITH_ZLIB
    8991210  if (soap->mode & SOAP_ENC_ZLIB)
    9001211  { register int r;
    9011212    memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN);
    902     soap->d_stream.next_in = (Byte*)(soap->z_buf + soap->bufidx);
    903     soap->d_stream.avail_in = (unsigned int)ret;
    904     soap->d_stream.next_out = (Byte*)soap->buf;
    905     soap->d_stream.avail_out = SOAP_BUFLEN;
    906     r = inflate(&soap->d_stream, Z_NO_FLUSH);
     1213    soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx);
     1214    soap->d_stream->avail_in = (unsigned int)ret;
     1215    soap->d_stream->next_out = (Byte*)soap->buf;
     1216    soap->d_stream->avail_out = SOAP_BUFLEN;
     1217    r = inflate(soap->d_stream, Z_NO_FLUSH);
    9071218    if (r == Z_OK || r == Z_STREAM_END)
    9081219    { soap->bufidx = 0;
    9091220      soap->z_buflen = soap->buflen;
    910       soap->buflen = ret = SOAP_BUFLEN - soap->d_stream.avail_out;
     1221      soap->buflen = SOAP_BUFLEN - soap->d_stream->avail_out;
    9111222      if (soap->zlib_in == SOAP_ZLIB_GZIP)
    9121223        soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->buflen);
    913       DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %u bytes\n", (unsigned int)ret));
    914       if (!ret)
     1224      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %u bytes\n", (unsigned int)soap->buflen));
     1225      if (ret && !soap->buflen)
    9151226        goto zlib_again;
     1227      ret = soap->buflen;
    9161228      if (r == Z_STREAM_END)
    917       { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %lu->%lu bytes\n", soap->d_stream.total_in, soap->d_stream.total_out));
    918         soap->z_ratio_in = (float)soap->d_stream.total_in / (float)soap->d_stream.total_out;
    919         soap->d_stream.next_out = Z_NULL;
    920       }
     1229      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated total %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out));
     1230        soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out;
     1231        soap->d_stream->next_out = Z_NULL;
     1232      }
     1233      DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n"));
     1234      DBGMSG(RECV, soap->buf, ret);
    9211235    }
    9221236    else
    923     { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to inflate: (%d) %s\n", r, soap->d_stream.msg?soap->d_stream.msg:""));
    924       soap->d_stream.next_out = Z_NULL;
     1237    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to inflate: (%d) %s\n", r, soap->d_stream->msg?soap->d_stream->msg:SOAP_STR_EOS));
     1238      soap->d_stream->next_out = Z_NULL;
     1239      soap->error = SOAP_ZLIB_ERROR;
    9251240      return EOF;
    9261241    }
     
    10121327soap_getchar(struct soap *soap)
    10131328{ register soap_wchar c;
    1014   if (soap->ahead)
    1015   { c = soap->ahead;
    1016     soap->ahead = 0;
     1329  c = soap->ahead;
     1330  if (c)
     1331  { if (c != EOF)
     1332      soap->ahead = 0;
    10171333    return c;
    10181334  }
     
    10261342const struct soap_code_map*
    10271343SOAP_FMAC2
    1028 soap_code(const struct soap_code_map *map, const char *str)
    1029 { while (map->string)
    1030   { if (!strcmp(str, map->string)) /* case sensitive */
    1031       return map;
    1032     map++;
     1344soap_code(const struct soap_code_map *code_map, const char *str)
     1345{ if (code_map && str)
     1346  { while (code_map->string)
     1347    { if (!strcmp(str, code_map->string)) /* case sensitive */
     1348        return code_map;
     1349      code_map++;
     1350    }
    10331351  }
    10341352  return NULL;
     
    10411359long
    10421360SOAP_FMAC2
    1043 soap_int_code(const struct soap_code_map *map, const char *str, long other)
    1044 { while (map->string)
    1045   { if (!soap_tag_cmp(str, map->string)) /* case insensitive */
    1046       return map->code;
    1047     map++;
     1361soap_code_int(const struct soap_code_map *code_map, const char *str, long other)
     1362{ if (code_map)
     1363  { while (code_map->string)
     1364    { if (!soap_tag_cmp(str, code_map->string)) /* case insensitive */
     1365        return code_map->code;
     1366      code_map++;
     1367    }
    10481368  }
    10491369  return other;
     
    10561376const char*
    10571377SOAP_FMAC2
    1058 soap_str_code(const struct soap_code_map *map, long code)
    1059 { while (map->code != code && map->string)
    1060     map++;
    1061   return map->string;
     1378soap_code_str(const struct soap_code_map *code_map, long code)
     1379{ if (!code_map)
     1380    return NULL;
     1381  while (code_map->code != code && code_map->string)
     1382    code_map++;
     1383  return code_map->string;
     1384}
     1385#endif
     1386
     1387/******************************************************************************/
     1388#ifndef PALM_1
     1389SOAP_FMAC1
     1390long
     1391SOAP_FMAC2
     1392soap_code_bits(const struct soap_code_map *code_map, const char *str)
     1393{ register long bits = 0;
     1394  if (code_map)
     1395  { while (str && *str)
     1396    { const struct soap_code_map *p;
     1397      for (p = code_map; p->string; p++)
     1398      { register size_t n = strlen(p->string);
     1399        if (!strncmp(p->string, str, n) && soap_blank(str[n]))
     1400        { bits |= p->code;
     1401          str += n;
     1402          while (*str > 0 && *str <= 32)
     1403            str++;
     1404          break;
     1405        }
     1406      }
     1407      if (!p->string)
     1408        return 0;
     1409    }
     1410  }
     1411  return bits;
     1412}
     1413#endif
     1414
     1415/******************************************************************************/
     1416#ifndef PALM_1
     1417SOAP_FMAC1
     1418const char*
     1419SOAP_FMAC2
     1420soap_code_list(struct soap *soap, const struct soap_code_map *code_map, long code)
     1421{ register char *t = soap->tmpbuf;
     1422  if (code_map)
     1423  { while (code_map->string)
     1424    { if (code_map->code & code)
     1425      { register const char *s = code_map->string;
     1426        if (t != soap->tmpbuf)
     1427          *t++ = ' ';
     1428        while (*s && t < soap->tmpbuf + sizeof(soap->tmpbuf) - 1)
     1429          *t++ = *s++;
     1430        if (t == soap->tmpbuf + sizeof(soap->tmpbuf) - 1)
     1431          break;
     1432      }
     1433      code_map++;
     1434    }
     1435  }
     1436  *t = '\0';
     1437  return soap->tmpbuf;
    10621438}
    10631439#endif
     
    10941470    return '\'';
    10951471#ifndef WITH_LEAN
    1096   return (soap_wchar)soap_int_code(html_entity_codes, tmp, SOAP_UNKNOWN_CHAR);
     1472  return (soap_wchar)soap_code_int(html_entity_codes, tmp, SOAP_UNKNOWN_CHAR);
    10971473#else
    10981474  return SOAP_UNKNOWN_CHAR; /* use this to represent unknown code */
    10991475#endif
    11001476}
     1477#endif
     1478
     1479/******************************************************************************/
     1480#ifdef WITH_LEAN
     1481#ifndef PALM_1
     1482soap_wchar
     1483soap_get0(struct soap *soap)
     1484{ if (soap->bufidx >= soap->buflen && soap_recv(soap))
     1485    return EOF;
     1486  return (unsigned char)soap->buf[soap->bufidx];
     1487}
     1488#endif
     1489#endif
     1490
     1491/******************************************************************************/
     1492#ifdef WITH_LEAN
     1493#ifndef PALM_1
     1494soap_wchar
     1495soap_get1(struct soap *soap)
     1496{ if (soap->bufidx >= soap->buflen && soap_recv(soap))
     1497    return EOF;
     1498  return (unsigned char)soap->buf[soap->bufidx++];
     1499}
     1500#endif
    11011501#endif
    11021502
     
    11101510  c = soap->ahead;
    11111511  if (c)
    1112     soap->ahead = 0;
     1512  { if ((int)c != EOF)
     1513      soap->ahead = 0;
     1514  }
    11131515  else
    11141516    c = soap_get1(soap);
    1115   for (;;)
     1517  while ((int)c != EOF)
    11161518  { if (soap->cdata)
    11171519    { if (c == ']')
    11181520      { c = soap_get1(soap);
    11191521        if (c == ']')
    1120         { soap->cdata = 0;
    1121           soap_get1(soap); /* skip > */
    1122           c = soap_get1(soap);
     1522        { c = soap_get0(soap);
     1523          if (c == '>')
     1524          { soap->cdata = 0;
     1525            soap_get1(soap);
     1526            c = soap_get1(soap);
     1527          }
     1528          else
     1529          { soap_unget(soap, ']');
     1530            return ']';
     1531          }
    11231532        }
    1124         else
     1533        else
    11251534        { soap_revget1(soap);
    11261535          return ']';
     
    11351544        while (soap_blank(c));
    11361545        if (c == '!' || c == '?' || c == '%')
    1137         { if (c == '!')
     1546        { register int k = 1;
     1547          if (c == '!')
    11381548          { c = soap_get1(soap);
    11391549            if (c == '[')
     
    11441554              soap->cdata = 1;
    11451555              c = soap_get1(soap);
    1146               continue;
     1556              continue;
    11471557            }
    11481558            if (c == '-' && (c = soap_get1(soap)) == '-')
     
    11541564            }
    11551565          }
    1156           while ((int)c != EOF && c != '>')
     1566          else if (c == '?')
     1567            c = soap_get_pi(soap);
     1568          while ((int)c != EOF)
     1569          { if (c == '<')
     1570              k++;
     1571            else if (c == '>')
     1572            { if (--k <= 0)
     1573                break;
     1574            }
    11571575            c = soap_get1(soap);
    1158           if ((int)c == EOF)
    1159             break;
     1576          }
     1577          if ((int)c == EOF)
     1578            break;
    11601579          c = soap_get1(soap);
    11611580          continue;
     
    11821601/******************************************************************************/
    11831602#ifndef PALM_1
    1184 SOAP_FMAC1
    1185 soap_wchar
    1186 SOAP_FMAC2
    1187 soap_advance(struct soap *soap)
    1188 { register soap_wchar c;
    1189   while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT)
    1190     ;
    1191   return c;
    1192 }
    1193 #endif
    1194 
    1195 /******************************************************************************/
    1196 #ifndef PALM_1
    1197 SOAP_FMAC1
    1198 soap_wchar
    1199 SOAP_FMAC2
    1200 soap_skip(struct soap *soap)
    1201 { register soap_wchar c;
    1202   do c = soap_get(soap);
    1203   while (soap_blank(c));
     1603static soap_wchar
     1604soap_get_pi(struct soap *soap)
     1605{ char buf[64];
     1606  register char *s = buf;
     1607  register int i = sizeof(buf);
     1608  register soap_wchar c = soap_getchar(soap);
     1609  /* This is a quick way to parse XML PI and we could use a callback instead to
     1610   * enable applications to intercept processing instructions */
     1611  while ((int)c != EOF && c != '?')
     1612  { if (--i > 0)
     1613    { if (soap_blank(c))
     1614        c = ' ';
     1615      *s++ = (char)c;
     1616    }
     1617    c = soap_getchar(soap);
     1618  }
     1619  *s = '\0';
     1620  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "XML PI <?%s?>\n", buf));
     1621  if (!strncmp(buf, "xml ", 4))
     1622  { s = strstr(buf, " encoding=");
     1623    if (s && s[10])
     1624    { if (!soap_tag_cmp(s + 11, "iso-8859-1*")
     1625       || !soap_tag_cmp(s + 11, "latin1*"))
     1626      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Switching to latin1 encoding\n"));
     1627        soap->mode |= SOAP_ENC_LATIN;
     1628      }
     1629      else if (!soap_tag_cmp(s + 11, "utf-8*"))
     1630      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Switching to utf-8 encoding\n"));
     1631        soap->mode &= ~SOAP_ENC_LATIN;
     1632      }
     1633    }
     1634  }
     1635  if ((int)c != EOF)
     1636    c = soap_getchar(soap);
    12041637  return c;
    12051638}
     
    12411674soap_pututf8(struct soap *soap, register unsigned long c)
    12421675{ char tmp[16];
    1243   if (c > 0 && c < 0x80)
     1676  if (c < 0x80 && c > 0)
    12441677  { *tmp = (char)c;
    12451678    return soap_send_raw(soap, tmp, 1);
    12461679  }
    12471680#ifndef WITH_LEAN
    1248   if (soap->mode & SOAP_XML_CANONICAL)
     1681  if (c >= 0x80)
    12491682  { register char *t = tmp;
    12501683    if (c < 0x0800)
     
    12721705    *t = '\0';
    12731706  }
    1274   else
    1275 #endif
    1276     sprintf(tmp, "&#%lu;", c);
     1707#else
     1708  sprintf(tmp, "&#%lu;", c);
     1709#endif
    12771710  return soap_send(soap, tmp);
    12781711}
     
    12861719soap_getutf8(struct soap *soap)
    12871720{ register soap_wchar c, c1, c2, c3, c4;
     1721  c = soap->ahead;
     1722  if (c > 0xFF)
     1723  { soap->ahead = 0;
     1724    return c;
     1725  }
     1726again:
    12881727  c = soap_get(soap);
    12891728  if (c < 0x80 || (soap->mode & SOAP_ENC_LATIN))
    12901729    return c;
    1291   c1 = soap_get(soap);
     1730  c1 = soap_get1(soap);
    12921731  if (c1 < 0x80)
    1293   { soap_unget(soap, c1);
     1732  { soap_revget1(soap); /* doesn't look like this is UTF8 */
    12941733    return c;
    12951734  }
     
    12981737    return ((soap_wchar)(c & 0x1F) << 6) | c1;
    12991738  c2 = (soap_wchar)soap_get1(soap) & 0x3F;
     1739  if (c == 0xEF && c1 == 0x3B && c2 == 0x3F)    /* ignore UTF-8 BOM */
     1740    goto again;
    13001741  if (c < 0xF0)
    13011742    return ((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2;
     
    13161757SOAP_FMAC2
    13171758soap_puthex(struct soap *soap, const unsigned char *s, int n)
    1318 { /* TODO: serialize to DOM (as an option) using new soap_s2hex() */
    1319   char d[2];
     1759{ char d[2];
    13201760  register int i;
     1761#ifdef WITH_DOM
     1762  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
     1763  { if (!(soap->dom->data = soap_s2hex(soap, s, NULL, n)))
     1764      return soap->error;
     1765    return SOAP_OK;
     1766  }
     1767#endif
    13211768  for (i = 0; i < n; i++)
    13221769  { register int m = *s++;
     
    13381785soap_gethex(struct soap *soap, int *n)
    13391786{
     1787#ifdef WITH_DOM
     1788  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
     1789  { soap->dom->data = soap_string_in(soap, 0, -1, -1);
     1790    return (unsigned char*)soap_hex2s(soap, soap->dom->data, NULL, 0, n);
     1791  }
     1792#endif
    13401793#ifdef WITH_FAST
    13411794  soap->labidx = 0;
    13421795  for (;;)
    13431796  { register char *s;
    1344     register int i, k;
     1797    register size_t i, k;
    13451798    if (soap_append_lab(soap, NULL, 0))
    13461799      return NULL;
     
    13551808      { d1 = (char)c;
    13561809        c = soap_get(soap);
    1357         if (soap_isxdigit(c))
     1810        if (soap_isxdigit(c))
    13581811          d2 = (char)c;
    13591812        else
     
    13661819        soap_unget(soap, c);
    13671820        if (n)
    1368           *n = (int)(soap->lablen - k + i);
    1369         p = (unsigned char*)soap_malloc(soap, soap->lablen - k + i);
    1370         if (p)
    1371           memcpy(p, soap->labbuf, soap->lablen - k + i);
     1821          *n = (int)(soap->lablen + i - k);
     1822        p = (unsigned char*)soap_malloc(soap, soap->lablen + i - k);
     1823        if (p)
     1824          memcpy(p, soap->labbuf, soap->lablen + i - k);
    13721825        return p;
    13731826      }
     
    13761829  }
    13771830#else
    1378   if (soap_new_block(soap))
     1831  if (soap_new_block(soap) == NULL)
    13791832    return NULL;
    13801833  for (;;)
    13811834  { register int i;
    1382     register char *s = (char*)soap_push_block(soap, SOAP_BLKLEN);
     1835    register char *s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN);
    13831836    if (!s)
    1384     { soap_end_block(soap);
     1837    { soap_end_block(soap, NULL);
    13851838      return NULL;
    13861839    }
     
    13911844      { d1 = (char)c;
    13921845        c = soap_get(soap);
    1393         if (soap_isxdigit(c))
     1846        if (soap_isxdigit(c))
    13941847          d2 = (char)c;
    13951848        else
    1396         { soap_end_block(soap);
    1397           soap->error = SOAP_TYPE;
     1849        { soap_end_block(soap, NULL);
     1850          soap->error = SOAP_TYPE;
    13981851          return NULL;
    13991852        }
     
    14031856        soap_unget(soap, c);
    14041857        if (n)
    1405           *n = soap_size_block(soap, i);
     1858          *n = (int)soap_size_block(soap, NULL, i);
    14061859        p = (unsigned char*)soap_save_block(soap, NULL, 0);
    14071860        return p;
     
    14271880#ifdef WITH_DOM
    14281881  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
    1429   { if (!(soap->dom->data = soap_s2base64(soap, s, soap->dom->data, n)))
     1882  { if (!(soap->dom->data = soap_s2base64(soap, s, NULL, n)))
    14301883      return soap->error;
    14311884    return SOAP_OK;
     
    14651918soap_getbase64(struct soap *soap, int *n, int malloc_flag)
    14661919{
     1920#ifdef WITH_DOM
     1921  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
     1922  { soap->dom->data = soap_string_in(soap, 0, -1, -1);
     1923    return (unsigned char*)soap_base642s(soap, soap->dom->data, NULL, 0, n);
     1924  }
     1925#endif
    14671926#ifdef WITH_FAST
    14681927  soap->labidx = 0;
    14691928  for (;;)
    1470   { register int i, k;
     1929  { register size_t i, k;
    14711930    register char *s;
    14721931    if (soap_append_lab(soap, NULL, 2))
    14731932      return NULL;
    14741933    s = soap->labbuf + soap->labidx;
    1475     k = 3 * ((soap->lablen - soap->labidx) / 3);
     1934    k = soap->lablen - soap->labidx;
    14761935    soap->labidx = 3 * (soap->lablen / 3);
    14771936    if (!s)
    14781937      return NULL;
    1479     for (i = 0; i < k; i += 3)
    1480     { register unsigned long m = 0;
    1481       register int j = 0;
    1482       do
    1483       { register soap_wchar c = soap_get(soap);
    1484         if (c == '=' || c < 0)
    1485         { unsigned char *p;
    1486           switch (j)
    1487           { case 2:
    1488               *s++ = (char)((m >> 4) & 0xFF);
    1489               i++;
    1490               break;
    1491             case 3:
    1492               *s++ = (char)((m >> 10) & 0xFF);
    1493               *s++ = (char)((m >> 2) & 0xFF);
    1494               i += 2;
     1938    if (k > 2)
     1939    { for (i = 0; i < k - 2; i += 3)
     1940      { register unsigned long m = 0;
     1941        register int j = 0;
     1942        do
     1943        { register soap_wchar c = soap_get(soap);
     1944          if (c == '=' || c < 0)
     1945          { unsigned char *p;
     1946            switch (j)
     1947            { case 2:
     1948                *s++ = (char)((m >> 4) & 0xFF);
     1949                i++;
     1950                break;
     1951              case 3:
     1952                *s++ = (char)((m >> 10) & 0xFF);
     1953                *s++ = (char)((m >> 2) & 0xFF);
     1954                i += 2;
     1955            }
     1956            if (n)
     1957              *n = (int)(soap->lablen + i - k);
     1958            p = (unsigned char*)soap_malloc(soap, soap->lablen + i - k);
     1959            if (p)
     1960              memcpy(p, soap->labbuf, soap->lablen + i - k);
     1961            if (c >= 0)
     1962            { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT)
     1963                ;
     1964            }
     1965            soap_unget(soap, c);
     1966            return p;
    14951967          }
    1496           if (n)
    1497             *n = (int)(soap->lablen - k + i);
    1498           p = (unsigned char*)soap_malloc(soap, soap->lablen - k + i);
    1499           if (p)
    1500             memcpy(p, soap->labbuf, soap->lablen - k + i);
    1501           if (c >= 0)
    1502           { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT)
    1503               ;
    1504           }
    1505           soap_unget(soap, c);
    1506           return p;
    1507         }
    1508         c -= '+';
    1509         if (c >= 0 && c <= 79)
    1510         { m = (m << 6) + soap_base64i[c];
    1511           j++;
    1512         }
    1513       } while (j < 4);
    1514       *s++ = (char)((m >> 16) & 0xFF);
    1515       *s++ = (char)((m >> 8) & 0xFF);
    1516       *s++ = (char)(m & 0xFF);
     1968          c -= '+';
     1969          if (c >= 0 && c <= 79)
     1970          { register int b = soap_base64i[c];
     1971            if (b >= 64)
     1972            { soap->error = SOAP_TYPE;
     1973              return NULL; 
     1974            }
     1975            m = (m << 6) + b;
     1976            j++;
     1977          }
     1978          else if (!soap_blank(c + '+'))
     1979          { soap->error = SOAP_TYPE;
     1980            return NULL; 
     1981          }
     1982        } while (j < 4);
     1983        *s++ = (char)((m >> 16) & 0xFF);
     1984        *s++ = (char)((m >> 8) & 0xFF);
     1985        *s++ = (char)(m & 0xFF);
     1986      }
    15171987    }
    15181988  }
    15191989#else
    1520   if (soap_new_block(soap))
     1990  if (soap_new_block(soap) == NULL)
    15211991    return NULL;
    15221992  for (;;)
    15231993  { register int i;
    1524     register char *s = (char*)soap_push_block(soap, 3 * SOAP_BLKLEN); /* must be multiple of 3 */
     1994    register char *s = (char*)soap_push_block(soap, NULL, 3 * SOAP_BLKLEN); /* must be multiple of 3 */
    15251995    if (!s)
    1526     { soap_end_block(soap);
     1996    { soap_end_block(soap, NULL);
    15271997      return NULL;
    15281998    }
     
    15462016          }
    15472017          if (n)
    1548             *n = (int)soap_size_block(soap, i);
     2018            *n = (int)soap_size_block(soap, NULL, i);
    15492019          p = (unsigned char*)soap_save_block(soap, NULL, 0);
    15502020          if (c >= 0)
    15512021          { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT)
    15522022              ;
    1553           }
     2023          }
    15542024          soap_unget(soap, c);
    15552025          return p;
     
    15572027        c -= '+';
    15582028        if (c >= 0 && c <= 79)
    1559         { m = (m << 6) + soap_base64i[c];
     2029        { int b = soap_base64i[c];
     2030          if (b >= 64)
     2031          { soap->error = SOAP_TYPE;
     2032            return NULL; 
     2033          }
     2034          m = (m << 6) + b;
    15602035          j++;
     2036        }
     2037        else if (!soap_blank(c))
     2038        { soap->error = SOAP_TYPE;
     2039          return NULL; 
    15612040        }
    15622041      } while (j < 4);
     
    15712050
    15722051/******************************************************************************/
     2052#ifndef WITH_LEANER
     2053#ifndef PALM_1
     2054SOAP_FMAC1
     2055int
     2056SOAP_FMAC2
     2057soap_xop_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options)
     2058{ /* Check MTOM xop:Include element (within hex/base64Binary) */
     2059  /* TODO: this code to be obsoleted with new import/xop.h conventions */
     2060  int body = soap->body; /* should save type too? */
     2061  if (!soap_peek_element(soap))
     2062  { if (!soap_element_begin_in(soap, "xop:Include", 0, NULL) && *soap->href)
     2063    { if (soap_dime_forward(soap, ptr, size, id, type, options))
     2064        return soap->error;
     2065    }
     2066    if (soap->body && soap_element_end_in(soap, NULL))
     2067      return soap->error;
     2068  }
     2069  soap->body = body;
     2070  return SOAP_OK;
     2071}
     2072#endif
     2073#endif
     2074
     2075/******************************************************************************/
     2076#ifndef WITH_LEANER
     2077#ifndef PALM_1
     2078SOAP_FMAC1
     2079int
     2080SOAP_FMAC2
     2081soap_dime_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options)
     2082{ struct soap_xlist *xp;
     2083  *ptr = NULL;
     2084  *size = 0;
     2085  *id = NULL;
     2086  *type = NULL;
     2087  *options = NULL;
     2088  if (!*soap->href)
     2089    return SOAP_OK;
     2090  *id = soap_strdup(soap, soap->href);
     2091  xp = (struct soap_xlist*)SOAP_MALLOC(soap, sizeof(struct soap_xlist));
     2092  if (!xp)
     2093    return soap->error = SOAP_EOM;
     2094  xp->next = soap->xlist;
     2095  xp->ptr = ptr;
     2096  xp->size = size;
     2097  xp->id = *id;
     2098  xp->type = type;
     2099  xp->options = options;
     2100  soap->xlist = xp;
     2101  return SOAP_OK;
     2102}
     2103#endif
     2104#endif
     2105
     2106/******************************************************************************/
    15732107#ifndef PALM_1
    15742108SOAP_FMAC1
     
    15862120#ifndef PALM_1
    15872121SOAP_FMAC1
    1588 int
     2122wchar_t *
     2123SOAP_FMAC2
     2124soap_wstrdup(struct soap *soap, const wchar_t *s)
     2125{ wchar_t *t = NULL;
     2126  if (s)
     2127  { size_t n = 0;
     2128    while (s[n])
     2129      n++;
     2130    if ((t = (wchar_t*)soap_malloc(soap, sizeof(wchar_t)*(n+1))))
     2131      memcpy(t, s, sizeof(wchar_t)*(n+1));
     2132  }
     2133  return t;
     2134}
     2135#endif
     2136
     2137/******************************************************************************/
     2138#ifndef PALM_1
     2139SOAP_FMAC1
     2140struct soap_blist*
    15892141SOAP_FMAC2
    15902142soap_new_block(struct soap *soap)
    15912143{ struct soap_blist *p;
    15922144  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New block sequence (prev=%p)\n", soap->blist));
    1593   if (!(p = (struct soap_blist*)SOAP_MALLOC(sizeof(struct soap_blist))))
    1594     return SOAP_EOM;   
     2145  if (!(p = (struct soap_blist*)SOAP_MALLOC(soap, sizeof(struct soap_blist))))
     2146  { soap->error = SOAP_EOM;   
     2147    return NULL;
     2148  }
    15952149  p->next = soap->blist;
    15962150  p->ptr = NULL;
    15972151  p->size = 0;
    15982152  soap->blist = p;
    1599   return SOAP_OK;
     2153  return p;
    16002154}
    16012155#endif
     
    16062160void*
    16072161SOAP_FMAC2
    1608 soap_push_block(struct soap *soap, size_t n)
     2162soap_push_block(struct soap *soap, struct soap_blist *b, size_t n)
    16092163{ char *p;
    1610   DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push block of %u bytes (%u bytes total)\n", (unsigned int)n, (unsigned int)soap->blist->size + (unsigned int)n));
    1611   if (!(p = (char*)SOAP_MALLOC(n + sizeof(char*) + sizeof(size_t))))
     2164  if (!b)
     2165    b = soap->blist;
     2166  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push block of %u bytes (%u bytes total)\n", (unsigned int)n, (unsigned int)b->size + (unsigned int)n));
     2167  if (!(p = (char*)SOAP_MALLOC(soap, n + sizeof(char*) + sizeof(size_t))))
    16122168  { soap->error = SOAP_EOM;
    16132169    return NULL;
    16142170  }
    1615   *(char**)p = soap->blist->ptr;
     2171  *(char**)p = b->ptr;
    16162172  *(size_t*)(p + sizeof(char*)) = n;
    1617   soap->blist->ptr = p;
    1618   soap->blist->size += n;
     2173  b->ptr = p;
     2174  b->size += n;
    16192175  return p + sizeof(char*) + sizeof(size_t);
    16202176}
     
    16262182void
    16272183SOAP_FMAC2
    1628 soap_pop_block(struct soap *soap)
     2184soap_pop_block(struct soap *soap, struct soap_blist *b)
    16292185{ char *p;
    1630   if (!soap->blist->ptr)
     2186  if (!b)
     2187    b = soap->blist;
     2188  if (!b->ptr)
    16312189    return;
    16322190  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop block\n"));
    1633   p = soap->blist->ptr;
    1634   soap->blist->size -= *(size_t*)(p + sizeof(char*));
    1635   soap->blist->ptr = *(char**)p;
    1636   SOAP_FREE(p);
    1637 }
    1638 #endif
    1639 
    1640 /******************************************************************************/
     2191  p = b->ptr;
     2192  b->size -= *(size_t*)(p + sizeof(char*));
     2193  b->ptr = *(char**)p;
     2194  SOAP_FREE(soap, p);
     2195}
     2196#endif
     2197
     2198/******************************************************************************/
     2199#ifndef WITH_NOIDREF
    16412200#ifndef PALM_1
    16422201static void
    1643 soap_update_ptrs(struct soap *soap, char *start, char *end, long offset)
     2202soap_update_ptrs(struct soap *soap, char *start, char *end, char *p1, char *p2)
    16442203{ int i;
    1645   register struct soap_ilist *ip;
    1646   register struct soap_flist *fp;
     2204  register struct soap_ilist *ip = NULL;
     2205  register struct soap_flist *fp = NULL;
     2206#ifndef WITH_LEANER
     2207  register struct soap_xlist *xp = NULL;
     2208#endif
    16472209  register void *p, **q;
    16482210  for (i = 0; i < SOAP_IDHASH; i++)
    1649     for (ip = soap->iht[i]; ip; ip = ip->next)
     2211  { for (ip = soap->iht[i]; ip; ip = ip->next)
    16502212    { if (ip->ptr && (char*)ip->ptr >= start && (char*)ip->ptr < end)
    1651       { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update id='%s' %p -> %p\n", ip->id, ip->ptr, (char*)ip->ptr + offset));
    1652         ip->ptr = (char*)ip->ptr + offset;
     2213      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update id='%s' %p -> %p\n", ip->id, ip->ptr, (char*)ip->ptr + (p1-p2)));
     2214        ip->ptr = (char*)ip->ptr + (p1-p2);
    16532215      }
    16542216      for (q = &ip->link; q; q = (void**)p)
     
    16562218        if (p && (char*)p >= start && (char*)p < end)
    16572219        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Link update id='%s' %p\n", ip->id, p));
    1658           *q = (char*)p + offset;
     2220          *q = (char*)p + (p1-p2);
    16592221        }
    16602222      }
     
    16632225        if (p && (char*)p >= start && (char*)p < end)
    16642226        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy chain update id='%s' %p\n", ip->id, p));
    1665           *q = (char*)p + offset;
     2227          *q = (char*)p + (p1-p2);
    16662228        }
    16672229      }
     
    16692231      { if ((char*)fp->ptr >= start && (char*)fp->ptr < end)
    16702232        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy list update id='%s' %p\n", ip->id, fp));
    1671           fp->ptr = (char*)fp->ptr + offset;
     2233          fp->ptr = (char*)fp->ptr + (p1-p2);
    16722234        }
    16732235      }
    16742236    }
    1675 }
    1676 #endif
    1677 
    1678 /******************************************************************************/
     2237  }
     2238#ifndef WITH_LEANER
     2239  for (xp = soap->xlist; xp; xp = xp->next)
     2240  { if (xp->ptr && (char*)xp->ptr >= start && (char*)xp->ptr < end)
     2241    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update id='%s' %p -> %p\n", xp->id?xp->id:SOAP_STR_EOS, xp->ptr, (char*)xp->ptr + (p1-p2)));
     2242      xp->ptr = (unsigned char**)((char*)xp->ptr + (p1-p2));
     2243      xp->size = (int*)((char*)xp->size + (p1-p2));
     2244      xp->type = (char**)((char*)xp->type + (p1-p2));
     2245      xp->options = (char**)((char*)xp->options + (p1-p2));
     2246    }
     2247  }
     2248#endif
     2249}
     2250#endif
     2251#endif
     2252
     2253/******************************************************************************/
     2254#ifndef WITH_NOIDREF
    16792255#ifndef PALM_1
    16802256static int
    16812257soap_has_copies(struct soap *soap, register const char *start, register const char *end)
    16822258{ register int i;
    1683   register struct soap_ilist *ip;
    1684   register struct soap_flist *fp;
     2259  register struct soap_ilist *ip = NULL;
     2260  register struct soap_flist *fp = NULL;
    16852261  register const char *p;
    16862262  for (i = 0; i < SOAP_IDHASH; i++)
     
    16912267      for (fp = ip->flist; fp; fp = fp->next)
    16922268        if ((const char*)fp->ptr >= start && (const char*)fp->ptr < end)
    1693           return SOAP_ERR;
     2269          return SOAP_ERR;
    16942270    }
    16952271  }
     
    16972273}
    16982274#endif
    1699 
    1700 /******************************************************************************/
     2275#endif
     2276
     2277/******************************************************************************/
     2278#ifndef WITH_NOIDREF
    17012279#ifndef PALM_1
    17022280SOAP_FMAC1
     
    17052283soap_resolve(struct soap *soap)
    17062284{ register int i;
    1707   register struct soap_ilist *ip;
    1708   register struct soap_flist *fp;
     2285  register struct soap_ilist *ip = NULL;
     2286  register struct soap_flist *fp = NULL;
    17092287  short flag;
    17102288  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data\n"));
     
    17432321            do
    17442322            { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... copy %p -> %p (%u bytes)\n", ip->ptr, q, (unsigned int)ip->size));
    1745               p = *q;
     2323              p = *q;
    17462324              memcpy(q, ip->ptr, ip->size);
    17472325              q = (void**)p;
    17482326            } while (q);
    1749             flag = 1;
    1750           }
     2327            flag = 1;
     2328          }
    17512329          for (fp = ip->flist; fp; fp = ip->flist)
    17522330          { register unsigned int k = fp->level;
    1753             register void *p = ip->ptr;
     2331            register void *p = ip->ptr;
    17542332            DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data type=%d location=%p level=%u,%u id='%s'\n", ip->type, p, ip->level, fp->level, ip->id));
    1755             while (ip->level < k)
     2333            while (ip->level < k)
    17562334            { register void **q = (void**)soap_malloc(soap, sizeof(void*)); 
    1757               if (!q)
    1758                 return soap->error;
    1759               *q = p;
     2335              if (!q)
     2336                return soap->error;
     2337              *q = p;
    17602338              DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level, new location=%p holds=%p...\n", q, *q));
    17612339              p = (void*)q;
    17622340              k--;
    17632341            }
    1764             if (fp->fcopy)
    1765               fp->fcopy(soap, ip->type, fp->type, fp->ptr, p, ip->size);
    1766             else
    1767               soap_fcopy(soap, ip->type, fp->type, fp->ptr, p, ip->size);
    1768             ip->flist = fp->next;
    1769             SOAP_FREE(fp);
    1770             flag = 1;
    1771           }
     2342            if (fp->fcopy)
     2343              fp->fcopy(soap, ip->type, fp->type, fp->ptr, fp->len, p, ip->size);
     2344            else
     2345              soap_fcopy(soap, ip->type, fp->type, fp->ptr, fp->len, p, ip->size);
     2346            ip->flist = fp->next;
     2347            SOAP_FREE(soap, fp);
     2348            flag = 1;
     2349          }
    17722350        }
    17732351      }
     
    17872365}
    17882366#endif
     2367#endif
    17892368
    17902369/******************************************************************************/
     
    17932372size_t
    17942373SOAP_FMAC2
    1795 soap_size_block(struct soap *soap, size_t n)
    1796 { if (soap->blist->ptr)
    1797   { soap->blist->size -= *(size_t*)(soap->blist->ptr + sizeof(char*)) - n;
    1798     *(size_t*)(soap->blist->ptr + sizeof(char*)) = n;
    1799   }
    1800   return soap->blist->size;
     2374soap_size_block(struct soap *soap, struct soap_blist *b, size_t n)
     2375{ if (!b)
     2376    b = soap->blist;
     2377  if (b->ptr)
     2378  { b->size -= *(size_t*)(b->ptr + sizeof(char*)) - n;
     2379    *(size_t*)(b->ptr + sizeof(char*)) = n;
     2380  }
     2381  return b->size;
    18012382}
    18022383#endif
     
    18072388char*
    18082389SOAP_FMAC2
    1809 soap_first_block(struct soap *soap)
     2390soap_first_block(struct soap *soap, struct soap_blist *b)
    18102391{ char *p, *q, *r;
    1811   p = soap->blist->ptr;
     2392  if (!b)
     2393    b = soap->blist;
     2394  p = b->ptr;
    18122395  if (!p)
    18132396    return NULL;
     
    18202403    p = q;
    18212404  } while (p);
    1822   soap->blist->ptr = r;
     2405  b->ptr = r;
    18232406  return r + sizeof(char*) + sizeof(size_t);
    18242407}
     
    18302413char*
    18312414SOAP_FMAC2
    1832 soap_next_block(struct soap *soap)
     2415soap_next_block(struct soap *soap, struct soap_blist *b)
    18332416{ char *p;
    1834   p = soap->blist->ptr;
     2417  if (!b)
     2418    b = soap->blist;
     2419  p = b->ptr;
    18352420  if (p)
    18362421  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Next block\n"));
    1837     soap->blist->ptr = *(char**)p;
    1838     SOAP_FREE(p);
    1839     if (soap->blist->ptr)
    1840       return soap->blist->ptr + sizeof(char*) + sizeof(size_t);
     2422    b->ptr = *(char**)p;
     2423    SOAP_FREE(soap, p);
     2424    if (b->ptr)
     2425      return b->ptr + sizeof(char*) + sizeof(size_t);
    18412426  }
    18422427  return NULL;
     
    18492434size_t
    18502435SOAP_FMAC2
    1851 soap_block_size(struct soap *soap)
    1852 { return *(size_t*)(soap->blist->ptr + sizeof(char*));
     2436soap_block_size(struct soap *soap, struct soap_blist *b)
     2437{ if (!b)
     2438    b = soap->blist;
     2439  return *(size_t*)(b->ptr + sizeof(char*));
    18532440}
    18542441#endif
     
    18592446void
    18602447SOAP_FMAC2
    1861 soap_end_block(struct soap *soap)
    1862 { struct soap_blist *bp;
    1863   char *p, *q;
    1864   bp = soap->blist;
    1865   if (bp)
     2448soap_end_block(struct soap *soap, struct soap_blist *b)
     2449{ char *p, *q;
     2450  if (!b)
     2451    b = soap->blist;
     2452  if (b)
    18662453  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of block sequence, free all remaining blocks\n"));
    1867     for (p = bp->ptr; p; p = q)
     2454    for (p = b->ptr; p; p = q)
    18682455    { q = *(char**)p;
    1869       SOAP_FREE(p);
    1870     }
    1871     soap->blist = bp->next;
    1872     SOAP_FREE(bp);
     2456      SOAP_FREE(soap, p);
     2457    }
     2458    if (soap->blist == b)
     2459      soap->blist = b->next;
     2460    else
     2461    { struct soap_blist *bp;
     2462      for (bp = soap->blist; bp; bp = bp->next)
     2463      { if (bp->next == b)
     2464        { bp->next = b->next;
     2465          break;
     2466        }
     2467      }
     2468    }
     2469    SOAP_FREE(soap, b);
    18732470  }
    18742471  DBGLOG(TEST, if (soap->blist) SOAP_MESSAGE(fdebug, "Restore previous block sequence\n"));
     
    18812478char*
    18822479SOAP_FMAC2
    1883 soap_save_block(struct soap *soap, char *p, int flag)
     2480soap_save_block(struct soap *soap, struct soap_blist *b, char *p, int flag)
    18842481{ register size_t n;
    18852482  register char *q, *s;
    1886   DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Save all blocks in contiguous memory space of %u bytes (%p->%p)\n", (unsigned int)soap->blist->size, soap->blist->ptr, p));
    1887   if (soap->blist->size)
     2483  if (!b)
     2484    b = soap->blist;
     2485  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Save all blocks in contiguous memory space of %u bytes (%p->%p)\n", (unsigned int)b->size, b->ptr, p));
     2486  if (b->size)
    18882487  { if (!p)
    1889       p = (char*)soap_malloc(soap, soap->blist->size);
     2488      p = (char*)soap_malloc(soap, b->size);
    18902489    if (p)
    1891     { for (s = p, q = soap_first_block(soap); q; q = soap_next_block(soap))
    1892       { n = soap_block_size(soap);
     2490    { for (s = p, q = soap_first_block(soap, b); q; q = soap_next_block(soap, b))
     2491      { n = soap_block_size(soap, b);
     2492#ifndef WITH_NOIDREF
    18932493        if (flag)
    1894           soap_update_ptrs(soap, q, q + n, (long)s - (long)q); /* pointers s and q may or may not be related */
     2494          soap_update_ptrs(soap, q, q + n, s, q);
     2495#endif
    18952496        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy %u bytes from %p to %p\n", (unsigned int)n, q, s));
    18962497        memcpy(s, q, n);
     
    19012502      soap->error = SOAP_EOM;
    19022503  }
    1903   soap_end_block(soap);
     2504  soap_end_block(soap, b);
    19042505  return p;
    19052506}
     
    20312632  if (!*attr1)
    20322633    return -1;
     2634  if (*attr1 == '[')
     2635    attr1++;
    20332636  n = 1;
    2034   do
    2035   { attr1++;
    2036     k = (int)soap_strtol(attr1, &s, 10);
     2637  for (;;)
     2638  { k = (int)soap_strtol(attr1, &s, 10);
    20372639    n *= k;
    20382640    if (k < 0 || n > SOAP_MAXARRAYSIZE || s == attr1)
     
    20502652      attr2 = s;
    20512653    }
    2052   } while (attr1 && *attr1 != ']');
     2654    if (!attr1)
     2655      break;
     2656    attr1++;
     2657  }
    20532658  return n - *j;
    20542659}
     
    20642669  if (!*attr)
    20652670    return -1;
    2066   i = strlen(attr);
     2671  i = (int)strlen(attr);
    20672672  n = 1;
    20682673  do
     
    21092714{ register struct soap_nlist *np;
    21102715  register struct Namespace *p;
    2111   np = (struct soap_nlist*)SOAP_MALLOC(sizeof(struct soap_nlist) + strlen(id));
     2716  register short i = -1;
     2717  register size_t n, k;
     2718  n = strlen(id);
     2719  k = strlen(ns) + 1;
     2720  p = soap->local_namespaces;
     2721  if (p)
     2722  { for (i = 0; p->id; p++, i++)
     2723    { if (p->ns && !strcmp(ns, p->ns))
     2724      { if (p->out)
     2725        { SOAP_FREE(soap, p->out);
     2726          p->out = NULL;
     2727        }
     2728        break;
     2729      }
     2730      if (p->out)
     2731      { if (!strcmp(ns, p->out))
     2732          break;
     2733      }
     2734      else if (p->in)
     2735      { if (!soap_tag_cmp(ns, p->in))
     2736        { if ((p->out = (char*)SOAP_MALLOC(soap, k)))
     2737            strcpy(p->out, ns);
     2738          break;
     2739        }
     2740      }
     2741    }
     2742    if (!p || !p->id)
     2743      i = -1;
     2744  }
     2745  if (i >= 0)
     2746    k = 0;
     2747  np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k);
    21122748  if (!np)
    21132749    return soap->error = SOAP_EOM;
    21142750  np->next = soap->nlist;
    21152751  soap->nlist = np;
     2752  np->level = soap->level;
     2753  np->index = i;
    21162754  strcpy(np->id, id);
    2117   np->level = soap->level;
    2118   np->index = -1;
    2119   np->ns = NULL;
    21202755  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push namespace binding (level=%u) '%s' '%s'\n", soap->level, id, ns));
    2121   p = soap->local_namespaces;
    2122   if (p)
    2123   { register short i = 0;
    2124     for (; p->id; p++, i++)
    2125     { if (p->ns && !strcmp(ns, p->ns))
    2126       { if (p->out)
    2127         { SOAP_FREE(p->out);
    2128           p->out = NULL;
    2129         }
    2130         break;
    2131       }
    2132       if (p->out)
    2133       { if (!SOAP_STRCMP(ns, p->out))
    2134           break;
    2135       }
    2136       else if (p->in)
    2137       { if (!soap_tag_cmp(ns, p->in))
    2138         { if ((p->out = (char*)SOAP_MALLOC(strlen(ns) + 1)))
    2139             strcpy(p->out, ns);
    2140           break;
    2141         }
    2142       }
    2143     }
    2144     if (p && p->id)
    2145     { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push OK ('%s' matches '%s' in namespace table)\n", id, p->id));
    2146       np->index = i;
    2147     }
    2148   }
    2149   if (!p || !p->id)
    2150   { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push NOT OK: no match found for '%s' in namespace mapping table (added to stack anyway)\n", ns));
    2151     np->ns = (char*)SOAP_MALLOC(strlen(ns) + 1);
    2152     if (!np->ns)
    2153       return soap->error = SOAP_EOM;
     2756  if (i < 0)
     2757  { np->ns = np->id + n + 1;
    21542758    strcpy(np->ns, ns);
     2759    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push NOT OK: no match found for '%s' in namespace mapping table (added to stack anyway)\n", ns));
     2760  }
     2761  else
     2762  { np->ns = NULL;
     2763    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push OK ('%s' matches '%s' in namespace table)\n", id, p->id));
    21552764  }
    21562765  return SOAP_OK;
     
    21642773SOAP_FMAC2
    21652774soap_pop_namespace(struct soap *soap)
    2166 { register struct soap_nlist *np;
    2167   while (soap->nlist && soap->nlist->level >= soap->level)
    2168   { np = soap->nlist->next;
    2169     DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Popped namespace binding (level=%u) '%s'\n", soap->level, soap->nlist->id));
    2170     if (soap->nlist->ns)
    2171       SOAP_FREE(soap->nlist->ns);
    2172     SOAP_FREE(soap->nlist);
    2173     soap->nlist = np;
    2174   }
     2775{ register struct soap_nlist *np, *nq;
     2776  for (np = soap->nlist; np && np->level >= soap->level; np = nq)
     2777  { nq = np->next;
     2778    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop namespace binding (level=%u) '%s'\n", soap->level, np->id));
     2779    SOAP_FREE(soap, np);
     2780  }
     2781  soap->nlist = np;
    21752782}
    21762783#endif
     
    21812788int
    21822789SOAP_FMAC2
    2183 soap_match_namespace(struct soap *soap, const char *id1, const char *id2, int n1, int n2)
     2790soap_match_namespace(struct soap *soap, const char *id1, const char *id2, size_t n1, size_t n2)
    21842791{ register struct soap_nlist *np = soap->nlist;
    21852792  while (np && (strncmp(np->id, id1, n1) || np->id[n1]))
    21862793    np = np->next;
    21872794  if (np)
    2188   { if (np->index < 0 || (np->index >= 0 && soap->local_namespaces[np->index].id && (strncmp(soap->local_namespaces[np->index].id, id2, n2) || soap->local_namespaces[np->index].id[n2])))
     2795  { if (np->index < 0
     2796     || (soap->local_namespaces[np->index].id
     2797      && (strncmp(soap->local_namespaces[np->index].id, id2, n2)
     2798       || soap->local_namespaces[np->index].id[n2])))
    21892799      return SOAP_NAMESPACE;
    21902800    return SOAP_OK;
    21912801  }
    2192   if (n1 == 3 && n1 == n2 && !strcmp(id1, "xml") && !strcmp(id1, id2))
     2802  if (n1 == 3 && n1 == n2 && !strncmp(id1, "xml", 3) && !strncmp(id1, id2, 3))
    21932803    return SOAP_OK;
    2194   return SOAP_SYNTAX_ERROR;
     2804  return soap->error = SOAP_SYNTAX_ERROR;
     2805}
     2806#endif
     2807
     2808/******************************************************************************/
     2809#ifndef PALM_2
     2810SOAP_FMAC1
     2811const char*
     2812SOAP_FMAC2
     2813soap_current_namespace(struct soap *soap, const char *tag)
     2814{ register struct soap_nlist *np;
     2815  register const char *s;
     2816  if (!tag || !strncmp(tag, "xml", 3))
     2817    return NULL;
     2818  np = soap->nlist;
     2819  if (!(s = strchr(tag, ':')))
     2820  { while (np && *np->id) /* find default namespace, if present */
     2821      np = np->next;
     2822  }
     2823  else
     2824  { while (np && (strncmp(np->id, tag, s - tag) || np->id[s - tag]))
     2825      np = np->next;
     2826    if (!np)
     2827      soap->error = SOAP_NAMESPACE;
     2828  }
     2829  if (np)
     2830  { if (np->index >= 0)
     2831      return soap->namespaces[np->index].ns;
     2832    if (np->ns)
     2833      return soap_strdup(soap, np->ns);
     2834  }
     2835  return NULL;
    21952836}
    21962837#endif
     
    22172858      { if (c2 != '*')
    22182859          return 1;
    2219         c2 = *++t;
     2860        c2 = *++t;
    22202861        if (!c2)
    2221           return 0;
     2862          return 0;
    22222863        if (c2 >= 'A' && c2 <= 'Z')
    22232864          c2 += 'a' - 'A';
    22242865        for (;;)
    22252866        { c1 = *s;
    2226           if (!c1 || c1 == '"')
    2227             break;
    2228           if (c1 >= 'A' && c1 <= 'Z')
     2867          if (!c1 || c1 == '"')
     2868            break;
     2869          if (c1 >= 'A' && c1 <= 'Z')
    22292870            c1 += 'a' - 'A';
    2230           if (c1 == c2)
    2231             if (!soap_tag_cmp(s + 1, t + 1))
    2232               return 0;
    2233           s++;
     2871          if (c1 == c2 && !soap_tag_cmp(s + 1, t + 1))
     2872            return 0;
     2873          s++;
    22342874        }
    22352875        break;
     
    22522892soap_match_tag(struct soap *soap, const char *tag1, const char *tag2)
    22532893{ register const char *s, *t;
     2894  register int err;
    22542895  if (!tag1 || !tag2 || !*tag2)
    22552896    return SOAP_OK;
     
    22602901    { if (t[1] && SOAP_STRCMP(s + 1, t + 1))
    22612902        return SOAP_TAG_MISMATCH;
    2262       if (t != tag2 && soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2))
     2903      if (t != tag2 && (err = soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2)))
    22632904      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2));
    2264         return SOAP_TAG_MISMATCH;
     2905        if (err == SOAP_NAMESPACE)
     2906          return SOAP_TAG_MISMATCH;
     2907        return err;
    22652908      }
    22662909    }
    22672910    else if (SOAP_STRCMP(tag1, t + 1))
    2268       return SOAP_TAG_MISMATCH;
    2269     else if (t != tag2 && soap_match_namespace(soap, tag1, tag2, 0, t - tag2))
     2911    { return SOAP_TAG_MISMATCH;
     2912    }
     2913    else if (t != tag2 && (err = soap_match_namespace(soap, tag1, tag2, 0, t - tag2)))
    22702914    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2));
    2271       return SOAP_TAG_MISMATCH;
     2915      if (err == SOAP_NAMESPACE)
     2916        return SOAP_TAG_MISMATCH;
     2917      return err;
    22722918    }
    22732919    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags and (default) namespaces match: '%s' '%s'\n", tag1, tag2));
     
    23032949#endif
    23042950
    2305 /******************************************************************************/
     2951/******************************************************************************\
     2952 *
     2953 *      SSL
     2954 *
     2955\******************************************************************************/
    23062956
    23072957#ifdef WITH_OPENSSL
     2958/******************************************************************************/
     2959#ifndef PALM_2
     2960SOAP_FMAC1
     2961int
     2962SOAP_FMAC2
     2963soap_rand()
     2964{ unsigned char buf[4];
     2965  if (!soap_ssl_init_done)
     2966    soap_ssl_init();
     2967  RAND_pseudo_bytes(buf, 4);
     2968  return *(int*)buf;
     2969}
     2970#endif
     2971
    23082972/******************************************************************************/
    23092973#ifndef PALM_2
     
    23172981  soap->cafile = cafile;
    23182982  soap->capath = capath;
    2319   if (dhfile)
    2320   { soap->dhfile = dhfile;
    2321     soap->rsa = 0;
    2322   }
    2323   else
    2324   { soap->dhfile = NULL;
    2325     soap->rsa = 1;
    2326   }
     2983  soap->dhfile = dhfile;
    23272984  soap->randfile = randfile;
    2328   soap->require_client_auth = (flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION);
     2985  soap->ssl_flags = flags | (dhfile == NULL ? SOAP_SSL_RSA : 0);
    23292986  if (!(err = soap->fsslauth(soap)))
    2330     if (sid)
    2331       SSL_CTX_set_session_id_context(soap->ctx, (unsigned char*)sid, strlen(sid));
     2987  { if (sid)
     2988      SSL_CTX_set_session_id_context(soap->ctx, (unsigned char*)sid, (unsigned int)strlen(sid));
     2989  }
    23322990  return err;
    23332991}
     
    23453003  soap->capath = capath;
    23463004  soap->dhfile = NULL;
    2347   soap->rsa = 0;
     3005  soap->ssl_flags = flags;
    23483006  soap->randfile = randfile;
    2349   soap->require_server_auth = (flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION);
     3007  soap->fsslverify = (flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) == 0 ? ssl_verify_callback : ssl_verify_callback_allow_expired_certificate;
    23503008  return soap->fsslauth(soap);
    23513009}
     
    23543012/******************************************************************************/
    23553013#ifndef PALM_2
    2356 static void
    2357 ssl_init()
    2358 { static int done = 0;
    2359   if (!done)
    2360   { done = 1;
     3014SOAP_FMAC1
     3015void
     3016SOAP_FMAC2
     3017soap_ssl_init()
     3018{ /* Note: for MT systems, the main program MUST call soap_ssl_init() before any threads are started */
     3019  if (!soap_ssl_init_done)
     3020  { soap_ssl_init_done = 1;
    23613021    SSL_library_init();
    23623022#ifndef WITH_LEAN
     
    23643024#endif
    23653025    if (!RAND_load_file("/dev/urandom", 1024))
    2366     { int r;
    2367 #ifdef HAVE_RAND_R
    2368       unsigned int s = (unsigned int)time(NULL);
    2369 #endif
    2370       char buf[SOAP_BUFLEN];
     3026    { char buf[1024];
    23713027      RAND_seed(buf, sizeof(buf));
    23723028      while (!RAND_status())
    2373       {
    2374 #ifdef HAVE_RAND_R
    2375         r = rand_r(&s);
    2376 #else
    2377         r = rand();
    2378 #endif
     3029      { int r = rand();
    23793030        RAND_seed(&r, sizeof(int));
    23803031      }
     
    23863037/******************************************************************************/
    23873038#ifndef PALM_1
    2388 static const char *
    2389 ssl_error(struct soap *soap, int ret)
     3039SOAP_FMAC1
     3040const char *
     3041SOAP_FMAC2
     3042soap_ssl_error(struct soap *soap, int ret)
    23903043{ int err = SSL_get_error(soap->ssl, ret);
    2391   const char *msg = soap_str_code(h_ssl_error_codes, err);
     3044  const char *msg = soap_code_str(h_ssl_error_codes, err);
    23923045  if (msg)
    23933046    strcpy(soap->msgbuf, msg);
     
    24203073{ if (num < (int)strlen((char*)userdata) + 1)
    24213074    return 0;
    2422   return strlen(strcpy(buf, (char*)userdata));
     3075  return (int)strlen(strcpy(buf, (char*)userdata));
    24233076}
    24243077#endif
     
    24583111#endif
    24593112*/
     3113
    24603114/******************************************************************************/
    24613115#ifndef PALM_1
    24623116static int
    24633117ssl_auth_init(struct soap *soap)
    2464 { ssl_init();
     3118{ long flags;
     3119  int mode;
     3120  if (!soap_ssl_init_done)
     3121    soap_ssl_init();
     3122  ERR_clear_error();
    24653123  if (!soap->ctx)
    2466     if (!(soap->ctx = SSL_CTX_new(SSLv23_method())))
     3124  { if (!(soap->ctx = SSL_CTX_new(SSLv23_method())))
    24673125      return soap_set_receiver_error(soap, "SSL error", "Can't setup context", SOAP_SSL_ERROR);
     3126    /* Alters the behavior of SSL read/write:
     3127    SSL_CTX_set_mode(soap->ctx, SSL_MODE_ENABLE_PARTIAL_WRITE | SSL_MODE_AUTO_RETRY);
     3128    */
     3129  }
    24683130  if (soap->randfile)
    24693131  { if (!RAND_load_file(soap->randfile, -1))
     
    24713133  }
    24723134  if (soap->cafile || soap->capath)
    2473     if (!SSL_CTX_load_verify_locations(soap->ctx, soap->cafile, soap->capath))
    2474       return soap_set_receiver_error(soap, "SSL error", "Can't read CA file and/or directory", SOAP_SSL_ERROR);
     3135  { if (!SSL_CTX_load_verify_locations(soap->ctx, soap->cafile, soap->capath))
     3136      return soap_set_receiver_error(soap, "SSL error", "Can't read CA file and directory", SOAP_SSL_ERROR);
     3137    if (soap->cafile && (soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION))
     3138      SSL_CTX_set_client_CA_list(soap->ctx, SSL_load_client_CA_file(soap->cafile));
     3139  }
    24753140  if (!SSL_CTX_set_default_verify_paths(soap->ctx))
    24763141    return soap_set_receiver_error(soap, "SSL error", "Can't read default CA file and/or directory", SOAP_SSL_ERROR);
     3142/* This code assumes a typical scenario, see alternative code below */
    24773143  if (soap->keyfile)
    24783144  { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile))
     
    24813147    { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password);
    24823148      SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password);
     3149    }
     3150    if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM))
     3151      return soap_set_receiver_error(soap, "SSL error", "Can't read key file", SOAP_SSL_ERROR);
     3152  }
     3153/* Suggested alternative approach to check the key file for certs (cafile=NULL):
     3154  if (soap->password)
     3155  { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password);
     3156    SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password);
     3157  }
     3158  if (!soap->cafile || !SSL_CTX_use_certificate_chain_file(soap->ctx, soap->cafile))
     3159  { if (soap->keyfile)
     3160    { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile))
     3161        return soap_set_receiver_error(soap, "SSL error", "Can't read certificate or key file", SOAP_SSL_ERROR);
    24833162      if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM))
    24843163        return soap_set_receiver_error(soap, "SSL error", "Can't read key file", SOAP_SSL_ERROR);
    24853164    }
    24863165  }
    2487   if (soap->rsa)
    2488   { RSA *rsa = RSA_generate_key(512, RSA_F4, NULL, NULL);
     3166*/
     3167  if ((soap->ssl_flags & SOAP_SSL_RSA))
     3168  { RSA *rsa = RSA_generate_key(1024, RSA_F4, NULL, NULL);
    24893169    if (!SSL_CTX_set_tmp_rsa(soap->ctx, rsa))
    24903170    { if (rsa)
     
    25093189    DH_free(dh);
    25103190  }
    2511   SSL_CTX_set_options(soap->ctx, SSL_OP_ALL | SSL_OP_NO_SSLv2);
    2512   SSL_CTX_set_verify(soap->ctx, soap->require_client_auth ? (SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT) : soap->require_server_auth ? SSL_VERIFY_PEER : SSL_VERIFY_NONE, soap->fsslverify);
     3191  flags = (SSL_OP_ALL | SSL_OP_NO_SSLv2);
     3192  if ((soap->ssl_flags & SOAP_SSLv3))
     3193    flags |= SSL_OP_NO_TLSv1;
     3194  if ((soap->ssl_flags & SOAP_TLSv1))
     3195    flags |= SSL_OP_NO_SSLv3;
     3196  SSL_CTX_set_options(soap->ctx, flags);
     3197  if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION))
     3198    mode = (SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT);
     3199  else if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION))
     3200    mode = SSL_VERIFY_PEER;
     3201  else
     3202    mode = SSL_VERIFY_NONE;
     3203  SSL_CTX_set_verify(soap->ctx, mode, soap->fsslverify);
    25133204#if (OPENSSL_VERSION_NUMBER < 0x00905100L)
    25143205  SSL_CTX_set_verify_depth(soap->ctx, 1);
     
    25293220  { char data[256];
    25303221    X509 *cert = X509_STORE_CTX_get_current_cert(store);
    2531     fprintf(stderr, "SSL Verify error with certificate at depth %d: %s\n", X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(X509_STORE_CTX_get_error(store)));
     3222    fprintf(stderr, "SSL verify error or warning with certificate at depth %d: %s\n", X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(X509_STORE_CTX_get_error(store)));
    25323223    X509_NAME_oneline(X509_get_issuer_name(cert), data, sizeof(data));
    25333224    fprintf(stderr, "certificate issuer %s\n", data);
     
    25363227  }
    25373228#endif
    2538   /* return 1 to always continue, but unsafe progress will be terminated by SSL */
     3229  /* Note: return 1 to continue, but unsafe progress will be terminated by SSL */
    25393230  return ok;
    25403231}
     
    25433234/******************************************************************************/
    25443235#ifndef PALM_1
     3236static int
     3237ssl_verify_callback_allow_expired_certificate(int ok, X509_STORE_CTX *store)
     3238{ ok = ssl_verify_callback(ok, store);
     3239  if (ok == 0 && X509_STORE_CTX_get_error(store) == X509_V_ERR_CERT_HAS_EXPIRED)
     3240  {
     3241#ifdef SOAP_DEBUG
     3242    fprintf(stderr, "ignoring certificate expiration\n");
     3243#endif
     3244    X509_STORE_CTX_set_error(store, X509_V_OK);
     3245    ok = 1;
     3246  }
     3247  /* Note: return 1 to continue, but unsafe progress will be terminated by SSL */
     3248  return ok;
     3249}
     3250#endif
     3251
     3252/******************************************************************************/
     3253#ifndef PALM_1
    25453254SOAP_FMAC1
    25463255int
    25473256SOAP_FMAC2
    25483257soap_ssl_accept(struct soap *soap)
    2549 { int i, r;
     3258{ BIO *bio;
     3259  int retries, r, s;
    25503260  if (!soap_valid_socket(soap->socket))
    25513261    return soap_set_receiver_error(soap, "SSL error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR);
     3262  if (!soap->ctx && (soap->error = soap->fsslauth(soap)))
     3263    return SOAP_INVALID_SOCKET;
    25523264  if (!soap->ssl)
    25533265  { soap->ssl = SSL_new(soap->ctx);
     
    25593271  soap->imode |= SOAP_ENC_SSL;
    25603272  soap->omode |= SOAP_ENC_SSL;
    2561 #ifdef WIN32
    2562   { u_long nonblocking = 1;
    2563     ioctlsocket((SOAP_SOCKET)soap->socket, FIONBIO, &nonblocking);
    2564   }
    2565 #else
    2566   fcntl((SOAP_SOCKET)soap->socket, F_SETFL, fcntl((SOAP_SOCKET)soap->socket, F_GETFL)|O_NONBLOCK);
    2567 #endif
    2568   soap->bio = BIO_new_socket((SOAP_SOCKET)soap->socket, BIO_NOCLOSE);
    2569   SSL_set_bio(soap->ssl, soap->bio, soap->bio);
    2570   i = 100; /* 100 * 0.1 ms retries */
     3273  /* Set SSL sockets to non-blocking */
     3274  SOAP_SOCKNONBLOCK(soap->socket)
     3275  bio = BIO_new_socket((int)soap->socket, BIO_NOCLOSE);
     3276  SSL_set_bio(soap->ssl, bio, bio);
     3277  retries = 100; /* 10 sec retries, 100 times 0.1 sec */
    25713278  while ((r = SSL_accept(soap->ssl)) <= 0)
    25723279  { int err = SSL_get_error(soap->ssl, r);
     
    25743281    { struct timeval timeout;
    25753282      fd_set fd;
    2576       if (i-- <= 0)
    2577         break;
     3283#ifndef WIN32
     3284      if ((int)soap->socket >= (int)FD_SETSIZE)
     3285        return SOAP_FD_EXCEEDED;        /* Hint: MUST increase FD_SETSIZE */
     3286#endif
    25783287      timeout.tv_sec = 0;
    25793288      timeout.tv_usec = 100000;
    25803289      FD_ZERO(&fd);
    2581       FD_SET((SOAP_SOCKET)soap->socket, &fd);
    2582       r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout);
    2583       if (r < 0 && soap_socket_errno != SOAP_EINTR)
    2584       { soap->errnum = soap_socket_errno;
    2585         return SOAP_EOF;
     3290      FD_SET(soap->socket, &fd);
     3291      if (err == SSL_ERROR_WANT_READ)
     3292        s = select((int)soap->socket + 1, &fd, NULL, &fd, &timeout);
     3293      else
     3294        s = select((int)soap->socket + 1, NULL, &fd, &fd, &timeout);
     3295      if (s < 0 && (s = soap_socket_errno(soap->socket)) != SOAP_EINTR)
     3296      { soap->errnum = s;
     3297        break;
    25863298      }
    25873299    }
     
    25903302      break;
    25913303    }
    2592   }
    2593 #ifdef WIN32
    2594   { u_long blocking = 0;
    2595     ioctlsocket((SOAP_SOCKET)soap->socket, FIONBIO, &blocking);
    2596   }
    2597 #else
    2598   fcntl((SOAP_SOCKET)soap->socket, F_SETFL, fcntl((SOAP_SOCKET)soap->socket, F_GETFL)&~O_NONBLOCK);
    2599 #endif
     3304    if (retries-- <= 0)
     3305      break;
     3306  }
    26003307  if (r <= 0)
    2601   { soap_set_receiver_error(soap, ssl_error(soap, r), "SSL_accept() failed in soap_ssl_accept()", SOAP_SSL_ERROR);
     3308  { soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL_accept() failed in soap_ssl_accept()", SOAP_SSL_ERROR);
    26023309    soap_closesock(soap);
    26033310    return SOAP_SSL_ERROR;
    26043311  }
    2605   if (soap->require_client_auth)
     3312  if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION))
    26063313  { X509 *peer;
    26073314    int err;
     
    26253332
    26263333/******************************************************************************/
     3334#ifndef WITH_NOIO
    26273335#ifndef PALM_1
    26283336static int
     
    26423350}
    26433351#endif
     3352#endif
    26443353
    26453354/******************************************************************************/
     
    26533362  int i;
    26543363#endif
    2655   soap_free(soap);
     3364  if (soap_check_state(soap))
     3365    return;
     3366  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Done with context\n"));
     3367  soap_free_temp(soap);
    26563368  while (soap->clist)
    26573369  { struct soap_clist *p = soap->clist->next;
    2658     SOAP_FREE(soap->clist);
     3370    SOAP_FREE(soap, soap->clist);
    26593371    soap->clist = p;
    26603372  }
     
    26673379  { register struct soap_plugin *p = soap->plugins->next;
    26683380    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Removing plugin '%s'\n", soap->plugins->id));
    2669     if (soap->plugins->fcopy || !soap->copy)
     3381    if (soap->plugins->fcopy || soap->state == SOAP_INIT)
    26703382      soap->plugins->fdelete(soap, soap->plugins);
    2671     SOAP_FREE(soap->plugins);
     3383    SOAP_FREE(soap, soap->plugins);
    26723384    soap->plugins = p;
    26733385  }
    26743386  soap->fplugin = fplugin;
     3387  soap->fmalloc = NULL;
     3388#ifndef WITH_NOHTTP
    26753389  soap->fpost = http_post;
    26763390  soap->fget = http_get;
     3391  soap->fput = http_put;
     3392  soap->fdel = http_del;
     3393  soap->fhead = http_head;
     3394  soap->fform = NULL;
    26773395  soap->fposthdr = http_post_header;
    26783396  soap->fresponse = http_response;
    26793397  soap->fparse = http_parse;
    26803398  soap->fparsehdr = http_parse_header;
    2681 #ifndef MAC_CARBON
     3399#endif
     3400  soap->fheader = NULL;
     3401#ifndef WITH_NOIO
    26823402#ifndef WITH_IPV6
    26833403  soap->fresolve = tcp_gethost;
     
    26943414  soap->fpoll = soap_poll;
    26953415#else
     3416  soap->fopen = NULL;
     3417  soap->fclose = NULL;
    26963418  soap->fpoll = NULL;
    26973419#endif
     3420#ifndef WITH_LEANER
    26983421  soap->fprepareinit = NULL;
    26993422  soap->fpreparesend = NULL;
    27003423  soap->fpreparerecv = NULL;
     3424  soap->fpreparefinal = NULL;
     3425#endif
     3426  soap->fseterror = NULL;
    27013427  soap->fignore = NULL;
    27023428  soap->fserveloop = NULL;
     
    27073433  }
    27083434#endif
    2709   if (!soap->copy)
     3435  if (soap->state == SOAP_INIT)
    27103436  { if (soap_valid_socket(soap->master))
    2711     { soap->fclosesocket(soap, (SOAP_SOCKET)soap->master);
     3437    { soap->fclosesocket(soap, soap->master);
    27123438      soap->master = SOAP_INVALID_SOCKET;
    27133439    }
     3440  }
    27143441#ifdef WITH_OPENSSL
    2715     if (soap->ctx)
     3442  if (soap->ssl)
     3443  { SSL_free(soap->ssl);
     3444    soap->ssl = NULL;
     3445  }
     3446  if (soap->state == SOAP_INIT)
     3447  { if (soap->ctx)
    27163448    { SSL_CTX_free(soap->ctx);
    27173449      soap->ctx = NULL;
    27183450    }
    2719 #endif
    2720   }
     3451  }
     3452#endif
     3453#ifdef WITH_OPENSSL
     3454  ERR_remove_state(0);
     3455#endif
     3456#ifdef WITH_C_LOCALE
     3457  freelocale(soap->c_locale);
     3458#endif
     3459#ifdef WITH_ZLIB
     3460  if (soap->d_stream)
     3461  { SOAP_FREE(soap, (void*)soap->d_stream);
     3462    soap->d_stream = NULL;
     3463  }
     3464  if (soap->z_buf)
     3465  { SOAP_FREE(soap, (void*)soap->z_buf);
     3466    soap->z_buf = NULL;
     3467  }
     3468#endif
    27213469#ifdef SOAP_DEBUG
     3470  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free logfiles\n"));
    27223471  for (i = 0; i < SOAP_MAXLOGS; i++)
    2723   { soap_close_logfile(soap, i);
    2724     if (soap->logfile[i])
    2725     { SOAP_FREE((void*)soap->logfile[i]);
     3472  { if (soap->logfile[i])
     3473    { SOAP_FREE(soap, (void*)soap->logfile[i]);
    27263474      soap->logfile[i] = NULL;
    27273475    }
    2728   }
    2729 #endif
    2730 }
    2731 #endif
    2732 
    2733 /******************************************************************************/
     3476    soap_close_logfile(soap, i);
     3477  }
     3478  soap->state = SOAP_NONE;
     3479#endif
     3480#ifdef SOAP_MEM_DEBUG
     3481  soap_free_mht(soap);
     3482#endif
     3483}
     3484#endif
     3485
     3486/******************************************************************************/
     3487#ifndef WITH_NOIO
    27343488#ifndef PALM_2
    27353489SOAP_FMAC1
     
    27463500}
    27473501#endif
    2748 
    2749 /******************************************************************************/
     3502#endif
     3503
     3504/******************************************************************************/
     3505#ifndef WITH_NOIO
    27503506#ifndef PALM_1
    27513507static const char*
     
    27623518    {
    27633519#ifndef WITH_LEAN
    2764       msg = soap_str_code(h_error_codes, soap->errnum);
     3520      msg = soap_code_str(h_error_codes, soap->errnum);
    27653521      if (!msg)
    27663522#endif
    2767       { sprintf(soap->msgbuf, "TCP error %d", soap->errnum);
     3523      { sprintf(soap->msgbuf, "TCP/UDP IP error %d", soap->errnum);
    27683524        msg = soap->msgbuf;
    27693525      }
     
    27733529}
    27743530#endif
    2775 
    2776 /******************************************************************************/
     3531#endif
     3532
     3533/******************************************************************************/
     3534#ifndef WITH_NOHTTP
    27773535#ifndef PALM_1
    27783536static const char*
    27793537http_error(struct soap *soap, int status)
    2780 { register const char *msg = NULL;
     3538{ register const char *msg = SOAP_STR_EOS;
    27813539#ifndef WITH_LEAN
    2782   msg = soap_str_code(h_http_error_codes, status);
     3540  msg = soap_code_str(h_http_error_codes, status);
    27833541  if (!msg)
    2784 #endif
    2785   { sprintf(soap->msgbuf, "HTTP error %d", status);
    2786     msg = soap->msgbuf;
    2787   }
     3542    msg = SOAP_STR_EOS;
     3543#endif
    27883544  return msg;
    27893545}
    27903546#endif
    2791 
    2792 /******************************************************************************/
    2793 /* WR[ */
     3547#endif
     3548
     3549/******************************************************************************/
    27943550#ifndef WITH_IPV6
    2795 /* ]WR */
    2796 #ifndef MAC_CARBON
     3551#ifndef WITH_NOIO
    27973552#ifndef PALM_1
    27983553static int
    27993554tcp_gethost(struct soap *soap, const char *addr, struct in_addr *inaddr)
    2800 { unsigned long iadd;
     3555{ soap_int32 iadd = -1;
    28013556  struct hostent hostent, *host = &hostent;
    2802 /* WR[ */
    28033557#ifdef VXWORKS
    28043558  int hostint;
    2805   char *addrcopy = (char*)malloc(strlen(addr) + 1); /*copy of addr. */
    28063559  /* inet_addr(), and hostGetByName() expect "char *"; addr is a "const char *". */
    2807   strncpy(addrcopy, addr, strlen(addr)+1);
    2808   iadd = inet_addr(addrcopy);
     3560  iadd = inet_addr((char*)addr);
    28093561#else
    2810 /* ]WR */
    2811 #if defined(_AIXVERSION_431) || defined(TRU64)
     3562#if defined(_AIX43) || ((defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R))
    28123563  struct hostent_data ht_data;
    28133564#endif
     3565#ifdef AS400
     3566  iadd = inet_addr((void*)addr);
     3567#else
    28143568  iadd = inet_addr(addr);
    2815 /* WR[ */
    2816 #endif
    2817 /* ]WR */
    2818   if ((int)iadd != -1)
     3569#endif
     3570#endif
     3571  if (iadd != -1)
    28193572  { memcpy(inaddr, &iadd, sizeof(iadd));
    2820 /* WR[ */
    2821 #ifdef VXWORKS
    2822     free(addrcopy);
    2823 #endif
    2824 /* ]WR */
    28253573    return SOAP_OK;
    28263574  }
    2827 #if defined(__GLIBC__)
     3575#if defined(__GLIBC__) || (defined(HAVE_GETHOSTBYNAME_R) && (defined(FREEBSD) || defined(__FreeBSD__)))
    28283576  if (gethostbyname_r(addr, &hostent, soap->buf, SOAP_BUFLEN, &host, &soap->errnum) < 0)
    28293577    host = NULL;
    2830 #elif defined(_AIXVERSION_431) || defined(TRU64)
     3578#elif defined(_AIX43) || ((defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R))
    28313579  memset((void*)&ht_data, 0, sizeof(ht_data));
    28323580  if (gethostbyname_r(addr, &hostent, &ht_data) < 0)
     
    28363584#elif defined(HAVE_GETHOSTBYNAME_R)
    28373585  host = gethostbyname_r(addr, &hostent, soap->buf, SOAP_BUFLEN, &soap->errnum);
    2838 /* WR[ */
    28393586#elif defined(VXWORKS)
    28403587  /* If the DNS resolver library resolvLib has been configured in the vxWorks
    28413588   * image, a query for the host IP address is sent to the DNS server, if the
    28423589   * name was not found in the local host table. */
    2843   hostint = hostGetByName(addrcopy);
     3590  hostint = hostGetByName((char*)addr);
    28443591  if (hostint == ERROR)
    28453592  { host = NULL;
    28463593    soap->errnum = soap_errno;
    28473594  }
    2848   free(addrcopy);  /*free() is placed after the error checking to assure that
    2849                     * errno captured is that from hostGetByName() */
    2850 /* ]WR */
     3595#else
     3596#ifdef AS400
     3597  if (!(host = gethostbyname((void*)addr)))
     3598    soap->errnum = h_errno;
    28513599#else
    28523600  if (!(host = gethostbyname(addr)))
    28533601    soap->errnum = h_errno;
    28543602#endif
     3603#endif
    28553604  if (!host)
    28563605  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Host name not found\n"));
    28573606    return SOAP_ERR;
    28583607  }
    2859 /* WR[ */
    28603608#ifdef VXWORKS
    28613609  inaddr->s_addr = hostint;
    28623610#else
    2863 /* ]WR */
    28643611  memcpy(inaddr, host->h_addr, host->h_length);
    2865 /* WR[ */
    2866 #endif
    2867 /* ]WR */
     3612#endif
    28683613  return SOAP_OK;
    28693614}
    28703615#endif
    28713616#endif
    2872 /* WR[ */
    2873 #endif /* WITH_IPV6 */
    2874 /* ]WR */
    2875 
    2876 /******************************************************************************/
    2877 #ifndef MAC_CARBON
    2878 #ifndef PALM_1
    2879 static int
     3617#endif
     3618
     3619/******************************************************************************/
     3620#ifndef WITH_NOIO
     3621#ifndef PALM_1
     3622static SOAP_SOCKET
    28803623tcp_connect(struct soap *soap, const char *endpoint, const char *host, int port)
    2881 { struct sockaddr_in sockaddr;
    2882 /* WR[ */
     3624{
    28833625#ifdef WITH_IPV6
    2884   struct addrinfo *addrinfo;
    2885   struct addrinfo hints;
    2886   struct addrinfo resaddr;
    2887   struct sockaddr_storage addrstorage;
    2888   int err;
    2889 #endif /* WITH_IPV6 */
    2890 /* ]WR */
    2891   register int fd;
     3626  struct addrinfo hints, *res, *ressave;
     3627#endif
     3628  SOAP_SOCKET fd;
     3629  int err = 0;
    28923630#ifndef WITH_LEAN
     3631  int retry = 10;
    28933632  int len = SOAP_BUFLEN;
    28943633  int set = 1;
    28953634#endif
    28963635  if (soap_valid_socket(soap->socket))
    2897     soap->fclosesocket(soap, (SOAP_SOCKET)soap->socket);
     3636    soap->fclosesocket(soap, soap->socket);
    28983637  soap->socket = SOAP_INVALID_SOCKET;
    28993638  if (tcp_init(soap))
    2900   { soap_set_sender_error(soap, tcp_error(soap), "TCP initialization failed in tcp_connect()", SOAP_TCP_ERROR);
    2901     return -1;
     3639  { soap->errnum = 0;
     3640    soap_set_sender_error(soap, tcp_error(soap), "TCP init failed in tcp_connect()", SOAP_TCP_ERROR);
     3641    return SOAP_INVALID_SOCKET;
    29023642  }
    29033643  soap->errmode = 0;
    2904 /* WR[ */
    29053644#ifdef WITH_IPV6
    29063645  memset((void*)&hints, 0, sizeof(hints));
    29073646  hints.ai_family = PF_UNSPEC;
    2908   hints.ai_socktype = SOCK_STREAM;
     3647#ifndef WITH_LEAN
     3648  if ((soap->omode & SOAP_IO_UDP))
     3649    hints.ai_socktype = SOCK_DGRAM;
     3650  else
     3651#endif
     3652    hints.ai_socktype = SOCK_STREAM;
    29093653  soap->errmode = 2;
    29103654  if (soap->proxy_host)
    2911     err = getaddrinfo(soap->proxy_host, soap_int2s(soap, soap->proxy_port), &hints, &addrinfo);
     3655    err = getaddrinfo(soap->proxy_host, soap_int2s(soap, soap->proxy_port), &hints, &res);
    29123656  else
    2913     err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo);
    2914   if (addrinfo)
    2915   { resaddr = *addrinfo;
    2916     addrstorage = *((struct sockaddr_storage*)addrinfo->ai_addr);
    2917     resaddr.ai_addr = (struct sockaddr*)&addrstorage;
    2918     freeaddrinfo(addrinfo);
    2919   }
     3657    err = getaddrinfo(host, soap_int2s(soap, port), &hints, &res);
    29203658  if (err)
    2921   { soap_set_sender_error(soap, gai_strerror(err),
    2922     "TCP getaddrinfo on proxy host failed in tcp_connect()", SOAP_TCP_ERROR);
    2923     return -1;
    2924   }
    2925   fd = (int)socket(resaddr.ai_family, resaddr.ai_socktype, resaddr.ai_protocol); /* modified to use fd */
     3659  { soap_set_sender_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in tcp_connect()", SOAP_TCP_ERROR);
     3660    return SOAP_INVALID_SOCKET;
     3661  }
     3662  ressave = res;
     3663again:
     3664  fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
    29263665  soap->errmode = 0;
    2927 #else /* WITH_IPV6 */
    2928 /* ]WR */
    2929   fd = (int)socket(AF_INET, SOCK_STREAM, 0);
    2930 /* WR[ */
    2931 #endif /* WITH_IPV6 */
    2932 /* ]WR */
    2933   if (fd < 0)
    2934   { soap->errnum = soap_socket_errno;
    2935     soap_set_sender_error(soap, tcp_error(soap), "TCP socket failed in tcp_connect()", SOAP_TCP_ERROR);
    2936     return -1;
     3666#else
     3667#ifndef WITH_LEAN
     3668again:
     3669#endif
     3670#ifndef WITH_LEAN
     3671  if ((soap->omode & SOAP_IO_UDP))
     3672    fd = socket(AF_INET, SOCK_DGRAM, 0);
     3673  else
     3674#endif
     3675    fd = socket(AF_INET, SOCK_STREAM, 0);
     3676#endif
     3677  if (!soap_valid_socket(fd))
     3678  {
     3679#ifdef WITH_IPV6
     3680    if (res->ai_next)
     3681    { res = res->ai_next;
     3682      goto again;
     3683    }
     3684#endif
     3685    soap->errnum = soap_socket_errno(fd);
     3686    soap_set_sender_error(soap, tcp_error(soap), "socket failed in tcp_connect()", SOAP_TCP_ERROR);
     3687#ifdef WITH_IPV6
     3688    freeaddrinfo(ressave);
     3689#endif
     3690    return SOAP_INVALID_SOCKET;
    29373691  }
    29383692#ifdef SOCKET_CLOSE_ON_EXEC
     
    29423696#endif
    29433697#else
    2944   fcntl (fd, F_SETFD, 1);
     3698  fcntl(fd, F_SETFD, 1);
    29453699#endif
    29463700#endif
    29473701#ifndef WITH_LEAN
    2948   if (soap->connect_flags & SO_LINGER)
     3702  if (soap->connect_flags == SO_LINGER)
    29493703  { struct linger linger;
    29503704    memset((void*)&linger, 0, sizeof(linger));
    29513705    linger.l_onoff = 1;
    2952     linger.l_linger = 0;
    2953     if (setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger)))
    2954     { soap->errnum = soap_socket_errno;
    2955       soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt SO_LINGER failed in tcp_connect()", SOAP_TCP_ERROR);
    2956       soap->fclosesocket(soap, (SOAP_SOCKET)fd);
    2957       return -1;
    2958     }
    2959   }
    2960   if ((soap->connect_flags & ~SO_LINGER) && setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, soap->connect_flags & ~SO_LINGER, (char*)&set, sizeof(int)))
    2961   { soap->errnum = soap_socket_errno;
    2962     soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt failed in tcp_connect()", SOAP_TCP_ERROR);
     3706    linger.l_linger = soap->linger_time;
     3707    if (setsockopt(fd, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger)))
     3708    { soap->errnum = soap_socket_errno(fd);
     3709      soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in tcp_connect()", SOAP_TCP_ERROR);
     3710      soap->fclosesocket(soap, fd);
     3711#ifdef WITH_IPV6
     3712      freeaddrinfo(ressave);
     3713#endif
     3714      return SOAP_INVALID_SOCKET;
     3715    }
     3716  }
     3717  else if (soap->connect_flags && setsockopt(fd, SOL_SOCKET, soap->connect_flags, (char*)&set, sizeof(int)))
     3718  { soap->errnum = soap_socket_errno(fd);
     3719    soap_set_sender_error(soap, tcp_error(soap), "setsockopt failed in tcp_connect()", SOAP_TCP_ERROR);
     3720    soap->fclosesocket(soap, fd);
     3721#ifdef WITH_IPV6
     3722    freeaddrinfo(ressave);
     3723#endif
     3724    return SOAP_INVALID_SOCKET;
     3725  }
     3726  if ((soap->keep_alive || soap->tcp_keep_alive) && setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
     3727  { soap->errnum = soap_socket_errno(fd);
     3728    soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in tcp_connect()", SOAP_TCP_ERROR);
     3729    soap->fclosesocket(soap, fd);
     3730#ifdef WITH_IPV6
     3731    freeaddrinfo(ressave);
     3732#endif
     3733    return SOAP_INVALID_SOCKET;
     3734  }
     3735  if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
     3736  { soap->errnum = soap_socket_errno(fd);
     3737    soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in tcp_connect()", SOAP_TCP_ERROR);
     3738    soap->fclosesocket(soap, fd);
     3739#ifdef WITH_IPV6
     3740    freeaddrinfo(ressave);
     3741#endif
     3742    return SOAP_INVALID_SOCKET;
     3743  }
     3744  if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
     3745  { soap->errnum = soap_socket_errno(fd);
     3746    soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in tcp_connect()", SOAP_TCP_ERROR);
     3747    soap->fclosesocket(soap, fd);
     3748#ifdef WITH_IPV6
     3749    freeaddrinfo(ressave);
     3750#endif
     3751    return SOAP_INVALID_SOCKET;
     3752  }
     3753#ifdef TCP_KEEPIDLE
     3754  if (soap->tcp_keep_idle && setsockopt((SOAP_SOCKET)fd, IPPROTO_TCP, TCP_KEEPIDLE, (unsigned int*)&(soap->tcp_keep_idle), sizeof(int)))
     3755  { soap->errnum = soap_socket_errno(fd);
     3756    soap_set_sender_error(soap, tcp_error(soap), "setsockopt TCP_KEEPIDLE failed in tcp_connect()", SOAP_TCP_ERROR);
    29633757    soap->fclosesocket(soap, (SOAP_SOCKET)fd);
    2964     return -1;
    2965   }
    2966   if (soap->keep_alive && setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
    2967   { soap->errnum = soap_socket_errno;
    2968     soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt SO_KEEPALIVE failed in tcp_connect()", SOAP_TCP_ERROR);
     3758#ifdef WITH_IPV6
     3759    freeaddrinfo(ressave);
     3760#endif
     3761    return SOAP_INVALID_SOCKET;
     3762  }
     3763#endif
     3764#ifdef TCP_KEEPINTVL
     3765  if (soap->tcp_keep_intvl && setsockopt((SOAP_SOCKET)fd, IPPROTO_TCP, TCP_KEEPINTVL, (unsigned int*)&(soap->tcp_keep_intvl), sizeof(int)))
     3766  { soap->errnum = soap_socket_errno(fd);
     3767    soap_set_sender_error(soap, tcp_error(soap), "setsockopt TCP_KEEPINTVL failed in tcp_connect()", SOAP_TCP_ERROR);
    29693768    soap->fclosesocket(soap, (SOAP_SOCKET)fd);
    2970     return -1;
    2971   }
    2972   if (setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
    2973   { soap->errnum = soap_socket_errno;
    2974     soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt SO_SNDBUF failed in tcp_connect()", SOAP_TCP_ERROR);
     3769#ifdef WITH_IPV6
     3770    freeaddrinfo(ressave);
     3771#endif
     3772    return SOAP_INVALID_SOCKET;
     3773  }
     3774#endif
     3775#ifdef TCP_KEEPCNT
     3776  if (soap->tcp_keep_cnt && setsockopt((SOAP_SOCKET)fd, IPPROTO_TCP, TCP_KEEPCNT, (unsigned int*)&(soap->tcp_keep_cnt), sizeof(int)))
     3777  { soap->errnum = soap_socket_errno(fd);
     3778    soap_set_sender_error(soap, tcp_error(soap), "setsockopt TCP_KEEPCNT failed in tcp_connect()", SOAP_TCP_ERROR);
    29753779    soap->fclosesocket(soap, (SOAP_SOCKET)fd);
    2976     return -1;
    2977   }
    2978   if (setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
    2979   { soap->errnum = soap_socket_errno;
    2980     soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt SO_RCVBUF failed in tcp_connect()", SOAP_TCP_ERROR);
    2981     soap->fclosesocket(soap, (SOAP_SOCKET)fd);
    2982     return -1;
    2983   }
     3780#ifdef WITH_IPV6
     3781    freeaddrinfo(ressave);
     3782#endif
     3783    return SOAP_INVALID_SOCKET;
     3784  }
     3785#endif
    29843786#ifdef TCP_NODELAY
    2985   if (setsockopt((SOAP_SOCKET)fd, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
    2986   { soap->errnum = soap_socket_errno;
    2987     soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt TCP_NODELAY failed in tcp_connect()", SOAP_TCP_ERROR);
    2988     soap->fclosesocket(soap, (SOAP_SOCKET)fd);
    2989     return -1;
    2990   }
    2991 #endif
    2992 #endif
    2993 /* WR[ */
     3787  if (!(soap->omode & SOAP_IO_UDP) && setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
     3788  { soap->errnum = soap_socket_errno(fd);
     3789    soap_set_sender_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in tcp_connect()", SOAP_TCP_ERROR);
     3790    soap->fclosesocket(soap, fd);
     3791#ifdef WITH_IPV6
     3792    freeaddrinfo(ressave);
     3793#endif
     3794    return SOAP_INVALID_SOCKET;
     3795  }
     3796#endif
     3797#ifdef WITH_IPV6
     3798  if ((soap->omode & SOAP_IO_UDP) && soap->ipv6_multicast_if)
     3799  { struct sockaddr_in6 *in6addr = (struct sockaddr_in6*)res->ai_addr;
     3800    in6addr->sin6_scope_id = soap->ipv6_multicast_if;
     3801  }
     3802#else
     3803  if ((soap->omode & SOAP_IO_UDP) && soap->ipv4_multicast_if)
     3804  { if (soap->ipv4_multicast_ttl > 0)
     3805    { char ttl = (char)(soap->ipv4_multicast_ttl);
     3806      if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)))
     3807      { soap->errnum = soap_socket_errno(fd);
     3808        soap_set_sender_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_TTL failed in tcp_connect()", SOAP_TCP_ERROR);
     3809        soap->fclosesocket(soap, fd);
     3810        return SOAP_INVALID_SOCKET;
     3811      }
     3812    }
     3813#ifndef WINDOWS
     3814    if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, soap->ipv4_multicast_if, sizeof(struct in_addr)))
     3815    { soap->errnum = soap_socket_errno(fd);
     3816      soap_set_sender_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR);
     3817      soap->fclosesocket(soap, fd);
     3818      return SOAP_INVALID_SOCKET;
     3819    }
     3820#else
     3821#ifndef IP_MULTICAST_IF
     3822#define IP_MULTICAST_IF 2
     3823#endif
     3824    if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, soap->ipv4_multicast_if, sizeof(struct in_addr)))
     3825    { soap->errnum = soap_socket_errno(fd);
     3826      soap_set_sender_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR);
     3827      soap->fclosesocket(soap, fd);
     3828      return SOAP_INVALID_SOCKET;
     3829    }
     3830#endif
     3831  }
     3832#endif
     3833#endif
     3834  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Opening socket %d to host='%s' port=%d\n", fd, host, port));
    29943835#ifndef WITH_IPV6
    2995 /* ]WR */
    2996   memset((void*)&sockaddr, 0, sizeof(sockaddr));
    2997   sockaddr.sin_family = AF_INET;
    2998   DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Open socket %d to host='%s'\n", fd, host));
     3836  soap->peerlen = sizeof(soap->peer);
     3837  memset((void*)&soap->peer, 0, sizeof(soap->peer));
     3838  soap->peer.sin_family = AF_INET;
    29993839  soap->errmode = 2;
    30003840  if (soap->proxy_host)
    3001   { if (soap->fresolve(soap, soap->proxy_host, &sockaddr.sin_addr))
    3002     { soap_set_sender_error(soap, tcp_error(soap), "TCP get proxy host by name failed in tcp_connect()", SOAP_TCP_ERROR);
    3003       soap->fclosesocket(soap, (SOAP_SOCKET)fd);
    3004       return -1;
    3005     }
    3006     sockaddr.sin_port = htons((short)soap->proxy_port);
     3841  { if (soap->fresolve(soap, soap->proxy_host, &soap->peer.sin_addr))
     3842    { soap_set_sender_error(soap, tcp_error(soap), "get proxy host by name failed in tcp_connect()", SOAP_TCP_ERROR);
     3843      soap->fclosesocket(soap, fd);
     3844#ifdef WITH_IPV6
     3845      freeaddrinfo(ressave);
     3846#endif
     3847      return SOAP_INVALID_SOCKET;
     3848    }
     3849    soap->peer.sin_port = htons((short)soap->proxy_port);
    30073850  }
    30083851  else
    3009   { if (soap->fresolve(soap, host, &sockaddr.sin_addr))
    3010     { soap_set_sender_error(soap, tcp_error(soap), "TCP get host by name failed in tcp_connect()", SOAP_TCP_ERROR);
    3011       soap->fclosesocket(soap, (SOAP_SOCKET)fd);
    3012       return -1;
    3013     }
    3014     sockaddr.sin_port = htons((short)port);
     3852  { if (soap->fresolve(soap, host, &soap->peer.sin_addr))
     3853    { soap_set_sender_error(soap, tcp_error(soap), "get host by name failed in tcp_connect()", SOAP_TCP_ERROR);
     3854      soap->fclosesocket(soap, fd);
     3855#ifdef WITH_IPV6
     3856      freeaddrinfo(ressave);
     3857#endif
     3858      return SOAP_INVALID_SOCKET;
     3859    }
     3860    soap->peer.sin_port = htons((short)port);
    30153861  }
    30163862  soap->errmode = 0;
    3017 /* WR[ */
    3018 #endif /* WITH_IPV6 */
    3019 /* ]WR */
     3863#ifndef WITH_LEAN
     3864  if ((soap->omode & SOAP_IO_UDP))
     3865  {
     3866#ifdef WITH_IPV6
     3867    freeaddrinfo(ressave);
     3868#endif
     3869    return fd;
     3870  }
     3871#endif
     3872#endif
    30203873#ifndef WITH_LEAN
    30213874  if (soap->connect_timeout)
    3022 #if defined(WIN32)
    3023   { u_long nonblocking = 1;
    3024     ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &nonblocking);
    3025   }
    3026 /* WR[ */
    3027 #elif defined(VXWORKS)
    3028   { vx_nonblocking = TRUE;
    3029     ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&vx_nonblocking)); /* modified to use fd */
    3030   }
    3031 /* ]WR */
    3032 #else
    3033     fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)|O_NONBLOCK);
    3034 #endif
     3875    SOAP_SOCKNONBLOCK(fd)
    30353876  else
    3036 #if defined(WIN32)
    3037   { u_long blocking = 0;
    3038     ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &blocking);
    3039   }
    3040 /* WR[ */
    3041 #elif defined(VXWORKS)
    3042   { vx_nonblocking = FALSE;
    3043     ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&vx_nonblocking)); /* modified to use fd */
    3044   }
    3045 /* ]WR */
    3046 #else
    3047     fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)&~O_NONBLOCK);
    3048 #endif
     3877    SOAP_SOCKBLOCK(fd)
    30493878#endif
    30503879  for (;;)
    30513880  {
    3052 /* WR[ */
    30533881#ifdef WITH_IPV6
    3054     if (connect((SOAP_SOCKET)fd, resaddr.ai_addr, resaddr.ai_addrlen)) /* modified to use fd */
    3055 #else /* WITH_IPV6 */
    3056     if (connect((SOAP_SOCKET)fd, (struct sockaddr*)&sockaddr, sizeof(sockaddr)))
    3057 #endif /* WITH_IPV6 */
    3058 /* ]WR */
    3059     {
     3882    if (connect(fd, res->ai_addr, (int)res->ai_addrlen))
     3883#else
     3884    if (connect(fd, (struct sockaddr*)&soap->peer, sizeof(soap->peer)))
     3885#endif
     3886    { err = soap_socket_errno(fd);
    30603887#ifndef WITH_LEAN
    3061       if (soap->connect_timeout && (soap_socket_errno == SOAP_EINPROGRESS || soap_socket_errno == SOAP_EWOULDBLOCK))
    3062       { struct timeval timeout;
    3063 #if defined(SOCKLEN_T)
    3064         SOCKLEN_T n = sizeof(struct sockaddr_in);
    3065 #elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN)
    3066         socklen_t n = sizeof(struct sockaddr_in);
    3067 #elif defined(WIN32) || defined(__APPLE__) || defined(HP_UX) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS)
    3068         int n = sizeof(struct sockaddr_in);
    3069 #else
    3070         size_t n = sizeof(struct sockaddr_in);
    3071 #endif
    3072         fd_set fds;
    3073         if (soap->connect_timeout > 0)
    3074         { timeout.tv_sec = soap->connect_timeout;
    3075           timeout.tv_usec = 0;
     3888      if (err == SOAP_EADDRINUSE)
     3889      { soap->fclosesocket(soap, fd);
     3890        if (retry-- > 0)
     3891          goto again;
     3892      }
     3893      else if (soap->connect_timeout && (err == SOAP_EINPROGRESS || err == SOAP_EAGAIN || err == SOAP_EWOULDBLOCK))
     3894      {
     3895        SOAP_SOCKLEN_T k;
     3896#ifndef WIN32
     3897        if ((int)soap->socket >= (int)FD_SETSIZE)
     3898        { soap->error = SOAP_FD_EXCEEDED;
     3899#ifdef WITH_IPV6
     3900          freeaddrinfo(ressave);
     3901#endif
     3902          return SOAP_INVALID_SOCKET;   /* Hint: MUST increase FD_SETSIZE */
    30763903        }
    3077         else
    3078         { timeout.tv_sec = -soap->connect_timeout/1000000;
    3079           timeout.tv_usec = -soap->connect_timeout%1000000;
    3080         }
    3081         FD_ZERO(&fds);
    3082         FD_SET((SOAP_SOCKET)fd, &fds);
     3904#endif
    30833905        for (;;)
    3084         { int r = select((SOAP_SOCKET)(fd + 1), NULL, &fds, NULL, &timeout);
    3085           if (r > 0)
    3086             break;
    3087           if (!r)
    3088           { soap->errnum = 0;
    3089             DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n"));
    3090             soap_set_sender_error(soap, "Timeout", "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
    3091             soap->fclosesocket(soap, (SOAP_SOCKET)fd);
    3092             return -1;
    3093           }
    3094           if (soap_socket_errno != SOAP_EINTR)
    3095           { soap->errnum = soap_socket_errno;
    3096             DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n"));
    3097             soap_set_sender_error(soap, tcp_error(soap), "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
    3098             soap->fclosesocket(soap, (SOAP_SOCKET)fd);
    3099             return -1;
    3100           }
    3101         }
    3102         n = sizeof(soap->errnum);
    3103         if (!getsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_ERROR, (char*)&soap->errnum, &n) && !soap->errnum)
    3104           break;
    3105         DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n"));
    3106         soap_set_sender_error(soap, tcp_error(soap), "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
    3107         soap->fclosesocket(soap, (SOAP_SOCKET)fd);
    3108         return -1;
    3109       }
    3110       else
    3111 #endif
    3112       if (soap_socket_errno != SOAP_EINTR)
    3113       { soap->errnum = soap_socket_errno;
    3114         DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n"));
    3115         soap_set_sender_error(soap, tcp_error(soap), "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
    3116         soap->fclosesocket(soap, (SOAP_SOCKET)fd);
    3117         return -1;
    3118       }
    3119     } 
    3120     else
    3121       break;
    3122   }
    3123 #ifndef WITH_LEAN
    3124   if (soap->connect_timeout)
    3125 #if defined(WIN32)
    3126   { u_long blocking = 0;
    3127     ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &blocking);
    3128   }
    3129 /* WR[ */
    3130 #elif defined(VXWORKS)
    3131   { vx_nonblocking = FALSE;
    3132     ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&vx_nonblocking)); /* modified to use fd */
    3133   }
    3134 /* ]WR */
    3135 #else
    3136     fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)&~O_NONBLOCK);
    3137 #endif
    3138 #endif
    3139   soap->socket = fd;
    3140 #ifdef WITH_OPENSSL
    3141   soap->imode &= ~SOAP_ENC_SSL;
    3142   soap->omode &= ~SOAP_ENC_SSL;
    3143   if (!strncmp(endpoint, "https:", 6))
    3144   { int r;
    3145     if (soap->proxy_host)
    3146     { unsigned int k = soap->omode; /* make sure we only parse HTTP */
    3147       size_t n = soap->count; /* save the content length */
    3148       soap->omode &= ~0xFF; /* mask IO and ENC */
    3149       soap->omode |= SOAP_IO_BUFFER;
    3150       soap_begin_send(soap);
    3151       DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connecting to proxy server\n"));
    3152       sprintf(soap->tmpbuf, "CONNECT %s:%d HTTP/%s", host, port, soap->http_version);
    3153       if ((soap->error = soap->fposthdr(soap, soap->tmpbuf, NULL)))
    3154         return -1;
    3155 #ifndef WITH_LEAN
    3156       if (soap->proxy_userid && soap->proxy_passwd && strlen(soap->proxy_userid) + strlen(soap->proxy_passwd) < 761)
    3157       { sprintf(soap->tmpbuf + 262, "%s:%s", soap->proxy_userid, soap->proxy_passwd);
    3158         strcpy(soap->tmpbuf, "Basic ");
    3159         soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, strlen(soap->tmpbuf + 262));
    3160         if ((soap->error = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf)))
    3161           return soap->error;
    3162       }
    3163 #endif
    3164       if ((soap->error = soap->fposthdr(soap, NULL, NULL))
    3165        || soap_flush(soap))
    3166         return -1;
    3167       soap->omode = k;
    3168       k = soap->imode;
    3169       soap->imode &= ~0xFF; /* mask IO and ENC */
    3170       if (soap_begin_recv(soap))
    3171         return -1;
    3172       soap->imode = k;
    3173       soap->count = n;
    3174       soap_begin_send(soap);
    3175     }
    3176     if (!soap->ctx && (soap->error = soap->fsslauth(soap)))
    3177     { soap_set_sender_error(soap, "SSL error", "SSL authentication failed in tcp_connect(): check password, key file, and ca file.", SOAP_SSL_ERROR);
    3178       return -1;
    3179     }
    3180     soap->ssl = SSL_new(soap->ctx);
    3181     if (!soap->ssl)
    3182     { soap->error = SOAP_SSL_ERROR;
    3183       return -1;
    3184     }
    3185     if (soap->session)
    3186     { if (!strcmp(soap->session_host, host) && soap->session_port == port)
    3187         SSL_set_session(soap->ssl, soap->session);
    3188       SSL_SESSION_free(soap->session);
    3189       soap->session = NULL;
    3190     }
    3191     soap->imode |= SOAP_ENC_SSL;
    3192     soap->omode |= SOAP_ENC_SSL;
    3193     soap->bio = BIO_new_socket((SOAP_SOCKET)fd, BIO_NOCLOSE);
    3194     SSL_set_bio(soap->ssl, soap->bio, soap->bio);
    3195 #ifndef WITH_LEAN
    3196     if (soap->connect_timeout)
    3197 #ifdef WIN32
    3198     { u_long nonblocking = 1;
    3199       ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &nonblocking);
    3200     }
    3201 #else
    3202       fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)|O_NONBLOCK);
    3203 #endif
    3204 #endif
    3205     for (;;)
    3206     { if ((r = SSL_connect(soap->ssl)) <= 0)
    3207       { int err = SSL_get_error(soap->ssl, r);
    3208         if (err != SSL_ERROR_NONE && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE)
    3209         { soap_set_sender_error(soap, ssl_error(soap, r), "SSL connect failed in tcp_connect()", SOAP_SSL_ERROR);
    3210           return -1;
    3211         }
    3212         if (soap->connect_timeout)
    32133906        { struct timeval timeout;
    32143907          fd_set fds;
     3908          register int r;
    32153909          if (soap->connect_timeout > 0)
    32163910          { timeout.tv_sec = soap->connect_timeout;
     
    32223916          }
    32233917          FD_ZERO(&fds);
    3224           FD_SET((SOAP_SOCKET)(soap->socket), &fds);
     3918          FD_SET(fd, &fds);
     3919          r = select((int)fd + 1, NULL, &fds, NULL, &timeout);
     3920          if (r > 0)
     3921            break;
     3922          if (!r)
     3923          { soap->errnum = 0;
     3924            DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n"));
     3925            soap_set_sender_error(soap, "Timeout", "connect failed in tcp_connect()", SOAP_TCP_ERROR);
     3926            soap->fclosesocket(soap, fd);
     3927#ifdef WITH_IPV6
     3928            freeaddrinfo(ressave);
     3929#endif
     3930            return SOAP_INVALID_SOCKET;
     3931          }
     3932          r = soap_socket_errno(fd);
     3933          if (r != SOAP_EINTR)
     3934          { soap->errnum = r;
     3935            DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n"));
     3936            soap_set_sender_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR);
     3937            soap->fclosesocket(soap, fd);
     3938#ifdef WITH_IPV6
     3939            freeaddrinfo(ressave);
     3940#endif
     3941            return SOAP_INVALID_SOCKET;
     3942          }
     3943        }
     3944        k = (SOAP_SOCKLEN_T)sizeof(soap->errnum);
     3945        if (!getsockopt(fd, SOL_SOCKET, SO_ERROR, (char*)&soap->errnum, &k) && !soap->errnum)   /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */
     3946          break;
     3947        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n"));
     3948        if (!soap->errnum)
     3949          soap->errnum = soap_socket_errno(fd);
     3950        soap_set_sender_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR);
     3951        soap->fclosesocket(soap, fd);
     3952#ifdef WITH_IPV6
     3953        freeaddrinfo(ressave);
     3954#endif
     3955        return SOAP_INVALID_SOCKET;
     3956      }
     3957#endif
     3958#ifdef WITH_IPV6
     3959      if (res->ai_next)
     3960      { res = res->ai_next;
     3961        soap->fclosesocket(soap, fd);
     3962        goto again;
     3963      }
     3964#endif
     3965      if (err && err != SOAP_EINTR)
     3966      { soap->errnum = err;
     3967        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n"));
     3968        soap_set_sender_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR);
     3969        soap->fclosesocket(soap, fd);
     3970#ifdef WITH_IPV6
     3971        freeaddrinfo(ressave);
     3972#endif
     3973        return SOAP_INVALID_SOCKET;
     3974      }
     3975    } 
     3976    else
     3977      break;
     3978  }
     3979#ifdef WITH_IPV6
     3980  soap->peerlen = 0; /* IPv6: already connected so use send() */
     3981  freeaddrinfo(ressave);
     3982#endif
     3983#ifndef WITH_LEAN
     3984  if (soap->recv_timeout || soap->send_timeout)
     3985    SOAP_SOCKNONBLOCK(fd)
     3986  else
     3987    SOAP_SOCKBLOCK(fd)
     3988#endif
     3989  soap->socket = fd;
     3990  soap->imode &= ~SOAP_ENC_SSL;
     3991  soap->omode &= ~SOAP_ENC_SSL;
     3992  if (!soap_tag_cmp(endpoint, "https:*"))
     3993  {
     3994#ifdef WITH_OPENSSL
     3995    BIO *bio;
     3996    int r;
     3997    if (soap->proxy_host)
     3998    { soap_mode m = soap->omode; /* make sure we only parse HTTP */
     3999      size_t n = soap->count; /* save the content length */
     4000      char *userid, *passwd;
     4001      soap->omode &= ~SOAP_ENC; /* mask IO and ENC */
     4002      soap->omode |= SOAP_IO_BUFFER;
     4003      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connecting to %s proxy server\n", soap->proxy_http_version));
     4004      sprintf(soap->tmpbuf, "CONNECT %s:%d HTTP/%s", host, port, soap->proxy_http_version);
     4005      if (soap_begin_send(soap)
     4006       || (soap->error = soap->fposthdr(soap, soap->tmpbuf, NULL)))
     4007      { soap->fclosesocket(soap, fd);
     4008        return SOAP_INVALID_SOCKET;
     4009      }
     4010#ifndef WITH_LEAN
     4011      if (soap->proxy_userid && soap->proxy_passwd && strlen(soap->proxy_userid) + strlen(soap->proxy_passwd) < 761)
     4012      { sprintf(soap->tmpbuf + 262, "%s:%s", soap->proxy_userid, soap->proxy_passwd);
     4013        strcpy(soap->tmpbuf, "Basic ");
     4014        soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262));
     4015        if ((soap->error = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf)))
     4016        { soap->fclosesocket(soap, fd);
     4017          return soap->error;
     4018        }
     4019      }
     4020#endif
     4021      if ((soap->error = soap->fposthdr(soap, NULL, NULL))
     4022       || soap_flush(soap))
     4023      { soap->fclosesocket(soap, fd);
     4024        return SOAP_INVALID_SOCKET;
     4025      }
     4026      soap->omode = m;
     4027      m = soap->imode;
     4028      soap->imode &= ~SOAP_ENC; /* mask IO and ENC */
     4029      userid = soap->userid; /* preserve */
     4030      passwd = soap->passwd; /* preserve */
     4031      if ((soap->error = soap->fparse(soap)))
     4032      { soap->fclosesocket(soap, fd);
     4033        return SOAP_INVALID_SOCKET;
     4034      }
     4035      soap->userid = userid; /* restore */
     4036      soap->passwd = passwd; /* restore */
     4037      soap->imode = m; /* restore */
     4038      soap->count = n; /* restore */
     4039      if (soap_begin_send(soap))
     4040      { soap->fclosesocket(soap, fd);
     4041        return SOAP_INVALID_SOCKET;
     4042      }
     4043      if (endpoint)
     4044        strncpy(soap->endpoint, endpoint, sizeof(soap->endpoint)-1); /* restore */
     4045    }
     4046    if (!soap->ctx && (soap->error = soap->fsslauth(soap)))
     4047    { soap_set_sender_error(soap, "SSL error", "SSL authentication failed in tcp_connect(): check password, key file, and ca file.", SOAP_SSL_ERROR);
     4048      soap->fclosesocket(soap, fd);
     4049      return SOAP_INVALID_SOCKET;
     4050    }
     4051    if (!soap->ssl)
     4052    { soap->ssl = SSL_new(soap->ctx);
     4053      if (!soap->ssl)
     4054      { soap->fclosesocket(soap, fd);
     4055        soap->error = SOAP_SSL_ERROR;
     4056        return SOAP_INVALID_SOCKET;
     4057      }
     4058    }
     4059    else
     4060      SSL_clear(soap->ssl);
     4061    if (soap->session)
     4062    { if (!strcmp(soap->session_host, host) && soap->session_port == port)
     4063        SSL_set_session(soap->ssl, soap->session);
     4064      SSL_SESSION_free(soap->session);
     4065      soap->session = NULL;
     4066    }
     4067    soap->imode |= SOAP_ENC_SSL;
     4068    soap->omode |= SOAP_ENC_SSL;
     4069    bio = BIO_new_socket((int)fd, BIO_NOCLOSE);
     4070    SSL_set_bio(soap->ssl, bio, bio);
     4071#ifndef WITH_LEAN
     4072    /* Connect timeout: set SSL sockets to non-blocking */
     4073    if (soap->connect_timeout)
     4074      SOAP_SOCKNONBLOCK(fd)
     4075    else
     4076      SOAP_SOCKBLOCK(fd)
     4077    /* Try connecting until success or timeout */
     4078    do
     4079    { if ((r = SSL_connect(soap->ssl)) <= 0)
     4080      { int err;
     4081        if ((err = SSL_get_error(soap->ssl, r)) == SSL_ERROR_NONE)
     4082          break;
     4083        if (err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE)
     4084        { soap_set_sender_error(soap, soap_ssl_error(soap, r), "SSL connect failed in tcp_connect()", SOAP_SSL_ERROR);
     4085          soap->fclosesocket(soap, fd);
     4086          return SOAP_INVALID_SOCKET;
     4087        }
     4088        if (soap->connect_timeout)
     4089        {
     4090#ifndef WIN32
     4091          if ((int)soap->socket >= (int)FD_SETSIZE)
     4092          { soap->error = SOAP_FD_EXCEEDED;
     4093            return SOAP_INVALID_SOCKET; /* Hint: MUST increase FD_SETSIZE */
     4094          }
     4095#endif
    32254096          for (;;)
    3226           { int r = select((SOAP_SOCKET)(soap->socket + 1), &fds, NULL, &fds, &timeout);
    3227             if (r > 0)
     4097          { struct timeval timeout;
     4098            fd_set fds;
     4099            register int r;
     4100            if (soap->connect_timeout > 0)
     4101            { timeout.tv_sec = soap->connect_timeout;
     4102              timeout.tv_usec = 0;
     4103            }
     4104            else
     4105            { timeout.tv_sec = -soap->connect_timeout/1000000;
     4106              timeout.tv_usec = -soap->connect_timeout%1000000;
     4107            }
     4108            FD_ZERO(&fds);
     4109            FD_SET(fd, &fds);
     4110            if (err == SSL_ERROR_WANT_READ)
     4111              r = select((int)fd + 1, &fds, NULL, NULL, &timeout);
     4112            else
     4113              r = select((int)fd + 1, NULL, &fds, NULL, &timeout);
     4114            if (r >= 1)
     4115            { r = 1;
    32284116              break;
    3229             if (!r)
     4117            }
     4118            else
    32304119            { soap->errnum = 0;
    32314120              DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n"));
    3232               soap_set_sender_error(soap, "Timeout", "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
    3233               return -1;
     4121              soap_set_sender_error(soap, "Timeout", "connect failed in tcp_connect()", SOAP_TCP_ERROR);
     4122              soap->fclosesocket(soap, fd);
     4123              return SOAP_INVALID_SOCKET;
    32344124            }
    32354125          }
    3236           continue;
     4126          continue;
    32374127        }
    32384128      }
    32394129      break;
    3240     }
    3241 #ifndef WITH_LEAN
    3242     if (soap->connect_timeout)
    3243 #ifdef WIN32
    3244     { u_long blocking = 0;
    3245       ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &blocking);
    3246     }
    3247 #else
    3248       fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)&~O_NONBLOCK);
    3249 #endif
    3250 #endif
    3251     if (soap->require_server_auth)
    3252     { X509 *peer;
    3253       int err;
     4130    } while (r == 1 && !SSL_is_init_finished(soap->ssl));
     4131    /* Set SSL sockets to nonblocking */
     4132    SOAP_SOCKNONBLOCK(fd)
     4133#endif
     4134    /* Check server credentials when required */
     4135    if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION))
     4136    { int err;
    32544137      if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK)
    32554138      { soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL certificate presented by peer cannot be verified in tcp_connect()", SOAP_SSL_ERROR);
    3256         return -1;
    3257       }
    3258       peer = SSL_get_peer_certificate(soap->ssl);
    3259       if (!peer)
    3260       { soap_set_sender_error(soap, "SSL error", "No SSL certificate was presented by the peer in tcp_connect()", SOAP_SSL_ERROR);
    3261         return -1;
    3262       }
    3263       X509_NAME_get_text_by_NID(X509_get_subject_name(peer), NID_commonName, soap->msgbuf, sizeof(soap->msgbuf));
    3264       X509_free(peer);
    3265       if (soap_tag_cmp(soap->msgbuf, host))
    3266       { soap_set_sender_error(soap, "SSL error", "SSL certificate host name mismatch in tcp_connect()", SOAP_SSL_ERROR);
    3267         return -1;
    3268       }
    3269     }
    3270   }
    3271 #endif
     4139        soap->fclosesocket(soap, fd);
     4140        return SOAP_INVALID_SOCKET;
     4141      }
     4142      if (!(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK))
     4143      { X509_NAME *subj;
     4144        int ext_count;
     4145        int ok = 0;
     4146        X509 *peer;
     4147        peer = SSL_get_peer_certificate(soap->ssl);
     4148        if (!peer)
     4149        { soap_set_sender_error(soap, "SSL error", "No SSL certificate was presented by the peer in tcp_connect()", SOAP_SSL_ERROR);
     4150          soap->fclosesocket(soap, fd);
     4151          return SOAP_INVALID_SOCKET;
     4152        }
     4153        ext_count = X509_get_ext_count(peer);
     4154        if (ext_count > 0)
     4155        { int i;
     4156          for (i = 0; i < ext_count; i++)
     4157          { X509_EXTENSION *ext = X509_get_ext(peer, i);
     4158            const char *ext_str = OBJ_nid2sn(OBJ_obj2nid(X509_EXTENSION_get_object(ext)));
     4159            if (ext_str && !strcmp(ext_str, "subjectAltName"))
     4160            { X509V3_EXT_METHOD *meth = X509V3_EXT_get(ext);
     4161              void *ext_data;
     4162#if (OPENSSL_VERSION_NUMBER >= 0x0090800fL)
     4163              const unsigned char *data;
     4164#else
     4165              unsigned char *data;
     4166#endif
     4167              STACK_OF(CONF_VALUE) *val;
     4168              int j;
     4169              if (!meth)
     4170                break;
     4171              data = ext->value->data;
     4172#if (OPENSSL_VERSION_NUMBER > 0x00907000L)
     4173              if (meth->it)
     4174                ext_data = ASN1_item_d2i(NULL, &data, ext->value->length, ASN1_ITEM_ptr(meth->it));
     4175              else
     4176              { /* OpenSSL not perfectly portable at this point (?):
     4177                   Some compilers appear to prefer
     4178                   meth->d2i(NULL, (const unsigned char**)&data, ...
     4179                   or
     4180                   meth->d2i(NULL, &data, ext->value->length);
     4181                */
     4182                ext_data = meth->d2i(NULL, &data, ext->value->length);
     4183              }
     4184#else
     4185              ext_data = meth->d2i(NULL, &data, ext->value->length);
     4186#endif
     4187              val = meth->i2v(meth, ext_data, NULL);
     4188              for (j = 0; j < sk_CONF_VALUE_num(val); j++)
     4189              { CONF_VALUE *nval = sk_CONF_VALUE_value(val, j);
     4190                if (nval && !strcmp(nval->name, "DNS") && !strcmp(nval->value, host))
     4191                { ok = 1;
     4192                  break;
     4193                }
     4194              }
     4195            }
     4196            if (ok)
     4197              break;
     4198          }
     4199        }
     4200        if (!ok && (subj = X509_get_subject_name(peer)))
     4201        { int i = -1;
     4202          do
     4203          { ASN1_STRING *name;
     4204            i = X509_NAME_get_index_by_NID(subj, NID_commonName, i);
     4205            if (i == -1)
     4206              break;
     4207            name = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(subj, i));
     4208            if (name)
     4209            { if (!soap_tag_cmp(host, (const char*)name))
     4210                ok = 1;
     4211              else
     4212              { unsigned char *tmp = NULL;
     4213                ASN1_STRING_to_UTF8(&tmp, name);
     4214                if (tmp)
     4215                { if (!soap_tag_cmp(host, (const char*)tmp))
     4216                    ok = 1;
     4217                  OPENSSL_free(tmp);
     4218                }
     4219              }
     4220            }
     4221          } while (!ok);
     4222        }
     4223        X509_free(peer);
     4224        if (!ok)
     4225        { soap_set_sender_error(soap, "SSL error", "SSL certificate host name mismatch in tcp_connect()", SOAP_SSL_ERROR);
     4226          soap->fclosesocket(soap, fd);
     4227          return SOAP_INVALID_SOCKET;
     4228        }
     4229      }
     4230    }
     4231#else
     4232    soap->fclosesocket(soap, fd);
     4233    soap->error = SOAP_SSL_ERROR;
     4234    return SOAP_INVALID_SOCKET;
     4235#endif
     4236  }
    32724237  return fd;
    32734238}
     
    32764241
    32774242/******************************************************************************/
    3278 #ifndef MAC_CARBON
    3279 #ifndef PALM_1
    3280 SOAP_FMAC1
    3281 int
     4243#ifndef WITH_NOIO
     4244#ifndef PALM_1
     4245SOAP_FMAC1
     4246SOAP_SOCKET
    32824247SOAP_FMAC2
    32834248soap_bind(struct soap *soap, const char *host, int port, int backlog)
    3284 { struct sockaddr_in sockaddr;
    3285 /* WR[ */
     4249{
    32864250#ifdef WITH_IPV6
    3287   struct addrinfo *addrinfo;
     4251  struct addrinfo *addrinfo = NULL;
    32884252  struct addrinfo hints;
    3289   struct addrinfo resaddr;
    3290   struct sockaddr_storage addrstorage;
     4253  struct addrinfo res;
    32914254  int err;
    3292 #endif /* WITH_IPV6 */
    3293 /* ]WR */
     4255#endif
    32944256#ifndef WITH_LEAN
    32954257  int len = SOAP_BUFLEN;
     
    32974259#endif
    32984260  if (soap_valid_socket(soap->master))
    3299   { soap->fclosesocket(soap, (SOAP_SOCKET)soap->master);
     4261  { soap->fclosesocket(soap, soap->master);
    33004262    soap->master = SOAP_INVALID_SOCKET;
    33014263  }
     
    33044266  if (tcp_init(soap))
    33054267  { soap_set_receiver_error(soap, tcp_error(soap), "TCP init failed in soap_bind()", SOAP_TCP_ERROR);
    3306     return -1;
    3307   }
    3308 /* WR[ */
     4268    return SOAP_INVALID_SOCKET;
     4269  }
    33094270#ifdef WITH_IPV6
    33104271  memset((void*)&hints, 0, sizeof(hints));
    33114272  hints.ai_family = PF_UNSPEC;
    3312   hints.ai_socktype = SOCK_STREAM;
     4273#ifndef WITH_LEAN
     4274  if ((soap->omode & SOAP_IO_UDP))
     4275    hints.ai_socktype = SOCK_DGRAM;
     4276  else
     4277#endif
     4278    hints.ai_socktype = SOCK_STREAM;
    33134279  hints.ai_flags = AI_PASSIVE;
    33144280  soap->errmode = 2;
    3315   if (host)
    3316     err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo);
     4281  err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo);
     4282  if (addrinfo)
     4283  { res = *addrinfo;
     4284    memcpy(&soap->peer, addrinfo->ai_addr, addrinfo->ai_addrlen);
     4285    soap->peerlen = addrinfo->ai_addrlen;
     4286    res.ai_addr = (struct sockaddr*)&soap->peer;
     4287    res.ai_addrlen = soap->peerlen;
     4288    freeaddrinfo(addrinfo);
     4289  }
     4290  if (err || !addrinfo)
     4291  { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in soap_bind()", SOAP_TCP_ERROR);
     4292    return SOAP_INVALID_SOCKET;
     4293  }
     4294  soap->master = (int)socket(res.ai_family, res.ai_socktype, res.ai_protocol);
     4295#else
     4296#ifndef WITH_LEAN
     4297  if ((soap->omode & SOAP_IO_UDP))
     4298    soap->master = (int)socket(AF_INET, SOCK_DGRAM, 0);
    33174299  else
    3318     err = getaddrinfo(NULL, soap_int2s(soap, port), &hints, &addrinfo);
    3319   if (NULL != addrinfo)
    3320   {
    3321     resaddr = *addrinfo;
    3322     addrstorage = *((struct sockaddr_storage *) addrinfo->ai_addr);
    3323     resaddr.ai_addr = (struct sockaddr *) &addrstorage;
    3324     freeaddrinfo(addrinfo);
    3325   }
    3326   if (err)
    3327   { soap_set_receiver_error(soap, gai_strerror(err), "TCP getaddrinfo failed in soap_bind()", SOAP_TCP_ERROR);
    3328     return -1;
    3329   }
     4300#endif
     4301    soap->master = (int)socket(AF_INET, SOCK_STREAM, 0);
     4302#endif
    33304303  soap->errmode = 0;
    3331   if ((soap->master = socket(resaddr.ai_family, resaddr.ai_socktype, resaddr.ai_protocol)) < 0)
    3332   { soap->errnum = soap_socket_errno;
    3333     soap_set_receiver_error(soap, tcp_error(soap), "TCP socket failed in soap_bind()", SOAP_TCP_ERROR);
    3334     return -1;
    3335   }
    3336 #else /* WITH_IPV6 */
    3337 /* ]WR */
    3338   soap->errmode = 0;
    3339   if ((soap->master = (int)socket(AF_INET, SOCK_STREAM, 0)) < 0)
    3340   { soap->errnum = soap_socket_errno;
    3341     soap_set_receiver_error(soap, tcp_error(soap), "TCP socket failed in soap_bind()", SOAP_TCP_ERROR);
    3342     return -1;
    3343   }
    3344 /* WR[ */
    3345 #endif /* WITH_IPV6 */
    3346 /* ]WR */
     4304  if (!soap_valid_socket(soap->master))
     4305  { soap->errnum = soap_socket_errno(soap->master);
     4306    soap_set_receiver_error(soap, tcp_error(soap), "socket failed in soap_bind()", SOAP_TCP_ERROR);
     4307    return SOAP_INVALID_SOCKET;
     4308  }
     4309#ifndef WITH_LEAN
     4310  if ((soap->omode & SOAP_IO_UDP))
     4311    soap->socket = soap->master;
     4312#endif
    33474313#ifdef SOCKET_CLOSE_ON_EXEC
    33484314#ifdef WIN32
     
    33514317#endif
    33524318#else
    3353   fcntl (soap->master, F_SETFD, 1);
     4319  fcntl(soap->master, F_SETFD, 1);
    33544320#endif
    33554321#endif
    33564322#ifndef WITH_LEAN
    3357   if (soap->bind_flags && setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, soap->bind_flags, (char*)&set, sizeof(int)))
    3358   { soap->errnum = soap_socket_errno;
    3359     soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt failed in soap_bind()", SOAP_TCP_ERROR);
    3360     return -1;
    3361   }
    3362   if (soap->keep_alive && setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
    3363   { soap->errnum = soap_socket_errno;
    3364     soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_KEEPALIVE failed in soap_bind()", SOAP_TCP_ERROR);
    3365     return -1;
    3366   }
    3367   if (setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
    3368   { soap->errnum = soap_socket_errno;
    3369     soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_SNDBUF failed in soap_bind()", SOAP_TCP_ERROR);
    3370     return -1;
    3371   }
    3372   if (setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
    3373   { soap->errnum = soap_socket_errno;
    3374     soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_RCVBUF failed in soap_bind()", SOAP_TCP_ERROR);
    3375     return -1;
     4323  if (soap->bind_flags && setsockopt(soap->master, SOL_SOCKET, soap->bind_flags, (char*)&set, sizeof(int)))
     4324  { soap->errnum = soap_socket_errno(soap->master);
     4325    soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_bind()", SOAP_TCP_ERROR);
     4326    return SOAP_INVALID_SOCKET;
     4327  }
     4328  if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && setsockopt(soap->master, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
     4329  { soap->errnum = soap_socket_errno(soap->master);
     4330    soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in soap_bind()", SOAP_TCP_ERROR);
     4331    return SOAP_INVALID_SOCKET;
     4332  }
     4333  if (setsockopt(soap->master, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
     4334  { soap->errnum = soap_socket_errno(soap->master);
     4335    soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in soap_bind()", SOAP_TCP_ERROR);
     4336    return SOAP_INVALID_SOCKET;
     4337  }
     4338  if (setsockopt(soap->master, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
     4339  { soap->errnum = soap_socket_errno(soap->master);
     4340    soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in soap_bind()", SOAP_TCP_ERROR);
     4341    return SOAP_INVALID_SOCKET;
    33764342  }
    33774343#ifdef TCP_NODELAY
    3378   if (setsockopt((SOAP_SOCKET)soap->master, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
    3379   { soap->errnum = soap_socket_errno;
    3380     soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt TCP_NODELAY failed in soap_bind()", SOAP_TCP_ERROR);
    3381     return -1;
    3382   }
    3383 #endif
    3384 #endif
    3385 /* WR[ */
     4344  if (!(soap->omode & SOAP_IO_UDP) && setsockopt(soap->master, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
     4345  { soap->errnum = soap_socket_errno(soap->master);
     4346    soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in soap_bind()", SOAP_TCP_ERROR);
     4347    return SOAP_INVALID_SOCKET;
     4348  }
     4349#endif
     4350#endif
    33864351#ifdef WITH_IPV6
    33874352  soap->errmode = 0;
    3388   if (bind(soap->master, resaddr.ai_addr, resaddr.ai_addrlen) || listen(soap->master, backlog))
    3389   {
    3390     soap->errnum = soap_socket_errno;
     4353  if (bind(soap->master, res.ai_addr, (int)res.ai_addrlen))
     4354  { soap->errnum = soap_socket_errno(soap->master);
    33914355    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n"));
    33924356    soap_closesock(soap);
    3393     soap_set_receiver_error(soap, tcp_error(soap), "TCP bind failed in soap_bind()", SOAP_TCP_ERROR);
    3394     return -1;
     4357    soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR);
     4358    return SOAP_INVALID_SOCKET;
    33954359  } 
    3396 #else /* WITH_IPV6 */
    3397 /* ]WR */
    3398   memset((void*)&sockaddr, 0, sizeof(sockaddr));
    3399   sockaddr.sin_family = AF_INET;
     4360#else
     4361  soap->peerlen = sizeof(soap->peer);
     4362  memset((void*)&soap->peer, 0, sizeof(soap->peer));
     4363  soap->peer.sin_family = AF_INET;
    34004364  soap->errmode = 2;
    34014365  if (host)
    3402   { if (soap->fresolve(soap, host, &sockaddr.sin_addr))
    3403     { soap_set_receiver_error(soap, tcp_error(soap), "TCP get host by name failed in soap_bind()", SOAP_TCP_ERROR);
    3404       return -1;
     4366  { if (soap->fresolve(soap, host, &soap->peer.sin_addr))
     4367    { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in soap_bind()", SOAP_TCP_ERROR);
     4368      return SOAP_INVALID_SOCKET;
    34054369    }
    34064370  }
    34074371  else
    3408     sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    3409   sockaddr.sin_port = htons((short)port);
     4372    soap->peer.sin_addr.s_addr = htonl(INADDR_ANY);
     4373  soap->peer.sin_port = htons((short)port);
    34104374  soap->errmode = 0;
    3411   if (bind((SOAP_SOCKET)soap->master, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) || listen((SOAP_SOCKET)soap->master, backlog))
    3412   { soap->errnum = soap_socket_errno;
     4375  if (bind(soap->master, (struct sockaddr*)&soap->peer, (int)soap->peerlen))
     4376  { soap->errnum = soap_socket_errno(soap->master);
    34134377    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n"));
    34144378    soap_closesock(soap);
    3415     soap_set_receiver_error(soap, tcp_error(soap), "TCP bind failed in soap_bind()", SOAP_TCP_ERROR);
    3416     return -1;
     4379    soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR);
     4380    return SOAP_INVALID_SOCKET;
     4381  }
     4382#endif
     4383  if (!(soap->omode & SOAP_IO_UDP) && listen(soap->master, backlog))
     4384  { soap->errnum = soap_socket_errno(soap->master);
     4385    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n"));
     4386    soap_closesock(soap);
     4387    soap_set_receiver_error(soap, tcp_error(soap), "listen failed in soap_bind()", SOAP_TCP_ERROR);
     4388    return SOAP_INVALID_SOCKET;
    34174389  } 
    3418 /* WR[ */
    3419 #endif /* WITH_IPV6 */
    3420 /* ]WR */
    3421 #ifdef WITH_OPENSSL
    3422   if (!soap->ctx && (soap->error = soap->fsslauth(soap)))
    3423     return -1;
    3424 #endif
    34254390  return soap->master;
    34264391}
     
    34294394
    34304395/******************************************************************************/
    3431 #ifndef MAC_CARBON
     4396#ifndef WITH_NOIO
    34324397#ifndef PALM_1
    34334398SOAP_FMAC1
     
    34384403#ifndef WITH_LEAN
    34394404  struct timeval timeout;
    3440   fd_set sfd,rfd;
    3441   int r;
     4405  fd_set rfd, sfd, xfd;
     4406  register int r;
     4407#ifndef WIN32
     4408  if ((int)soap->socket >= (int)FD_SETSIZE)
     4409    return SOAP_FD_EXCEEDED;    /* Hint: MUST increase FD_SETSIZE */
     4410#endif
    34424411  timeout.tv_sec = 0;
    34434412  timeout.tv_usec = 0;
    34444413  FD_ZERO(&rfd);
    34454414  FD_ZERO(&sfd);
    3446   if (soap->socket >= 0)
     4415  FD_ZERO(&xfd);
     4416  if (soap_valid_socket(soap->socket))
    34474417  { FD_SET(soap->socket, &rfd);
    34484418    FD_SET(soap->socket, &sfd);
    3449     r = select(soap->socket + 1, &rfd, &sfd, NULL, &timeout);
    3450   }
    3451   else if (soap->master >= 0)
    3452   { FD_SET(soap->master, &rfd);
    3453     r = select(soap->master + 1, &rfd, &sfd, NULL, &timeout);
     4419    FD_SET(soap->socket, &xfd);
     4420    r = select((int)soap->socket + 1, &rfd, &sfd, &xfd, &timeout);
     4421    if (r > 0 && FD_ISSET(soap->socket, &xfd))
     4422      r = -1;
     4423  }
     4424  else if (soap_valid_socket(soap->master))
     4425  { FD_SET(soap->master, &sfd);
     4426    r = select((int)soap->master + 1, NULL, &sfd, NULL, &timeout);
    34544427  }
    34554428  else
    3456   { FD_SET(soap->sendfd, &sfd);
    3457     FD_SET(soap->recvfd, &rfd);
    3458     r = select((soap->sendfd > soap->recvfd ? soap->sendfd : soap->recvfd) + 1, &rfd, &sfd, NULL, &timeout);
    3459   }
     4429    return SOAP_OK;
    34604430  if (r > 0)
    34614431  {
    34624432#ifdef WITH_OPENSSL
    3463     if (soap->ssl)
    3464     { if ((soap->socket >= 0) && FD_ISSET(soap->socket, &rfd))
    3465       { char buf = '\0';
    3466         if (SSL_peek(soap->ssl, &buf, 1) <= 0)
    3467           return SOAP_EOF;
    3468       }
    3469     }
    3470 #endif   
    3471     return SOAP_OK;
    3472   }
    3473   if (r < 0 && (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) && soap_socket_errno != SOAP_EINTR)
    3474   { soap->errnum = soap_socket_errno;
    3475     soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_poll()", SOAP_TCP_ERROR);
    3476     return soap->error = SOAP_TCP_ERROR;
     4433    if (soap->imode & SOAP_ENC_SSL)
     4434    {
     4435      if (soap_valid_socket(soap->socket)
     4436       && FD_ISSET(soap->socket, &sfd)
     4437       && (!FD_ISSET(soap->socket, &rfd)
     4438        || SSL_peek(soap->ssl, soap->tmpbuf, 1) > 0))
     4439        return SOAP_OK;
     4440    }
     4441    else
     4442#endif
     4443      if (soap_valid_socket(soap->socket)
     4444       && FD_ISSET(soap->socket, &sfd)
     4445       && (!FD_ISSET(soap->socket, &rfd)
     4446        || recv(soap->socket, soap->tmpbuf, 1, MSG_PEEK) > 0))
     4447        return SOAP_OK;
     4448  }
     4449  else if (r < 0)
     4450  { soap->errnum = soap_socket_errno(soap->master);
     4451    if ((soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) && soap_socket_errno(soap->master) != SOAP_EINTR)
     4452    { soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_poll()", SOAP_TCP_ERROR);
     4453      return soap->error = SOAP_TCP_ERROR;
     4454    }
    34774455  }
    34784456  else
    3479     soap->errnum = soap_errno;
     4457    soap->errnum = 0;
     4458  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Polling: other end down on socket=%d select=%d\n", soap->socket, r));
    34804459  return SOAP_EOF;
    34814460#else
     
    34874466
    34884467/******************************************************************************/
    3489 #ifndef MAC_CARBON
    3490 #ifndef PALM_1
    3491 static int
    3492 tcp_accept(struct soap *soap, int s, struct sockaddr *a, int *n)
    3493 { int fd;
    3494 #if defined(SOCKLEN_T)
    3495   fd = (int)accept((SOAP_SOCKET)s, a, (SOCKLEN_T*)n);
    3496 #elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN)
    3497   fd = (int)accept((SOAP_SOCKET)s, a, (socklen_t*)n);
    3498 #elif defined(WIN32) || defined(__APPLE__) || defined(HP_UX) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS)
    3499   fd = (int)accept((SOAP_SOCKET)s, a, n);
    3500 #else
    3501   fd = (int)accept((SOAP_SOCKET)s, a, (size_t*)n);
    3502 #endif
     4468#ifndef WITH_NOIO
     4469#ifndef PALM_1
     4470static SOAP_SOCKET
     4471tcp_accept(struct soap *soap, SOAP_SOCKET s, struct sockaddr *a, int *n)
     4472{ SOAP_SOCKET fd;
     4473  fd = accept(s, a, (SOAP_SOCKLEN_T*)n);        /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */
    35034474#ifdef SOCKET_CLOSE_ON_EXEC
    35044475#ifdef WIN32
     
    35164487
    35174488/******************************************************************************/
    3518 #ifndef MAC_CARBON
    3519 #ifndef PALM_1
    3520 SOAP_FMAC1
    3521 int
     4489#ifndef WITH_NOIO
     4490#ifndef PALM_1
     4491SOAP_FMAC1
     4492SOAP_SOCKET
    35224493SOAP_FMAC2
    35234494soap_accept(struct soap *soap)
    3524 {
    3525 /* WR[ */
    3526 #ifdef WITH_IPV6
    3527   struct sockaddr_storage sockaddr;
    3528 #else /* WITH_IPV6 */
    3529 /* ]WR */
    3530   struct sockaddr_in sockaddr;
    3531 /* WR[ */
    3532 #endif
    3533 /* ]WR */
    3534   int n = (int)sizeof(sockaddr);
     4495{ int n = (int)sizeof(soap->peer);
    35354496#ifndef WITH_LEAN
    35364497  int len = SOAP_BUFLEN;
     
    35384499#endif
    35394500  soap->error = SOAP_OK;
    3540   memset((void*)&sockaddr, 0, sizeof(sockaddr));
     4501#ifndef WITH_LEAN
     4502  if ((soap->omode & SOAP_IO_UDP))
     4503    return soap->socket = soap->master;
     4504#endif
     4505  memset((void*)&soap->peer, 0, sizeof(soap->peer));
    35414506  soap->socket = SOAP_INVALID_SOCKET;
    35424507  soap->errmode = 0;
     4508  soap->keep_alive = 0;
    35434509  if (soap_valid_socket(soap->master))
    3544   { for (;;)
     4510  { register int err;
     4511    for (;;)
    35454512    {
    35464513#ifndef WITH_LEAN
    3547       if (soap->accept_timeout)
    3548       { struct timeval timeout;
    3549         fd_set fd;
    3550         if (soap->accept_timeout > 0)
    3551         { timeout.tv_sec = soap->accept_timeout;
    3552           timeout.tv_usec = 0;
     4514      if (soap->accept_timeout || soap->send_timeout || soap->recv_timeout)
     4515      {
     4516#ifndef WIN32
     4517        if ((int)soap->socket >= (int)FD_SETSIZE)
     4518        { soap->error = SOAP_FD_EXCEEDED;
     4519          return SOAP_INVALID_SOCKET;   /* Hint: MUST increase FD_SETSIZE */
    35534520        }
    3554         else
    3555         { timeout.tv_sec = -soap->accept_timeout/1000000;
    3556           timeout.tv_usec = -soap->accept_timeout%1000000;
    3557         }
    3558         FD_ZERO(&fd);
    3559         FD_SET((SOAP_SOCKET)soap->master, &fd);
     4521#endif
    35604522        for (;;)
    3561         { int r = select((SOAP_SOCKET)(soap->master + 1), &fd, &fd, NULL, &timeout);
     4523        { struct timeval timeout;
     4524          fd_set fd;
     4525          register int r;
     4526          if (soap->accept_timeout > 0)
     4527          { timeout.tv_sec = soap->accept_timeout;
     4528            timeout.tv_usec = 0;
     4529          }
     4530          else if (soap->accept_timeout < 0)
     4531          { timeout.tv_sec = -soap->accept_timeout/1000000;
     4532            timeout.tv_usec = -soap->accept_timeout%1000000;
     4533          }
     4534          else
     4535          { timeout.tv_sec = 60;
     4536            timeout.tv_usec = 0;
     4537          }
     4538          FD_ZERO(&fd);
     4539          FD_SET(soap->master, &fd);
     4540          r = select((int)soap->master + 1, &fd, &fd, &fd, &timeout);
    35624541          if (r > 0)
    35634542            break;
    3564           if (!r)
     4543          if (!r && soap->accept_timeout)
    35654544          { soap->errnum = 0;
    3566             soap_set_receiver_error(soap, "Timeout", "TCP accept failed in soap_accept()", SOAP_TCP_ERROR);
    3567             return -1;
     4545            soap_set_receiver_error(soap, "Timeout", "accept failed in soap_accept()", SOAP_TCP_ERROR);
     4546            return SOAP_INVALID_SOCKET;
    35684547          }
    3569           if (soap_socket_errno != SOAP_EINTR)
    3570           { soap->errnum = soap_socket_errno;
    3571             soap_closesock(soap);
    3572             soap_set_sender_error(soap, tcp_error(soap), "TCP accept failed in soap_accept()", SOAP_TCP_ERROR);
    3573             return -1;
    3574           }
     4548          if (r < 0)
     4549          { r = soap_socket_errno(soap->master);
     4550            if (r != SOAP_EINTR)
     4551            { soap->errnum = r;
     4552              soap_closesock(soap);
     4553              soap_set_sender_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR);
     4554              return SOAP_INVALID_SOCKET;
     4555            }
     4556          }
    35754557        }
    3576 #if defined(WIN32)
    3577         { u_long nonblocking = 1;
    3578           ioctlsocket((SOAP_SOCKET)soap->master, FIONBIO, &nonblocking);
    3579         }
    3580 #elif defined(VXWORKS)
    3581         { vx_nonblocking = TRUE;
    3582           ioctl((SOAP_SOCKET)soap->master, FIONBIO, (int)(&vx_nonblocking));
    3583         }
    3584 #else
    3585         fcntl((SOAP_SOCKET)soap->master, F_SETFL, fcntl((SOAP_SOCKET)soap->master, F_GETFL)|O_NONBLOCK);
    3586 #endif
    3587       }
     4558      }
     4559      if (soap->accept_timeout || soap->send_timeout || soap->recv_timeout)
     4560        SOAP_SOCKNONBLOCK(soap->master)
    35884561      else
    3589 #if defined(WIN32)
    3590       { u_long blocking = 0;
    3591         ioctlsocket((SOAP_SOCKET)soap->master, FIONBIO, &blocking);
    3592       }
    3593 /* WR[ */
    3594 #elif defined(VXWORKS)
    3595       { vx_nonblocking = FALSE;
    3596         ioctl((SOAP_SOCKET)soap->master, FIONBIO, (int)(&vx_nonblocking));
    3597       }
    3598 /* ]WR */
    3599 #else
    3600         fcntl((SOAP_SOCKET)soap->master, F_SETFL, fcntl((SOAP_SOCKET)soap->master, F_GETFL)&~O_NONBLOCK);
    3601 #endif
    3602 #endif
    3603       if ((soap->socket = soap->faccept(soap, soap->master, (struct sockaddr*)&sockaddr, &n)) >= 0)
     4562        SOAP_SOCKBLOCK(soap->master)
     4563#endif
     4564      soap->socket = soap->faccept(soap, soap->master, (struct sockaddr*)&soap->peer, &n);
     4565      soap->peerlen = (size_t)n;
     4566      if (soap_valid_socket(soap->socket))
    36044567      {
    3605 /* WR[ */
    36064568#ifdef WITH_IPV6
    36074569/* Use soap->host to store the numeric form of the remote host */
    3608         getnameinfo((struct sockaddr*)&sockaddr, n, soap->host, sizeof(soap->host), NULL, 0, NI_NUMERICHOST | NI_NUMERICSERV);
     4570        getnameinfo((struct sockaddr*)&soap->peer, n, soap->host, sizeof(soap->host), NULL, 0, NI_NUMERICHOST | NI_NUMERICSERV);
    36094571        DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Accept socket %d from %s\n", soap->socket, soap->host));
    3610         soap->ip = 0; /* info stored in soap->host */
    3611         soap->port = 0; /* info stored in soap->host */
    3612 #else /* WITH_IPV6 */
    3613 /* ]WR */
    3614         soap->ip = ntohl(sockaddr.sin_addr.s_addr);
    3615         soap->port = (int)ntohs(sockaddr.sin_port); /* does not return port number on some systems */
     4572        soap->ip = 0; /* info stored in soap->peer and soap->host */
     4573        soap->port = 0; /* info stored in soap->peer and soap->host */
     4574#else
     4575        soap->ip = ntohl(soap->peer.sin_addr.s_addr);
     4576        soap->port = (int)ntohs(soap->peer.sin_port); /* does not return port number on some systems */
    36164577        DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Accept socket %d at port %d from IP %d.%d.%d.%d\n", soap->socket, soap->port, (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF));
    3617 /* WR[ */
    3618 #endif /* WITH_IPV6 */
    3619 /* ]WR */
    3620         soap->keep_alive = ((soap->imode & SOAP_IO_KEEPALIVE) != 0);
     4578#endif
    36214579#ifndef WITH_LEAN
    3622         if (soap->accept_flags & SO_LINGER)
     4580        if (soap->accept_flags == SO_LINGER)
    36234581        { struct linger linger;
    36244582          memset((void*)&linger, 0, sizeof(linger));
    36254583          linger.l_onoff = 1;
    3626           linger.l_linger = 0;
    3627           if (setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger)))
    3628           { soap->errnum = soap_socket_errno;
    3629             soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_LINGER failed in soap_accept()", SOAP_TCP_ERROR);
    3630             return -1;
    3631           }
     4584          linger.l_linger = soap->linger_time;
     4585          if (setsockopt(soap->socket, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger)))
     4586          { soap->errnum = soap_socket_errno(soap->socket);
     4587            soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in soap_accept()", SOAP_TCP_ERROR);
     4588            soap_closesock(soap);
     4589            return SOAP_INVALID_SOCKET;
     4590          }
    36324591        }
    3633         if ((soap->accept_flags & ~SO_LINGER) && setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, soap->accept_flags & ~SO_LINGER, (char*)&set, sizeof(int)))
    3634         { soap->errnum = soap_socket_errno;
    3635           soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt failed in soap_accept()", SOAP_TCP_ERROR);
    3636           return -1;
     4592        else if (soap->accept_flags && setsockopt(soap->socket, SOL_SOCKET, soap->accept_flags, (char*)&set, sizeof(int)))
     4593        { soap->errnum = soap_socket_errno(soap->socket);
     4594          soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_accept()", SOAP_TCP_ERROR);
     4595          soap_closesock(soap);
     4596          return SOAP_INVALID_SOCKET;
    36374597        }
    3638         if (soap->keep_alive && setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
    3639         { soap->errnum = soap_socket_errno;
    3640           soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_KEEPALIVE failed in soap_accept()", SOAP_TCP_ERROR);
    3641           return -1;
     4598        if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && setsockopt(soap->socket, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
     4599        { soap->errnum = soap_socket_errno(soap->socket);
     4600          soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in soap_accept()", SOAP_TCP_ERROR);
     4601          soap_closesock(soap);
     4602          return SOAP_INVALID_SOCKET;
    36424603        }
    3643         if (setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
    3644         { soap->errnum = soap_socket_errno;
    3645           soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_SNDBUF failed in soap_accept()", SOAP_TCP_ERROR);
    3646           return -1;
     4604        if (setsockopt(soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
     4605        { soap->errnum = soap_socket_errno(soap->socket);
     4606          soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in soap_accept()", SOAP_TCP_ERROR);
     4607          soap_closesock(soap);
     4608          return SOAP_INVALID_SOCKET;
    36474609        }
    3648         if (setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
    3649         { soap->errnum = soap_socket_errno;
    3650           soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_RCVBUF failed in soap_accept()", SOAP_TCP_ERROR);
    3651           return -1;
     4610        if (setsockopt(soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
     4611        { soap->errnum = soap_socket_errno(soap->socket);
     4612          soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in soap_accept()", SOAP_TCP_ERROR);
     4613          soap_closesock(soap);
     4614          return SOAP_INVALID_SOCKET;
    36524615        }
    36534616#ifdef TCP_NODELAY
    3654         if (setsockopt((SOAP_SOCKET)soap->socket, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
    3655         { soap->errnum = soap_socket_errno;
    3656           soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt TCP_NODELAY failed in soap_accept()", SOAP_TCP_ERROR);
    3657           return -1;
     4617        if (!(soap->omode & SOAP_IO_UDP) && setsockopt(soap->socket, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
     4618        { soap->errnum = soap_socket_errno(soap->socket);
     4619          soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in soap_accept()", SOAP_TCP_ERROR);
     4620          soap_closesock(soap);
     4621          return SOAP_INVALID_SOCKET;
    36584622        }
    36594623#endif
    36604624#endif
    3661         if (soap->accept_timeout)
    3662         {
    3663 #if defined(WIN32)
    3664           u_long blocking = 0;
    3665           ioctlsocket((SOAP_SOCKET)soap->master, FIONBIO, &blocking);
    3666           ioctlsocket((SOAP_SOCKET)soap->socket, FIONBIO, &blocking);
    3667 /* WR[ */
    3668 #elif defined(VXWORKS)
    3669           vx_nonblocking = FALSE;
    3670           ioctl((SOAP_SOCKET)soap->master, FIONBIO, (int)(&vx_nonblocking));
    3671           ioctl((SOAP_SOCKET)soap->socket, FIONBIO, (int)(&vx_nonblocking));
    3672 /* ]WR */
    3673 #elif defined(PALM)
    3674           fcntl((SOAP_SOCKET)soap->master, F_SETFL, fcntl((SOAP_SOCKET)soap->master, F_GETFL,0)&~O_NONBLOCK);
    3675           fcntl((SOAP_SOCKET)soap->socket, F_SETFL, fcntl((SOAP_SOCKET)soap->socket, F_GETFL,0)&~O_NONBLOCK);
    3676 #elif defined(SYMBIAN)
    3677           long blocking = 0;
    3678           ioctl((SOAP_SOCKET)soap->master, 0/*FIONBIO*/, &blocking);
    3679 #else
    3680           fcntl((SOAP_SOCKET)soap->master, F_SETFL, fcntl((SOAP_SOCKET)soap->master, F_GETFL)&~O_NONBLOCK);
    3681           fcntl((SOAP_SOCKET)soap->socket, F_SETFL, fcntl((SOAP_SOCKET)soap->socket, F_GETFL)&~O_NONBLOCK);
    3682 #endif
    3683         }
     4625        soap->keep_alive = (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0);
    36844626        return soap->socket;
    36854627      }
    3686       if (soap_socket_errno != SOAP_EINTR && soap_socket_errno != SOAP_EAGAIN)
    3687       { soap->errnum = soap_socket_errno;
    3688         soap_set_receiver_error(soap, tcp_error(soap), "TCP accept failed in soap_accept()", SOAP_TCP_ERROR);
    3689         return -1;
     4628      err = soap_socket_errno(soap->socket);
     4629      if (err != 0 && err != SOAP_EINTR && err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK)
     4630      { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Accept failed from %s\n", soap->host));
     4631        soap->errnum = err;
     4632        soap_set_receiver_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR);
     4633        soap_closesock(soap);
     4634        return SOAP_INVALID_SOCKET;
    36904635      }
    36914636    }
    36924637  }
    36934638  else
    3694   { soap_set_receiver_error(soap, tcp_error(soap), "TCP no master socket in soap_accept()", SOAP_TCP_ERROR);
    3695     return -1;
    3696   }
    3697 }
    3698 #endif
    3699 #endif
    3700 
    3701 /******************************************************************************/
    3702 #ifndef MAC_CARBON
     4639  { soap->errnum = 0;
     4640    soap_set_receiver_error(soap, tcp_error(soap), "no master socket in soap_accept()", SOAP_TCP_ERROR);
     4641    return SOAP_INVALID_SOCKET;
     4642  }
     4643}
     4644#endif
     4645#endif
     4646
     4647/******************************************************************************/
     4648#ifndef WITH_NOIO
    37034649#ifndef PALM_1
    37044650static int
     
    37094655  { int r, s = 0;
    37104656    if (soap->session)
    3711       SSL_SESSION_free(soap->session);
     4657    { SSL_SESSION_free(soap->session);
     4658      soap->session = NULL;
     4659    }
    37124660    if (*soap->host)
    37134661    { soap->session = SSL_get1_session(soap->ssl);
     
    37184666    }
    37194667    r = SSL_shutdown(soap->ssl);
     4668    if (r == 0)
     4669    { if (soap_valid_socket(soap->socket))
     4670      { struct timeval timeout;
     4671        fd_set fd;
     4672        if (soap->fshutdownsocket(soap, soap->socket, 1))
     4673        { /*
     4674          wait up to 10 seconds for close_notify to be sent by peer (if peer not
     4675          present, this avoids calling SSL_shutdown() which has a lengthy return
     4676          timeout)
     4677          */
     4678#ifndef WIN32
     4679          if ((int)soap->socket < (int)FD_SETSIZE)
     4680          {
     4681#endif
     4682            timeout.tv_sec = 10;
     4683            timeout.tv_usec = 0;
     4684            FD_ZERO(&fd);
     4685            FD_SET(soap->socket, &fd);
     4686            r = select((int)soap->socket + 1, &fd, NULL, &fd, &timeout);
     4687            if (r <= 0 && soap_socket_errno(soap->socket) != SOAP_EINTR)
     4688            { soap->errnum = 0;
     4689              DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection lost...\n"));
     4690              soap->fclosesocket(soap, soap->socket);
     4691              soap->socket = SOAP_INVALID_SOCKET;
     4692              ERR_remove_state(0);
     4693              return SOAP_OK;
     4694            }
     4695#ifndef WIN32
     4696          }
     4697#endif
     4698        }
     4699      }
     4700      r = SSL_shutdown(soap->ssl);
     4701    }
    37204702    if (r != 1)
    37214703    { s = ERR_get_error();
    37224704      if (s)
    3723       { if (soap_valid_socket(soap->socket))
    3724         { soap->fshutdownsocket(soap, (SOAP_SOCKET)soap->socket, 1);
     4705      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown failed: %d\n", SSL_get_error(soap->ssl, r)));
     4706        if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP))
     4707        { soap->fclosesocket(soap, soap->socket);
    37254708          soap->socket = SOAP_INVALID_SOCKET;
    37264709        }
    3727         r = SSL_shutdown(soap->ssl);
    3728       }
    3729     }
    3730     DBGLOG(TEST, if (s) SOAP_MESSAGE(fdebug, "Shutdown failed: %d\n", SSL_get_error(soap->ssl, r)));
     4710      }
     4711    }
    37314712    SSL_free(soap->ssl);
    37324713    soap->ssl = NULL;
     
    37364717  }
    37374718#endif
    3738   if (soap_valid_socket(soap->socket))
    3739   { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Closing socket %d\n", soap->socket));
    3740     soap->fshutdownsocket(soap, (SOAP_SOCKET)soap->socket, 2);
    3741     soap->fclosesocket(soap, (SOAP_SOCKET)soap->socket);
     4719  if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP))
     4720  { soap->fshutdownsocket(soap, soap->socket, 2);
     4721    soap->fclosesocket(soap, soap->socket);
    37424722    soap->socket = SOAP_INVALID_SOCKET;
    37434723  }
     
    37484728
    37494729/******************************************************************************/
    3750 #ifndef MAC_CARBON
     4730#ifndef WITH_NOIO
    37514731#ifndef PALM_1
    37524732static int
    37534733tcp_closesocket(struct soap *soap, SOAP_SOCKET fd)
    3754 { return closesocket(fd);
    3755 }
    3756 #endif
    3757 #endif
    3758 
    3759 /******************************************************************************/
    3760 #ifndef MAC_CARBON
     4734{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Close socket %d\n", (int)fd));
     4735  return soap_closesocket(fd);
     4736}
     4737#endif
     4738#endif
     4739
     4740/******************************************************************************/
     4741#ifndef WITH_NOIO
    37614742#ifndef PALM_1
    37624743static int
    37634744tcp_shutdownsocket(struct soap *soap, SOAP_SOCKET fd, int how)
    3764 { return shutdown(fd, how);
     4745{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown socket %d how=%d\n", (int)fd, how));
     4746  return shutdown(fd, how);
    37654747}
    37664748#endif
     
    37744756soap_closesock(struct soap *soap)
    37754757{ register int status = soap->error;
    3776 #ifndef MAC_CARBON
    37774758  if (status == SOAP_EOF || status == SOAP_TCP_ERROR || status == SOAP_SSL_ERROR || !soap->keep_alive)
    3778   { if ((soap->error = soap->fclose(soap)))
     4759  { if (soap->fclose && (soap->error = soap->fclose(soap)))
    37794760      return soap->error;
    3780     soap->socket = SOAP_INVALID_SOCKET;
    3781   }
    3782 #endif
     4761    soap->keep_alive = 0;
     4762  }
    37834763#ifdef WITH_ZLIB
    37844764  if (soap->zlib_state == SOAP_ZLIB_DEFLATE)
    3785     deflateEnd(&soap->d_stream);
     4765    deflateEnd(soap->d_stream);
    37864766  else if (soap->zlib_state == SOAP_ZLIB_INFLATE)
    3787     inflateEnd(&soap->d_stream);
     4767    inflateEnd(soap->d_stream);
    37884768  soap->zlib_state = SOAP_ZLIB_NONE;
    37894769#endif
     
    37934773
    37944774/******************************************************************************/
     4775#ifndef WITH_NOIDREF
    37954776#ifndef PALM_2
    37964777SOAP_FMAC1
     
    38044785}
    38054786#endif
    3806 
    3807 /******************************************************************************/
     4787#endif
     4788
     4789/******************************************************************************/
     4790#ifndef WITH_NOIDREF
    38084791#ifndef PALM_1
    38094792static void
     
    38114794{ register int i;
    38124795  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing pointer hashtable\n"));
     4796  soap->pblk = NULL;
     4797  soap->pidx = 0;
    38134798  for (i = 0; i < (int)SOAP_PTRHASH; i++)
    38144799    soap->pht[i] = NULL;
    38154800}
    38164801#endif
     4802#endif
    38174803
    38184804/******************************************************************************/
     
    38214807struct soap*
    38224808SOAP_FMAC2
     4809soap_new1(soap_mode mode)
     4810{ return soap_new2(mode, mode);
     4811}
     4812#endif
     4813
     4814/******************************************************************************/
     4815#ifndef PALM_1
     4816SOAP_FMAC1
     4817struct soap*
     4818SOAP_FMAC2
    38234819soap_new()
    3824 { struct soap *soap = (struct soap*)SOAP_MALLOC(sizeof(struct soap));
    3825   if (soap)
    3826     soap_init(soap);
    3827   return soap;
     4820{ return soap_new2(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);
    38284821}
    38294822#endif
     
    38344827struct soap*
    38354828SOAP_FMAC2
    3836 soap_new1(int mode)
    3837 { return soap_new2(mode, mode);
    3838 }
    3839 #endif
    3840 
    3841 /******************************************************************************/
    3842 #ifndef PALM_1
    3843 SOAP_FMAC1
    3844 struct soap*
    3845 SOAP_FMAC2
    3846 soap_new2(int imode, int omode)
    3847 { struct soap *soap = (struct soap*)SOAP_MALLOC(sizeof(struct soap));
     4829soap_new2(soap_mode imode, soap_mode omode)
     4830{ struct soap *soap = (struct soap*)malloc(sizeof(struct soap));
    38484831  if (soap)
    38494832    soap_init2(soap, imode, omode);
     
    38544837/******************************************************************************/
    38554838#ifndef PALM_1
     4839SOAP_FMAC1
     4840void
     4841SOAP_FMAC2
     4842soap_free(struct soap *soap)
     4843{ soap_done(soap);
     4844  free(soap);
     4845}
     4846#endif
     4847
     4848/******************************************************************************/
     4849#ifndef PALM_1
     4850SOAP_FMAC1
     4851void
     4852SOAP_FMAC2
     4853soap_del(struct soap *soap)
     4854{ free(soap);
     4855}
     4856#endif
     4857
     4858/******************************************************************************/
     4859#ifndef WITH_NOIDREF
     4860#ifndef PALM_1
    38564861static void
    38574862soap_free_pht(struct soap *soap)
    3858 { register struct soap_plist *pp, *next;
     4863{ register struct soap_pblk *pb, *next;
    38594864  register int i;
    38604865  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free pointer hashtable\n"));
     4866  for (pb = soap->pblk; pb; pb = next)
     4867  { next = pb->next;
     4868    SOAP_FREE(soap, pb);
     4869  }
     4870  soap->pblk = NULL;
     4871  soap->pidx = 0;
    38614872  for (i = 0; i < (int)SOAP_PTRHASH; i++)
    3862   { for (pp = soap->pht[i]; pp; pp = next)
    3863     { next = pp->next;
    3864       SOAP_FREE(pp);
    3865     }
    38664873    soap->pht[i] = NULL;
    3867   }
    3868 }
    3869 #endif
    3870 
    3871 /******************************************************************************/
     4874}
     4875#endif
     4876#endif
     4877
     4878/******************************************************************************/
     4879#ifndef WITH_NOIDREF
    38724880#ifndef PALM_2
    38734881SOAP_FMAC1
     
    38924900}
    38934901#endif
    3894 
    3895 /******************************************************************************/
     4902#endif
     4903
     4904/******************************************************************************/
     4905#ifndef WITH_NOIDREF
    38964906#ifndef PALM_2
    38974907SOAP_FMAC1
     
    39024912  *ppp = NULL;
    39034913  if (p)
    3904     for (pp = soap->pht[soap_hash_ptr(p)]; pp; pp = pp->next)
    3905       if (pp->ptr == p && pp->type == type)
     4914  { for (pp = soap->pht[soap_hash_ptr(p)]; pp; pp = pp->next)
     4915    { if (pp->ptr == p && pp->type == type)
    39064916      { *ppp = pp;
    39074917        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d id=%d\n", p, type, pp->id));
    39084918        return pp->id;
    39094919      }
     4920    }
     4921  }
    39104922  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d: not found\n", p, type));
    39114923  return 0;
    39124924}
    39134925#endif
    3914 
    3915 /******************************************************************************/
     4926#endif
     4927
     4928/******************************************************************************/
     4929#ifndef WITH_NOIDREF
    39164930#ifndef PALM_2
    39174931SOAP_FMAC1
     
    39194933SOAP_FMAC2
    39204934soap_pointer_enter(struct soap *soap, const void *p, const struct soap_array *a, int n, int type, struct soap_plist **ppp)
    3921 { register int h;
    3922   register struct soap_plist *pp = *ppp = (struct soap_plist*)SOAP_MALLOC(sizeof(struct soap_plist));
    3923   if (!pp)
    3924     return 0;
     4935{ register size_t h;
     4936  register struct soap_plist *pp;
     4937  if (!soap->pblk || soap->pidx >= SOAP_PTRBLK)
     4938  { register struct soap_pblk *pb = (struct soap_pblk*)SOAP_MALLOC(soap, sizeof(struct soap_pblk));
     4939    if (!pb)
     4940    { soap->error = SOAP_EOM;
     4941      return 0;
     4942    }
     4943    pb->next = soap->pblk;
     4944    soap->pblk = pb;
     4945    soap->pidx = 0;
     4946  }
     4947  *ppp = pp = &soap->pblk->plist[soap->pidx++];
    39254948  if (a)
    39264949    h = soap_hash_ptr(a->__ptr);
    39274950  else
    39284951    h = soap_hash_ptr(p);
    3929   DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pointer enter location=%p array=%p size=%d dim=%d type=%d id=%lu\n", p, a?a->__ptr:NULL, a?a->__size:0, n, type, soap->idnum+1));
     4952  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pointer enter location=%p array=%p size=%d dim=%d type=%d id=%d\n", p, a?a->__ptr:NULL, a?a->__size:0, n, type, soap->idnum+1));
    39304953  pp->next = soap->pht[h];
    39314954  pp->type = type;
     
    39394962}
    39404963#endif
    3941 
    3942 /******************************************************************************/
     4964#endif
     4965
     4966/******************************************************************************/
     4967#ifndef WITH_NOIDREF
    39434968#ifndef PALM_2
    39444969SOAP_FMAC1
     
    39554980      for (i = 0; i < n; i++)
    39564981        if (((const int*)&pp->array->__size)[i] != ((const int*)&a->__size)[i])
    3957           break;
     4982          break;
    39584983      if (i == n)
    39594984      { *ppp = pp;
     
    39674992}
    39684993#endif
    3969 
    3970 /******************************************************************************/
    3971 #ifndef PALM_1
    3972 SOAP_FMAC1
    3973 void
     4994#endif
     4995
     4996/******************************************************************************/
     4997#ifndef PALM_1
     4998SOAP_FMAC1
     4999int
    39745000SOAP_FMAC2
    39755001soap_begin_count(struct soap *soap)
    3976 { soap_clr_attr(soap);
    3977   soap_set_local_namespaces(soap);
     5002{
    39785003#ifndef WITH_LEANER
    39795004  if ((soap->mode & SOAP_ENC_DIME) || (soap->omode & SOAP_ENC_DIME))
     
    39835008  { soap->mode = soap->omode;
    39845009    if ((soap->mode & SOAP_IO) == SOAP_IO_STORE
    3985      || (((soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_ENC_XML)) && !soap->fpreparesend))
     5010     || (((soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_ENC_XML))
     5011#ifndef WITH_LEANER
     5012      && !soap->fpreparesend
     5013#endif
     5014      ))
    39865015      soap->mode &= ~SOAP_IO_LENGTH;
    39875016    else
    39885017      soap->mode |= SOAP_IO_LENGTH;
    39895018  }
     5019#ifdef WITH_ZLIB
    39905020  if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH)
    39915021  { if (!(soap->mode & SOAP_ENC_DIME))
     
    39965026      soap->mode |= SOAP_IO_STORE;
    39975027  }
     5028#endif
    39985029  if (!soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH))
    39995030    soap->mode |= SOAP_XML_TREE;
    40005031#ifndef WITH_LEANER
     5032  if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME))
     5033    soap->mode |= SOAP_ENC_MIME;
     5034  else
     5035    soap->mode &= ~SOAP_ENC_MTOM;
    40015036  if (soap->mode & SOAP_ENC_MIME)
    40025037    soap_select_mime_boundary(soap);
     
    40115046  soap->part = SOAP_BEGIN;
    40125047  soap->idnum = 0;
     5048  soap_clr_attr(soap);
     5049  soap_set_local_namespaces(soap);
     5050  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin count phase (socket=%d mode=0x%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count));
     5051#ifndef WITH_LEANER
    40135052  soap->dime.count = 0; /* count # of attachments */
    40145053  soap->dime.size = 0; /* accumulate total size of attachments */
    4015   DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin count phase (socket=%d mode=%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count));
    40165054  if (soap->fprepareinit && (soap->mode & SOAP_IO) != SOAP_IO_STORE)
    4017     soap->fprepareinit(soap);   
     5055    return soap->error = soap->fprepareinit(soap);   
     5056#endif
     5057  return SOAP_OK;
    40185058}
    40195059#endif
     
    40245064int
    40255065SOAP_FMAC2
     5066soap_end_count(struct soap *soap)
     5067{
     5068#ifndef WITH_LEANER
     5069  if (soap->fpreparefinal)
     5070    return soap->error = soap->fpreparefinal(soap);
     5071#endif
     5072  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of count phase\n"));
     5073  return SOAP_OK;
     5074}
     5075#endif
     5076
     5077/******************************************************************************/
     5078#ifndef PALM_1
     5079SOAP_FMAC1
     5080int
     5081SOAP_FMAC2
    40265082soap_begin_send(struct soap *soap)
    4027 { soap->error = SOAP_OK;
    4028   soap_clr_attr(soap);
    4029   soap_set_local_namespaces(soap);
    4030   soap->mode = (soap->omode & ~SOAP_IO_LENGTH) | (soap->mode & SOAP_ENC_DIME);
     5083{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for output\n"));
     5084  soap->error = SOAP_OK;
     5085  soap->mode = soap->omode | (soap->mode & (SOAP_IO_LENGTH | SOAP_ENC_DIME));
     5086#ifdef WITH_ZLIB
    40315087  if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH)
    40325088  { if (soap->mode & SOAP_ENC_XML)
     
    40355091      soap->mode |= SOAP_IO_STORE;
    40365092  }
     5093#endif
     5094#ifndef WITH_LEAN
     5095  if ((soap->mode & SOAP_IO_UDP))
     5096  { soap->mode |= SOAP_ENC_XML;
     5097    if (soap->count > SOAP_BUFLEN)
     5098      return soap->error = SOAP_UDP_ERROR;
     5099  }
     5100#endif
    40375101  if ((soap->mode & SOAP_IO) == SOAP_IO_FLUSH && soap_valid_socket(soap->socket))
    4038   { if (soap->count || (soap->mode & SOAP_ENC_XML))
     5102  { if (soap->count || (soap->mode & SOAP_IO_LENGTH) || (soap->mode & SOAP_ENC_XML))
    40395103      soap->mode |= SOAP_IO_BUFFER;
    40405104    else
    40415105      soap->mode |= SOAP_IO_STORE;
    40425106  }
     5107  soap->mode &= ~SOAP_IO_LENGTH;
    40435108  if ((soap->mode & SOAP_IO) == SOAP_IO_STORE)
    4044     soap_new_block(soap);
     5109    if (soap_new_block(soap) == NULL)
     5110      return soap->error;
    40455111  if (!(soap->mode & SOAP_IO_KEEPALIVE))
    40465112    soap->keep_alive = 0;
     
    40485114    soap->mode |= SOAP_XML_TREE;
    40495115#ifndef WITH_LEANER
     5116  if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME))
     5117  { soap->mode |= SOAP_ENC_MIME;
     5118    soap->mode &= ~SOAP_ENC_DIME;
     5119  }
     5120  else
     5121    soap->mode &= ~SOAP_ENC_MTOM;
    40505122  if (soap->mode & SOAP_ENC_MIME)
    40515123    soap_select_mime_boundary(soap);
    4052 #endif
    40535124#ifdef WIN32
    40545125#ifndef UNDER_CE
     
    40565127  if (!soap_valid_socket(soap->socket)) /* Set win32 stdout or soap->sendfd to BINARY, e.g. to support DIME */
    40575128#ifdef __BORLANDC__
    4058     setmode((SOAP_SOCKET)soap->sendfd, O_BINARY);
     5129    setmode(soap->sendfd, O_BINARY);
    40595130#else
    4060     _setmode((SOAP_SOCKET)soap->sendfd, _O_BINARY);
     5131    _setmode(soap->sendfd, _O_BINARY);
     5132#endif
    40615133#endif
    40625134#endif
     
    40735145  soap->mustUnderstand = 0;
    40745146  soap->encoding = 0;
    4075   soap->part = SOAP_BEGIN;
    40765147  soap->idnum = 0;
    40775148  soap->level = 0;
     5149  soap_clr_attr(soap);
     5150  soap_set_local_namespaces(soap);
    40785151#ifdef WITH_ZLIB
    40795152  soap->z_ratio_out = 1.0;
    40805153  if ((soap->mode & SOAP_ENC_ZLIB) && soap->zlib_state != SOAP_ZLIB_DEFLATE)
    4081   {
     5154  { if (!soap->z_buf)
     5155      soap->z_buf = (char*)SOAP_MALLOC(soap, SOAP_BUFLEN);
     5156    soap->d_stream->next_out = (Byte*)soap->z_buf;
     5157    soap->d_stream->avail_out = SOAP_BUFLEN;
    40825158#ifdef WITH_GZIP
    4083     memcpy(soap->z_buf, "\37\213\10\0\0\0\0\0\0\377", 10);
    4084     soap->d_stream.next_out = (Byte*)soap->z_buf + 10;
    4085     soap->d_stream.avail_out = SOAP_BUFLEN - 10;
    4086     soap->z_crc = crc32(0L, NULL, 0);
    4087     if (deflateInit2(&soap->d_stream, soap->z_level, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY) != Z_OK)
    4088 #else
    4089     soap->d_stream.next_out = (Byte*)soap->z_buf;
    4090     soap->d_stream.avail_out = SOAP_BUFLEN;
    4091     if (deflateInit(&soap->d_stream, soap->z_level) != Z_OK)
    4092 #endif
     5159    if (soap->zlib_out != SOAP_ZLIB_DEFLATE)
     5160    { memcpy(soap->z_buf, "\37\213\10\0\0\0\0\0\0\377", 10);
     5161      soap->d_stream->next_out = (Byte*)soap->z_buf + 10;
     5162      soap->d_stream->avail_out = SOAP_BUFLEN - 10;
     5163      soap->z_crc = crc32(0L, NULL, 0);
     5164      soap->zlib_out = SOAP_ZLIB_GZIP;
     5165      if (deflateInit2(soap->d_stream, soap->z_level, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY) != Z_OK)
     5166        return soap->error = SOAP_ZLIB_ERROR;
     5167    }
     5168    else
     5169#endif
     5170    if (deflateInit(soap->d_stream, soap->z_level) != Z_OK)
    40935171      return soap->error = SOAP_ZLIB_ERROR;
    40945172    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflate initialized\n"));
     
    40965174  }
    40975175#endif
    4098   DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin send phase (socket=%d mode=%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count));
     5176#ifdef WITH_OPENSSL
     5177  if (soap->ssl)
     5178    ERR_clear_error();
     5179#endif
     5180  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin send phase (socket=%d mode=0x%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count));
     5181  soap->part = SOAP_BEGIN;
     5182#ifndef WITH_LEANER
    40995183  if (soap->fprepareinit && (soap->mode & SOAP_IO) == SOAP_IO_STORE)
    41005184    soap->fprepareinit(soap);   
     5185#endif
    41015186  return SOAP_OK;
    41025187}
     
    41045189
    41055190/******************************************************************************/
     5191#ifndef WITH_NOIDREF
    41065192#ifndef PALM_2
    41075193SOAP_FMAC1
     
    41175203}
    41185204#endif
    4119 
    4120 /******************************************************************************/
     5205#endif
     5206
     5207/******************************************************************************/
     5208#ifndef WITH_NOIDREF
    41215209#ifndef PALM_2
    41225210SOAP_FMAC1
     
    41435231}
    41445232#endif
    4145 
    4146 /******************************************************************************/
     5233#endif
     5234
     5235/******************************************************************************/
     5236#ifndef WITH_NOIDREF
    41475237#ifndef PALM_2
    41485238SOAP_FMAC1
     
    41525242{ register int i;
    41535243  struct soap_plist *pp;
    4154   if (!p)
     5244  if (!p || !a->__ptr)
    41555245    return 1;
    41565246  i = soap_array_pointer_lookup(soap, p, a, n, t, &pp);
     
    41715261}
    41725262#endif
    4173 
    4174 /******************************************************************************/
     5263#endif
     5264
     5265/******************************************************************************/
     5266#ifndef WITH_NOIDREF
    41755267#ifndef PALM_2
    41765268SOAP_FMAC1
     
    41785270SOAP_FMAC2
    41795271soap_embedded_id(struct soap *soap, int id, const void *p, int t)
    4180 { struct soap_plist *pp;
    4181   DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id %p type=%d id=%d\n", p, t, id));
     5272{ struct soap_plist *pp = NULL;
    41825273  if (soap->mode & SOAP_XML_TREE)
    41835274    return id;
     5275  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id %p type=%d id=%d\n", p, t, id));
    41845276  if (soap->version == 1 && soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH) && soap->part != SOAP_IN_HEADER)
    41855277  { if (id < 0)
     
    42105302}
    42115303#endif
    4212 
    4213 /******************************************************************************/
     5304#endif
     5305
     5306/******************************************************************************/
     5307#ifndef WITH_NOIDREF
    42145308#ifndef PALM_2
    42155309SOAP_FMAC1
     
    42305324}
    42315325#endif
    4232 
    4233 /******************************************************************************/
     5326#endif
     5327
     5328/******************************************************************************/
     5329#ifndef WITH_NOIDREF
    42345330#ifndef PALM_2
    42355331SOAP_FMAC1
     
    42465342}
    42475343#endif
    4248 
    4249 /******************************************************************************/
     5344#endif
     5345
     5346/******************************************************************************/
     5347#ifndef WITH_NOIDREF
    42505348#ifndef PALM_2
    42515349SOAP_FMAC1
     
    42615359}
    42625360#endif
     5361#endif
    42635362
    42645363/******************************************************************************/
     
    42685367int
    42695368SOAP_FMAC2
    4270 soap_element_dime(struct soap *soap, const char *tag, int id, const void *p, const struct soap_array *a, const char *aid, const char *atype, const char *aoptions, int n, const char *type, int t)
    4271 { struct soap_plist *pp;
     5369soap_attachment(struct soap *soap, const char *tag, int id, const void *p, const struct soap_array *a, const char *aid, const char *atype, const char *aoptions, int n, const char *type, int t)
     5370{
     5371#ifndef WITH_NOIDREF
     5372  struct soap_plist *pp;
     5373  int i;
    42725374  if (!p || !a->__ptr || (!aid && !atype))
    42735375    return soap_element_id(soap, tag, id, p, a, n, type, t);
    4274   DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attachment tag='%s' id='%s' (%d) type='%s'\n", tag, aid?aid:"", id, atype?atype:""));
    4275   if (id < 0)
    4276     id = soap_array_pointer_lookup(soap, p, a, n, t, &pp);
     5376  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attachment tag='%s' id='%s' (%d) type='%s'\n", tag, aid?aid:SOAP_STR_EOS, id, atype?atype:SOAP_STR_EOS));
     5377  i = soap_array_pointer_lookup(soap, p, a, n, t, &pp);
     5378  if (!i)
     5379  { i = soap_pointer_enter(soap, p, a, n, t, &pp);
     5380    if (!i)
     5381    { soap->error = SOAP_EOM;
     5382      return -1;
     5383    }
     5384  }
     5385  if (id <= 0)
     5386    id = i;
    42775387  if (!aid)
    42785388  { sprintf(soap->tmpbuf, soap->dime_id_format, id);
    42795389    aid = soap_strdup(soap, soap->tmpbuf);
    42805390  }
    4281   if (soap_element_href(soap, tag, 0, "href", aid))
     5391  /* Add MTOM xop:Include element when necessary */
     5392  /* TODO: this code to be obsoleted with new import/xop.h conventions */
     5393  if ((soap->mode & SOAP_ENC_MTOM) && strcmp(tag, "xop:Include"))
     5394  { if (soap_element_begin_out(soap, tag, 0, type)
     5395     || soap_element_href(soap, "xop:Include", 0, "href", aid)
     5396     || soap_element_end_out(soap, tag))
     5397      return soap->error;
     5398  }
     5399  else if (soap_element_href(soap, tag, 0, "href", aid))
    42825400    return soap->error;
    42835401  if (soap->mode & SOAP_IO_LENGTH)
    42845402  { if (pp->mark1 != 3)
    4285     { struct soap_multipart *content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, (char*)a->__ptr, a->__size);
     5403    { struct soap_multipart *content;
     5404      if (soap->mode & SOAP_ENC_MTOM)
     5405        content = soap_new_multipart(soap, &soap->mime.first, &soap->mime.last, (char*)a->__ptr, a->__size);
     5406      else
     5407        content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, (char*)a->__ptr, a->__size);
    42865408      if (!content)
    4287         return soap->error = SOAP_EOM;
    4288       content->id = aid;
     5409      { soap->error = SOAP_EOM;
     5410        return -1;
     5411      }
     5412      if (!strncmp(aid, "cid:", 4)) /* RFC 2111 */
     5413      { if (soap->mode & SOAP_ENC_MTOM)
     5414        { char *s = (char*)soap_malloc(soap, strlen(aid) - 1);
     5415          if (s)
     5416          { *s = '<';
     5417            strcpy(s + 1, aid + 4);
     5418            strcat(s, ">");
     5419            content->id = s;
     5420          }
     5421        }
     5422        else
     5423          content->id = aid + 4;
     5424      }
     5425      else
     5426        content->id = aid;
    42895427      content->type = atype;
    42905428      content->options = aoptions;
     5429      content->encoding = SOAP_MIME_BINARY;
    42915430      pp->mark1 = 3;
    42925431    }
     
    42945433  else
    42955434    pp->mark2 = 3;
    4296   return SOAP_OK;
    4297 }
    4298 #endif
    4299 #endif
    4300 
    4301 /******************************************************************************/
     5435#endif
     5436  return -1;
     5437}
     5438#endif
     5439#endif
     5440
     5441/******************************************************************************/
     5442#ifndef WITH_NOIDREF
    43025443#ifndef PALM_1
    43035444static void
     
    43095450}
    43105451#endif
    4311 
    4312 /******************************************************************************/
     5452#endif
     5453
     5454/******************************************************************************/
     5455#ifndef WITH_NOIDREF
    43135456#ifndef PALM_1
    43145457static void
    43155458soap_free_iht(struct soap *soap)
    43165459{ register int i;
    4317   register struct soap_ilist *ip, *p;
    4318   register struct soap_flist *fp, *fq;
     5460  register struct soap_ilist *ip = NULL, *p = NULL;
     5461  register struct soap_flist *fp = NULL, *fq = NULL;
    43195462  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free ID hashtable\n"));
    43205463  for (i = 0; i < SOAP_IDHASH; i++)
     
    43225465    { for (fp = ip->flist; fp; fp = fq)
    43235466      { fq = fp->next;
    4324         SOAP_FREE(fp);
     5467        SOAP_FREE(soap, fp);
    43255468      }
    43265469      p = ip->next;
    4327       SOAP_FREE(ip);
     5470      SOAP_FREE(soap, ip);
    43285471    }
    43295472    soap->iht[i] = NULL;
     
    43315474}
    43325475#endif
    4333 
    4334 /******************************************************************************/
     5476#endif
     5477
     5478/******************************************************************************/
     5479#ifndef WITH_NOIDREF
    43355480#ifndef PALM_2
    4336 static struct soap_ilist *
    4337 soap_hlookup(struct soap *soap, const char *id)
    4338 { register struct soap_ilist *ip;
     5481SOAP_FMAC1
     5482struct soap_ilist *
     5483SOAP_FMAC2
     5484soap_lookup(struct soap *soap, const char *id)
     5485{ register struct soap_ilist *ip = NULL;
    43395486  for (ip = soap->iht[soap_hash(id)]; ip; ip = ip->next)
    43405487    if (!strcmp(ip->id, id))
     
    43435490}
    43445491#endif
    4345 
    4346 /******************************************************************************/
    4347 #ifndef PALM_2
    4348 SOAP_FMAC1
    4349 struct soap_ilist *
    4350 SOAP_FMAC2
    4351 soap_lookup(struct soap *soap, const char *id)
    4352 { register struct soap_ilist *ip;
    4353   ip = soap_hlookup(soap, id);
    4354 #ifndef WITH_LEANER
    4355   if (!ip && *id != '#' && !strchr(id, ':')) /* try content id "cid:" with DIME attachments */
    4356   { char cid[SOAP_TAGLEN];
    4357     strcpy(cid, "cid:");
    4358     strncat(cid + 4, id, sizeof(cid) - 5);
    4359     cid[sizeof(cid) - 1] = '\0';
    4360     ip = soap_hlookup(soap, cid);
    4361   }
    4362 #endif
    4363   return ip;
    4364 }
    4365 #endif
    4366 
    4367 /******************************************************************************/
     5492#endif
     5493
     5494/******************************************************************************/
     5495#ifndef WITH_NOIDREF
    43685496#ifndef PALM_2
    43695497SOAP_FMAC1
     
    43735501{ register size_t h;
    43745502  register struct soap_ilist *ip;
    4375   ip = (struct soap_ilist*)SOAP_MALLOC(sizeof(struct soap_ilist) + strlen(id));
     5503  ip = (struct soap_ilist*)SOAP_MALLOC(soap, sizeof(struct soap_ilist) + strlen(id));
    43765504  if (ip)
    43775505  { h = soap_hash(id);
     
    43795507    ip->next = soap->iht[h];
    43805508    soap->iht[h] = ip;
    4381     return ip;
    4382   }
    4383   return NULL;
    4384 }
     5509  }
     5510  return ip;
     5511}
     5512#endif
    43855513#endif
    43865514
     
    43935521{ register char *p;
    43945522  if (!n)
    4395     return NULL;
     5523    return (void*)SOAP_NON_NULL;
    43965524  if (!soap)
    4397     return SOAP_MALLOC(n);
    4398   n += (-(long)n) & 7;
    4399   if (!(p = (char*)SOAP_MALLOC(n + sizeof(void*) + sizeof(size_t))))
    4400   { soap->error = SOAP_EOM;
    4401     return NULL;
    4402   }
    4403   /* keep chain of alloced cells for later destruction */
     5525    return SOAP_MALLOC(soap, n);
     5526  if (soap->fmalloc)
     5527    p = (char*)soap->fmalloc(soap, n);
     5528  else
     5529  { n += sizeof(short);
     5530    n += (-(long)n) & (sizeof(void*)-1); /* align at 4-, 8- or 16-byte boundary */
     5531    if (!(p = (char*)SOAP_MALLOC(soap, n + sizeof(void*) + sizeof(size_t))))
     5532    { soap->error = SOAP_EOM;
     5533      return NULL;
     5534    }
     5535    /* set the canary to detect corruption */
     5536    *(short*)(p + n - sizeof(short)) = (short)SOAP_CANARY;
     5537    /* keep chain of alloced cells for destruction */
     5538    *(void**)(p + n) = soap->alist;
     5539    *(size_t*)(p + n + sizeof(void*)) = n;
     5540    soap->alist = p + n;
     5541  }
    44045542  soap->alloced = 1;
    4405   *(void**)(p + n) = soap->alist;
    4406   *(size_t*)(p + n + sizeof(void*)) = n;
    4407   soap->alist = p + n;
    4408   DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Malloc %u bytes at location %p\n", (unsigned int)n, p));
    44095543  return p;
    44105544}
     
    44125546
    44135547/******************************************************************************/
     5548#ifdef SOAP_MEM_DEBUG
     5549static void
     5550soap_init_mht(struct soap *soap)
     5551{ register int i;
     5552  for (i = 0; i < (int)SOAP_PTRHASH; i++)
     5553    soap->mht[i] = NULL;
     5554}
     5555#endif
     5556
     5557/******************************************************************************/
     5558#ifdef SOAP_MEM_DEBUG
     5559static void
     5560soap_free_mht(struct soap *soap)
     5561{ register int i;
     5562  register struct soap_mlist *mp, *mq;
     5563  for (i = 0; i < (int)SOAP_PTRHASH; i++)
     5564  { for (mp = soap->mht[i]; mp; mp = mq)
     5565    { mq = mp->next;
     5566      if (mp->live)
     5567        fprintf(stderr, "%s(%d): malloc() = %p not freed (memory leak or forgot to call soap_end()?)\n", mp->file, mp->line, mp->ptr);
     5568      free(mp);
     5569    }
     5570    soap->mht[i] = NULL;
     5571  }
     5572}
     5573#endif
     5574
     5575/******************************************************************************/
     5576#ifdef SOAP_MEM_DEBUG
     5577SOAP_FMAC1
     5578void*
     5579SOAP_FMAC2
     5580soap_track_malloc(struct soap *soap, const char *file, int line, size_t size)
     5581{ register void *p = malloc(size);
     5582  if (soap)
     5583  { register size_t h = soap_hash_ptr(p);
     5584    register struct soap_mlist *mp = (struct soap_mlist*)malloc(sizeof(struct soap_mlist));
     5585    if (soap->fdebug[SOAP_INDEX_TEST])
     5586    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): malloc(%lu) = %p\n", file, line, (unsigned long)size, p));
     5587    }
     5588    mp->next = soap->mht[h];
     5589    mp->ptr = p;
     5590    mp->file = file;
     5591    mp->line = line;
     5592    mp->live = 1;
     5593    soap->mht[h] = mp;
     5594  }
     5595  return p;
     5596}
     5597#endif
     5598
     5599/******************************************************************************/
     5600#ifdef SOAP_MEM_DEBUG
     5601SOAP_FMAC1
     5602void
     5603SOAP_FMAC2
     5604soap_track_free(struct soap *soap, const char *file, int line, void *p)
     5605{ register size_t h = soap_hash_ptr(p);
     5606  register struct soap_mlist *mp;
     5607  for (mp = soap->mht[h]; mp; mp = mp->next)
     5608    if (mp->ptr == p)
     5609      break;
     5610  if (mp)
     5611  { if (mp->live)
     5612    { free(p);
     5613      if (soap->fdebug[SOAP_INDEX_TEST])
     5614      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): free(%p)\n", file, line, p));
     5615      }
     5616      mp->live = 0;
     5617    }
     5618    else
     5619      fprintf(stderr, "%s(%d): free(%p) double free of pointer malloced at %s(%d)\n", file, line, p, mp->file, mp->line);
     5620  }
     5621  else
     5622    fprintf(stderr, "%s(%d): free(%p) pointer not malloced\n", file, line, p);
     5623}
     5624#endif
     5625
     5626/******************************************************************************/
     5627#ifdef SOAP_MEM_DEBUG
     5628static void
     5629soap_track_unlink(struct soap *soap, const void *p)
     5630{ register size_t h = soap_hash_ptr(p);
     5631  register struct soap_mlist *mp;
     5632  for (mp = soap->mht[h]; mp; mp = mp->next)
     5633    if (mp->ptr == p)
     5634      break;
     5635  if (mp)
     5636    mp->live = 0;
     5637}
     5638#endif
     5639
     5640/******************************************************************************/
    44145641#ifndef PALM_2
    44155642SOAP_FMAC1
     
    44175644SOAP_FMAC2
    44185645soap_dealloc(struct soap *soap, void *p)
    4419 { if (!soap)
     5646{ if (soap_check_state(soap))
    44205647    return;
    44215648  if (p)
    44225649  { register char **q;
    44235650    for (q = (char**)&soap->alist; *q; q = *(char***)q)
    4424     { if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*))))
     5651    {
     5652      if (*(short*)(char*)(*q - sizeof(short)) != (short)SOAP_CANARY)
     5653      {
     5654#ifdef SOAP_MEM_DEBUG
     5655        fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n");
     5656#endif
     5657        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n"));
     5658        DBGHEX(TEST, *q - 200, 200);
     5659        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n"));
     5660        soap->error = SOAP_MOE;
     5661        return;
     5662      }
     5663      if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*))))
    44255664      { *q = **(char***)q;
    44265665        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Freed data at %p\n", p));
    4427         SOAP_FREE(p);
     5666        SOAP_FREE(soap, p);
    44285667        return;
    44295668      }
     
    44335672  else
    44345673  { register char *q;
     5674    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free all soap_malloc() data\n"));
    44355675    while (soap->alist)
    44365676    { q = (char*)soap->alist;
     5677      if (*(short*)(char*)(q - sizeof(short)) != (short)SOAP_CANARY)
     5678      {
     5679#ifdef SOAP_MEM_DEBUG
     5680        fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n");
     5681#endif
     5682        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n"));
     5683        DBGHEX(TEST, q - 200, 200);
     5684        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n"));
     5685        soap->error = SOAP_MOE;
     5686        return;
     5687      }
    44375688      soap->alist = *(void**)q;
    44385689      q -= *(size_t*)(q + sizeof(void*));
    4439       SOAP_FREE(q);
    4440     }
    4441     DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Dealloc all data done\n"));
    4442   }
    4443   /* we must assume these were deallocated: */
    4444   soap->action = NULL;
    4445   soap->fault = NULL;
    4446   soap->header = NULL;
    4447   soap->authrealm = NULL;
     5690      SOAP_FREE(soap, q);
     5691    }
     5692    /* we must assume these were deallocated: */
     5693    soap->action = NULL;
     5694    soap->fault = NULL;
     5695    soap->header = NULL;
     5696    soap->userid = NULL;
     5697    soap->passwd = NULL;
     5698    soap->authrealm = NULL;
     5699    soap->http_content = NULL;
    44485700#ifndef WITH_LEANER
    4449   soap_clr_mime(soap);
    4450 #endif
     5701    soap_clr_mime(soap);
     5702#endif
     5703  }
    44515704}
    44525705#endif
     
    44585711SOAP_FMAC2
    44595712soap_delete(struct soap *soap, void *p)
    4460 { register struct soap_clist **cp = &soap->clist;
     5713{ register struct soap_clist **cp;
     5714  if (soap_check_state(soap))
     5715    return;
     5716  cp = &soap->clist;
    44615717  if (p)
    44625718  { while (*cp)
     
    44645720      { register struct soap_clist *q = *cp;
    44655721        *cp = q->next;
    4466         q->fdelete(q);
    4467         SOAP_FREE(q);
     5722        if (q->fdelete(q))
     5723        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: deletion callback failed for object type %d\n", q->ptr, q->type));
     5724#ifdef SOAP_MEM_DEBUG
     5725          fprintf(stderr, "new(object type = %d) = %p not freed: deletion callback failed\n", q->type, q->ptr);
     5726#endif
     5727        }
     5728        SOAP_FREE(soap, q);
    44685729        return;
    44695730      }
     
    44765737    { register struct soap_clist *q = *cp;
    44775738      *cp = q->next;
    4478       if (q->ptr == (void*)soap->fault)
    4479         soap->fault = NULL; /* this was deallocated */
    4480       else if (q->ptr == (void*)soap->header)
    4481         soap->header = NULL; /* this was deallocated */
    4482       q->fdelete(q);
    4483       SOAP_FREE(q);
    4484     }
    4485   }
     5739      if (q->fdelete(q))
     5740      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: deletion callback failed for object type %d\n", q->ptr, q->type));
     5741#ifdef SOAP_MEM_DEBUG
     5742        fprintf(stderr, "new(object type = %d) = %p not freed: deletion callback failed\n", q->type, q->ptr);
     5743#endif
     5744      }
     5745      SOAP_FREE(soap, q);
     5746    }
     5747  }
     5748  soap->fault = NULL; /* this was possibly deallocated */
     5749  soap->header = NULL; /* this was possibly deallocated */
    44865750}
    44875751#endif
     
    44925756struct soap_clist *
    44935757SOAP_FMAC2
    4494 soap_link(struct soap *soap, void *p, int t, int n, void (*fdelete)(struct soap_clist*))
     5758soap_link(struct soap *soap, void *p, int t, int n, int (*fdelete)(struct soap_clist*))
    44955759{ register struct soap_clist *cp;
    4496   if ((cp = (struct soap_clist*)SOAP_MALLOC(sizeof(struct soap_clist))))
     5760  if ((cp = (struct soap_clist*)SOAP_MALLOC(soap, sizeof(struct soap_clist))))
    44975761  { cp->next = soap->clist;
    44985762    cp->type = t;
     
    45205784    { *q = **(char***)q;
    45215785      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked data %p\n", p));
     5786#ifdef SOAP_MEM_DEBUG
     5787      soap_track_unlink(soap, p);
     5788#endif
    45225789      return;
    45235790    }
     
    45285795      q = (char**)*cp;
    45295796      *cp = (*cp)->next;
    4530       SOAP_FREE(q);
     5797      SOAP_FREE(soap, q);
    45315798      return;
    45325799    }
     
    45365803
    45375804/******************************************************************************/
     5805#ifndef WITH_NOIDREF
    45385806#ifndef PALM_2
    45395807SOAP_FMAC1
     
    45535821}
    45545822#endif
    4555 
    4556 /******************************************************************************/
     5823#endif
     5824
     5825/******************************************************************************/
     5826#ifndef WITH_NOIDREF
    45575827#ifndef PALM_2
    45585828SOAP_FMAC1
     
    45625832{ struct soap_ilist *ip;
    45635833  void **q;
    4564   if (!id || !*id)
     5834  if (!p || !id || !*id)
    45655835    return p;
    4566   soap->alloced = 0;
    4567   if (!p)
    4568     p = (void**)soap_malloc(soap, sizeof(void*));
    45695836  ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */
    45705837  if (!ip)
    4571   { ip = soap_enter(soap, id); /* new hash table entry for string id */
     5838  { if (!(ip = soap_enter(soap, id))) /* new hash table entry for string id */
     5839      return NULL;
    45725840    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding first href='%s' type=%d %p (%u bytes)\n", id, t, p, (unsigned int)n));
    45735841    ip->type = t;
     
    45855853    { strcpy(soap->id, id);
    45865854      soap->error = SOAP_HREF;
    4587       DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Type incompatibility: id type=%d href type=%d\n", ip->type, t));
     5855      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Type incompatibility: href='%s' id-type=%d href-type=%d\n", id, ip->type, t));
    45885856      return NULL;
    45895857    }
     
    46065874      while (q)
    46075875      { *r = (void*)soap_malloc(soap, sizeof(void*));
     5876        if (!*r)
     5877          return NULL;
    46085878        s = *q;
    46095879        *q = *r;
     
    46255895    while (ip->level < k)
    46265896    { q = (void**)soap_malloc(soap, sizeof(void*)); 
     5897      if (!q)
     5898        return NULL;
    46275899      *p = q;
    46285900      p = q;
     
    46375909}
    46385910#endif
    4639 
    4640 /******************************************************************************/
     5911#endif
     5912
     5913/******************************************************************************/
     5914#ifndef WITH_NOIDREF
    46415915#ifndef PALM_2
    46425916SOAP_FMAC1
    46435917void*
    46445918SOAP_FMAC2
    4645 soap_id_forward(struct soap *soap, const char *href, void *p, int st, int tt, size_t n, unsigned int k, void (*fcopy)(struct soap*, int, int, void*, const void*, size_t))
     5919soap_id_forward(struct soap *soap, const char *href, void *p, size_t len, int st, int tt, size_t n, unsigned int k, void (*fcopy)(struct soap*, int, int, void*, size_t, const void*, size_t))
    46465920{ struct soap_ilist *ip;
    46475921  if (!p || !href || !*href)
     
    46495923  ip = soap_lookup(soap, href); /* lookup pointer to hash table entry for string id */
    46505924  if (!ip)
    4651   { ip = soap_enter(soap, href); /* new hash table entry for string id */
     5925  { if (!(ip = soap_enter(soap, href))) /* new hash table entry for string id */
     5926      return NULL;
    46525927    ip->type = st;
    46535928    ip->size = n;
     
    46665941  }
    46675942  if (fcopy || n < sizeof(void*) || *href != '#')
    4668   { register struct soap_flist *fp = (struct soap_flist*)SOAP_MALLOC(sizeof(struct soap_flist));
     5943  { register struct soap_flist *fp = (struct soap_flist*)SOAP_MALLOC(soap, sizeof(struct soap_flist));
    46695944    if (!fp)
    46705945    { soap->error = SOAP_EOM;
     
    46755950    fp->ptr = p;
    46765951    fp->level = k;
     5952    fp->len = len;
    46775953    if (fcopy)
    46785954      fp->fcopy = fcopy;
     
    46805956      fp->fcopy = soap_fcopy;
    46815957    ip->flist = fp;
    4682     DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding type=%d (target type=%d) size=%lu location=%p level=%u href='%s'\n", st, tt, (unsigned long)n, p, k, href));
     5958    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding type=%d (target type=%d) size=%lu location=%p level=%u len=%lu href='%s'\n", st, tt, (unsigned long)n, p, k, (unsigned long)len, href));
    46835959  }
    46845960  else
     
    46905966}
    46915967#endif
     5968#endif
    46925969
    46935970/******************************************************************************/
     
    46975974SOAP_FMAC2
    46985975soap_id_enter(struct soap *soap, const char *id, void *p, int t, size_t n, unsigned int k, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*))
    4699 { struct soap_ilist *ip;
     5976{
     5977#ifndef WITH_NOIDREF
     5978  struct soap_ilist *ip;
     5979#endif
    47005980  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Enter id='%s' type=%d loc=%p size=%lu level=%u\n", id, t, p, (unsigned long)n, k));
    47015981  soap->alloced = 0;
     
    47085988      soap->alloced = 1;
    47095989  }
     5990#ifndef WITH_NOIDREF
    47105991  if (!id || !*id)
     5992#endif
    47115993    return p;
     5994#ifndef WITH_NOIDREF
    47125995  ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */
    47135996  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Lookup entry id='%s for location=%p'\n", id, p));
    47145997  if (!ip)
    4715   { ip = soap_enter(soap, id); /* new hash table entry for string id */
     5998  { if (!(ip = soap_enter(soap, id))) /* new hash table entry for string id */
     5999      return NULL;
    47166000    ip->type = t;
    47176001    ip->link = NULL;
     
    47326016  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Multiply defined id='%s'\n", id));
    47336017    strcpy(soap->id, id);
    4734     soap->error = SOAP_MULTI_ID;
     6018    soap->error = SOAP_DUPLICATE_ID;
    47356019    return NULL;
    47366020  }
     
    47426026  }
    47436027  return ip->ptr;
     6028#endif
    47446029}
    47456030#endif
     
    47506035void
    47516036SOAP_FMAC2
    4752 soap_fcopy(struct soap *soap, int st, int tt, void *p, const void *q, size_t n)
     6037soap_fcopy(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n)
    47536038{ DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Copying data type=%d (target type=%d) %p -> %p (%lu bytes)\n", st, tt, q, p, (unsigned long)n));
    47546039  memcpy(p, q, n);
     
    47866071    { if (soap->mode & SOAP_ENC_ZLIB && soap->zlib_state == SOAP_ZLIB_DEFLATE)
    47876072      { soap->zlib_state = SOAP_ZLIB_NONE;
    4788         deflateEnd(&soap->d_stream);
     6073        deflateEnd(soap->d_stream);
    47896074      }
    47906075      return soap->error;
     
    47966081    if (soap->mode & SOAP_ENC_ZLIB)
    47976082    { int r;
    4798       soap->d_stream.avail_in = 0;
     6083      soap->d_stream->avail_in = 0;
    47996084      do
    48006085      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating remainder\n"));
    4801         r = deflate(&soap->d_stream, Z_FINISH);
    4802         if (soap->d_stream.avail_out != SOAP_BUFLEN)
    4803         { if (soap_flush_raw(soap, soap->z_buf, SOAP_BUFLEN - soap->d_stream.avail_out))
     6086        r = deflate(soap->d_stream, Z_FINISH);
     6087        if (soap->d_stream->avail_out != SOAP_BUFLEN)
     6088        { if (soap_flush_raw(soap, soap->z_buf, SOAP_BUFLEN - soap->d_stream->avail_out))
    48046089          { soap->zlib_state = SOAP_ZLIB_NONE;
    4805             deflateEnd(&soap->d_stream);
     6090            deflateEnd(soap->d_stream);
    48066091            return soap->error;
    4807           }
    4808           soap->d_stream.next_out = (Byte*)soap->z_buf;
    4809           soap->d_stream.avail_out = SOAP_BUFLEN;
     6092          }
     6093          soap->d_stream->next_out = (Byte*)soap->z_buf;
     6094          soap->d_stream->avail_out = SOAP_BUFLEN;
    48106095        }
    48116096      } while (r == Z_OK);
    4812       DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflated %lu->%lu bytes\n", soap->d_stream.total_in, soap->d_stream.total_out));
    4813       soap->z_ratio_out = (float)soap->d_stream.total_out / (float)soap->d_stream.total_in;
     6097      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflated total %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out));
     6098      soap->z_ratio_out = (float)soap->d_stream->total_out / (float)soap->d_stream->total_in;
    48146099      soap->mode &= ~SOAP_ENC_ZLIB;
    48156100      soap->zlib_state = SOAP_ZLIB_NONE;
    4816       if (deflateEnd(&soap->d_stream) != Z_OK || r != Z_STREAM_END)
    4817       { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to end deflate: %s\n", soap->d_stream.msg?soap->d_stream.msg:""));
     6101      if (deflateEnd(soap->d_stream) != Z_OK || r != Z_STREAM_END)
     6102      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to end deflate: %s\n", soap->d_stream->msg?soap->d_stream->msg:SOAP_STR_EOS));
    48186103        return soap->error = SOAP_ZLIB_ERROR;
    48196104      }
    48206105#ifdef WITH_GZIP
    4821       soap->z_buf[0] = soap->z_crc & 0xFF;
    4822       soap->z_buf[1] = (soap->z_crc >> 8) & 0xFF;
    4823       soap->z_buf[2] = (soap->z_crc >> 16) & 0xFF;
    4824       soap->z_buf[3] = (soap->z_crc >> 24) & 0xFF;
    4825       soap->z_buf[4] = soap->d_stream.total_in & 0xFF;
    4826       soap->z_buf[5] = (soap->d_stream.total_in >> 8) & 0xFF;
    4827       soap->z_buf[6] = (soap->d_stream.total_in >> 16) & 0xFF;
    4828       soap->z_buf[7] = (soap->d_stream.total_in >> 24) & 0xFF;
    4829       if (soap_flush_raw(soap, soap->z_buf, 8))
    4830         return soap->error;
    4831       DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip crc32=%lu\n", (unsigned long)soap->z_crc));
     6106      if (soap->zlib_out != SOAP_ZLIB_DEFLATE)
     6107      { soap->z_buf[0] = soap->z_crc & 0xFF;
     6108        soap->z_buf[1] = (soap->z_crc >> 8) & 0xFF;
     6109        soap->z_buf[2] = (soap->z_crc >> 16) & 0xFF;
     6110        soap->z_buf[3] = (soap->z_crc >> 24) & 0xFF;
     6111        soap->z_buf[4] = soap->d_stream->total_in & 0xFF;
     6112        soap->z_buf[5] = (soap->d_stream->total_in >> 8) & 0xFF;
     6113        soap->z_buf[6] = (soap->d_stream->total_in >> 16) & 0xFF;
     6114        soap->z_buf[7] = (soap->d_stream->total_in >> 24) & 0xFF;
     6115        if (soap_flush_raw(soap, soap->z_buf, 8))
     6116          return soap->error;
     6117        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip crc32=%lu\n", (unsigned long)soap->z_crc));
     6118      }
    48326119#endif
    48336120    }
     
    48356122    if ((soap->mode & SOAP_IO) == SOAP_IO_STORE)
    48366123    { char *p;
     6124#ifndef WITH_NOHTTP
    48376125      if (!(soap->mode & SOAP_ENC_XML))
    48386126      { soap->mode--;
     
    48466134        soap->mode++;
    48476135      }
    4848       for (p = soap_first_block(soap); p; p = soap_next_block(soap))
    4849       { DBGMSG(SENT, p, soap_block_size(soap));
    4850         if ((soap->error = soap->fsend(soap, p, soap_block_size(soap))))
    4851         { soap_end_block(soap);
     6136#endif
     6137      for (p = soap_first_block(soap, NULL); p; p = soap_next_block(soap, NULL))
     6138      { DBGMSG(SENT, p, soap_block_size(soap, NULL));
     6139        if ((soap->error = soap->fsend(soap, p, soap_block_size(soap, NULL))))
     6140        { soap_end_block(soap, NULL);
    48526141          return soap->error;
    48536142        }
    48546143      }
    4855       soap_end_block(soap);
    4856     }
     6144      soap_end_block(soap, NULL);
     6145    }
     6146#ifndef WITH_LEANER
    48576147    else if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
    48586148    { DBGMSG(SENT, "\r\n0\r\n\r\n", 7);
     
    48606150        return soap->error;
    48616151    }
    4862   }
     6152#endif
     6153  }
     6154#ifdef WITH_TCPFIN
    48636155#ifdef WITH_OPENSSL
    4864   if (!soap->ssl && soap_valid_socket(soap->socket) && !soap->keep_alive)
    4865     soap->fshutdownsocket(soap, (SOAP_SOCKET)soap->socket, 1); /* Send TCP FIN */
     6156  if (!soap->ssl && soap_valid_socket(soap->socket) && !soap->keep_alive && !(soap->omode & SOAP_IO_UDP))
     6157    soap->fshutdownsocket(soap, soap->socket, 1); /* Send TCP FIN */
    48666158#else
    4867   if (soap_valid_socket(soap->socket) && !soap->keep_alive)
    4868     soap->fshutdownsocket(soap, (SOAP_SOCKET)soap->socket, 1); /* Send TCP FIN */
    4869 #endif
    4870   DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of send message ok\n"));
     6159  if (soap_valid_socket(soap->socket) && !soap->keep_alive && !(soap->omode & SOAP_IO_UDP))
     6160    soap->fshutdownsocket(soap, soap->socket, 1); /* Send TCP FIN */
     6161#endif
     6162#endif
     6163  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of send phase\n"));
     6164  soap->omode &= ~SOAP_XML_SEC;
     6165  soap->count = 0;
    48716166  soap->part = SOAP_END;
    4872   soap->count = 0;
    48736167  return SOAP_OK;
    48746168}
     
    48836177{ soap->part = SOAP_END;
    48846178#ifndef WITH_LEANER
    4885   if ((soap->mode & SOAP_ENC_MIME) && soap_getmime(soap))
     6179  if ((soap->mode & SOAP_ENC_DIME) && soap_getdime(soap))
     6180  { soap->dime.first = NULL;
     6181    soap->dime.last = NULL;
    48866182    return soap->error;
     6183  }
     6184  soap->dime.list = soap->dime.first;
     6185  soap->dime.first = NULL;
     6186  soap->dime.last = NULL;
     6187  /* Check if MIME attachments and mime-post-check flag is set, if set call soap_resolve() and return */
     6188  if (soap->mode & SOAP_ENC_MIME)
     6189  {
     6190#ifndef WITH_NOIDREF
     6191    if (soap->mode & SOAP_MIME_POSTCHECK)
     6192    { soap_resolve(soap);
     6193      return SOAP_OK;
     6194    }
     6195#endif
     6196    if (soap_getmime(soap))
     6197      return soap->error;
     6198  }
    48876199  soap->mime.list = soap->mime.first;
    48886200  soap->mime.first = NULL;
    48896201  soap->mime.last = NULL;
    4890   soap->dime.list = soap->dime.first;
    4891   soap->dime.first = NULL;
    4892   soap->dime.last = NULL;
     6202  soap->mime.boundary = NULL;
     6203  if (soap->xlist)
     6204  { struct soap_multipart *content;
     6205    for (content = soap->mime.list; content; content = content->next)
     6206      soap_resolve_attachment(soap, content);
     6207  }
    48936208#endif
    48946209  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "End of receive message ok\n"));
    48956210#ifdef WITH_ZLIB
    48966211  if (soap->mode & SOAP_ENC_ZLIB)
    4897   { soap->mode &= ~SOAP_ENC_ZLIB;
     6212  { /* Make sure end of compressed content is reached */
     6213    while (soap->d_stream->next_out != Z_NULL)
     6214      if ((int)soap_get1(soap) == EOF)
     6215        break;
     6216    soap->mode &= ~SOAP_ENC_ZLIB;
    48986217    memcpy(soap->buf, soap->z_buf, SOAP_BUFLEN);
    4899     soap->bufidx = (char*)soap->d_stream.next_in - soap->z_buf;
     6218    soap->bufidx = (char*)soap->d_stream->next_in - soap->z_buf;
    49006219    soap->buflen = soap->z_buflen;
    49016220    soap->zlib_state = SOAP_ZLIB_NONE;
    4902     if (inflateEnd(&soap->d_stream) != Z_OK)
     6221    if (inflateEnd(soap->d_stream) != Z_OK)
    49036222      return soap->error = SOAP_ZLIB_ERROR;
     6223    DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Inflate end ok\n"));
    49046224#ifdef WITH_GZIP
    49056225    if (soap->zlib_in == SOAP_ZLIB_GZIP)
    49066226    { soap_wchar c;
    49076227      short i;
     6228      DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Inflate gzip crc check\n"));
    49086229      for (i = 0; i < 8; i++)
    4909       { if ((int)(c = soap_getchar(soap)) == EOF)
     6230      { if ((int)(c = soap_get1(soap)) == EOF)
    49106231          return soap->error = SOAP_EOF;
    49116232        soap->z_buf[i] = (char)c;
     
    49156236        return soap->error = SOAP_ZLIB_ERROR;
    49166237      }
    4917       if (soap->d_stream.total_out != ((uLong)(unsigned char)soap->z_buf[4] | ((uLong)(unsigned char)soap->z_buf[5] << 8) | ((uLong)(unsigned char)soap->z_buf[6] << 16) | ((uLong)(unsigned char)soap->z_buf[7] << 24)))
     6238      if (soap->d_stream->total_out != ((uLong)(unsigned char)soap->z_buf[4] | ((uLong)(unsigned char)soap->z_buf[5] << 8) | ((uLong)(unsigned char)soap->z_buf[6] << 16) | ((uLong)(unsigned char)soap->z_buf[7] << 24)))
    49186239      { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Gzip error: incorrect message length\n"));
    49196240        return soap->error = SOAP_ZLIB_ERROR;
    49206241      }
    49216242    }
     6243    soap->zlib_in = SOAP_ZLIB_NONE;
    49226244#endif
    49236245  }
     
    49286250  if (soap->fdisconnect && (soap->error = soap->fdisconnect(soap)))
    49296251    return soap->error;
    4930   return soap_resolve(soap);
     6252#ifndef WITH_NOIDREF
     6253  if (soap_resolve(soap))
     6254    return soap->error;
     6255#endif
     6256#ifndef WITH_LEANER
     6257  if (soap->xlist)
     6258  { if (soap->mode & SOAP_ENC_MTOM)
     6259      return soap->error = SOAP_MIME_HREF;
     6260    return soap->error = SOAP_DIME_HREF;
     6261  }
     6262#endif
     6263  soap_free_temp(soap);
     6264  return SOAP_OK;
    49316265}
    49326266#endif
     
    49376271void
    49386272SOAP_FMAC2
    4939 soap_free(struct soap *soap)
    4940 { register struct soap_nlist *np;
    4941   register struct soap_attribute *tp;
     6273soap_free_temp(struct soap *soap)
     6274{ register struct soap_nlist *np, *nq;
     6275  register struct soap_attribute *tp, *tq;
    49426276  register struct Namespace *ns;
    49436277  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free namespace stack\n"));
    4944   while (soap->nlist)
    4945   { np = soap->nlist->next;
    4946     if (soap->nlist->ns)
    4947       SOAP_FREE(soap->nlist->ns);
    4948     SOAP_FREE(soap->nlist);
    4949     soap->nlist = np;
    4950   }
     6278  for (np = soap->nlist; np; np = nq)
     6279  { nq = np->next;
     6280    SOAP_FREE(soap, np);
     6281  }
     6282  soap->nlist = NULL;
    49516283  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free any remaining temp blocks\n"));
    49526284  while (soap->blist)
    4953     soap_end_block(soap);
    4954   DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attributes\n"));
    4955   while (soap->attributes)
    4956   { tp = soap->attributes->next;
    4957     if (soap->attributes->value)
    4958       SOAP_FREE(soap->attributes->value);
    4959     SOAP_FREE(soap->attributes);
    4960     soap->attributes = tp;
    4961   }
     6285    soap_end_block(soap, NULL);
     6286  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute storage\n"));
     6287  for (tp = soap->attributes; tp; tp = tq)
     6288  { tq = tp->next;
     6289    if (tp->value)
     6290      SOAP_FREE(soap, tp->value);
     6291    SOAP_FREE(soap, tp);
     6292  }
     6293  soap->attributes = NULL;
    49626294#ifdef WITH_FAST
    49636295  if (soap->labbuf)
    4964     SOAP_FREE(soap->labbuf);
     6296    SOAP_FREE(soap, soap->labbuf);
    49656297  soap->labbuf = NULL;
    49666298  soap->lablen = 0;
    49676299  soap->labidx = 0;
    49686300#endif
    4969   soap_free_pht(soap);
    4970   soap_free_iht(soap);
    49716301  ns = soap->local_namespaces;
    49726302  if (ns)
    49736303  { for (; ns->id; ns++)
    49746304    { if (ns->out)
    4975       { SOAP_FREE(ns->out);
    4976         if (soap->encodingStyle == ns->out)
     6305      { if (soap->encodingStyle == ns->out)
    49776306          soap->encodingStyle = SOAP_STR_EOS;
     6307        SOAP_FREE(soap, ns->out);
    49786308        ns->out = NULL;
    49796309      }
     
    49816311        soap->encodingStyle = SOAP_STR_EOS;
    49826312    }
    4983     SOAP_FREE(soap->local_namespaces);
     6313    SOAP_FREE(soap, soap->local_namespaces);
    49846314    soap->local_namespaces = NULL;
    49856315  }
     6316#ifndef WITH_LEANER
     6317  while (soap->xlist)
     6318  { struct soap_xlist *xp = soap->xlist->next;
     6319    SOAP_FREE(soap, soap->xlist);
     6320    soap->xlist = xp;
     6321  }
     6322#endif
     6323#ifndef WITH_NOIDREF
     6324  soap_free_pht(soap);
     6325  soap_free_iht(soap);
     6326#endif
    49866327}
    49876328#endif
     
    50376378static void
    50386379soap_set_logfile(struct soap *soap, int i, const char *logfile)
    5039 { char *s = NULL;
     6380{ const char *s;
     6381  char *t = NULL;
    50406382  soap_close_logfile(soap, i);
    5041   if (soap->logfile[i])
    5042     SOAP_FREE((void*)soap->logfile[i]);
     6383  s = soap->logfile[i];
     6384  soap->logfile[i] = logfile;
     6385  if (s)
     6386    SOAP_FREE(soap, (void*)s);
    50436387  if (logfile)
    5044     if ((s = (char*)SOAP_MALLOC(strlen(logfile) + 1)))
    5045       strcpy(s, logfile);
    5046   soap->logfile[i] = s;
     6388    if ((t = (char*)SOAP_MALLOC(soap, strlen(logfile) + 1)))
     6389      strcpy(t, logfile);
     6390  soap->logfile[i] = t;
    50476391}
    50486392#endif
     
    50836427struct soap*
    50846428SOAP_FMAC2
    5085 soap_copy(struct soap *soap)
    5086 { return soap_copy_context((struct soap*)SOAP_MALLOC(sizeof(struct soap)), soap);
     6429soap_copy(const struct soap *soap)
     6430{ return soap_copy_context((struct soap*)malloc(sizeof(struct soap)), soap);
    50876431}
    50886432#endif
     
    50936437struct soap*
    50946438SOAP_FMAC2
    5095 soap_copy_context(struct soap *copy, struct soap *soap)
    5096 { if (copy)
    5097   { register struct soap_plugin *p;
     6439soap_copy_context(struct soap *copy, const struct soap *soap)
     6440{ if (soap_check_state(soap))
     6441    return NULL;
     6442  if (copy)
     6443  { register struct soap_plugin *p = NULL;
     6444#ifdef __cplusplus
     6445    *copy = *soap;
     6446#else
    50986447    memcpy(copy, soap, sizeof(struct soap));
    5099     copy->copy = 1;
    5100     copy->user = NULL;
     6448#endif
     6449    copy->state = SOAP_COPY;
     6450    copy->error = SOAP_OK;
    51016451    copy->userid = NULL;
    51026452    copy->passwd = NULL;
     
    51066456    copy->alist = NULL;
    51076457    copy->attributes = NULL;
     6458    copy->labbuf = NULL;
     6459    copy->lablen = 0;
     6460    copy->labidx = 0;
     6461#ifdef SOAP_MEM_DEBUG
     6462    soap_init_mht(copy);
     6463#endif
     6464#ifdef SOAP_DEBUG
     6465    soap_init_logs(copy);
     6466    soap_set_recv_logfile(copy, soap->logfile[SOAP_INDEX_RECV]);
     6467    soap_set_sent_logfile(copy, soap->logfile[SOAP_INDEX_SENT]);
     6468    soap_set_test_logfile(copy, soap->logfile[SOAP_INDEX_TEST]);
     6469#endif
     6470#ifdef WITH_C_LOCALE
     6471    copy->c_locale = duplocale(soap->c_locale);
     6472#else
     6473    copy->c_locale = NULL;
     6474#endif
     6475#ifdef WITH_OPENSSL
     6476    copy->bio = NULL;
     6477    copy->ssl = NULL;
     6478#endif
     6479#ifdef WITH_ZLIB
     6480    copy->d_stream = (z_stream*)SOAP_MALLOC(copy, sizeof(z_stream));
     6481    copy->d_stream->zalloc = Z_NULL;
     6482    copy->d_stream->zfree = Z_NULL;
     6483    copy->d_stream->opaque = Z_NULL;
     6484    copy->z_buf = NULL;
     6485#endif
    51086486    copy->local_namespaces = NULL;
    5109     soap_set_local_namespaces(copy);
     6487#ifndef WITH_NOIDREF
    51106488    soap_init_iht(copy);
    51116489    soap_init_pht(copy);
     6490#endif
    51126491    copy->header = NULL;
    51136492    copy->fault = NULL;
    51146493    copy->action = NULL;
    5115     *copy->host = '\0';
    51166494#ifndef WITH_LEAN
    51176495#ifdef WITH_COOKIES
    5118     copy->cookies = soap_copy_cookies(soap);
     6496    copy->cookies = soap_copy_cookies(copy, soap);
    51196497#else
    51206498    copy->cookies = NULL;
    51216499#endif
    51226500#endif
    5123 #ifdef SOAP_DEBUG
    5124     soap_init_logs(copy);
    5125     soap_set_recv_logfile(copy, "RECV.log");
    5126     soap_set_sent_logfile(copy, "SENT.log");
    5127     soap_set_test_logfile(copy, "TEST.log");
    5128 #endif
    51296501    copy->plugins = NULL;
    51306502    for (p = soap->plugins; p; p = p->next)
    5131     { register struct soap_plugin *q = (struct soap_plugin*)SOAP_MALLOC(sizeof(struct soap_plugin));
     6503    { register struct soap_plugin *q = (struct soap_plugin*)SOAP_MALLOC(copy, sizeof(struct soap_plugin));
    51326504      if (!q)
    51336505        return NULL;
    51346506      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying plugin '%s'\n", p->id));
    51356507      *q = *p;
    5136       if (p->fcopy && (soap->error = p->fcopy(soap, q, p)))
    5137       { SOAP_FREE(q);
     6508      if (p->fcopy && p->fcopy(copy, q, p))
     6509      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not copy plugin '%s'\n", p->id));
     6510        SOAP_FREE(copy, q);
    51386511        return NULL;
    51396512      }
     
    51426515    }
    51436516  }
    5144   else
    5145     soap->error = SOAP_EOM;
    51466517  return copy;
    51476518}
     
    51536524void
    51546525SOAP_FMAC2
     6526soap_copy_stream(struct soap *copy, struct soap *soap)
     6527{ copy->mode = soap->mode;
     6528  copy->imode = soap->imode;
     6529  copy->omode = soap->omode;
     6530  copy->socket = soap->socket;
     6531  copy->recv_timeout = soap->recv_timeout;
     6532  copy->send_timeout = soap->send_timeout;
     6533#if defined(__cplusplus) && !defined(WITH_LEAN)
     6534  copy->os = soap->os;
     6535  copy->is = soap->is;
     6536#endif
     6537  copy->sendfd = soap->sendfd;
     6538  copy->recvfd = soap->recvfd;
     6539  copy->bufidx = soap->bufidx;
     6540  copy->buflen = soap->buflen;
     6541  copy->ahead = soap->ahead;
     6542  copy->cdata = soap->cdata;
     6543  copy->chunksize = soap->chunksize;
     6544  copy->chunkbuflen = soap->chunkbuflen;
     6545  copy->keep_alive = soap->keep_alive;
     6546  copy->tcp_keep_alive = soap->tcp_keep_alive;
     6547  copy->tcp_keep_idle = soap->tcp_keep_idle;
     6548  copy->tcp_keep_intvl = soap->tcp_keep_intvl;
     6549  copy->tcp_keep_cnt = soap->tcp_keep_cnt;
     6550  copy->max_keep_alive = soap->max_keep_alive;
     6551#ifndef WITH_NOIO
     6552  copy->peer = soap->peer;
     6553  copy->peerlen = soap->peerlen;
     6554#endif
     6555#ifdef WITH_OPENSSL
     6556  copy->bio = soap->bio;
     6557  copy->ssl = soap->ssl;
     6558  copy->ctx = soap->ctx;
     6559#endif
     6560#ifdef WITH_ZLIB
     6561  copy->zlib_state = soap->zlib_state;
     6562  copy->zlib_in = soap->zlib_in;
     6563  copy->zlib_out = soap->zlib_out;
     6564  copy->d_stream = (z_stream*)SOAP_MALLOC(copy, sizeof(z_stream));
     6565  memcpy(copy->d_stream, soap->d_stream, sizeof(z_stream));
     6566  copy->z_crc = soap->z_crc;
     6567  copy->z_ratio_in = soap->z_ratio_in;
     6568  copy->z_ratio_out = soap->z_ratio_out;
     6569  copy->z_buf = NULL;
     6570  copy->z_buflen = soap->z_buflen;
     6571  copy->z_level = soap->z_level;
     6572  if (soap->z_buf && soap->zlib_state != SOAP_ZLIB_NONE)
     6573  { copy->z_buf = (char*)SOAP_MALLOC(copy, SOAP_BUFLEN);
     6574    memcpy(copy->z_buf, soap->z_buf, sizeof(soap->z_buf));
     6575  }
     6576#endif
     6577  memcpy(copy->buf, soap->buf, sizeof(soap->buf));
     6578}
     6579#endif
     6580
     6581/******************************************************************************/
     6582#ifndef PALM_1
     6583SOAP_FMAC1
     6584void
     6585SOAP_FMAC2
    51556586soap_init(struct soap *soap)
    5156 { soap->version = 0;
     6587{ soap->state = SOAP_INIT;
     6588#ifdef SOAP_MEM_DEBUG
     6589  soap_init_mht(soap);
     6590#endif
     6591#ifdef SOAP_DEBUG
     6592  soap_init_logs(soap);
     6593  soap_set_recv_logfile(soap, "RECV.log");
     6594  soap_set_sent_logfile(soap, "SENT.log");
     6595  soap_set_test_logfile(soap, "TEST.log");
     6596  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing context\n"));
     6597#endif
     6598  soap->version = 0;
    51576599  soap_imode(soap, SOAP_IO_DEFAULT);
    51586600  soap_omode(soap, SOAP_IO_DEFAULT);
    5159   soap->copy = 0;
    51606601  soap->plugins = NULL;
    51616602  soap->user = NULL;
    51626603  soap->userid = NULL;
    51636604  soap->passwd = NULL;
     6605#ifndef WITH_NOHTTP
    51646606  soap->fpost = http_post;
    51656607  soap->fget = http_get;
     6608  soap->fput = http_put;
     6609  soap->fdel = http_del;
     6610  soap->fhead = http_head;
     6611  soap->fform = NULL;
    51666612  soap->fposthdr = http_post_header;
    51676613  soap->fresponse = http_response;
    51686614  soap->fparse = http_parse;
    51696615  soap->fparsehdr = http_parse_header;
     6616#endif
     6617  soap->fheader = NULL;
    51706618  soap->fconnect = NULL;
    51716619  soap->fdisconnect = NULL;
    5172 #ifndef MAC_CARBON
     6620#ifndef WITH_NOIO
     6621  soap->ipv6_multicast_if = 0;
     6622  soap->ipv4_multicast_if = NULL;
    51736623#ifndef WITH_IPV6
    51746624  soap->fresolve = tcp_gethost;
     
    51856635  soap->fpoll = soap_poll;
    51866636#else
     6637  soap->fopen = NULL;
     6638  soap->fclose = NULL;
    51876639  soap->fpoll = NULL;
    51886640#endif
     6641  soap->fseterror = NULL;
     6642  soap->fignore = NULL;
     6643  soap->fserveloop = NULL;
     6644  soap->fplugin = fplugin;
     6645  soap->fmalloc = NULL;
     6646#ifndef WITH_LEANER
    51896647  soap->fprepareinit = NULL;
    51906648  soap->fpreparesend = NULL;
    51916649  soap->fpreparerecv = NULL;
    5192   soap->fignore = NULL;
    5193   soap->fserveloop = NULL;
    5194   soap->fplugin = fplugin;
     6650  soap->fpreparefinal = NULL;
    51956651  soap->fdimereadopen = NULL;
    51966652  soap->fdimewriteopen = NULL;
     
    51996655  soap->fdimeread = NULL;
    52006656  soap->fdimewrite = NULL;
    5201   soap->float_format = "%.8g"; /* .8 preserves single FP precision as much as possible, but might not be very efficient */
    5202   soap->double_format = "%.17lg"; /* .17 preserves double FP precision as much as possible, but might not be very efficient */
     6657  soap->fmimereadopen = NULL;
     6658  soap->fmimewriteopen = NULL;
     6659  soap->fmimereadclose = NULL;
     6660  soap->fmimewriteclose = NULL;
     6661  soap->fmimeread = NULL;
     6662  soap->fmimewrite = NULL;
     6663#endif
     6664  soap->float_format = "%.9G"; /* Alternative: use "%G" */
     6665  soap->double_format = "%.17lG"; /* Alternative: use "%lG" */
    52036666  soap->dime_id_format = "cid:id%d"; /* default DIME id format */
    52046667  soap->http_version = "1.1";
     6668  soap->proxy_http_version = "1.0";
     6669  soap->http_content = NULL;
    52056670  soap->actor = NULL;
     6671  soap->lang = "en";
     6672  soap->keep_alive = 0;
     6673  soap->tcp_keep_alive = 0;
     6674  soap->tcp_keep_idle = 0;
     6675  soap->tcp_keep_intvl = 0;
     6676  soap->tcp_keep_cnt = 0;
    52066677  soap->max_keep_alive = SOAP_MAXKEEPALIVE;
    5207   soap->keep_alive = 0;
    52086678  soap->recv_timeout = 0;
    52096679  soap->send_timeout = 0;
     
    52146684  soap->bind_flags = 0;
    52156685  soap->accept_flags = 0;
     6686  soap->linger_time = 0;
    52166687  soap->ip = 0;
    52176688  soap->labbuf = NULL;
     
    52366707  soap->os = NULL;
    52376708  soap->is = NULL;
     6709#ifndef WITH_LEANER
    52386710  soap->dom = NULL;
    52396711  soap->dime.list = NULL;
     
    52456717  soap->mime.boundary = NULL;
    52466718  soap->mime.start = NULL;
     6719  soap->xlist = NULL;
     6720#endif
    52476721#ifndef UNDER_CE
    52486722  soap->recvfd = 0;
     
    52616735  soap->authrealm = NULL;
    52626736  soap->prolog = NULL;
     6737#ifdef WITH_ZLIB
     6738  soap->zlib_state = SOAP_ZLIB_NONE;
     6739  soap->zlib_in = SOAP_ZLIB_NONE;
     6740  soap->zlib_out = SOAP_ZLIB_NONE;
     6741  soap->d_stream = (z_stream*)SOAP_MALLOC(soap, sizeof(z_stream));
     6742  soap->d_stream->zalloc = Z_NULL;
     6743  soap->d_stream->zfree = Z_NULL;
     6744  soap->d_stream->opaque = Z_NULL;
     6745  soap->z_buf = NULL;
     6746  soap->z_level = 6;
     6747#endif
     6748#ifndef WITH_LEAN
     6749  soap->c14ninclude = NULL;
     6750  soap->c14nexclude = NULL;
     6751  soap->cookies = NULL;
     6752  soap->cookie_domain = NULL;
     6753  soap->cookie_path = NULL;
     6754  soap->cookie_max = 32;
     6755#endif
     6756#ifdef WMW_RPM_IO
     6757  soap->rpmreqid = NULL;
     6758#endif
     6759#ifdef PALM
     6760  palmNetLibOpen();
     6761#endif
     6762#ifndef WITH_NOIDREF
     6763  soap_init_iht(soap);
     6764  soap_init_pht(soap);
     6765#endif
    52636766#ifdef WITH_OPENSSL
     6767  if (!soap_ssl_init_done)
     6768  { soap_ssl_init();
     6769    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing OpenSSL, version=%ld\n", (long)OPENSSL_VERSION_NUMBER));
     6770  }
    52646771  soap->fsslauth = ssl_auth_init;
    52656772  soap->fsslverify = ssl_verify_callback;
     
    52676774  soap->ssl = NULL;
    52686775  soap->ctx = NULL;
    5269   soap->require_server_auth = 0;
    5270   soap->require_client_auth = 0;
    5271   soap->rsa = 0;
     6776  soap->ssl_flags = SOAP_SSL_DEFAULT;
    52726777  soap->keyfile = NULL;
    52736778  soap->password = NULL;
     
    52756780  soap->cafile = NULL;
    52766781  soap->capath = NULL;
     6782  soap->crlfile = NULL;
    52776783  soap->randfile = NULL;
    52786784  soap->session = NULL;
    52796785#endif
    5280 #ifdef WITH_ZLIB
    5281   soap->zlib_state = SOAP_ZLIB_NONE;
    5282   soap->zlib_in = SOAP_ZLIB_NONE;
    5283   soap->zlib_out = SOAP_ZLIB_NONE;
    5284   soap->d_stream.zalloc = NULL;
    5285   soap->d_stream.zfree = NULL;
    5286   soap->d_stream.opaque = NULL;
    5287   soap->z_level = 6;
    5288 #endif
    5289 #ifndef WITH_LEAN
    5290   soap->cookies = NULL;
    5291   soap->cookie_domain = NULL;
    5292   soap->cookie_path = NULL;
    5293   soap->cookie_max = 32;
    5294 #endif
    5295 #ifdef SOAP_DEBUG
    5296   soap_init_logs(soap);
    5297   soap_set_recv_logfile(soap, "RECV.log");
    5298   soap_set_sent_logfile(soap, "SENT.log");
    5299   soap_set_test_logfile(soap, NULL);
    5300 #endif
    5301 /* WR[ */
    5302 #ifdef WMW_RPM_IO
    5303   soap->rpmreqid = NULL;
    5304 #endif /* WMW_RPM_IO */
    5305 /* ]WR */
    5306 #ifdef PALM
    5307   palmNetLibOpen();
    5308 #endif
    5309   soap_init_iht(soap);
    5310   soap_init_pht(soap);
     6786#ifdef WITH_C_LOCALE
     6787  soap->c_locale = newlocale(LC_ALL_MASK, "C", NULL);
     6788#else
     6789  soap->c_locale = NULL;
     6790#endif
    53116791  soap_begin(soap);
    5312 #ifdef SOAP_DEBUG
    5313   soap_set_test_logfile(soap, "TEST.log");
    5314 #endif
    53156792}
    53166793#endif
     
    53216798void
    53226799SOAP_FMAC2
    5323 soap_init1(struct soap *soap, int mode)
     6800soap_init1(struct soap *soap, soap_mode mode)
    53246801{ soap_init2(soap, mode, mode);
    53256802}
     
    53316808void
    53326809SOAP_FMAC2
    5333 soap_init2(struct soap *soap, int imode, int omode)
     6810soap_init2(struct soap *soap, soap_mode imode, soap_mode omode)
    53346811{ soap_init(soap);
    53356812  soap_imode(soap, imode);
     
    53446821SOAP_FMAC2
    53456822soap_begin(struct soap *soap)
    5346 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing\n"));
     6823{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reinitializing context\n"));
    53476824  if (!soap->keep_alive)
    53486825  { soap->buflen = 0;
     
    53566833  soap->mode = 0;
    53576834  soap->ns = 0;
    5358   soap->part = SOAP_BEGIN;
     6835  soap->part = SOAP_END;
    53596836  soap->alloced = 0;
    53606837  soap->count = 0;
     
    53676844  soap->level = 0;
    53686845  soap->endpoint[0] = '\0';
     6846#ifndef WITH_LEANER
    53696847  soap->dime.chunksize = 0;
    53706848  soap->dime.buflen = 0;
    5371   soap_free(soap);
     6849#endif
     6850  soap_free_temp(soap);
    53726851}
    53736852#endif
     
    53796858SOAP_FMAC2
    53806859soap_end(struct soap *soap)
    5381 { register struct soap_clist *cp;
    5382   soap_free(soap);
     6860{ if (soap_check_state(soap))
     6861    return;
     6862  soap_free_temp(soap);
    53836863  soap_dealloc(soap, NULL);
    53846864  while (soap->clist)
    5385   { cp = soap->clist->next;
    5386     SOAP_FREE(soap->clist);
     6865  { register struct soap_clist *cp = soap->clist->next;
     6866    SOAP_FREE(soap, soap->clist);
    53876867    soap->clist = cp;
    53886868  }
     
    54026882int
    54036883SOAP_FMAC2
    5404 soap_set_namespaces(struct soap *soap, struct Namespace *p)
    5405 { struct Namespace *ns = soap->local_namespaces;
    5406   struct soap_nlist *np, *nq, *nr;
    5407   unsigned int level = soap->level;
     6884soap_set_namespaces(struct soap *soap, const struct Namespace *p)
     6885{ register struct Namespace *ns = soap->local_namespaces;
     6886  register struct soap_nlist *np, *nq, *nr;
     6887  register unsigned int level = soap->level;
    54086888  soap->namespaces = p;
    54096889  soap->local_namespaces = NULL;
    54106890  soap_set_local_namespaces(soap);
    5411   /* reverse the list */
     6891  /* reverse the namespace list */
    54126892  np = soap->nlist;
    54136893  soap->nlist = NULL;
     
    54226902    }
    54236903  }
     6904  /* then push on new stack */
    54246905  while (np)
    5425   { soap->level = np->level; /* preserve element nesting level */
    5426     if (np->ns)
    5427     { if (soap_push_namespace(soap, np->id, np->ns))
    5428         return soap->error;
    5429     }
    5430     else if (np->index >= 0 && ns)
    5431     { if (ns[np->index].out)
    5432       { if (soap_push_namespace(soap, np->id, ns[np->index].out))
    5433           return soap->error;
    5434       }
    5435       else if (soap_push_namespace(soap, np->id, ns[np->index].ns))
    5436         return soap->error;
    5437     }
    5438     if (np->ns)
    5439       SOAP_FREE(np->ns);
     6906  { register const char *s;
     6907    soap->level = np->level; /* preserve element nesting level */
     6908    s = np->ns;
     6909    if (!s && np->index >= 0 && ns)
     6910    { s = ns[np->index].out;
     6911      if (!s)
     6912        s = ns[np->index].ns;
     6913    }
     6914    if (s && soap_push_namespace(soap, np->id, s))
     6915      return soap->error;
    54406916    nq = np;
    54416917    np = np->next;
    5442     SOAP_FREE(nq);
     6918    SOAP_FREE(soap, nq);
    54436919  }
    54446920  if (ns)
    5445   { int i;
     6921  { register int i;
    54466922    for (i = 0; ns[i].id; i++)
    54476923    { if (ns[i].out)
    5448       { SOAP_FREE(ns[i].out);
     6924      { SOAP_FREE(soap, ns[i].out);
    54496925        ns[i].out = NULL;
    54506926      }
    54516927    }
    5452     SOAP_FREE(ns);
     6928    SOAP_FREE(soap, ns);
    54536929  }
    54546930  soap->level = level; /* restore level */
     
    54596935/******************************************************************************/
    54606936#ifndef PALM_1
    5461 static void
     6937SOAP_FMAC1
     6938void
     6939SOAP_FMAC2
    54626940soap_set_local_namespaces(struct soap *soap)
    54636941{ if (soap->namespaces && !soap->local_namespaces)
     
    54676945    for (ns1 = soap->namespaces; ns1->id; ns1++)
    54686946      n++;
    5469     if (n > 3)
    5470     { n *= sizeof(struct Namespace);
    5471       ns2 = (struct Namespace*)SOAP_MALLOC(n);
    5472       if (ns2)
    5473       { memcpy(ns2, soap->namespaces, n);
    5474         ns2[0].id = "SOAP-ENV";
    5475         ns2[1].id = "SOAP-ENC";
    5476         ns2[2].id = "xsi";
    5477         if (ns2[0].ns)
    5478         { if (!strcmp(ns2[0].ns, soap_env1))
    5479             soap->version = 1;
    5480           else
    5481             soap->version = 2;
    5482         }
    5483         soap->local_namespaces = ns2;
    5484       }
    5485     }
    5486   }
     6947    n *= sizeof(struct Namespace);
     6948    ns2 = (struct Namespace*)SOAP_MALLOC(soap, n);
     6949    if (ns2)
     6950    { memcpy(ns2, soap->namespaces, n);
     6951      if (ns2[0].ns)
     6952      { if (!strcmp(ns2[0].ns, soap_env1))
     6953          soap->version = 1;
     6954        else
     6955          soap->version = 2;
     6956      }
     6957      soap->local_namespaces = ns2;
     6958    }
     6959  }
     6960}
     6961#endif
     6962
     6963/******************************************************************************/
     6964#ifndef WITH_LEAN
     6965#ifndef PALM_1
     6966SOAP_FMAC1
     6967const char *
     6968SOAP_FMAC2
     6969soap_strsearch(const char *big, const char *little)
     6970{ size_t n = strlen(little);
     6971  const char *s = big;
     6972  while (s)
     6973  { if (!strncmp(s, little, n) && (s[n] == '\0' || s[n] == ' '))
     6974      return s;
     6975    s = strchr(s, ' ');
     6976    if (s)
     6977      s++;
     6978  }
     6979  return NULL;
     6980}
     6981#endif
     6982#endif
     6983
     6984/******************************************************************************/
     6985#ifndef WITH_LEAN
     6986#ifndef PALM_1
     6987SOAP_FMAC1
     6988struct soap_nlist *
     6989SOAP_FMAC2
     6990soap_lookup_ns(struct soap *soap, const char *tag, size_t n)
     6991{ register struct soap_nlist *np;
     6992  for (np = soap->nlist; np; np = np->next)
     6993  { if (!strncmp(np->id, tag, n) && !np->id[n])
     6994      return np;
     6995  }
     6996  return NULL;
     6997}
     6998#endif
     6999#endif
     7000
     7001/******************************************************************************/
     7002#ifndef WITH_LEAN
     7003static struct soap_nlist *
     7004soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized)
     7005{ register struct soap_nlist *np;
     7006  size_t n, k;
     7007  if (soap_strsearch(soap->c14nexclude, id))
     7008    return NULL;
     7009  if (!utilized)
     7010  { for (np = soap->nlist; np; np = np->next)
     7011    { if (!strcmp(np->id, id) && (!np->ns || !strcmp(np->ns, ns)))
     7012        break;
     7013    }
     7014    if (np)
     7015    { if ((np->level < soap->level || !np->ns) && np->index == 1)
     7016        utilized = 1;
     7017      else
     7018        return NULL;
     7019    }
     7020  }
     7021  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding namespace binding (level=%u) '%s' '%s' utilized=%d\n", soap->level, id, ns?ns:"(null)", utilized));
     7022  n = strlen(id);
     7023  if (ns)
     7024    k = strlen(ns);
     7025  else
     7026    k = 0;
     7027  np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k + 1);
     7028  if (!np)
     7029  { soap->error = SOAP_EOM;
     7030    return NULL;
     7031  }
     7032  np->next = soap->nlist;
     7033  soap->nlist = np;
     7034  strcpy(np->id, id);
     7035  if (ns)
     7036  { np->ns = np->id + n + 1;
     7037    strcpy(np->ns, ns);
     7038  }
     7039  else
     7040    np->ns = NULL;
     7041  np->level = soap->level;
     7042  np->index = utilized;
     7043  return np;
     7044}
     7045#endif
     7046
     7047/******************************************************************************/
     7048#ifndef WITH_LEAN
     7049static void
     7050soap_utilize_ns(struct soap *soap, const char *tag, size_t n)
     7051{ register struct soap_nlist *np = soap_lookup_ns(soap, tag, n);
     7052  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Utilizing namespace of '%s'\n", tag));
     7053  if (np)
     7054  { if (np->index == 0)
     7055      soap_push_ns(soap, np->id, np->ns, 1);
     7056  }
     7057  else if (strncmp(tag, "xml", 3))
     7058  { strncpy(soap->tmpbuf, tag, n);
     7059    soap->tmpbuf[n] = '\0';
     7060    soap_push_ns(soap, soap->tmpbuf, NULL, 1);
     7061  }
     7062}
     7063#endif
     7064
     7065/******************************************************************************/
     7066#ifndef WITH_LEAN
     7067static void
     7068soap_pop_ns(struct soap *soap)
     7069{ soap_pop_namespace(soap);
    54877070}
    54887071#endif
     
    54947077SOAP_FMAC2
    54957078soap_element(struct soap *soap, const char *tag, int id, const char *type)
    5496 { struct Namespace *ns = soap->local_namespaces;
    5497   DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element begin tag='%s' id='%d' type='%s'\n", tag, id, type?type:""));
    5498 /**/
     7079{
     7080#ifdef WITH_XMLNS
     7081  register const char *s;
     7082#endif
     7083  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element begin tag='%s' id='%d' type='%s'\n", tag, id, type?type:SOAP_STR_EOS));
    54997084#ifdef WITH_DOM
     7085  if (soap->part == SOAP_BEGIN_SECURITY && (soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_DOM_ASIS))
     7086  { register struct soap_nlist *np;
     7087    /* wsu:Id found: clear xmlns renderings, so re-emit them for exc-c14n */
     7088    for (np = soap->nlist; np; np = np->next)
     7089    { if (np->index == 2)
     7090        np->index = 0;
     7091    }
     7092  }
    55007093  if (soap->mode & SOAP_XML_DOM)
    5501   { register struct soap_dom_element *p, *e = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element));
    5502     e->next = NULL;
    5503     e->prnt = soap->dom;
    5504     e->nstr = NULL;
    5505     e->name = soap_strdup(soap, tag); /* check EOM? */
    5506     e->data = NULL;
    5507     e->type = 0;
    5508     e->node = NULL;
    5509     e->elts = NULL;
    5510     e->atts = NULL;
     7094  { register struct soap_dom_element *elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element));
     7095    if (!elt)
     7096      return soap->error;
     7097    elt->soap = soap;
     7098    elt->next = NULL;
     7099    elt->prnt = soap->dom;
     7100    elt->name = soap_strdup(soap, tag);
     7101    elt->elts = NULL;
     7102    elt->atts = NULL;
     7103    elt->nstr = NULL;
     7104    elt->data = NULL;
     7105    elt->wide = NULL;
     7106    elt->node = NULL;
     7107    elt->type = 0;
     7108    elt->head = NULL;
     7109    elt->tail = NULL;
    55117110    if (soap->dom)
    5512     { p = soap->dom->elts;
     7111    { struct soap_dom_element *p = soap->dom->elts;
    55137112      if (p)
    55147113      { while (p->next)
    55157114          p = p->next;
    5516         p->next = e;
     7115        p->next = elt;
    55177116      }
    55187117      else
    5519         soap->dom->elts = e;
    5520     }
    5521     soap->dom = e;
     7118        soap->dom->elts = elt;
     7119    }
     7120    soap->dom = elt;
    55227121  }
    55237122  else
    5524 #endif
    5525 {
    5526   soap->level++;
    5527   if (!soap->ns && !(soap->mode & SOAP_XML_CANONICAL))
    5528     if (soap_send(soap, soap->prolog ? soap->prolog : "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"))
     7123  {
     7124#endif
     7125    soap->level++;
     7126#ifndef WITH_LEAN
     7127    if (!soap->ns)
     7128    { if (!(soap->mode & SOAP_XML_CANONICAL)
     7129       && soap_send(soap, soap->prolog ? soap->prolog : "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"))
     7130        return soap->error;
     7131    }
     7132    else if (soap->mode & SOAP_XML_INDENT)
     7133    { if (soap->ns == 1 && soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1))
     7134        return soap->error;
     7135      soap->body = 1;
     7136    }
     7137#endif
     7138#ifdef WITH_XMLNS
     7139    s = strchr(tag, ':');
     7140    if (s && strncmp(tag, "SOAP-ENV", s - tag))
     7141    { struct Namespace *ns = soap->local_namespaces;
     7142      size_t n = s - tag;
     7143      if (soap_send_raw(soap, "<", 1)
     7144       || soap_send(soap, s + 1))
     7145        return soap->error;
     7146      if (soap->nlist && !strncmp(soap->nlist->id, tag, n) && !soap->nlist->id[n])
     7147        ns = NULL;
     7148      for (; ns && ns->id; ns++)
     7149      { if (*ns->id && (ns->out || ns->ns) && !strncmp(ns->id, tag, n) && !ns->id[n])
     7150        { soap_push_ns(soap, ns->id, ns->out ? ns->out : ns->ns, 0);
     7151          if (soap_attribute(soap, "xmlns", ns->out ? ns->out : ns->ns))
     7152            return soap->error;
     7153          break;
     7154        }
     7155      }   
     7156    }
     7157    else
     7158#endif
     7159    if (soap_send_raw(soap, "<", 1)
     7160     || soap_send(soap, tag))
    55297161      return soap->error;
    5530   if (soap_send_raw(soap, "<", 1)
    5531    || soap_send(soap, tag))
    5532     return soap->error;
    5533 }
    5534 /**/
     7162#ifdef WITH_DOM
     7163  }
     7164#endif
    55357165  if (!soap->ns)
    5536   { for (ns = soap->local_namespaces; ns && ns->id; ns++)
     7166  { struct Namespace *ns;
     7167    for (ns = soap->local_namespaces; ns && ns->id; ns++)
    55377168    { if (*ns->id && (ns->out || ns->ns))
    55387169      { sprintf(soap->tmpbuf, "xmlns:%s", ns->id);
     
    55417172      }
    55427173    }   
    5543     soap->ns = 1;
    5544   }
     7174  }
     7175  soap->ns = 1; /* namespace table control: ns = 0 or 2 to start, then 1 to stop dumping the table  */
     7176#ifndef WITH_LEAN
     7177  if (soap->mode & SOAP_XML_CANONICAL)
     7178  { const char *t = strchr(tag, ':');
     7179    if (t)
     7180      soap_utilize_ns(soap, tag, t - tag);
     7181  }
     7182#endif
    55457183  if (id > 0)
    55467184  { sprintf(soap->tmpbuf, "_%d", id);
     
    55487186      return soap->error;
    55497187  }
    5550   if (type && *type)
     7188  if (type && *type && (!(soap->mode & SOAP_XML_SEC) || soap->part == SOAP_IN_BODY))
    55517189  { if (soap_attribute(soap, "xsi:type", type))
    55527190      return soap->error;
     7191#ifndef WITH_LEAN
     7192    if (soap->mode & SOAP_XML_CANONICAL)
     7193    { const char *t = strchr(type, ':');
     7194      if (t)
     7195        soap_utilize_ns(soap, type, t - type);
     7196    }
     7197#endif
    55537198  }
    55547199  if (soap->null && soap->position > 0)
    5555   { int i;
     7200  { register int i;
    55567201    sprintf(soap->tmpbuf, "[%d", soap->positions[0]);
    55577202    for (i = 1; i < soap->position; i++)
     
    55857230  soap->null = 0;
    55867231  soap->position = 0;
     7232  if (soap->part == SOAP_BEGIN_SECURITY && (soap->mode & SOAP_XML_CANONICAL))
     7233    soap->part = SOAP_IN_SECURITY;
    55877234  return SOAP_OK;
    55887235}
     
    56397286      s++;
    56407287    while ((c = *s) && c >= '0' && c <= '9')
    5641     { if (n > 214748364)
     7288    { if (n >= 214748364 && (n > 214748364 || c >= '8'))
    56427289        break;
    56437290      n *= 10;
     
    56857332      s++;
    56867333    while ((c = *s) && c >= '0' && c <= '9')
    5687     { if (n > 429496729)
     7334    { if (n >= 429496729 && (n > 429496729 || c >= '6'))
    56887335        break;
    56897336      n *= 10;
     
    57407387      return soap->error;
    57417388  }
     7389#ifndef WITH_LEAN
     7390  if (type && *type && (soap->mode & SOAP_XML_CANONICAL))
     7391  { const char *s = strchr(type, ':');
     7392    if (s)
     7393      soap_utilize_ns(soap, type, s - type);
     7394  }
     7395#endif
    57427396  return soap_element_start_end_out(soap, NULL);
    57437397}
     
    57517405soap_element_start_end_out(struct soap *soap, const char *tag)
    57527406{ register struct soap_attribute *tp;
    5753 /**/
     7407#ifndef WITH_LEAN
     7408  if (soap->mode & SOAP_XML_CANONICAL)
     7409  { struct soap_nlist *np;
     7410    for (tp = soap->attributes; tp; tp = tp->next)
     7411    { if (tp->visible && tp->name)
     7412      { const char *s = strchr(tp->name, ':');
     7413        if (s)
     7414          soap_utilize_ns(soap, tp->name, s - tp->name);
     7415      }
     7416    }
     7417    for (np = soap->nlist; np; np = np->next)
     7418    { if (np->index == 1 && np->ns)
     7419      { sprintf(soap->tmpbuf, "xmlns:%s", np->id);
     7420        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enabling utilized binding (level=%u) %s='%s'\n", np->level, soap->tmpbuf, np->ns));
     7421        soap_set_attr(soap, soap->tmpbuf, np->ns);
     7422        np->index = 2;
     7423      }
     7424    }
     7425  }
     7426#endif
    57547427#ifdef WITH_DOM
    57557428  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
    5756   { for (tp = soap->attributes; tp; tp = tp->next)
     7429  { register struct soap_dom_attribute **att;
     7430    att = &soap->dom->atts;
     7431    for (tp = soap->attributes; tp; tp = tp->next)
    57577432    { if (tp->visible)
    5758       { register struct soap_dom_attribute *a = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute));
    5759         a->next = soap->dom->atts;
    5760         a->nstr = NULL;
    5761         a->name = soap_strdup(soap, tp->name); /* check EOM */
    5762         a->data = soap_strdup(soap, tp->value); /* check EOM */
    5763         a->wide = NULL;
    5764         soap->dom->atts = a;
     7433      { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute));
     7434        if (!*att)
     7435          return soap->error;
     7436        (*att)->next = NULL;
     7437        (*att)->nstr = NULL;
     7438        (*att)->name = soap_strdup(soap, tp->name);
     7439        (*att)->data = soap_strdup(soap, tp->value);
     7440        (*att)->wide = NULL;
     7441        (*att)->soap = soap;
     7442        att = &(*att)->next;
    57657443        tp->visible = 0;
    57667444      }
     
    57697447  }
    57707448#endif
    5771 /**/
    57727449  for (tp = soap->attributes; tp; tp = tp->next)
    57737450  { if (tp->visible)
    5774     { if (soap_send2(soap, " ", tp->name))
     7451    {
     7452#ifdef WITH_XMLNS
     7453      const char *s = strchr(tp->name, ':');
     7454      if (s)
     7455      { size_t n = s - tp->name;
     7456        if (soap->nlist && !strncmp(soap->nlist->id, tp->name, n) && !soap->nlist->id[n])
     7457          s++;
     7458        else
     7459          s = tp->name;
     7460        if (soap_send(soap, " ") || soap_send(soap, s))
     7461          return soap->error;
     7462      }
     7463      else
     7464#endif
     7465      if (soap_send(soap, " ") || soap_send(soap, tp->name))
    57757466        return soap->error;
    57767467      if (tp->visible == 2 && tp->value)
    57777468        if (soap_send_raw(soap, "=\"", 2)
    5778         || soap_string_out(soap, tp->value, 1)
    5779         || soap_send_raw(soap, "\"", 1))
     7469        || soap_string_out(soap, tp->value, 1)
     7470        || soap_send_raw(soap, "\"", 1))
    57807471          return soap->error;
    57817472      tp->visible = 0;
     
    57837474  }
    57847475  if (tag)
    5785   { soap->level--;
     7476  {
    57867477#ifndef WITH_LEAN
    57877478    if (soap->mode & SOAP_XML_CANONICAL)
     
    57927483    }
    57937484#endif
    5794     return soap_send_raw(soap, "/>", 2);
     7485    soap->level--;      /* decrement level just before /> */
     7486    if (soap_send_raw(soap, "/>", 2))
     7487      return soap->error;
     7488    return SOAP_OK;
    57957489  }
    57967490  return soap_send_raw(soap, ">", 1);
     
    58077501    return SOAP_OK;
    58087502  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element ending tag='%s'\n", tag));
    5809 /**/
    58107503#ifdef WITH_DOM
    58117504  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
     
    58157508  }
    58167509#endif
    5817 /**/
    5818   soap->level--;
     7510#ifndef WITH_LEAN
     7511  if (soap->mode & SOAP_XML_CANONICAL)
     7512    soap_pop_ns(soap);
     7513  if (soap->mode & SOAP_XML_INDENT)
     7514  { if (!soap->body)
     7515    { if (soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1))
     7516        return soap->error;
     7517    }
     7518    soap->body = 0;
     7519  }
     7520#endif
     7521#ifdef WITH_XMLNS
     7522  { const char *s = strchr(tag, ':');
     7523    if (s && strncmp(tag, "SOAP-ENV", s - tag))
     7524    { soap_pop_ns(soap);
     7525      tag = s + 1;
     7526    }
     7527  }
     7528#endif
    58197529  if (soap_send_raw(soap, "</", 2)
    58207530   || soap_send(soap, tag))
    58217531    return soap->error;
     7532  soap->level--;        /* decrement level just before > */
    58227533  return soap_send_raw(soap, ">", 1);
    58237534}
     
    58317542soap_element_ref(struct soap *soap, const char *tag, int id, int href)
    58327543{ register int n = 0;
     7544  const char *s = "href";
    58337545  if (soap->version == 2)
     7546  { s = "SOAP-ENC:ref";
    58347547    n = 1;
     7548  }
    58357549  sprintf(soap->href, "#_%d", href);
    5836   return soap_element_href(soap, tag, id, "href" + n, soap->href + n);
     7550  return soap_element_href(soap, tag, id, s, soap->href + n);
    58377551}
    58387552#endif
     
    58667580  { if (soap_element(soap, tag, id, type))
    58677581      return soap->error;
    5868     if (soap->part != SOAP_IN_HEADER && soap->encodingStyle)
    5869       if (soap_attribute(soap, "xsi:nil", "true"))
    5870         return soap->error;
     7582    if (!tp && soap_attribute(soap, "xsi:nil", "true"))
     7583      return soap->error;
    58717584    return soap_element_start_end_out(soap, tag);
    58727585  }
     
    58847597SOAP_FMAC2
    58857598soap_element_id(struct soap *soap, const char *tag, int id, const void *p, const struct soap_array *a, int n, const char *type, int t)
    5886 { struct soap_plist *pp;
    5887   if (!p || (a && !a->__ptr))
     7599{ if (!p || (a && !a->__ptr))
    58887600  { soap_element_null(soap, tag, id, type);
    58897601    return -1;
    58907602  }
     7603#ifndef WITH_NOIDREF
    58917604  if (soap->mode & SOAP_XML_TREE)
    58927605    return 0;
    58937606  if (id < 0)
    5894   { if (a)
     7607  { struct soap_plist *pp;
     7608    if (a)
    58957609      id = soap_array_pointer_lookup(soap, p, a, n, t, &pp);
    58967610    else
     
    59077621  }
    59087622  return id;
     7623#else
     7624  return 0;
     7625#endif
    59097626}
    59107627#endif
     
    59177634soap_element_result(struct soap *soap, const char *tag)
    59187635{ if (soap->version == 2 && soap->encodingStyle)
    5919     if (soap_element(soap, "SOAP-RPC:result", 0, NULL)
     7636  { if (soap_element(soap, "SOAP-RPC:result", 0, NULL)
    59207637     || soap_attribute(soap, "xmlns:SOAP-RPC", soap_rpc)
    59217638     || soap_element_start_end_out(soap, NULL)
     
    59237640     || soap_element_end_out(soap, "SOAP-RPC:result"))
    59247641      return soap->error;
     7642  }
    59257643  return SOAP_OK;
     7644}
     7645#endif
     7646
     7647/******************************************************************************/
     7648#ifndef PALM_1
     7649SOAP_FMAC1
     7650void
     7651SOAP_FMAC2
     7652soap_check_result(struct soap *soap, const char *tag)
     7653{ if (soap->version == 2 && soap->encodingStyle)
     7654  { soap_instring(soap, ":result", NULL, NULL, 0, 2, -1, -1);
     7655    /* just ignore content for compliance reasons, but should compare tag to element's QName value? */
     7656  }
    59267657}
    59277658#endif
     
    59347665soap_attribute(struct soap *soap, const char *name, const char *value)
    59357666{
    5936 /**/
    59377667#ifdef WITH_DOM
    5938   if ((soap->mode & SOAP_XML_DOM) && soap->dom)
     7668  if ((soap->mode & SOAP_XML_DOM) && !(soap->mode & SOAP_XML_CANONICAL) && soap->dom)
    59397669  { register struct soap_dom_attribute *a = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute));
     7670    if (!a)
     7671      return soap->error;
    59407672    a->next = soap->dom->atts;
    59417673    a->nstr = NULL;
    5942     a->name = soap_strdup(soap, name); /* check EOM */
    5943     a->data = soap_strdup(soap, value); /* check EOM */
     7674    a->name = soap_strdup(soap, name);
     7675    a->data = soap_strdup(soap, value);
    59447676    a->wide = NULL;
     7677    a->soap = soap;
    59457678    soap->dom->atts = a;
    59467679    return SOAP_OK;
    59477680  }
    59487681#endif
    5949 /**/
    59507682#ifndef WITH_LEAN
    59517683  if (soap->mode & SOAP_XML_CANONICAL)
    5952   { if (soap_set_attr(soap, name, value))
     7684  { /* TODO: consider using this code to handle default namespace bindings
     7685    if (!strncmp(name, "xmlns", 5) && (name[5] == ':' || name[5] == '\0'))
     7686    { if (name[5] == ':')
     7687        soap_push_ns(soap, name + 6, value, 0);
     7688      else
     7689        soap_push_ns(soap, "", value, 0);
     7690    }
     7691    */
     7692    if (!strncmp(name, "xmlns:", 6))
     7693      soap_push_ns(soap, name + 6, value, 0);
     7694    else if (soap_set_attr(soap, name, value))
    59537695      return soap->error;
    59547696  }
    59557697  else
    59567698#endif
    5957   { if (soap_send2(soap, " ", name))
     7699  { if (soap_send(soap, " ") || soap_send(soap, name))
    59587700      return soap->error;
    59597701    if (value)
     
    59727714int
    59737715SOAP_FMAC2
    5974 soap_element_begin_in(struct soap *soap, const char *tag, int nillable)
     7716soap_element_begin_in(struct soap *soap, const char *tag, int nillable, const char *type)
    59757717{ if (!soap_peek_element(soap))
    59767718  { if (soap->other)
     
    59807722    if (!(soap->error = soap_match_tag(soap, soap->tag, tag)))
    59817723    { soap->peeked = 0;
     7724      if (type && *soap->type && soap_match_tag(soap, soap->type, type))
     7725        return soap->error = SOAP_TYPE;
     7726      if (!nillable && soap->null && (soap->mode & SOAP_XML_STRICT))
     7727        return soap->error = SOAP_NULL;
    59827728      if (soap->body)
    59837729        soap->level++;
    5984       DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin element found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag?tag:"" ));
    5985       if (!nillable && soap->null && (soap->mode & SOAP_XML_STRICT))
    5986         return soap->error = SOAP_NULL;
    5987     }
    5988   }
     7730      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin element found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag?tag:SOAP_STR_EOS ));
     7731    }
     7732  }
     7733  else if (soap->error == SOAP_NO_TAG && tag && *tag == '-')
     7734    soap->error = SOAP_OK;
    59897735  return soap->error;
    59907736}
     
    59997745{ register soap_wchar c;
    60007746  register char *s;
    6001   register const char *t;
     7747  register int n = 0;
    60027748  if (tag && *tag == '-')
    60037749    return SOAP_OK;
    6004   soap->level--;
    6005   soap_pop_namespace(soap);
     7750  if (soap->error == SOAP_NO_TAG)
     7751    soap->error = SOAP_OK;
     7752#ifdef WITH_DOM
     7753  /* this whitespace or mixed content is not insignificant for DOM */
     7754  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
     7755  { if (!soap->peeked && !soap_string_in(soap, 3, -1, -1))
     7756      return soap->error;
     7757    if (soap->dom->prnt)
     7758      soap->dom = soap->dom->prnt;
     7759  }
     7760#endif
    60067761  if (soap->peeked)
    6007   { if (*soap->tag == '\0')
    6008     { soap->peeked = 0;
    6009       if (soap->error == SOAP_NO_TAG || soap->error == SOAP_TAG_END)
    6010         soap->error = SOAP_OK;
    6011     }
    6012     else
    6013       return soap->error = SOAP_TAG_END;
    6014   }
    6015   else
     7762  { if (*soap->tag)
     7763      n++;
     7764    soap->peeked = 0;
     7765  }
     7766  do
    60167767  { while (((c = soap_get(soap)) != SOAP_TT))
    60177768    { if ((int)c == EOF)
    60187769        return soap->error = SOAP_EOF;
    60197770      if (c == SOAP_LT)
    6020         return soap->error = SOAP_TAG_END;
    6021     }
    6022   }
     7771        n++;
     7772      else if (c == '/')
     7773      { c = soap_get(soap);
     7774        if (c == SOAP_GT)
     7775          n--;
     7776        else
     7777          soap_unget(soap, c);
     7778      }
     7779    }
     7780  } while (n--);
    60237781  s = soap->tag;
    6024   do c = soap_get(soap);
    6025   while (soap_blank(c));
    6026   do
    6027   { *s++ = (char)c;
    6028     c = soap_get(soap);
    6029   } while (soap_notblank(c));
     7782  n = sizeof(soap->tag);
     7783  while (soap_notblank(c = soap_get(soap)))
     7784  { if (--n > 0)
     7785      *s++ = (char)c;
     7786  }
    60307787  *s = '\0';
    60317788  if ((int)c == EOF)
     
    60357792  if (c != SOAP_GT)
    60367793    return soap->error = SOAP_SYNTAX_ERROR;
    6037   DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End element found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag?tag:""));
    6038   if (!tag)
    6039     return SOAP_OK;
    6040   if ((s = strchr(soap->tag, ':')))
    6041     s++;
    6042   else
    6043     s = soap->tag;
    6044   if ((t = strchr(tag, ':')))
    6045     t++;
    6046   else
    6047     t = tag;
    6048   if (!SOAP_STRCMP(s, t))
    6049     return SOAP_OK;
    6050   DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End element tag name does not match\n"));
    6051   return soap->error = SOAP_SYNTAX_ERROR;
     7794  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End element found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag?tag:SOAP_STR_EOS));
     7795#ifndef WITH_LEAN
     7796  if (tag && (soap->mode & SOAP_XML_STRICT))
     7797  { soap_pop_namespace(soap);
     7798    if (soap_match_tag(soap, soap->tag, tag))
     7799    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End element tag name does not match\n"));
     7800      return soap->error = SOAP_SYNTAX_ERROR;
     7801    }
     7802  }
     7803#endif
     7804  soap->level--;
     7805  return SOAP_OK;
    60527806}
    60537807#endif
     
    60607814soap_attr_value(struct soap *soap, const char *name, int flag)
    60617815{ register struct soap_attribute *tp;
     7816  if (*name == '-')
     7817    return SOAP_STR_EOS;
    60627818  for (tp = soap->attributes; tp; tp = tp->next)
    6063     if (!soap_match_tag(soap, tp->name, name))
     7819  { if (tp->visible && !soap_match_tag(soap, tp->name, name))
    60647820      break;
    6065   if (tp && tp->visible == 2)
     7821  }
     7822  if (tp)
    60667823  { if (flag == 2 && (soap->mode & SOAP_XML_STRICT))
    60677824      soap->error = SOAP_PROHIBITED;
     
    60827839soap_set_attr(struct soap *soap, const char *name, const char *value)
    60837840{ register struct soap_attribute *tp;
    6084   DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set attribute %s='%s'\n", name, value?value:""));
     7841  if (*name == '-')
     7842    return SOAP_OK;
     7843  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set attribute %s='%s'\n", name, value?value:SOAP_STR_EOS));
    60857844  for (tp = soap->attributes; tp; tp = tp->next)
    6086     if (!strcmp(tp->name, name))
     7845  { if (!strcmp(tp->name, name))
    60877846      break;
     7847  }
    60887848  if (!tp)
    60897849  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute %s\n", name));
    6090     if (!(tp = (struct soap_attribute*)SOAP_MALLOC(sizeof(struct soap_attribute) + strlen(name))))
     7850    if (!(tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + strlen(name))))
    60917851      return soap->error = SOAP_EOM;
    60927852    tp->ns = NULL;
     
    60957855    { struct soap_attribute **tpp = &soap->attributes;
    60967856      const char *s = strchr(name, ':');
     7857      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inserting attribute %s for c14n\n", name))
    60977858      if (!strncmp(name, "xmlns", 5))
    60987859      { for (; *tpp; tpp = &(*tpp)->next)
     
    61087869      { int k;
    61097870        for (; *tpp; tpp = &(*tpp)->next)
    6110         { if (!strncmp((*tpp)->name, "xmlns:", 6) && !strncmp((*tpp)->name + 6, name, s - name) && !(*tpp)->name[6 + s - name])
    6111           { if (!tp->ns)
    6112             { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Canonicalization: prefix %s=%p(%s)\n", name, (*tpp)->ns, (*tpp)->ns));
    6113               tp->ns = (*tpp)->ns;
    6114             }
    6115           }
     7871        { if (!strncmp((*tpp)->name, "xmlns:", 6) && !strncmp((*tpp)->name + 6, name, s - name) && !(*tpp)->name[6 + s - name])
     7872          { if (!tp->ns)
     7873            { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Canonicalization: prefix %s=%p (%s)\n", name, (*tpp)->ns, (*tpp)->ns));
     7874              tp->ns = (*tpp)->ns;
     7875            }
     7876          }
    61167877          else if (strncmp((*tpp)->name, "xmlns", 5) && (*tpp)->ns && tp->ns && ((k = strcmp((*tpp)->ns, tp->ns)) > 0 || (!k && strcmp((*tpp)->name, name) > 0)))
    61177878            break;
     
    61297890    tp->value = NULL;
    61307891  }
     7892  else if (tp->visible)
     7893  { return SOAP_OK;
     7894  }
    61317895  else if (value && tp->value && tp->size <= strlen(value))
    61327896  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute value of %s (free %p)\n", name, tp->value));
    6133     SOAP_FREE(tp->value);
     7897    SOAP_FREE(soap, tp->value);
    61347898    tp->value = NULL;
    61357899    tp->ns = NULL;
     
    61387902  { if (!tp->value)
    61397903    { tp->size = strlen(value) + 1;
    6140       if (!(tp->value = (char*)SOAP_MALLOC(tp->size)))
     7904      if (!(tp->value = (char*)SOAP_MALLOC(soap, tp->size)))
    61417905        return soap->error = SOAP_EOM;
    6142       DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute value of %s (%p)\n", tp->name, tp->value));
     7906      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute value for %s (%p)\n", tp->name, tp->value));
    61437907    }
    61447908    strcpy(tp->value, value);
     
    61467910      tp->ns = tp->value;
    61477911    tp->visible = 2;
     7912#ifndef WITH_LEAN
     7913    if (!strcmp(name, "wsu:Id"))
     7914    { soap->part = SOAP_BEGIN_SECURITY;
     7915      strncpy(soap->id, value, sizeof(soap->id));
     7916      soap->id[sizeof(soap->id)-1] = '\0';
     7917    }
     7918#endif
    61487919  }
    61497920  else
     
    61617932{ register struct soap_attribute *tp;
    61627933#ifndef WITH_LEAN
    6163   if (soap->mode & SOAP_XML_CANONICAL)
     7934  if ((soap->mode & SOAP_XML_CANONICAL))
    61647935  { while (soap->attributes)
    61657936    { tp = soap->attributes->next;
    6166       SOAP_FREE(soap->attributes->value);
    6167       SOAP_FREE(soap->attributes);
     7937      if (soap->attributes->value)
     7938        SOAP_FREE(soap, soap->attributes->value);
     7939      SOAP_FREE(soap, soap->attributes);
    61687940      soap->attributes = tp;
    61697941    }
     
    61817953static int
    61827954soap_getattrval(struct soap *soap, char *s, size_t n, soap_wchar d)
    6183 { size_t i;
    6184   soap_wchar c;
     7955{ register size_t i;
    61857956  for (i = 0; i < n; i++)
    6186   { c = soap_getutf8(soap);
     7957  { register soap_wchar c = soap_get(soap);
    61877958    switch (c)
    61887959    {
     
    62398010#ifdef WITH_FAST
    62408011#ifndef PALM_2
    6241 static int
     8012SOAP_FMAC1
     8013int
     8014SOAP_FMAC2
     8015soap_store_lab(struct soap *soap, const char *s, size_t n)
     8016{ soap->labidx = 0;
     8017  return soap_append_lab(soap, s, n);
     8018}
     8019#endif
     8020#endif
     8021
     8022/******************************************************************************/
     8023#ifdef WITH_FAST
     8024#ifndef PALM_2
     8025SOAP_FMAC1
     8026int
     8027SOAP_FMAC2
    62428028soap_append_lab(struct soap *soap, const char *s, size_t n)
    62438029{ if (soap->labidx + n >= soap->lablen)
     
    62498035      soap->lablen <<= 1;
    62508036    DBGLOG(TEST, SOAP_MESSAGE(fdebug, ", new size=%lu\n", (unsigned long)soap->lablen));
    6251     soap->labbuf = (char*)SOAP_MALLOC(soap->lablen);
     8037    soap->labbuf = (char*)SOAP_MALLOC(soap, soap->lablen);
    62528038    if (!soap->labbuf)
    62538039    { if (t)
    6254         free(t);
     8040        SOAP_FREE(soap, t);
    62558041      return soap->error = SOAP_EOM;
    62568042    }
    6257     if (t && soap->labidx)
     8043    if (t)
    62588044    { memcpy(soap->labbuf, t, soap->labidx);
    6259       free(t);
     8045      SOAP_FREE(soap, t);
    62608046    }
    62618047  }
     
    62758061SOAP_FMAC2
    62768062soap_peek_element(struct soap *soap)
    6277 { register struct soap_attribute *tp;
     8063{
     8064#ifdef WITH_DOM
     8065  register struct soap_dom_attribute **att = NULL;
     8066  register char *lead = NULL;
     8067#endif
     8068  register struct soap_attribute *tp, *tq = NULL;
    62788069  const char *t;
    62798070  register char *s;
    62808071  register soap_wchar c;
    62818072  register int i;
    6282   if (soap->error == SOAP_NO_TAG || soap->error == SOAP_TAG_END || soap->error == SOAP_TAG_MISMATCH)
    6283     soap->error = SOAP_OK;      /* retry */
    62848073  if (soap->peeked)
    6285   { if (*soap->tag == '\0')
     8074  { if (!*soap->tag)
    62868075      return soap->error = SOAP_NO_TAG;
    62878076    return SOAP_OK;
    62888077  }
    62898078  soap->peeked = 1;
    6290   for (;;)
    6291   { while (((c = soap_getutf8(soap)) != SOAP_LT) && c != SOAP_TT)
    6292     { if ((int)c == EOF)
    6293         return soap->error = SOAP_EOF;
    6294     }
    6295     if (c == SOAP_TT)
    6296     { *soap->tag = '\0';
    6297       return soap->error = SOAP_NO_TAG; /* ending tag found */
    6298     }
    6299     s = soap->tag;
    6300     do c = soap_get(soap);
    6301     while (soap_blank(c));
    6302     i = sizeof(soap->tag);
    6303     while (c != '/' && soap_notblank(c))
    6304     { if (--i > 0)
    6305         *s++ = (char)c;
    6306       c = soap_get(soap);
    6307     }
    6308     while (soap_blank(c))
    6309       c = soap_get(soap);
    6310     *s = '\0';
    6311     if (*soap->tag != '?')
    6312       break;
    6313     DBGLOG(TEST, SOAP_MESSAGE(fdebug, "XML PI <%s?>\n", soap->tag));
    6314     while ((int)c != EOF && c != SOAP_GT && c != '?')
    6315     { s = soap->tmpbuf;
    6316       i = sizeof(soap->tmpbuf) - 2;
    6317       while (c != '=' && c != SOAP_GT && c != '?' && soap_notblank(c))
    6318       { if (--i > 0)
    6319           *s++ = (char)c;
    6320         c = soap_get(soap);
    6321       }
    6322       while (soap_blank(c))
    6323         c = soap_get(soap);
    6324       if (c == '=')
    6325       { *s++ = '=';
    6326         do c = soap_get(soap);
    6327         while (soap_blank(c));
    6328         if (c != SOAP_QT && c != SOAP_AP)
    6329         { soap_unget(soap, c);
    6330           c = ' '; /* blank delimiter */
    6331         }
    6332         if (soap_getattrval(soap, s, i, c) == SOAP_EOM)
    6333           while (soap_getattrval(soap, soap->tmpbuf, sizeof(soap->tmpbuf), c) == SOAP_EOM)
    6334             ;
    6335         else if (!strcmp(soap->tag, "?xml") && (!soap_tag_cmp(soap->tmpbuf, "encoding=iso-8859-1") || !soap_tag_cmp(soap->tmpbuf, "encoding=latin1")))
    6336         { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "XML latin1 encoding\n"));
    6337           soap->mode |= SOAP_ENC_LATIN;
    6338         }
    6339       }
    6340       do c = soap_get(soap);
    6341       while (soap_blank(c));
    6342     }
    6343   }
    63448079  soap->id[0] = '\0';
    63458080  soap->href[0] = '\0';
     
    63538088  soap->null = 0;
    63548089  soap->mustUnderstand = 0;
    6355   soap_clr_attr(soap);
    6356   while ((int)c != EOF && c != SOAP_GT && c != '/')
     8090  c = soap_getutf8(soap);
     8091#ifdef WITH_DOM
     8092  /* whitespace leading to start tag is not insignificant for DOM */
     8093  if (soap_blank(c))
     8094  { soap->labidx = 0;
     8095    do
     8096    { if (soap_append_lab(soap, NULL, 0))
     8097        return SOAP_EOM;
     8098      s = soap->labbuf + soap->labidx;
     8099      i = soap->lablen - soap->labidx;
     8100      soap->labidx = soap->lablen;
     8101      while (soap_blank(c) && i--)
     8102      { *s++ = c;
     8103        c = soap_getutf8(soap);
     8104      }
     8105    }
     8106    while (soap_blank(c));
     8107    *s = '\0';
     8108    lead = soap_strdup(soap, soap->labbuf);
     8109  }
     8110#else
     8111  while (soap_blank(c))
     8112    c = soap_getutf8(soap);
     8113#endif
     8114  if (c != SOAP_LT)
     8115  { *soap->tag = '\0';
     8116    if ((int)c == EOF)
     8117      return soap->error = SOAP_EOF;
     8118    soap_unget(soap, c);
     8119#ifdef WITH_DOM
     8120    /* whitespace leading to end tag is not insignificant for DOM */
     8121    if ((soap->mode & SOAP_XML_DOM) && soap->dom)
     8122      soap->dom->tail = soap_strdup(soap, lead);
     8123#endif
     8124    return soap->error = SOAP_NO_TAG;
     8125  }
     8126  s = soap->tag;
     8127  do c = soap_get1(soap);
     8128  while (soap_blank(c));
     8129  i = sizeof(soap->tag);
     8130  while (c != '>' && c != '/' && soap_notblank(c) && (int)c != EOF)
     8131  { if (--i > 0)
     8132      *s++ = (char)c;
     8133    c = soap_get1(soap);
     8134  }
     8135  while (soap_blank(c))
     8136    c = soap_get1(soap);
     8137  *s = '\0';
     8138#ifdef WITH_DOM
     8139  if (soap->mode & SOAP_XML_DOM)
     8140  { register struct soap_dom_element *elt;
     8141    elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element));
     8142    if (!elt)
     8143      return soap->error;
     8144    elt->next = NULL;
     8145    elt->nstr = NULL;
     8146    elt->name = soap_strdup(soap, soap->tag);
     8147    elt->prnt = soap->dom;
     8148    elt->elts = NULL;
     8149    elt->atts = NULL;
     8150    elt->data = NULL;
     8151    elt->wide = NULL;
     8152    elt->type = 0;
     8153    elt->node = NULL;
     8154    elt->head = lead;
     8155    elt->tail = NULL;
     8156    elt->soap = soap;
     8157    if (soap->dom)
     8158    { struct soap_dom_element *p = soap->dom->elts;
     8159      if (p)
     8160      { while (p->next)
     8161          p = p->next;
     8162        p->next = elt;
     8163      }
     8164      else
     8165        soap->dom->elts = elt;
     8166    }
     8167    soap->dom = elt;
     8168    att = &elt->atts;
     8169  }
     8170#endif
     8171  soap_pop_namespace(soap);
     8172  for (tp = soap->attributes; tp; tp = tp->next)
     8173    tp->visible = 0;
     8174  while ((int)c != EOF && c != '>' && c != '/')
    63578175  { s = soap->tmpbuf;
    63588176    i = sizeof(soap->tmpbuf);
    6359     while (c != '=' && c != '/' && soap_notblank(c))
     8177    while (c != '=' && c != '>' && c != '/' && soap_notblank(c) && (int)c != EOF)
    63608178    { if (--i > 0)
    63618179        *s++ = (char)c;
    6362       c = soap_get(soap);
     8180      c = soap_get1(soap);
    63638181    }
    63648182    *s = '\0';
    63658183    if (i == sizeof(soap->tmpbuf))
    63668184      return soap->error = SOAP_SYNTAX_ERROR;
    6367     if (!strncmp(soap->tmpbuf, "xmlns:", 6))
    6368     { soap->tmpbuf[5] = '\0';
    6369       t = soap->tmpbuf + 6;
    6370     }
    6371     else if (!strcmp(soap->tmpbuf, "xmlns"))
    6372       t = SOAP_STR_EOS;
     8185#ifdef WITH_DOM
     8186    /* add attribute name to dom */
     8187    if (att)
     8188    { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute));
     8189       if (!*att)
     8190         return soap->error;
     8191       (*att)->next = NULL;
     8192       (*att)->nstr = NULL;
     8193       (*att)->name = soap_strdup(soap, soap->tmpbuf);
     8194       (*att)->data = NULL;
     8195       (*att)->wide = NULL;
     8196       (*att)->soap = soap;
     8197    }
     8198#endif
     8199    if (!strncmp(soap->tmpbuf, "xmlns", 5))
     8200    { if (soap->tmpbuf[5] == ':')
     8201        t = soap->tmpbuf + 6;
     8202      else if (soap->tmpbuf[5])
     8203        t = NULL;
     8204      else
     8205        t = SOAP_STR_EOS;
     8206    }
    63738207    else
    63748208      t = NULL;
    6375     for (tp = soap->attributes; tp; tp = tp->next)
    6376       if (!SOAP_STRCMP(tp->name, soap->tmpbuf))
     8209    tq = NULL;
     8210    for (tp = soap->attributes; tp; tq = tp, tp = tp->next)
     8211    { if (!SOAP_STRCMP(tp->name, soap->tmpbuf))
    63778212        break;
     8213    }
    63788214    if (!tp)
    6379     { tp = (struct soap_attribute*)SOAP_MALLOC(sizeof(struct soap_attribute) + strlen(soap->tmpbuf));
     8215    { tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + strlen(soap->tmpbuf));
    63808216      if (!tp)
    63818217        return soap->error = SOAP_EOM;
     
    63838219      tp->value = NULL;
    63848220      tp->size = 0;
    6385       tp->next = soap->attributes;
    6386       soap->attributes = tp;
     8221      /* if attribute name is qualified, append it to the end of the list */
     8222      if (tq && strchr(soap->tmpbuf, ':'))
     8223      { tq->next = tp;
     8224        tp->next = NULL;
     8225      }
     8226      else
     8227      { tp->next = soap->attributes;
     8228        soap->attributes = tp;
     8229      }
    63878230    }
    63888231    while (soap_blank(c))
    6389       c = soap_get(soap);
     8232      c = soap_get1(soap);
    63908233    if (c == '=')
    6391     { do c = soap_get(soap);
     8234    { do c = soap_getutf8(soap);
    63928235      while (soap_blank(c));
    63938236      if (c != SOAP_QT && c != SOAP_AP)
     
    64018244          return soap->error;
    64028245        soap->error = SOAP_OK;
    6403         soap->labidx = 0;
    6404         if (soap_append_lab(soap, tp->value, tp->size))
    6405           return soap->error;
    6406         SOAP_FREE(tp->value);
    6407         for (;;)
    6408         { if (soap_getattrval(soap, soap->labbuf + soap->labidx, soap->lablen - soap->labidx, c))
    6409           { if (soap->error != SOAP_EOM)
    6410               return soap->error;
     8246        if (soap_store_lab(soap, tp->value, tp->size))
     8247          return soap->error;
     8248        if (tp->value)
     8249          SOAP_FREE(soap, tp->value);
     8250        for (;;)
     8251        { if (soap_getattrval(soap, soap->labbuf + soap->labidx, soap->lablen - soap->labidx, c))
     8252          { if (soap->error != SOAP_EOM)
     8253              return soap->error;
    64118254            soap->error = SOAP_OK;
    6412             soap->labidx = soap->lablen;
    6413             if (soap_append_lab(soap, NULL, 0))
    6414               return soap->error;
    6415           }
    6416           else
    6417             break;
    6418         }
    6419         tp->size = soap->lablen;
    6420         if (!(tp->value = (char*)SOAP_MALLOC(tp->size)))
    6421           return soap->error = SOAP_EOM;
    6422         memcpy(tp->value, soap->labbuf, soap->lablen);
     8255            soap->labidx = soap->lablen;
     8256            if (soap_append_lab(soap, NULL, 0))
     8257              return soap->error;
     8258          }
     8259          else
     8260            break;
     8261        }
     8262        if (soap->labidx)
     8263          tp->size = soap->lablen;
     8264        else
     8265        { tp->size = strlen(soap->labbuf) + 1;
     8266          if (tp->size < SOAP_LABLEN)
     8267            tp->size = SOAP_LABLEN;
     8268        }
     8269        if (!(tp->value = (char*)SOAP_MALLOC(soap, tp->size)))
     8270          return soap->error = SOAP_EOM;
     8271        strcpy(tp->value, soap->labbuf);
    64238272#else
    6424         size_t n;
     8273        size_t n;
    64258274        if (soap->error != SOAP_EOM)
    64268275          return soap->error;
    64278276        soap->error = SOAP_OK;
    6428         if (soap_new_block(soap))
     8277        if (soap_new_block(soap) == NULL)
    64298278          return soap->error;
    64308279        for (;;)
    6431         { if (!(s = (char*)soap_push_block(soap, SOAP_BLKLEN)))
     8280        { if (!(s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN)))
    64328281            return soap->error;
    64338282          if (soap_getattrval(soap, s, SOAP_BLKLEN, c))
     
    64398288            break;
    64408289        }
    6441         n = tp->size + soap->blist->size;
    6442         if (!(s = (char*)SOAP_MALLOC(n)))
     8290        n = tp->size + soap->blist->size;
     8291        if (!(s = (char*)SOAP_MALLOC(soap, n)))
    64438292          return soap->error = SOAP_EOM;
    64448293        if (tp->value)
    64458294        { memcpy(s, tp->value, tp->size);
    6446           SOAP_FREE(tp->value);
     8295          SOAP_FREE(soap, tp->value);
    64478296        }
    6448         soap_save_block(soap, s + tp->size, 0);
     8297        soap_save_block(soap, NULL, s + tp->size, 0);
    64498298        tp->value = s;
    64508299        tp->size = n;
    64518300#endif
    64528301      }
    6453       do c = soap_get(soap);
     8302      do c = soap_get1(soap);
    64548303      while (soap_blank(c));
    64558304      tp->visible = 2; /* seen this attribute w/ value */
     8305#ifdef WITH_DOM
     8306      if (att)
     8307        (*att)->data = soap_strdup(soap, tp->value);
     8308#endif
    64568309    }
    64578310    else
    64588311      tp->visible = 1; /* seen this attribute w/o value */
     8312#ifdef WITH_DOM
     8313    if (att)
     8314      att = &(*att)->next;
     8315#endif
    64598316    if (t && tp->value)
    64608317    { if (soap_push_namespace(soap, t, tp->value))
    64618318        return soap->error;
    6462       tp->visible = 0;
    6463     }
    6464   }
     8319    }
     8320  }
     8321#ifdef WITH_DOM
     8322  if (att)
     8323  { soap->dom->nstr = soap_current_namespace(soap, soap->tag);
     8324    for (att = &soap->dom->atts; *att; att = &(*att)->next)
     8325      (*att)->nstr = soap_current_namespace(soap, (*att)->name);
     8326  }
     8327#endif
    64658328  if ((int)c == EOF)
    64668329    return soap->error = SOAP_EOF;
     8330  if (!(soap->body = (c != '/')))
     8331    do c = soap_get1(soap);
     8332    while (soap_blank(c));
     8333#ifdef WITH_DOM
     8334  if (soap->mode & SOAP_XML_DOM)
     8335  { if (!soap->body && soap->dom->prnt)
     8336      soap->dom = soap->dom->prnt;
     8337  }
     8338#endif
    64678339  for (tp = soap->attributes; tp; tp = tp->next)
    64688340  { if (tp->visible && tp->value)
    6469     { if (!strcmp(tp->name, "id"))
    6470       { *soap->id = '#';
    6471         strncpy(soap->id + 1, tp->value, sizeof(soap->id) - 2);
    6472         soap->id[sizeof(soap->id)-1] = '\0';
     8341    {
     8342#ifndef WITH_NOIDREF
     8343      if (!strcmp(tp->name, "id"))
     8344      { if ((soap->version > 0 && !(soap->mode & SOAP_XML_TREE))
     8345         || (soap->mode & SOAP_XML_GRAPH))
     8346        { *soap->id = '#';
     8347          strncpy(soap->id + 1, tp->value, sizeof(soap->id) - 2);
     8348          soap->id[sizeof(soap->id)-1] = '\0';
     8349        }
    64738350      }
    64748351      else if (!strcmp(tp->name, "href"))
    6475       { strncpy(soap->href, tp->value, sizeof(soap->href) - 1);
    6476         soap->href[sizeof(soap->href)-1] = '\0';
    6477       }
    6478       else if ((soap->version == 2 || (soap->mode & SOAP_XML_GRAPH)) && !strcmp(tp->name, "ref"))
    6479       { *soap->href = '#';
    6480         strncpy(soap->href + 1, tp->value, sizeof(soap->href) - 2);
    6481         soap->href[sizeof(soap->href)-1] = '\0';
    6482       }
    6483       else if (!soap_match_tag(soap, tp->name, "xsi:type"))
     8352      { if (soap->version == 1
     8353         || (soap->mode & SOAP_XML_GRAPH)
     8354         || (soap->mode & SOAP_ENC_MTOM))
     8355        { strncpy(soap->href, tp->value, sizeof(soap->href) - 1);
     8356          soap->href[sizeof(soap->href)-1] = '\0';
     8357        }
     8358      }
     8359      else
     8360#endif
     8361      if (!soap_match_tag(soap, tp->name, "xsi:type"))
    64848362      { strncpy(soap->type, tp->value, sizeof(soap->type) - 1);
    64858363        soap->type[sizeof(soap->type)-1] = '\0';
    64868364      }
    6487       else if (soap->version == 1 && !soap_match_tag(soap, tp->name, "SOAP-ENC:arrayType"))
    6488       { s = soap_strrchr(tp->value, '[');
    6489         if (s && (size_t)(s - tp->value) < sizeof(soap->arrayType))
    6490         { strncpy(soap->arrayType, tp->value, s - tp->value);
    6491           soap->arrayType[s - tp->value] = '\0';
    6492           strncpy(soap->arraySize, s, sizeof(soap->arraySize) - 1);
    6493         }
    6494         else
    6495           strncpy(soap->arrayType, tp->value, sizeof(soap->arrayType) - 1);
    6496         soap->arraySize[sizeof(soap->arrayType)-1] = '\0';
    6497         soap->arrayType[sizeof(soap->arrayType)-1] = '\0';
    6498       }
    6499       else if (soap->version == 2 && !soap_match_tag(soap, tp->name, "SOAP-ENC:itemType"))
    6500         strncpy(soap->arrayType, tp->value, sizeof(soap->arrayType) - 1);
    6501       else if (soap->version == 2 && !soap_match_tag(soap, tp->name, "SOAP-ENC:arraySize"))
    6502         strncpy(soap->arraySize, tp->value, sizeof(soap->arraySize) - 1);
    6503       else if (soap->version == 1 && !soap_match_tag(soap, tp->name, "SOAP-ENC:offset"))
    6504         strncpy(soap->arrayOffset, tp->value, sizeof(soap->arrayOffset));
    6505       else if (soap->version == 1 && !soap_match_tag(soap, tp->name, "SOAP-ENC:position"))
    6506         soap->position = soap_getposition(tp->value, soap->positions);
    6507       else if (soap->version == 1 && !soap_match_tag(soap, tp->name, "SOAP-ENC:root"))
    6508         soap->root = ((!strcmp(tp->value, "1") || !strcmp(tp->value, "true")));
    6509       else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:actor")
    6510             || !soap_match_tag(soap, tp->name, "SOAP-ENV:role"))
    6511       { if ((!soap->actor || strcmp(soap->actor, tp->value))
    6512          && strcmp(tp->value, "http://schemas.xmlsoap.org/soap/actor/next")
    6513          && strcmp(tp->value, "http://www.w3.org/2003/05/soap-envelope/role/next"))
    6514           soap->other = 1;
    6515       }
    6516       else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand")
    6517             && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true")))
    6518         soap->mustUnderstand = 1;
    65198365      else if ((!soap_match_tag(soap, tp->name, "xsi:null")
    65208366             || !soap_match_tag(soap, tp->name, "xsi:nil"))
    65218367            && (!strcmp(tp->value, "1")
    65228368             || !strcmp(tp->value, "true")))
    6523         soap->null = 1;
    6524     }
    6525   }
    6526   if (!(soap->body = (c != '/')))
    6527     do c = soap_get(soap);
    6528     while (soap_blank(c));
    6529   return SOAP_OK;
     8369      { soap->null = 1;
     8370      }
     8371      else if (soap->version == 1)
     8372      { if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arrayType"))
     8373        { s = soap_strrchr(tp->value, '[');
     8374          if (s && (size_t)(s - tp->value) < sizeof(soap->arrayType))
     8375          { strncpy(soap->arrayType, tp->value, s - tp->value);
     8376            soap->arrayType[s - tp->value] = '\0';
     8377            strncpy(soap->arraySize, s, sizeof(soap->arraySize) - 1);
     8378          }
     8379          else
     8380            strncpy(soap->arrayType, tp->value, sizeof(soap->arrayType) - 1);
     8381          soap->arraySize[sizeof(soap->arrayType)-1] = '\0';
     8382          soap->arrayType[sizeof(soap->arrayType)-1] = '\0';
     8383        }
     8384        else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:offset"))
     8385          strncpy(soap->arrayOffset, tp->value, sizeof(soap->arrayOffset));
     8386        else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:position"))
     8387          soap->position = soap_getposition(tp->value, soap->positions);
     8388        else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:root"))
     8389          soap->root = ((!strcmp(tp->value, "1") || !strcmp(tp->value, "true")));
     8390        else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand")
     8391              && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true")))
     8392          soap->mustUnderstand = 1;
     8393        else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:actor"))
     8394        { if ((!soap->actor || strcmp(soap->actor, tp->value))
     8395           && strcmp(tp->value, "http://schemas.xmlsoap.org/soap/actor/next"))
     8396            soap->other = 1;
     8397        }
     8398      }
     8399      else if (soap->version == 2)
     8400      {
     8401#ifndef WITH_NOIDREF
     8402        if (!strcmp(tp->name, "ref")
     8403         || !soap_match_tag(soap, tp->name, "SOAP-ENC:ref"))
     8404        { *soap->href = '#';
     8405          strncpy(soap->href + 1, tp->value, sizeof(soap->href) - 2);
     8406          soap->href[sizeof(soap->href)-1] = '\0';
     8407        }
     8408        else
     8409#endif
     8410        if (!soap_match_tag(soap, tp->name, "SOAP-ENC:itemType"))
     8411          strncpy(soap->arrayType, tp->value, sizeof(soap->arrayType) - 1);
     8412        else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arraySize"))
     8413          strncpy(soap->arraySize, tp->value, sizeof(soap->arraySize) - 1);
     8414        else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand")
     8415              && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true")))
     8416          soap->mustUnderstand = 1;
     8417        else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:role"))
     8418        { if ((!soap->actor || strcmp(soap->actor, tp->value))
     8419           && strcmp(tp->value, "http://www.w3.org/2003/05/soap-envelope/role/next"))
     8420            soap->other = 1;
     8421        }
     8422      }
     8423    }
     8424  }
     8425  return soap->error = SOAP_OK;
    65308426}
    65318427#endif
     
    65378433SOAP_FMAC2
    65388434soap_retry(struct soap *soap)
    6539 { soap->peeked = 1;
    6540   soap->error = SOAP_OK;
     8435{ soap->error = SOAP_OK;
     8436  soap_revert(soap);
    65418437}
    65428438#endif
     
    65658461{ register const char *t;
    65668462  register soap_wchar c;
    6567   register soap_wchar mask = 0x80000000;
     8463  register soap_wchar mask = (soap_wchar)0xFFFFFF80UL;
    65688464#ifdef WITH_DOM
    65698465  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
    6570   { soap->dom->data = soap_strdup(soap, s); /* check EOM */
     8466  { soap->dom->data = soap_strdup(soap, s);
    65718467    return SOAP_OK;
    65728468  }
     
    65788474  { switch (c)
    65798475    {
    6580     case 9:
     8476    case 0x09:
    65818477      if (flag)
    65828478      { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&#x9;", 5))
    6583           return soap->error;
     8479          return soap->error;
    65848480        s = t;
    65858481      }
    65868482      break;
    6587     case 10:
     8483    case 0x0A:
    65888484      if (flag || !(soap->mode & SOAP_XML_CANONICAL))
    65898485      { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&#xA;", 5))
    6590           return soap->error;
     8486          return soap->error;
    65918487        s = t;
    65928488      }
    65938489      break;
    6594     case 13:
     8490    case 0x0D:
    65958491      if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&#xD;", 5))
    65968492        return soap->error;
     
    66108506      if (!flag)
    66118507      { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&gt;", 4))
    6612           return soap->error;
     8508          return soap->error;
    66138509        s = t;
    66148510      }
     
    66178513      if (flag)
    66188514      { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&quot;", 6))
    6619           return soap->error;
     8515          return soap->error;
    66208516        s = t;
    66218517      }
    66228518      break;
    66238519    default:
     8520#ifndef WITH_LEANER
    66248521#ifdef HAVE_MBTOWC
    66258522      if (soap->mode & SOAP_C_MBSTRING)
     
    66298526        { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, wc))
    66308527            return soap->error;
    6631           s = t + m - 1;
    6632           continue;
     8528          s = t += m - 1;
     8529          continue;
    66338530        }
    66348531      }
    66358532#endif
    6636       if (c & mask)
     8533#endif
     8534#ifndef WITH_NOSTRINGTOUTF8
     8535      if ((c & mask) || !(c & 0xFFFFFFE0UL))
    66378536      { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned char)c))
    66388537          return soap->error;
    66398538        s = t;
    66408539      }
     8540#endif
    66418541    }
    66428542  }
     
    66558555  register size_t i;
    66568556  register long l = 0;
    6657   register int n = 0;
    6658   register int m = 0;
     8557  register int n = 0, f = 0, m = 0;
    66598558  register soap_wchar c;
    6660 #ifdef HAVE_WCTOMB
     8559#if !defined(WITH_LEANER) && defined(HAVE_WCTOMB)
    66618560  char buf[MB_LEN_MAX > 8 ? MB_LEN_MAX : 8];
    66628561#else
    66638562  char buf[8];
    66648563#endif
     8564  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Reading string content\n"));
     8565  if (soap->peeked)
     8566  { if (*soap->tag)
     8567    {
     8568#ifndef WITH_LEAN
     8569      struct soap_attribute *tp;
     8570      t = soap->tmpbuf;
     8571      *t = '<';
     8572      t[sizeof(soap->tmpbuf)-1] = '\0';
     8573      strncpy(t + 1, soap->tag, sizeof(soap->tmpbuf) - 2);
     8574      t += strlen(t);
     8575      for (tp = soap->attributes; tp; tp = tp->next)
     8576      { if (tp->visible)
     8577        { if (t >= soap->tmpbuf + sizeof(soap->tmpbuf) - 2)
     8578            break;
     8579          *t++ = ' ';
     8580          strcpy(t, tp->name);
     8581          t += strlen(t);
     8582          if (t >= soap->tmpbuf + sizeof(soap->tmpbuf) - 2)
     8583            break; /* too many or large attribute values */
     8584          if (tp->value)
     8585          { *t++ = '=';
     8586            *t++ = '"';
     8587            strcpy(t, tp->value);
     8588            t += strlen(t);
     8589            *t++ = '"';
     8590          }
     8591        }
     8592      }
     8593      if (!soap->body)
     8594        *t++ = '/';
     8595      *t++ = '>';
     8596      *t = '\0';
     8597      t = soap->tmpbuf;
     8598      m = (int)strlen(soap->tmpbuf);
     8599#endif
     8600      if (soap->body)
     8601        n = 1;
     8602      f = 1;
     8603      soap->peeked = 0;
     8604    }
     8605  }
    66658606#ifdef WITH_CDATA
    66668607  if (!flag)
     
    66698610    soap->labidx = 0;                   /* use look-aside buffer */
    66708611#else
    6671     if (soap_new_block(soap))
     8612    if (soap_new_block(soap) == NULL)
    66728613      return NULL;
    66738614#endif
     
    66838624#else
    66848625      register size_t k = SOAP_BLKLEN;
    6685       if (!(s = (char*)soap_push_block(soap, k)))
     8626      if (!(s = (char*)soap_push_block(soap, NULL, k)))
    66868627        return NULL;
    66878628#endif
     
    66898630      { if (m > 0)
    66908631        { *s++ = *t++;  /* copy multibyte characters */
    6691           m--;
     8632          m--;
    66928633          continue;
    66938634        }
    66948635        c = soap_getchar(soap);
    6695         if ((int)c == EOF)
     8636        if ((int)c == EOF)
    66968637          goto end;
    6697         if (c >= 0x80 && !(soap->mode & SOAP_ENC_LATIN))
     8638        if (c >= 0x80 && state != 1 && !(soap->mode & SOAP_ENC_LATIN))
    66988639        { soap_unget(soap, c);
    6699           c = soap_getutf8(soap);
    6700           if (soap->mode & SOAP_C_UTFSTRING)
     8640          c = soap_getutf8(soap);
     8641          if (soap->mode & SOAP_C_UTFSTRING)
    67018642          { if ((c & 0x80000000) && c >= -0x7FFFFF80 && c < SOAP_AP)
    67028643            { c &= 0x7FFFFFFF;
     
    67248665              }
    67258666              *t++ = (char)(0x80 | (c & 0x3F));
    6726               m = (int)(t - buf) - 1;
     8667              m = (int)(t - buf) - 1;
    67278668              t = buf;
    67288669              *s++ = *t++;
    67298670              continue;
    6730             }
     8671            }
    67318672          }
    67328673        }
    6733         switch (state)
     8674        switch (state)
    67348675        { case 1:
    67358676            if (c == ']')
    6736               state = 4;
    6737             *s++ = c;
    6738             continue;
    6739           case 2:
    6740             if (c == '-')
     8677              state = 4;
     8678            *s++ = c;
     8679            continue;
     8680          case 2:
     8681            if (c == '-')
    67418682              state = 6;
    6742             *s++ = c;
    6743             continue;
    6744           case 3:
    6745             if (c == '?')
    6746               state = 8;
    6747             *s++ = c;
    6748             continue;
     8683            *s++ = c;
     8684            continue;
     8685          case 3:
     8686            if (c == '?')
     8687              state = 8;
     8688            *s++ = c;
     8689            continue;
    67498690          /* CDATA */
    6750           case 4:
    6751             if (c == ']')
     8691          case 4:
     8692            if (c == ']')
    67528693              state = 5;
    6753             else
    6754               state = 1;
    6755             *s++ = c;
    6756             continue;
    6757           case 5:
    6758             if (c == '>')
    6759               state = 0;
    6760             else
    6761               state = 1;
    6762             *s++ = c;
    6763             continue;
     8694            else
     8695              state = 1;
     8696            *s++ = c;
     8697            continue;
     8698          case 5:
     8699            if (c == '>')
     8700              state = 0;
     8701            else
     8702              state = 1;
     8703            *s++ = c;
     8704            continue;
    67648705          /* comment */
    67658706          case 6:
    67668707            if (c == '-')
    6767               state = 7;
    6768             else
    6769               state = 2;
    6770             *s++ = c;
    6771             continue;
     8708              state = 7;
     8709            else
     8710              state = 2;
     8711            *s++ = c;
     8712            continue;
    67728713          case 7:
    67738714            if (c == '>')
    6774               state = 0;
    6775             else
    6776               state = 2;
    6777             *s++ = c;
    6778             continue;
     8715              state = 0;
     8716            else
     8717              state = 2;
     8718            *s++ = c;
     8719            continue;
    67798720          /* PI */
    6780           case 8:
     8721          case 8:
    67818722            if (c == '>')
    6782               state = 0;
    6783             else
    6784               state = 3;
    6785             *s++ = c;
    6786             continue;
     8723              state = 0;
     8724            else
     8725              state = 3;
     8726            *s++ = c;
     8727            continue;
    67878728        }
    67888729        switch (c)
     
    67988739          break;
    67998740        case '<':
    6800           c = soap_getchar(soap);
    6801           if (c == '/')
    6802           { if (n == 0)
    6803             { c = SOAP_TT;
    6804               goto end;
    6805             }
    6806             n--;
    6807           }
    6808           else if (c == '!')
    6809           { c = soap_getchar(soap);
    6810             if (c == '[')
     8741          c = soap_getchar(soap);
     8742          if (c == '/')
     8743          { if (n == 0)
     8744            { c = SOAP_TT;
     8745              goto end;
     8746            }
     8747            n--;
     8748          }
     8749          else if (c == '!')
     8750          { c = soap_getchar(soap);
     8751            if (c == '[')
    68118752            { do c = soap_getchar(soap);
    68128753              while ((int)c != EOF && c != '[');
    68138754              if ((int)c == EOF)
    68148755                 goto end;
    6815               t = (char*)"![CDATA[";
    6816               m = 8;
    6817               state = 1;
    6818             }
     8756              t = (char*)"![CDATA[";
     8757              m = 8;
     8758              state = 1;
     8759            }
    68198760            else if (c == '-')
    6820             { if ((c = soap_getchar(soap)) == '-')
    6821                 state = 2;
    6822               t = (char*)"!-";
    6823               m = 2;
    6824               soap_unget(soap, c);
    6825             }
    6826             else
    6827             { t = (char*)"!";
    6828               m = 1;
    6829               soap_unget(soap, c);
    6830             }
    6831             *s++ = '<';
    6832             break;
    6833           }
    6834           else if (c == '?')
    6835             state = 3;
    6836           else
    6837             n++;
     8761            { if ((c = soap_getchar(soap)) == '-')
     8762                state = 2;
     8763              t = (char*)"!-";
     8764              m = 2;
     8765              soap_unget(soap, c);
     8766            }
     8767            else
     8768            { t = (char*)"!";
     8769              m = 1;
     8770              soap_unget(soap, c);
     8771            }
     8772            *s++ = '<';
     8773            break;
     8774          }
     8775          else if (c == '?')
     8776            state = 3;
     8777          else
     8778            n++;
    68388779          soap_unget(soap, c);
    68398780          *s++ = '<';
     
    68468787          break;
    68478788        default:
     8789#ifndef WITH_LEANER
    68488790#ifdef HAVE_WCTOMB
    68498791          if (soap->mode & SOAP_C_MBSTRING)
    68508792          { m = wctomb(buf, c & 0x7FFFFFFF);
    6851             if (m >= 1)
     8793            if (m >= 1 && m <= (int)MB_CUR_MAX)
    68528794            { t = buf;
    68538795              *s++ = *t++;
     
    68558797            }
    68568798            else
    6857               *s++ = SOAP_UNKNOWN_CHAR;
     8799            { *s++ = SOAP_UNKNOWN_CHAR;
     8800              m = 0;
     8801            }
    68588802          }
    68598803          else
    68608804#endif
     8805#endif
    68618806            *s++ = (char)(c & 0xFF);
    68628807        }
    6863         l++;
     8808        l++;
    68648809        if ((soap->mode & SOAP_XML_STRICT) && maxlen >= 0 && l > maxlen)
    68658810        { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen));
     
    68748819  soap->labidx = 0;                     /* use look-aside buffer */
    68758820#else
    6876   if (soap_new_block(soap))
     8821  if (soap_new_block(soap) == NULL)
    68778822    return NULL;
    68788823#endif
     
    68888833#else
    68898834    register size_t k = SOAP_BLKLEN;
    6890     if (!(s = (char*)soap_push_block(soap, k)))
     8835    if (!(s = (char*)soap_push_block(soap, NULL, k)))
    68918836      return NULL;
    68928837#endif
     
    69238868          }
    69248869          *t++ = (char)(0x80 | (c & 0x3F));
    6925           m = (int)(t - buf) - 1;
     8870          m = (int)(t - buf) - 1;
    69268871          t = buf;
    69278872          *s++ = *t++;
     
    69398884        *s++ = '<';
    69408885        t = (char*)"/";
    6941         m = 1;
     8886        m = 1;
    69428887        break;
    69438888      case SOAP_LT:
     8889        if (f && n == 0)
     8890          goto end;
    69448891        n++;
    69458892        *s++ = '<';
     
    69638910        *s++ = '/';
    69648911        break;
    6965       case '<' | 0x80000000:
     8912      case (soap_wchar)('<' | 0x80000000):
    69668913        if (flag)
    69678914          *s++ = '<';
     
    69698916        { *s++ = '&';
    69708917          t = (char*)"lt;";
    6971           m = 3;
     8918          m = 3;
    69728919        }
    69738920        break;
    6974       case '>' | 0x80000000:
     8921      case (soap_wchar)('>' | 0x80000000):
    69758922        if (flag)
    69768923          *s++ = '>';
     
    69788925        { *s++ = '&';
    69798926          t = (char*)"gt;";
    6980           m = 3;
     8927          m = 3;
    69818928        }
    69828929        break;
    6983       case '"' | 0x80000000:
     8930      case (soap_wchar)('&' | 0x80000000):
     8931        if (flag)
     8932          *s++ = '&';
     8933        else
     8934        { *s++ = '&';
     8935          t = (char*)"amp;";
     8936          m = 4;
     8937        }
     8938        break;
     8939      case (soap_wchar)('"' | 0x80000000):
    69848940        if (flag)
    69858941          *s++ = '"';
     
    69878943        { *s++ = '&';
    69888944          t = (char*)"quot;";
    6989           m = 5;
     8945          m = 5;
    69908946        }
    69918947        break;
    6992       case '\'' | 0x80000000:
     8948      case (soap_wchar)('\'' | 0x80000000):
    69938949        if (flag)
    69948950          *s++ = '\'';
     
    69968952        { *s++ = '&';
    69978953          t = (char*)"apos;";
    6998           m = 5;
     8954          m = 5;
    69998955        }
    70008956        break;
     
    70028958        if ((int)c == EOF)
    70038959          goto end;
     8960#ifndef WITH_LEANER
    70048961#ifdef HAVE_WCTOMB
    70058962        if (soap->mode & SOAP_C_MBSTRING)
    70068963        { m = wctomb(buf, c & 0x7FFFFFFF);
    7007           if (m >= 1)
     8964          if (m >= 1 && m <= (int)MB_CUR_MAX)
    70088965          { t = buf;
    70098966            *s++ = *t++;
     
    70118968          }
    70128969          else
    7013             *s++ = SOAP_UNKNOWN_CHAR;
     8970          { *s++ = SOAP_UNKNOWN_CHAR;
     8971            m = 0;
     8972          }
    70148973        }
    70158974        else
     8975#endif
    70168976#endif
    70178977          *s++ = (char)(c & 0xFF);
     
    70318991  t = soap_strdup(soap, soap->labbuf);
    70328992#else
    7033   soap_size_block(soap, i+1);
     8993  soap_size_block(soap, NULL, i+1);
    70348994  t = soap_save_block(soap, NULL, 0);
    70358995#endif
     
    70398999    return NULL;
    70409000  }
     9001#ifdef WITH_DOM
     9002  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
     9003  { if (flag == 3)
     9004      soap->dom->tail = t;
     9005    else
     9006      soap->dom->data = t;
     9007  }
     9008#endif
    70419009  if (flag == 2)
    70429010    if (soap_s2QName(soap, t, &t))
     
    70479015
    70489016/******************************************************************************/
     9017#ifndef WITH_LEANER
    70499018#ifndef PALM_2
    70509019SOAP_FMAC1
     
    70579026#ifdef WITH_DOM
    70589027  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
    7059   { soap->dom->wide = NULL; /* soap_malloc() ??? */
     9028  { wchar_t *r = (wchar_t*)s;
     9029    int n = 1;
     9030    while (*r++)
     9031      n++;
     9032    soap->dom->wide = r = (wchar_t*)soap_malloc(soap, n * sizeof(wchar_t));
     9033    while (n--)
     9034      *r++ = *s++;
    70609035    return SOAP_OK;
    70619036  }
     
    70649039  { switch (c)
    70659040    {
    7066     case 9:
     9041    case 0x09:
    70679042      if (flag)
    70689043        t = "&#x9;";
     
    70709045        t = "\t";
    70719046      break;
    7072     case 10:
     9047    case 0x0A:
    70739048      if (flag || !(soap->mode & SOAP_XML_CANONICAL))
    70749049        t = "&#xA;";
     
    70769051        t = "\n";
    70779052      break;
    7078     case 13:
     9053    case 0x0D:
    70799054      t = "&#xD;";
    70809055      break;
     
    70899064        t = ">";
    70909065      else
    7091         t = "&gt;";
     9066        t = "&gt;";
    70929067      break;
    70939068    case '"':
     
    70989073      break;
    70999074    default:
    7100       if (c > 0 && c < 0x80)
     9075      if (c >= 0x20 && c < 0x80)
    71019076      { tmp = (char)c;
    71029077        if (soap_send_raw(soap, &tmp, 1))
     
    71139088}
    71149089#endif
    7115 
    7116 /******************************************************************************/
     9090#endif
     9091
     9092/******************************************************************************/
     9093#ifndef WITH_LEANER
    71179094#ifndef PALM_2
    71189095SOAP_FMAC1
     
    71219098soap_wstring_in(struct soap *soap, int flag, long minlen, long maxlen)
    71229099{ wchar_t *s;
    7123   register int i, n = 0;
     9100  register int i, n = 0, f = 0;
    71249101  register long l = 0;
    71259102  register soap_wchar c;
    7126   const char *t = NULL;
    7127   if (soap_new_block(soap))
     9103  char *t = NULL;
     9104  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Reading wide string content\n"));
     9105  if (soap->peeked)
     9106  { if (*soap->tag)
     9107    {
     9108#ifndef WITH_LEAN
     9109      struct soap_attribute *tp;
     9110      t = soap->tmpbuf;
     9111      *t = '<';
     9112      t[sizeof(soap->tmpbuf)-1] = '\0';
     9113      strncpy(t + 1, soap->tag, sizeof(soap->tmpbuf) - 2);
     9114      t += strlen(t);
     9115      for (tp = soap->attributes; tp; tp = tp->next)
     9116      { if (tp->visible)
     9117        { if (t >= soap->tmpbuf + sizeof(soap->tmpbuf) - 2)
     9118            break;
     9119          *t++ = ' ';
     9120          strcpy(t, tp->name);
     9121          t += strlen(t);
     9122          if (t >= soap->tmpbuf + sizeof(soap->tmpbuf) - 2)
     9123            break;
     9124          if (tp->value)
     9125          { *t++ = '=';
     9126            *t++ = '"';
     9127            strcpy(t, tp->value);
     9128            t += strlen(t);
     9129            *t++ = '"';
     9130          }
     9131        }
     9132      }
     9133      if (!soap->body)
     9134        *t++ = '/';
     9135      *t++ = '>';
     9136      *t = '\0';
     9137      t = soap->tmpbuf;
     9138#endif
     9139      if (soap->body)
     9140        n = 1;
     9141      f = 1;
     9142      soap->peeked = 0;
     9143    }
     9144  }
     9145  if (soap_new_block(soap) == NULL)
    71289146    return NULL;
    71299147  for (;;)
    7130   { if (!(s = (wchar_t*)soap_push_block(soap, sizeof(wchar_t)*SOAP_BLKLEN)))
     9148  { if (!(s = (wchar_t*)soap_push_block(soap, NULL, sizeof(wchar_t)*SOAP_BLKLEN)))
    71319149      return NULL;
    71329150    for (i = 0; i < SOAP_BLKLEN; i++)
     
    71489166        break;
    71499167      case SOAP_LT:
     9168        if (f && n == 0)
     9169          goto end;
    71509170        n++;
    71519171        *s++ = '<';
     
    71749194        else
    71759195        { *s++ = (soap_wchar)'&';
    7176           t = "lt;";
     9196          t = (char*)"lt;";
    71779197        }
    71789198        break;
     
    71829202        else
    71839203        { *s++ = (soap_wchar)'&';
    7184           t = "gt;";
     9204          t = (char*)"gt;";
    71859205        }
    71869206        break;
     
    71909210        else
    71919211        { *s++ = (soap_wchar)'&';
    7192           t = "quot;";
     9212          t = (char*)"quot;";
    71939213        }
    71949214        break;
     
    72099229  soap_unget(soap, c);
    72109230  *s = '\0';
    7211   soap_size_block(soap, sizeof(wchar_t) * (i + 1));
     9231  soap_size_block(soap, NULL, sizeof(wchar_t) * (i + 1));
    72129232  if ((soap->mode & SOAP_XML_STRICT) && l < minlen)
    72139233  { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too short: %ld chars, minlen=%ld\n", l, minlen));
     
    72159235    return NULL;
    72169236  }
    7217   return (wchar_t*)soap_save_block(soap, NULL, 0);
    7218 }
     9237  s = (wchar_t*)soap_save_block(soap, NULL, NULL, 0);
     9238#ifdef WITH_DOM
     9239  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
     9240    soap->dom->wide = s;
     9241#endif
     9242  return s;
     9243}
     9244#endif
    72199245#endif
    72209246
     
    72509276{ if (s)
    72519277  { char *r;
     9278#ifndef WITH_NOIO
     9279#ifndef WITH_LEAN
     9280    soap_reset_errno;
     9281#endif
     9282#endif
    72529283    *p = (int)soap_strtol(s, &r, 10);
    7253     if (*r)
     9284    if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r
     9285#ifndef WITH_NOIO
     9286#ifndef WITH_LEAN
     9287     || soap_errno == SOAP_ERANGE
     9288#endif
     9289#endif
     9290    )
    72549291      soap->error = SOAP_TYPE;
    72559292  }
     
    72649301SOAP_FMAC2
    72659302soap_inint(struct soap *soap, const char *tag, int *p, const char *type, int t)
    7266 { if (soap_element_begin_in(soap, tag, 0))
     9303{ if (soap_element_begin_in(soap, tag, 0, NULL))
    72679304    return NULL;
    72689305#ifndef WITH_LEAN
     
    72789315#endif
    72799316  p = (int*)soap_id_enter(soap, soap->id, p, t, sizeof(int), 0, NULL, NULL, NULL);
    7280   if (p)
     9317  if (*soap->href)
     9318    p = (int*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(int), 0, NULL);
     9319  else if (p)
    72819320  { if (soap_s2int(soap, soap_value(soap), p))
    72829321      return NULL;
    72839322  }
    7284   p = (int*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(int), 0, NULL);
    72859323  if (soap->body && soap_element_end_in(soap, tag))
    72869324    return NULL;
     
    73219359{ if (s)
    73229360  { char *r;
     9361#ifndef WITH_NOIO
     9362#ifndef WITH_LEAN
     9363    soap_reset_errno;
     9364#endif
     9365#endif
    73239366    *p = soap_strtol(s, &r, 10);
    7324     if (*r)
     9367    if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r
     9368#ifndef WITH_NOIO
     9369#ifndef WITH_LEAN
     9370     || soap_errno == SOAP_ERANGE
     9371#endif
     9372#endif
     9373    )
    73259374      soap->error = SOAP_TYPE;
    73269375  }
     
    73359384SOAP_FMAC2
    73369385soap_inlong(struct soap *soap, const char *tag, long *p, const char *type, int t)
    7337 { if (soap_element_begin_in(soap, tag, 0))
     9386{ if (soap_element_begin_in(soap, tag, 0, NULL))
    73389387    return NULL;
    73399388#ifndef WITH_LEAN
     
    73499398#endif
    73509399  p = (long*)soap_id_enter(soap, soap->id, p, t, sizeof(long), 0, NULL, NULL, NULL);
    7351   if (p)
     9400  if (*soap->href)
     9401    p = (long*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(long), 0, NULL);
     9402  else if (p)
    73529403  { if (soap_s2long(soap, soap_value(soap), p))
    73539404      return NULL;
    73549405  }
    7355   p = (long*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(long), 0, NULL);
    73569406  if (soap->body && soap_element_end_in(soap, tag))
    73579407    return NULL;
     
    73909440SOAP_FMAC2
    73919441soap_s2LONG64(struct soap *soap, const char *s, LONG64 *p)
    7392 { if (s && sscanf(s, SOAP_LONG_FORMAT, p) != 1)
    7393     soap->error = SOAP_TYPE;
     9442{ if (s)
     9443  {
     9444#ifdef HAVE_STRTOLL
     9445    char *r;
     9446#ifndef WITH_NOIO
     9447#ifndef WITH_LEAN
     9448    soap_reset_errno;
     9449#endif
     9450#endif
     9451    *p = strtoll(s, &r, 10);
     9452    if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r
     9453#ifndef WITH_NOIO
     9454#ifndef WITH_LEAN
     9455       || soap_errno == SOAP_ERANGE
     9456#endif
     9457#endif
     9458      )
     9459#else
     9460# ifdef HAVE_SSCANF
     9461    if (sscanf(s, SOAP_LONG_FORMAT, p) != 1)
     9462# endif
     9463#endif
     9464      soap->error = SOAP_TYPE;
     9465  }
    73949466  return soap->error;
    73959467}
     
    74029474SOAP_FMAC2
    74039475soap_inLONG64(struct soap *soap, const char *tag, LONG64 *p, const char *type, int t)
    7404 { if (soap_element_begin_in(soap, tag, 0))
     9476{ if (soap_element_begin_in(soap, tag, 0, NULL))
    74059477    return NULL;
    74069478#ifndef WITH_LEAN
     
    74229494#endif
    74239495  p = (LONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(LONG64), 0, NULL, NULL, NULL);
    7424   if (p)
     9496  if (*soap->href)
     9497    p = (LONG64*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(LONG64), 0, NULL);
     9498  else if (p)
    74259499  { if (soap_s2LONG64(soap, soap_value(soap), p))
    74269500      return NULL;
    74279501  }
    7428   p = (LONG64*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(LONG64), 0, NULL);
    74299502  if (soap->body && soap_element_end_in(soap, tag))
    74309503    return NULL;
     
    74669539    char *r;
    74679540    n = soap_strtol(s, &r, 10);
    7468     if (*r || n < -128 || n > 127)
     9541    if (s == r || *r || n < -128 || n > 127)
    74699542      soap->error = SOAP_TYPE;
    74709543    *p = (char)n;
     
    74809553SOAP_FMAC2
    74819554soap_inbyte(struct soap *soap, const char *tag, char *p, const char *type, int t)
    7482 { if (soap_element_begin_in(soap, tag, 0))
     9555{ if (soap_element_begin_in(soap, tag, 0, NULL))
    74839556    return NULL;
    74849557#ifndef WITH_LEAN
     
    74929565#endif
    74939566  p = (char*)soap_id_enter(soap, soap->id, p, t, sizeof(char), 0, NULL, NULL, NULL);
    7494   if (p)
     9567  if (*soap->href)
     9568    p = (char*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(char), 0, NULL);
     9569  else if (p)
    74959570  { if (soap_s2byte(soap, soap_value(soap), p))
    74969571      return NULL;
    74979572  }
    7498   p = (char*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(char), 0, NULL);
    74999573  if (soap->body && soap_element_end_in(soap, tag))
    75009574    return NULL;
     
    75369610    char *r;
    75379611    n = soap_strtol(s, &r, 10);
    7538     if (*r || n < -32768 || n > 32767)
     9612    if (s == r || *r || n < -32768 || n > 32767)
    75399613      soap->error = SOAP_TYPE;
    75409614    *p = (short)n;
     
    75509624SOAP_FMAC2
    75519625soap_inshort(struct soap *soap, const char *tag, short *p, const char *type, int t)
    7552 { if (soap_element_begin_in(soap, tag, 0))
     9626{ if (soap_element_begin_in(soap, tag, 0, NULL))
    75539627    return NULL;
    75549628#ifndef WITH_LEAN
     
    75639637#endif
    75649638  p = (short*)soap_id_enter(soap, soap->id, p, t, sizeof(short), 0, NULL, NULL, NULL);
    7565   if (p)
     9639  if (*soap->href)
     9640    p = (short*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(short), 0, NULL);
     9641  else if (p)
    75669642  { if (soap_s2short(soap, soap_value(soap), p))
    75679643      return NULL;
    75689644  }
    7569   p = (short*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(short), 0, NULL);
    75709645  if (soap->body && soap_element_end_in(soap, tag))
    75719646    return NULL;
     
    75809655SOAP_FMAC2
    75819656soap_float2s(struct soap *soap, float n)
    7582 { const char *s;
     9657{ char *s;
    75839658  if (soap_isnan((double)n))
    7584     s = "NaN";
    7585   else if (soap_ispinff(n))
    7586     s = "INF";
    7587   else if (soap_isninff(n))
    7588     s = "-INF";
    7589   else
    7590   { sprintf(soap->tmpbuf, soap->float_format, n);
    7591     s = soap->tmpbuf;
    7592   }
    7593   return s;
     9659    return "NaN";
     9660  if (soap_ispinff(n))
     9661    return "INF";
     9662  if (soap_isninff(n))
     9663    return "-INF";
     9664  s = soap->tmpbuf;
     9665#if defined(HAVE_SPRINTF_L)
     9666  sprintf_l(s, soap->c_locale, soap->float_format, n);
     9667#else
     9668  sprintf(s, soap->float_format, n);
     9669  s = strchr(s, ',');   /* convert decimal comma to DP */
     9670  if (s)
     9671    *s = '.';
     9672#endif
     9673  return soap->tmpbuf;
    75949674}
    75959675#endif
     
    76159695soap_s2float(struct soap *soap, const char *s, float *p)
    76169696{ if (s)
    7617   { if (!soap_tag_cmp(s, "INF"))
     9697  { if (!*s)
     9698      return soap->error = SOAP_TYPE;
     9699    if (!soap_tag_cmp(s, "INF"))
    76189700      *p = FLT_PINFTY;
    76199701    else if (!soap_tag_cmp(s, "+INF"))
     
    76259707    else
    76269708    {
    7627 #ifdef HAVE_STRTOD
     9709/* On some systems, strtof appears to be broken or doesn't link: use with caution */
     9710#if defined(HAVE_STRTOF_L)
     9711      char *r;
     9712      *p = strtof_l((char*)s, &r, soap->c_locale);
     9713      if (*r)
     9714#elif defined(HAVE_STRTOD_L)
     9715      char *r;
     9716      *p = (float)strtod_l(s, &r, soap->c_locale);
     9717      if (*r)
     9718#elif defined(HAVE_STRTOF)
     9719      char *r;
     9720      *p = strtof((char*)s, &r);
     9721      if (*r)
     9722#elif defined(HAVE_STRTOD)
    76289723      char *r;
    76299724      *p = (float)strtod(s, &r);
    76309725      if (*r)
    76319726#endif
    7632 #ifdef HAVE_SSCANF
    7633         if (sscanf(s, soap->float_format, p) != 1)
     9727      {
     9728#if defined(HAVE_SSCANF_L) && !defined(HAVE_STRTOF_L) && !defined(HAVE_STRTOD_L)
     9729        if (sscanf_l(s, soap->c_locale, "%g", p) != 1)
     9730          soap->error = SOAP_TYPE;
     9731#elif defined(HAVE_SSCANF)
     9732        if (sscanf(s, "%g", p) != 1)
    76349733          soap->error = SOAP_TYPE;
    76359734#else
    76369735        soap->error = SOAP_TYPE;
    76379736#endif
     9737      }
    76389738    }
    76399739  }
     
    76769776SOAP_FMAC2
    76779777soap_infloat(struct soap *soap, const char *tag, float *p, const char *type, int t)
    7678 { if (soap_element_begin_in(soap, tag, 0))
     9778{ if (soap_element_begin_in(soap, tag, 0, NULL))
    76799779    return NULL;
    76809780#ifndef WITH_LEAN
     
    76839783#endif
    76849784  p = (float*)soap_id_enter(soap, soap->id, p, t, sizeof(float), 0, NULL, NULL, NULL);
    7685   if (p)
     9785  if (*soap->href)
     9786    p = (float*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(float), 0, NULL);
     9787  else if (p)
    76869788  { if (soap_s2float(soap, soap_value(soap), p))
    76879789      return NULL;
    76889790  }
    7689   p = (float*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(float), 0, NULL);
    76909791  if (soap->body && soap_element_end_in(soap, tag))
    76919792    return NULL;
     
    77009801SOAP_FMAC2
    77019802soap_double2s(struct soap *soap, double n)
    7702 { const char *s;
     9803{ char *s;
    77039804  if (soap_isnan(n))
    7704     s = "NaN";
    7705   else if (soap_ispinfd(n))
    7706     s = "INF";
    7707   else if (soap_isninfd(n))
    7708     s = "-INF";
    7709   else
    7710   { sprintf(soap->tmpbuf, soap->double_format, n);
    7711     s = soap->tmpbuf;
    7712   }
    7713   return s;
     9805    return "NaN";
     9806  if (soap_ispinfd(n))
     9807    return "INF";
     9808  if (soap_isninfd(n))
     9809    return "-INF";
     9810  s = soap->tmpbuf;
     9811#if defined(HAVE_SPRINTF_L)
     9812  sprintf_l(s, soap->c_locale, soap->double_format, n);
     9813#else
     9814  sprintf(s, soap->double_format, n);
     9815  s = strchr(s, ',');   /* convert decimal comma to DP */
     9816  if (s)
     9817    *s = '.';
     9818#endif
     9819  return soap->tmpbuf;
    77149820}
    77159821#endif
     
    77359841soap_s2double(struct soap *soap, const char *s, double *p)
    77369842{ if (s)
    7737   { if (!soap_tag_cmp(s, "INF"))
     9843  { if (!*s)
     9844      return soap->error = SOAP_TYPE;
     9845    if (!soap_tag_cmp(s, "INF"))
    77389846      *p = DBL_PINFTY;
    77399847    else if (!soap_tag_cmp(s, "+INF"))
     
    77459853    else
    77469854    {
    7747 #ifdef HAVE_STRTOD
     9855#if defined(HAVE_STRTOD_L)
     9856      char *r;
     9857      *p = strtod_l(s, &r, soap->c_locale);
     9858      if (*r)
     9859#elif defined(HAVE_STRTOD)
    77489860      char *r;
    77499861      *p = strtod(s, &r);
    77509862      if (*r)
    77519863#endif
    7752 #ifdef HAVE_SSCANF
    7753         if (sscanf(s, soap->double_format, p) != 1)
     9864      {
     9865#if defined(HAVE_SSCANF_L) && !defined(HAVE_STRTOF_L) && !defined(HAVE_STRTOD_L)
     9866        if (sscanf_l(s, soap->c_locale, "%lg", p) != 1)
     9867          soap->error = SOAP_TYPE;
     9868#elif defined(HAVE_SSCANF)
     9869        if (sscanf(s, "%lg", p) != 1)
    77549870          soap->error = SOAP_TYPE;
    77559871#else
    77569872        soap->error = SOAP_TYPE;
    77579873#endif
     9874      }
    77589875    }
    77599876  }
     
    77689885SOAP_FMAC2
    77699886soap_indouble(struct soap *soap, const char *tag, double *p, const char *type, int t)
    7770 { if (soap_element_begin_in(soap, tag, 0))
     9887{ if (soap_element_begin_in(soap, tag, 0, NULL))
    77719888    return NULL;
    77729889#ifndef WITH_LEAN
     
    77759892#endif
    77769893  p = (double*)soap_id_enter(soap, soap->id, p, t, sizeof(double), 0, NULL, NULL, NULL);
    7777   if (p)
     9894  if (*soap->href)
     9895    p = (double*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(double), 0, NULL);
     9896  else if (p)
    77789897  { if (soap_s2double(soap, soap_value(soap), p))
    77799898      return NULL;
    77809899  }
    7781   p = (double*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(double), 0, NULL);
    77829900  if (soap->body && soap_element_end_in(soap, tag))
    77839901    return NULL;
     
    78199937    char *r;
    78209938    n = soap_strtoul(s, &r, 10);
    7821     if (*r || n > 255)
     9939    if (s == r || *r || n > 255)
    78229940      soap->error = SOAP_TYPE;
    78239941    *p = (unsigned char)n;
     
    78339951SOAP_FMAC2
    78349952soap_inunsignedByte(struct soap *soap, const char *tag, unsigned char *p, const char *type, int t)
    7835 { if (soap_element_begin_in(soap, tag, 0))
     9953{ if (soap_element_begin_in(soap, tag, 0, NULL))
    78369954    return NULL;
    78379955#ifndef WITH_LEAN
     
    78459963#endif
    78469964  p = (unsigned char*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned char), 0, NULL, NULL, NULL);
    7847   if (p)
     9965  if (*soap->href)
     9966    p = (unsigned char*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned char), 0, NULL);
     9967  else if (p)
    78489968  { if (soap_s2unsignedByte(soap, soap_value(soap), p))
    78499969      return NULL;
    78509970  }
    7851   p = (unsigned char*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(unsigned char), 0, NULL);
    78529971  if (soap->body && soap_element_end_in(soap, tag))
    78539972    return NULL;
     
    78579976
    78589977/******************************************************************************/
    7859 #ifndef WITH_LEAN
     9978#ifndef PALM_2
    78609979SOAP_FMAC1
    78619980const char*
     
    78679986
    78689987/******************************************************************************/
    7869 #ifndef WITH_LEAN
     9988#ifndef PALM_2
    78709989SOAP_FMAC1
    78719990int
     
    78809999
    788110000/******************************************************************************/
    7882 #ifndef WITH_LEAN
     10001#ifndef PALM_2
    788310002SOAP_FMAC1
    788410003int
     
    788910008    char *r;
    789010009    n = soap_strtoul(s, &r, 10);
    7891     if (*r || n > 65535)
     10010    if (s == r || *r || n > 65535)
    789210011      soap->error = SOAP_TYPE;
    789310012    *p = (unsigned short)n;
     
    789810017
    789910018/******************************************************************************/
    7900 #ifndef WITH_LEAN
     10019#ifndef PALM_2
    790110020SOAP_FMAC1
    790210021unsigned short *
    790310022SOAP_FMAC2
    790410023soap_inunsignedShort(struct soap *soap, const char *tag, unsigned short *p, const char *type, int t)
    7905 { if (soap_element_begin_in(soap, tag, 0))
     10024{ if (soap_element_begin_in(soap, tag, 0, NULL))
    790610025    return NULL;
    790710026#ifndef WITH_LEAN
     
    791610035#endif
    791710036  p = (unsigned short*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned short), 0, NULL, NULL, NULL);
    7918   if (p)
     10037  if (*soap->href)
     10038    p = (unsigned short*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned short), 0, NULL);
     10039  else if (p)
    791910040  { if (soap_s2unsignedShort(soap, soap_value(soap), p))
    792010041      return NULL;
    792110042  }
    7922   p = (unsigned short*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(unsigned short), 0, NULL);
    792310043  if (soap->body && soap_element_end_in(soap, tag))
    792410044    return NULL;
     
    795810078{ if (s)
    795910079  { char *r;
     10080#ifndef WITH_NOIO
     10081#ifndef WITH_LEAN
     10082    soap_reset_errno;
     10083#endif
     10084#endif
    796010085    *p = (unsigned int)soap_strtoul(s, &r, 10);
    7961     if (*r)
     10086    if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r
     10087#ifndef WITH_NOIO
     10088#ifndef WITH_LEAN
     10089     || soap_errno == SOAP_ERANGE
     10090#endif
     10091#endif
     10092    )
    796210093      soap->error = SOAP_TYPE;
    796310094  }
     
    797210103SOAP_FMAC2
    797310104soap_inunsignedInt(struct soap *soap, const char *tag, unsigned int *p, const char *type, int t)
    7974 { if (soap_element_begin_in(soap, tag, 0))
     10105{ if (soap_element_begin_in(soap, tag, 0, NULL))
    797510106    return NULL;
    797610107#ifndef WITH_LEAN
     
    798610117#endif
    798710118  p = (unsigned int*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned int), 0, NULL, NULL, NULL);
    7988   if (p)
     10119  if (*soap->href)
     10120    p = (unsigned int*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned int), 0, NULL);
     10121  else if (p)
    798910122  { if (soap_s2unsignedInt(soap, soap_value(soap), p))
    799010123      return NULL;
    799110124  }
    7992   p = (unsigned int*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(unsigned int), 0, NULL);
    799310125  if (soap->body && soap_element_end_in(soap, tag))
    799410126    return NULL;
     
    802910161{ if (s)
    803010162  { char *r;
     10163#ifndef WITH_NOIO
     10164#ifndef WITH_LEAN
     10165    soap_reset_errno;
     10166#endif
     10167#endif
    803110168    *p = soap_strtoul(s, &r, 10);
    8032     if (*r)
     10169    if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r
     10170#ifndef WITH_NOIO
     10171#ifndef WITH_LEAN
     10172     || soap_errno == SOAP_ERANGE
     10173#endif
     10174#endif
     10175    )
    803310176      soap->error = SOAP_TYPE;
    803410177  }
     
    804310186SOAP_FMAC2
    804410187soap_inunsignedLong(struct soap *soap, const char *tag, unsigned long *p, const char *type, int t)
    8045 { if (soap_element_begin_in(soap, tag, 0))
     10188{ if (soap_element_begin_in(soap, tag, 0, NULL))
    804610189    return NULL;
    804710190#ifndef WITH_LEAN
     
    805710200#endif
    805810201  p = (unsigned long*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned long), 0, NULL, NULL, NULL);
    8059   if (p)
     10202  if (*soap->href)
     10203    p = (unsigned long*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned long), 0, NULL);
     10204  else if (p)
    806010205  { if (soap_s2unsignedLong(soap, soap_value(soap), p))
    806110206      return NULL;
    806210207  }
    8063   p = (unsigned long*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(unsigned long), 0, NULL);
    806410208  if (soap->body && soap_element_end_in(soap, tag))
    806510209    return NULL;
     
    809810242SOAP_FMAC2
    809910243soap_s2ULONG64(struct soap *soap, const char *s, ULONG64 *p)
    8100 { if (s && sscanf(s, SOAP_ULONG_FORMAT, p) != 1)
    8101     soap->error = SOAP_TYPE;
     10244{ if (s)
     10245  {
     10246#ifdef HAVE_STRTOULL
     10247    char *r;
     10248#ifndef WITH_NOIO
     10249#ifndef WITH_LEAN
     10250    soap_reset_errno;
     10251#endif
     10252#endif
     10253    *p = strtoull(s, &r, 10);
     10254    if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r
     10255#ifndef WITH_NOIO
     10256#ifndef WITH_LEAN
     10257       || soap_errno == SOAP_ERANGE
     10258#endif
     10259#endif
     10260      )
     10261#else
     10262#ifdef HAVE_SSCANF
     10263    if (sscanf(s, SOAP_ULONG_FORMAT, p) != 1)
     10264#endif
     10265#endif
     10266      soap->error = SOAP_TYPE;
     10267  }
    810210268  return soap->error;
    810310269}
     
    811010276SOAP_FMAC2
    811110277soap_inULONG64(struct soap *soap, const char *tag, ULONG64 *p, const char *type, int t)
    8112 { if (soap_element_begin_in(soap, tag, 0))
     10278{ if (soap_element_begin_in(soap, tag, 0, NULL))
    811310279    return NULL;
    811410280  if (*soap->type
     
    812510291  }
    812610292  p = (ULONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(ULONG64), 0, NULL, NULL, NULL);
    8127   if (p)
     10293  if (*soap->href)
     10294    p = (ULONG64*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(ULONG64), 0, NULL);
     10295  else if (p)
    812810296  { if (soap_s2ULONG64(soap, soap_value(soap), p))
    812910297      return NULL;
    813010298  }
    8131   p = (ULONG64*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(ULONG64), 0, NULL);
    813210299  if (soap->body && soap_element_end_in(soap, tag))
    813310300    return NULL;
     
    814210309SOAP_FMAC2
    814310310soap_s2string(struct soap *soap, const char *s, char **t)
    8144 { *t = NULL;
    8145   if (s && !(*t = soap_strdup(soap, s)))
    8146     soap->error = SOAP_EOM;
     10311{ if (s)
     10312  { if (!(*t = soap_strdup(soap, s)))
     10313      return soap->error = SOAP_EOM;
     10314    if (!(soap->mode & (SOAP_ENC_LATIN | SOAP_C_UTFSTRING)))
     10315    { /* TODO: consider truncating UTF8 to ASCII for regular XML attribute strings? */
     10316    }
     10317  }
    814710318  return soap->error;
    814810319}
     
    815610327soap_s2QName(struct soap *soap, const char *s, char **t)
    815710328{ if (s)
    8158   { struct soap_nlist *np;
    8159     const char *p;
    8160     if (!strncmp(s, "xml:", 4))
    8161     { *t = soap_strdup(soap, s);
    8162       return SOAP_OK;
    8163     }
    8164     np = soap->nlist;
    8165     p = strchr(s, ':');
    8166     if (p)
    8167     { register int n = p - s;
    8168       while (np && (strncmp(np->id, s, n) || np->id[n]))
    8169         np = np->next;
    8170       p++;
     10329  { soap->labidx = 0;
     10330    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Normalized namespace(s) of QNames '%s'", s));
     10331    /* convert (by prefix normalize prefix) all QNames in s */
     10332    for (;;)
     10333    { size_t n;
     10334      struct soap_nlist *np;
     10335      register const char *p;
     10336      /* skip blanks */
     10337      while (*s && soap_blank(*s))
     10338        s++;
     10339      if (!*s)
     10340        break;
     10341      /* find next QName */
     10342      n = 1;
     10343      while (s[n] && !soap_blank(s[n]))
     10344        n++;
     10345      np = soap->nlist;
     10346      /* if there is no namespace stack, or prefix is "xml" then copy string */
     10347      if (!np || !strncmp(s, "xml:", 4))
     10348      { soap_append_lab(soap, s, n);
     10349      }
     10350      else /* we normalize the QName by replacing its prefix */
     10351      { p = strchr(s, ':');
     10352        if (p)
     10353        { size_t k = p - s;
     10354          while (np && (strncmp(np->id, s, k) || np->id[k]))
     10355            np = np->next;
     10356          p++;
     10357        }
     10358        else
     10359        { while (np && *np->id)
     10360            np = np->next;
     10361          p = s;
     10362        }
     10363        /* replace prefix */
     10364        if (np)
     10365        { if (np->index >= 0 && soap->local_namespaces)
     10366          { const char *q = soap->local_namespaces[np->index].id;
     10367            if (q)
     10368              soap_append_lab(soap, q, strlen(q));
     10369          }
     10370          else if (np->ns)
     10371          { soap_append_lab(soap, "\"", 1);
     10372            soap_append_lab(soap, np->ns, strlen(np->ns));
     10373            soap_append_lab(soap, "\"", 1);
     10374          }
     10375          else
     10376          { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\nNamespace prefix of '%s' not defined (index=%d, URI=%s)\n", s, np->index, np->ns?np->ns:SOAP_STR_EOS));
     10377            return soap->error = SOAP_NAMESPACE;
     10378          }
     10379        }
     10380        else /* no namespace: assume default "" namespace */
     10381        { soap_append_lab(soap, "\"\"", 2);
     10382        }
     10383        soap_append_lab(soap, ":", 1);
     10384        soap_append_lab(soap, p, n - (p-s));
     10385      }
     10386      /* advance to next and add spacing */
     10387      s += n;
     10388      if (*s)
     10389        soap_append_lab(soap, " ", 1);
     10390    }
     10391    soap_append_lab(soap, SOAP_STR_EOS, 1);
     10392    *t = soap_strdup(soap, soap->labbuf);
     10393    DBGLOG(TEST, SOAP_MESSAGE(fdebug, " into '%s'\n", *t));
     10394  }
     10395  return soap->error;
     10396}
     10397#endif
     10398
     10399/******************************************************************************/
     10400#ifndef PALM_2
     10401SOAP_FMAC1
     10402const char*
     10403SOAP_FMAC2
     10404soap_QName2s(struct soap *soap, const char *s)
     10405{ const char *t = NULL;
     10406  if (s)
     10407  { soap->labidx = 0;
     10408    for (;;)
     10409    { size_t n;
     10410      /* skip blanks */
     10411      while (*s && soap_blank(*s))
     10412        s++;
     10413      if (!*s)
     10414        break;
     10415      /* find next QName */
     10416      n = 1;
     10417      while (s[n] && !soap_blank(s[n]))
     10418        n++;
     10419      /* normal prefix: pass string as is */
     10420      if (*s != '"')
     10421      { soap_append_lab(soap, s, n);
     10422#ifndef WITH_LEAN
     10423        if ((soap->mode & SOAP_XML_CANONICAL))
     10424        { const char *r = strchr(s, ':');
     10425          if (r)
     10426            soap_utilize_ns(soap, s, r - s);
     10427        }
     10428#endif
     10429      }
     10430      else /* URL-based string prefix */
     10431      { const char *q;
     10432        s++;
     10433        q = strchr(s, '"');
     10434        if (q)
     10435        { struct Namespace *p = soap->local_namespaces;
     10436          if (p)
     10437          { for (; p->id; p++)
     10438            { if (p->ns)
     10439                if (!soap_tag_cmp(s, p->ns))
     10440                  break;
     10441              if (p->in)
     10442                if (!soap_tag_cmp(s, p->in))
     10443                  break;
     10444            }
     10445          }
     10446          /* URL is in the namespace table? */
     10447          if (p && p->id)
     10448          { soap_append_lab(soap, p->id, strlen(p->id));
     10449          }
     10450          else /* not in namespace table: create xmlns binding */
     10451          { char *r = soap_strdup(soap, s);
     10452            r[q-s] = '\0';
     10453            sprintf(soap->tmpbuf, "xmlns:_%d", soap->idnum++);
     10454            soap_set_attr(soap, soap->tmpbuf, r);
     10455            soap_append_lab(soap, soap->tmpbuf + 6, strlen(soap->tmpbuf + 6));
     10456          }
     10457          soap_append_lab(soap, q + 1, n - (q-s) - 1);
     10458        }
     10459      }
     10460      /* advance to next and add spacing */
     10461      s += n;
     10462      if (*s)
     10463        soap_append_lab(soap, " ", 1);
     10464    }
     10465    soap_append_lab(soap, SOAP_STR_EOS, 1);
     10466    t = soap_strdup(soap, soap->labbuf);
     10467  }
     10468  return t;
     10469}
     10470#endif
     10471
     10472/******************************************************************************/
     10473#ifndef WITH_LEAN
     10474SOAP_FMAC1
     10475int
     10476SOAP_FMAC2
     10477soap_s2wchar(struct soap *soap, const char *s, wchar_t **t)
     10478{ if (s)
     10479  { wchar_t *r;
     10480    *t = r = (wchar_t*)soap_malloc(soap, sizeof(wchar_t) * (strlen(s) + 1));
     10481    if (!r)
     10482      return soap->error;
     10483    if (soap->mode & SOAP_ENC_LATIN)
     10484    { while (*s)
     10485        *r++ = (wchar_t)*s++;
    817110486    }
    817210487    else
    8173     { while (np && *np->id)
    8174         np = np->next;
    8175       p = s;
    8176     }
    8177     if (np)
    8178     { if (np->index >= 0 && soap->local_namespaces)
    8179       { register const char *q = soap->local_namespaces[np->index].id;
    8180         if (q)
    8181         { if ((*t = (char*)soap_malloc(soap, strlen(p) + strlen(q) + 2)))
    8182             sprintf(*t, "%s:%s", q, p);
    8183           return SOAP_OK;
     10488    { /* Convert UTF8 to wchar */
     10489      while (*s)
     10490      { register soap_wchar c, c1, c2, c3, c4;
     10491        c = (unsigned char)*s++;
     10492        if (c < 0x80)
     10493          *r++ = (wchar_t)c;
     10494        else
     10495        { c1 = (soap_wchar)*s++ & 0x3F;
     10496          if (c < 0xE0)
     10497            *r++ = (wchar_t)(((soap_wchar)(c & 0x1F) << 6) | c1);
     10498          else
     10499          { c2 = (soap_wchar)*s++ & 0x3F;
     10500            if (c < 0xF0)
     10501              *r++ = (wchar_t)(((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2);
     10502            else
     10503            { c3 = (soap_wchar)*s++ & 0x3F;
     10504              if (c < 0xF8)
     10505                *r++ = (wchar_t)(((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3);
     10506              else
     10507              { c4 = (soap_wchar)*s++ & 0x3F;
     10508                if (c < 0xFC)
     10509                  *r++ = (wchar_t)(((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4);
     10510                else
     10511                  *r++ = (wchar_t)(((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (soap_wchar)(*s++ & 0x3F));
     10512              }
     10513            }
     10514          }
    818410515        }
    818510516      }
    8186       if (np->ns)
    8187       { if ((*t = (char*)soap_malloc(soap, strlen(p) + strlen(np->ns) + 4)))
    8188           sprintf(*t, "\"%s\":%s", np->ns, p);
    8189         return SOAP_OK;
    8190       }
    8191       DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Namespace prefix of '%s' not defined (index=%d, URI=%s)\n", s, np->index, np->ns?np->ns:""));
    8192       return soap->error = SOAP_NAMESPACE;
    8193     }
    8194     DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Namespace prefix of '%s' not defined, assuming empty namespace\n", s));
    8195     if ((*t = (char*)soap_malloc(soap, strlen(p) + 4)))
    8196       sprintf(*t, "\"\":%s", p);
    8197   }
    8198   return soap->error;
    8199 }
    8200 #endif
    8201 
    8202 /******************************************************************************/
    8203 #ifndef PALM_2
     10517    }
     10518    *r = L'\0';
     10519  }
     10520  return SOAP_OK;
     10521}
     10522#endif
     10523
     10524/******************************************************************************/
     10525#ifndef WITH_LEAN
    820410526SOAP_FMAC1
    820510527const char*
    820610528SOAP_FMAC2
    8207 soap_QName2s(struct soap *soap, const char *s)
    8208 { struct Namespace *p;
    8209   char *t;
    8210   int n;
    8211   if (!s || *s != '"')
    8212     return s;
    8213   s++;
    8214   if ((p = soap->local_namespaces))
    8215   { for (; p->id; p++)
    8216     { if (p->ns)
    8217         if (!soap_tag_cmp(s, p->ns))
    8218           break;
    8219       if (p->in)
    8220         if (!soap_tag_cmp(s, p->in))
    8221           break;
    8222     }
    8223     if (p && p->id)
    8224     { s = strchr(s, '"');
    8225       if (s)
    8226       { t = (char*)soap_malloc(soap, strlen(p->id) + strlen(s));
    8227         strcpy(t, p->id);
    8228         strcat(t, s + 1);
    8229         return t;
    8230       }
    8231     }
    8232   }
    8233   t = (char*)strchr(s, '"');
    8234   if (t)
    8235     n = t - s;
    8236   else
    8237     n = 0;
    8238   t = soap_strdup(soap, s);
    8239   t[n] = '\0';
    8240   sprintf(soap->tmpbuf, "xmlns:_%lu", soap->idnum++);
    8241   soap_set_attr(soap, soap->tmpbuf, t);
    8242   s = strchr(s, '"');
    8243   if (s)
    8244   { t = (char*)soap_malloc(soap, strlen(soap->tmpbuf) + strlen(s) - 6);
    8245     strcpy(t, soap->tmpbuf + 6);
    8246     strcat(t, s + 1);
    8247   }
    8248   return t;
     10529soap_wchar2s(struct soap *soap, const wchar_t *s)
     10530{ register soap_wchar c;
     10531  register char *r, *t;
     10532  const wchar_t *q = s;
     10533  size_t n = 0;
     10534  while ((c = *q++))
     10535  { if (c > 0 && c < 0x80)
     10536      n++;
     10537    else
     10538      n += 6;
     10539  }
     10540  r = t = (char*)soap_malloc(soap, n + 1);
     10541  if (r)
     10542  { /* Convert wchar to UTF8 */
     10543    while ((c = *s++))
     10544    { if (c > 0 && c < 0x80)
     10545        *t++ = (char)c;
     10546      else
     10547      { if (c < 0x0800)
     10548          *t++ = (char)(0xC0 | ((c >> 6) & 0x1F));
     10549        else
     10550        { if (c < 0x010000)
     10551            *t++ = (char)(0xE0 | ((c >> 12) & 0x0F));
     10552          else
     10553          { if (c < 0x200000)
     10554              *t++ = (char)(0xF0 | ((c >> 18) & 0x07));
     10555            else
     10556            { if (c < 0x04000000)
     10557                *t++ = (char)(0xF8 | ((c >> 24) & 0x03));
     10558              else
     10559              { *t++ = (char)(0xFC | ((c >> 30) & 0x01));
     10560                *t++ = (char)(0x80 | ((c >> 24) & 0x3F));
     10561              }
     10562              *t++ = (char)(0x80 | ((c >> 18) & 0x3F));
     10563            }     
     10564            *t++ = (char)(0x80 | ((c >> 12) & 0x3F));
     10565          }
     10566          *t++ = (char)(0x80 | ((c >> 6) & 0x3F));
     10567        }
     10568        *t++ = (char)(0x80 | (c & 0x3F));
     10569      }
     10570    }
     10571    *t = '\0';
     10572  }
     10573  return r;
    824910574}
    825010575#endif
     
    825710582soap_outstring(struct soap *soap, const char *tag, int id, char *const*p, const char *type, int n)
    825810583{ id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n);
    8259   if (id < 0
    8260    || soap_element_begin_out(soap, tag, id, type)
     10584  if (id < 0)
     10585    return soap->error;
     10586  if (!**p && (soap->mode & SOAP_C_NILSTRING))
     10587    return soap_element_null(soap, tag, id, type);
     10588  if (soap_element_begin_out(soap, tag, id, type)
    826110589   || soap_string_out(soap, *p, 0)
    826210590   || soap_element_end_out(soap, tag))
     
    827210600SOAP_FMAC2
    827310601soap_instring(struct soap *soap, const char *tag, char **p, const char *type, int t, int flag, long minlen, long maxlen)
    8274 { if (soap_element_begin_in(soap, tag, 1))
    8275     return NULL;
     10602{ if (soap_element_begin_in(soap, tag, 1, NULL))
     10603  { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG)
     10604      return NULL;
     10605    soap->error = SOAP_OK;
     10606  }
    827610607  if (!p)
    8277     if (!(p = (char**)soap_malloc(soap, sizeof(char*))))
     10608  { if (!(p = (char**)soap_malloc(soap, sizeof(char*))))
    827810609      return NULL;
     10610  }
    827910611  if (soap->body)
    828010612  { *p = soap_string_in(soap, flag, minlen, maxlen);
    828110613    if (!*p || !(char*)soap_id_enter(soap, soap->id, *p, t, sizeof(char*), 0, NULL, NULL, NULL))
    828210614      return NULL;
    8283   }
     10615    if (!**p && tag && *tag == '-')
     10616    { soap->error = SOAP_NO_TAG;
     10617      return NULL;
     10618    }
     10619  }
     10620  else if (tag && *tag == '-')
     10621  { soap->error = SOAP_NO_TAG;
     10622    return NULL;
     10623  }
     10624  else if (soap->null)
     10625    *p = NULL;
    828410626  else
    8285     *p = NULL;
    8286   p = (char**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(char**), 0);
     10627    *p = soap_strdup(soap, SOAP_STR_EOS);
     10628  if (*soap->href)
     10629    p = (char**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(char**), 0);
    828710630  if (soap->body && soap_element_end_in(soap, tag))
    828810631    return NULL;
     
    829210635
    829310636/******************************************************************************/
     10637#ifndef WITH_LEANER
    829410638#ifndef PALM_2
    829510639SOAP_FMAC1
     
    829810642soap_outwstring(struct soap *soap, const char *tag, int id, wchar_t *const*p, const char *type, int n)
    829910643{ id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n);
    8300   if (id < 0
    8301    || soap_element_begin_out(soap, tag, id, type)
     10644  if (id < 0)
     10645    return soap->error;
     10646  if (!**p && (soap->mode & SOAP_C_NILSTRING))
     10647    return soap_element_null(soap, tag, id, type);
     10648  if (soap_element_begin_out(soap, tag, id, type)
    830210649   || soap_wstring_out(soap, *p, 0)
    830310650   || soap_element_end_out(soap, tag))
     
    830610653}
    830710654#endif
    8308 
    8309 /******************************************************************************/
     10655#endif
     10656
     10657/******************************************************************************/
     10658#ifndef WITH_LEANER
    831010659#ifndef PALM_2
    831110660SOAP_FMAC1
     
    831310662SOAP_FMAC2
    831410663soap_inwstring(struct soap *soap, const char *tag, wchar_t **p, const char *type, int t, long minlen, long maxlen)
    8315 { if (soap_element_begin_in(soap, tag, 1))
    8316     return NULL;
     10664{ if (soap_element_begin_in(soap, tag, 1, NULL))
     10665  { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG)
     10666      return NULL;
     10667    soap->error = SOAP_OK;
     10668  }
    831710669  if (!p)
    8318     if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*))))
     10670  { if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*))))
    831910671      return NULL;
     10672  }
    832010673  if (soap->body)
    832110674  { *p = soap_wstring_in(soap, 1, minlen, maxlen);
    832210675    if (!*p || !(wchar_t*)soap_id_enter(soap, soap->id, *p, t, sizeof(wchar_t*), 0, NULL, NULL, NULL))
    832310676      return NULL;
    8324   }
     10677    if (!**p && tag && *tag == '-')
     10678    { soap->error = SOAP_NO_TAG;
     10679      return NULL;
     10680    }
     10681  }
     10682  else if (tag && *tag == '-')
     10683  { soap->error = SOAP_NO_TAG;
     10684    return NULL;
     10685  }
     10686  else if (soap->null)
     10687    *p = NULL;
    832510688  else
    8326     *p = NULL;
    8327   p = (wchar_t**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(wchar_t**), 0);
     10689    *p = soap_wstrdup(soap, (wchar_t*)SOAP_STR_EOS);
     10690  if (*soap->href)
     10691    p = (wchar_t**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(wchar_t**), 0);
    832810692  if (soap->body && soap_element_end_in(soap, tag))
    832910693    return NULL;
     
    833110695}
    833210696#endif
     10697#endif
    833310698
    833410699/******************************************************************************/
    833510700#ifndef WITH_LEAN
    8336 static time_t
     10701SOAP_FMAC1
     10702time_t
     10703SOAP_FMAC2
    833710704soap_timegm(struct tm *T)
    833810705{
    833910706#if defined(HAVE_TIMEGM)
    834010707  return timegm(T);
    8341 #elif defined(HAVE_GETTIMEOFDAY)
    8342   struct timezone t;
    8343   struct timeval tv;
    8344   memset((void*)&t, 0, sizeof(t));
    8345   gettimeofday(&tv, &t);
    8346   T->tm_min -= t.tz_minuteswest - (t.tz_dsttime != 0)*60;
    8347   T->tm_isdst = 0;
    8348   return mktime(T);
    8349 /* WR[ */
    8350   /* The following define was added for VxWorks*/
    8351 #elif defined(HAVE_MKTIME)
    8352   /* FOR VXWORKS:
    8353   vxWorks does not seem to have any variable representation of time zones, but
    8354   timezone information can be set in INSTALL_DIR/target/h/private/timeP.h header
    8355   file, by setting the ZONEBUFFER define.  The ZONEBUFFER define follows this
    8356   format:
    8357     name_of_zone:<(unused)>:time_in_minutes_from_UTC:daylight_start:daylight_end
    8358   To calculate local time, the value of time_in_minutes_from_UTC is subtracted
    8359   from UTC; time_in_minutes_from_UTC must be positive. Daylight information is
    8360   expressed as mmddhh (month-day-hour), for example:
    8361     UTC::0:040102:100102
    8362   */
    8363   return mktime(T);
    8364 /* ]WR */
    8365 #elif defined(HAVE_FTIME)
    8366   struct timeb t;
    8367   memset((void*)&t, 0, sizeof(t));
    8368   t.timezone = 0;
    8369   t.dstflag = -1;
    8370   ftime(&t);
    8371   T->tm_min -= t.timezone - (t.dstflag != 0)*60;
    8372   T->tm_isdst = 0;
    8373   return mktime(T);
    837410708#else
    8375 #warning "time_t (de)serialization is not MT safe on this platform"
    8376   time_t t;
    8377   char *tz = getenv("TZ");
    8378   putenv("TZ=UTC");
    8379   tzset();
     10709  time_t t, g, z;
     10710  struct tm tm;
    838010711  t = mktime(T);
    8381   if (tz)
    8382   { char tmp[16];
    8383     strcpy(tmp, "TZ=");
    8384     strncat(tmp, tz, 12);
    8385     tmp[15] = '\0';
    8386     putenv(tmp);
    8387   }
    8388   else
    8389     putenv("TZ=");
    8390   tzset();
    8391   return t;
     10712  if (t == (time_t)-1)
     10713    return (time_t)-1;
     10714#ifdef HAVE_GMTIME_R
     10715  gmtime_r(&t, &tm);
     10716#else
     10717  tm = *gmtime(&t);
     10718#endif
     10719  tm.tm_isdst = 0;
     10720  g = mktime(&tm);
     10721  if (g == (time_t)-1)
     10722    return (time_t)-1;
     10723  z = g - t;
     10724  return t - z;
    839210725#endif
    839310726}
     
    840010733SOAP_FMAC2
    840110734soap_dateTime2s(struct soap *soap, time_t n)
    8402 { struct tm T;
    8403   struct tm *pT = &T;
     10735{ struct tm T, *pT = &T;
    840410736#if defined(HAVE_GMTIME_R)
    840510737  if (gmtime_r(&n, pT))
    840610738    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT);
    8407 /* WR[ */
    8408   /* The following defines were added for VxWorks*/
    8409 #elif defined(HAVE_PGMTIME_R)
    8410   if (gmtime_r(&n, pT))
    8411     strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT);
    8412 #elif defined(HAVE_PGMTIME)
    8413   if (gmtime(&n, pT))
    8414     strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT);
    8415 /* ]WR */
    841610739#elif defined(HAVE_GMTIME)
    841710740  if ((pT = gmtime(&n)))
     
    842510748    gettimeofday(&tv, &tz);
    842610749    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
    8427     sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -tz.tz_minuteswest/60+(tz.tz_dsttime!=0), abs(tz.tz_minuteswest)%60);
     10750    sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60);
    842810751  }
    842910752#else
     
    843210755    gettimeofday(&tv, &tz);
    843310756    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
    8434     sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -tz.tz_minuteswest/60+(tz.tz_dsttime!=0), abs(tz.tz_minuteswest)%60);
     10757    sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60);
    843510758  }
    843610759#endif
     
    844010763#if defined(HAVE_LOCALTIME_R)
    844110764  if (localtime_r(&n, pT))
    8442   { ftime(&t);
     10765  {
     10766#ifdef __BORLANDC__
     10767    ::ftime(&t);
     10768#else
     10769    ftime(&t);
     10770#endif
    844310771    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
    8444     sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60+(t.dstflag!=0), abs(t.timezone)%60);
    8445   }
    8446 /* WR[ */
    8447   /* The following defines were added for VxWorks*/
    8448 #elif defined(HAVE_PLOCALTIME_R)
    8449   if (localtime_r(&n, pT))
    8450   { strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
    8451     sprintf(soap->tmpbuf+strlen(soap->tmpbuf), "%+03d:%02d", t.timezone/60, abs(t.timezone)%60);
    8452   }
    8453 /* ]WR */
     10772    sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60);
     10773  }
    845410774#else
    845510775  if ((pT = localtime(&n)))
    8456   { ftime(&t);
     10776  {
     10777#ifdef __BORLANDC__
     10778    ::ftime(&t);
     10779#else
     10780    ftime(&t);
     10781#endif
    845710782    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
    8458     sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60+(t.dstflag!=0), abs(t.timezone)%60);
     10783    sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60);
    845910784  }
    846010785#endif
     
    846210787  if (localtime_r(&n, pT))
    846310788    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
    8464 /* WR[ */
    8465   /* The following defines were added for VxWorks*/
    8466 #elif defined(HAVE_PLOCALTIME_R)
    8467   if (localtime_r(&n, pT))
    8468     strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
    8469 /* ]WR */
    847010789#else
    847110790  if ((pT = localtime(&n)))
     
    849810817soap_s2dateTime(struct soap *soap, const char *s, time_t *p)
    849910818{ if (s)
    8500   { struct tm T;
    8501     char zone[16];
     10819  { char zone[32];
     10820    struct tm T;
     10821    const char *t;
     10822    *zone = '\0';
    850210823    memset((void*)&T, 0, sizeof(T));
    8503     zone[sizeof(zone)-1] = '\0';
    8504     sscanf(s, "%d-%d-%dT%d:%d:%d%15s", &T.tm_year, &T.tm_mon, &T.tm_mday, &T.tm_hour, &T.tm_min, &T.tm_sec, zone);
     10824    if (strchr(s, '-'))
     10825      t = "%d-%d-%dT%d:%d:%d%31s";
     10826    else if (strchr(s, ':'))
     10827      t = "%4d%2d%2dT%d:%d:%d%31s";
     10828    else /* parse non-XSD-standard alternative ISO 8601 format */
     10829      t = "%4d%2d%2dT%2d%2d%2d%31s";
     10830    if (sscanf(s, t, &T.tm_year, &T.tm_mon, &T.tm_mday, &T.tm_hour, &T.tm_min, &T.tm_sec, zone) < 6)
     10831      return soap->error = SOAP_TYPE;
    850510832    if (T.tm_year == 1)
    850610833      T.tm_year = 70;
     
    850810835      T.tm_year -= 1900;
    850910836    T.tm_mon--;
    8510     if (*zone)
    8511     { if (*zone == '.')
    8512       { for (s = zone + 1; *s; s++)
    8513           if (*s < '0' || *s > '9')
    8514             break;
    8515       }
    8516       else
    8517         s = zone;
    8518       if (*s != 'Z')
     10837    if (*zone == '.')
     10838    { for (s = zone + 1; *s; s++)
     10839        if (*s < '0' || *s > '9')
     10840          break;
     10841    }
     10842    else
     10843      s = zone;
     10844    if (*s)
     10845    {
     10846#ifndef WITH_NOZONE
     10847      if (*s == '+' || *s == '-')
    851910848      { int h = 0, m = 0;
    8520         sscanf(s, "%d:%d", &h, &m);
    8521         T.tm_hour -= h;
    8522         if (h >= 0)
    8523           T.tm_min -= m;
    8524         else
    8525           T.tm_min += m;
    8526       }
     10849        if (s[3] == ':')
     10850        { /* +hh:mm */
     10851          sscanf(s, "%d:%d", &h, &m);
     10852          if (h < 0)
     10853            m = -m;
     10854        }
     10855        else /* +hhmm */
     10856        { m = (int)atol(s);
     10857          h = m / 100;
     10858          m = m % 100;
     10859        }
     10860        T.tm_min -= m;
     10861        T.tm_hour -= h;
     10862        /* put hour and min in range */
     10863        T.tm_hour += T.tm_min / 60;
     10864        T.tm_min %= 60;
     10865        if (T.tm_min < 0)
     10866          T.tm_min += 60;
     10867        T.tm_mday += T.tm_hour / 24;
     10868        T.tm_hour %= 24;
     10869        if (T.tm_hour < 0)
     10870          T.tm_hour += 24;
     10871        /* note: day of the month may be out of range, timegm() handles it */
     10872      }
     10873#endif
    852710874      *p = soap_timegm(&T);
    852810875    }
    852910876    else
    8530       *p = mktime(&T); /* no time zone: suppose it is localtime? */
     10877      *p = mktime(&T);
    853110878  }
    853210879  return soap->error;
     
    853910886time_t *
    854010887SOAP_FMAC2
    8541 soap_indateTime(struct soap *soap, const char *tag, time_t *p, const char * type, int t)
    8542 { if (soap_element_begin_in(soap, tag, 0))
     10888soap_indateTime(struct soap *soap, const char *tag, time_t *p, const char *type, int t)
     10889{ if (soap_element_begin_in(soap, tag, 0, NULL))
    854310890    return NULL;
    854410891  if (*soap->type
     
    855010897  }
    855110898  p = (time_t*)soap_id_enter(soap, soap->id, p, t, sizeof(time_t), 0, NULL, NULL, NULL);
    8552   if (p)
     10899  if (*soap->href)
     10900    p = (time_t*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(time_t), 0, NULL);
     10901  else if (p)
    855310902  { if (soap_s2dateTime(soap, soap_value(soap), p))
    855410903      return NULL;
    855510904  }
    8556   p = (time_t*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(time_t), 0, NULL);
    855710905  if (soap->body && soap_element_end_in(soap, tag))
    855810906    return NULL;
     
    856610914int
    856710915SOAP_FMAC2
    8568 soap_outliteral(struct soap *soap, const char *tag, char *const*p)
     10916soap_outliteral(struct soap *soap, const char *tag, char *const*p, const char *type)
    856910917{ int i;
    857010918  const char *t = NULL;
    857110919  if (tag && *tag != '-')
    8572   { if ((t = strchr(tag, ':')))
     10920  { if (soap->local_namespaces && (t = strchr(tag, ':')))
    857310921    { strncpy(soap->tmpbuf, tag, t-tag);
    857410922      soap->tmpbuf[t-tag] = '\0';
     
    857710925          break;
    857810926      t++;
    8579       sprintf(soap->tmpbuf, "<%s xmlns=\"%s\">", t, soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS);
     10927      if (soap_element(soap, t, 0, type)
     10928       || soap_attribute(soap, "xmlns", soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS)
     10929       || soap_element_start_end_out(soap, NULL))
     10930        return soap->error;
    858010931    }
    858110932    else
    858210933    { t = tag;
    8583       sprintf(soap->tmpbuf, "<%s>", tag);
    8584     }
    8585     if (soap_send(soap, soap->tmpbuf))
    8586       return soap->error;
     10934      if (soap_element_begin_out(soap, t, 0, type))
     10935        return soap->error;
     10936    }
    858710937  }
    858810938  if (p && *p)
     
    859110941  }
    859210942  if (t)
    8593   { sprintf(soap->tmpbuf, "</%s>", t);
    8594     return soap_send(soap, soap->tmpbuf);
    8595   }
     10943    return soap_element_end_out(soap, t);
    859610944  return SOAP_OK;
    859710945}
     
    860410952SOAP_FMAC2
    860510953soap_inliteral(struct soap *soap, const char *tag, char **p)
    8606 { if (soap_element_begin_in(soap, tag, 1))
    8607     return NULL;
     10954{ if (soap_element_begin_in(soap, tag, 1, NULL))
     10955  { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT)
     10956      return NULL;
     10957    soap->error = SOAP_OK;
     10958  }
    860810959  if (!p)
    8609     if (!(p = (char**)soap_malloc(soap, sizeof(char*))))
     10960  { if (!(p = (char**)soap_malloc(soap, sizeof(char*))))
    861010961      return NULL;
    8611   if (soap->null)
     10962  }
     10963  if (soap->body || (tag && *tag == '-'))
     10964  { *p = soap_string_in(soap, 0, -1, -1);
     10965    if (!*p)
     10966      return NULL;
     10967    if (!**p && tag && *tag == '-')
     10968    { soap->error = SOAP_NO_TAG;
     10969      return NULL;
     10970    }
     10971  }
     10972  else if (soap->null)
    861210973    *p = NULL;
    8613   else if (soap->body)
    8614     *p = soap_string_in(soap, 0, -1, -1);
    861510974  else
    8616     *p = NULL;
     10975    *p = soap_strdup(soap, SOAP_STR_EOS);
    861710976  if (soap->body && soap_element_end_in(soap, tag))
    861810977    return NULL;
     
    862210981
    862310982/******************************************************************************/
     10983#ifndef WITH_LEANER
    862410984#ifndef PALM_2
    862510985SOAP_FMAC1
    862610986int
    862710987SOAP_FMAC2
    8628 soap_outwliteral(struct soap *soap, const char *tag, wchar_t *const*p)
     10988soap_outwliteral(struct soap *soap, const char *tag, wchar_t *const*p, const char *type)
    862910989{ int i;
    863010990  const char *t = NULL;
    8631   wchar_t c;
    8632   const wchar_t *s;
    863310991  if (tag && *tag != '-')
    8634   { if (tag && (t = strchr(tag, ':')))
     10992  { if (soap->local_namespaces && (t = strchr(tag, ':')))
    863510993    { strncpy(soap->tmpbuf, tag, t-tag);
    863610994      soap->tmpbuf[t-tag] = '\0';
     
    863910997          break;
    864010998      t++;
    8641       sprintf(soap->tmpbuf, "<%s xmlns=\"%s\">", t, soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS);
     10999      if (soap_element(soap, t, 0, type)
     11000       || soap_attribute(soap, "xmlns", soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS)
     11001       || soap_element_start_end_out(soap, NULL))
     11002        return soap->error;
    864211003    }
    864311004    else
    864411005    { t = tag;
    8645       sprintf(soap->tmpbuf, "<%s>", tag);
     11006      if (soap_element_begin_out(soap, t, 0, type))
     11007        return soap->error;
    864611008    }
    864711009    if (soap_send(soap, soap->tmpbuf))
     
    864911011  }
    865011012  if (p)
    8651   { s = *p;
     11013  { wchar_t c;
     11014    const wchar_t *s = *p;
    865211015    while ((c = *s++))
    8653       if (soap_pututf8(soap, (unsigned char)c))
     11016    { if (soap_pututf8(soap, (unsigned long)c))
    865411017        return soap->error;
     11018    }
    865511019  }
    865611020  if (t)
    8657   { sprintf(soap->tmpbuf, "</%s>", t);
    8658     return soap_send(soap, soap->tmpbuf);
    8659   }
     11021    return soap_element_end_out(soap, t);
    866011022  return SOAP_OK;
    866111023}
    866211024#endif
    8663 
    8664 /******************************************************************************/
     11025#endif
     11026
     11027/******************************************************************************/
     11028#ifndef WITH_LEANER
    866511029#ifndef PALM_2
    866611030SOAP_FMAC1
     
    866811032SOAP_FMAC2
    866911033soap_inwliteral(struct soap *soap, const char *tag, wchar_t **p)
    8670 { if (soap_element_begin_in(soap, tag, 1))
     11034{ if (soap_element_begin_in(soap, tag, 1, NULL))
     11035  { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT)
     11036      return NULL;
     11037    soap->error = SOAP_OK;
     11038  }
     11039  if (!p)
     11040  { if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*))))
     11041      return NULL;
     11042  }
     11043  if (soap->body)
     11044  { *p = soap_wstring_in(soap, 0, -1, -1);
     11045    if (!*p)
     11046      return NULL;
     11047    if (!**p && tag && *tag == '-')
     11048    { soap->error = SOAP_NO_TAG;
     11049      return NULL;
     11050    }
     11051  }
     11052  else if (tag && *tag == '-')
     11053  { soap->error = SOAP_NO_TAG;
    867111054    return NULL;
    8672   if (!p)
    8673     if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*))))
    8674       return NULL;
    8675   if (soap->null)
     11055  }
     11056  else if (soap->null)
    867611057    *p = NULL;
    8677   else if (soap->body)
    8678     *p = soap_wstring_in(soap, 0, -1, -1);
    867911058  else
    8680     *p = NULL;
     11059    *p = soap_wstrdup(soap, (wchar_t*)SOAP_STR_EOS);
    868111060  if (soap->body && soap_element_end_in(soap, tag))
    868211061    return NULL;
     
    868411063}
    868511064#endif
     11065#endif
    868611066
    868711067/******************************************************************************/
     
    869111071SOAP_FMAC2
    869211072soap_value(struct soap *soap)
    8693 { size_t i;
    8694   soap_wchar c = 0;
    8695   char *s = soap->tmpbuf;
     11073{ register size_t i;
     11074  register soap_wchar c = 0;
     11075  register char *s = soap->tmpbuf;
    869611076  if (!soap->body)
    869711077    return SOAP_STR_EOS;
     11078  do c = soap_get(soap);
     11079  while (soap_blank(c));
    869811080  for (i = 0; i < sizeof(soap->tmpbuf) - 1; i++)
    8699   { c = soap_get(soap);
    8700     if (c == SOAP_TT || (int)c == EOF || soap_blank(c))
     11081  { if (c == SOAP_TT || (int)c == EOF)
    870111082      break;
    870211083    *s++ = (char)c;
    8703   }
     11084    c = soap_get(soap);
     11085  }
     11086  for (s--; i > 0; i--, s--)
     11087  { if (!soap_blank(*s))
     11088      break;
     11089  }
     11090  s[1] = '\0';
    870411091  if ((int)c == EOF || c == SOAP_TT)
    870511092    soap_unget(soap, c);
    8706   *s = '\0';
     11093  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element content value='%s'\n", soap->tmpbuf));
     11094#ifdef WITH_DOM
     11095  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
     11096    soap->dom->data = soap_strdup(soap, soap->tmpbuf);
     11097#endif
    870711098  return soap->tmpbuf; /* return non-null pointer */
    870811099}
     
    871011101
    871111102/******************************************************************************/
     11103#if !defined(WITH_LEANER) || !defined(WITH_NOHTTP)
    871211104#ifndef PALM_2
    871311105SOAP_FMAC1
     
    872011112  { while (--i > 0)
    872111113    { c = soap_getchar(soap);
    8722       if (c == '\r')
     11114      if (c == '\r' || c == '\n')
    872311115        break;
    872411116      if ((int)c == EOF)
     
    872611118      *s++ = (char)c;
    872711119    }
    8728     c = soap_getchar(soap);
     11120    if (c != '\n')
     11121      c = soap_getchar(soap); /* got \r or something else, now get \n */
    872911122    if (c == '\n')
    873011123    { *s = '\0';
    8731       if (i+1 == len) /* empty line: end of HTTP header */
     11124      if (i+1 == len) /* empty line: end of HTTP/MIME header */
    873211125        break;
    8733       c = soap_unget(soap, soap_getchar(soap));
     11126      c = soap_get0(soap);
    873411127      if (c != ' ' && c != '\t') /* HTTP line continuation? */
    873511128        break;
     
    873811131      return soap->error = SOAP_EOF;
    873911132  }
     11133  if (i < 0)
     11134    return soap->error = SOAP_HDR;
    874011135  return SOAP_OK;
    874111136}
     11137#endif
    874211138#endif
    874311139
     
    875011146  register struct soap_multipart *content;
    875111147  register size_t count = soap->count;
    8752   if (soap->mode & SOAP_ENC_DIME)
     11148  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the message size with attachments, current count=%lu\n", (unsigned long)count));
     11149  if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM))
    875311150  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the size of DIME attachments\n"));
    875411151    for (content = soap->dime.first; content; content = content->next)
     
    876011157      if (content->options)
    876111158        count += ((((unsigned char)content->options[2] << 8) | ((unsigned char)content->options[3]))+7)&(~3);
    8762       DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of DIME attachment %lu bytes\n", (unsigned long)content->size));
     11159      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of DIME attachment content is %lu bytes\n", (unsigned long)content->size));
    876311160    }
    876411161  }
     
    877311170      if (content->type)
    877411171        count += 16 + strlen(content->type);
    8775       s = soap_str_code(mime_codes, content->encoding);
    877611172      /* count Content-Transfer-Encoding: ...\r\n */
     11173      s = soap_code_str(mime_codes, content->encoding);
    877711174      if (s)
    877811175        count += 29 + strlen(s);
     
    878511182      /* count Content-Description: ...\r\n */
    878611183      if (content->description)
    8787         count += 23 + strlen(content->location);
     11184        count += 23 + strlen(content->description);
    878811185      /* count \r\n...content */
    878911186      count += 2 + content->size;
    8790       DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of MIME attachment %lu bytes\n", (unsigned long)content->size));
    8791     }
    8792     /* count \r\n--boundary--\r\n */
    8793     count += 8 + n;
    8794   }
     11187      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of MIME attachment content is %lu bytes\n", (unsigned long)content->size));
     11188    }
     11189    /* count \r\n--boundary-- */
     11190    count += 6 + n;
     11191  }
     11192  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New count is %lu bytes\n", (unsigned long)count));
    879511193  return count;
    879611194#else
     
    882511223    s = (char*)soap_malloc(soap, n + 5);
    882611224    if (s)
    8827     { s[0] = optype >> 8;
    8828       s[1] = optype & 0xFF;
    8829       s[2] = n >> 8;
    8830       s[3] = n & 0xFF;
     11225    { s[0] = (char)(optype >> 8);
     11226      s[1] = (char)(optype & 0xFF);
     11227      s[2] = (char)(n >> 8);
     11228      s[3] = (char)(n & 0xFF);
    883111229      strcpy(s + 4, option);
    883211230    }
     
    884611244{ unsigned char tmp[12];
    884711245  size_t optlen = 0, idlen = 0, typelen = 0;
    8848   DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Put DIME header id='%s'\n", soap->dime.id?soap->dime.id:""));
     11246  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Put DIME header id='%s'\n", soap->dime.id?soap->dime.id:SOAP_STR_EOS));
    884911247  if (soap->dime.options)
    885011248    optlen = (((unsigned char)soap->dime.options[2] << 8) | ((unsigned char)soap->dime.options[3])) + 4;
    885111249  if (soap->dime.id)
    8852     idlen = strlen(soap->dime.id);
     11250  { idlen = strlen(soap->dime.id);
     11251    if (idlen > 0x0000FFFF)
     11252      idlen = 0x0000FFFF;
     11253  }
    885311254  if (soap->dime.type)
    8854     typelen = strlen(soap->dime.type);
     11255  { typelen = strlen(soap->dime.type);
     11256    if (typelen > 0x0000FFFF)
     11257      typelen = 0x0000FFFF;
     11258  }
    885511259  tmp[0] = SOAP_DIME_VERSION | (soap->dime.flags & 0x7);
    885611260  tmp[1] = soap->dime.flags & 0xF0;
    8857   tmp[2] = optlen >> 8;
    8858   tmp[3] = optlen & 0xFF;
    8859   tmp[4] = idlen >> 8;
    8860   tmp[5] = idlen & 0xFF;
    8861   tmp[6] = typelen >> 8;
    8862   tmp[7] = typelen & 0xFF;
    8863   tmp[8] = soap->dime.size >> 24;
    8864   tmp[9] = (soap->dime.size >> 16) & 0xFF;
    8865   tmp[10] = (soap->dime.size >> 8) & 0xFF;
    8866   tmp[11] = soap->dime.size & 0xFF;
     11261  tmp[2] = (char)(optlen >> 8);
     11262  tmp[3] = (char)(optlen & 0xFF);
     11263  tmp[4] = (char)(idlen >> 8);
     11264  tmp[5] = (char)(idlen & 0xFF);
     11265  tmp[6] = (char)(typelen >> 8);
     11266  tmp[7] = (char)(typelen & 0xFF);
     11267  tmp[8] = (char)(soap->dime.size >> 24);
     11268  tmp[9] = (char)((soap->dime.size >> 16) & 0xFF);
     11269  tmp[10] = (char)((soap->dime.size >> 8) & 0xFF);
     11270  tmp[11] = (char)(soap->dime.size & 0xFF);
    886711271  if (soap_send_raw(soap, (char*)tmp, 12)
    886811272   || soap_putdimefield(soap, soap->dime.options, optlen)
     
    889811302        return soap->error;
    889911303      }
    8900       if (!content->size && ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE))
     11304      if (!size && ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE))
    890111305      { size_t chunksize = sizeof(soap->tmpbuf);
    890211306        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming DIME\n"));
     
    890511309          DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread returned %lu bytes\n", (unsigned long)size));
    890611310          if (size < chunksize)
    8907           { soap->dime.flags &= ~SOAP_DIME_CF;
     11311          { soap->dime.flags &= ~SOAP_DIME_CF;
    890811312            if (!content->next)
    890911313              soap->dime.flags |= SOAP_DIME_ME;
    8910           }
     11314          }
    891111315          else
    891211316            soap->dime.flags |= SOAP_DIME_CF;
    8913           soap->dime.size = size;
     11317          soap->dime.size = size;
    891411318          if (soap_putdimehdr(soap)
    8915            || soap_putdimefield(soap, soap->tmpbuf, size))
     11319           || soap_putdimefield(soap, soap->tmpbuf, size))
    891611320            break;
    891711321          if (soap->dime.id)
    8918           { soap->dime.flags &= ~(SOAP_DIME_MB | SOAP_DIME_MEDIA);
     11322          { soap->dime.flags &= ~(SOAP_DIME_MB | SOAP_DIME_MEDIA);
    891911323            soap->dime.id = NULL;
    892011324            soap->dime.type = NULL;
     
    893011334        do
    893111335        { size_t bufsize;
    8932           if (size < sizeof(soap->tmpbuf))
     11336          if (size < sizeof(soap->tmpbuf))
    893311337            bufsize = size;
    893411338          else
    893511339            bufsize = sizeof(soap->tmpbuf);
    893611340          if (!(bufsize = soap->fdimeread(soap, handle, soap->tmpbuf, bufsize)))
    8937           { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)soap->dime.size));
     11341          { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)content->size));
    893811342            soap->error = SOAP_EOF;
    8939             break;
     11343            break;
    894011344          }
    894111345          if (soap_send_raw(soap, soap->tmpbuf, bufsize))
     
    896911373soap_getdimefield(struct soap *soap, size_t n)
    897011374{ register soap_wchar c;
    8971   register int i;
     11375  register size_t i;
    897211376  register char *s;
    8973   char *p = NULL;
     11377  register char *p = NULL;
    897411378  if (n)
    897511379  { p = (char*)soap_malloc(soap, n + 1);
     
    903711441  if (!(soap->dime.type = soap_getdimefield(soap, typelen)) && soap->error)
    903811442    return soap->error;
    9039   DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME id=%s, type=%s, options=%s\n", soap->dime.id?soap->dime.id:"", soap->dime.type?soap->dime.type:"", soap->dime.options?soap->dime.options+4:""));
     11443  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME id=%s, type=%s, options=%s\n", soap->dime.id?soap->dime.id:SOAP_STR_EOS, soap->dime.type?soap->dime.type:"", soap->dime.options?soap->dime.options+4:SOAP_STR_EOS));
    904011444  if (soap->dime.flags & SOAP_DIME_ME)
    904111445    soap->mode &= ~SOAP_ENC_DIME;
     
    905211456SOAP_FMAC2
    905311457soap_getdime(struct soap *soap)
    9054 { struct soap_multipart *content;
    9055   if (soap_getdimehdr(soap))
     11458{ while (soap->dime.flags & SOAP_DIME_CF)
     11459  { if (soap_getdimehdr(soap))
     11460      return soap->error;
     11461    if (soap_move(soap, (long)soap->dime.size))
     11462      return soap->error = SOAP_EOF;
     11463  }
     11464  if (soap_move(soap, (long)(((soap->dime.size+3)&(~3))-soap_tell(soap))))
     11465    return soap->error = SOAP_EOF;
     11466  for (;;)
     11467  { register struct soap_multipart *content;
     11468    if (soap_getdimehdr(soap))
     11469      break;
     11470    if (soap->fdimewriteopen && ((soap->dime.ptr = (char*)soap->fdimewriteopen(soap, soap->dime.id, soap->dime.type, soap->dime.options)) || soap->error))
     11471    { const char *id, *type, *options;
     11472      size_t size, n;
     11473      if (!soap->dime.ptr)
     11474        return soap->error;
     11475      id = soap->dime.id;
     11476      type = soap->dime.type;
     11477      options = soap->dime.options;
     11478      for (;;)
     11479      { size = soap->dime.size;
     11480        for (;;)
     11481        { n = soap->buflen - soap->bufidx;
     11482          if (size < n)
     11483            n = size;
     11484          if ((soap->error = soap->fdimewrite(soap, (void*)soap->dime.ptr, soap->buf + soap->bufidx, n)))
     11485            break;
     11486          size -= n;
     11487          if (!size)
     11488          { soap->bufidx += n;
     11489            break;
     11490          }
     11491          if (soap_recv(soap))
     11492          { soap->error = SOAP_EOF;
     11493            goto end;
     11494          }
     11495        }
     11496        if (soap_move(soap, -(long)soap->dime.size&3))
     11497        { soap->error = SOAP_EOF;
     11498          break;
     11499        }
     11500        if (!(soap->dime.flags & SOAP_DIME_CF))
     11501          break;
     11502        if (soap_getdimehdr(soap))
     11503          break;
     11504      }
     11505end:
     11506      if (soap->fdimewriteclose)
     11507        soap->fdimewriteclose(soap, (void*)soap->dime.ptr);
     11508      soap->dime.size = 0;
     11509      soap->dime.id = id;
     11510      soap->dime.type = type;
     11511      soap->dime.options = options;
     11512    }
     11513    else if (soap->dime.flags & SOAP_DIME_CF)
     11514    { const char *id, *type, *options;
     11515      id = soap->dime.id;
     11516      type = soap->dime.type;
     11517      options = soap->dime.options;
     11518      if (soap_new_block(soap) == NULL)
     11519        return SOAP_EOM;
     11520      for (;;)
     11521      { register soap_wchar c;
     11522        register size_t i;
     11523        register char *s;
     11524        s = (char*)soap_push_block(soap, NULL, soap->dime.size);
     11525        if (!s)
     11526          return soap->error = SOAP_EOM;
     11527        for (i = soap->dime.size; i > 0; i--)
     11528        { if ((int)(c = soap_get1(soap)) == EOF)
     11529            return soap->error = SOAP_EOF;
     11530          *s++ = (char)c;
     11531        }
     11532        if (soap_move(soap, -(long)soap->dime.size&3))
     11533          return soap->error = SOAP_EOF;
     11534        if (!(soap->dime.flags & SOAP_DIME_CF))
     11535          break;
     11536        if (soap_getdimehdr(soap))
     11537          return soap->error;
     11538      }
     11539      soap->dime.size = soap->blist->size++; /* allocate one more for '\0' */
     11540      if (!(soap->dime.ptr = soap_save_block(soap, NULL, NULL, 0)))
     11541        return soap->error;
     11542      soap->dime.ptr[soap->dime.size] = '\0'; /* force 0-terminated */
     11543      soap->dime.id = id;
     11544      soap->dime.type = type;
     11545      soap->dime.options = options;
     11546    }
     11547    else
     11548      soap->dime.ptr = soap_getdimefield(soap, soap->dime.size);
     11549    content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, soap->dime.ptr, soap->dime.size);
     11550    if (!content)
     11551      return soap->error = SOAP_EOM;
     11552    content->id = soap->dime.id;
     11553    content->type = soap->dime.type;
     11554    content->options = soap->dime.options;
     11555    if (soap->error)
     11556      return soap->error;
     11557    soap_resolve_attachment(soap, content);
     11558  }
     11559  if (soap->error != SOAP_DIME_END)
    905611560    return soap->error;
    9057   if (soap->fdimewriteopen && ((soap->dime.ptr = (char*)soap->fdimewriteopen(soap, soap->dime.id, soap->dime.type, soap->dime.options)) || soap->error))
    9058   { const char *id, *type, *options;
    9059     size_t size, n;
    9060     if (!soap->dime.ptr)
    9061       return soap->error;
    9062     id = soap->dime.id;
    9063     type = soap->dime.type;
    9064     options = soap->dime.options;
    9065     for (;;)
    9066     { size = soap->dime.size;
    9067       for (;;)
    9068       { n = soap->buflen - soap->bufidx;
    9069         if (size < n)
    9070           n = size;
    9071         if ((soap->error = soap->fdimewrite(soap, (void*)soap->dime.ptr, soap->buf + soap->bufidx, n)))
    9072           break;
    9073         size -= n;
    9074         if (!size)
    9075         { soap->bufidx += n;
    9076           break;
    9077         }
    9078         if (soap_recv(soap))
    9079         { soap->error = SOAP_EOF;
    9080           goto end;
    9081         }
    9082       }
    9083       if (soap_move(soap, -(long)soap->dime.size&3))
    9084       { soap->error = SOAP_EOF;
    9085         break;
    9086       }
    9087       if (!(soap->dime.flags & SOAP_DIME_CF))
    9088         break;
    9089       if (soap_getdimehdr(soap))
    9090         break;
    9091     }
    9092 end:
    9093     if (soap->fdimewriteclose)
    9094       soap->fdimewriteclose(soap, (void*)soap->dime.ptr);
    9095     soap->dime.size = 0;
    9096     soap->dime.id = id;
    9097     soap->dime.type = type;
    9098     soap->dime.options = options;
    9099   }
    9100   else if (soap->dime.flags & SOAP_DIME_CF)
    9101   { const char *id, *type, *options;
    9102     register soap_wchar c;
    9103     register char *s;
    9104     register int i;
    9105     id = soap->dime.id;
    9106     type = soap->dime.type;
    9107     options = soap->dime.options;
    9108     if (soap_new_block(soap))
    9109       return SOAP_EOM;
    9110     for (;;)
    9111     { s = (char*)soap_push_block(soap, soap->dime.size);
    9112       if (!s)
    9113         return soap->error = SOAP_EOM;
    9114       for (i = soap->dime.size; i > 0; i--)
    9115       { if ((int)(c = soap_get1(soap)) == EOF)
    9116           return soap->error = SOAP_EOF;
    9117         *s++ = (char)c;
    9118       }
    9119       if (soap_move(soap, -(long)soap->dime.size&3))
    9120         return soap->error = SOAP_EOF;
    9121       if (!(soap->dime.flags & SOAP_DIME_CF))
    9122         break;
    9123       if (soap_getdimehdr(soap))
    9124         return soap->error;
    9125     }
    9126     soap->dime.size = soap->blist->size++; /* allocate one more for '\0' */
    9127     if (!(soap->dime.ptr = soap_save_block(soap, NULL, 0)))
    9128       return soap->error;
    9129     soap->dime.ptr[soap->dime.size] = '\0'; /* force 0-terminated */
    9130     soap->dime.id = id;
    9131     soap->dime.type = type;
    9132     soap->dime.options = options;
    9133   }
    9134   else
    9135     soap->dime.ptr = soap_getdimefield(soap, soap->dime.size);
    9136   content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, soap->dime.ptr, soap->dime.size);
    9137   if (!content)
    9138     return soap->error = SOAP_EOM;
    9139   content->id = soap->dime.id;
    9140   content->type = soap->dime.type;
    9141   content->options = soap->dime.options;
    9142   return soap->error;
     11561  return soap->error = SOAP_OK;
    914311562}
    914411563#endif
     
    919111610      else if (!soap_tag_cmp(key, "Content-Location"))
    919211611        content->location = soap_strdup(soap, val);
     11612      else if (!soap_tag_cmp(key, "Content-Disposition"))
     11613        content->id = soap_strdup(soap, soap_get_header_attribute(soap, val, "name"));
    919311614      else if (!soap_tag_cmp(key, "Content-Type"))
    919411615        content->type = soap_strdup(soap, val);
     
    919611617        content->description = soap_strdup(soap, val);
    919711618      else if (!soap_tag_cmp(key, "Content-Transfer-Encoding"))
    9198         content->encoding = (enum soap_mime_encoding)soap_int_code(mime_codes, val, (long)SOAP_MIME_NONE);
     11619        content->encoding = (enum soap_mime_encoding)soap_code_int(mime_codes, val, (long)SOAP_MIME_NONE);
    919911620    }
    920011621    if (soap_getline(soap, key, sizeof(soap->msgbuf)))
     
    921311634SOAP_FMAC2
    921411635soap_getmime(struct soap *soap)
    9215 { register soap_wchar c;
    9216   if (!soap->mime.last)
    9217     return SOAP_OK;
     11636{ while (soap_get_mime_attachment(soap, NULL))
     11637    ;
     11638  return soap->error;
     11639}
     11640#endif
     11641#endif
     11642
     11643/******************************************************************************/
     11644#ifndef WITH_LEANER
     11645#ifndef PALM_1
     11646SOAP_FMAC1
     11647void
     11648SOAP_FMAC2
     11649soap_post_check_mime_attachments(struct soap *soap)
     11650{ soap->imode |= SOAP_MIME_POSTCHECK;
     11651}
     11652#endif
     11653#endif
     11654
     11655/******************************************************************************/
     11656#ifndef WITH_LEANER
     11657#ifndef PALM_1
     11658SOAP_FMAC1
     11659int
     11660SOAP_FMAC2
     11661soap_check_mime_attachments(struct soap *soap)
     11662{ if (soap->mode & SOAP_MIME_POSTCHECK)
     11663    return soap_get_mime_attachment(soap, NULL) != NULL;
     11664  return 0;
     11665}
     11666#endif
     11667#endif
     11668
     11669/******************************************************************************/
     11670#ifndef WITH_LEANER
     11671#ifndef PALM_1
     11672SOAP_FMAC1
     11673struct soap_multipart *
     11674SOAP_FMAC2
     11675soap_get_mime_attachment(struct soap *soap, void *handle)
     11676{ register soap_wchar c = 0;
     11677  register size_t i, m = 0;
     11678  register char *s, *t = NULL;
     11679  register struct soap_multipart *content;
     11680  register short flag = 0;
     11681  if (!(soap->mode & SOAP_ENC_MIME))
     11682    return NULL;
     11683  content = soap->mime.last;
     11684  if (!content)
     11685  { if (soap_getmimehdr(soap))
     11686      return NULL;
     11687    content = soap->mime.last;
     11688  }
     11689  else if (content != soap->mime.first)
     11690  { if (soap->fmimewriteopen && ((content->ptr = (char*)soap->fmimewriteopen(soap, (void*)handle, content->id, content->type, content->description, content->encoding)) || soap->error))
     11691    { if (!content->ptr)
     11692        return NULL;
     11693    }
     11694  }
     11695  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Parsing MIME content id=%s type=%s\n", content->id?content->id:SOAP_STR_EOS, content->type?content->type:SOAP_STR_EOS));
     11696  if (!content->ptr && soap_new_block(soap) == NULL)
     11697  { soap->error = SOAP_EOM;
     11698    return NULL;
     11699  }
    921811700  for (;;)
    9219   { register size_t i, m = 0;
    9220     register char *s;
    9221     struct soap_multipart *content = soap->mime.last;
    9222     DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Parsing MIME content id=%s type=%s\n", content->id?content->id:"", content->type?content->type:""));
    9223     if (soap_new_block(soap))
    9224       return soap->error = SOAP_EOM;
    9225     for (;;)
    9226     { register char *t = NULL;
    9227       if (!(s = (char*)soap_push_block(soap, SOAP_BLKLEN)))
    9228         return soap->error = SOAP_EOM;
    9229       for (i = 0; i < SOAP_BLKLEN; i++)
    9230       { if (m > 0)
    9231         { *s++ = *t++;
    9232           m--;
    9233         }
    9234         else
     11701  { if (content->ptr)
     11702      s = soap->tmpbuf;
     11703    else if (!(s = (char*)soap_push_block(soap, NULL, sizeof(soap->tmpbuf))))
     11704    { soap->error = SOAP_EOM;
     11705      return NULL;
     11706    }
     11707    for (i = 0; i < sizeof(soap->tmpbuf); i++)
     11708    { if (m > 0)
     11709      { *s++ = *t++;
     11710        m--;
     11711      }
     11712      else
     11713      { if (!flag)
    923511714        { c = soap_get1(soap);
    9236           if ((int)c == EOF)
    9237             return soap->error = SOAP_EOF;
    9238           if (c == '\r')
    9239           { t = soap->tmpbuf;
    9240             strcpy(t, "\n--");
    9241             strncat(t, soap->mime.boundary, sizeof(soap->tmpbuf)-3);
    9242             t[sizeof(soap->tmpbuf)-1] = '\0';
    9243             do c = soap_getchar(soap);
    9244             while (c == *t++);
    9245             if ((int)c == EOF)
    9246               return soap->error = SOAP_EOF;
    9247             if (!*--t)
    9248               goto end;
    9249             *t = (char)c;
    9250             m = t - soap->tmpbuf + 1;
    9251             t = soap->tmpbuf;
    9252             c = '\r';
    9253           }
    9254           *s++ = (char)c;
     11715          if ((int)c == EOF)
     11716          { soap->error = SOAP_EOF;
     11717            return NULL;
     11718          }
    925511719        }
    9256       }
    9257     }
     11720        if (flag || c == '\r')
     11721        { t = soap->msgbuf;
     11722          memset(t, 0, sizeof(soap->msgbuf));
     11723          strcpy(t, "\n--");
     11724          if (soap->mime.boundary)
     11725            strncat(t, soap->mime.boundary, sizeof(soap->msgbuf)-4);
     11726          do c = soap_getchar(soap);
     11727          while (c == *t++);
     11728          if ((int)c == EOF)
     11729          { soap->error = SOAP_EOF;
     11730            return NULL;
     11731          }
     11732          if (!*--t)
     11733            goto end;
     11734          *t = (char)c;
     11735          flag = (c == '\r');
     11736          m = t - soap->msgbuf + 1 - flag;
     11737          t = soap->msgbuf;
     11738          c = '\r';
     11739        }
     11740        *s++ = (char)c;
     11741      }
     11742    }
     11743    if (content->ptr && soap->fmimewrite)
     11744    { if ((soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i)))
     11745        break;
     11746    }
     11747  }
    925811748end:
    9259     *s = '\0'; /* force 0-terminated */
    9260     content->size = soap_size_block(soap, i+1)-1;
    9261     content->ptr = soap_save_block(soap, NULL, 0);
    9262     if (c == '-' && soap_getchar(soap) == '-')
    9263       break;
    9264     while (c != '\r' && (int)c != EOF && soap_blank(c))
     11749  *s = '\0'; /* force 0-terminated */
     11750  if (content->ptr)
     11751  { if (!soap->error && soap->fmimewrite)
     11752      soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i);
     11753    if (soap->fmimewriteclose)
     11754      soap->fmimewriteclose(soap, (void*)content->ptr);
     11755    if (soap->error)
     11756      return NULL;
     11757  }
     11758  else
     11759  { content->size = soap_size_block(soap, NULL, i+1)-1;
     11760    content->ptr = soap_save_block(soap, NULL, NULL, 0);
     11761  }
     11762  soap_resolve_attachment(soap, content);
     11763  if (c == '-' && soap_getchar(soap) == '-')
     11764  { soap->mode &= ~SOAP_ENC_MIME;
     11765    if ((soap->mode & SOAP_MIME_POSTCHECK) && soap_end_recv(soap))
     11766      return NULL;
     11767  }
     11768  else
     11769  { while (c != '\r' && (int)c != EOF && soap_blank(c))
    926511770      c = soap_getchar(soap);
    926611771    if (c != '\r' || soap_getchar(soap) != '\n')
    9267       return soap->error = SOAP_MIME_ERROR;
     11772    { soap->error = SOAP_MIME_ERROR;
     11773      return NULL;
     11774    }
    926811775    if (soap_getmimehdr(soap))
    9269       return soap->error;
    9270   }
    9271   do c = soap_getchar(soap);
    9272   while ((int)c != EOF && c != '\r');
    9273   if ((int)c == EOF)
    9274     return soap->error = SOAP_EOF;
    9275   if (soap_getchar(soap) != '\n')
    9276     return soap->error = SOAP_MIME_ERROR;
    9277   return SOAP_OK;
     11776      return NULL;
     11777  }
     11778  return content;
     11779}
     11780#endif
     11781#endif
     11782
     11783/******************************************************************************/
     11784#ifndef WITH_LEANER
     11785#ifndef PALM_1
     11786SOAP_FMAC1
     11787int
     11788SOAP_FMAC2
     11789soap_match_cid(struct soap *soap, const char *s, const char *t)
     11790{ register size_t n;
     11791  if (!s)
     11792    return 1;
     11793  if (!strcmp(s, t))
     11794    return 0;
     11795  if (!strncmp(s, "cid:", 4))
     11796    s += 4;
     11797  n = strlen(t);
     11798  if (*t == '<')
     11799  { t++;
     11800    n -= 2;
     11801  }
     11802  if (!strncmp(s, t, n) && !s[n])
     11803    return 0;
     11804  soap_decode(soap->tmpbuf, sizeof(soap->tmpbuf), s, SOAP_STR_EOS);
     11805  if (!strncmp(soap->tmpbuf, t, n) && !soap->tmpbuf[n])
     11806    return 0;
     11807  return 1;
     11808}
     11809#endif
     11810#endif
     11811
     11812/******************************************************************************/
     11813#ifndef WITH_LEANER
     11814#ifndef PALM_1
     11815static void
     11816soap_resolve_attachment(struct soap *soap, struct soap_multipart *content)
     11817{ if (content->id)
     11818  { register struct soap_xlist **xp = &soap->xlist;
     11819    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving attachment data for id=%s\n", content->id));
     11820    while (*xp)
     11821    { register struct soap_xlist *xq = *xp;
     11822      if (!soap_match_cid(soap, xq->id, content->id))
     11823      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Found matching attachment %s for content id=%s\n", xq->id, content->id));
     11824        *xp = xq->next;
     11825        *xq->ptr = (unsigned char*)content->ptr;
     11826        *xq->size = (int)content->size;
     11827        *xq->type = (char*)content->type;
     11828        if (content->options)
     11829          *xq->options = (char*)content->options;
     11830        else
     11831          *xq->options = (char*)content->description;
     11832        SOAP_FREE(soap, xq);
     11833      }
     11834      else
     11835        xp = &(*xp)->next;
     11836    }
     11837  }
    927811838}
    927911839#endif
     
    928811848soap_putmimehdr(struct soap *soap, struct soap_multipart *content)
    928911849{ const char *s;
    9290   DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MIME attachment type=%s\n", content->type?content->type:""));
     11850  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MIME attachment type=%s\n", content->type?content->type:SOAP_STR_EOS));
    929111851  if (soap_send3(soap, "\r\n--", soap->mime.boundary, "\r\n"))
    929211852    return soap->error;
    929311853  if (content->type && soap_send3(soap, "Content-Type: ", content->type, "\r\n"))
    929411854    return soap->error;
    9295   s = soap_str_code(mime_codes, content->encoding);
     11855  s = soap_code_str(mime_codes, content->encoding);
    929611856  if (s && soap_send3(soap, "Content-Transfer-Encoding: ", s, "\r\n"))
    929711857    return soap->error;
     
    931911879  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending MIME attachments\n"));
    932011880  for (content = soap->mime.first; content; content = content->next)
    9321     if (soap_putmimehdr(soap, content)
    9322      || soap_send_raw(soap, content->ptr, content->size))
    9323       return soap->error;
    9324   return soap_send3(soap, "\r\n--", soap->mime.boundary, "--\r\n");
     11881  { void *handle;
     11882    if (soap->fmimereadopen && ((handle = soap->fmimereadopen(soap, (void*)content->ptr, content->id, content->type, content->description)) || soap->error))
     11883    { size_t size = content->size;
     11884      if (!handle)
     11885      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimereadopen failed\n"));
     11886        return soap->error;
     11887      }
     11888      if (soap_putmimehdr(soap, content))
     11889        return soap->error;
     11890      if (!size)
     11891      { if ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE)
     11892        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming MIME\n"));
     11893          do
     11894          { size = soap->fmimeread(soap, handle, soap->tmpbuf, sizeof(soap->tmpbuf));
     11895            DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimeread returned %lu bytes\n", (unsigned long)size));
     11896            if (soap_send_raw(soap, soap->tmpbuf, size))
     11897              break;
     11898          } while (size);
     11899        }
     11900        else
     11901        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error: cannot chunk streaming MIME (no HTTP chunking)\n"));
     11902        }
     11903      }
     11904      else
     11905      { do
     11906        { size_t bufsize;
     11907          if (size < sizeof(soap->tmpbuf))
     11908            bufsize = size;
     11909          else
     11910            bufsize = sizeof(soap->tmpbuf);
     11911          if (!(bufsize = soap->fmimeread(soap, handle, soap->tmpbuf, bufsize)))
     11912          { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)content->size));
     11913            soap->error = SOAP_EOF;
     11914            break;
     11915          }
     11916          if (soap_send_raw(soap, soap->tmpbuf, bufsize))
     11917            break;
     11918          size -= bufsize;
     11919        } while (size);
     11920      }
     11921      if (soap->fmimereadclose)
     11922        soap->fmimereadclose(soap, handle);
     11923    }
     11924    else
     11925    { if (soap_putmimehdr(soap, content)
     11926       || soap_send_raw(soap, content->ptr, content->size))
     11927        return soap->error;
     11928    }
     11929  }
     11930  return soap_send3(soap, "\r\n--", soap->mime.boundary, "--");
    932511931}
    932611932#endif
     
    947812084      n = strlen(s);
    947912085    if (n < 16)
    9480     { n = 72;
    9481       s = soap->mime.boundary = (char*)soap_malloc(soap, n);
     12086    { n = 64;
     12087      s = soap->mime.boundary = (char*)soap_malloc(soap, n + 1);
    948212088      if (!s)
    948312089        return;
    948412090    }
    9485     strcpy(s, "<>");
     12091    strcpy(s, "==");
    948612092    s += 2;
    948712093    n -= 4;
    948812094    while (n)
    9489     { *s++ = soap_base64o[rand()&0x3F];
     12095    { *s++ = soap_base64o[soap_random & 0x3F];
    949012096      n--;
    949112097    }
    9492     *s = '\0';
    9493     strcat(s, "<>");
     12098    strcpy(s, "==");
    949412099  }
    949512100  if (!soap->mime.start)
     
    950512110soap_valid_mime_boundary(struct soap *soap)
    950612111{ register struct soap_multipart *content;
    9507   register size_t k = strlen(soap->mime.boundary);
     12112  register size_t k;
     12113  if (soap->fmimeread)
     12114    return SOAP_OK;
     12115  k = strlen(soap->mime.boundary);
    950812116  for (content = soap->mime.first; content; content = content->next)
    950912117  { if (content->ptr && content->size >= k)
     
    951112119      register size_t i;
    951212120      for (i = 0; i < content->size - k; i++, p++)
    9513         if (!strncmp(p, soap->mime.boundary, k))
     12121      { if (!strncmp(p, soap->mime.boundary, k))
    951412122          return SOAP_ERR;
     12123      }
    951512124    }
    951612125  }
     
    952012129#endif
    952112130
    9522 /******************************************************************************/
     12131/******************************************************************************\
     12132 *
     12133 *      HTTP cookie handling
     12134 *
     12135\******************************************************************************/
    952312136
    952412137#ifdef WITH_COOKIES
     
    953112144  register size_t n = len;
    953212145  while ((c = *s++) && --n > 0)
    9533   { if (c > ' ' && c < 128 && c != ';' && c != ',')
     12146  { if (c > ' ' && c < 128 && !strchr("()<>@,;:\\\"/[]?={}", c))
    953412147      *t++ = c;
    953512148    else if (n > 2)
     
    955812171  if (!path)
    955912172    path = soap->cookie_path;
    9560   if (*path == '/')
     12173  if (!path)
     12174    path = SOAP_STR_EOS;
     12175  else if (*path == '/')
    956112176    path++;
    956212177  n = strlen(path);
     12178  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Search cookie %s domain=%s path=%s\n", name, domain?domain:"(null)", path?path:"(null)"));
    956312179  for (p = soap->cookies; p; p = p->next)
     12180  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie in database: %s=%s domain=%s path=%s env=%hd\n", p->name, p->value?p->value:"(null)", p->domain?p->domain:"(null)", p->path?p->path:"(null)", p->env));
    956412181    if (!strcmp(p->name, name)
    9565      && domain
    956612182     && p->domain
     12183     && p->path
    956712184     && !strcmp(p->domain, domain)
    956812185     && !strncmp(p->path, path, n))
    956912186      break;
     12187  }
    957012188  return p;
    957112189}
     
    957812196{ struct soap_cookie **p, *q;
    957912197  int n;
    9580   DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie: %s=%s domain=%s path=%s\n", name, value?value:"", domain?domain:"", path?path:""));
    958112198  if (!domain)
    958212199    domain = soap->cookie_domain;
     
    958412201    path = soap->cookie_path;
    958512202  if (!path)
    9586   { soap_set_receiver_error(soap, "Cookie path not set", NULL, SOAP_HTTP_ERROR);
    9587     return NULL;
    9588   }
    9589   if (*path == '/')
     12203    path = SOAP_STR_EOS;
     12204  else if (*path == '/')
    959012205    path++;
    959112206  q = soap_cookie(soap, name, domain, path);
     12207  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set %scookie: %s=%s domain=%s path=%s\n", q ? SOAP_STR_EOS : "new ", name, value?value:"(null)", domain?domain:"(null)", path?path:"(null)"));
    959212208  if (!q)
    9593   { if ((q = (struct soap_cookie*)SOAP_MALLOC(sizeof(struct soap_cookie))))
    9594     { if ((q->name = (char*)SOAP_MALLOC(strlen(name)+1)))
     12209  { if ((q = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie))))
     12210    { if ((q->name = (char*)SOAP_MALLOC(soap, strlen(name)+1)))
    959512211        strcpy(q->name, name);
    959612212      q->value = NULL;
    959712213      q->domain = NULL;
    959812214      q->path = NULL;
    9599       q->expire = -1;
    9600       q->version = 0;
     12215      q->expire = 0;
     12216      q->maxage = -1;
     12217      q->version = 1;
    960112218      q->secure = 0;
    9602       q->env = 0;
    960312219      q->modified = 0;
    960412220      for (p = &soap->cookies, n = soap->cookie_max; *p && n; p = &(*p)->next, n--)
    9605         if (!strcmp((*p)->name, name) && (*p)->path && strcmp((*p)->path, path) < 0)
     12221        if (!strcmp((*p)->name, name) && (*p)->path && path && strcmp((*p)->path, path) < 0)
    960612222          break;
    960712223      if (n)
     
    961012226      }
    961112227      else
    9612       { SOAP_FREE(q->name);
    9613         SOAP_FREE(q);
     12228      { SOAP_FREE(soap, q->name);
     12229        SOAP_FREE(soap, q);
    961412230        q = NULL;
    961512231      }
     
    962012236  if (q)
    962112237  { if (q->value)
    9622     { SOAP_FREE(q->value);
     12238    { SOAP_FREE(soap, q->value);
    962312239      q->value = NULL;
    962412240    }
    962512241    if (q->domain)
    9626     { SOAP_FREE(q->domain);
     12242    { SOAP_FREE(soap, q->domain);
    962712243      q->domain = NULL;
    962812244    }
    962912245    if (q->path)
    9630     { SOAP_FREE(q->path);
     12246    { SOAP_FREE(soap, q->path);
    963112247      q->path = NULL;
    963212248    }
    9633     if (value && *value && (q->value = (char*)SOAP_MALLOC(strlen(value)+1)))
     12249    if (value && *value && (q->value = (char*)SOAP_MALLOC(soap, strlen(value)+1)))
    963412250      strcpy(q->value, value);
    9635     if (domain && *domain && (q->domain = (char*)SOAP_MALLOC(strlen(domain)+1)))
     12251    if (domain && (q->domain = (char*)SOAP_MALLOC(soap, strlen(domain)+1)))
    963612252      strcpy(q->domain, domain);
    9637     if (path && *path && (q->path = (char*)SOAP_MALLOC(strlen(path)+1)))
     12253    if (path && (q->path = (char*)SOAP_MALLOC(soap, strlen(path)+1)))
    963812254      strcpy(q->path, path);
    963912255    q->session = 1;
     12256    q->env = 0;
    964012257  }
    964112258  return q;
     
    965112268    domain = soap->cookie_domain;
    965212269  if (!domain)
    9653   { soap_set_receiver_error(soap, "Cookie domain not set", SOAP_STR_EOS, SOAP_HTTP_ERROR);
     12270  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in clear cookie %s: cookie domain not set\n", name?name:"(null)"));
    965412271    return;
    965512272  }
     
    965712274    path = soap->cookie_path;
    965812275  if (!path)
    9659   { soap_set_receiver_error(soap, "Cookie path not set", SOAP_STR_EOS, SOAP_HTTP_ERROR);
     12276  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in clear cookie %s: cookie path not set\n", name?name:"(null)"));
    966012277    return;
    966112278  }
     
    966312280    path++;
    966412281  for (p = &soap->cookies, q = *p; q; q = *p)
    9665     if (!strcmp(q->name, name) && !strcmp(q->domain, domain) && !strncmp(q->path, path, strlen(q->path)))
     12282  { if (!strcmp(q->name, name) && !strcmp(q->domain, domain) && !strncmp(q->path, path, strlen(q->path)))
    966612283    { if (q->value)
    9667         SOAP_FREE(q->value);
     12284        SOAP_FREE(soap, q->value);
    966812285      if (q->domain)
    9669         SOAP_FREE(q->domain);
     12286        SOAP_FREE(soap, q->domain);
    967012287      if (q->path)
    9671         SOAP_FREE(q->path);
     12288        SOAP_FREE(soap, q->path);
    967212289      *p = q->next;
    9673       SOAP_FREE(q);
     12290      SOAP_FREE(soap, q);
    967412291    }
    967512292    else
    967612293      p = &q->next;
     12294  }
    967712295}
    967812296
     
    969012308/******************************************************************************/
    969112309SOAP_FMAC1
    9692 long
     12310char *
     12311SOAP_FMAC2
     12312soap_env_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path)
     12313{ struct soap_cookie *p;
     12314  if ((p = soap_cookie(soap, name, domain, path)) && p->env)
     12315    return p->value;
     12316  return NULL;
     12317}
     12318
     12319/******************************************************************************/
     12320SOAP_FMAC1
     12321time_t
    969312322SOAP_FMAC2
    969412323soap_cookie_expire(struct soap *soap, const char *name, const char *domain, const char *path)
     
    970512334soap_set_cookie_expire(struct soap *soap, const char *name, long expire, const char *domain, const char *path)
    970612335{ struct soap_cookie *p;
     12336  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie expiration max-age %ld: %s domain=%s path=%s\n", expire, name, domain?domain:"(null)", path?path:"(null)"));
    970712337  if ((p = soap_cookie(soap, name, domain, path)))
    9708   { p->expire = expire;
     12338  { p->maxage = expire;
    970912339    p->modified = 1;
    971012340    return SOAP_OK;
     
    975012380  const char *t;
    975112381  for (p = soap->cookies; p; p = p->next)
    9752   { if (p->modified || !p->env)
     12382  {
     12383    if (p->modified
     12384#ifdef WITH_OPENSSL
     12385     || (!p->env && !soap->ssl == !p->secure)
     12386#endif
     12387       )
    975312388    { s = tmp;
    975412389      if (p->name)
     
    975912394      }
    976012395      if (p->domain && (int)strlen(p->domain) < tmp-s+4064)
    9761         sprintf(s, ";Domain=%s", p->domain);
     12396      { strcpy(s, ";Domain=");
     12397        strcat(s, p->domain);
     12398      }
    976212399      else if (soap->cookie_domain && (int)strlen(soap->cookie_domain) < tmp-s+4064)
    9763         sprintf(s, ";Domain=%s", soap->cookie_domain);
     12400      { strcpy(s, ";Domain=");
     12401        strcat(s, soap->cookie_domain);
     12402      }
    976412403      strcat(s, ";Path=/");
     12404      s += strlen(s);
    976512405      if (p->path)
    976612406        t = p->path;
     
    977112411          t++;
    977212412        if ((int)strlen(t) < tmp-s+4064)
    9773           strcat(s, t);
    9774       }
    9775       s += strlen(s);
    9776       if (p->version > 0)
    9777         sprintf(s, ";Version=%u", p->version);
    9778       if (p->expire >= 0)
    9779         sprintf(s, ";Max-Age=%ld", p->expire);
    9780       if (p->secure)
    9781         strcat(s, ";Secure");
     12413        { if (strchr(t, '%'))   /* already URL encoded? */
     12414          { strcpy(s, t);
     12415            s += strlen(s);
     12416          }
     12417          else
     12418            s += soap_encode_cookie(t, s, tmp-s+4064);
     12419        }
     12420      }
     12421      if (p->version > 0 && s-tmp < 4060)
     12422      { sprintf(s, ";Version=%u", p->version);
     12423        s += strlen(s);
     12424      }
     12425      if (p->maxage >= 0 && s-tmp < 4060)
     12426      { sprintf(s, ";Max-Age=%ld", p->maxage);
     12427        s += strlen(s);
     12428      }
     12429      if (s-tmp < 4073
     12430       && (p->secure
     12431#ifdef WITH_OPENSSL
     12432       || soap->ssl
     12433#endif
     12434         ))
     12435        strcpy(s, ";Secure");
    978212436      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set-Cookie: %s\n", tmp));
    9783       if (soap->fposthdr(soap, "Set-Cookie", tmp))
     12437      if ((soap->error = soap->fposthdr(soap, "Set-Cookie", tmp)))
    978412438        return soap->error;
    978512439    }
     
    979812452  char *s, tmp[4096];
    979912453  p = &soap->cookies;
     12454  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending cookies for domain=%s path=%s\n", domain, path));
     12455  if (*path == '/')
     12456    path++;
    980012457  while ((q = *p))
    980112458  { if (q->expire && now > q->expire)
    980212459    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie %s expired\n", q->name));
    9803       SOAP_FREE(q->name);
     12460      SOAP_FREE(soap, q->name);
    980412461      if (q->value)
    9805         SOAP_FREE(q->value);
     12462        SOAP_FREE(soap, q->value);
    980612463      if (q->domain)
    9807         SOAP_FREE(q->domain);
     12464        SOAP_FREE(soap, q->domain);
    980812465      if (q->path)
    9809         SOAP_FREE(q->path);
     12466        SOAP_FREE(soap, q->path);
    981012467      *p = q->next;
    9811       SOAP_FREE(q);
    9812     }
    9813     else if ((!q->domain || !strcmp(q->domain, domain))
     12468      SOAP_FREE(soap, q);
     12469    }
     12470    else
     12471    { int flag;
     12472      char *t = q->domain;
     12473      size_t n = 0;
     12474      if (!t)
     12475        flag = 1;
     12476      else
     12477      { const char *r = strchr(t, ':');
     12478        if (r)
     12479          n = r - t;
     12480        else
     12481          n = strlen(t);
     12482        flag = !strncmp(t, domain, n);
     12483      }
     12484      /* domain-level cookies, cannot compile when WITH_NOIO set */
     12485#ifndef WITH_NOIO
     12486      if (!flag)
     12487      { struct hostent *hostent = gethostbyname((char*)domain);
     12488        if (hostent)
     12489        { const char *r = strchr(hostent->h_name, '.');
     12490          if (!r)
     12491            r = hostent->h_name;
     12492          flag = !strncmp(t, r, n);
     12493        }
     12494      }
     12495#endif
     12496      if (flag
    981412497          && (!q->path || !strncmp(q->path, path, strlen(q->path)))
    981512498          && (!q->secure || secure))
    9816     { s = tmp;
    9817       if (q->version != version)
    9818       { sprintf(s, "$Version=%u;", q->version);
    9819         version = q->version;
    9820       }
    9821       if (q->name)
    9822         s += soap_encode_cookie(q->name, s, tmp-s+4080);
    9823       if (q->value && *q->value)
    9824       { *s++ = '=';
    9825         s += soap_encode_cookie(q->value, s, tmp-s+4080);
    9826       }
    9827       if (q->path && (int)strlen(q->path) < tmp-s+4080)
    9828       { sprintf(s, ";$Path=/%s", q->path);
    9829         s += strlen(s);
    9830       }
    9831       if (q->domain && (int)strlen(q->domain) < tmp-s+4080)
    9832         sprintf(s, ";$Domain=%s", q->domain);
    9833       DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie: %s\n", tmp));
    9834       if (soap->fposthdr(soap, "Cookie", tmp))
    9835         return soap->error;
     12499      { s = tmp;
     12500        if (q->version != version)
     12501        { sprintf(s, "$Version=%u;", q->version);
     12502          version = q->version;
     12503        }
     12504        if (q->name)
     12505          s += soap_encode_cookie(q->name, s, tmp-s+4080);
     12506        if (q->value && *q->value)
     12507        { *s++ = '=';
     12508          s += soap_encode_cookie(q->value, s, tmp-s+4080);
     12509        }
     12510        if (q->path && *q->path && (int)strlen(q->path) < tmp-s+4080)
     12511        { sprintf(s, ";$Path=\"/%s\"", (*q->path == '/' ? q->path + 1 : q->path));
     12512          s += strlen(s);
     12513        }
     12514        if (q->domain && (int)strlen(q->domain) < tmp-s+4080)
     12515          sprintf(s, ";$Domain=\"%s\"", q->domain);
     12516        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie: %s\n", tmp));
     12517        if ((soap->error = soap->fposthdr(soap, "Cookie", tmp)))
     12518          return soap->error;
     12519      }
    983612520      p = &q->next;
    983712521    }
    9838     else
    9839       p = &q->next;
    984012522  }
    984112523  return SOAP_OK;
     
    987012552    { s = soap_decode_val(tmp, sizeof(tmp), s);
    987112553      if (*tmp)
    9872       { if ((t = (char*)SOAP_MALLOC(strlen(tmp)+1)))
     12554      { if ((t = (char*)SOAP_MALLOC(soap, strlen(tmp)+1)))
    987312555          strcpy(t, tmp);
    987412556      }
     
    987712559      if (p)
    987812560      { if (p->path)
    9879           SOAP_FREE(p->path);
     12561          SOAP_FREE(soap, p->path);
    988012562        p->path = t;
    988112563      }
    988212564      else
    988312565      { if (path)
    9884           SOAP_FREE(path);
     12566          SOAP_FREE(soap, path);
    988512567        path = t;
    988612568      }
     
    988912571    { s = soap_decode_val(tmp, sizeof(tmp), s);
    989012572      if (*tmp)
    9891       { if ((t = (char*)SOAP_MALLOC(strlen(tmp)+1)))
     12573      { if ((t = (char*)SOAP_MALLOC(soap, strlen(tmp)+1)))
    989212574          strcpy(t, tmp);
    989312575      }
     
    989612578      if (p)
    989712579      { if (p->domain)
    9898           SOAP_FREE(p->domain);
    9899         p->domain = t;
     12580          SOAP_FREE(soap, p->domain);
     12581        p->domain = t;
    990012582      }
    990112583      else
    990212584      { if (domain)
    9903           SOAP_FREE(domain);
     12585          SOAP_FREE(soap, domain);
    990412586        domain = t;
    990512587      }
     
    990712589    else if (p && !soap_tag_cmp(tmp, "Path"))
    990812590    { if (p->path)
    9909         SOAP_FREE(p->path);
     12591        SOAP_FREE(soap, p->path);
    991012592      s = soap_decode_val(tmp, sizeof(tmp), s);
    991112593      if (*tmp)
    9912       { if ((p->path = (char*)SOAP_MALLOC(strlen(tmp)+1)))
     12594      { if ((p->path = (char*)SOAP_MALLOC(soap, strlen(tmp)+1)))
    991312595          strcpy(p->path, tmp);
    991412596      }
     
    991812600    else if (p && !soap_tag_cmp(tmp, "Domain"))
    991912601    { if (p->domain)
    9920         SOAP_FREE(p->domain);
     12602        SOAP_FREE(soap, p->domain);
    992112603      s = soap_decode_val(tmp, sizeof(tmp), s);
    992212604      if (*tmp)
    9923       { if ((p->domain = (char*)SOAP_MALLOC(strlen(tmp)+1)))
     12605      { if ((p->domain = (char*)SOAP_MALLOC(soap, strlen(tmp)+1)))
    992412606          strcpy(p->domain, tmp);
    992512607      }
     
    994812630        a[0] = tmp[8];
    994912631        a[1] = tmp[9];
    9950         T.tm_mon = (strstr(mns, a) - mns) / 2;
     12632        T.tm_mon = (int)(strstr(mns, a) - mns) / 2;
    995112633        a[0] = tmp[11];
    995212634        a[1] = tmp[12];
     
    996812650    else
    996912651    { if (p)
    9970       { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie %s=%s domain=%s path=%s expire=%ld secure=%d\n", p->name, p->value?p->value:"", p->domain?p->domain:"", p->path?p->path:"", p->expire, p->secure));
     12652      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie %s=%s domain=%s path=%s expire=%ld secure=%d\n", p->name, p->value?p->value:"(null)", p->domain?p->domain:"(null)", p->path?p->path:"(null)", p->expire, p->secure));
    997112653        if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path)))
    997212654        { q->version = p->version;
     
    997612658        }
    997712659        if (p->name)
    9978           SOAP_FREE(p->name);
     12660          SOAP_FREE(soap, p->name);
    997912661        if (p->value)
    9980           SOAP_FREE(p->value);
     12662          SOAP_FREE(soap, p->value);
    998112663        if (p->domain)
    9982           SOAP_FREE(p->domain);
     12664          SOAP_FREE(soap, p->domain);
    998312665        if (p->path)
    9984           SOAP_FREE(p->path);
    9985         SOAP_FREE(p);
    9986       }
    9987       if ((p = (struct soap_cookie*)SOAP_MALLOC(sizeof(struct soap_cookie))))
    9988       { p->name = (char*)SOAP_MALLOC(strlen(tmp)+1);
     12666          SOAP_FREE(soap, p->path);
     12667        SOAP_FREE(soap, p);
     12668      }
     12669      if ((p = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie))))
     12670      { p->name = (char*)SOAP_MALLOC(soap, strlen(tmp)+1);
    998912671        strcpy(p->name, tmp);
    999012672        s = soap_decode_val(tmp, sizeof(tmp), s);
    999112673        if (*tmp)
    9992         { p->value = (char*)SOAP_MALLOC(strlen(tmp)+1);
     12674        { p->value = (char*)SOAP_MALLOC(soap, strlen(tmp)+1);
    999312675          strcpy(p->value, tmp);
    999412676        }
    999512677        else
    999612678          p->value = NULL;
    9997         p->domain = domain;
    9998         p->path = path;
     12679        if (domain)
     12680          p->domain = domain;
     12681        else if (*soap->host)
     12682        { p->domain = (char*)SOAP_MALLOC(soap, strlen(soap->host)+1);
     12683          strcpy(p->domain, soap->host);
     12684        }
     12685        else
     12686          p->domain = NULL;
     12687        if (path)
     12688          p->path = path;
     12689        else if (soap->path && *soap->path)
     12690        { p->path = (char*)SOAP_MALLOC(soap, strlen(soap->path)+1);
     12691          strcpy(p->path, soap->path);
     12692        }
     12693        else
     12694        { p->path = (char*)SOAP_MALLOC(soap, 2);
     12695          strcpy(p->path, "/");
     12696        }
    999912697        p->expire = 0;
    1000012698        p->secure = 0;
     
    1000412702  }
    1000512703  if (p)
    10006   { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got cookie %s=%s domain=%s path=%s expire=%ld secure=%d\n", p->name, p->value?p->value:"", p->domain?p->domain:"", p->path?p->path:"", p->expire, p->secure));
     12704  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie %s=%s domain=%s path=%s expire=%ld secure=%d\n", p->name, p->value?p->value:"(null)", p->domain?p->domain:"(null)", p->path?p->path:"(null)", p->expire, p->secure));
    1000712705    if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path)))
    1000812706    { q->version = p->version;
    1000912707      q->expire = p->expire;
    1001012708      q->secure = p->secure;
     12709      q->env = 1;
    1001112710    }
    1001212711    if (p->name)
    10013       SOAP_FREE(p->name);
     12712      SOAP_FREE(soap, p->name);
    1001412713    if (p->value)
    10015       SOAP_FREE(p->value);
     12714      SOAP_FREE(soap, p->value);
    1001612715    if (p->domain)
    10017       SOAP_FREE(p->domain);
     12716      SOAP_FREE(soap, p->domain);
    1001812717    if (p->path)
    10019       SOAP_FREE(p->path);
    10020     SOAP_FREE(p);
     12718      SOAP_FREE(soap, p->path);
     12719    SOAP_FREE(soap, p);
    1002112720  }
    1002212721  if (domain)
    10023     SOAP_FREE(domain);
     12722    SOAP_FREE(soap, domain);
    1002412723  if (path)
    10025     SOAP_FREE(path);
     12724    SOAP_FREE(soap, path);
    1002612725}
    1002712726
     
    1005012749struct soap_cookie*
    1005112750SOAP_FMAC2
    10052 soap_copy_cookies(struct soap *soap)
     12751soap_copy_cookies(struct soap *copy, const struct soap *soap)
    1005312752{ struct soap_cookie *p, **q, *r;
    1005412753  q = &r;
    1005512754  for (p = soap->cookies; p; p = p->next)
    10056   { if (!(*q = (struct soap_cookie*)SOAP_MALLOC(sizeof(struct soap_cookie))))
     12755  { if (!(*q = (struct soap_cookie*)SOAP_MALLOC(copy, sizeof(struct soap_cookie))))
    1005712756      return r;
    1005812757    **q = *p;
    1005912758    if (p->name)
    10060     { if (((*q)->name = (char*)SOAP_MALLOC(strlen(p->name)+1)))
     12759    { if (((*q)->name = (char*)SOAP_MALLOC(copy, strlen(p->name)+1)))
    1006112760        strcpy((*q)->name, p->name);
    1006212761    }
    1006312762    if (p->value)
    10064     { if (((*q)->value = (char*)SOAP_MALLOC(strlen(p->value)+1)))
     12763    { if (((*q)->value = (char*)SOAP_MALLOC(copy, strlen(p->value)+1)))
    1006512764        strcpy((*q)->value, p->value);
    1006612765    }
    1006712766    if (p->domain)
    10068     { if (((*q)->domain = (char*)SOAP_MALLOC(strlen(p->domain)+1)))
     12767    { if (((*q)->domain = (char*)SOAP_MALLOC(copy, strlen(p->domain)+1)))
    1006912768        strcpy((*q)->domain, p->domain);
    1007012769    }
    1007112770    if (p->path)
    10072     { if (((*q)->path = (char*)SOAP_MALLOC(strlen(p->path)+1)))
     12771    { if (((*q)->path = (char*)SOAP_MALLOC(copy, strlen(p->path)+1)))
    1007312772        strcpy((*q)->path, p->path);
    1007412773    }
     
    1008712786  for (p = soap->cookies; p; p = soap->cookies)
    1008812787  { soap->cookies = p->next;
    10089     SOAP_FREE(p->name);
     12788    SOAP_FREE(soap, p->name);
    1009012789    if (p->value)
    10091       SOAP_FREE(p->value);
     12790      SOAP_FREE(soap, p->value);
    1009212791    if (p->domain)
    10093       SOAP_FREE(p->domain);
     12792      SOAP_FREE(soap, p->domain);
    1009412793    if (p->path)
    10095       SOAP_FREE(p->path);
    10096     SOAP_FREE(p);
     12794      SOAP_FREE(soap, p->path);
     12795    SOAP_FREE(soap, p);
    1009712796  }
    1009812797}
     
    1010712806soap_getgziphdr(struct soap *soap)
    1010812807{ int i;
    10109   soap_wchar c, f = 0;
     12808  soap_wchar c = 0, f = 0;
    1011012809  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get gzip header\n"));
    1011112810  for (i = 0; i < 9; i++)
     
    1011712816  if (f & 0x04) /* FEXTRA */
    1011812817  { for (i = soap_get1(soap) | (soap_get1(soap) << 8); i; i--)
    10119       if ((int)soap_get1(soap) == EOF)
     12818    { if ((int)soap_get1(soap) == EOF)
    1012012819        return soap->error = SOAP_EOF;
     12820    }
    1012112821  }
    1012212822  if (f & 0x08) /* FNAME */
    10123     do
     12823  { do
    1012412824      c = soap_get1(soap);
    1012512825    while (c && (int)c != EOF);
     12826  }
    1012612827  if ((int)c != EOF && (f & 0x10)) /* FCOMMENT */
    10127     do
     12828  { do
    1012812829      c = soap_get1(soap);
    10129     while (c && (int)f != EOF);
     12830    while (c && (int)c != EOF);
     12831  }
    1013012832  if ((int)c != EOF && (f & 0x01)) /* FHCRC */
    1013112833  { if ((int)(c = soap_get1(soap)) != EOF)
     
    1014612848soap_begin_recv(struct soap *soap)
    1014712849{ soap_wchar c;
     12850  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for input\n"));
    1014812851  soap->error = SOAP_OK;
    10149   soap_free(soap);
     12852  soap_free_temp(soap);
    1015012853  soap_set_local_namespaces(soap);
    1015112854  soap->version = 0;    /* don't assume we're parsing SOAP content by default */
     12855#ifndef WITH_NOIDREF
    1015212856  soap_free_iht(soap);
     12857#endif
    1015312858  if ((soap->imode & SOAP_IO) == SOAP_IO_CHUNK)
    1015412859    soap->omode |= SOAP_IO_CHUNK;
     
    1017012875  soap->cdata = 0;
    1017112876  *soap->endpoint = '\0';
    10172   soap->userid = NULL;
    10173   soap->passwd = NULL;
    1017412877  soap->action = NULL;
    10175   soap->authrealm = NULL;
     12878  soap->header = NULL;
     12879  soap->fault = NULL;
     12880  soap->status = 0;
     12881#ifndef WITH_LEANER
     12882  soap->dom = NULL;
    1017612883  soap->dime.chunksize = 0;
    1017712884  soap->dime.buflen = 0;
     
    1018412891  soap->mime.boundary = NULL;
    1018512892  soap->mime.start = NULL;
     12893  soap->xlist = NULL;
     12894#endif
    1018612895#ifdef WIN32
    1018712896#ifndef UNDER_CE
     
    1018912898  if (!soap_valid_socket(soap->socket))
    1019012899#ifdef __BORLANDC__
    10191     setmode((SOAP_SOCKET)soap->recvfd, O_BINARY);
     12900    setmode(soap->recvfd, O_BINARY);
    1019212901#else
    10193     _setmode((SOAP_SOCKET)soap->recvfd, _O_BINARY);
     12902    _setmode(soap->recvfd, _O_BINARY);
    1019412903#endif
    1019512904#endif
     
    1020012909  soap->zlib_in = SOAP_ZLIB_NONE;
    1020112910  soap->zlib_out = SOAP_ZLIB_NONE;
    10202   soap->d_stream.next_in = Z_NULL;
    10203   soap->d_stream.avail_in = 0;
    10204   soap->d_stream.next_out = (Byte*)soap->buf;
    10205   soap->d_stream.avail_out = SOAP_BUFLEN;
     12911  soap->d_stream->next_in = Z_NULL;
     12912  soap->d_stream->avail_in = 0;
     12913  soap->d_stream->next_out = (Byte*)soap->buf;
     12914  soap->d_stream->avail_out = SOAP_BUFLEN;
    1020612915  soap->z_ratio_in = 1.0;
     12916#endif
     12917#ifdef WITH_OPENSSL
     12918  if (soap->ssl)
     12919    ERR_clear_error();
     12920#endif
     12921#ifndef WITH_LEANER
    1020712922  if (soap->fprepareinit)
    1020812923    soap->fprepareinit(soap);
     
    1021312928  { if (soap_getgziphdr(soap))
    1021412929      return soap->error;
    10215     if (inflateInit2(&soap->d_stream, -MAX_WBITS) != Z_OK)
     12930    if (inflateInit2(soap->d_stream, -MAX_WBITS) != Z_OK)
    1021612931      return soap->error = SOAP_ZLIB_ERROR;
    1021712932    soap->zlib_state = SOAP_ZLIB_INFLATE;
     
    1022012935    soap->z_crc = crc32(0L, NULL, 0);
    1022112936    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n"));
     12937    if (!soap->z_buf)
     12938      soap->z_buf = (char*)SOAP_MALLOC(soap, SOAP_BUFLEN);
    1022212939    memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN);
    1022312940    /* should not chunk over plain transport, so why bother to check? */
     
    1022512942    /*   soap->z_buflen = soap->bufidx; */
    1022612943    /* else */
    10227     soap->d_stream.next_in = (Byte*)(soap->z_buf + soap->bufidx);
    10228     soap->d_stream.avail_in = soap->buflen - soap->bufidx;
     12944    soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx);
     12945    soap->d_stream->avail_in = soap->buflen - soap->bufidx;
    1022912946    soap->z_buflen = soap->buflen;
    1023012947    soap->buflen = soap->bufidx;
     
    1023212949  } 
    1023312950#endif
     12951#ifndef WITH_LEANER
    1023412952  if (c == '-' && soap_get0(soap) == '-')
    1023512953    soap->mode |= SOAP_ENC_MIME;
     
    1023712955    soap->mode |= SOAP_ENC_DIME;
    1023812956  else
     12957#endif
    1023912958  { while (soap_blank(c))
    1024012959      c = soap_getchar(soap);
     
    1024312962    return soap->error = SOAP_EOF;
    1024412963  soap_unget(soap, c);
    10245   if (c != '<' && !(soap->mode & (SOAP_ENC_DIME | SOAP_ENC_ZLIB)))
     12964#ifndef WITH_NOHTTP
     12965  /* if not XML or (start of)BOM or MIME/DIME/ZLIB, assume HTTP header */
     12966  if (c != '<' && c != 0xEF && !(soap->mode & (SOAP_ENC_MIME | SOAP_ENC_DIME | SOAP_ENC_ZLIB)))
    1024612967  { soap->mode &= ~SOAP_IO;
    10247     if ((soap->error = soap->fparse(soap)))
     12968    soap->error = soap->fparse(soap);
     12969    if (soap->error && soap->error < SOAP_STOP)
    1024812970    { soap->keep_alive = 0; /* force close later */
    1024912971      return soap->error;
    1025012972    }
     12973    if (soap->error == SOAP_STOP)
     12974      return soap->error;
     12975    soap->mode = soap->imode; /* if imode is changed, copy */
    1025112976    if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
    1025212977    { soap->chunkbuflen = soap->buflen;
     
    1025412979      soap->chunksize = 0;
    1025512980    }
     12981#ifndef WITH_LEANER
    1025612982    else if (soap->fpreparerecv && soap->buflen != soap->bufidx)
    1025712983      soap->fpreparerecv(soap, soap->buf + soap->bufidx, soap->buflen - soap->bufidx);
     12984#endif
     12985    /* Note: fparse should not use soap_unget to push back last char */
     12986    if (soap_get0(soap) == (int)EOF)
     12987    { if (soap->status == 200)
     12988        return soap->error = SOAP_NO_DATA;
     12989      return soap->error = soap->status;
     12990    }
    1025812991#ifdef WITH_ZLIB
    10259     if (soap->zlib_in)
    10260     { /* fparse should not use soap_unget to push back last char */
     12992    if (soap->zlib_in != SOAP_ZLIB_NONE)
     12993    {
    1026112994#ifdef WITH_GZIP
    10262       c = soap_get1(soap);
    10263       if (c == 0x1F)
    10264       { if (soap_getgziphdr(soap))
    10265           return soap->error;
    10266         if (inflateInit2(&soap->d_stream, -MAX_WBITS) != Z_OK)
    10267           return soap->error = SOAP_ZLIB_ERROR;
    10268         soap->zlib_state = SOAP_ZLIB_INFLATE;
    10269         soap->z_crc = crc32(0L, NULL, 0);
    10270         DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n"));
     12995      if (soap->zlib_in != SOAP_ZLIB_DEFLATE)
     12996      { c = soap_get1(soap);
     12997        if (c == 0x1F)
     12998        { if (soap_getgziphdr(soap))
     12999            return soap->error;
     13000          if (inflateInit2(soap->d_stream, -MAX_WBITS) != Z_OK)
     13001            return soap->error = SOAP_ZLIB_ERROR;
     13002          soap->z_crc = crc32(0L, NULL, 0);
     13003          DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n"));
     13004        }
     13005        else
     13006        { soap_revget1(soap);
     13007          if (inflateInit(soap->d_stream) != Z_OK)
     13008            return soap->error = SOAP_ZLIB_ERROR;
     13009          soap->zlib_in = SOAP_ZLIB_DEFLATE;
     13010        }
    1027113011      }
    1027213012      else
    10273       { soap_revget1(soap);
    10274 #else
    10275       {
    10276 #endif
    10277         if (inflateInit(&soap->d_stream) != Z_OK)
    10278           return soap->error = SOAP_ZLIB_ERROR;
    10279         soap->zlib_state = SOAP_ZLIB_INFLATE;
    10280         DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate initialized\n"));
    10281       }
     13013#endif
     13014      if (inflateInit(soap->d_stream) != Z_OK)
     13015        return soap->error = SOAP_ZLIB_ERROR;
     13016      soap->zlib_state = SOAP_ZLIB_INFLATE;
     13017      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate initialized\n"));
    1028213018      soap->mode |= SOAP_ENC_ZLIB;
     13019      if (!soap->z_buf)
     13020        soap->z_buf = (char*)SOAP_MALLOC(soap, SOAP_BUFLEN);
    1028313021      memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN);
    10284       soap->d_stream.next_in = (Byte*)(soap->z_buf + soap->bufidx);
    10285       soap->d_stream.avail_in = soap->buflen - soap->bufidx;
     13022      soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx);
     13023      soap->d_stream->avail_in = soap->buflen - soap->bufidx;
    1028613024      soap->z_buflen = soap->buflen;
    1028713025      soap->buflen = soap->bufidx;
    1028813026    }
    1028913027#endif
    10290   }
     13028    if (soap->error)
     13029    { if (soap->error == SOAP_FORM && soap->fform)
     13030      { soap->error = soap->fform(soap);
     13031        if (soap->error == SOAP_OK)
     13032          soap->error = SOAP_STOP; /* prevents further processing */
     13033      }
     13034      return soap->error;
     13035    }
     13036  }
     13037#endif
    1029113038#ifndef WITH_LEANER
    1029213039  if (soap->mode & SOAP_ENC_MIME)
    1029313040  { if (soap_getmimehdr(soap))
    1029413041      return soap->error;
     13042    if (soap->mime.start)
     13043    { do
     13044      { if (!soap->mime.last->id)
     13045          break;
     13046        if (!soap_match_cid(soap, soap->mime.start, soap->mime.last->id))
     13047          break;
     13048      } while (soap_get_mime_attachment(soap, NULL));
     13049    }
    1029513050    if (soap_get_header_attribute(soap, soap->mime.first->type, "application/dime"))
    1029613051      soap->mode |= SOAP_ENC_DIME;
     
    1031713072
    1031813073/******************************************************************************/
     13074#ifndef WITH_NOHTTP
    1031913075#ifndef PALM_1
    1032013076static int
    1032113077http_parse(struct soap *soap)
    1032213078{ char header[SOAP_HDRLEN], *s;
    10323   unsigned short g = 0, k;
    10324   DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Waiting for response...\n"));
     13079  unsigned short httpcmd = 0, status = 0, k = 0;
     13080  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Waiting for HTTP request/response...\n"));
    1032513081  *soap->endpoint = '\0';
    1032613082  soap->length = 0;
     13083  soap->userid = NULL;
     13084  soap->passwd = NULL;
     13085  soap->action = NULL;
     13086  soap->authrealm = NULL;
     13087  soap->proxy_from = NULL;
     13088  soap->http_content = NULL;
     13089  soap->status = 0;
    1032713090  do
    1032813091  { if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf)))
    10329       return soap->error;
     13092    { if (soap->error == SOAP_EOF)
     13093        return SOAP_EOF;
     13094      return soap->error = 414;
     13095    }
    1033013096    DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP status: %s\n", soap->msgbuf));
    1033113097    for (;;)
    1033213098    { if (soap_getline(soap, header, SOAP_HDRLEN))
     13099      { if (soap->error == SOAP_EOF)
     13100        { soap->error = SOAP_OK;
     13101          DBGLOG(TEST,SOAP_MESSAGE(fdebug, "EOF in HTTP header, continue anyway\n"));
     13102          break;
     13103        }
    1033313104        return soap->error;
     13105      }
    1033413106      if (!*header)
    1033513107        break;
     
    1033713109      s = strchr(header, ':');
    1033813110      if (s)
    10339       { *s = '\0';
     13111      { char *t;
     13112        *s = '\0';
    1034013113        do s++;
    1034113114        while (*s && *s <= 32);
     13115        if (*s == '"')
     13116          s++;
     13117        t = s + strlen(s) - 1;
     13118        while (t > s && *t <= 32)
     13119          t--;
     13120        if (t >= s && *t == '"')
     13121          t--;
     13122        t[1] = '\0';
    1034213123        if ((soap->error = soap->fparsehdr(soap, header, s)))
    10343           return soap->error;
     13124        { if (soap->error < SOAP_STOP)
     13125            return soap->error;
     13126          status = soap->error;
     13127          soap->error = SOAP_OK;
     13128        }
    1034413129      }
    1034513130    }
    1034613131    if ((s = strchr(soap->msgbuf, ' ')))
    10347       k = (unsigned short)soap_strtoul(s, NULL, 10);
     13132    { k = (unsigned short)soap_strtoul(s, &s, 10);
     13133      if (!soap_blank(*s))
     13134        k = 0;
     13135    }
    1034813136    else
    1034913137      k = 0;
    1035013138  } while (k == 100);
    10351   DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Finished HTTP header parsing\n"));
     13139  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Finished HTTP header parsing, status = %d\n", k));
    1035213140  s = strstr(soap->msgbuf, "HTTP/");
    1035313141  if (s && s[7] != '1')
     
    1036213150    soap->keep_alive = 1;
    1036313151  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Keep alive connection = %d\n", soap->keep_alive));
    10364   if (s && (((g = !strncmp(soap->msgbuf, "GET ", 4))) || !strncmp(soap->msgbuf, "POST ", 5)))
    10365   { size_t m = strlen(soap->endpoint);
    10366     size_t n = m + (s - soap->msgbuf) - 5 - (!g);
    10367     if (n >= sizeof(soap->endpoint))
    10368       n = sizeof(soap->endpoint) - 1;
    10369     strncpy(soap->path, soap->msgbuf + 4 + (!g), n - m);
    10370     soap->path[n - m] = '\0';
    10371     strcat(soap->endpoint, soap->path);
    10372     DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Target endpoint='%s'\n", soap->endpoint));
    10373     if (g)
    10374     { soap->error = soap->fget(soap);
    10375       if (soap->error == SOAP_OK)
    10376         soap->error = SOAP_STOP; /* prevents further processing */
    10377       return soap->error;
    10378     }
     13152  if (k == 0)
     13153  { size_t l = 0;
     13154    if (s)
     13155    { if (!strncmp(soap->msgbuf, "POST ", l = 5))
     13156        httpcmd = 1;
     13157      else if (!strncmp(soap->msgbuf, "GET ", l = 4))
     13158        httpcmd = 2;
     13159      else if (!strncmp(soap->msgbuf, "PUT ", l = 4))
     13160        httpcmd = 3;
     13161      else if (!strncmp(soap->msgbuf, "DELETE ", l = 7))
     13162        httpcmd = 4;
     13163      else if (!strncmp(soap->msgbuf, "HEAD ", l = 5))
     13164        httpcmd = 5;
     13165    }
     13166    if (s && httpcmd)
     13167    { size_t m = strlen(soap->endpoint);
     13168      size_t n = m + (s - soap->msgbuf) - l - 1;
     13169      if (m > n)
     13170        m = n;
     13171      if (n >= sizeof(soap->endpoint))
     13172        n = sizeof(soap->endpoint) - 1;
     13173      strncpy(soap->path, soap->msgbuf + l, n - m);
     13174      soap->path[n - m] = '\0';
     13175      strcat(soap->endpoint, soap->path);
     13176      DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Target endpoint='%s'\n", soap->endpoint));
     13177      if (httpcmd > 1)
     13178      { switch (httpcmd)
     13179        { case  2: soap->error = soap->fget(soap); break;
     13180          case  3: soap->error = soap->fput(soap); break;
     13181          case  4: soap->error = soap->fdel(soap); break;
     13182          case  5: soap->error = soap->fhead(soap); break;
     13183          default: soap->error = SOAP_HTTP_METHOD; break;
     13184        }
     13185        if (soap->error == SOAP_OK)
     13186          soap->error = SOAP_STOP; /* prevents further processing */
     13187        return soap->error;
     13188      }
     13189      if (status)
     13190        return soap->error = status;
     13191    }
     13192    else if (status)
     13193      return soap->error = status;
     13194    else if (s)
     13195      return soap->error = 405;
     13196  }
     13197  soap->status = k;
     13198  /* Status OK (HTTP 200) */
     13199  if (k == 0 || k == 200)
    1037913200    return SOAP_OK;
    10380   }
    10381   if (k == 0 || (k >= 200 && k <= 299) || k == 400 || k == 500)
     13201  /* Status 201 (Created), 202 (Accepted), ... and HTTP 400 and 500 errors.
     13202     Only keep parsing HTTP body when content-length>0 or chunked is set.
     13203  */
     13204  if (((k > 200 && k <= 299) || k == 400 || k == 500) && (soap->length > 0 || (soap->imode & SOAP_IO) == SOAP_IO_CHUNK))
    1038213205    return SOAP_OK;
    10383   return soap_set_receiver_error(soap, "HTTP error", soap->msgbuf, k);
    10384 }
    10385 #endif
    10386 
    10387 /******************************************************************************/
     13206  /* HTTP 400 and 500 headers are supposed to set content-length or chunked.
     13207     For those that don't we keep parsing the body only if content type is
     13208     given and connection closes.
     13209  */
     13210  if ((k == 400 || k == 500) && (soap->http_content || soap->keep_alive == 0))
     13211    return SOAP_OK;
     13212  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP error %d\n", k));
     13213  return soap_set_receiver_error(soap, "HTTP Error", soap->msgbuf, k);
     13214}
     13215#endif
     13216#endif
     13217
     13218/******************************************************************************/
     13219#ifndef WITH_NOHTTP
    1038813220#ifndef PALM_1
    1038913221static int
     
    1040213234#ifndef WITH_LEANER
    1040313235  else if (!soap_tag_cmp(key, "Content-Type"))
    10404   { if (soap_get_header_attribute(soap, val, "application/dime"))
    10405       soap->mode |= SOAP_ENC_DIME;
    10406     else if (soap_get_header_attribute(soap, val, "multipart/related"))
     13236  { const char *action;
     13237    soap->http_content = soap_strdup(soap, val);
     13238    if (soap_get_header_attribute(soap, val, "application/dime"))
     13239      soap->imode |= SOAP_ENC_DIME;
     13240    else if (soap_get_header_attribute(soap, val, "multipart/related")
     13241          || soap_get_header_attribute(soap, val, "multipart/form-data"))
    1040713242    { soap->mime.boundary = soap_strdup(soap, soap_get_header_attribute(soap, val, "boundary"));
    1040813243      soap->mime.start = soap_strdup(soap, soap_get_header_attribute(soap, val, "start"));
    10409       soap->mode |= SOAP_ENC_MIME;
     13244      soap->imode |= SOAP_ENC_MIME;
     13245    }
     13246    action = soap_get_header_attribute(soap, val, "action");
     13247    if (action)
     13248    { if (*action == '"')
     13249      { soap->action = soap_strdup(soap, action + 1);
     13250        soap->action[strlen(soap->action) - 1] = '\0';
     13251      }
     13252      else
     13253        soap->action = soap_strdup(soap, action);
    1041013254    }
    1041113255  }
    1041213256#endif
    1041313257  else if (!soap_tag_cmp(key, "Content-Length"))
    10414     soap->length = soap_strtoul(val, NULL, 10);
     13258  { soap->length = soap_strtoul(val, NULL, 10);
     13259  }
    1041513260  else if (!soap_tag_cmp(key, "Content-Encoding"))
    1041613261  { if (!soap_tag_cmp(val, "deflate"))
     
    1044213287#endif
    1044313288  else if (!soap_tag_cmp(key, "Transfer-Encoding"))
    10444   { soap->mode &= ~SOAP_IO;
     13289  { soap->imode &= ~SOAP_IO;
    1044513290    if (!soap_tag_cmp(val, "chunked"))
    10446       soap->mode |= SOAP_IO_CHUNK;
     13291      soap->imode |= SOAP_IO_CHUNK;
    1044713292  }
    1044813293  else if (!soap_tag_cmp(key, "Connection"))
     
    1045513300  else if (!soap_tag_cmp(key, "Authorization"))
    1045613301  { if (!soap_tag_cmp(val, "Basic *"))
    10457     { size_t n;
     13302    { int n;
    1045813303      char *s;
    1045913304      soap_base642s(soap, val + 6, soap->tmpbuf, sizeof(soap->tmpbuf) - 1, &n);
     
    1046113306      if ((s = strchr(soap->tmpbuf, ':')))
    1046213307      { *s = '\0';
    10463         soap->userid = soap_strdup(soap, soap->tmpbuf);
    10464         soap->passwd = soap_strdup(soap, s + 1);
     13308        soap->userid = soap_strdup(soap, soap->tmpbuf);
     13309        soap->passwd = soap_strdup(soap, s + 1);
    1046513310      }
    1046613311    }
    1046713312  }
    1046813313  else if (!soap_tag_cmp(key, "WWW-Authenticate"))
    10469     soap->authrealm = soap_strdup(soap, soap_get_header_attribute(soap, val+6, "realm"));
     13314  { soap->authrealm = soap_strdup(soap, soap_get_header_attribute(soap, val + 6, "realm"));
     13315  }
    1047013316  else if (!soap_tag_cmp(key, "Expect"))
    1047113317  { if (!soap_tag_cmp(val, "100-continue"))
     
    1047713323#endif
    1047813324  else if (!soap_tag_cmp(key, "SOAPAction"))
    10479   { if (val[0] && val[1])
     13325  { if (*val == '"')
    1048013326    { soap->action = soap_strdup(soap, val + 1);
    1048113327      soap->action[strlen(soap->action) - 1] = '\0';
    1048213328    }
     13329    else
     13330      soap->action = soap_strdup(soap, val);
    1048313331  }
    1048413332  else if (!soap_tag_cmp(key, "Location"))
     
    1048613334    soap->endpoint[sizeof(soap->endpoint) - 1] = '\0';
    1048713335  }
     13336  else if (!soap_tag_cmp(key, "X-Forwarded-For"))
     13337  { soap->proxy_from = soap_strdup(soap, val);
     13338  }
    1048813339#ifdef WITH_COOKIES
    10489   else if (!soap_tag_cmp(key, "Cookie") || !soap_tag_cmp(key, "Set-Cookie"))
    10490     soap_getcookies(soap, val);
     13340  else if (!soap_tag_cmp(key, "Cookie")
     13341   || !soap_tag_cmp(key, "Cookie2")
     13342   || !soap_tag_cmp(key, "Set-Cookie")
     13343   || !soap_tag_cmp(key, "Set-Cookie2"))
     13344  { soap_getcookies(soap, val);
     13345  }
    1049113346#endif
    1049213347  return SOAP_OK;
    1049313348}
    1049413349#endif
    10495 
    10496 /******************************************************************************/
     13350#endif
     13351
     13352/******************************************************************************/
     13353#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER)
    1049713354#ifndef PALM_1
    1049813355SOAP_FMAC1
     
    1051413371}
    1051513372#endif
    10516 
    10517 /******************************************************************************/
     13373#endif
     13374
     13375/******************************************************************************/
     13376#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER)
    1051813377#ifndef PALM_1
    1051913378SOAP_FMAC1
     
    1052413383}
    1052513384#endif
    10526 
    10527 /******************************************************************************/
     13385#endif
     13386
     13387/******************************************************************************/
     13388#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER)
    1052813389#ifndef PALM_1
    1052913390SOAP_FMAC1
     
    1053813399}
    1053913400#endif
    10540 
    10541 /******************************************************************************/
     13401#endif
     13402
     13403/******************************************************************************/
     13404#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER)
    1054213405#ifndef PALM_1
    1054313406static const char*
     
    1055413417  }
    1055513418  else
    10556   { while (soap_notblank(*s) && !strchr(sep, *s) && --len)
     13419  { while (*s && !soap_blank(*s) && !strchr(sep, *s) && --len)
    1055713420    { if (*s == '%')
    1055813421      { *t++ = ((s[1] >= 'A' ? (s[1] & 0x7) + 9 : s[1] - '0') << 4)
     
    1057013433}
    1057113434#endif
     13435#endif
    1057213436
    1057313437/******************************************************************************/
     
    1058013444#ifndef WITH_LEANER
    1058113445  size_t n = 0;
    10582   if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && soap->mime.start)
     13446  if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && soap->mime.start && strlen(soap->mime.boundary) + strlen(soap->mime.start) < sizeof(soap->tmpbuf) - 80 )
    1058313447  { const char *s;
    10584     if (soap->mode & SOAP_ENC_DIME)
     13448    if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM))
    1058513449      s = "application/dime";
    1058613450    else if (soap->version == 2)
    10587       s = "application/soap+xml; charset=utf-8";
     13451    { if (soap->mode & SOAP_ENC_MTOM)
     13452        s = "application/xop+xml; charset=utf-8; type=\"application/soap+xml\"";
     13453      else
     13454        s = "application/soap+xml; charset=utf-8";
     13455    }
     13456    else if (soap->mode & SOAP_ENC_MTOM)
     13457      s = "application/xop+xml; text/xml; charset=utf-8";
    1058813458    else
    1058913459      s = "text/xml; charset=utf-8";
     
    1061413484    return soap->error;
    1061513485#ifndef WITH_LEANER
    10616   if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME))
     13486  if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM))
    1061713487  { soap->dime.size = soap->count - soap->dime.size;    /* DIME in MIME correction */
    1061813488    sprintf(soap->id, soap->dime_id_format, 0);
     
    1062813498    if (!soap->dime.first)
    1062913499      soap->dime.flags |= SOAP_DIME_ME;
    10630     soap->count += 12 + ((strlen(soap->dime.id)+3)&(~3)) + ((strlen(soap->dime.type)+3)&(~3));
    10631   }
    10632   if (soap->mode & SOAP_ENC_DIME)
     13500    soap->count += 12 + ((strlen(soap->dime.id)+3)&(~3)) + (soap->dime.type ? ((strlen(soap->dime.type)+3)&(~3)) : 0);
     13501  }
     13502  if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM))
    1063313503    return soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3);
    1063413504#endif
     
    1064613516{ register struct Namespace *p;
    1064713517  soap->part = SOAP_IN_ENVELOPE;
    10648   if (soap_element_begin_in(soap, "SOAP-ENV:Envelope", 0))
    10649     return soap->error = SOAP_VERSIONMISMATCH;
     13518  if (soap_element_begin_in(soap, "SOAP-ENV:Envelope", 0, NULL))
     13519  {
     13520#ifndef WITH_LEAN
     13521    if (soap->error == SOAP_TAG_MISMATCH && !soap_element_begin_in(soap, "html", 0, NULL))
     13522    { /* get HTML from buffer, stop receiving to avoid HTML parsing issues */
     13523      char *s;
     13524#ifndef WITH_NOIO
     13525      size_t (*f)(struct soap*, char*, size_t) = soap->frecv;
     13526      soap->frecv = frecv_stop;
     13527#endif
     13528      soap_revert(soap);
     13529      s = soap_string_in(soap, 1, -1, -1);
     13530#ifndef WITH_NOIO
     13531      soap->frecv = f;
     13532#endif
     13533      return soap_set_receiver_error(soap, "HTTP Error", s, SOAP_HTTP_ERROR);
     13534    }
     13535#endif
     13536    if (soap->error == SOAP_TAG_MISMATCH)
     13537      return soap->error = SOAP_VERSIONMISMATCH;
     13538    return soap->error;
     13539  }
    1065013540  p = soap->local_namespaces;
    1065113541  if (p)
     
    1065613546    { soap->version = 1; /* make sure we use SOAP 1.1 */
    1065713547      if (p[1].out)
    10658         SOAP_FREE(p[1].out);
    10659       if ((p[1].out = (char*)SOAP_MALLOC(sizeof(soap_enc1))))
     13548        SOAP_FREE(soap, p[1].out);
     13549      if ((p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc1))))
    1066013550        strcpy(p[1].out, soap_enc1);
    1066113551    }
     
    1066313553    { soap->version = 2; /* make sure we use SOAP 1.2 */
    1066413554      if (p[1].out)
    10665         SOAP_FREE(p[1].out);
    10666       if ((p[1].out = (char*)SOAP_MALLOC(sizeof(soap_enc2))))
     13555        SOAP_FREE(soap, p[1].out);
     13556      if ((p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc2))))
    1066713557        strcpy(p[1].out, soap_enc2);
    1066813558    }
     
    1067813568SOAP_FMAC2
    1067913569soap_envelope_end_in(struct soap *soap)
    10680 { if (soap_element_end_in(soap, "SOAP-ENV:Envelope"))
    10681     return soap->error;
    10682   soap->part = SOAP_END_ENVELOPE;
    10683   return SOAP_OK;
     13570{ soap->part = SOAP_END_ENVELOPE;
     13571  return soap_element_end_in(soap, "SOAP-ENV:Envelope");
    1068413572}
    1068513573#endif
     
    1069413582  if (soap->version == 1)
    1069513583    soap->encoding = 1;
     13584#ifndef WITH_LEAN
     13585  if ((soap->mode & SOAP_XML_SEC) && soap_set_attr(soap, "wsu:Id", "Body"))
     13586    return soap->error;
     13587#endif
    1069613588  if (soap_element(soap, "SOAP-ENV:Body", 0, NULL))
    10697     return soap->error;
    10698   if ((soap->mode & SOAP_XML_SEC) && soap_attribute(soap, "id", "_0"))
    1069913589    return soap->error;
    1070013590  return soap_element_start_end_out(soap, NULL);
     
    1071013600{ if (soap_element_end_out(soap, "SOAP-ENV:Body"))
    1071113601    return soap->error;
    10712   soap->part = SOAP_IN_BODY;
     13602  soap->part = SOAP_END_BODY;
    1071313603  return SOAP_OK;
    1071413604}
     
    1072213612soap_body_begin_in(struct soap *soap)
    1072313613{ soap->part = SOAP_IN_BODY;
    10724   return soap_element_begin_in(soap, "SOAP-ENV:Body", 0);
     13614  if (soap_element_begin_in(soap, "SOAP-ENV:Body", 0, NULL))
     13615    return soap->error;
     13616  if (!soap->body)
     13617    soap->part = SOAP_NO_BODY;
     13618  return SOAP_OK;
    1072513619}
    1072613620#endif
     
    1073213626SOAP_FMAC2
    1073313627soap_body_end_in(struct soap *soap)
    10734 { if (soap_element_end_in(soap, "SOAP-ENV:Body"))
    10735     return soap->error;
     13628{ if (soap->part == SOAP_NO_BODY)
     13629    return SOAP_OK;
    1073613630  soap->part = SOAP_END_BODY;
    10737   return SOAP_OK;
     13631  return soap_element_end_in(soap, "SOAP-ENV:Body");
    1073813632}
    1073913633#endif
     
    1074713641{ if (soap_getheader(soap) && soap->error == SOAP_TAG_MISMATCH)
    1074813642    soap->error = SOAP_OK;
     13643  else if (soap->error == SOAP_OK && soap->fheader)
     13644    soap->error = soap->fheader(soap);
    1074913645  return soap->error;
    1075013646}
     
    1075913655{ register const char *s;
    1076013656  register size_t i, n;
    10761   *soap->endpoint = '\0';
    10762   *soap->host = '\0';
    10763   *soap->path = '\0';
     13657  soap->endpoint[0] = '\0';
     13658  soap->host[0] = '\0';
     13659  soap->path[0] = '/';
     13660  soap->path[1] = '\0';
    1076413661  soap->port = 80;
    1076513662  if (!endpoint || !*endpoint)
    1076613663    return;
    1076713664#ifdef WITH_OPENSSL
    10768   if (!strncmp(endpoint, "https:", 6))
     13665  if (!soap_tag_cmp(endpoint, "https:*"))
    1076913666    soap->port = 443;
    1077013667#endif
    1077113668  strncpy(soap->endpoint, endpoint, sizeof(soap->endpoint) - 1);
     13669  soap->endpoint[sizeof(soap->endpoint) - 1] = '\0';
    1077213670  s = strchr(endpoint, ':');
    1077313671  if (s && s[1] == '/' && s[2] == '/')
     
    1077813676  if (n >= sizeof(soap->host))
    1077913677    n = sizeof(soap->host) - 1;
    10780 /* WR[ */
    1078113678#ifdef WITH_IPV6
    10782   if ('[' == s[0])
     13679  if (s[0] == '[')
    1078313680  { s++;
    1078413681    for (i = 0; i < n; i++)
    10785     { soap->host[i] = s[i];
    10786       if (']' == s[i])
    10787       {
    10788         s++;
     13682    { if (s[i] == ']')
     13683      { s++;
     13684        --n;
    1078913685        break;
    1079013686      }
     13687      soap->host[i] = s[i];
    1079113688    }
    1079213689  }
     
    1079813695    }
    1079913696  }
    10800 #else /* WITH_IPV6 */
    10801 /* ]WR */
     13697#else
    1080213698  for (i = 0; i < n; i++)
    1080313699  { soap->host[i] = s[i];
     
    1080513701      break;
    1080613702  }
    10807 /* WR[ */
    10808 #endif /* WITH_IPV6 */
    10809 /* ]WR */
     13703#endif
    1081013704  soap->host[i] = '\0';
    1081113705  if (s[i] == ':')
     
    1081513709        break;
    1081613710  }
    10817   if (s[i])
    10818   { strncpy(soap->path, s + i + 1, sizeof(soap->path));
     13711  if (i < n && s[i])
     13712  { strncpy(soap->path, s + i, sizeof(soap->path));
    1081913713    soap->path[sizeof(soap->path) - 1] = '\0';
    1082013714  }
     
    1084213736  size_t count;
    1084313737  soap->error = SOAP_OK;
    10844   strcpy(host, soap->host); /* save to compare */
    10845   port = soap->port; /* save to compare */
     13738  strcpy(host, soap->host); /* save previous host name to compare */
     13739  port = soap->port; /* save previous port to compare */
     13740  soap->status = http_command;
    1084613741  soap_set_endpoint(soap, endpoint);
    10847   if (action)
    10848     soap->action = soap_strdup(soap, action);
     13742#ifndef WITH_LEANER
    1084913743  if (soap->fconnect)
    10850     if ((soap->error = soap->fconnect(soap, endpoint, soap->host, soap->port)))
     13744  { if ((soap->error = soap->fconnect(soap, endpoint, soap->host, soap->port)))
    1085113745      return soap->error;
    10852   if (*soap->host)
    10853   { soap->status = http_command;
    10854     if (!soap_valid_socket(soap->socket) || strcmp(soap->host, host) || soap->port != port)
    10855     { soap->keep_alive = 0; /* force close */
     13746  }
     13747  else
     13748#endif
     13749  if (soap->fopen && *soap->host)
     13750  { if (!soap->keep_alive || !soap_valid_socket(soap->socket) || strcmp(soap->host, host) || soap->port != port || !soap->fpoll || soap->fpoll(soap))
     13751    { soap->keep_alive = 0; /* to force close */
     13752      soap->omode &= ~SOAP_IO_UDP; /* to force close */
    1085613753      soap_closesock(soap);
    10857       DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Connect to host='%s' path='%s' port=%d\n", soap->host, soap->path, soap->port));
     13754      DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Connect/reconnect to host='%s' path='%s' port=%d\n", soap->host, soap->path, soap->port));
     13755#ifndef WITH_LEAN
     13756      if (!strncmp(endpoint, "soap.udp:", 9))
     13757        soap->omode |= SOAP_IO_UDP;
     13758#endif
    1085813759      soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port);
    1085913760      if (soap->error)
     
    1086113762      soap->keep_alive = ((soap->omode & SOAP_IO_KEEPALIVE) != 0);
    1086213763    }
    10863     else if (!soap->keep_alive || !soap->fpoll || soap->fpoll(soap))
    10864     { soap->keep_alive = 0; /* force close */
    10865       soap_closesock(soap);
    10866       DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Reconnect to host='%s' path='%s' port=%d\n", soap->host, soap->path, soap->port));
    10867       soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port);
    10868       if (soap->error)
    10869         return soap->error;
    10870     }
    10871   }
     13764  }
     13765  count = soap_count_attachments(soap);
    1087213766  if (soap_begin_send(soap))
    1087313767    return soap->error;
    10874   count = soap_count_attachments(soap);
     13768  if (http_command != SOAP_POST)
     13769  { soap->mode &= ~SOAP_IO;
     13770    soap->mode |= SOAP_IO_BUFFER;
     13771  }
     13772#ifndef WITH_NOHTTP
     13773  soap->action = soap_strdup(soap, action);
    1087513774  if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML) && endpoint)
    1087613775  { unsigned int k = soap->mode;
     
    1088013779    if ((soap->error = soap->fpost(soap, endpoint, soap->host, soap->port, soap->path, action, count)))
    1088113780      return soap->error;
     13781#ifndef WITH_LEANER
    1088213782    if ((k & SOAP_IO) == SOAP_IO_CHUNK)
    1088313783    { if (soap_flush(soap))
    1088413784        return soap->error;
    1088513785    }
     13786#endif
    1088613787    soap->mode = k;
    1088713788  }
    1088813789  if (http_command != SOAP_POST)
    1088913790    return soap_end_send(soap);
     13791#endif
    1089013792  return SOAP_OK;
    1089113793}
     
    1089713799char*
    1089813800SOAP_FMAC2
    10899 soap_s2base64(struct soap *soap, const unsigned char *s, char *t, size_t n)
    10900 { register size_t i;
     13801soap_s2base64(struct soap *soap, const unsigned char *s, char *t, int n)
     13802{ register int i;
    1090113803  register unsigned long m;
    1090213804  register char *p;
     
    1090413806    t = (char*)soap_malloc(soap, (n + 2) / 3 * 4 + 1);
    1090513807  if (!t)
    10906   { soap->error = SOAP_EOM;
    1090713808    return NULL;
    10908   }
    1090913809  p = t;
    1091013810  t[0] = '\0';
     
    1094113841const char*
    1094213842SOAP_FMAC2
    10943 soap_base642s(struct soap *soap, const char *s, char *t, size_t l, size_t *n)
     13843soap_base642s(struct soap *soap, const char *s, char *t, size_t l, int *n)
    1094413844{ register int i, j, c;
    1094513845  register unsigned long m;
    10946   char *p = t;
     13846  register const char *p;
     13847  if (!s || !*s)
     13848  { if (n)
     13849      *n = 0;
     13850    if (soap->error)
     13851      return NULL;
     13852    return SOAP_NON_NULL;
     13853  }
     13854  if (!t)
     13855  { l = (strlen(s) + 3) / 4 * 3;
     13856    t = (char*)soap_malloc(soap, l);
     13857  }
     13858  if (!t)
     13859    return NULL;
     13860  p = t;
    1094713861  if (n)
    1094813862    *n = 0;
     
    1096613880          }
    1096713881          if (n)
    10968             *n += i;
     13882            *n += i;
    1096913883          return p;
    1097013884        }
    1097113885        c -= '+';
    1097213886        if (c >= 0 && c <= 79)
    10973         { m = (m << 6) + soap_base64i[c];
     13887        { int b = soap_base64i[c];
     13888          if (b >= 64)
     13889          { soap->error = SOAP_TYPE;
     13890            return NULL; 
     13891          }
     13892          m = (m << 6) + b;
    1097413893          j++;
     13894        }
     13895        else if (!soap_blank(c + '+'))
     13896        { soap->error = SOAP_TYPE;
     13897          return NULL; 
    1097513898        }
    1097613899      }
     
    1098013903      if (l < 3)
    1098113904      { if (n)
    10982           *n += i;
     13905          *n += i;
    1098313906        return p;
    1098413907      }
     
    1099213915
    1099313916/******************************************************************************/
     13917#ifndef WITH_LEAN
     13918SOAP_FMAC1
     13919char*
     13920SOAP_FMAC2
     13921soap_s2hex(struct soap *soap, const unsigned char *s, char *t, int n)
     13922{ register char *p;
     13923  if (!t)
     13924    t = (char*)soap_malloc(soap, 2 * n + 1);
     13925  if (!t)
     13926    return NULL;
     13927  p = t;
     13928  t[0] = '\0';
     13929  if (s)
     13930  { for (; n > 0; n--)
     13931    { register int m = *s++;
     13932      *t++ = (char)((m >> 4) + (m > 159 ? 'a' - 10 : '0'));
     13933      m &= 0x0F;
     13934      *t++ = (char)(m + (m > 9 ? 'a' - 10 : '0'));
     13935    }
     13936  }
     13937  *t++ = '\0';
     13938  return p;
     13939}
     13940#endif
     13941
     13942/******************************************************************************/
     13943#ifndef WITH_LEAN
     13944SOAP_FMAC1
     13945const char*
     13946SOAP_FMAC2
     13947soap_hex2s(struct soap *soap, const char *s, char *t, size_t l, int *n)
     13948{ register const char *p;
     13949  if (!s || !*s)
     13950  { if (n)
     13951      *n = 0;
     13952    if (soap->error)
     13953      return NULL;
     13954    return SOAP_NON_NULL;
     13955  }
     13956  if (!t)
     13957  { l = strlen(s) / 2;
     13958    t = (char*)soap_malloc(soap, l);
     13959  }
     13960  if (!t)
     13961    return NULL;
     13962  p = t;
     13963  while (l)
     13964  { register int d1, d2;
     13965    d1 = *s++;
     13966    if (!d1)
     13967      break;
     13968    d2 = *s++;
     13969    if (!d2)
     13970      break;
     13971    *t++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0');
     13972    l--;
     13973  }
     13974  if (n)
     13975    *n = (int)(t - p);
     13976  return p;
     13977}
     13978#endif
     13979
     13980/******************************************************************************/
     13981#ifndef WITH_NOHTTP
    1099413982#ifndef PALM_1
    1099513983SOAP_FMAC1
     
    1099713985SOAP_FMAC2
    1099813986soap_puthttphdr(struct soap *soap, int status, size_t count)
    10999 { register const char *s;
    11000   register int err;
    11001   if (status == SOAP_FILE)
    11002     s = soap->http_content;
    11003   else if (status == SOAP_HTML)
    11004     s = "text/html; charset=utf-8";
     13987{ if (soap->status != SOAP_GET)
     13988  { register const char *s = "text/xml; charset=utf-8";
     13989    register int err = SOAP_OK;
    1100513990#ifndef WITH_LEANER
    11006   else if (soap->mode & SOAP_ENC_DIME)
    11007     s = "application/dime";
    11008 #endif
    11009   else if (soap->version == 2)
    11010     s = "application/soap+xml; charset=utf-8";
    11011   else
    11012     s = "text/xml; charset=utf-8";
     13991    register const char *r = NULL;
     13992#endif
     13993    if (status == SOAP_FILE && soap->http_content)
     13994      s = soap->http_content;
     13995    else if (status == SOAP_HTML)
     13996      s = "text/html; charset=utf-8";
     13997    else if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK))
     13998    { if (soap->version == 2)
     13999        s = "application/soap+xml; charset=utf-8";
     14000    }
    1101314001#ifndef WITH_LEANER
    11014   if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && soap->mime.start && soap->status != SOAP_GET)
    11015   { sprintf(soap->tmpbuf, "multipart/related; boundary=\"%s\"; type=%s; start=\"%s\"", soap->mime.boundary, s, soap->mime.start);
    11016     s = soap->tmpbuf;
    11017   }
    11018 #endif
    11019   if ((err = soap->fposthdr(soap, "Content-Type", s)))
    11020     return err;
     14002    if (soap->mode & (SOAP_ENC_DIME | SOAP_ENC_MTOM))
     14003    { if (soap->mode & SOAP_ENC_MTOM)
     14004      { r = s;
     14005        s = "application/xop+xml; charset=utf-8";
     14006      }
     14007      else
     14008        s = "application/dime";
     14009    }
     14010    if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && strlen(soap->mime.boundary) + strlen(soap->mime.start ? soap->mime.start : SOAP_STR_EOS) < sizeof(soap->tmpbuf) - 80)
     14011    { register const char *t = strchr(s, ';');
     14012      sprintf(soap->tmpbuf, "multipart/related; boundary=\"%s\"; type=\"", soap->mime.boundary);
     14013      if (t)
     14014      { strncat(soap->tmpbuf, s, t - s);
     14015        soap->tmpbuf[sizeof(soap->tmpbuf)-1] = '\0';
     14016      }
     14017      else
     14018        strcat(soap->tmpbuf, s);
     14019      if (soap->mime.start)
     14020      { strcat(soap->tmpbuf, "\"; start=\"");
     14021        strcat(soap->tmpbuf, soap->mime.start);
     14022      }
     14023      strcat(soap->tmpbuf, "\"");
     14024      if (r)
     14025      { strcat(soap->tmpbuf, "; start-info=\"");
     14026        strcat(soap->tmpbuf, r);
     14027        strcat(soap->tmpbuf, "\"");
     14028      }
     14029      s = soap->tmpbuf;
     14030    }
     14031#endif
     14032    if (s && (err = soap->fposthdr(soap, "Content-Type", s)))
     14033      return err;
    1102114034#ifdef WITH_ZLIB
    11022   if (soap->omode & SOAP_ENC_ZLIB)
    11023   {
     14035    if ((soap->omode & SOAP_ENC_ZLIB))
     14036    {
    1102414037#ifdef WITH_GZIP
    11025     err = soap->fposthdr(soap, "Content-Encoding", "gzip");
     14038      err = soap->fposthdr(soap, "Content-Encoding", soap->zlib_out == SOAP_ZLIB_DEFLATE ? "deflate" : "gzip");
    1102614039#else
    11027     err = soap->fposthdr(soap, "Content-Encoding", "deflate");
    11028 #endif
     14040      err = soap->fposthdr(soap, "Content-Encoding", "deflate");
     14041#endif
     14042      if (err)
     14043        return err;
     14044    }
     14045#endif
     14046#ifndef WITH_LEANER
     14047    if ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)
     14048      err = soap->fposthdr(soap, "Transfer-Encoding", "chunked");
     14049    else
     14050#endif
     14051    if (s)
     14052    { sprintf(soap->tmpbuf, "%lu", (unsigned long)count);
     14053      err = soap->fposthdr(soap, "Content-Length", soap->tmpbuf);
     14054    }
    1102914055    if (err)
    1103014056      return err;
    1103114057  }
    11032 #endif
    11033   if ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)
    11034     err = soap->fposthdr(soap, "Transfer-Encoding", "chunked");
    11035   else if (count > 0)
    11036   { sprintf(soap->tmpbuf, "%lu", (unsigned long)count);
    11037     err = soap->fposthdr(soap, "Content-Length", soap->tmpbuf);
    11038   }
    11039   if (err)
    11040     return err;
    1104114058  return soap->fposthdr(soap, "Connection", soap->keep_alive ? "keep-alive" : "close");
    1104214059}
    1104314060#endif
    11044 
    11045 /******************************************************************************/
     14061#endif
     14062
     14063/******************************************************************************/
     14064#ifndef WITH_NOHTTP
    1104614065#ifndef PALM_1
    1104714066static int
     
    1105014069}
    1105114070#endif
    11052 
    11053 /******************************************************************************/
     14071#endif
     14072
     14073/******************************************************************************/
     14074#ifndef WITH_NOHTTP
     14075#ifndef PALM_1
     14076static int
     14077http_put(struct soap *soap)
     14078{ return SOAP_PUT_METHOD;
     14079}
     14080#endif
     14081#endif
     14082
     14083/******************************************************************************/
     14084#ifndef WITH_NOHTTP
     14085#ifndef PALM_1
     14086static int
     14087http_del(struct soap *soap)
     14088{ return SOAP_DEL_METHOD;
     14089}
     14090#endif
     14091#endif
     14092
     14093/******************************************************************************/
     14094#ifndef WITH_NOHTTP
     14095#ifndef PALM_1
     14096static int
     14097http_head(struct soap *soap)
     14098{ return SOAP_HEAD_METHOD;
     14099}
     14100#endif
     14101#endif
     14102
     14103/******************************************************************************/
     14104#ifndef WITH_NOHTTP
    1105414105#ifndef PALM_1
    1105514106static int
     
    1105814109  register int err;
    1105914110  if (soap->status == SOAP_GET)
    11060   { s = "GET";
    11061     count = 0;
    11062   }
     14111    s = "GET";
    1106314112  else
    1106414113    s = "POST";
    1106514114#ifdef PALM
    11066   if (!endpoint || (strncmp(endpoint, "http:", 5) && strncmp(endpoint, "https:", 6) && strncmp(endpoint, "httpg:", 6)) && strncmp(endpoint, "_beam:", 6) && strncmp(endpoint, "_local:", 7) && strncmp(endpoint, "_btobex:", 8))
     14115  if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && strncmp(endpoint, "httpg:", 6)) && strncmp(endpoint, "_beam:", 6) && strncmp(endpoint, "_local:", 7) && strncmp(endpoint, "_btobex:", 8))
    1106714116#else
    11068   if (!endpoint || (strncmp(endpoint, "http:", 5) && strncmp(endpoint, "https:", 6) && strncmp(endpoint, "httpg:", 6)))
     14117  if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && strncmp(endpoint, "httpg:", 6)))
    1106914118#endif
    1107014119    return SOAP_OK;
    11071   if (soap->proxy_host && strncmp(endpoint, "https:", 6))
     14120  if (strlen(endpoint) + strlen(soap->http_version) > sizeof(soap->tmpbuf) - 80)
     14121    return soap->error = SOAP_EOM;
     14122  if (soap->proxy_host && soap_tag_cmp(endpoint, "https:*"))
    1107214123    sprintf(soap->tmpbuf, "%s %s HTTP/%s", s, endpoint, soap->http_version);
    1107314124  else
    11074     sprintf(soap->tmpbuf, "%s /%s HTTP/%s", s, path, soap->http_version);
     14125    sprintf(soap->tmpbuf, "%s /%s HTTP/%s", s, (*path == '/' ? path + 1 : path), soap->http_version);
    1107514126  if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL)))
    1107614127    return err;
     14128#ifdef WITH_OPENSSL
     14129  if ((soap->ssl && soap->port != 443) || (!soap->ssl && soap->port != 80))
     14130    sprintf(soap->tmpbuf, "%s:%d", host, port);
     14131  else
     14132    strcpy(soap->tmpbuf, host);
     14133#else
    1107714134  if (port != 80)
    1107814135    sprintf(soap->tmpbuf, "%s:%d", host, port);
    1107914136  else
    1108014137    strcpy(soap->tmpbuf, host);
     14138#endif
    1108114139  if ((err = soap->fposthdr(soap, "Host", soap->tmpbuf))
    1108214140   || (err = soap->fposthdr(soap, "User-Agent", "gSOAP/2.7"))
     
    1109514153  { sprintf(soap->tmpbuf + 262, "%s:%s", soap->userid, soap->passwd);
    1109614154    strcpy(soap->tmpbuf, "Basic ");
    11097     soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, strlen(soap->tmpbuf + 262));
     14155    soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262));
    1109814156    if ((err = soap->fposthdr(soap, "Authorization", soap->tmpbuf)))
    1109914157      return err;
     
    1110214160  { sprintf(soap->tmpbuf + 262, "%s:%s", soap->proxy_userid, soap->proxy_passwd);
    1110314161    strcpy(soap->tmpbuf, "Basic ");
    11104     soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, strlen(soap->tmpbuf + 262));
     14162    soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262));
    1110514163    if ((err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf)))
    1110614164      return err;
     
    1111614174#endif
    1111714175#endif
    11118   if (action && soap->version == 1)
    11119   { sprintf(soap->tmpbuf, "\"%s\"", action);
     14176  if (soap->status != SOAP_GET && (soap->version == 1 || (action && *action)))
     14177  { sprintf(soap->tmpbuf, "\"%s\"", action && strlen(action) < sizeof(soap->tmpbuf) - 3 ? action : SOAP_STR_EOS);
    1112014178    if ((err = soap->fposthdr(soap, "SOAPAction", soap->tmpbuf)))
    1112114179      return err;
     
    1112414182}
    1112514183#endif
    11126 
    11127 /******************************************************************************/
     14184#endif
     14185
     14186/******************************************************************************/
     14187#ifndef WITH_NOHTTP
    1112814188#ifndef PALM_1
    1112914189static int
     
    1114114201}
    1114214202#endif
    11143 
    11144 /******************************************************************************/
     14203#endif
     14204
     14205/******************************************************************************/
     14206#ifndef WITH_NOHTTP
    1114514207#ifndef PALM_1
    1114614208static int
     
    1115514217}
    1115614218#endif
    11157 
    11158 /******************************************************************************/
     14219#endif
     14220
     14221/******************************************************************************/
     14222#ifndef WITH_NOHTTP
    1115914223#ifndef PALM_1
    1116014224static int
    1116114225http_response(struct soap *soap, int status, size_t count)
    1116214226{ register int err;
    11163 /* WR[ */
    1116414227#ifdef WMW_RPM_IO
    1116514228  if (soap->rpmreqid)
    1116614229    httpOutputEnable(soap->rpmreqid);
    11167 #endif  /* WMW_RPM_IO */
    11168 /* ]WR */
     14230#endif
     14231  if (strlen(soap->http_version) > 4)
     14232    return soap->error = SOAP_EOM;
    1116914233  if (!status || status == SOAP_HTML || status == SOAP_FILE)
    11170   { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "OK 200\n"));
    11171 /* WR[ */
     14234  { const char *s;
     14235    if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK))
     14236      s = "200 OK";
     14237    else
     14238      s = "202 ACCEPTED";
     14239    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Status = %s\n", s));
    1117214240#ifdef WMW_RPM_IO
    1117314241    if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */
    1117414242#else
    11175 /* ]WR */
    1117614243    if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application */
    11177 /* WR[ */
    11178 #endif /* WMW_RPM_IO */
    11179 /* ]WR */
    11180     { sprintf(soap->tmpbuf, "HTTP/%s 200 OK", soap->http_version);
     14244#endif
     14245    { sprintf(soap->tmpbuf, "HTTP/%s %s", soap->http_version, s);
    1118114246      if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL)))
    1118214247        return err;
    1118314248    }
    11184     else if ((err = soap->fposthdr(soap, "Status", "200 OK")))
     14249    else if ((err = soap->fposthdr(soap, "Status", s)))
    1118514250      return err;
    1118614251  }
    11187   else if (status > 200 && status < 600)
     14252  else if (status >= 200 && status < 600)
    1118814253  { sprintf(soap->tmpbuf, "HTTP/%s %d %s", soap->http_version, status, http_error(soap, status));
    1118914254    if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL)))
    1119014255      return err;
     14256#ifndef WITH_LEAN
    1119114257    if (status == 401)
    11192     { sprintf(soap->tmpbuf, "Basic realm=\"%s\"", soap->authrealm ? soap->authrealm : "gSOAP Web Service");
     14258    { sprintf(soap->tmpbuf, "Basic realm=\"%s\"", (soap->authrealm && strlen(soap->authrealm) < sizeof(soap->tmpbuf) - 14) ? soap->authrealm : "gSOAP Web Service");
    1119314259      if ((err = soap->fposthdr(soap, "WWW-Authenticate", soap->tmpbuf)))
    1119414260        return err;
     
    1119814264        return err;
    1119914265    }
     14266#endif
    1120014267  }
    1120114268  else
    1120214269  { const char *s = *soap_faultcode(soap);
    11203     if (soap->version == 2 && !strcmp(s, "SOAP-ENV:Sender"))
     14270    if (soap->version == 2 && (!s || !strcmp(s, "SOAP-ENV:Sender")))
    1120414271      s = "400 Bad Request";
    1120514272    else
    1120614273      s = "500 Internal Server Error";
    1120714274    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error %s (status=%d)\n", s, status));
    11208 /* WR[ */
    1120914275#ifdef WMW_RPM_IO
    1121014276    if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */
    1121114277#else
    11212 /* ]WR */
    1121314278    if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application */
    11214 /* WR[ */
    11215 #endif /* WMW_RPM_IO */
    11216 /* ]WR */
     14279#endif
    1121714280    { sprintf(soap->tmpbuf, "HTTP/%s %s", soap->http_version, s);
    1121814281      if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL)))
    1121914282        return err;
    1122014283    }
    11221     else if ((err = soap->fposthdr(soap, "Status", s)))
     14284    else if ((err = soap->fposthdr(soap, "Status", s))) /* CGI */
    1122214285      return err;
    1122314286  }
     
    1123214295}
    1123314296#endif
     14297#endif
    1123414298
    1123514299/******************************************************************************/
     
    1124214306  if (!(soap->omode & (SOAP_ENC_XML | SOAP_IO_STORE /* this tests for chunking too */))
    1124314307   && (status == SOAP_HTML || status == SOAP_FILE))
    11244   { soap->omode &= ~SOAP_IO;
    11245     soap->omode |= SOAP_IO_STORE;
    11246   }
     14308    soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE;
    1124714309  soap->status = status;
    1124814310  count = soap_count_attachments(soap);
    1124914311  if (soap_begin_send(soap))
    1125014312    return soap->error;
     14313#ifndef WITH_NOHTTP
    1125114314  if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML))
    1125214315  { register int n = soap->mode;
     
    1125614319    if ((soap->error = soap->fresponse(soap, status, count)))
    1125714320      return soap->error;
     14321#ifndef WITH_LEANER
    1125814322    if ((n & SOAP_IO) == SOAP_IO_CHUNK)
    1125914323    { if (soap_flush(soap))
    1126014324        return soap->error;
    1126114325    }
     14326#endif
    1126214327    soap->mode = n;
    1126314328  }
     14329#endif
    1126414330  return SOAP_OK;
    1126514331}
     
    1127014336static const char*
    1127114337soap_set_validation_fault(struct soap *soap, const char *s, const char *t)
    11272 { sprintf(soap->msgbuf, "Validation constraint violation: %s%s in element <%s>", s, t?t:SOAP_STR_EOS, soap->tag);
     14338{ if (*soap->tag)
     14339    sprintf(soap->msgbuf, "Validation constraint violation: %s%s in element <%s>", s, t?t:SOAP_STR_EOS, soap->tag);
     14340  else
     14341    sprintf(soap->msgbuf, "Validation constraint violation: %s%s", s, t?t:SOAP_STR_EOS);
    1127314342  return soap->msgbuf;
    1127414343}
     
    1128314352{ const char **c = soap_faultcode(soap);
    1128414353  const char **s = soap_faultstring(soap);
     14354  if (soap->fseterror)
     14355    soap->fseterror(soap, c, s);
    1128514356  if (!*c)
    1128614357  { if (soap->version == 2)
     
    1130314374      *s = soap_set_validation_fault(soap, "tag name or namespace mismatch", NULL);
    1130414375      break;
    11305     case SOAP_TAG_END:
    11306       *s = soap_set_validation_fault(soap, "incorrect end tag", NULL);
    11307       break;
    1130814376    case SOAP_TYPE:
    1130914377      *s = soap_set_validation_fault(soap, "data type mismatch ", soap->type);
    1131014378      break;
    1131114379    case SOAP_SYNTAX_ERROR:
    11312       *s = "Well-formedness constraint violation";
     14380      *s = "Well-formedness violation";
    1131314381      break;
    1131414382    case SOAP_NO_TAG:
    11315       *s = "No XML element tag found";
     14383      *s = "No XML element tag";
    1131614384      break;
    1131714385    case SOAP_MUSTUNDERSTAND:
     
    1132214390    case SOAP_VERSIONMISMATCH:
    1132314391      *c = "SOAP-ENV:VersionMismatch";
    11324       *s = "SOAP version mismatch or invalid SOAP message";
     14392      *s = "Invalid SOAP message or SOAP version mismatch";
    1132514393      break;
    1132614394    case SOAP_DATAENCODINGUNKNOWN:
     
    1132914397      break;
    1133014398    case SOAP_NAMESPACE:
    11331       *s = soap_set_validation_fault(soap, "namespace mismatch", NULL);
     14399      *s = soap_set_validation_fault(soap, "namespace error", NULL);
     14400      break;
     14401    case SOAP_USER_ERROR:
     14402      *s = "User error";
    1133214403      break;
    1133314404    case SOAP_FATAL_ERROR:
     
    1133814409      *s = soap->msgbuf;
    1133914410      break;
     14411    case SOAP_NO_DATA:
     14412      *s = "Data required for operation";
     14413      break;
    1134014414    case SOAP_GET_METHOD:
    1134114415      *s = "HTTP GET method not implemented";
    1134214416      break;
     14417    case SOAP_PUT_METHOD:
     14418      *s = "HTTP PUT method not implemented";
     14419      break;
     14420    case SOAP_HEAD_METHOD:
     14421      *s = "HTTP HEAD method not implemented";
     14422      break;
     14423    case SOAP_HTTP_METHOD:
     14424      *s = "HTTP method not implemented";
     14425      break;
    1134314426    case SOAP_EOM:
    1134414427      *s = "Out of memory";
     14428      break;
     14429    case SOAP_MOE:
     14430      *s = "Memory overflow or memory corruption error";
     14431      break;
     14432    case SOAP_HDR:
     14433      *s = "Header line too long";
    1134514434      break;
    1134614435    case SOAP_IOB:
     
    1135014439      *s = soap_set_validation_fault(soap, "nil not allowed", NULL);
    1135114440      break;
    11352     case SOAP_MULTI_ID:
     14441    case SOAP_DUPLICATE_ID:
    1135314442      *s = soap_set_validation_fault(soap, "multiple definitions of id ", soap->id);
     14443      if (soap->version == 2)
     14444        *soap_faultsubcode(soap) = "SOAP-ENC:DuplicateID";
    1135414445      break;
    1135514446    case SOAP_MISSING_ID:
    1135614447      *s = soap_set_validation_fault(soap, "missing id for ref ", soap->id);
     14448      if (soap->version == 2)
     14449        *soap_faultsubcode(soap) = "SOAP-ENC:MissingID";
    1135714450      break;
    1135814451    case SOAP_HREF:
    11359       *s = soap_set_validation_fault(soap, "incompatible object ref ", soap->id);
     14452      *s = soap_set_validation_fault(soap, "incompatible object type ref/id pair ", soap->id);
    1136014453      break;
    1136114454    case SOAP_FAULT:
     14455      break;
     14456#ifndef WITH_NOIO
     14457    case SOAP_UDP_ERROR:
     14458      *s = "Message too large for UDP packet";
    1136214459      break;
    1136314460    case SOAP_TCP_ERROR:
    1136414461      *s = tcp_error(soap);
    1136514462      break;
     14463#endif
    1136614464    case SOAP_HTTP_ERROR:
    11367       *s = "HTTP error";
     14465      *s = "An HTTP processing error occurred";
    1136814466      break;
    1136914467    case SOAP_SSL_ERROR:
     14468#ifdef WITH_OPENSSL
    1137014469      *s = "SSL error";
     14470#else
     14471      *s = "OpenSSL not installed: recompile with -DWITH_OPENSSL";
     14472#endif
    1137114473      break;
    1137214474    case SOAP_PLUGIN_ERROR:
    1137314475      *s = "Plugin registry error";
     14476      break;
     14477    case SOAP_DIME_ERROR:
     14478      *s = "DIME format error";
     14479      break;
     14480    case SOAP_DIME_HREF:
     14481      *s = "DIME href to missing attachment";
    1137414482      break;
    1137514483    case SOAP_DIME_MISMATCH:
     
    1137914487      *s = "End of DIME error";
    1138014488      break;
    11381     case SOAP_DIME_ERROR:
    11382       *s = "DIME format error";
    11383       break;
    1138414489    case SOAP_MIME_ERROR:
    1138514490      *s = "MIME format error";
    1138614491      break;
     14492    case SOAP_MIME_HREF:
     14493      *s = "MIME href to missing attachment";
     14494      break;
     14495    case SOAP_MIME_END:
     14496      *s = "End of MIME error";
     14497      break;
    1138714498    case SOAP_ZLIB_ERROR:
    1138814499#ifdef WITH_ZLIB
    11389       sprintf(soap->msgbuf, "Zlib/gzip error: '%s'", soap->d_stream.msg?soap->d_stream.msg:"");
     14500      sprintf(soap->msgbuf, "Zlib/gzip error: '%s'", soap->d_stream->msg?soap->d_stream->msg:SOAP_STR_EOS);
    1139014501      *s = soap->msgbuf;
    1139114502#else
    11392       *s = "Zlib not installed for required message (de)compression";
     14503      *s = "Zlib/gzip not installed for (de)compression: recompile with -DWITH_GZIP";
    1139314504#endif
    1139414505      break;
     
    1140014511      break;
    1140114512    case SOAP_OCCURS:
    11402       *s = soap_set_validation_fault(soap, "a min/maxOccurs violation was detected", NULL);
     14513      *s = soap_set_validation_fault(soap, "occurrence violation", NULL);
    1140314514      break;
    1140414515    case SOAP_LENGTH:
    1140514516      *s = soap_set_validation_fault(soap, "content length violation", NULL);
    1140614517      break;
     14518    case SOAP_FD_EXCEEDED:
     14519      *s = "Maximum number of open connections was reached";
     14520      break;
     14521    case SOAP_STOP:
     14522      *s = "Stopped: no response sent";
     14523      break;
    1140714524#endif
    1140814525    case SOAP_EOF:
    11409       sprintf(soap->msgbuf, "End of file or no input: '%s'", soap_strerror(soap));
     14526#ifndef WITH_NOIO
     14527      strcpy(soap->msgbuf, soap_strerror(soap));
     14528#ifndef WITH_LEAN
     14529      if (strlen(soap->msgbuf) + 25 < sizeof(soap->msgbuf))
     14530      { memmove(soap->msgbuf + 25, soap->msgbuf, strlen(soap->msgbuf) + 1);
     14531        memcpy(soap->msgbuf, "End of file or no input: ", 25);
     14532      }
     14533#endif
    1141014534      *s = soap->msgbuf;
    1141114535      break;
     14536#else
     14537      *s = "End of file or no input";
     14538      break;
     14539#endif
    1141214540    default:
     14541#ifndef WITH_NOHTTP
     14542#ifndef WITH_LEAN
    1141314543      if (soap->error > 200 && soap->error < 600)
    11414       { sprintf(soap->msgbuf, "HTTP Error: '%s'", http_error(soap, soap->error));
     14544      { sprintf(soap->msgbuf, "HTTP Error: %d %s", soap->error, http_error(soap, soap->error));
    1141514545        *s = soap->msgbuf;
    1141614546      }
    1141714547      else
    11418       { sprintf(soap->msgbuf, "Error code %d", soap->error);
     14548#endif
     14549#endif
     14550      { sprintf(soap->msgbuf, "Error %d", soap->error);
    1141914551        *s = soap->msgbuf;
    1142014552      }
     
    1143014562soap_send_fault(struct soap *soap)
    1143114563{ register int status = soap->error;
     14564  int r = 1;
    1143214565  if (status == SOAP_STOP)
    1143314566    return status;
     
    1143514568  soap->keep_alive = 0; /* to terminate connection */
    1143614569  soap_set_fault(soap);
    11437   if ((status != SOAP_EOF || (!soap->recv_timeout && !soap->send_timeout)) && (!soap->fpoll || soap->fpoll(soap) == SOAP_OK))
     14570#ifndef WITH_NOIO
     14571#ifndef WITH_LEAN
     14572  if (soap_valid_socket(soap->socket))
     14573  { struct timeval timeout;
     14574    fd_set rfd, sfd;
     14575    timeout.tv_sec = 0;
     14576    timeout.tv_usec = 0;
     14577    FD_ZERO(&rfd);
     14578    FD_ZERO(&sfd);
     14579    FD_SET(soap->socket, &rfd);
     14580    FD_SET(soap->socket, &sfd);
     14581    r = select((int)soap->socket + 1, &rfd, &sfd, NULL, &timeout);
     14582    if (r > 0)
     14583    { if (!FD_ISSET(soap->socket, &sfd)
     14584       || (FD_ISSET(soap->socket, &rfd)
     14585        && recv(soap->socket, soap->tmpbuf, 1, MSG_PEEK) < 0))
     14586        r = 0;
     14587    }
     14588  }
     14589#endif
     14590#endif
     14591  if ((status != SOAP_EOF || (!soap->recv_timeout && !soap->send_timeout)) && r > 0)
    1143814592  { soap->error = SOAP_OK;
    1143914593    soap_serializeheader(soap);
     
    1144814602      soap_envelope_end_out(soap);
    1144914603    }
     14604    soap_end_count(soap);
    1145014605    if (soap_response(soap, status)
    1145114606     || soap_envelope_begin_out(soap)
     
    1150314658
    1150414659/******************************************************************************/
     14660#ifndef WITH_NOHTTP
     14661#ifndef PALM_1
     14662SOAP_FMAC1
     14663int
     14664SOAP_FMAC2
     14665soap_send_empty_response(struct soap *soap, int httpstatuscode)
     14666{ register soap_mode m = soap->omode;
     14667  soap->count = 0;
     14668  if ((m & SOAP_IO) == SOAP_IO_CHUNK)
     14669    soap->omode = (m & ~SOAP_IO) | SOAP_IO_BUFFER;
     14670  if (soap_response(soap, httpstatuscode) || soap_end_send(soap))
     14671  { soap->omode = m;
     14672    return soap_closesock(soap);
     14673  }
     14674  soap->omode = m;
     14675  return SOAP_OK;
     14676}
     14677#endif
     14678#endif
     14679
     14680/******************************************************************************/
     14681#ifndef WITH_NOHTTP
     14682#ifndef PALM_1
     14683SOAP_FMAC1
     14684int
     14685SOAP_FMAC2
     14686soap_recv_empty_response(struct soap *soap)
     14687{ if (soap_begin_recv(soap) || soap_end_recv(soap))
     14688  { if (soap->error != 202)
     14689      return soap_closesock(soap);
     14690    soap->error = SOAP_OK;
     14691  }
     14692  return SOAP_OK;
     14693}
     14694#endif
     14695#endif
     14696
     14697/******************************************************************************/
     14698#ifndef WITH_NOIO
    1150514699#ifndef PALM_1
    1150614700static const char*
    1150714701soap_strerror(struct soap *soap)
    11508 { int err = soap->errnum;
    11509   if (!err)
    11510     err = soap_errno;
     14702{ register int err = soap->errnum;
    1151114703  if (err)
    1151214704  {
    11513 #ifndef UNDER_CE
     14705#ifndef WIN32
    1151414706    return strerror(err);
    1151514707#else
    11516     FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, 0, (LPTSTR)&soap->werrorstr, sizeof(soap->werrorstr), NULL);
    11517     wcstombs(soap->errorstr, soap->werrorstr, sizeof(soap->errorstr));
    11518     return soap->errorstr;
    11519 #endif
    11520   }
     14708#ifndef UNDER_CE
     14709    DWORD len;
     14710    *soap->msgbuf = '\0';
     14711    len = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)soap->msgbuf, (DWORD)sizeof(soap->msgbuf), NULL);
     14712#else
     14713    DWORD i, len;
     14714    *soap->msgbuf = '\0';
     14715    len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, 0, (LPTSTR)soap->msgbuf, (DWORD)(sizeof(soap->msgbuf)/sizeof(TCHAR)), NULL);
     14716    for (i = 0; i <= len; i++)
     14717    { if (((TCHAR*)soap->msgbuf)[i] < 0x80)
     14718        soap->msgbuf[i] = (char)((TCHAR*)soap->msgbuf)[i];
     14719      else
     14720        soap->msgbuf[i] = '?';
     14721    }
     14722#endif
     14723    return soap->msgbuf;
     14724#endif
     14725  }
     14726#ifndef WITH_LEAN
     14727  if (soap->recv_timeout > 0)
     14728  { if (soap->send_timeout > 0)
     14729      sprintf(soap->msgbuf, "Operation interrupted or timed out after %ds send or %ds receive delay", soap->send_timeout, soap->recv_timeout);
     14730    else
     14731      sprintf(soap->msgbuf, "Operation interrupted or timed out after %ds receive delay", soap->recv_timeout);
     14732    return soap->msgbuf;
     14733  }
     14734#endif
    1152114735  return "Operation interrupted or timed out";
    1152214736}
    1152314737#endif
     14738#endif
    1152414739
    1152514740/******************************************************************************/
    1152614741#ifndef PALM_2
    1152714742static int
    11528 soap_set_error(struct soap *soap, const char *faultcode, const char *faultstring, const char *faultdetail, int soaperror)
     14743soap_set_error(struct soap *soap, const char *faultcode, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML, int soaperror)
    1152914744{ *soap_faultcode(soap) = faultcode;
     14745  if (faultsubcodeQName)
     14746    *soap_faultsubcode(soap) = faultsubcodeQName;
    1153014747  *soap_faultstring(soap) = faultstring;
    11531   if (faultdetail && *faultdetail)
     14748  if (faultdetailXML && *faultdetailXML)
    1153214749  { register const char **s = soap_faultdetail(soap);
    1153314750    if (s)
    11534       *s = faultdetail;
     14751      *s = faultdetailXML;
    1153514752  }
    1153614753  return soap->error = soaperror;
     
    1154314760int
    1154414761SOAP_FMAC2
    11545 soap_set_sender_error(struct soap *soap, const char *faultstring, const char *faultdetail, int soaperror)
    11546 { return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", faultstring, faultdetail, soaperror);
     14762soap_set_sender_error(struct soap *soap, const char *faultstring, const char *faultdetailXML, int soaperror)
     14763{ return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", NULL, faultstring, faultdetailXML, soaperror);
    1154714764}
    1154814765#endif
     
    1155314770int
    1155414771SOAP_FMAC2
    11555 soap_set_receiver_error(struct soap *soap, const char *faultstring, const char *faultdetail, int soaperror)
    11556 { return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", faultstring, faultdetail, soaperror);
     14772soap_set_receiver_error(struct soap *soap, const char *faultstring, const char *faultdetailXML, int soaperror)
     14773{ return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", NULL, faultstring, faultdetailXML, soaperror);
    1155714774}
    1155814775#endif
     
    1156114778#ifndef PALM_2
    1156214779static int
    11563 soap_copy_fault(struct soap *soap, const char *faultcode, const char *faultstring, const char *faultdetail)
    11564 { char *s = NULL, *t = NULL;
     14780soap_copy_fault(struct soap *soap, const char *faultcode, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML)
     14781{ char *r = NULL, *s = NULL, *t = NULL;
     14782  if (faultsubcodeQName)
     14783    r = soap_strdup(soap, faultsubcodeQName);
    1156514784  if (faultstring)
    1156614785    s = soap_strdup(soap, faultstring);
    11567   if (faultdetail)
    11568     t = soap_strdup(soap, faultdetail);
    11569   return soap_set_error(soap, faultcode, s, t, SOAP_FAULT);
     14786  if (faultdetailXML)
     14787    t = soap_strdup(soap, faultdetailXML);
     14788  return soap_set_error(soap, faultcode, r, s, t, SOAP_FAULT);
    1157014789}
    1157114790#endif
     
    1157614795int
    1157714796SOAP_FMAC2
    11578 soap_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail)
    11579 { return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", faultstring, faultdetail);
     14797soap_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetailXML)
     14798{ return soap_sender_fault_subcode(soap, NULL, faultstring, faultdetailXML);
    1158014799}
    1158114800#endif
     
    1158614805int
    1158714806SOAP_FMAC2
    11588 soap_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail)
    11589 { return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", faultstring, faultdetail);
     14807soap_sender_fault_subcode(struct soap *soap, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML)
     14808{ return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", faultsubcodeQName, faultstring, faultdetailXML);
    1159014809}
    1159114810#endif
     
    1159414813#ifndef PALM_2
    1159514814SOAP_FMAC1
     14815int
     14816SOAP_FMAC2
     14817soap_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetailXML)
     14818{ return soap_receiver_fault_subcode(soap, NULL, faultstring, faultdetailXML);
     14819}
     14820#endif
     14821
     14822/******************************************************************************/
     14823#ifndef PALM_2
     14824SOAP_FMAC1
     14825int
     14826SOAP_FMAC2
     14827soap_receiver_fault_subcode(struct soap *soap, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML)
     14828{ return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", faultsubcodeQName, faultstring, faultdetailXML);
     14829}
     14830#endif
     14831
     14832/******************************************************************************/
     14833#ifndef PALM_2
     14834#ifndef WITH_NOSTDLIB
     14835SOAP_FMAC1
    1159614836void
    1159714837SOAP_FMAC2
    1159814838soap_print_fault(struct soap *soap, FILE *fd)
    11599 { if (soap->error)
    11600   { const char **s;
    11601     if (!*soap_faultcode(soap))
     14839{ if (soap_check_state(soap))
     14840    fprintf(fd, "Error: soap struct state not initialized\n");
     14841  else if (soap->error)
     14842  { const char *c, *v = NULL, *s, **d;
     14843    d = soap_faultcode(soap);
     14844    if (!*d)
    1160214845      soap_set_fault(soap);
    11603     fprintf(fd, "SOAP FAULT: %s\n\"%s\"\n", *soap_faultcode(soap), *soap_faultstring(soap));
    11604     s = soap_faultdetail(soap);
    11605     if (s && *s)
    11606       fprintf(fd, "Detail: %s\n", *s);
    11607   }
    11608 }
     14846    c = *d;
     14847    if (soap->version == 2)
     14848      v = *soap_faultsubcode(soap);
     14849    s = *soap_faultstring(soap);
     14850    d = soap_faultdetail(soap);
     14851    fprintf(fd, "%s%d fault: %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, c, v ? v : "no subcode", s ? s : "[no reason]", d && *d ? *d : "[no detail]");
     14852  }
     14853}
     14854#endif
    1160914855#endif
    1161014856 
    1161114857/******************************************************************************/
    11612 #ifndef PALM_1
     14858#ifdef __cplusplus
     14859#ifndef WITH_LEAN
     14860#ifndef WITH_NOSTDLIB
     14861SOAP_FMAC1
     14862void
     14863SOAP_FMAC2
     14864soap_stream_fault(struct soap *soap, std::ostream& os)
     14865{ if (soap_check_state(soap))
     14866    os << "Error: soap struct state not initialized\n";
     14867  else if (soap->error)
     14868  { const char *c, *v = NULL, *s, **d;
     14869    d = soap_faultcode(soap);
     14870    if (!*d)
     14871      soap_set_fault(soap);
     14872    c = *d;
     14873    if (soap->version == 2)
     14874      v = *soap_faultsubcode(soap);
     14875    s = *soap_faultstring(soap);
     14876    d = soap_faultdetail(soap);
     14877    os << (soap->version ? "SOAP 1." : "Error ")
     14878       << (soap->version ? (int)soap->version : soap->error)
     14879       << " fault: " << c
     14880       << "[" << (v ? v : "no subcode") << "]"
     14881       << std::endl
     14882       << "\"" << (s ? s : "[no reason]") << "\""
     14883       << std::endl
     14884       << "Detail: " << (d && *d ? *d : "[no detail]")
     14885       << std::endl;
     14886  }
     14887}
     14888#endif
     14889#endif
     14890#endif
     14891 
     14892/******************************************************************************/
     14893#ifndef WITH_LEAN
     14894#ifndef WITH_NOSTDLIB
     14895SOAP_FMAC1
     14896char*
     14897SOAP_FMAC2
     14898soap_sprint_fault(struct soap *soap, char *buf, size_t len)
     14899{ if (soap_check_state(soap))
     14900    strncpy(buf, "Error: soap struct not initialized", len);
     14901  else if (soap->error)
     14902  { const char *c, *v = NULL, *s, **d;
     14903    d = soap_faultcode(soap);
     14904    if (!*d)
     14905      soap_set_fault(soap);
     14906    c = *d;
     14907    if (soap->version == 2)
     14908      v = *soap_faultsubcode(soap);
     14909    s = *soap_faultstring(soap);
     14910    d = soap_faultdetail(soap);
     14911#ifdef WIN32
     14912    _snprintf
     14913#else
     14914    snprintf
     14915#endif
     14916      (buf, len, "%s%d fault: %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, c, v ? v : "no subcode", s ? s : "[no reason]", d && *d ? *d : "[no detail]");
     14917  }
     14918  return buf;
     14919}
     14920#endif
     14921#endif
     14922 
     14923/******************************************************************************/
     14924#ifndef PALM_1
     14925#ifndef WITH_NOSTDLIB
    1161314926SOAP_FMAC1
    1161414927void
     
    1161714930{
    1161814931#ifndef WITH_LEAN
    11619   int c;
    11620   if (soap->error && soap->buflen > 0)
    11621   { if (soap->bufidx == 0)
    11622       soap->bufidx = 1;
    11623     c = soap->buf[soap->bufidx - 1];
    11624     soap->buf[soap->bufidx - 1] = '\0';
    11625     if (soap->buflen - soap->bufidx > 1024)
    11626       soap->buf[soap->bufidx + 1024] = '\0';
     14932  int i, j, c1, c2;
     14933  if (soap->error && soap->bufidx <= soap->buflen && soap->buflen > 0 && soap->buflen <= SOAP_BUFLEN)
     14934  { i = (int)soap->bufidx - 1;
     14935    if (i <= 0)
     14936      i = 0;
     14937    c1 = soap->buf[i];
     14938    soap->buf[i] = '\0';
     14939    if ((int)soap->buflen >= i + 1024)
     14940      j = i + 1023;
    1162714941    else
    11628       soap->buf[soap->buflen - 1] = '\0';
    11629     fprintf(fd, "%s%c\n** HERE **\n", soap->buf, c);
     14942      j = (int)soap->buflen - 1;
     14943    c2 = soap->buf[j];
     14944    soap->buf[j] = '\0';
     14945    fprintf(fd, "%s%c\n<!-- ** HERE ** -->\n", soap->buf, c1);
    1163014946    if (soap->bufidx < soap->buflen)
    1163114947      fprintf(fd, "%s\n", soap->buf + soap->bufidx);
    11632   }
    11633 #endif
    11634 }
     14948    soap->buf[i] = c1;
     14949    soap->buf[j] = c2;
     14950  }
     14951#endif
     14952}
     14953#endif
    1163514954#endif
    1163614955 
     
    1164314962{ register struct soap_plugin *p;
    1164414963  register int r;
    11645   if (!(p = (struct soap_plugin*)SOAP_MALLOC(sizeof(struct soap_plugin))))
     14964  if (!(p = (struct soap_plugin*)SOAP_MALLOC(soap, sizeof(struct soap_plugin))))
    1164614965    return soap->error = SOAP_EOM;
    1164714966  p->id = NULL;
     
    1165714976  }
    1165814977  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not register plugin '%s': plugin returned error %d (or fdelete callback not set)\n", p->id?p->id:"?", r));
    11659   SOAP_FREE(p);
     14978  SOAP_FREE(soap, p);
    1166014979  return r;
    1166114980}
     
    1168915008#endif
    1169015009
     15010/******************************************************************************\
     15011 *
     15012 *      C++ soap struct methods
     15013 *
     15014\******************************************************************************/
     15015
     15016#ifdef __cplusplus
     15017soap::soap()
     15018{ soap_init(this);
     15019}
     15020#endif
     15021
     15022/******************************************************************************/
     15023#ifdef __cplusplus
     15024soap::soap(soap_mode m)
     15025{ soap_init1(this, m);
     15026}
     15027#endif
     15028
     15029/******************************************************************************/
     15030#ifdef __cplusplus
     15031soap::soap(soap_mode im, soap_mode om)
     15032{ soap_init2(this, im, om);
     15033}
     15034#endif
     15035
     15036/******************************************************************************/
     15037#ifdef __cplusplus
     15038soap::soap(struct soap& soap)
     15039{ soap_copy_context(this, &soap);
     15040}
     15041#endif
     15042
     15043/******************************************************************************/
     15044#ifdef __cplusplus
     15045soap::~soap()
     15046{ soap_destroy(this);
     15047  soap_end(this);
     15048  soap_done(this);
     15049}
     15050#endif
     15051
     15052/******************************************************************************/
  • trunk/Nebulous/nebclient/src/stdsoap2.h

    r3017 r19542  
    11/*
    2 
    3 stdsoap2.h 2.7.0d
    4 
    5 gSOAP runtime environment.
     2        stdsoap2.h 2.7.11-upd
     3
     4        gSOAP runtime engine
    65
    76gSOAP XML Web services tools
    8 Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc., All Rights Reserved.
    9 
     7Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved.
     8This part of the software is released under ONE of the following licenses:
     9GPL, the gSOAP public license, OR Genivia's license for commercial use.
     10--------------------------------------------------------------------------------
    1011Contributors:
    1112
    12 Wind River Systems, Inc., for the following additions (marked WR[...]) :
     13Wind River Systems, Inc., for the following additions
    1314  - vxWorks compatible
    14   - Support for IPv6.
    15 
    1615--------------------------------------------------------------------------------
    1716gSOAP public license.
     
    2625
    2726The Initial Developer of the Original Code is Robert A. van Engelen.
    28 Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc., All Rights Reserved.
     27Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved.
    2928--------------------------------------------------------------------------------
    3029GPL license.
     
    4544Author contact information:
    4645engelen@genivia.com / engelen@acm.org
     46
     47This program is released under the GPL with the additional exemption that
     48compiling, linking, and/or using OpenSSL is allowed.
     49--------------------------------------------------------------------------------
     50A commercial use license is available from Genivia, Inc., contact@genivia.com
    4751--------------------------------------------------------------------------------
    4852*/
     
    6266#endif
    6367
    64 #ifndef SOAP_BEGIN_NAMESPACE
    65 # define SOAP_BEGIN_NAMESPACE(name)
    66 #endif
    67 
    68 #ifndef SOAP_END_NAMESPACE
    69 # define SOAP_END_NAMESPACE(name)
    70 #endif
    71 
    7268#ifndef SOAP_FMAC1      /* stdsoap2.h declaration macro */
    7369# define SOAP_FMAC1
     
    8278#endif
    8379
     80#ifndef SOAP_FMAC3S     /* string converter for (de)serializer declaration macro */
     81# define SOAP_FMAC3S SOAP_FMAC3
     82#endif
     83
    8484#ifndef SOAP_FMAC4      /* (de)serializer declaration macro */
    8585# define SOAP_FMAC4
    8686#endif
    8787
     88#ifndef SOAP_FMAC4S     /* string converter for (de)serializer declaration macro */
     89# define SOAP_FMAC4S SOAP_FMAC4
     90#endif
     91
    8892#ifndef SOAP_FMAC5      /* stub/skeleton declaration macro */
    8993# define SOAP_FMAC5
     
    104108#ifndef SOAP_SOURCE_STAMP
    105109# define SOAP_SOURCE_STAMP(str)
     110#endif
     111
     112/* gSOAP 2.7.4 and higher: fast look-aside buffering is stable */
     113#ifndef WITH_FAST
     114# define WITH_FAST
    106115#endif
    107116
     
    128137# ifndef WIN32
    129138#  define WIN32
     139# endif
     140#endif
     141
     142#ifdef _WIN32_WCE
     143# ifndef UNDER_CE
     144#  define UNDER_CE _WIN32_WCE
    130145# endif
    131146#endif
     
    157172
    158173#if defined(__palmos__) || defined(PALM_GCC) || defined(__PALMOS_TRAPS__)
    159 # define PALM
    160 #endif
    161 
    162 #ifdef __hpux
    163 # define HP_UX
    164 #endif
    165 
    166 #ifdef __alpha
    167 # define TRU64
     174# ifndef PALM
     175#  define PALM
     176# endif
     177#endif
     178
     179#if defined(__hpux)
     180# ifndef HP_UX
     181#  define HP_UX
     182# endif
     183#endif
     184
     185#if defined(__digital__) && defined(__unix__)
     186# ifndef TRU64
     187#  define TRU64
     188# endif
    168189#endif
    169190
    170191#ifdef __MVS__
    171 # define OS390
    172 #endif
    173 
    174 #ifdef _AIX
    175 # define __socklen_t_defined
     192# ifndef OS390
     193#  define OS390
     194# endif
    176195#endif
    177196
    178197#ifdef HAVE_CONFIG_H
    179198# include "config.h"
     199# if defined(WITH_OPENSSL)
     200#  ifndef HAVE_OPENSSL_SSL_H
     201#   undef WITH_OPENSSL
     202#  endif
     203# endif
     204# if defined(WITH_ZLIB) || defined(WITH_GZIP)
     205#  ifndef HAVE_ZLIB_H
     206#   undef WITH_ZLIB
     207#   undef WITH_GZIP
     208#  endif
     209# endif
    180210#else
    181211# if defined(UNDER_CE)
     212#  define WITH_NOEMPTYSTRUCT
    182213#  define WITH_LEAN
    183214#  define HAVE_SSCANF
    184215# elif defined(WIN32)
     216#  define WITH_NOEMPTYSTRUCT
    185217#  define HAVE_STRRCHR
    186218#  define HAVE_STRTOD
     
    192224#  define HAVE_WCTOMB
    193225#  define HAVE_MBTOWC
     226#  define SOAP_LONG_FORMAT "%I64d"
     227#  define SOAP_ULONG_FORMAT "%I64u"
    194228# elif defined(CYGWIN)
    195229#  define HAVE_STRRCHR
     
    209243#  define HAVE_STRTOD
    210244#  define HAVE_SSCANF
     245#  define HAVE_STRTOD_L
     246#  define HAVE_SSCANF_L
     247#  define HAVE_SPRINTF_L
    211248#  define HAVE_STRTOL
    212249#  define HAVE_STRTOUL
     
    217254#  define HAVE_WCTOMB
    218255#  define HAVE_MBTOWC
    219 # elif defined(_AIXVERSION_431)
     256# elif defined(_AIX43)
    220257#  define HAVE_STRRCHR
    221258#  define HAVE_STRTOD
     
    228265#  define HAVE_GMTIME_R
    229266#  define HAVE_LOCALTIME_R
     267#  define HAVE_WCTOMB
     268#  define HAVE_MBTOWC
     269# elif defined(_AIX41)
     270#  define HAVE_STRRCHR
     271#  define HAVE_STRTOD
     272#  define HAVE_SSCANF
     273#  define HAVE_STRTOL
     274#  define HAVE_STRTOUL
     275#  define HAVE_SYS_TIMEB_H
    230276#  define HAVE_WCTOMB
    231277#  define HAVE_MBTOWC
     
    243289#  define HAVE_WCTOMB
    244290#  define HAVE_MBTOWC
    245 # elif defined(FREEBSD)
     291# elif defined(FREEBSD) || defined(__FreeBSD__)
    246292#  define HAVE_STRRCHR
    247293#  define HAVE_STRTOD
    248294#  define HAVE_SSCANF
     295#  define HAVE_STRTOD_L
     296#  define HAVE_SSCANF_L
     297#  define HAVE_SPRINTF_L
    249298#  define HAVE_STRTOL
    250299#  define HAVE_STRTOUL
     300#  define HAVE_STRTOLL
     301#  define HAVE_STRTOULL
    251302#  define HAVE_GETTIMEOFDAY
    252303#  define HAVE_RAND_R
     
    255306#  define HAVE_WCTOMB
    256307#  define HAVE_MBTOWC
     308#  define SOAP_LONG_FORMAT "%qd"
     309#  define SOAP_ULONG_FORMAT "%qu"
    257310# elif defined(__VMS)
    258311#  define HAVE_STRRCHR
     
    268321#  define HAVE_WCTOMB
    269322#  define HAVE_MBTOWC
    270 # elif defined(__GLIBC__)
     323# elif defined(__GLIBC__) || defined(__GNU__)
    271324#  define HAVE_STRRCHR
    272325#  define HAVE_STRTOD
    273326#  define HAVE_SSCANF
     327#  define HAVE_STRTOD_L
     328#  define HAVE_SSCANF_L
     329#  define HAVE_SPRINTF_L
    274330#  define HAVE_STRTOL
    275331#  define HAVE_STRTOUL
     332#  define HAVE_STRTOLL
     333#  define HAVE_STRTOULL
    276334#  define HAVE_SYS_TIMEB_H
    277335#  define HAVE_FTIME
     
    297355#  define HAVE_WCTOMB
    298356#  define HAVE_MBTOWC
     357#  define SOAP_LONG_FORMAT "%ld"
     358#  define SOAP_ULONG_FORMAT "%lu"
    299359# elif defined(MAC_CARBON)
     360#  define WITH_NOIO
    300361#  define HAVE_STRRCHR
    301362#  define HAVE_STRTOD
    302363#  define HAVE_SSCANF
     364#  define HAVE_STRTOD_L
     365#  define HAVE_SSCANF_L
     366#  define HAVE_SPRINTF_L
    303367#  define HAVE_STRTOL
    304368#  define HAVE_STRTOUL
     
    319383#  define O_NONBLOCK FNONBIO
    320384#  include <sys_socket.h>
    321 #  include <time.h>
    322385#  include "palmFunctions.h"
    323386# elif defined(SYMBIAN)
     
    325388#  define WITH_NONAMESPACES
    326389#  define HAVE_STRTOD   /* use STRTOD since sscanf doesn't seem to work */
     390#  include <e32def.h>
    327391#  include <sys/ioctl.h>
    328392# elif defined(VXWORKS)
     393#  ifdef _WRS_KERNEL
     394#   define _POSIX_THREADS 1
     395#  endif
    329396#  define HAVE_STRRCHR
    330397#  define HAVE_STRTOD
     
    332399#  define HAVE_STRTOL
    333400#  define HAVE_STRTOUL
    334 #  define HAVE_RAND_R
    335 #  define HAVE_PGMTIME_R
    336 #  define HAVE_PLOCALTIME_R
     401#  define HAVE_GMTIME
     402#  define HAVE_LOCALTIME
    337403#  define HAVE_MKTIME
    338404# elif defined(OS390)
     
    348414#  define HAVE_LOCALTIME_R
    349415#  define HAVE_WCTOMB
    350 #  define HAVE_MB
     416#  define HAVE_MBTOWC
     417# elif defined(AS400)
     418#  define HAVE_STRRCHR
     419#  define HAVE_STRTOD
     420#  define HAVE_SSCANF
     421#  define HAVE_STRTOL
     422#  define HAVE_STRTOUL
     423#  define HAVE_SYS_TIMEB_H
     424#  define HAVE_FTIME
     425#  define HAVE_RAND_R
     426#  define HAVE_GMTIME_R
     427#  define HAVE_LOCALTIME_R
     428#  define HAVE_WCTOMB
     429#  define HAVE_MBTOWC
     430# elif defined(__QNX__) || defined(QNX)
     431/* QNX does not have a working version of strtof */
     432#  undef HAVE_STRTOF
     433#  define HAVE_STRRCHR
     434#  define HAVE_STRTOD
     435#  define HAVE_SSCANF
     436#  define HAVE_STRTOL
     437#  define HAVE_STRTOUL
     438#  define HAVE_SYS_TIMEB_H
     439#  define HAVE_FTIME
     440#  define HAVE_RAND_R
     441#  define HAVE_GETHOSTBYNAME_R
     442#  define HAVE_GMTIME_R
     443#  define HAVE_LOCALTIME_R
     444#  define HAVE_WCTOMB
     445#  define HAVE_MBTOWC
     446#  define LONG64 long
     447#  define ULONG64 unsigned LONG64
     448#  define SOAP_LONG_FORMAT "%ld"
     449#  define SOAP_ULONG_FORMAT "%lu"
    351450# else
    352451/* Default asumptions on supported functions */
     
    367466#endif
    368467
    369 #if defined(TRU64)
    370 # define SOAP_LONG_FORMAT "%ld"
    371 # define SOAP_ULONG_FORMAT "%lu"
    372 #elif defined(WIN32)
    373 # define SOAP_LONG_FORMAT "%I64d"
    374 # define SOAP_ULONG_FORMAT "%I64u"
    375 #endif
    376 
    377 #ifndef SOAP_LONG_FORMAT
    378 # define SOAP_LONG_FORMAT "%lld"        /* printf format for 64 bit ints */
    379 #endif
    380 
    381 #ifndef SOAP_ULONG_FORMAT
    382 # define SOAP_ULONG_FORMAT "%llu"       /* printf format for unsigned 64 bit ints */
    383 #endif
    384 
    385 #ifndef SOAP_MALLOC                     /* use libc malloc */
    386 # define SOAP_MALLOC(n) malloc(n)
    387 #endif
    388 
    389 #ifndef SOAP_FREE                       /* use libc free */
    390 # define SOAP_FREE(p) free(p)
    391 #endif
    392 
    393 #include <stdlib.h>
    394 
    395 #ifndef PALM
    396 # include <stdio.h>
    397 # include <string.h>
    398 #endif
    399 
    400 #include <ctype.h>
    401 #include <limits.h>
     468#ifdef WITH_C_LOCALE
     469# include <xlocale.h>
     470#else
     471# undef HAVE_STRTOF_L
     472# undef HAVE_STRTOD_L
     473# undef HAVE_SSCANF_L
     474# undef HAVE_SPRINTF_L
     475#endif
     476
     477#ifndef WITH_NOSTDLIB
     478# include <stdlib.h>
     479# ifndef PALM
     480#  include <stdio.h>
     481#  include <string.h>
     482# endif
     483# include <ctype.h>
     484# include <limits.h>
     485#endif
    402486
    403487#if defined(__cplusplus) && !defined(WITH_LEAN)
    404488# include <string>
    405489# include <iostream>
    406   using namespace std;
    407 #endif
     490#endif
     491
     492#ifdef WITH_NOHTTP
     493# ifndef WITH_NOIO
     494#  define WITH_NOIO
     495#  undef WITH_COOKIES
     496# endif
     497#endif
     498
     499/* Suggestion when SOAP_FD_EXCEEDED error occurs:
     500   Some systems allow increasing FD_SETSIZE before including sys/types.h:
     501#define FD_SETSIZE (2048)
     502*/
    408503
    409504#ifndef UNDER_CE
    410505# ifndef PALM
    411 #  include <errno.h>
    412 ifndef MAC_CARBON
     506#  ifndef WITH_NOIO
     507 include <errno.h>
    413508#   include <sys/types.h>
    414509#  endif
     
    429524#endif
    430525
    431 #ifndef MAC_CARBON
     526#ifndef WITH_NOIO
    432527# ifndef WIN32
    433528#  ifndef PALM
     
    435530#   ifdef VXWORKS
    436531#    include <sockLib.h>
    437 #   endif
    438 #   ifndef VXWORKS
     532#    include <selectLib.h>
     533#    ifndef _WRS_KERNEL
     534#     include <strings.h>
     535#    endif
     536#   else
    439537#    ifndef SYMBIAN
    440538#     include <strings.h>
     
    446544#   endif
    447545#   ifdef VXWORKS
    448 #    include <sys/times.h>
     546#    ifdef _WRS_KERNEL
     547#     include <sys/times.h>
     548#    endif
    449549#   else
    450550#    include <sys/time.h>
     
    461561#endif
    462562
    463 #ifdef WITH_FASTCGI
    464 # include <fcgi_stdio.h>
    465 #endif
    466 
    467 #ifdef WITH_OPENSSL
    468 # define OPENSSL_NO_KRB5
    469 # include <openssl/ssl.h>
    470 # include <openssl/err.h>
    471 # include <openssl/rand.h>
    472 # ifndef ALLOW_OLD_VERSIONS
    473 #  if (OPENSSL_VERSION_NUMBER < 0x00905100L)
    474 #   error "Must use OpenSSL 0.9.6 or later"
    475 #  endif
    476 # endif
    477 #endif
    478 
    479 #ifdef WITH_GZIP
    480 # ifndef WITH_ZLIB
    481 #  define WITH_ZLIB
    482 # endif
    483 #endif
    484 
    485 #ifdef WITH_CASEINSENSITIVETAGS
    486 # define SOAP_STRCMP soap_tag_cmp       /* case insensitve XML element/attribute names */
     563#ifdef WIN32
     564# define SOAP_WINSOCKINT int
    487565#else
    488 # define SOAP_STRCMP strcmp             /* case sensitive XML element/attribute names */
    489 #endif
    490 
    491 #ifdef WITH_ZLIB
    492 # include <zlib.h>
    493 #endif
    494 
    495 #ifndef PALM
    496 # include <math.h>      /* for isnan() */
    497 #endif
    498 
    499 /* #define DEBUG */ /* Uncomment to debug sending (in file SENT.log) receiving (in file RECV.log) and messages (in file TEST.log) */
    500 
    501 #ifdef __cplusplus
    502 extern "C" {
    503 #endif
    504 
    505 #define soap_get0(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx])
    506 #define soap_get1(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx++])
    507 #define soap_revget1(soap) ((soap)->bufidx--)
    508 #define soap_unget(soap, c) ((soap)->ahead = c)
    509 #define soap_register_plugin(soap, plugin) soap_register_plugin_arg(soap, plugin, NULL)
    510 #define soap_imode(soap, n) ((soap)->mode = (soap)->imode = (n))
    511 #define soap_set_imode(soap, n) ((soap)->mode = (soap)->imode |= (n))
    512 #define soap_clr_imode(soap, n) ((soap)->mode = (soap)->imode &= ~(n))
    513 #define soap_omode(soap, n) ((soap)->mode = (soap)->omode = (n))
    514 #define soap_set_omode(soap, n) ((soap)->mode = (soap)->omode |= (n))
    515 #define soap_clr_omode(soap, n) ((soap)->mode = (soap)->omode &= ~(n))
    516 #define soap_destroy(soap) soap_delete((soap), NULL)
     566# define SOAP_WINSOCKINT size_t
     567#endif
    517568
    518569#ifdef WIN32
     
    521572#  include <fcntl.h>
    522573# endif
    523 # include <winsock.h>
    524 /* # include <winsock2.h> */ /* Alternative: use winsock2 (not available with eVC) */
    525 /* WR[ */
    526574# ifdef WITH_IPV6
     575#  include <winsock2.h> /* Visual Studio 2005 users: you must install the Platform SDK (R2) */
    527576#  include <ws2tcpip.h>
    528577#  include <wspiapi.h>
     578#  define SOAP_GAI_STRERROR gai_strerrorA
     579# else
     580#  include <winsock.h> /* Visual Studio 2005 users: you must install the Platform SDK (R2) */
     581/* # include <winsock2.h> */ /* Alternative: use winsock2 (not available with eVC) */
    529582# endif
    530583#else
     
    534587#  include <ioLib.h>
    535588# endif
    536 /* ]WR */
    537 # ifndef MAC_CARBON
     589# ifndef WITH_NOIO
    538590#  ifndef PALM
    539591#   include <netdb.h>
     
    541593#   include <unistd.h>
    542594#   include <fcntl.h>
     595#   ifdef _AIX41
     596#    include <sys/select.h>
     597#   endif
    543598#  endif
    544599# endif
    545600#endif
    546601
    547 #ifdef WIN32
    548 # define SOAP_SOCKET SOCKET
     602#ifdef WITH_FASTCGI
     603# include <fcgi_stdio.h>
     604#endif
     605
     606#ifdef WITH_OPENSSL
     607# define OPENSSL_NO_KRB5
     608# include <openssl/bio.h>
     609# include <openssl/err.h>
     610# include <openssl/rand.h>
     611# include <openssl/ssl.h>
     612# include <openssl/x509v3.h>
     613# ifndef ALLOW_OLD_VERSIONS
     614#  if (OPENSSL_VERSION_NUMBER < 0x00905100L)
     615#   error "Must use OpenSSL 0.9.6 or later"
     616#  endif
     617# endif
     618#endif
     619
     620#ifdef WITH_GZIP
     621# ifndef WITH_ZLIB
     622#  define WITH_ZLIB
     623# endif
     624#endif
     625
     626#ifdef WITH_CASEINSENSITIVETAGS
     627# define SOAP_STRCMP soap_tag_cmp       /* case insensitve XML element/attribute names */
    549628#else
    550 # define SOAP_SOCKET int
    551 # define closesocket(n) close(n)
    552 #endif
    553 
    554 #define soap_valid_socket(n) ((n) >= 0)
    555 #define SOAP_INVALID_SOCKET (-1)
     629# define SOAP_STRCMP strcmp             /* case sensitive XML element/attribute names */
     630#endif
     631
     632#ifdef WITH_ZLIB
     633# include <zlib.h>
     634#endif
     635
     636#ifndef WITH_NOSTDLIB
     637# ifndef PALM
     638#  include <math.h>     /* for isnan() */
     639# endif
     640#endif
     641
     642/* #define DEBUG */ /* Uncomment to debug sending (in file SENT.log) receiving (in file RECV.log) and messages (in file TEST.log) */
     643
     644#ifdef __cplusplus
     645extern "C" {
     646#endif
     647
     648/* Portability: define SOAP_SOCKLEN_T */
     649#if defined(_AIX)
     650# if defined(_AIX43)
     651#  define SOAP_SOCKLEN_T socklen_t
     652# else
     653#  define SOAP_SOCKLEN_T int
     654# endif
     655#elif defined(SOCKLEN_T)
     656# define SOAP_SOCKLEN_T SOCKLEN_T
     657#elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN) || defined(FREEBSD) || defined(__FreeBSD__) || defined(__QNX__) || defined(QNX)
     658# define SOAP_SOCKLEN_T socklen_t
     659#elif defined(IRIX) || defined(WIN32) || defined(__APPLE__) || defined(HP_UX) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS)
     660# define SOAP_SOCKLEN_T int
     661#else
     662# define SOAP_SOCKLEN_T size_t
     663#endif
     664
     665#ifndef SOAP_SOCKET
     666# ifdef WIN32
     667#  define SOAP_SOCKET SOCKET
     668#  define soap_closesocket(n) closesocket(n)
     669# else
     670#  define SOAP_SOCKET int
     671#  define soap_closesocket(n) close(n)
     672# endif
     673#endif
     674
     675#define SOAP_INVALID_SOCKET ((SOAP_SOCKET)-1)
     676#define soap_valid_socket(n) ((n) != SOAP_INVALID_SOCKET)
     677
     678#ifndef SOAP_GAI_STRERROR
     679# define SOAP_GAI_STRERROR gai_strerror
     680#endif
     681
     682#ifndef FD_SETSIZE
     683# define FD_SETSIZE (1024)
     684#endif
    556685
    557686#if defined(SYMBIAN)
    558687# define LONG64 long
    559688# define ULONG64 unsigned LONG64
    560 #elif !defined(WIN32)
    561 # define LONG64 long long
    562 # define ULONG64 unsigned LONG64
     689#elif !defined(WIN32) || defined(CYGWIN) || defined(__GLIBC__) || defined(__GNU__)
     690# ifndef LONG64
     691#  if defined(HAVE_STDINT_H)
     692#   include <stdint.h>
     693#   define LONG64 int64_t
     694#   define ULONG64 uint64_t
     695#  elif defined(__GLIBC__)
     696#   include <bits/wordsize.h>
     697#   if (__WORDSIZE == 64)
     698#    define LONG64 int64_t
     699#    define ULONG64 uint64_t
     700#    ifndef SOAP_LONG_FORMAT
     701#     define SOAP_LONG_FORMAT "%ld"
     702#    endif
     703#    ifndef SOAP_ULONG_FORMAT
     704#     define SOAP_ULONG_FORMAT "%lu"
     705#    endif
     706#   else
     707#    define LONG64 long long
     708#    define ULONG64 unsigned LONG64
     709#   endif
     710#  else
     711#   define LONG64 long long
     712#   define ULONG64 unsigned LONG64
     713#  endif
     714# endif
    563715#elif defined(UNDER_CE)
    564716# define LONG64 __int64
     
    569721#endif
    570722
    571 #if defined(WIN32)
     723#ifndef SOAP_LONG_FORMAT
     724# define SOAP_LONG_FORMAT "%lld"        /* printf format for 64 bit ints */
     725#endif
     726
     727#ifndef SOAP_ULONG_FORMAT
     728# define SOAP_ULONG_FORMAT "%llu"       /* printf format for unsigned 64 bit ints */
     729#endif
     730
     731#if defined(WIN32) && !defined(CYGWIN)
    572732# define soap_int32 __int32
    573733#elif defined(SYMBIAN)
     
    575735#elif defined(PALM)
    576736# define soap_int32 Int32
     737#elif defined(_AIX)
     738# if defined(_AIX43)
     739#  define soap_int32 int32_t
     740# else
     741#  define soap_int32 signed int
     742# endif
    577743#else
    578744# define soap_int32 int32_t
    579745#endif
    580746
    581 /* UCS-4 requires 32 bits (0-7FFFFFFF, the sign bit is used by gSOAP to distinguish XML entities) */
    582 typedef soap_int32 soap_wchar;
    583 
    584747#ifdef WIN32
     748# define SOAP_ERANGE ERANGE
    585749# define SOAP_EINTR WSAEINTR
    586750# define SOAP_EAGAIN WSAEWOULDBLOCK
    587751# define SOAP_EWOULDBLOCK WSAEWOULDBLOCK
    588752# define SOAP_EINPROGRESS WSAEINPROGRESS
     753# define SOAP_EADDRINUSE WSAEADDRINUSE
    589754#else
     755# define SOAP_ERANGE ERANGE
    590756# define SOAP_EINTR EINTR
    591757# define SOAP_EAGAIN EAGAIN
     758# define SOAP_EADDRINUSE EADDRINUSE
    592759# ifdef SYMBIAN
    593760#  define SOAP_EWOULDBLOCK 9898
     
    602769# ifdef UNDER_CE
    603770#  define soap_errno GetLastError()
    604 #  define soap_socket_errno GetLastError()
     771#  define soap_socket_errno(s) GetLastError()
     772#  define soap_reset_errno SetLastError(0)
    605773# else
    606774#  define soap_errno GetLastError()
    607 #  define soap_socket_errno WSAGetLastError()
     775#  define soap_socket_errno(s) WSAGetLastError()
     776#  define soap_reset_errno SetLastError(0)
    608777# endif
    609778#else
    610 # define soap_errno errno
    611 # define soap_socket_errno errno
     779# ifndef WITH_NOIO
     780#  define soap_errno errno
     781#  define soap_socket_errno(s) errno
     782#  define soap_reset_errno (errno = 0)
     783# else
     784#  define soap_errno 0
     785#  define soap_socket_errno(s) 0
     786#  define soap_reset_errno
     787# endif
    612788#endif
    613789
    614790#ifndef SOAP_BUFLEN
    615791# ifndef WITH_LEAN
    616 #  define SOAP_BUFLEN  (32768) /* buffer length for socket packets, also used by gethostbyname_r so don't make this too small */
     792#  define SOAP_BUFLEN (65536) /* buffer length for socket packets, also used by gethostbyname_r and UDP messages, so don't make this too small */
    617793# else
    618 #  define SOAP_BUFLEN   (2048)
     794#  define SOAP_BUFLEN  (2048)
    619795# endif
    620796#endif
    621797#ifndef SOAP_LABLEN
    622 # ifndef WITH_LEAN
    623 #  define SOAP_LABLEN  (256) /* initial look-aside buffer length */
    624 # else
    625 #  define SOAP_LABLEN   (64)
    626 # endif
     798# define SOAP_LABLEN     (256) /* initial look-aside buffer length */
     799#endif
     800#ifndef SOAP_PTRBLK
     801# define SOAP_PTRBLK     (32) /* block allocation for pointer hash table chains */
    627802#endif
    628803#ifndef SOAP_PTRHASH
    629804# ifndef WITH_LEAN
    630 #  define SOAP_PTRHASH  (1024) /* size of pointer analysis hash table (must be power of 2) */
     805#  define SOAP_PTRHASH (1024) /* size of pointer analysis hash table (must be power of 2) */
    631806# else
    632 #  define SOAP_PTRHASH    (16)
     807#  define SOAP_PTRHASH   (32)
    633808# endif
    634809#endif
    635810#ifndef SOAP_IDHASH
    636811# ifndef WITH_LEAN
    637 #  define SOAP_IDHASH   (1999) /* prime size of hash table for parsed id/ref */
     812#  define SOAP_IDHASH  (1999) /* prime size of hash table for parsed id/ref */
    638813# else
    639 #  define SOAP_IDHASH    (199)
     814#  define SOAP_IDHASH    (19) /* 19, 199 */
    640815# endif
    641816#endif
    642817#ifndef SOAP_BLKLEN
    643 # define SOAP_BLKLEN     (256) /* size of blocks to collect long strings and XML attributes */
     818# ifndef WITH_LEAN
     819#  define SOAP_BLKLEN   (256) /* size of blocks to collect long strings and XML attributes */
     820# else
     821#  define SOAP_BLKLEN    (32)
     822# endif
    644823#endif
    645824#ifndef SOAP_TAGLEN
    646 # define SOAP_TAGLEN     (256) /* maximum length of XML element tag/attribute name + 1 */
     825# ifndef WITH_LEAN
     826#  define SOAP_TAGLEN  (1024) /* maximum length of XML element tag/attribute name or host/path name + 1 */
     827# else
     828#  define SOAP_TAGLEN    (64)
     829# endif
    647830#endif
    648831#ifndef SOAP_HDRLEN
    649832# ifndef WITH_LEAN
    650 #  define SOAP_HDRLEN   (8192) /* maximum length of HTTP header line (must be >4096 to read cookies) */
     833#  define SOAP_HDRLEN  (8192) /* maximum length of HTTP header line (must be >4096 to read cookies) */
    651834# else
    652 #  define SOAP_HDRLEN   (1024)
     835#  define SOAP_HDRLEN  (1024)
    653836# endif
    654837#endif
    655838#ifndef SOAP_MAXDIMS
    656 # define SOAP_MAXDIMS    (16) /* maximum array dimensions (array nestings) must be less than 64 to protect soap->tmpbuf */
     839# ifndef WITH_LEAN
     840#  define SOAP_MAXDIMS   (16) /* maximum array dimensions (array nestings) must be less than 64 to protect soap->tmpbuf */
     841# else
     842#  define SOAP_MAXDIMS    (4)
     843# endif
    657844#endif
    658845
     
    669856
    670857#ifndef SOAP_MAXARRAYSIZE
    671 # define SOAP_MAXARRAYSIZE (100000) /* "trusted" max size of inbound SOAP array for compound array allocation */
     858# define SOAP_MAXARRAYSIZE (1000000) /* "trusted" max size of inbound SOAP array for compound array allocation */
    672859#endif
    673860
     
    691878
    692879#ifdef SUN_OS
    693 # define soap_isnan(n) isnan(n)
     880# define HAVE_ISNAN
     881#endif
     882
     883#ifdef __APPLE__
     884# ifdef __cplusplus
     885#  ifndef isnan
     886extern "C" int isnan(double);
     887#  endif
     888# endif
     889# define HAVE_ISNAN
    694890#endif
    695891
    696892#if !defined(HAVE_ISNAN) && (defined(_MATH_H) || defined(_MATH_INCLUDED))
    697893# define HAVE_ISNAN
     894#endif
     895
     896extern const struct soap_double_nan { unsigned int n1, n2; } soap_double_nan;
     897
     898#ifdef VXWORKS
     899# ifndef FLT_MAX
     900#  define FLT_MAX _ARCH_FLT_MAX
     901# endif
     902# ifndef DBL_MAX
     903#  define DBL_MAX _ARCH_DBL_MAX
     904# endif
     905#endif
     906
     907#ifndef FLT_NAN
     908#  define FLT_NAN (*(float*)(void*)&soap_double_nan)
     909#endif
     910
     911#ifndef FLT_PINFTY
     912# if defined(FLT_MAX)
     913#  define FLT_PINFTY FLT_MAX
     914# elif defined(HUGE_VALF)
     915#  define FLT_PINFTY (float)HUGE_VALF
     916# elif defined(HUGE_VAL)
     917#  define FLT_PINFTY (float)HUGE_VAL
     918# elif defined(FLOAT_MAX)
     919#  define FLT_PINFTY FLOAT_MAX
     920# else
     921#  define FLT_PINFTY (3.40282347e+38F)
     922# endif
     923#endif
     924
     925#ifndef FLT_NINFTY
     926# define FLT_NINFTY (-FLT_PINFTY)
     927#endif
     928
     929#ifndef DBL_NAN
     930#  define DBL_NAN (*(double*)(void*)&soap_double_nan)
     931#endif
     932
     933#ifndef DBL_PINFTY
     934# if defined(DBL_MAX)
     935#  define DBL_PINFTY DBL_MAX
     936# elif defined(HUGE_VALF)
     937#  define DBL_PINFTY (double)HUGE_VALF
     938# elif defined(HUGE_VAL)
     939#  define DBL_PINFTY (double)HUGE_VAL
     940# elif defined(DOUBLE_MAX)
     941#  define DBL_PINFTY DOUBLE_MAX
     942# else
     943#  define DBL_PINFTY (1.7976931348623157e+308)
     944# endif
     945#endif
     946
     947#ifndef DBL_NINFTY
     948# define DBL_NINFTY (-DBL_PINFTY)
    698949#endif
    699950
     
    702953#  define soap_isnan(n) isnan(n)
    703954# else
    704 #  define soap_isnan(_) (0)
    705 # endif
    706 #endif
    707 
    708 extern const struct soap_double_nan { unsigned int n1, n2; } soap_double_nan;
    709 
    710 #ifdef VXWORKS
    711 # ifndef FLT_MAX
    712 #  define FLT_MAX _ARCH_FLT_MAX
    713 # endif
    714 # ifndef DBL_MAX
    715 #  define DBL_MAX _ARCH_DBL_MAX
    716 # endif
    717 #endif
    718 
    719 #ifndef FLT_NAN
    720 # ifdef HAVE_ISNAN
    721 #  define FLT_NAN (*(float*)&soap_double_nan)
    722 # else
    723 #  define FLT_NAN (0.0)
    724 # endif
    725 #endif
    726 
    727 #ifndef FLT_PINFTY
    728 # ifdef FLT_MAX
    729 #  define FLT_PINFTY FLT_MAX
    730 # else
    731 #  ifdef HUGE_VAL
    732 #    define FLT_PINFTY (float)HUGE_VAL
    733 #  else
    734 #   ifdef FLOAT_MAX
    735 #    define FLT_PINFTY FLOAT_MAX
    736 #   else
    737 #    define FLT_PINFTY (3.40282347e+38)
    738 #   endif
    739 #  endif
    740 # endif
    741 #endif
    742 
    743 #ifndef FLT_NINFTY
    744 # define FLT_NINFTY (-FLT_PINFTY)
    745 #endif
    746 
    747 #ifndef DBL_NAN
    748 # ifdef HAVE_ISNAN
    749 #  define DBL_NAN (*(double*)&soap_double_nan)
    750 # else
    751 #  define DBL_NAN (0.0)
    752 # endif
    753 #endif
    754 
    755 #ifndef DBL_PINFTY
    756 # ifdef DBL_MAX
    757 #  define DBL_PINFTY DBL_MAX
    758 # else
    759 #  ifdef HUGE_VAL
    760 #   define DBL_PINFTY (double)HUGE_VAL
    761 #  else
    762 #   ifdef DOUBLE_MAX
    763 #    define DBL_PINFTY DOUBLE_MAX
    764 #   else
    765 #    define DBL_PINFTY (1.7976931348623157e+308)
    766 #   endif
    767 #  endif
    768 # endif
    769 #endif
    770 
    771 #ifndef DBL_NINFTY
    772 # define DBL_NINFTY (-DBL_PINFTY)
     955#  define soap_isnan(n) (0)
     956# endif
    773957#endif
    774958
     
    792976#define SOAP_MUSTUNDERSTAND             8
    793977#define SOAP_NAMESPACE                  9
    794 /* #define SOAP_OBJ_MISMATCH            10      obsolete */
    795 #define SOAP_TAG_END                    10
     978#define SOAP_USER_ERROR                 10
    796979#define SOAP_FATAL_ERROR                11
    797980#define SOAP_FAULT                      12
    798981#define SOAP_NO_METHOD                  13
    799 #define SOAP_GET_METHOD                 14
    800 #define SOAP_EOM                        15
    801 #define SOAP_NULL                       16
    802 #define SOAP_MULTI_ID                   17
    803 #define SOAP_MISSING_ID                 18
    804 #define SOAP_HREF                       19
    805 #define SOAP_TCP_ERROR                  20
    806 #define SOAP_HTTP_ERROR                 21
    807 #define SOAP_SSL_ERROR                  22
    808 #define SOAP_ZLIB_ERROR                 23
    809 #define SOAP_DIME_ERROR                 24
    810 #define SOAP_DIME_HREF                  25
    811 #define SOAP_DIME_MISMATCH              26
    812 #define SOAP_DIME_END                   27
    813 #define SOAP_MIME_ERROR                 28
    814 #define SOAP_VERSIONMISMATCH            29
    815 #define SOAP_PLUGIN_ERROR               30
    816 #define SOAP_DATAENCODINGUNKNOWN        31
    817 #define SOAP_REQUIRED                   32
    818 #define SOAP_PROHIBITED                 33
    819 #define SOAP_OCCURS                     34
    820 #define SOAP_LENGTH                     35
    821 
    822 #define soap_xml_error_check(e) ((e) == SOAP_TAG_MISMATCH || (e) == SOAP_TAG_END || (e) == SOAP_SYNTAX_ERROR || (e) == SOAP_NAMESPACE || (e) == SOAP_MULTI_ID || (e) == SOAP_MISSING_ID || (e) == SOAP_REQUIRED || (e) == SOAP_PROHIBITED || (e) == SOAP_OCCURS || (e) == SOAP_LENGTH || (e) == SOAP_NULL || (e) == SOAP_HREF)
     982#define SOAP_NO_DATA                    14
     983#define SOAP_GET_METHOD                 15
     984#define SOAP_PUT_METHOD                 16
     985#define SOAP_DEL_METHOD                 17
     986#define SOAP_HEAD_METHOD                18
     987#define SOAP_HTTP_METHOD                19
     988#define SOAP_EOM                        20
     989#define SOAP_MOE                        21
     990#define SOAP_HDR                        22
     991#define SOAP_NULL                       23
     992#define SOAP_DUPLICATE_ID               24
     993#define SOAP_MISSING_ID                 25
     994#define SOAP_HREF                       26
     995#define SOAP_UDP_ERROR                  27
     996#define SOAP_TCP_ERROR                  28
     997#define SOAP_HTTP_ERROR                 29
     998#define SOAP_SSL_ERROR                  30
     999#define SOAP_ZLIB_ERROR                 31
     1000#define SOAP_DIME_ERROR                 32
     1001#define SOAP_DIME_HREF                  33
     1002#define SOAP_DIME_MISMATCH              34
     1003#define SOAP_DIME_END                   35
     1004#define SOAP_MIME_ERROR                 36
     1005#define SOAP_MIME_HREF                  37
     1006#define SOAP_MIME_END                   38
     1007#define SOAP_VERSIONMISMATCH            39
     1008#define SOAP_PLUGIN_ERROR               40
     1009#define SOAP_DATAENCODINGUNKNOWN        41
     1010#define SOAP_REQUIRED                   42
     1011#define SOAP_PROHIBITED                 43
     1012#define SOAP_OCCURS                     44
     1013#define SOAP_LENGTH                     45
     1014#define SOAP_FD_EXCEEDED                46
     1015
     1016#define soap_xml_error_check(e) ((e) == SOAP_TAG_MISMATCH || (e) == SOAP_NO_TAG || (e) == SOAP_SYNTAX_ERROR || (e) == SOAP_NAMESPACE || (e) == SOAP_DUPLICATE_ID || (e) == SOAP_MISSING_ID || (e) == SOAP_REQUIRED || (e) == SOAP_PROHIBITED || (e) == SOAP_OCCURS || (e) == SOAP_LENGTH || (e) == SOAP_NULL || (e) == SOAP_HREF)
    8231017#define soap_soap_error_check(e) ((e) == SOAP_CLI_FAULT || (e) == SOAP_SVR_FAULT || (e) == SOAP_VERSIONMISMATCH || (e) == SOAP_MUSTUNDERSTAND || (e) == SOAP_FAULT || (e) == SOAP_NO_METHOD)
    8241018#define soap_tcp_error_check(e) ((e) == SOAP_EOF || (e) == SOAP_TCP_ERROR)
    8251019#define soap_ssl_error_check(e) ((e) == SOAP_SSL_ERROR)
    8261020#define soap_zlib_error_check(e) ((e) == SOAP_ZLIB_ERROR)
    827 #define soap_mime_error_check(e) ((e) == SOAP_MIME_ERROR)
    828 #define soap_dime_error_check(e) ((e) == SOAP_DIME_ERROR || (e) == SOAP_DIME_MISMATCH)
    829 #define soap_http_error_check(e) ((e) == SOAP_HTTP_ERROR || (e) == SOAP_GET_METHOD || ((e) >= 100 && (e) < 600))
    830 
    831 /* gSOAP HTTP response status codes 100 to 600 are reserved */
    832 
    833 /* Special gSOAP HTTP response status codes */
     1021#define soap_http_error_check(e) ((e) == SOAP_HTTP_ERROR || ((e) >= SOAP_GET_METHOD && (e) <= SOAP_HTTP_METHOD)|| (e) == SOAP_NO_DATA || ((e) >= 100 && (e) < 600))
     1022
     1023/* gSOAP HTTP response status codes 100 to 599 are reserved */
     1024
     1025/* Codes 600 to 999 are user definable */
     1026
     1027/* Exceptional gSOAP HTTP response status codes >= 1000 */
    8341028
    8351029#define SOAP_STOP               1000    /* No HTTP response */
    836 #define SOAP_HTML               1001    /* Custom HTML response */
    837 #define SOAP_FILE               1002    /* Custom file-based response */
    838 
    839 /* gSOAP HTTP request status codes */
    840 
    841 #define SOAP_POST               1003
    842 #define SOAP_GET                1104
     1030#define SOAP_FORM               1001    /* Form request/response */
     1031#define SOAP_HTML               1002    /* Custom HTML response */
     1032#define SOAP_FILE               1003    /* Custom file-based response */
     1033
     1034/* gSOAP HTTP method codes */
     1035
     1036#define SOAP_POST               2000
     1037#define SOAP_GET                2001
    8431038
    8441039/* gSOAP DIME */
     
    8681063#define SOAP_IO_CHUNK           0x00000003      /* use HTTP chunked transfer AND buffer packets */
    8691064
    870 #define SOAP_IO_LENGTH          0x00000004
    871 #define SOAP_IO_KEEPALIVE       0x00000008
    872 
    873 #define SOAP_ENC_LATIN          0x00800010      /* iso-8859-1 encoding */
    874 #define SOAP_ENC_XML            0x00000020      /* plain XML encoding, no HTTP header */
    875 #define SOAP_ENC_DIME           0x00000040
    876 #define SOAP_ENC_MIME           0x00000080
    877 #define SOAP_ENC_ZLIB           0x00000100
    878 #define SOAP_ENC_SSL            0x00000200
    879 
    880 #define SOAP_XML_STRICT         0x00001000      /* strict validation */
    881 #define SOAP_XML_CANONICAL      0x00002000      /* C14N canonical XML */
    882 #define SOAP_XML_TREE           0x00004000
    883 #define SOAP_XML_GRAPH          0x00008000
    884 #define SOAP_XML_NIL            0x00010000
    885 #define SOAP_XML_DOM            0x00020000
    886 #define SOAP_XML_SEC            0x00040000      /* reserved for WS security */
    887 
    888 #define SOAP_C_NOIOB            0x00100000
    889 #define SOAP_C_UTFSTRING        0x00200000
    890 #define SOAP_C_MBSTRING         0x00400000
     1065#define SOAP_IO_UDP             0x00000004      /* TCP or UDP */
     1066
     1067#define SOAP_IO_LENGTH          0x00000008      /* calc message length (internal) */
     1068#define SOAP_IO_KEEPALIVE       0x00000010      /* keep connection alive */
     1069
     1070#define SOAP_ENC_LATIN          0x00000020      /* accept iso-8859-1 encoding */
     1071#define SOAP_ENC_XML            0x00000040      /* plain XML encoding, no HTTP header */
     1072#define SOAP_ENC_DIME           0x00000080
     1073#define SOAP_ENC_MIME           0x00000100
     1074#define SOAP_ENC_MTOM           0x00000200
     1075#define SOAP_ENC_ZLIB           0x00000400
     1076#define SOAP_ENC_SSL            0x00000800
     1077
     1078#define SOAP_ENC                0x00000FFF      /* IO and ENC mask */
     1079
     1080#define SOAP_XML_STRICT         0x00001000      /* apply strict validation */
     1081#define SOAP_XML_INDENT         0x00002000      /* emit indented XML */
     1082#define SOAP_XML_CANONICAL      0x00004000      /* EXC C14N canonical XML */
     1083#define SOAP_XML_TREE           0x00008000      /* emit XML tree (no id/ref) */
     1084#define SOAP_XML_GRAPH          0x00010000
     1085#define SOAP_XML_NIL            0x00020000
     1086#define SOAP_XML_DOM            0x00040000
     1087#define SOAP_XML_SEC            0x00080000      /* reserved for WS security */
     1088
     1089#define SOAP_C_NOIOB            0x00100000      /* don't fault on array index out of bounds (just ignore) */
     1090#define SOAP_C_UTFSTRING        0x00200000      /* (de)serialize strings with UTF8 content */
     1091#define SOAP_C_MBSTRING         0x00400000      /* (de)serialize strings with multi-byte content */
     1092#define SOAP_C_NILSTRING        0x00800000      /* serialize empty strings as nil (omitted) */
    8911093
    8921094#define SOAP_DOM_TREE           0x01000000
    8931095#define SOAP_DOM_NODE           0x02000000
     1096#define SOAP_DOM_ASIS           0x04000000
     1097
     1098#define SOAP_MIME_POSTCHECK     0x10000000      /* MIME flag (internal) */
    8941099
    8951100#define SOAP_IO_DEFAULT         SOAP_IO_FLUSH
     
    9001105#define SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION  0x01    /* client requires server to authenticate */
    9011106#define SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION  0x02    /* server requires client to authenticate */
    902 
    903 #define SOAP_SSL_DEFAULT                        SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION
    904 
    905 /* */
     1107#define SOAP_SSL_SKIP_HOST_CHECK                0x04    /* client does not check the common name of the host in certificate */
     1108#define SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE      0x08    /* client does not check the expiration date of the host certificate */
     1109#define SOAP_SSL_RSA                            0x10    /* use RSA */
     1110#define SOAP_SSLv3                              0x20    /* SSL v3 only */
     1111#define SOAP_TLSv1                              0x40    /* TLS v1 only */
     1112#define SOAP_SSLv3_TLSv1                        0x00    /* SSL v3 and TLS v1 support by default */
     1113
     1114#define SOAP_SSL_DEFAULT                        (SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION | SOAP_SSLv3_TLSv1)
     1115
     1116/* state */
     1117
     1118#define SOAP_NONE       0
     1119#define SOAP_INIT       1
     1120#define SOAP_COPY       2
     1121
     1122#define soap_check_state(soap) (!(soap) || ((soap)->state != SOAP_INIT && (soap)->state != SOAP_COPY))
     1123
     1124/* part */
    9061125
    9071126#define SOAP_BEGIN              0
     
    9091128#define SOAP_IN_HEADER          3
    9101129#define SOAP_END_HEADER         4
    911 #define SOAP_IN_BODY            5
    912 #define SOAP_END_BODY           6
    913 #define SOAP_END_ENVELOPE       7
    914 #define SOAP_END                8
     1130#define SOAP_NO_BODY            5
     1131#define SOAP_IN_BODY            6
     1132#define SOAP_END_BODY           7
     1133#define SOAP_END_ENVELOPE       8
     1134#define SOAP_END                9
     1135#define SOAP_BEGIN_SECURITY     10
     1136#define SOAP_IN_SECURITY        11
     1137#define SOAP_END_SECURITY       12
    9151138
    9161139/* DEBUG macros */
     
    9211144#   define SOAP_DEBUG
    9221145#  endif
    923 # endif
     1146#  ifndef SOAP_MEM_DEBUG
     1147#   define SOAP_MEM_DEBUG
     1148#  endif
     1149# endif
     1150#endif
     1151
     1152#ifdef SOAP_MEM_DEBUG
     1153# ifndef SOAP_MALLOC
     1154#  define SOAP_MALLOC(soap, size) soap_track_malloc(soap, __FILE__, __LINE__, size)
     1155# endif
     1156# ifndef SOAP_FREE
     1157#  define SOAP_FREE(soap, ptr) soap_track_free(soap, __FILE__, __LINE__, ptr)
     1158# endif
     1159#endif
     1160
     1161#ifndef SOAP_MALLOC                     /* use libc malloc */
     1162# define SOAP_MALLOC(soap, size) malloc(size)
     1163#endif
     1164
     1165#ifndef SOAP_FREE                       /* use libc free */
     1166# define SOAP_FREE(soap, ptr) free(ptr)
    9241167#endif
    9251168
     
    9321175{ if (soap)\
    9331176  { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\
    934       soap_open_logfile(soap, SOAP_INDEX_##DBGFILE);\
     1177      soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\
    9351178    if (soap->fdebug[SOAP_INDEX_##DBGFILE])\
    9361179    { FILE *fdebug = soap->fdebug[SOAP_INDEX_##DBGFILE];\
     
    9451188{ if (soap)\
    9461189  { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\
    947       soap_open_logfile(soap, SOAP_INDEX_##DBGFILE);\
     1190      soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\
    9481191    if (soap->fdebug[SOAP_INDEX_##DBGFILE])\
    9491192    { fwrite((MSG), 1, (LEN), soap->fdebug[SOAP_INDEX_##DBGFILE]);\
     
    9531196}
    9541197# endif
     1198# ifndef DBGFUN
     1199#  define DBGFUN(FNAME) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s()\n", __FILE__, __LINE__, FNAME))
     1200#  define DBGFUN1(FNAME, FMT, ARG) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s("FMT")\n", __FILE__, __LINE__, FNAME, (ARG)))
     1201#  define DBGFUN2(FNAME, FMT1, ARG1, FMT2, ARG2) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s("FMT1", "FMT2")\n", __FILE__, __LINE__, FNAME, (ARG1), (ARG2)))
     1202#  define DBGFUN3(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s("FMT1", "FMT2", "FMT3")\n", __FILE__, __LINE__, FNAME, (ARG1), (ARG2), (ARG3)))
     1203# endif
     1204# ifndef DBGHEX
     1205#  define DBGHEX(DBGFILE, MSG, LEN) \
     1206{ if (soap)\
     1207  { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\
     1208      soap_open_logfile(soap, SOAP_INDEX_##DBGFILE);\
     1209    if (soap->fdebug[SOAP_INDEX_##DBGFILE])\
     1210    { int i; char *s;\
     1211      for (s = (char*)(MSG), i = (LEN); i; i--)\
     1212        fprintf(soap->fdebug[SOAP_INDEX_##DBGFILE], "%2.2X  ", (int)*s++&0xFF);\
     1213      fflush(soap->fdebug[SOAP_INDEX_##DBGFILE]);\
     1214    }\
     1215  }\
     1216}
     1217# endif
    9551218#else
    9561219# define DBGLOG(DBGFILE, CMD)
    9571220# define DBGMSG(DBGFILE, MSG, LEN)
    958 #endif
    959 
     1221# define DBGFUN(FNAME)
     1222# define DBGFUN1(FNAME, FMT, ARG)
     1223# define DBGFUN2(FNAME, FMT1, ARG1, FMT2, ARG2)
     1224# define DBGFUN3(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3)
     1225# define DBGHEX(DBGFILE, MSG, LEN)
     1226#endif
     1227
     1228/* UCS-4 requires 32 bits (0-7FFFFFFF, the sign bit is used by gSOAP to distinguish XML entities) */
     1229typedef soap_int32 soap_wchar;
     1230
     1231/* namespace table row */
    9601232struct Namespace
    9611233{ const char *id;
     
    9651237};
    9661238
     1239/* namespace stack */
    9671240struct soap_nlist
    9681241{ struct soap_nlist *next;
    969   unsigned int level;
     1242  unsigned int level; /* nesting depth level */
    9701243  short index; /* corresponding entry in ns mapping table */
    9711244  char *ns; /* only set when parsed ns URI is not in the ns mapping table */
     
    9731246};
    9741247
     1248/* block stack for nested block allocations */
    9751249struct soap_blist
    9761250{ struct soap_blist *next;
     
    9791253};
    9801254
     1255/* array layout */
    9811256struct soap_array
    9821257{ void *__ptr;
     
    9951270};
    9961271
     1272/* block allocation for pointer serialization management */
     1273struct soap_pblk
     1274{ struct soap_pblk *next;
     1275  struct soap_plist plist[SOAP_PTRBLK];
     1276};
     1277
     1278#ifdef SOAP_MEM_DEBUG
     1279/* malloc/free tracking for debugging */
     1280struct soap_mlist
     1281{ struct soap_mlist *next;
     1282  const void *ptr;
     1283  const char *file;
     1284  int line;
     1285  short live;
     1286};
     1287#endif
     1288
    9971289/* class allocation list */
    9981290struct soap_clist
     
    10011293  int type;
    10021294  int size;
    1003   void (*fdelete)(struct soap_clist*);
    1004 };
    1005 
     1295  int (*fdelete)(struct soap_clist*);
     1296};
     1297
     1298/* attributes */
    10061299struct soap_attribute
    10071300{ struct soap_attribute *next;
     
    10131306};
    10141307
     1308#ifndef WITH_LEAN
    10151309struct soap_cookie
    10161310{ struct soap_cookie *next;
     
    10191313  char *domain;
    10201314  char *path;
    1021   long expire;          /* client-side: local time to expire; server-side: seconds to expire */
     1315  time_t expire;        /* client-side: local time to expire */
     1316  long maxage;          /* server-side: seconds to expire */
    10221317  unsigned int version;
    10231318  short secure;
    10241319  short session;        /* server-side */
    1025   short env;            /* server-side: got cookie from client */
    1026   short modified;       /* server-side: client cookie was modified */
    1027 };
     1320  short env;            /* server-side: got cookie from client and should not be (re)send */
     1321  short modified;       /* server-side: client cookie was modified and should be send */
     1322};
     1323#endif
    10281324
    10291325#ifdef __cplusplus
    10301326SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart*);
     1327
    10311328class soap_multipart_iterator
    10321329{ public:
     
    10471344#endif
    10481345
     1346#ifndef WITH_LEANER
    10491347struct soap_dime
    10501348{ size_t count;
     
    10661364#endif
    10671365};
    1068 
     1366#endif
     1367
     1368#ifndef WITH_LEANER
    10691369struct soap_mime
    10701370{ char *boundary;                       /* MIME boundary */
    10711371  const char *start;                    /* MIME start ID */
    1072   struct soap_multipart *list;          /* list of DIME attachments received */
     1372  struct soap_multipart *list;          /* list of MIME attachments received */
    10731373  struct soap_multipart *first, *last;  /* temporary in/out queue */
    10741374#ifdef __cplusplus
     
    10791379#endif
    10801380};
    1081 
     1381#endif
     1382
     1383#ifndef WITH_LEANER
    10821384/* RFC2045 MIME content transfer encodings */
    10831385enum soap_mime_encoding
     
    10911393  SOAP_MIME_X_TOKEN
    10921394};
    1093 
     1395#endif
     1396
     1397#ifndef WITH_LEANER
    10941398/* DIME/MIME multipart list */
    10951399struct soap_multipart
     
    10971401  char *ptr;                            /* points to raw data content */
    10981402  size_t size;                          /* size of data content */
    1099   const char *id;                       /* DIME/MIME content ID */
     1403  const char *id;                       /* DIME/MIME content ID or form data name */
    11001404  const char *type;                     /* DIME/MIME type (MIME type format) */
    11011405  const char *options;                  /* DIME options */
     
    11071411#endif
    11081412};
    1109 
     1413#endif
     1414
     1415#ifndef WITH_LEANER
     1416/* attachment DIME and MTOM XOP forwarding */
     1417struct soap_xlist
     1418{ struct soap_xlist *next;
     1419  unsigned char **ptr;
     1420  int *size;
     1421  char *id;
     1422  char **type;
     1423  char **options;
     1424};
     1425#endif
     1426
     1427/******************************************************************************/
     1428
     1429#ifndef WITH_LEANER
     1430#ifdef __cplusplus
     1431class soap_dom_attribute_iterator
     1432{ public:
     1433  struct soap_dom_attribute *att;
     1434  const char *nstr;
     1435  const char *name;
     1436  bool operator==(const soap_dom_attribute_iterator&) const;
     1437  bool operator!=(const soap_dom_attribute_iterator&) const;
     1438  struct soap_dom_attribute &operator*() const;
     1439  soap_dom_attribute_iterator &operator++();
     1440  soap_dom_attribute_iterator();
     1441  soap_dom_attribute_iterator(struct soap_dom_attribute*);
     1442  ~soap_dom_attribute_iterator();
     1443};
     1444#endif
     1445#endif
     1446
     1447#ifndef WITH_LEANER
    11101448struct soap_dom_attribute
    11111449{ struct soap_dom_attribute *next;
     
    11161454  struct soap *soap;
    11171455#ifdef __cplusplus
    1118   struct soap_dom_attribute &set(const char *nstr, const char *name);   // set namespace and name
    1119   struct soap_dom_attribute &set(const char *data);             // set data
     1456  typedef soap_dom_attribute_iterator iterator;
     1457  struct soap_dom_attribute &set(const char *nstr, const char *name);   /* set namespace and name */
     1458  struct soap_dom_attribute &set(const char *data);             /* set data */
     1459  soap_dom_attribute_iterator begin();
     1460  soap_dom_attribute_iterator end();
     1461  soap_dom_attribute_iterator find(const char *nstr, const char *name);
    11201462  void unlink();
    11211463  soap_dom_attribute();
     
    11251467#endif
    11261468};
    1127 
     1469#endif
     1470
     1471#ifndef WITH_LEANER
    11281472#ifdef __cplusplus
    1129 class soap_dom_iterator
     1473class soap_dom_element_iterator
    11301474{ public:
    11311475  struct soap_dom_element *elt;
     
    11331477  const char *name;
    11341478  int type;
    1135   bool operator==(const soap_dom_iterator&) const;
    1136   bool operator!=(const soap_dom_iterator&) const;
     1479  bool operator==(const soap_dom_element_iterator&) const;
     1480  bool operator!=(const soap_dom_element_iterator&) const;
    11371481  struct soap_dom_element &operator*() const;
    1138   soap_dom_iterator &operator++();
    1139   soap_dom_iterator();
    1140   soap_dom_iterator(struct soap_dom_element*);
    1141   ~soap_dom_iterator();
    1142 };
    1143 #endif
    1144 
     1482  soap_dom_element_iterator &operator++();
     1483  soap_dom_element_iterator();
     1484  soap_dom_element_iterator(struct soap_dom_element*);
     1485  ~soap_dom_element_iterator();
     1486};
     1487#endif
     1488#endif
     1489
     1490#ifndef WITH_LEANER
    11451491struct soap_dom_element
    11461492{ struct soap_dom_element *next;        /* next sibling */
    11471493  struct soap_dom_element *prnt;        /* parent */
    1148   struct soap_dom_element *elts;        /* first child element */
    1149   struct soap_dom_attribute *atts;      /* first child attribute */
     1494  struct soap_dom_element *elts;        /* list of child elements */
     1495  struct soap_dom_attribute *atts;      /* list of attributes */
    11501496  const char *nstr;                     /* namespace string */
    11511497  char *name;                           /* element tag name */
     
    11541500  int type;                             /* optional: serialized C/C++ data type */
    11551501  void *node;                           /* optional: pointer to serialized C/C++ data */
    1156   struct soap *soap;
     1502  char *head;                           /* leading whitespace to start tag */
     1503  char *tail;                           /* leading whitespace to end tag */
     1504  struct soap *soap;                    /* soap context that manages this node */
    11571505#ifdef __cplusplus
    1158   typedef soap_dom_iterator iterator;
     1506  typedef soap_dom_element_iterator iterator;
    11591507  struct soap_dom_element &set(const char *nstr, const char *name);
    11601508  struct soap_dom_element &set(const char *data);
     
    11641512  struct soap_dom_element &add(struct soap_dom_attribute*);
    11651513  struct soap_dom_element &add(struct soap_dom_attribute&);
    1166   soap_dom_iterator begin();
    1167   soap_dom_iterator end();
    1168   soap_dom_iterator find(const char *nstr, const char *name);
    1169   soap_dom_iterator find(int type);
     1514  soap_dom_element_iterator begin();
     1515  soap_dom_element_iterator end();
     1516  soap_dom_element_iterator find(const char *nstr, const char *name);
     1517  soap_dom_element_iterator find(int type);
    11701518  void unlink();
    11711519  soap_dom_element();
     
    11771525#endif
    11781526};
     1527SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_next_element(struct soap_dom_element *elt);
     1528SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dom_next_attribute(struct soap_dom_attribute *att);
     1529#endif
    11791530
    11801531#if defined(__cplusplus) && !defined(WITH_LEAN)
    11811532}
    1182 extern ostream &operator<<(ostream&, const struct soap_dom_element&);
    1183 extern istream &operator>>(istream&, struct soap_dom_element&);
     1533extern std::ostream &operator<<(std::ostream&, const struct soap_dom_element&);
     1534extern std::istream &operator>>(std::istream&, struct soap_dom_element&);
    11841535extern "C" {
    11851536#endif
    11861537
    1187 struct soap
    1188 { short version;                /* 1 = SOAP1.1 and 2 = SOAP1.2 (set automatically from namespace URI in nsmap table) */
    1189   short copy;                   /* 1 = copy of another soap struct */
     1538/******************************************************************************/
     1539
     1540#ifdef WIN32
     1541# ifdef SOAP_STD_EXPORTS
     1542#  define SOAP_STD_API __declspec(dllexport)
     1543# else
     1544#  define SOAP_STD_API
     1545# endif
     1546#else
     1547# define SOAP_STD_API
     1548#endif
     1549
     1550struct SOAP_STD_API soap
     1551{ short state;                  /* 0 = uninitialized, 1 = initialized, 2 = copy of another soap struct */
     1552  short version;                /* 1 = SOAP1.1 and 2 = SOAP1.2 (set automatically from namespace URI in nsmap table) */
    11901553  soap_mode mode;
    11911554  soap_mode imode;
    11921555  soap_mode omode;
    1193   const char *float_format;     /* points to user-definable format string for floats (<1024 chars) */
    1194   const char *double_format;    /* points to user-definable format string for doubles (<1024 chars) */
    1195   const char *dime_id_format;   /* points to user-definable format string for integer DIME id (<SOAP_TAGLEN chars) */
    1196   const char *http_version;     /* default = "1.0" */
     1556  const char *float_format;     /* user-definable format string for floats (<1024 chars) */
     1557  const char *double_format;    /* user-definable format string for doubles (<1024 chars) */
     1558  const char *dime_id_format;   /* user-definable format string for integer DIME id (<SOAP_TAGLEN chars) */
     1559  const char *http_version;     /* HTTP version used "1.0" or "1.1" */
    11971560  const char *http_content;     /* optional custom response content type (with SOAP_FILE) */
    11981561  const char *encodingStyle;    /* default = NULL which means that SOAP encoding is used */
    1199   const char *actor;
     1562  const char *actor;            /* SOAP-ENV:actor or role attribute value */
     1563  const char *lang;             /* xml:lang attribute value of SOAP-ENV:Text */
    12001564  int recv_timeout;             /* when > 0, gives socket recv timeout in seconds, < 0 in usec */
    12011565  int send_timeout;             /* when > 0, gives socket send timeout in seconds, < 0 in usec */
     
    12061570  int bind_flags;               /* bind() SOL_SOCKET sockopt flags, e.g. set to SO_REUSEADDR to enable reuse */
    12071571  int accept_flags;             /* accept() SOL_SOCKET sockopt flags */
     1572  unsigned short linger_time;   /* linger time for SO_LINGER option */
    12081573  const struct Namespace *namespaces;   /* Pointer to global namespace mapping table */
    12091574  struct Namespace *local_namespaces;   /* Local namespace mapping table */
     
    12111576  struct soap_blist *blist;     /* block allocation stack */
    12121577  struct soap_clist *clist;     /* class instance allocation list */
    1213   void *alist;                  /* memory allocation list */
     1578  void *alist;                  /* memory allocation (malloc) list */
    12141579  struct soap_ilist *iht[SOAP_IDHASH];
    12151580  struct soap_plist *pht[SOAP_PTRHASH];
     1581  struct soap_pblk *pblk;       /* plist block allocation */
     1582  short pidx;                   /* plist block allocation */
    12161583  struct SOAP_ENV__Header *header;
    12171584  struct SOAP_ENV__Fault *fault;
     1585  int idnum;
    12181586  void *user;                   /* to pass user-defined data */
    12191587  struct soap_plugin *plugins;  /* linked list of plug-in data */
     
    12221590  int (*fpost)(struct soap*, const char*, const char*, int, const char*, const char*, size_t);
    12231591  int (*fget)(struct soap*);
     1592  int (*fput)(struct soap*);
     1593  int (*fdel)(struct soap*);
     1594  int (*fhead)(struct soap*);
     1595  int (*fform)(struct soap*);
    12241596  int (*fposthdr)(struct soap*, const char*, const char*);
    12251597  int (*fresponse)(struct soap*, int, size_t);
    12261598  int (*fparse)(struct soap*);
    12271599  int (*fparsehdr)(struct soap*, const char*, const char*);
     1600  int (*fheader)(struct soap*);
    12281601  int (*fresolve)(struct soap*, const char*, struct in_addr* inaddr);
    12291602  int (*fconnect)(struct soap*, const char*, const char*, int);
     
    12311604  int (*fclosesocket)(struct soap*, SOAP_SOCKET);
    12321605  int (*fshutdownsocket)(struct soap*, SOAP_SOCKET, int);
    1233   int (*fopen)(struct soap*, const char*, const char*, int);
    1234   int (*faccept)(struct soap*, int, struct sockaddr*, int *n);
     1606  SOAP_SOCKET (*fopen)(struct soap*, const char*, const char*, int);
     1607  SOAP_SOCKET (*faccept)(struct soap*, SOAP_SOCKET, struct sockaddr*, int *n);
    12351608  int (*fclose)(struct soap*);
    12361609  int (*fsend)(struct soap*, const char*, size_t);
    12371610  size_t (*frecv)(struct soap*, char*, size_t);
    12381611  int (*fpoll)(struct soap*);
     1612  void (*fseterror)(struct soap*, const char **c, const char **s);
     1613  int (*fignore)(struct soap*, const char*);
     1614  int (*fserveloop)(struct soap*);
     1615  void *(*fplugin)(struct soap*, const char*);
     1616  void *(*fmalloc)(struct soap*, size_t);
     1617#ifndef WITH_LEANER
    12391618  int (*fprepareinit)(struct soap*);
    12401619  int (*fpreparesend)(struct soap*, const char*, size_t);
    12411620  int (*fpreparerecv)(struct soap*, const char*, size_t);
    1242   int (*fignore)(struct soap*, const char*);
    1243   int (*fserveloop)(struct soap*);
    1244   void *(*fplugin)(struct soap*, const char*);
     1621  int (*fpreparefinal)(struct soap*);
    12451622  void *(*fdimereadopen)(struct soap*, void*, const char*, const char*, const char*);
    12461623  void *(*fdimewriteopen)(struct soap*, const char*, const char*, const char*);
     
    12491626  size_t (*fdimeread)(struct soap*, void*, char*, size_t);
    12501627  int (*fdimewrite)(struct soap*, void*, const char*, size_t);
    1251   int master;
    1252   int socket;
     1628  void *(*fmimereadopen)(struct soap*, void*, const char*, const char*, const char*);
     1629  void *(*fmimewriteopen)(struct soap*, void*, const char*, const char*, const char*, enum soap_mime_encoding);
     1630  void (*fmimereadclose)(struct soap*, void*);
     1631  void (*fmimewriteclose)(struct soap*, void*);
     1632  size_t (*fmimeread)(struct soap*, void*, char*, size_t);
     1633  int (*fmimewrite)(struct soap*, void*, const char*, size_t);
     1634#endif
     1635  SOAP_SOCKET master;
     1636  SOAP_SOCKET socket;
    12531637#if defined(__cplusplus) && !defined(WITH_LEAN)
    1254   ostream *os;
    1255   istream *is;
     1638  std::ostream *os;
     1639  std::istream *is;
    12561640#else
    1257   void *os;     /* preserve alignment */
    1258   void *is;     /* preserve alignment */
     1641  void *os;             /* preserve struct size */
     1642  void *is;             /* preserve struct size */
    12591643#endif
    12601644#ifndef UNDER_CE
     
    12641648  FILE *sendfd;
    12651649  FILE *recvfd;
    1266   char errorstr[256];
    1267   wchar_t werrorstr[256];
    1268 #endif
    1269   size_t bufidx;
    1270   size_t buflen;
    1271   soap_wchar ahead;
    1272   short cdata;
    1273   short body;
    1274   unsigned int level;
     1650#endif
     1651  size_t bufidx;        /* index in soap.buf[] */
     1652  size_t buflen;        /* length of soap.buf[] content */
     1653  soap_wchar ahead;     /* parser lookahead */
     1654  short cdata;          /* CDATA parser state */
     1655  short body;           /* parsed XML element has a body or not */
     1656  unsigned int level;   /* XML nesting level */
    12751657  size_t count;         /* message length counter */
    12761658  size_t length;        /* message length as set by HTTP header */
     
    12791661  size_t labidx;        /* look-aside buffer index to available part */
    12801662  char buf[SOAP_BUFLEN];/* send and receive buffer */
    1281   char tmpbuf[1024];    /* output buffer for HTTP headers, simpleType values, attribute names, and DIME >=1024 bytes */
    1282   char msgbuf[1024];    /* output buffer for (error) messages <=1024 bytes */
     1663  char msgbuf[1024];    /* in/out buffer for HTTP/MIME headers >=1024 bytes */
     1664  char tmpbuf[1024];    /* in/out buffer for HTTP/MIME headers, simpleType values, element and attribute tag names, and DIME must be >=1024 bytes */
    12831665  char tag[SOAP_TAGLEN];
    12841666  char id[SOAP_TAGLEN];
     
    12891671  char arrayOffset[SOAP_TAGLEN];
    12901672  short other;
    1291   short root;
    12921673  short position;
    12931674  int positions[SOAP_MAXDIMS];
     1675  short root;
    12941676  struct soap_attribute *attributes;    /* attribute list */
    1295   short encoding;
    1296   short mustUnderstand;
    1297   short null;
    1298   short ns;
    1299   short part;
     1677  short encoding;       /* when set, output encodingStyle */
     1678  short mustUnderstand; /* a mustUnderstand element was parsed or is output */
     1679  short null;           /* parsed XML is xsi:nil */
     1680  short ns;             /* when not set, output full xmlns bindings */
     1681  short part;           /* parsing state */
    13001682  short alloced;
    13011683  short peeked;
    1302   short keep_alive;
    13031684  size_t chunksize;
    13041685  size_t chunkbuflen;
     
    13091690  char *authrealm;              /* HTTP authentication realm */
    13101691  char *prolog;                 /* XML declaration prolog */
    1311   int port;
    1312   unsigned int max_keep_alive;
     1692  unsigned long ip;             /* IP number */
     1693  int port;                     /* port number */
     1694  short keep_alive;             /* connection should be kept open */
     1695  short tcp_keep_alive;         /* enable SO_KEEPALIVE */
     1696  unsigned int tcp_keep_idle;   /* set TCP_KEEPIDLE */
     1697  unsigned int tcp_keep_intvl;  /* set TCP_KEEPINTVL */
     1698  unsigned int tcp_keep_cnt;    /* set TCP_KEEPCNT */
     1699  unsigned int max_keep_alive;  /* maximum keep-alive session (default=100) */
     1700  const char *proxy_http_version;/* HTTP version of proxy "1.0" or "1.1" */
    13131701  const char *proxy_host;       /* Proxy Server host name */
    13141702  int proxy_port;               /* Proxy Server port (default = 8080) */
    13151703  const char *proxy_userid;     /* Proxy Authorization user name */
    13161704  const char *proxy_passwd;     /* Proxy Authorization password */
     1705  const char *proxy_from;       /* X-Forwarding-For header returned by proxy */
    13171706  int status;                   /* -1 when request, else error code to be returned by server */
    13181707  int error;
    13191708  int errmode;
    13201709  int errnum;
    1321   unsigned long idnum;
    1322   unsigned long ip;
     1710#ifndef WITH_LEANER
     1711  struct soap_dom_element *dom;
    13231712  struct soap_dime dime;
    13241713  struct soap_mime mime;
    1325   struct soap_dom_element *dom;
     1714  struct soap_xlist *xlist;
     1715#endif
    13261716#if !defined(WITH_LEAN) || defined(SOAP_DEBUG)
    13271717  const char *logfile[SOAP_MAXLOGS];
    13281718  FILE *fdebug[SOAP_MAXLOGS];
     1719  struct soap_mlist *mht[SOAP_PTRHASH];
    13291720#endif
    13301721#ifndef WITH_LEAN
     1722  const char *c14ninclude;
     1723  const char *c14nexclude;
    13311724  struct soap_cookie *cookies;
    13321725  const char *cookie_domain;
     
    13341727  int cookie_max;
    13351728#endif
     1729#ifndef WITH_NOIO
     1730  int ipv6_multicast_if; /* always include this to keep the soap struct size the same in v4 and v6 */
     1731  char* ipv4_multicast_if; /* always include this to keep the soap struct size the same in v4 and v6 */
     1732  int ipv4_multicast_ttl; /* multicast scope */
     1733#ifdef WITH_IPV6
     1734  struct sockaddr_storage peer; /* IPv6: set by soap_accept and by UDP recv */
     1735#else
     1736  struct sockaddr_in peer;      /* IPv4: set by soap_connect/soap_accept and by UDP recv */
     1737#endif
     1738#endif
     1739  size_t peerlen;
    13361740#ifdef WITH_OPENSSL
    13371741  int (*fsslauth)(struct soap*);
     
    13401744  SSL *ssl;
    13411745  SSL_CTX *ctx;
    1342   short require_server_auth;
    1343   short require_client_auth;
    1344   short rsa;                    /* when set, use RSA instead of DH */
     1746  SSL_SESSION *session;
     1747#else
     1748  void *fsslauth;               /* dummy members, to preserve struct size */
     1749  void *fsslverify;
     1750  void *bio;
     1751  void *ssl;
     1752  void *ctx;
     1753  void *session;
     1754#endif
     1755  unsigned short ssl_flags;
    13451756  const char *keyfile;
    13461757  const char *password;
     
    13481759  const char *cafile;
    13491760  const char *capath;
     1761  const char *crlfile;
    13501762  const char *randfile;
    1351   SSL_SESSION *session;
    13521763  char session_host[SOAP_TAGLEN];
    13531764  int session_port;
     1765#ifdef WITH_C_LOCALE
     1766  locale_t c_locale;            /* set to C locale by default */
     1767#else
     1768  void *c_locale;
    13541769#endif
    13551770#ifdef WITH_ZLIB
     1771  z_stream *d_stream;           /* decompression stream */
     1772  uLong z_crc;                  /* internal gzip crc */
     1773#else
     1774  void *d_stream;               /* dummy members, to preserve struct size */
     1775  soap_int32 z_crc;
     1776#endif
    13561777  short zlib_state;             /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_INFLATE */
    13571778  short zlib_in;                /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_GZIP */
    13581779  short zlib_out;               /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_GZIP */
    1359   z_stream d_stream;            /* decompression stream */
    1360   char z_buf[SOAP_BUFLEN];      /* buffer */
     1780  char *z_buf;                  /* buffer */
    13611781  size_t z_buflen;
    13621782  unsigned short z_level;       /* compression level to be used (0=none, 1=fast to 9=best) */
    1363   uLong z_crc;                  /* internal gzip crc */
    13641783  float z_ratio_in;             /* detected compression ratio compressed_length/length of inbound message */
    13651784  float z_ratio_out;            /* detected compression ratio compressed_length/length of outbound message */
    1366 #endif
    1367 /* WR[ */
    13681785#ifdef WMW_RPM_IO
    13691786  void *rpmreqid;
    1370 #endif /* WMW_RPM_IO */
    1371 /* ]WR */
     1787#endif
     1788#ifdef __cplusplus
     1789  soap();
     1790  soap(soap_mode);
     1791  soap(soap_mode, soap_mode);
     1792  soap(struct soap&);
     1793  virtual ~soap();
     1794#else
     1795  void (*dummy)();
     1796#endif
    13721797};
    13731798
     
    13831808  void *ptr;
    13841809  unsigned int level;
    1385   void (*fcopy)(struct soap*, int, int, void*, const void*, size_t);
     1810  size_t len;
     1811  void (*fcopy)(struct soap*, int, int, void*, size_t, const void*, size_t);
    13861812};
    13871813
     
    14111837#endif
    14121838
     1839#ifndef WITH_LEAN
     1840# define soap_get0(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx])
     1841# define soap_get1(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx++])
     1842#else
     1843soap_wchar soap_get0(struct soap*);
     1844soap_wchar soap_get1(struct soap*);
     1845#endif
     1846
     1847#define soap_revget1(soap) ((soap)->bufidx--)
     1848#define soap_unget(soap, c) ((soap)->ahead = c)
     1849#define soap_register_plugin(soap, plugin) soap_register_plugin_arg(soap, plugin, NULL)
     1850#define soap_imode(soap, n) ((soap)->mode = (soap)->imode = (n))
     1851#define soap_set_imode(soap, n) ((soap)->imode |= (n))
     1852#define soap_clr_imode(soap, n) ((soap)->imode &= ~(n))
     1853#define soap_omode(soap, n) ((soap)->mode = (soap)->omode = (n))
     1854#define soap_set_omode(soap, n) ((soap)->omode |= (n))
     1855#define soap_clr_omode(soap, n) ((soap)->omode &= ~(n))
     1856#define soap_set_mode(soap, n) ((soap)->imode |= (n), (soap)->omode |= (n))
     1857#define soap_clr_mode(soap, n) ((soap)->imode &= ~(n), (soap)->omode &= ~(n))
     1858#define soap_destroy(soap) soap_delete((soap), NULL)
     1859
    14131860#ifdef HAVE_STRRCHR
    14141861# define soap_strrchr(s, t) strrchr(s, t)
     
    14291876#endif
    14301877
     1878#if defined(WITH_OPENSSL)
     1879# define soap_random soap_rand()
     1880SOAP_FMAC1 int SOAP_FMAC2 soap_rand(void);
     1881#elif defined(HAVE_RANDOM)
     1882# define soap_random (int)random()
     1883#else
     1884# define soap_random rand()
     1885#endif
     1886
     1887#ifdef WITH_NOIDREF
     1888# define soap_embedded(s, p, t) (0)
     1889# define soap_id_lookup(s, i, p, t, n, k) (p)
     1890# define soap_id_forward(s, h, p, len, st, tt, n, k, fc) (p)
     1891# define soap_reference(s, a, t) (1)
     1892# define soap_array_reference(s, p, a, n, t) (1)
     1893# define soap_embed(s, p, a, n, t, pp) (0)
     1894# define soap_embedded_id(s, i, p, t) (i)
     1895# define soap_is_embedded(s, p) (0)
     1896# define soap_is_single(s, p) (1)
     1897# define soap_lookup_type(s, i) (0)
     1898# define soap_getindependent(s) (0)
     1899# define soap_putindependent(s) (0)
     1900# define soap_getelement(s, n) (n)
     1901# define soap_putelement(s, p, t, i, n) (0)
     1902# define soap_markelement(s, p, n) (0)
     1903#endif
     1904
     1905SOAP_FMAC1 void SOAP_FMAC2 soap_header(struct soap*);
    14311906SOAP_FMAC1 void SOAP_FMAC2 soap_fault(struct soap*);
    14321907SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultcode(struct soap*);
     1908SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultsubcode(struct soap*);
    14331909SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultstring(struct soap*);
    14341910SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultdetail(struct soap*);
     
    14401916SOAP_FMAC1 int SOAP_FMAC2 soap_getfault(struct soap*);
    14411917
     1918SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_init();
    14421919SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap*);
    14431920SOAP_FMAC1 int SOAP_FMAC2 soap_connect_command(struct soap*, int, const char*, const char*);
    14441921SOAP_FMAC1 int SOAP_FMAC2 soap_connect(struct soap*, const char*, const char*);
    1445 SOAP_FMAC1 int SOAP_FMAC2 soap_bind(struct soap*, const char*, int, int);
    1446 SOAP_FMAC1 int SOAP_FMAC2 soap_accept(struct soap*);
     1922SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_bind(struct soap*, const char*, int, int);
     1923SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_accept(struct soap*);
    14471924SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_accept(struct soap*);
     1925SOAP_FMAC1 const char * SOAP_FMAC2 soap_ssl_error(struct soap*, int);
    14481926
    14491927SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_server_context(struct soap*, unsigned short, const char*, const char*, const char*, const char*, const char*, const char*, const char*);
     
    14651943SOAP_FMAC1 void SOAP_FMAC2 soap_set_fault(struct soap*);
    14661944SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault(struct soap*, const char*, const char*);
     1945SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault_subcode(struct soap*, const char*, const char*, const char*);
    14671946SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault(struct soap*, const char*, const char*);
     1947SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault_subcode(struct soap*, const char*, const char*, const char*);
    14681948SOAP_FMAC1 int SOAP_FMAC2 soap_set_sender_error(struct soap*, const char*, const char*, int);
    14691949SOAP_FMAC1 int SOAP_FMAC2 soap_set_receiver_error(struct soap*, const char*, const char*, int);
     
    14841964SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_gethex(struct soap*, int*);
    14851965
    1486 
    1487 SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_lookup(struct soap*, const char*);
    1488 SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_enter(struct soap*, const char*);
    1489 SOAP_FMAC1 int SOAP_FMAC2 soap_resolve(struct soap*);
    1490 
     1966#ifndef WITH_LEANER
     1967SOAP_FMAC1 int SOAP_FMAC2 soap_xop_forward(struct soap*, unsigned char**, int*, char**, char**, char**);
     1968SOAP_FMAC1 int SOAP_FMAC2 soap_dime_forward(struct soap*, unsigned char**, int*, char**, char**, char**);
     1969#endif
     1970
     1971#ifndef WITH_NOIDREF
    14911972SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup_id(struct soap*, void *p, int t, struct soap_plist**);
    14921973SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup(struct soap*, const void *p, int t, struct soap_plist**);
    14931974SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_enter(struct soap*, const void *p, const struct soap_array *a, int n, int t, struct soap_plist**);
    14941975SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap*, const void *p, const struct soap_array *a, int n, int t, struct soap_plist**);
    1495 
    14961976SOAP_FMAC1 int SOAP_FMAC2 soap_embed(struct soap *soap, const void *p, const struct soap_array *a, int n, const char *tag, int type);
    1497 
    1498 SOAP_FMAC1 void SOAP_FMAC2 soap_begin_count(struct soap*);
    1499 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_send(struct soap*);
    1500 SOAP_FMAC1 int SOAP_FMAC2 soap_end_send(struct soap*);
    1501 
     1977SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_lookup(struct soap*, const char*);
     1978SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_enter(struct soap*, const char*);
     1979SOAP_FMAC1 int SOAP_FMAC2 soap_resolve(struct soap*);
    15021980SOAP_FMAC1 void SOAP_FMAC2 soap_embedded(struct soap*, const void *p, int t);
    15031981SOAP_FMAC1 int SOAP_FMAC2 soap_reference(struct soap*, const void *p, int t);
     
    15071985SOAP_FMAC1 int SOAP_FMAC2 soap_is_single(struct soap*, struct soap_plist*);
    15081986SOAP_FMAC1 void SOAP_FMAC2 soap_set_embedded(struct soap*, struct soap_plist*);
    1509 
    1510 SOAP_FMAC1 const struct soap_code_map* SOAP_FMAC2 soap_code(const struct soap_code_map*, const char *str);
    1511 SOAP_FMAC1 long SOAP_FMAC2 soap_int_code(const struct soap_code_map*, const char *str, long other);
    1512 SOAP_FMAC1 const char* SOAP_FMAC2 soap_str_code(const struct soap_code_map*, long code);
     1987#endif
     1988
     1989SOAP_FMAC1 int SOAP_FMAC2 soap_begin_count(struct soap*);
     1990SOAP_FMAC1 int SOAP_FMAC2 soap_end_count(struct soap*);
     1991SOAP_FMAC1 int SOAP_FMAC2 soap_begin_send(struct soap*);
     1992SOAP_FMAC1 int SOAP_FMAC2 soap_end_send(struct soap*);
     1993
     1994SOAP_FMAC1 const struct soap_code_map* SOAP_FMAC2 soap_code(const struct soap_code_map*, const char*);
     1995SOAP_FMAC1 long SOAP_FMAC2 soap_code_int(const struct soap_code_map*, const char*, long);
     1996SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_str(const struct soap_code_map*, long);
     1997SOAP_FMAC1 long SOAP_FMAC2 soap_code_bits(const struct soap_code_map*, const char*);
     1998SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_list(struct soap*, const struct soap_code_map*, long);
    15131999
    15142000SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap*, char*, int);
     
    15182004SOAP_FMAC1 void* SOAP_FMAC2 soap_malloc(struct soap*, size_t);
    15192005SOAP_FMAC1 void SOAP_FMAC2 soap_dealloc(struct soap*, void*);
    1520 SOAP_FMAC1 struct soap_clist * SOAP_FMAC2 soap_link(struct soap*, void*, int, int, void (*fdelete)(struct soap_clist*));
     2006SOAP_FMAC1 struct soap_clist * SOAP_FMAC2 soap_link(struct soap*, void*, int, int, int (*fdelete)(struct soap_clist*));
    15212007SOAP_FMAC1 void SOAP_FMAC2 soap_unlink(struct soap*, const void*);
    1522 SOAP_FMAC1 void SOAP_FMAC2 soap_free(struct soap*);
    1523 
     2008SOAP_FMAC1 void SOAP_FMAC2 soap_free_temp(struct soap*);
     2009SOAP_FMAC1 void SOAP_FMAC2 soap_del(struct soap*);
     2010
     2011SOAP_FMAC1 void* SOAP_FMAC2 soap_track_malloc(struct soap*, const char*, int, size_t);
     2012SOAP_FMAC1 void SOAP_FMAC2 soap_track_free(struct soap*, const char*, int, void*);
     2013
     2014#ifndef WITH_NOIDREF
    15242015SOAP_FMAC1 int SOAP_FMAC2 soap_lookup_type(struct soap*, const char *id);
    1525 
    15262016SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap*, const char *id, void **p, int t, size_t n, unsigned int k);
    1527 SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap*, const char *id, void *p, int st, int tt, size_t n, unsigned int k, void(*fcopy)(struct soap*, int, int, void*, const void*, size_t));
     2017SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap*, const char *id, void *p, size_t len, int st, int tt, size_t n, unsigned int k, void(*fcopy)(struct soap*, int, int, void*, size_t, const void*, size_t));
     2018#endif
    15282019SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct soap*, const char *id, void *p, int t, size_t n, unsigned int k, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*));
    1529 SOAP_FMAC1 void SOAP_FMAC2 soap_fcopy(struct soap *soap, int st, int tt, void *p, const void *q, size_t n);
     2020SOAP_FMAC1 void SOAP_FMAC2 soap_fcopy(struct soap *soap, int st, int tt, void *p, size_t, const void *q, size_t n);
    15302021
    15312022SOAP_FMAC1 int SOAP_FMAC2 soap_size(const int *, int);
     
    15442035
    15452036SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_new(void);
    1546 SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_new1(int);
    1547 SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_new2(int, int);
    1548 SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy(struct soap*);
    1549 SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy_context(struct soap*,struct soap*);
     2037SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_new1(soap_mode);
     2038SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_new2(soap_mode, soap_mode);
     2039SOAP_FMAC1 void SOAP_FMAC2 soap_free(struct soap*);
     2040SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy(const struct soap*);
     2041SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy_context(struct soap*, const struct soap*);
     2042SOAP_FMAC1 void SOAP_FMAC2 soap_copy_stream(struct soap*, struct soap*);
    15502043SOAP_FMAC1 void SOAP_FMAC2 soap_init(struct soap*);
    1551 SOAP_FMAC1 void SOAP_FMAC2 soap_init1(struct soap*, int);
    1552 SOAP_FMAC1 void SOAP_FMAC2 soap_init2(struct soap*, int, int);
     2044SOAP_FMAC1 void SOAP_FMAC2 soap_init1(struct soap*, soap_mode);
     2045SOAP_FMAC1 void SOAP_FMAC2 soap_init2(struct soap*, soap_mode, soap_mode);
    15532046SOAP_FMAC1 void SOAP_FMAC2 soap_done(struct soap*);
    15542047SOAP_FMAC1 void SOAP_FMAC2 soap_cleanup(struct soap*);
     
    15662059
    15672060SOAP_FMAC1 const char* SOAP_FMAC2 soap_value(struct soap*);
    1568 
    1569 SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_advance(struct soap*);
    1570 SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_skip(struct soap*);
    15712061
    15722062SOAP_FMAC1 int SOAP_FMAC2 soap_match_tag(struct soap*, const char*, const char *);
     
    15812071SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap*, const char *tag, int id, const void *p, const struct soap_array *a, int d, const char *type, int n);
    15822072SOAP_FMAC1 int SOAP_FMAC2 soap_element_result(struct soap*, const char *tag);
     2073SOAP_FMAC1 void SOAP_FMAC2 soap_check_result(struct soap*, const char *tag);
    15832074SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_out(struct soap*, const char *tag);
    15842075SOAP_FMAC1 int SOAP_FMAC2 soap_element_start_end_out(struct soap*, const char *tag);
     
    15862077SOAP_FMAC1 int SOAP_FMAC2 soap_attribute(struct soap*, const char*, const char*);
    15872078
    1588 SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_in(struct soap*, const char *tag, int nillable);
     2079SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_in(struct soap*, const char *tag, int nillable, const char *type);
    15892080
    15902081SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_in(struct soap*, const char *tag);
     
    15962087
    15972088SOAP_FMAC1 char* SOAP_FMAC2 soap_strdup(struct soap*, const char*);
     2089SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstrdup(struct soap*, const wchar_t*);
     2090SOAP_FMAC1 const char * SOAP_FMAC2 soap_strsearch(const char *big, const char *little);
    15982091
    15992092SOAP_FMAC1 int SOAP_FMAC2 soap_string_out(struct soap*, const char *s, int flag);
    16002093SOAP_FMAC1 char* SOAP_FMAC2 soap_string_in(struct soap*, int, long, long);
     2094
     2095#ifndef WITH_LEANER
    16012096SOAP_FMAC1 int SOAP_FMAC2 soap_wstring_out(struct soap*, const wchar_t *s, int flag);
    16022097SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstring_in(struct soap*, int, long, long);
    1603 
    1604 SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap*, const char *, const char*, int n1, int n2);
    1605 
    1606 SOAP_FMAC1 int SOAP_FMAC2 soap_set_namespaces(struct soap*, struct Namespace*);
     2098#endif
     2099
     2100SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap*, const char *, const char*, size_t n1, size_t n2);
     2101
     2102SOAP_FMAC1 int SOAP_FMAC2 soap_set_namespaces(struct soap*, const struct Namespace*);
     2103SOAP_FMAC1 void SOAP_FMAC2 soap_set_local_namespaces(struct soap*);
    16072104
    16082105SOAP_FMAC1 void SOAP_FMAC2 soap_pop_namespace(struct soap*);
    16092106SOAP_FMAC1 int SOAP_FMAC2 soap_push_namespace(struct soap*, const char *,const char *);
    1610 
    1611 SOAP_FMAC1 int SOAP_FMAC2 soap_new_block(struct soap*);
    1612 SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap*, size_t);
    1613 SOAP_FMAC1 void SOAP_FMAC2 soap_pop_block(struct soap*);
    1614 SOAP_FMAC1 size_t SOAP_FMAC2 soap_size_block(struct soap*, size_t);
    1615 SOAP_FMAC1 char* SOAP_FMAC2 soap_first_block(struct soap*);
    1616 SOAP_FMAC1 char* SOAP_FMAC2 soap_next_block(struct soap*);
    1617 SOAP_FMAC1 size_t SOAP_FMAC2 soap_block_size(struct soap*);
    1618 SOAP_FMAC1 char* SOAP_FMAC2 soap_save_block(struct soap*, char*, int);
    1619 SOAP_FMAC1 void SOAP_FMAC2 soap_end_block(struct soap*);
     2107SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace(struct soap *soap, const char *tag);
     2108
     2109SOAP_FMAC1 struct soap_nlist* SOAP_FMAC2 soap_lookup_ns(struct soap *soap, const char *tag, size_t n);
     2110
     2111SOAP_FMAC1 int SOAP_FMAC2 soap_store_lab(struct soap*, const char*, size_t);
     2112SOAP_FMAC1 int SOAP_FMAC2 soap_append_lab(struct soap*, const char*, size_t);
     2113
     2114SOAP_FMAC1 struct soap_blist* SOAP_FMAC2 soap_new_block(struct soap*);
     2115SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap*, struct soap_blist*, size_t);
     2116SOAP_FMAC1 void SOAP_FMAC2 soap_pop_block(struct soap*, struct soap_blist*);
     2117SOAP_FMAC1 size_t SOAP_FMAC2 soap_size_block(struct soap*, struct soap_blist*, size_t);
     2118SOAP_FMAC1 char* SOAP_FMAC2 soap_first_block(struct soap*, struct soap_blist*);
     2119SOAP_FMAC1 char* SOAP_FMAC2 soap_next_block(struct soap*, struct soap_blist*);
     2120SOAP_FMAC1 size_t SOAP_FMAC2 soap_block_size(struct soap*, struct soap_blist*);
     2121SOAP_FMAC1 char* SOAP_FMAC2 soap_save_block(struct soap*, struct soap_blist*, char*, int);
     2122SOAP_FMAC1 void SOAP_FMAC2 soap_end_block(struct soap*, struct soap_blist*);
    16202123
    16212124SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap*);
     
    16352138SOAP_FMAC1 int SOAP_FMAC2 soap_response(struct soap*, int);
    16362139
     2140SOAP_FMAC1 int SOAP_FMAC2 soap_send_empty_response(struct soap*, int status);
     2141SOAP_FMAC1 int SOAP_FMAC2 soap_recv_empty_response(struct soap*);
     2142
    16372143SOAP_FMAC1 int SOAP_FMAC2 soap_send_fault(struct soap*);
    1638 
    16392144SOAP_FMAC1 int SOAP_FMAC2 soap_recv_fault(struct soap*);
    16402145
     2146#ifndef WITH_NOSTDLIB
    16412147SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault(struct soap*, FILE*);
    16422148SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault_location(struct soap*, FILE*);
     2149# ifndef WITH_LEAN
     2150#  ifdef __cplusplus
     2151SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault(struct soap*, std::ostream&);
     2152#  endif
     2153SOAP_FMAC1 char* SOAP_FMAC2 soap_sprint_fault(struct soap*, char*, size_t);
     2154# endif
     2155#endif
    16432156
    16442157SOAP_FMAC1 int SOAP_FMAC2 soap_s2byte(struct soap*, const char*, char*);
     
    16542167SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedLong(struct soap*, const char*, unsigned long*);
    16552168SOAP_FMAC1 int SOAP_FMAC2 soap_s2ULONG64(struct soap*, const char*, ULONG64*);
    1656 SOAP_FMAC1 int SOAP_FMAC2 soap_s2dateTime(struct soap*, const char*, time_t*);
    16572169SOAP_FMAC1 int SOAP_FMAC2 soap_s2string(struct soap*, const char*, char**);
    16582170SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap*, const char*, char**);
    16592171
    1660 SOAP_FMAC1 char* SOAP_FMAC2 soap_s2base64(struct soap*, const unsigned char*, char*, size_t);
     2172#ifndef WITH_LEAN
     2173SOAP_FMAC1 int SOAP_FMAC2 soap_s2wchar(struct soap*, const char*, wchar_t**);
     2174SOAP_FMAC1 int SOAP_FMAC2 soap_s2dateTime(struct soap*, const char*, time_t*);
     2175SOAP_FMAC1 char* SOAP_FMAC2 soap_s2base64(struct soap*, const unsigned char*, char*, int);
     2176SOAP_FMAC1 char* SOAP_FMAC2 soap_s2hex(struct soap*, const unsigned char*, char*, int);
     2177#endif
    16612178
    16622179SOAP_FMAC1 const char* SOAP_FMAC2 soap_byte2s(struct soap*, char);
     
    16722189SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedLong2s(struct soap*, unsigned long);
    16732190SOAP_FMAC1 const char* SOAP_FMAC2 soap_ULONG642s(struct soap*, ULONG64);
     2191SOAP_FMAC1 const char* SOAP_FMAC2 soap_QName2s(struct soap*, const char*);
     2192
     2193#ifndef WITH_LEAN
     2194SOAP_FMAC1 const char* SOAP_FMAC2 soap_wchar2s(struct soap*, const wchar_t*);
    16742195SOAP_FMAC1 const char* SOAP_FMAC2 soap_dateTime2s(struct soap*, time_t);
    1675 SOAP_FMAC1 const char* SOAP_FMAC2 soap_QName2s(struct soap*, const char*);
    1676 
    1677 SOAP_FMAC1 const char* SOAP_FMAC2 soap_base642s(struct soap*, const char*, char*, size_t, size_t*);
     2196SOAP_FMAC1 const char* SOAP_FMAC2 soap_base642s(struct soap*, const char*, char*, size_t, int*);
     2197SOAP_FMAC1 const char* SOAP_FMAC2 soap_hex2s(struct soap*, const char*, char*, size_t, int*);
     2198#endif
     2199
    16782200
    16792201SOAP_FMAC1 int* SOAP_FMAC2 soap_inint(struct soap*, const char *tag, int *p, const char *, int);
     
    16892211SOAP_FMAC1 unsigned long* SOAP_FMAC2 soap_inunsignedLong(struct soap*, const char *tag, unsigned long *p, const char *, int);
    16902212SOAP_FMAC1 ULONG64* SOAP_FMAC2 soap_inULONG64(struct soap*, const char *tag, ULONG64 *p, const char *, int);
     2213SOAP_FMAC1 char** SOAP_FMAC2 soap_instring(struct soap*, const char *tag, char **p, const char *, int, int, long, long);
     2214SOAP_FMAC1 char** SOAP_FMAC2 soap_inliteral(struct soap*, const char *tag, char **p);
     2215
     2216#ifndef WITH_LEAN
    16912217SOAP_FMAC1 time_t* SOAP_FMAC2 soap_indateTime(struct soap*, const char *tag, time_t *p, const char *, int);
    1692 SOAP_FMAC1 char** SOAP_FMAC2 soap_instring(struct soap*, const char *tag, char **p, const char *, int, int, long, long);
     2218SOAP_FMAC1 time_t SOAP_FMAC2 soap_timegm(struct tm*);
     2219#endif
     2220
     2221#ifndef WITH_LEANER
    16932222SOAP_FMAC1 wchar_t** SOAP_FMAC2 soap_inwstring(struct soap*, const char *tag, wchar_t **p, const char *, int, long, long);
    1694 SOAP_FMAC1 char** SOAP_FMAC2 soap_inliteral(struct soap*, const char *tag, char **p);
    16952223SOAP_FMAC1 wchar_t** SOAP_FMAC2 soap_inwliteral(struct soap*, const char *tag, wchar_t **p);
     2224#endif
    16962225
    16972226SOAP_FMAC1 int SOAP_FMAC2 soap_outbyte(struct soap*, const char *tag, int id, const char *p, const char *, int);
     
    17072236SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedLong(struct soap*, const char *tag, int id, const unsigned long *p, const char *, int);
    17082237SOAP_FMAC1 int SOAP_FMAC2 soap_outULONG64(struct soap*, const char *tag, int id, const ULONG64 *p, const char *, int);
     2238SOAP_FMAC1 int SOAP_FMAC2 soap_outstring(struct soap*, const char *tag, int id, char *const*p, const char *, int);
     2239SOAP_FMAC1 int SOAP_FMAC2 soap_outliteral(struct soap*, const char *tag, char *const*p, const char *type);
     2240
     2241#ifndef WITH_LEAN
    17092242SOAP_FMAC1 int SOAP_FMAC2 soap_outdateTime(struct soap*, const char *tag, int id, const time_t *p, const char *, int);
    1710 SOAP_FMAC1 int SOAP_FMAC2 soap_outstring(struct soap*, const char *tag, int id, char *const*p, const char *, int);
     2243#endif
     2244
     2245#ifndef WITH_LEANER
    17112246SOAP_FMAC1 int SOAP_FMAC2 soap_outwstring(struct soap*, const char *tag, int id, wchar_t *const*p, const char *, int);
    1712 SOAP_FMAC1 int SOAP_FMAC2 soap_outliteral(struct soap*, const char *tag, char *const*p);
    1713 SOAP_FMAC1 int SOAP_FMAC2 soap_outwliteral(struct soap*, const char *tag, wchar_t *const*p);
     2247SOAP_FMAC1 int SOAP_FMAC2 soap_outwliteral(struct soap*, const char *tag, wchar_t *const*p, const char *type);
     2248#endif
    17142249
    17152250#ifndef WITH_LEANER
    1716 SOAP_FMAC1 int SOAP_FMAC2 soap_element_dime(struct soap *, const char*, int, const void*, const struct soap_array*, const char*, const char*, const char*, int, const char*, int);
     2251SOAP_FMAC1 int SOAP_FMAC2 soap_attachment(struct soap *, const char*, int, const void*, const struct soap_array*, const char*, const char*, const char*, int, const char*, int);
    17172252SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap*, long);
    17182253SOAP_FMAC1 size_t SOAP_FMAC2 soap_tell(struct soap*);
     
    17322267SOAP_FMAC1 int SOAP_FMAC2 soap_set_dime_attachment(struct soap*, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option);
    17332268SOAP_FMAC1 int SOAP_FMAC2 soap_set_mime_attachment(struct soap*, char *ptr, size_t size, enum soap_mime_encoding encoding, const char *type, const char *id, const char *location, const char *description);
     2269SOAP_FMAC1 void SOAP_FMAC2 soap_post_check_mime_attachments(struct soap *soap);
     2270SOAP_FMAC1 int SOAP_FMAC2 soap_check_mime_attachments(struct soap *soap);
     2271SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_get_mime_attachment(struct soap *soap, void *handle);
    17342272SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart*);
     2273SOAP_FMAC1 int SOAP_FMAC2 soap_match_cid(struct soap*, const char*, const char*);
    17352274#endif
    17362275
     
    17432282
    17442283#ifdef WITH_COOKIES
     2284SOAP_FMAC1 void SOAP_FMAC2 soap_getcookies(struct soap *soap, const char *val);
    17452285SOAP_FMAC1 size_t SOAP_FMAC2 soap_encode_cookie(const char*, char*, size_t);
    17462286SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_set_cookie(struct soap*, const char*, const char*, const char*, const char*);
    17472287SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap*, const char*, const char*, const char*);
    17482288SOAP_FMAC1 extern char* SOAP_FMAC2 soap_cookie_value(struct soap*, const char*, const char*, const char*);
    1749 SOAP_FMAC1 extern long SOAP_FMAC2 soap_cookie_expire(struct soap*, const char*, const char*, const char*);
     2289SOAP_FMAC1 extern char* SOAP_FMAC2 soap_env_cookie_value(struct soap*, const char*, const char*, const char*);
     2290SOAP_FMAC1 extern time_t SOAP_FMAC2 soap_cookie_expire(struct soap*, const char*, const char*, const char*);
    17502291SOAP_FMAC1 extern int SOAP_FMAC2 soap_set_cookie_expire(struct soap*, const char*, long, const char*, const char*);
    17512292SOAP_FMAC1 extern int SOAP_FMAC2 soap_set_cookie_session(struct soap*, const char*, const char*, const char*);
     
    17532294SOAP_FMAC1 extern void SOAP_FMAC2 soap_clr_cookie(struct soap*, const char*, const char*, const char*);
    17542295SOAP_FMAC1 extern int SOAP_FMAC2 soap_getenv_cookies(struct soap*);
    1755 SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_copy_cookies(struct soap*);
     2296SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_copy_cookies(struct soap*, const struct soap*);
    17562297SOAP_FMAC1 extern void SOAP_FMAC2 soap_free_cookies(struct soap*);
    17572298#endif
    17582299
    17592300#ifdef __cplusplus
    1760 }
    1761 #endif
    1762 
    1763 #endif
    1764 
     2301} /* extern "C" */
     2302#endif
     2303
     2304#endif
Note: See TracChangeset for help on using the changeset viewer.