summaryrefslogtreecommitdiff
path: root/src/bluetooth-otp.c
diff options
context:
space:
mode:
authorGowtham Anandha Babu <gowtham.ab@samsung.com>2017-06-07 12:02:56 +0530
committerGowtham Anandha Babu <gowtham.ab@samsung.com>2017-06-07 12:14:53 +0530
commit323f919ab1dec5790963f0a379ed149efd6d0478 (patch)
treeee14972d62cc72e8f382b20ff9a28166e46480aa /src/bluetooth-otp.c
parentfe6f5af851ff5e49ab0e70262abc07ce737e5327 (diff)
downloadbluetooth-323f919ab1dec5790963f0a379ed149efd6d0478.tar.gz
bluetooth-323f919ab1dec5790963f0a379ed149efd6d0478.tar.bz2
bluetooth-323f919ab1dec5790963f0a379ed149efd6d0478.zip
[OTP] Fix to track ongoing APIs
Change-Id: Ic5e59a0f12f5f6b0c0ab45eb0ea96bcac7dd9307 Signed-off-by: Gowtham Anandha Babu <gowtham.ab@samsung.com>
Diffstat (limited to 'src/bluetooth-otp.c')
-rw-r--r--src/bluetooth-otp.c363
1 files changed, 200 insertions, 163 deletions
diff --git a/src/bluetooth-otp.c b/src/bluetooth-otp.c
index 3ed8125..05fbb3d 100644
--- a/src/bluetooth-otp.c
+++ b/src/bluetooth-otp.c
@@ -129,6 +129,12 @@
#define BT_OTP_IS_READ_PERMITTED(props) props & OBJECT_READ
+typedef enum {
+ BT_OTP_NO_OPERATION = 0,
+ BT_OTP_OBJECT_DISCOVERY,
+ BT_OTP_OBJECT_READ,
+} bt_otp_api_info_e;
+
typedef struct {
char *name;
char *type;
@@ -147,12 +153,6 @@ typedef struct {
const void *connection_callback;
void *conn_cb_user_data;
- const void *object_discovery_complete_cb;
- void *discovery_user_data;
-
- const void *object_read_complete_cb;
- void *read_object_user_data;
-
char *otp_service_handle; /* OTP Service Handle */
char *otp_feature_obj_path; /* OTP feature characteristic handle */
uint64_t otp_feature; /* OTP feature value */
@@ -172,13 +172,16 @@ typedef struct {
bool oacp_cccd_enabled; /* OTP OACP Control Point CCCD is enabled or not */
bool olcp_cccd_enabled; /* OTP OLCP Control Point CCCD is enabled or not */
- bool object_discovery; /* Indicates current state of the object_discovery */
bool multiple_obj_supp; /* Indicates whether remote server supports
* multiple-objects or not
*/
- bool oacp_read_status; /* Indicate whether oacp read is completed or not */
GSList *object_list; /* List of server objects */
uint64_t object_id; /* ID of current object */
+
+ /* Ongoing API Information */
+ bt_otp_api_info_e curr_op;
+ const void *callback;
+ void *user_data;
} bt_otp_client_s;
typedef struct {
@@ -201,6 +204,7 @@ guint id;
object_metadata *_bt_otp_client_find_object(GSList *list, uint64_t id);
static void _bt_otp_client_notify_read_object_status(int result,
char *file_path, bt_otp_client_s *otp_client_s);
+void __bt_otp_reset_api_info(bt_otp_client_s *otp_client_s);
int __bt_check_otp_server_init_status(void)
{
@@ -652,9 +656,8 @@ int bt_otp_client_create(const char *remote_address, bt_otp_client_h *otp_client
otp_client_s->otp_olcp_control_point = NULL;
otp_client_s->olcp_cccd_enabled = FALSE;
otp_client_s->oacp_cccd_enabled = FALSE;
- otp_client_s->object_discovery = FALSE;
+ otp_client_s->curr_op = BT_OTP_NO_OPERATION;
otp_client_s->multiple_obj_supp = FALSE;
- otp_client_s->oacp_read_status = FALSE;
otp_client_list = g_slist_append(otp_client_list, otp_client_s);
*otp_client = (bt_otp_client_h)otp_client_s;
@@ -753,8 +756,8 @@ void _bt_otp_send_discovery_callback(int result, bt_otp_client_s *otp_client_s)
GSList *l;
int k;
if (result != BLUETOOTH_ERROR_NONE) {
- ((bt_otp_client_object_discovery_cb)otp_client_s->object_discovery_complete_cb)(
- result, otp_client_s->remote_address, NULL, otp_client_s->discovery_user_data);
+ ((bt_otp_client_object_discovery_cb)otp_client_s->callback)(
+ result, otp_client_s->remote_address, NULL, otp_client_s->user_data);
return;
}
@@ -780,8 +783,8 @@ void _bt_otp_send_discovery_callback(int result, bt_otp_client_s *otp_client_s)
obj_list->data[k] = m_data;
k++;
}
- ((bt_otp_client_object_discovery_cb)otp_client_s->object_discovery_complete_cb)(
- BLUETOOTH_ERROR_NONE, otp_client_s->remote_address, obj_list, otp_client_s->discovery_user_data);
+ ((bt_otp_client_object_discovery_cb)otp_client_s->callback)(
+ BLUETOOTH_ERROR_NONE, otp_client_s->remote_address, obj_list, otp_client_s->user_data);
}
void _bt_otp_client_read_value_response(int result, char *char_path,
@@ -795,8 +798,10 @@ void _bt_otp_client_read_value_response(int result, char *char_path,
BT_DBG("OTP client Read Value Response [%d] [%s] [%s] [%d]", result,
char_path, value, len);
- if (result != BLUETOOTH_ERROR_NONE)
+ if (result != BLUETOOTH_ERROR_NONE) {
BT_INFO("Read failed for [%s]", char_path);
+ goto read_fail;
+ }
otp_client_s = _bt_otp_client_find(remote_address);
if (otp_client_s == NULL)
@@ -832,111 +837,109 @@ void _bt_otp_client_read_value_response(int result, char *char_path,
}
} else {
if (!g_strcmp0(otp_client_s->otp_name_obj_path, char_path)) {
+ char *name = NULL;
+ name = g_strndup(value, len);
+ BT_INFO("Object Name [%s]", name);
- if (result != BLUETOOTH_ERROR_NONE) {
- BT_INFO("Read Charc Value Response Failed %s(0x%08x)",
- _bt_convert_error_to_string(error_code), error_code);
- return;
- }
-
- metadata->name = g_strndup(value, len);
- BT_INFO("Object Name [%s]", metadata->name);
-
- if (otp_client_s->object_discovery) {
+ if (otp_client_s->curr_op == BT_OTP_OBJECT_DISCOVERY) {
+ metadata->name = g_strdup(name);
error_code = bluetooth_otp_read_characteristic_value(otp_client_s->otp_type_obj_path);
- if (error_code != BLUETOOTH_ERROR_NONE)
+ if (error_code != BLUETOOTH_ERROR_NONE) {
BT_INFO("Read Charc Value Failed %s(0x%08x)",
_bt_convert_error_to_string(error_code), error_code);
+ goto read_fail;
+ }
}
+ g_free(name);
} else if (!g_strcmp0(otp_client_s->otp_type_obj_path, char_path)) {
+ char *type = NULL;
+ type = g_strndup(value, len);
+ BT_INFO("Object Type [%s]", type);
- if (result != BLUETOOTH_ERROR_NONE) {
- return;
- }
- metadata->type = g_strndup(value, len);
- BT_INFO("Object Type [%s]", metadata->type);
-
- if (otp_client_s->object_discovery) {
+ if (otp_client_s->curr_op == BT_OTP_OBJECT_DISCOVERY) {
+ metadata->type = g_strdup(type);
error_code = bluetooth_otp_read_characteristic_value(otp_client_s->otp_size_obj_path);
- if (error_code != BLUETOOTH_ERROR_NONE)
+ if (error_code != BLUETOOTH_ERROR_NONE) {
BT_INFO("Read Charc Value Failed %s(0x%08x)",
_bt_convert_error_to_string(error_code), error_code);
+ goto read_fail;
+ }
}
+ g_free(type);
} else if (!g_strcmp0(otp_client_s->otp_size_obj_path, char_path)) {
+ uint32_t csize, asize;
+ csize = (uint32_t)(value[3] & 0xFF) << 24 |
+ (uint32_t)(value[2] & 0xFF) << 16 |
+ (uint32_t)(value[1] & 0xFF) << 8 |
+ (uint32_t)(value[0] & 0xFF);
- uint32_t curr_size, alloc_size;
-
- if (result != BLUETOOTH_ERROR_NONE) {
- return;
- }
-
- curr_size = (uint32_t)(value[3] & 0xFF) << 24 |
- (uint32_t)(value[2] & 0xFF) << 16 |
- (uint32_t)(value[1] & 0xFF) << 8 |
- (uint32_t)(value[0] & 0xFF);
-
- alloc_size = (uint32_t)(value[7] & 0xFF) << 24 |
+ asize = (uint32_t)(value[7] & 0xFF) << 24 |
(uint32_t)(value[6] & 0xFF) << 16 |
(uint32_t)(value[5] & 0xFF) << 8 |
(uint32_t)(value[4] & 0xFF);
- metadata->curr_size = curr_size;
- metadata->alloc_size = alloc_size;
- BT_INFO("Object Size curr[%lu] alloc[%lu]", metadata->curr_size, metadata->alloc_size);
+ BT_INFO("Object Size curr[%lu] alloc[%lu]", csize, asize);
- if (otp_client_s->object_discovery) {
+ if (otp_client_s->curr_op == BT_OTP_OBJECT_DISCOVERY) {
+ metadata->curr_size = csize;
+ metadata->alloc_size = asize;
error_code = bluetooth_otp_read_characteristic_value(otp_client_s->otp_props_obj_path);
- if (error_code != BLUETOOTH_ERROR_NONE)
+ if (error_code != BLUETOOTH_ERROR_NONE) {
BT_INFO("Read Charc Value Failed %s(0x%08x)",
_bt_convert_error_to_string(error_code), error_code);
+ goto read_fail;
+ }
}
} else if (!g_strcmp0(otp_client_s->otp_props_obj_path, char_path)) {
-
- if (result != BLUETOOTH_ERROR_NONE) {
- return;
- }
- metadata->props = (uint32_t)(value[3] & 0xFF) << 24 |
+ uint32_t props;
+ props = (uint32_t)(value[3] & 0xFF) << 24 |
(uint32_t)(value[2] & 0xFF) << 16 |
(uint32_t)(value[1] & 0xFF) << 8 |
(uint32_t)(value[0] & 0xFF);
- BT_INFO("Object Properties [%lu]", metadata->props);
+ BT_INFO("Object Properties [%lu]", props);
/* First-created & Last-modified are optional charcacteristics */
- if (otp_client_s->otp_first_created_obj_path && otp_client_s->object_discovery) {
- error_code = bluetooth_otp_read_characteristic_value(otp_client_s->otp_first_created_obj_path);
- if (error_code != BLUETOOTH_ERROR_NONE)
- BT_INFO("Read Charc Value Failed %s(0x%08x)",
- _bt_convert_error_to_string(error_code), error_code);
- } else if (otp_client_s->otp_last_modified_obj_path && otp_client_s->object_discovery) {
- error_code = bluetooth_otp_read_characteristic_value(otp_client_s->otp_last_modified_obj_path);
- if (error_code != BLUETOOTH_ERROR_NONE)
- BT_INFO("Read Charc Value Failed %s(0x%08x)",
+ if (otp_client_s->curr_op == BT_OTP_OBJECT_DISCOVERY) {
+ metadata->props = props;
+ if (otp_client_s->otp_first_created_obj_path) {
+ error_code = bluetooth_otp_read_characteristic_value(otp_client_s->otp_first_created_obj_path);
+ if (error_code != BLUETOOTH_ERROR_NONE) {
+ BT_INFO("Read Charc Value Failed %s(0x%08x)",
_bt_convert_error_to_string(error_code), error_code);
- } else {
- /* Reading Object ID characteristics makes sense if server
- * supports multiple objects.
- */
- if (otp_client_s->multiple_obj_supp) {
- metadata->id = 0x256;
- otp_client_s->object_id = metadata->id;
- otp_client_s->object_list = g_slist_append(otp_client_s->object_list, metadata);
- _bt_otp_send_discovery_callback(BLUETOOTH_ERROR_NONE, otp_client_s);
- } else {
- if (otp_client_s->otp_id_obj_path && otp_client_s->object_discovery) {
- error_code = bluetooth_otp_read_characteristic_value(otp_client_s->otp_id_obj_path);
- if (error_code != BLUETOOTH_ERROR_NONE)
- BT_INFO("Read Charc Value Failed %s(0x%08x)",
+ goto read_fail;
+ }
+ } else if (otp_client_s->otp_last_modified_obj_path) {
+ error_code = bluetooth_otp_read_characteristic_value(otp_client_s->otp_last_modified_obj_path);
+ if (error_code != BLUETOOTH_ERROR_NONE) {
+ BT_INFO("Read Charc Value Failed %s(0x%08x)",
_bt_convert_error_to_string(error_code), error_code);
+ goto read_fail;
+ }
+ } else {
+ /* Reading Object ID characteristics makes sense if server
+ * supports multiple objects.
+ */
+ if (otp_client_s->multiple_obj_supp) {
+ metadata->id = 0x256;
+ otp_client_s->object_id = metadata->id;
+ otp_client_s->object_list = g_slist_append(otp_client_s->object_list, metadata);
+ _bt_otp_send_discovery_callback(BLUETOOTH_ERROR_NONE, otp_client_s);
+ __bt_otp_reset_api_info(otp_client_s);
+ } else {
+ if (otp_client_s->otp_id_obj_path) {
+ error_code = bluetooth_otp_read_characteristic_value(otp_client_s->otp_id_obj_path);
+ if (error_code != BLUETOOTH_ERROR_NONE) {
+ BT_INFO("Read Charc Value Failed %s(0x%08x)",
+ _bt_convert_error_to_string(error_code), error_code);
+ goto read_fail;
+ }
+ }
}
}
}
} else if (!g_strcmp0(otp_client_s->otp_first_created_obj_path, char_path)) {
-
- if (result != BLUETOOTH_ERROR_NONE) {
- return;
- }
struct tm tm = {0};
uint16_t year = (uint16_t)(value[1] & 0xFF) << 8 |
(uint16_t)(value[0] & 0xFF);
@@ -949,33 +952,36 @@ void _bt_otp_client_read_value_response(int result, char *char_path,
tm.tm_sec = value[6] & 0xFF;
BT_INFO("Object First Created [%d]-[%d]-[%d]\t[%d][%d][%d]", tm.tm_mday,
tm.tm_mon, tm.tm_year, tm.tm_hour, tm.tm_min, tm.tm_sec);
- metadata->first_created = mktime(&tm);
- if (otp_client_s->otp_last_modified_obj_path && otp_client_s->object_discovery) {
- error_code = bluetooth_otp_read_characteristic_value(otp_client_s->otp_last_modified_obj_path);
- if (error_code != BLUETOOTH_ERROR_NONE)
- BT_INFO("Read Charc Value Failed %s(0x%08x)",
- _bt_convert_error_to_string(error_code), error_code);
- } else {
- if (otp_client_s->multiple_obj_supp) {
- metadata->id = 0x256;
- otp_client_s->object_id = metadata->id;
- otp_client_s->object_list = g_slist_append(otp_client_s->object_list, metadata);
- _bt_otp_send_discovery_callback(BLUETOOTH_ERROR_NONE, otp_client_s);
+ if (otp_client_s->curr_op == BT_OTP_OBJECT_DISCOVERY) {
+ metadata->first_created = mktime(&tm);
+ if (otp_client_s->otp_last_modified_obj_path) {
+ error_code = bluetooth_otp_read_characteristic_value(otp_client_s->otp_last_modified_obj_path);
+ if (error_code != BLUETOOTH_ERROR_NONE) {
+ BT_INFO("Read Charc Value Failed %s(0x%08x)",
+ _bt_convert_error_to_string(error_code), error_code);
+ goto read_fail;
+ }
} else {
- if (otp_client_s->otp_id_obj_path && otp_client_s->object_discovery) {
- error_code = bluetooth_otp_read_characteristic_value(otp_client_s->otp_id_obj_path);
- if (error_code != BLUETOOTH_ERROR_NONE)
- BT_INFO("Read Charc Value Failed %s(0x%08x)",
- _bt_convert_error_to_string(error_code), error_code);
+ if (otp_client_s->multiple_obj_supp) {
+ metadata->id = 0x256;
+ otp_client_s->object_id = metadata->id;
+ otp_client_s->object_list = g_slist_append(otp_client_s->object_list, metadata);
+ _bt_otp_send_discovery_callback(BLUETOOTH_ERROR_NONE, otp_client_s);
+ __bt_otp_reset_api_info(otp_client_s);
+ } else {
+ if (otp_client_s->otp_id_obj_path) {
+ error_code = bluetooth_otp_read_characteristic_value(otp_client_s->otp_id_obj_path);
+ if (error_code != BLUETOOTH_ERROR_NONE) {
+ BT_INFO("Read Charc Value Failed %s(0x%08x)",
+ _bt_convert_error_to_string(error_code), error_code);
+ goto read_fail;
+ }
+ }
}
}
}
} else if (!g_strcmp0(otp_client_s->otp_last_modified_obj_path, char_path)) {
-
- if (result != BLUETOOTH_ERROR_NONE) {
- return;
- }
struct tm tm = {0};
uint16_t year = (uint16_t)(value[1] & 0xFF) << 8 |
(uint16_t)(value[0] & 0xFF);
@@ -988,45 +994,59 @@ void _bt_otp_client_read_value_response(int result, char *char_path,
tm.tm_sec = value[6] & 0xFF;
BT_INFO("Object Last Modified [%d]-[%d]-[%d]\t[%d][%d][%d]", tm.tm_mday,
tm.tm_mon, tm.tm_year, tm.tm_hour, tm.tm_min, tm.tm_sec);
- metadata->last_modified = mktime(&tm);
- if (otp_client_s->multiple_obj_supp) {
- /* None of the optional characteristics supported, so finish object discovery */
- metadata->id = 0x256;
- otp_client_s->object_id = metadata->id;
- otp_client_s->object_list = g_slist_append(otp_client_s->object_list, metadata);
- _bt_otp_send_discovery_callback(BLUETOOTH_ERROR_NONE, otp_client_s);
- } else {
- if (otp_client_s->otp_id_obj_path && otp_client_s->object_discovery) {
- error_code = bluetooth_otp_read_characteristic_value(otp_client_s->otp_id_obj_path);
- if (error_code != BLUETOOTH_ERROR_NONE)
- BT_INFO("Read Charc Value Failed %s(0x%08x)",
- _bt_convert_error_to_string(error_code), error_code);
+ if (otp_client_s->curr_op == BT_OTP_OBJECT_DISCOVERY) {
+ metadata->last_modified = mktime(&tm);
+ if (otp_client_s->multiple_obj_supp) {
+ /* None of the optional characteristics supported, so finish object discovery */
+ metadata->id = 0x256;
+ otp_client_s->object_id = metadata->id;
+ otp_client_s->object_list = g_slist_append(otp_client_s->object_list, metadata);
+ _bt_otp_send_discovery_callback(BLUETOOTH_ERROR_NONE, otp_client_s);
+ __bt_otp_reset_api_info(otp_client_s);
+ } else {
+ if (otp_client_s->otp_id_obj_path) {
+ error_code = bluetooth_otp_read_characteristic_value(otp_client_s->otp_id_obj_path);
+ if (error_code != BLUETOOTH_ERROR_NONE) {
+ BT_INFO("Read Charc Value Failed %s(0x%08x)",
+ _bt_convert_error_to_string(error_code), error_code);
+ goto read_fail;
+ }
+ }
}
}
} else if (!g_strcmp0(otp_client_s->otp_id_obj_path, char_path)) {
+ uint64_t id;
+ id = (uint64_t)(value[5] & 0xFF) << 48 |
+ (uint64_t)(value[4] & 0xFF) << 32 |
+ (uint64_t)(value[3] & 0xFF) << 24 |
+ (uint64_t)(value[2] & 0xFF) << 16 |
+ (uint64_t)(value[1] & 0xFF) << 8 |
+ (uint64_t)(value[0] & 0xFF);
+ BT_INFO("Object ID [%llu]", id);
+ /* TODO: Remove the previous stored object list */
+ if (otp_client_s->curr_op == BT_OTP_OBJECT_DISCOVERY) {
+ metadata->id = id;
+ otp_client_s->object_id = metadata->id;
+ otp_client_s->object_list = g_slist_append(otp_client_s->object_list, metadata);
- if (result != BLUETOOTH_ERROR_NONE) {
- return;
+ uint8_t value[7] = {0x00};
+ value[0] = OLCP_NEXT;
+ error_code = bluetooth_otp_write_characteristics_value(otp_client_s->otp_olcp_control_point, value, 1);
+ if (error_code != BT_ERROR_NONE) {
+ BT_ERR("Failed to write control point : %s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+ goto read_fail;
+ }
}
- metadata->id = (uint64_t)(value[5] & 0xFF) << 48 |
- (uint64_t)(value[4] & 0xFF) << 32 |
- (uint64_t)(value[3] & 0xFF) << 24 |
- (uint64_t)(value[2] & 0xFF) << 16 |
- (uint64_t)(value[1] & 0xFF) << 8 |
- (uint64_t)(value[0] & 0xFF);
- BT_INFO("Object ID [%llu]", metadata->id);
- /* Current Selected Object ID */
- otp_client_s->object_id = metadata->id;
- /* TODO: Remove the previous stored object list */
- otp_client_s->object_list = g_slist_append(otp_client_s->object_list, metadata);
-
- uint8_t value[7] = {0x00};
- value[0] = OLCP_NEXT;
- error_code = bluetooth_otp_write_characteristics_value(otp_client_s->otp_olcp_control_point, value, 1);
- if (error_code != BT_ERROR_NONE) {
- BT_ERR("Failed to write control point : %s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
- otp_client_s->object_discovery = FALSE;
+ }
+read_fail:
+ if (otp_client_s->curr_op == BT_OTP_OBJECT_DISCOVERY) {
+ if (result != BLUETOOTH_ERROR_NONE) {
+ _bt_otp_send_discovery_callback(result, otp_client_s);
+ __bt_otp_reset_api_info(otp_client_s);
+ } else if (error_code != BLUETOOTH_ERROR_NONE) {
+ _bt_otp_send_discovery_callback(error_code, otp_client_s);
+ __bt_otp_reset_api_info(otp_client_s);
}
}
}
@@ -1043,14 +1063,14 @@ void _bt_otp_client_write_value_response(int result, char *handle)
if (result != BLUETOOTH_ERROR_NONE) {
BT_DBG("OTP Write Failed");
- if (otp_client_s->object_discovery) {
+ if (otp_client_s->curr_op == BT_OTP_OBJECT_DISCOVERY) {
_bt_otp_send_discovery_callback(result, otp_client_s);
- otp_client_s->object_discovery = FALSE;
+ __bt_otp_reset_api_info(otp_client_s);
}
- if (otp_client_s->oacp_read_status) {
+ if (otp_client_s->curr_op == BT_OTP_OBJECT_READ) {
_bt_otp_client_notify_read_object_status(result,
NULL, otp_client_s);
- otp_client_s->oacp_read_status = FALSE;
+ __bt_otp_reset_api_info(otp_client_s);
}
}
}
@@ -1152,9 +1172,9 @@ void _bt_otp_client_indication(int result, bluetooth_otp_resp_info_t *info)
}
return;
oacp_fail:
- if (otp_client_s->oacp_read_status) {
+ if (otp_client_s->curr_op == BT_OTP_OBJECT_READ) {
_bt_otp_client_notify_read_object_status(result, NULL, otp_client_s);
- otp_client_s->oacp_read_status = FALSE;
+ __bt_otp_reset_api_info(otp_client_s);
}
} else if (!g_strcmp0(otp_client_s->otp_olcp_control_point, info->handle)) {
uint8_t resp_code = info->data[0];
@@ -1226,13 +1246,20 @@ oacp_fail:
}
return;
olcp_fail:
- if (otp_client_s->object_discovery) {
+ if (otp_client_s->curr_op == BT_OTP_OBJECT_DISCOVERY) {
_bt_otp_send_discovery_callback(result, otp_client_s);
- otp_client_s->object_discovery = FALSE;
+ __bt_otp_reset_api_info(otp_client_s);
}
}
}
+void __bt_otp_reset_api_info(bt_otp_client_s *otp_client_s)
+{
+ otp_client_s->curr_op = BT_OTP_NO_OPERATION;
+ otp_client_s->callback = NULL;
+ otp_client_s->user_data = NULL;
+}
+
int bt_otp_client_discover_all_objects(bt_otp_client_h otp_client,
bt_otp_client_object_discovery_cb callback, void *user_data)
{
@@ -1252,11 +1279,16 @@ int bt_otp_client_discover_all_objects(bt_otp_client_h otp_client,
return BT_ERROR_OPERATION_FAILED;
}
+ if (otp_client_s->curr_op != BT_OTP_NO_OPERATION) {
+ BT_DBG("OTP client is busy");
+ return BT_ERROR_OPERATION_FAILED;
+ }
+
BT_DBG("OTP client Discover objects from Remote device [%s]", otp_client_s->remote_address);
- otp_client_s->object_discovery_complete_cb = callback;
- otp_client_s->discovery_user_data = user_data;
+ otp_client_s->curr_op = BT_OTP_OBJECT_DISCOVERY;
+ otp_client_s->callback = callback;
+ otp_client_s->user_data = user_data;
- otp_client_s->object_discovery = TRUE;
if (!otp_client_s->otp_olcp_control_point) {
/* Remote server supports only single object */
otp_client_s->multiple_obj_supp = TRUE;
@@ -1265,7 +1297,8 @@ int bt_otp_client_discover_all_objects(bt_otp_client_h otp_client,
if (error_code != BLUETOOTH_ERROR_NONE) {
BT_INFO("Read Charc Value Failed %s(0x%08x)",
_bt_convert_error_to_string(error_code), error_code);
- otp_client_s->object_discovery = FALSE;
+ error_code = BT_ERROR_OPERATION_FAILED;
+ __bt_otp_reset_api_info(otp_client_s);
}
} else {
/* Remote server supports multiple objects.
@@ -1276,12 +1309,11 @@ int bt_otp_client_discover_all_objects(bt_otp_client_h otp_client,
error_code = bluetooth_otp_write_characteristics_value(otp_client_s->otp_olcp_control_point, value, 1);
if (error_code != BT_ERROR_NONE) {
BT_ERR("Failed to write control point : %s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
- otp_client_s->object_discovery = FALSE;
- goto fail;
+ error_code = BT_ERROR_OPERATION_FAILED;
+ __bt_otp_reset_api_info(otp_client_s);
}
}
-fail:
return error_code;
}
@@ -1353,7 +1385,7 @@ static gboolean __client_data_received_cb(GIOChannel *chan, GIOCondition cond,
if (!oacp_read_op) {
char file_path[BT_FILE_PATH_MAX_LEN] = {0, };
bt_otp_client_s *otp_client_s = NULL;
- object_metadata *object_info;
+ object_metadata *object_info = NULL;
uint64_t obj_id;
FILE *fp = NULL;
@@ -1405,9 +1437,9 @@ static void _bt_otp_client_notify_read_object_status(int result,
char *file_path, bt_otp_client_s *otp_client_s)
{
- ((bt_otp_client_read_object_complete_cb)otp_client_s->object_read_complete_cb)(
+ ((bt_otp_client_read_object_complete_cb)otp_client_s->callback)(
result, otp_client_s->remote_address,
- file_path, otp_client_s->read_object_user_data);
+ file_path, otp_client_s->user_data);
}
void _bt_otc_connection_state_changed(int result, bluetooth_otc_info_t *otc_info)
@@ -1455,10 +1487,10 @@ void _bt_otc_connection_state_changed(int result, bluetooth_otc_info_t *otc_info
bt_otp_client_s *otp_client_s = NULL;
otp_client_s = _bt_otp_client_find(otc_info->address);
- if (otp_client_s->oacp_read_status) {
+ if (otp_client_s && (otp_client_s->curr_op == BT_OTP_OBJECT_READ)) {
_bt_otp_client_notify_read_object_status(BLUETOOTH_ERROR_NONE,
file_path, otp_client_s);
- otp_client_s->oacp_read_status = FALSE;
+ __bt_otp_reset_api_info(otp_client_s);
}
}
}
@@ -1518,14 +1550,19 @@ int bt_otp_client_read_object_contents(bt_otp_client_h otp_client,
return BT_ERROR_OPERATION_FAILED;
}
- otp_client_s->object_read_complete_cb = callback;
- otp_client_s->read_object_user_data = user_data;
- otp_client_s->oacp_read_status = TRUE;
+ if (otp_client_s->curr_op != BT_OTP_NO_OPERATION) {
+ BT_DBG("OTP Client is busy");
+ return BT_ERROR_OPERATION_FAILED;
+ }
+
+ otp_client_s->callback = callback;
+ otp_client_s->user_data = user_data;
+ otp_client_s->curr_op = BT_OTP_OBJECT_READ;
uint32_t offset = 0;
uint32_t length = object_info->curr_size;
- BT_INFO("Object ID [%llu],Offset [%lu], Length [%lu], curr_soze [%lu]",
+ BT_INFO("Object ID [%llu],Offset [%lu], Length [%lu], curr_size [%lu]",
obj_id, offset, length, object_info->curr_size);
uint8_t value[9] = {0x00};
@@ -1544,7 +1581,7 @@ int bt_otp_client_read_object_contents(bt_otp_client_h otp_client,
if (error_code != BT_ERROR_NONE) {
BT_ERR("Failed to write control point : %s(0x%08x)",
_bt_convert_error_to_string(error_code), error_code);
- otp_client_s->oacp_read_status = FALSE;
+ __bt_otp_reset_api_info(otp_client_s);
}
return error_code;