diff --git a/src/shared/gatt-client.c b/src/shared/gatt-client.c
index 292e6ec..b255175 100644
--- a/src/shared/gatt-client.c
+++ b/src/shared/gatt-client.c
bool success;
uint16_t start;
uint16_t end;
+ uint16_t last;
int ref_count;
discovery_op_complete_func_t complete_func;
discovery_op_fail_func_t failure_func;
free(op);
}
+static void discovery_op_complete(struct discovery_op *op, bool success,
+ uint8_t err)
+{
+ /* Reset remaining range */
+ if (success) {
+ if (op->last != UINT16_MAX)
+ gatt_db_clear_range(op->client->db, op->last + 1,
+ UINT16_MAX);
+ } else
+ gatt_db_clear(op->client->db);
+
+ op->success = success;
+ op->complete_func(op, success, err);
+}
+
static struct discovery_op *discovery_op_create(struct bt_gatt_client *client,
uint16_t start, uint16_t end,
discovery_op_complete_func_t complete_func,
discovery_op_unref(op);
failed:
- op->success = false;
- op->complete_func(op, false, att_ecode);
+ discovery_op_complete(op, false, att_ecode);
}
struct chrc {
success = false;
done:
- op->success = success;
- op->complete_func(op, success, att_ecode);
+ discovery_op_complete(op, success, att_ecode);
}
static void discover_chrcs_cb(bool success, uint8_t att_ecode,
success = false;
done:
- op->success = success;
- op->complete_func(op, success, att_ecode);
+ discovery_op_complete(op, success, att_ecode);
}
static void discover_secondary_cb(bool success, uint8_t att_ecode,
/* Skip if service already active */
if (!gatt_db_service_get_active(attr))
queue_push_tail(op->pending_svcs, attr);
+
+ /* Update last handle */
+ if (end > op->last)
+ op->last = end;
}
next:
discovery_op_unref(op);
done:
- op->success = success;
- op->complete_func(op, success, att_ecode);
+ discovery_op_complete(op, success, att_ecode);
}
static void discover_primary_cb(bool success, uint8_t att_ecode,
/* Skip if service already active */
if (!gatt_db_service_get_active(attr))
queue_push_tail(op->pending_svcs, attr);
+
+ /* Update last handle */
+ if (end > op->last)
+ op->last = end;
}
secondary:
success = false;
done:
- op->success = success;
- op->complete_func(op, success, att_ecode);
+ discovery_op_complete(op, success, att_ecode);
}
static void notify_client_ready(struct bt_gatt_client *client, bool success,