[Adapt]Added support for RFCOMM server APIs 38/87738/1
authorAtul Rai <a.rai@samsung.com>
Wed, 31 Aug 2016 04:57:23 +0000 (10:27 +0530)
committerAtul Rai <a.rai@samsung.com>
Wed, 31 Aug 2016 04:57:23 +0000 (10:27 +0530)
This patch added support for following APIs in bt-service:
1/ RFCOMM socket create
2/ RFCOMM remove socket
3/ RFCOMM socket listen

Change-Id: I30cc39a9a3fe7ff17d9ae848615cfe94379c07c1
Signed-off-by: Atul Rai <a.rai@samsung.com>
bt-service-adaptation/services/bt-request-handler.c
bt-service-adaptation/services/include/bt-service-rfcomm.h
bt-service-adaptation/services/include/bt-service-socket.h
bt-service-adaptation/services/rfcomm/bt-service-rfcomm.c
bt-service-adaptation/services/socket/bt-service-socket.c

index 7d5994d..70ddce8 100644 (file)
@@ -157,7 +157,8 @@ static gboolean __bt_is_sync_function(int service_function)
                        || 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;
@@ -1029,6 +1030,44 @@ int __bt_bluez_request(int function_name,
                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;
index d40084b..fe34848 100644 (file)
@@ -32,6 +32,7 @@ extern "C" {
 
 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
 }
index 08e157c..ca64135 100644 (file)
@@ -42,6 +42,8 @@ void _bt_socket_deinit(void);
 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 */
index 1105784..0b4b199 100644 (file)
@@ -63,7 +63,7 @@ static void __bt_rfcomm_reply_pending_request(int result,
 
                                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);
                        }
 
@@ -72,6 +72,27 @@ static void __bt_rfcomm_reply_pending_request(int result,
                        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");
                }
@@ -159,3 +180,37 @@ int _bt_rfcomm_connect_using_channel(bluetooth_device_address_t *device_address,
        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;
+}
index 4d00088..27c2309 100644 (file)
@@ -48,7 +48,7 @@ bt_socket_info_t *pending_conn_info;
 /* 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);
 
@@ -87,7 +87,7 @@ void __handle_socket_disconnected(event_socket_client_conn_t *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);
@@ -189,6 +189,36 @@ int _bt_socket_client_connect(int sock_type, char *address,
        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");