eapp->proxies = g_slist_remove(eapp->proxies, proxy);
}
+static void proxy_read_cb(struct btd_attribute *attr,
+ btd_attr_read_result_t result, void *user_data)
+{
+ DBusMessageIter iter, array;
+ GDBusProxy *proxy;
+ uint8_t *value;
+ int len;
+
+ /*
+ * Remote device is trying to read the informed attribute,
+ * "Value" should be read from the proxy. GDBusProxy tracks
+ * properties changes automatically, it is not necessary to
+ * get the value directly from the GATT server.
+ */
+ proxy = g_hash_table_lookup(proxy_hash, attr);
+ if (!proxy) {
+ result(-ENOENT, NULL, 0, user_data);
+ return;
+ }
+
+ if (!g_dbus_proxy_get_property(proxy, "Value", &iter)) {
+ /* Unusual situation, read property will checked earlier */
+ result(-EPERM, NULL, 0, user_data);
+ return;
+ }
+
+ if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) {
+ DBG("External service inconsistent!");
+ result(-EPERM, NULL, 0, user_data);
+ return;
+ }
+
+ dbus_message_iter_recurse(&iter, &array);
+ dbus_message_iter_get_fixed_array(&array, &value, &len);
+
+ DBG("attribute: %p read %d bytes", attr, len);
+
+ result(0, value, len, user_data);
+}
+
static int register_external_service(const struct external_app *eapp,
GDBusProxy *proxy)
{
* Reference table 3.5: Characteristic Properties bit field.
*/
- attr = btd_gatt_add_char(&uuid, 0x00, NULL);
+ attr = btd_gatt_add_char(&uuid, 0x00, proxy_read_cb);
if (attr == NULL)
return -EINVAL;