|| service_function == BT_GET_LOCAL_VERSION
|| service_function == BT_GET_BONDED_DEVICES
|| service_function == BT_GET_BONDED_DEVICE
- || service_function == BT_IS_SERVICE_USED)
+ || service_function == BT_IS_SERVICE_USED
+ || service_function == BT_RFCOMM_LISTEN)
return TRUE;
else
return FALSE;
result = BLUETOOTH_ERROR_NONE;
break;
}
+ case BT_RFCOMM_CREATE_SOCKET: {
+ /*
+ * This call to bt-service is only used for privilege check, so return
+ * BLUETOOTH_ERROR_NONE from here.
+ */
+ result = BLUETOOTH_ERROR_NONE;
+ break;
+ }
+ case BT_RFCOMM_LISTEN: {
+ char *sender;
+ char *uuid;
+ int socket_fd = -1;
+
+ sender = (char *)g_dbus_method_invocation_get_sender(context);
+ uuid = (char *)g_variant_get_data(in_param1);
+
+ result = _bt_rfcomm_socket_listen(sender, uuid);
+ if (result > 0) {
+ BT_ERR("BT_RFCOMM_LISTEN success, save context");
+
+ result = BLUETOOTH_ERROR_NONE;
+ _bt_save_invocation_context(context,
+ result, sender, function_name, NULL);
+ } else {
+ g_array_append_vals(*out_param1, &socket_fd, sizeof(int));
+ g_free(sender);
+ }
+ break;
+ }
+ case BT_RFCOMM_REMOVE_SOCKET: {
+ /*
+ * This call to bt-service is only used for privilege check, so return
+ * BLUETOOTH_ERROR_NONE from here.
+ */
+ result = BLUETOOTH_ERROR_NONE;
+ break;
+ }
+
default:
BT_INFO("UnSupported function [%d]", function_name);
result = BLUETOOTH_ERROR_NOT_SUPPORT;
int _bt_rfcomm_connect_using_uuid(bluetooth_device_address_t *device_address, char *remote_uuid);
int _bt_rfcomm_connect_using_channel(bluetooth_device_address_t *device_address, char *chan_str);
+int _bt_rfcomm_socket_listen(char *svc_name, char *uuid);
#ifdef __cplusplus
}
int _bt_socket_client_connect(int sock_type, char *address,
char *remote_uuid, int channel, bt_socket_client_conn_cb cb);
+int _bt_socket_listen(int sock_type, char *svc_name, char *server_uuid, int channel);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
fd_list = g_unix_fd_list_new();
g_unix_fd_list_append(fd_list, ptr->socket_fd, &error);
- g_assert_no_error (error);
+ g_assert_no_error(error);
close(ptr->socket_fd);
}
g_object_unref(fd_list);
break;
}
+ case BT_RFCOMM_LISTEN: {
+ GUnixFDList *fd_list = NULL;
+ GError *error = NULL;
+ int *socket_fd = user_data;
+
+ BT_INFO("Server socket fd: %d", *socket_fd);
+
+ g_array_append_vals(out_param, user_data, size);
+
+ /* Add socket fd to unix_fd_list */
+ fd_list = g_unix_fd_list_new();
+ g_unix_fd_list_append(fd_list, *socket_fd, &error);
+ g_assert_no_error(error);
+
+ _bt_service_method_return_with_unix_fd_list(
+ req_info->context, out_param, result, fd_list);
+
+ close(*socket_fd);
+ g_object_unref(fd_list);
+ break;
+ }
default:
BT_ERR("Unknown Service function");
}
BT_DBG("-");
return result;
}
+
+gboolean __bt_send_rfcomm_server_fd(gpointer user_data)
+{
+ BT_DBG("+");
+
+ __bt_rfcomm_reply_pending_request(BLUETOOTH_ERROR_NONE,
+ BT_RFCOMM_LISTEN, user_data, sizeof(int));
+
+ g_free(user_data);
+ BT_DBG("-");
+ return FALSE;
+}
+
+int _bt_rfcomm_socket_listen(char *svc_name, char *uuid)
+{
+ int channel = 0;
+ int sock_fd;
+
+ BT_DBG("+");
+
+ retv_if(NULL == svc_name, BLUETOOTH_ERROR_INVALID_PARAM);
+ retv_if(NULL == uuid, BLUETOOTH_ERROR_INVALID_PARAM);
+
+ BT_INFO("RFCOMM create socket called with svc name: [%s], uuid: [%s]", svc_name, uuid);
+ sock_fd = _bt_socket_listen(SOCK_TYPE_RFCOMM, svc_name, uuid, channel);
+ if (sock_fd < 0) {
+ BT_ERR("_bt_socket_listen failed");
+ return BLUETOOTH_ERROR_INTERNAL;
+ }
+
+ g_idle_add(__bt_send_rfcomm_server_fd, g_memdup(&sock_fd, sizeof(int)));
+ BT_DBG("-");
+ return sock_fd;
+}
/* Function to handle socket disconnection */
void __handle_socket_disconnected(event_socket_client_conn_t *client_info)
{
- char address[BT_ADDRESS_STR_LEN];
+ char address[BT_ADDRESS_STRING_SIZE];
ret_if(NULL == client_info);
/* Handle outgoing client socket connection event */
static void __handle_outgoing_client_socket_connected(event_socket_client_conn_t *client_info)
{
- char address[BT_ADDRESS_STR_LEN];
+ char address[BT_ADDRESS_STRING_SIZE];
ret_if(NULL == client_info);
ret_if(NULL == pending_conn_info);
return BLUETOOTH_ERROR_NONE;
}
+int _bt_socket_listen(int sock_type, char *svc_name, char *server_uuid, int channel)
+{
+ int sock_fd;
+ oal_uuid_t uuid;
+
+ retv_if(NULL == svc_name, BLUETOOTH_ERROR_INVALID_PARAM);
+ retv_if(NULL == server_uuid, BLUETOOTH_ERROR_INVALID_PARAM);
+
+ BT_INFO("sock_type: %d, svc_name: %s, uuid: %s, channel: %d",
+ sock_type, svc_name, server_uuid, channel);
+
+ _bt_service_convert_uuid_string_to_type(uuid.uuid, server_uuid);
+
+ switch (sock_type) {
+ case SOCK_TYPE_RFCOMM:
+ sock_fd = socket_listen(OAL_SOCK_RFCOMM, &uuid, svc_name, channel);
+ break;
+ default:
+ BT_ERR("Socket type: %d not supported");
+ return BLUETOOTH_ERROR_NOT_SUPPORT;
+ }
+
+ if(0 > sock_fd) {
+ BT_ERR("Bluetooth socket create failed");
+ return BLUETOOTH_ERROR_INTERNAL;
+ }
+
+ return sock_fd;
+}
+
int _bt_socket_init(void)
{
BT_INFO("Socket Init");