|
|
|
@ -369,7 +369,7 @@ static zend_bool soap_check_xml_ref(zval *data, xmlNodePtr node TSRMLS_DC) |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
static zend_bool soap_add_xml_ref(zval *data, xmlNodePtr node TSRMLS_DC) |
|
|
|
static void soap_add_xml_ref(zval *data, xmlNodePtr node TSRMLS_DC) |
|
|
|
{ |
|
|
|
if (SOAP_GLOBAL(ref_map)) { |
|
|
|
zend_hash_index_update(SOAP_GLOBAL(ref_map), (ulong)node, data); |
|
|
|
@ -1820,7 +1820,6 @@ static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, xmlNo |
|
|
|
{ |
|
|
|
xmlNodePtr xmlParam; |
|
|
|
HashTable *prop = NULL; |
|
|
|
int i; |
|
|
|
sdlTypePtr sdlType = type->sdl_type; |
|
|
|
|
|
|
|
if (!data || Z_TYPE_P(data) == IS_NULL) { |
|
|
|
@ -1973,29 +1972,15 @@ static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, xmlNo |
|
|
|
return xmlParam; |
|
|
|
} |
|
|
|
if (prop != NULL) { |
|
|
|
i = zend_hash_num_elements(prop); |
|
|
|
zend_hash_internal_pointer_reset(prop); |
|
|
|
|
|
|
|
for (;i > 0;i--) { |
|
|
|
xmlNodePtr property; |
|
|
|
zval *zprop; |
|
|
|
zend_string *str_key; |
|
|
|
ulong index; |
|
|
|
int key_type; |
|
|
|
|
|
|
|
key_type = zend_hash_get_current_key_ex(prop, &str_key, &index, FALSE, &prop->nInternalPointer); |
|
|
|
zprop = zend_hash_get_current_data(prop); |
|
|
|
if (Z_TYPE_P(zprop) == IS_INDIRECT) { |
|
|
|
zprop = Z_INDIRECT_P(zprop); |
|
|
|
if (Z_TYPE_P(zprop) == IS_UNDEF) { |
|
|
|
zend_hash_move_forward(prop); |
|
|
|
continue; |
|
|
|
} |
|
|
|
} |
|
|
|
zval *zprop; |
|
|
|
zend_string *str_key; |
|
|
|
xmlNodePtr property; |
|
|
|
|
|
|
|
property = master_to_xml(get_conversion(Z_TYPE_P(zprop)), zprop, style, xmlParam TSRMLS_CC); |
|
|
|
ZEND_HASH_FOREACH_STR_KEY_VAL_IND(prop, str_key, zprop) { |
|
|
|
|
|
|
|
if (key_type == HASH_KEY_IS_STRING) { |
|
|
|
property = master_to_xml(get_conversion(Z_TYPE_P(zprop)), zprop, style, xmlParam TSRMLS_CC); |
|
|
|
|
|
|
|
if (str_key) { |
|
|
|
const char *prop_name; |
|
|
|
|
|
|
|
if (Z_TYPE_P(data) == IS_OBJECT) { |
|
|
|
@ -2009,8 +1994,7 @@ static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, xmlNo |
|
|
|
xmlNodeSetName(property, BAD_CAST(prop_name)); |
|
|
|
} |
|
|
|
} |
|
|
|
zend_hash_move_forward(prop); |
|
|
|
} |
|
|
|
} ZEND_HASH_FOREACH_END(); |
|
|
|
} |
|
|
|
if (style == SOAP_ENCODED) { |
|
|
|
set_ns_and_type(xmlParam, type); |
|
|
|
@ -2141,29 +2125,40 @@ static void add_xml_array_elements(xmlNodePtr xmlParam, |
|
|
|
int style |
|
|
|
TSRMLS_DC) |
|
|
|
{ |
|
|
|
int j; |
|
|
|
int j = 0; |
|
|
|
zval *zdata; |
|
|
|
xmlNodePtr xparam; |
|
|
|
|
|
|
|
if (data && Z_TYPE_P(data) == IS_ARRAY) { |
|
|
|
zend_hash_internal_pointer_reset(Z_ARRVAL_P(data)); |
|
|
|
for (j=0; j<dims[0]; j++) { |
|
|
|
zval *zdata; |
|
|
|
ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL_P(data), zdata) { |
|
|
|
if (j >= dims[0]) { |
|
|
|
break; |
|
|
|
} |
|
|
|
if (dimension == 1) { |
|
|
|
if (enc == NULL) { |
|
|
|
xparam = master_to_xml(get_conversion(Z_TYPE_P(zdata)), zdata, style, xmlParam TSRMLS_CC); |
|
|
|
} else { |
|
|
|
xparam = master_to_xml(enc, zdata, style, xmlParam TSRMLS_CC); |
|
|
|
} |
|
|
|
|
|
|
|
if ((zdata = zend_hash_get_current_data(Z_ARRVAL_P(data))) == NULL) { |
|
|
|
zdata = NULL; |
|
|
|
if (type) { |
|
|
|
xmlNodeSetName(xparam, BAD_CAST(type->name)); |
|
|
|
} else if (style == SOAP_LITERAL && enc && enc->details.type_str) { |
|
|
|
xmlNodeSetName(xparam, BAD_CAST(enc->details.type_str)); |
|
|
|
xmlSetNs(xparam, ns); |
|
|
|
} else { |
|
|
|
xmlNodeSetName(xparam, BAD_CAST("item")); |
|
|
|
} |
|
|
|
} else { |
|
|
|
add_xml_array_elements(xmlParam, type, enc, ns, dimension-1, dims+1, zdata, style TSRMLS_CC); |
|
|
|
} |
|
|
|
if (dimension == 1) { |
|
|
|
xmlNodePtr xparam; |
|
|
|
j++; |
|
|
|
} ZEND_HASH_FOREACH_END(); |
|
|
|
|
|
|
|
if (zdata) { |
|
|
|
if (enc == NULL) { |
|
|
|
xparam = master_to_xml(get_conversion(Z_TYPE_P(zdata)), zdata, style, xmlParam TSRMLS_CC); |
|
|
|
} else { |
|
|
|
xparam = master_to_xml(enc, zdata, style, xmlParam TSRMLS_CC); |
|
|
|
} |
|
|
|
} else { |
|
|
|
xparam = xmlNewNode(NULL, BAD_CAST("BOGUS")); |
|
|
|
xmlAddChild(xmlParam, xparam); |
|
|
|
} |
|
|
|
if (dimension == 1) { |
|
|
|
while (j < dims[0]) { |
|
|
|
xparam = xmlNewNode(NULL, BAD_CAST("BOGUS")); |
|
|
|
xmlAddChild(xmlParam, xparam); |
|
|
|
|
|
|
|
if (type) { |
|
|
|
xmlNodeSetName(xparam, BAD_CAST(type->name)); |
|
|
|
@ -2173,15 +2168,15 @@ static void add_xml_array_elements(xmlNodePtr xmlParam, |
|
|
|
} else { |
|
|
|
xmlNodeSetName(xparam, BAD_CAST("item")); |
|
|
|
} |
|
|
|
} else { |
|
|
|
if (zdata) { |
|
|
|
add_xml_array_elements(xmlParam, type, enc, ns, dimension-1, dims+1, zdata, style TSRMLS_CC); |
|
|
|
} else { |
|
|
|
add_xml_array_elements(xmlParam, type, enc, ns, dimension-1, dims+1, NULL, style TSRMLS_CC); |
|
|
|
} |
|
|
|
|
|
|
|
j++; |
|
|
|
} |
|
|
|
zend_hash_move_forward(Z_ARRVAL_P(data)); |
|
|
|
} |
|
|
|
} else { |
|
|
|
while (j < dims[0]) { |
|
|
|
add_xml_array_elements(xmlParam, type, enc, ns, dimension-1, dims+1, NULL, style TSRMLS_CC); |
|
|
|
j++; |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
for (j=0; j<dims[0]; j++) { |
|
|
|
if (dimension == 1) { |
|
|
|
@ -2342,8 +2337,9 @@ iterator_done: |
|
|
|
for (i = 1; i < dimension; i++) { |
|
|
|
if (el != NULL && Z_TYPE_P(el) == IS_ARRAY && |
|
|
|
zend_hash_num_elements(Z_ARRVAL_P(el)) > 0) { |
|
|
|
zend_hash_internal_pointer_reset(Z_ARRVAL_P(el)); |
|
|
|
el = zend_hash_get_current_data(Z_ARRVAL_P(el)); |
|
|
|
ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL_P(el), el) { |
|
|
|
break; |
|
|
|
} ZEND_HASH_FOREACH_END(); |
|
|
|
if (Z_TYPE_P(el) == IS_ARRAY) { |
|
|
|
dims[i] = zend_hash_num_elements(Z_ARRVAL_P(el)); |
|
|
|
} else { |
|
|
|
@ -2692,29 +2688,25 @@ static zval *to_zval_array(zval *ret, encodeTypePtr type, xmlNodePtr data TSRMLS |
|
|
|
/* Map encode/decode */ |
|
|
|
static xmlNodePtr to_xml_map(encodeTypePtr type, zval *data, int style, xmlNodePtr parent TSRMLS_DC) |
|
|
|
{ |
|
|
|
zval *temp_data; |
|
|
|
zend_string *key_val; |
|
|
|
ulong int_val; |
|
|
|
xmlNodePtr xmlParam; |
|
|
|
int i; |
|
|
|
xmlNodePtr xparam, item; |
|
|
|
xmlNodePtr key; |
|
|
|
|
|
|
|
xmlParam = xmlNewNode(NULL, BAD_CAST("BOGUS")); |
|
|
|
xmlAddChild(parent, xmlParam); |
|
|
|
FIND_ZVAL_NULL(data, xmlParam, style); |
|
|
|
|
|
|
|
if (Z_TYPE_P(data) == IS_ARRAY) { |
|
|
|
i = zend_hash_num_elements(Z_ARRVAL_P(data)); |
|
|
|
zend_hash_internal_pointer_reset(Z_ARRVAL_P(data)); |
|
|
|
for (;i > 0;i--) { |
|
|
|
xmlNodePtr xparam, item; |
|
|
|
xmlNodePtr key; |
|
|
|
zval *temp_data; |
|
|
|
zend_string *key_val; |
|
|
|
ulong int_val; |
|
|
|
|
|
|
|
temp_data = zend_hash_get_current_data(Z_ARRVAL_P(data)); |
|
|
|
ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(data), int_val, key_val, temp_data) { |
|
|
|
|
|
|
|
item = xmlNewNode(NULL, BAD_CAST("item")); |
|
|
|
xmlAddChild(xmlParam, item); |
|
|
|
key = xmlNewNode(NULL, BAD_CAST("key")); |
|
|
|
xmlAddChild(item,key); |
|
|
|
if (zend_hash_get_current_key(Z_ARRVAL_P(data), &key_val, &int_val, FALSE) == HASH_KEY_IS_STRING) { |
|
|
|
if (key_val) { |
|
|
|
if (style == SOAP_ENCODED) { |
|
|
|
set_xsi_type(key, "xsd:string"); |
|
|
|
} |
|
|
|
@ -2734,9 +2726,7 @@ static xmlNodePtr to_xml_map(encodeTypePtr type, zval *data, int style, xmlNodeP |
|
|
|
|
|
|
|
xparam = master_to_xml(get_conversion(Z_TYPE_P(temp_data)), temp_data, style, item TSRMLS_CC); |
|
|
|
xmlNodeSetName(xparam, BAD_CAST("value")); |
|
|
|
|
|
|
|
zend_hash_move_forward(Z_ARRVAL_P(data)); |
|
|
|
} |
|
|
|
} ZEND_HASH_FOREACH_END(); |
|
|
|
} |
|
|
|
if (style == SOAP_ENCODED) { |
|
|
|
set_ns_and_type(xmlParam, type); |
|
|
|
@ -3509,26 +3499,23 @@ encodePtr get_conversion(int encode) |
|
|
|
|
|
|
|
static int is_map(zval *array) |
|
|
|
{ |
|
|
|
int i, count = zend_hash_num_elements(Z_ARRVAL_P(array)); |
|
|
|
|
|
|
|
zend_hash_internal_pointer_reset(Z_ARRVAL_P(array)); |
|
|
|
for (i = 0; i < count; i++) { |
|
|
|
zend_string *_str_index; |
|
|
|
ulong num_index; |
|
|
|
ulong index; |
|
|
|
zend_string *key; |
|
|
|
int i = 0; |
|
|
|
|
|
|
|
if (zend_hash_get_current_key(Z_ARRVAL_P(array), &_str_index, &num_index, 0) == HASH_KEY_IS_STRING || |
|
|
|
num_index != i) { |
|
|
|
ZEND_HASH_FOREACH_KEY(Z_ARRVAL_P(array), index, key) { |
|
|
|
if (key || index != i) { |
|
|
|
return TRUE; |
|
|
|
} |
|
|
|
zend_hash_move_forward(Z_ARRVAL_P(array)); |
|
|
|
} |
|
|
|
i++; |
|
|
|
} ZEND_HASH_FOREACH_END(); |
|
|
|
return FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
static encodePtr get_array_type(xmlNodePtr node, zval *array, smart_str *type TSRMLS_DC) |
|
|
|
{ |
|
|
|
HashTable *ht; |
|
|
|
int i, count, cur_type, prev_type, different; |
|
|
|
int i, cur_type, prev_type, different; |
|
|
|
zval *tmp; |
|
|
|
char *prev_stype = NULL, *cur_stype = NULL, *prev_ns = NULL, *cur_ns = NULL; |
|
|
|
|
|
|
|
@ -3537,15 +3524,12 @@ static encodePtr get_array_type(xmlNodePtr node, zval *array, smart_str *type TS |
|
|
|
return get_conversion(XSD_ANYTYPE); |
|
|
|
} |
|
|
|
|
|
|
|
i = 0; |
|
|
|
different = FALSE; |
|
|
|
cur_type = prev_type = 0; |
|
|
|
ht = HASH_OF(array); |
|
|
|
count = zend_hash_num_elements(ht); |
|
|
|
|
|
|
|
zend_hash_internal_pointer_reset(ht); |
|
|
|
for (i = 0;i < count;i++) { |
|
|
|
tmp = zend_hash_get_current_data(ht); |
|
|
|
|
|
|
|
ZEND_HASH_FOREACH_VAL_IND(ht, tmp) { |
|
|
|
if (Z_TYPE_P(tmp) == IS_OBJECT && |
|
|
|
Z_OBJCE_P(tmp) == soap_var_class_entry) { |
|
|
|
zval *ztype; |
|
|
|
@ -3591,10 +3575,10 @@ static encodePtr get_array_type(xmlNodePtr node, zval *array, smart_str *type TS |
|
|
|
prev_type = cur_type; |
|
|
|
prev_stype = cur_stype; |
|
|
|
prev_ns = cur_ns; |
|
|
|
zend_hash_move_forward(ht); |
|
|
|
} |
|
|
|
i++; |
|
|
|
} ZEND_HASH_FOREACH_END(); |
|
|
|
|
|
|
|
if (different || count == 0) { |
|
|
|
if (different || i == 0) { |
|
|
|
smart_str_appendl(type, "xsd:anyType", sizeof("xsd:anyType")-1); |
|
|
|
return get_conversion(XSD_ANYTYPE); |
|
|
|
} else { |
|
|
|
@ -3625,6 +3609,7 @@ static encodePtr get_array_type(xmlNodePtr node, zval *array, smart_str *type TS |
|
|
|
return enc; |
|
|
|
} |
|
|
|
} |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
static void get_type_str(xmlNodePtr node, const char* ns, const char* type, smart_str* ret) |
|
|
|
|