From: Paulo Borges Date: Fri, 19 Apr 2013 22:19:05 +0000 (-0300) Subject: hfp_ag_bluez5: Implement RequestDisconnection() X-Git-Tag: 1.13~76 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7b56ca27300ee1db445ffa2c140dba09ee53bb26;p=platform%2Fupstream%2Fofono.git hfp_ag_bluez5: Implement RequestDisconnection() When a RequestDisconnect() is received, the socket must be closed. This way, the related emulator will be freed. --- diff --git a/plugins/hfp_ag_bluez5.c b/plugins/hfp_ag_bluez5.c index a0203b13..59e84d21 100644 --- a/plugins/hfp_ag_bluez5.c +++ b/plugins/hfp_ag_bluez5.c @@ -162,11 +162,35 @@ static DBusMessage *profile_cancel(DBusConnection *conn, static DBusMessage *profile_disconnection(DBusConnection *conn, DBusMessage *msg, void *user_data) { + DBusMessageIter iter; + const char *device; + gpointer fd; + DBG("Profile handler RequestDisconnection"); - return g_dbus_create_error(msg, BLUEZ_ERROR_INTERFACE - ".NotImplemented", - "Implementation not provided"); + if (!dbus_message_iter_init(msg, &iter)) + goto invalid; + + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_OBJECT_PATH) + goto invalid; + + dbus_message_iter_get_basic(&iter, &device); + + DBG("%s", device); + + fd = g_hash_table_lookup(connection_hash, device); + if (fd == NULL) + goto invalid; + + shutdown(GPOINTER_TO_INT(fd), SHUT_RDWR); + + g_hash_table_remove(connection_hash, device); + + return dbus_message_new_method_return(msg); + +invalid: + return g_dbus_create_error(msg, BLUEZ_ERROR_INTERFACE ".Rejected", + "Invalid arguments in method call"); } static const GDBusMethodTable profile_methods[] = {