{BT_RFCOMM_SOCKET_WRITE, "BT_RFCOMM_SOCKET_WRITE"},
{BT_RFCOMM_CREATE_SOCKET, "BT_RFCOMM_CREATE_SOCKET"},
{BT_RFCOMM_REMOVE_SOCKET, "BT_RFCOMM_REMOVE_SOCKET"},
+ {BT_RFCOMM_LISTEN_AND_ACCEPT, "BT_RFCOMM_LISTEN_AND_ACCEPT"},
{BT_RFCOMM_LISTEN, "BT_RFCOMM_LISTEN"},
{BT_RFCOMM_IS_UUID_AVAILABLE, "BT_RFCOMM_IS_UUID_AVAILABLE"},
{BT_RFCOMM_ACCEPT_CONNECTION, "BT_RFCOMM_ACCEPT_CONNECTION"},
return FALSE;
}
-static int __rfcomm_listen(rfcomm_server_info_t *server_info)
+static int __rfcomm_listen(rfcomm_server_info_t *server_info, bool accept)
{
int result;
GUnixFDList *out_fd_list = NULL;
BT_INIT_PARAMS();
BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
- g_array_append_vals(in_param1, server_info->uuid, BLUETOOTH_UUID_STRING_MAX);
- result = _bt_send_request_with_unix_fd_list(BT_BLUEZ_SERVICE, BT_RFCOMM_LISTEN,
- in_param1, in_param2, in_param3, in_param4, NULL, &out_param, &out_fd_list);
+ if (accept == false) {
+ g_array_append_vals(in_param1, server_info->uuid, BLUETOOTH_UUID_STRING_MAX);
+ result = _bt_send_request_with_unix_fd_list(BT_BLUEZ_SERVICE, BT_RFCOMM_LISTEN,
+ in_param1, in_param2, in_param3, in_param4, NULL, &out_param, &out_fd_list);
+ } else {
+ g_array_append_vals(in_param1, server_info->uuid, BLUETOOTH_UUID_STRING_MAX);
+ result = _bt_send_request_with_unix_fd_list(BT_BLUEZ_SERVICE, BT_RFCOMM_LISTEN_AND_ACCEPT,
+ in_param1, in_param2, in_param3, in_param4, NULL, &out_param, &out_fd_list);
+ }
BT_DBG("result: %x", result);
if (result != BLUETOOTH_ERROR_NONE) {
server_info->max_pending_conn = max_pending_connection;
server_info->auto_accept = TRUE;
- return __rfcomm_listen(server_info);
+ return __rfcomm_listen(server_info, true);
#endif
}
server_info->max_pending_conn = max_pending_connection;
server_info->auto_accept = FALSE;
- return __rfcomm_listen(server_info);
+ return __rfcomm_listen(server_info, false);
#endif
}
|| service_function == BT_GET_IS_ALIAS_SET
|| service_function == BT_GET_CONNECTED_LINK_TYPE
|| service_function == BT_IS_SERVICE_USED
+ || service_function == BT_RFCOMM_LISTEN_AND_ACCEPT
|| service_function == BT_RFCOMM_LISTEN
|| service_function == BT_HDP_REGISTER_SINK_APP
|| service_function == BT_HDP_UNREGISTER_SINK_APP
result = BLUETOOTH_ERROR_NONE;
break;
}
+ case BT_RFCOMM_LISTEN_AND_ACCEPT: {
+ 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, true);
+ if (result > 0) {
+ BT_ERR("BT_RFCOMM_LISTEN_AND_ACCEPT 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));
+ }
+ break;
+ }
case BT_RFCOMM_LISTEN: {
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);
+ result = _bt_rfcomm_socket_listen(sender, uuid, false);
if (result > 0) {
BT_ERR("BT_RFCOMM_LISTEN success, save context");
case BT_PBAP_PULL_VCARD:
case BT_PBAP_PHONEBOOK_SEARCH:
+ case BT_RFCOMM_LISTEN_AND_ACCEPT:
+
ret_val = cynara_check(p_cynara, client_creds, client_session, user_creds,
BT_PRIVILEGE_PUBLIC);
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);
+int _bt_rfcomm_socket_listen(char *svc_name, char *uuid, bool accept);
#ifdef __cplusplus
}
g_array_free(out_param, TRUE);
break;
}
+ case BT_RFCOMM_LISTEN_AND_ACCEPT:
case BT_RFCOMM_LISTEN: {
GUnixFDList *fd_list = NULL;
GError *error = NULL;
return FALSE;
}
-int _bt_rfcomm_socket_listen(char *svc_name, char *uuid)
+gboolean __bt_send_rfcomm_server_fd_with_accept(gpointer user_data)
+{
+ BT_DBG("+");
+
+ __bt_rfcomm_reply_pending_request(BLUETOOTH_ERROR_NONE,
+ BT_RFCOMM_LISTEN_AND_ACCEPT, user_data, sizeof(int));
+
+ g_free(user_data);
+ BT_DBG("-");
+ return FALSE;
+}
+
+int _bt_rfcomm_socket_listen(char *svc_name, char *uuid, bool accept)
{
int channel = 0;
int sock_fd;
return BLUETOOTH_ERROR_INTERNAL;
}
- g_idle_add(__bt_send_rfcomm_server_fd, g_memdup(&sock_fd, sizeof(int)));
+ if (accept == false)
+ g_idle_add(__bt_send_rfcomm_server_fd, g_memdup(&sock_fd, sizeof(int)));
+ else
+ g_idle_add(__bt_send_rfcomm_server_fd_with_accept, g_memdup(&sock_fd, sizeof(int)));
+
BT_DBG("-");
return sock_fd;
}
BT_RFCOMM_SOCKET_WRITE,
BT_RFCOMM_CREATE_SOCKET,
BT_RFCOMM_REMOVE_SOCKET,
+ BT_RFCOMM_LISTEN_AND_ACCEPT,
BT_RFCOMM_LISTEN,
BT_RFCOMM_IS_UUID_AVAILABLE,
BT_RFCOMM_ACCEPT_CONNECTION,