OSDN Git Service

gatt: Assign write callback for external services
authorClaudio Takahasi <claudio.takahasi@openbossa.org>
Mon, 24 Mar 2014 13:30:03 +0000 (10:30 -0300)
committerJohan Hedberg <johan.hedberg@intel.com>
Mon, 24 Mar 2014 13:37:05 +0000 (15:37 +0200)
This patch adds the callback for writing the external characteristic
value. Internally, GDBusProxy implementation calls Set method of the
"Value" property. At the moment, potential errors returned by the
external service implementation are being ignored.

The ATT operation (Write Command or Request) is not exposed to the
external service implementation. GATT/GDBusProxy handles possible
DBus errors returned, and notify the core using the callbacks informed.
Write Command doesn't have callback since it doesn't return ATT errors.

src/gatt-dbus.c

index ef137a8..cdb46c4 100644 (file)
@@ -179,6 +179,30 @@ static void proxy_read_cb(struct btd_attribute *attr,
        result(0, value, len, user_data);
 }
 
+static void proxy_write_reply(const DBusError *derr, void *user_data)
+{
+       if (derr)
+               DBG("Write reply: %s", derr->message);
+}
+
+static void proxy_write_cb(struct btd_attribute *attr,
+                                       const uint8_t *value, size_t len)
+{
+       GDBusProxy *proxy;
+
+       proxy = g_hash_table_lookup(proxy_hash, attr);
+       if (!proxy)
+               /* FIXME: Attribute not found */
+               return;
+
+       g_dbus_proxy_set_property_array(proxy, "Value", DBUS_TYPE_BYTE,
+                                               value, len, proxy_write_reply,
+                                               NULL, NULL);
+
+       DBG("Server: Write characteristic callback %s",
+                                       g_dbus_proxy_get_path(proxy));
+}
+
 static int register_external_service(const struct external_app *eapp,
                                                        GDBusProxy *proxy)
 {
@@ -238,7 +262,8 @@ static int register_external_characteristics(GSList *proxies)
                 * Reference table 3.5: Characteristic Properties bit field.
                 */
 
-               attr = btd_gatt_add_char(&uuid, 0x00, proxy_read_cb, NULL);
+               attr = btd_gatt_add_char(&uuid, 0x00, proxy_read_cb,
+                                                       proxy_write_cb);
                if (attr == NULL)
                        return -EINVAL;