diff --git a/mesh/gatt.c b/mesh/gatt.c
index 197291e..9116a9d 100644
--- a/mesh/gatt.c
+++ b/mesh/gatt.c
free(data);
}
-static void write_setup(DBusMessageIter *iter, void *user_data)
-{
- struct write_data *data = user_data;
- struct iovec *iov = &data->iov;
- DBusMessageIter array, dict;
-
- dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, "y", &array);
- dbus_message_iter_append_fixed_array(&array, DBUS_TYPE_BYTE,
- &iov->iov_base, iov->iov_len);
- dbus_message_iter_close_container(iter, &array);
-
- dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
- DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
- DBUS_TYPE_STRING_AS_STRING
- DBUS_TYPE_VARIANT_AS_STRING
- DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
- &dict);
-
- dbus_message_iter_close_container(iter, &dict);
-}
-
uint16_t mesh_gatt_sar(uint8_t **pkt, uint16_t size)
{
const uint8_t *data = *pkt;
struct write_data *data = user_data;
struct iovec iov[2];
uint8_t sar;
- uint8_t max_len = write_mtu - 4;
+ uint8_t max_len;
if (data == NULL)
return true;
+ max_len = write_mtu ? write_mtu - 3 - 1 : GATT_MTU - 3 - 1;
print_byte_array("GATT-TX:\t", data->gatt_data, data->gatt_len);
sar = data->gatt_data[0];
data->iov.iov_base = data->gatt_data + 1;
data->iov.iov_len--;
+ sar = data->gatt_data[0] & GATT_TYPE_MASK;
+ data->gatt_len--;
+
+ if (data->gatt_len > max_len) {
+ sar |= GATT_SAR_FIRST;
+ data->iov.iov_len = max_len;
+ }
+
iov[0].iov_base = &sar;
iov[0].iov_len = sizeof(sar);
}
}
-static void write_reply(DBusMessage *message, void *user_data)
-{
- struct write_data *data = user_data;
- struct write_data *tmp;
- uint8_t *dptr = data->gatt_data;
- uint8_t max_len = GATT_MTU - 3;
- uint8_t max_seg = GATT_MTU - 4;
- DBusError error;
-
- dbus_error_init(&error);
-
- if (dbus_set_error_from_message(&error, message) == TRUE) {
- bt_shell_printf("Failed to write: %s\n", error.name);
- dbus_error_free(&error);
- return;
- }
-
- if (data == NULL)
- return;
-
- switch (data->gatt_data[0] & GATT_SAR_MASK) {
- case GATT_SAR_FIRST:
- case GATT_SAR_CONTINUE:
- tmp = g_new0(struct write_data, 1);
- if (!data)
- return;
-
- *tmp = *data;
- tmp->gatt_data = g_malloc(data->gatt_len);
-
- if (!tmp->gatt_data) {
- g_free(tmp);
- return;
- }
-
- tmp->gatt_data[0] = dptr[0];
- data = tmp;
- memcpy(data->gatt_data + 1, dptr + max_len,
- data->gatt_len - max_seg);
- data->gatt_len -= max_seg;
- data->gatt_data[0] &= GATT_TYPE_MASK;
- data->iov.iov_base = data->gatt_data;
- if (max_len < data->gatt_len) {
- data->iov.iov_len = max_len;
- data->gatt_data[0] |= GATT_SAR_CONTINUE;
- } else {
- data->iov.iov_len = data->gatt_len;
- data->gatt_data[0] |= GATT_SAR_LAST;
- }
-
- break;
-
- default:
- if(data->cb)
- data->cb(message, data->user_data);
- return;
- }
-
- if (g_dbus_proxy_method_call(data->proxy, "WriteValue", write_setup,
- write_reply, data, write_data_free) == FALSE) {
- bt_shell_printf("Failed to write\n");
- write_data_free(data);
- return;
- }
-
-}
-
static void write_io_destroy(void)
{
io_destroy(write_io);
if (dbus_set_error_from_message(&error, message) == TRUE) {
dbus_error_free(&error);
- if (g_dbus_proxy_method_call(data->proxy, "WriteValue",
- write_setup, write_reply, data,
- write_data_free) == FALSE) {
- bt_shell_printf("Failed to write\n");
- write_data_free(data);
- }
+ bt_shell_printf("Failed to write\n");
+ write_data_free(data);
return;
}
GDBusReturnFunction cb, void *user_data)
{
struct write_data *data;
- DBusMessageIter iter;
- uint8_t max_len;
if (!buf || !len)
return false;
if (!data)
return false;
- max_len = write_mtu ? write_mtu - 3 : GATT_MTU - 3;
-
/* TODO: should keep in queue in case we need to cancel write? */
data->gatt_len = len;
data->gatt_data = g_memdup(buf, len);
data->gatt_data[0] &= GATT_TYPE_MASK;
- if (max_len < len) {
- len = max_len;
- data->gatt_data[0] |= GATT_SAR_FIRST;
- }
data->iov.iov_base = data->gatt_data;
data->iov.iov_len = len;
data->proxy = proxy;
if (write_io)
return pipe_write(write_io, data);
- if (g_dbus_proxy_get_property(proxy, "WriteAcquired", &iter)) {
- if (g_dbus_proxy_method_call(proxy, "AcquireWrite",
- acquire_setup, acquire_write_reply,
- data, NULL) == FALSE) {
- bt_shell_printf("Failed to AcquireWrite\n");
- write_data_free(data);
- return false;
- }
- } else {
- if (g_dbus_proxy_method_call(data->proxy, "WriteValue",
- write_setup, write_reply, data,
- write_data_free) == FALSE) {
- bt_shell_printf("Failed to write\n");
- write_data_free(data);
- return false;
- }
- print_byte_array("GATT-TX: ", buf, len);
- bt_shell_printf("Attempting to write %s\n",
- g_dbus_proxy_get_path(proxy));
+ if (g_dbus_proxy_method_call(proxy, "AcquireWrite",
+ acquire_setup, acquire_write_reply,
+ data, NULL) == FALSE) {
+ bt_shell_printf("Failed to AcquireWrite\n");
+ write_data_free(data);
+ return false;
}
-
return true;
}