summaryrefslogtreecommitdiff
path: root/android/handsfree-client.c
diff options
context:
space:
mode:
authorLukasz Rymanowski <lukasz.rymanowski@tieto.com>2014-11-11 18:52:57 +0100
committerSzymon Janc <szymon.janc@tieto.com>2014-11-12 08:42:30 +0100
commitb4b68cc0b8738975883f7aca8594e7d21bb6620e (patch)
treedfd0f7edfc54763b3d14e5af2d96c1e3b0ff04b6 /android/handsfree-client.c
parent4b726a259175ea614a28bce1fcf9b6615e4dd1d6 (diff)
downloadbluez-b4b68cc0b8738975883f7aca8594e7d21bb6620e.tar.gz
android/handsfree-client: Handle disconnect command
This function adds handling of handsfree client disconnect. This patch also moves device_set_state and device_destroy funtion in the file as this is needed by the handle_disconnect
Diffstat (limited to 'android/handsfree-client.c')
-rw-r--r--android/handsfree-client.c118
1 files changed, 80 insertions, 38 deletions
diff --git a/android/handsfree-client.c b/android/handsfree-client.c
index ebf5d89d5..c576ae8dd 100644
--- a/android/handsfree-client.c
+++ b/android/handsfree-client.c
@@ -193,11 +193,89 @@ static struct device *get_device(const bdaddr_t *addr)
return NULL;
}
+static void device_set_state(struct device *dev, uint8_t state)
+{
+ struct hal_ev_hf_client_conn_state ev;
+ char address[18];
+
+ if (dev->state == state)
+ return;
+
+ memset(&ev, 0, sizeof(ev));
+
+ dev->state = state;
+
+ ba2str(&dev->bdaddr, address);
+ DBG("device %s state %u", address, state);
+
+ bdaddr2android(&dev->bdaddr, ev.bdaddr);
+ ev.state = state;
+
+ ev.chld_feat = dev->chld_features;
+ ev.peer_feat = dev->features;
+
+ ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE_CLIENT,
+ HAL_EV_HF_CLIENT_CONN_STATE, sizeof(ev), &ev);
+}
+
+static void device_destroy(struct device *dev)
+{
+ device_set_state(dev, HAL_HF_CLIENT_CONN_STATE_DISCONNECTED);
+ queue_remove(devices, dev);
+
+ if (dev->hf)
+ hfp_hf_unref(dev->hf);
+
+ free(dev);
+}
+
static void handle_disconnect(const void *buf, uint16_t len)
{
- DBG("Not Implemented");
+ const struct hal_cmd_hf_client_disconnect *cmd = buf;
+ struct device *dev;
+ uint32_t status;
+ bdaddr_t bdaddr;
+ char addr[18];
+
+ DBG("");
+
+ android2bdaddr(&cmd->bdaddr, &bdaddr);
+
+ ba2str(&bdaddr, addr);
+ DBG("Disconnect %s", addr);
+
+ dev = get_device(&bdaddr);
+ if (!dev) {
+ status = HAL_STATUS_FAILED;
+ goto done;
+ }
+
+ if (dev->state == HAL_HF_CLIENT_CONN_STATE_DISCONNECTED) {
+ status = HAL_STATUS_FAILED;
+ goto done;
+ }
+
+ if (dev->state == HAL_HF_CLIENT_CONN_STATE_DISCONNECTING) {
+ status = HAL_STATUS_SUCCESS;
+ goto done;
+ }
+
+ if (dev->state == HAL_HF_CLIENT_CONN_STATE_CONNECTING) {
+ device_destroy(dev);
+ status = HAL_STATUS_SUCCESS;
+ goto done;
+ }
+
+ status = hfp_hf_disconnect(dev->hf) ? HAL_STATUS_SUCCESS :
+ HAL_STATUS_FAILED;
+
+ if (status)
+ device_set_state(dev, HAL_HF_CLIENT_CONN_STATE_DISCONNECTING);
+
+done:
+
ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HANDSFREE_CLIENT,
- HAL_OP_HF_CLIENT_DISCONNECT, HAL_STATUS_UNSUPPORTED);
+ HAL_OP_HF_CLIENT_DISCONNECT, status);
}
static void handle_connect_audio(const void *buf, uint16_t len)
@@ -306,42 +384,6 @@ static void handle_get_last_vc_tag_num(const void *buf, uint16_t len)
HAL_STATUS_UNSUPPORTED);
}
-static void device_set_state(struct device *dev, uint8_t state)
-{
- struct hal_ev_hf_client_conn_state ev;
- char address[18];
-
- if (dev->state == state)
- return;
-
- memset(&ev, 0, sizeof(ev));
-
- dev->state = state;
-
- ba2str(&dev->bdaddr, address);
- DBG("device %s state %u", address, state);
-
- bdaddr2android(&dev->bdaddr, ev.bdaddr);
- ev.state = state;
-
- ev.chld_feat = dev->chld_features;
- ev.peer_feat = dev->features;
-
- ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE_CLIENT,
- HAL_EV_HF_CLIENT_CONN_STATE, sizeof(ev), &ev);
-}
-
-static void device_destroy(struct device *dev)
-{
- device_set_state(dev, HAL_HF_CLIENT_CONN_STATE_DISCONNECTED);
- queue_remove(devices, dev);
-
- if (dev->hf)
- hfp_hf_unref(dev->hf);
-
- free(dev);
-}
-
static void disconnect_watch(void *user_data)
{
DBG("");