Fix the build error in aarch64
[platform/core/connectivity/bluetooth-frwk.git] / bt-service-adaptation / services / adapter / bt-service-core-adapter-le.c
index eafce27..c0530e4 100644 (file)
@@ -52,6 +52,17 @@ static const char BASE_UUID_CONVERTED[BT_UUID_128] = {
 };
 
 typedef struct {
+        int adv_inst_max;
+        int rpa_offloading;
+        int max_filter;
+       int le_2m_phy;
+       int le_coded_phy;
+} bt_adapter_le_feature_info_t;
+
+/* Set Default values */
+static bt_adapter_le_feature_info_t le_feature_info = {1, 0, 0, 0, 0};
+
+typedef struct {
        int adv_handle;
        char *sender;
        int data_len;
@@ -85,6 +96,9 @@ typedef struct {
 GSList *scanner_list = NULL;
 static gboolean is_le_set_scan_parameter = FALSE;
 static gboolean is_le_scanning = FALSE;
+
+static int g_gatt_client_id = 0;
+
 /******************************************* LE Scan *********************************************/
 
 void _bt_adapter_set_le_status(bt_le_status_t status)
@@ -234,8 +248,9 @@ static void __bt_adapter_le_handle_pending_request_info(int result,
        invocation_info_t *req_info = NULL;
        BT_DBG("+");
 
-       for (l = _bt_get_invocation_list(); l != NULL; l = g_slist_next(l)) {
+       for (l = _bt_get_invocation_list(); l != NULL; ) {
                req_info = l->data;
+               l = g_slist_next(l);
                if (req_info == NULL || req_info->service_function != service_function)
                        continue;
 
@@ -317,7 +332,6 @@ static void __bt_le_handle_server_instance_registered(event_gatts_register_t *da
        /* Get sender and adv handle for the server instance */
        _bt_get_adv_handle_from_instance(data->server_inst, &adv_handle);
 
-       if (adv_handle > 0) {
                /* Check if pending Adv Data set or Scan response data set request is pending*/
                for (l = adv_data_pending_list; l != NULL; l = l->next) {
                        info = l->data;
@@ -366,7 +380,6 @@ static void __bt_le_handle_server_instance_registered(event_gatts_register_t *da
                                                                (void*)info, sizeof(bt_pending_adv_data_set_t));
                                                }
                                                goto data_free;
-                                       }
                                }
                        }
                }
@@ -615,9 +628,7 @@ static void __bt_le_event_handler(int event_type, gpointer event_data)
        }
        case OAL_EVENT_BLE_SERVER_INSTANCE_INITIALISED: {
                BT_INFO("OAL Event: Server Instance Registered");
-               event_gatts_register_t* event = g_memdup(event_data, sizeof(event_gatts_register_t));
-               /* GATT Server Registered event is handled in MAIN thread context */
-               __bt_le_handle_server_instance_registered(event);
+               __bt_le_handle_server_instance_registered((event_gatts_register_t *)event_data);
                break;
        }
        case OAL_EVENT_BLE_ADVERTISING_STARTED: {
@@ -630,23 +641,17 @@ static void __bt_le_event_handler(int event_type, gpointer event_data)
        }
        case OAL_EVENT_BLE_MULTI_ADVERTISING_ENABLE: {
                BT_INFO("OAL Event: Advertising Enabled");
-               event_ble_multiadv_status* event = (event_ble_multiadv_status*)g_memdup(event_data,
-                                                               sizeof(event_ble_multiadv_status));
-               __bt_le_multi_advertising_enabled(event);
+               __bt_le_multi_advertising_enabled((event_ble_multiadv_status *)event_data);
                break;
        }
        case OAL_EVENT_BLE_MULTI_ADVERTISING_DISABLE: {
                BT_INFO("OAL Event: Advertising Disabled");
-               event_ble_multiadv_status* event = (event_ble_multiadv_status*)g_memdup(event_data,
-                                                               sizeof(event_ble_multiadv_status));
-               __bt_le_multi_advertising_disabled(event);
+               __bt_le_multi_advertising_disabled((event_ble_multiadv_status *)event_data);
                break;
        }
        case OAL_EVENT_BLE_MULTI_ADVERTISING_SET_INST_DATA: {
                BT_INFO("OAL Event: Advertising Data set successfully");
-               event_ble_multiadv_status* event = (event_ble_multiadv_status*)g_memdup(event_data,
-                                                               sizeof(event_ble_multiadv_status));
-               __bt_le_multi_advertising_set_data(event);
+               __bt_le_multi_advertising_set_data((event_ble_multiadv_status *)event_data);
                break;
        }
        case OAL_EVENT_BLE_MULTI_ADVERTISING_UPDATE: {
@@ -682,6 +687,39 @@ static void __bt_le_event_handler(int event_type, gpointer event_data)
                __bt_le_handle_device_found(scan_result);
                break;
        }
+       case OAL_EVENT_GATTC_REGISTRATION: {
+               event_gattc_register_t *gattc_event = event_data;
+               char uuid_str[BLUETOOTH_UUID_STRING_MAX];
+               char *default_uuid_string;
+
+               default_uuid_string = _bt_gatt_get_default_gatt_client_uuid();
+               _bt_uuid_to_string((service_uuid_t*)&(gattc_event->client_uuid), uuid_str);
+               BT_INFO("default UUID [%s] current registered uuid [%s]",
+                               default_uuid_string, uuid_str);
+               if (g_strcmp0(uuid_str, default_uuid_string)) {
+                       BT_INFO("This is not the default GATT client that is registered");
+
+                       g_free(default_uuid_string);
+                       break;
+               }
+               BT_INFO("GATT CLient instance registered is default client: ID [%d]",
+                               gattc_event->client_if);
+               g_free(default_uuid_string);
+
+               g_gatt_client_id = gattc_event->client_if;
+               break;
+       }
+       case OAL_EVENT_BLE_LOCAL_FEATURES: {
+               event_adapter_le_features_t *le_features = event_data;
+
+               le_feature_info.le_2m_phy = le_features->le_2m_phy_support;
+               le_feature_info.le_coded_phy = le_features->le_coded_phy_support;
+
+               BT_INFO("Adapter LE 2M PHY Support [%s]", le_feature_info.le_2m_phy ? "TRUE" : "FALSE");
+               BT_INFO("Adapter LE CODED PHY Support [%s]", le_feature_info.le_coded_phy ? "TRUE" : "FALSE");
+
+               break;
+       }
        default:
                break;
        }
@@ -991,7 +1029,7 @@ int _bt_get_advertising_data(char *sender, int adv_handle, bluetooth_advertising
        }
 
        _bt_get_previous_adv_data(adv, length, server_instance);
-       BT_DBG("ADV Data length [%d] Server Instance [%d] Adv handle [%d]", length, server_instance, adv_handle);
+       BT_DBG("ADV Data length [%d] Server Instance [%d] Adv handle [%d]", *length, server_instance, adv_handle);
 
        return BLUETOOTH_ERROR_NONE;
 }
@@ -1012,7 +1050,7 @@ int _bt_get_scan_response_data(char *sender, int adv_handle, bluetooth_scan_resp
        }
 
        _bt_get_previous_scan_rsp_data(response, length, server_instance);
-       BT_DBG("SCAN RSP Data length [%d] Server Instance [%d] Adv handle [%d]", length, server_instance, adv_handle);
+       BT_DBG("SCAN RSP Data length [%d] Server Instance [%d] Adv handle [%d]", *length, server_instance, adv_handle);
 
        return BLUETOOTH_ERROR_NONE;
 }
@@ -1237,6 +1275,8 @@ int _bt_set_advertising_data(const char *sender, int adv_handle,
                                        BLUETOOTH_EVENT_ADVERTISING_MANUFACTURER_DATA_CHANGED,
                                        param);
                }
+
+               g_free(old_mdata);
        }
 
        /* Time to update new ADV data completely in Table */
@@ -1364,6 +1404,8 @@ int _bt_set_scan_response_data(const char *sender, int adv_handle,
                                        BLUETOOTH_EVENT_ADVERTISING_MANUFACTURER_DATA_CHANGED,
                                        param);
                }
+
+               g_free(old_mdata);
        }
 
        /* Time to update new Scan Response data completely in Table */
@@ -1424,7 +1466,7 @@ int _bt_set_scan_parameters(bluetooth_le_scan_params_t *params)
 
 gboolean __send_le_scan_reply(gpointer data)
 {
-       int value = (int)data;
+       int value = (intptr_t)data;
 
        if (0 == value) {
                BT_DBG("Send reply to BT_STOP_LE_DISCOVERY");
@@ -1464,7 +1506,7 @@ int _bt_start_le_scan(const char *sender)
                int value = 1;
 
                BT_INFO("LE Full Scan is already on progress");
-               g_idle_add(__send_le_scan_reply, (void *)value);
+               g_idle_add(__send_le_scan_reply, (void *)(intptr_t)value);
                goto done;
        }
 
@@ -1479,7 +1521,8 @@ int _bt_start_le_scan(const char *sender)
        }
 
        BT_INFO("Start LE Full Scan");
-       ret = gattc_start_le_discovery();
+       ret = gattc_start_le_discovery(g_gatt_client_id);
+
        if (OAL_STATUS_SUCCESS != ret) {
                BT_ERR("gattc_start_le_discovery failed");
                return BLUETOOTH_ERROR_INTERNAL;
@@ -1512,13 +1555,14 @@ int _bt_stop_le_scan(const char *sender)
        if (next_scanning == TRUE) {
                int value = 0;
 
-               g_idle_add(__send_le_scan_reply, (void *)value);
+               g_idle_add(__send_le_scan_reply, (void *)(intptr_t)value);
                return BLUETOOTH_ERROR_NONE;
        } else {
                BT_INFO("Just stop LE scan");
        }
 
-       ret = gattc_stop_le_discovery();
+       ret = gattc_stop_le_discovery(g_gatt_client_id);
+
        if (OAL_STATUS_SUCCESS != ret) {
                BT_ERR("gattc_start_le_discovery failed");
                return BLUETOOTH_ERROR_INTERNAL;
@@ -1556,5 +1600,31 @@ void _bt_service_le_deinit(void)
        le_deinit();
 }
 
+int _bt_is_advertising(void)
+{
+       int ret = is_advertising();
+
+       if (ret == BLUETOOTH_ERROR_NONE)
+               return TRUE;
+       else
+               return FALSE;
+}
+
+gboolean _bt_is_le_2m_phy_supported(void)
+{
+       if (le_feature_info.le_2m_phy)
+               return TRUE;
+       else
+               return FALSE;
+}
+
+gboolean _bt_is_le_coded_phy_supported(void)
+{
+       if (le_feature_info.le_coded_phy)
+               return TRUE;
+       else
+               return FALSE;
+}
+
 
 /*************************************** LE Scan APIs *********************************************/