diff options
author | injun.yang <injun.yang@samsung.com> | 2019-07-01 16:59:12 +0900 |
---|---|---|
committer | DoHyun Pyun <dh79.pyun@samsung.com> | 2019-09-16 13:16:47 +0900 |
commit | cde88279676b86e7412665ec388701fa36f858c8 (patch) | |
tree | 67cc717c8e21c7ec09847b335c31680190982b57 /src | |
parent | 2eb5fd42c86a3b9475f48c1f538660defbead9ae (diff) | |
download | bluetooth-cde88279676b86e7412665ec388701fa36f858c8.tar.gz bluetooth-cde88279676b86e7412665ec388701fa36f858c8.tar.bz2 bluetooth-cde88279676b86e7412665ec388701fa36f858c8.zip |
Implement MTU changed callback for GATT server
[Model] All
[BinType] AP
[Customer] OPEN
[Issue#] N/A
[Request] Internal
[Occurrence Version] N/A
[Problem] Unable to notice MTU changed event to application
[Cause & Measure] Implement MTU changed callback for GATT server
[Checking Method] n/a
[Team] Convergence BT
[Developer] Injun Yang
[Solution company] Samsung
[Change Type] Specification change
Change-Id: I266f8335948c7dd358c8c4e43a974109d297a9b6
Signed-off-by: injun.yang <injun.yang@samsung.com>
Signed-off-by: DoHyun Pyun <dh79.pyun@samsung.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/bluetooth-common.c | 42 | ||||
-rw-r--r-- | src/bluetooth-gatt.c | 38 |
2 files changed, 79 insertions, 1 deletions
diff --git a/src/bluetooth-common.c b/src/bluetooth-common.c index c92cb0a..d5966fb 100644 --- a/src/bluetooth-common.c +++ b/src/bluetooth-common.c @@ -724,6 +724,23 @@ static int __bt_get_bt_gatt_client_att_mtu_info_s(bt_gatt_client_att_mtu_info_s return BT_ERROR_NONE; } +static int __bt_get_bt_gatt_server_att_mtu_info_s(bt_gatt_server_att_mtu_info_s **dest, bluetooth_le_att_mtu_info_t *source) +{ + *dest = (bt_gatt_server_att_mtu_info_s *)g_malloc0(sizeof(bt_gatt_server_att_mtu_info_s)); + + if (_bt_convert_address_to_string(&((*dest)->remote_address), &(source->device_address)) != BT_ERROR_NONE) { + g_free(*dest); + *dest = NULL; + + return BT_ERROR_OUT_OF_MEMORY; + } + + (*dest)->mtu = source->mtu; + (*dest)->status = source->status; + + return BT_ERROR_NONE; +} + static int __bt_get_bt_device_connection_info_s(bt_device_connection_info_s **dest, bt_connection_info_t *source) { *dest = (bt_device_connection_info_s *)g_malloc0(sizeof(bt_device_connection_info_s)); @@ -1252,7 +1269,7 @@ static bool __bt_need_to_handle(int event) case BLUETOOTH_EVENT_GATT_SERVER_NOTIFICATION_COMPLETED: case BLUETOOTH_EVENT_GATT_CLIENT_SERVICE_CHANGED: case BLUETOOTH_EVENT_GATT_ATT_MTU_CHANGED: - case BLUETOOTH_EVENT_TDS_TRANSPORT_DATA_RECEIVED: + case BLUETOOTH_EVENT_GATT_SERVER_ATT_MTU_CHANGED: case BLUETOOTH_EVENT_TDS_ACTIVATION_RESULT: case BLUETOOTH_EVENT_TDS_CONTROL_POINT_ENABLED: case BLUETOOTH_EVENT_TDS_ACTIVATION_INDICATION: @@ -2907,6 +2924,29 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us break; } + case BLUETOOTH_EVENT_GATT_SERVER_ATT_MTU_CHANGED: { + bt_gatt_server_att_mtu_info_s *mtu_info = NULL; + const GSList *server_list = NULL; + bt_gatt_server_s *server = NULL; + + BT_INFO("BLUETOOTH_EVENT_GATT_SERVER_ATT_MTU_CHANGED"); + + server_list = _bt_gatt_get_server_list(); + if (!server_list) + break; + + server = (bt_gatt_server_s *)server_list->data; + + __bt_get_bt_gatt_server_att_mtu_info_s(&mtu_info, (bluetooth_le_att_mtu_info_t *)(param->param_data)); + + if (server && server->att_mtu_changed_cb) + server->att_mtu_changed_cb(server, + (const bt_gatt_server_att_mtu_info_s *)mtu_info, + server->att_mtu_changed_user_data); + + g_free(mtu_info); + break; + } case BLUETOOTH_EVENT_LE_DATA_LENGTH_CHANGED: BT_INFO("__bt_le_set_data_length_changed_cb() will be called"); data_length_info = (bt_le_data_length_params_t *)(param->param_data); diff --git a/src/bluetooth-gatt.c b/src/bluetooth-gatt.c index c17f1ae..a2b1733 100644 --- a/src/bluetooth-gatt.c +++ b/src/bluetooth-gatt.c @@ -3347,6 +3347,44 @@ int bt_gatt_server_foreach_services(bt_gatt_server_h server, return BT_ERROR_NONE; } +int bt_gatt_server_set_att_mtu_changed_cb(bt_gatt_server_h server, bt_gatt_server_att_mtu_changed_cb callback, void *user_data) +{ + bt_gatt_server_s *server_s = (bt_gatt_server_s *)server; + + BT_CHECK_GATT_SERVER_SUPPORT(); + BT_CHECK_INIT_STATUS(); + BT_CHECK_INPUT_PARAMETER(callback); + BT_CHECK_INPUT_PARAMETER(server); + + if (server_s->att_mtu_changed_cb) { + BT_INFO("Already registered"); + server_s->att_mtu_changed_cb = callback; + server_s->att_mtu_changed_user_data = user_data; + return BT_ERROR_NONE; + } + + BT_INFO("MTU Changed callback registered"); + server_s->att_mtu_changed_cb = callback; + server_s->att_mtu_changed_user_data = user_data; + + return BT_ERROR_NONE; +} + +int bt_gatt_server_unset_att_mtu_changed_cb(bt_gatt_server_h server) +{ + bt_gatt_server_s *server_s = (bt_gatt_server_s *)server; + + BT_CHECK_GATT_SERVER_SUPPORT(); + BT_CHECK_INIT_STATUS(); + BT_CHECK_INPUT_PARAMETER(server); + + BT_INFO("MTU Changed callback unregistered"); + server_s->att_mtu_changed_cb = NULL; + server_s->att_mtu_changed_user_data = NULL; + + return BT_ERROR_NONE; +} + #ifdef TIZEN_GATT_CLIENT int bt_gatt_client_create(const char *remote_address, bt_gatt_client_h *client) { |