[Adapt: Bluez HAL] Implement ACL connection state changed event 95/78495/1
authorAnupam Roy <anupam.r@samsung.com>
Tue, 5 Jul 2016 20:35:23 +0000 (16:35 -0400)
committerAnupam Roy <anupam.r@samsung.com>
Tue, 5 Jul 2016 20:35:23 +0000 (16:35 -0400)
Change-Id: I1c03526bac86538d73ca2950cea8051827ba0110
Signed-off-by: Anupam Roy <anupam.r@samsung.com>
bt-oal/bluez_hal/src/bt-hal-bluetooth.c
bt-oal/bluez_hal/src/bt-hal-event-receiver.c

index 793e116..aeacae2 100644 (file)
@@ -54,6 +54,7 @@ static void __bt_hal_handle_stack_messages(int message, void *buf, uint16_t len)
 static void __bt_hal_handle_adapter_discovery_state_changed(void *buf, uint16_t len);
 static void __bt_hal_handle_device_found_event(void *buf, uint16_t len);
 static void __bt_hal_handle_bond_state_changed_event(void *buf, uint16_t len);
+static void __bt_hal_handle_device_acl_state_changed_event(void *buf, uint16_t len);
 
 static bool interface_ready(void)
 {
@@ -558,6 +559,33 @@ static void __bt_hal_handle_bond_state_changed_event(void *buf, uint16_t len)
        DBG("-");
 }
 
+static void __bt_hal_handle_device_acl_state_changed_event(void *buf, uint16_t len)
+{
+        struct hal_ev_acl_state_changed *ev = (struct hal_ev_acl_state_changed*)buf;
+        bt_bdaddr_t bd_addr;
+        DBG("+");
+
+        memcpy(bd_addr.address, ev->bdaddr, 6);
+        /* BD address*/
+        DBG("[0x%x]", bd_addr.address[0]);
+        DBG("[0x%x]", bd_addr.address[1]);
+        DBG("[0x%x]", bd_addr.address[2]);
+        DBG("[0x%x]", bd_addr.address[3]);
+        DBG("[0x%x]", bd_addr.address[4]);
+        DBG("[0x%x]", bd_addr.address[5]);
+
+        DBG("ACL Status [0x%x]", ev->status);
+        DBG("ACL State  [0x%x]", ev->state);
+
+        if (!bt_hal_cbacks->acl_state_changed_cb) {
+                ERR("HAL User acl_state_changed_cb is not set!!");
+                return;
+        }
+
+        bt_hal_cbacks->acl_state_changed_cb(ev->status, &bd_addr, ev->state);
+        DBG("-");
+}
+
 static void __bt_hal_handle_stack_messages(int message, void *buf, uint16_t len)
 {
        DBG("+");
@@ -586,6 +614,10 @@ static void __bt_hal_handle_stack_messages(int message, void *buf, uint16_t len)
                         DBG("Event: HAL_EV_BOND_STATE_CHANGED:");
                         __bt_hal_handle_bond_state_changed_event(buf, len);
                         break;
+               case HAL_EV_ACL_STATE_CHANGED:
+                        DBG("Event: HAL_ACL_STATE_CONNECTED or Disconnected");
+                        __bt_hal_handle_device_acl_state_changed_event(buf, len);
+                        break;
                default:
                        DBG("Event Currently not handled!!");
                        break;
index 338e37e..a7f9116 100644 (file)
@@ -71,6 +71,8 @@ static gboolean __bt_hal_discovery_finished_cb(gpointer user_data);
 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path);
 static void __bt_hal_dbus_device_found_properties(const char *device_path);
 static void __bt_hal_device_properties_lookup(GVariant *result, char *address);
+static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member,const char *path);
+static void __bt_hal_send_device_acl_connection_state_event(gboolean connected, const char *address);
 
 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data)
 {
@@ -670,6 +672,7 @@ static  void __bt_hal_manager_event_filter(GDBusConnection *connection,
                DBG("Manager Event: Interface Name:BT_HAL_AGENT_INTERFACE");
        } else if (g_strcmp0(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
                DBG("Manager Event: Interface Name:BT_HAL_DEVICE_INTERFACE");
+               __bt_hal_handle_device_specific_events(parameters, signal_name, object_path);
        }
 
        return;
@@ -1105,3 +1108,75 @@ static void __bt_hal_device_properties_lookup(GVariant *result, char *address)
        }
        DBG("-");
 }
+
+static void __bt_hal_send_device_acl_connection_state_event(gboolean connected, const char *address)
+{
+       DBG("+");
+       struct hal_ev_acl_state_changed ev;
+
+       ev.status = BT_STATUS_SUCCESS;
+       ev.state = (connected == TRUE) ?
+               HAL_ACL_STATE_CONNECTED :
+               HAL_ACL_STATE_DISCONNECTED;
+
+       _bt_convert_addr_string_to_type(ev.bdaddr, address);
+
+       if (!event_cb)
+               ERR("Bluetooth HAL event handler not registered");
+       else
+               event_cb(HAL_EV_ACL_STATE_CHANGED, &ev, sizeof(ev));
+       DBG("-");
+}
+
+static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member,
+                       const char *path)
+{
+       char *address;
+       const char *property = NULL;
+       if (path == NULL)
+               return;
+
+       if (strcasecmp(member, "PropertyChanged") == 0) {
+               g_variant_get(msg, "(s)", &property);
+               if (property == NULL)
+                       return;
+               if (strcasecmp(property, "GattConnected") == 0) {
+                       /* TODO */
+               } else if (strcasecmp(property, "Paired") == 0) {
+                       /* TODO */
+               } else if (strcasecmp(property, "UUIDs") == 0) {
+                       /* TODO */
+               }
+       } else if (strcasecmp(member, "DeviceConnected") == 0) {
+               unsigned char addr_type = 0;
+
+               g_variant_get(msg, "(y)", &addr_type);
+
+               address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
+               _bt_convert_device_path_to_address(path, address);
+
+               DBG("Member: [%s]", member);
+               ERR_C("Connected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
+               __bt_hal_send_device_acl_connection_state_event(TRUE, address);
+               g_free(address);
+       } else if (strcasecmp(member, "Disconnected") == 0) {
+               unsigned char disc_reason = 0;
+               unsigned char addr_type = 0;
+
+               g_variant_get(msg, "(yy)", &addr_type, &disc_reason);
+
+               address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
+               _bt_convert_device_path_to_address(path, address);
+
+               DBG("Member: [%s]", member);
+               ERR_C("DisConnected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
+               DBG("Disconnect Reason: %d", disc_reason);
+               __bt_hal_send_device_acl_connection_state_event(FALSE, address);
+               g_free(address);
+       } else if (strcasecmp(member, "ProfileStateChanged") == 0) {
+               /* TODO */
+       } else if (strcasecmp(member, "AdvReport") == 0) {
+               /* TODO */
+               DBG("Member: [%s]", member);
+       }
+}