client: Add support for optional gatt write offset parameter
This patch extends missing optional gatt write offset parameter.
diff --git a/client/gatt.c b/client/gatt.c
index 1766651..d59d1ba 100644
--- a/client/gatt.c
+++ b/client/gatt.c
@@ -579,14 +579,20 @@
return bt_shell_noninteractive_quit(EXIT_SUCCESS);
}
+struct write_attribute_data {
+ struct iovec *iov;
+ uint16_t offset;
+};
+
static void write_setup(DBusMessageIter *iter, void *user_data)
{
- struct iovec *iov = user_data;
+ struct write_attribute_data *wd = user_data;
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);
+ &wd->iov->iov_base,
+ wd->iov->iov_len);
dbus_message_iter_close_container(iter, &array);
dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
@@ -595,18 +601,22 @@
DBUS_TYPE_VARIANT_AS_STRING
DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
&dict);
- /* TODO: Add offset support */
+
+ g_dbus_dict_append_entry(&dict, "offset", DBUS_TYPE_UINT16,
+ &wd->offset);
+
dbus_message_iter_close_container(iter, &dict);
}
-static void write_attribute(GDBusProxy *proxy, char *arg)
+static void write_attribute(GDBusProxy *proxy, char *val_str, uint16_t offset)
{
struct iovec iov;
+ struct write_attribute_data wd;
uint8_t value[512];
char *entry;
unsigned int i;
- for (i = 0; (entry = strsep(&arg, " \t")) != NULL; i++) {
+ for (i = 0; (entry = strsep(&val_str, " \t")) != NULL; i++) {
long int val;
char *endptr = NULL;
@@ -641,8 +651,11 @@
return;
}
+ wd.iov = &iov;
+ wd.offset = offset;
+
if (g_dbus_proxy_method_call(proxy, "WriteValue", write_setup,
- write_reply, &iov, NULL) == FALSE) {
+ write_reply, &wd, NULL) == FALSE) {
bt_shell_printf("Failed to write\n");
return bt_shell_noninteractive_quit(EXIT_FAILURE);
}
@@ -651,14 +664,19 @@
g_dbus_proxy_get_path(proxy));
}
-void gatt_write_attribute(GDBusProxy *proxy, const char *arg)
+void gatt_write_attribute(GDBusProxy *proxy, int argc, char *argv[])
{
const char *iface;
+ uint16_t offset = 0;
iface = g_dbus_proxy_get_interface(proxy);
if (!strcmp(iface, "org.bluez.GattCharacteristic1") ||
!strcmp(iface, "org.bluez.GattDescriptor1")) {
- write_attribute(proxy, (char *) arg);
+
+ if (argc > 2)
+ offset = atoi(argv[2]);
+
+ write_attribute(proxy, argv[1], offset);
return;
}
diff --git a/client/gatt.h b/client/gatt.h
index 274c76b..957ae80 100644
--- a/client/gatt.h
+++ b/client/gatt.h
@@ -35,7 +35,7 @@
char *gatt_attribute_generator(const char *text, int state);
void gatt_read_attribute(GDBusProxy *proxy, int argc, char *argv[]);
-void gatt_write_attribute(GDBusProxy *proxy, const char *arg);
+void gatt_write_attribute(GDBusProxy *proxy, int argc, char *argv[]);
void gatt_notify_attribute(GDBusProxy *proxy, bool enable);
void gatt_acquire_write(GDBusProxy *proxy, const char *arg);
diff --git a/client/main.c b/client/main.c
index 57a85f1..dd85a1c 100644
--- a/client/main.c
+++ b/client/main.c
@@ -1918,7 +1918,7 @@
return bt_shell_noninteractive_quit(EXIT_FAILURE);
}
- gatt_write_attribute(default_attr, argv[1]);
+ gatt_write_attribute(default_attr, argc, argv);
}
static void cmd_acquire_write(int argc, char *argv[])
@@ -2416,7 +2416,7 @@
{ "attribute-info", "[attribute/UUID]", cmd_attribute_info,
"Select attribute", attribute_generator },
{ "read", "[offset]", cmd_read, "Read attribute value" },
- { "write", "<data=xx xx ...>", cmd_write,
+ { "write", "<data=xx xx ...> [offset]", cmd_write,
"Write attribute value" },
{ "acquire-write", NULL, cmd_acquire_write,
"Acquire Write file descriptor" },