dmitry Thu Aug 3 16:13:06 2006 UTC Modified files: /php-src/ext/soap php_packet_soap.c soap.c Log: Unicode support.
http://cvs.php.net/viewvc.cgi/php-src/ext/soap/php_packet_soap.c?r1=1.47&r2=1.48&diff_format=u Index: php-src/ext/soap/php_packet_soap.c diff -u php-src/ext/soap/php_packet_soap.c:1.47 php-src/ext/soap/php_packet_soap.c:1.48 --- php-src/ext/soap/php_packet_soap.c:1.47 Thu Jul 27 15:23:04 2006 +++ php-src/ext/soap/php_packet_soap.c Thu Aug 3 16:13:06 2006 @@ -17,7 +17,7 @@ | Dmitry Stogov <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: php_packet_soap.c,v 1.47 2006/07/27 15:23:04 dmitry Exp $ */ +/* $Id: php_packet_soap.c,v 1.48 2006/08/03 16:13:06 dmitry Exp $ */ #include "php_soap.h" @@ -191,26 +191,12 @@ tmp = get_node(fault->children, "faultstring"); if (tmp != NULL && tmp->children != NULL) { - zval *zv = master_to_zval(get_conversion(IS_STRING), tmp); - if (Z_TYPE_P(zv) == IS_STRING) { - faultstring = Z_STRVAL_P(zv); - FREE_ZVAL(zv); - } else { - faultstring = soap_unicode_to_string(Z_USTRVAL_P(zv), Z_USTRLEN_P(zv) TSRMLS_CC); - zval_ptr_dtor(&zv); - } + faultstring = (char*)tmp->children->content; } tmp = get_node(fault->children, "faultactor"); if (tmp != NULL && tmp->children != NULL) { - zval *zv = master_to_zval(get_conversion(IS_STRING), tmp); - if (Z_TYPE_P(zv) == IS_STRING) { - faultactor = Z_STRVAL_P(zv); - FREE_ZVAL(zv); - } else { - faultactor = soap_unicode_to_string(Z_USTRVAL_P(zv), Z_USTRLEN_P(zv) TSRMLS_CC); - zval_ptr_dtor(&zv); - } + faultactor = (char*)tmp->children->content; } tmp = get_node(fault->children, "detail"); @@ -231,14 +217,7 @@ /* TODO: lang attribute */ tmp = get_node(tmp->children,"Text"); if (tmp != NULL && tmp->children != NULL) { - zval *zv = master_to_zval(get_conversion(IS_STRING), tmp); - if (Z_TYPE_P(zv) == IS_STRING) { - faultstring = Z_STRVAL_P(zv); - FREE_ZVAL(zv); - } else { - faultstring = soap_unicode_to_string(Z_USTRVAL_P(zv), Z_USTRLEN_P(zv) TSRMLS_CC); - zval_ptr_dtor(&zv); - } + faultstring = (char*)tmp->children->content; } } @@ -248,12 +227,6 @@ } } add_soap_fault(this_ptr, faultcode, faultstring, faultactor, details TSRMLS_CC); - if (faultstring) { - efree(faultstring); - } - if (faultactor) { - efree(faultactor); - } if (details) { details->refcount--; } http://cvs.php.net/viewvc.cgi/php-src/ext/soap/soap.c?r1=1.200&r2=1.201&diff_format=u Index: php-src/ext/soap/soap.c diff -u php-src/ext/soap/soap.c:1.200 php-src/ext/soap/soap.c:1.201 --- php-src/ext/soap/soap.c:1.200 Tue Aug 1 16:10:25 2006 +++ php-src/ext/soap/soap.c Thu Aug 3 16:13:06 2006 @@ -17,7 +17,7 @@ | Dmitry Stogov <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: soap.c,v 1.200 2006/08/01 16:10:25 dmitry Exp $ */ +/* $Id: soap.c,v 1.201 2006/08/03 16:13:06 dmitry Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -1007,10 +1007,13 @@ SoapFault constructor */ PHP_METHOD(SoapFault, SoapFault) { - char *fault_string = NULL, *fault_code = NULL, *fault_actor = NULL, *name = NULL, *fault_code_ns = NULL; - int fault_string_len, fault_actor_len, name_len, fault_code_len = 0; + zstr fault_string = NULL_ZSTR; + zstr fault_actor = NULL_ZSTR; + zstr name = NULL_ZSTR; + char *fault_code = NULL, *fault_code_ns = NULL; + int fault_string_len, fault_actor_len, name_len; zval *code = NULL, *details = NULL, *headerfault = NULL; - zend_uchar name_type, fault_string_type, fault_actor_type, fault_code_type, fault_code_ns_type; + zend_uchar name_type, fault_string_type, fault_actor_type; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zt|t!z!t!z", &code, @@ -1022,15 +1025,9 @@ php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters"); } - fault_code_type = Z_TYPE_P(code); - fault_code_ns_type = IS_NULL; if (Z_TYPE_P(code) == IS_NULL) { - } else if (Z_TYPE_P(code) == IS_STRING) { - fault_code = Z_STRVAL_P(code); - fault_code_len = Z_STRLEN_P(code); - } else if (Z_TYPE_P(code) == IS_UNICODE) { - fault_code = soap_unicode_to_string(Z_USTRVAL_P(code), Z_USTRLEN_P(code) TSRMLS_CC); - fault_code_len = strlen(fault_code); + } else if (Z_TYPE_P(code) == IS_STRING || Z_TYPE_P(code) == IS_UNICODE) { + fault_code = soap_encode_string(code, NULL TSRMLS_CC); } else if (Z_TYPE_P(code) == IS_ARRAY && zend_hash_num_elements(Z_ARRVAL_P(code)) == 2) { zval **t_ns, **t_code; @@ -1040,60 +1037,48 @@ zend_hash_get_current_data(Z_ARRVAL_P(code), (void**)&t_code); if ((Z_TYPE_PP(t_ns) == IS_STRING || Z_TYPE_PP(t_ns) == IS_UNICODE) && (Z_TYPE_PP(t_code) == IS_STRING || Z_TYPE_PP(t_code) == IS_UNICODE)) { - fault_code_ns_type = Z_TYPE_PP(t_ns); - if (Z_TYPE_PP(t_ns) == IS_STRING) { - fault_code_ns = Z_STRVAL_PP(t_ns); - } else { - fault_code_ns = soap_unicode_to_string(Z_USTRVAL_PP(t_ns), Z_USTRLEN_PP(t_ns) TSRMLS_CC); - } - fault_code_type = Z_TYPE_PP(t_code); - if (Z_TYPE_PP(t_code) == IS_STRING) { - fault_code = Z_STRVAL_PP(t_code); - fault_code_len = Z_STRLEN_PP(t_code); - } else { - fault_code = soap_unicode_to_string(Z_USTRVAL_PP(t_code), Z_USTRLEN_PP(t_code) TSRMLS_CC); - fault_code_len = strlen(fault_code); - } + fault_code_ns = soap_encode_string(*t_ns, NULL TSRMLS_CC); + fault_code = soap_encode_string(*t_code, NULL TSRMLS_CC); } else { php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters. Invalid fault code."); } } else { php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters. Invalid fault code."); } - if (fault_code != NULL && fault_code_len == 0) { + if (fault_code != NULL && !fault_code[0]) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters. Invalid fault code."); } - if (name != NULL && name_len == 0) { - name = NULL; + if (name.v != NULL && name_len == 0) { + name.v = NULL; } - if (name && name_type == IS_UNICODE) { - name = soap_unicode_to_string((UChar*)name, name_len TSRMLS_CC); + if (name.v) { + name.s = soap_encode_string_ex(name_type, name, name_len TSRMLS_CC); } - if (fault_string && fault_string_type == IS_UNICODE) { - fault_string = soap_unicode_to_string((UChar*)fault_string, fault_string_len TSRMLS_CC); + if (fault_string.v) { + fault_string.s = soap_encode_string_ex(fault_string_type, fault_string, fault_string_len TSRMLS_CC); } - if (fault_actor && fault_actor_type == IS_UNICODE) { - fault_actor = soap_unicode_to_string((UChar*)fault_actor, fault_actor_len TSRMLS_CC); + if (fault_actor.v) { + fault_actor.s = soap_encode_string_ex(fault_actor_type, fault_actor, fault_actor_len TSRMLS_CC); } - set_soap_fault(this_ptr, fault_code_ns, fault_code, fault_string, fault_actor, details, name TSRMLS_CC); + set_soap_fault(this_ptr, fault_code_ns, fault_code, fault_string.s, fault_actor.s, details, name.s TSRMLS_CC); if (headerfault != NULL) { add_property_zval(this_ptr, "headerfault", headerfault); } - if (fault_code && fault_code_type == IS_UNICODE) { + if (fault_code) { efree(fault_code); } - if (fault_code_ns && fault_code_ns_type == IS_UNICODE) { + if (fault_code_ns) { efree(fault_code_ns); } - if (name && name_type == IS_UNICODE) { - efree(name); + if (name.s) { + efree(name.s); } - if (fault_string && fault_string_type == IS_UNICODE) { - efree(fault_string); + if (fault_string.s) { + efree(fault_string.s); } - if (fault_actor && fault_actor_type == IS_UNICODE) { - efree(fault_actor); + if (fault_actor.s) { + efree(fault_actor.s); } } /* }}} */ @@ -1118,7 +1103,7 @@ file = zend_read_property(soap_fault_class_entry, this_ptr, "file", sizeof("file")-1, 1 TSRMLS_CC); line = zend_read_property(soap_fault_class_entry, this_ptr, "line", sizeof("line")-1, 1 TSRMLS_CC); - ZVAL_STRINGL(&fname, "gettraceasstring", sizeof("gettraceasstring")-1, 0); + ZVAL_ASCII_STRINGL(&fname, "gettraceasstring", sizeof("gettraceasstring")-1, 1); fci.size = sizeof(fci); fci.function_table = &Z_OBJCE_P(getThis())->function_table; @@ -1131,14 +1116,20 @@ fci.no_separation = 1; zend_call_function(&fci, NULL TSRMLS_CC); + zval_dtor(&fname); - len = spprintf(&str, 0, "SoapFault exception: [%s] %s in %s:%ld\nStack trace:\n%s", - Z_STRVAL_P(faultcode), Z_STRVAL_P(faultstring), Z_STRVAL_P(file), Z_LVAL_P(line), + len = spprintf(&str, 0, "SoapFault exception: [%R] %R in %s:%ld\nStack trace:\n%s", + Z_TYPE_P(faultcode), Z_UNIVAL_P(faultcode), + Z_TYPE_P(faultstring), Z_UNIVAL_P(faultstring), + Z_STRVAL_P(file), Z_LVAL_P(line), Z_STRLEN_P(trace) ? Z_STRVAL_P(trace) : "#0 {main}\n"); zval_ptr_dtor(&trace); - RETURN_STRINGL(str, len, 0); + RETVAL_STRINGL(str, len, 0); + if (UG(unicode)) { + zval_string_to_unicode(return_value TSRMLS_CC); + } } /* }}} */ @@ -2167,19 +2158,49 @@ Issue SoapFault indicating an error */ PHP_METHOD(SoapServer, fault) { - char *code, *string, *actor=NULL, *name=NULL; + zstr code, string; + zstr actor=NULL_ZSTR; + zstr name=NULL_ZSTR; int code_len, string_len, actor_len, name_len; + zend_uchar code_type, string_type, actor_type, name_type; zval* details = NULL; SOAP_SERVER_BEGIN_CODE(); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|szs", - &code, &code_len, &string, &string_len, &actor, &actor_len, &details, - &name, &name_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "tt|tzt", + &code, &code_len, &code_type, + &string, &string_len, &string_type, + &actor, &actor_len, &actor_type, + &details, + &name, &name_len, &name_type) == FAILURE) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters"); } - soap_server_fault(code, string, actor, details, name TSRMLS_CC); + if (code.v) { + code.s = soap_encode_string_ex(code_type, code, code_len TSRMLS_CC); + } + if (name.v) { + name.s = soap_encode_string_ex(name_type, name, name_len TSRMLS_CC); + } + if (string.v) { + string.s = soap_encode_string_ex(string_type, string, string_len TSRMLS_CC); + } + if (actor.v) { + actor.s = soap_encode_string_ex(actor_type, actor, actor_len TSRMLS_CC); + } + soap_server_fault(code.s, string.s, actor.s, details, name.s TSRMLS_CC); + if (code.s) { + efree(code.s); + } + if (name.s) { + efree(name.s); + } + if (string.s) { + efree(string.s); + } + if (actor.s) { + efree(actor.s); + } SOAP_SERVER_END_CODE(); } /* }}} */ @@ -3420,19 +3441,30 @@ static void set_soap_fault(zval *obj, char *fault_code_ns, char *fault_code, char *fault_string, char *fault_actor, zval *fault_detail, char *name TSRMLS_DC) { + zval *tmp; + if (Z_TYPE_P(obj) != IS_OBJECT) { object_init_ex(obj, soap_fault_class_entry); } if (fault_string != NULL) { - add_property_string(obj, "faultstring", fault_string, 1); - zend_update_property_string(zend_exception_get_default(TSRMLS_C), obj, "message", sizeof("message")-1, fault_string TSRMLS_CC); + MAKE_STD_ZVAL(tmp); + soap_decode_string(tmp, fault_string TSRMLS_CC); + tmp->refcount--; + add_property_zval(obj, "faultstring", tmp); + zend_update_property(zend_exception_get_default(TSRMLS_C), obj, "message", sizeof("message")-1, tmp TSRMLS_CC); } if (fault_code != NULL) { int soap_version = SOAP_GLOBAL(soap_version); if (fault_code_ns) { - add_property_string(obj, "faultcode", fault_code, 1); - add_property_string(obj, "faultcodens", fault_code_ns, 1); + MAKE_STD_ZVAL(tmp); + soap_decode_string(tmp, fault_code TSRMLS_CC); + tmp->refcount--; + add_property_zval(obj, "faultcode", tmp); + MAKE_STD_ZVAL(tmp); + soap_decode_string(tmp, fault_code_ns TSRMLS_CC); + tmp->refcount--; + add_property_zval(obj, "faultcodens", tmp); } else { if (soap_version == SOAP_1_1) { add_property_string(obj, "faultcode", fault_code, 1); @@ -3440,28 +3472,34 @@ strcmp(fault_code,"Server") == 0 || strcmp(fault_code,"VersionMismatch") == 0 || strcmp(fault_code,"MustUnderstand") == 0) { - add_property_string(obj, "faultcodens", SOAP_1_1_ENV_NAMESPACE, 1); + add_property_ascii_string(obj, "faultcodens", SOAP_1_1_ENV_NAMESPACE, 1); } } else if (soap_version == SOAP_1_2) { if (strcmp(fault_code,"Client") == 0) { - add_property_string(obj, "faultcode", "Sender", 1); - add_property_string(obj, "faultcodens", SOAP_1_2_ENV_NAMESPACE, 1); + add_property_ascii_string(obj, "faultcode", "Sender", 1); + add_property_ascii_string(obj, "faultcodens", SOAP_1_2_ENV_NAMESPACE, 1); } else if (strcmp(fault_code,"Server") == 0) { - add_property_string(obj, "faultcode", "Receiver", 1); - add_property_string(obj, "faultcodens", SOAP_1_2_ENV_NAMESPACE, 1); - } else if (strcmp(fault_code,"VersionMismatch") == 0 || - strcmp(fault_code,"MustUnderstand") == 0 || - strcmp(fault_code,"DataEncodingUnknown") == 0) { - add_property_string(obj, "faultcode", fault_code, 1); - add_property_string(obj, "faultcodens", SOAP_1_2_ENV_NAMESPACE, 1); + add_property_ascii_string(obj, "faultcode", "Receiver", 1); + add_property_ascii_string(obj, "faultcodens", SOAP_1_2_ENV_NAMESPACE, 1); } else { - add_property_string(obj, "faultcode", fault_code, 1); + if (strcmp(fault_code,"VersionMismatch") == 0 || + strcmp(fault_code,"MustUnderstand") == 0 || + strcmp(fault_code,"DataEncodingUnknown") == 0) { + add_property_ascii_string(obj, "faultcodens", SOAP_1_2_ENV_NAMESPACE, 1); + } + MAKE_STD_ZVAL(tmp); + soap_decode_string(tmp, fault_code TSRMLS_CC); + tmp->refcount--; + add_property_zval(obj, "faultcode", tmp); } } } } if (fault_actor != NULL) { - add_property_string(obj, "faultactor", fault_actor, 1); + MAKE_STD_ZVAL(tmp); + soap_decode_string(tmp, fault_actor TSRMLS_CC); + tmp->refcount--; + add_property_zval(obj, "faultactor", tmp); } if (fault_detail != NULL) { add_property_zval(obj, "detail", fault_detail); @@ -4062,7 +4100,7 @@ param = xmlNewChild(body, ns, BAD_CAST("Fault"), NULL); if (zend_hash_find(prop, "faultcodens", sizeof("faultcodens"), (void**)&tmp) == SUCCESS && Z_TYPE_PP(tmp) == IS_STRING) { - fault_ns = Z_STRVAL_PP(tmp); + fault_ns = soap_encode_string(*tmp, NULL TSRMLS_CC); } use = SOAP_LITERAL; if (zend_hash_find(prop, "_name", sizeof("_name"), (void**)&tmp) == SUCCESS && Z_TYPE_PP(tmp) == IS_STRING) { @@ -4076,7 +4114,7 @@ sdlSoapBindingFunctionFaultPtr fb = (sdlSoapBindingFunctionFaultPtr)fault->bindingAttributes; use = fb->use; if (fault_ns == NULL) { - fault_ns = fb->ns; + fault_ns = estrdup(fb->ns); } } } @@ -4092,7 +4130,7 @@ sdlSoapBindingFunctionFaultPtr fb = (sdlSoapBindingFunctionFaultPtr)fault->bindingAttributes; use = fb->use; if (fault_ns == NULL) { - fault_ns = fb->ns; + fault_ns = estrdup(fb->ns); } } } @@ -4107,7 +4145,7 @@ zend_hash_get_current_data(fault->details, (void**)&sparam); sparam = *(sdlParamPtr*)sparam; if (sparam->element) { - fault_ns = sparam->element->namens; + fault_ns = estrdup(sparam->element->namens); } } @@ -4115,7 +4153,7 @@ if (zend_hash_find(prop, "faultcode", sizeof("faultcode"), (void**)&tmp) == SUCCESS) { int new_len; xmlNodePtr node = xmlNewNode(NULL, BAD_CAST("faultcode")); - char *str = php_escape_html_entities(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), &new_len, 0, 0, NULL TSRMLS_CC); + char *str = soap_encode_string(*tmp, &new_len TSRMLS_CC); xmlAddChild(param, node); if (fault_ns) { xmlNsPtr nsptr = encode_add_ns(node, fault_ns); @@ -4138,7 +4176,7 @@ if (zend_hash_find(prop, "faultcode", sizeof("faultcode"), (void**)&tmp) == SUCCESS) { int new_len; xmlNodePtr node = xmlNewChild(param, ns, BAD_CAST("Code"), NULL); - char *str = php_escape_html_entities(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), &new_len, 0, 0, NULL TSRMLS_CC); + char *str = soap_encode_string(*tmp, &new_len TSRMLS_CC); node = xmlNewChild(node, ns, BAD_CAST("Value"), NULL); if (fault_ns) { xmlNsPtr nsptr = encode_add_ns(node, fault_ns); @@ -4156,6 +4194,9 @@ } detail_name = SOAP_1_2_ENV_NS_PREFIX":Detail"; } + if (fault_ns) { + efree(fault_ns); + } if (fault && fault->details && zend_hash_num_elements(fault->details) == 1) { xmlNodePtr node; zval *detail = NULL;
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php