X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gdbus%2Fobject.c;h=900e7aba2968f1ee7d4a9013c793ef2543dde8ca;hb=335e7562aafe49d4f91184ebe4d84d1aa99b9ca7;hp=cc3c5da8309f77fd0a30d27120ac581d823db378;hpb=ca06a2839668cd1d5a85257735afdf5ac87f6bb1;p=framework%2Fconnectivity%2Fconnman.git diff --git a/gdbus/object.c b/gdbus/object.c index cc3c5da..900e7ab 100644 --- a/gdbus/object.c +++ b/gdbus/object.c @@ -2,7 +2,7 @@ * * D-Bus helper library * - * Copyright (C) 2004-2010 Marcel Holtmann + * Copyright (C) 2004-2011 Marcel Holtmann * * * This program is free software; you can redistribute it and/or modify @@ -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"); } } @@ -162,7 +140,7 @@ static void generate_introspection_xml(DBusConnection *conn, gstr = g_string_new(DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE); - g_string_append_printf(gstr, "\n", path); + g_string_append_printf(gstr, "\n"); for (list = data->interfaces; list; list = list->next) { struct interface_data *iface = list->data; @@ -196,17 +174,12 @@ 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) + if (data->introspect == NULL) generate_introspection_xml(connection, data, dbus_message_get_path(message)); reply = dbus_message_new_method_return(message); - if (!reply) + if (reply == NULL) return NULL; dbus_message_append_args(reply, DBUS_TYPE_STRING, &data->introspect, @@ -255,14 +228,13 @@ void g_dbus_pending_success(DBusConnection *connection, for (list = pending_security; list; list = list->next) { struct security_data *secdata = list->data; - DBusHandlerResult result; if (secdata->pending != pending) continue; pending_security = g_slist_remove(pending_security, secdata); - result = process_message(connection, secdata->message, + process_message(connection, secdata->message, secdata->method, secdata->iface_user_data); dbus_message_unref(secdata->message); @@ -405,7 +377,7 @@ static struct interface_data *find_interface(GSList *interfaces, { GSList *list; - if (!name) + if (name == NULL) return NULL; for (list = interfaces; list; list = list->next) { @@ -417,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) { @@ -428,7 +421,7 @@ static DBusHandlerResult generic_message(DBusConnection *connection, interface = dbus_message_get_interface(message); iface = find_interface(data->interfaces, interface); - if (!iface) + if (iface == NULL) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; for (method = iface->methods; method && @@ -437,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, @@ -464,7 +457,7 @@ static void invalidate_parent_data(DBusConnection *conn, const char *child_path) parent_path = g_strdup(child_path); slash = strrchr(parent_path, '/'); - if (!slash) + if (slash == NULL) goto done; if (slash == parent_path && parent_path[1] != '\0') @@ -475,13 +468,14 @@ static void invalidate_parent_data(DBusConnection *conn, const char *child_path) if (!strlen(parent_path)) goto done; - if (!dbus_connection_get_object_path_data(conn, parent_path, - (void *) &data)) { - invalidate_parent_data(conn, parent_path); + if (dbus_connection_get_object_path_data(conn, parent_path, + (void *) &data) == FALSE) { goto done; } - if (!data) + invalidate_parent_data(conn, parent_path); + + if (data == NULL) goto done; g_free(data->introspect); @@ -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) }, { } }; @@ -554,7 +549,7 @@ static gboolean remove_interface(struct generic_data *data, const char *name) struct interface_data *iface; iface = find_interface(data->interfaces, name); - if (!iface) + if (iface == NULL) return FALSE; data->interfaces = g_slist_remove(data->interfaces, iface); @@ -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; @@ -601,14 +596,14 @@ static gboolean check_signal(DBusConnection *conn, const char *path, *args = NULL; if (!dbus_connection_get_object_path_data(conn, path, - (void *) &data) || !data) { + (void *) &data) || data == NULL) { error("dbus_connection_emit_signal: path %s isn't registered", path); return FALSE; } iface = find_interface(data->interfaces, interface); - if (!iface) { + if (iface == NULL) { error("dbus_connection_emit_signal: %s does not implement %s", path, interface); return FALSE; @@ -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) { - 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,13 +629,13 @@ 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; signal = dbus_message_new_signal(path, interface, name); - if (!signal) { + if (signal == NULL) { error("Unable to allocate new %s.%s signal", interface, name); 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; @@ -702,7 +692,7 @@ gboolean g_dbus_unregister_interface(DBusConnection *connection, { struct generic_data *data = NULL; - if (!path) + if (path == NULL) return FALSE; if (dbus_connection_get_object_path_data(connection, path,