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(&param_values[i], params[i], FALSE TSRMLS_CC) != SUCCESS) {
+        if (phpg_gvalue_to_zval(&param_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(&params[i].value, spec->value_type);
 
-        if (phpg_gvalue_from_zval(&params[i].value, php_args[i] TSRMLS_CC) == FAILURE) {
+        if (phpg_gvalue_from_zval(&params[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);