diff options
Diffstat (limited to 'ext/soap/php_encoding.c')
-rw-r--r-- | ext/soap/php_encoding.c | 519 |
1 files changed, 368 insertions, 151 deletions
diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index 3b4909f3d6..0f312e4a81 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -5,10 +5,10 @@ encode defaultEncoding[] = { {{UNKNOWN_TYPE, NULL, NULL, NULL}, guess_zval_convert, guess_xml_convert}, - {{IS_NULL, "null", "null", NULL}, to_zval_null, to_xml_null}, + {{IS_NULL, "nil", XSI_NAMESPACE, NULL}, to_zval_null, to_xml_null}, {{IS_STRING, XSD_STRING_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_string}, {{IS_LONG, XSD_INT_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_long}, - {{IS_DOUBLE, XSD_FLOAT_STRING, XSD_NAMESPACE, NULL}, to_zval_double, to_xml_string}, + {{IS_DOUBLE, XSD_FLOAT_STRING, XSD_NAMESPACE, NULL}, to_zval_double, to_xml_double}, {{IS_BOOL, XSD_BOOLEAN_STRING, XSD_NAMESPACE, NULL}, to_zval_bool, to_xml_bool}, {{IS_CONSTANT, XSD_STRING_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_string}, {{IS_ARRAY, SOAP_ENC_ARRAY_STRING, SOAP_ENC_NAMESPACE, NULL}, to_zval_array, guess_array_map}, @@ -17,9 +17,9 @@ encode defaultEncoding[] = { {{XSD_STRING, XSD_STRING_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_string}, {{XSD_BOOLEAN, XSD_BOOLEAN_STRING, XSD_NAMESPACE, NULL}, to_zval_bool, to_xml_bool}, - {{XSD_DECIMAL, XSD_DECIMAL_STRING, XSD_NAMESPACE, NULL}, to_zval_double, to_xml_string}, - {{XSD_FLOAT, XSD_FLOAT_STRING, XSD_NAMESPACE, NULL}, to_zval_double, to_xml_string}, - {{XSD_DOUBLE, XSD_DOUBLE_STRING, XSD_NAMESPACE, NULL}, to_zval_double, to_xml_string}, + {{XSD_DECIMAL, XSD_DECIMAL_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_string}, + {{XSD_FLOAT, XSD_FLOAT_STRING, XSD_NAMESPACE, NULL}, to_zval_double, to_xml_double}, + {{XSD_DOUBLE, XSD_DOUBLE_STRING, XSD_NAMESPACE, NULL}, to_zval_double, to_xml_double}, {{XSD_DATETIME, XSD_DATETIME_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_datetime}, {{XSD_TIME, XSD_TIME_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_time}, {{XSD_DATE, XSD_DATE_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_date}, @@ -32,8 +32,16 @@ encode defaultEncoding[] = { {{XSD_BASE64BINARY, XSD_BASE64BINARY_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_stringl}, {{XSD_LONG, XSD_LONG_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_long}, - {{XSD_INT, XSD_INT_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_string}, - {{XSD_SHORT, XSD_SHORT_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_string}, + {{XSD_INT, XSD_INT_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_long}, + {{XSD_SHORT, XSD_SHORT_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_long}, + {{XSD_BYTE, XSD_BYTE_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_long}, + {{XSD_NONPOSITIVEINTEGER, XSD_NONPOSITIVEINTEGER_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_long}, + {{XSD_POSITIVEINTEGER, XSD_POSITIVEINTEGER_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_long}, + {{XSD_NONNEGATIVEINTEGER, XSD_NONNEGATIVEINTEGER_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_long}, + {{XSD_NEGATIVEINTEGER, XSD_NEGATIVEINTEGER_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_long}, + {{XSD_UNSIGNEDBYTE, XSD_UNSIGNEDBYTE_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_long}, + {{XSD_UNSIGNEDSHORT, XSD_UNSIGNEDSHORT_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_long}, + {{XSD_UNSIGNEDINT, XSD_UNSIGNEDINT_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_long}, {{APACHE_MAP, APACHE_MAP_STRING, APACHE_NAMESPACE, NULL}, to_zval_map, to_xml_map}, @@ -43,12 +51,12 @@ encode defaultEncoding[] = { /* support some of the 1999 data types */ {{XSD_STRING, XSD_STRING_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_string, to_xml_string}, {{XSD_BOOLEAN, XSD_BOOLEAN_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_bool, to_xml_bool}, - {{XSD_DECIMAL, XSD_DECIMAL_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_long, to_xml_string}, - {{XSD_FLOAT, XSD_FLOAT_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_double, to_xml_string}, - {{XSD_DOUBLE, XSD_DOUBLE_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_double, to_xml_string}, + {{XSD_DECIMAL, XSD_DECIMAL_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_string, to_xml_string}, + {{XSD_FLOAT, XSD_FLOAT_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_double, to_xml_double}, + {{XSD_DOUBLE, XSD_DOUBLE_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_double, to_xml_double}, {{XSD_LONG, XSD_LONG_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_long, to_xml_long}, - {{XSD_INT, XSD_INT_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_long, to_xml_string}, - {{XSD_SHORT, XSD_SHORT_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_long, to_xml_string}, + {{XSD_INT, XSD_INT_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_long, to_xml_long}, + {{XSD_SHORT, XSD_SHORT_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_long, to_xml_long}, {{XSD_1999_TIMEINSTANT, XSD_1999_TIMEINSTANT_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_string, to_xml_string}, {{END_KNOWN_TYPES, NULL, NULL, NULL}, guess_zval_convert, guess_xml_convert} @@ -63,9 +71,6 @@ encode defaultEncoding[] = { #define XSD_QNAME_STRING "QName" #define XSD_NOTATION 120 #define XSD_NOTATION_STRING "NOTATION" -*/ - -/* #define XSD_NORMALIZEDSTRING 121 #define XSD_NORMALIZEDSTRING_STRING "normalizedString" #define XSD_TOKEN 122 @@ -88,24 +93,8 @@ encode defaultEncoding[] = { #define XSD_ENTITY_STRING "ENTITY" #define XSD_ENTITYS 129 #define XSD_ENTITYS_STRING "ENTITYS" -#define XSD_INTEGER 130 -#define XSD_INTEGER_STRING "integer" -#define XSD_NONPOSITIVEINTEGER 131 -#define XSD_NONPOSITIVEINTEGER_STRING "nonPositiveInteger" -#define XSD_NEGATIVEINTEGER 132 -#define XSD_NEGATIVEINTEGER_STRING "negativeInteger" -#define XSD_NONNEGATIVEINTEGER 137 -#define XSD_NONNEGATIVEINTEGER_STRING "nonNegativeInteger" #define XSD_UNSIGNEDLONG 138 #define XSD_UNSIGNEDLONG_STRING "unsignedLong" -#define XSD_UNSIGNEDINT 139 -#define XSD_UNSIGNEDINT_STRING "unsignedInt" -#define XSD_UNSIGNEDSHORT 140 -#define XSD_UNSIGNEDSHORT_STRING "unsignedShort" -#define XSD_UNSIGNEDBYTE 141 -#define XSD_UNSIGNEDBYTE_STRING "unsignedByte" -#define XSD_POSITIVEINTEGER 142 -#define XSD_POSITIVEINTEGER_STRING "positiveInteger" */ }; @@ -126,7 +115,6 @@ xmlNodePtr master_to_xml(encodePtr encode, zval *data, int style) zval *master_to_zval(encodePtr encode, xmlNodePtr data) { zval *ret; - data = check_and_resolve_href(data); if(encode->to_zval_before) data = encode->to_zval_before(encode->details, data, 0); @@ -267,9 +255,11 @@ zval *to_zval_string(encodeType type, xmlNodePtr data) zval *ret; MAKE_STD_ZVAL(ret); FIND_XML_NULL(data, ret); - - if(data && data->children) + if(data && data->children && data->children->content) { ZVAL_STRING(ret, data->children->content, 1); + } else { + ZVAL_EMPTY_STRING(ret); + } return ret; } @@ -278,9 +268,11 @@ zval *to_zval_stringl(encodeType type, xmlNodePtr data) zval *ret; MAKE_STD_ZVAL(ret); FIND_XML_NULL(data, ret); - - if(data && data->children) + if(data && data->children && data->children->content) { ZVAL_STRINGL(ret, data->children->content, xmlStrlen(data->children->content), 1); + } else { + ZVAL_EMPTY_STRING(ret) + } return ret; } @@ -292,16 +284,23 @@ xmlNodePtr to_xml_string(encodeType type, zval *data, int style) TSRMLS_FETCH(); ret = xmlNewNode(NULL, "BOGUS"); - FIND_ZVAL_NULL(data, ret); - - convert_to_string(data); - str = php_escape_html_entities(Z_STRVAL_P(data), Z_STRLEN_P(data), &new_len, 0, 0, NULL TSRMLS_CC); + FIND_ZVAL_NULL(data, ret, style); + + if (Z_TYPE_P(data) == IS_STRING) { + str = php_escape_html_entities(Z_STRVAL_P(data), Z_STRLEN_P(data), &new_len, 0, 0, NULL TSRMLS_CC); + } else { + zval tmp = *data; + zval_copy_ctor(&tmp); + convert_to_string(&tmp); + str = php_escape_html_entities(Z_STRVAL(tmp), Z_STRLEN(tmp), &new_len, 0, 0, NULL TSRMLS_CC); + zval_dtor(&tmp); + } pstr = malloc(new_len + 1); memcpy(pstr, str, new_len); pstr[new_len] = '\0'; efree(str); - + xmlNodeSetContentLen(ret, pstr, new_len); if(style == SOAP_ENCODED) @@ -314,10 +313,17 @@ xmlNodePtr to_xml_stringl(encodeType type, zval *data, int style) xmlNodePtr ret; ret = xmlNewNode(NULL, "BOGUS"); - FIND_ZVAL_NULL(data, ret); - - convert_to_string(data); - xmlNodeSetContentLen(ret, estrndup(Z_STRVAL_P(data), Z_STRLEN_P(data)), Z_STRLEN_P(data)); + FIND_ZVAL_NULL(data, ret, style); + + if (Z_TYPE_P(data) == IS_STRING) { + xmlNodeSetContentLen(ret, Z_STRVAL_P(data), Z_STRLEN_P(data)); + } else { + zval tmp = *data; + zval_copy_ctor(&tmp); + convert_to_string(&tmp); + xmlNodeSetContentLen(ret, Z_STRVAL(tmp), Z_STRLEN(tmp)); + zval_dtor(&tmp); + } if(style == SOAP_ENCODED) set_ns_and_type(ret, type); @@ -330,7 +336,11 @@ zval *to_zval_double(encodeType type, xmlNodePtr data) MAKE_STD_ZVAL(ret); FIND_XML_NULL(data, ret); - ZVAL_DOUBLE(ret, atof(data->children->content)); + if (data && data->children && data->children->content) { + ZVAL_DOUBLE(ret, atof(data->children->content)); + } else { + ZVAL_NULL(ret); + } return ret; } @@ -340,21 +350,53 @@ zval *to_zval_long(encodeType type, xmlNodePtr data) MAKE_STD_ZVAL(ret); FIND_XML_NULL(data, ret); - ZVAL_LONG(ret, atol(data->children->content)); + if (data && data->children && data->children->content) { + ZVAL_LONG(ret, atol(data->children->content)); + } else { + ZVAL_NULL(ret); + } return ret; } xmlNodePtr to_xml_long(encodeType type, zval *data, int style) { xmlNodePtr ret; + zval tmp; ret = xmlNewNode(NULL, "BOGUS"); - FIND_ZVAL_NULL(data, ret); + FIND_ZVAL_NULL(data, ret, style); + + tmp = *data; + zval_copy_ctor(&tmp); + if (Z_TYPE(tmp) != IS_LONG) { + convert_to_long(&tmp); + } + convert_to_string(&tmp); + xmlNodeSetContentLen(ret, Z_STRVAL(tmp), Z_STRLEN(tmp)); + zval_dtor(&tmp); + + if(style == SOAP_ENCODED) + set_ns_and_type(ret, type); + return ret; +} + +xmlNodePtr to_xml_double(encodeType type, zval *data, int style) +{ + xmlNodePtr ret; + zval tmp; + + ret = xmlNewNode(NULL, "BOGUS"); + FIND_ZVAL_NULL(data, ret, style); + + tmp = *data; + zval_copy_ctor(&tmp); + if (Z_TYPE(tmp) != IS_DOUBLE) { + convert_to_double(&tmp); + } + convert_to_string(&tmp); + xmlNodeSetContentLen(ret, Z_STRVAL(tmp), Z_STRLEN(tmp)); + zval_dtor(&tmp); - convert_to_long(data); - convert_to_string(data); - xmlNodeSetContentLen(ret, Z_STRVAL_P(data), Z_STRLEN_P(data)); - if(style == SOAP_ENCODED) set_ns_and_type(ret, type); return ret; @@ -366,15 +408,19 @@ zval *to_zval_bool(encodeType type, xmlNodePtr data) MAKE_STD_ZVAL(ret); FIND_XML_NULL(data, ret); - if(stricmp(data->children->content,"true") == 0 || - stricmp(data->children->content,"t") == 0 || - strcmp(data->children->content,"1") == 0) - { - ZVAL_BOOL(ret, 1); - } - else - { - ZVAL_BOOL(ret, 0); + if (data && data->children && data->children->content) { + if(stricmp(data->children->content,"true") == 0 || + stricmp(data->children->content,"t") == 0 || + strcmp(data->children->content,"1") == 0) + { + ZVAL_BOOL(ret, 1); + } + else + { + ZVAL_BOOL(ret, 0); + } + } else { + ZVAL_NULL(ret); } return ret; } @@ -382,16 +428,27 @@ zval *to_zval_bool(encodeType type, xmlNodePtr data) xmlNodePtr to_xml_bool(encodeType type, zval *data, int style) { xmlNodePtr ret; + zval tmp; ret = xmlNewNode(NULL, "BOGUS"); - FIND_ZVAL_NULL(data, ret); + FIND_ZVAL_NULL(data, ret, style); + + if (Z_TYPE_P(data) != IS_BOOL) { + tmp = *data; + zval_copy_ctor(&tmp); + convert_to_boolean(data); + data = &tmp; + } - convert_to_boolean(data); if(data->value.lval == 1) xmlNodeSetContent(ret, "1"); else xmlNodeSetContent(ret, "0"); + if (data == &tmp) { + zval_dtor(&tmp); + } + if(style == SOAP_ENCODED) set_ns_and_type(ret, type); return ret; @@ -411,10 +468,10 @@ xmlNodePtr to_xml_null(encodeType type, zval *data, int style) xmlNodePtr ret; ret = xmlNewNode(NULL, "BOGUS"); - FIND_ZVAL_NULL(data, ret); - + FIND_ZVAL_NULL(data, ret, style); + if(style == SOAP_ENCODED) - xmlSetProp(ret, "xsi:null", "1"); + xmlSetProp(ret, "xsi:nil", "1"); return ret; } @@ -423,28 +480,47 @@ zval *to_zval_object(encodeType type, xmlNodePtr data) { zval *ret; xmlNodePtr trav; - encodePtr enc; + sdlPtr sdl; + sdlTypePtr sdlType = NULL; TSRMLS_FETCH(); MAKE_STD_ZVAL(ret); FIND_XML_NULL(data, ret); + sdl = SOAP_GLOBAL(sdl); + if (sdl && type.sdl_type) { + sdlType = type.sdl_type; + } + object_init(ret); trav = data->children; - enc = get_conversion(UNKNOWN_TYPE); - do - { - if(trav->type == XML_ELEMENT_NODE) - { + while (trav != NULL) { + if(trav->type == XML_ELEMENT_NODE) { + sdlTypePtr *element; + encodePtr enc = NULL; zval *tmpVal; + xmlAttrPtr typeAttr = get_attribute(trav->properties,"type"); + if (typeAttr != NULL && typeAttr->children && typeAttr->children->content) { + enc = get_encoder_from_prefix(sdl, trav, typeAttr->children->content); + } + if (enc == NULL && sdlType != NULL && sdlType->elements != NULL && trav->name != NULL && + zend_hash_find(sdlType->elements, (char*)trav->name, strlen(trav->name)+1,(void **)&element) == SUCCESS) { + enc = (*element)->encode; + } + if (enc == NULL) { + enc = get_conversion(UNKNOWN_TYPE); + } + tmpVal = master_to_zval(enc, trav); +#ifdef ZEND_ENGINE_2 + tmpVal->refcount--; +#endif add_property_zval(ret, (char *)trav->name, tmpVal); } + trav = trav->next; } - while(trav = trav->next); - return ret; } @@ -456,18 +532,21 @@ xmlNodePtr to_xml_object(encodeType type, zval *data, int style) TSRMLS_FETCH(); /* Special handling of class SoapVar */ - if(data && Z_TYPE_P(data) == IS_OBJECT && !strcmp(Z_OBJCE_P(data)->name, soap_var_class_entry.name)) + if(data && Z_TYPE_P(data) == IS_OBJECT && Z_OBJCE_P(data) == soap_var_class_entry) { zval **ztype, **zdata, **zns, **zstype, **zname, **znamens; encodePtr enc; if(zend_hash_find(Z_OBJPROP_P(data), "enc_type", sizeof("enc_type"), (void **)&ztype) == FAILURE) php_error(E_ERROR, "error encoding SoapVar"); - if(zend_hash_find(Z_OBJPROP_P(data), "enc_value", sizeof("enc_value"), (void **)&zdata) == FAILURE) - php_error(E_ERROR, "error encoding SoapVar"); enc = get_conversion(Z_LVAL_P(*ztype)); - xmlParam = master_to_xml(enc, *zdata, style); + + if(zend_hash_find(Z_OBJPROP_P(data), "enc_value", sizeof("enc_value"), (void **)&zdata) == FAILURE) { + xmlParam = master_to_xml(enc, NULL, style); + } else { + xmlParam = master_to_xml(enc, *zdata, style); + } if(zend_hash_find(Z_OBJPROP_P(data), "enc_stype", sizeof("enc_stype"), (void **)&zstype) == SUCCESS) { @@ -494,7 +573,7 @@ xmlNodePtr to_xml_object(encodeType type, zval *data, int style) else { xmlParam = xmlNewNode(NULL, "BOGUS"); - FIND_ZVAL_NULL(data, xmlParam); + FIND_ZVAL_NULL(data, xmlParam, style); if(Z_TYPE_P(data) == IS_OBJECT) { @@ -520,7 +599,7 @@ xmlNodePtr to_xml_object(encodeType type, zval *data, int style) zend_hash_move_forward(prop); } } - + if(style == SOAP_ENCODED) set_ns_and_type(xmlParam, type); } @@ -535,13 +614,10 @@ xmlNodePtr guess_array_map(encodeType type, zval *data, int style) if(data && Z_TYPE_P(data) == IS_ARRAY) { - if(zend_hash_num_elements(Z_ARRVAL_P(data)) > 0) - { - if(is_map(data)) - enc = get_conversion(APACHE_MAP); - else - enc = get_conversion(SOAP_ENC_ARRAY); - } + if(is_map(data)) + enc = get_conversion(APACHE_MAP); + else + enc = get_conversion(SOAP_ENC_ARRAY); } if(!enc) enc = get_conversion(IS_NULL); @@ -558,13 +634,13 @@ xmlNodePtr to_xml_array(encodeType type, zval *data, int style) xmlParam = xmlNewNode(NULL,"BOGUS"); - FIND_ZVAL_NULL(data, xmlParam); + FIND_ZVAL_NULL(data, xmlParam, style); if(Z_TYPE_P(data) == IS_ARRAY) { i = zend_hash_num_elements(Z_ARRVAL_P(data)); - if(style == SOAP_ENCODED) + if(i > 0 && style == SOAP_ENCODED) { get_array_type(data, &array_type TSRMLS_CC); smart_str_append(&array_type_and_size, &array_type); @@ -604,31 +680,157 @@ xmlNodePtr to_xml_array(encodeType type, zval *data, int style) return xmlParam; } +static xmlNodePtr add_zval_array_elements(zval* ret, + sdlPtr sdl, + encodePtr enc, + int dimension, + int* dims, + xmlNodePtr data) +{ + int i; + if (dimension == 1) { + for (i = 0; i < dims[0]; i++) { + zval *tmpVal; + encodePtr typeEnc = NULL; + xmlAttrPtr type = get_attribute(data->properties,"type"); + if (type != NULL && type->children && type->children->content) { + typeEnc = get_encoder_from_prefix(sdl, data, type->children->content); + } + if (typeEnc) { + tmpVal = master_to_zval(typeEnc, data); + } else { + tmpVal = master_to_zval(enc, data); + } + zend_hash_next_index_insert(Z_ARRVAL_P(ret), &tmpVal, sizeof(zval*), NULL); + if (data != NULL) { + do { + data = data->next; + } while (data != NULL && data->type != XML_ELEMENT_NODE); + } + } + } else { + for (i = 0; i < dims[0]; i++) { + zval *tmpVal; + MAKE_STD_ZVAL(tmpVal); + array_init(tmpVal); + data = add_zval_array_elements(tmpVal,sdl,enc,dimension-1,dims+1,data); + zend_hash_next_index_insert(Z_ARRVAL_P(ret), &tmpVal, sizeof(zval*), NULL); + } + } + return data; +} + zval *to_zval_array(encodeType type, xmlNodePtr data) { zval *ret; xmlNodePtr trav; - encodePtr enc; + encodePtr enc = NULL; + int dimension = 1; + int* dims = NULL; + xmlAttrPtr arrayTypeAttr; + sdlPtr sdl; + TSRMLS_FETCH(); MAKE_STD_ZVAL(ret); FIND_XML_NULL(data, ret); + sdl = SOAP_GLOBAL(sdl); + + if (data && + (arrayTypeAttr = get_attribute(data->properties,"arrayType")) && + arrayTypeAttr->children && + arrayTypeAttr->children->content) { + char *type, *end, *ns; + xmlNsPtr nsptr; + + parse_namespace(arrayTypeAttr->children->content, &type, &ns); + nsptr = xmlSearchNs(arrayTypeAttr->doc, arrayTypeAttr->parent, ns); + + end = strrchr(type,'['); + if (end) { + int i; + char *tmp = end+1; + *end = '\0'; + end++; + while (*tmp != ']' && *tmp != '\0') { + if (*tmp == ',') { + dimension++; + } + tmp++; + } + dims = emalloc(sizeof(int)*dimension); + memset(dims,0,sizeof(int)*dimension); + tmp = end; i = 0; + while (*tmp != ']' && *tmp != '\0') { + if (*tmp >= '0' && *tmp <= '9') { + dims[i] = (dims[i]*10)+(*tmp-'0'); + } else if (*tmp == ',') { + i++; + } + tmp++; + } + } + if(nsptr != NULL) { + enc = get_encoder(SOAP_GLOBAL(sdl), nsptr->href, type); + } + efree(type); + if (ns) efree(ns); + } + if (enc == NULL) { + enc = get_conversion(UNKNOWN_TYPE); + } array_init(ret); - trav = data->children; - - enc = get_conversion(UNKNOWN_TYPE); - while(trav) - { - if(trav->type == XML_ELEMENT_NODE) - { - zval *tmpVal; - tmpVal = master_to_zval(enc, trav); - zend_hash_next_index_insert(Z_ARRVAL_P(ret), &tmpVal, sizeof(zval *), NULL); + if (dims == NULL) { + trav = data->children; + while(trav) { + if(trav->type == XML_ELEMENT_NODE) { + zval *tmpVal; + encodePtr typeEnc = NULL; + xmlAttrPtr type = get_attribute(trav->properties,"type"); + if (type != NULL && type->children && type->children->content) { + typeEnc = get_encoder_from_prefix(sdl, trav, type->children->content); + } + if (typeEnc) { + tmpVal = master_to_zval(typeEnc, trav); + } else { + tmpVal = master_to_zval(enc, trav); + } + zend_hash_next_index_insert(Z_ARRVAL_P(ret), &tmpVal, sizeof(zval *), NULL); + } + trav = trav->next; + } + } else { + trav = data->children; + while (trav != NULL && trav->type != XML_ELEMENT_NODE) { + trav = trav->next; } - trav = trav->next; + add_zval_array_elements(ret, sdl, enc, dimension, dims, trav); + } +/* + if (data) { + if (dims == NULL && dimension <= 1) { + trav = data->children; + while(trav) { + if(trav->type == XML_ELEMENT_NODE) { + zval *tmpVal; + tmpVal = master_to_zval(enc, trav); + zend_hash_next_index_insert(Z_ARRVAL_P(ret), &tmpVal, sizeof(zval *), NULL); + } + trav = trav->next; + } + } else { + trav = data->children; + while (trav != NULL && trav->type != XML_ELEMENT_NODE) { + trav = trav->next; + } + add_zval_array_elements(ret, enc, dimension, dims, trav); + } + } +*/ + if (dims) { + efree(dims); } - return ret; } @@ -640,7 +842,7 @@ xmlNodePtr to_xml_map(encodeType type, zval *data, int style) TSRMLS_FETCH(); xmlParam = xmlNewNode(NULL, "BOGUS"); - FIND_ZVAL_NULL(data, xmlParam); + FIND_ZVAL_NULL(data, xmlParam, style); if(Z_TYPE_P(data) == IS_ARRAY) { @@ -709,33 +911,36 @@ zval *to_zval_map(encodeType type, xmlNodePtr data) MAKE_STD_ZVAL(ret); FIND_XML_NULL(data, ret); - array_init(ret); - trav = data->children; + if (data && data->children) { + array_init(ret); + trav = data->children; - enc = get_conversion(UNKNOWN_TYPE); - trav = data->children; - FOREACHNODE(trav, "item", item) - { - xmlKey = get_node(item->children, "key"); - if(!xmlKey) - php_error(E_ERROR, "Error encoding apache map, missing key"); + enc = get_conversion(UNKNOWN_TYPE); + trav = data->children; + FOREACHNODE(trav, "item", item) + { + xmlKey = get_node(item->children, "key"); + if(!xmlKey) + php_error(E_ERROR, "Error encoding apache map, missing key"); - xmlValue = get_node(item->children, "value"); - if(!xmlKey) - php_error(E_ERROR, "Error encoding apache map, missing value"); + xmlValue = get_node(item->children, "value"); + if(!xmlKey) + php_error(E_ERROR, "Error encoding apache map, missing value"); - key = master_to_zval(enc, xmlKey); - value = master_to_zval(enc, xmlValue); + key = master_to_zval(enc, xmlKey); + value = master_to_zval(enc, xmlValue); - if(Z_TYPE_P(key) == IS_STRING) - zend_hash_update(Z_ARRVAL_P(ret), Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, &value, sizeof(zval *), NULL); - else if(Z_TYPE_P(key) == IS_LONG) - zend_hash_index_update(Z_ARRVAL_P(ret), Z_LVAL_P(key), &value, sizeof(zval *), NULL); - else - php_error(E_ERROR, "Error encoding apache map, only Strings or Longs are allowd as keys"); + if(Z_TYPE_P(key) == IS_STRING) + zend_hash_update(Z_ARRVAL_P(ret), Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, &value, sizeof(zval *), NULL); + else if(Z_TYPE_P(key) == IS_LONG) + zend_hash_index_update(Z_ARRVAL_P(ret), Z_LVAL_P(key), &value, sizeof(zval *), NULL); + else + php_error(E_ERROR, "Error encoding apache map, only Strings or Longs are allowd as keys"); + } + ENDFOREACH(trav); + } else { + ZVAL_NULL(ret); } - ENDFOREACH(trav); - return ret; } @@ -760,14 +965,21 @@ zval *guess_zval_convert(encodeType type, xmlNodePtr data) data = check_and_resolve_href(data); - if(data == NULL || data->children == NULL) + if (data == NULL) { + enc = get_conversion(IS_NULL); + } else if (data->properties && get_attribute(data->properties, "nil")) { enc = get_conversion(IS_NULL); + } else { tmpattr = get_attribute(data->properties,"type"); if(tmpattr != NULL) { - enc = get_conversion_from_type(data, tmpattr->children->content); + if (tmpattr->children) { + enc = get_conversion_from_type(data, tmpattr->children->content); + } else { + enc = get_conversion_from_type(data, ""); + } /* if(enc == NULL) php_error(E_ERROR, "Error (Don't know how to encode/decode \"%s\")", tmpattr->children->content); @@ -786,15 +998,14 @@ zval *guess_zval_convert(encodeType type, xmlNodePtr data) { enc = get_conversion(XSD_STRING); trav = data->children; - do - { + while (trav != NULL) { if(trav->type == XML_ELEMENT_NODE) { enc = get_conversion(SOAP_ENC_OBJECT); break; } + trav = trav->next; } - while(trav = trav->next); } } } @@ -813,23 +1024,31 @@ xmlNodePtr to_xml_datetime_ex(encodeType type, zval *data, char *format, int sty xmlNodePtr xmlParam; xmlParam = xmlNewNode(NULL, "BOGUS"); - FIND_ZVAL_NULL(data, xmlParam); + FIND_ZVAL_NULL(data, xmlParam, style); - timestamp = Z_LVAL_P(data); + if (Z_TYPE_P(data) == IS_LONG) { + timestamp = Z_LVAL_P(data); + /*time(×tamp);*/ + ta = php_localtime_r(×tamp, &tmbuf); - time(×tamp); - ta = php_localtime_r(×tamp, &tmbuf); + buf = (char *) emalloc(buf_len); + while ((real_len = strftime(buf, buf_len, format, ta)) == buf_len || real_len == 0) + { + buf_len *= 2; + buf = (char *) erealloc(buf, buf_len); + if(!--max_reallocs) break; + } - buf = (char *) emalloc(buf_len); - while ((real_len = strftime(buf, buf_len, format, ta)) == buf_len || real_len == 0) - { - buf_len *= 2; - buf = (char *) erealloc(buf, buf_len); - if(!--max_reallocs) break; - } + xmlNodeSetContent(xmlParam, buf); + efree(buf); + } else if (Z_TYPE_P(data) == IS_STRING) { + buf = malloc(Z_STRLEN_P(data)+1); + strcpy(buf, Z_STRVAL_P(data)); - xmlNodeSetContent(xmlParam, buf); - efree(buf); + xmlNodeSetContentLen(xmlParam, buf, Z_STRLEN_P(data)); + } else { + xmlSetProp(xmlParam, "xsi:nil", "1"); + } if(style == SOAP_ENCODED) set_ns_and_type(xmlParam, type); @@ -966,20 +1185,20 @@ encodePtr get_conversion_ex(HashTable *encoding, int encode) return *enc; } -encodePtr get_conversion_from_href_type_ex(HashTable *encoding, char *type, int len) +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, type, len + 1, (void **)&enc) == FAILURE) + 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, char *type) +encodePtr get_conversion_from_type_ex(HashTable *encoding, xmlNodePtr node, const char *type) { encodePtr *enc = NULL; xmlNsPtr nsptr; @@ -1000,14 +1219,14 @@ encodePtr get_conversion_from_type_ex(HashTable *encoding, xmlNodePtr node, char if(zend_hash_find(encoding, nscat.c, nscat.len + 1, (void **)&enc) == FAILURE) { - if(zend_hash_find(encoding, type, strlen(type) + 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, type, strlen(type) + 1, (void **)&enc) == FAILURE) + if(zend_hash_find(encoding, (char*)type, strlen(type) + 1, (void **)&enc) == FAILURE) enc = NULL; } @@ -1035,7 +1254,6 @@ void get_array_type(zval *array, smart_str *type TSRMLS_DC) { HashTable *ht = HASH_OF(array); int i, count, cur_type, prev_type, different; - char *name = NULL; zval **tmp; /* TSRMLS_FETCH();*/ @@ -1051,7 +1269,7 @@ void get_array_type(zval *array, smart_str *type TSRMLS_DC) { zend_hash_get_current_data(ht, (void **)&tmp); - if(Z_TYPE_PP(tmp) == IS_OBJECT && !strcmp(Z_OBJCE_PP(tmp)->name, soap_var_class_entry.name)) + if(Z_TYPE_PP(tmp) == IS_OBJECT && Z_OBJCE_PP(tmp) == soap_var_class_entry) { zval **ztype; @@ -1132,4 +1350,3 @@ void delete_encoder(void *encode) delete_mapping(t->details.map); free(t); } - |