dmitry          Tue Jul 18 15:05:07 2006 UTC

  Modified files:              
    /php-src/ext/soap   php_encoding.c soap.c 
  Log:
  Unicode support (not finished)
  
  
http://cvs.php.net/viewvc.cgi/php-src/ext/soap/php_encoding.c?r1=1.136&r2=1.137&diff_format=u
Index: php-src/ext/soap/php_encoding.c
diff -u php-src/ext/soap/php_encoding.c:1.136 
php-src/ext/soap/php_encoding.c:1.137
--- php-src/ext/soap/php_encoding.c:1.136       Tue Jul 18 09:24:54 2006
+++ php-src/ext/soap/php_encoding.c     Tue Jul 18 15:05:07 2006
@@ -17,7 +17,7 @@
   |          Dmitry Stogov <[EMAIL PROTECTED]>                             |
   +----------------------------------------------------------------------+
 */
-/* $Id: php_encoding.c,v 1.136 2006/07/18 09:24:54 dmitry Exp $ */
+/* $Id: php_encoding.c,v 1.137 2006/07/18 15:05:07 dmitry Exp $ */
 
 #include <time.h>
 
@@ -283,17 +283,36 @@
                zval **ztype, **zdata, **zns, **zstype, **zname, **znamens;
                encodePtr enc = NULL;
                HashTable *ht = Z_OBJPROP_P(data);
+               char *stype_str = NULL, *ns_str = NULL;
+               int free_stype = 0, free_ns = 0;
 
                if (zend_hash_find(ht, "enc_type", sizeof("enc_type"), (void 
**)&ztype) == FAILURE) {
                        soap_error0(E_ERROR, "Encoding: SoapVar hasn't 
'enc_type' propery");
                }
 
+               if (zend_hash_find(ht, "enc_stype", sizeof("enc_stype"), (void 
**)&zstype) == SUCCESS) {
+                       if (Z_TYPE_PP(zstype) == IS_STRING) {
+                               stype_str = Z_STRVAL_PP(zstype);
+                       } else if (Z_TYPE_PP(zstype) == IS_UNICODE) {
+                               stype_str = 
soap_unicode_to_string(Z_USTRVAL_PP(zstype), Z_USTRLEN_PP(zstype) TSRMLS_CC);
+                               free_stype = 1;
+                       }
+                       if (stype_str && zend_hash_find(ht, "enc_ns", 
sizeof("enc_ns"), (void **)&zns) == SUCCESS) {
+                               if (Z_TYPE_PP(zns) == IS_STRING) {
+                                       ns_str = Z_STRVAL_PP(zns);
+                               } else if (Z_TYPE_PP(zns) == IS_UNICODE) {
+                                       ns_str = 
soap_unicode_to_string(Z_USTRVAL_PP(zns), Z_USTRLEN_PP(zns) TSRMLS_CC);
+                                       free_ns = 1;
+                               }
+                       }
+               }
+
                if (SOAP_GLOBAL(sdl)) {
-                       if (zend_hash_find(ht, "enc_stype", 
sizeof("enc_stype"), (void **)&zstype) == SUCCESS) {
-                               if (zend_hash_find(ht, "enc_ns", 
sizeof("enc_ns"), (void **)&zns) == SUCCESS) {
-                                 enc = get_encoder(SOAP_GLOBAL(sdl), 
Z_STRVAL_PP(zns), Z_STRVAL_PP(zstype));
+                       if (stype_str) {
+                               if (ns_str) {
+                                 enc = get_encoder(SOAP_GLOBAL(sdl), ns_str, 
stype_str);
                                } else {
-                                 enc = get_encoder_ex(SOAP_GLOBAL(sdl), 
Z_STRVAL_PP(zstype), Z_STRLEN_PP(zstype));
+                                 enc = get_encoder_ex(SOAP_GLOBAL(sdl), 
stype_str, strlen(stype_str));
                                }
                        }
                }
@@ -311,21 +330,39 @@
                }
 
                if (style == SOAP_ENCODED || (SOAP_GLOBAL(sdl) && encode != 
enc)) {
-                       if (zend_hash_find(ht, "enc_stype", 
sizeof("enc_stype"), (void **)&zstype) == SUCCESS) {
-                               if (zend_hash_find(ht, "enc_ns", 
sizeof("enc_ns"), (void **)&zns) == SUCCESS) {
-                                       set_ns_and_type_ex(node, 
Z_STRVAL_PP(zns), Z_STRVAL_PP(zstype));
-                               } else {
-                                       set_ns_and_type_ex(node, NULL, 
Z_STRVAL_PP(zstype));
-                               }
+                       if (stype_str) {
+                               set_ns_and_type_ex(node, ns_str, stype_str);
                        }
                }
 
+               if (free_stype) {
+                       efree(stype_str);
+               }
+               if (free_ns) {
+                       efree(ns_str);
+               }
+
                if (zend_hash_find(ht, "enc_name", sizeof("enc_name"), (void 
**)&zname) == SUCCESS) {
-                       xmlNodeSetName(node, BAD_CAST(Z_STRVAL_PP(zname)));
+                       if (Z_TYPE_PP(zname) == IS_STRING) {
+                               xmlNodeSetName(node, 
BAD_CAST(Z_STRVAL_PP(zname)));
+                       } else if (Z_TYPE_PP(zname) == IS_UNICODE) {
+                               char *str = 
soap_unicode_to_string(Z_USTRVAL_PP(zname), Z_USTRLEN_PP(zname) TSRMLS_CC);
+
+                               xmlNodeSetName(node, BAD_CAST(str));
+                               efree(str);
+                       }
                }
                if (zend_hash_find(ht, "enc_namens", sizeof("enc_namens"), 
(void **)&znamens) == SUCCESS) {
-                       xmlNsPtr nsp = encode_add_ns(node, 
Z_STRVAL_PP(znamens));
-                       xmlSetNs(node, nsp);
+                       if (Z_TYPE_PP(znamens) == IS_STRING) {
+                               xmlNsPtr nsp = encode_add_ns(node, 
Z_STRVAL_PP(znamens));
+                               xmlSetNs(node, nsp);
+                       } if (Z_TYPE_PP(znamens) == IS_UNICODE) {
+                               char *str = 
soap_unicode_to_string(Z_USTRVAL_PP(znamens), Z_USTRLEN_PP(znamens) TSRMLS_CC);
+
+                               xmlNsPtr nsp = encode_add_ns(node, str);
+                               efree(str);
+                               xmlSetNs(node, nsp);
+                       }
                }
        } else {
                if (SOAP_GLOBAL(class_map) && data &&
@@ -2624,6 +2661,7 @@
                zval* soapvar;
                char *ns, *cptype;
                xmlNsPtr nsptr;
+               zval *tmp;
 
                MAKE_STD_ZVAL(soapvar);
                object_init_ex(soapvar, soap_var_class_entry);
@@ -2633,10 +2671,20 @@
 #endif
                add_property_zval(soapvar, "enc_value", ret);
                parse_namespace(type_name, &cptype, &ns);
-               nsptr = xmlSearchNs(data->doc, data, BAD_CAST(ns));
-               add_property_string(soapvar, "enc_stype", cptype, 1);
+               nsptr = xmlSearchNs(data->doc, data, BAD_CAST(ns));     
+               MAKE_STD_ZVAL(tmp);
+               ZVAL_STRING(tmp, cptype, 1);
+#ifdef ZEND_ENGINE_2
+               tmp->refcount--;
+#endif
+               add_property_zval(soapvar, "enc_stype", tmp);
                if (nsptr) {
-                       add_property_string(soapvar, "enc_ns", 
(char*)nsptr->href, 1);
+                       MAKE_STD_ZVAL(tmp);
+                       ZVAL_STRING(tmp, (char*)nsptr->href, 1);
+#ifdef ZEND_ENGINE_2
+                       tmp->refcount--;
+#endif
+                       add_property_zval(soapvar, "enc_ns", tmp);
                }
                efree(cptype);
                if (ns) {efree(ns);}
@@ -3199,7 +3247,7 @@
        HashTable *ht;
        int i, count, cur_type, prev_type, different;
        zval **tmp;
-       char *prev_stype = NULL, *cur_stype = NULL, *prev_ns = NULL, *cur_ns = 
NULL;
+       zval *prev_stype = NULL, *cur_stype = NULL, *prev_ns = NULL, *cur_ns = 
NULL;
 
        if (!array || Z_TYPE_P(array) != IS_ARRAY) {
                smart_str_appendl(type, "xsd:anyType", sizeof("xsd:anyType")-1);
@@ -3224,14 +3272,16 @@
                        }
                        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);
+                       if (zend_hash_find(Z_OBJPROP_PP(tmp), "enc_stype", 
sizeof("enc_stype"), (void **)&ztype) == SUCCESS &&
+                               (Z_TYPE_PP(ztype) == IS_STRING || 
Z_TYPE_PP(ztype) == IS_UNICODE)) {
+                               cur_stype = *ztype;
                        } else {
                                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);
+                       if (zend_hash_find(Z_OBJPROP_PP(tmp), "enc_ns", 
sizeof("enc_ns"), (void **)&ztype) == SUCCESS &&
+                               (Z_TYPE_PP(ztype) == IS_STRING || 
Z_TYPE_PP(ztype) == IS_UNICODE)) {
+                               cur_ns = *ztype;
                        } else {
                                cur_ns = NULL;
                        }
@@ -3246,15 +3296,54 @@
                        cur_ns = NULL;
                }
 
+               if (cur_stype) {
+                       if (Z_TYPE_P(cur_stype) == IS_UNICODE) {
+                               zval *tmp;
+                               UErrorCode status = U_ZERO_ERROR;
+
+                               ALLOC_INIT_ZVAL(tmp);
+                               Z_TYPE_P(tmp) = IS_STRING;
+                               zend_convert_from_unicode(UG(utf8_conv), 
&Z_STRVAL_P(tmp), &Z_STRLEN_P(tmp), Z_USTRVAL_P(cur_stype), 
Z_USTRLEN_P(cur_stype), &status);
+                               cur_stype = tmp;
+                       } else {
+                               cur_stype->refcount++;
+                       }
+               }
+               if (cur_ns) {
+                       if (Z_TYPE_P(cur_ns) == IS_UNICODE) {
+                               zval *tmp;
+                               UErrorCode status = U_ZERO_ERROR;
+
+                               ALLOC_INIT_ZVAL(tmp);
+                               Z_TYPE_P(tmp) = IS_STRING;
+                               zend_convert_from_unicode(UG(utf8_conv), 
&Z_STRVAL_P(tmp), &Z_STRLEN_P(tmp), Z_USTRVAL_P(cur_ns), Z_USTRLEN_P(cur_ns), 
&status);
+                               cur_ns = tmp;
+                       } else {
+                               cur_ns->refcount++;
+                       }
+               }
+
                if (i > 0) {
                        if ((cur_type != prev_type) ||
-                           (cur_stype != NULL && prev_stype != NULL && 
strcmp(cur_stype,prev_stype) != 0) ||
+                           (cur_stype != NULL && prev_stype != NULL && 
strcmp(Z_STRVAL_P(cur_stype),Z_STRVAL_P(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 && prev_ns != NULL && 
strcmp(Z_STRVAL_P(cur_ns), Z_STRVAL_P(prev_ns)) != 0) ||
                            (cur_ns == NULL && cur_ns != prev_ns)) {
                                different = TRUE;
+                               if (prev_stype) {
+                                       zval_ptr_dtor(&prev_stype);
+                               }
+                               if (prev_ns) {
+                                       zval_ptr_dtor(&prev_ns);
+                               }
                                break;
                        }
+                       if (prev_stype) {
+                               zval_ptr_dtor(&prev_stype);
+                       }
+                       if (prev_ns) {
+                               zval_ptr_dtor(&prev_ns);
+                       }
                }
 
                prev_type = cur_type;
@@ -3273,24 +3362,33 @@
                        smart_str array_type = {0};
 
                        if (cur_ns) {
-                               xmlNsPtr ns = encode_add_ns(node,cur_ns);
+                               xmlNsPtr ns = encode_add_ns(node, 
Z_STRVAL_P(cur_ns));
 
                                smart_str_appends(type, (char*)ns->prefix);
                                smart_str_appendc(type, ':');
-                               smart_str_appends(&array_type, cur_ns);
+                               smart_str_appends(&array_type, 
Z_STRVAL_P(cur_ns));
                                smart_str_appendc(&array_type, ':');
                        }
-                       smart_str_appends(type, cur_stype);
+                       smart_str_appends(type, Z_STRVAL_P(cur_stype));
                        smart_str_0(type);
-                       smart_str_appends(&array_type, cur_stype);
+                       smart_str_appends(&array_type, Z_STRVAL_P(cur_stype));
                        smart_str_0(&array_type);
 
                        enc = get_encoder_ex(SOAP_GLOBAL(sdl), array_type.c, 
array_type.len);
                        smart_str_free(&array_type);
+                       if (cur_stype) {
+                               zval_ptr_dtor(&cur_stype);
+                       }
+                       if (cur_ns) {
+                               zval_ptr_dtor(&cur_ns);
+                       }
                        return enc;
                } else {
                        enc = get_conversion(cur_type);
                        get_type_str(node, enc->details.ns, 
enc->details.type_str, type);
+                       if (cur_ns) {
+                               zval_ptr_dtor(&cur_ns);
+                       }
                        return enc;
                }
        }
http://cvs.php.net/viewvc.cgi/php-src/ext/soap/soap.c?r1=1.195&r2=1.196&diff_format=u
Index: php-src/ext/soap/soap.c
diff -u php-src/ext/soap/soap.c:1.195 php-src/ext/soap/soap.c:1.196
--- php-src/ext/soap/soap.c:1.195       Thu Jul 13 16:47:25 2006
+++ php-src/ext/soap/soap.c     Tue Jul 18 15:05:07 2006
@@ -17,7 +17,7 @@
   |          Dmitry Stogov <[EMAIL PROTECTED]>                             |
   +----------------------------------------------------------------------+
 */
-/* $Id: soap.c,v 1.195 2006/07/13 16:47:25 dmitry Exp $ */
+/* $Id: soap.c,v 1.196 2006/07/18 15:05:07 dmitry Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -748,10 +748,11 @@
 PHP_METHOD(SoapParam, SoapParam)
 {
        zval *data;
-       char *name;
+       zstr name;
        int name_length;
+       zend_uchar name_type;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zs", &data, 
&name, &name_length) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zt", &data, 
&name, &name_length, &name_type) == FAILURE) {
                php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters");
        }
        if (name_length == 0) {
@@ -761,7 +762,11 @@
 #ifndef ZEND_ENGINE_2
        zval_add_ref(&data);
 #endif
-       add_property_stringl(this_ptr, "param_name", name, name_length, 1);
+       if (name_type == IS_STRING) {
+               add_property_stringl(this_ptr, "param_name", name.s, 
name_length, 1);
+       } else {
+               add_property_unicodel(this_ptr, "param_name", name.u, 
name_length, 1);
+       }
        add_property_zval(this_ptr, "param_data", data);
 }
 /* }}} */
@@ -772,11 +777,14 @@
 PHP_METHOD(SoapHeader, SoapHeader)
 {
        zval *data = NULL, *actor = NULL;
-       char *name, *ns;
+       zstr name, ns;
        int name_len, ns_len;
+       zend_uchar name_type, ns_type;
        zend_bool must_understand = 0;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|zbz", &ns, 
&ns_len, &name, &name_len, &data, &must_understand, &actor) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "tt|zbz", 
+                       &ns, &ns_len, &ns_type, &name, &name_len, &name_type,
+                       &data, &must_understand, &actor) == FAILURE) {
                php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters");
        }
        if (ns_len == 0) {
@@ -786,8 +794,16 @@
                php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters. 
Invalid header name.");
        }
 
-       add_property_stringl(this_ptr, "namespace", ns, ns_len, 1);
-       add_property_stringl(this_ptr, "name", name, name_len, 1);
+       if (ns_type == IS_STRING) {
+               add_property_stringl(this_ptr, "namespace", ns.s, ns_len, 1);
+       } else {
+               add_property_unicodel(this_ptr, "namespace", ns.u, ns_len, 1);
+       }
+       if (name_type == IS_STRING) {
+               add_property_stringl(this_ptr, "name", name.s, name_len, 1);
+       } else {
+               add_property_unicodel(this_ptr, "name", name.u, name_len, 1);
+       }
        if (data) {
 #ifndef ZEND_ENGINE_2
                zval_add_ref(&data);
@@ -803,6 +819,8 @@
                add_property_long(this_ptr, "actor", Z_LVAL_P(actor));
        } else if (Z_TYPE_P(actor) == IS_STRING && Z_STRLEN_P(actor) > 0) {
                add_property_stringl(this_ptr, "actor", Z_STRVAL_P(actor), 
Z_STRLEN_P(actor), 1);
+       } else if (Z_TYPE_P(actor) == IS_UNICODE && Z_USTRLEN_P(actor) > 0) {
+               add_property_unicodel(this_ptr, "actor", Z_USTRVAL_P(actor), 
Z_USTRLEN_P(actor), 1);
        } else {
                php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters. 
Invalid actor.");
        }
@@ -954,10 +972,16 @@
 PHP_METHOD(SoapVar, SoapVar)
 {
        zval *data, *type;
-       char *stype = NULL, *ns = NULL, *name = NULL, *namens = NULL;
+       zstr stype = NULL_ZSTR, ns = NULL_ZSTR, name = NULL_ZSTR, namens = 
NULL_ZSTR;
        int stype_len, ns_len, name_len, namens_len;
+       zend_uchar stype_type, ns_type, name_type, namens_type;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z!z|ssss", &data, 
&type, &stype, &stype_len, &ns, &ns_len, &name, &name_len, &namens, 
&namens_len) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z!z|tttt", 
+                       &data, &type,
+                       &stype, &stype_len, &stype_type,
+                       &ns, &ns_len, &ns_type,
+                       &name, &name_len, &name_type,
+                       &namens, &namens_len, &namens_type) == FAILURE) {
                php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters");
        }
 
@@ -978,17 +1002,33 @@
                add_property_zval(this_ptr, "enc_value", data);
        }
 
-       if (stype && stype_len > 0) {
-               add_property_stringl(this_ptr, "enc_stype", stype, stype_len, 
1);
-       }
-       if (ns && ns_len > 0) {
-               add_property_stringl(this_ptr, "enc_ns", ns, ns_len, 1);
-       }
-       if (name && name_len > 0) {
-               add_property_stringl(this_ptr, "enc_name", name, name_len, 1);
-       }
-       if (namens && namens_len > 0) {
-               add_property_stringl(this_ptr, "enc_namens", namens, 
namens_len, 1);
+       if (stype.v && stype_len > 0) {
+               if (stype_type == IS_STRING) {
+                       add_property_stringl(this_ptr, "enc_stype", stype.s, 
stype_len, 1);
+               } else if (stype_type == IS_UNICODE) {
+                       add_property_unicodel(this_ptr, "enc_stype", stype.u, 
stype_len, 1);
+               }
+       }
+       if (ns.v && ns_len > 0) {
+               if (ns_type == IS_STRING) {
+                       add_property_stringl(this_ptr, "enc_ns", ns.s, ns_len, 
1);
+               } else if (ns_type == IS_UNICODE) {
+                       add_property_unicodel(this_ptr, "enc_ns", ns.u, ns_len, 
1);
+               }
+       }
+       if (name.v && name_len > 0) {
+               if (name_type == IS_STRING) {
+                       add_property_stringl(this_ptr, "enc_name", name.s, 
name_len, 1);
+               } else if (name_type == IS_UNICODE) {
+                       add_property_unicodel(this_ptr, "enc_name", name.u, 
name_len, 1);
+               }
+       }
+       if (namens.v && namens_len > 0) {
+               if (namens_type == IS_STRING) {
+                       add_property_stringl(this_ptr, "enc_namens", namens.s, 
namens_len, 1);
+               } else if (namens_type == IS_UNICODE) {
+                       add_property_unicodel(this_ptr, "enc_namens", namens.u, 
namens_len, 1);
+               }
        }
 }
 /* }}} */
@@ -3816,6 +3856,7 @@
                        zval *hdr_ret  = *tmp;
                        char *hdr_ns   = headers->hdr?headers->hdr->ns:NULL;
                        char *hdr_name = Z_STRVAL(headers->function_name);
+                       int free_ns = 0, free_name = 0;
 
                        head = xmlNewChild(envelope, ns, BAD_CAST("Header"), 
NULL);
                        if (Z_TYPE_P(hdr_ret) == IS_OBJECT &&
@@ -3825,16 +3866,31 @@
                                sdlSoapBindingFunctionHeaderPtr *hdr;
                                smart_str key = {0};
 
-                               if (zend_hash_find(ht, "namespace", 
sizeof("namespace"), (void**)&tmp) == SUCCESS &&
-                             Z_TYPE_PP(tmp) == IS_STRING) {
-                                       smart_str_appendl(&key, 
Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
-                                       smart_str_appendc(&key, ':');
-                                       hdr_ns = Z_STRVAL_PP(tmp);
+                               if (zend_hash_find(ht, "namespace", 
sizeof("namespace"), (void**)&tmp) == SUCCESS) {
+                                       if (Z_TYPE_PP(tmp) == IS_STRING) {
+                                               smart_str_appendl(&key, 
Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
+                                               smart_str_appendc(&key, ':');
+                                               hdr_ns = Z_STRVAL_PP(tmp);
+                                       } else if (Z_TYPE_PP(tmp) == 
IS_UNICODE) {
+                                               char *str = 
soap_unicode_to_string(Z_USTRVAL_PP(tmp), Z_USTRLEN_PP(tmp) TSRMLS_CC);
+
+                                               smart_str_appends(&key, str);
+                                               smart_str_appendc(&key, ':');
+                                               hdr_ns = str;
+                                               free_ns = 1;
+                                       }
                                }
-                               if (zend_hash_find(ht, "name", sizeof("name"), 
(void**)&tmp) == SUCCESS &&
-                                   Z_TYPE_PP(tmp) == IS_STRING) {
-                                       smart_str_appendl(&key, 
Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
-                                       hdr_name = Z_STRVAL_PP(tmp);
+                               if (zend_hash_find(ht, "name", sizeof("name"), 
(void**)&tmp) == SUCCESS) {
+                                       if (Z_TYPE_PP(tmp) == IS_STRING) {
+                                               smart_str_appendl(&key, 
Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
+                                               hdr_name = Z_STRVAL_PP(tmp);
+                                       } else if (Z_TYPE_PP(tmp) == 
IS_UNICODE) {
+                                               char *str = 
soap_unicode_to_string(Z_USTRVAL_PP(tmp), Z_USTRLEN_PP(tmp) TSRMLS_CC);
+
+                                               smart_str_appends(&key, str);
+                                               hdr_name = str;
+                                               free_name = 1;
+                                       }
                                }
                                smart_str_0(&key);
                                if (headers->hdr && headers->hdr->headerfaults 
&&
@@ -3864,6 +3920,13 @@
                                        xmlSetNs(xmlHdr, nsptr);
                                }
                        }
+
+                       if (free_ns) {
+                               efree(hdr_ns);
+                       }
+                       if (free_name) {
+                               efree(hdr_name);
+                       }
                }
 
                body = xmlNewChild(envelope, ns, BAD_CAST("Body"), NULL);
@@ -4033,7 +4096,7 @@
                                        zval *hdr_ret = &h->retval;
                                        char *hdr_ns   = h->hdr?h->hdr->ns:NULL;
                                        char *hdr_name = 
Z_STRVAL(h->function_name);
-
+                                       int free_ns = 0, free_name = 0;
 
                                        if (Z_TYPE(h->retval) == IS_OBJECT &&
                                            
instanceof_function(Z_OBJCE(h->retval), soap_header_class_entry TSRMLS_CC)) {
@@ -4042,16 +4105,31 @@
                                                sdlSoapBindingFunctionHeaderPtr 
*hdr;
                                                smart_str key = {0};
 
-                                               if (zend_hash_find(ht, 
"namespace", sizeof("namespace"), (void**)&tmp) == SUCCESS &&
-                                             Z_TYPE_PP(tmp) == IS_STRING) {
-                                                       smart_str_appendl(&key, 
Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
-                                                       smart_str_appendc(&key, 
':');
-                                                       hdr_ns = 
Z_STRVAL_PP(tmp);
+                                               if (zend_hash_find(ht, 
"namespace", sizeof("namespace"), (void**)&tmp) == SUCCESS) {
+                                               if (Z_TYPE_PP(tmp) == 
IS_STRING) {
+                                                               
smart_str_appendl(&key, Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
+                                                               
smart_str_appendc(&key, ':');
+                                                               hdr_ns = 
Z_STRVAL_PP(tmp);
+                                                       } else if 
(Z_TYPE_PP(tmp) == IS_UNICODE) {
+                                                               char *str = 
soap_unicode_to_string(Z_USTRVAL_PP(tmp), Z_USTRLEN_PP(tmp) TSRMLS_CC);
+
+                                                               
smart_str_appends(&key, str);
+                                                               
smart_str_appendc(&key, ':');
+                                                               hdr_ns = str;
+                                                               free_ns = 1;
+                                                       }
                                                }
-                                               if (zend_hash_find(ht, "name", 
sizeof("name"), (void**)&tmp) == SUCCESS &&
-                                                   Z_TYPE_PP(tmp) == 
IS_STRING) {
-                                                       smart_str_appendl(&key, 
Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
-                                                       hdr_name = 
Z_STRVAL_PP(tmp);
+                                               if (zend_hash_find(ht, "name", 
sizeof("name"), (void**)&tmp) == SUCCESS) {
+                                                       if (Z_TYPE_PP(tmp) == 
IS_STRING) {
+                                                               
smart_str_appendl(&key, Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
+                                                               hdr_name = 
Z_STRVAL_PP(tmp);
+                                                       } else if 
(Z_TYPE_PP(tmp) == IS_UNICODE) {
+                                                               char *str = 
soap_unicode_to_string(Z_USTRVAL_PP(tmp), Z_USTRLEN_PP(tmp) TSRMLS_CC);
+
+                                                               
smart_str_appends(&key, str);
+                                                               hdr_name = str;
+                                                               free_name = 1;
+                                                       }
                                                }
                                                smart_str_0(&key);
                                                if (function && 
function->binding && function->binding->bindingType == BINDING_SOAP) {
@@ -4085,6 +4163,13 @@
                                                        xmlSetNs(xmlHdr, nsptr);
                                                }
                                        }
+
+                                       if (free_ns) {
+                                               efree(hdr_ns);
+                                       }
+                                       if (free_name) {
+                                               efree(hdr_name);
+                                       }
                                }
                                h = h->next;
                        }
@@ -4242,21 +4327,36 @@
                        zval **name, **ns, **tmp;
 
                        if (zend_hash_find(ht, "name", sizeof("name"), 
(void**)&name) == SUCCESS &&
-                           Z_TYPE_PP(name) == IS_STRING &&
+                           (Z_TYPE_PP(name) == IS_STRING || Z_TYPE_PP(name) == 
IS_UNICODE) &&
                            zend_hash_find(ht, "namespace", 
sizeof("namespace"), (void**)&ns) == SUCCESS &&
-                           Z_TYPE_PP(ns) == IS_STRING) {
+                           (Z_TYPE_PP(ns) == IS_STRING || Z_TYPE_PP(ns) == 
IS_UNICODE)) {
                                xmlNodePtr h;
-                               xmlNsPtr nsptr;
+                               xmlNsPtr nsptr = NULL;
                                int hdr_use = SOAP_LITERAL;
                                encodePtr enc = NULL;
+                               char *name_str = NULL, *ns_str = NULL;
 
                                if (hdrs) {
                                        smart_str key = {0};
                                        sdlSoapBindingFunctionHeaderPtr *hdr;
 
-                                       smart_str_appendl(&key, 
Z_STRVAL_PP(ns), Z_STRLEN_PP(ns));
+                                       if (Z_TYPE_PP(ns) == IS_STRING) {
+                                               smart_str_appendl(&key, 
Z_STRVAL_PP(ns), Z_STRLEN_PP(ns));
+                                       } else {
+                                               char *str = 
soap_unicode_to_string(Z_USTRVAL_PP(ns), Z_USTRLEN_PP(ns) TSRMLS_CC);
+
+                                               smart_str_appends(&key, str);
+                                               ns_str = str;
+                                       }
                                        smart_str_appendc(&key, ':');
-                                       smart_str_appendl(&key, 
Z_STRVAL_PP(name), Z_STRLEN_PP(name));
+                                       if (Z_TYPE_PP(name) == IS_STRING) {
+                                               smart_str_appendl(&key, 
Z_STRVAL_PP(name), Z_STRLEN_PP(name));
+                                       } else {
+                                               char *str = 
soap_unicode_to_string(Z_USTRVAL_PP(name), Z_USTRLEN_PP(name) TSRMLS_CC);
+
+                                               smart_str_appends(&key, str);
+                                               name_str = str;
+                                       }
                                        smart_str_0(&key);
                                        if (zend_hash_find(hdrs, key.c, 
key.len+1,(void**)&hdr) == SUCCESS) {
                                                hdr_use = (*hdr)->use;
@@ -4266,18 +4366,33 @@
                                                }
                                        }
                                        smart_str_free(&key);
+                               } else {
+                                       if (Z_TYPE_PP(ns) == IS_UNICODE) {
+                                               ns_str = 
soap_unicode_to_string(Z_USTRVAL_PP(ns), Z_USTRLEN_PP(ns) TSRMLS_CC);
+                                       }
+                                       if (Z_TYPE_PP(name) == IS_UNICODE) {
+                                               name_str = 
soap_unicode_to_string(Z_USTRVAL_PP(name), Z_USTRLEN_PP(name) TSRMLS_CC);
+                                       }
                                }
 
                                if (zend_hash_find(ht, "data", sizeof("data"), 
(void**)&tmp) == SUCCESS) {
                                        h = master_to_xml(enc, *tmp, hdr_use, 
head);
-                                       xmlNodeSetName(h, 
BAD_CAST(Z_STRVAL_PP(name)));
+                                       xmlNodeSetName(h, 
BAD_CAST(name_str?name_str:Z_STRVAL_PP(name)));
                                } else {
-                                       h = xmlNewNode(NULL, 
BAD_CAST(Z_STRVAL_PP(name)));
+                                       h = xmlNewNode(NULL, 
BAD_CAST(name_str?name_str:Z_STRVAL_PP(name)));
                                        xmlAddChild(head, h);
                                }
-                               nsptr = encode_add_ns(h, Z_STRVAL_PP(ns));
+
+                               nsptr = encode_add_ns(h, 
ns_str?ns_str:Z_STRVAL_PP(ns));
                                xmlSetNs(h, nsptr);
 
+                               if (name_str) {
+                                       efree(name_str);
+                               }
+                               if (ns_str) {
+                                       efree(ns_str);
+                               }
+
                                if (zend_hash_find(ht, "mustUnderstand", 
sizeof("mustUnderstand"), (void**)&tmp) == SUCCESS &&
                                    Z_TYPE_PP(tmp) == IS_BOOL && 
Z_LVAL_PP(tmp)) {
                                        if (version == SOAP_1_1) {
@@ -4293,6 +4408,15 @@
                                                } else {
                                                        xmlSetProp(h, 
BAD_CAST(SOAP_1_2_ENV_NS_PREFIX":role"), BAD_CAST(Z_STRVAL_PP(tmp)));
                                                }
+                                       } else if (Z_TYPE_PP(tmp) == 
IS_UNICODE) {
+                                               char *str = 
soap_unicode_to_string(Z_USTRVAL_PP(tmp), Z_STRLEN_PP(tmp) TSRMLS_CC);
+
+                                               if (version == SOAP_1_1) {
+                                                       xmlSetProp(h, 
BAD_CAST(SOAP_1_1_ENV_NS_PREFIX":actor"), BAD_CAST(str));
+                                               } else {
+                                                       xmlSetProp(h, 
BAD_CAST(SOAP_1_2_ENV_NS_PREFIX":role"), BAD_CAST(str));
+                                               }
+                                               efree(str);
                                        } else if (Z_TYPE_PP(tmp) == IS_LONG) {
                                                if (version == SOAP_1_1) {
                                                        if (Z_LVAL_PP(tmp) == 
SOAP_ACTOR_NEXT) {
@@ -4335,6 +4459,7 @@
        char *paramName;
        xmlNodePtr xmlParam;
        char paramNameBuf[10];
+       int free_name = 0;
 
        if (param_val &&
            Z_TYPE_P(param_val) == IS_OBJECT &&
@@ -4343,9 +4468,15 @@
                zval **param_data;
 
                if (zend_hash_find(Z_OBJPROP_P(param_val), "param_name", 
sizeof("param_name"), (void **)&param_name) == SUCCESS &&
+                       (Z_TYPE_PP(param_name) == IS_STRING || 
Z_TYPE_PP(param_name) == IS_UNICODE) &&
                    zend_hash_find(Z_OBJPROP_P(param_val), "param_data", 
sizeof("param_data"), (void **)&param_data) == SUCCESS) {
                        param_val = *param_data;
-                       name = Z_STRVAL_PP(param_name);
+                       if (Z_TYPE_PP(param_name) == IS_STRING) {
+                               name = Z_STRVAL_PP(param_name);
+                       } else {
+                               name = 
soap_unicode_to_string(Z_USTRVAL_PP(param_name), Z_USTRLEN_PP(param_name) 
TSRMLS_CC);
+                               free_name = 1;
+                       }
                }
        }
 
@@ -4362,6 +4493,10 @@
 
        xmlParam = serialize_zval(param_val, param, paramName, style, parent 
TSRMLS_CC);
 
+       if (free_name) {
+               efree(name);
+       }
+
        return xmlParam;
 }
 

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to