]> granicus.if.org Git - php/commitdiff
Encoding of ommited tail parameters as NULLs
authorDmitry Stogov <dmitry@php.net>
Tue, 17 Feb 2004 08:18:53 +0000 (08:18 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 17 Feb 2004 08:18:53 +0000 (08:18 +0000)
ext/soap/php_encoding.c
ext/soap/soap.c

index 024a19c32ef979ced7190a43dcc4479a88b28f8c..69bf69a4b1865826d5b8cd55c5b364e958ded58b 100644 (file)
@@ -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) {
index 13cfb827f2b1ad829791846ee74ec11cf6a25f4b..8802ba219382986e5f6061b7ee6d3e093d706225 100644 (file)
@@ -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;