diff --git a/android/gatt.c b/android/gatt.c
index 8b0833c..c1bd54d 100644
--- a/android/gatt.c
+++ b/android/gatt.c
HAL_OP_GATT_CLIENT_UNREGISTER, status);
}
-static void primary_cb(uint8_t status, GSList *services, void *user_data)
+static void send_client_primary_notify(void *data, void *user_data)
+{
+ struct hal_ev_gatt_client_search_result ev;
+ struct service *p = data;
+ int32_t conn_id = PTR_TO_INT(user_data);
+
+ /* In service queue we will have also included services */
+ if (!p->primary)
+ return;
+
+ ev.conn_id = conn_id;
+ element_id_to_hal_srvc_id(&p->id, 1, &ev.srvc_id);
+
+ uuid2android(&p->id.uuid, ev.srvc_id.uuid);
+
+ ipc_send_notif(hal_ipc, HAL_SERVICE_ID_GATT,
+ HAL_EV_GATT_CLIENT_SEARCH_RESULT,
+ sizeof(ev), &ev);
+}
+
+static void send_client_all_primary(int32_t status, struct queue *services,
+ int32_t conn_id)
{
struct hal_ev_gatt_client_search_complete ev;
+
+ if (!status)
+ queue_foreach(services, send_client_primary_notify,
+ INT_TO_PTR(conn_id));
+
+ ev.status = status;
+ ev.conn_id = conn_id;
+ ipc_send_notif(hal_ipc, HAL_SERVICE_ID_GATT,
+ HAL_EV_GATT_CLIENT_SEARCH_COMPLETE, sizeof(ev), &ev);
+
+}
+
+static void primary_cb(uint8_t status, GSList *services, void *user_data)
+{
struct gatt_device *dev = user_data;
GSList *l;
+ int32_t gatt_status;
DBG("Status %d", status);
if (status) {
error("gatt: Discover all primary services failed: %s",
att_ecode2str(status));
- ev.status = GATT_FAILURE;
+ gatt_status = GATT_FAILURE;
goto done;
}
if (!services) {
info("gatt: No primary services found");
- ev.status = GATT_SUCCESS;
+ gatt_status = GATT_SUCCESS;
goto done;
}
for (l = services; l; l = l->next) {
- struct hal_ev_gatt_client_search_result ev_res;
struct gatt_primary *prim = l->data;
struct service *p;
continue;
}
- memset(&ev_res, 0, sizeof(ev_res));
-
if (bt_string_to_uuid(&p->id.uuid, prim->uuid) < 0) {
error("gatt: Cannot convert string to uuid");
continue;
}
DBG("attr handle = 0x%04x, end grp handle = 0x%04x uuid: %s",
- prim->range.start, prim->range.end, prim->uuid);
-
- /* Set event data */
- ev_res.conn_id = dev->conn_id;
- element_id_to_hal_srvc_id(&p->id, 1, &ev_res.srvc_id);
-
- ipc_send_notif(hal_ipc, HAL_SERVICE_ID_GATT ,
- HAL_EV_GATT_CLIENT_SEARCH_RESULT,
- sizeof(ev_res), &ev_res);
+ prim->range.start, prim->range.end, prim->uuid);
}
- ev.status = GATT_SUCCESS;
+ gatt_status = GATT_SUCCESS;
done:
- ev.conn_id = dev->conn_id;
- ipc_send_notif(hal_ipc, HAL_SERVICE_ID_GATT,
- HAL_EV_GATT_CLIENT_SEARCH_COMPLETE, sizeof(ev), &ev);
+ send_client_all_primary(gatt_status, dev->services, dev->conn_id);
}
static void connection_cleanup(struct gatt_device *device)