summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Zeuthen <davidz@redhat.com>2009-02-03 04:25:19 -0500
committerDavid Zeuthen <davidz@redhat.com>2009-02-03 04:25:19 -0500
commit7006f3f8350d319c3950509086b15ced581bd17e (patch)
tree93585f1afa67fbb811498b82081f4721cb8a6523
parentdd4fa7198b0ec0d239b34c488152f538621f40e6 (diff)
docbook generator: expand signature into human readable description
-rw-r--r--src/eggdbus/interface.c204
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&lt;%s&#x2192;%s&gt;", 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&lt;"))
+ {
+ 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&lt;%s&gt;", 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);