dmitry Fri Jul 8 03:16:58 2005 EDT Modified files: /php-src/ext/soap php_encoding.c Log: Fixed support for <any> in base type of extension http://cvs.php.net/diff.php/php-src/ext/soap/php_encoding.c?r1=1.99&r2=1.100&ty=u Index: php-src/ext/soap/php_encoding.c diff -u php-src/ext/soap/php_encoding.c:1.99 php-src/ext/soap/php_encoding.c:1.100 --- php-src/ext/soap/php_encoding.c:1.99 Thu Jul 7 13:29:25 2005 +++ php-src/ext/soap/php_encoding.c Fri Jul 8 03:16:56 2005 @@ -17,7 +17,7 @@ | Dmitry Stogov <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: php_encoding.c,v 1.99 2005/07/07 17:29:25 dmitry Exp $ */ +/* $Id: php_encoding.c,v 1.100 2005/07/08 07:16:56 dmitry Exp $ */ #include <time.h> @@ -910,6 +910,66 @@ return NULL; } +static void unset_zval_property(zval* object, char* name TSRMLS_DC) +{ + if (Z_TYPE_P(object) == IS_OBJECT) { + zval member; + zend_class_entry *old_scope; + + ZVAL_STRING(&member, name, 0); + old_scope = EG(scope); + EG(scope) = Z_OBJCE_P(object); + Z_OBJ_HT_P(object)->unset_property(object, &member TSRMLS_CC); + EG(scope) = old_scope; + } else if (Z_TYPE_P(object) == IS_ARRAY) { + zend_hash_del(Z_ARRVAL_P(object), name, strlen(name)+1); + } +} + +static void model_to_zval_any(zval *ret, xmlNodePtr node TSRMLS_DC) +{ + zval* any = NULL; + + while (node != NULL) { + if (get_zval_property(ret, (char*)node->name TSRMLS_CC) == NULL) { + zval* val = master_to_zval(get_conversion(XSD_ANYXML), node); + if (get_attribute_ex(node->properties,"type", XSI_NAMESPACE) == NULL && + Z_TYPE_P(val) == IS_STRING) { + while (node->next != NULL && + get_zval_property(ret, (char*)node->next->name TSRMLS_CC) == NULL && + get_attribute_ex(node->next->properties,"type", XSI_NAMESPACE) == NULL) { + zval* val2 = master_to_zval(get_conversion(XSD_ANYXML), node->next); + if (Z_TYPE_P(val2) != IS_STRING) { + break; + } + add_string_to_string(val, val, val2); + zval_ptr_dtor(&val2); + node = node->next; + } + } + if (any == NULL) { + any = val; + } else { + if (Z_TYPE_P(any) != IS_ARRAY) { + /* Convert into array */ + zval *arr; + + MAKE_STD_ZVAL(arr); + array_init(arr); + add_next_index_zval(arr, any); + any = arr; + } + /* Add array element */ + add_next_index_zval(any, val); + } + } + node = node->next; + } + if (any) { + set_zval_property(ret, "any", any TSRMLS_CC); + } +} + static void model_to_zval_object(zval *ret, sdlContentModelPtr model, xmlNodePtr data, sdlPtr sdl TSRMLS_DC) { switch (model->kind) { @@ -987,43 +1047,7 @@ zend_hash_move_forward_ex(model->u.content, &pos); } if (any) { - xmlNodePtr node = data->children; - zval* any = NULL; - - while (node != NULL) { - if (get_zval_property(ret, (char*)node->name TSRMLS_CC) == NULL) { - zval* val = master_to_zval(get_conversion(XSD_ANYXML), node); - while (Z_TYPE_P(val) == IS_STRING && node->next != NULL && - get_zval_property(ret, (char*)node->next->name TSRMLS_CC) == NULL) { - zval* val2 = master_to_zval(get_conversion(XSD_ANYXML), node->next); - if (Z_TYPE_P(val2) != IS_STRING) { - break; - } - add_string_to_string(val, val, val2); - zval_ptr_dtor(&val2); - node = node->next; - } - if (any == NULL) { - any = val; - } else { - if (Z_TYPE_P(any) != IS_ARRAY) { - /* Convert into array */ - zval *arr; - - MAKE_STD_ZVAL(arr); - array_init(arr); - add_next_index_zval(arr, any); - any = arr; - } - /* Add array element */ - add_next_index_zval(any, val); - } - } - node = node->next; - } - if (any) { - set_zval_property(ret, "any", any TSRMLS_CC); - } + model_to_zval_any(ret, data->children TSRMLS_CC); } break; } @@ -1043,6 +1067,7 @@ sdlPtr sdl; sdlTypePtr sdlType = type->sdl_type; zend_class_entry *ce = ZEND_STANDARD_CLASS_DEF_PTR; + zend_bool redo_any = 0; TSRMLS_FETCH(); if (SOAP_GLOBAL(class_map) && type->type_str) { @@ -1090,6 +1115,10 @@ sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_UNION) { ret = master_to_zval_int(sdlType->encode, data); FIND_XML_NULL(data, ret); + if (get_zval_property(ret, "any" TSRMLS_CC) != NULL) { + unset_zval_property(ret, "any" TSRMLS_CC); + redo_any = 1; + } } else { zval *base; @@ -1106,6 +1135,9 @@ } if (sdlType->model) { model_to_zval_object(ret, sdlType->model, data, sdl TSRMLS_CC); + if (redo_any && get_zval_property(ret, "any" TSRMLS_CC) == NULL) { + model_to_zval_any(ret, data->children TSRMLS_CC); + } } if (sdlType->attributes) { sdlAttributePtr *attr;
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php