summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohan Dahlin <johan@gnome.org>2008-03-01 13:53:39 +0000
committerJohan Dahlin <johan@src.gnome.org>2008-03-01 13:53:39 +0000
commit7bcdd85f44149dc8614af15157cf8da68eacb932 (patch)
treeb7e64c879dcd028e0c403985d7ad9ed66a304d66
parent9acfc511074d1c64ca5b5854519deb72bd06fc16 (diff)
downloadgdk-pixbuf-7bcdd85f44149dc8614af15157cf8da68eacb932.tar.gz
Merged from trunk:
2008-02-29 Johan Dahlin <johan@gnome.org> Merged from trunk: * gtk/gtkbuilder.c: * gtk/gtkbuilderparser.c: * gtk/gtkbuilderprivate.h: Do not use g_error for a few more errors, instead set the GError sent in through add_from_file/add_from_string. * tests/buildertest.c: Add a couple of new parsing tests. (#519199, Pavel Syomin) svn path=/branches/gtk-2-12/; revision=19682
-rw-r--r--ChangeLog13
-rw-r--r--gtk/gtkbuilder.c45
-rw-r--r--gtk/gtkbuilderparser.c29
-rw-r--r--gtk/gtkbuilderprivate.h3
-rw-r--r--tests/buildertest.c22
5 files changed, 93 insertions, 19 deletions
diff --git a/ChangeLog b/ChangeLog
index 0a13d264d..8bfbca105 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2008-02-29 Johan Dahlin <johan@gnome.org>
+
+ Merged from trunk:
+
+ * gtk/gtkbuilder.c:
+ * gtk/gtkbuilderparser.c:
+ * gtk/gtkbuilderprivate.h:
+ Do not use g_error for a few more errors, instead set
+ the GError sent in through add_from_file/add_from_string.
+ * tests/buildertest.c:
+ Add a couple of new parsing tests.
+ (#519199, Pavel Syomin)
+
2008-02-29 Federico Mena Quintero <federico@novell.com>
Merged from trunk:
diff --git a/gtk/gtkbuilder.c b/gtk/gtkbuilder.c
index 5f6e1dff8..80afd1abd 100644
--- a/gtk/gtkbuilder.c
+++ b/gtk/gtkbuilder.c
@@ -334,7 +334,8 @@ gtk_builder_get_parameters (GtkBuilder *builder,
static GObject *
gtk_builder_get_internal_child (GtkBuilder *builder,
ObjectInfo *info,
- const gchar *childname)
+ const gchar *childname,
+ GError **error)
{
GObject *obj = NULL;
@@ -359,14 +360,19 @@ gtk_builder_get_internal_child (GtkBuilder *builder,
};
if (!obj)
- g_error ("Unknown internal child: %s\n", childname);
-
+ {
+ g_set_error (error,
+ GTK_BUILDER_ERROR,
+ GTK_BUILDER_ERROR_INVALID_VALUE,
+ "Unknown internal child: %s", childname);
+ }
return obj;
}
GObject *
_gtk_builder_construct (GtkBuilder *builder,
- ObjectInfo *info)
+ ObjectInfo *info,
+ GError **error)
{
GArray *parameters, *construct_parameters;
GType object_type;
@@ -379,7 +385,14 @@ _gtk_builder_construct (GtkBuilder *builder,
g_assert (info->class_name != NULL);
object_type = gtk_builder_get_type_from_name (builder, info->class_name);
if (object_type == G_TYPE_INVALID)
- g_error ("Invalid type: %s", info->class_name);
+ {
+ g_set_error (error,
+ GTK_BUILDER_ERROR,
+ GTK_BUILDER_ERROR_INVALID_VALUE,
+ "Invalid object type `%s'",
+ info->class_name);
+ return NULL;
+ }
gtk_builder_get_parameters (builder, object_type,
info->id,
@@ -393,9 +406,17 @@ _gtk_builder_construct (GtkBuilder *builder,
constructor = gtk_builder_get_object (builder, info->constructor);
if (constructor == NULL)
- g_error ("Unknown constructor for %s: %s\n", info->id,
- info->constructor);
-
+ {
+ g_set_error (error,
+ GTK_BUILDER_ERROR,
+ GTK_BUILDER_ERROR_INVALID_VALUE,
+ "Unknown object constructor for %s: %s",
+ info->id,
+ info->constructor);
+ g_array_free (parameters, TRUE);
+ g_array_free (construct_parameters, TRUE);
+ return NULL;
+ }
obj = gtk_buildable_construct_child (GTK_BUILDABLE (constructor),
builder,
info->id);
@@ -407,7 +428,13 @@ _gtk_builder_construct (GtkBuilder *builder,
else if (info->parent && ((ChildInfo*)info->parent)->internal_child != NULL)
{
gchar *childname = ((ChildInfo*)info->parent)->internal_child;
- obj = gtk_builder_get_internal_child (builder, info, childname);
+ obj = gtk_builder_get_internal_child (builder, info, childname, error);
+ if (!obj)
+ {
+ g_array_free (parameters, TRUE);
+ g_array_free (construct_parameters, TRUE);
+ return NULL;
+ }
if (construct_parameters->len)
g_warning ("Can't pass in construct-only parameters to %s", childname);
g_object_ref (obj);
diff --git a/gtk/gtkbuilderparser.c b/gtk/gtkbuilderparser.c
index 73fe135c7..b0f965448 100644
--- a/gtk/gtkbuilderparser.c
+++ b/gtk/gtkbuilderparser.c
@@ -182,8 +182,9 @@ _gtk_builder_boolean_from_string (const gchar *string,
}
static GObject *
-builder_construct (ParserData *data,
- ObjectInfo *object_info)
+builder_construct (ParserData *data,
+ ObjectInfo *object_info,
+ GError **error)
{
GObject *object;
@@ -194,7 +195,10 @@ builder_construct (ParserData *data,
object_info->properties = g_slist_reverse (object_info->properties);
- object = _gtk_builder_construct (data->builder, object_info);
+ object = _gtk_builder_construct (data->builder, object_info, error);
+ if (!object)
+ return NULL;
+
g_assert (G_IS_OBJECT (object));
object_info->object = object;
@@ -345,7 +349,7 @@ parse_child (ParserData *data,
child_info->parent = (CommonInfo*)object_info;
- object_info->object = builder_construct (data, object_info);
+ object_info->object = builder_construct (data, object_info, error);
}
static void
@@ -643,8 +647,13 @@ parse_custom (GMarkupParseContext *context,
{
ObjectInfo* object_info = (ObjectInfo*)parent_info;
if (!object_info->object)
- object_info->object = _gtk_builder_construct (data->builder,
- object_info);
+ {
+ object_info->object = _gtk_builder_construct (data->builder,
+ object_info,
+ error);
+ if (!object_info->object)
+ return TRUE; /* A GError is already set */
+ }
g_assert (object_info->object);
object = object_info->object;
child = NULL;
@@ -803,8 +812,12 @@ end_element (GMarkupParseContext *context,
ObjectInfo *object_info = state_pop_info (data, ObjectInfo);
ChildInfo* child_info = state_peek_info (data, ChildInfo);
- object_info->object = builder_construct (data, object_info);
-
+ object_info->object = builder_construct (data, object_info, error);
+ if (!object_info->object)
+ {
+ free_object_info (object_info);
+ return;
+ }
if (child_info)
child_info->object = object_info->object;
diff --git a/gtk/gtkbuilderprivate.h b/gtk/gtkbuilderprivate.h
index bcb8d8984..f0973322e 100644
--- a/gtk/gtkbuilderprivate.h
+++ b/gtk/gtkbuilderprivate.h
@@ -103,7 +103,8 @@ void _gtk_builder_parser_parse_buffer (GtkBuilder *builder,
gsize length,
GError **error);
GObject * _gtk_builder_construct (GtkBuilder *builder,
- ObjectInfo *info);
+ ObjectInfo *info,
+ GError **error);
void _gtk_builder_add (GtkBuilder *builder,
ChildInfo *child_info);
void _gtk_builder_add_signals (GtkBuilder *builder,
diff --git a/tests/buildertest.c b/tests/buildertest.c
index 6d0c7e4c5..aed4aeaa9 100644
--- a/tests/buildertest.c
+++ b/tests/buildertest.c
@@ -76,6 +76,27 @@ gboolean test_parser (void)
g_return_val_if_fail (error->code == GTK_BUILDER_ERROR_INVALID_TAG, FALSE);
g_error_free (error);
+ error = NULL;
+ gtk_builder_add_from_string (builder, "<interface><object class=\"Unknown\" id=\"a\"></object></interface>", -1, &error);
+ g_assert (error != NULL);
+ g_assert (error->domain == GTK_BUILDER_ERROR);
+ g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
+ g_error_free (error);
+
+ error = NULL;
+ gtk_builder_add_from_string (builder, "<interface><object class=\"GtkWidget\" id=\"a\" constructor=\"none\"></object></interface>", -1, &error);
+ g_assert (error != NULL);
+ g_assert (error->domain == GTK_BUILDER_ERROR);
+ g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
+ g_error_free (error);
+
+ error = NULL;
+ gtk_builder_add_from_string (builder, "<interface><object class=\"GtkButton\" id=\"a\"><child internal-child=\"foobar\"><object class=\"GtkButton\" id=\"int\"/></child></object></interface>", -1, &error);
+ g_assert (error != NULL);
+ g_assert (error->domain == GTK_BUILDER_ERROR);
+ g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
+ g_error_free (error);
+
g_object_unref (builder);
return TRUE;
@@ -1858,7 +1879,6 @@ main (int argc, char **argv)
g_print ("Testing parser\n");
if (!test_parser ())
g_error ("test_parser failed");
-
g_print ("Testing types\n");
if (!test_types ())
g_error ("test_types failed");