GATT : Fix Server disconnection state change callback 39/282639/1
authorAnuj Jain <anuj01.jain@samsung.com>
Fri, 7 Oct 2022 06:51:45 +0000 (12:21 +0530)
committerAnuj Jain <anuj01.jain@samsung.com>
Fri, 7 Oct 2022 07:02:00 +0000 (12:32 +0530)
This patch fixes the issue of GATT server disconnection callback not
received when server connection state change callback is set using
bt_gatt_server_set_connection_state_changed_cb.

This patch also adds some INVALID_INPUT_PARAMETER checks to new GATT
APIs.

Change-Id: Ie651f9822702a7a15c327361cff8ebd34c156613
Signed-off-by: Anuj Jain <anuj01.jain@samsung.com>
src/bluetooth-common.c
src/bluetooth-gatt.c

index 60af564..04cae16 100644 (file)
@@ -2649,6 +2649,14 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us
        case BLUETOOTH_EVENT_GATT_CLIENT_DISCONNECTED: {
                bt_gatt_client_s *client_s;
                bt_gatt_connection_state_changed_cb cb = NULL;
+
+               const GSList *server_list = NULL;
+               bt_gatt_server_s *server = NULL;
+
+               server_list = _bt_gatt_get_server_list();
+               if (server_list)
+                       server = (bt_gatt_server_s *)server_list->data;
+
                BT_INFO("BLUETOOTH_EVENT_GATT_CLIENT_DISCONNECTED");
                _bt_convert_address_to_string(&device_addr,
                                (bluetooth_device_address_t *)(param->param_data));
@@ -2670,9 +2678,17 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us
                /* TDS Seeker */
                _bt_tds_update_seeker_connection_state_changed(param->result, device_addr, FALSE);
 
-               if (client_s && client_s->client_connection_change_cb)
+               /* Handle Client disconnection event in case of Server */
+               if (server && server->server_connection_change_cb)
+                       server->server_connection_change_cb(_bt_get_error_code(param->result), FALSE, device_addr,
+                                       server->connection_change_user_data);
+
+               if (client_s && client_s->client_connection_change_cb) {
                        client_s->client_connection_change_cb(_bt_get_error_code(param->result), FALSE, device_addr,
                                        client_s->connection_change_user_data);
+                       client_s->client_connection_change_cb = NULL;
+                       client_s->connection_change_user_data = NULL;
+               }
                else {
                        if (event_index >= 0)
                                cb = bt_event_slot_container[event_index].callback;
index 4323a4d..fb72744 100644 (file)
@@ -827,14 +827,17 @@ int bt_gatt_client_connect(bt_gatt_client_h client,
 
        bt_gatt_client_s *client_h = (bt_gatt_client_s *)client;
 
+       BT_CHECK_GATT_CLIENT_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(client);
+       BT_CHECK_INPUT_PARAMETER(callback);
+       BT_CHECK_INPUT_PARAMETER(client_h->remote_address);
+
        bt_gatt_client_s *client_s;
 
        BT_INFO("Address [%s] Auto Connect [%d]",
                        client_h->remote_address, auto_connect);
 
-       BT_CHECK_GATT_CLIENT_SUPPORT();
-       BT_CHECK_INIT_STATUS();
-       BT_CHECK_INPUT_PARAMETER(client_h->remote_address);
        _bt_convert_address_to_hex(&bd_addr, client_h->remote_address);
 
        client_h->client_connection_change_cb = callback;
@@ -928,6 +931,7 @@ int bt_gatt_client_disconnect(bt_gatt_client_h client)
 
        BT_CHECK_GATT_CLIENT_SUPPORT();
        BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(client);
        BT_CHECK_INPUT_PARAMETER(client_h->remote_address);
        _bt_convert_address_to_hex(&bd_addr, client_h->remote_address);
 
@@ -997,6 +1001,7 @@ int bt_gatt_server_set_connection_state_changed_cb(bt_gatt_server_h server,
        BT_CHECK_GATT_SUPPORT();
        BT_CHECK_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(callback);
+       BT_CHECK_INPUT_PARAMETER(server);
        BT_INFO("Connection Change callback registered");
 
        server_s->server_connection_change_cb = callback;
@@ -1011,6 +1016,7 @@ int bt_gatt_server_unset_connection_state_changed_cb(bt_gatt_server_h server)
 
        BT_CHECK_GATT_SUPPORT();
        BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(server);
        BT_INFO("Connection Changed callback unregistered");
 
        server_s->server_connection_change_cb = NULL;