guint gatt_write_char(GAttrib *attrib, uint16_t handle, uint8_t *value, int vlen, GAttribResultFunc func, gpointer user_data) { uint8_t *buf; int buflen; guint16 plen; buf = g_attrib_get_buffer(attrib, &buflen); if (func) plen = enc_write_req(handle, value, vlen, buf, buflen); else plen = enc_write_cmd(handle, value, vlen, buf, buflen); return g_attrib_send(attrib, 0, buf[0], buf, plen, func, user_data, NULL); }
guint gatt_write_char(GAttrib *attrib, uint16_t handle, uint8_t *value, size_t vlen, GAttribResultFunc func, gpointer user_data) { uint8_t *buf; size_t buflen; guint16 plen; struct write_long_data *long_write; buf = g_attrib_get_buffer(attrib, &buflen); /* Only use Write Request/Command if payload fits on a single transfer, * including 3 bytes for the header. */ if (vlen <= buflen - 3) { if (func) plen = enc_write_req(handle, value, vlen, buf, buflen); else plen = enc_write_cmd(handle, value, vlen, buf, buflen); return g_attrib_send(attrib, 0, buf, plen, func, user_data, NULL); } /* Write Long Characteristic Values */ long_write = g_try_new0(struct write_long_data, 1); if (long_write == NULL) return 0; long_write->attrib = attrib; long_write->func = func; long_write->user_data = user_data; long_write->handle = handle; long_write->value = g_memdup(value, vlen); long_write->vlen = vlen; return prepare_write(attrib, handle, long_write->offset, value, vlen, func, long_write); }