summaryrefslogtreecommitdiff
path: root/ext/soap/php_encoding.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/soap/php_encoding.c')
-rw-r--r--ext/soap/php_encoding.c159
1 files changed, 72 insertions, 87 deletions
diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c
index 4d339173bc..c35cae2d33 100644
--- a/ext/soap/php_encoding.c
+++ b/ext/soap/php_encoding.c
@@ -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)