dmitry Thu Nov 11 04:17:11 2004 EDT Modified files: /php-src/ext/soap php_encoding.c Log: Support for lists in non-WSDL mode was implemented Support for "xsi:type" was improved http://cvs.php.net/diff.php/php-src/ext/soap/php_encoding.c?r1=1.79&r2=1.80&ty=u Index: php-src/ext/soap/php_encoding.c diff -u php-src/ext/soap/php_encoding.c:1.79 php-src/ext/soap/php_encoding.c:1.80 --- php-src/ext/soap/php_encoding.c:1.79 Wed Nov 3 18:36:49 2004 +++ php-src/ext/soap/php_encoding.c Thu Nov 11 04:17:10 2004 @@ -17,7 +17,7 @@ | Dmitry Stogov <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: php_encoding.c,v 1.79 2004/11/03 23:36:49 derick Exp $ */ +/* $Id: php_encoding.c,v 1.80 2004/11/11 09:17:10 dmitry Exp $ */ #include <time.h> @@ -312,14 +312,10 @@ return node; } -zval *master_to_zval(encodePtr encode, xmlNodePtr data) +static zval *master_to_zval_int(encodePtr encode, xmlNodePtr data) { zval *ret = NULL; - if (encode == NULL) { - encode = get_conversion(UNKNOWN_TYPE); - } - data = check_and_resolve_href(data); if (encode->to_zval_before) { data = encode->to_zval_before(&encode->details, data, 0); } @@ -332,6 +328,40 @@ return ret; } +zval *master_to_zval(encodePtr encode, xmlNodePtr data) +{ + data = check_and_resolve_href(data); + + if (encode == NULL) { + encode = get_conversion(UNKNOWN_TYPE); + } else { + /* Use xsi:type if it is defined */ + xmlAttrPtr type_attr = get_attribute_ex(data->properties,"type", XSI_NAMESPACE); + + if (type_attr != NULL) { + encodePtr enc = get_encoder_from_prefix(SOAP_GLOBAL(sdl), data, type_attr->children->content); + + if (enc != NULL && enc != encode) { + encodePtr tmp = enc; + while (tmp && + tmp->details.sdl_type != NULL && + tmp->details.sdl_type->kind != XSD_TYPEKIND_COMPLEX) { + if (enc == tmp->details.sdl_type->encode || + tmp == tmp->details.sdl_type->encode) { + enc = NULL; + break; + } + tmp = tmp->details.sdl_type->encode; + } + if (enc != NULL) { + encode = enc; + } + } + } + } + master_to_zval_int(encode, data); +} + #ifdef HAVE_PHP_DOMXML zval *to_xml_before_user(encodeTypePtr type, zval *data) { @@ -945,7 +975,7 @@ MAKE_STD_ZVAL(ret); object_init(ret); - base = master_to_zval(enc, data); + base = master_to_zval_int(enc, data); #ifdef ZEND_ENGINE_2 base->refcount--; #endif @@ -962,7 +992,7 @@ sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_SIMPLE && sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_LIST && sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_UNION) { - ret = master_to_zval(sdlType->encode, data); + ret = master_to_zval_int(sdlType->encode, data); FIND_XML_NULL(data, ret); } else { zval *base; @@ -970,7 +1000,7 @@ MAKE_STD_ZVAL(ret); object_init(ret); - base = master_to_zval(sdlType->encode, data); + base = master_to_zval_int(sdlType->encode, data); #ifdef ZEND_ENGINE_2 base->refcount--; #endif @@ -1031,13 +1061,32 @@ while (trav != NULL) { if (trav->type == XML_ELEMENT_NODE) { - zval *tmpVal; + zval *tmpVal; + zval **prop; + int key_len; tmpVal = master_to_zval(NULL, trav); + key_len = strlen(trav->name) + 1; + + if (zend_hash_find(Z_OBJPROP_P(ret), (char*)trav->name, key_len, (void **) &prop) == FAILURE) { #ifdef ZEND_ENGINE_2 - tmpVal->refcount--; + tmpVal->refcount--; #endif - add_property_zval(ret, (char *)trav->name, tmpVal); + add_property_zval_ex(ret, (char*)trav->name, key_len, tmpVal); + } else { + /* Property already exist - make array */ + if (Z_TYPE_PP(prop) != IS_ARRAY) { + /* Convert into array */ + zval *arr; + + MAKE_STD_ZVAL(arr); + array_init(arr); + add_next_index_zval(arr, *prop); + *prop = arr; + } + /* Add array element */ + add_next_index_zval(*prop, tmpVal); + } } trav = trav->next; } @@ -2121,7 +2170,8 @@ while (tmp && tmp->details.sdl_type != NULL && tmp->details.sdl_type->kind != XSD_TYPEKIND_COMPLEX) { - if (tmp == enc) { + if (enc == tmp->details.sdl_type->encode || + tmp == tmp->details.sdl_type->encode) { enc = NULL; break; } @@ -2152,7 +2202,7 @@ } } } - ret = master_to_zval(enc, data); + ret = master_to_zval_int(enc, data); if (SOAP_GLOBAL(sdl) && type_name && enc->details.sdl_type) { zval* soapvar; char *ns, *cptype; @@ -2432,7 +2482,7 @@ switch (type->kind) { case XSD_TYPEKIND_SIMPLE: if (type->encode && enc != &type->encode->details) { - return master_to_zval(type->encode, data); + return master_to_zval_int(type->encode, data); } else { return guess_zval_convert(enc, data); }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php