com gtk/php-gtk: UTF-8 conversions should now be handled automatically whenever we convert between GValue and zval.: main/php_gtk. h main/php_gtk_object.c main/phpg_closure.c mai n/phpg_gvalue.c main/phpg_support.c
[email protected] (David Soria Parra) Thu, 09 Feb 2006 08:46:21 +0000
| Newsgroups | php.gtk.cvs |
|---|---|
| Message-ID | <[email protected]> |
Commit: 5d2ed39cfd630f1eab09470d6a07d98d6808d59a Author: Andrei Zmievski <[email protected]> Thu, 9 Feb 2006 08:46:21 +0000 Parents: 12e4f3ec68cf13c91b17d85c2d12297e62a1702d Branches: master Link: http://git.php.net/?p=gtk/php-gtk.git;a=commitdiff;h=5d2ed39cfd630f1eab09470d6a07d98d6808d59a Log: UTF-8 conversions should now be handled automatically whenever we convert between GValue and zval. Changed paths: M main/php_gtk.h M main/php_gtk_object.c M main/phpg_closure.c M main/phpg_gvalue.c M main/phpg_support.c Diff: 5d2ed39cfd630f1eab09470d6a07d98d6808d59a diff --git a/main/php_gtk.h b/main/php_gtk.h index df32b76..65705c9 100644 --- a/main/php_gtk.h +++ b/main/php_gtk.h @@ -419,8 +419,8 @@ PHP_GTK_API GType phpg_gtype_from_class(zend_class_entry *ce); /* GValue */ -PHP_GTK_API int phpg_gvalue_to_zval(const GValue *gval, zval **value, zend_bool copy_boxed TSRMLS_DC); -PHP_GTK_API int phpg_gvalue_from_zval(GValue *gval, zval *value TSRMLS_DC); +PHP_GTK_API int phpg_gvalue_to_zval(const GValue *gval, zval **value, zend_bool copy_boxed, zend_bool do_utf8 TSRMLS_DC); +PHP_GTK_API int phpg_gvalue_from_zval(GValue *gval, zval *value, zend_bool do_utf8 TSRMLS_DC); PHP_GTK_API int phpg_param_gvalue_to_zval(const GValue *gval, zval **value, zend_bool copy_boxed, const GParamSpec *pspec TSRMLS_DC); PHP_GTK_API int phpg_param_gvalue_from_zval(GValue *gval, zval *value, const GParamSpec *pspec TSRMLS_DC); PHP_GTK_API zval *phpg_gvalues_to_array(const GValue *values, uint n_values); diff --git a/main/php_gtk_object.c b/main/php_gtk_object.c index 28475f9..973c470 100644 --- a/main/php_gtk_object.c +++ b/main/php_gtk_object.c @@ -156,6 +156,7 @@ PHP_GTK_API int php_gtk_get_simple_enum_value(zval *enum_val, int *result) return 0; } +#if 0 PHP_GTK_API int php_gtk_get_enum_value(GType enum_type, zval *enum_val, int *result) { if (!enum_val) @@ -221,6 +222,7 @@ int php_gtk_get_flag_value(GType flag_type, zval *flag_val, int *result) php_error(E_WARNING, "flag values must be integers or strings"); return 0; } +#endif /* Generic callback marshal. */ PHP_GTK_API void php_gtk_callback_marshal(GtkObject *o, gpointer data, guint nargs, GtkArg *args) diff --git a/main/phpg_closure.c b/main/phpg_closure.c index 5ea0048..8e387c5 100644 --- a/main/phpg_closure.c +++ b/main/phpg_closure.c @@ -108,7 +108,7 @@ static void phpg_closure_marshal(GClosure *closure, for ( ; i < n_param_values; i++) { params[i] = (zval **) emalloc(sizeof(zval *)); *(params[i]) = NULL; - if (phpg_gvalue_to_zval(¶m_values[i], params[i], FALSE TSRMLS_CC) != SUCCESS) { + if (phpg_gvalue_to_zval(¶m_values[i], params[i], FALSE, TRUE TSRMLS_CC) != SUCCESS) { goto err_marshal; } } @@ -126,7 +126,7 @@ static void phpg_closure_marshal(GClosure *closure, if (retval) { if (return_value) { - if (phpg_gvalue_from_zval(return_value, retval TSRMLS_CC) == FAILURE) { + if (phpg_gvalue_from_zval(return_value, retval, TRUE TSRMLS_CC) == FAILURE) { php_error(E_WARNING, "Could not convert return value of signal callback '%s' to '%s'", callback_name, g_type_name(G_VALUE_TYPE(return_value))); } diff --git a/main/phpg_gvalue.c b/main/phpg_gvalue.c index 609acf2..89478dd 100644 --- a/main/phpg_gvalue.c +++ b/main/phpg_gvalue.c @@ -32,7 +32,7 @@ /* {{{ PHP_GTK_API phpg_gvalue_to_zval() */ -PHP_GTK_API int phpg_gvalue_to_zval(const GValue *gval, zval **value, zend_bool copy_boxed TSRMLS_DC) +PHP_GTK_API int phpg_gvalue_to_zval(const GValue *gval, zval **value, zend_bool copy_boxed, zend_bool do_utf8 TSRMLS_DC) { assert(value != NULL); @@ -104,11 +104,25 @@ PHP_GTK_API int phpg_gvalue_to_zval(const GValue *gval, zval **value, zend_bool case G_TYPE_STRING: { + gchar *cp = NULL; + gsize cp_len = 0; + zend_bool free_cp = 0; const gchar *str = g_value_get_string(gval); MAKE_ZVAL_IF_NULL(*value); if (str != NULL) { + if (do_utf8) { + cp = phpg_from_utf8(str, strlen(str), &cp_len, &free_cp TSRMLS_CC); + if (cp) { + str = cp; + } else { + php_error(E_WARNING, "Could not convert string from UTF-8"); + } + } ZVAL_STRING(*value, (char *)str, 1); + if (free_cp) { + g_free(cp); + } } else ZVAL_NULL(*value); } @@ -160,7 +174,7 @@ PHP_GTK_API int phpg_gvalue_to_zval(const GValue *gval, zval **value, zend_bool for (i = 0; i < value_count; i++) { MAKE_STD_ZVAL(item); - phpg_gvalue_to_zval(array->values + i, &item, copy_boxed TSRMLS_CC); + phpg_gvalue_to_zval(array->values + i, &item, copy_boxed, TRUE TSRMLS_CC); add_next_index_zval(*value, item); } } else if ((gbm = phpg_gboxed_lookup_custom(G_VALUE_TYPE(gval)))) { @@ -188,7 +202,7 @@ PHP_GTK_API int phpg_gvalue_to_zval(const GValue *gval, zval **value, zend_bool /* }}} */ /* {{{ PHP_GTK_API phpg_gvalue_from_zval() */ -PHP_GTK_API int phpg_gvalue_from_zval(GValue *gval, zval *value TSRMLS_DC) +PHP_GTK_API int phpg_gvalue_from_zval(GValue *gval, zval *value, zend_bool do_utf8 TSRMLS_DC) { switch (G_TYPE_FUNDAMENTAL(G_VALUE_TYPE(gval))) { /* @@ -265,9 +279,28 @@ PHP_GTK_API int phpg_gvalue_from_zval(GValue *gval, zval *value TSRMLS_DC) } case G_TYPE_STRING: + { + gchar *utf8 = NULL; + gsize utf8_len = 0; + zend_bool free_utf8 = 0; + gchar *str; + convert_to_string(value); - g_value_set_string(gval, Z_STRVAL_P(value)); + str = Z_STRVAL_P(value); + if (do_utf8) { + utf8 = phpg_to_utf8(Z_STRVAL_P(value), Z_STRLEN_P(value), &utf8_len, &free_utf8 TSRMLS_CC); + if (utf8) { + str = utf8; + } else { + php_error(E_WARNING, "Could not convert string to UTF-8"); + } + } + g_value_set_string(gval, str); + if (free_utf8) { + g_free(utf8); + } break; + } case G_TYPE_POINTER: if (Z_TYPE_P(value) == IS_NULL) { @@ -343,7 +376,7 @@ PHP_GTK_API int phpg_param_gvalue_to_zval(const GValue *gval, zval **value, zend /* TODO */ return FAILURE; } else { - return phpg_gvalue_to_zval(gval, value, copy_boxed TSRMLS_CC); + return phpg_gvalue_to_zval(gval, value, copy_boxed, TRUE TSRMLS_CC); } } /* }}} */ @@ -355,7 +388,7 @@ PHP_GTK_API int phpg_param_gvalue_from_zval(GValue *gval, zval *value, const GPa /* TODO */ return FAILURE; } else { - return phpg_gvalue_from_zval(gval, value TSRMLS_CC); + return phpg_gvalue_from_zval(gval, value, TRUE TSRMLS_CC); } } /* }}} */ diff --git a/main/phpg_support.c b/main/phpg_support.c index cd2bb78..76ad10b 100644 --- a/main/phpg_support.c +++ b/main/phpg_support.c @@ -565,7 +565,7 @@ PHP_GTK_API zend_bool phpg_parse_ctor_props(GType gtype, zval **php_args, GParam params[i].name = prop_names[i]; g_value_init(¶ms[i].value, spec->value_type); - if (phpg_gvalue_from_zval(¶ms[i].value, php_args[i] TSRMLS_CC) == FAILURE) { + if (phpg_gvalue_from_zval(¶ms[i].value, php_args[i], FALSE TSRMLS_CC) == FAILURE) { php_error(E_WARNING, "Could not convert value for parameter '%s' of type '%s'", prop_names[i], g_type_name(spec->value_type)); g_type_class_unref(klass);