summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2005-07-08 07:17:17 +0000
committerDmitry Stogov <dmitry@php.net>2005-07-08 07:17:17 +0000
commit042862140c83d8baa553cf450822732f95817db8 (patch)
treeb24c17f69bebf60eb77cbdc889326ed062f48e26
parent1724f8e6a815d883a4adc319b3dfe4327be7d248 (diff)
downloadphp-git-042862140c83d8baa553cf450822732f95817db8.tar.gz
Fixed support for <any> in base type of extension
-rw-r--r--ext/soap/php_encoding.c106
1 files changed, 69 insertions, 37 deletions
diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c
index 4f36b67152..68709dc343 100644
--- a/ext/soap/php_encoding.c
+++ b/ext/soap/php_encoding.c
@@ -910,6 +910,66 @@ static zval* get_zval_property(zval* object, char* name TSRMLS_DC)
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 @@ static void model_to_zval_object(zval *ret, sdlContentModelPtr model, xmlNodePtr
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 @@ static zval *to_zval_object(encodeTypePtr type, xmlNodePtr data)
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 @@ static zval *to_zval_object(encodeTypePtr type, xmlNodePtr data)
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 @@ static zval *to_zval_object(encodeTypePtr type, xmlNodePtr data)
}
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;