diff --git a/android/hog.c b/android/hog.c
index 0e0eafe..66b117d 100644
--- a/android/hog.c
+++ b/android/hog.c
void *user_data;
};
+static struct gatt_request *create_request(struct bt_hog *hog,
+ void *user_data)
+{
+ struct gatt_request *req;
+
+ req = new0(struct gatt_request, 1);
+ if (!req)
+ return NULL;
+
+ req->user_data = user_data;
+ req->hog = bt_hog_ref(hog);
+
+ return req;
+}
+
+static bool set_and_store_gatt_req(struct bt_hog *hog,
+ struct gatt_request *req,
+ unsigned int id)
+{
+ req->id = id;
+ return queue_push_head(hog->gatt_op, req);
+}
+
static void destroy_gatt_req(struct gatt_request *req)
{
queue_remove(req->hog->gatt_op, req);
free(req);
}
+static void discover_primary(struct bt_hog *hog, GAttrib *attrib,
+ bt_uuid_t *uuid, gatt_cb_t func,
+ gpointer user_data)
+{
+ struct gatt_request *req;
+ unsigned int id;
+
+ req = create_request(hog, user_data);
+ if (!req)
+ return;
+
+ id = gatt_discover_primary(attrib, uuid, func, req);
+
+ if (set_and_store_gatt_req(hog, req, id))
+ return;
+
+ error("hog: Could not send discover primary");
+ g_attrib_cancel(attrib, id);
+ free(req);
+}
+
+static void find_included(struct bt_hog *hog, GAttrib *attrib,
+ uint16_t start, uint16_t end,
+ gatt_cb_t func, gpointer user_data)
+{
+ struct gatt_request *req;
+ unsigned int id;
+
+ req = create_request(hog, user_data);
+ if (!req)
+ return;
+
+ id = gatt_find_included(attrib, start, end, func, req);
+
+ if (set_and_store_gatt_req(hog, req, id))
+ return;
+
+ error("Could not find included");
+ g_attrib_cancel(attrib, id);
+ free(req);
+}
+
static void report_value_cb(const guint8 *pdu, guint16 len, gpointer user_data)
{
struct report *report = user_data;
static void find_included_cb(uint8_t status, GSList *services, void *user_data)
{
- struct bt_hog *hog = user_data;
+ struct gatt_request *req = user_data;
+ struct bt_hog *hog = req->user_data;
struct gatt_included *include;
GSList *l;
DBG("");
+ destroy_gatt_req(req);
+
if (hog->primary)
return;
for (l = services; l; l = l->next) {
include = l->data;
- gatt_find_included(hog->attrib, include->range.start,
- include->range.end, find_included_cb, hog);
+ find_included(hog, hog->attrib,
+ include->range.start,
+ include->range.end, find_included_cb,
+ hog);
}
return;
}
static void primary_cb(uint8_t status, GSList *services, void *user_data)
{
- struct bt_hog *hog = user_data;
+ struct gatt_request *req = user_data;
+ struct bt_hog *hog = req->user_data;
struct gatt_primary *primary;
GSList *l;
DBG("");
+ destroy_gatt_req(req);
+
if (status) {
const char *str = att_ecode2str(status);
DBG("Discover primary failed: %s", str);
for (l = services; l; l = l->next) {
primary = l->data;
- gatt_find_included(hog->attrib, primary->range.start,
- primary->range.end, find_included_cb,
- hog);
+ find_included(hog, hog->attrib, primary->range.start,
+ primary->range.end, find_included_cb, hog);
}
}
hog->attrib = g_attrib_ref(gatt);
if (!primary) {
- gatt_discover_primary(hog->attrib, NULL, primary_cb, hog);
+ discover_primary(hog, hog->attrib, NULL, primary_cb, hog);
return true;
}