Adapt HF Profile Connect & Disconnect to BT HAL framework
[platform/core/connectivity/bluetooth-frwk.git] / bt-oal / bluez_hal / src / bt-hal-event-receiver.c
index 38c838d..2f78578 100644 (file)
@@ -55,6 +55,7 @@ static handle_stack_msg hid_event_cb = NULL;
 static handle_stack_msg av_event_cb = NULL;
 static handle_stack_msg a2dp_sink_event_cb = NULL;
 static handle_stack_msg hf_event_cb = NULL;
+static handle_stack_msg hf_client_event_cb = NULL;
 static handle_stack_msg avrcp_ctrl_event_cb = NULL;
 static handle_stack_msg avrcp_tg_event_cb = NULL;
 static handle_stack_msg gatt_event_cb = NULL;
@@ -112,6 +113,7 @@ static void __bt_hal_send_hf_connection_state_event(gboolean connected, const ch
 static void __bt_hal_send_device_trusted_profile_changed_event(uint32_t trust_val, const char *address);
 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path);
 static void __bt_hal_handle_gatts_mtu_changed_event(char *address, int mtu);
+static void __bt_hal_send_hf_client_connection_state_event(gboolean connected, const char *address);
 
 
 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data)
@@ -501,8 +503,7 @@ static void __bt_hal_flight_ps_mode_cb(keynode_t *node, void *data)
                if (flight_mode != TRUE) {
                        ERR("Ignore the event");
                        return;
-               }
-               else {
+               } else {
                        ERR("Flight Mode == TRUE");
                }
        } else {
@@ -2057,7 +2058,7 @@ static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *me
                        } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
                                DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
                        }
-               } else if (strncmp(profile_uuid, HFP_HF_UUID, strlen(HFP_HF_UUID)) == 0) {
+               } else if (strcmp(profile_uuid, HFP_HF_UUID) == 0) {
                        if (state == BT_HAL_PROFILE_STATE_CONNECTING)
                                DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTING");
                        else if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
@@ -2071,6 +2072,20 @@ static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *me
                        } else {
                                ERR("HFP Profile state: Invalid");
                        }
+               } else if (strncmp(profile_uuid, HFP_AG_UUID, strlen(HFP_AG_UUID)) == 0) {
+                       if (state == BT_HAL_PROFILE_STATE_CONNECTING)
+                               DBG("HFP Client Profile state changed: BT_PROFILE_STATE_CONNECTING");
+                       else if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
+                               DBG("HFP Client Profile state changed: BT_PROFILE_STATE_CONNECTED");
+                               __bt_hal_send_hf_client_connection_state_event(TRUE, address);
+                       } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
+                               DBG("HFP Client Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
+                               __bt_hal_send_hf_client_connection_state_event(FALSE, address);
+                       } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
+                               DBG("HFP Client Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
+                       } else {
+                               ERR("HFP Client Profile state: Invalid");
+                       }
                } else if ((strncmp(profile_uuid, AVRCP_TARGET_UUID, strlen(AVRCP_TARGET_UUID)) == 0)) {
                        if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
                                DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
@@ -2585,6 +2600,29 @@ static void __bt_hal_send_hf_connection_state_event(gboolean connected,
                hf_event_cb(HAL_EV_HANDSFREE_CONN_STATE, &ev, sizeof(ev));
 }
 
+/* HF(Client Role) Profile Events */
+static void __bt_hal_send_hf_client_connection_state_event(gboolean connected,
+                                               const char *address)
+{
+       struct hal_ev_hf_client_conn_state ev;
+
+       if (connected == TRUE)
+               INFO("HF Client Profile Connected for address [%s]", address);
+       else
+               INFO("HF Client Profile DisConnected for address [%s]", address);
+
+       ev.state = (connected == TRUE) ?
+               HAL_EV_HF_CLIENT_CONN_STATE_CONNECTED :
+               HAL_EV_HF_CLIENT_CONN_STATE_DISCONNECTED;
+
+       _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
+
+       if (!hf_client_event_cb)
+               ERR("HF Client event handler not registered");
+       else
+               hf_client_event_cb(HAL_EV_HF_CLIENT_CONN_STATE, &ev, sizeof(ev));
+}
+
 void _bt_hal_register_event_handler_cb(bt_hal_module_e module, handle_stack_msg cb)
 {
        switch (module) {
@@ -2600,6 +2638,9 @@ void _bt_hal_register_event_handler_cb(bt_hal_module_e module, handle_stack_msg
        case HAL_HF_AG:
                hf_event_cb = cb;
                break;
+       case HAL_HF_CLIENT:
+               hf_client_event_cb = cb;
+               break;
        case HAL_AVRCP_TG:
                avrcp_tg_event_cb = cb;
                break;
@@ -2629,6 +2670,9 @@ void _bt_hal_unregister_event_handler_cb(bt_hal_module_e module)
        case HAL_HF_AG:
                hf_event_cb = NULL;
                break;
+       case HAL_HF_CLIENT:
+               hf_client_event_cb = NULL;
+               break;
        case HAL_AVRCP_TG:
                avrcp_tg_event_cb = NULL;
                break;