pollita         Fri Jan  5 02:07:59 2007 UTC

  Modified files:              
    /php-src/ext/session        php_session.h session.c mod_user.c mod_files.c 
    /php-src/ext/session/tests  001.phpt 003.phpt 004.phpt 005.phpt 
  Log:
  Unicode Updates
  
http://cvs.php.net/viewvc.cgi/php-src/ext/session/php_session.h?r1=1.111&r2=1.112&diff_format=u
Index: php-src/ext/session/php_session.h
diff -u php-src/ext/session/php_session.h:1.111 
php-src/ext/session/php_session.h:1.112
--- php-src/ext/session/php_session.h:1.111     Thu Jan  4 22:04:38 2007
+++ php-src/ext/session/php_session.h   Fri Jan  5 02:07:59 2007
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_session.h,v 1.111 2007/01/04 22:04:38 pollita Exp $ */
+/* $Id: php_session.h,v 1.112 2007/01/05 02:07:59 pollita Exp $ */
 
 #ifndef PHP_SESSION_H
 #define PHP_SESSION_H
@@ -199,6 +199,7 @@
        ulong num_key;                                                          
                                \
        zval **struc;
 
+/* (Possibly) needed for BC (e.g. by external modules using the session 
registry) */
 #define PS_ENCODE_LOOP(code) do {                                              
                        \
                HashTable *_ht = Z_ARRVAL_P(PS(http_session_vars)); \
                                                                                
                                                        \
@@ -212,6 +213,24 @@
                }                                                               
                                                        \
        } while(0)
 
+#define PS_UENCODE_LOOP(code) do { \
+               int key_type;   \
+               HashTable *_ht = Z_ARRVAL_P(PS(http_session_vars)); \
+               HashPosition _pos;      \
+                                                                               
                                                        \
+               for (zend_hash_internal_pointer_reset_ex(_ht, &_pos);           
        \
+                               (key_type = zend_hash_get_current_key_ex(_ht, 
&key, &key_length, &num_key, 0, &_pos)) != HASH_KEY_NON_EXISTANT; \
+                               zend_hash_move_forward_ex(_ht, &_pos)) {        
                        \
+                       if (key_type != HASH_KEY_IS_STRING && key_type != 
HASH_KEY_IS_UNICODE) { break; }       \
+                       key_length--;                                           
                                \
+                       struc = NULL; \
+                       zend_hash_get_current_data_ex(_ht, (void**)&struc, 
&_pos);      \
+\
+                       code;                                                   
                                        \
+               }                                                               
                                                        \
+       } while(0)
+
+
 PHPAPI ZEND_EXTERN_MODULE_GLOBALS(ps)
 
 void php_session_auto_start(void *data);
http://cvs.php.net/viewvc.cgi/php-src/ext/session/session.c?r1=1.462&r2=1.463&diff_format=u
Index: php-src/ext/session/session.c
diff -u php-src/ext/session/session.c:1.462 php-src/ext/session/session.c:1.463
--- php-src/ext/session/session.c:1.462 Thu Jan  4 22:04:38 2007
+++ php-src/ext/session/session.c       Fri Jan  5 02:07:59 2007
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: session.c,v 1.462 2007/01/04 22:04:38 pollita Exp $ */
+/* $Id: session.c,v 1.463 2007/01/05 02:07:59 pollita Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -140,9 +140,11 @@
        }
 }
 
+/* BC? */
 PHPAPI void php_set_session_var(char *name, size_t namelen, zval *state_val, 
php_unserialize_data_t *var_hash TSRMLS_DC)
 {
-       zend_set_hash_symbol(state_val, name, namelen, PZVAL_IS_REF(state_val), 
1, Z_ARRVAL_P(PS(http_session_vars)));
+       zend_utf8_hash_update(Z_ARRVAL_P(PS(http_session_vars)), name, namelen 
+ 1, &state_val, sizeof(zval *), NULL);
+       zval_add_ref(&state_val);
 }
 
 PHPAPI int php_get_session_var(char *name, size_t namelen, zval ***state_var 
TSRMLS_DC)
@@ -572,19 +574,22 @@
 
        PHP_VAR_SERIALIZE_INIT(var_hash);
 
-       PS_ENCODE_LOOP(
-                       if (key_length > PS_BIN_MAX) continue;
-                       smart_str_appendc(&buf, (unsigned char) key_length);
-                       smart_str_appendl(&buf, key.s, key_length);
-                       
-                       php_var_serialize(&buf, struc, &var_hash TSRMLS_CC);
-       } else {
-                       if (key_length > PS_BIN_MAX) continue;
-                       smart_str_appendc(&buf, (unsigned char) (key_length & 
PS_BIN_UNDEF));
-                       smart_str_appendl(&buf, key.s, key_length);
+       PS_UENCODE_LOOP(
+                       if (key_length > PS_BIN_MAX || key_type != 
HASH_KEY_IS_STRING) continue;
+                       if (struc) {
+                               smart_str_appendc(&buf, (unsigned 
char)key_length );
+                               smart_str_appendl(&buf, key.s, key_length);
+                               php_var_serialize(&buf, struc, &var_hash 
TSRMLS_CC);
+                       } else {
+                               smart_str_appendc(&buf, (unsigned 
char)key_length | PS_BIN_UNDEF);
+                               smart_str_appendl(&buf, key.s, key_length);
+                       }
        );
        
-       if (newlen) *newlen = buf.len;
+       if (newlen) {
+               *newlen = buf.len;
+       }
+       smart_str_0(&buf);
        *newstr = buf.c;
        PHP_VAR_SERIALIZE_DESTROY(var_hash);
 
@@ -605,7 +610,7 @@
 
        for (p = val; p < endptr; ) {
                zval **tmp;
-               namelen = *p & (~PS_BIN_UNDEF);
+               namelen = ((unsigned char)(*p)) & (~PS_BIN_UNDEF);
 
                if (namelen > PS_BIN_MAX || (p + namelen) >= endptr) {
                        return FAILURE;
@@ -627,10 +632,12 @@
                if (has_value) {
                        ALLOC_INIT_ZVAL(current);
                        if (php_var_unserialize(&current, (const unsigned char 
**) &p, (const unsigned char *) endptr, &var_hash TSRMLS_CC)) {
-                               php_set_session_var(name, namelen, current, 
&var_hash  TSRMLS_CC);
+                               
zend_utf8_hash_update(Z_ARRVAL_P(PS(http_session_vars)), name, namelen + 1, 
&current, sizeof(zval *), NULL);
+                       } else {
+                               zval_ptr_dtor(&current);
                        }
-                       zval_ptr_dtor(&current);
                }
+
                PS_ADD_VARL(name, namelen);
                efree(name);
        }
@@ -651,23 +658,44 @@
 
        PHP_VAR_SERIALIZE_INIT(var_hash);
 
-       PS_ENCODE_LOOP(
-                       smart_str_appendl(&buf, key.s, (unsigned char) 
key_length);
+       PS_UENCODE_LOOP(
+               if (!struc) {
+                       smart_str_appendc(&buf, PS_UNDEF_MARKER);
+               }
+
+               if (key_type == HASH_KEY_IS_STRING) {
                        if (memchr(key.s, PS_DELIMITER, key_length)) {
                                PHP_VAR_SERIALIZE_DESTROY(var_hash);
                                smart_str_free(&buf);                           
                                return FAILURE;
                        }
-                       smart_str_appendc(&buf, PS_DELIMITER);
-                       
+                       smart_str_appendl(&buf, key.s, (unsigned char) 
key_length);
+               } else {
+                       /* HASH_KEY_IS_UNICODE */
+                       char *str = NULL;
+                       int len;
+                       UErrorCode status = U_ZERO_ERROR;
+
+                       zend_unicode_to_string_ex(UG(utf8_conv), &str, &len, 
key.u, key_length, &status);
+                       if (U_FAILURE(status) || memchr(str, PS_DELIMITER, 
key_length)) {
+                               PHP_VAR_SERIALIZE_DESTROY(var_hash);
+                               smart_str_free(&buf);
+                               if (str) { efree(str); }
+                               return FAILURE;
+                       }
+                       smart_str_appendl(&buf, str, len);
+                       efree(str);
+               }
+               smart_str_appendc(&buf, PS_DELIMITER);
+
+               if (struc) {
                        php_var_serialize(&buf, struc, &var_hash TSRMLS_CC);
-       } else {
-                       smart_str_appendc(&buf, PS_UNDEF_MARKER);
-                       smart_str_appendl(&buf, key.s, key_length);
-                       smart_str_appendc(&buf, PS_DELIMITER);
+               }
        );
        
        if (newlen) *newlen = buf.len;
+
+       smart_str_0(&buf);
        *newstr = buf.c;
 
        PHP_VAR_SERIALIZE_DESTROY(var_hash);
@@ -690,16 +718,17 @@
 
        while (p < endptr) {
                zval **tmp;
+               has_value = 1;
+
                q = p;
                while (*q != PS_DELIMITER) {
                        if (++q >= endptr) goto break_outer_loop;
                }
                
-               if (p[0] == PS_UNDEF_MARKER) {
-                       p++;
+               if (*p == PS_UNDEF_MARKER) {
+                       if (++p >= endptr) goto break_outer_loop;
+
                        has_value = 0;
-               } else {
-                       has_value = 1;
                }
                
                namelen = q - p;
@@ -715,9 +744,10 @@
                if (has_value) {
                        ALLOC_INIT_ZVAL(current);
                        if (php_var_unserialize(&current, (const unsigned char 
**) &q, (const unsigned char *) endptr, &var_hash TSRMLS_CC)) {
-                               php_set_session_var(name, namelen, current, 
&var_hash TSRMLS_CC);
+                               
zend_utf8_hash_update(Z_ARRVAL_P(PS(http_session_vars)), name, namelen + 1, 
&current, sizeof(zval *), NULL);
+                       } else {
+                               zval_ptr_dtor(&current);
                        }
-                       zval_ptr_dtor(&current);
                }
                PS_ADD_VARL(name, namelen);
 skip:
@@ -1236,7 +1266,7 @@
    ******************************** */
 
 
-/* {{{ proto void session_set_cookie_params(int lifetime [, string path [, 
string domain [, bool secure[, bool httponly]]]])
+/* {{{ proto void session_set_cookie_params(int lifetime [, string path [, 
string domain [, bool secure[, bool httponly]]]]) U
    Set session cookie parameters */
 static PHP_FUNCTION(session_set_cookie_params)
 {
@@ -1269,7 +1299,7 @@
 }
 /* }}} */
 
-/* {{{ proto array session_get_cookie_params(void)
+/* {{{ proto array session_get_cookie_params(void) U
    Return the session cookie parameters */ 
 static PHP_FUNCTION(session_get_cookie_params)
 {
@@ -1287,18 +1317,18 @@
 }
 /* }}} */
 
-/* {{{ proto string session_name([string newname])
+/* {{{ proto string session_name([string newname]) U
    Return the current session name. If newname is given, the session name is 
replaced with newname */
 static PHP_FUNCTION(session_name)
 {
        char *name = NULL;
        int name_len;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &name, 
&name_len) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s&", &name, 
&name_len, UG(utf8_conv)) == FAILURE) {
                return;
        }
        
-       RETVAL_STRING(PS(session_name), 1);
+       RETVAL_UTF8_STRING(PS(session_name), ZSTR_DUPLICATE);
 
        if (name) {
                zend_alter_ini_entry("session.name", sizeof("session.name"), 
name, name_len, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
@@ -1306,20 +1336,20 @@
 }
 /* }}} */
 
-/* {{{ proto string session_module_name([string newname])
+/* {{{ proto string session_module_name([string newname]) U
    Return the current module name used for accessing session data. If newname 
is given, the module name is replaced with newname */
 static PHP_FUNCTION(session_module_name)
 {
        char *name = NULL;
        int name_len;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &name, 
&name_len) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s&", &name, 
&name_len, UG(utf8_conv)) == FAILURE) {
                return;
        }
 
        /* Set return_value to current module name */
        if (PS(mod) && PS(mod)->s_name) {
-               RETVAL_STRING(safe_estrdup(PS(mod)->s_name), 0);
+               RETVAL_UTF8_STRING((char*)PS(mod)->s_name, ZSTR_DUPLICATE);
        } else {
                RETVAL_EMPTY_STRING();
        }
@@ -1341,7 +1371,7 @@
 }
 /* }}} */
 
-/* {{{ proto void session_set_save_handler(string open, string close, string 
read, string write, string destroy, string gc)
+/* {{{ proto void session_set_save_handler(string open, string close, string 
read, string write, string destroy, string gc) U
    Sets user-level functions */
 static PHP_FUNCTION(session_set_save_handler)
 {
@@ -1383,18 +1413,18 @@
 }
 /* }}} */
 
-/* {{{ proto string session_save_path([string newname])
+/* {{{ proto string session_save_path([string newname]) U
    Return the current save path passed to module_name. If newname is given, 
the save path is replaced with newname */
 static PHP_FUNCTION(session_save_path)
 {
        char *name;
        int name_len;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &name, 
&name_len) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s&", &name, 
&name_len, UG(utf8_conv)) == FAILURE) {
                return;
        }
 
-       RETVAL_STRING(PS(save_path), 1);
+       RETVAL_UTF8_STRING(PS(save_path), ZSTR_DUPLICATE);
 
        if (name) {
                if (memchr(name, '\0', name_len) != NULL) {
@@ -1408,31 +1438,56 @@
 }
 /* }}} */
 
-/* {{{ proto string session_id([string newid])
+/* {{{ proto string session_id([string newid]) U
    Return the current session id. If newid is given, the session id is 
replaced with newid */
 static PHP_FUNCTION(session_id)
 {
-       char *name;
+       zstr name = NULL_ZSTR;
        int name_len;
+       zend_uchar name_type;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &name, 
&name_len) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|t", &name, 
&name_len, &name_type) == FAILURE) {
                return;
        }
 
-       if (PS(id)) {
-               RETVAL_STRING(PS(id), name ? 0 : 1);
-       } else {
-               RETVAL_EMPTY_STRING();
-       }
+       if (name.v) {
+               char *old = PS(id);
 
-       if (name) {
-               /* PS(id) was given to retval, doesn't need to be freed */
-               PS(id) = estrndup(name, name_len);
+               if (name_type == IS_STRING) {
+                       PS(id) = estrndup(name.s, name_len);
+               } else {
+                       /* IS_UNICODE */
+                       char *id = NULL;
+                       int id_len;
+                       UErrorCode status = U_ZERO_ERROR;
+
+                       
zend_unicode_to_string_ex(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), &id, 
&id_len, name.u, name_len, &status TSRMLS_CC);
+
+                       if (U_SUCCESS(status) && id) {
+                               PS(id) = id;
+                       } else {
+                               if (id) {
+                                       efree(id);
+                               }
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"Session ID must be either binary or a unicode string made up exclusively of 
ASCII");
+                               RETURN_FALSE;
+                       }
+               }
+
+               if (old) {
+                       RETURN_STRING(old, 0);
+               } else {
+                       RETURN_EMPTY_STRING();
+               }
+       } else  if (PS(id)) {
+               RETURN_STRING(PS(id), 1);
+       } else {
+               RETURN_EMPTY_STRING();
        }
 }
 /* }}} */
 
-/* {{{ proto bool session_regenerate_id([bool delete_old_session])
+/* {{{ proto bool session_regenerate_id([bool delete_old_session]) U
    Update the current session id with a newly generated one. If 
delete_old_session is set to true, remove the old session. */
 static PHP_FUNCTION(session_regenerate_id)
 {
@@ -1467,18 +1522,18 @@
 }
 /* }}} */
 
-/* {{{ proto string session_cache_limiter([string new_cache_limiter])
+/* {{{ proto string session_cache_limiter([string new_cache_limiter]) U
    Return the current cache limiter. If new_cache_limited is given, the 
current cache_limiter is replaced with new_cache_limiter */
 static PHP_FUNCTION(session_cache_limiter)
 {
        char *limiter;
        int limiter_len;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &limiter, 
&limiter_len) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s&", &limiter, 
&limiter_len, UG(utf8_conv)) == FAILURE) {
                return;
        }
 
-       RETVAL_STRING(PS(cache_limiter), 1);
+       RETVAL_UTF8_STRING(PS(cache_limiter), 1);
 
        if (limiter) {
                zend_alter_ini_entry("session.cache_limiter", 
sizeof("session.cache_limiter"), limiter, limiter_len, PHP_INI_USER, 
PHP_INI_STAGE_RUNTIME);
@@ -1486,7 +1541,7 @@
 }
 /* }}} */
 
-/* {{{ proto int session_cache_expire([int new_cache_expire])
+/* {{{ proto int session_cache_expire([int new_cache_expire]) U
    Return the current cache expire. If new_cache_expire is given, the current 
cache_expire is replaced with new_cache_expire */
 static PHP_FUNCTION(session_cache_expire)
 {
@@ -1494,7 +1549,7 @@
        char *expires;
        int expires_len;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &expires, 
&expires_len) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s&", &expires, 
&expires_len, UG(utf8_conv)) == FAILURE) {
                return;
        }
 
@@ -1528,7 +1583,7 @@
 }
 /* }}} */
 
-/* {{{ proto string session_encode(void)
+/* {{{ proto string session_encode(void) U
    Serializes the current setup and returns the serialized representation */
 static PHP_FUNCTION(session_encode)
 {
@@ -1544,11 +1599,11 @@
                RETURN_FALSE;
        }
        
-       RETVAL_STRINGL(enc, len, 0);
+       RETVAL_UTF8_STRINGL(enc, len, ZSTR_AUTOFREE);
 }
 /* }}} */
 
-/* {{{ proto bool session_decode(string data)
+/* {{{ proto bool session_decode(string data) U
    Deserializes data and reinitializes the variables */
 static PHP_FUNCTION(session_decode)
 {
@@ -1559,7 +1614,7 @@
                RETURN_FALSE;
        }
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, 
&str_len) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s&", &str, 
&str_len, UG(utf8_conv)) == FAILURE) {
                return;
        }
 
@@ -1569,7 +1624,7 @@
 }
 /* }}} */
 
-/* {{{ proto bool session_start(void)
+/* {{{ proto bool session_start(void) U
    Begin session - reinitializes freezed variables, registers browsers etc */
 static PHP_FUNCTION(session_start)
 {
@@ -1579,7 +1634,7 @@
 }
 /* }}} */
 
-/* {{{ proto bool session_destroy(void)
+/* {{{ proto bool session_destroy(void) U
    Destroy the current session and all data associated with it */
 static PHP_FUNCTION(session_destroy)
 {
@@ -1592,7 +1647,7 @@
 /* }}} */
 
 
-/* {{{ proto void session_unset(void)
+/* {{{ proto void session_unset(void) U
    Unset all registered variables */
 static PHP_FUNCTION(session_unset)
 {
@@ -1609,7 +1664,7 @@
 }
 /* }}} */
 
-/* {{{ proto void session_write_close(void)
+/* {{{ proto void session_write_close(void) U
    Write session data and end session */
 static PHP_FUNCTION(session_write_close)
 {
http://cvs.php.net/viewvc.cgi/php-src/ext/session/mod_user.c?r1=1.32&r2=1.33&diff_format=u
Index: php-src/ext/session/mod_user.c
diff -u php-src/ext/session/mod_user.c:1.32 php-src/ext/session/mod_user.c:1.33
--- php-src/ext/session/mod_user.c:1.32 Thu Jan  4 22:04:38 2007
+++ php-src/ext/session/mod_user.c      Fri Jan  5 02:07:59 2007
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: mod_user.c,v 1.32 2007/01/04 22:04:38 pollita Exp $ */
+/* $Id: mod_user.c,v 1.33 2007/01/05 02:07:59 pollita Exp $ */
 
 #include "php.h"
 #include "php_session.h"
@@ -32,17 +32,17 @@
        ZVAL_LONG(a, val);                                              \
 }
 
-#define SESS_ZVAL_STRING(vl, a)                                        \
+
+#define SESS_ZVAL_STRINGN(vl, ln, a)                   \
 {                                                                              
        \
-       int len = strlen(vl);                                   \
        MAKE_STD_ZVAL(a);                                               \
-       ZVAL_STRINGL(a, vl, len, 1);                    \
+       ZVAL_UTF8_STRINGL(a, vl, ln, ZSTR_DUPLICATE);   \
 }
 
-#define SESS_ZVAL_STRINGN(vl, ln, a)                   \
+#define SESS_ZVAL_STRING(vl, a)                                        \
 {                                                                              
        \
-       MAKE_STD_ZVAL(a);                                               \
-       ZVAL_STRINGL(a, vl, ln, 1);                     \
+       char *__vl = vl;                                                        
\
+       SESS_ZVAL_STRINGN(__vl, strlen(__vl), a);       \
 }
 
 
@@ -126,7 +126,23 @@
                        *val = estrndup(Z_STRVAL_P(retval), Z_STRLEN_P(retval));
                        *vallen = Z_STRLEN_P(retval);
                        ret = SUCCESS;
+               } else if (Z_TYPE_P(retval) == IS_UNICODE) {
+                       char *sval = NULL;
+                       int slen;
+                       UErrorCode status = U_ZERO_ERROR;
+
+                       zend_unicode_to_string_ex(UG(utf8_conv), &sval, &slen, 
Z_USTRVAL_P(retval), Z_USTRLEN_P(retval), &status);
+                       if (U_FAILURE(status)) {
+                               if (sval) {
+                                       efree(sval);
+                               }
+                       } else {
+                               *val = sval;
+                               *vallen = slen;
+                               ret = SUCCESS;
+                       }
                }
+
                zval_ptr_dtor(&retval);
        }
 
http://cvs.php.net/viewvc.cgi/php-src/ext/session/mod_files.c?r1=1.108&r2=1.109&diff_format=u
Index: php-src/ext/session/mod_files.c
diff -u php-src/ext/session/mod_files.c:1.108 
php-src/ext/session/mod_files.c:1.109
--- php-src/ext/session/mod_files.c:1.108       Thu Jan  4 23:50:19 2007
+++ php-src/ext/session/mod_files.c     Fri Jan  5 02:07:59 2007
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: mod_files.c,v 1.108 2007/01/04 23:50:19 iliaa Exp $ */
+/* $Id: mod_files.c,v 1.109 2007/01/05 02:07:59 pollita Exp $ */
 
 #include "php.h"
 
@@ -120,6 +120,28 @@
        memcpy(buf + n, key, key_len);
        n += key_len;
        buf[n] = '\0';
+
+       if (UG(unicode) && UG(filesystem_encoding_conv)) {
+               /* If there's a cheap way to see if filesystem_encoding_conv 
happens to be utf8, we should skip this reconversion */
+               char *newbuf = NULL;
+               int newlen;
+               UErrorCode status = U_ZERO_ERROR;
+
+               zend_convert_encodings(UG(filesystem_encoding_conv), 
UG(utf8_conv), &newbuf, &newlen, buf, n, &status);
+
+               if (status != U_ZERO_ERROR) {
+                       php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Failure 
converting savepath to local filesystem encoding, attempting to use utf8");
+               } else {
+                       if (newlen >= buflen) {
+                               newlen = buflen - 1;
+                               newbuf[newlen] = 0;
+                       }
+                       memcpy(buf, newbuf, newlen + 1);
+               }
+               if (newbuf) {
+                       efree(newbuf);
+               }
+       }
        
        return buf;
 }
http://cvs.php.net/viewvc.cgi/php-src/ext/session/tests/001.phpt?r1=1.14&r2=1.15&diff_format=u
Index: php-src/ext/session/tests/001.phpt
diff -u php-src/ext/session/tests/001.phpt:1.14 
php-src/ext/session/tests/001.phpt:1.15
--- php-src/ext/session/tests/001.phpt:1.14     Wed Dec 27 19:22:29 2006
+++ php-src/ext/session/tests/001.phpt  Fri Jan  5 02:07:59 2007
@@ -30,3 +30,6 @@
 ?>
 --EXPECT--
 string(126) 
"baz|O:3:"foo":2:{S:3:"bar";S:2:"ok";S:3:"yes";S:4:"done";}arr|a:1:{i:3;O:3:"foo":2:{S:3:"bar";S:2:"ok";S:3:"yes";S:4:"done";}}"
+--UEXPECT--
+unicode(126) 
"baz|O:3:"foo":2:{U:3:"bar";U:2:"ok";U:3:"yes";U:4:"done";}arr|a:1:{i:3;O:3:"foo":2:{U:3:"bar";U:2:"ok";U:3:"yes";U:4:"done";}}"
+
http://cvs.php.net/viewvc.cgi/php-src/ext/session/tests/003.phpt?r1=1.16&r2=1.17&diff_format=u
Index: php-src/ext/session/tests/003.phpt
diff -u php-src/ext/session/tests/003.phpt:1.16 
php-src/ext/session/tests/003.phpt:1.17
--- php-src/ext/session/tests/003.phpt:1.16     Mon Mar 27 14:08:10 2006
+++ php-src/ext/session/tests/003.phpt  Fri Jan  5 02:07:59 2007
@@ -18,7 +18,11 @@
 
 session_id("abtest");
 session_start();
-session_decode('baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:1;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:1;}}');
+if (ini_get("unicode.semantics")) {
+       
session_decode('baz|O:3:"foo":2:{U:3:"bar";U:2:"ok";U:3:"yes";i:1;}arr|a:1:{i:3;O:3:"foo":2:{U:3:"bar";U:2:"ok";U:3:"yes";i:1;}}');
+} else {
+       
session_decode('baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:1;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:1;}}');
+}
 $baz = $_SESSION['baz'];
 $arr = $_SESSION['arr'];
 
http://cvs.php.net/viewvc.cgi/php-src/ext/session/tests/004.phpt?r1=1.18&r2=1.19&diff_format=u
Index: php-src/ext/session/tests/004.phpt
diff -u php-src/ext/session/tests/004.phpt:1.18 
php-src/ext/session/tests/004.phpt:1.19
--- php-src/ext/session/tests/004.phpt:1.18     Wed Dec 27 19:22:29 2006
+++ php-src/ext/session/tests/004.phpt  Fri Jan  5 02:07:59 2007
@@ -12,7 +12,8 @@
 error_reporting(E_ALL);
 
 class handler {
-       public $data = 
'baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:1;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:1;}}';
+    public $data = 
'baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:1;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:1;}}';
+
     function open($save_path, $session_name)
     {
         print "OPEN: $session_name\n";
@@ -42,6 +43,14 @@
     }
 
     function gc() { return true; }
+
+    function __construct()
+    {
+       if (ini_get("unicode.semantics")) {
+               /* Setup proper deserialization data for unicode.semantics mode 
*/
+               $this->data = str_replace('s:', 'U:', $this->data);
+       }
+    }
 }
 
 $hnd = new handler;
@@ -55,6 +64,7 @@
 
 session_id("abtest");
 session_start();
+
 $baz = $_SESSION['baz'];
 $arr = $_SESSION['arr'];
 $baz->method();
@@ -110,3 +120,40 @@
   }
 }
 DESTROY: abtest
+--UEXPECTF--
+OPEN: PHPSESSID
+READ: abtest
+object(foo)#%d (2) {
+  [u"bar"]=>
+  unicode(2) "ok"
+  [u"yes"]=>
+  int(2)
+}
+array(1) {
+  [3]=>
+  object(foo)#%d (2) {
+    [u"bar"]=>
+    unicode(2) "ok"
+    [u"yes"]=>
+    int(2)
+  }
+}
+WRITE: abtest, 
baz|O:3:"foo":2:{U:3:"bar";U:2:"ok";U:3:"yes";i:2;}arr|a:1:{i:3;O:3:"foo":2:{U:3:"bar";U:2:"ok";U:3:"yes";i:2;}}
+OPEN: PHPSESSID
+READ: abtest
+object(foo)#%d (2) {
+  [u"bar"]=>
+  unicode(2) "ok"
+  [u"yes"]=>
+  int(2)
+}
+array(1) {
+  [3]=>
+  object(foo)#%d (2) {
+    [u"bar"]=>
+    unicode(2) "ok"
+    [u"yes"]=>
+    int(2)
+  }
+}
+DESTROY: abtest
http://cvs.php.net/viewvc.cgi/php-src/ext/session/tests/005.phpt?r1=1.16&r2=1.17&diff_format=u
Index: php-src/ext/session/tests/005.phpt
diff -u php-src/ext/session/tests/005.phpt:1.16 
php-src/ext/session/tests/005.phpt:1.17
--- php-src/ext/session/tests/005.phpt:1.16     Wed Dec 27 19:22:29 2006
+++ php-src/ext/session/tests/005.phpt  Fri Jan  5 02:07:59 2007
@@ -13,7 +13,8 @@
 error_reporting(E_ALL);
 
 class handler {
-       public $data = 
'baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:1;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:1;}}';
+    public $data = 
'baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:1;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:1;}}';
+
     function open($save_path, $session_name)
     {
         print "OPEN: $session_name\n";
@@ -33,7 +34,7 @@
     function write($key, $val)
     {
         print "WRITE: $key, $val\n";
-               $GLOBALS["hnd"]->data = $val;
+        $GLOBALS["hnd"]->data = $val;
         return true;
     }
 
@@ -44,6 +45,13 @@
     }
 
     function gc() { return true; }
+
+    function __construct()
+    {
+        if (ini_get("unicode.semantics")) {
+            $this->data = str_replace('s:', 'U:', $this->data);
+        }
+    }
 }
 
 $hnd = new handler;
@@ -149,3 +157,64 @@
 int(123)
 DESTROY: abtest
 CLOSE
+--UEXPECTF--
+OPEN: PHPSESSID
+READ: abtest
+object(foo)#%d (2) {
+  [u"bar"]=>
+  unicode(2) "ok"
+  [u"yes"]=>
+  int(2)
+}
+array(1) {
+  [3]=>
+  object(foo)#%d (2) {
+    [u"bar"]=>
+    unicode(2) "ok"
+    [u"yes"]=>
+    int(2)
+  }
+}
+WRITE: abtest, 
baz|O:3:"foo":2:{U:3:"bar";U:2:"ok";U:3:"yes";i:2;}arr|a:1:{i:3;O:3:"foo":2:{U:3:"bar";U:2:"ok";U:3:"yes";i:2;}}
+CLOSE
+OPEN: PHPSESSID
+READ: abtest
+object(foo)#%d (2) {
+  [u"bar"]=>
+  unicode(2) "ok"
+  [u"yes"]=>
+  int(3)
+}
+array(1) {
+  [3]=>
+  object(foo)#%d (2) {
+    [u"bar"]=>
+    unicode(2) "ok"
+    [u"yes"]=>
+    int(3)
+  }
+}
+int(123)
+WRITE: abtest, 
baz|O:3:"foo":2:{U:3:"bar";U:2:"ok";U:3:"yes";i:3;}arr|a:1:{i:3;O:3:"foo":2:{U:3:"bar";U:2:"ok";U:3:"yes";i:3;}}c|i:123;
+CLOSE
+OPEN: PHPSESSID
+READ: abtest
+object(foo)#%d (2) {
+  [u"bar"]=>
+  unicode(2) "ok"
+  [u"yes"]=>
+  int(3)
+}
+array(1) {
+  [3]=>
+  object(foo)#%d (2) {
+    [u"bar"]=>
+    unicode(2) "ok"
+    [u"yes"]=>
+    int(3)
+  }
+}
+int(123)
+DESTROY: abtest
+CLOSE
+

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

Reply via email to