Deinitialize adv slot and scanner 27/183527/1
authorinjun.yang <injun.yang@samsung.com>
Fri, 6 Jul 2018 08:42:50 +0000 (17:42 +0900)
committerinjun.yang <injun.yang@samsung.com>
Fri, 6 Jul 2018 08:42:50 +0000 (17:42 +0900)
[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 <injun.yang@samsung.com>
bt-service/bt-service-adapter-le.c
bt-service/bt-service-event-receiver.c

index a82e8ce..4a50b1e 100644 (file)
@@ -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();
+}
index a7aeecd..aa15764 100644 (file)
@@ -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);