OSDN Git Service

gatt: Add read callback to btd_gatt_add_char helper
authorClaudio Takahasi <claudio.takahasi@openbossa.org>
Tue, 18 Mar 2014 20:26:21 +0000 (17:26 -0300)
committerJohan Hedberg <johan.hedberg@intel.com>
Thu, 20 Mar 2014 17:35:06 +0000 (19:35 +0200)
This patch adds a function callback for read operations. When a remote
device wants to reads a given attribute, the core calls the specified
read callback to get the value from the external services.

src/gatt-dbus.c
src/gatt.c
src/gatt.h

index f60260e..275b263 100644 (file)
@@ -198,7 +198,7 @@ static int register_external_characteristics(GSList *proxies)
                 * Reference table 3.5: Characteristic Properties bit field.
                 */
 
-               attr = btd_gatt_add_char(&uuid, 0x00);
+               attr = btd_gatt_add_char(&uuid, 0x00, NULL);
                if (attr == NULL)
                        return -EINVAL;
 
index 34f9eea..76bbe20 100644 (file)
@@ -45,6 +45,7 @@ static const bt_uuid_t chr_uuid = { .type = BT_UUID16,
 struct btd_attribute {
        uint16_t handle;
        bt_uuid_t type;
+       btd_attr_read_t read_cb;
        uint16_t value_len;
        uint8_t value[0];
 };
@@ -131,7 +132,8 @@ struct btd_attribute *btd_gatt_add_service(const bt_uuid_t *uuid)
 }
 
 struct btd_attribute *btd_gatt_add_char(const bt_uuid_t *uuid,
-                                                       uint8_t properties)
+                                               uint8_t properties,
+                                               btd_attr_read_t read_cb)
 {
        struct btd_attribute *char_decl, *char_value = NULL;
 
@@ -189,8 +191,9 @@ struct btd_attribute *btd_gatt_add_char(const bt_uuid_t *uuid,
         */
 
        char_value->type = *uuid;
+       char_value->read_cb = read_cb;
 
-       /* TODO: Read & Write callbacks */
+       /* TODO: Write callbacks */
 
        if (local_database_add(next_handle, char_value) < 0)
                /* TODO: remove declaration */
index d7acc5b..e446fa0 100644 (file)
@@ -27,6 +27,22 @@ void gatt_init(void);
 
 void gatt_cleanup(void);
 
+/*
+ * Callbacks of this type are called once the value from the attribute is
+ * ready to be read from the service implementation. Result callback is
+ * the asynchronous function that should be used to inform the caller
+ * the read value.
+ * @err:       error in errno format.
+ * @value:     pointer to value
+ * @len:       length of value
+ * @user_data: user_data passed in btd_attr_read_t callback
+ */
+typedef void (*btd_attr_read_result_t) (int err, uint8_t *value, size_t len,
+                                                       void *user_data);
+typedef void (*btd_attr_read_t) (struct btd_attribute *attr,
+                                               btd_attr_read_result_t result,
+                                               void *user_data);
+
 /* btd_gatt_add_service - Add a service declaration to local attribute database.
  * @uuid:      Service UUID.
  *
@@ -40,9 +56,11 @@ struct btd_attribute *btd_gatt_add_service(const bt_uuid_t *uuid);
  * to local attribute database.
  * @uuid:      Characteristic UUID (16-bits or 128-bits).
  * @properties:        Characteristic properties. See Core SPEC 4.1 page 2183.
+ * @read_cb:   Callback used to provide the characteristic value.
  *
  * Returns a reference to characteristic value attribute. In case of error,
  * NULL is returned.
  */
 struct btd_attribute *btd_gatt_add_char(const bt_uuid_t *uuid,
-                                                       uint8_t properties);
+                                               uint8_t properties,
+                                               btd_attr_read_t read_cb);