BLE Gatt Server Socket write implemetation
[platform/core/connectivity/bluetooth-frwk.git] / bt-service-adaptation / services / gatt / bt-service-gatt.c
index abcba75..6529804 100644 (file)
@@ -1653,6 +1653,45 @@ static void __bt_handle_gatt_server_disconnection_state(event_gatts_conn_t *even
 }
 #endif
 
+
+static void __bt_handle_gatt_server_acquire_write_requested(event_gatts_srvc_acquire_attr_t *event)
+{
+       GVariant *param = NULL;
+       int result = BLUETOOTH_ERROR_NONE;
+       struct gatt_server_req_info *req_info = NULL;
+       bluetooth_device_address_t dev_addr;
+       char  adress[BT_ADDRESS_STRING_SIZE] = {'/0',};
+       ;
+       BT_INFO("GATT Server ACQUIRE  Write Req Connection ID: [%d]", event->attr_trans.conn_id);
+       BT_INFO("GATT Server  ACQUIRE Write Req Transaction ID:[%d]", event->attr_trans.trans_id);
+       BT_INFO("GATT Server ACQUIRE Write Req Attribute Handle: [%d]", event->attr_trans.attr_handle);
+
+       //adress = g_malloc0(BT_ADDRESS_STRING_SIZE);
+       memcpy(dev_addr.addr, event->address.addr, 6);
+
+       req_info = g_new0(struct gatt_server_req_info, 1);
+       req_info->request_id = event->attr_trans.trans_id;
+       req_info->attribute_handle = event->attr_trans.attr_handle;
+       req_info->connection_id = event->attr_trans.conn_id;
+       req_info->request_type = BLUETOOTH_GATT_REQUEST_TYPE_ACQUIRE_WRITE;
+       gatt_server_requests = g_slist_append(gatt_server_requests, req_info);
+
+       _bt_convert_addr_type_to_string(adress,
+                       (unsigned char *)dev_addr.addr);
+
+       param = g_variant_new("(iiiiiis)", result,
+                       event->attr_trans.conn_id,
+                       event->attr_trans.trans_id,
+                       event->attr_trans.attr_handle,
+                       event->mtu, event->attr_trans.offset, adress);
+       BT_INFO("GATT Server ACQUIRE Write Req Attribute remote adress : [%s]", adress);
+
+
+       _bt_send_event(BT_GATT_SERVER_EVENT,
+                       BLUETOOTH_EVENT_GATT_SERVER_ACQUIRE_WRITE,
+                       param);
+}
+
 static void __bt_handle_gatt_server_write_requested(event_gatts_srvc_write_attr_t *event)
 {
        char *address;
@@ -1953,6 +1992,11 @@ static void __bt_gatt_event_handler(int event_type, gpointer event_data)
                __bt_handle_gatt_server_write_requested((event_gatts_srvc_write_attr_t *)event_data);
                break;
        }
+       case OAL_EVENT_GATTS_REQUEST_ACQUIRE_WRITE: {
+               BT_INFO("OAL Event: GATT Server Acquire  Write Request");
+               __bt_handle_gatt_server_acquire_write_requested((event_gatts_srvc_acquire_attr_t*)event_data);
+               break;
+       }
        case OAL_EVENT_GATTS_IND_CONFIRM: {
                BT_INFO("OAL Event: GATT Server Indication confirmed");
                __bt_handle_gatt_server_indicate_confirmed((event_gatts_ind_cnfrm_t *)event_data);
@@ -2237,6 +2281,43 @@ int _bt_gatt_server_send_response(char *sender, bluetooth_gatt_att_data_t *data,
        return BLUETOOTH_ERROR_NONE;
 }
 
+int _bt_gatt_server_acquire_send_response(char *sender, bluetooth_gatt_server_acquire_response_params_t *param ,       void *fd_list)
+{
+       BT_CHECK_PARAMETER(sender, return);
+       BT_CHECK_PARAMETER(param, return);
+       struct gatt_server_req_info *req_info = NULL;
+       int ret = OAL_STATUS_SUCCESS;
+
+
+       BT_INFO("GATT acquire Server Response: Req Type [%d] req_id [%d] fd  [%d] mtu[%d]",
+                       param->req_type, param->request_id,
+                        param->fd,
+                       param->mtu);
+
+       /* Search for matching Request in List */
+       req_info = __bt_gatt_server_find_request_info(param->request_id, param->req_type);
+       if (!req_info) {
+               BT_ERR("GATT acquire Server Req Info not found for current response..return Error");
+               return BLUETOOTH_ERROR_NOT_IN_OPERATION;
+       }
+
+       ret = gatt_send_response_acquire(req_info->connection_id, param->request_id, 0, param->fd, param->mtu, fd_list);
+
+       if (ret != OAL_STATUS_SUCCESS) {
+               BT_ERR("ret: %d", ret);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       BT_INFO("GATT acquire Server Response successfully sent");
+       /* Remove GATT server request from list */
+       gatt_server_requests = g_slist_remove(gatt_server_requests, req_info);
+       g_free(req_info->addr);
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+
+
 int _bt_gatt_server_send_indication(char *sender, bluetooth_device_address_t *dev_addr,
                bluetooth_gatt_att_data_t *data,
                bluetooth_gatt_server_indication_params_t *param)