Merge "Fix : GATT service changed event is not invoked" into tizen accepted/tizen/unified/20200305.123312 submit/tizen/20200304.063814
authorPyun DoHyun <dh79.pyun@samsung.com>
Wed, 4 Mar 2020 06:28:44 +0000 (06:28 +0000)
committerGerrit Code Review <gerrit@review.ap-northeast-2.compute.internal>
Wed, 4 Mar 2020 06:28:44 +0000 (06:28 +0000)
19 files changed:
bt-api/bt-event-handler.c
bt-oal/bluez_hal/src/bt-hal-adapter-dbus-handler.c
bt-oal/bluez_hal/src/bt-hal-dbus-common-utils.c
bt-oal/bluez_hal/src/bt-hal-event-receiver.c
bt-oal/bluez_hal/src/bt-hal-gatt.c
bt-oal/hardware/bt_gatt_client.h
bt-oal/include/oal-event.h
bt-oal/include/oal-manager.h
bt-oal/oal-gatt.c
bt-oal/oal-manager.c
bt-service-adaptation/services/adapter/bt-service-core-adapter-le.c
bt-service-adaptation/services/audio/a2dp_src/bt-service-a2dp-src.c
bt-service-adaptation/services/audio/bt-service-absolute-volume.c
bt-service-adaptation/services/bt-request-handler.c
bt-service-adaptation/services/bt-service-common.c
bt-service-adaptation/services/device/bt-service-bonded-device.c
bt-service-adaptation/services/gatt/bt-service-gatt.c
bt-service-adaptation/services/include/bt-service-common.h
bt-service-adaptation/services/include/bt-service-gatt.h

index b8235df..f0167ea 100644 (file)
@@ -1395,6 +1395,13 @@ void __bt_headset_event_filter(GDBusConnection *connection,
                _bt_headset_event_cb(BLUETOOTH_EVENT_AUDIO_AVC_STATUS,
                                result, &mode,
                                event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, BT_MEDIA_VOLUME_CHANGE) == 0) {
+               unsigned int volume;
+
+               g_variant_get(parameters, "(u)", &volume);
+               _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_VOLUME_CHANGED,
+                               result, &volume,
+                               event_info->cb, event_info->user_data);
        }
 #endif
 }
@@ -1663,13 +1670,6 @@ void __bt_avrcp_event_filter(GDBusConnection *connection,
                _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_DELAY_CHANGED,
                                result, &delay,
                                event_info->cb, event_info->user_data);
-       }  else if (strcasecmp(signal_name, BT_MEDIA_VOLUME_CHANGE) == 0) {
-               unsigned int volume;
-
-               g_variant_get(parameters, "(u)", &volume);
-               _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_VOLUME_CHANGED,
-                               result, &volume,
-                               event_info->cb, event_info->user_data);
        }
 }
 
index 3f594c6..41ed4d8 100644 (file)
@@ -823,6 +823,8 @@ int _bt_hal_get_adapter_powered_state(uint8_t *state)
                return ret;
        }
 
+       g_free(adapter_path);
+
        if (powered)
                *state = 1;
        else
index 730fde4..90f74fc 100644 (file)
@@ -52,9 +52,6 @@
 #define RFCOMM_DEFAULT_PROFILE_CHANNEL 0
 #define BT_AUDIO_SOURCE_MAX 2
 
-static char *avrcp_control_path = NULL;
-static char *avrcp_transport_path = NULL;
-
 static GDBusConnection *system_conn;
 static GDBusConnection *session_conn;
 static GDBusProxy *manager_gproxy = NULL;
@@ -396,8 +393,7 @@ char *_bt_hal_get_control_device_path(bt_bdaddr_t *bd_addr)
        char *control_path;
        char connected_address[BT_HAL_ADDRESS_STRING_SIZE];
 
-       if (avrcp_control_path != NULL)
-               return avrcp_control_path;
+       /* We can add the cache to get transport path for each device */
 
        _bt_hal_convert_addr_type_to_string(connected_address, bd_addr->address);
 
@@ -405,7 +401,6 @@ char *_bt_hal_get_control_device_path(bt_bdaddr_t *bd_addr)
        if (control_path == NULL)
                return NULL;
 
-       avrcp_control_path = control_path;
        DBG("control_path = %s", control_path);
        return control_path;
 }
@@ -415,8 +410,7 @@ char *_bt_hal_get_transport_device_path(bt_bdaddr_t *bd_addr)
        char *transport_path;
        char connected_address[BT_HAL_ADDRESS_STRING_SIZE];
 
-       if (avrcp_transport_path != NULL)
-               return avrcp_transport_path;
+       /* We can add the cache to get transport path for each device */
 
        _bt_hal_convert_addr_type_to_string(connected_address, bd_addr->address);
 
@@ -424,7 +418,6 @@ char *_bt_hal_get_transport_device_path(bt_bdaddr_t *bd_addr)
        if (transport_path == NULL)
                return NULL;
 
-       avrcp_transport_path = transport_path;
        DBG("transport_path = %s", transport_path);
        return transport_path;
 }
index 604eb88..e79c661 100644 (file)
@@ -1825,7 +1825,7 @@ static void __bt_hal_device_properties_lookup(GVariant *result, char *address)
                                        (BT_HAL_STACK_UUID_SIZE * uuid_count),
                                        uuids);
                        ev->num_props = num_props_tmp + 1;
-                       g_free(uuid_value);
+                       g_strfreev(uuid_value);
                }
                g_variant_unref(tmp_value);
 
index e6b6d34..2e959af 100644 (file)
@@ -58,8 +58,10 @@ typedef struct {
        uint8_t addr_type;
        uint8_t adv_type;
        int rssi;
-       int data_len;
-       uint8_t data[BT_HAL_ADV_DATA_MAX_SIZE * 2];
+       uint8_t adv_data[BT_HAL_ADV_DATA_MAX_SIZE];
+       int adv_data_len;
+       uint8_t scan_rsp_data[BT_HAL_ADV_DATA_MAX_SIZE];
+       int scan_rsp_data_len;
        guint timer_id;
 } bt_hal_le_adv_info_t;
 
@@ -462,7 +464,9 @@ static void __bt_hal_send_le_scan_result_event(bt_hal_le_adv_info_t *adv_info)
        str2bt_bdaddr_t(adv_info->addr, &bd_addr);
        if (bt_gatt_callbacks->client->scan_result_cb)
                bt_gatt_callbacks->client->scan_result_cb(
-                               &bd_addr, adv_info->rssi, adv_info->data);
+                               &bd_addr, adv_info->addr_type, adv_info->rssi,
+                               adv_info->adv_data, adv_info->adv_data_len,
+                               adv_info->scan_rsp_data, adv_info->scan_rsp_data_len);
 }
 
 static void __bt_handle_gatt_client_connected(void *buf, uint16_t len)
@@ -774,7 +778,8 @@ static void __bt_hal_handle_gatt_client_scan_result(void *buf, uint16_t len)
                adv_info = __bt_hal_get_adv_ind_info(address);
                if (adv_info) {
                        /* Copy scan response data in data field and send event */
-                       memcpy(&(adv_info->data[adv_info->data_len]), ev->adv_data, data_len);
+                       adv_info->scan_rsp_data_len = data_len;
+                       memcpy(adv_info->scan_rsp_data, ev->adv_data, data_len);
                        __bt_hal_send_le_scan_result_event(adv_info);
                        adv_ind_list = g_slist_remove(adv_ind_list, adv_info);
                        if (adv_info->timer_id)
@@ -796,8 +801,8 @@ static void __bt_hal_handle_gatt_client_scan_result(void *buf, uint16_t len)
        adv_info->addr_type = ev->addr_type;
        adv_info->adv_type = ev->adv_type;
        adv_info->rssi = ev->rssi;
-       adv_info->data_len = data_len;
-       memcpy(adv_info->data, ev->adv_data, data_len);
+       adv_info->adv_data_len = data_len;
+       memcpy(adv_info->adv_data, ev->adv_data, data_len);
 
 #ifdef TIZEN_BT_HAL
        if (_bt_hal_gatt_client_get_le_scan_type() == BT_GATTC_LE_SCAN_TYPE_PASSIVE) {
index d229184..ed445c6 100644 (file)
@@ -89,7 +89,8 @@ typedef void (*register_client_callback)(int status, int client_if,
                bt_uuid_t *app_uuid);
 
 /** Callback for scan results */
-typedef void (*scan_result_callback)(bt_bdaddr_t* bda, int rssi, uint8_t* adv_data);
+typedef void (*scan_result_callback)(bt_bdaddr_t* bda, uint8_t addr_type, int rssi,
+               uint8_t* adv_data, int adv_dat_len, uint8_t *scan_rsp_data, int scan_rsp_data_len);
 
 /** GATT open callback invoked in response to open */
 typedef void (*connect_callback)(int conn_id, int status, int client_if, bt_bdaddr_t* bda);
index 100e701..6f4c45a 100644 (file)
@@ -431,8 +431,12 @@ typedef struct {
 /* BLE: Scan Result Callback data */
 typedef struct {
        int rssi;
+       uint8_t addr_type;
        bt_address_t address;
        uint8_t adv_data[BLE_ADV_DATA_LENGTH];
+       int adv_data_len;
+       uint8_t scan_rsp_data[BLE_ADV_DATA_LENGTH];
+       int scan_rsp_data_len;
 } event_ble_scan_result_info;
 
 typedef struct {
index 2b02fee..f26a784 100755 (executable)
@@ -36,7 +36,7 @@ extern "C" {
 
 #define OAL_UUID_MAX_LENGTH                            16/**< This specifies ble service UUID Length */
 
-#define BLE_ADV_DATA_LENGTH            62 /**< This specifies Advertising Data Length */
+#define BLE_ADV_DATA_LENGTH            31 /**< This specifies Advertising Data Length */
 
 #define BT_ADDRESS_STR_LEN                             18 /**< BT address String length> */
 
index 462132a..c41085f 100644 (file)
@@ -197,7 +197,8 @@ static const btgatt_server_callbacks_t btgatt_server_callbacks = {
 
 /* Forward declaration for GATT client callbacks */
 static void cb_gattc_register_app(int status, int clientIf, bt_uuid_t *app_uuid);
-static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, int rssi, uint8_t *adv_data);
+static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, uint8_t addr_type, int rssi,
+               uint8_t *adv_data, int adv_data_len, uint8_t *scan_rsp_data, int scan_rsp_data_len);
 static void cb_gattc_connection(int conn_id, int status, int client_if, bt_bdaddr_t* bda);
 static void cb_gattc_disconnect(int conn_id, int status, int client_if, bt_bdaddr_t* bda);
 static void cb_gattc_search_result(int conn_id, btgatt_srvc_id_t *srvc_id);
@@ -1413,14 +1414,19 @@ static void cb_gattc_register_app(int status, int clientIf, bt_uuid_t *app_uuid)
        send_event(OAL_EVENT_GATTC_REGISTRATION, event, sizeof(event_gattc_register_t));
 }
 
-static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, int rssi, uint8_t *adv_data)
+static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, uint8_t addr_type, int rssi,
+               uint8_t *adv_data, int adv_data_len, uint8_t *scan_rsp_data, int scan_rsp_data_len)
 {
        event_ble_scan_result_info *event;
 
        event = g_new0(event_ble_scan_result_info, 1);
+       event->addr_type = addr_type;
        event->rssi = rssi;
        memcpy(event->address.addr, bdaddress->address, BT_ADDRESS_BYTES_NUM);
        memcpy(event->adv_data, adv_data, BLE_ADV_DATA_LENGTH);
+       event->adv_data_len = adv_data_len;
+       memcpy(event->scan_rsp_data, scan_rsp_data, BLE_ADV_DATA_LENGTH);
+       event->scan_rsp_data_len = scan_rsp_data_len;
        send_event_bda_trace(OAL_EVENT_BLE_REMOTE_DEVICE_FOUND, event,
                        sizeof(event_ble_scan_result_info), (bt_address_t *)bdaddress);
 }
index 0d28d52..7ae3e67 100644 (file)
@@ -44,6 +44,7 @@
 
 static const hw_module_t* module = NULL;
 static const bt_interface_t *blued_api = NULL;
+static bluetooth_device_t* bt_device = NULL;
 
 static gboolean unload_libs(gpointer data);
 static bluetooth_device_t* load_hal_lib(void);
@@ -53,8 +54,6 @@ static int unload(const struct hw_module_t *module);
 
 oal_status_t oal_mgr_init_internal(void)
 {
-       bluetooth_device_t* bt_device;
-
        bt_device = load_hal_lib();
 
        if (bt_device == NULL) {
@@ -128,6 +127,7 @@ gboolean oal_lib_init(gpointer data)
 
 static gboolean unload_libs(gpointer data)
 {
+       bt_device->common.close((hw_device_t*)bt_device);
        unload((hw_module_t const*)module);
        module = NULL;
        return FALSE;
@@ -137,7 +137,6 @@ static bluetooth_device_t* load_hal_lib(void)
 {
        int err = 0;
        hw_device_t* device;
-       bluetooth_device_t* bt_device = NULL;
 
        BT_DBG("Loading HAL lib");
        if (module == NULL) {
index 2b39e01..dc5abdd 100644 (file)
@@ -519,26 +519,6 @@ static void __bt_le_multi_advertising_set_data(event_ble_multiadv_status *event)
        }
 }
 
-static int __get_advertisement_data(unsigned char *dest, unsigned char *src)
-{
-       int length = 0;
-       int i = 0;
-
-       while (i <= 31) {
-               int len = src[i];
-
-               if ((len == 0) || (31 < (i + len))) {
-                       memcpy(dest, src, length);
-                       break;
-               }
-
-               length += (len + 1);
-               i += (len + 1);
-       }
-
-       return length;
-}
-
 static int __bt_get_ad_data_by_type(const char *in_data, int in_len,
                char in_type, char **data, int *data_len)
 {
@@ -902,7 +882,6 @@ static void __bt_le_handle_device_found(event_ble_scan_result_info *scan_result)
        int result = BLUETOOTH_ERROR_NONE;
        bt_adapter_le_scanner_t *scanner = NULL;
        char address[BT_ADDRESS_STRING_SIZE];
-       int addr_type = 0x01; /* TODO: Need to get correct address type */
        unsigned char adv_ind_data[BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX];
        unsigned char scan_resp_data[BLUETOOTH_SCAN_RESP_DATA_LENGTH_MAX];
        int adv_ind_len = 0;
@@ -917,20 +896,12 @@ static void __bt_le_handle_device_found(event_ble_scan_result_info *scan_result)
        _bt_convert_addr_type_to_string(address, scan_result->address.addr);
 
        memset(adv_ind_data, 0x00, sizeof(adv_ind_data));
-       adv_ind_len = __get_advertisement_data(
-                       adv_ind_data, &(scan_result->adv_data[0]));
-       if (adv_ind_len > BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX) {
-               BT_ERR("Invalid advertising data");
-               return;
-       }
+       adv_ind_len = scan_result->adv_data_len;
+       memcpy(adv_ind_data, scan_result->adv_data, BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX);
 
        memset(scan_resp_data, 0x00, sizeof(scan_resp_data));
-       scan_resp_len = __get_advertisement_data(
-                       scan_resp_data, &(scan_result->adv_data[adv_ind_len]));
-       if (scan_resp_len > BLUETOOTH_SCAN_RESP_DATA_LENGTH_MAX) {
-               BT_ERR("Invalid scan response data");
-               return;
-       }
+       scan_resp_len = scan_result->scan_rsp_data_len;
+       memcpy(scan_resp_data, scan_result->scan_rsp_data, BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX);
 
        BT_DBG("Address: %s, RSSI: %d, adv_ind_len: %d, scan_resp_len: %d",
                        address, scan_result->rssi, adv_ind_len, scan_resp_len);
@@ -951,7 +922,7 @@ static void __bt_le_handle_device_found(event_ble_scan_result_info *scan_result)
 
                param = g_variant_new("(isnnn@ayn@ay)",
                                result, address,
-                               addr_type, scan_result->rssi,
+                               scan_result->addr_type, scan_result->rssi,
                                adv_ind_len, adv_data_param,
                                scan_resp_len, scan_data_param);
 
index 8df461a..caf7515 100644 (file)
@@ -85,6 +85,11 @@ static void __bt_handle_av_connected_state(bluetooth_device_address_t *address)
        /* Set VCONF Key for A2DP Connected status */
        _bt_set_device_values(TRUE, VCONFKEY_BT_DEVICE_A2DP_HEADSET_CONNECTED);
 
+       /* Set readout notification of tts */
+#ifdef TIZEN_FEATURE_READOUT_NOTIFICATION
+       _bt_set_readout_notification_of_tts();
+#endif
+
        /* Send A2DP(SRC Role) connected event to Application */
        param = g_variant_new("(is)", result, addr);
        _bt_send_event(BT_HEADSET_EVENT, BLUETOOTH_EVENT_AV_CONNECTED, param);
index 6c24945..631f3b1 100644 (file)
@@ -459,7 +459,7 @@ void _bt_audio_handle_a2dp_state_changed(const char *address, bool connected)
                __bt_audio_set_avc_mode(mode);
 
                /* Send the initial volume to application */
-               _bt_send_event(BT_AVRCP_EVENT,
+               _bt_send_event(BT_HEADSET_EVENT,
                        BLUETOOTH_EVENT_AVRCP_VOLUME_CHANGED,
                        g_variant_new("(u)", absolute_volume));
        }
@@ -497,7 +497,7 @@ void _bt_audio_handle_transport_volume_changed(unsigned int bt_vol)
                return;
        }
 
-       _bt_send_event(BT_AVRCP_EVENT,
+       _bt_send_event(BT_HEADSET_EVENT,
                BLUETOOTH_EVENT_AVRCP_VOLUME_CHANGED,
                g_variant_new("(u)", absolute_volume));
 }
index c222d57..1236e48 100644 (file)
@@ -2814,6 +2814,9 @@ int __bt_bluez_request(int function_name,
                        /* Save the informations to invocation */
                        _bt_save_invocation_context(context, result, sender,
                                        function_name, (gpointer)addr);
+
+                       if (auto_connect)
+                               _bt_handle_invocation_context(function_name, (void *)addr);
                } else {
                        BT_ERR("GATT Client: gatt connect failed. client_id[%d]", client_id);
                        g_array_append_vals(*out_param1, &address,
index d6ed3b7..c6bbcfe 100644 (file)
@@ -1225,6 +1225,24 @@ void _bt_free_remote_dev(bt_remote_dev_info_t *dev_info)
 
 }
 
+void _bt_free_paired_dev(void *paired_info)
+{
+       bt_remote_dev_info_t* dev_info = (bt_remote_dev_info_t*) paired_info;
+       unsigned int c;
+
+       ret_if(NULL == dev_info);
+
+       g_free(dev_info->address);
+       g_free(dev_info->name);
+       g_free(dev_info->alias);
+       g_free(dev_info->manufacturer_data);
+
+       for (c = 0; c < dev_info->uuid_count; c++)
+               g_free(dev_info->uuids[c]);
+       g_free(dev_info->uuids);
+       g_free(dev_info);
+}
+
 static void __bt_get_service_list(bt_remote_dev_info_t *info, bluetooth_device_info_t *dev)
 {
        unsigned int i;
@@ -1443,6 +1461,24 @@ void _bt_set_device_values(gboolean connected, int state)
                BT_ERR("vconf_set_int failed");
 }
 
+#ifdef TIZEN_FEATURE_READOUT_NOTIFICATION
+void _bt_set_readout_notification_of_tts(void)
+{
+       int tts_setting;
+
+       if (vconf_get_int(VCONFKEY_TTS_SETTING_NOTIFICATION_TTS, &tts_setting) != 0) {
+               BT_ERR("vconf_get_int failed");
+               return;
+       }
+
+       BT_DBG("current value[%d]", tts_setting);
+
+       if (tts_setting == -1)
+               if (vconf_set_int(VCONFKEY_TTS_SETTING_NOTIFICATION_TTS, -1) != 0)
+                       BT_ERR("vconf_set_int failed");
+}
+#endif
+
 int _bt_get_ad_data_by_type(char *in_data, int in_len,
                char in_type, char **data, int *data_len)
 {
index 1047fb2..2ff4cb7 100644 (file)
@@ -494,7 +494,7 @@ void _bt_device_handle_adapter_state(gboolean enabled)
 
        if (!enabled) {
                BT_DBG("Adapter disabled");
-               g_slist_free_full(paired_list, g_free);
+               g_slist_free_full(paired_list, _bt_free_paired_dev);
                paired_list = NULL;
                bonded_list_retrieved = FALSE;
                return;
index 164f14e..824d50e 100644 (file)
@@ -504,6 +504,9 @@ void _bt_gatt_deinit(void)
 {
        BT_INFO("GATT deinit");
 
+       /* Un-register the default gatt client before */
+       __bt_unregister_gatt_client_instance(gatt_default_client);
+
        if (OAL_STATUS_SUCCESS != gatt_disable())
                BT_ERR("gatt deinit failed");
 
@@ -4231,6 +4234,17 @@ gboolean _bt_is_remote_gatt_device_connected(bluetooth_device_address_t *address
        return connected;
 }
 
+void _bt_handle_invocation_context(int function_name, void *data)
+{
+       switch (function_name) {
+       case BT_CONNECT_LE:
+               __bt_gatt_handle_pending_request_info(BLUETOOTH_ERROR_NONE, BT_CONNECT_LE,
+                               (char *)data, BT_ADDRESS_STRING_SIZE);
+               break;
+       default:
+               break;
+       }
+}
 
 int _bt_connect_le_device(bluetooth_device_address_t *address,
                int auto_connect, int client_id)
index bb32986..546af31 100644 (file)
@@ -430,8 +430,14 @@ void _bt_service_print_dev_info(bluetooth_device_info_t *dev_info);
 
 void _bt_free_remote_dev(bt_remote_dev_info_t * dev_info);
 
+void _bt_free_paired_dev(void * paired_info);
+
 void _bt_set_device_values(gboolean connected, int state);
 
+#ifdef TIZEN_FEATURE_READOUT_NOTIFICATION
+void _bt_set_readout_notification_of_tts(void);
+#endif
+
 void _bt_string_to_uuid(char *str, service_uuid_t *p_uuid);
 
 int _bt_get_ad_data_by_type(char *in_data, int in_len,
index 6c9efc9..cabf594 100644 (file)
@@ -107,6 +107,7 @@ int _bt_register_gatt_client_instance(const char *sender,
 
 gboolean _bt_is_remote_gatt_device_connected(bluetooth_device_address_t *address);
 
+void _bt_handle_invocation_context(int function_name, void *data);
 
 int _bt_connect_le_device(bluetooth_device_address_t *address,
                int auto_connect, int client_id);