Adapt device disconnect to BT HAL framework
[platform/core/connectivity/bluetooth-frwk.git] / bt-service-adaptation / services / device / bt-service-core-device.c
index e694ceb..dc7337d 100644 (file)
@@ -166,7 +166,7 @@ static void __bt_device_handle_bond_completion_event(bt_address_t *bd_addr);
 static void __bt_device_handle_bond_removal_event(bt_address_t *bd_addr);
 static void __bt_device_handle_bond_failed_event(event_dev_bond_failed_t* bond_fail_event);
 static void __bt_handle_ongoing_bond(bt_remote_dev_info_t *remote_dev_info, gboolean incoming_bond);
-static void __bt_device_conn_state_changed_callback(event_dev_conn_status_t *acl_event,
+static void __bt_device_acl_state_changed_callback(event_dev_conn_status_t *acl_event,
                gboolean connected, unsigned char type);
 static void __bt_free_pairing_info(bt_pairing_data_t **p_info);
 
@@ -207,8 +207,9 @@ void __bt_device_handle_pending_requests(int result, int service_function,
        BT_DBG("+");
 
        /* 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;
 
@@ -599,7 +600,14 @@ static void __bt_device_authorization_request_callback(event_dev_authorize_req_t
 #ifdef TIZEN_FEATURE_BT_OBEX
        case OPP_SERVICE_ID: {
                GVariant *param = NULL;
-               char *name = g_strdup(address); /* TODO: Retrieve and send correct name in OBEX conn auth req event */
+               char *name = NULL;
+
+               if (_bt_obex_server_is_custom() == false) {
+                       /* Allow the connection for native OPP server */
+                       break;
+               }
+
+               name = g_strdup(address);
 
                BT_INFO("Incoming OPP conn Req from device addr [%s]", address);
                _bt_obex_server_set_pending_conn_auth_device_addr(address);
@@ -964,23 +972,23 @@ static void __bt_device_event_handler(int event_type, gpointer event_data)
        case OAL_EVENT_DEVICE_ACL_CONNECTED: {
                BT_INFO("ACL Connected event Received");
                event_dev_conn_status_t* param = event_data;
-               __bt_device_conn_state_changed_callback(param, TRUE, 0);
+               __bt_device_acl_state_changed_callback(param, TRUE, 0);
                break;
        }
        case OAL_EVENT_DEVICE_ACL_DISCONNECTED: {
                BT_INFO("ACL Disconnected event Received");
-               __bt_device_conn_state_changed_callback((event_dev_conn_status_t *)event_data, FALSE, 0);
+               __bt_device_acl_state_changed_callback((event_dev_conn_status_t *)event_data, FALSE, 0);
                break;
        }
        case OAL_EVENT_DEVICE_LE_CONNECTED: {
                BT_INFO("LE Connected event Received");
                event_dev_conn_status_t* param = event_data;
-               __bt_device_conn_state_changed_callback(param, TRUE, 1);
+               __bt_device_acl_state_changed_callback(param, TRUE, 1);
                break;
        }
        case OAL_EVENT_DEVICE_LE_DISCONNECTED: {
                BT_INFO("LE Disconnected event Received");
-               __bt_device_conn_state_changed_callback((event_dev_conn_status_t *)event_data, FALSE, 1);
+               __bt_device_acl_state_changed_callback((event_dev_conn_status_t *)event_data, FALSE, 1);
                break;
        }
        case OAL_EVENT_DEVICE_PIN_REQUEST: {
@@ -1116,6 +1124,7 @@ static void __bt_device_pin_request_callback(remote_device_t* pin_req_event)
        GVariant *param;
        char address[BT_ADDRESS_STRING_SIZE];
        char pin_code[BLUETOOTH_PIN_CODE_MAX_LENGTH + 1];
+       bool incoming = false;
        BT_DBG("+");
 
        _bt_convert_addr_type_to_string(address, pin_req_event->address.addr);
@@ -1152,7 +1161,11 @@ static void __bt_device_pin_request_callback(remote_device_t* pin_req_event)
                device_accept_pin_request(&pin_req_event->address, str_passkey);
 
                BT_DBG("Send BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY");
-               param = g_variant_new("(isss)", BLUETOOTH_ERROR_NONE, address, pin_req_event->name, str_passkey);
+
+               if(trigger_bond_info == NULL)
+                       incoming = true;
+
+               param = g_variant_new("(bsss)", incoming, address, pin_req_event->name, str_passkey);
                _bt_send_event(BT_ADAPTER_EVENT,
                                BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY, param);
                BT_DBG("Key board pairing in process");
@@ -1167,7 +1180,11 @@ static void __bt_device_pin_request_callback(remote_device_t* pin_req_event)
                        trigger_pairing_info->is_ssp = FALSE;
 
                        BT_DBG("Send BLUETOOTH_EVENT_PIN_REQUEST");
-                       param = g_variant_new("(iss)", BLUETOOTH_ERROR_NONE, address, pin_req_event->name);
+
+                       if(trigger_bond_info == NULL)
+                               incoming = true;
+
+                       param = g_variant_new("(bss)", incoming, address, pin_req_event->name);
                        _bt_send_event(BT_ADAPTER_EVENT,
                                        BLUETOOTH_EVENT_PIN_REQUEST, param);
                }
@@ -1185,7 +1202,8 @@ static void __bt_device_ssp_passkey_entry_callback(remote_device_t* dev_info)
        gchar address[BT_ADDRESS_STR_LEN];
        char *p_addr;
        gchar *name;
-       int result = BLUETOOTH_ERROR_NONE;
+       bool incoming = false;
+
        BT_DBG("+");
 
        _bt_convert_addr_type_to_string(address, dev_info->address.addr);
@@ -1210,7 +1228,10 @@ static void __bt_device_ssp_passkey_entry_callback(remote_device_t* dev_info)
        trigger_pairing_info->addr = g_strdup(address);
        trigger_pairing_info->is_ssp = TRUE;
 
-       param = g_variant_new("(iss)", result, p_addr, name);
+       if(trigger_bond_info == NULL)
+               incoming = true;
+
+       param = g_variant_new("(bss)", incoming, p_addr, name);
        _bt_send_event(BT_ADAPTER_EVENT,
                        BLUETOOTH_EVENT_PASSKEY_REQUEST, param);
        BT_DBG("-");
@@ -1223,7 +1244,7 @@ static void __bt_device_ssp_passkey_confirmation_callback(event_dev_passkey_t *d
        char *p_addr;
        gchar *name;
        char str_passkey[7];
-       int result = BLUETOOTH_ERROR_NONE;
+       bool incoming = false; /*Stores if bonding request is incoming(true) or outgoing(false) */
        BT_DBG("+");
 
        _bt_convert_addr_type_to_string(address, dev_info->device_info.address.addr);
@@ -1251,7 +1272,11 @@ static void __bt_device_ssp_passkey_confirmation_callback(event_dev_passkey_t *d
        BT_DBG("Send BLUETOOTH_EVENT_PASSKEY_CONFIRMATION");
        snprintf(str_passkey, sizeof(str_passkey), "%.6d", dev_info->pass_key);
 
-       param = g_variant_new("(isss)", result, p_addr, name, str_passkey);
+       /*Storing if bond is incoming or outgoing*/
+       if(trigger_bond_info == NULL)
+               incoming = true;
+
+       param = g_variant_new("(bsss)", incoming, p_addr, name, str_passkey);
        _bt_send_event(BT_ADAPTER_EVENT,
                        BLUETOOTH_EVENT_PASSKEY_CONFIRM_REQUEST, param);
        BT_DBG("-");
@@ -1264,7 +1289,7 @@ static void __bt_device_ssp_passkey_display_callback(event_dev_passkey_t *dev_in
        char *p_addr;
        gchar *name;
        char str_passkey[7];
-       int result = BLUETOOTH_ERROR_NONE;
+       bool incoming = false;
        BT_DBG("+");
 
        _bt_convert_addr_type_to_string(address, dev_info->device_info.address.addr);
@@ -1292,7 +1317,11 @@ static void __bt_device_ssp_passkey_display_callback(event_dev_passkey_t *dev_in
        BT_DBG("Send BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY");
        snprintf(str_passkey, sizeof(str_passkey), "%06d", dev_info->pass_key);
 
-       param = g_variant_new("(isss)", result, p_addr, name, str_passkey);
+       if(trigger_bond_info == NULL)
+               incoming = true;
+
+        param = g_variant_new("(bsss)", incoming, p_addr, name, str_passkey);
+
        if (passkey_watcher) {
                BT_INFO("Send passkey to %s", passkey_watcher);
                _bt_send_event_to_dest(passkey_watcher, BT_ADAPTER_EVENT,
@@ -1343,7 +1372,38 @@ static void __bt_device_ssp_consent_callback(remote_device_t* dev_info)
        BT_DBG("-");
 }
 
-static void __bt_device_conn_state_changed_callback(event_dev_conn_status_t *acl_event,
+static int __bt_oal_status_to_bt_error(int oal_status)
+{
+        int ret = 0;
+
+       switch (oal_status) {
+       case OAL_STATUS_SUCCESS:
+               ret = BLUETOOTH_ERROR_NONE;
+               break;
+       case OAL_STATUS_CONN_TIMEOUT:
+       case OAL_STATUS_LINK_LOSS:
+               BT_INFO("Connection Timeout");
+               ret = BLUETOOTH_ERROR_CONNECTION_TIMEOUT;
+               break;
+#ifdef TIZEN_BT_HAL
+       case OAL_STATUS_CONN_TERM_LOCAL_HOST:
+               ret = BLUETOOTH_ERROR_LOCAL_HOST_TERM;
+               break;
+       case OAL_STATUS_CONN_TERM_RMT_HOST:
+               ret = BLUETOOTH_ERROR_REMOTE_USER_TERM;
+               break;
+#endif
+       case OAL_STATUS_INTERNAL_ERROR:
+               ret = BLUETOOTH_ERROR_INTERNAL;
+               break;
+       default:
+               ret = BLUETOOTH_ERROR_INTERNAL;
+               break;
+       }
+       return ret;
+}
+
+static void __bt_device_acl_state_changed_callback(event_dev_conn_status_t *acl_event,
                gboolean connected, unsigned char type)
 {
        gchar address[BT_ADDRESS_STR_LEN];
@@ -1356,6 +1416,9 @@ static void __bt_device_conn_state_changed_callback(event_dev_conn_status_t *acl
 
        _bt_logging_connection(connected, type);
 
+       result = __bt_oal_status_to_bt_error(acl_event->status);
+       BT_INFO("Result [0x%x]", result);
+
        if (connected) {
                param = g_variant_new("(isy)", result, address, type);
                _bt_send_event(BT_DEVICE_EVENT,
@@ -2431,4 +2494,22 @@ fail:
        return ret;
 }
 
+int _bt_disconnect_device(bluetooth_device_address_t *device_address)
+{
+       int result = OAL_STATUS_SUCCESS;
+
+       BT_DBG("+");
+
+       retv_if(!device_address, BLUETOOTH_ERROR_INVALID_PARAM);
+
+       result = device_disconnect((bt_address_t *)device_address);
+       if (result != OAL_STATUS_SUCCESS) {
+               BT_DBG("Failed to disconnect device");
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       BT_DBG("-");
+       return BLUETOOTH_ERROR_NONE;
+}
+
 #endif