+
+int _bt_service_set_alarm(int timeout, bt_set_alarm_cb call_back, void *user_data, alarm_id_t *alarm_id)
+{
+ int result = BLUETOOTH_ERROR_NONE;
+ bt_service_alarm_t *alarm = NULL;
+
+ if (!call_back || !alarm_id)
+ return BLUETOOTH_ERROR_INVALID_PARAM;
+
+ if (!alarm_mgr.is_alarm_initialized) {
+ result = alarmmgr_init("bt-service");
+ if (result != 0) {
+ BT_ERR("Failed to initialize alarm = %d", result);
+ result = BLUETOOTH_ERROR_INTERNAL;
+ goto finish;
+ }
+ result = alarmmgr_set_cb(alarm_cb, NULL);
+ if (result != 0) {
+ BT_ERR("Failed to set the callback = %d", result);
+ result = BLUETOOTH_ERROR_INTERNAL;
+ goto finish;
+ }
+ alarm_mgr.is_alarm_initialized = TRUE;
+ }
+
+ alarm = g_malloc0(sizeof(bt_service_alarm_t));
+ if (!alarm)
+ return BLUETOOTH_ERROR_MEMORY_ALLOCATION;
+
+ result = alarmmgr_add_alarm(ALARM_TYPE_VOLATILE, timeout,
+ 0, NULL, alarm_id);
+ if (result != 0) {
+ BT_ERR("Failed to create alarm error = %d", result);
+ result = BLUETOOTH_ERROR_INTERNAL;
+ g_free(alarm);
+ goto finish;
+ }
+ alarm->alarm_id = *alarm_id;
+ alarm->callback = call_back;
+ alarm->user_data = user_data;
+
+ alarm_mgr.g_alarm_list = g_list_append(alarm_mgr.g_alarm_list, alarm);
+ result = BLUETOOTH_ERROR_NONE;
+finish:
+ return result;
+}
+
+static int alarm_cb(alarm_id_t alarm_id, void* user_param)
+{
+ GList *node = NULL;
+ bt_service_alarm_t *p_data;
+ bt_set_alarm_cb callback = NULL;
+ void *user_data = NULL;
+
+ node = g_list_find_custom(alarm_mgr.g_alarm_list,
+ GINT_TO_POINTER(alarm_id), compare_alarm);
+ if (!node)
+ return 0;
+
+ p_data = (bt_service_alarm_t *)node->data;
+ alarm_mgr.g_alarm_list = g_list_delete_link(alarm_mgr.g_alarm_list,
+ node);
+
+ if (!p_data)
+ return 0;
+
+ callback = p_data->callback;
+ user_data = p_data->user_data;
+ g_free(p_data);
+
+ if (callback)
+ callback(alarm_id, user_data);
+
+ return 0;
+}
+
+int _bt_service_remove_alarm(alarm_id_t alarm_id)
+{
+ GList *list = NULL;
+ bt_service_alarm_t *p_data;
+ list = g_list_find_custom(alarm_mgr.g_alarm_list, GINT_TO_POINTER(alarm_id), compare_alarm);
+
+ if (list != NULL) {
+ alarmmgr_remove_alarm(alarm_id);
+ p_data = (bt_service_alarm_t *)list->data;
+ alarm_mgr.g_alarm_list = g_list_remove(alarm_mgr.g_alarm_list, list->data);
+ g_free(p_data);
+ }
+
+ return 0;
+}
+
+gint compare_alarm(gconstpointer list_data, gconstpointer data)
+{
+ alarm_id_t alarm_id = (alarm_id_t)data;
+ bt_service_alarm_t *p_data = (bt_service_alarm_t *)list_data;
+
+ if (p_data->alarm_id == alarm_id)
+ return 0;
+
+ return 1;
+}
+
+static void alarm_data_free(void *data)
+{
+ bt_service_alarm_t *p_data = (bt_service_alarm_t *)data;
+ g_free(p_data);
+ return;
+}
+
+static gboolean _bt_adapter_request_delayed_cb(gpointer user_data)
+{
+ int result;
+ int function = (int)user_data;
+
+ switch (function) {
+ case BT_ENABLE_ADAPTER:
+ result = _bt_enable_adapter();
+ if (result != BLUETOOTH_ERROR_NONE) {
+ BT_ERR("_bt_enable_adapter is failed");
+ /* Send enabled event to API */
+ _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_ENABLED,
+ g_variant_new("(i)", result));
+ }
+ break;
+ case BT_DISABLE_ADAPTER:
+ result = _bt_disable_adapter();
+ if (result != BLUETOOTH_ERROR_NONE) {
+ BT_ERR("_bt_disable_adapter is failed");
+ /* Send disabled event to API */
+ _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_DISABLED,
+ g_variant_new("(i)", result));
+ }
+ break;
+ default:
+ BT_ERR("function is NOT matched");
+ break;
+ }
+
+ return FALSE;
+}
+
+int _bt_adapter_request_delayed(int function)
+{
+ int ret;
+
+ switch (function) {
+ case BT_ENABLE_ADAPTER:
+ ret = _bt_enable_adapter_check_status();
+ if (ret == BLUETOOTH_ERROR_NONE)
+ _bt_adapter_set_status(BT_ACTIVATING);
+ else
+ return ret;
+
+ break;
+ case BT_DISABLE_ADAPTER:
+ ret = _bt_disable_adapter_check_status();
+ if (ret == BLUETOOTH_ERROR_NONE)
+ _bt_adapter_set_status(BT_DEACTIVATING);
+ else
+ return ret;
+
+ break;
+ default:
+ BT_ERR("function is NOT matched");
+ return BLUETOOTH_ERROR_INTERNAL;
+ }
+
+ g_idle_add((GSourceFunc)_bt_adapter_request_delayed_cb, (void*)function);
+
+ return BLUETOOTH_ERROR_NONE;
+}
+
+