Deinitialize adv slot and scanner 34/117434/1 accepted/tizen/3.0/common/20170307.113220 accepted/tizen/3.0/ivi/20170307.090702 accepted/tizen/3.0/mobile/20170307.090418 accepted/tizen/3.0/tv/20170307.090524 accepted/tizen/3.0/wearable/20170307.090611 submit/tizen_3.0/20170306.075549
authorInjun Yang <injun.yang@samsung.com>
Mon, 6 Mar 2017 05:59:50 +0000 (14:59 +0900)
committerDeokhyun Kim <dukan.kim@samsung.com>
Mon, 6 Mar 2017 05:59:50 +0000 (14:59 +0900)
 - When application request BLE scanning, IN_PROGRESS error returned
 - After recover bluetooth, adv slot and scanner is not initialized.

Change-Id: I97dff857079661ac89a62e4c1f4f94714194d9d5
Signed-off-by: Deokhyun Kim <dukan.kim@samsung.com>
bt-service/bt-service-adapter-le.c
bt-service/bt-service-event-receiver.c

index 29ab7f9..0b911e2 100644 (file)
@@ -95,23 +95,14 @@ static 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();
-}
-
 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;
 
@@ -1178,7 +1169,7 @@ int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *fil
        scanner = __bt_find_scanner_from_list(sender);
        if (scanner == NULL) {
                scanner = g_malloc0(sizeof(bt_adapter_le_scanner_t));
-               scanner->sender = strdup(sender);
+               scanner->sender = g_strdup(sender);
                scanner_list = g_slist_append(scanner_list, scanner);
        }
 
@@ -1291,7 +1282,7 @@ int _bt_start_le_scan(const char *sender)
 
        if (scanner == NULL) {
                scanner = g_malloc0(sizeof(bt_adapter_le_scanner_t));
-               scanner->sender = strdup(sender);
+               scanner->sender = g_strdup(sender);
                scanner_list = g_slist_append(scanner_list, scanner);
        }
 
@@ -1463,6 +1454,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;
@@ -2199,3 +2210,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 d60b5de..6a8231c 100644 (file)
@@ -637,6 +637,9 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path)
                        g_variant_get(val, "b", &discovering);
                        /* Send event to application */
                        BT_DBG("Discovering %d", discovering);
+                       if (_bt_adapter_get_status() != BT_ACTIVATED)
+                               return;
+
                        if (discovering == TRUE) {
                                _bt_set_discovery_status(TRUE);
                                param = g_variant_new("(i)", result);
@@ -669,6 +672,11 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path)
                        gboolean le_discovering = FALSE;
 
                        g_variant_get(val, "b", &le_discovering);
+                       BT_DBG("LEDiscovering %d", le_discovering);
+                       if (_bt_adapter_get_status() != BT_ACTIVATED ||
+                               _bt_adapter_get_le_status() != BT_LE_ACTIVATED)
+                               return;
+
                        /* Send event to application */
                        if (le_discovering == TRUE) {
                                _bt_set_le_scan_status(TRUE);
@@ -2927,6 +2935,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);