From 745b19d640e657118b298c6b7cc37798af878a5a Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Sat, 9 Jul 2005 18:54:45 +0000 Subject: 2005-07-09 Colin Walters * glib/dbus-gparser.c (parse_annotation): Add annotations to argument if available, not method. * glib/dbus-gobject.c (arg_iterate): More verbose warnings. (invoke_object_method): First, remove some redundant GValues (object_value, error_value) in favor of working on array directly. Second, rework constness to be less buggy. Now we iterate directly over the argument metadata instead of parallel iterating over output signature and metadata. * glib/dbus-glib-tool.h: Add INVALID_ANNOTATION error. * glib/dbus-binding-tool-glib.c (generate_glue): Barf on const annotation on input args. --- ChangeLog | 17 ++++++++++++++ glib/dbus-binding-tool-glib.c | 17 ++++++++++++-- glib/dbus-glib-tool.h | 3 ++- glib/dbus-gobject.c | 54 +++++++++++++++++++++++++------------------ glib/dbus-gparser.c | 7 +++--- 5 files changed, 69 insertions(+), 29 deletions(-) diff --git a/ChangeLog b/ChangeLog index d6734049..00c77880 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2005-07-09 Colin Walters + + * glib/dbus-gparser.c (parse_annotation): Add annotations to + argument if available, not method. + + * glib/dbus-gobject.c (arg_iterate): More verbose warnings. + (invoke_object_method): First, remove some redundant + GValues (object_value, error_value) in favor of working on + array directly. Second, rework constness to be less buggy. + Now we iterate directly over the argument metadata instead + of parallel iterating over output signature and metadata. + + * glib/dbus-glib-tool.h: Add INVALID_ANNOTATION error. + + * glib/dbus-binding-tool-glib.c (generate_glue): Barf on const + annotation on input args. + 2005-07-09 Colin Walters * glib/dbus-binding-tool-glib.h (DBUS_GLIB_ANNOTATION_CONST): diff --git a/glib/dbus-binding-tool-glib.c b/glib/dbus-binding-tool-glib.c index c87327a3..f161c638 100644 --- a/glib/dbus-binding-tool-glib.c +++ b/glib/dbus-binding-tool-glib.c @@ -554,8 +554,21 @@ generate_glue (BaseInfo *base, DBusBindingToolCData *data, GError **error) g_string_append_c (object_introspection_data_blob, direction); g_string_append_c (object_introspection_data_blob, '\0'); - if (method_info_get_annotation (method, DBUS_GLIB_ANNOTATION_CONST) != NULL) - g_string_append_c (object_introspection_data_blob, 'C'); + if (arg_info_get_annotation (arg, DBUS_GLIB_ANNOTATION_CONST) != NULL) + { + if (arg_info_get_direction (arg) == ARG_IN) + { + g_set_error (error, + DBUS_BINDING_TOOL_ERROR, + DBUS_BINDING_TOOL_ERROR_INVALID_ANNOTATION, + "Input argument \"%s\" has const annotation in method \"%s\" of interface \"%s\"\n", + arg_info_get_name (arg), + method_info_get_name (method), + interface_info_get_name (interface)); + return FALSE; + } + g_string_append_c (object_introspection_data_blob, 'C'); + } else g_string_append_c (object_introspection_data_blob, 'F'); g_string_append_c (object_introspection_data_blob, '\0'); diff --git a/glib/dbus-glib-tool.h b/glib/dbus-glib-tool.h index b56d764a..0c61de74 100644 --- a/glib/dbus-glib-tool.h +++ b/glib/dbus-glib-tool.h @@ -27,7 +27,8 @@ typedef enum { - DBUS_BINDING_TOOL_ERROR_UNSUPPORTED_CONVERSION + DBUS_BINDING_TOOL_ERROR_UNSUPPORTED_CONVERSION, + DBUS_BINDING_TOOL_ERROR_INVALID_ANNOTATION } DBusBindingToolError; #define DBUS_BINDING_TOOL_ERROR dbus_binding_tool_error_quark () diff --git a/glib/dbus-gobject.c b/glib/dbus-gobject.c index ce90eaa7..58291573 100644 --- a/glib/dbus-gobject.c +++ b/glib/dbus-gobject.c @@ -162,7 +162,7 @@ arg_iterate (const char *data, *in = FALSE; break; default: - g_warning ("invalid arg direction"); + g_warning ("invalid arg direction '%c'", *data); break; } @@ -176,7 +176,7 @@ arg_iterate (const char *data, *constval = TRUE; break; default: - g_warning ("invalid arg const value"); + g_warning ("invalid arg const value '%c'", *data); break; } @@ -843,8 +843,6 @@ invoke_object_method (GObject *object, gboolean had_error, call_only; GError *gerror; GValueArray *value_array; - GValue object_value = {0,}; - GValue error_value = {0,}; GValue return_value = {0,}; GClosure closure; char *in_signature; @@ -860,6 +858,9 @@ invoke_object_method (GObject *object, gerror = NULL; + /* Determine whether or not this method should be invoked in a new + thread + */ if (strcmp (string_table_lookup (get_method_data (object_info, method), 2), "A") == 0) call_only = TRUE; else @@ -904,10 +905,9 @@ invoke_object_method (GObject *object, } /* Prepend object as first argument */ - g_value_init (&object_value, G_TYPE_OBJECT); - g_value_set_object (&object_value, object); - g_value_array_prepend (value_array, &object_value); - g_value_unset (&object_value); + g_value_array_prepend (value_array, NULL); + g_value_init (g_value_array_get_nth (value_array, 0), G_TYPE_OBJECT); + g_value_set_object (g_value_array_get_nth (value_array, 0), object); if (call_only) { @@ -975,9 +975,9 @@ invoke_object_method (GObject *object, } /* Append GError as final argument */ - g_value_init (&error_value, G_TYPE_POINTER); - g_value_set_pointer (&error_value, &gerror); - g_value_array_append (value_array, &error_value); + g_value_array_append (value_array, NULL); + g_value_init (g_value_array_get_nth (value_array, value_array->n_values - 1), G_TYPE_POINTER); + g_value_set_pointer (g_value_array_get_nth (value_array, value_array->n_values - 1), &gerror); } /* Actually invoke method */ g_value_init (&return_value, G_TYPE_BOOLEAN); @@ -997,9 +997,7 @@ invoke_object_method (GObject *object, DBusMessageIter iter; const char *arg_metadata; - /* Grab the metadata and iterate over it so we can determine - * whether or not a value is constant - */ + /* Grab the argument metadata and iterate over it */ arg_metadata = method_arg_info_from_object_info (object_info, method); reply = dbus_message_new_method_return (message); @@ -1008,22 +1006,36 @@ invoke_object_method (GObject *object, /* Append OUT arguments to reply */ dbus_message_iter_init_append (reply, &iter); - dbus_signature_iter_init (&out_signature_iter, out_signature); out_param_pos = 0; out_param_gvalue_pos = 0; - while ((current_type = dbus_signature_iter_get_current_type (&out_signature_iter)) != DBUS_TYPE_INVALID) + while (*arg_metadata) { GValue gvalue = {0, }; const char *arg_name; gboolean arg_in; gboolean constval; const char *arg_signature; + DBusSignatureIter argsigiter; + + do + { + /* Look for constness; skip over input arguments */ + arg_metadata = arg_iterate (arg_metadata, &arg_name, &arg_in, &constval, &arg_signature); + } + while (arg_in && *arg_metadata); + + /* If the last argument we saw was input, we must be done iterating over + * output arguments. + */ + if (arg_in) + break; - g_assert (*arg_metadata); - arg_metadata = arg_iterate (arg_metadata, &arg_name, &arg_in, &constval, &arg_signature); + dbus_signature_iter_init (&argsigiter, arg_signature); - g_value_init (&gvalue, dbus_gtype_from_signature_iter (&out_signature_iter, FALSE)); - if (current_type != DBUS_TYPE_VARIANT) + g_print ("looking at arg %s (%s)\n", arg_name, constval ? "TRUE" : "FALSE"); + + g_value_init (&gvalue, dbus_gtype_from_signature_iter (&argsigiter, FALSE)); + if (G_VALUE_TYPE (&gvalue) != G_TYPE_VALUE) { if (!dbus_gvalue_take (&gvalue, &(g_array_index (out_param_values, GTypeCValue, out_param_pos)))) @@ -1044,7 +1056,6 @@ invoke_object_method (GObject *object, */ if (!constval) g_value_unset (&gvalue); - dbus_signature_iter_next (&out_signature_iter); } } else @@ -1064,7 +1075,6 @@ invoke_object_method (GObject *object, { g_array_free (out_param_values, TRUE); g_value_array_free (out_param_gvalues); - g_value_unset (&error_value); } g_value_array_free (value_array); g_value_unset (&return_value); diff --git a/glib/dbus-gparser.c b/glib/dbus-gparser.c index 4c962874..bf89492d 100644 --- a/glib/dbus-gparser.c +++ b/glib/dbus-gparser.c @@ -666,7 +666,6 @@ parse_arg (Parser *parser, method_info_get_n_args (parser->method) : signal_info_get_n_args (parser->signal)); - arg = arg_info_new (name ? name : generated_name, dir, type); if (parser->method) method_info_add_arg (parser->method, arg); @@ -732,12 +731,12 @@ parse_annotation (Parser *parser, return FALSE; } - if (parser->method) + if (parser->arg) + arg_info_add_annotation (parser->arg, name, value); + else if (parser->method) method_info_add_annotation (parser->method, name, value); else if (parser->interface) interface_info_add_annotation (parser->interface, name, value); - else if (parser->arg) - arg_info_add_annotation (parser->arg, name, value); else g_assert_not_reached (); -- cgit