Update the RFCOMM client connection information 52/230152/3
authorDoHyun Pyun <dh79.pyun@samsung.com>
Wed, 8 Apr 2020 07:07:29 +0000 (16:07 +0900)
committerPyun DoHyun <dh79.pyun@samsung.com>
Thu, 9 Apr 2020 04:53:16 +0000 (04:53 +0000)
Change-Id: Ief091e60d094bc277daad306f3cce906a1607931
Signed-off-by: DoHyun Pyun <dh79.pyun@samsung.com>
bt-api/bt-common.c
bt-api/bt-rfcomm-client.c
bt-api/bt-rfcomm-server.c
bt-api/include/bt-common.h
bt-service-adaptation/services/bt-request-handler.c
bt-service-adaptation/services/include/bt-service-rfcomm.h
bt-service-adaptation/services/rfcomm/bt-service-rfcomm.c
include/bt-internal-types.h

index 2161643..696468a 100644 (file)
@@ -179,6 +179,32 @@ int _bt_common_send_rfcomm_tx_details(int len)
        return ret;
 }
 
+int _bt_common_send_rfcomm_conn_info(int role, gboolean connected, int socket_fd)
+{
+       int result = BLUETOOTH_ERROR_NONE;
+
+       if (bluetooth_get_battery_monitor_state() == 0) {
+               BT_DBG("Battery monitor state is off");
+               return BLUETOOTH_ERROR_NONE;
+       }
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       g_array_append_vals(in_param1, &role, sizeof(int));
+       g_array_append_vals(in_param2, &connected, sizeof(gboolean));
+       g_array_append_vals(in_param3, &socket_fd, sizeof(int));
+
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_RFCOMM_UPDATE_CONNECTION_INFO,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       BT_DBG("result: %x", result);
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
 void _bt_common_event_cb(int event, int result, void *param,
                                        void *callback, void *user_data)
 {
index 65c983c..a642e10 100644 (file)
@@ -320,6 +320,10 @@ static void _bt_rfcomm_disconnect_conn_info(rfcomm_conn_info_t *conn_info,
        if (info->rfcomm_conns == NULL)
                rfcomm_cb_data_remove(info);
 
+       if (_bt_common_send_rfcomm_conn_info(RFCOMM_ROLE_CLIENT,
+                       FALSE, disconn_info.socket_fd) != BLUETOOTH_ERROR_NONE)
+               BT_ERR("Fail to send the connection info");
+
        BT_DBG("-");
 }
 
@@ -475,6 +479,10 @@ static void __client_connected_cb(rfcomm_cb_data_t *cb_data, char *dev_address,
        conn_info.socket_fd = conn_list_info->fd;
        conn_info.server_id = -1;
 
+       if (_bt_common_send_rfcomm_conn_info(RFCOMM_ROLE_CLIENT,
+                       TRUE, conn_info.socket_fd) != BLUETOOTH_ERROR_NONE)
+               BT_ERR("Fail to send the connection info");
+
        BT_DBG("Connection Result[%d] BT_ADDRESS[%s] UUID[%s] FD[%d]",
                        result, conn_list_info->bt_addr, cb_data->uuid, conn_list_info->fd);
        _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_CONNECTED,
index 1e6e1c6..2ad7d73 100644 (file)
 #define BLUETOOTH_SOCK_CONNECT_INFO_LEN 16
 #define BATTERY_MONITOR_RFCOMM_INTERVAL 5
 
-static int __rfcomm_send_conn_info(gboolean connected, int client_fd)
-{
-       int result;
-
-       if (bluetooth_get_battery_monitor_state() == 0) {
-               BT_DBG("Battery monitor state is off");
-               return BLUETOOTH_ERROR_NONE;
-       }
-
-       BT_INIT_PARAMS();
-       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
-
-       g_array_append_vals(in_param1, &connected, sizeof(gboolean));
-       g_array_append_vals(in_param2, &client_fd, sizeof(int));
-
-       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_RFCOMM_SERVER_UPDATE_CONNECTION_INFO,
-               in_param1, in_param2, in_param3, in_param4, &out_param);
-
-       BT_DBG("result: %x", result);
-
-       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
-
-       return result;
-}
-
 #ifdef TIZEN_FEATURE_BT_RFCOMM_DIRECT
 
 static GSList *rfcomm_nodes;
@@ -222,7 +197,8 @@ static void __connected_cb(rfcomm_info_t *info, rfcomm_conn_t *conn,
 
        BT_INFO_C("### Connected [RFCOMM Server]");
 
-       if (__rfcomm_send_conn_info(TRUE, conn_info.socket_fd) != BLUETOOTH_ERROR_NONE)
+       if (_bt_common_send_rfcomm_conn_info(RFCOMM_ROLE_SERVER,
+                       TRUE, conn_info.socket_fd) != BLUETOOTH_ERROR_NONE)
                BT_ERR("Fail to send the connection info");
 
        _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_CONNECTED,
@@ -262,7 +238,8 @@ static void __rfcomm_server_disconnect_conn(rfcomm_conn_t *conn,
        BT_INFO("Disconnected FD [%d]", conn->fd);
        disconn_info.socket_fd = conn->fd;
 
-       if (__rfcomm_send_conn_info(FALSE, disconn_info.socket_fd) != BLUETOOTH_ERROR_NONE)
+       if (_bt_common_send_rfcomm_conn_info(RFCOMM_ROLE_SERVER,
+                       FALSE, disconn_info.socket_fd) != BLUETOOTH_ERROR_NONE)
                BT_ERR("Fail to send the connection info");
 
        _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DISCONNECTED,
index c74baaf..8d69aab 100644 (file)
@@ -326,6 +326,8 @@ int _bt_common_send_rfcomm_rx_details(int len);
 
 int _bt_common_send_rfcomm_tx_details(int len);
 
+int _bt_common_send_rfcomm_conn_info(int role, gboolean connected, int client_fd);
+
 const char *_bt_convert_error_to_string(int error);
 
 const char *_bt_convert_service_function_to_string(int function);
index 4e230df..b8d6b55 100644 (file)
@@ -1558,19 +1558,21 @@ int __bt_bluez_request(int function_name,
                _bt_bm_add_transaction_details(uid, pid, size, TX_DATA);
                break;
        }
-       case BT_RFCOMM_SERVER_UPDATE_CONNECTION_INFO: {
+       case BT_RFCOMM_UPDATE_CONNECTION_INFO: {
                gboolean connected = FALSE;
-               int client_fd = -1;
+               int socket_fd = -1;
+               int role = RFCOMM_ROLE_SERVER;
 
                sender = (char *)g_dbus_method_invocation_get_sender(context);
 
-               __bt_service_get_parameters(in_param1, &connected, sizeof(gboolean));
-               __bt_service_get_parameters(in_param2, &client_fd, sizeof(int));
+               __bt_service_get_parameters(in_param1, &role, sizeof(int));
+               __bt_service_get_parameters(in_param2, &connected, sizeof(gboolean));
+               __bt_service_get_parameters(in_param3, &socket_fd, sizeof(int));
 
                if (connected == TRUE)
-                       result = _bt_rfcomm_server_conn_added(sender, client_fd);
+                       result = _bt_rfcomm_conn_added(sender, role, socket_fd);
                else
-                       result = _bt_rfcomm_server_conn_removed(sender, client_fd);
+                       result = _bt_rfcomm_conn_removed(sender, role, socket_fd);
 
                break;
        }
@@ -4010,7 +4012,7 @@ gboolean __bt_service_check_privilege(int function_name,
        case BT_RFCOMM_REMOVE_SOCKET:
        case BT_RFCOMM_SEND_RX_DETAILS:
        case BT_RFCOMM_SEND_TX_DETAILS:
-       case BT_RFCOMM_SERVER_UPDATE_CONNECTION_INFO:
+       case BT_RFCOMM_UPDATE_CONNECTION_INFO:
 
        case BT_OPP_PUSH_FILES:
        case BT_OPP_CANCEL_PUSH:
@@ -4417,8 +4419,8 @@ static void __name_owner_changed(GDBusConnection *connection,
        /* Check if le_scanning app is terminated */
        _bt_check_le_scanner_app_termination(name);
 
-       /* Check if RFCOMM server is terminated */
-       _bt_rfcomm_server_check_termination(name);
+       /* Check if RFCOMM app is terminated */
+       _bt_rfcomm_check_termination(name);
 }
 
 static void __bt_service_bus_acquired_handler(GDBusConnection *connection,
index 0f4f9db..66b6750 100644 (file)
@@ -33,9 +33,9 @@ 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, bool accept);
-int _bt_rfcomm_server_conn_added(char *svc_name, int client_fd);
-int _bt_rfcomm_server_conn_removed(char *svc_name, int client_fd);
-void _bt_rfcomm_server_check_termination(const char *name);
+int _bt_rfcomm_conn_added(char *svc_name, int role, int socket_fd);
+int _bt_rfcomm_conn_removed(char *svc_name, int role, int socket_fd);
+void _bt_rfcomm_check_termination(const char *name);
 
 #ifdef __cplusplus
 }
index 7311d40..a7558ab 100644 (file)
 
 typedef struct {
        char *sender;
-       int client_fd;
+       int role;
+       int socket_fd;
 } bt_rfcomm_conn_info_t;
 
-static GSList *server_conn_list = NULL;
+static GSList *rfcomm_conn_list = NULL;
 
 static void __bt_rfcomm_reply_pending_request(int result,
                int service_function, void *user_data, unsigned int size)
@@ -51,8 +52,9 @@ static void __bt_rfcomm_reply_pending_request(int result,
        invocation_info_t *req_info;
 
        /* Get method invocation context */
-       for (l = _bt_get_invocation_list(); l != NULL; l = g_slist_next(l)) {
+       for (l = _bt_get_invocation_list(); l != NULL; ) {
                req_info = l->data;
+               l = g_slist_next(l);
                if (req_info == NULL || req_info->service_function != service_function)
                        continue;
 
@@ -254,17 +256,18 @@ int _bt_rfcomm_socket_listen(char *svc_name, char *uuid, bool accept)
        return sock_fd;
 }
 
-static bt_rfcomm_conn_info_t* __bt_find_server_from_list(const char *sender, int client_fd)
+static bt_rfcomm_conn_info_t* __bt_find_conn_from_list(const char *sender, int role, int socket_fd)
 {
        GSList *l;
        bt_rfcomm_conn_info_t *conn_info;
 
        retv_if(NULL == sender, NULL);
 
-       for (l = server_conn_list; l != NULL; l = g_slist_next(l)) {
+       for (l = rfcomm_conn_list; l != NULL; l = g_slist_next(l)) {
                conn_info = l->data;
                if (g_strcmp0(conn_info->sender, sender) == 0) {
-                       if (client_fd == conn_info->client_fd)
+                       if (socket_fd == conn_info->socket_fd &&
+                                role == conn_info->role)
                                return conn_info;
                }
        }
@@ -272,18 +275,18 @@ static bt_rfcomm_conn_info_t* __bt_find_server_from_list(const char *sender, int
        return NULL;
 }
 
-int _bt_rfcomm_server_conn_added(char *svc_name, int client_fd)
+int _bt_rfcomm_conn_added(char *svc_name, int role, int socket_fd)
 {
        bt_rfcomm_conn_info_t *conn_info = NULL;
 
        retv_if(NULL == svc_name, BLUETOOTH_ERROR_INVALID_PARAM);
 
-       if (__bt_find_server_from_list(svc_name, client_fd) != NULL) {
-               BT_ERR("Client fd already exist");
+       if (__bt_find_conn_from_list(svc_name, role, socket_fd) != NULL) {
+               BT_ERR("Socket fd already exist");
                return BLUETOOTH_ERROR_INVALID_PARAM;
        }
 
-       BT_INFO("RFCOMM server is connected: [%s], [%d]", svc_name, client_fd);
+       BT_INFO("RFCOMM is connected: [%s], [%d], [%d]", svc_name, role, socket_fd);
 
        conn_info = g_malloc0(sizeof(bt_rfcomm_conn_info_t));
 
@@ -293,51 +296,53 @@ int _bt_rfcomm_server_conn_added(char *svc_name, int client_fd)
        _bt_start_connect_time();
 
        conn_info->sender = g_strdup(svc_name);
-       conn_info->client_fd = client_fd;
+       conn_info->role = role;
+       conn_info->socket_fd = socket_fd;
 
-       server_conn_list = g_slist_append(server_conn_list, conn_info);
+       rfcomm_conn_list = g_slist_append(rfcomm_conn_list, conn_info);
 
        return BLUETOOTH_ERROR_NONE;
 }
 
-int _bt_rfcomm_server_conn_removed(char *svc_name, int client_fd)
+int _bt_rfcomm_conn_removed(char *svc_name, int role, int socket_fd)
 {
        bt_rfcomm_conn_info_t *conn_info = NULL;
 
        retv_if(NULL == svc_name, BLUETOOTH_ERROR_INVALID_PARAM);
 
-       BT_INFO("RFCOMM server is disconnected: [%s], [%d]", svc_name, client_fd);
+       BT_INFO("RFCOMM is connected: [%s], [%d], [%d]", svc_name, role, socket_fd);
 
        /* Find the first connection */
-       conn_info = __bt_find_server_from_list(svc_name, client_fd);
+       conn_info = __bt_find_conn_from_list(svc_name, role, socket_fd);
 
        if (conn_info == NULL) {
-               BT_ERR("No client fd is in list");
+               BT_ERR("No socket fd is in list");
                return BLUETOOTH_ERROR_INVALID_PARAM;
        }
 
        _bt_stop_connect_time();
 
-       server_conn_list = g_slist_remove(server_conn_list, conn_info);
+       rfcomm_conn_list = g_slist_remove(rfcomm_conn_list, conn_info);
        g_free(conn_info->sender);
        g_free(conn_info);
 
        return BLUETOOTH_ERROR_NONE;
 }
 
-void _bt_rfcomm_server_check_termination(const char *name)
+void _bt_rfcomm_check_termination(const char *name)
 {
        GSList *l;
        bt_rfcomm_conn_info_t *conn_info = NULL;
 
        ret_if(NULL == name);
 
-       for (l = server_conn_list; l != NULL; ) {
+       for (l = rfcomm_conn_list; l != NULL; ) {
                conn_info = l->data;
                l = g_slist_next(l);
                if (g_strcmp0(conn_info->sender, name) == 0) {
-                       _bt_rfcomm_server_conn_removed((char *)name,
-                                               conn_info->client_fd);
+                       _bt_rfcomm_conn_removed((char *)name,
+                                               conn_info->role,
+                                               conn_info->socket_fd);
                }
        }
 
@@ -345,14 +350,14 @@ void _bt_rfcomm_server_check_termination(const char *name)
        _bt_unregister_osp_server_in_agent_by_sender(name);
 }
 
-static void __bt_free_server_conn(bt_rfcomm_conn_info_t *conn_info)
+static void __bt_free_rfcomm_conn(bt_rfcomm_conn_info_t *conn_info)
 {
        g_free(conn_info->sender);
        g_free(conn_info);
 }
 
-void _bt_rfcomm_server_all_conn_removed(void)
+void _bt_rfcomm_all_conn_removed(void)
 {
-       g_slist_free_full(server_conn_list, (GDestroyNotify)__bt_free_server_conn);
-       server_conn_list = NULL;
+       g_slist_free_full(rfcomm_conn_list, (GDestroyNotify)__bt_free_rfcomm_conn);
+       rfcomm_conn_list = NULL;
 }
index de99945..febada4 100644 (file)
@@ -336,7 +336,7 @@ typedef enum {
        BT_RFCOMM_REMOVE_SOCKET_EX,
        BT_RFCOMM_SEND_RX_DETAILS,
        BT_RFCOMM_SEND_TX_DETAILS,
-       BT_RFCOMM_SERVER_UPDATE_CONNECTION_INFO,
+       BT_RFCOMM_UPDATE_CONNECTION_INFO,
        BT_PBAP_CONNECT = BT_FUNC_PBAP_BASE,
        BT_PBAP_DISCONNECT,
        BT_PBAP_GET_PHONEBOOK_SIZE,