GATT-Server: Enable Read/Write request Callbacks for Descriptor. 92/70992/3
authorh.sandeep <h.sandeep@samsung.com>
Mon, 23 May 2016 12:38:54 +0000 (18:08 +0530)
committerSandeep Hattiholi <h.sandeep@samsung.com>
Tue, 24 May 2016 09:26:53 +0000 (02:26 -0700)
Change-Id: I1162f64f10ca669ffc24a98e25d8b7851ff6e82c
Signed-off-by: h.sandeep <h.sandeep@samsung.com>
include/bluetooth_private.h
src/bluetooth-common.c
src/bluetooth-gatt.c
test/bt_unit_test.c

index 81cf98c6cc9199278811c0469d37efd67d745ac4..e064c2456e9933b872fb97ce6b6bd6553b75e390 100644 (file)
@@ -316,6 +316,12 @@ typedef struct {
 
        int permissions;
 
+       bt_gatt_server_value_changed_cb server_value_changed_cb;
+       void *server_value_changed_user_data;
+
+       bt_gatt_server_read_value_requested_cb read_requested_cb;
+       void *read_requested_user_data;
+
        int value_length;
        char *value;
 } bt_gatt_descriptor_s;
index ada528f615e74dcb24e5140f8f3f35b4825d46eb..43aa1e37f327d87ead9dd615a5d614873494560f 100644 (file)
@@ -486,12 +486,12 @@ static int __bt_get_bt_device_connection_info_s(bt_device_connection_info_s **de
 }
 
 static bt_gatt_server_read_value_requested_cb __bt_gatt_attribute_get_read_cb(
-                                       bt_gatt_h service, bt_gatt_h characteristic, void **user_data)
+                                       bt_gatt_h service, bt_gatt_h attribute, void **user_data)
 {
        gchar *svc_path = (gchar *)service;
-       gchar *chr_path = (gchar *)characteristic;
+       gchar *att_path = (gchar *)attribute;
        const GSList *gatt_server_list = NULL;
-       const GSList *l1, *l2, *l3;
+       const GSList *l1, *l2, *l3, *l4;
 
        gatt_server_list = _bt_gatt_get_server_list();
 
@@ -508,12 +508,26 @@ static bt_gatt_server_read_value_requested_cb __bt_gatt_attribute_get_read_cb(
                                for (l3 = svc->characteristics; l3 != NULL; l3 = l3->next) {
                                        bt_gatt_characteristic_s *chr = l3->data;
 
-                                       if (chr && g_strcmp0(chr->path, chr_path) == 0) {
-                                               if (chr->read_requested_cb) {
-                                                       *user_data = chr->read_requested_user_data;
-                                                       return chr->read_requested_cb;
-                                               } else
-                                                       return NULL;
+                                       if (chr) {
+                                               if (g_strcmp0(chr->path, att_path) == 0) {
+                                                       if (chr->read_requested_cb) {
+                                                               *user_data = chr->read_requested_user_data;
+                                                               return chr->read_requested_cb;
+                                                       } else
+                                                               return NULL;
+                                               } else {
+                                                       for (l4 = chr->descriptors; l4 != NULL; l4 = l4->next) {
+                                                               bt_gatt_descriptor_s *desc = l4->data;
+
+                                                               if (desc && g_strcmp0(desc->path, att_path) == 0) {
+                                                                       if (desc->read_requested_cb) {
+                                                                               *user_data = desc->read_requested_user_data;
+                                                                               return desc->read_requested_cb;
+                                                                       } else
+                                                                               return NULL;
+                                                               }
+                                                       }
+                                               }
                                        }
                                }
                        }
@@ -557,8 +571,11 @@ static bt_gatt_server_value_changed_cb __bt_gatt_attribute_get_value_change_cb(
                                                                bt_gatt_descriptor_s *desc = l4->data;
 
                                                                if (desc && g_strcmp0(desc->path, att_path) == 0) {
-                                                                       /* TODO: Call value changed callback registerd for the descriptor */
-                                                                       return NULL;
+                                                                       if (desc->read_requested_cb) {
+                                                                               *user_data = desc->server_value_changed_user_data;
+                                                                               return desc->server_value_changed_cb;
+                                                                       } else
+                                                                               return NULL;
                                                                }
                                                        }
                                                }
index fb6003ac4030928e6982ed603d0840ac43136414..e175aefe63a04e8b88bc6f5247b0b7fa91b17f8f 100644 (file)
@@ -2110,15 +2110,25 @@ int bt_gatt_server_set_read_value_requested_cb(bt_gatt_h gatt_handle,
                                bt_gatt_server_read_value_requested_cb callback,
                                void *user_data)
 {
+       bt_gatt_common_s *handle = (bt_gatt_common_s *)gatt_handle;
        bt_gatt_characteristic_s *chr = (bt_gatt_characteristic_s *)gatt_handle;
+       bt_gatt_descriptor_s *desc = (bt_gatt_descriptor_s*)gatt_handle;
 
        BT_CHECK_INIT_STATUS();
        BT_CHECK_GATT_SERVER_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(gatt_handle);
        BT_CHECK_INPUT_PARAMETER(callback);
 
-       chr->read_requested_cb = callback;
-       chr->read_requested_user_data = user_data;
+       if (handle->type == BT_GATT_TYPE_CHARACTERISTIC) {
+               chr->read_requested_cb = callback;
+               chr->read_requested_user_data = user_data;
+       } else if (handle->type == BT_GATT_TYPE_DESCRIPTOR) {
+               desc->read_requested_cb = callback;
+               desc->read_requested_user_data = user_data;
+       } else {
+               BT_ERR("Type is invalid(type:%d)", handle->type);
+               return BT_ERROR_INVALID_PARAMETER;
+       }
 
        _bt_set_cb(BT_EVENT_GATT_SERVER_READ_REQUESTED, callback, user_data);
 
@@ -2363,20 +2373,29 @@ int bt_gatt_server_notify(bt_gatt_h characteristic, bool need_confirm,
        return ret;
 }
 
-int bt_gatt_server_set_value_changed_cb(bt_gatt_h characteristic,
+int bt_gatt_server_set_value_changed_cb(bt_gatt_h gatt_handle,
                bt_gatt_server_value_changed_cb callback,
                void *user_data)
 {
-       bt_gatt_characteristic_s *chr = (bt_gatt_characteristic_s *)characteristic;
+       bt_gatt_common_s *handle = (bt_gatt_common_s *)gatt_handle;
+       bt_gatt_characteristic_s *chr = (bt_gatt_characteristic_s *)gatt_handle;
+       bt_gatt_descriptor_s *desc = (bt_gatt_descriptor_s*)gatt_handle;
 
        BT_CHECK_INIT_STATUS();
        BT_CHECK_GATT_SERVER_INIT_STATUS();
-
-       BT_CHECK_INPUT_PARAMETER(characteristic);
+       BT_CHECK_INPUT_PARAMETER(gatt_handle);
        BT_CHECK_INPUT_PARAMETER(callback);
 
-       chr->server_value_changed_cb = callback;
-       chr->server_value_changed_user_data = user_data;
+       if (handle->type == BT_GATT_TYPE_CHARACTERISTIC) {
+               chr->server_value_changed_cb = callback;
+               chr->server_value_changed_user_data = user_data;
+       } else if (handle->type == BT_GATT_TYPE_DESCRIPTOR) {
+               desc->server_value_changed_cb = callback;
+               desc->server_value_changed_user_data = user_data;
+       } else {
+               BT_ERR("Type is invalid(type:%d)", handle->type);
+               return BT_ERROR_INVALID_PARAMETER;
+       }
 
        return BT_ERROR_NONE;
 }
index dbc747f22019da020682e55970c99f31d356298a..a4ebc72f430d5508651b695faa6ab1d6d854c4cb 100644 (file)
@@ -6197,6 +6197,13 @@ int test_input_callback(void *data)
                                        desc_value, value_length, &descriptor);
                        TC_PRT("bt_gatt_descriptor_create : %s\n", __bt_get_error_message(ret));
 
+                       bt_gatt_server_set_read_value_requested_cb(descriptor,
+                               __bt_gatt_server_read_value_requested_cb, NULL);
+
+                       ret = bt_gatt_server_set_value_changed_cb(descriptor,
+                               __bt_gatt_server_value_changed_cb,
+                               NULL);
+
                        ret = bt_gatt_characteristic_add_descriptor(characteristic, descriptor);
                        TC_PRT("bt_gatt_characteristic_add_descriptor : %s\n", __bt_get_error_message(ret));