X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bt-service-adaptation%2Fservices%2Fadapter%2Fbt-service-core-adapter.c;h=26148dc424cfa6e23930958d826514dad17f2ae7;hb=fe4f8a1ad930daab9e7f8f5250b03ff9deb84f81;hp=581c1b63489e9fc7b55b1febd0ce476af5939cea;hpb=492d0bd778071736cdf4caeb4a7ad77aeb1d8786;p=platform%2Fcore%2Fconnectivity%2Fbluetooth-frwk.git diff --git a/bt-service-adaptation/services/adapter/bt-service-core-adapter.c b/bt-service-adaptation/services/adapter/bt-service-core-adapter.c index 581c1b6..26148dc 100644 --- a/bt-service-adaptation/services/adapter/bt-service-core-adapter.c +++ b/bt-service-adaptation/services/adapter/bt-service-core-adapter.c @@ -48,6 +48,7 @@ #include "bt-service-dpm.h" #endif #include "bt-service-hidhost.h" +#include "bt-service-hiddevice.h" #include "bt-service-socket.h" #include "bt-service-hdp.h" @@ -76,7 +77,7 @@ static bt_adapter_timer_t visible_timer; static guint timer_id = 0; -static gboolean a2dp_init_pending = FALSE; +static gboolean a2dp_init_pending = TRUE; /* Adapter default states */ static bt_status_t adapter_state = BT_DEACTIVATED; @@ -135,6 +136,29 @@ int _bt_stack_init(void) int _bt_enable_adapter(void) { + bt_le_status_t le_status = BT_LE_DEACTIVATED; + + le_status = _bt_adapter_get_le_status(); + + BT_INFO("Current state [%d], LE [%d]", adapter_state, le_status); + + if (adapter_state == BT_ACTIVATING || le_status == BT_LE_ACTIVATING) { + BT_ERR("Enabling in progress"); + return BLUETOOTH_ERROR_IN_PROGRESS; + } + + if (adapter_state == BT_ACTIVATED) { + BT_ERR("Already enabled"); + return BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED; + } + + if (adapter_state == BT_DEACTIVATING || + adapter_state == BT_TERMINATING || + le_status == BT_LE_DEACTIVATING) { + BT_ERR("Disabling in progress"); + return BLUETOOTH_ERROR_DEVICE_BUSY; + } + return __bt_adapter_state_handle_request(TRUE); } @@ -188,6 +212,32 @@ int _bt_check_adapter(int *status) int _bt_disable_adapter(void) { + bt_le_status_t le_status = BT_LE_DEACTIVATED; + + le_status = _bt_adapter_get_le_status(); + + BT_INFO("Current state [%d], LE [%d]", adapter_state, le_status); + + if (adapter_state == BT_DEACTIVATING || + adapter_state == BT_TERMINATING || + le_status == BT_LE_DEACTIVATING) { + BT_DBG("Disabling in progress"); + return BLUETOOTH_ERROR_IN_PROGRESS; + } + + if (adapter_state == BT_DEACTIVATED) { + BT_DBG("Already disabled"); + return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED; + } + + if (adapter_state == BT_ACTIVATING || le_status == BT_LE_ACTIVATING) { + BT_ERR("Enabling in progress"); + return BLUETOOTH_ERROR_DEVICE_BUSY; + } + + /* TODO: Need to add the function to disconnect all devices */ + /* __bt_disconnect_all(); */ + return __bt_adapter_state_handle_request(FALSE); } @@ -744,40 +794,33 @@ int _bt_get_profile_connected_devices(char *profile_uuid, GArray **addr_list) return BLUETOOTH_ERROR_NONE; } -static void __bt_handle_pending_a2dp_init(service_uuid_t *service_list, unsigned int count) +static void __bt_handle_pending_a2dp_init(unsigned int a2dp_role) { int ret; - unsigned int i; - unsigned char *uuid; - char uuid_str[BT_UUID_STRING_SIZE]; if (!a2dp_init_pending) return; BT_DBG("+"); a2dp_init_pending = FALSE; - for (i = 0; i < count; i++) { - uuid = service_list[i].uuid; - _bt_service_convert_uuid_type_to_string(uuid_str, uuid); - BT_INFO("Adapter Service: [%s]", uuid_str); - if (!strcasecmp(uuid_str, A2DP_SINK_UUID)) { - BT_INFO("Enable A2DP Sink role"); - /* Initialize A2DP Sink */ - ret = _bt_audio_initialize(BT_A2DP_SINK_MODULE); - if (ret != BLUETOOTH_ERROR_NONE) - BT_ERR("_bt_audio_initialize(BT_A2DP_SINK_MODULE) Failed"); - - /* Initialize AVRCP Controller */ - ret = _bt_audio_initialize(BT_AVRCP_CTRL_MODULE); - if (ret != BLUETOOTH_ERROR_NONE) - BT_ERR("_bt_audio_initialize(BT_AVRCP_CTRL_MODULE) Failed"); - - _bt_audio_set_current_role(BLUETOOTH_A2DP_SINK); - return; - } + + if (a2dp_role == BT_A2DP_SINK_ROLE) { + BT_INFO("Enable A2DP Sink role"); + /* Initialize A2DP Sink */ + ret = _bt_audio_initialize(BT_A2DP_SINK_MODULE); + if (ret != BLUETOOTH_ERROR_NONE) + BT_ERR("_bt_audio_initialize(BT_A2DP_SINK_MODULE) Failed"); + + /* Initialize AVRCP Controller */ + ret = _bt_audio_initialize(BT_AVRCP_CTRL_MODULE); + if (ret != BLUETOOTH_ERROR_NONE) + BT_ERR("_bt_audio_initialize(BT_AVRCP_CTRL_MODULE) Failed"); + + _bt_audio_set_current_role(BLUETOOTH_A2DP_SINK); + return; } - BT_INFO("Enable A2DP Source role by default"); + BT_INFO("Enable A2DP Source role"); /* Initialize A2DP Source */ ret = _bt_audio_initialize(BT_A2DP_SOURCE_MODULE); if (ret != BLUETOOTH_ERROR_NONE) @@ -927,7 +970,6 @@ static void __bt_adapter_event_handler(int event_type, gpointer event_data) count = list->num; service_list = list->service_list; - __bt_handle_pending_a2dp_init(service_list, count); __bt_adapter_handle_pending_requests(BT_IS_SERVICE_USED, service_list, count); break; } @@ -951,6 +993,15 @@ static void __bt_adapter_event_handler(int event_type, gpointer event_data) g_free(addr_list); break; } + case OAL_EVENT_ADAPTER_PROPERTY_A2DP_ROLE: { + unsigned int *a2dp_role = event_data; + + BT_INFO("a2dp role: [%u]", *a2dp_role); + + __bt_handle_pending_a2dp_init(*a2dp_role); + + break; + } default: BT_ERR("Unhandled event.."); break; @@ -969,21 +1020,14 @@ int _bt_init_profiles() if (ret != BLUETOOTH_ERROR_NONE) BT_ERR("_bt_hidhost_initialize Failed"); + ret = _bt_hiddevice_initialize(); + if (ret != BLUETOOTH_ERROR_NONE) + BT_ERR("_bt_hiddevice_initialize Failed"); + ret = _bt_socket_init(); if (ret != BLUETOOTH_ERROR_NONE) BT_ERR("_bt_socket_init Failed"); - /* - * Query local adapter services and based on a2dp service uuids initialized - * in bluetooth stack, enable A2DP sourec or A2DP sink role. - */ - ret = adapter_get_service_uuids(); - if (ret != OAL_STATUS_SUCCESS) - BT_ERR("adapter_get_service_uuids failed: %d", ret); - else - a2dp_init_pending = TRUE; - - /* Initialize HFP Audio Gateway */ ret = _bt_audio_initialize(BT_AG_MODULE); if (ret != BLUETOOTH_ERROR_NONE) @@ -1023,6 +1067,8 @@ int _bt_cleanup_profiles(void) //_bt_audio_deinitialize(BT_AG_MODULE); //_bt_audio_deinitialize(BT_AVRCP_CTRL_MODULE); //_bt_audio_deinitialize(BT_AUDIO_ALL_MODULE); + + a2dp_init_pending = TRUE; #endif _bt_hdp_deinit(); _bt_gatt_deinit(); @@ -1243,8 +1289,6 @@ static void __bt_adapter_update_bt_enabled(void) /* TODO:Add timer function to handle any further post processing */ g_idle_add((GSourceFunc)__bt_adapter_post_set_enabled, NULL); - /*Return BT_ADAPTER_ENABLE Method invocation context */ - __bt_adapter_handle_pending_requests(BT_ENABLE_ADAPTER, NULL, 0); /*Send BT Enabled event to application */ _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_ENABLED, g_variant_new("(i)", result)); @@ -1275,9 +1319,6 @@ static void __bt_adapter_update_bt_disabled(void) /* TODO:Add timer function to handle any further post processing */ g_idle_add((GSourceFunc)__bt_adapter_post_set_disabled, NULL); - /* Return BT_ADAPTER_DISABLE Method invocation context */ - __bt_adapter_handle_pending_requests(BT_DISABLE_ADAPTER, NULL, 0); - /* Send BT Disabled event to application */ _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_DISABLED, g_variant_new("(i)", result)); @@ -1301,7 +1342,7 @@ static void __bt_adapter_state_change_callback(int bt_status) switch (bt_status) { case BT_DEACTIVATED: - __bt_adapter_state_set_status(bt_status); + __bt_adapter_state_set_status(BT_TERMINATING); /* Adapter is disabled, unregister event handlers */ _bt_service_unregister_event_handler_callback(BT_ADAPTER_MODULE); @@ -1342,30 +1383,11 @@ static int __bt_adapter_state_handle_request(gboolean enable) BT_DBG(""); switch (adapter_state) { - case BT_ACTIVATING: { - BT_INFO("Adapter is currently in activating state, state [%d]", - adapter_state); - if (enable) { - return BLUETOOTH_ERROR_IN_PROGRESS; - } else { - if (adapter_discovery_state == ADAPTER_DISCOVERY_STARTED || - adapter_discovery_state == ADAPTER_DISCOVERY_STARTING) { - /*TODO Stop Discovery*/ - __bt_adapter_update_discovery_status(FALSE); - } - result = adapter_disable(); - if (result != OAL_STATUS_SUCCESS) { - BT_ERR("adapter_enable failed: [%d]", result); - result = BLUETOOTH_ERROR_INTERNAL; - /*TODO: perform if anything more needs to be done to handle failure */ - } else { - /* TODO: To be handled */ - __bt_adapter_state_set_status(BT_DEACTIVATING); - result = BLUETOOTH_ERROR_NONE; - } - } + case BT_ACTIVATING: + case BT_DEACTIVATING: + BT_INFO("Should not be callded : state [%d]", adapter_state); + return BLUETOOTH_ERROR_INTERNAL; break; - } case BT_ACTIVATED: { BT_INFO("Adapter is currently in activated state, state [%d]", adapter_state); @@ -1390,27 +1412,6 @@ static int __bt_adapter_state_handle_request(gboolean enable) } break; } - case BT_DEACTIVATING: { - BT_INFO("Adapter is currently in deactivating state, state [%d]", - adapter_state); - if (!enable) { - return BLUETOOTH_ERROR_IN_PROGRESS; - - } else { - result = adapter_enable(); - if (result != OAL_STATUS_SUCCESS && result != OAL_STATUS_PENDING) { - BT_ERR("adapter_enable failed: [%d]", result); - adapter_disable(); - result = BLUETOOTH_ERROR_INTERNAL; - /*TODO: perform if anything more needs to be done to handle failure */ - } else { - /* TODO: To be handled */ - __bt_adapter_state_set_status(BT_ACTIVATING); - result = BLUETOOTH_ERROR_NONE; - } - } - break; - } case BT_DEACTIVATED: { BT_INFO("Adapter is currently in deactivated state, state [%d]", adapter_state);