From 33e944d18afe5114694ba34e96af252df5a79d9d Mon Sep 17 00:00:00 2001 From: Lukasz Rymanowski Date: Fri, 24 Oct 2014 13:59:27 +0200 Subject: [PATCH] shared/hfp: Add set disconnect handler and disconnect API to HFP HF --- src/shared/hfp.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++ src/shared/hfp.h | 5 ++++ 2 files changed, 68 insertions(+) diff --git a/src/shared/hfp.c b/src/shared/hfp.c index ad2daa21c..b7855ed46 100644 --- a/src/shared/hfp.c +++ b/src/shared/hfp.c @@ -74,6 +74,10 @@ struct hfp_hf { hfp_destroy_func_t debug_destroy; void *debug_data; + hfp_disconnect_func_t disconnect_callback; + hfp_destroy_func_t disconnect_destroy; + void *disconnect_data; + bool in_disconnect; bool destroyed; }; @@ -956,3 +960,62 @@ bool hfp_hf_set_close_on_unref(struct hfp_hf *hfp, bool do_close) return true; } + +static void hf_disconnect_watch_destroy(void *user_data) +{ + struct hfp_hf *hfp = user_data; + + if (hfp->disconnect_destroy) + hfp->disconnect_destroy(hfp->disconnect_data); + + if (hfp->destroyed) + free(hfp); +} + +static bool hf_io_disconnected(struct io *io, void *user_data) +{ + struct hfp_hf *hfp = user_data; + + hfp->in_disconnect = true; + + if (hfp->disconnect_callback) + hfp->disconnect_callback(hfp->disconnect_data); + + hfp->in_disconnect = false; + + return false; +} + +bool hfp_hf_set_disconnect_handler(struct hfp_hf *hfp, + hfp_disconnect_func_t callback, + void *user_data, + hfp_destroy_func_t destroy) +{ + if (!hfp) + return false; + + if (hfp->disconnect_destroy) + hfp->disconnect_destroy(hfp->disconnect_data); + + if (!io_set_disconnect_handler(hfp->io, hf_io_disconnected, hfp, + hf_disconnect_watch_destroy)) { + hfp->disconnect_callback = NULL; + hfp->disconnect_destroy = NULL; + hfp->disconnect_data = NULL; + return false; + } + + hfp->disconnect_callback = callback; + hfp->disconnect_destroy = destroy; + hfp->disconnect_data = user_data; + + return true; +} + +bool hfp_hf_disconnect(struct hfp_hf *hfp) +{ + if (!hfp) + return false; + + return io_shutdown(hfp->io); +} diff --git a/src/shared/hfp.h b/src/shared/hfp.h index 21d205b88..d98d14b0d 100644 --- a/src/shared/hfp.h +++ b/src/shared/hfp.h @@ -134,3 +134,8 @@ void hfp_hf_unref(struct hfp_hf *hfp); bool hfp_hf_set_debug(struct hfp_hf *hfp, hfp_debug_func_t callback, void *user_data, hfp_destroy_func_t destroy); bool hfp_hf_set_close_on_unref(struct hfp_hf *hfp, bool do_close); +bool hfp_hf_set_disconnect_handler(struct hfp_hf *hfp, + hfp_disconnect_func_t callback, + void *user_data, + hfp_destroy_func_t destroy); +bool hfp_hf_disconnect(struct hfp_hf *hfp); -- 2.47.3