Scan filter refactoring 94/217794/2
authorDeokhyun Kim <dukan.kim@samsung.com>
Thu, 14 Nov 2019 08:17:55 +0000 (17:17 +0900)
committerDoHyun Pyun <dh79.pyun@samsung.com>
Fri, 15 Nov 2019 04:53:46 +0000 (13:53 +0900)
Change-Id: I8bf48e8945811eb09147c547c15b87fe6fdf7bf2
Signed-off-by: Deokhyun Kim <dukan.kim@samsung.com>
bt-api/bt-adapter-le.c
bt-api/bt-common.c
bt-service-adaptation/services/adapter/bt-service-core-adapter-le.c
bt-service-adaptation/services/bt-request-handler.c
bt-service-adaptation/services/include/bt-service-core-adapter-le.h
bt-service/bt-request-handler.c
bt-service/bt-service-adapter-le.c
bt-service/bt-service-common.c
bt-service/include/bt-service-adapter-le.h
include/bluetooth-api.h
include/bt-internal-types.h

index 4479d8e..7899e19 100644 (file)
@@ -182,7 +182,7 @@ BT_EXPORT_API int bluetooth_is_scan_filter_supported(gboolean *is_supported)
        return result;
 }
 
-BT_EXPORT_API int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *filter, int *slot_id)
+BT_EXPORT_API int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *filter)
 {
        int result;
 
@@ -196,47 +196,6 @@ BT_EXPORT_API int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *fil
        result = _bt_send_request(BT_BLUEZ_SERVICE, BT_REGISTER_SCAN_FILTER,
                in_param1, in_param2, in_param3, in_param4, &out_param);
 
-       if (result == BLUETOOTH_ERROR_NONE)
-               *slot_id = g_array_index(out_param, int, 0);
-       else
-               BT_ERR("Fail to send request");
-
-       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
-
-       return result;
-}
-
-BT_EXPORT_API int bluetooth_unregister_scan_filter(int slot_id)
-{
-       int result;
-
-       BT_CHECK_ENABLED_ANY(return);
-
-       BT_INIT_PARAMS();
-       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
-
-       g_array_append_vals(in_param1, &slot_id, sizeof(int));
-
-       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_UNREGISTER_SCAN_FILTER,
-               in_param1, in_param2, in_param3, in_param4, &out_param);
-
-       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
-
-       return result;
-}
-
-BT_EXPORT_API int bluetooth_unregister_all_scan_filters(void)
-{
-       int result;
-
-       BT_CHECK_ENABLED_ANY(return);
-
-       BT_INIT_PARAMS();
-       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
-
-       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_UNREGISTER_ALL_SCAN_FILTERS,
-               in_param1, in_param2, in_param3, in_param4, &out_param);
-
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
        return result;
index 7e552bb..d329b6c 100644 (file)
@@ -535,8 +535,6 @@ const char *_bt_convert_service_function_to_string(int function)
                {BT_REMOVE_WHITE_LIST, "BT_REMOVE_WHITE_LIST"},
                {BT_CLEAR_WHITE_LIST, "BT_CLEAR_WHITE_LIST"},
                {BT_REGISTER_SCAN_FILTER, "BT_REGISTER_SCAN_FILTER"},
-               {BT_UNREGISTER_SCAN_FILTER, "BT_UNREGISTER_SCAN_FILTER"},
-               {BT_UNREGISTER_ALL_SCAN_FILTERS, "BT_UNREGISTER_ALL_SCAN_FILTERS"},
                {BT_IS_SCAN_FILTER_SUPPORTED, "BT_IS_SCAN_FILTER_SUPPORTED"},
                {BT_GET_PROFILE_CONNECTED_DEVICES, "BT_GET_PROFILE_CONNECTED_DEVICES"},
                {BT_ENABLE_FORCE_HCI_DUMP, "BT_ENABLE_FORCE_HCI_DUMP"},
index 77e94b1..b80d387 100644 (file)
@@ -92,7 +92,6 @@ typedef struct {
        char *sender;
        GSList *filter_list;
        gboolean is_scanning;
-       gboolean stop_pending;
 } bt_adapter_le_scanner_t;
 
 GSList *scanner_list = NULL;
@@ -106,6 +105,25 @@ static void _bt_disable_all_scanner_status(void);
 
 /******************************************* LE Scan *********************************************/
 
+static void __bt_free_le_scanner(bt_adapter_le_scanner_t *scanner)
+{
+       g_free(scanner->sender);
+       g_slist_free_full(scanner->filter_list, g_free);
+       g_free(scanner);
+}
+
+static void __bt_free_le_scanner_all(void)
+{
+       g_slist_free_full(scanner_list, (GDestroyNotify)__bt_free_le_scanner);
+       scanner_list = NULL;
+
+       is_le_scanning = FALSE;
+       is_le_set_scan_parameter = FALSE;
+       le_scan_params.type = BT_LE_ACTIVE_SCAN;
+       le_scan_params.interval = 0;
+       le_scan_params.window = 0;
+}
+
 void _bt_adapter_set_le_status(bt_le_status_t status)
 {
        BT_INFO("adapter_le_state changed [%d] -> [%d]", adapter_le_state, status);
@@ -732,69 +750,6 @@ static void __bt_le_event_handler(int event_type, gpointer event_data)
        }
 }
 
-int _bt_unregister_scan_filter(const char *sender, int slot_id)
-{
-       int ret;
-       bt_adapter_le_scanner_t *scanner = NULL;
-       bluetooth_le_scan_filter_t *scan_filter_data = NULL;
-       GSList *l;
-       gboolean is_slot_id_found = FALSE;
-
-       scanner = __bt_find_scanner_from_list(sender);
-       if (scanner == NULL) {
-               BT_ERR("There is NO available scanner.");
-               return BLUETOOTH_ERROR_NOT_FOUND;
-       }
-
-       for (l = scanner->filter_list; l != NULL; l = g_slist_next(l)) {
-               scan_filter_data = l->data;
-               if (scan_filter_data->slot_id == slot_id) {
-                       is_slot_id_found = TRUE;
-                       break;
-               }
-       }
-       if (is_slot_id_found == FALSE) {
-               BT_ERR("There is NO registered slot.");
-               return BLUETOOTH_ERROR_NOT_FOUND;
-       }
-       ret = gattc_unregister_scan_filter(slot_id);
-       if (OAL_STATUS_SUCCESS != ret) {
-               BT_ERR("gattc_unregister_scan_filter failed");
-               return BLUETOOTH_ERROR_INTERNAL;
-       }
-       scanner->filter_list = g_slist_remove(scanner->filter_list, scan_filter_data);
-       g_free(scan_filter_data);
-       return BLUETOOTH_ERROR_NONE;
-}
-
-int _bt_unregister_all_scan_filters(const char* sender)
-{
-       int ret;
-       bt_adapter_le_scanner_t *scanner = NULL;
-       bluetooth_le_scan_filter_t *filter_data = NULL;
-       GSList *l;
-
-       scanner = __bt_find_scanner_from_list(sender);
-
-       if (scanner == NULL) {
-               BT_ERR("There is NO available scanner.");
-               return BLUETOOTH_ERROR_NOT_FOUND;
-       }
-       for (l = scanner->filter_list; l != NULL; l = g_slist_next(l)) {
-               filter_data = l->data;
-
-               ret = gattc_unregister_scan_filter(filter_data->slot_id);
-
-               if (OAL_STATUS_SUCCESS != ret)
-                       BT_ERR("gattc_unregister_scan_filter failed for slot_id = [%d]", filter_data->slot_id);
-       }
-
-       g_slist_free_full(scanner->filter_list, g_free);
-       scanner->filter_list = NULL;
-
-       return BLUETOOTH_ERROR_NONE;
-}
-
 int _bt_le_init(void)
 {
        BT_DBG("+");
@@ -1595,12 +1550,121 @@ gboolean __send_le_scan_reply(gpointer data)
        return FALSE;
 }
 
-static gboolean __start_le_scan_timeout(gpointer user_data)
+static int __bt_get_available_scan_filter_slot_id(void)
+{
+       GSList *l;
+       bt_adapter_le_scanner_t *scanner;
+       GSList *fl;
+       bluetooth_le_scan_filter_t *filter_data;
+       gboolean *slot_check_list = NULL;
+       int i;
+
+       if (le_feature_info.max_filter == 0) {
+               BT_ERR("Scan filter is NOT Supported");
+               return -1;
+       }
+       slot_check_list = g_malloc0(sizeof(gboolean) * le_feature_info.max_filter);
+
+       for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
+               scanner = l->data;
+               for (fl = scanner->filter_list; fl != NULL; fl = g_slist_next(fl)) {
+                       filter_data = fl->data;
+                       if (filter_data->slot_id < le_feature_info.max_filter)
+                               slot_check_list[filter_data->slot_id] = TRUE;
+               }
+       }
+
+       for (i = 0; i < le_feature_info.max_filter; i++) {
+               if (slot_check_list[i] == FALSE) {
+                       g_free(slot_check_list);
+                       return i;
+               }
+       }
+
+       BT_ERR("There is NO available slot for scan filter.");
+       g_free(slot_check_list);
+       return -1;
+}
+
+int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *filter)
 {
-       char *sender = (char *)user_data;
-       _bt_start_le_scan(sender);
+       int ret = BLUETOOTH_ERROR_NONE;
+       bt_adapter_le_scanner_t *scanner = NULL;
+       bluetooth_le_scan_filter_t *scan_filter_data = NULL;
+       int slot_id;
 
-       return FALSE;
+       slot_id = __bt_get_available_scan_filter_slot_id();
+       if (slot_id == -1)
+               return BLUETOOTH_ERROR_NO_RESOURCES;
+
+       oal_ble_scan_filter_t filter_data = {.slot_id = slot_id, .device_address = (bt_address_t*)&filter->device_address, .device_name = filter->device_name,
+                                               .service_uuid = (oal_uuid_t*)&filter->service_uuid.data, .service_uuid_len = filter->service_uuid.data_len,
+                                               .service_uuid_mask = (oal_uuid_t*)&filter->service_uuid_mask.data, .service_uuid_mask_len = filter->service_uuid_mask.data_len,
+                                               .service_solicitation_uuid = (oal_uuid_t*)&filter->service_solicitation_uuid.data,
+                                               .service_solicitation_uuid_len = filter->service_solicitation_uuid.data_len,
+                                               .service_solicitation_uuid_mask = (oal_uuid_t*)&filter->service_solicitation_uuid_mask.data,
+                                               .service_solicitation_uuid_mask_len = filter->service_solicitation_uuid_mask.data_len,
+                                               .service_data = filter->service_data.data.data, .service_data_len = filter->service_data.data_len,
+                                               .service_data_mask = filter->service_data_mask.data.data, .service_data_mask_len = filter->service_data_mask.data_len,
+                                               .manufacturer_id = filter->manufacturer_id, .manufacturer_data = filter->manufacturer_data.data.data,
+                                               .manufacturer_data_len = filter->manufacturer_data.data_len, .manufacturer_data_mask = filter->manufacturer_data_mask.data.data,
+                                               .manufacturer_data_mask_len = filter->manufacturer_data_mask.data_len , .added_features = filter->added_features
+                                       };
+       ret = gattc_register_scan_filter(&filter_data);
+
+       if (OAL_STATUS_SUCCESS != ret) {
+               BT_ERR("gattc_register_scan_filter failed");
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       scanner = __bt_find_scanner_from_list(sender);
+
+       if (scanner == NULL) {
+               scanner = g_malloc0(sizeof(bt_adapter_le_scanner_t));
+
+               if (scanner == NULL)
+                       return BLUETOOTH_ERROR_MEMORY_ALLOCATION;
+
+               scanner->sender = g_strdup(sender);
+               scanner_list = g_slist_append(scanner_list, scanner);
+       }
+
+       scan_filter_data = g_malloc0(sizeof(bluetooth_le_scan_filter_t));
+
+       memcpy(scan_filter_data, filter, sizeof(bluetooth_le_scan_filter_t));
+
+       scan_filter_data->slot_id = slot_id;
+       scanner->filter_list = g_slist_append(scanner->filter_list, scan_filter_data);
+
+       return ret;
+}
+
+int _bt_unregister_all_scan_filters(const char* sender)
+{
+       int ret;
+       bt_adapter_le_scanner_t *scanner = NULL;
+       bluetooth_le_scan_filter_t *filter_data = NULL;
+       GSList *l;
+
+       scanner = __bt_find_scanner_from_list(sender);
+
+       if (scanner == NULL) {
+               BT_ERR("There is NO available scanner.");
+               return BLUETOOTH_ERROR_NOT_FOUND;
+       }
+       for (l = scanner->filter_list; l != NULL; l = g_slist_next(l)) {
+               filter_data = l->data;
+
+               ret = gattc_unregister_scan_filter(filter_data->slot_id);
+
+               if (OAL_STATUS_SUCCESS != ret)
+                       BT_ERR("gattc_unregister_scan_filter failed for slot_id = [%d]", filter_data->slot_id);
+       }
+
+       g_slist_free_full(scanner->filter_list, g_free);
+       scanner->filter_list = NULL;
+
+       return BLUETOOTH_ERROR_NONE;
 }
 
 int _bt_start_le_scan(const char *sender)
@@ -1617,13 +1681,6 @@ int _bt_start_le_scan(const char *sender)
                scanner_list = g_slist_append(scanner_list, scanner);
        }
 
-       /* Check scanning is finished or not */
-       if (scanner->stop_pending == TRUE) {
-               BT_DBG("Waiting LEDiscoveryFinished");
-               g_timeout_add(500, (GSourceFunc)__start_le_scan_timeout, scanner->sender);
-               return BLUETOOTH_ERROR_NONE;
-       }
-
        /* Check scanning is in progress or not */
        if (scanner->is_scanning) {
                BT_ERR("BT is already in LE scanning");
@@ -1651,6 +1708,7 @@ int _bt_start_le_scan(const char *sender)
                _bt_set_scan_parameters(&le_scan_params);
        }
 
+// TODO: Enable scan filter
        BT_INFO("Start LE Full Scan");
        ret = gattc_start_le_discovery(g_gatt_client_id);
 
@@ -1666,19 +1724,18 @@ done:
 
 int _bt_stop_le_scan(const char *sender)
 {
-       bt_adapter_le_scanner_t *scan_sender;
+       int result = BLUETOOTH_ERROR_NONE;
        bt_adapter_le_scanner_t *scanner;
        gboolean next_scanning = FALSE;
        GSList *l;
        int ret;
 
        /* Check scanning is in progress or not */
-       scan_sender = __bt_find_scanner_from_list(sender);
-       if (scan_sender == NULL || scan_sender->is_scanning == FALSE)
+       scanner = __bt_find_scanner_from_list(sender);
+       if (scanner == NULL || scanner->is_scanning == FALSE)
                return BLUETOOTH_ERROR_NOT_IN_OPERATION;
 
-       scan_sender->is_scanning = FALSE;
-       scan_sender->stop_pending = TRUE;
+       scanner->is_scanning = FALSE;
 
        for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
                scanner = l->data;
@@ -1690,26 +1747,30 @@ int _bt_stop_le_scan(const char *sender)
                int value = 0;
 
                g_idle_add(__send_le_scan_reply, (void *)(intptr_t)value);
-               return BLUETOOTH_ERROR_NONE;
+               result = BLUETOOTH_ERROR_NONE;
        } else {
                BT_INFO("Just stop LE scan");
-       }
+               ret = gattc_stop_le_discovery(g_gatt_client_id);
+
+               if (OAL_STATUS_SUCCESS != ret) {
+                       BT_ERR("gattc_start_le_discovery failed");
+                       result = BLUETOOTH_ERROR_INTERNAL;
+               }
 
-       ret = gattc_stop_le_discovery(g_gatt_client_id);
+// TODO: Disable scan filter
+               is_le_set_scan_parameter = FALSE;
 
-       if (OAL_STATUS_SUCCESS != ret) {
-               BT_ERR("gattc_start_le_discovery failed");
-               scan_sender->stop_pending = FALSE;
-               return BLUETOOTH_ERROR_INTERNAL;
+               le_scan_params.type = BT_LE_ACTIVE_SCAN;
+               le_scan_params.interval = 0;
+               le_scan_params.window = 0;
        }
 
-       is_le_set_scan_parameter = FALSE;
+       _bt_unregister_all_scan_filters(sender);
 
-       le_scan_params.type = BT_LE_ACTIVE_SCAN;
-       le_scan_params.interval = 0;
-       le_scan_params.window = 0;
+       scanner_list = g_slist_remove(scanner_list, scanner);
+       __bt_free_le_scanner(scanner);
 
-       return BLUETOOTH_ERROR_NONE;
+       return result;
 }
 
 static void _bt_disable_all_scanner_status(void)
@@ -1720,32 +1781,9 @@ static void _bt_disable_all_scanner_status(void)
        for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
                scanner = l->data;
                scanner->is_scanning = FALSE;
-               scanner->stop_pending = FALSE;
        }
 }
 
-static void __bt_free_le_scanner(void)
-{
-       GSList *l;
-       bt_adapter_le_scanner_t *scanner;
-
-       for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
-               scanner = l->data;
-               g_free(scanner->sender);
-               g_slist_free_full(scanner->filter_list, g_free);
-               g_free(scanner);
-       }
-
-       g_slist_free(scanner_list);
-       scanner_list = NULL;
-
-       is_le_scanning = FALSE;
-       is_le_set_scan_parameter = FALSE;
-       le_scan_params.type = BT_LE_ACTIVE_SCAN;
-       le_scan_params.interval = 0;
-       le_scan_params.window = 0;
-}
-
 void _bt_check_le_scanner_app_termination(const char *sender)
 {
        bt_adapter_le_scanner_t *scanner;
@@ -1762,95 +1800,6 @@ void _bt_check_le_scanner_app_termination(const char *sender)
        g_free(scanner);
 }
 
-int __bt_get_available_scan_filter_slot_id(void)
-{
-       GSList *l;
-       bt_adapter_le_scanner_t *scanner;
-       GSList *fl;
-       bluetooth_le_scan_filter_t *filter_data;
-       gboolean *slot_check_list = NULL;
-       int i;
-
-       if (le_feature_info.max_filter == 0) {
-               BT_ERR("Scan filter is NOT Supported");
-               return -1;
-       }
-       slot_check_list = g_malloc0(sizeof(gboolean) * le_feature_info.max_filter);
-
-       for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
-               scanner = l->data;
-               for (fl = scanner->filter_list; fl != NULL; fl = g_slist_next(fl)) {
-                       filter_data = fl->data;
-                       if (filter_data->slot_id < le_feature_info.max_filter)
-                               slot_check_list[filter_data->slot_id] = TRUE;
-               }
-       }
-
-       for (i = 0; i < le_feature_info.max_filter; i++) {
-               if (slot_check_list[i] == FALSE) {
-                       g_free(slot_check_list);
-                       return i;
-               }
-       }
-
-       BT_ERR("There is NO available slot for scan filter.");
-       g_free(slot_check_list);
-       return -1;
-}
-
-int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *filter, int *slot_id)
-{
-       int ret = BLUETOOTH_ERROR_NONE;
-       bt_adapter_le_scanner_t *scanner = NULL;
-       bluetooth_le_scan_filter_t *scan_filter_data = NULL;
-
-       *slot_id = __bt_get_available_scan_filter_slot_id();
-
-       if (*slot_id == -1)
-               return BLUETOOTH_ERROR_NO_RESOURCES;
-
-       oal_ble_scan_filter_t filter_data = {.slot_id = *slot_id, .device_address = (bt_address_t*)&filter->device_address, .device_name = filter->device_name,
-                                               .service_uuid = (oal_uuid_t*)&filter->service_uuid.data, .service_uuid_len = filter->service_uuid.data_len,
-                                               .service_uuid_mask = (oal_uuid_t*)&filter->service_uuid_mask.data, .service_uuid_mask_len = filter->service_uuid_mask.data_len,
-                                               .service_solicitation_uuid = (oal_uuid_t*)&filter->service_solicitation_uuid.data,
-                                               .service_solicitation_uuid_len = filter->service_solicitation_uuid.data_len,
-                                               .service_solicitation_uuid_mask = (oal_uuid_t*)&filter->service_solicitation_uuid_mask.data,
-                                               .service_solicitation_uuid_mask_len = filter->service_solicitation_uuid_mask.data_len,
-                                               .service_data = filter->service_data.data.data, .service_data_len = filter->service_data.data_len,
-                                               .service_data_mask = filter->service_data_mask.data.data, .service_data_mask_len = filter->service_data_mask.data_len,
-                                               .manufacturer_id = filter->manufacturer_id, .manufacturer_data = filter->manufacturer_data.data.data,
-                                               .manufacturer_data_len = filter->manufacturer_data.data_len, .manufacturer_data_mask = filter->manufacturer_data_mask.data.data,
-                                               .manufacturer_data_mask_len = filter->manufacturer_data_mask.data_len , .added_features = filter->added_features
-                                       };
-       ret = gattc_register_scan_filter(&filter_data);
-
-       if (OAL_STATUS_SUCCESS != ret) {
-               BT_ERR("gattc_register_scan_filter failed");
-               return BLUETOOTH_ERROR_INTERNAL;
-       }
-
-       scanner = __bt_find_scanner_from_list(sender);
-
-       if (scanner == NULL) {
-               scanner = g_malloc0(sizeof(bt_adapter_le_scanner_t));
-
-               if (scanner == NULL)
-                       return BLUETOOTH_ERROR_MEMORY_ALLOCATION;
-
-               scanner->sender = g_strdup(sender);
-               scanner_list = g_slist_append(scanner_list, scanner);
-       }
-
-       scan_filter_data = g_malloc0(sizeof(bluetooth_le_scan_filter_t));
-
-       memcpy(scan_filter_data, filter, sizeof(bluetooth_le_scan_filter_t));
-
-       scan_filter_data->slot_id = *slot_id;
-       scanner->filter_list = g_slist_append(scanner->filter_list, scan_filter_data);
-
-       return ret;
-}
-
 int _bt_service_le_init(void)
 {
        le_init();
@@ -1861,7 +1810,7 @@ int _bt_service_le_init(void)
 void _bt_service_le_deinit(void)
 {
        le_deinit();
-       __bt_free_le_scanner();
+       __bt_free_le_scanner_all();
 }
 
 int _bt_is_advertising(void)
index 45cf633..4c1dd26 100644 (file)
@@ -3147,29 +3147,6 @@ normal:
                g_array_append_vals(*out_param1, &is_coded_phy_supported, sizeof(gboolean));
                break;
        }
-       case BT_UNREGISTER_SCAN_FILTER:{
-               char *sender = NULL;
-               int slot_id;
-
-               sender = (char *)g_dbus_method_invocation_get_sender(context);
-               __bt_service_get_parameters(in_param1, &slot_id, sizeof(int));
-               BT_DBG("Remove scan filter [Slot ID : %d]", slot_id);
-
-               result = _bt_unregister_scan_filter(sender, slot_id);
-
-               break;
-       }
-       case BT_UNREGISTER_ALL_SCAN_FILTERS: {
-               char *sender = NULL;
-
-               sender = (char *)g_dbus_method_invocation_get_sender(context);
-
-               BT_DBG("Remove all scan filters [Sender : %s]", sender);
-
-               result = _bt_unregister_all_scan_filters(sender);
-
-               break;
-       }
        case BT_DISCONNECT_DEVICE: {
                bluetooth_device_address_t address = { {0} };
 
@@ -3181,7 +3158,6 @@ normal:
        }
        case BT_REGISTER_SCAN_FILTER: {
                bluetooth_le_scan_filter_t scan_filter;
-               int slot_id;
 
                sender = (char*)g_dbus_method_invocation_get_sender(context);
                __bt_service_get_parameters(in_param1, &scan_filter,
@@ -3190,9 +3166,8 @@ normal:
                BT_DBG("bluetooth_le_scan_filter_t [features : 0x%.2x]",
                                scan_filter.added_features);
 
-               result = _bt_register_scan_filter(sender, &scan_filter, &slot_id);
+               result = _bt_register_scan_filter(sender, &scan_filter);
 
-               g_array_append_vals(*out_param1, &slot_id, sizeof(int));
                break;
        }
        default:
@@ -4149,8 +4124,6 @@ gboolean __bt_service_check_privilege(int function_name,
        case BT_IS_LE_2M_PHY_SUPPORTED:
        case BT_IS_LE_CODED_PHY_SUPPORTED:
        case BT_REGISTER_SCAN_FILTER:
-       case BT_UNREGISTER_SCAN_FILTER:
-       case BT_UNREGISTER_ALL_SCAN_FILTERS:
        case BT_IS_SCAN_FILTER_SUPPORTED:
        case BT_GET_ATT_MTU:
 
index bba7eaf..fb97c76 100644 (file)
@@ -103,11 +103,9 @@ int _bt_set_white_list(bluetooth_device_address_t *device_address, int address_t
 
 int _bt_set_manufacturer_data(bluetooth_manufacturer_data_t *m_data);
 
-int _bt_unregister_scan_filter(const char *sender, int slot_id);
-
 int _bt_unregister_all_scan_filters(const char *sender);
 
-int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *filter, int *slot_id);
+int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *filter);
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
index a1bb5fc..18c99e0 100644 (file)
@@ -472,7 +472,6 @@ int __bt_bluez_request(int function_name,
        case BT_REGISTER_SCAN_FILTER: {
                char *sender = NULL;
                bluetooth_le_scan_filter_t scan_filter;
-               int slot_id;
 
                sender = (char *)g_dbus_method_invocation_get_sender(context);
                __bt_service_get_parameters(in_param1, &scan_filter,
@@ -481,31 +480,7 @@ int __bt_bluez_request(int function_name,
                                scan_filter.added_features);
 
                result = _bt_register_scan_filter(sender,
-                               &scan_filter, &slot_id);
-
-               g_array_append_vals(*out_param1, &slot_id, sizeof(int));
-               break;
-       }
-       case BT_UNREGISTER_SCAN_FILTER:{
-               char *sender = NULL;
-               int slot_id;
-
-               sender = (char *)g_dbus_method_invocation_get_sender(context);
-               __bt_service_get_parameters(in_param1, &slot_id, sizeof(int));
-               BT_DBG("Remove scan filter [Slot ID : %d]", slot_id);
-
-               result = _bt_unregister_scan_filter(sender, slot_id);
-
-               break;
-       }
-       case BT_UNREGISTER_ALL_SCAN_FILTERS:{
-               char *sender = NULL;
-
-               sender = (char *)g_dbus_method_invocation_get_sender(context);
-
-               BT_DBG("Remove all scan filters [Sender : %s]", sender);
-
-               result = _bt_unregister_all_scan_filters(sender);
+                               &scan_filter);
 
                break;
        }
@@ -2986,8 +2961,6 @@ gboolean __bt_service_check_privilege(int function_name,
        case BT_GET_SCAN_RESPONSE_DATA:
        case BT_IS_ADVERTISING:
        case BT_REGISTER_SCAN_FILTER:
-       case BT_UNREGISTER_SCAN_FILTER:
-       case BT_UNREGISTER_ALL_SCAN_FILTERS:
        case BT_IS_SCAN_FILTER_SUPPORTED:
        case BT_GET_PROFILE_RESTRICTED:
        case BT_GET_ATT_MTU:
index 634b19f..b7d9c49 100644 (file)
@@ -61,7 +61,6 @@ typedef struct {
        char *sender;
        GSList *filter_list;
        gboolean is_scanning;
-       gboolean stop_pending;
 } bt_adapter_le_scanner_t;
 
 static bluetooth_advertising_params_t adv_params = {
@@ -181,6 +180,26 @@ void __bt_free_le_adv_slot(void)
        le_adv_slot = NULL;
 }
 
+static void __bt_free_le_scanner(bt_adapter_le_scanner_t *scanner)
+{
+       g_free(scanner->sender);
+       g_slist_free_full(scanner->filter_list, g_free);
+       g_free(scanner);
+}
+
+static void __bt_free_le_scanner_all(void)
+{
+       g_slist_free_full(scanner_list, (GDestroyNotify)__bt_free_le_scanner);
+       scanner_list = NULL;
+
+       scan_filter_enabled = FALSE;
+       is_le_scanning = FALSE;
+       is_le_set_scan_parameter = FALSE;
+       le_scan_params.type = BT_LE_ACTIVE_SCAN;
+       le_scan_params.interval = 0;
+       le_scan_params.window = 0;
+}
+
 int _bt_le_set_max_packet_len(void)
 {
        int result = BLUETOOTH_ERROR_NONE;
@@ -956,7 +975,7 @@ bt_adapter_le_scanner_t* __bt_find_scanner_from_list(const char *sender)
        return NULL;
 }
 
-int __bt_get_available_scan_filter_slot_id(void)
+static int __bt_get_available_scan_filter_slot_id(void)
 {
        GSList *l;
        bt_adapter_le_scanner_t *scanner;
@@ -1000,7 +1019,7 @@ gboolean _bt_is_scan_filter_supported(void)
        return FALSE;
 }
 
-int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *filter, int *slot_id)
+int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *filter)
 {
        GDBusProxy *proxy;
        GError *error = NULL;
@@ -1014,9 +1033,10 @@ int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *fil
        bt_adapter_le_scanner_t *scanner = NULL;
        bluetooth_le_scan_filter_t *filter_data = NULL;
        int feature_selection = 0;
+       int slot_id;
 
-       *slot_id = __bt_get_available_scan_filter_slot_id();
-       if (*slot_id == -1)
+       slot_id = __bt_get_available_scan_filter_slot_id();
+       if (slot_id == -1)
                return BLUETOOTH_ERROR_NO_RESOURCES;
 
        proxy = _bt_get_adapter_proxy();
@@ -1041,7 +1061,7 @@ int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *fil
                                        0,      // client_if
                                        0,      // action (Add - 0x00, Delete - 0x01, Clear - 0x02)
                                        BLUETOOTH_LE_SCAN_FILTER_FEATURE_DEVICE_ADDRESS,        // filter_type
-                                       *slot_id,       // filter_index
+                                       slot_id,        // filter_index
                                        0,      // company_id
                                        0,      // company_id_mask
                                        arr_uuid_param, // p_uuid
@@ -1079,7 +1099,7 @@ int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *fil
                                        0,      // client_if
                                        0,      // action (Add - 0x00, Delete - 0x01, Clear - 0x02)
                                        BLUETOOTH_LE_SCAN_FILTER_FEATURE_DEVICE_NAME,   // filter_type
-                                       *slot_id,       // filter_index
+                                       slot_id,        // filter_index
                                        0,      // company_id
                                        0,      // company_id_mask
                                        arr_uuid_param, // p_uuid
@@ -1123,7 +1143,7 @@ int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *fil
                                        0,      // client_if
                                        0,      // action (Add - 0x00, Delete - 0x01, Clear - 0x02)
                                        BLUETOOTH_LE_SCAN_FILTER_FEATURE_SERVICE_UUID,  // filter_type
-                                       *slot_id,       // filter_index
+                                       slot_id,        // filter_index
                                        0,      // company_id
                                        0,      // company_id_mask
                                        arr_uuid_param, // p_uuid
@@ -1170,7 +1190,7 @@ int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *fil
                                        0,      // client_if
                                        0,      // action (Add - 0x00, Delete - 0x01, Clear - 0x02)
                                        BLUETOOTH_LE_SCAN_FILTER_FEATURE_SERVICE_SOLICITATION_UUID,     // filter_type
-                                       *slot_id,       // filter_index
+                                       slot_id,        // filter_index
                                        0,      // company_id
                                        0,      // company_id_mask
                                        arr_uuid_param, // p_uuid
@@ -1217,7 +1237,7 @@ int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *fil
                                        0,      // client_if
                                        0,      // action (Add - 0x00, Delete - 0x01, Clear - 0x02)
                                        BLUETOOTH_LE_SCAN_FILTER_FEATURE_SERVICE_DATA,  // filter_type
-                                       *slot_id,       // filter_index
+                                       slot_id,        // filter_index
                                        0,      // company_id
                                        0,      // company_id_mask
                                        arr_uuid_param, // p_uuid
@@ -1264,7 +1284,7 @@ int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *fil
                                        0,      // client_if
                                        0,      // action (Add - 0x00, Delete - 0x01, Clear - 0x02)
                                        BLUETOOTH_LE_SCAN_FILTER_FEATURE_MANUFACTURER_DATA,     // filter_type
-                                       *slot_id,       // filter_index
+                                       slot_id,        // filter_index
                                        filter->manufacturer_id,        // company_id
                                        0xFFFF, // company_id_mask
                                        arr_uuid_param, // p_uuid
@@ -1294,7 +1314,7 @@ int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *fil
        param = g_variant_new("(iiiiiiiiiiii)",
                                0,      // client_if
                                0,      // action (Add - 0x00, Delete - 0x01, Clear - 0x02)
-                               *slot_id,       // filter_index
+                               slot_id,        // filter_index
                                feature_selection,      // feat_seln
                                0,      // list_logic_type (OR - 0x00, AND - 0x01)
                                1,      // filt_logic_type (OR - 0x00, AND - 0x01)
@@ -1324,7 +1344,7 @@ int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *fil
        if (scanner) {
                filter_data = g_malloc0(sizeof(bluetooth_le_scan_filter_t));
                memcpy(filter_data, filter, sizeof(bluetooth_le_scan_filter_t));
-               filter_data->slot_id = *slot_id;
+               filter_data->slot_id = slot_id;
 
                scanner->filter_list = g_slist_append(scanner->filter_list, filter_data);
        }
@@ -1334,55 +1354,6 @@ int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *fil
        return BLUETOOTH_ERROR_NONE;
 }
 
-int _bt_unregister_scan_filter(const char *sender, int slot_id)
-{
-       GDBusProxy *proxy;
-       GError *error = NULL;
-       GVariant *ret;
-       bt_adapter_le_scanner_t *scanner = NULL;
-       bluetooth_le_scan_filter_t *filter_data = NULL;
-       GSList *l;
-       gboolean is_slot_id_found = FALSE;
-
-       scanner = __bt_find_scanner_from_list(sender);
-       if (scanner == NULL) {
-               BT_ERR("There is NO available scanner.");
-               return BLUETOOTH_ERROR_NOT_FOUND;
-       }
-
-       for (l = scanner->filter_list; l != NULL; l = g_slist_next(l)) {
-               filter_data = l->data;
-               if (filter_data->slot_id == slot_id) {
-                       is_slot_id_found = TRUE;
-                       break;
-               }
-       }
-       if (is_slot_id_found == FALSE) {
-               BT_ERR("There is NO registered slot.");
-               return BLUETOOTH_ERROR_NOT_FOUND;
-       }
-
-       proxy = _bt_get_adapter_proxy();
-       retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
-
-       ret = g_dbus_proxy_call_sync(proxy, "scan_filter_clear",
-                               g_variant_new("(ii)", 0, slot_id),
-                               G_DBUS_CALL_FLAGS_NONE,
-                               -1, NULL, &error);
-
-       if (error) {
-               BT_ERR("scan_filter_clear Fail: %s", error->message);
-               g_clear_error(&error);
-       }
-
-       scanner->filter_list = g_slist_remove(scanner->filter_list, filter_data);
-       g_free(filter_data);
-
-       if (ret)
-               g_variant_unref(ret);
-       return BLUETOOTH_ERROR_NONE;
-}
-
 int _bt_unregister_all_scan_filters(const char *sender)
 {
        GDBusProxy *proxy;
@@ -1422,15 +1393,6 @@ int _bt_unregister_all_scan_filters(const char *sender)
        return BLUETOOTH_ERROR_NONE;
 }
 
-static gboolean __start_le_scan_timeout(gpointer user_data)
-{
-       char *sender = (char *)user_data;
-       _bt_start_le_scan(sender);
-
-       return FALSE;
-}
-
-
 int _bt_start_le_scan(const char *sender)
 {
        GDBusProxy *proxy;
@@ -1444,12 +1406,6 @@ int _bt_start_le_scan(const char *sender)
                scanner_list = g_slist_append(scanner_list, scanner);
        }
 
-       if (scanner->stop_pending == TRUE) {
-               BT_DBG("Waiting LEDiscoveryFinished");
-               g_timeout_add(500, (GSourceFunc)__start_le_scan_timeout, scanner->sender);
-               return BLUETOOTH_ERROR_NONE;
-       }
-
        if (scanner->is_scanning == TRUE) {
                BT_ERR("BT is already in LE scanning");
                return BLUETOOTH_ERROR_IN_PROGRESS;
@@ -1533,17 +1489,18 @@ int _bt_stop_le_scan(const char *sender)
        GDBusProxy *proxy;
        GError *error = NULL;
        GVariant *ret;
-       bt_adapter_le_scanner_t *scan_sender = __bt_find_scanner_from_list(sender);
-       bt_adapter_le_scanner_t *scanner;
+       bt_adapter_le_scanner_t *scanner = __bt_find_scanner_from_list(sender);
        GSList *l;
        gboolean next_scanning = FALSE;
        gboolean need_scan_filter = TRUE;
 
-       if (scan_sender == NULL || scan_sender->is_scanning == FALSE)
+       if (scanner == NULL || scanner->is_scanning == FALSE)
                return BLUETOOTH_ERROR_NOT_IN_OPERATION;
 
-       scan_sender->is_scanning = FALSE;
-       scan_sender->stop_pending = TRUE;
+       _bt_unregister_all_scan_filters(sender);
+
+       scanner_list = g_slist_remove(scanner_list, scanner);
+       __bt_free_le_scanner(scanner);
 
        for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
                scanner = l->data;
@@ -1575,7 +1532,6 @@ int _bt_stop_le_scan(const char *sender)
                        scan_filter_enabled = TRUE;
                }
                BT_INFO("next_scanning exists. Keep the LE scanning");
-               scan_sender->stop_pending = FALSE;
                return BLUETOOTH_ERROR_NONE;
        } else {
                if (scan_filter_enabled == TRUE) {
@@ -1628,33 +1584,9 @@ void _bt_disable_all_scanner_status(void)
        for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
                scanner = l->data;
                scanner->is_scanning = FALSE;
-               scanner->stop_pending = FALSE;
        }
 }
 
-static void __bt_free_le_scanner(void)
-{
-       GSList *l;
-       bt_adapter_le_scanner_t *scanner;
-
-       for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
-               scanner = l->data;
-               g_free(scanner->sender);
-               g_slist_free_full(scanner->filter_list, g_free);
-               g_free(scanner);
-       }
-
-       g_slist_free(scanner_list);
-       scanner_list = NULL;
-
-       scan_filter_enabled = FALSE;
-       is_le_scanning = FALSE;
-       is_le_set_scan_parameter = FALSE;
-       le_scan_params.type = BT_LE_ACTIVE_SCAN;
-       le_scan_params.interval = 0;
-       le_scan_params.window = 0;
-}
-
 void _bt_set_le_scan_status(gboolean mode)
 {
        BT_DBG("set is_le_scanning : %d -> %d", is_le_scanning, mode);
@@ -2431,5 +2363,5 @@ int _bt_service_adapter_le_init(void)
 void _bt_service_adapter_le_deinit(void)
 {
        __bt_free_le_adv_slot();
-       __bt_free_le_scanner();
+       __bt_free_le_scanner_all();
 }
index daed285..fd531ab 100644 (file)
@@ -1172,8 +1172,6 @@ const char *_bt_convert_service_function_to_string(int function)
                {BT_REMOVE_WHITE_LIST, "BT_REMOVE_WHITE_LIST"},
                {BT_CLEAR_WHITE_LIST, "BT_CLEAR_WHITE_LIST"},
                {BT_REGISTER_SCAN_FILTER, "BT_REGISTER_SCAN_FILTER"},
-               {BT_UNREGISTER_SCAN_FILTER, "BT_UNREGISTER_SCAN_FILTER"},
-               {BT_UNREGISTER_ALL_SCAN_FILTERS, "BT_UNREGISTER_ALL_SCAN_FILTERS"},
                {BT_IS_SCAN_FILTER_SUPPORTED, "BT_IS_SCAN_FILTER_SUPPORTED"},
                {BT_GET_PROFILE_CONNECTED_DEVICES, "BT_GET_PROFILE_CONNECTED_DEVICES"},
                {BT_ENABLE_FORCE_HCI_DUMP, "BT_ENABLE_FORCE_HCI_DUMP"},
index 3b44d90..85a71a8 100644 (file)
@@ -100,9 +100,7 @@ int _bt_prepare_scan_parameters(bluetooth_le_scan_params_t *params, int scan_typ
 
 gboolean _bt_is_scan_filter_supported(void);
 
-int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *filter, int *slot_id);
-
-int _bt_unregister_scan_filter(const char *sender, int slot_id);
+int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *filter);
 
 int _bt_unregister_all_scan_filters(const char *sender);
 
index 5570984..3ff8a99 100644 (file)
@@ -3285,7 +3285,7 @@ int  bluetooth_is_scan_filter_supported(gboolean *is_supported);
 int bluetooth_force_hcidump(int timeout);
 
 /**
- * @fn int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *filter, int *slot_id)
+ * @fn int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *filter)
  * @brief Register scan filter.
  *
  * This function registers the scan filter.
@@ -3295,41 +3295,10 @@ int bluetooth_force_hcidump(int timeout);
  * @return     BLUETOOTH_ERROR_NONE - Success \n
  *
  * @param[in]   filter   scan filter to register
- * @param[out]  slot_id  the slot ID of scan filter
  *
  * @remark      None
  */
-int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *filter, int *slot_id);
-
-/**
- * @fn int bluetooth_unregister_scan_filter(int slot_id)
- * @brief Register scan filter.
- *
- * This function unregisters the scan filter.
- *
- * This function is a synchronous call.
- *
- * @return     BLUETOOTH_ERROR_NONE - Success \n
- *
- * @param[in]   slot_id  the slot ID of scan filter
- *
- * @remark      None
- */
-int bluetooth_unregister_scan_filter(int slot_id);
-
-/**
- * @fn int bluetooth_unregister_all_scan_filters(void)
- * @brief Register scan filter.
- *
- * This function usregisters all scan filters.
- *
- * This function is a synchronous call.
- *
- * @return     BLUETOOTH_ERROR_NONE - Success \n
- *
- * @remark      None
- */
-int bluetooth_unregister_all_scan_filters(void);
+int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *filter);
 
 /**
  * @fn int bluetooth_enable_rssi(const bluetooth_device_address_t *remote_address,
index 016285c..5fee5c9 100644 (file)
@@ -211,8 +211,6 @@ typedef enum {
        BT_REMOVE_WHITE_LIST,
        BT_CLEAR_WHITE_LIST,
        BT_REGISTER_SCAN_FILTER,
-       BT_UNREGISTER_SCAN_FILTER,
-       BT_UNREGISTER_ALL_SCAN_FILTERS,
        BT_IS_SCAN_FILTER_SUPPORTED,
        BT_GET_PROFILE_CONNECTED_DEVICES,
        BT_ENABLE_FORCE_HCI_DUMP,