From 168dc362dfcb1141cb9c364c96999cee65d66306 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 17 Feb 2004 08:18:53 +0000 Subject: [PATCH] Encoding of ommited tail parameters as NULLs --- ext/soap/php_encoding.c | 9 +++++++ ext/soap/soap.c | 53 ++++++++++++++++++++++++++++------------- 2 files changed, 45 insertions(+), 17 deletions(-) diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index 024a19c32e..69bf69a4b1 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -1071,6 +1071,15 @@ static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, xmlNo sdlTypePtr sdlType = type->sdl_type; TSRMLS_FETCH(); + if (!data || Z_TYPE_P(data) == IS_NULL) { + xmlParam = xmlNewNode(NULL,"BOGUS"); + xmlAddChild(parent, xmlParam); + if (style == SOAP_ENCODED) { + xmlSetProp(xmlParam, "xsi:nil", "1"); + } + return xmlParam; + } + if (sdlType) { prop = NULL; if (Z_TYPE_P(data) == IS_OBJECT) { diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 13cfb827f2..8802ba2193 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -2587,11 +2587,9 @@ static int serialize_response_call2(xmlNodePtr body, sdlFunctionPtr function, ch } else { param = serialize_parameter(parameter, ret, 0, "return", use, body TSRMLS_CC); if (function && function->binding->bindingType == BINDING_SOAP) { - sdlParamPtr *sparam; - - if (zend_hash_index_find(function->responseParameters, 0, (void **)&sparam) == SUCCESS && (*sparam)->element) { - ns = encode_add_ns(param, (*sparam)->element->namens); - xmlNodeSetName(param, (*sparam)->element->name); + if (parameter && parameter->element) { + ns = encode_add_ns(param, parameter->element->namens); + xmlNodeSetName(param, parameter->element->name); xmlSetNs(param, ns); } } else if (strcmp(param->name,"return") == 0) { @@ -2619,11 +2617,9 @@ static int serialize_response_call2(xmlNodePtr body, sdlFunctionPtr function, ch } else { param = serialize_parameter(parameter, *data, i, param_name, use, body TSRMLS_CC); if (function && function->binding->bindingType == BINDING_SOAP) { - sdlParamPtr *sparam; - - if (zend_hash_index_find(function->responseParameters, i, (void **)&sparam) == SUCCESS) { - ns = encode_add_ns(param, (*sparam)->encode->details.ns); - xmlNodeSetName(param, (*sparam)->encode->details.type_str); + if (parameter && parameter->element) { + ns = encode_add_ns(param, parameter->element->namens); + xmlNodeSetName(param, parameter->element->name); xmlSetNs(param, ns); } } @@ -2911,16 +2907,38 @@ static xmlDocPtr serialize_function_call(zval *this_ptr, sdlFunctionPtr function } else if (style == SOAP_DOCUMENT) { param = serialize_parameter(parameter, arguments[i], i, NULL, use, body TSRMLS_CC); if (function && function->binding->bindingType == BINDING_SOAP) { - sdlParamPtr *sparam; - - if (zend_hash_index_find(function->requestParameters, i, (void **)&sparam) == SUCCESS && (*sparam)->element) { - ns = encode_add_ns(param, (*sparam)->element->namens); - xmlNodeSetName(param, (*sparam)->element->name); + if (parameter && parameter->element) { + ns = encode_add_ns(param, parameter->element->namens); + xmlNodeSetName(param, parameter->element->name); xmlSetNs(param, ns); } } } } + + if (function && function->requestParameters) { + int n = zend_hash_num_elements(function->requestParameters); + + if (n > arg_count) { + for (i = arg_count; i < n; i++) { + xmlNodePtr param; + sdlParamPtr parameter = get_param(function, NULL, i, FALSE); + + if (style == SOAP_RPC) { + param = serialize_parameter(parameter, NULL, i, NULL, use, method TSRMLS_CC); + } else if (style == SOAP_DOCUMENT) { + param = serialize_parameter(parameter, NULL, i, NULL, use, body TSRMLS_CC); + if (function && function->binding->bindingType == BINDING_SOAP) { + if (parameter && parameter->element) { + ns = encode_add_ns(param, parameter->element->namens); + xmlNodeSetName(param, parameter->element->name); + xmlSetNs(param, ns); + } + } + } + } + } + } if (head) { zval** header; @@ -3026,8 +3044,9 @@ static xmlNodePtr serialize_parameter(sdlParamPtr param, zval *param_val, int in xmlNodePtr xmlParam; char paramNameBuf[10]; - if (Z_TYPE_P(param_val) == IS_OBJECT && - Z_OBJCE_P(param_val) == soap_param_class_entry) { + if (param_val && + Z_TYPE_P(param_val) == IS_OBJECT && + Z_OBJCE_P(param_val) == soap_param_class_entry) { zval **param_name; zval **param_data; -- 2.50.1