From a813962a28a27836e2d34596fd12827f0548ae71 Mon Sep 17 00:00:00 2001 From: "injun.yang" Date: Fri, 6 Jul 2018 17:42:50 +0900 Subject: [PATCH] Deinitialize adv slot and scanner [Problem] When application request BLE scanning, IN_PROGRESS error returned [Cause & Measure] After recover bluetooth, adv slot and scanner is not initialized. [Checking Method] Recover BT durning LE scanning Change-Id: I117a602ac99bc98c9e063c10734d86e32f95de59 Signed-off-by: injun.yang --- bt-service/bt-service-adapter-le.c | 48 +++++++++++++++++++++++++--------- bt-service/bt-service-event-receiver.c | 10 +++++++ 2 files changed, 46 insertions(+), 12 deletions(-) diff --git a/bt-service/bt-service-adapter-le.c b/bt-service/bt-service-adapter-le.c index a82e8ce..4a50b1e 100644 --- a/bt-service/bt-service-adapter-le.c +++ b/bt-service/bt-service-adapter-le.c @@ -177,18 +177,6 @@ void __bt_free_le_adv_slot(void) le_adv_slot = NULL; } -int _bt_service_adapter_le_init(void) -{ - le_adv_slot = g_malloc0(sizeof(bt_adapter_le_adv_slot_t) * le_feature_info.adv_inst_max); - - return BLUETOOTH_ERROR_NONE; -} - -void _bt_service_adapter_le_deinit(void) -{ - __bt_free_le_adv_slot(); -} - int _bt_le_set_max_packet_len(void) { int result = BLUETOOTH_ERROR_NONE; @@ -217,6 +205,9 @@ gboolean _bt_update_le_feature_support(const char *item, const char *value) if (item == NULL || value == NULL) return FALSE; + if (!le_adv_slot) + _bt_service_adapter_le_init(); + if (g_strcmp0(item, "adv_inst_max") == 0) { int slot_num; @@ -1558,6 +1549,26 @@ void _bt_disable_all_scanner_status(void) } } +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; +} + void _bt_set_le_scan_status(gboolean mode) { is_le_scanning = mode; @@ -2324,3 +2335,16 @@ int _bt_le_set_data_length(bluetooth_device_address_t *device_address, return BLUETOOTH_ERROR_NONE; } + +int _bt_service_adapter_le_init(void) +{ + le_adv_slot = g_malloc0(sizeof(bt_adapter_le_adv_slot_t) * le_feature_info.adv_inst_max); + + return BLUETOOTH_ERROR_NONE; +} + +void _bt_service_adapter_le_deinit(void) +{ + __bt_free_le_adv_slot(); + __bt_free_le_scanner(); +} diff --git a/bt-service/bt-service-event-receiver.c b/bt-service/bt-service-event-receiver.c index a7aeecd..aa15764 100644 --- a/bt-service/bt-service-event-receiver.c +++ b/bt-service/bt-service-event-receiver.c @@ -619,12 +619,17 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path) GError *err = NULL; char *property = NULL; GVariant *param = NULL; + g_variant_iter_init(&value_iter, msg); while ((g_variant_iter_loop(&value_iter, "{sv}", &property, &val))) { BT_INFO("Property %s", property); if (strcasecmp(property, "Discovering") == 0) { gboolean discovering = FALSE; + + if (_bt_adapter_get_status() != BT_ACTIVATED) + return; + g_variant_get(val, "b", &discovering); /* Send event to application */ BT_DBG("Discovering %d", discovering); @@ -659,6 +664,10 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path) } else if (strcasecmp(property, "LEDiscovering") == 0) { gboolean le_discovering = FALSE; + if (_bt_adapter_get_status() != BT_ACTIVATED || + _bt_adapter_get_le_status() != BT_LE_ACTIVATED) + return; + g_variant_get(val, "b", &le_discovering); /* Send event to application */ if (le_discovering == TRUE) { @@ -2825,6 +2834,7 @@ static void __bt_manager_event_filter(GDBusConnection *connection, _bt_handle_adapter_removed(); __bt_devices_list_free(); + _bt_service_adapter_le_deinit(); } _bt_obex_server_check_allocation(&value); -- 2.7.4