From: Dmitry Stogov Date: Fri, 13 Feb 2004 08:30:13 +0000 (+0000) Subject: SoapClient::__getTypes and SoapClient::__getFunctions were fixed to return proper... X-Git-Tag: RELEASE_0_2_0~347 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dcb3189df2f8d9cae9cc307d8e1efff1291696e0;p=php SoapClient::__getTypes and SoapClient::__getFunctions were fixed to return proper information --- diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 29cc3e6437..16ef01a29c 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -3186,15 +3186,37 @@ static void function_to_string(sdlFunctionPtr function, smart_str *buf) { int i = 0; HashPosition pos; + sdlParamPtr *param; - if (function->responseParameters && function->responseParameters->pListHead) { - sdlParamPtr *param; - param = function->responseParameters->pListHead->pData; - if ((*param)->encode && (*param)->encode->details.type_str) { - smart_str_appendl(buf, (*param)->encode->details.type_str, strlen((*param)->encode->details.type_str)); - smart_str_appendc(buf, ' '); + if (function->responseParameters && + zend_hash_num_elements(function->responseParameters) > 0) { + if (zend_hash_num_elements(function->responseParameters) == 1) { + param = function->responseParameters->pListHead->pData; + if ((*param)->encode && (*param)->encode->details.type_str) { + smart_str_appendl(buf, (*param)->encode->details.type_str, strlen((*param)->encode->details.type_str)); + smart_str_appendc(buf, ' '); + } else { + smart_str_appendl(buf, "UNKNOWN ", 8); + } } else { - smart_str_appendl(buf, "mixed ", 6); + i = 0; + smart_str_appendl(buf, "list(", 5); + zend_hash_internal_pointer_reset_ex(function->responseParameters, &pos); + while (zend_hash_get_current_data_ex(function->responseParameters, (void **)¶m, &pos) != FAILURE) { + if (i > 0) { + smart_str_appendl(buf, ", ", 2); + } + if ((*param)->encode && (*param)->encode->details.type_str) { + smart_str_appendl(buf, (*param)->encode->details.type_str, strlen((*param)->encode->details.type_str)); + } else { + smart_str_appendl(buf, "UNKNOWN", 7); + } + smart_str_appendl(buf, " $", 2); + smart_str_appendl(buf, (*param)->paramName, strlen((*param)->paramName)); + zend_hash_move_forward_ex(function->responseParameters, &pos); + i++; + } + smart_str_appendl(buf, ") ", 2); } } else { smart_str_appendl(buf, "void ", 5); @@ -3204,22 +3226,19 @@ static void function_to_string(sdlFunctionPtr function, smart_str *buf) smart_str_appendc(buf, '('); if (function->requestParameters) { - sdlParamPtr *param; - i = 0; zend_hash_internal_pointer_reset_ex(function->requestParameters, &pos); while (zend_hash_get_current_data_ex(function->requestParameters, (void **)¶m, &pos) != FAILURE) { + if (i > 0) { + smart_str_appendl(buf, ", ", 2); + } if ((*param)->encode && (*param)->encode->details.type_str) { smart_str_appendl(buf, (*param)->encode->details.type_str, strlen((*param)->encode->details.type_str)); } else { - smart_str_appendl(buf, "mixed ", 6); + smart_str_appendl(buf, "UNKNOWN", 7); } - smart_str_appendc(buf, ' '); - smart_str_appendc(buf, '$'); + smart_str_appendl(buf, " $", 2); smart_str_appendl(buf, (*param)->paramName, strlen((*param)->paramName)); - if (zend_hash_num_elements(function->requestParameters) > i + 1) { - smart_str_appendl(buf, ", ", 2); - } zend_hash_move_forward_ex(function->requestParameters, &pos); i++; } @@ -3228,6 +3247,32 @@ static void function_to_string(sdlFunctionPtr function, smart_str *buf) smart_str_0(buf); } +static void model_to_string(sdlContentModelPtr model, smart_str *buf, int level) +{ + switch (model->kind) { + case XSD_CONTENT_ELEMENT: + type_to_string(model->u.element, buf, level); + smart_str_appendl(buf, ";\n", 2); + break; + case XSD_CONTENT_SEQUENCE: + case XSD_CONTENT_ALL: + case XSD_CONTENT_CHOICE: { + sdlContentModelPtr *tmp; + + zend_hash_internal_pointer_reset(model->u.content); + while (zend_hash_get_current_data(model->u.content, (void**)&tmp) == SUCCESS) { + model_to_string(*tmp, buf, level); + zend_hash_move_forward(model->u.content); + } + break; + } + case XSD_CONTENT_GROUP: + model_to_string(model->u.group->model, buf, level); + default: + break; + } +} + static void type_to_string(sdlTypePtr type, smart_str *buf, int level) { int i; @@ -3239,29 +3284,124 @@ static void type_to_string(sdlTypePtr type, smart_str *buf, int level) } smart_str_appendl(buf, spaces.c, spaces.len); - if (type->elements) { - sdlTypePtr *t_type; - - smart_str_appendl(buf, "struct ", 7); - smart_str_appendl(buf, type->name, strlen(type->name)); - smart_str_appendc(buf, '\n'); - smart_str_appendl(buf, spaces.c, spaces.len); - smart_str_appendl(buf, "{\n", 2); - - zend_hash_internal_pointer_reset_ex(type->elements, &pos); - level++; - while (zend_hash_get_current_data_ex(type->elements, (void **)&t_type, &pos) != FAILURE) { - type_to_string((*t_type), buf, level); - zend_hash_move_forward_ex(type->elements, &pos); - } - - smart_str_appendl(buf, spaces.c, spaces.len); - smart_str_appendl(buf, "}\n", 2); - } else { - smart_str_appendl(buf, type->encode->details.type_str, strlen(type->encode->details.type_str)); - smart_str_appendc(buf, ' '); - smart_str_appendl(buf, type->name, strlen(type->name)); - smart_str_appendl(buf, ";\n", 2); + switch (type->kind) { + case XSD_TYPEKIND_SIMPLE: + case XSD_TYPEKIND_LIST: + case XSD_TYPEKIND_UNION: + smart_str_appendl(buf, type->encode->details.type_str, strlen(type->encode->details.type_str)); + smart_str_appendc(buf, ' '); + smart_str_appendl(buf, type->name, strlen(type->name)); + break; + case XSD_TYPEKIND_COMPLEX: + case XSD_TYPEKIND_RESTRICTION: + case XSD_TYPEKIND_EXTENSION: + if (type->encode && + (type->encode->details.type == IS_ARRAY || + type->encode->details.type == SOAP_ENC_ARRAY)) { + sdlAttributePtr *attr; + sdlExtraAttributePtr *ext; + + if (type->attributes && + zend_hash_find(type->attributes, SOAP_1_1_ENC_NAMESPACE":arrayType", + sizeof(SOAP_1_1_ENC_NAMESPACE":arrayType"), + (void **)&attr) == SUCCESS && + zend_hash_find((*attr)->extraAttributes, WSDL_NAMESPACE":arrayType", sizeof(WSDL_NAMESPACE":arrayType"), (void **)&ext) == SUCCESS) { + char *end = strchr((*ext)->val, '['); + int len; + if (end == NULL) { + len = strlen((*ext)->val); + } else { + len = end-(*ext)->val; + } + if (len == 0) { + smart_str_appendl(buf, "anyType", 7); + } else { + smart_str_appendl(buf, (*ext)->val, len); + } + smart_str_appendc(buf, ' '); + smart_str_appendl(buf, type->name, strlen(type->name)); + if (end != NULL) { + smart_str_appends(buf, end); + } + } else { + sdlTypePtr elementType; + if (type->attributes && + zend_hash_find(type->attributes, SOAP_1_2_ENC_NAMESPACE":itemType", + sizeof(SOAP_1_2_ENC_NAMESPACE":itemType"), + (void **)&attr) == SUCCESS && + zend_hash_find((*attr)->extraAttributes, WSDL_NAMESPACE":itemType", sizeof(WSDL_NAMESPACE":arrayType"), (void **)&ext) == SUCCESS) { + smart_str_appends(buf, (*ext)->val); + smart_str_appendc(buf, ' '); + } else if (type->elements && + zend_hash_num_elements(type->elements) == 1 && + (elementType = *(sdlTypePtr*)type->elements->pListHead->pData) != NULL && + elementType->encode && elementType->encode->details.type_str) { + smart_str_appends(buf, elementType->encode->details.type_str); + smart_str_appendc(buf, ' '); + } else { + smart_str_appendl(buf, "anyType ", 8); + } + smart_str_appendl(buf, type->name, strlen(type->name)); + if (type->attributes && + zend_hash_find(type->attributes, SOAP_1_2_ENC_NAMESPACE":arraySize", + sizeof(SOAP_1_2_ENC_NAMESPACE":arraySize"), + (void **)&attr) == SUCCESS && + zend_hash_find((*attr)->extraAttributes, WSDL_NAMESPACE":itemType", sizeof(WSDL_NAMESPACE":arraySize"), (void **)&ext) == SUCCESS) { + smart_str_appendc(buf, '['); + smart_str_appends(buf, (*ext)->val); + smart_str_appendc(buf, ']'); + } else { + smart_str_appendl(buf, "[]", 2); + } + } + } else { + smart_str_appendl(buf, "struct ", 7); + smart_str_appendl(buf, type->name, strlen(type->name)); + smart_str_appendc(buf, ' '); + smart_str_appendl(buf, "{\n", 2); + if ((type->kind == XSD_TYPEKIND_RESTRICTION || + type->kind == XSD_TYPEKIND_EXTENSION) && type->encode) { + encodePtr enc = type->encode; + while (enc && enc->details.sdl_type && + enc->details.sdl_type->kind != XSD_TYPEKIND_SIMPLE && + enc->details.sdl_type->kind != XSD_TYPEKIND_LIST && + enc->details.sdl_type->kind != XSD_TYPEKIND_UNION) { + enc = enc->details.sdl_type->encode; + } + if (enc) { + smart_str_appendl(buf, spaces.c, spaces.len); + smart_str_appendc(buf, ' '); + smart_str_appendl(buf, type->encode->details.type_str, strlen(type->encode->details.type_str)); + smart_str_appendl(buf, " _;\n", 4); + } + } + if (type->model) { + model_to_string(type->model, buf, level+1); + } + if (type->attributes) { + sdlAttributePtr *attr; + + zend_hash_internal_pointer_reset_ex(type->attributes, &pos); + while (zend_hash_get_current_data_ex(type->attributes, (void **)&attr, &pos) != FAILURE) { + smart_str_appendl(buf, spaces.c, spaces.len); + smart_str_appendc(buf, ' '); + if ((*attr)->encode && (*attr)->encode->details.type_str) { + smart_str_appends(buf, (*attr)->encode->details.type_str); + smart_str_appendc(buf, ' '); + } else { + smart_str_appendl(buf, "UNKNOWN ", 8); + } + smart_str_appends(buf, (*attr)->name); + smart_str_appendl(buf, ";\n", 2); + zend_hash_move_forward_ex(type->attributes, &pos); + } + } + smart_str_appendl(buf, spaces.c, spaces.len); + smart_str_appendc(buf, '}'); + } + break; + default: + break; } smart_str_free(&spaces); smart_str_0(buf);