GDBusProxy *proxy = NULL;
GDBusConnection *conn = NULL;
- conn = _bt_gdbus_get_system_gconn();
+ conn = _bt_get_system_private_conn();
retv_if(conn == NULL, NULL);
- proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+ proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
NULL, BT_HID_SERVICE_NAME, path, interface, NULL, err);
if (proxy == NULL) {
BT_ERR("Unable to allocate new proxy");
for (l = device_list; l != NULL; l = l->next) {
hid_connected_device_info_t *info = l->data;
- if (g_strcmp0((const char *)info->address, (const char *)remote_addr) == 0)
+ if (strcasecmp((const char *)info->address, (const char *)remote_addr) == 0)
return info;
}
return NULL;
g_dbus_error_strip_remote_error(error);
BT_ERR("Error : %s \n", error->message);
- if (g_strcmp0(error->message, "In Progress") == 0)
- result = BLUETOOTH_ERROR_DEVICE_BUSY;
- else
- result = BLUETOOTH_ERROR_INTERNAL;
-
info.ctrl_fd = -1;
info.intr_fd = -1;
path = g_dbus_proxy_get_object_path(proxy);
_bt_convert_device_path_to_address(path, info.address);
- __hid_connected_cb(&info, result);
+ if (g_strcmp0(error->message, "Already Connected") == 0) {
+ bluetooth_device_address_t dev_address = { {0} };
+ int ctrl = -1, intr = -1;
- g_free(info.address);
+ _bt_convert_addr_string_to_type(dev_address.addr,
+ info.address);
+ _bt_hid_device_get_fd(info.address, &ctrl, &intr);
+ if (ctrl != -1 && intr != -1)
+ _bt_hid_new_connection(&dev_address, ctrl, intr);
+ else
+ BT_ERR("fd is invalid.(ctrl=%d, intr=%d)", ctrl, intr);
+ } else {
+ if (g_strcmp0(error->message, "In Progress") == 0)
+ result = BLUETOOTH_ERROR_IN_PROGRESS;
+ else
+ result = BLUETOOTH_ERROR_INTERNAL;
+
+ __hid_connected_cb(&info, result);
+ }
+ g_free(info.address);
g_error_free(error);
} else {
g_variant_unref(ret);
}
info->disconnect_idle_id = 0;
event_info = _bt_event_get_cb_data(BT_HID_DEVICE_EVENT);
- if (event_info == NULL)
- return FALSE;
+ if (event_info != NULL) {
+ memset(&bd_addr, 0x00, sizeof(bluetooth_device_address_t));
+ _bt_convert_addr_string_to_type(bd_addr.addr , info->address);
+ _bt_common_event_cb(BLUETOOTH_HID_DEVICE_DISCONNECTED,
+ BLUETOOTH_ERROR_NONE, &bd_addr,
+ event_info->cb, event_info->user_data);
+ }
- memset(&bd_addr, 0x00, sizeof(bluetooth_device_address_t));
- _bt_convert_addr_string_to_type(bd_addr.addr , info->address);
- _bt_common_event_cb(BLUETOOTH_HID_DEVICE_DISCONNECTED,
- BLUETOOTH_ERROR_NONE, &bd_addr,
- event_info->cb, event_info->user_data);
- if (info->address)
- g_free(info->address);
+ g_free(info->address);
g_free(info);
- info = NULL;
- BT_DBG("-");
+
return FALSE;
}
&len, &err);
if (status == G_IO_STATUS_NORMAL) {
BT_INFO("Parsing Data");
- bluetooth_hid_received_data_t data = {0};
+ bluetooth_hid_received_data_t recv_data = {0};
header = buffer[0];
type = header & BT_HID_HEADER_TRANS_MASK;
param = header & BT_HID_HEADER_PARAM_MASK;
if (event_info == NULL)
return FALSE;
- data.address = g_strdup(info->address);
+ recv_data.address = g_strdup(info->address);
switch (type) {
case BT_HID_TRANS_HANDSHAKE:
BT_INFO("TRANS HANDSHAKE");
- data.type = HTYPE_TRANS_HANDSHAKE;
- data.buffer_size = len;
- data.buffer = (char *) malloc(sizeof(char) * len);
- if (data.buffer)
- memcpy(data.buffer, buffer, len);
+ recv_data.type = HTYPE_TRANS_HANDSHAKE;
+ recv_data.buffer_size = len;
+ recv_data.buffer = (char *)g_malloc0(sizeof(char) * len);
+ memcpy(recv_data.buffer, buffer, len);
break;
case BT_HID_TRANS_HID_CONTROL:
BT_INFO("HID CONTROL");
- data.type = HTYPE_TRANS_HID_CONTROL;
- data.buffer_size = len;
- data.buffer = (char *) malloc(sizeof(char) * len);
- if (data.buffer)
- memcpy(data.buffer, buffer, len);
+ recv_data.type = HTYPE_TRANS_HID_CONTROL;
+ recv_data.buffer_size = len;
+ recv_data.buffer = (char *)g_malloc0(sizeof(char) * len);
+ memcpy(recv_data.buffer, buffer, len);
break;
case BT_HID_TRANS_DATA:
BT_INFO("TRANS DATA");
- data.type = HTYPE_TRANS_DATA;
+ recv_data.type = HTYPE_TRANS_DATA;
if (param & BT_HID_DATA_RTYPE_INPUT) {
BT_INFO("Input Report");
- data.param = PTYPE_DATA_RTYPE_INPUT;
- data.buffer_size = len;
- data.buffer = (char *) malloc(sizeof(char) * len);
- if (data.buffer)
- memcpy(data.buffer, buffer, len);
+ recv_data.param = PTYPE_DATA_RTYPE_INPUT;
+ recv_data.buffer_size = len;
+ recv_data.buffer = (char *)g_malloc0(sizeof(char) * len);
+ memcpy(recv_data.buffer, buffer, len);
} else {
BT_INFO("Out Report");
- data.param = PTYPE_DATA_RTYPE_OUTPUT;
- data.buffer_size = len;
- data.buffer = (char *) malloc(sizeof(char) * len);
- if (data.buffer)
- memcpy(data.buffer, buffer, len);
+ recv_data.param = PTYPE_DATA_RTYPE_OUTPUT;
+ recv_data.buffer_size = len;
+ recv_data.buffer = (char *)g_malloc0(sizeof(char) * len);
+ memcpy(recv_data.buffer, buffer, len);
}
break;
case BT_HID_TRANS_GET_REPORT: {
BT_INFO("Get Report");
- data.type = HTYPE_TRANS_GET_REPORT;
+ recv_data.type = HTYPE_TRANS_GET_REPORT;
if (param & BT_HID_DATA_RTYPE_INPUT) {
BT_INFO("Input Report");
- data.param = PTYPE_DATA_RTYPE_INPUT;
+ recv_data.param = PTYPE_DATA_RTYPE_INPUT;
} else {
BT_INFO("Output Report");
- data.param = PTYPE_DATA_RTYPE_OUTPUT;
+ recv_data.param = PTYPE_DATA_RTYPE_OUTPUT;
}
- data.buffer_size = len;
- data.buffer = (char *) malloc(sizeof(char) * len);
- if (data.buffer)
- memcpy(data.buffer, buffer, len);
+ recv_data.buffer_size = len;
+ recv_data.buffer = (char *)g_malloc0(sizeof(char) * len);
+ memcpy(recv_data.buffer, buffer, len);
break;
}
case BT_HID_TRANS_SET_REPORT: {
BT_INFO("Set Report");
- data.type = HTYPE_TRANS_SET_REPORT;
+ recv_data.type = HTYPE_TRANS_SET_REPORT;
if (param & BT_HID_DATA_RTYPE_INPUT) {
BT_INFO("Input Report");
- data.param = PTYPE_DATA_RTYPE_INPUT;
+ recv_data.param = PTYPE_DATA_RTYPE_INPUT;
} else {
BT_INFO("Output Report");
- data.param = PTYPE_DATA_RTYPE_OUTPUT;
+ recv_data.param = PTYPE_DATA_RTYPE_OUTPUT;
}
- data.buffer_size = len;
- data.buffer = (char *) malloc(sizeof(char) * len);
- if (data.buffer)
- memcpy(data.buffer, buffer, len);
+ recv_data.buffer_size = len;
+ recv_data.buffer = (char *)g_malloc0(sizeof(char) * len);
+ memcpy(recv_data.buffer, buffer, len);
break;
}
case BT_HID_TRANS_GET_PROTOCOL:{
BT_INFO("Get_PROTOCOL");
- data.type = HTYPE_TRANS_GET_PROTOCOL;
- data.param = PTYPE_DATA_RTYPE_INPUT;
- data.buffer_size = len;
- data.buffer = (char *) malloc(sizeof(char) * len);
- if (data.buffer)
- memcpy(data.buffer, buffer, len);
+ recv_data.type = HTYPE_TRANS_GET_PROTOCOL;
+ recv_data.param = PTYPE_DATA_RTYPE_INPUT;
+ recv_data.buffer_size = len;
+ recv_data.buffer = (char *)g_malloc0(sizeof(char) * len);
+ memcpy(recv_data.buffer, buffer, len);
break;
}
case BT_HID_TRANS_SET_PROTOCOL:{
BT_INFO("Set_PROTOCOL");
- data.type = HTYPE_TRANS_SET_PROTOCOL;
- data.param = PTYPE_DATA_RTYPE_INPUT;
- data.buffer_size = len;
- data.buffer = (char *) malloc(sizeof(char) * len);
- if (data.buffer)
- memcpy(data.buffer, buffer, len);
+ recv_data.type = HTYPE_TRANS_SET_PROTOCOL;
+ recv_data.param = PTYPE_DATA_RTYPE_INPUT;
+ recv_data.buffer_size = len;
+ recv_data.buffer = (char *)g_malloc0(sizeof(char) * len);
+ memcpy(recv_data.buffer, buffer, len);
break;
}
case BT_HID_TRANS_GET_IDLE:{
BT_INFO("Get_IDLE");
- data.type = HTYPE_TRANS_GET_IDLE;
- data.param = PTYPE_DATA_RTYPE_INPUT;
- data.buffer_size = len;
- data.buffer = (char *) malloc(sizeof(char) * len);
- if (data.buffer)
- memcpy(data.buffer, buffer, len);
+ recv_data.type = HTYPE_TRANS_GET_IDLE;
+ recv_data.param = PTYPE_DATA_RTYPE_INPUT;
+ recv_data.buffer_size = len;
+ recv_data.buffer = (char *)g_malloc0(sizeof(char) * len);
+ memcpy(recv_data.buffer, buffer, len);
break;
}
case BT_HID_TRANS_SET_IDLE:{
BT_INFO("Set_IDLE");
- data.type = HTYPE_TRANS_SET_IDLE;
- data.param = PTYPE_DATA_RTYPE_INPUT;
- data.buffer_size = len;
- data.buffer = (char *) malloc(sizeof(char) * len);
- if (data.buffer)
- memcpy(data.buffer, buffer, len);
+ recv_data.type = HTYPE_TRANS_SET_IDLE;
+ recv_data.param = PTYPE_DATA_RTYPE_INPUT;
+ recv_data.buffer_size = len;
+ recv_data.buffer = (char *)g_malloc0(sizeof(char) * len);
+ memcpy(recv_data.buffer, buffer, len);
break;
}
BT_ERR("Send Handshake Message");
guint8 type = BT_HID_TRANS_HANDSHAKE |
BT_HID_HSHK_ERR_UNSUPPORTED_REQUEST;
- data.type = HTYPE_TRANS_UNKNOWN;
+ recv_data.type = HTYPE_TRANS_UNKNOWN;
int fd = g_io_channel_unix_get_fd(chan);
int bytes = write(fd, &type, sizeof(type));
BT_INFO("Bytes Written %d", bytes);
}
_bt_common_event_cb(BLUETOOTH_HID_DEVICE_DATA_RECEIVED,
- BLUETOOTH_ERROR_NONE, &data,
+ BLUETOOTH_ERROR_NONE, &recv_data,
event_info->cb, event_info->user_data);
- if (data.buffer)
- g_free(data.buffer);
+ if (recv_data.buffer)
+ g_free(recv_data.buffer);
- if (data.address)
- g_free((char *)data.address);
+ if (recv_data.address)
+ g_free((char *)recv_data.address);
} else {
BT_ERR("Error while reading data %d [%s]", status, info->address);
if (err) {
int index1 = 0;
int index2 = 0;
GUnixFDList *out_fd_list = NULL;
- conn = _bt_gdbus_get_system_gconn();
+ conn = _bt_get_system_private_conn();
retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
adapter_path = _bt_get_device_object_path((char *)address);
retv_if(adapter_path == NULL, BLUETOOTH_ERROR_INTERNAL);
BT_INFO_C("Device : %s", adapter_path);
- server_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+ server_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
NULL, BT_BLUEZ_NAME,
adapter_path, "org.bluez.Input1", NULL, NULL);
g_free(adapter_path);
hid_connected_device_info_t *info = NULL;
BT_CHECK_PARAMETER(remote_addr, return);
+ if (data_len > 20) {
+ BT_ERR("data(len:%d) overflow", data_len);
+ return BLUETOOTH_ERROR_INVALID_PARAM;
+ }
info = __find_hid_info_with_address(remote_addr);
if (info == NULL) {
break;
}
+ case HTYPE_TRANS_DATA: {
+ output_report.type = BT_HID_TRANS_DATA;
+ memcpy(output_report.rep_data, data, data_len);
+ bytes = write(info->ctrl_fd, &output_report.type,
+ data_len + 1);
+ break;
+ }
+
case HTYPE_TRANS_GET_IDLE: {
output_report.type = BT_HID_TRANS_DATA | BT_HID_DATA_RTYPE_OUTPUT;
output_report.rep_data[0] = data[0];