From 2a535129fd38b12cfbe34e572cb97ec80823ae80 Mon Sep 17 00:00:00 2001 From: Lukasz Rymanowski Date: Wed, 30 Apr 2014 11:14:03 +0200 Subject: [PATCH] android/gatt: Add support for write requests This patch add support for write request, command, prepare write and execute write. --- android/gatt.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/android/gatt.c b/android/gatt.c index 3c8af4a01..54cb8a6da 100644 --- a/android/gatt.c +++ b/android/gatt.c @@ -3898,6 +3898,65 @@ static uint8_t find_info_handle(const uint8_t *cmd, uint16_t cmd_len, return 0; } +static uint8_t write_cmd_request(const uint8_t *cmd, uint16_t cmd_len, + struct gatt_device *dev) +{ + uint8_t value[ATT_DEFAULT_LE_MTU]; + uint16_t handle; + uint16_t len; + size_t vlen; + + len = dec_write_cmd(cmd, cmd_len, &handle, value, &vlen); + if (!len) + return ATT_ECODE_INVALID_PDU; + + if (!gatt_db_write(gatt_db, handle, 0, value, vlen, cmd[0], + &dev->bdaddr)) + return ATT_ECODE_UNLIKELY; + + return 0; +} + +static uint8_t write_req_request(const uint8_t *cmd, uint16_t cmd_len, + struct gatt_device *dev) +{ + uint8_t value[ATT_DEFAULT_LE_MTU]; + uint16_t handle; + uint16_t len; + size_t vlen; + + len = dec_write_req(cmd, cmd_len, &handle, value, &vlen); + if (!len) + return ATT_ECODE_INVALID_PDU; + + if (!gatt_db_write(gatt_db, handle, 0, value, vlen, cmd[0], + &dev->bdaddr)) + return ATT_ECODE_UNLIKELY; + + return 0; +} + +static uint8_t write_prep_request(const uint8_t *cmd, uint16_t cmd_len, + struct gatt_device *dev) +{ + uint8_t value[ATT_DEFAULT_LE_MTU]; + uint16_t handle; + uint16_t offset; + uint16_t len; + size_t vlen; + + len = dec_prep_write_req(cmd, cmd_len, &handle, &offset, + value, &vlen); + if (!len) + return ATT_ECODE_INVALID_PDU; + + if (!gatt_db_write(gatt_db, handle, offset, value, vlen, cmd[0], + &dev->bdaddr)) + return ATT_ECODE_UNLIKELY; + + return 0; +} + static void att_handler(const uint8_t *ipdu, uint16_t len, gpointer user_data) { struct gatt_device *dev = user_data; @@ -3939,14 +3998,27 @@ static void att_handler(const uint8_t *ipdu, uint16_t len, gpointer user_data) &length); break; case ATT_OP_WRITE_REQ: + status = write_req_request(ipdu, len, dev); + if (!status) + return; + break; case ATT_OP_WRITE_CMD: + status = write_cmd_request(ipdu, len, dev); + if (!status) + return; + break; + case ATT_OP_PREP_WRITE_REQ: + status = write_prep_request(ipdu, len, dev); + if (!status) + return; + break; + case ATT_OP_EXEC_WRITE_REQ: + /* TODO */ case ATT_OP_FIND_BY_TYPE_REQ: case ATT_OP_HANDLE_CNF: case ATT_OP_HANDLE_IND: case ATT_OP_HANDLE_NOTIFY: case ATT_OP_READ_MULTI_REQ: - case ATT_OP_PREP_WRITE_REQ: - case ATT_OP_EXEC_WRITE_REQ: default: DBG("Unsupported request 0x%02x", ipdu[0]); status = ATT_ECODE_REQ_NOT_SUPP; -- 2.47.3