From f44740d6fe503d2318f86b3024d7ffca5668c9ba Mon Sep 17 00:00:00 2001 From: "h.sandeep" Date: Tue, 8 Aug 2017 11:57:22 +0530 Subject: [PATCH] Apply Tizen3.0 Gatt client product patch ================================================= commit 19bdcca142a1369080998e61c552d422c5dca302 Author: Seungyoun Ju Date: Thu Apr 20 21:36:37 2017 +0900 Fix : Simultaneous GATT client requests are failed ================================================= Change-Id: Iefb332ae6adc881e4c20fd7bd93ae26e3ee7bda9 Signed-off-by: h.sandeep --- bt-api/bt-gatt-client.c | 275 ++++++++++++++++++++++++++---------------------- include/bluetooth-api.h | 9 +- 2 files changed, 157 insertions(+), 127 deletions(-) diff --git a/bt-api/bt-gatt-client.c b/bt-api/bt-gatt-client.c index aad09f1..9819f1e 100644 --- a/bt-api/bt-gatt-client.c +++ b/bt-api/bt-gatt-client.c @@ -918,78 +918,85 @@ static int __bluetooth_get_att_error_code(GError *error) } static void __bluetooth_internal_read_cb(GObject *source_object, - GAsyncResult *res, - gpointer user_data) + GAsyncResult *res, gpointer user_data) { GError *error = NULL; - bt_user_info_t *user_info; - bt_gatt_char_value_t char_value = { 0, }; GDBusConnection *system_gconn = NULL; GVariant *value; - GByteArray *gp_byte_array = NULL; + bt_user_info_t *user_info; GVariantIter *iter; + GByteArray *gp_byte_array = NULL; guint8 g_byte; int att_ecode = 0; + bt_gatt_resp_data_t *resp_data = user_data; BT_DBG("+"); - user_info = _bt_get_user_data(BT_COMMON); system_gconn = _bt_gdbus_get_system_gconn(); value = g_dbus_connection_call_finish(system_gconn, res, &error); - char_value.char_handle = user_data; + + user_info = _bt_get_user_data(BT_COMMON); + if (!user_info) { + g_free(resp_data); + if (error) { + BT_ERR("Error : %s", error->message); + g_clear_error(&error); + return; + } + g_variant_unref(value); + return; + } if (error) { att_ecode = __bluetooth_get_att_error_code(error); g_clear_error(&error); - if (user_info) { - _bt_common_event_cb(BLUETOOTH_EVENT_GATT_READ_CHAR, - att_ecode, NULL, - user_info->cb, user_info->user_data); - } - g_free(char_value.char_handle); - g_variant_unref(value); + + _bt_common_event_cb(BLUETOOTH_EVENT_GATT_READ_CHAR, + att_ecode, resp_data, + user_info->cb, user_info->user_data); + g_free(resp_data); return; } + gp_byte_array = g_byte_array_new(); g_variant_get(value, "(ay)", &iter); - gp_byte_array = g_byte_array_new(); while (g_variant_iter_loop(iter, "y", &g_byte)) g_byte_array_append(gp_byte_array, &g_byte, 1); if (gp_byte_array->len != 0) { - char_value.val_len = gp_byte_array->len; - char_value.char_value = gp_byte_array->data; + resp_data->len = gp_byte_array->len; + resp_data->value = gp_byte_array->data; } - if (user_info) { - _bt_common_event_cb(BLUETOOTH_EVENT_GATT_READ_CHAR, - BLUETOOTH_ATT_ERROR_NONE, &char_value, - user_info->cb, user_info->user_data); - } + _bt_common_event_cb(BLUETOOTH_EVENT_GATT_READ_CHAR, + BLUETOOTH_ATT_ERROR_NONE, resp_data, + user_info->cb, user_info->user_data); + g_free(resp_data); - g_free(char_value.char_handle); g_byte_array_free(gp_byte_array, TRUE); - g_variant_unref(value); g_variant_iter_free(iter); + g_variant_unref(value); BT_DBG("-"); } -BT_EXPORT_API int bluetooth_gatt_read_characteristic_value(const char *characteristic) +BT_EXPORT_API int bluetooth_gatt_read_characteristic_value(const char *chr, + gpointer user_data) { GDBusConnection *conn; - char *handle; + bt_gatt_resp_data_t *resp_data; GVariantBuilder *builder = NULL; guint16 offset = 0; - BT_CHECK_PARAMETER(characteristic, return); + BT_CHECK_PARAMETER(chr, return); BT_CHECK_ENABLED(return); conn = _bt_gdbus_get_system_gconn(); retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL); - handle = g_strdup(characteristic); + resp_data = g_malloc0(sizeof(bt_gatt_resp_data_t)); + resp_data->user_data = user_data; builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); @@ -1001,54 +1008,58 @@ BT_EXPORT_API int bluetooth_gatt_read_characteristic_value(const char *character // g_variant_builder_add(builder, "{sv}", "device", // g_variant_new_object("o", NULL)); - g_dbus_connection_call(conn, - BT_BLUEZ_NAME, - characteristic, - GATT_CHAR_INTERFACE, - "ReadValue", - g_variant_new("(a{sv})", builder), - G_VARIANT_TYPE("(ay)"), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, + g_dbus_connection_call(conn, BT_BLUEZ_NAME, chr, GATT_CHAR_INTERFACE, + "ReadValue", g_variant_new("(a{sv})", builder), + G_VARIANT_TYPE("(ay)"), G_DBUS_CALL_FLAGS_NONE, -1, NULL, (GAsyncReadyCallback)__bluetooth_internal_read_cb, - (gpointer)handle); + (gpointer)resp_data); g_variant_builder_unref(builder); return BLUETOOTH_ERROR_NONE; } static void __bluetooth_internal_write_cb(GObject *source_object, - GAsyncResult *res, - gpointer user_data) + GAsyncResult *res, gpointer user_data) { GError *error = NULL; - bt_user_info_t *user_info; GDBusConnection *system_gconn = NULL; + bt_user_info_t *user_info; GVariant *value; - int att_ecode = BLUETOOTH_ATT_ERROR_NONE; - - user_info = _bt_get_user_data(BT_COMMON); + int att_ecode = 0; + bt_gatt_resp_data_t *resp_data = user_data; system_gconn = _bt_gdbus_get_system_gconn(); value = g_dbus_connection_call_finish(system_gconn, res, &error); + user_info = _bt_get_user_data(BT_COMMON); + if (!user_info) { + g_free(resp_data); + if (error) { + BT_ERR("Error : %s", error->message); + g_clear_error(&error); + return; + } + g_variant_unref(value); + return; + } + if (error) { att_ecode = __bluetooth_get_att_error_code(error); g_clear_error(&error); - } - if (user_info) { _bt_common_event_cb(BLUETOOTH_EVENT_GATT_WRITE_CHAR, - att_ecode, NULL, + att_ecode, resp_data, user_info->cb, user_info->user_data); - } else { - BT_ERR("user info is null"); + g_free(resp_data); + return; } - if (value) - g_variant_unref(value); + _bt_common_event_cb(BLUETOOTH_EVENT_GATT_WRITE_CHAR, + BLUETOOTH_ATT_ERROR_NONE, resp_data, + user_info->cb, user_info->user_data); + g_free(resp_data); + g_variant_unref(value); return; } @@ -1117,7 +1128,8 @@ BT_EXPORT_API int bluetooth_gatt_set_characteristics_value( } BT_EXPORT_API int bluetooth_gatt_set_characteristics_value_by_type( - const char *char_handle, const guint8 *value, int length, guint8 write_type) + const char *chr, const guint8 *value, int length, + guint8 write_type, gpointer user_data) { GVariant *val, *options; GVariantBuilder *builder1; @@ -1126,8 +1138,9 @@ BT_EXPORT_API int bluetooth_gatt_set_characteristics_value_by_type( guint16 offset = 0; int i = 0; int ret = BLUETOOTH_ERROR_NONE; + bt_gatt_resp_data_t *resp_data; - BT_CHECK_PARAMETER(char_handle, return); + BT_CHECK_PARAMETER(chr, return); BT_CHECK_PARAMETER(value, return); retv_if(length == 0, BLUETOOTH_ERROR_INVALID_PARAM); BT_CHECK_ENABLED_INTERNAL(return); @@ -1153,21 +1166,20 @@ BT_EXPORT_API int bluetooth_gatt_set_characteristics_value_by_type( options = g_variant_new("a{sv}", builder2); - g_dbus_connection_call(conn, - BT_BLUEZ_NAME, - char_handle, - GATT_CHAR_INTERFACE, + resp_data = g_malloc0(sizeof(bt_gatt_resp_data_t)); + resp_data->user_data = user_data; + + g_dbus_connection_call(conn, BT_BLUEZ_NAME, chr, GATT_CHAR_INTERFACE, "WriteValuebyType", - g_variant_new("(y@ay@a{sv})", - write_type, val, options), + g_variant_new("(y@ay@a{sv})", write_type, val, options), NULL, - G_DBUS_CALL_FLAGS_NONE, - -1, NULL, + G_DBUS_CALL_FLAGS_NONE, -1, NULL, (GAsyncReadyCallback)__bluetooth_internal_write_cb, - NULL); + (gpointer)resp_data); g_variant_builder_unref(builder1); g_variant_builder_unref(builder2); + return ret; } @@ -1442,75 +1454,85 @@ static void __bluetooth_internal_read_desc_cb(GObject *source_object, gpointer user_data) { GError *error = NULL; - bt_user_info_t *user_info; - bt_gatt_char_property_t char_value = { 0, }; GDBusConnection *system_gconn = NULL; GVariant *value; + bt_user_info_t *user_info; GByteArray *gp_byte_array = NULL; GVariantIter *iter; guint8 g_byte; int att_ecode = 0; + bt_gatt_resp_data_t *resp_data = user_data; BT_DBG("+"); - user_info = _bt_get_user_data(BT_COMMON); - system_gconn = _bt_gdbus_get_system_gconn(); - char_value.handle = user_data; + system_gconn = _bt_gdbus_get_system_gconn(); value = g_dbus_connection_call_finish(system_gconn, res, &error); + user_info = _bt_get_user_data(BT_COMMON); + if (!user_info) { + g_free(resp_data); + if (error) { + BT_ERR("Error : %s", error->message); + g_clear_error(&error); + return; + } + g_variant_unref(value); + return; + } + if (error) { att_ecode = __bluetooth_get_att_error_code(error); g_clear_error(&error); - if (user_info) { - _bt_common_event_cb(BLUETOOTH_EVENT_GATT_READ_DESC, - att_ecode, NULL, - user_info->cb, user_info->user_data); - } - g_free(char_value.handle); - g_variant_unref(value); + + _bt_common_event_cb(BLUETOOTH_EVENT_GATT_READ_DESC, + att_ecode, resp_data, + user_info->cb, user_info->user_data); + g_free(resp_data); return; } + gp_byte_array = g_byte_array_new(); g_variant_get(value, "(ay)", &iter); - gp_byte_array = g_byte_array_new(); - while (g_variant_iter_loop(iter, "y", &g_byte)) + while (g_variant_iter_loop(iter, "y", &g_byte)) g_byte_array_append(gp_byte_array, &g_byte, 1); if (gp_byte_array->len != 0) { - char_value.val_len = (unsigned int)gp_byte_array->len; - char_value.description = (char *)gp_byte_array->data; + resp_data->len = gp_byte_array->len; + resp_data->value = gp_byte_array->data; } - if (user_info) { - _bt_common_event_cb(BLUETOOTH_EVENT_GATT_READ_DESC, - BLUETOOTH_ATT_ERROR_NONE, &char_value, - user_info->cb, user_info->user_data); - } + _bt_common_event_cb(BLUETOOTH_EVENT_GATT_READ_DESC, + BLUETOOTH_ATT_ERROR_NONE, resp_data, + user_info->cb, user_info->user_data); + g_free(resp_data); + g_byte_array_free(gp_byte_array, TRUE); - g_free(char_value.handle); - g_variant_unref(value); g_variant_iter_free(iter); + g_variant_unref(value); BT_DBG("-"); } -BT_EXPORT_API int bluetooth_gatt_read_descriptor_value(const char *char_descriptor) +BT_EXPORT_API int bluetooth_gatt_read_descriptor_value(const char *desc, + gpointer user_data) { GDBusConnection *conn; GVariantBuilder *builder; guint offset = 0; - char *handle; + bt_gatt_resp_data_t *resp_data; BT_DBG("+"); - BT_CHECK_PARAMETER(char_descriptor, return); + + BT_CHECK_PARAMETER(desc, return); BT_CHECK_ENABLED(return); conn = _bt_gdbus_get_system_gconn(); retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL); - handle = g_strdup(char_descriptor); + resp_data = g_malloc0(sizeof(bt_gatt_resp_data_t)); + resp_data->user_data = user_data; builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); @@ -1521,18 +1543,12 @@ BT_EXPORT_API int bluetooth_gatt_read_descriptor_value(const char *char_descript // g_variant_builder_add(builder, "{sv}", "device", // g_variant_new("o", serv_info->serv_path)); - g_dbus_connection_call(conn, - BT_BLUEZ_NAME, - char_descriptor, - GATT_DESC_INTERFACE, - "ReadValue", - g_variant_new("(a{sv})", builder), + g_dbus_connection_call(conn, BT_BLUEZ_NAME, desc, GATT_DESC_INTERFACE, + "ReadValue", g_variant_new("(a{sv})", builder), G_VARIANT_TYPE("(ay)"), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, + G_DBUS_CALL_FLAGS_NONE, -1, NULL, (GAsyncReadyCallback)__bluetooth_internal_read_desc_cb, - (gpointer)handle); + (gpointer)resp_data); g_variant_builder_unref(builder); BT_DBG("-"); @@ -1540,40 +1556,54 @@ BT_EXPORT_API int bluetooth_gatt_read_descriptor_value(const char *char_descript } static void __bluetooth_internal_write_desc_cb(GObject *source_object, - GAsyncResult *res, - gpointer user_data) + GAsyncResult *res, gpointer user_data) { GError *error = NULL; bt_user_info_t *user_info; GDBusConnection *system_gconn = NULL; GVariant *value; int att_ecode = BLUETOOTH_ATT_ERROR_NONE; + bt_gatt_resp_data_t *resp_data = user_data; BT_DBG("+"); - user_info = _bt_get_user_data(BT_COMMON); system_gconn = _bt_gdbus_get_system_gconn(); value = g_dbus_connection_call_finish(system_gconn, res, &error); + user_info = _bt_get_user_data(BT_COMMON); + if (!user_info) { + g_free(resp_data); + if (error) { + BT_ERR("Error : %s", error->message); + g_clear_error(&error); + return; + } + g_variant_unref(value); + return; + } + if (error) { att_ecode = __bluetooth_get_att_error_code(error); g_clear_error(&error); - } - if (user_info) { _bt_common_event_cb(BLUETOOTH_EVENT_GATT_WRITE_DESC, - att_ecode, NULL, + att_ecode, resp_data, user_info->cb, user_info->user_data); + g_free(resp_data); + return; } - if (value) - g_variant_unref(value); + _bt_common_event_cb(BLUETOOTH_EVENT_GATT_WRITE_DESC, + BLUETOOTH_ATT_ERROR_NONE, resp_data, + user_info->cb, user_info->user_data); + g_free(resp_data); + g_variant_unref(value); BT_DBG("-"); } -BT_EXPORT_API int bluetooth_gatt_write_descriptor_value( - const char *desc_handle, const guint8 *value, int length) +BT_EXPORT_API int bluetooth_gatt_write_descriptor_value(const char *desc, + const guint8 *value, int length, gpointer user_data) { GVariant *val, *options; GDBusConnection *conn; @@ -1581,9 +1611,11 @@ BT_EXPORT_API int bluetooth_gatt_write_descriptor_value( GVariantBuilder *builder2; guint offset = 0; int i; + bt_gatt_resp_data_t *resp_data; BT_DBG("+"); - BT_CHECK_PARAMETER(desc_handle, return); + + BT_CHECK_PARAMETER(desc, return); BT_CHECK_PARAMETER(value, return); retv_if(length == 0, BLUETOOTH_ERROR_INVALID_PARAM); BT_CHECK_ENABLED(return); @@ -1609,18 +1641,15 @@ BT_EXPORT_API int bluetooth_gatt_write_descriptor_value( options = g_variant_new("a{sv}", builder2); - g_dbus_connection_call(conn, - BT_BLUEZ_NAME, - desc_handle, - GATT_DESC_INTERFACE, - "WriteValue", - g_variant_new("(@ay@a{sv})", - val, options), - NULL, - G_DBUS_CALL_FLAGS_NONE, - -1, NULL, - (GAsyncReadyCallback)__bluetooth_internal_write_desc_cb, - NULL); + resp_data = g_malloc0(sizeof(bt_gatt_resp_data_t)); + resp_data->user_data = user_data; + + g_dbus_connection_call(conn, BT_BLUEZ_NAME, desc, GATT_DESC_INTERFACE, + "WriteValue", g_variant_new("(@ay@a{sv})", + val, options), NULL, + G_DBUS_CALL_FLAGS_NONE, -1, NULL, + (GAsyncReadyCallback)__bluetooth_internal_write_desc_cb, + (gpointer)resp_data); g_variant_builder_unref(builder1); g_variant_builder_unref(builder2); diff --git a/include/bluetooth-api.h b/include/bluetooth-api.h index 59d7e3a..fe4eba7 100644 --- a/include/bluetooth-api.h +++ b/include/bluetooth-api.h @@ -5431,7 +5431,8 @@ int bluetooth_gatt_set_characteristics_value(const char *char_handle, * @see None */ int bluetooth_gatt_set_characteristics_value_by_type(const char *char_handle, - const guint8 *value, int length, guint8 write_type); + const guint8 *value, int length, + guint8 write_type, gpointer app_data); /** @@ -5476,7 +5477,7 @@ int bluetooth_gatt_set_characteristics_value_request(const char *char_handle, * @remark None * @see None */ -int bluetooth_gatt_read_characteristic_value(const char *char_handle); +int bluetooth_gatt_read_characteristic_value(const char *char_handle, gpointer app_data); /** * @fn int bluetooth_gatt_get_service_from_uuid(bluetooth_device_address_t *address, @@ -5643,7 +5644,7 @@ int bluetooth_gatt_discover_characteristic_descriptor(const char *characteristic * @remark None * @see None */ -int bluetooth_gatt_read_descriptor_value(const char *desc_handle); +int bluetooth_gatt_read_descriptor_value(const char *desc_handle, gpointer app_data); /** * @fn int bluetooth_gatt_write_descriptor_value(const char *desc_handle, @@ -5667,7 +5668,7 @@ int bluetooth_gatt_read_descriptor_value(const char *desc_handle); * @see None */ int bluetooth_gatt_write_descriptor_value(const char *desc_handle, - const guint8 *value, int length); + const guint8 *value, int length, gpointer app_data); /* @fn int bluetooth_gatt_init(void) * -- 2.7.4