X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gdbus%2Fobject.c;h=900e7aba2968f1ee7d4a9013c793ef2543dde8ca;hb=57156cc5738cfbf60e1b0ddf444ad6eec5964a0d;hp=8bc12f53c3ac40ac70a23c9e3e5e3c87634d912a;hpb=640ba9b3e1d35d69413733ae6b8875ccc37393ac;p=framework%2Fconnectivity%2Fconnman.git diff --git a/gdbus/object.c b/gdbus/object.c index 8bc12f5..900e7ab 100644 --- a/gdbus/object.c +++ b/gdbus/object.c @@ -59,63 +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; - memset(type, 0, sizeof(type)); - - /* 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; - } - + 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"); + } } @@ -125,26 +82,47 @@ 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)) + gboolean deprecated = method->flags & + G_DBUS_METHOD_FLAG_DEPRECATED; + gboolean noreply = method->flags & + G_DBUS_METHOD_FLAG_NOREPLY; + + if (!deprecated && !noreply && + !(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"); + + if (deprecated) + g_string_append_printf(gstr, "\t\t\t\n"); + + if (noreply) + g_string_append_printf(gstr, "\t\t\t\n"); + g_string_append_printf(gstr, "\t\t\n"); } } for (signal = iface->signals; signal && signal->name; signal++) { - if (!strlen(signal->signature)) + gboolean deprecated = signal->flags & + G_DBUS_SIGNAL_FLAG_DEPRECATED; + + if (!deprecated && !(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); + + if (deprecated) + g_string_append_printf(gstr, "\t\t\t\n"); + g_string_append_printf(gstr, "\t\t\n"); } } @@ -196,11 +174,6 @@ static DBusMessage *introspect(DBusConnection *connection, struct generic_data *data = user_data; DBusMessage *reply; - if (!dbus_message_has_signature(message, DBUS_TYPE_INVALID_AS_STRING)) { - error("Unexpected signature to introspect call"); - return NULL; - } - if (data->introspect == NULL) generate_introspection_xml(connection, data, dbus_message_get_path(message)); @@ -416,6 +389,27 @@ static struct interface_data *find_interface(GSList *interfaces, return NULL; } +static gboolean g_dbus_args_have_signature(const GDBusArgInfo *args, + DBusMessage *message) +{ + const char *sig = dbus_message_get_signature(message); + const char *p = NULL; + + for (; args && args->signature && *sig; args++) { + p = args->signature; + + for (; *sig && *p; sig++, p++) { + if (*p != *sig) + return FALSE; + } + } + + if (*sig || (p && *p) || (args && args->signature)) + return FALSE; + + return TRUE; +} + static DBusHandlerResult generic_message(DBusConnection *connection, DBusMessage *message, void *user_data) { @@ -436,8 +430,8 @@ static DBusHandlerResult generic_message(DBusConnection *connection, method->name) == FALSE) continue; - if (dbus_message_has_signature(message, - method->signature) == FALSE) + if (g_dbus_args_have_signature(method->in_args, + message) == FALSE) continue; if (check_privilege(connection, message, method, @@ -491,8 +485,9 @@ done: g_free(parent_path); } -static GDBusMethodTable introspect_methods[] = { - { "Introspect", "", "s", introspect }, +static const GDBusMethodTable introspect_methods[] = { + { GDBUS_METHOD("Introspect", NULL, + GDBUS_ARGS({ "xml", "s" }), introspect) }, { } }; @@ -593,7 +588,7 @@ static void object_path_unref(DBusConnection *connection, const char *path) static gboolean check_signal(DBusConnection *conn, const char *path, const char *interface, const char *name, - const char **args) + const GDBusArgInfo **args) { struct generic_data *data = NULL; struct interface_data *iface; @@ -616,17 +611,13 @@ static gboolean check_signal(DBusConnection *conn, const char *path, for (signal = iface->signals; signal && signal->name; signal++) { if (!strcmp(signal->name, name)) { - *args = signal->signature; - break; + *args = signal->args; + return TRUE; } } - if (*args == NULL) { - error("No signal named %s on interface %s", name, interface); - return FALSE; - } - - return TRUE; + error("No signal named %s on interface %s", name, interface); + return FALSE; } static dbus_bool_t emit_signal_valist(DBusConnection *conn, @@ -638,7 +629,7 @@ static dbus_bool_t emit_signal_valist(DBusConnection *conn, { DBusMessage *signal; dbus_bool_t ret; - const char *signature, *args; + const GDBusArgInfo *args; if (!check_signal(conn, path, interface, name, &args)) return FALSE; @@ -653,8 +644,7 @@ static dbus_bool_t emit_signal_valist(DBusConnection *conn, if (!ret) goto fail; - signature = dbus_message_get_signature(signal); - if (strcmp(args, signature) != 0) { + if (g_dbus_args_have_signature(args, signal) == FALSE) { error("%s.%s: expected signature'%s' but got '%s'", interface, name, args, signature); ret = FALSE;