diff options
Diffstat (limited to 'ext/soap/php_encoding.c')
-rw-r--r-- | ext/soap/php_encoding.c | 72 |
1 files changed, 24 insertions, 48 deletions
diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index 2bba8acfa5..b6225270e8 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -361,7 +361,6 @@ static zend_bool soap_check_xml_ref(zval **data, xmlNodePtr node TSRMLS_DC) static xmlNodePtr master_to_xml_int(encodePtr encode, zval *data, int style, xmlNodePtr parent, int check_class_map) { xmlNodePtr node = NULL; - int add_type = 0; TSRMLS_FETCH(); /* Special handling of class SoapVar */ @@ -448,21 +447,20 @@ static xmlNodePtr master_to_xml_int(encodePtr encode, zval *data, int style, xml zend_binary_strncasecmp(ce->name, ce->name_length, Z_STRVAL_PP(tmp), ce->name_length, ce->name_length) == 0 && zend_hash_get_current_key_ex(SOAP_GLOBAL(class_map), &type_name, &type_len, &idx, 0, &pos) == HASH_KEY_IS_STRING) { - /* TODO: namespace isn't stored */ - encodePtr enc = NULL; - if (SOAP_GLOBAL(sdl)) { - enc = get_encoder(SOAP_GLOBAL(sdl), SOAP_GLOBAL(sdl)->target_ns, type_name); - if (!enc) { - enc = find_encoder_by_type_name(SOAP_GLOBAL(sdl), type_name); - } - } - if (enc) { - if (encode != enc && style == SOAP_LITERAL) { - add_type = 1; - } - encode = enc; - } - break; + /* TODO: namespace isn't stored */ + encodePtr enc = NULL; + if (SOAP_GLOBAL(sdl)) { + enc = get_encoder(SOAP_GLOBAL(sdl), SOAP_GLOBAL(sdl)->target_ns, type_name); + } + if (enc) { + encode = enc; + } else if (SOAP_GLOBAL(sdl)) { + enc = find_encoder_by_type_name(SOAP_GLOBAL(sdl), type_name); + if (enc) { + encode = enc; + } + } + break; } } } @@ -487,9 +485,6 @@ static xmlNodePtr master_to_xml_int(encodePtr encode, zval *data, int style, xml } if (encode->to_xml) { node = encode->to_xml(&encode->details, data, style, parent); - if (add_type) { - set_ns_and_type(node, &encode->details); - } } } return node; @@ -1020,15 +1015,7 @@ static zval *to_zval_double(encodeTypePtr type, xmlNodePtr data) Z_DVAL_P(ret) = dval; break; default: - if (strncasecmp((char*)data->children->content, "NaN", sizeof("NaN")-1) == 0) { - ZVAL_DOUBLE(ret, php_get_nan()); - } else if (strncasecmp((char*)data->children->content, "INF", sizeof("INF")-1) == 0) { - ZVAL_DOUBLE(ret, php_get_inf()); - } else if (strncasecmp((char*)data->children->content, "-INF", sizeof("-INF")-1) == 0) { - ZVAL_DOUBLE(ret, -php_get_inf()); - } else { - soap_error0(E_ERROR, "Encoding: Violation of encoding rules"); - } + soap_error0(E_ERROR, "Encoding: Violation of encoding rules"); } } else { soap_error0(E_ERROR, "Encoding: Violation of encoding rules"); @@ -1458,7 +1445,7 @@ static zval *to_zval_object_ex(encodeTypePtr type, xmlNodePtr data, zend_class_e sdlPtr sdl; sdlTypePtr sdlType = type->sdl_type; zend_class_entry *ce = ZEND_STANDARD_CLASS_DEF_PTR; - zval *redo_any = NULL; + zend_bool redo_any = 0; TSRMLS_FETCH(); if (pce) { @@ -1530,7 +1517,10 @@ static zval *to_zval_object_ex(encodeTypePtr type, xmlNodePtr data, zend_class_e if (soap_check_xml_ref(&ret, data TSRMLS_CC)) { return ret; } - redo_any = get_zval_property(ret, "any" TSRMLS_CC); + if (get_zval_property(ret, "any" TSRMLS_CC) != NULL) { + unset_zval_property(ret, "any" TSRMLS_CC); + redo_any = 1; + } if (Z_TYPE_P(ret) == IS_OBJECT && ce != ZEND_STANDARD_CLASS_DEF_PTR) { zend_object *zobj = zend_objects_get_address(ret TSRMLS_CC); zobj->ce = ce; @@ -1556,17 +1546,10 @@ static zval *to_zval_object_ex(encodeTypePtr type, xmlNodePtr data, zend_class_e object_init_ex(ret, ce); } if (sdlType->model) { - if (redo_any) { - Z_ADDREF_P(redo_any); - unset_zval_property(ret, "any" TSRMLS_CC); - } model_to_zval_object(ret, sdlType->model, data, sdl TSRMLS_CC); - if (redo_any) { - if (get_zval_property(ret, "any" TSRMLS_CC) == NULL) { - model_to_zval_any(ret, data->children TSRMLS_CC); - } - zval_ptr_dtor(&redo_any); - } + if (redo_any && get_zval_property(ret, "any" TSRMLS_CC) == NULL) { + model_to_zval_any(ret, data->children TSRMLS_CC); + } } if (sdlType->attributes) { sdlAttributePtr *attr; @@ -1671,13 +1654,6 @@ static int model_to_xml_object(xmlNodePtr node, sdlContentModelPtr model, zval * encodePtr enc; data = get_zval_property(object, model->u.element->name TSRMLS_CC); - if (data && - Z_TYPE_P(data) == IS_NULL && - !model->u.element->nillable && - model->min_occurs > 0 && - !strict) { - return 0; - } if (data) { enc = model->u.element->encode; if ((model->max_occurs == -1 || model->max_occurs > 1) && @@ -2993,7 +2969,7 @@ static xmlNodePtr to_xml_datetime_ex(encodeTypePtr type, zval *data, char *forma #ifdef HAVE_TM_GMTOFF snprintf(tzbuf, sizeof(tzbuf), "%c%02d:%02d", (ta->tm_gmtoff < 0) ? '-' : '+', abs(ta->tm_gmtoff / 3600), abs( (ta->tm_gmtoff % 3600) / 60 )); #else -# if defined(__CYGWIN__) || defined(NETWARE) +# ifdef __CYGWIN__ snprintf(tzbuf, sizeof(tzbuf), "%c%02d:%02d", ((ta->tm_isdst ? _timezone - 3600:_timezone)>0)?'-':'+', abs((ta->tm_isdst ? _timezone - 3600 : _timezone) / 3600), abs(((ta->tm_isdst ? _timezone - 3600 : _timezone) % 3600) / 60)); # else snprintf(tzbuf, sizeof(tzbuf), "%c%02d:%02d", ((ta->tm_isdst ? timezone - 3600:timezone)>0)?'-':'+', abs((ta->tm_isdst ? timezone - 3600 : timezone) / 3600), abs(((ta->tm_isdst ? timezone - 3600 : timezone) % 3600) / 60)); |