Added feature : notification of GATT char Changed Value
[platform/core/connectivity/bluetooth-frwk.git] / bt-service-adaptation / services / gatt / bt-service-gatt.c
index 4448648..8e5db8e 100644 (file)
@@ -255,6 +255,7 @@ static int __bt_do_unregister_gatt_instance(int instance_id);
 static void __bt_hanlde_le_device_disconnection(event_dev_conn_status_t *event_data);
 static void __bt_handle_client_notification_registered(event_gattc_regdereg_notify_t *event_data,
                gboolean is_registered);
+static void __bt_handle_client_notification_data(event_gattc_notify_data *event_data);
 
 #endif
 
@@ -2118,6 +2119,11 @@ static void __bt_gatt_event_handler(int event_type, gpointer event_data)
                __bt_handle_client_notification_registered((event_gattc_regdereg_notify_t *) event_data, FALSE);
                break;
        }
+       case OAL_EVENT_GATTC_NOTIFY_DATA: {
+               BT_INFO("OAL Event: GATT Client Notification Data");
+               __bt_handle_client_notification_data((event_gattc_notify_data *) event_data);
+
+       }
 #endif
        default:
                break;
@@ -3906,6 +3912,91 @@ static void __bt_handle_client_notification_registered(
                        sizeof(bt_gatt_notif_reg_info_t));
 }
 
+static void __bt_handle_client_notification_data(event_gattc_notify_data *event_data)
+{
+       /* No status in this event from OAL */
+       int result = BLUETOOTH_ERROR_NONE;
+
+       /* Read Information data structures */
+       GVariant *param = NULL;
+       GVariant *data = NULL;
+       GVariant *data_svc_uuid = NULL;
+       GVariant *data_char_uuid = NULL;
+       char *read_val = NULL;
+       char *svc_uuid = NULL;
+       char *char_uuid = NULL;
+       char *addr = NULL;
+       int i;
+       int uuid_len = 16;
+       BT_INFO("+");
+
+       BT_INFO("Notifcation of charc data changed");
+
+       if (event_data->data_len > 0) {
+               /* DEBUG */
+               for (i = 0; i < event_data->data_len; i++)
+                       BT_INFO("Data[%d] = [0x%x]", i, event_data->data[i]);
+
+               /* Fill address */
+               addr = g_malloc0(BT_ADDRESS_STRING_SIZE);
+               _bt_convert_addr_type_to_string(addr,
+                               (unsigned char *)&(event_data->address.addr));
+
+               /* Read data */
+               read_val = g_memdup(&event_data->data[0], event_data->data_len);
+
+               data = g_variant_new_from_data(
+                               G_VARIANT_TYPE_BYTESTRING,
+                               read_val,
+                               event_data->data_len,
+                               TRUE, NULL, NULL);
+               /* SVC uuid */
+               svc_uuid = g_memdup(&event_data->srvc_id.id.uuid.uuid[0], uuid_len);
+
+               data_svc_uuid = g_variant_new_from_data(
+                               G_VARIANT_TYPE_BYTESTRING,
+                               svc_uuid,
+                               uuid_len,
+                               TRUE, NULL, NULL);
+
+               /* Char uuid */
+               char_uuid = g_memdup(&event_data->char_id.uuid.uuid[0], uuid_len);
+
+               data_char_uuid = g_variant_new_from_data(
+                               G_VARIANT_TYPE_BYTESTRING,
+                               char_uuid,
+                               uuid_len,
+                               TRUE, NULL, NULL);
+
+               /* Build Param */
+               param = g_variant_new("(isn@ayin@ayin@ay)", result,
+                               addr,
+                               16,
+                               data_svc_uuid,
+                               event_data->srvc_id.id.inst_id,
+                               16,
+                               data_char_uuid,
+                               event_data->char_id.inst_id,
+                               event_data->data_len,
+                               data);
+
+               /* Send Event */
+               _bt_send_event(BT_GATT_CLIENT_EVENT,
+                               BLUETOOTH_EVENT_GATT_CHAR_VAL_CHANGED,
+                               param);
+       } else {
+               BT_ERR("No Data!!");
+       }
+       /* Free data */
+       if (read_val)
+               g_free(read_val);
+       if (svc_uuid)
+               g_free(svc_uuid);
+       if (char_uuid)
+               g_free(char_uuid);
+       if (addr)
+               g_free(addr);
+}
 
 gboolean _bt_is_remote_gatt_device_connected(bluetooth_device_address_t *address)
 {