Add the status check logic for BT enable / disable method
[platform/core/connectivity/bluetooth-frwk.git] / bt-service-adaptation / services / adapter / bt-service-core-adapter.c
index 581c1b6..26148dc 100644 (file)
@@ -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);