From 2b97fb81a508a047b14f4c4426c28abfd18bb2e0 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Sun, 27 Feb 2005 17:38:12 +0000 Subject: 2005-02-27 Colin Walters * glib/dbus-gidl.c (property_info_get_type, arg_info_get_type): Change return value to const char * instead of int so we can do full signatures. (struct PropertyInfo, struct ArgInfo): Store char *. (property_info_new, arg_info_new): Update parameters, strdup. (property_info_unref, arg_info_unref): Free. * glib/dbus-gidl.h: Update prototypes. * glib/dbus-gparser.c (basic_type_from_string): Delete. (validate_signature): New function, just validates signature and sets GError. (parse_property, parse_arg): Invoke validate_signature. Store signature instead of just type code. * glib/dbus-gvalue.c (base_type_from_signature): New utility function to return a primary type for a signature, dropping information about types in container types. (dbus_gvalue_genmarshal_name_from_type) (dbus_gvalue_binding_type_from_type) (dbus_gvalue_ctype_from_type): Update to take full signature instead of type code. (dbus_gtype_to_dbus_type): Moved here from glib/dbus-gobject.c. * glib/dbus-gvalue.h: Update prototypes for above. * glib/dbus-gobject.c (gtype_to_dbus_type): Moved to glib/dbus-gvalue.c as dbus_gtype_to_dbus_type. (introspect_properties, introspect_signals, write_interface): Update to handle signatures, and remove usage of _dbus_gutils_type_to_string. (handle_introspect): Print out type codes instead of e.g. "string" in hardcoded introspection XML; also use x_AS_STRING constants instead of hardcoding in string. * glib/dbus-glib-tool.c (pretty_print): Handle signature change to string. Remove usage of _dbus_gutils_type_to_string. * glib/dbus-gutils.c (_dbus_gutils_type_to_string): Delete. * glib/dbus-gutils.h (_dbus_gutils_type_to_string): Update for deletion. * glib/dbus-binding-tool-glib.c (compute_marshaller) (compute_marshaller_name, generate_glue): Handle signature change to string. (write_formal_parameters, write_args_for_direction): Ditto, and remove FIXME. * tools/dbus-tree-view.c (type_to_string): Delete. (info_set_func_text): Update to print full signatures. * test/glib/test-service-glib.xml: Change types to new introspection format. --- ChangeLog | 57 ++++++++++++++++++++++++++++++++ glib/dbus-binding-tool-glib.c | 20 ++++++------ glib/dbus-gidl.c | 18 ++++++----- glib/dbus-gidl.h | 8 ++--- glib/dbus-glib-tool.c | 8 ++--- glib/dbus-gobject.c | 69 ++++++++------------------------------- glib/dbus-gparser.c | 72 +++++++++-------------------------------- glib/dbus-gutils.c | 42 ------------------------ glib/dbus-gutils.h | 1 - glib/dbus-gvalue.c | 71 ++++++++++++++++++++++++++++++++++++++-- glib/dbus-gvalue.h | 8 +++-- test/glib/test-service-glib.xml | 18 +++++------ tools/dbus-tree-view.c | 47 ++------------------------- 13 files changed, 199 insertions(+), 240 deletions(-) diff --git a/ChangeLog b/ChangeLog index e51ea0c5..c87e4007 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,60 @@ +2005-02-27 Colin Walters + + * glib/dbus-gidl.c (property_info_get_type, arg_info_get_type): + Change return value to const char * instead of int so we can do + full signatures. + (struct PropertyInfo, struct ArgInfo): Store char *. + (property_info_new, arg_info_new): Update parameters, strdup. + (property_info_unref, arg_info_unref): Free. + + * glib/dbus-gidl.h: Update prototypes. + + * glib/dbus-gparser.c (basic_type_from_string): Delete. + (validate_signature): New function, just validates signature and + sets GError. + (parse_property, parse_arg): Invoke validate_signature. Store + signature instead of just type code. + + * glib/dbus-gvalue.c (base_type_from_signature): New utility + function to return a primary type for a signature, dropping + information about types in container types. + (dbus_gvalue_genmarshal_name_from_type) + (dbus_gvalue_binding_type_from_type) + (dbus_gvalue_ctype_from_type): Update to take full signature + instead of type code. + (dbus_gtype_to_dbus_type): Moved here from glib/dbus-gobject.c. + + * glib/dbus-gvalue.h: Update prototypes for above. + + * glib/dbus-gobject.c (gtype_to_dbus_type): Moved to + glib/dbus-gvalue.c as dbus_gtype_to_dbus_type. + (introspect_properties, introspect_signals, write_interface): + Update to handle signatures, and remove usage of + _dbus_gutils_type_to_string. + (handle_introspect): Print out type codes instead of e.g. "string" + in hardcoded introspection XML; also use x_AS_STRING constants + instead of hardcoding in string. + + * glib/dbus-glib-tool.c (pretty_print): Handle signature change + to string. Remove usage of _dbus_gutils_type_to_string. + + * glib/dbus-gutils.c (_dbus_gutils_type_to_string): Delete. + + * glib/dbus-gutils.h (_dbus_gutils_type_to_string): Update for + deletion. + + * glib/dbus-binding-tool-glib.c (compute_marshaller) + (compute_marshaller_name, generate_glue): Handle signature change + to string. + (write_formal_parameters, write_args_for_direction): Ditto, and + remove FIXME. + + * tools/dbus-tree-view.c (type_to_string): Delete. + (info_set_func_text): Update to print full signatures. + + * test/glib/test-service-glib.xml: Change types to new + introspection format. + 2005-02-26 Havoc Pennington * doc/TODO: remove the "guid" item diff --git a/glib/dbus-binding-tool-glib.c b/glib/dbus-binding-tool-glib.c index 94823cb1..641f07da 100644 --- a/glib/dbus-binding-tool-glib.c +++ b/glib/dbus-binding-tool-glib.c @@ -68,13 +68,15 @@ compute_marshaller (MethodInfo *method, GError **error) if (arg_info_get_direction (arg) == ARG_IN) { - const char *marshal_name = dbus_gvalue_genmarshal_name_from_type (arg_info_get_type (arg)); + const char *marshal_name; + + marshal_name = dbus_gvalue_genmarshal_name_from_type (arg_info_get_type (arg)); if (!marshal_name) { g_set_error (error, DBUS_BINDING_TOOL_ERROR, DBUS_BINDING_TOOL_ERROR_UNSUPPORTED_CONVERSION, - _("Unsupported conversion from D-BUS type %d to glib-genmarshal type"), + _("Unsupported conversion from D-BUS type %s to glib-genmarshal type"), arg_info_get_type (arg)); g_string_free (ret, TRUE); return NULL; @@ -129,7 +131,7 @@ compute_marshaller_name (MethodInfo *method, GError **error) if (arg_info_get_direction (arg) == ARG_IN) { const char *marshal_name; - int type; + const char *type; type = arg_info_get_type (arg); marshal_name = dbus_gvalue_genmarshal_name_from_type (type); @@ -145,7 +147,7 @@ compute_marshaller_name (MethodInfo *method, GError **error) } g_string_append (ret, "_"); - g_string_append (ret, dbus_gvalue_genmarshal_name_from_type (arg_info_get_type (arg))); + g_string_append (ret, dbus_gvalue_genmarshal_name_from_type (type)); } } @@ -385,7 +387,7 @@ 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'); - g_string_append_c (object_introspection_data_blob, arg_info_get_type (arg)); + g_string_append (object_introspection_data_blob, arg_info_get_type (arg)); g_string_append_c (object_introspection_data_blob, '\0'); } @@ -608,7 +610,6 @@ write_formal_parameters (InterfaceInfo *iface, MethodInfo *method, GIOChannel *c direction = arg_info_get_direction (arg); - /* FIXME - broken for containers */ type_str = dbus_gvalue_ctype_from_type (arg_info_get_type (arg), direction == ARG_IN); if (!type_str) @@ -616,7 +617,7 @@ write_formal_parameters (InterfaceInfo *iface, MethodInfo *method, GIOChannel *c g_set_error (error, DBUS_BINDING_TOOL_ERROR, DBUS_BINDING_TOOL_ERROR_UNSUPPORTED_CONVERSION, - _("Unsupported conversion from D-BUS type %d to glib C type"), + _("Unsupported conversion from D-BUS type %s to glib C type"), arg_info_get_type (arg)); return FALSE; } @@ -660,15 +661,14 @@ write_args_for_direction (InterfaceInfo *iface, MethodInfo *method, GIOChannel * if (direction != arg_info_get_direction (arg)) continue; - /* FIXME - broken for containers */ type_str = dbus_gvalue_binding_type_from_type (arg_info_get_type (arg)); if (!type_str) { g_set_error (error, DBUS_BINDING_TOOL_ERROR, DBUS_BINDING_TOOL_ERROR_UNSUPPORTED_CONVERSION, - _("Unsupported conversion from D-BUS type %c"), - (char) arg_info_get_type (arg)); + _("Unsupported conversion from D-BUS type %s"), + arg_info_get_type (arg)); return FALSE; } diff --git a/glib/dbus-gidl.c b/glib/dbus-gidl.c index fb9573e5..3ca0a478 100644 --- a/glib/dbus-gidl.c +++ b/glib/dbus-gidl.c @@ -66,14 +66,14 @@ struct SignalInfo struct PropertyInfo { BaseInfo base; - int type; + char *type; PropertyAccessFlags access; }; struct ArgInfo { BaseInfo base; - int type; + char *type; ArgDirection direction; }; @@ -631,7 +631,7 @@ signal_info_add_arg (SignalInfo *info, PropertyInfo* property_info_new (const char *name, - int type, + const char *type, PropertyAccessFlags access) { PropertyInfo *info; @@ -641,7 +641,7 @@ property_info_new (const char *name, info->base.name = g_strdup (name); info->base.type = INFO_TYPE_PROPERTY; - info->type = type; + info->type = g_strdup (type); info->access = access; return info; @@ -662,6 +662,7 @@ property_info_unref (PropertyInfo *info) if (info->base.refcount == 0) { base_info_free (info); + g_free (info->type); } } @@ -671,7 +672,7 @@ property_info_get_name (PropertyInfo *info) return info->base.name; } -int +const char * property_info_get_type (PropertyInfo *info) { return info->type; @@ -686,7 +687,7 @@ property_info_get_access (PropertyInfo *info) ArgInfo* arg_info_new (const char *name, ArgDirection direction, - int type) + const char *type) { ArgInfo *info; @@ -697,7 +698,7 @@ arg_info_new (const char *name, /* name can be NULL */ info->base.name = g_strdup (name); info->direction = direction; - info->type = type; + info->type = g_strdup (type); return info; } @@ -717,6 +718,7 @@ arg_info_unref (ArgInfo *info) if (info->base.refcount == 0) { base_info_free (info); + g_free (info->type); } } const char* @@ -725,7 +727,7 @@ arg_info_get_name (ArgInfo *info) return info->base.name; } -int +const char * arg_info_get_type (ArgInfo *info) { return info->type; diff --git a/glib/dbus-gidl.h b/glib/dbus-gidl.h index 539c731f..46374c3a 100644 --- a/glib/dbus-gidl.h +++ b/glib/dbus-gidl.h @@ -128,20 +128,20 @@ void signal_info_add_arg (SignalInfo *info, ArgInfo *arg); int signal_info_get_n_args (SignalInfo *info); PropertyInfo* property_info_new (const char *name, - int type, + const char *type, PropertyAccessFlags access); PropertyInfo* property_info_ref (PropertyInfo *info); void property_info_unref (PropertyInfo *info); const char* property_info_get_name (PropertyInfo *info); -int property_info_get_type (PropertyInfo *info); +const char* property_info_get_type (PropertyInfo *info); PropertyAccessFlags property_info_get_access (PropertyInfo *info); ArgInfo* arg_info_new (const char *name, ArgDirection direction, - int type); + const char *type); ArgInfo* arg_info_ref (ArgInfo *info); void arg_info_unref (ArgInfo *info); const char* arg_info_get_name (ArgInfo *info); -int arg_info_get_type (ArgInfo *info); +const char* arg_info_get_type (ArgInfo *info); ArgDirection arg_info_get_direction (ArgInfo *info); G_END_DECLS diff --git a/glib/dbus-glib-tool.c b/glib/dbus-glib-tool.c index b057c5ae..2fc564c4 100644 --- a/glib/dbus-glib-tool.c +++ b/glib/dbus-glib-tool.c @@ -177,13 +177,13 @@ pretty_print (BaseInfo *base, case INFO_TYPE_PROPERTY: { PropertyInfo *a = (PropertyInfo*) base; - int pt = property_info_get_type (a); + const char *pt = property_info_get_type (a); PropertyAccessFlags acc = property_info_get_access (a); printf ("%s%s %s", acc & PROPERTY_READ ? "read" : "", acc & PROPERTY_WRITE ? "write" : "", - _dbus_gutils_type_to_string (pt)); + pt); if (name) printf (" %s\n", name); else @@ -193,12 +193,12 @@ pretty_print (BaseInfo *base, case INFO_TYPE_ARG: { ArgInfo *a = (ArgInfo*) base; - int at = arg_info_get_type (a); + const char *at = arg_info_get_type (a); ArgDirection d = arg_info_get_direction (a); printf ("%s %s", d == ARG_IN ? "in" : "out", - _dbus_gutils_type_to_string (at)); + at); if (name) printf (" %s\n", name); else diff --git a/glib/dbus-gobject.c b/glib/dbus-gobject.c index af87ffeb..7ab4dd1b 100644 --- a/glib/dbus-gobject.c +++ b/glib/dbus-gobject.c @@ -247,47 +247,6 @@ gobject_unregister_function (DBusConnection *connection, } -static int -gtype_to_dbus_type (GType type) -{ - switch (type) - { - case G_TYPE_CHAR: - case G_TYPE_UCHAR: - return DBUS_TYPE_BYTE; - - case G_TYPE_BOOLEAN: - return DBUS_TYPE_BOOLEAN; - - /* long gets cut to 32 bits so the remote API is consistent - * on all architectures - */ - - case G_TYPE_LONG: - case G_TYPE_INT: - return DBUS_TYPE_INT32; - case G_TYPE_ULONG: - case G_TYPE_UINT: - return DBUS_TYPE_UINT32; - - case G_TYPE_INT64: - return DBUS_TYPE_INT64; - - case G_TYPE_UINT64: - return DBUS_TYPE_UINT64; - - case G_TYPE_FLOAT: - case G_TYPE_DOUBLE: - return DBUS_TYPE_DOUBLE; - - case G_TYPE_STRING: - return DBUS_TYPE_STRING; - - default: - return DBUS_TYPE_INVALID; - } -} - static void introspect_properties (GObject *object, GString *xml) { @@ -303,13 +262,13 @@ introspect_properties (GObject *object, GString *xml) for (i = 0; i < n_specs; i++ ) { char *s; - int dbus_type; + const char *dbus_type; gboolean can_set; gboolean can_get; GParamSpec *spec = specs[i]; - dbus_type = gtype_to_dbus_type (G_PARAM_SPEC_VALUE_TYPE (spec)); - if (dbus_type == DBUS_TYPE_INVALID) + dbus_type = dbus_gtype_to_dbus_type (G_PARAM_SPEC_VALUE_TYPE (spec)); + if (dbus_type == NULL) continue; if (spec->owner_type != last_type) @@ -341,7 +300,7 @@ introspect_properties (GObject *object, GString *xml) g_string_append (xml, " \n"); } @@ -455,7 +414,7 @@ write_interface (gpointer key, gpointer val, gpointer user_data) /* FIXME - handle container types */ g_string_append_printf (xml, " \n", - name, _dbus_gutils_type_to_string (type[0]), arg_in ? "in" : "out"); + name, type, arg_in ? "in" : "out"); } g_string_append (xml, " \n"); @@ -543,21 +502,21 @@ handle_introspect (DBusConnection *connection, /* We are introspectable, though I guess that was pretty obvious */ g_string_append_printf (xml, " \n", DBUS_INTERFACE_INTROSPECTABLE); g_string_append (xml, " \n"); - g_string_append (xml, " \n"); + g_string_append_printf (xml, " \n", DBUS_TYPE_STRING_AS_STRING); g_string_append (xml, " \n"); g_string_append (xml, " \n"); /* We support get/set properties */ g_string_append_printf (xml, " \n", DBUS_INTERFACE_PROPERTIES); g_string_append (xml, " \n"); - g_string_append (xml, " \n"); - g_string_append (xml, " \n"); - g_string_append (xml, " \n"); + g_string_append_printf (xml, " \n", DBUS_TYPE_STRING_AS_STRING); + g_string_append_printf (xml, " \n", DBUS_TYPE_STRING_AS_STRING); + g_string_append_printf (xml, " \n", DBUS_TYPE_VARIANT_AS_STRING); g_string_append (xml, " \n"); g_string_append (xml, " \n"); - g_string_append (xml, " \n"); - g_string_append (xml, " \n"); - g_string_append (xml, " \n"); + g_string_append_printf (xml, " \n", DBUS_TYPE_STRING_AS_STRING); + g_string_append_printf (xml, " \n", DBUS_TYPE_STRING_AS_STRING); + g_string_append_printf (xml, " \n", DBUS_TYPE_VARIANT_AS_STRING); g_string_append (xml, " \n"); g_string_append (xml, " \n"); diff --git a/glib/dbus-gparser.c b/glib/dbus-gparser.c index 5d6d664a..745e0dde 100644 --- a/glib/dbus-gparser.c +++ b/glib/dbus-gparser.c @@ -21,7 +21,9 @@ * */ #include "dbus-gparser.h" +#include "dbus/dbus-glib-lowlevel.h" #include "dbus-gidl.h" +#include "dbus/dbus-signature.h" #include #include @@ -461,59 +463,21 @@ parse_signal (Parser *parser, return TRUE; } -static int -basic_type_from_string (const char *str) +static gboolean +validate_signature (const char *str, + const char *element_name, + GError **error) { - if (strcmp (str, "string") == 0) - return DBUS_TYPE_STRING; - else if (strcmp (str, "int16") == 0) - return DBUS_TYPE_INT16; - else if (strcmp (str, "uint16") == 0) - return DBUS_TYPE_UINT16; - else if (strcmp (str, "int32") == 0) - return DBUS_TYPE_INT32; - else if (strcmp (str, "uint32") == 0) - return DBUS_TYPE_UINT32; - else if (strcmp (str, "int64") == 0) - return DBUS_TYPE_INT64; - else if (strcmp (str, "uint64") == 0) - return DBUS_TYPE_UINT64; - else if (strcmp (str, "double") == 0) - return DBUS_TYPE_DOUBLE; - else if (strcmp (str, "byte") == 0) - return DBUS_TYPE_BYTE; - else if (strcmp (str, "boolean") == 0) - return DBUS_TYPE_BOOLEAN; - else if (strcmp (str, "byte") == 0) - return DBUS_TYPE_BYTE; - else if (strcmp (str, "object") == 0) - return DBUS_TYPE_OBJECT_PATH; - else if (strcmp (str, "variant") == 0) - return DBUS_TYPE_VARIANT; - else - return DBUS_TYPE_INVALID; -} + DBusError derror; -/* FIXME we have to allow type signatures, not just basic types - */ -static int -type_from_string (const char *str, - const char *element_name, - GError **error) -{ - int t; + dbus_error_init (&derror); - t = basic_type_from_string (str); - - if (t == DBUS_TYPE_INVALID) + if (!dbus_signature_validate (str, &derror)) { - g_set_error (error, G_MARKUP_ERROR, - G_MARKUP_ERROR_PARSE, - _("Type \"%s\" not understood on <%s> element "), - str, element_name); + dbus_set_g_error (error, &derror); + return FALSE; } - - return t; + return TRUE; } static gboolean @@ -529,7 +493,6 @@ parse_property (Parser *parser, PropertyInfo *property; NodeInfo *top; PropertyAccessFlags access_flags; - int t; if (parser->interface == NULL || parser->node_stack == NULL || @@ -582,8 +545,7 @@ parse_property (Parser *parser, return FALSE; } - t = type_from_string (type, element_name, error); - if (t == DBUS_TYPE_INVALID) + if (!validate_signature (type, element_name, error)) return FALSE; access_flags = 0; @@ -604,7 +566,7 @@ parse_property (Parser *parser, top = parser->node_stack->data; - property = property_info_new (name, t, access_flags); + property = property_info_new (name, type, access_flags); interface_info_add_property (parser->interface, property); property_info_unref (property); @@ -624,7 +586,6 @@ parse_arg (Parser *parser, const char *type; const char *direction; ArgDirection dir; - int t; ArgInfo *arg; char *generated_name; @@ -694,8 +655,7 @@ parse_arg (Parser *parser, return FALSE; } - t = type_from_string (type, element_name, error); - if (t == DBUS_TYPE_INVALID) + if (!validate_signature (type, element_name, error)) return FALSE; generated_name = NULL; @@ -706,7 +666,7 @@ parse_arg (Parser *parser, signal_info_get_n_args (parser->signal)); - arg = arg_info_new (name ? name : generated_name, dir, t); + arg = arg_info_new (name ? name : generated_name, dir, type); if (parser->method) method_info_add_arg (parser->method, arg); else if (parser->signal) diff --git a/glib/dbus-gutils.c b/glib/dbus-gutils.c index 30d00fed..ea7a1df4 100644 --- a/glib/dbus-gutils.c +++ b/glib/dbus-gutils.c @@ -83,48 +83,6 @@ _dbus_gutils_split_path (const char *path) return split; } -const char * -_dbus_gutils_type_to_string (int type) -{ - switch (type) - { - case DBUS_TYPE_INVALID: - return "invalid"; - case DBUS_TYPE_BOOLEAN: - return "boolean"; - case DBUS_TYPE_BYTE: - return "byte"; - case DBUS_TYPE_INT16: - return "int16"; - case DBUS_TYPE_UINT16: - return "uint16"; - case DBUS_TYPE_INT32: - return "int32"; - case DBUS_TYPE_UINT32: - return "uint32"; - case DBUS_TYPE_DOUBLE: - return "double"; - case DBUS_TYPE_STRING: - return "string"; - case DBUS_TYPE_OBJECT_PATH: - return "object_path"; - case DBUS_TYPE_SIGNATURE: - return "signature"; - case DBUS_TYPE_STRUCT: - return "struct"; - case DBUS_TYPE_ARRAY: - return "array"; - case DBUS_TYPE_VARIANT: - return "variant"; - case DBUS_STRUCT_BEGIN_CHAR: - return "begin_struct"; - case DBUS_STRUCT_END_CHAR: - return "end_struct"; - default: - return "unknown"; - } -} - char* _dbus_gutils_wincaps_to_uscore (const char *caps) { diff --git a/glib/dbus-gutils.h b/glib/dbus-gutils.h index 0356b30e..874028c9 100644 --- a/glib/dbus-gutils.h +++ b/glib/dbus-gutils.h @@ -32,7 +32,6 @@ G_BEGIN_DECLS char **_dbus_gutils_split_path (const char *path); -const char *_dbus_gutils_type_to_string (int type); char *_dbus_gutils_wincaps_to_uscore (const char *uscore); diff --git a/glib/dbus-gvalue.c b/glib/dbus-gvalue.c index 8306be9b..bcda9259 100644 --- a/glib/dbus-gvalue.c +++ b/glib/dbus-gvalue.c @@ -23,6 +23,7 @@ */ #include +#include "dbus/dbus-signature.h" /* This is slightly evil, we don't use g_value_set_foo() functions */ #define MAP_BASIC_INIT(d_t, g_t) \ @@ -71,9 +72,24 @@ dbus_gvalue_init (int type, return can_convert; } +/* FIXME - broken for containers + */ +static int +base_type_from_signature (const char *signature) +{ + DBusSignatureIter iter; + + dbus_signature_iter_init (&iter, signature); + + return dbus_signature_iter_get_current_type (&iter); +} + const char * -dbus_gvalue_genmarshal_name_from_type (int type) +dbus_gvalue_genmarshal_name_from_type (const char *signature) { + int type; + + type = base_type_from_signature (signature); switch (type) { case DBUS_TYPE_BOOLEAN: @@ -109,8 +125,12 @@ dbus_gvalue_genmarshal_name_from_type (int type) } const char * -dbus_gvalue_binding_type_from_type (int type) +dbus_gvalue_binding_type_from_type (const char *signature) { + int type; + + type = base_type_from_signature (signature); + #define STRINGIFY(x) \ case x: \ return (#x) @@ -142,8 +162,12 @@ dbus_gvalue_binding_type_from_type (int type) } const char * -dbus_gvalue_ctype_from_type (int type, gboolean in) +dbus_gvalue_ctype_from_type (const char *signature, gboolean in) { + int type; + + type = base_type_from_signature (signature); + switch (type) { case DBUS_TYPE_BOOLEAN: @@ -181,6 +205,47 @@ dbus_gvalue_ctype_from_type (int type, gboolean in) return NULL; } +const char * +dbus_gtype_to_dbus_type (GType type) +{ + switch (type) + { + case G_TYPE_CHAR: + case G_TYPE_UCHAR: + return DBUS_TYPE_BYTE_AS_STRING; + + case G_TYPE_BOOLEAN: + return DBUS_TYPE_BOOLEAN_AS_STRING; + + /* long gets cut to 32 bits so the remote API is consistent + * on all architectures + */ + + case G_TYPE_LONG: + case G_TYPE_INT: + return DBUS_TYPE_INT32_AS_STRING; + case G_TYPE_ULONG: + case G_TYPE_UINT: + return DBUS_TYPE_UINT32_AS_STRING; + + case G_TYPE_INT64: + return DBUS_TYPE_INT64_AS_STRING; + + case G_TYPE_UINT64: + return DBUS_TYPE_UINT64_AS_STRING; + + case G_TYPE_FLOAT: + case G_TYPE_DOUBLE: + return DBUS_TYPE_DOUBLE_AS_STRING; + + case G_TYPE_STRING: + return DBUS_TYPE_STRING_AS_STRING; + + default: + return NULL; + } +} + gboolean dbus_gvalue_demarshal (DBusMessageIter *iter, GValue *value) { diff --git a/glib/dbus-gvalue.h b/glib/dbus-gvalue.h index fafda585..dc1cf323 100644 --- a/glib/dbus-gvalue.h +++ b/glib/dbus-gvalue.h @@ -20,11 +20,13 @@ typedef union char * chararray_val; } DBusBasicGValue; -const char * dbus_gvalue_genmarshal_name_from_type (int type); +const char * dbus_gvalue_genmarshal_name_from_type (const char *type); -const char * dbus_gvalue_ctype_from_type (int type, gboolean in); +const char * dbus_gvalue_ctype_from_type (const char *type, gboolean in); -const char * dbus_gvalue_binding_type_from_type (int type); +const char * dbus_gvalue_binding_type_from_type (const char *type); + +const char * dbus_gtype_to_dbus_type (GType type); gboolean dbus_gvalue_init (int type, GValue *value); diff --git a/test/glib/test-service-glib.xml b/test/glib/test-service-glib.xml index 298e2ddb..80a815fa 100644 --- a/test/glib/test-service-glib.xml +++ b/test/glib/test-service-glib.xml @@ -11,8 +11,8 @@ - - + + @@ -21,17 +21,17 @@ - - + + - - - - - + + + + + diff --git a/tools/dbus-tree-view.c b/tools/dbus-tree-view.c index 7f143ab9..b4404457 100644 --- a/tools/dbus-tree-view.c +++ b/tools/dbus-tree-view.c @@ -25,49 +25,6 @@ #include "dbus-tree-view.h" #include -/* FIXME this function should just be in the library */ -static const char * -type_to_string (int type) -{ - switch (type) - { - case DBUS_TYPE_INVALID: - return "invalid"; - case DBUS_TYPE_BOOLEAN: - return "boolean"; - case DBUS_TYPE_BYTE: - return "byte"; - case DBUS_TYPE_INT16: - return "int16"; - case DBUS_TYPE_UINT16: - return "uint16"; - case DBUS_TYPE_INT32: - return "int32"; - case DBUS_TYPE_UINT32: - return "uint32"; - case DBUS_TYPE_DOUBLE: - return "double"; - case DBUS_TYPE_STRING: - return "string"; - case DBUS_TYPE_OBJECT_PATH: - return "object_path"; - case DBUS_TYPE_SIGNATURE: - return "signature"; - case DBUS_TYPE_STRUCT: - return "struct"; - case DBUS_TYPE_ARRAY: - return "array"; - case DBUS_TYPE_VARIANT: - return "variant"; - case DBUS_STRUCT_BEGIN_CHAR: - return "begin_struct"; - case DBUS_STRUCT_END_CHAR: - return "end_struct"; - default: - return "unknown"; - } -} - enum { MODEL_COLUMN_INFO, @@ -334,14 +291,14 @@ info_set_func_text (GtkTreeViewColumn *tree_column, case INFO_TYPE_PROPERTY: g_string_append (str, "property"); g_string_append_printf (str, " %s", - type_to_string (property_info_get_type ((PropertyInfo*)info))); + property_info_get_type ((PropertyInfo*)info)); break; case INFO_TYPE_ARG: g_string_append_printf (str, "arg %s", arg_info_get_direction ((ArgInfo*)info) == ARG_IN ? "in" : "out"); g_string_append_printf (str, " %s", - type_to_string (arg_info_get_type ((ArgInfo*)info))); + arg_info_get_type ((ArgInfo*)info)); break; } -- cgit