2 * Copyright (c) 2015 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Contact: Anupam Roy <anupam.r@samsung.com>
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
26 #include <vconf-internal-keys.h>
27 #include <syspopup_caller.h>
29 #include <eventsystem.h>
30 #include <bundle_internal.h>
34 /*bt-service headers */
35 #include "bt-internal-types.h"
36 #include "bt-service-common.h"
37 #include "bt-service-util.h"
38 #include "bt-service-main.h"
39 #include "bt-service-core-adapter.h"
40 #include "bt-service-core-device.h"
41 #include "bt-service-event-receiver.h"
42 #include "bt-request-handler.h"
43 #include "bt-service-event.h"
44 #ifdef TIZEN_DPM_ENABLE
45 #include "bt-service-dpm.h"
47 #include "bt-service-hidhost.h"
48 #include "bt-service-socket.h"
51 #include <oal-event.h>
52 #include <oal-manager.h>
53 #include <oal-adapter-mgr.h>
55 #define BT_ENABLE_TIMEOUT 20000 /* 20 seconds */
57 /*This file will contain state machines related to adapter and remote device */
59 /* Global variables */
68 static bt_adapter_timer_t visible_timer;
70 static guint timer_id = 0;
72 /* Adapter default states */
73 static bt_status_t adapter_state = BT_DEACTIVATED;
74 static bt_adapter_discovery_state_t adapter_discovery_state = ADAPTER_DISCOVERY_STOPPED;
76 /* Forward declarations */
77 static void __bt_adapter_event_handler(int event_type, gpointer event_data);
78 static void __bt_post_oal_init(void);
79 static void __bt_handle_oal_initialisation(oal_event_t event);
80 static void __bt_adapter_handle_pending_requests(int service_function, void *user_data, unsigned int size);
81 static gboolean __bt_adapter_post_set_enabled(gpointer user_data);
82 static gboolean __bt_adapter_post_set_disabled(gpointer user_data);
83 static void __bt_adapter_update_bt_enabled(void);
84 static void __bt_adapter_update_bt_disabled(void);
85 static void __bt_adapter_state_set_status(bt_status_t status);
86 static void __bt_adapter_update_discovery_status(bt_adapter_discovery_state_t status);
87 static void __bt_adapter_state_change_callback(int bt_status);
88 static int __bt_adapter_state_handle_request(gboolean enable);
89 static int __bt_adapter_state_discovery_request(gboolean enable);
90 static void __bt_adapter_discovery_state_change_callback(int bt_discovery_status);
91 static gboolean __bt_is_service_request_present(int service_function);
93 static void __bt_set_visible_mode(void);
95 static void __bt_set_local_name(void);
97 /* Initialize BT stack (Initialize OAL layer) */
98 int _bt_stack_init(void)
102 BT_INFO("[bt-service] Start to initialize BT stack");
103 /* Adapter enable request is successful, setup event handlers */
104 _bt_service_register_event_handler_callback(
105 BT_ADAPTER_MODULE, __bt_adapter_event_handler);
107 ret = oal_bt_init(_bt_service_oal_event_receiver);
109 if (OAL_STATUS_PENDING == ret) {
110 BT_INFO("OAL Initialisation Pending, Profiles Init will be done once oal initialised...");
111 return BLUETOOTH_ERROR_NONE;
112 } else if (OAL_STATUS_SUCCESS != ret) {
113 _bt_service_unregister_event_handler_callback(BT_ADAPTER_MODULE);
114 return BLUETOOTH_ERROR_INTERNAL;
117 __bt_post_oal_init();
118 return BLUETOOTH_ERROR_NONE;
121 int _bt_enable_adapter(void)
123 return __bt_adapter_state_handle_request(TRUE);
126 int _bt_disable_adapter(void)
128 return __bt_adapter_state_handle_request(FALSE);
132 int _bt_start_discovery(void)
134 return __bt_adapter_state_discovery_request(TRUE);
137 int _bt_cancel_discovery(void)
139 return __bt_adapter_state_discovery_request(FALSE);
142 gboolean _bt_is_discovering(void)
144 if (adapter_discovery_state == ADAPTER_DISCOVERY_STARTED
145 || adapter_discovery_state == ADAPTER_DISCOVERY_STARTING)
151 int _bt_get_local_address(void)
157 result = adapter_get_address();
158 if (result != OAL_STATUS_SUCCESS) {
159 BT_ERR("adapter_get_address failed: %d", result);
160 result = BLUETOOTH_ERROR_INTERNAL;
162 result = BLUETOOTH_ERROR_NONE;
168 int _bt_get_local_version(void)
173 result = adapter_get_version();
174 if (result != OAL_STATUS_SUCCESS) {
175 BT_ERR("adapter_get_address failed: %d", result);
176 result = BLUETOOTH_ERROR_INTERNAL;
178 result = BLUETOOTH_ERROR_NONE;
184 int _bt_get_local_name(void)
190 result = adapter_get_name();
191 if (result != OAL_STATUS_SUCCESS) {
192 BT_ERR("adapter_get_name failed: %d", result);
193 result = BLUETOOTH_ERROR_INTERNAL;
195 result = BLUETOOTH_ERROR_NONE;
201 int _bt_set_local_name(char *local_name)
203 int result = BLUETOOTH_ERROR_NONE;
206 retv_if(NULL == local_name, BLUETOOTH_ERROR_INVALID_PARAM);
208 result = adapter_set_name(local_name);
209 if (result != OAL_STATUS_SUCCESS) {
210 BT_ERR("adapter_set_name failed: %d", result);
211 result = BLUETOOTH_ERROR_INTERNAL;
213 result = BLUETOOTH_ERROR_NONE;
219 int _bt_get_discoverable_mode(int *mode)
226 retv_if(NULL == mode, BLUETOOTH_ERROR_INVALID_PARAM);
228 adapter_is_discoverable(&scan_mode);
229 if (TRUE == scan_mode) {
230 adapter_get_discoverable_timeout(&timeout);
232 *mode = BLUETOOTH_DISCOVERABLE_MODE_TIME_LIMITED_DISCOVERABLE;
234 *mode = BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE;
236 adapter_is_connectable(&scan_mode);
237 if(scan_mode == TRUE)
238 *mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
241 * TODO: NON CONNECTABLE is not defined in bluetooth_discoverable_mode_t.
242 * After adding BLUETOOTH_DISCOVERABLE_MODE_NON_CONNECTABLE, set mode as
243 * BLUETOOTH_DISCOVERABLE_MODE_NON_CONNECTABLE. Until then set -1.
250 return BLUETOOTH_ERROR_NONE;
253 int _bt_get_timeout_value(int *timeout)
258 /* Take current time */
260 time_diff = difftime(current_time, visible_timer.start_time);
262 BT_DBG("Time diff = %d\n", time_diff);
263 *timeout = visible_timer.timeout - time_diff;
265 return BLUETOOTH_ERROR_NONE;
268 static void __bt_visibility_alarm_remove()
270 if (visible_timer.event_id > 0) {
271 g_source_remove(visible_timer.event_id);
272 visible_timer.event_id = 0;
275 if (visible_timer.alarm_id > 0) {
276 alarmmgr_remove_alarm(visible_timer.alarm_id);
277 visible_timer.alarm_id = 0;
281 static int __bt_visibility_alarm_cb(alarm_id_t alarm_id, void* user_param)
283 int result = BLUETOOTH_ERROR_NONE;
286 BT_DBG("__bt_visibility_alarm_cb - alram id = [%d] \n", alarm_id);
288 if (alarm_id != visible_timer.alarm_id)
291 if (visible_timer.event_id) {
292 _bt_send_event(BT_ADAPTER_EVENT,
293 BLUETOOTH_EVENT_DISCOVERABLE_TIMEOUT_CHANGED,
294 g_variant_new("(in)", result, timeout));
295 g_source_remove(visible_timer.event_id);
296 visible_timer.event_id = 0;
297 visible_timer.timeout = 0;
299 #ifndef TIZEN_WEARABLE
300 if (vconf_set_int(BT_FILE_VISIBLE_TIME, 0) != 0)
301 BT_ERR("Set vconf failed\n");
304 /* Switch Off visibility in Bluez */
305 _bt_set_discoverable_mode(BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE, 0);
306 visible_timer.alarm_id = 0;
310 static gboolean __bt_timeout_handler(gpointer user_data)
312 int result = BLUETOOTH_ERROR_NONE;
316 /* Take current time */
318 time_diff = difftime(current_time, visible_timer.start_time);
320 /* Send event to application */
321 _bt_send_event(BT_ADAPTER_EVENT,
322 BLUETOOTH_EVENT_DISCOVERABLE_TIMEOUT_CHANGED,
323 g_variant_new("(in)", result, time_diff));
325 if (visible_timer.timeout <= time_diff) {
326 g_source_remove(visible_timer.event_id);
327 visible_timer.event_id = 0;
328 visible_timer.timeout = 0;
330 #ifndef TIZEN_WEARABLE
331 if (vconf_set_int(BT_FILE_VISIBLE_TIME, 0) != 0)
332 BT_ERR("Set vconf failed\n");
340 static void __bt_visibility_alarm_create()
345 result = alarmmgr_add_alarm(ALARM_TYPE_VOLATILE, visible_timer.timeout,
348 BT_ERR("Failed to create alarm error = %d\n", result);
350 BT_DBG("Alarm created = %d\n", alarm_id);
351 visible_timer.alarm_id = alarm_id;
355 static int __bt_set_visible_time(int timeout)
359 __bt_visibility_alarm_remove();
361 visible_timer.timeout = timeout;
363 #ifndef TIZEN_WEARABLE
364 #ifdef TIZEN_DPM_ENABLE
365 if (_bt_dpm_get_bluetooth_limited_discoverable_state() != DPM_RESTRICTED) {
367 if (vconf_set_int(BT_FILE_VISIBLE_TIME, timeout) != 0)
368 BT_ERR("Set vconf failed");
369 #ifdef TIZEN_DPM_ENABLE
375 return BLUETOOTH_ERROR_NONE;
377 if (!visible_timer.alarm_init) {
378 /* Set Alarm timer to switch off BT */
379 result = alarmmgr_init("bt-service");
381 return BLUETOOTH_ERROR_INTERNAL;
383 visible_timer.alarm_init = TRUE;
386 result = alarmmgr_set_cb(__bt_visibility_alarm_cb, NULL);
388 return BLUETOOTH_ERROR_INTERNAL;
390 /* Take start time */
391 time(&(visible_timer.start_time));
392 visible_timer.event_id = g_timeout_add_seconds(1,
393 __bt_timeout_handler, NULL);
395 __bt_visibility_alarm_create();
397 return BLUETOOTH_ERROR_NONE;
400 int _bt_set_discoverable_mode(int discoverable_mode, int timeout)
406 BT_INFO("discoverable_mode: %d, timeout: %d", discoverable_mode, timeout);
408 #ifdef TIZEN_DPM_ENABLE
409 if (discoverable_mode != BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE &&
410 _bt_dpm_get_bluetooth_limited_discoverable_state() == DPM_RESTRICTED) {
411 _bt_launch_dpm_popup("DPM_POLICY_DISABLE_BT_HANDSFREE");
412 return BLUETOOTH_ERROR_ACCESS_DENIED;
414 if (discoverable_mode != BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE &&
415 _bt_dpm_get_bluetooth_limited_discoverable_state() == DPM_RESTRICTED) {
416 _bt_launch_dpm_popup("DPM_POLICY_DISABLE_BT");
417 return BLUETOOTH_ERROR_ACCESS_DENIED;
421 switch (discoverable_mode) {
422 case BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE:
423 result = adapter_set_connectable(TRUE);
426 case BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE:
427 result = adapter_set_discoverable();
430 case BLUETOOTH_DISCOVERABLE_MODE_TIME_LIMITED_DISCOVERABLE:
431 result = adapter_set_discoverable();
434 return BLUETOOTH_ERROR_INVALID_PARAM;
437 if (result != OAL_STATUS_SUCCESS) {
438 BT_ERR("set scan mode failed %d", result);
439 return BLUETOOTH_ERROR_INTERNAL;
442 result = adapter_set_discoverable_timeout(timeout);
443 if (result != OAL_STATUS_SUCCESS) {
444 BT_ERR("adapter_set_discoverable_timeout failed %d", result);
445 return BLUETOOTH_ERROR_INTERNAL;
448 if (discoverable_mode == BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE)
451 result = __bt_set_visible_time(timeout);
457 gboolean _bt_is_connectable(void)
464 adapter_is_connectable(&connectable);
470 BT_DBG("Connectable: [%s]", result ? "TRUE":"FALSE");
475 int _bt_set_connectable(gboolean connectable)
477 int result = BLUETOOTH_ERROR_NONE;
480 result = adapter_set_connectable(connectable);
481 if (result != OAL_STATUS_SUCCESS) {
482 BT_ERR("adapter_get_address failed: %d", result);
483 result = BLUETOOTH_ERROR_INTERNAL;
485 result = BLUETOOTH_ERROR_NONE;
491 int _bt_is_service_used(void)
497 result = adapter_get_service_uuids();
498 if (result != OAL_STATUS_SUCCESS) {
499 BT_ERR("adapter_get_service_uuids failed: %d", result);
500 result = BLUETOOTH_ERROR_INTERNAL;
502 result = BLUETOOTH_ERROR_NONE;
509 int _bt_adapter_get_bonded_devices(void)
511 int result = BLUETOOTH_ERROR_NONE;
514 result = adapter_get_bonded_devices();
515 if (result != OAL_STATUS_SUCCESS) {
516 BT_ERR("adapter_get_bonded_devices failed: %d", result);
517 result = BLUETOOTH_ERROR_INTERNAL;
519 result = BLUETOOTH_ERROR_NONE;
525 static void __bt_adapter_event_handler(int event_type, gpointer event_data)
527 int result = BLUETOOTH_ERROR_NONE;
532 case OAL_EVENT_OAL_INITIALISED_SUCCESS:
533 case OAL_EVENT_OAL_INITIALISED_FAILED:
534 __bt_handle_oal_initialisation(event_type);
536 case OAL_EVENT_ADAPTER_ENABLED:
537 __bt_adapter_state_change_callback(BT_ACTIVATED);
539 case OAL_EVENT_ADAPTER_DISABLED:
540 __bt_adapter_state_change_callback(BT_DEACTIVATED);
542 case OAL_EVENT_ADAPTER_INQUIRY_STARTED:
543 __bt_adapter_discovery_state_change_callback(ADAPTER_DISCOVERY_STARTED);
545 case OAL_EVENT_ADAPTER_INQUIRY_FINISHED:
546 __bt_adapter_discovery_state_change_callback(ADAPTER_DISCOVERY_STOPPED);
548 case OAL_EVENT_ADAPTER_PROPERTY_ADDRESS: {
549 bt_address_t *bd_addr = event_data;
550 bluetooth_device_address_t local_address;
553 memcpy(local_address.addr, bd_addr->addr, BT_ADDRESS_LENGTH_MAX);
554 BT_DBG("Adapter address: [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]",
555 local_address.addr[0], local_address.addr[1], local_address.addr[2],
556 local_address.addr[3], local_address.addr[4], local_address.addr[5]);
558 __bt_adapter_handle_pending_requests(BT_GET_LOCAL_ADDRESS,
559 (void *) &local_address, sizeof(bluetooth_device_address_t));
562 case OAL_EVENT_ADAPTER_PROPERTY_NAME: {
563 char *name = event_data;
564 BT_DBG("Adapter Name: %s", name);
566 if (__bt_is_service_request_present(BT_GET_LOCAL_NAME)) {
567 bluetooth_device_name_t local_name;
569 memset(&local_name, 0x00, sizeof(bluetooth_device_name_t));
570 g_strlcpy(local_name.name,
571 (const gchar *)name, BLUETOOTH_DEVICE_NAME_LENGTH_MAX);
572 __bt_adapter_handle_pending_requests(BT_GET_LOCAL_NAME,
573 (void *) &local_name, sizeof(bluetooth_device_name_t));
575 /* Send event to application */
576 _bt_send_event(BT_ADAPTER_EVENT,
577 BLUETOOTH_EVENT_LOCAL_NAME_CHANGED,
578 g_variant_new("(is)", result, name));
582 case OAL_EVENT_ADAPTER_PROPERTY_VERSION: {
583 char *ver = event_data;
584 bluetooth_version_t local_version;
586 memset(&local_version, 0x00, sizeof(bluetooth_version_t));
587 g_strlcpy(local_version.version,
588 (const gchar *)ver, BLUETOOTH_VERSION_LENGTH_MAX);
589 BT_DBG("BT Version: %s", local_version.version);
591 __bt_adapter_handle_pending_requests(BT_GET_LOCAL_VERSION,
592 (void *) &local_version, sizeof(bluetooth_version_t));
595 case OAL_EVENT_ADAPTER_MODE_NON_CONNECTABLE: {
597 gboolean connectable = FALSE;
599 BT_INFO("Adapter discoverable mode:"
600 " BLUETOOTH_DISCOVERABLE_MODE_NON_CONNECTABLE");
601 _bt_send_event(BT_ADAPTER_EVENT,
602 BLUETOOTH_EVENT_CONNECTABLE_CHANGED,
603 g_variant_new("(b)", connectable));
605 _bt_send_event(BT_ADAPTER_EVENT,
606 BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
607 g_variant_new("(in)", result, mode));
610 case OAL_EVENT_ADAPTER_MODE_CONNECTABLE: {
612 gboolean connectable = TRUE;
614 BT_INFO("Adapter discoverable mode:"
615 " BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE");
616 _bt_send_event(BT_ADAPTER_EVENT,
617 BLUETOOTH_EVENT_CONNECTABLE_CHANGED,
618 g_variant_new("(b)", connectable));
620 mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
621 _bt_send_event(BT_ADAPTER_EVENT,
622 BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
623 g_variant_new("(in)", result, mode));
626 case OAL_EVENT_ADAPTER_MODE_DISCOVERABLE: {
629 BT_INFO("Adapter discoverable mode:"
630 " BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE");
632 /* Send event to application */
633 mode = BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE;
634 _bt_send_event(BT_ADAPTER_EVENT,
635 BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
636 g_variant_new("(in)", result, mode));
640 case OAL_EVENT_ADAPTER_MODE_DISCOVERABLE_TIMEOUT: {
641 int *timeout = event_data;
644 BT_INFO("Discoverable timeout: [%d]", *timeout);
646 /* Send event to application */
647 _bt_get_discoverable_mode(&mode);
648 _bt_send_event(BT_ADAPTER_EVENT,
649 BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
650 g_variant_new("(in)", result, mode));
653 case OAL_EVENT_ADAPTER_PROPERTY_SERVICES: {
655 service_uuid_t *service_list;
656 event_adapter_services_t *list = event_data;
659 service_list = list->service_list;
660 __bt_adapter_handle_pending_requests(BT_IS_SERVICE_USED, service_list, count);
663 case OAL_EVENT_ADAPTER_BONDED_DEVICE_LIST: {
666 bluetooth_device_address_t *addr_list;
668 event_device_list_t *bonded_device_list = event_data;
669 count = bonded_device_list->num;
671 addr_list = g_malloc0(count * sizeof(bluetooth_device_address_t));
672 for (i = 0; i < count; i++) {
673 memcpy(addr_list[i].addr,
674 bonded_device_list->devices[i].addr,
675 BLUETOOTH_ADDRESS_LENGTH);
678 __bt_adapter_handle_pending_requests(BT_GET_BONDED_DEVICES,
679 (void *)addr_list, bonded_device_list->num);
683 BT_ERR("Unhandled event..");
690 static int __bt_init_profiles()
694 /*TODO: Init bluetooth profiles */
695 ret = _bt_hidhost_initialize();
696 if (ret != BLUETOOTH_ERROR_NONE) {
697 BT_ERR("_bt_hidhost_initialize Failed");
700 ret = _bt_socket_init();
701 if (ret != BLUETOOTH_ERROR_NONE) {
702 BT_ERR("_bt_socket_init Failed");
706 return BLUETOOTH_ERROR_NONE;
709 /* OAL post initialization handler */
710 static void __bt_post_oal_init(void)
714 BT_DBG("OAL initialized, Init profiles..");
715 ret = __bt_init_profiles();
716 if (ret != BLUETOOTH_ERROR_NONE)
717 BT_ERR("Bluetooth profile init error: %d", ret);
722 /* OAL initialization handler */
723 static void __bt_handle_oal_initialisation(oal_event_t event)
728 case OAL_EVENT_OAL_INITIALISED_SUCCESS:
729 __bt_post_oal_init();
731 case OAL_EVENT_OAL_INITIALISED_FAILED:
732 BT_ERR("OAL Initialisation Failed, terminate bt-service daemon..");
733 g_idle_add(_bt_terminate_service, NULL);
736 BT_ERR("Unknown Event");
741 static gboolean __bt_is_service_request_present(int service_function)
744 invocation_info_t *req_info;
748 /* Get method invocation context */
749 for (l = _bt_get_invocation_list(); l != NULL; l = g_slist_next(l)) {
751 if (req_info && req_info->service_function == service_function)
759 /* Internal functions of core adapter service */
760 static void __bt_adapter_handle_pending_requests(int service_function, void *user_data, unsigned int size)
764 invocation_info_t *req_info;
767 /* Get method invocation context */
768 for (l = _bt_get_invocation_list(); l != NULL; l = g_slist_next(l)) {
770 if (req_info == NULL || req_info->service_function != service_function)
773 /* Create out param */
774 out_param = g_array_new(FALSE, FALSE, sizeof(gchar));
776 switch(service_function) {
777 case BT_ENABLE_ADAPTER:
778 case BT_DISABLE_ADAPTER: {
779 gboolean done = TRUE;
780 g_array_append_vals(out_param, &done, sizeof(gboolean));
783 case BT_GET_LOCAL_NAME:
784 case BT_GET_LOCAL_ADDRESS:
785 case BT_GET_LOCAL_VERSION:
786 g_array_append_vals(out_param, user_data, size);
788 case BT_IS_SERVICE_USED: {
790 gboolean used = FALSE;
792 char uuid_str[BT_UUID_STRING_SIZE];
793 char *request_uuid = req_info->user_data;
794 service_uuid_t *service_list = user_data;
796 BT_INFO("Check for service uuid: %s", request_uuid);
797 for (i = 0; i < size; i++) {
798 uuid = service_list[i].uuid;
799 _bt_service_convert_uuid_type_to_string(uuid_str, uuid);
800 BT_INFO("Adapter Service: [%s]", uuid_str);
801 if (strcasecmp(uuid_str, request_uuid) == 0) {
802 BT_INFO("UUID matched!!");
808 g_array_append_vals(out_param, &used, sizeof(gboolean));
811 case BT_GET_BONDED_DEVICES: {
812 bluetooth_device_address_t *addr_list = user_data;
813 bonded_devices_req_info_t *bonded_devices_req_info;
814 char address[BT_ADDRESS_STRING_SIZE];
816 int res = BLUETOOTH_ERROR_NONE;
819 * BT_GET_BONDED_DEVICES is already processed for this request,
820 * continue for next BT_GET_BONDED_DEVICES request if any
822 if (NULL != req_info->user_data)
825 BT_DBG("BT_GET_BONDED_DEVICES: count = [%d]", count);
826 /* No bonded devices, return method invocation */
827 if (0 == count || !addr_list)
830 /* Save address list in user data for futur reference. */
831 bonded_devices_req_info = g_malloc0(sizeof(bonded_devices_req_info));
832 if (!bonded_devices_req_info) {
833 BT_ERR("Memory allocation failed");
834 req_info->result = BLUETOOTH_ERROR_MEMORY_ALLOCATION;
839 bonded_devices_req_info->count = count;
840 bonded_devices_req_info->addr_list = addr_list;
841 bonded_devices_req_info->out_param = out_param;
842 req_info->user_data = bonded_devices_req_info;
844 while (bonded_devices_req_info->count > 0) {
845 bonded_devices_req_info->count -= 1;
846 res = _bt_device_get_bonded_device_info(
847 &addr_list[bonded_devices_req_info->count]);
848 if (BLUETOOTH_ERROR_NONE == res)
851 _bt_convert_addr_type_to_string((char *)address,
852 addr_list[bonded_devices_req_info->count].addr);
853 BT_ERR("_bt_device_get_bonded_device_info Failed for [%s]", address);
854 if (bonded_devices_req_info->count == 0) {
855 g_free(bonded_devices_req_info->addr_list);
856 g_free(bonded_devices_req_info);
857 req_info->user_data = NULL;
864 BT_ERR("Unknown service function[%d]", service_function);
867 _bt_service_method_return(req_info->context, out_param, req_info->result);
868 g_array_free(out_param, TRUE);
869 /* Now free invocation info for this request*/
870 _bt_free_info_from_invocation_list(req_info);
874 /* Request return handlings */
875 static gboolean __bt_adapter_post_set_enabled(gpointer user_data)
877 BT_INFO("__bt_adapter_post_set_enabled>>");
880 __bt_set_visible_mode();
883 if (BLUETOOTH_ERROR_NONE != _bt_set_discoverable_mode(
884 BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE, 0))
885 BT_ERR("Fail to set discoverable mode");
888 __bt_set_local_name();
890 /* Get All properties */
891 if (OAL_STATUS_SUCCESS != adapter_get_properties())
892 BT_ERR("adapter_get_properties failed");
894 /* Add Adapter enabled post processing codes */
898 static gboolean __bt_adapter_post_set_disabled(gpointer user_data)
900 BT_INFO("_bt_adapter_post_set_disabled>>");
901 /* Add Adapter disabled post processing codes */
905 static void __bt_adapter_update_bt_enabled(void)
907 int result = BLUETOOTH_ERROR_NONE;
908 BT_INFO("_bt_adapter_update_bt_enabled>>");
909 /* Update Bluetooth Status to notify other modules */
910 if (vconf_set_int(VCONFKEY_BT_STATUS, VCONFKEY_BT_STATUS_ON) != 0)
911 BT_ERR("Set vconf failed\n");
913 /* TODO:Add timer function to handle any further post processing */
914 g_idle_add((GSourceFunc)__bt_adapter_post_set_enabled, NULL);
916 /*Return BT_ADAPTER_ENABLE Method invocation context */
917 __bt_adapter_handle_pending_requests(BT_ENABLE_ADAPTER, NULL, 0);
918 /*Send BT Enabled event to application */
919 _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_ENABLED,
920 g_variant_new("(i)", result));
923 static void __bt_adapter_update_bt_disabled(void)
925 int result = BLUETOOTH_ERROR_NONE;
926 BT_INFO("_bt_adapter_update_bt_disabled>>");
928 int power_off_status = 0;
931 /* Update the vconf BT status in normal Deactivation case only */
932 ret = vconf_get_int(VCONFKEY_SYSMAN_POWER_OFF_STATUS, &power_off_status);
933 BT_DBG("ret : %d, power_off_status : %d", ret, power_off_status);
935 /* TODO:Add timer function to handle any further post processing */
936 g_idle_add((GSourceFunc)__bt_adapter_post_set_disabled, NULL);
938 /* Return BT_ADAPTER_DISABLE Method invocation context */
939 __bt_adapter_handle_pending_requests(BT_DISABLE_ADAPTER, NULL, 0);
941 /* Send BT Disabled event to application */
942 _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_DISABLED,
943 g_variant_new("(i)", result));
947 static void __bt_adapter_state_set_status(bt_status_t status)
949 BT_INFO("adapter_status changed [%d] -> [%d]", adapter_state, status);
950 adapter_state = status;
953 static void __bt_adapter_update_discovery_status(bt_adapter_discovery_state_t status)
955 BT_INFO("adapter_discovery_status changed [%d] -> [%d]", adapter_discovery_state, status);
956 adapter_discovery_state = status;
959 static void __bt_adapter_state_change_callback(int bt_status)
961 BT_INFO("__bt_adapter_state_change_callback: status [%d]", bt_status);
965 __bt_adapter_state_set_status(bt_status);
967 /* Adapter is disabled, unregister event handlers */
968 _bt_service_unregister_event_handler_callback(BT_ADAPTER_MODULE);
969 //_bt_deinit_device_event_handler();
971 /* Add Adapter disabled post processing codes */
972 __bt_adapter_update_bt_disabled();
975 __bt_adapter_state_set_status(bt_status);
976 /* Add Adapter enabled post processing codes */
978 BT_DBG("g_source is removed");
979 g_source_remove(timer_id);
982 __bt_adapter_update_bt_enabled();
985 BT_ERR("Incorrect Bluetooth adapter state changed status");
990 static int __bt_adapter_state_handle_request(gboolean enable)
992 int result = BLUETOOTH_ERROR_NONE;
995 switch (adapter_state) {
998 BT_INFO("Adapter is currently in activating state, state [%d]",
1001 return BLUETOOTH_ERROR_IN_PROGRESS;
1003 if (adapter_discovery_state == ADAPTER_DISCOVERY_STARTED ||
1004 adapter_discovery_state == ADAPTER_DISCOVERY_STARTING) {
1005 /*TODO Stop Discovery*/
1006 if (result != OAL_STATUS_SUCCESS)
1007 BT_ERR("Discover stop failed: %d", result);
1008 __bt_adapter_update_discovery_status(FALSE);
1010 result = adapter_disable();
1011 if (result != OAL_STATUS_SUCCESS) {
1012 BT_ERR("adapter_enable failed: [%d]", result);
1013 result = BLUETOOTH_ERROR_INTERNAL;
1014 /*TODO: perform if anything more needs to be done to handle failure */
1016 /* TODO: To be handled */
1017 __bt_adapter_state_set_status(BT_DEACTIVATING);
1018 result = BLUETOOTH_ERROR_NONE;
1025 BT_INFO("Adapter is currently in activated state, state [%d]",
1028 return BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED;
1030 if (adapter_discovery_state == ADAPTER_DISCOVERY_STARTED ||
1031 adapter_discovery_state == ADAPTER_DISCOVERY_STARTING) {
1032 /*TODO Stop Discovery*/
1033 if (result != OAL_STATUS_SUCCESS)
1034 BT_ERR("Discover stop failed: %d", result);
1035 __bt_adapter_update_discovery_status(FALSE);
1037 result = adapter_disable();
1038 if (result != OAL_STATUS_SUCCESS) {
1039 BT_ERR("adapter_enable failed: [%d]", result);
1040 result = BLUETOOTH_ERROR_INTERNAL;
1041 /*TODO: perform if anything more needs to be done to handle failure */
1043 /* TODO: To be handled */
1044 __bt_adapter_state_set_status(BT_DEACTIVATING);
1045 result = BLUETOOTH_ERROR_NONE;
1050 case BT_DEACTIVATING:
1052 BT_INFO("Adapter is currently in deactivating state, state [%d]",
1055 return BLUETOOTH_ERROR_IN_PROGRESS;
1058 result = adapter_enable();
1059 if (result != OAL_STATUS_SUCCESS) {
1060 BT_ERR("adapter_enable failed: [%d]", result);
1062 result = BLUETOOTH_ERROR_INTERNAL;
1063 /*TODO: perform if anything more needs to be done to handle failure */
1065 /* TODO: To be handled */
1066 __bt_adapter_state_set_status(BT_ACTIVATING);
1067 result = BLUETOOTH_ERROR_NONE;
1072 case BT_DEACTIVATED:
1074 BT_INFO("Adapter is currently in deactivated state, state [%d]",
1077 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
1079 result = adapter_enable();
1080 if (result != OAL_STATUS_SUCCESS) {
1081 BT_ERR("adapter_enable failed: [%d]", result);
1083 result = BLUETOOTH_ERROR_INTERNAL;
1084 /*TODO: perform if anything more needs to be done to handle failure */
1086 /* TODO: To be handled */
1087 __bt_adapter_state_set_status(BT_ACTIVATING);
1088 result = BLUETOOTH_ERROR_NONE;
1094 if (enable && result == BLUETOOTH_ERROR_NONE) {
1095 /* Adapter enable request is successful, setup event handlers */
1096 _bt_service_register_event_handler_callback(
1097 BT_ADAPTER_MODULE, __bt_adapter_event_handler);
1098 _bt_device_state_handle_callback_set_request();
1103 static int __bt_adapter_state_discovery_request(gboolean enable)
1105 int result = BLUETOOTH_ERROR_NONE;
1108 switch (adapter_discovery_state) {
1109 case ADAPTER_DISCOVERY_STARTED: {
1110 BT_INFO("Adapter is currently in discovery started state, state [%d]",
1111 adapter_discovery_state);
1113 return BLUETOOTH_ERROR_IN_PROGRESS;
1115 result = adapter_stop_inquiry();
1116 if (result != OAL_STATUS_SUCCESS) {
1117 BT_ERR("Discover stop failed: %d", result);
1118 result = BLUETOOTH_ERROR_INTERNAL;
1120 BT_ERR("Stop Discovery Triggered successfully");
1121 __bt_adapter_update_discovery_status(ADAPTER_DISCOVERY_STOPPING);
1122 result = BLUETOOTH_ERROR_NONE;
1127 case ADAPTER_DISCOVERY_STARTING: {
1128 BT_INFO("Adapter is currently in discovery starting state, state [%d]",
1129 adapter_discovery_state);
1131 return BLUETOOTH_ERROR_IN_PROGRESS;
1133 result = adapter_stop_inquiry();
1134 if (result != OAL_STATUS_SUCCESS) {
1135 BT_ERR("Discover stop failed: %d", result);
1136 result = BLUETOOTH_ERROR_INTERNAL;
1138 BT_ERR("Stop Discovery Triggered successfully");
1139 __bt_adapter_update_discovery_status(ADAPTER_DISCOVERY_STOPPING);
1140 result = BLUETOOTH_ERROR_NONE;
1145 case ADAPTER_DISCOVERY_STOPPED: {
1146 BT_INFO("Adapter is currently in discovery stopped state, state [%d]",
1147 adapter_discovery_state);
1149 return BLUETOOTH_ERROR_NOT_IN_OPERATION;
1151 result = adapter_start_inquiry();
1152 if (result != OAL_STATUS_SUCCESS) {
1153 BT_ERR("Start Discovery failed: %d", result);
1154 result = BLUETOOTH_ERROR_INTERNAL;
1156 BT_ERR("Start Discovery Triggered successfully");
1157 __bt_adapter_update_discovery_status(ADAPTER_DISCOVERY_STARTING);
1158 result = BLUETOOTH_ERROR_NONE;
1163 case ADAPTER_DISCOVERY_STOPPING: {
1164 BT_INFO("Adapter is currently in discovery stopping state, state [%d]",
1165 adapter_discovery_state);
1167 return BLUETOOTH_ERROR_NOT_IN_OPERATION;
1169 result = adapter_start_inquiry();
1170 if (result != OAL_STATUS_SUCCESS) {
1171 BT_ERR("Start Discovery failed: %d", result);
1172 result = BLUETOOTH_ERROR_INTERNAL;
1174 BT_ERR("Start Discovery Triggered successfully");
1175 __bt_adapter_update_discovery_status(ADAPTER_DISCOVERY_STARTING);
1176 result = BLUETOOTH_ERROR_NONE;
1187 static void __bt_adapter_discovery_state_change_callback(int bt_discovery_status)
1189 BT_INFO("__bt_adapter_discovery_state_change_callback: status [%d]", bt_discovery_status);
1190 GVariant *param = NULL;
1191 int result = BLUETOOTH_ERROR_NONE;
1193 switch (bt_discovery_status) {
1194 case ADAPTER_DISCOVERY_STOPPED:
1196 __bt_adapter_update_discovery_status(bt_discovery_status);
1197 param = g_variant_new("(i)", result);
1198 _bt_send_event(BT_ADAPTER_EVENT,
1199 BLUETOOTH_EVENT_DISCOVERY_FINISHED,
1203 case ADAPTER_DISCOVERY_STARTED:
1205 __bt_adapter_update_discovery_status(bt_discovery_status);
1206 param = g_variant_new("(i)", result);
1207 _bt_send_event(BT_ADAPTER_EVENT,
1208 BLUETOOTH_EVENT_DISCOVERY_STARTED,
1213 BT_ERR("Incorrect Bluetooth adapter Discovery state changed status");
1218 static void __bt_set_visible_mode(void)
1222 if (vconf_get_int(BT_FILE_VISIBLE_TIME, &timeout) != 0)
1223 BT_ERR("Fail to get the timeout value");
1225 #ifdef TIZEN_DPM_ENABLE
1226 if (timeout == -1 ||
1227 _bt_dpm_get_bluetooth_limited_discoverable_state() == DPM_RESTRICTED) {
1228 if (_bt_set_discoverable_mode(
1229 BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE,
1230 timeout) != BLUETOOTH_ERROR_NONE) {
1231 if (vconf_set_int(BT_FILE_VISIBLE_TIME, 0) != 0)
1232 BT_ERR("Set vconf failed");
1235 if (_bt_set_discoverable_mode(
1236 BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE,
1237 timeout) != BLUETOOTH_ERROR_NONE) {
1238 BT_ERR("Set connectable mode failed");
1242 if (timeout == -1) {
1243 if (_bt_set_discoverable_mode(
1244 BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE,
1245 timeout) != BLUETOOTH_ERROR_NONE) {
1246 if (vconf_set_int(BT_FILE_VISIBLE_TIME, 0) != 0)
1247 BT_ERR("Set vconf failed");
1250 if (_bt_set_discoverable_mode(
1251 BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE,
1252 timeout) != BLUETOOTH_ERROR_NONE) {
1253 BT_ERR("Set connectable mode failed");
1260 static void __bt_set_local_name(void)
1262 char *phone_name = NULL;
1265 phone_name = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
1270 if (strlen(phone_name) != 0) {
1271 if (!g_utf8_validate(phone_name, -1, (const char **)&ptr))
1274 _bt_set_local_name(phone_name);