diff options
author | David Zeuthen <davidz@redhat.com> | 2009-02-03 04:25:19 -0500 |
---|---|---|
committer | David Zeuthen <davidz@redhat.com> | 2009-02-03 04:25:19 -0500 |
commit | 7006f3f8350d319c3950509086b15ced581bd17e (patch) | |
tree | 93585f1afa67fbb811498b82081f4721cb8a6523 | |
parent | dd4fa7198b0ec0d239b34c488152f538621f40e6 (diff) |
docbook generator: expand signature into human readable description
-rw-r--r-- | src/eggdbus/interface.c | 204 |
1 files changed, 197 insertions, 7 deletions
diff --git a/src/eggdbus/interface.c b/src/eggdbus/interface.c index 2a7bfd8..dbd3d41 100644 --- a/src/eggdbus/interface.c +++ b/src/eggdbus/interface.c @@ -3282,15 +3282,197 @@ interface_generate_iface_c_file (const EggDBusInterfaceInfo *interface, } static void +get_type_name_for_sig_iter (DBusSignatureIter *sig_iter, + gchar **out_raw, + gchar **out_name) +{ + GString *ret_raw; + GString *ret; + gchar *s; + gchar *s_raw; + gchar *s1; + gchar *s1_raw; + guint n; + DBusSignatureIter sub_sig_iter; + int cur_type; + + ret_raw = NULL; + ret = g_string_new (NULL); + + cur_type = dbus_signature_iter_get_current_type (sig_iter); + + switch (cur_type) + { + case DBUS_TYPE_BYTE: + g_string_append (ret, "Byte"); + break; + + case DBUS_TYPE_BOOLEAN: + g_string_append (ret, "Boolean"); + break; + + case DBUS_TYPE_INT16: + g_string_append (ret, "Int16"); + break; + + case DBUS_TYPE_UINT16: + g_string_append (ret, "UInt16"); + break; + + case DBUS_TYPE_INT32: + g_string_append (ret, "Int32"); + break; + + case DBUS_TYPE_UINT32: + g_string_append (ret, "UInt32"); + break; + + case DBUS_TYPE_INT64: + g_string_append (ret, "Int64"); + break; + + case DBUS_TYPE_UINT64: + g_string_append (ret, "UInt64"); + break; + + case DBUS_TYPE_DOUBLE: + g_string_append (ret, "Double"); + break; + + case DBUS_TYPE_STRING: + g_string_append (ret, "String"); + break; + + case DBUS_TYPE_OBJECT_PATH: + g_string_append (ret, "ObjectPath"); + break; + + case DBUS_TYPE_SIGNATURE: + g_string_append (ret, "Signature"); + break; + + case DBUS_TYPE_VARIANT: + g_string_append (ret, "Variant"); + break; + + case DBUS_TYPE_DICT_ENTRY: + ret_raw = g_string_new (NULL); + + dbus_signature_iter_recurse (sig_iter, &sub_sig_iter); + get_type_name_for_sig_iter (&sub_sig_iter, &s_raw, &s); + g_assert (dbus_signature_iter_next (&sub_sig_iter) == TRUE); + get_type_name_for_sig_iter (&sub_sig_iter, &s1_raw, &s1); + g_assert (dbus_signature_iter_next (&sub_sig_iter) == FALSE); + g_string_append_printf (ret_raw, "Dict<%s_%s>", s_raw, s1_raw); + g_string_append_printf (ret, "Dict<%s→%s>", s, s1); /* U+2192 RIGHTWARDS ARROW */ + g_free (s_raw); + g_free (s); + g_free (s1_raw); + g_free (s1); + break; + + case DBUS_TYPE_STRUCT: + ret_raw = g_string_new (NULL); + + g_string_append (ret_raw, "["); + g_string_append (ret, "["); + dbus_signature_iter_recurse (sig_iter, &sub_sig_iter); + n = 0; + do + { + get_type_name_for_sig_iter (&sub_sig_iter, &s_raw, &s); + if (n != 0) + { + g_string_append (ret_raw, ","); + g_string_append (ret, ","); + } + g_string_append_printf (ret_raw, "%s", s_raw); + g_string_append_printf (ret, "%s", s); + g_free (s_raw); + g_free (s); + n++; + } + while (dbus_signature_iter_next (&sub_sig_iter)); + g_string_append (ret_raw, "]"); + g_string_append (ret, "]"); + break; + + case DBUS_TYPE_ARRAY: + ret_raw = g_string_new (NULL); + + dbus_signature_iter_recurse (sig_iter, &sub_sig_iter); + get_type_name_for_sig_iter (&sub_sig_iter, &s_raw, &s); + if (g_str_has_prefix (s, "Dict<")) + { + g_string_append (ret_raw, s_raw); + g_string_append (ret, s); + } + else + { + g_string_append_printf (ret_raw, "Array<%s>", s_raw); + g_string_append_printf (ret, "Array<%s>", s); + } + g_free (s); + break; + + default: + g_warning ("Unable to handle %s", dbus_signature_iter_get_signature (sig_iter)); + g_assert_not_reached (); + break; + } + + s = g_string_free (ret, FALSE); + + if (ret_raw != NULL) + s_raw = g_string_free (ret_raw, FALSE); + else + s_raw = g_strdup (s); + + if (out_raw != NULL) + { + *out_raw = s_raw; + s_raw = NULL; + } + + if (out_name != NULL) + { + *out_name = s; + s = NULL; + } + + g_free (s); + g_free (s_raw); +} + +static void docbook_get_typename_for_signature (const gchar *signature, gchar **out_name, gchar **out_link) { + DBusSignatureIter iter; + gchar *name; + gchar *name_link; + + name = NULL; + name_link = NULL; + + dbus_signature_iter_init (&iter, signature); + get_type_name_for_sig_iter (&iter, &name, &name_link); + if (out_name != NULL) - *out_name = g_strdup_printf ("'%s'", signature); + { + *out_name = name; + name = NULL; + } if (out_link != NULL) - *out_link = g_strdup_printf ("'%s'", signature); + { + *out_link = name_link; + name_link = NULL; + } + + g_free (name); + g_free (name_link); } static void @@ -3413,7 +3595,7 @@ docbook_print_method_prototype (const EggDBusInterfaceInfo *interface, if (num_printed != 0) g_print (",\n%*s", indent, ""); - docbook_print_arg (arg, "in ", arg_max_len); + docbook_print_arg (arg, "IN ", arg_max_len); num_printed++; } @@ -3425,7 +3607,7 @@ docbook_print_method_prototype (const EggDBusInterfaceInfo *interface, if (num_printed != 0) g_print (",\n%*s", indent, ""); - docbook_print_arg (arg, "out ", arg_max_len); + docbook_print_arg (arg, "OUT ", arg_max_len); num_printed++; } @@ -3533,11 +3715,17 @@ docbook_print_arg_in_list (const gchar *prefix, const EggDBusInterfaceArgInfo *arg) { gchar *arg_doc_string; + gchar *arg_type_link; arg_doc_string = get_doc_string (arg->annotations, "Argument"); + docbook_get_typename_for_signature (arg->signature, NULL, &arg_type_link); + g_print (" <varlistentry>\n"); - g_print (" <term>%s<parameter>%s</parameter>:</term>\n", prefix, arg->name); + g_print (" <term><literal>%s%s <parameter>%s</parameter></literal>:</term>\n", + prefix, + arg_type_link, + arg->name); g_print (" <listitem>\n"); g_print (" <para>\n"); g_print ("%s\n", arg_doc_string); @@ -3546,6 +3734,8 @@ docbook_print_arg_in_list (const gchar *prefix, g_print (" </varlistentry>\n"); g_free (arg_doc_string); + + g_free (arg_type_link); } static void @@ -3752,10 +3942,10 @@ interface_generate_docbook (const EggDBusInterfaceInfo *interface, g_print (" </para>\n"); docbook_print_args (interface, - "in ", + "IN ", method->in_args, method->in_num_args, - "out ", + "OUT ", method->out_args, method->out_num_args); |