Browse Source

Support for lists in non-WSDL mode was implemented

Support for "xsi:type" was improved
PHP-5.1
Dmitry Stogov 22 years ago
parent
commit
e370219e2a
  1. 78
      ext/soap/php_encoding.c

78
ext/soap/php_encoding.c

@ -312,14 +312,10 @@ xmlNodePtr master_to_xml(encodePtr encode, zval *data, int style, xmlNodePtr par
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 @@ zval *master_to_zval(encodePtr encode, xmlNodePtr data)
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 @@ static zval *to_zval_object(encodeTypePtr type, xmlNodePtr data)
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 @@ static zval *to_zval_object(encodeTypePtr type, xmlNodePtr data)
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 @@ static zval *to_zval_object(encodeTypePtr type, xmlNodePtr data)
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 @@ static zval *to_zval_object(encodeTypePtr type, xmlNodePtr data)
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 @@ static zval *guess_zval_convert(encodeTypePtr type, xmlNodePtr data)
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 @@ static zval *guess_zval_convert(encodeTypePtr type, xmlNodePtr data)
}
}
}
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 @@ zval *sdl_guess_convert_zval(encodeTypePtr enc, xmlNodePtr data)
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);
}

Loading…
Cancel
Save