dmitry Thu Nov 11 04:16:40 2004 EDT
Modified files: (Branch: PHP_5_0)
/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.71.2.7&r2=1.71.2.8&ty=u
Index: php-src/ext/soap/php_encoding.c
diff -u php-src/ext/soap/php_encoding.c:1.71.2.7
php-src/ext/soap/php_encoding.c:1.71.2.8
--- php-src/ext/soap/php_encoding.c:1.71.2.7 Wed Nov 3 18:27:26 2004
+++ php-src/ext/soap/php_encoding.c Thu Nov 11 04:16:36 2004
@@ -17,7 +17,7 @@
| Dmitry Stogov <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: php_encoding.c,v 1.71.2.7 2004/11/03 23:27:26 derick Exp $ */
+/* $Id: php_encoding.c,v 1.71.2.8 2004/11/11 09:16:36 dmitry Exp $ */
#include <time.h>
@@ -312,15 +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;
- TSRMLS_FETCH();
- 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);
}
@@ -333,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)
{
@@ -946,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
@@ -963,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;
@@ -971,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
@@ -1032,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;
}
@@ -1380,7 +1428,6 @@
static xmlNodePtr guess_array_map(encodeTypePtr type, zval *data, int style,
xmlNodePtr parent)
{
encodePtr enc = NULL;
- TSRMLS_FETCH();
if (data && Z_TYPE_P(data) == IS_ARRAY) {
if (is_map(data)) {
@@ -1513,7 +1560,6 @@
if (zdata) {
if (enc == NULL) {
- TSRMLS_FETCH();
xparam =
master_to_xml(get_conversion((*zdata)->type), (*zdata), style, xmlParam);
} else {
xparam = master_to_xml(enc,
(*zdata), style, xmlParam);
@@ -1983,7 +2029,6 @@
{
xmlNodePtr xmlParam;
int i;
- TSRMLS_FETCH();
xmlParam = xmlNewNode(NULL,"BOGUS");
xmlAddChild(parent, xmlParam);
@@ -2041,7 +2086,6 @@
{
zval *ret, *key, *value;
xmlNodePtr trav, item, xmlKey, xmlValue;
- TSRMLS_FETCH();
MAKE_STD_ZVAL(ret);
FIND_XML_NULL(data, ret);
@@ -2086,7 +2130,6 @@
{
encodePtr enc;
xmlNodePtr ret;
- TSRMLS_FETCH();
if (data) {
enc = get_conversion(data->type);
@@ -2127,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;
}
@@ -2158,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;
@@ -2438,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