From: Lucas De Marchi Date: Sun, 20 May 2012 05:07:30 +0000 (-0300) Subject: gdbus: use GDBusArgInfo to generate introspection X-Git-Tag: 1.7~82 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=568a7d07076505a549491a7aedd457fce576ff0e;p=platform%2Fupstream%2Fofono.git gdbus: use GDBusArgInfo to generate introspection By using GDBusArgInfo in methods and signals, the introspection generation is much simpler and we can add each argument name. --- diff --git a/gdbus/object.c b/gdbus/object.c index 2ddc574..3ac6a0b 100644 --- a/gdbus/object.c +++ b/gdbus/object.c @@ -59,68 +59,20 @@ struct security_data { void *iface_user_data; }; -static void print_arguments(GString *gstr, const char *sig, +static void print_arguments(GString *gstr, const GDBusArgInfo *args, const char *direction) { - int i; - - for (i = 0; sig[i]; i++) { - char type[32]; - int struct_level, dict_level; - unsigned int len; - gboolean complete; - - complete = FALSE; - struct_level = dict_level = 0; - - /* Gather enough data to have a single complete type */ - for (len = 0; len < (sizeof(type) - 1) && sig[i]; len++, i++) { - switch (sig[i]) { - case '(': - struct_level++; - break; - case ')': - struct_level--; - if (struct_level <= 0 && dict_level <= 0) - complete = TRUE; - break; - case '{': - dict_level++; - break; - case '}': - dict_level--; - if (struct_level <= 0 && dict_level <= 0) - complete = TRUE; - break; - case 'a': - break; - default: - if (struct_level <= 0 && dict_level <= 0) - complete = TRUE; - break; - } - - type[len] = sig[i]; - - if (complete) - break; - } - - type[len + 1] = '\0'; - - if (!complete) { - error("Unexpected signature: %s", sig); - return; - } + for (; args && args->name; args++) { + g_string_append_printf(gstr, + "\t\t\tname, args->signature); if (direction) g_string_append_printf(gstr, - "\t\t\t\n", - type, direction); + " direction=\"%s\"/>\n", direction); else - g_string_append_printf(gstr, - "\t\t\t\n", - type); + g_string_append_printf(gstr, "/>\n"); + } } @@ -130,26 +82,27 @@ static void generate_interface_xml(GString *gstr, struct interface_data *iface) const GDBusSignalTable *signal; for (method = iface->methods; method && method->name; method++) { - if (!strlen(method->signature) && !strlen(method->reply)) + if (!(method->in_args && method->in_args->name) && + !(method->out_args && method->out_args->name)) g_string_append_printf(gstr, "\t\t\n", method->name); else { g_string_append_printf(gstr, "\t\t\n", method->name); - print_arguments(gstr, method->signature, "in"); - print_arguments(gstr, method->reply, "out"); + print_arguments(gstr, method->in_args, "in"); + print_arguments(gstr, method->out_args, "out"); g_string_append_printf(gstr, "\t\t\n"); } } for (signal = iface->signals; signal && signal->name; signal++) { - if (!strlen(signal->signature)) + if (!(signal->args && signal->args->name)) g_string_append_printf(gstr, "\t\t\n", signal->name); else { g_string_append_printf(gstr, "\t\t\n", signal->name); - print_arguments(gstr, signal->signature, NULL); + print_arguments(gstr, signal->args, NULL); g_string_append_printf(gstr, "\t\t\n"); } }