From 9d893d60a99d9e7eb7a93e68c6f121b30e8c513d Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 19 Dec 2013 17:15:55 +0200 Subject: [PATCH] android/AVDTP: Add avdtp_shutdown avdtp_shutdown can be used to disconnect closing all existing stream properly. --- android/avdtp.c | 19 +++++++++++++++++++ android/avdtp.h | 2 ++ 2 files changed, 21 insertions(+) diff --git a/android/avdtp.c b/android/avdtp.c index b2d77a41e..7d3cb18a8 100644 --- a/android/avdtp.c +++ b/android/avdtp.c @@ -2102,6 +2102,25 @@ gboolean avdtp_remove_disconnect_cb(struct avdtp *session, unsigned int id) return FALSE; } +void avdtp_shutdown(struct avdtp *session) +{ + GSList *l; + int sock; + + if (!session->io) + return; + + for (l = session->streams; l; l = g_slist_next(l)) { + struct avdtp_stream *stream = l->data; + + avdtp_close(session, stream, TRUE); + } + + sock = g_io_channel_unix_get_fd(session->io); + + shutdown(sock, SHUT_RDWR); +} + static void queue_request(struct avdtp *session, struct pending_req *req, gboolean priority) { diff --git a/android/avdtp.h b/android/avdtp.h index 1619029ef..d3716535b 100644 --- a/android/avdtp.h +++ b/android/avdtp.h @@ -209,6 +209,8 @@ unsigned int avdtp_add_disconnect_cb(struct avdtp *session, void *user_data); gboolean avdtp_remove_disconnect_cb(struct avdtp *session, unsigned int id); +void avdtp_shutdown(struct avdtp *session); + void avdtp_unref(struct avdtp *session); struct avdtp *avdtp_ref(struct avdtp *session); -- 2.47.3