Fix bt-service crash issue in testhub
[platform/core/connectivity/bluetooth-frwk.git] / bt-service-adaptation / services / adapter / bt-service-core-adapter-le.c
index 2b39e01..5f146f3 100644 (file)
@@ -33,6 +33,7 @@
 #include "bt-service-gatt.h"
 #include "bt-service-util.h"
 #include "bt-service-core-device.h"
+#include "bt-service-battery-monitor.h"
 
 #include <oal-hardware.h>
 #include <oal-manager.h>
@@ -90,6 +91,8 @@ static bt_le_discovery_state_t adapter_le_discovery_state = LE_DISCOVERY_STOPPED
 
 typedef struct {
        char *sender;
+       uid_t uid;
+       pid_t pid;
        GSList *filter_list;
        gboolean is_scanning;
 } bt_adapter_le_scanner_t;
@@ -519,26 +522,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 +885,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 +899,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 +925,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);
 
@@ -2009,7 +1983,7 @@ int _bt_unregister_all_scan_filters(const char* sender)
        return BLUETOOTH_ERROR_NONE;
 }
 
-int _bt_start_le_scan(const char *sender)
+int _bt_start_le_scan(const char *sender, uid_t uid, pid_t pid)
 {
        bt_adapter_le_scanner_t *scanner;
        int ret;
@@ -2020,6 +1994,8 @@ int _bt_start_le_scan(const char *sender)
                retv_if(scanner == NULL, BLUETOOTH_ERROR_INTERNAL);
 
                scanner->sender = g_strdup(sender);
+               scanner->uid = uid;
+               scanner->pid = pid;
                scanner_list = g_slist_append(scanner_list, scanner);
        }
 
@@ -2160,12 +2136,16 @@ void _bt_check_le_scanner_app_termination(const char *sender)
        if (!scanner)
                return;
 
-       if (scanner->is_scanning)
-               _bt_stop_le_scan(sender);
+       _bt_bm_remove_scan_app(SCAN_LE, scanner->uid, scanner->pid);
+
+       if (scanner->is_scanning) {
+               /* Free 'scanner' into the function */
+               if (_bt_stop_le_scan(sender) != BLUETOOTH_ERROR_NOT_IN_OPERATION)
+                       return;
+       }
 
        scanner_list = g_slist_remove(scanner_list, scanner);
-       g_free(scanner->sender);
-       g_free(scanner);
+       __bt_free_le_scanner(scanner);
 }
 
 int _bt_service_le_init(void)
@@ -2314,7 +2294,7 @@ int _bt_set_le_static_random_address(gboolean is_enable)
 
        result =  adapter_set_le_static_random_address(is_enable);
        if (result != OAL_STATUS_SUCCESS) {
-               BT_ERR("adapter_set_connectable failed: %d", result);
+               BT_ERR("adapter_set_le_static_random_address failed: %d", result);
                result = BLUETOOTH_ERROR_INTERNAL;
        } else {
                BT_INFO("SetLeStaticRandomAddress as %d", is_enable);