2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
24 #include <syspopup_caller.h>
26 #include <dbus/dbus-glib.h>
27 #include <dbus/dbus.h>
29 #include <eventsystem.h>
30 #include <bundle_internal.h>
33 #include "bluetooth-api.h"
34 #include "bt-internal-types.h"
35 #include "bt-service-common.h"
36 #include "bt-service-event.h"
37 #include "bt-service-adapter.h"
38 #include "bt-service-util.h"
39 #include "bt-service-network.h"
40 #include "bt-service-obex-server.h"
41 #include "bt-service-opp-client.h"
42 #include "bt-service-agent.h"
43 #include "bt-service-main.h"
44 #include "bt-service-avrcp.h"
45 #include "bt-service-device.h"
46 #ifdef TIZEN_DPM_ENABLE
47 #include "bt-service-dpm.h"
57 bt_adapter_timer_t visible_timer = {0, };
61 bt_set_alarm_cb callback;
66 gboolean is_alarm_initialized;
68 } bt_service_alarm_mgr_t;
70 static bt_service_alarm_mgr_t alarm_mgr = {0, };
72 static gboolean is_discovering;
73 static gboolean cancel_by_user;
74 static bt_status_t adapter_status = BT_DEACTIVATED;
75 static bt_le_status_t adapter_le_status = BT_LE_DEACTIVATED;
76 static gboolean is_le_intended = FALSE;
77 static void *adapter_agent = NULL;
78 static GDBusProxy *core_proxy = NULL;
79 static guint timer_id = 0;
80 static guint le_timer_id = 0;
81 static gboolean is_recovery_mode;
83 static uint status_reg_id;
85 #define BT_CORE_NAME "org.projectx.bt_core"
86 #define BT_CORE_PATH "/org/projectx/bt_core"
87 #define BT_CORE_INTERFACE "org.projectx.btcore"
89 #define BT_DISABLE_TIME 500 /* 500 ms */
91 static int alarm_cb(alarm_id_t alarm_id, void* user_param);
92 static void alarm_data_free(void *data);
94 GDBusProxy *_bt_init_core_proxy(void)
97 GDBusConnection *conn;
99 conn = _bt_get_system_gconn();
103 proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
118 static GDBusProxy *__bt_get_core_proxy(void)
120 return (core_proxy) ? core_proxy : _bt_init_core_proxy();
123 static gboolean __bt_is_factory_test_mode(void)
127 if (vconf_get_bool(VCONFKEY_BT_DUT_MODE, &mode)) {
128 BT_ERR("Get the DUT Mode fail");
133 BT_INFO("DUT Test Mode !!");
140 static gboolean __bt_timeout_handler(gpointer user_data)
142 int result = BLUETOOTH_ERROR_NONE;
146 /* Take current time */
148 time_diff = difftime(current_time, visible_timer.start_time);
150 /* Send event to application */
151 _bt_send_event(BT_ADAPTER_EVENT,
152 BLUETOOTH_EVENT_DISCOVERABLE_TIMEOUT_CHANGED,
153 g_variant_new("(in)", result, time_diff));
155 if (visible_timer.timeout <= time_diff) {
156 g_source_remove(visible_timer.event_id);
157 visible_timer.event_id = 0;
158 visible_timer.timeout = 0;
160 #ifndef TIZEN_PROFILE_WEARABLE
161 if (vconf_set_int(BT_FILE_VISIBLE_TIME, 0) != 0)
162 BT_ERR("Set vconf failed\n");
170 static int __bt_visibility_alarm_cb(alarm_id_t alarm_id, void* user_param)
173 int result = BLUETOOTH_ERROR_NONE;
176 if (alarm_id != visible_timer.alarm_id)
179 if (visible_timer.event_id) {
180 _bt_send_event(BT_ADAPTER_EVENT,
181 BLUETOOTH_EVENT_DISCOVERABLE_TIMEOUT_CHANGED,
182 g_variant_new("(in)", result, timeout));
183 g_source_remove(visible_timer.event_id);
184 visible_timer.event_id = 0;
185 visible_timer.timeout = 0;
187 #ifndef TIZEN_PROFILE_WEARABLE
188 if (vconf_set_int(BT_FILE_VISIBLE_TIME, 0) != 0)
189 BT_ERR("Set vconf failed\n");
192 /* Switch Off visibility in Bluez */
193 _bt_set_discoverable_mode(BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE, 0);
194 visible_timer.alarm_id = 0;
198 static void __bt_visibility_alarm_remove()
200 if (visible_timer.event_id > 0) {
201 g_source_remove(visible_timer.event_id);
202 visible_timer.event_id = 0;
205 if (visible_timer.alarm_id > 0) {
206 _bt_service_remove_alarm(visible_timer.alarm_id);
207 visible_timer.alarm_id = 0;
211 int __bt_set_visible_time(int timeout)
216 __bt_visibility_alarm_remove();
218 visible_timer.timeout = timeout;
220 #ifndef TIZEN_PROFILE_WEARABLE
221 #ifdef TIZEN_DPM_ENABLE
222 if (_bt_dpm_get_bluetooth_limited_discoverable_state() != DPM_RESTRICTED) {
224 if (vconf_set_int(BT_FILE_VISIBLE_TIME, timeout) != 0)
225 BT_ERR("Set vconf failed");
226 #ifdef TIZEN_DPM_ENABLE
233 return BLUETOOTH_ERROR_NONE;
235 result = _bt_service_set_alarm(visible_timer.timeout,
236 __bt_visibility_alarm_cb, NULL, &alarm_id);
237 if (result != BLUETOOTH_ERROR_NONE)
238 return BLUETOOTH_ERROR_INTERNAL;
239 visible_timer.alarm_id = alarm_id;
240 /* Take start time */
241 time(&(visible_timer.start_time));
242 visible_timer.event_id = g_timeout_add_seconds(1,
243 __bt_timeout_handler, NULL);
245 return BLUETOOTH_ERROR_NONE;
248 static void __bt_get_service_list(GVariant *value, bluetooth_device_info_t *dev)
255 ret_if(value == NULL);
258 dev->service_index = 0;
260 g_variant_get(value, "as", &iter);
261 while (g_variant_iter_loop(iter, "s", &uuid)) {
262 g_strlcpy(dev->uuids[i], uuid, BLUETOOTH_UUID_STRING_MAX);
263 parts = g_strsplit(uuid, "-", -1);
265 if (parts == NULL || parts[0] == NULL) {
270 dev->service_list_array[i] = g_ascii_strtoull(parts[0], NULL, 16);
273 dev->service_index++;
276 g_variant_iter_free(iter);
279 static int __bt_get_bonded_device_info(gchar *device_path,
280 bluetooth_device_info_t *dev_info)
282 GError *error = NULL;
283 GDBusProxy *device_proxy;
284 gchar *address = NULL;
286 unsigned int cod = 0;
288 gboolean trust = FALSE;
289 gboolean paired = FALSE;
290 guchar connected = 0;
291 GByteArray *manufacturer_data = NULL;
293 GDBusConnection *conn;
295 GVariantIter *property_iter;
299 GVariantIter *char_value_iter;
301 BT_CHECK_PARAMETER(device_path, return);
302 BT_CHECK_PARAMETER(dev_info, return);
304 conn = _bt_get_system_gconn();
305 retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
307 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
311 BT_PROPERTIES_INTERFACE,
314 retv_if(device_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
316 result = g_dbus_proxy_call_sync(device_proxy,
318 g_variant_new("(s)", BT_DEVICE_INTERFACE),
319 G_DBUS_CALL_FLAGS_NONE,
325 BT_ERR("Error occured in Proxy call");
327 BT_ERR("Error occured in Proxy call (Error: %s)", error->message);
328 g_clear_error(&error);
330 g_object_unref(device_proxy);
331 return BLUETOOTH_ERROR_INTERNAL;
334 g_object_unref(device_proxy);
336 g_variant_get(result, "(a{sv})", &property_iter);
338 while (g_variant_iter_loop(property_iter, "{sv}", &key, &value)) {
339 if (!g_strcmp0(key, "Paired")) {
340 paired = g_variant_get_boolean(value);
341 } else if (!g_strcmp0(key, "Address")) {
342 g_variant_get(value, "s", &address);
343 } else if (!g_strcmp0(key, "Alias")) {
344 g_variant_get(value, "s", &name);
345 } else if (!g_strcmp0(key, "Name")) {
347 g_variant_get(value, "s", &name);
348 } else if(!g_strcmp0(key, "IsAliasSet")) {
349 dev_info->is_alias_set = g_variant_get_boolean(value);
350 } else if (!g_strcmp0(key, "Class")) {
351 cod = g_variant_get_uint32(value);
352 } else if (!g_strcmp0(key, "Connected")) {
353 connected = g_variant_get_byte(value);
354 } else if (!g_strcmp0(key, "Trusted")) {
355 trust = g_variant_get_boolean(value);
356 } else if (!g_strcmp0(key, "RSSI")) {
357 rssi = g_variant_get_int16(value);
358 } else if (!g_strcmp0(key, "UUIDs")) {
359 __bt_get_service_list(value, dev_info);
360 } else if (!g_strcmp0(key, "ManufacturerDataLen")) {
361 dev_info->manufacturer_data.data_len = g_variant_get_uint16(value);
362 } else if (!g_strcmp0(key, "ManufacturerData")) {
363 manufacturer_data = g_byte_array_new();
364 g_variant_get(value, "ay", &char_value_iter);
365 while (g_variant_iter_loop(char_value_iter, "y", &char_value)) {
366 g_byte_array_append(manufacturer_data, &char_value, 1);
368 g_variant_iter_free(char_value_iter);
370 if (manufacturer_data) {
371 if (manufacturer_data->len > 0) {
372 memcpy(dev_info->manufacturer_data.data, manufacturer_data->data,
373 manufacturer_data->len);
376 g_byte_array_free(manufacturer_data, TRUE);
379 g_variant_iter_free(property_iter);
381 BT_DBG("trust: %d, paired: %d", trust, paired);
383 g_variant_unref(result);
385 if ((paired == FALSE) && (trust == FALSE)) {
388 return BLUETOOTH_ERROR_NOT_PAIRED;
391 _bt_convert_addr_string_to_type(dev_info->device_address.addr,
394 _bt_divide_device_class(&dev_info->device_class, cod);
396 g_strlcpy(dev_info->device_name.name, name,
397 BLUETOOTH_DEVICE_NAME_LENGTH_MAX+1);
399 dev_info->rssi = rssi;
400 dev_info->trust = trust;
401 dev_info->paired = paired;
402 dev_info->connected = connected;
403 ret = BLUETOOTH_ERROR_NONE;
410 void _bt_set_discovery_status(gboolean mode)
412 is_discovering = mode;
415 void _bt_set_cancel_by_user(gboolean value)
417 cancel_by_user = value;
420 gboolean _bt_get_cancel_by_user(void)
422 return cancel_by_user;
425 void _bt_adapter_set_status(bt_status_t status)
427 BT_INFO("adapter_status changed [%d] -> [%d]", adapter_status, status);
428 adapter_status = status;
431 bt_status_t _bt_adapter_get_status(void)
433 return adapter_status;
436 void _bt_adapter_set_le_status(bt_le_status_t status)
438 BT_INFO("adapter_le_status changed [%d] -> [%d]", adapter_le_status, status);
439 adapter_le_status = status;
442 bt_le_status_t _bt_adapter_get_le_status(void)
444 return adapter_le_status;
448 void _bt_set_le_intended_status(gboolean value)
450 is_le_intended = value;
453 static void __bt_phone_name_changed_cb(keynode_t *node, void *data)
455 char *phone_name = NULL;
461 if (vconf_keynode_get_type(node) == VCONF_TYPE_STRING) {
462 phone_name = vconf_keynode_get_str(node);
464 if (phone_name && strlen(phone_name) != 0) {
465 if (!g_utf8_validate(phone_name, -1,
466 (const char **)&ptr))
469 _bt_set_local_name(phone_name);
474 static void __bt_set_local_name(void)
476 bluetooth_device_name_t local_name;
477 char *phone_name = NULL;
481 if (_bt_get_local_name(&local_name) != BLUETOOTH_ERROR_NONE ||
482 (temp = strstr(local_name.name, "BlueZ")) != NULL) {
483 phone_name = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
488 if (strlen(phone_name) != 0) {
489 if (!g_utf8_validate(phone_name, -1, (const char **)&ptr))
492 _bt_set_local_name(phone_name);
498 static int __bt_set_enabled(void)
500 int adapter_status = BT_ADAPTER_DISABLED;
501 int result = BLUETOOTH_ERROR_NONE;
504 BT_DBG("g_source is removed");
505 g_source_remove(timer_id);
509 _bt_check_adapter(&adapter_status);
511 if (adapter_status == BT_ADAPTER_DISABLED) {
512 BT_ERR("Bluetoothd is not running");
513 return BLUETOOTH_ERROR_INTERNAL;
516 #ifdef TIZEN_PROFILE_MOBILE
517 /* BT setting UI will control Mobile's visible mode. So in the FRWK...set the visible mode as off: */
518 if (_bt_set_discoverable_mode(
519 BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE, 0) != BLUETOOTH_ERROR_NONE)
520 BT_ERR("Set connectable mode failed");
523 if (_bt_set_discoverable_mode(
524 BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE, 0) != BLUETOOTH_ERROR_NONE)
525 BT_ERR("Fail to set discoverable mode");
529 /* Update Bluetooth Status to notify other modules */
530 if (vconf_set_int(VCONFKEY_BT_STATUS, VCONFKEY_BT_STATUS_ON) != 0)
531 BT_ERR("Set vconf failed\n");
533 if (vconf_set_int(VCONFKEY_BT_DEVICE, VCONFKEY_BT_DEVICE_NONE) != 0)
534 BT_ERR("Set vconf failed\n");
536 if (_bt_eventsystem_set_value(SYS_EVENT_BT_STATE, EVT_KEY_BT_STATE,
537 EVT_VAL_BT_ON) != ES_R_OK)
538 BT_ERR("Fail to set value");
540 /* Send enabled event to API */
541 _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_ENABLED,
542 g_variant_new("(i)", result));
544 #ifdef TIZEN_BT_A2DP_SINK_AUTO_CONNECT
545 _bt_audio_start_auto_connect(FALSE);
548 __bt_set_local_name();
549 _bt_set_discovery_status(FALSE);
551 return BLUETOOTH_ERROR_NONE;
554 void _bt_set_disabled(int result)
556 int power_off_status = 0;
559 int pm_ignore_mode = 0;
561 ret = vconf_get_int(VCONFKEY_SYSMAN_POWER_OFF_STATUS, &power_off_status);
562 BT_DBG("ret : %d, power_off_status : %d", ret, power_off_status);
564 ret_pm_ignore = vconf_get_int(VCONFKEY_PM_KEY_IGNORE, &pm_ignore_mode);
566 /* Update the vconf BT status in normal Deactivation case only */
567 if (ret == 0 && power_off_status == VCONFKEY_SYSMAN_POWER_OFF_NONE &&
568 ret_pm_ignore == 0 && pm_ignore_mode != VCONFKEY_PM_KEY_LOCK) {
570 BT_DBG("Update vconf for BT normal Deactivation");
572 if (result == BLUETOOTH_ERROR_TIMEOUT)
573 if (vconf_set_int(BT_OFF_DUE_TO_TIMEOUT, 1) != 0)
574 BT_ERR("Set vconf failed");
576 /* Update Bluetooth Status to notify other modules */
577 if (vconf_set_int(VCONFKEY_BT_STATUS, VCONFKEY_BT_STATUS_OFF) != 0)
578 BT_ERR("Set vconf failed");
580 if (_bt_eventsystem_set_value(SYS_EVENT_BT_STATE, EVT_KEY_BT_STATE,
581 EVT_VAL_BT_OFF) != ES_R_OK)
582 BT_ERR("Fail to set value");
585 if (vconf_set_int(VCONFKEY_BT_DEVICE, VCONFKEY_BT_DEVICE_NONE) != 0)
586 BT_ERR("Set vconf failed\n");
588 _bt_cancel_queued_transfers();
589 _bt_adapter_set_status(BT_DEACTIVATED);
590 _bt_set_discovery_status(FALSE);
592 #ifndef USB_BLUETOOTH
593 if (_bt_adapter_get_le_status() != BT_LE_DEACTIVATED) {
595 /* Send disabled event */
596 _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_DISABLED,
597 g_variant_new("(i)", result));
598 #ifndef USB_BLUETOOTH
602 BT_INFO("Adapter disabled");
605 static int __bt_set_le_enabled(void)
608 int result = BLUETOOTH_ERROR_NONE;
611 /* Update Bluetooth Status to notify other modules */
612 if (vconf_set_int(VCONFKEY_BT_LE_STATUS, VCONFKEY_BT_LE_STATUS_ON) != 0)
613 BT_ERR("Set vconf failed\n");
615 if (_bt_eventsystem_set_value(SYS_EVENT_BT_STATE, EVT_KEY_BT_LE_STATE,
616 EVT_VAL_BT_LE_ON) != ES_R_OK)
617 BT_ERR("Fail to set value");
619 /* Send enabled event to API */
621 _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_ENABLED,
622 DBUS_TYPE_INT32, &result, DBUS_TYPE_INVALID);
624 status = _bt_adapter_get_status();
625 if (status == BT_DEACTIVATED) {
626 BT_INFO("BREDR is off, turn off PSCAN");
627 _bt_set_connectable(FALSE);
629 if (le_timer_id > 0) {
630 g_source_remove(le_timer_id);
634 /* Send enabled event to API */
635 _bt_send_event(BT_LE_ADAPTER_EVENT, BLUETOOTH_EVENT_LE_ENABLED,
636 g_variant_new("(i)", result));
638 __bt_set_local_name();
641 return BLUETOOTH_ERROR_NONE;
644 void _bt_set_le_disabled(int result)
646 int power_off_status;
649 ret = vconf_get_int(VCONFKEY_SYSMAN_POWER_OFF_STATUS, &power_off_status);
650 BT_DBG("ret : %d", ret);
651 BT_DBG("power_off_status : %d", power_off_status);
653 /* Update Bluetooth Status to notify other modules */
654 BT_DBG("Update vconf for BT LE normal Deactivation");
655 if (vconf_set_int(VCONFKEY_BT_LE_STATUS, VCONFKEY_BT_LE_STATUS_OFF) != 0)
656 BT_ERR("Set vconf failed\n");
657 _bt_adapter_set_le_status(BT_LE_DEACTIVATED);
659 if (_bt_eventsystem_set_value(SYS_EVENT_BT_STATE, EVT_KEY_BT_LE_STATE,
660 EVT_VAL_BT_LE_OFF) != ES_R_OK)
661 BT_ERR("Fail to set value");
663 /* Send disabled event */
664 _bt_send_event(BT_LE_ADAPTER_EVENT, BLUETOOTH_EVENT_LE_DISABLED,
665 g_variant_new_int32(result));
668 void *_bt_get_adapter_agent(void)
670 return adapter_agent;
673 int _bt_enable_core(void)
677 GError *error = NULL;
679 proxy = __bt_get_core_proxy();
680 retv_if(!proxy, BLUETOOTH_ERROR_INTERNAL);
682 /* Clean up the process */
683 result = g_dbus_proxy_call_sync(proxy,
686 G_DBUS_CALL_FLAGS_NONE,
693 BT_ERR("Bt core call failed(Error: %s)", error->message);
694 g_clear_error(&error);
696 BT_ERR("Bt core call failed");
697 return BLUETOOTH_ERROR_INTERNAL;
700 g_variant_unref(result);
701 return BLUETOOTH_ERROR_NONE;
704 #if defined(TIZEN_FEATURE_FLIGHTMODE_ENABLED) || (!defined(TIZEN_PROFILE_WEARABLE))
705 static void __bt_service_flight_ps_mode_cb(keynode_t *node, void *data)
707 gboolean flight_mode = FALSE;
708 int power_saving_mode = 0;
711 DBG_SECURE("key=%s", vconf_keynode_get_name(node));
712 type = vconf_keynode_get_type(node);
713 if (type == VCONF_TYPE_BOOL) {
714 flight_mode = vconf_keynode_get_bool(node);
715 if (flight_mode != TRUE) {
716 BT_ERR("Ignore the event");
719 } else if (type == VCONF_TYPE_INT) {
720 power_saving_mode = vconf_keynode_get_int(node);
721 if (power_saving_mode != 2) {
722 BT_ERR("Ignore the event");
726 BT_ERR("Invaild vconf key type : %d", type);
734 void _bt_service_register_vconf_handler(void)
738 #ifdef TIZEN_FEATURE_FLIGHTMODE_ENABLED
739 if (vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
740 (vconf_callback_fn)__bt_service_flight_ps_mode_cb, NULL) < 0)
741 BT_ERR("Unable to register key handler");
743 BT_DBG("Telephony is disabled");
746 #ifndef TIZEN_PROFILE_WEARABLE
747 if (vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE,
748 (vconf_callback_fn)__bt_service_flight_ps_mode_cb, NULL) < 0)
749 BT_ERR("Unable to register key handler");
753 void _bt_service_unregister_vconf_handler(void)
757 #ifdef TIZEN_FEATURE_FLIGHTMODE_ENABLED
758 vconf_ignore_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
759 (vconf_callback_fn)__bt_service_flight_ps_mode_cb);
762 #ifndef TIZEN_PROFILE_WEARABLE
763 vconf_ignore_key_changed(VCONFKEY_SETAPPL_PSMODE,
764 (vconf_callback_fn)__bt_service_flight_ps_mode_cb);
768 static void __bt_state_event_handler(const char *event_name, bundle *data, void *user_data)
770 const char *bt_status = NULL;
771 const char *bt_le_status = NULL;
772 BT_DBG("bt state set event(%s) received", event_name);
774 bt_status = bundle_get_val(data, EVT_KEY_BT_STATE);
775 BT_DBG("bt_state: (%s)", bt_status);
777 bt_le_status = bundle_get_val(data, EVT_KEY_BT_LE_STATE);
778 BT_DBG("bt_state: (%s)", bt_le_status);
781 void _bt_handle_adapter_added(void)
785 bt_le_status_t le_status;
789 BT_DBG("g_source is removed");
790 g_source_remove(timer_id);
795 status = _bt_adapter_get_status();
796 le_status = _bt_adapter_get_le_status();
797 BT_DBG("status : %d", status);
798 BT_DBG("le_status : %d", le_status);
800 #ifndef USB_BLUETOOTH
801 adapter_agent = _bt_create_agent(BT_ADAPTER_AGENT_PATH, TRUE);
802 if (!adapter_agent) {
803 BT_ERR("Fail to register agent");
807 if (adapter_agent == NULL) {
808 adapter_agent = _bt_create_agent(BT_ADAPTER_AGENT_PATH, TRUE);
809 if (!adapter_agent) {
810 BT_ERR("Fail to register agent");
816 if (_bt_register_media_player() != BLUETOOTH_ERROR_NONE)
817 BT_ERR("Fail to register media player");
819 if (_bt_register_obex_server() != BLUETOOTH_ERROR_NONE)
820 BT_ERR("Fail to init obex server");
822 #ifdef TIZEN_BT_PAN_NAP_ENABLED
823 if (_bt_network_activate() != BLUETOOTH_ERROR_NONE)
824 BT_ERR("Fail to activate network");
827 /* add the vconf noti handler */
828 ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_DEVICE_NAME_STR,
829 __bt_phone_name_changed_cb, NULL);
831 BT_ERR("Unable to register key handler");
833 if (le_status == BT_LE_ACTIVATING ||
834 status == BT_ACTIVATING) {
835 __bt_set_le_enabled();
836 _bt_adapter_set_le_status(BT_LE_ACTIVATED);
839 if (status == BT_ACTIVATING) {
841 _bt_adapter_set_status(BT_ACTIVATED);
844 _bt_service_register_vconf_handler();
847 if (eventsystem_register_event(SYS_EVENT_BT_STATE, &status_reg_id,
848 (eventsystem_handler)__bt_state_event_handler, NULL) != ES_R_OK) {
849 BT_ERR("Fail to register system event");
853 void _bt_handle_adapter_removed(void)
857 _bt_adapter_set_status(BT_DEACTIVATED);
859 __bt_visibility_alarm_remove();
861 if (alarm_mgr.is_alarm_initialized == TRUE) {
863 alarm_mgr.is_alarm_initialized = FALSE;
864 g_list_free_full(alarm_mgr.g_alarm_list, alarm_data_free);
865 alarm_mgr.g_alarm_list = NULL;
868 #ifdef TIZEN_BT_A2DP_SINK_AUTO_CONNECT
869 _bt_audio_stop_auto_connect();
872 ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_DEVICE_NAME_STR,
873 (vconf_callback_fn)__bt_phone_name_changed_cb);
875 ERR("vconf_ignore_key_changed failed\n");
878 #ifndef USB_BLUETOOTH
879 _bt_destroy_agent(adapter_agent);
880 adapter_agent = NULL;
882 if (is_recovery_mode == TRUE) {
883 /* Send disabled event */
884 _bt_set_disabled(BLUETOOTH_ERROR_NONE);
886 /* Will recover BT by bt-core, so set the mode as activating */
887 _bt_adapter_set_status(BT_ACTIVATING);
888 is_recovery_mode = FALSE;
890 _bt_reliable_terminate_service(NULL);
893 _bt_set_disabled(BLUETOOTH_ERROR_NONE);
896 if (eventsystem_unregister_event(status_reg_id) != ES_R_OK)
897 BT_ERR("Fail to unregister system event");
900 static gboolean __bt_enable_timeout_cb(gpointer user_data)
904 GError *error = NULL;
908 retv_if(_bt_adapter_get_status() == BT_ACTIVATED, FALSE);
910 BT_ERR("EnableAdapter is failed");
912 proxy = __bt_get_core_proxy();
916 /* Clean up the process */
917 result = g_dbus_proxy_call_sync(proxy,
920 G_DBUS_CALL_FLAGS_NONE,
927 BT_ERR("Bt core call failed(Error: %s)", error->message);
928 g_clear_error(&error);
930 BT_ERR("Bt core call failed");
935 g_variant_unref(result);
936 _bt_set_disabled(BLUETOOTH_ERROR_TIMEOUT);
938 #ifndef USB_BLUETOOTH
939 _bt_terminate_service(NULL);
945 static gboolean __bt_enable_le_timeout_cb(gpointer user_data)
949 GError *error = NULL;
953 retv_if(_bt_adapter_get_le_status() == BT_LE_ACTIVATED, FALSE);
955 BT_ERR("EnableAdapterLE is failed");
957 proxy = __bt_get_core_proxy();
961 /* Clean up the process */
962 result = g_dbus_proxy_call_sync(proxy,
965 G_DBUS_CALL_FLAGS_NONE,
972 BT_ERR("Bt core call failed(Error: %s)", error->message);
973 g_clear_error(&error);
975 BT_ERR("Bt core call failed");
979 g_variant_unref(result);
980 _bt_adapter_set_le_status(BT_LE_DEACTIVATED);
982 _bt_set_le_disabled(BLUETOOTH_ERROR_TIMEOUT);
984 if (_bt_adapter_get_status() == BT_DEACTIVATED)
985 _bt_terminate_service(NULL);
990 void _bt_adapter_start_le_enable_timer(void)
992 if (le_timer_id > 0) {
993 g_source_remove(le_timer_id);
997 le_timer_id = g_timeout_add(BT_ENABLE_TIMEOUT,
998 __bt_enable_le_timeout_cb, NULL);
1003 void _bt_adapter_start_enable_timer(void)
1006 g_source_remove(timer_id);
1010 timer_id = g_timeout_add(BT_ENABLE_TIMEOUT,
1011 __bt_enable_timeout_cb, NULL);
1017 static gboolean __bt_adapter_enabled_cb(gpointer user_data)
1022 _bt_adapter_set_status(BT_ACTIVATED);
1028 int _bt_enable_adapter(void)
1031 GError *error = NULL;
1033 GVariant *result = NULL;
1034 bt_status_t status = _bt_adapter_get_status();
1035 bt_le_status_t le_status = _bt_adapter_get_le_status();
1039 if (status == BT_ACTIVATING) {
1040 BT_ERR("Enabling in progress");
1041 return BLUETOOTH_ERROR_IN_PROGRESS;
1044 if (status == BT_ACTIVATED) {
1045 BT_ERR("Already enabled");
1046 return BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED;
1049 if (status == BT_DEACTIVATING || le_status == BT_LE_DEACTIVATING) {
1050 BT_ERR("Disabling in progress");
1051 return BLUETOOTH_ERROR_DEVICE_BUSY;
1054 _bt_adapter_set_status(BT_ACTIVATING);
1058 int adapter_status = BT_ADAPTER_DISABLED;
1060 if (vconf_set_int(VCONFKEY_BT_STATUS, VCONFKEY_BT_STATUS_OFF) != 0)
1061 BT_ERR("Set vconf failed");
1063 _bt_check_adapter(&adapter_status);
1064 if (adapter_status == BT_ADAPTER_ENABLED) {
1065 g_idle_add(__bt_adapter_enabled_cb, NULL);
1066 _bt_adapter_start_enable_timer();
1067 return BLUETOOTH_ERROR_NONE;
1072 proxy = __bt_get_core_proxy();
1074 return BLUETOOTH_ERROR_INTERNAL;
1076 if (le_status == BT_LE_ACTIVATED) {
1077 BT_INFO("LE Already enabled. Just turn on PSCAN");
1078 ret = _bt_set_connectable(TRUE);
1079 if (ret == BLUETOOTH_ERROR_NONE) {
1080 _bt_adapter_set_status(BT_ACTIVATED);
1082 return BLUETOOTH_ERROR_INTERNAL;
1086 result = g_dbus_proxy_call_sync(proxy, "EnableAdapter",
1088 G_DBUS_CALL_FLAGS_NONE, BT_ENABLE_TIMEOUT,
1091 BT_ERR("EnableAdapterLe failed: %s", error->message);
1092 _bt_adapter_set_status(BT_DEACTIVATED);
1093 g_clear_error(&error);
1095 result = g_dbus_proxy_call_sync(proxy,
1098 G_DBUS_CALL_FLAGS_NONE,
1103 if (error != NULL) {
1104 BT_ERR("Bt core call failed(Error: %s)", error->message);
1105 g_clear_error(&error);
1107 g_variant_unref(result);
1108 #ifndef USB_BLUETOOTH
1109 /* Terminate myself */
1110 g_idle_add((GSourceFunc)_bt_terminate_service, NULL);
1112 return BLUETOOTH_ERROR_INTERNAL;
1114 g_variant_unref(result);
1115 if (le_status == BT_LE_ACTIVATED) {
1118 _bt_adapter_start_enable_timer();
1121 return BLUETOOTH_ERROR_NONE;
1124 static gboolean __bt_disconnect_all(void)
1127 GDBusConnection *conn;
1128 GDBusProxy *dev_proxy;
1129 gboolean ret = FALSE;
1131 GError *error = NULL;
1132 GArray *device_list;
1133 bluetooth_device_info_t info;
1135 char *device_path = NULL;
1136 char address[BT_ADDRESS_STRING_SIZE] = { 0 };
1141 conn = _bt_get_system_gconn();
1143 device_list = g_array_new(FALSE, FALSE, sizeof(gchar));
1145 if (_bt_get_bonded_devices(&device_list)
1146 != BLUETOOTH_ERROR_NONE) {
1147 g_array_free(device_list, TRUE);
1151 size = (device_list->len) / sizeof(bluetooth_device_info_t);
1153 for (i = 0; i < size; i++) {
1155 info = g_array_index(device_list,
1156 bluetooth_device_info_t, i);
1158 if (info.connected != BLUETOOTH_CONNECTED_LINK_NONE) {
1159 BT_DBG("Found Connected device");
1160 _bt_convert_addr_type_to_string(address, info.device_address.addr);
1161 device_path = _bt_get_device_object_path(address);
1162 if (device_path == NULL)
1165 BT_DBG("Disconnecting : %s", device_path);
1167 dev_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
1171 BT_DEVICE_INTERFACE,
1174 if (dev_proxy == NULL)
1177 result = g_dbus_proxy_call_sync(dev_proxy,
1180 G_DBUS_CALL_FLAGS_NONE,
1186 if (error != NULL) {
1187 BT_ERR("Disconnect call failed(Error: %s)", error->message);
1188 g_clear_error(&error);
1190 BT_ERR("Disconnect call failed");
1191 g_object_unref(dev_proxy);
1195 g_variant_unref(result);
1196 g_object_unref(dev_proxy);
1200 g_array_free(device_list, TRUE);
1206 static gboolean __bt_set_disabled_timeout_cb(gpointer user_data)
1209 _bt_set_disabled(BLUETOOTH_ERROR_NONE);
1215 int _bt_disable_cb(void)
1223 GError *error = NULL;
1225 _bt_adapter_set_status(BT_DEACTIVATING);
1227 bt_le_status_t le_status;
1228 le_status = _bt_adapter_get_le_status();
1229 BT_DBG("le_status : %d", le_status);
1230 if (le_status == BT_LE_ACTIVATED) {
1231 BT_INFO("LE is enabled. Just turn off PSCAN");
1233 if (_bt_is_discovering())
1234 _bt_cancel_discovery();
1236 if (_bt_is_connectable() == FALSE) {
1237 g_timeout_add(100, (GSourceFunc)__bt_set_disabled_timeout_cb, NULL);
1239 ret = _bt_set_connectable(FALSE);
1240 if (ret != BLUETOOTH_ERROR_NONE) {
1241 BT_ERR("_bt_set_connectable fail!");
1242 _bt_adapter_set_status(BT_ACTIVATED);
1243 return BLUETOOTH_ERROR_INTERNAL;
1248 proxy = __bt_get_core_proxy();
1249 retv_if(!proxy, BLUETOOTH_ERROR_INTERNAL);
1251 result = g_dbus_proxy_call_sync(proxy,
1254 G_DBUS_CALL_FLAGS_NONE,
1260 if (error != NULL) {
1261 BT_ERR("Failed to DisableAdapter (Error: %s)", error->message);
1262 g_clear_error(&error);
1264 BT_ERR("Failed to DisableAdapter");
1265 _bt_adapter_set_status(BT_ACTIVATED);
1266 return BLUETOOTH_ERROR_INTERNAL;
1269 g_variant_unref(result);
1270 return BLUETOOTH_ERROR_NONE;
1273 int _bt_disable_adapter(void)
1278 if (_bt_adapter_get_status() == BT_DEACTIVATING) {
1279 BT_DBG("Disabling in progress");
1280 return BLUETOOTH_ERROR_IN_PROGRESS;
1283 if (_bt_adapter_get_status() == BT_DEACTIVATED) {
1284 BT_DBG("Already disabled");
1285 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
1289 g_source_remove(timer_id);
1293 __bt_disconnect_all();
1294 ret = _bt_disable_cb();
1300 int _bt_recover_adapter(void)
1305 GError *error = NULL;
1307 if (_bt_adapter_get_status() == BT_DEACTIVATING) {
1308 BT_DBG("Disabling in progress");
1309 return BLUETOOTH_ERROR_IN_PROGRESS;
1312 if (_bt_adapter_get_status() == BT_DEACTIVATED) {
1313 BT_DBG("Already disabled");
1314 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
1317 _bt_adapter_set_status(BT_DEACTIVATING);
1319 proxy = __bt_get_core_proxy();
1320 retv_if(!proxy, BLUETOOTH_ERROR_INTERNAL);
1322 result = g_dbus_proxy_call_sync(proxy,
1325 G_DBUS_CALL_FLAGS_NONE,
1331 if (error != NULL) {
1332 BT_ERR("Failed to RecoverAdapter (Error: %s)", error->message);
1333 g_clear_error(&error);
1335 BT_ERR("Failed to RecoverAdapter");
1336 return BLUETOOTH_ERROR_INTERNAL;
1339 is_recovery_mode = TRUE;
1341 g_variant_unref(result);
1342 __bt_disconnect_all();
1345 return BLUETOOTH_ERROR_NONE;
1348 int _bt_reset_adapter(void)
1352 GError *error = NULL;
1356 proxy = __bt_get_core_proxy();
1358 return BLUETOOTH_ERROR_INTERNAL;
1360 result = g_dbus_proxy_call_sync(proxy,
1363 G_DBUS_CALL_FLAGS_NONE,
1369 if (error != NULL) {
1370 BT_ERR("Failed to ResetAdapter (Error: %s)", error->message);
1371 g_clear_error(&error);
1373 BT_ERR("Failed to ResetAdapter");
1374 return BLUETOOTH_ERROR_INTERNAL;
1377 g_variant_unref(result);
1378 /* Terminate myself */
1379 if (_bt_adapter_get_status() == BT_DEACTIVATED) {
1380 g_idle_add((GSourceFunc)_bt_terminate_service, NULL);
1383 return BLUETOOTH_ERROR_NONE;
1387 int _bt_check_adapter(int *status)
1390 char *adapter_path = NULL;
1392 BT_CHECK_PARAMETER(status, return);
1394 *status = BT_ADAPTER_DISABLED;
1396 adapter_path = _bt_get_adapter_path();
1399 if (adapter_path != NULL)
1400 *status = BT_ADAPTER_ENABLED;
1402 g_free(adapter_path);
1403 return BLUETOOTH_ERROR_NONE;
1406 int _bt_check_adapter(int *status)
1409 GError *error = NULL;
1412 gboolean powered = FALSE;
1414 BT_CHECK_PARAMETER(status, return);
1416 *status = BT_ADAPTER_DISABLED;
1418 proxy = _bt_get_adapter_properties_proxy();
1419 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
1421 result = g_dbus_proxy_call_sync(proxy,
1423 g_variant_new("(ss)", BT_ADAPTER_INTERFACE,
1425 G_DBUS_CALL_FLAGS_NONE,
1431 BT_ERR("Failed to get local address");
1432 if (error != NULL) {
1433 BT_ERR("Failed to get local address (Error: %s)", error->message);
1434 g_clear_error(&error);
1436 return BLUETOOTH_ERROR_INTERNAL;
1439 g_variant_get(result, "(v)", &temp);
1440 powered = g_variant_get_boolean(temp);
1441 BT_DBG("powered: %d", powered);
1444 *status = BT_ADAPTER_ENABLED;
1446 g_variant_unref(result);
1447 g_variant_unref(temp);
1448 return BLUETOOTH_ERROR_NONE;
1452 int _bt_enable_adapter_le(void)
1456 GError *error = NULL;
1457 bt_status_t status = _bt_adapter_get_status();
1458 bt_le_status_t le_status = _bt_adapter_get_le_status();
1461 if (le_status == BT_LE_ACTIVATING) {
1462 BT_ERR("Enabling in progress");
1463 return BLUETOOTH_ERROR_IN_PROGRESS;
1466 if (le_status == BT_LE_ACTIVATED) {
1467 BT_ERR("Already enabled");
1468 return BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED;
1471 if (status == BT_DEACTIVATING || le_status == BT_LE_DEACTIVATING) {
1472 BT_ERR("Disabling in progress");
1473 return BLUETOOTH_ERROR_DEVICE_BUSY;
1476 _bt_adapter_set_le_status(BT_LE_ACTIVATING);
1478 proxy = __bt_get_core_proxy();
1479 retv_if(!proxy, BLUETOOTH_ERROR_INTERNAL);
1481 result = g_dbus_proxy_call_sync(proxy, "EnableAdapterLe",
1483 G_DBUS_CALL_FLAGS_NONE, BT_ENABLE_TIMEOUT,
1486 BT_ERR("EnableAdapterLe failed: %s", error->message);
1487 _bt_adapter_set_le_status(BT_DEACTIVATED);
1488 g_clear_error(&error);
1490 /* Clean up the process */
1491 result = g_dbus_proxy_call_sync(proxy,
1494 G_DBUS_CALL_FLAGS_NONE,
1500 BT_ERR("Bt core call failed");
1502 BT_ERR("EnableAdapterLE Failed %s", error->message);
1503 g_clear_error(&error);
1506 g_variant_unref(result);
1507 /* Terminate myself */
1508 if (_bt_adapter_get_status() == BT_DEACTIVATED)
1509 g_idle_add((GSourceFunc)_bt_terminate_service, NULL);
1510 return BLUETOOTH_ERROR_INTERNAL;
1514 g_variant_unref(result);
1516 _bt_adapter_start_le_enable_timer();
1518 if (status == BT_ACTIVATED) {
1519 _bt_adapter_set_le_status(BT_LE_ACTIVATED);
1520 __bt_set_le_enabled();
1522 BT_DBG("le status : %d", _bt_adapter_get_le_status());
1524 return BLUETOOTH_ERROR_NONE;
1527 int _bt_disable_adapter_le(void)
1531 bt_le_status_t bt_le_state;
1533 GError *error = NULL;
1535 bt_le_state = _bt_adapter_get_le_status();
1536 if (bt_le_state == BT_LE_DEACTIVATING) {
1537 BT_DBG("Disabling in progress");
1538 return BLUETOOTH_ERROR_IN_PROGRESS;
1541 if (bt_le_state == BT_LE_DEACTIVATED) {
1542 BT_DBG("Already disabled");
1543 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
1546 _bt_adapter_set_le_status(BT_LE_DEACTIVATING);
1548 proxy = __bt_get_core_proxy();
1550 return BLUETOOTH_ERROR_INTERNAL;
1552 result = g_dbus_proxy_call_sync(proxy,
1555 G_DBUS_CALL_FLAGS_NONE,
1561 if (error != NULL) {
1562 BT_ERR("Bt core call failed (Error: %s)", error->message);
1563 g_clear_error(&error);
1565 BT_ERR("Bt core call failed");
1566 _bt_adapter_set_le_status(BT_LE_ACTIVATED);
1567 return BLUETOOTH_ERROR_INTERNAL;
1570 g_variant_unref(result);
1571 _bt_set_le_disabled(BLUETOOTH_ERROR_NONE);
1572 BT_DBG("le status : %d", _bt_adapter_get_le_status());
1574 return BLUETOOTH_ERROR_NONE;
1577 int _bt_get_local_address(bluetooth_device_address_t *local_address)
1581 GError *error = NULL;
1582 const char *address;
1586 BT_CHECK_PARAMETER(local_address, return);
1588 proxy = _bt_get_adapter_properties_proxy();
1589 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
1591 result = g_dbus_proxy_call_sync(proxy,
1593 g_variant_new("(ss)", BT_ADAPTER_INTERFACE,
1595 G_DBUS_CALL_FLAGS_NONE,
1601 BT_ERR("Failed to get local address");
1602 if (error != NULL) {
1603 BT_ERR("Failed to get local address (Error: %s)", error->message);
1604 g_clear_error(&error);
1606 return BLUETOOTH_ERROR_INTERNAL;
1609 g_variant_get(result, "(v)", &temp);
1610 address = g_variant_get_string(temp, NULL);
1611 BT_DBG("Address:%s", address);
1614 _bt_convert_addr_string_to_type(local_address->addr, address);
1616 return BLUETOOTH_ERROR_INTERNAL;
1619 g_variant_unref(result);
1620 g_variant_unref(temp);
1621 return BLUETOOTH_ERROR_NONE;
1624 int _bt_get_local_version(bluetooth_version_t *local_version)
1627 const char *ver = NULL;
1629 int ret = BLUETOOTH_ERROR_NONE;
1633 BT_CHECK_PARAMETER(local_version, return);
1635 GError *error = NULL;
1637 proxy = _bt_get_adapter_properties_proxy();
1638 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
1640 result = g_dbus_proxy_call_sync(proxy,
1642 g_variant_new("(ss)", BT_ADAPTER_INTERFACE,
1644 G_DBUS_CALL_FLAGS_NONE,
1650 if (error != NULL) {
1651 BT_ERR("Failed to get local version (Error: %s)", error->message);
1652 g_clear_error(&error);
1654 BT_ERR("Failed to get local version");
1655 return BLUETOOTH_ERROR_INTERNAL;
1658 g_variant_get(result, "(v)", &temp);
1659 ver = g_variant_get_string(temp, NULL);
1660 BT_DBG("VERSION: %s", ver);
1662 if (ver && (strlen(ver) > 0)) {
1663 /* Check the utf8 valitation & Fill the NULL in the invalid location*/
1664 if (!g_utf8_validate(ver, -1, (const char **)&ptr))
1667 g_strlcpy(local_version->version, ver,
1668 BLUETOOTH_VERSION_LENGTH_MAX + 1);
1671 ret = BLUETOOTH_ERROR_INTERNAL;
1674 g_variant_unref(result);
1675 g_variant_unref(temp);
1679 int _bt_get_local_name(bluetooth_device_name_t *local_name)
1682 const char *name = NULL;
1684 int ret = BLUETOOTH_ERROR_NONE;
1687 GError *error = NULL;
1689 BT_CHECK_PARAMETER(local_name, return);
1691 proxy = _bt_get_adapter_properties_proxy();
1692 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
1694 result = g_dbus_proxy_call_sync(proxy,
1696 g_variant_new("(ss)", BT_ADAPTER_INTERFACE,
1698 G_DBUS_CALL_FLAGS_NONE,
1704 if (error != NULL) {
1705 BT_ERR("Failed to get local name (Error: %s)", error->message);
1706 g_clear_error(&error);
1708 BT_ERR("Failed to get local name");
1709 return BLUETOOTH_ERROR_INTERNAL;
1712 g_variant_get(result, "(v)", &temp);
1713 name = g_variant_get_string(temp, NULL);
1714 BT_DBG("LOCAL NAME:%s", name);
1716 if (name && (strlen(name) > 0)) {
1717 /* Check the utf8 valitation & Fill the NULL in the invalid location*/
1718 if (!g_utf8_validate(name, -1, (const char **)&ptr))
1721 g_strlcpy(local_name->name, name,
1722 BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
1724 ret = BLUETOOTH_ERROR_INTERNAL;
1726 g_variant_unref(result);
1727 g_variant_unref(temp);
1731 int _bt_set_local_name(char *local_name)
1734 GError *error = NULL;
1738 BT_CHECK_PARAMETER(local_name, return);
1740 proxy = _bt_get_adapter_properties_proxy();
1742 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
1744 if (!g_utf8_validate(local_name, -1, (const char **)&ptr))
1747 result = g_dbus_proxy_call_sync(proxy,
1749 g_variant_new("(ssv)", BT_ADAPTER_INTERFACE,
1750 "Alias", g_variant_new("s", local_name)),
1751 G_DBUS_CALL_FLAGS_NONE,
1757 if (error != NULL) {
1758 BT_ERR("Failed to set Alias (Error: %s)", error->message);
1759 g_clear_error(&error);
1761 BT_ERR("Failed to set Alias");
1762 return BLUETOOTH_ERROR_INTERNAL;
1765 g_variant_unref(result);
1766 return BLUETOOTH_ERROR_NONE;
1769 int _bt_is_service_used(char *service_uuid, gboolean *used)
1772 GError *error = NULL;
1773 int ret = BLUETOOTH_ERROR_NONE;
1775 GVariant *temp = NULL;
1776 GVariantIter *iter = NULL;
1780 BT_CHECK_PARAMETER(service_uuid, return);
1781 BT_CHECK_PARAMETER(used, return);
1783 proxy = _bt_get_adapter_properties_proxy();
1784 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
1786 result = g_dbus_proxy_call_sync(proxy,
1788 g_variant_new("(ss)", BT_ADAPTER_INTERFACE,
1790 G_DBUS_CALL_FLAGS_NONE,
1796 if (error != NULL) {
1797 BT_ERR("Failed to get UUIDs (Error: %s)", error->message);
1798 g_clear_error(&error);
1800 BT_ERR("Failed to get UUIDs");
1801 return BLUETOOTH_ERROR_INTERNAL;
1804 g_variant_get(result, "(v)", &temp);
1805 g_variant_get(temp, "as", &iter);
1808 while (g_variant_iter_loop(iter, "&s", &uuid)) {
1809 if (strcasecmp(uuid, service_uuid) == 0) {
1814 g_variant_iter_free(iter);
1815 g_variant_unref(result);
1817 BT_DBG("Service Used? %d", *used);
1822 static gboolean __bt_get_discoverable_property(void)
1825 gboolean discoverable_v;
1826 GError *error = NULL;
1830 proxy = _bt_get_adapter_properties_proxy();
1831 retv_if(proxy == NULL, FALSE);
1833 result = g_dbus_proxy_call_sync(proxy,
1835 g_variant_new("(ss)", BT_ADAPTER_INTERFACE,
1837 G_DBUS_CALL_FLAGS_NONE,
1843 if (error != NULL) {
1844 BT_ERR("Failed to get Discoverable property (Error: %s)", error->message);
1845 g_clear_error(&error);
1847 BT_ERR("Failed to get Discoverable property");
1848 return BLUETOOTH_ERROR_INTERNAL;
1851 g_variant_get(result, "(v)", &temp);
1852 discoverable_v = g_variant_get_boolean(temp);
1853 BT_DBG("discoverable_v:%d", discoverable_v);
1855 g_variant_unref(result);
1856 g_variant_unref(temp);
1858 return discoverable_v;
1861 int _bt_get_discoverable_mode(int *mode)
1863 gboolean discoverable;
1864 unsigned int timeout;
1866 BT_CHECK_PARAMETER(mode, return);
1868 discoverable = __bt_get_discoverable_property();
1869 timeout = _bt_get_discoverable_timeout_property();
1871 if (discoverable == TRUE) {
1873 *mode = BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE;
1875 *mode = BLUETOOTH_DISCOVERABLE_MODE_TIME_LIMITED_DISCOVERABLE;
1877 *mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
1879 return BLUETOOTH_ERROR_NONE;
1883 int _bt_set_discoverable_mode(int discoverable_mode, int timeout)
1885 int ret = BLUETOOTH_ERROR_NONE;
1888 GError *error = NULL;
1892 proxy = _bt_get_adapter_properties_proxy();
1894 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
1896 #ifdef TIZEN_DPM_ENABLE
1897 if (discoverable_mode != BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE &&
1898 _bt_dpm_get_bluetooth_limited_discoverable_state() == DPM_RESTRICTED) {
1899 _bt_launch_dpm_popup("DPM_POLICY_DISABLE_BT_HANDSFREE");
1900 return BLUETOOTH_ERROR_ACCESS_DENIED;
1902 if (discoverable_mode != BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE &&
1903 _bt_dpm_get_bluetooth_limited_discoverable_state() == DPM_RESTRICTED) {
1904 _bt_launch_dpm_popup("DPM_POLICY_DISABLE_BT");
1905 return BLUETOOTH_ERROR_ACCESS_DENIED;
1909 switch (discoverable_mode) {
1910 case BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE:
1915 case BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE:
1920 case BLUETOOTH_DISCOVERABLE_MODE_TIME_LIMITED_DISCOVERABLE:
1925 return BLUETOOTH_ERROR_INVALID_PARAM;
1928 BT_INFO("Req. discoverable_mode : %d, timeout : %d",
1929 discoverable_mode, timeout);
1931 result = g_dbus_proxy_call_sync(proxy,
1933 g_variant_new("(ssv)", BT_ADAPTER_INTERFACE,
1934 "Connectable", g_variant_new("b", pg_scan)),
1935 G_DBUS_CALL_FLAGS_NONE,
1941 if (error != NULL) {
1942 BT_ERR("Failed to set connectable property (Error: %s)", error->message);
1943 g_clear_error(&error);
1945 BT_ERR("Failed to set connectable property");
1946 return BLUETOOTH_ERROR_INTERNAL;
1948 g_variant_unref(result);
1949 result = g_dbus_proxy_call_sync(proxy,
1951 g_variant_new("(ssv)", BT_ADAPTER_INTERFACE, "Discoverable",
1952 g_variant_new("b", inq_scan)),
1953 G_DBUS_CALL_FLAGS_NONE,
1959 if (error != NULL) {
1960 BT_ERR("Failed to set Discoverable property (Error: %s)", error->message);
1961 g_clear_error(&error);
1963 BT_ERR("Failed to set Discoverable property");
1964 return BLUETOOTH_ERROR_INTERNAL;
1966 g_variant_unref(result);
1967 result = g_dbus_proxy_call_sync(proxy,
1969 g_variant_new("(ssv)", BT_ADAPTER_INTERFACE,
1970 "DiscoverableTimeout", g_variant_new("u", timeout)),
1971 G_DBUS_CALL_FLAGS_NONE,
1977 if (error != NULL) {
1978 BT_ERR("Failed to set DiscoverableTimeout property (Error: %s)", error->message);
1979 g_clear_error(&error);
1981 BT_ERR("Failed to set DiscoverableTimeout property");
1982 return BLUETOOTH_ERROR_INTERNAL;
1985 if (discoverable_mode == BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE)
1988 ret = __bt_set_visible_time(timeout);
1990 g_variant_unref(result);
1995 int _bt_start_discovery(void)
1998 GError *error = NULL;
2001 if (_bt_is_discovering() == TRUE) {
2002 BT_ERR("BT is already in discovering");
2003 return BLUETOOTH_ERROR_IN_PROGRESS;
2004 } else if (_bt_is_device_creating() == TRUE) {
2005 BT_ERR("Bonding device is going on");
2006 return BLUETOOTH_ERROR_DEVICE_BUSY;
2009 proxy = _bt_get_adapter_proxy();
2010 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
2012 result = g_dbus_proxy_call_sync(proxy,
2015 G_DBUS_CALL_FLAGS_NONE,
2021 if (error != NULL) {
2022 BT_ERR("StartDiscovery failed (Error: %s)", error->message);
2023 g_clear_error(&error);
2025 BT_ERR("StartDiscovery failed");
2026 return BLUETOOTH_ERROR_INTERNAL;
2029 is_discovering = TRUE;
2030 cancel_by_user = FALSE;
2031 /* discovery status will be change in event */
2032 g_variant_unref(result);
2033 return BLUETOOTH_ERROR_NONE;
2036 int _bt_start_custom_discovery(bt_discovery_role_type_t role)
2040 GError *error = NULL;
2041 const gchar *disc_type;
2043 if (_bt_is_discovering() == TRUE) {
2044 BT_ERR("BT is already in discovering");
2045 return BLUETOOTH_ERROR_IN_PROGRESS;
2048 proxy = _bt_get_adapter_proxy();
2049 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
2051 if (role == DISCOVERY_ROLE_BREDR)
2052 disc_type = "BREDR";
2053 else if (role == DISCOVERY_ROLE_LE)
2055 else if (role == DISCOVERY_ROLE_LE_BREDR)
2056 disc_type = "LE_BREDR";
2058 return BLUETOOTH_ERROR_INVALID_PARAM;
2060 result = g_dbus_proxy_call_sync(proxy,
2061 "StartCustomDiscovery",
2062 g_variant_new("s", disc_type),
2063 G_DBUS_CALL_FLAGS_NONE,
2069 if (error != NULL) {
2070 BT_ERR("StartCustomDiscovery failed (Error: %s)", error->message);
2071 g_clear_error(&error);
2073 BT_ERR("StartCustomDiscovery failed");
2074 return BLUETOOTH_ERROR_INTERNAL;
2077 is_discovering = TRUE;
2078 cancel_by_user = FALSE;
2079 /* discovery status will be change in event */
2080 g_variant_unref(result);
2081 return BLUETOOTH_ERROR_NONE;
2084 int _bt_cancel_discovery(void)
2087 GError *error = NULL;
2090 if (_bt_is_discovering() == FALSE) {
2091 BT_ERR("BT is not in discovering");
2092 return BLUETOOTH_ERROR_NOT_IN_OPERATION;
2095 proxy = _bt_get_adapter_proxy();
2096 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
2098 result = g_dbus_proxy_call_sync(proxy,
2101 G_DBUS_CALL_FLAGS_NONE,
2107 int ret = BLUETOOTH_ERROR_INTERNAL;
2108 if (error != NULL) {
2109 BT_ERR("StopDiscovery failed (Error: %s)", error->message);
2111 if (g_strrstr(error->message, "No discovery started"))
2112 ret = BLUETOOTH_ERROR_NOT_IN_OPERATION;
2114 g_clear_error(&error);
2116 BT_ERR("StopDiscovery failed");
2122 cancel_by_user = TRUE;
2123 /* discovery status will be change in event */
2124 g_variant_unref(result);
2125 return BLUETOOTH_ERROR_NONE;
2128 gboolean _bt_is_discovering(void)
2130 return is_discovering;
2133 gboolean _bt_is_connectable(void)
2136 GError *error = NULL;
2137 gboolean is_connectable = FALSE;
2141 proxy = _bt_get_adapter_properties_proxy();
2142 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
2144 result = g_dbus_proxy_call_sync(proxy,
2146 g_variant_new("(ss)", BT_ADAPTER_INTERFACE,
2148 G_DBUS_CALL_FLAGS_NONE,
2154 if (error != NULL) {
2155 BT_ERR("Failed to get connectable property (Error: %s)", error->message);
2156 g_clear_error(&error);
2158 BT_ERR("Failed to get connectable property");
2159 return BLUETOOTH_ERROR_INTERNAL;
2162 g_variant_get(result, "(v)", &temp);
2163 is_connectable = g_variant_get_boolean(temp);
2164 BT_DBG("discoverable_v:%d", is_connectable);
2166 g_variant_unref(result);
2167 g_variant_unref(temp);
2169 BT_INFO("Get connectable [%d]", is_connectable);
2170 return is_connectable;
2173 int _bt_set_connectable(gboolean is_connectable)
2176 GError *error = NULL;
2179 if (__bt_is_factory_test_mode()) {
2180 BT_ERR("Unable to set connectable in factory binary !!");
2181 return BLUETOOTH_ERROR_NOT_SUPPORT;
2184 proxy = _bt_get_adapter_properties_proxy();
2186 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
2188 result = g_dbus_proxy_call_sync(proxy,
2190 g_variant_new("(ssv)", BT_ADAPTER_INTERFACE, "Connectable",
2191 g_variant_new("b", is_connectable)),
2192 G_DBUS_CALL_FLAGS_NONE,
2198 if (error != NULL) {
2199 BT_ERR("Failed to set connectable property (Error: %s)", error->message);
2200 g_clear_error(&error);
2202 BT_ERR("Failed to set connectable property");
2203 return BLUETOOTH_ERROR_INTERNAL;
2206 BT_INFO("### Set connectable [%d]", is_connectable);
2207 g_variant_unref(result);
2208 return BLUETOOTH_ERROR_NONE;
2211 gboolean _bt_get_discovering_property(bt_discovery_role_type_t discovery_type)
2214 gboolean discovering_v;
2215 GError *error = NULL;
2216 char *discovering_type = NULL;
2220 proxy = _bt_get_adapter_properties_proxy();
2221 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
2223 if (discovery_type == DISCOVERY_ROLE_BREDR)
2224 discovering_type = "Discovering";
2225 else if (discovery_type == DISCOVERY_ROLE_LE)
2226 discovering_type = "LEDiscovering";
2228 result = g_dbus_proxy_call_sync(proxy,
2230 g_variant_new("(ss)", BT_ADAPTER_INTERFACE,
2232 G_DBUS_CALL_FLAGS_NONE,
2238 if (error != NULL) {
2239 BT_ERR("Failed to get discovering property (Error: %s)", error->message);
2240 g_clear_error(&error);
2242 BT_ERR("Failed to get discovering property");
2243 return BLUETOOTH_ERROR_INTERNAL;
2246 g_variant_get(result, "(v)", &temp);
2247 discovering_v = g_variant_get_boolean(temp);
2248 BT_DBG("discoverable_v:%d", discovering_v);
2250 g_variant_unref(result);
2251 g_variant_unref(temp);
2253 return discovering_v;
2256 unsigned int _bt_get_discoverable_timeout_property(void)
2259 unsigned int timeout_v;
2260 GError *error = NULL;
2264 proxy = _bt_get_adapter_properties_proxy();
2265 retv_if(proxy == NULL, 0);
2267 result = g_dbus_proxy_call_sync(proxy,
2269 g_variant_new("(ss)", BT_ADAPTER_INTERFACE,
2270 "DiscoverableTimeout"),
2271 G_DBUS_CALL_FLAGS_NONE,
2277 BT_ERR("Fail to get discoverable timeout");
2278 if (error != NULL) {
2279 BT_ERR("Fail to get discoverable timeout (Error: %s)", error->message);
2280 g_clear_error(&error);
2285 g_variant_get(result, "(v)", &temp);
2286 timeout_v = g_variant_get_uint32(temp);
2287 BT_DBG("discoverable_v:%d", timeout_v);
2289 g_variant_unref(result);
2290 g_variant_unref(temp);
2295 static bluetooth_device_info_t *__bt_parse_device_info(GVariantIter *item_iter)
2297 bluetooth_device_info_t *dev_info;
2300 GByteArray *manufacturer_data = NULL;
2302 GVariantIter *char_value_iter;
2304 dev_info = g_malloc0(sizeof(bluetooth_device_info_t));
2306 while (g_variant_iter_loop(item_iter, "{sv}", &key, &value)) {
2311 if (!g_strcmp0(key, "Address")) {
2312 const char *address = NULL;
2313 address = g_variant_get_string(value, NULL);
2314 _bt_convert_addr_string_to_type(dev_info->device_address.addr,
2316 } else if (!g_strcmp0(key, "Class")) {
2318 cod = g_variant_get_uint32(value);
2319 _bt_divide_device_class(&dev_info->device_class, cod);
2320 } else if (!g_strcmp0(key, "Name")) {
2321 const char *name = NULL;
2322 name = g_variant_get_string(value, NULL);
2323 /* If there is no Alias */
2324 if (strlen(dev_info->device_name.name) == 0) {
2325 g_strlcpy(dev_info->device_name.name, name,
2326 BLUETOOTH_DEVICE_NAME_LENGTH_MAX+1);
2328 } else if (!g_strcmp0(key, "Alias")) {
2329 const char *alias = NULL;
2330 alias = g_variant_get_string(value, NULL);
2331 /* Overwrite the name */
2333 memset(dev_info->device_name.name, 0x00,
2334 BLUETOOTH_DEVICE_NAME_LENGTH_MAX+1);
2335 g_strlcpy(dev_info->device_name.name, alias,
2336 BLUETOOTH_DEVICE_NAME_LENGTH_MAX+1);
2338 } else if (!g_strcmp0(key, "IsAliasSet")) {
2339 dev_info->is_alias_set = g_variant_get_boolean(value);
2340 } else if (!g_strcmp0(key, "Connected")) {
2341 dev_info->connected = g_variant_get_byte(value);
2342 } else if (!g_strcmp0(key, "Paired")) {
2343 dev_info->paired = g_variant_get_boolean(value);
2344 } else if (!g_strcmp0(key, "Trusted")) {
2345 dev_info->trust = g_variant_get_boolean(value);
2346 } else if (!g_strcmp0(key, "RSSI")) {
2347 dev_info->rssi = g_variant_get_int16(value);
2348 } else if (!g_strcmp0(key, "UUIDs")) {
2354 dev_info->service_index = 0;
2355 g_variant_get(value, "as", &iter);
2356 while (g_variant_iter_loop(iter, "s", &uuid)) {
2357 g_strlcpy(dev_info->uuids[i], uuid, BLUETOOTH_UUID_STRING_MAX);
2358 parts = g_strsplit(uuid, "-", -1);
2360 if (parts == NULL || parts[0] == NULL) {
2365 dev_info->service_list_array[i] = g_ascii_strtoull(parts[0], NULL, 16);
2370 dev_info->service_index = i;
2371 g_variant_iter_free(iter);
2372 } else if (strcasecmp(key, "ManufacturerDataLen") == 0) {
2373 dev_info->manufacturer_data.data_len = g_variant_get_uint16(value);
2374 } else if (strcasecmp(key, "ManufacturerData") == 0) {
2375 manufacturer_data = g_byte_array_new();
2376 g_variant_get(value, "ay", &char_value_iter);
2377 while (g_variant_iter_loop(char_value_iter, "y", &char_value)) {
2378 g_byte_array_append(manufacturer_data, &char_value, 1);
2380 if (manufacturer_data) {
2381 if (manufacturer_data->len > 0) {
2382 memcpy(dev_info->manufacturer_data.data, manufacturer_data->data, manufacturer_data->len);
2385 g_variant_iter_free(char_value_iter);
2386 g_byte_array_free(manufacturer_data, TRUE);
2393 static void __bt_extract_device_info(GVariantIter *iter,
2396 bluetooth_device_info_t *dev_info = NULL;
2397 char *object_path = NULL;
2398 GVariantIter *interface_iter;
2399 GVariantIter *svc_iter;
2400 char *interface_str = NULL;
2402 /* Parse the signature: oa{sa{sv}}} */
2403 while (g_variant_iter_loop(iter, "{&oa{sa{sv}}}", &object_path,
2406 if (object_path == NULL)
2409 while (g_variant_iter_loop(interface_iter, "{sa{sv}}",
2410 &interface_str, &svc_iter)) {
2411 if (g_strcmp0(interface_str, "org.bluez.Device1") == 0) {
2412 BT_DBG("Found a device: %s", object_path);
2413 dev_info = __bt_parse_device_info(svc_iter);
2415 if (dev_info->paired == TRUE) {
2416 g_array_append_vals(*dev_list, dev_info,
2417 sizeof(bluetooth_device_info_t));
2421 g_free(interface_str);
2422 g_variant_iter_free(svc_iter);
2430 int _bt_get_bonded_devices(GArray **dev_list)
2433 GDBusConnection *conn;
2434 GDBusProxy *manager_proxy;
2435 GVariant *result = NULL;
2436 GVariantIter *iter = NULL;
2437 GError *error = NULL;
2439 conn = _bt_get_system_conn();
2440 retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
2442 manager_proxy = _bt_get_manager_proxy();
2443 retv_if(manager_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
2445 result = g_dbus_proxy_call_sync(manager_proxy, "GetManagedObjects",
2447 G_DBUS_CALL_FLAGS_NONE,
2453 if (error != NULL) {
2454 BT_ERR("Failed to GetManagedObjects (Error: %s)", error->message);
2455 g_clear_error(&error);
2457 BT_ERR("Failed to Failed to GetManagedObjects");
2458 return BLUETOOTH_ERROR_INTERNAL;
2461 /* signature of GetManagedObjects: a{oa{sa{sv}}} */
2462 g_variant_get(result, "(a{oa{sa{sv}}})", &iter);
2464 __bt_extract_device_info(iter, dev_list);
2465 g_variant_iter_free(iter);
2466 g_variant_unref(result);
2469 return BLUETOOTH_ERROR_NONE;
2472 int _bt_get_profile_connected_devices(char *profile_uuid, GArray **addr_list)
2475 GDBusConnection *conn;
2476 GDBusProxy *manager_proxy;
2477 GVariant *result = NULL;
2478 GVariant *result1 = NULL;
2479 GVariantIter *iter = NULL;
2480 GError *error = NULL;
2481 char *object_path = NULL;
2482 GVariantIter *interface_iter;
2483 char *interface_str = NULL;
2484 GDBusProxy *device_proxy = NULL;
2485 gboolean is_connected = FALSE;
2487 conn = _bt_get_system_conn();
2488 retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
2490 manager_proxy = _bt_get_manager_proxy();
2491 retv_if(manager_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
2493 result = g_dbus_proxy_call_sync(manager_proxy, "GetManagedObjects",
2495 G_DBUS_CALL_FLAGS_NONE,
2501 if (error != NULL) {
2502 BT_ERR("Failed to GetManagedObjects (Error: %s)", error->message);
2503 g_clear_error(&error);
2506 BT_ERR("Failed to Failed to GetManagedObjects");
2507 return BLUETOOTH_ERROR_INTERNAL;
2510 /* signature of GetManagedObjects: a{oa{sa{sv}}} */
2511 g_variant_get(result, "(a{oa{sa{sv}}})", &iter);
2513 /* Parse the signature: oa{sa{sv}}} */
2514 while (g_variant_iter_loop(iter, "{&oa{sa{sv}}}", &object_path, &interface_iter)) {
2515 if (object_path == NULL)
2518 while (g_variant_iter_loop(interface_iter, "{sa{sv}}",
2519 &interface_str, NULL)) {
2520 if (g_strcmp0(interface_str, "org.bluez.Device1") == 0) {
2521 BT_DBG("Found a device: %s", object_path);
2522 g_free(interface_str);
2524 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
2525 NULL, BT_BLUEZ_NAME,
2526 object_path, BT_DEVICE_INTERFACE, NULL, NULL);
2528 if (device_proxy == NULL) {
2529 BT_DBG("Device don't have this service");
2533 result1 = g_dbus_proxy_call_sync(device_proxy, "IsConnectedProfile",
2534 g_variant_new("(s)", profile_uuid),
2535 G_DBUS_CALL_FLAGS_NONE,
2540 if (result1 == NULL) {
2541 BT_ERR("Error occured in Proxy call");
2543 BT_ERR("Error occured in Proxy call [%s]\n", error->message);
2544 g_error_free(error);
2547 g_object_unref(device_proxy);
2550 g_variant_get(result1, "(b)", &is_connected);
2552 if (is_connected == TRUE) {
2553 char address[BT_ADDRESS_STRING_SIZE];
2554 bluetooth_device_address_t *addr = NULL;
2556 _bt_convert_device_path_to_address(object_path, address);
2558 addr = g_malloc0(sizeof(bluetooth_device_address_t));
2559 _bt_convert_addr_string_to_type(addr->addr, address);
2561 g_array_append_vals(*addr_list, addr,
2562 sizeof(bluetooth_device_address_t));
2565 g_variant_unref(result1);
2566 g_object_unref(device_proxy);
2573 g_variant_unref(result);
2574 g_variant_iter_free(iter);
2577 return BLUETOOTH_ERROR_NONE;
2580 int _bt_get_bonded_device_info(bluetooth_device_address_t *device_address,
2581 bluetooth_device_info_t *dev_info)
2583 char *object_path = NULL;
2584 GDBusProxy *adapter_proxy;
2585 char address[BT_ADDRESS_STRING_SIZE] = { 0 };
2586 int ret = BLUETOOTH_ERROR_NONE;
2588 BT_CHECK_PARAMETER(device_address, return);
2589 BT_CHECK_PARAMETER(dev_info, return);
2591 adapter_proxy = _bt_get_adapter_proxy();
2592 retv_if(adapter_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
2594 _bt_convert_addr_type_to_string(address, device_address->addr);
2596 object_path = _bt_get_device_object_path(address);
2598 retv_if(object_path == NULL, BLUETOOTH_ERROR_NOT_PAIRED);
2600 ret = __bt_get_bonded_device_info(object_path, dev_info);
2601 g_free(object_path);
2606 int _bt_get_timeout_value(int *timeout)
2608 time_t current_time;
2611 /* Take current time */
2612 time(¤t_time);
2613 time_diff = difftime(current_time, visible_timer.start_time);
2615 BT_DBG("Time diff = %d\n", time_diff);
2617 *timeout = visible_timer.timeout - time_diff;
2619 return BLUETOOTH_ERROR_NONE;
2622 int _bt_set_le_privacy(gboolean set_privacy)
2625 GError *error = NULL;
2626 GVariant *result = NULL;
2628 if (__bt_is_factory_test_mode()) {
2629 BT_ERR("Unable to set le privacy in factory binary !!");
2630 return BLUETOOTH_ERROR_NOT_SUPPORT;
2633 if (_bt_adapter_get_status() != BT_ACTIVATED &&
2634 _bt_adapter_get_le_status() != BT_LE_ACTIVATED) {
2635 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
2638 proxy = _bt_get_adapter_proxy();
2639 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
2641 result = g_dbus_proxy_call_sync(proxy,
2643 g_variant_new("(b)", set_privacy),
2644 G_DBUS_CALL_FLAGS_NONE,
2650 if (error != NULL) {
2651 BT_ERR("Failed to SetLePrivacy (Error: %s)", error->message);
2652 g_clear_error(&error);
2654 BT_ERR("Failed to SetLePrivacy");
2655 return BLUETOOTH_ERROR_INTERNAL;
2658 g_variant_unref(result);
2659 BT_INFO("SetLePrivacy as %d", set_privacy);
2660 return BLUETOOTH_ERROR_NONE;
2663 int _bt_set_le_static_random_address(gboolean is_enable)
2666 GError *error = NULL;
2667 GVariant *result = NULL;
2669 if (__bt_is_factory_test_mode()) {
2670 BT_ERR("Unable to set le random address in factory binary !!");
2671 return BLUETOOTH_ERROR_NOT_SUPPORT;
2674 if (_bt_adapter_get_status() != BT_ACTIVATED &&
2675 _bt_adapter_get_le_status() != BT_LE_ACTIVATED) {
2676 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
2679 proxy = _bt_get_adapter_proxy();
2680 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
2682 result = g_dbus_proxy_call_sync(proxy,
2683 "SetLeStaticRandomAddress",
2684 g_variant_new("(b)", is_enable),
2685 G_DBUS_CALL_FLAGS_NONE,
2691 if (error != NULL) {
2692 BT_ERR("Failed to SetLeStaticRandomAddress (Error: %s)", error->message);
2693 g_clear_error(&error);
2695 BT_ERR("Failed to SetLeStaticRandomAddress");
2696 return BLUETOOTH_ERROR_INTERNAL;
2699 g_variant_unref(result);
2700 BT_INFO("SetLeStaticRandomAddress as %d", is_enable);
2701 return BLUETOOTH_ERROR_NONE;
2704 int _bt_set_manufacturer_data(bluetooth_manufacturer_data_t *m_data)
2707 GError *error = NULL;
2711 GVariantBuilder *builder;
2713 BT_CHECK_PARAMETER(m_data, return);
2715 if (_bt_adapter_get_status() != BT_ACTIVATED &&
2716 _bt_adapter_get_le_status() != BT_LE_ACTIVATED) {
2717 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
2720 proxy = _bt_get_adapter_proxy();
2721 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
2723 builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
2725 for (i = 0; i < (m_data->data_len) + 2; i++) {
2726 g_variant_builder_add(builder, "y", m_data->data[i]);
2729 val = g_variant_new("(ay)", builder);
2731 result = g_dbus_proxy_call_sync(proxy,
2732 "SetManufacturerData",
2734 G_DBUS_CALL_FLAGS_NONE,
2738 g_variant_builder_unref(builder);
2740 if (error != NULL) {
2741 BT_ERR("Failed to SetManufacturerData (Error: %s)", error->message);
2742 g_clear_error(&error);
2744 BT_ERR("Failed to SetManufacturerData");
2746 return BLUETOOTH_ERROR_INTERNAL;
2748 builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
2750 for (i = 0; i < (m_data->data_len) + 2; i++) {
2751 g_variant_builder_add(builder, "y", m_data->data[i]);
2754 val = g_variant_new("(ay)", builder);
2756 _bt_send_event(BT_ADAPTER_EVENT,
2757 BLUETOOTH_EVENT_MANUFACTURER_DATA_CHANGED,
2760 BT_INFO("Set manufacturer data");
2762 g_variant_builder_unref(builder);
2763 g_variant_unref(result);
2765 return BLUETOOTH_ERROR_NONE;
2769 int _bt_service_set_alarm(int timeout, bt_set_alarm_cb call_back, void *user_data, alarm_id_t *alarm_id)
2771 int result = BLUETOOTH_ERROR_NONE;
2772 bt_service_alarm_t *alarm = NULL;
2774 if(!call_back || !alarm_id)
2775 return BLUETOOTH_ERROR_INVALID_PARAM;
2777 if (!alarm_mgr.is_alarm_initialized) {
2778 result = alarmmgr_init("bt-service");
2780 BT_ERR("Failed to initialize alarm = %d",result);
2781 result = BLUETOOTH_ERROR_INTERNAL;
2784 result = alarmmgr_set_cb(alarm_cb, NULL);
2786 BT_ERR("Failed to set the callback = %d",result);
2787 result = BLUETOOTH_ERROR_INTERNAL;
2790 alarm_mgr.is_alarm_initialized = TRUE;
2793 alarm = g_malloc0(sizeof(bt_service_alarm_t));
2795 return BLUETOOTH_ERROR_MEMORY_ALLOCATION;
2797 result = alarmmgr_add_alarm(ALARM_TYPE_VOLATILE, timeout,
2800 BT_ERR("Failed to create alarm error = %d",result);
2801 result = BLUETOOTH_ERROR_INTERNAL;
2805 alarm->alarm_id = *alarm_id;
2806 alarm->callback = call_back;
2807 alarm->user_data = user_data;
2809 alarm_mgr.g_alarm_list = g_list_append(alarm_mgr.g_alarm_list, alarm);
2810 result = BLUETOOTH_ERROR_NONE;
2815 static int alarm_cb(alarm_id_t alarm_id, void* user_param)
2818 bt_service_alarm_t *p_data;
2819 bt_set_alarm_cb callback = NULL;
2820 void *user_data = NULL;
2822 node = g_list_find_custom(alarm_mgr.g_alarm_list,
2823 GINT_TO_POINTER(alarm_id), compare_alarm);
2827 p_data = (bt_service_alarm_t *)node->data;
2828 alarm_mgr.g_alarm_list = g_list_delete_link(alarm_mgr.g_alarm_list,
2834 callback = p_data->callback;
2835 user_data = p_data->user_data;
2839 callback(alarm_id, user_data);
2844 int _bt_service_remove_alarm(alarm_id_t alarm_id)
2847 bt_service_alarm_t *p_data;
2848 list = g_list_find_custom(alarm_mgr.g_alarm_list, GINT_TO_POINTER(alarm_id), compare_alarm);
2851 alarmmgr_remove_alarm(alarm_id);
2852 p_data = (bt_service_alarm_t *)list->data;
2853 alarm_mgr.g_alarm_list = g_list_remove(alarm_mgr.g_alarm_list, list->data);
2860 gint compare_alarm(gconstpointer list_data, gconstpointer data)
2862 alarm_id_t alarm_id = (alarm_id_t)data;
2863 bt_service_alarm_t *p_data = (bt_service_alarm_t *)list_data;
2865 if (p_data->alarm_id == alarm_id) {
2871 static void alarm_data_free(void *data)
2873 bt_service_alarm_t *p_data = (bt_service_alarm_t *)data;
2878 static gboolean _bt_adapter_request_delayed_cb(gpointer user_data)
2881 int function = (int)user_data;
2884 case BT_ENABLE_ADAPTER:
2885 result = _bt_enable_adapter();
2886 if (result != BLUETOOTH_ERROR_NONE) {
2887 BT_ERR("_bt_enable_adapter is failed");
2888 /* Send enabled event to API */
2889 _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_ENABLED,
2890 g_variant_new("(i)", result));
2893 case BT_DISABLE_ADAPTER:
2894 result = _bt_disable_adapter();
2895 if (result != BLUETOOTH_ERROR_NONE) {
2896 BT_ERR("_bt_disable_adapter is failed");
2897 /* Send disabled event to API */
2898 _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_DISABLED,
2899 g_variant_new("(i)", result));
2903 BT_ERR("function is NOT matched");
2910 int _bt_adapter_request_delayed(int function)
2912 bt_status_t status = _bt_adapter_get_status();
2913 bt_le_status_t le_status = _bt_adapter_get_le_status();
2916 case BT_ENABLE_ADAPTER:
2917 if (status == BT_ACTIVATING) {
2918 BT_ERR("Enabling in progress");
2919 return BLUETOOTH_ERROR_IN_PROGRESS;
2922 if (status == BT_ACTIVATED) {
2923 BT_ERR("Already enabled");
2924 return BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED;
2927 if (status == BT_DEACTIVATING || le_status == BT_LE_DEACTIVATING) {
2928 BT_ERR("Disabling in progress");
2929 return BLUETOOTH_ERROR_DEVICE_BUSY;
2933 case BT_DISABLE_ADAPTER:
2934 if (status == BT_DEACTIVATING) {
2935 BT_DBG("Disabling in progress");
2936 return BLUETOOTH_ERROR_IN_PROGRESS;
2939 if (status == BT_DEACTIVATED) {
2940 BT_DBG("Already disabled");
2941 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
2946 BT_ERR("function is NOT matched");
2947 return BLUETOOTH_ERROR_INTERNAL;
2950 g_idle_add((GSourceFunc)_bt_adapter_request_delayed_cb, (void*)function);
2952 return BLUETOOTH_ERROR_NONE;
2956 int _bt_get_enable_timer_id(void)