static struct gatt_req_info *__bt_gatt_find_request_info(guint request_id);
static int __bt_gatt_unregister_service(struct gatt_service_info *svc_info);
-
-
-typedef struct {
- int write_fd;
- int relpy_fd;
- int mtu;
- int att_hand;
- char *path ;
-} bluetooth_gatt_acquire_notify_info_t;
-
-
static int bluetooth_get_characteristic_fd(int att_handle , char *path)
{
GSList *l;
return FALSE;
}
- if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR)) {
- BT_ERR("Error : GIOCondition %d, []", cond);;
+ if (cond & G_IO_NVAL) {
+ BT_ERR("Invalid channel");
+ return FALSE;
+ }
+
+ if (cond & (G_IO_HUP | G_IO_ERR)) {
+ BT_ERR("Error : GIOCondition %d", cond);
g_io_channel_shutdown(gio, TRUE, NULL);
g_io_channel_unref(gio);
return err;
}
-
-#if 0
-BT_EXPORT_API int bluetooth_gatt_register_application(int instance_id)
-{
- BT_INIT_PARAMS();
-
- if (!is_server_started) {
-
- if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_GATT_REGISTER_APPLICATION)
- == BLUETOOTH_ERROR_PERMISSION_DEINED) {
- BT_ERR("Don't have aprivilege to use this API");
- return BLUETOOTH_ERROR_PERMISSION_DEINED;
- }
-
- BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
- g_array_append_vals(in_param1, &instance_id, sizeof(int));
-
- ret = _bt_send_request(BT_BLUEZ_SERVICE, BT_GATT_REGISTER_APPLICATION,
- in_param1, in_param2, in_param3, in_param4, &out_param);
- BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
-
- if (ret != BLUETOOTH_ERROR_NONE) {
- BT_ERR("Register application failed");
- return ret;
- }
- is_server_started = true;
-
- return BLUETOOTH_ERROR_NONE;
- }
-
- BT_INFO("Already RegisterApplication");
- return BLUETOOTH_ERROR_NONE;
-}
-#endif
-
BT_EXPORT_API int bluetooth_gatt_server_init(int *instance_id, gatt_server_cb_func_ptr callback_ptr,
void *user_data)
{
}
BT_EXPORT_API int bluetooth_gatt_server_send_indication(bluetooth_device_address_t *addr_hex,
- const bluetooth_gatt_server_indication_params_t *param,
+ bluetooth_gatt_server_indication_params_t *param,
const bluetooth_gatt_att_data_t *att_value)
{
BT_CHECK_PARAMETER(param, return);
_bt_convert_addr_type_to_string(addr, addr_hex->addr);
fd = bluetooth_get_characteristic_fd(param->atrribute_handle, addr);
- if (fd > -1)
+ if (fd > -1) {
result = bluetooth_gatt_write_characteristics_value_to_fd_(fd, att_value->data, att_value->length, NULL);
- else
+ param->fd = fd;
+ } else {
result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GATT_SERVER_SEND_INDICATION,
in_param1, in_param2, in_param3, in_param4, &out_param);
+ }
BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
BT_DBG("FD io write data received [%s]", write_data->address);
+ if (cond & G_IO_NVAL) {
+ BT_ERR("Invalid channel");
+ return FALSE;
+ }
+
+ if (cond & (G_IO_HUP | G_IO_ERR)) {
+ BT_ERR("Error : GIOCondition %d", cond);
+ g_io_channel_shutdown(gio, TRUE, NULL);
+ g_io_channel_unref(gio);
+
+ return FALSE;
+ }
+
if (cond & G_IO_IN) {
GIOStatus status = G_IO_STATUS_NORMAL;
GError *err = NULL;
} else {
BT_ERR("eventinfo failed");
}
-
-
}
g_free(buffer);
return TRUE;
}
- if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR)) {
- BT_ERR("Error : GIOCondition %d, ]", cond);
- g_io_channel_shutdown(gio, TRUE, NULL);
- g_io_channel_unref(gio);
-
- return FALSE;
- }
-
return TRUE;
}
data.mtu = mtu;
data.request_id = tran_id;
- bluetooth_gatt_server_acquire_write_info_t *write_info = g_malloc0(sizeof(bluetooth_gatt_server_acquire_write_info_t)) ;
+ bluetooth_gatt_server_acquire_write_info_t *write_info = g_malloc0(sizeof(bluetooth_gatt_server_acquire_write_info_t)) ;
write_info->attribute_handle = att_han;
write_info->connection_id = tran_id;
BT_INFO("FD read %d remote address [%s ] \n", pipefd[0], addr);
-
channel = g_io_channel_unix_new(pipefd[0]);
g_io_channel_set_encoding(channel, NULL, NULL);
g_io_channel_set_buffered(channel, FALSE);
g_io_add_watch(channel, (G_IO_IN | G_IO_ERR | G_IO_HUP),
bluetooth_gatt_server_acquire_channel_write_cb, write_info);
-
- GUnixFDList *fd_list = g_unix_fd_list_new();
- GError *error = NULL;
+ GUnixFDList *fd_list = g_unix_fd_list_new();
+ GError *error = NULL;
g_unix_fd_list_append(fd_list, pipefd[1], &error);
g_assert_no_error(error);
in_param1, in_param2, in_param3, in_param4, fd_list, &out_param, NULL);
BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
-
+ g_object_unref(fd_list);
}
-
-
void bluetooth_gatt_server_send_acquire_notify_response(GVariant * parameters, bt_event_info_t *event_info)
{
int con_id = -1;
data.mtu = mtu;
data.request_id = tran_id;
- BT_INFO("FD write %d characterstics path \n", pipefd[0]);
+ BT_INFO("FD write %d", pipefd[0]);
chr_info = bluetooth_get_characteristic_info_from_path(att_han);
if (!chr_info) {
chr_info->write_fd = fd;
channel = g_io_channel_unix_new(fd);
+ chr_info->io_channel = channel;
g_io_channel_set_encoding(channel, NULL, NULL);
g_io_channel_set_buffered(channel, FALSE);
g_io_channel_set_close_on_unref(channel, TRUE);
g_io_channel_set_flags(channel, G_IO_FLAG_NONBLOCK, NULL);
- g_io_add_watch(channel, (G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL),
+ chr_info->watch_id =
+ g_io_add_watch(channel,
+ (G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL),
bluetooth_gatt_write_channel_watch_cb, chr_info);
- GUnixFDList *fd_list = g_unix_fd_list_new();
- GError *error = NULL;
+ GUnixFDList *fd_list = g_unix_fd_list_new();
+ GError *error = NULL;
g_unix_fd_list_append(fd_list, pipefd[1], &error);
g_assert_no_error(error);
in_param1, in_param2, in_param3, in_param4, fd_list, &out_param, NULL);
BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
-
+ g_object_unref(fd_list);
//send
if (result == BLUETOOTH_ERROR_NONE) {
chr_info = bluetooth_get_characteristic_info_from_path(handle);
if (chr_info != NULL) {
- BT_INFO("GATT Server: acquire notification char info found");
+ BT_INFO("GATT Server: acquire notification char info found [%s]", chr_info->path);
+
+ if (chr_info->watch_id > 0)
+ g_source_remove(chr_info->watch_id);
- if (chr_info->write_fd >= 0) {
- BT_INFO("closing fd");
- close(chr_info->write_fd);
+ if (chr_info->io_channel) {
+ g_io_channel_shutdown(chr_info->io_channel, TRUE, NULL);
+ g_io_channel_unref(chr_info->io_channel);
}
BT_INFO("Removing char_info from the list");