diff options
Diffstat (limited to 'hcid')
-rw-r--r-- | hcid/dbus-manager.c | 7 | ||||
-rw-r--r-- | hcid/dbus-service.c | 50 | ||||
-rw-r--r-- | hcid/dbus.h | 3 |
3 files changed, 42 insertions, 18 deletions
diff --git a/hcid/dbus-manager.c b/hcid/dbus-manager.c index 518a0d35..87799309 100644 --- a/hcid/dbus-manager.c +++ b/hcid/dbus-manager.c @@ -218,14 +218,16 @@ static DBusHandlerResult list_services(DBusConnection *conn, static DBusHandlerResult register_service(DBusConnection *conn, DBusMessage *msg, void *data) { + const char *path, *name, *description; DBusMessage *message; - const char *path; DBusError err; int reg_err; dbus_error_init(&err); dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &path, + DBUS_TYPE_STRING, &name, + DBUS_TYPE_STRING, &description, DBUS_TYPE_INVALID); if (dbus_error_is_set(&err)) { @@ -235,7 +237,8 @@ static DBusHandlerResult register_service(DBusConnection *conn, } reg_err = register_service_agent(conn, dbus_message_get_sender(msg), - path); + path, name, description); + if (reg_err < 0) return error_failed(conn, msg, -reg_err); diff --git a/hcid/dbus-service.c b/hcid/dbus-service.c index 626062e5..dac91746 100644 --- a/hcid/dbus-service.c +++ b/hcid/dbus-service.c @@ -174,7 +174,29 @@ static void forward_reply(DBusPendingCall *call, void *udata) static DBusHandlerResult get_interface_names(DBusConnection *conn, DBusMessage *msg, void *data) { - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + DBusPendingCall *pending; + struct service_call *call_data; + struct service_agent *agent = data; + DBusMessage *forward = dbus_message_copy(msg); + const char *path = dbus_message_get_path(msg); + + dbus_message_set_destination(forward, agent->id); + dbus_message_set_interface(forward, "org.bluez.ServiceAgent"); + dbus_message_set_path(forward, path); + dbus_message_set_member(forward, "Interfaces"); + + call_data = malloc(sizeof(struct service_call)); + call_data->conn = dbus_connection_ref(conn); + call_data->msg = dbus_message_ref(msg); + + if (dbus_connection_send_with_reply(conn, forward, &pending, -1) == FALSE) { + dbus_message_unref(forward); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + + dbus_pending_call_set_notify(pending, forward_reply, call_data, service_call_free); + dbus_message_unref(forward); + return DBUS_HANDLER_RESULT_HANDLED; } static DBusHandlerResult get_connection_name(DBusConnection *conn, @@ -199,16 +221,15 @@ static DBusHandlerResult get_connection_name(DBusConnection *conn, static DBusHandlerResult get_name(DBusConnection *conn, DBusMessage *msg, void *data) { + + struct service_agent *agent = data; DBusMessage *reply; - struct service_agent *agent; const char *name = ""; reply = dbus_message_new_method_return(msg); if (!reply) return DBUS_HANDLER_RESULT_NEED_MEMORY; - agent = data; - if (agent->name) name = agent->name; @@ -292,10 +313,10 @@ static DBusHandlerResult remove_trust(DBusConnection *conn, } static struct service_data services_methods[] = { - { "GetInterfaceNames", get_interface_names }, - { "GetConnectionName", get_connection_name }, { "GetName", get_name }, { "GetDescription", get_description }, + { "GetInterfaceNames", get_interface_names }, + { "GetConnectionName", get_connection_name }, { "Start", start }, { "Stop", stop }, { "IsRunning", is_running }, @@ -307,7 +328,6 @@ static struct service_data services_methods[] = { { NULL, NULL } }; - static DBusHandlerResult msg_func_services(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -337,14 +357,13 @@ static DBusHandlerResult msg_func_services(DBusConnection *conn, call_data->msg = dbus_message_ref(msg); if (dbus_connection_send_with_reply(conn, forward, &pending, -1) == FALSE) { - /* FIXME: How handle this? */ - error("Can't foward the message."); dbus_message_unref(forward); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } dbus_pending_call_set_notify(pending, forward_reply, call_data, service_call_free); dbus_message_unref(forward); + return DBUS_HANDLER_RESULT_HANDLED; } @@ -353,21 +372,22 @@ static const DBusObjectPathVTable services_vtable = { .unregister_function = NULL }; -int register_service_agent(DBusConnection *conn, const char *sender ,const char *path) +int register_service_agent(DBusConnection *conn, const char *sender, + const char *path, const char *name, const char *description) { struct service_agent *agent; debug("Registering service object: %s", path); - - /* FIXME: the manager fallback '/org/bluez' should not return no such adapter */ /* Check if the name is already used? */ - agent = service_agent_new(sender, NULL, NULL); + agent = service_agent_new(sender, name, description); if (!agent) return -ENOMEM; - if (!dbus_connection_register_object_path(conn, path, &services_vtable, agent)) + if (!dbus_connection_register_object_path(conn, path, &services_vtable, agent)) { + free(agent); return -1; + } services = slist_append(services, strdup(path)); @@ -392,7 +412,7 @@ int unregister_service_agent(DBusConnection *conn, const char *sender, const cha if (!dbus_connection_unregister_object_path (conn, path)) return -1; - l = slist_find(services, path, strcmp); + l = slist_find(services, path, (cmp_func_t) strcmp); if (l) services = slist_remove(services, l->data); diff --git a/hcid/dbus.h b/hcid/dbus.h index a36e4c21..6d8b80b0 100644 --- a/hcid/dbus.h +++ b/hcid/dbus.h @@ -158,7 +158,8 @@ typedef int unregister_function_t(DBusConnection *conn, uint16_t id); DBusHandlerResult msg_func_device(DBusConnection *conn, DBusMessage *msg, void *data); DBusHandlerResult msg_func_manager(DBusConnection *conn, DBusMessage *msg, void *data); -int register_service_agent(DBusConnection *conn, const char *sender, const char *path); +int register_service_agent(DBusConnection *conn, const char *sender, const char *path, + const char *name, const char *description); int unregister_service_agent(DBusConnection *conn, const char *sender, const char *path); void append_available_services(DBusMessageIter *iter); |