From 3d69cfeab177e79b4ecfe1b4284a5bd840fd11e7 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Thu, 2 Apr 2009 14:01:05 +0100 Subject: [PATCH] Fix hyphenated error codes correctly The error code names generated my glib-mkenums separate the words by hyphens which are invalid D-BUS error names. This patch converts them back to wincaps, but we can't uppercase the first letter. Based on an original patch from Neil Roberts --- dbus/dbus-gobject.c | 21 ++++++++++++++++++--- test/core/my-object.c | 13 +++++++++++++ test/core/my-object.h | 4 +++- test/core/test-dbus-glib.c | 7 +++++++ test/core/test-service-glib.xml | 3 +++ 5 files changed, 44 insertions(+), 4 deletions(-) diff --git a/dbus/dbus-gobject.c b/dbus/dbus-gobject.c index f75a3b1..e294c35 100644 --- a/dbus/dbus-gobject.c +++ b/dbus/dbus-gobject.c @@ -46,13 +46,14 @@ static GHashTable *marshal_table = NULL; static GData *error_metadata = NULL; static char* -uscore_to_wincaps (const char *uscore) +uscore_to_wincaps_full (const char *uscore, + gboolean uppercase_first) { const char *p; GString *str; gboolean last_was_uscore; - last_was_uscore = TRUE; + last_was_uscore = uppercase_first; str = g_string_new (NULL); p = uscore; @@ -78,6 +79,12 @@ uscore_to_wincaps (const char *uscore) return g_string_free (str, FALSE); } +static char * +uscore_to_wincaps (const char *uscore) +{ + return uscore_to_wincaps_full (uscore, TRUE); +} + static const char * string_table_next (const char *table) { @@ -1065,6 +1072,7 @@ gerror_domaincode_to_dbus_error_name (const DBusGObjectInfo *object_info, { GEnumValue *value; GEnumClass *klass; + const char *p; klass = g_type_class_ref (info->code_enum); value = g_enum_get_value (klass, code); @@ -1093,9 +1101,16 @@ gerror_domaincode_to_dbus_error_name (const DBusGObjectInfo *object_info, } else { + gchar *code_str_wincaps; dbus_error_name = g_string_new (domain_str); g_string_append_c (dbus_error_name, '.'); - g_string_append (dbus_error_name, code_str); + /* We can't uppercase here for backwards compatibility + * reasons; if someone had a lowercase enumeration value, + * previously we'd just send it across unaltered. + */ + code_str_wincaps = uscore_to_wincaps_full (code_str, FALSE); + g_string_append (dbus_error_name, code_str_wincaps); + g_free (code_str_wincaps); } return g_string_free (dbus_error_name, FALSE); diff --git a/test/core/my-object.c b/test/core/my-object.c index 6059724..886943e 100644 --- a/test/core/my-object.c +++ b/test/core/my-object.c @@ -169,6 +169,7 @@ my_object_error_get_type (void) ENUM_ENTRY (MY_OBJECT_ERROR_FOO, "Foo"), ENUM_ENTRY (MY_OBJECT_ERROR_BAR, "Bar"), + ENUM_ENTRY (MY_OBJECT_ERROR_MULTI_WORD, "Multi-word"), { 0, 0, 0 } }; @@ -235,6 +236,18 @@ my_object_throw_not_supported (MyObject *obj, GError **error) } gboolean +my_object_throw_error_multi_word (MyObject *obj, GError **error) +{ + g_set_error (error, + MY_OBJECT_ERROR, + MY_OBJECT_ERROR_MULTI_WORD, + "%s", + "this method's error has a hyphen"); + return FALSE; +} + + +gboolean my_object_uppercase (MyObject *obj, const char *str, char **ret, GError **error) { *ret = g_ascii_strup (str, -1); diff --git a/test/core/my-object.h b/test/core/my-object.h index 7fe449d..1d3c869 100644 --- a/test/core/my-object.h +++ b/test/core/my-object.h @@ -31,7 +31,8 @@ struct MyObjectClass typedef enum { MY_OBJECT_ERROR_FOO, - MY_OBJECT_ERROR_BAR + MY_OBJECT_ERROR_BAR, + MY_OBJECT_ERROR_MULTI_WORD } MyObjectError; #define MY_OBJECT_ERROR (my_object_error_quark ()) @@ -50,6 +51,7 @@ gint32 my_object_increment_retval_error (MyObject *obj, gint32 x, GError **err gboolean my_object_throw_error (MyObject *obj, GError **error); gboolean my_object_throw_not_supported (MyObject *obj, GError **error); +gboolean my_object_throw_error_multi_word (MyObject *obj, GError **error); gboolean my_object_uppercase (MyObject *obj, const char *str, char **ret, GError **error); diff --git a/test/core/test-dbus-glib.c b/test/core/test-dbus-glib.c index 0e3c12f..6de156c 100644 --- a/test/core/test-dbus-glib.c +++ b/test/core/test-dbus-glib.c @@ -870,6 +870,13 @@ main (int argc, char **argv) g_print ("(wrapped) ThrowError failed (as expected) returned error: %s\n", error->message); g_clear_error (&error); + + g_print ("Calling (wrapped) throw_error_multi_word\n"); + if (org_freedesktop_DBus_GLib_Tests_MyObject_throw_error_multi_word (proxy, &error) != FALSE) + lose ("(wrapped) ThrowErrorMultiWord call unexpectedly succeeded!"); + + g_print ("(wrapped) ThrowErrorMultiWord failed (as expected) returned error: %s\n", error->message); + g_clear_error (&error); if (org_freedesktop_DBus_GLib_Tests_MyObject_async_throw_error (proxy, &error) != FALSE) lose ("(wrapped) AsyncThrowError call unexpectedly succeeded!"); diff --git a/test/core/test-service-glib.xml b/test/core/test-service-glib.xml index 86152c7..5bc94a6 100644 --- a/test/core/test-service-glib.xml +++ b/test/core/test-service-glib.xml @@ -31,6 +31,9 @@ + + + -- 1.6.6.1