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.c173
1 files changed, 58 insertions, 115 deletions
diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c
index d4d5367e7d..4138b5acb0 100644
--- a/ext/soap/php_encoding.c
+++ b/ext/soap/php_encoding.c
@@ -80,6 +80,8 @@ static void get_array_type(xmlNodePtr node, zval *array, smart_str *out_type TSR
static xmlNodePtr check_and_resolve_href(xmlNodePtr data);
+static encodePtr get_conversion(int encode);
+
static void get_type_str(xmlNodePtr node, const char* ns, const char* type, smart_str* ret);
static void set_ns_and_type_ex(xmlNodePtr node, char *ns, char *type);
@@ -212,16 +214,15 @@ void whiteSpace_replace(char* str)
void whiteSpace_collapse(char* str)
{
- char *orig = str;
- char *tmp = do_alloca(strlen(str)+1);
char *pos;
char old;
+ pos = str;
whiteSpace_replace(str);
while (*str == ' ') {
str++;
}
- pos = tmp; old = '\0';
+ old = '\0';
while (*str != '\0') {
if (*str != ' ' || old != ' ') {
*pos = *str;
@@ -234,8 +235,6 @@ void whiteSpace_collapse(char* str)
--pos;
}
*pos = '\0';
- memcpy(orig,tmp,(pos-tmp)+1);
- free_alloca(tmp);
}
xmlNodePtr master_to_xml(encodePtr encode, zval *data, int style, xmlNodePtr parent)
@@ -795,7 +794,7 @@ static void model_to_zval_object(zval *ret, sdlContentModelPtr model, xmlNodePtr
add_next_index_zval(array, val);
do {
typeAttr = get_attribute(node->properties,"type");
- enc = NULL;
+ enc = NULL;
if (typeAttr != NULL && typeAttr->children && typeAttr->children->content) {
enc = get_encoder_from_prefix(sdl, node, typeAttr->children->content);
}
@@ -847,16 +846,16 @@ static zval *to_zval_object(encodeTypePtr type, xmlNodePtr data)
if (sdlType) {
if (sdlType->kind == XSD_TYPEKIND_RESTRICTION &&
sdlType->encode && type != &sdlType->encode->details) {
- encodePtr enc;
+ encodePtr enc;
enc = sdlType->encode;
while (enc && enc->details.sdl_type &&
- enc->details.sdl_type->kind != XSD_TYPEKIND_SIMPLE &&
- enc->details.sdl_type->kind != XSD_TYPEKIND_LIST &&
- enc->details.sdl_type->kind != XSD_TYPEKIND_UNION) {
- enc = enc->details.sdl_type->encode;
- }
- if (enc) {
+ enc->details.sdl_type->kind != XSD_TYPEKIND_SIMPLE &&
+ enc->details.sdl_type->kind != XSD_TYPEKIND_LIST &&
+ enc->details.sdl_type->kind != XSD_TYPEKIND_UNION) {
+ enc = enc->details.sdl_type->encode;
+ }
+ if (enc) {
zval *base;
MAKE_STD_ZVAL(ret);
@@ -875,11 +874,11 @@ static zval *to_zval_object(encodeTypePtr type, xmlNodePtr data)
} else if (sdlType->kind == XSD_TYPEKIND_EXTENSION &&
sdlType->encode &&
type != &sdlType->encode->details) {
- if (sdlType->encode->details.sdl_type &&
- 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);
+ if (sdlType->encode->details.sdl_type &&
+ 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);
FIND_XML_NULL(data, ret);
} else {
zval *base;
@@ -1050,16 +1049,16 @@ static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, xmlNo
}
if (sdlType->kind == XSD_TYPEKIND_RESTRICTION &&
sdlType->encode && type != &sdlType->encode->details) {
- encodePtr enc;
+ encodePtr enc;
enc = sdlType->encode;
while (enc && enc->details.sdl_type &&
- enc->details.sdl_type->kind != XSD_TYPEKIND_SIMPLE &&
- enc->details.sdl_type->kind != XSD_TYPEKIND_LIST &&
- enc->details.sdl_type->kind != XSD_TYPEKIND_UNION) {
- enc = enc->details.sdl_type->encode;
- }
- if (enc) {
+ enc->details.sdl_type->kind != XSD_TYPEKIND_SIMPLE &&
+ enc->details.sdl_type->kind != XSD_TYPEKIND_LIST &&
+ enc->details.sdl_type->kind != XSD_TYPEKIND_UNION) {
+ enc = enc->details.sdl_type->encode;
+ }
+ if (enc) {
zval **tmp;
if (prop && zend_hash_find(prop, "_", sizeof("_"), (void**)&tmp) == SUCCESS) {
xmlParam = master_to_xml(enc, *tmp, style, parent);
@@ -1075,10 +1074,10 @@ static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, xmlNo
}
} else if (sdlType->kind == XSD_TYPEKIND_EXTENSION &&
sdlType->encode && type != &sdlType->encode->details) {
- if (sdlType->encode->details.sdl_type &&
- 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) {
+ if (sdlType->encode->details.sdl_type &&
+ 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) {
xmlParam = master_to_xml(sdlType->encode, data, style, parent);
} else {
zval **tmp;
@@ -1205,7 +1204,7 @@ static int calc_dimension_12(const char* str)
} else if (*str == '*') {
php_error(E_ERROR,"SOAP-ERROR: Encoding: '*' may only be first arraySize value in list");
} else {
- flag = 0;
+ flag = 0;
}
str++;
}
@@ -1229,11 +1228,11 @@ static int* get_position_12(int dimension, const char* str)
while (*str != '\0') {
if (*str >= '0' && *str <= '9') {
if (flag == 0) {
- i++;
- flag = 1;
- }
- pos[i] = (pos[i]*10)+(*str-'0');
- } else if (*str == '*') {
+ i++;
+ flag = 1;
+ }
+ pos[i] = (pos[i]*10)+(*str-'0');
+ } else if (*str == '*') {
php_error(E_ERROR,"SOAP-ERROR: Encoding: '*' may only be first arraySize value in list");
} else {
flag = 0;
@@ -1421,7 +1420,7 @@ static xmlNodePtr to_xml_array(encodeTypePtr type, zval *data, int style, xmlNod
if (Z_TYPE_PP(el) == IS_ARRAY) {
dims[i] = zend_hash_num_elements(Z_ARRVAL_PP(el));
} else {
- dims[i] = 0;
+ dims[i] = 0;
}
}
}
@@ -1484,19 +1483,19 @@ static xmlNodePtr to_xml_array(encodeTypePtr type, zval *data, int style, xmlNod
zend_hash_num_elements(sdl_type->elements) == 1 &&
(elementType = *(sdlTypePtr*)sdl_type->elements->pListHead->pData) != NULL &&
elementType->encode && elementType->encode->details.type_str) {
- element_type = elementType;
+ element_type = elementType;
enc = elementType->encode;
get_type_str(xmlParam, elementType->encode->details.ns, elementType->encode->details.type_str, &array_type);
} else {
get_array_type(xmlParam, data, &array_type TSRMLS_CC);
- enc = get_encoder_ex(SOAP_GLOBAL(sdl), array_type.c);
+ enc = get_encoder_ex(SOAP_GLOBAL(sdl), array_type.c, array_type.len);
}
} else if (sdl_type && sdl_type->elements &&
zend_hash_num_elements(sdl_type->elements) == 1 &&
(elementType = *(sdlTypePtr*)sdl_type->elements->pListHead->pData) != NULL &&
elementType->encode && elementType->encode->details.type_str) {
- element_type = elementType;
+ element_type = elementType;
enc = elementType->encode;
get_type_str(xmlParam, elementType->encode->details.ns, elementType->encode->details.type_str, &array_type);
@@ -1507,7 +1506,7 @@ static xmlNodePtr to_xml_array(encodeTypePtr type, zval *data, int style, xmlNod
} else {
get_array_type(xmlParam, data, &array_type TSRMLS_CC);
- enc = get_encoder_ex(SOAP_GLOBAL(sdl), array_type.c);
+ enc = get_encoder_ex(SOAP_GLOBAL(sdl), array_type.c, array_type.len);
smart_str_append_long(&array_size, i);
dims = emalloc(sizeof(int)*dimension);
dims[0] = i;
@@ -1898,10 +1897,9 @@ static zval *guess_zval_convert(encodeTypePtr type, xmlNodePtr data)
} else {
tmpattr = get_attribute(data->properties,"type");
if (tmpattr != NULL) {
- if (tmpattr->children) {
- enc = get_conversion_from_type(data, tmpattr->children->content);
- } else {
- enc = get_conversion_from_type(data, "");
+ enc = get_encoder_from_prefix(SOAP_GLOBAL(sdl), data, tmpattr->children->content);
+ if (enc != NULL && enc->details.sdl_type != NULL) {
+ enc = NULL;
}
}
@@ -2276,8 +2274,8 @@ static xmlNodePtr check_and_resolve_href(xmlNodePtr data)
href = data->properties;
while (1) {
href = get_attribute(href, "href");
- if (href == NULL || href->ns == NULL) {break;}
- href = href->next;
+ if (href == NULL || href->ns == NULL) {break;}
+ href = href->next;
}
if (href) {
/* Internal href try and find node */
@@ -2363,12 +2361,12 @@ void encode_reset_ns()
SOAP_GLOBAL(cur_uniq_ns) = 0;
}
-encodePtr get_conversion_ex(HashTable *encoding, int encode)
+static encodePtr get_conversion(int encode)
{
encodePtr *enc = NULL;
TSRMLS_FETCH();
- if (zend_hash_index_find(encoding, encode, (void **)&enc) == FAILURE) {
+ if (zend_hash_index_find(&SOAP_GLOBAL(defEncIndex), encode, (void **)&enc) == FAILURE) {
if (SOAP_GLOBAL(overrides)) {
smart_str nscat = {0};
@@ -2394,61 +2392,6 @@ encodePtr get_conversion_ex(HashTable *encoding, int encode)
}
}
-encodePtr get_conversion_from_href_type_ex(HashTable *encoding, const char *type, int len)
-{
- encodePtr *enc = NULL;
-
- if (encoding == NULL) {
- return NULL;
- }
-
- if (zend_hash_find(encoding, (char*)type, len + 1, (void **)&enc) == FAILURE) {
- return NULL;
- }
-
- return (*enc);
-}
-
-encodePtr get_conversion_from_type_ex(HashTable *encoding, xmlNodePtr node, const char *type)
-{
- encodePtr *enc = NULL;
- xmlNsPtr nsptr;
- char *ns, *cptype;
- smart_str nscat = {0};
-
- if (encoding == NULL) {
- return NULL;
- }
-
- parse_namespace(type, &cptype, &ns);
- nsptr = xmlSearchNs(node->doc, node, ns);
- if (nsptr != NULL) {
- smart_str_appends(&nscat, nsptr->href);
- smart_str_appendc(&nscat, ':');
- smart_str_appends(&nscat, cptype);
- smart_str_0(&nscat);
-
- if (zend_hash_find(encoding, nscat.c, nscat.len + 1, (void **)&enc) == FAILURE) {
- if (zend_hash_find(encoding, (char*)type, strlen(type) + 1, (void **)&enc) == FAILURE) {
- enc = NULL;
- }
- }
- smart_str_free(&nscat);
- } else {
- if (zend_hash_find(encoding, (char*)type, strlen(type) + 1, (void **)&enc) == FAILURE) {
- enc = NULL;
- }
- }
-
- if (cptype) {efree(cptype);}
- if (ns) {efree(ns);}
- if (enc == NULL) {
- return NULL;
- } else {
- return (*enc);
- }
-}
-
static int is_map(zval *array)
{
int i, count = zend_hash_num_elements(Z_ARRVAL_P(array));
@@ -2492,33 +2435,33 @@ static void get_array_type(xmlNodePtr node, zval *array, smart_str *type TSRMLS_
cur_type = Z_LVAL_PP(ztype);
if (zend_hash_find(Z_OBJPROP_PP(tmp), "enc_stype", sizeof("enc_stype"), (void **)&ztype) == SUCCESS) {
- cur_stype = Z_STRVAL_PP(ztype);
+ cur_stype = Z_STRVAL_PP(ztype);
} else {
- cur_stype = NULL;
+ cur_stype = NULL;
}
if (zend_hash_find(Z_OBJPROP_PP(tmp), "enc_ns", sizeof("enc_ns"), (void **)&ztype) == SUCCESS) {
- cur_ns = Z_STRVAL_PP(ztype);
+ cur_ns = Z_STRVAL_PP(ztype);
} else {
- cur_ns = NULL;
+ cur_ns = NULL;
}
} else if (Z_TYPE_PP(tmp) == IS_ARRAY && is_map(*tmp)) {
cur_type = APACHE_MAP;
- cur_stype = NULL;
- cur_ns = NULL;
+ cur_stype = NULL;
+ cur_ns = NULL;
} else {
cur_type = Z_TYPE_PP(tmp);
- cur_stype = NULL;
- cur_ns = NULL;
+ cur_stype = NULL;
+ cur_ns = NULL;
}
if (i > 0) {
if ((cur_type != prev_type) ||
- (cur_stype != NULL && prev_stype != NULL && strcmp(cur_stype,prev_stype) != 0) ||
- (cur_stype == NULL && cur_stype != prev_stype) ||
- (cur_ns != NULL && prev_ns != NULL && strcmp(cur_ns,prev_ns) != 0) ||
- (cur_ns == NULL && cur_ns != prev_ns)) {
+ (cur_stype != NULL && prev_stype != NULL && strcmp(cur_stype,prev_stype) != 0) ||
+ (cur_stype == NULL && cur_stype != prev_stype) ||
+ (cur_ns != NULL && prev_ns != NULL && strcmp(cur_ns,prev_ns) != 0) ||
+ (cur_ns == NULL && cur_ns != prev_ns)) {
different = TRUE;
break;
}