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.
21 #include "bluetooth-api.h"
22 #include "bt-internal-types.h"
24 #include "bt-common.h"
25 #include "bt-request-sender.h"
26 #include "bt-event-handler.h"
28 static gboolean is_le_scanning = FALSE;
29 static int is_scan_filter_supported = -1;
31 BT_EXPORT_API int bluetooth_check_adapter_le(void)
36 ret = _bt_get_adapter_path(_bt_gdbus_get_system_gconn(), NULL);
38 if (ret != BLUETOOTH_ERROR_NONE)
39 return BLUETOOTH_ADAPTER_LE_DISABLED;
41 ret = vconf_get_int(VCONFKEY_BT_LE_STATUS, &value);
43 BT_ERR("fail to get vconf key!");
47 BT_DBG("value : %d", value);
48 return value == VCONFKEY_BT_LE_STATUS_ON ? BLUETOOTH_ADAPTER_LE_ENABLED :
49 BLUETOOTH_ADAPTER_LE_DISABLED;
52 BT_EXPORT_API int bluetooth_enable_adapter_le(void)
57 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
59 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_ENABLE_ADAPTER_LE,
60 in_param1, in_param2, in_param3, in_param4, &out_param);
62 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
66 BT_EXPORT_API int bluetooth_disable_adapter_le(void)
69 retv_if(bluetooth_check_adapter_le() == BLUETOOTH_ADAPTER_LE_DISABLED,
70 BLUETOOTH_ERROR_DEVICE_NOT_ENABLED);
73 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
75 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_DISABLE_ADAPTER_LE,
76 in_param1, in_param2, in_param3, in_param4, &out_param);
78 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
83 void _bt_set_le_scan_status(gboolean mode)
85 BT_DBG("set LE scan mode : %d", mode);
86 is_le_scanning = mode;
89 BT_EXPORT_API gboolean bluetooth_is_le_scanning(void)
91 return is_le_scanning;
94 BT_EXPORT_API int bluetooth_start_le_discovery(void)
98 BT_CHECK_ENABLED_ANY(return);
101 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
103 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_START_LE_DISCOVERY,
104 in_param1, in_param2, in_param3, in_param4, &out_param);
106 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
108 if (result == BLUETOOTH_ERROR_NONE)
109 _bt_set_le_scan_status(TRUE);
114 BT_EXPORT_API int bluetooth_stop_le_discovery(void)
118 BT_CHECK_ENABLED_ANY(return);
121 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
123 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_STOP_LE_DISCOVERY,
124 in_param1, in_param2, in_param3, in_param4, &out_param);
126 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
128 if (result == BLUETOOTH_ERROR_NONE)
129 _bt_set_le_scan_status(FALSE);
134 BT_EXPORT_API int bluetooth_is_le_discovering(void)
137 int is_discovering = FALSE;
139 BT_CHECK_ENABLED_ANY(return);
142 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
144 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_LE_DISCOVERYING,
145 in_param1, in_param2, in_param3, in_param4, &out_param);
147 if (result == BLUETOOTH_ERROR_NONE) {
148 is_discovering = g_array_index(out_param,
151 BT_ERR("Fail to send request");
154 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
156 return is_discovering;
159 BT_EXPORT_API gboolean bluetooth_is_scan_filter_supported(void)
163 if (is_scan_filter_supported == -1) {
165 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
167 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_SCAN_FILTER_SUPPORTED,
168 in_param1, in_param2, in_param3, in_param4, &out_param);
170 if (result == BLUETOOTH_ERROR_NONE)
171 is_scan_filter_supported = g_array_index(out_param, int, 0);
173 BT_ERR("Fail to send request");
175 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
178 if (is_scan_filter_supported == 1)
184 BT_EXPORT_API int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *filter, int *slot_id)
188 BT_CHECK_ENABLED_ANY(return);
191 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
193 g_array_append_vals(in_param1, filter, sizeof(bluetooth_le_scan_filter_t));
195 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_REGISTER_SCAN_FILTER,
196 in_param1, in_param2, in_param3, in_param4, &out_param);
198 if (result == BLUETOOTH_ERROR_NONE)
199 *slot_id = g_array_index(out_param, int, 0);
201 BT_ERR("Fail to send request");
203 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
208 BT_EXPORT_API int bluetooth_unregister_scan_filter(int slot_id)
212 BT_CHECK_ENABLED_ANY(return);
215 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
217 g_array_append_vals(in_param1, &slot_id, sizeof(int));
219 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_UNREGISTER_SCAN_FILTER,
220 in_param1, in_param2, in_param3, in_param4, &out_param);
222 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
227 BT_EXPORT_API int bluetooth_unregister_all_scan_filters(void)
231 BT_CHECK_ENABLED_ANY(return);
234 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
236 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_UNREGISTER_ALL_SCAN_FILTERS,
237 in_param1, in_param2, in_param3, in_param4, &out_param);
239 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
244 #ifdef TIZEN_PROFILE_WEARABLE
245 gboolean __bluetooth_is_privileged_process(void)
248 char path[30] = {0, };
249 char buf[256] = {0, };
251 snprintf(path, sizeof(path), "/proc/%d/cmdline", getpid());
252 fp = fopen(path, "r");
256 if (fgets(buf, 256, fp) != NULL) {
257 if (strstr(buf, "weconnd") != NULL) {
268 BT_EXPORT_API int bluetooth_set_advertising(int handle, gboolean enable)
271 gboolean use_reserved_slot = FALSE;
273 BT_CHECK_ENABLED_ANY(return);
275 #ifdef TIZEN_PROFILE_WEARABLE
276 use_reserved_slot = __bluetooth_is_privileged_process();
280 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
282 g_array_append_vals(in_param1, &handle, sizeof(int));
283 g_array_append_vals(in_param2, &enable, sizeof(gboolean));
284 g_array_append_vals(in_param3, &use_reserved_slot, sizeof(gboolean));
286 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_ADVERTISING,
287 in_param1, in_param2, in_param3, in_param4, &out_param);
289 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
294 BT_EXPORT_API int bluetooth_set_custom_advertising(int handle, gboolean enable,
295 bluetooth_advertising_params_t *params)
298 gboolean use_reserved_slot = FALSE;
300 BT_CHECK_ENABLED_ANY(return);
302 #ifdef TIZEN_PROFILE_WEARABLE
303 use_reserved_slot = __bluetooth_is_privileged_process();
307 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
309 g_array_append_vals(in_param1, &handle, sizeof(int));
310 g_array_append_vals(in_param2, &enable, sizeof(gboolean));
311 g_array_append_vals(in_param3, params, sizeof(bluetooth_advertising_params_t));
312 g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean));
314 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_CUSTOM_ADVERTISING,
315 in_param1, in_param2, in_param3, in_param4, &out_param);
317 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
322 BT_EXPORT_API int bluetooth_get_advertising_data(bluetooth_advertising_data_t *adv_data, int *length)
327 BT_CHECK_PARAMETER(adv_data, return);
328 BT_CHECK_PARAMETER(length, return);
329 BT_CHECK_ENABLED_ANY(return);
332 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
334 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_ADVERTISING_DATA,
335 in_param1, in_param2, in_param3, in_param4, &out_param);
337 if (result == BLUETOOTH_ERROR_NONE) {
338 data = &g_array_index(out_param, guint8, 0);
339 *length = out_param->len;
341 memset(adv_data, 0x00, sizeof(bluetooth_advertising_data_t));
342 memcpy(adv_data->data, data, *length);
345 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
350 BT_EXPORT_API int bluetooth_set_advertising_data(int handle, const bluetooth_advertising_data_t *value, int length)
353 gboolean use_reserved_slot = FALSE;
355 BT_CHECK_PARAMETER(value, return);
356 BT_CHECK_ENABLED_ANY(return);
358 if (length > BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 3)
359 return BLUETOOTH_ERROR_INVALID_PARAM;
361 #ifdef TIZEN_PROFILE_WEARABLE
362 use_reserved_slot = __bluetooth_is_privileged_process();
366 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
368 g_array_append_vals(in_param1, &handle, sizeof(int));
369 g_array_append_vals(in_param2, value, sizeof(bluetooth_advertising_data_t));
370 g_array_append_vals(in_param3, &length, sizeof(int));
371 g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean));
373 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_ADVERTISING_DATA,
374 in_param1, in_param2, in_param3, in_param4, &out_param);
376 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
381 BT_EXPORT_API int bluetooth_get_scan_response_data(bluetooth_scan_resp_data_t *value, int *length)
386 BT_CHECK_PARAMETER(value, return);
387 BT_CHECK_PARAMETER(length, return);
388 BT_CHECK_ENABLED_ANY(return);
391 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
393 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_SCAN_RESPONSE_DATA,
394 in_param1, in_param2, in_param3, in_param4, &out_param);
396 if (result == BLUETOOTH_ERROR_NONE) {
397 data = &g_array_index(out_param, guint8, 0);
398 *length = out_param->len;
400 memset(value, 0x00, sizeof(bluetooth_scan_resp_data_t));
401 memcpy(value->data, data, *length);
404 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
409 BT_EXPORT_API int bluetooth_set_scan_response_data(int handle,
410 const bluetooth_scan_resp_data_t *value, int length)
413 gboolean use_reserved_slot = FALSE;
415 BT_CHECK_PARAMETER(value, return);
416 BT_CHECK_ENABLED_ANY(return);
418 if (length > BLUETOOTH_SCAN_RESP_DATA_LENGTH_MAX)
419 return BLUETOOTH_ERROR_INVALID_PARAM;
421 #ifdef TIZEN_PROFILE_WEARABLE
422 use_reserved_slot = __bluetooth_is_privileged_process();
426 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
428 g_array_append_vals(in_param1, &handle, sizeof(int));
429 g_array_append_vals(in_param2, value, length);
430 g_array_append_vals(in_param3, &length, sizeof(int));
431 g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean));
433 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCAN_RESPONSE_DATA,
434 in_param1, in_param2, in_param3, in_param4, &out_param);
436 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
441 BT_EXPORT_API int bluetooth_set_scan_parameters(bluetooth_le_scan_params_t *params)
445 BT_CHECK_ENABLED_ANY(return);
448 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
450 g_array_append_vals(in_param1, params, sizeof(bluetooth_le_scan_params_t));
452 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCAN_PARAMETERS,
453 in_param1, in_param2, in_param3, in_param4, &out_param);
455 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
460 BT_EXPORT_API int bluetooth_is_advertising(gboolean *is_advertising)
464 BT_CHECK_ENABLED_ANY(return);
467 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
469 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_ADVERTISING,
470 in_param1, in_param2, in_param3, in_param4, &out_param);
472 if (result == BLUETOOTH_ERROR_NONE)
473 *is_advertising = g_array_index(out_param, int, 0);
475 BT_ERR("Fail to send request");
477 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
482 BT_EXPORT_API int bluetooth_add_white_list(bluetooth_device_address_t *address, bluetooth_device_address_type_t address_type)
486 BT_CHECK_PARAMETER(address, return);
487 BT_CHECK_ENABLED_ANY(return);
490 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
492 g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
493 g_array_append_vals(in_param2, &address_type, sizeof(int));
495 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_ADD_WHITE_LIST,
496 in_param1, in_param2, in_param3, in_param4, &out_param);
498 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
503 BT_EXPORT_API int bluetooth_remove_white_list(bluetooth_device_address_t *address, bluetooth_device_address_type_t address_type)
507 BT_CHECK_PARAMETER(address, return);
508 BT_CHECK_ENABLED_ANY(return);
511 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
513 g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
514 g_array_append_vals(in_param2, &address_type, sizeof(int));
516 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_REMOVE_WHITE_LIST,
517 in_param1, in_param2, in_param3, in_param4, &out_param);
519 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
524 BT_EXPORT_API int bluetooth_clear_white_list(void)
528 BT_CHECK_ENABLED_ANY(return);
531 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
533 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_CLEAR_WHITE_LIST,
534 in_param1, in_param2, in_param3, in_param4, &out_param);
536 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
541 BT_EXPORT_API int bluetooth_enable_le_privacy(gboolean enable_privacy)
545 BT_CHECK_ENABLED_ANY(return);
548 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
550 g_array_append_vals(in_param1, &enable_privacy, sizeof(gboolean));
552 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_LE_PRIVACY,
553 in_param1, in_param2, in_param3, in_param4, &out_param);
555 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
560 BT_EXPORT_API int bluetooth_set_le_static_random_address(gboolean enable)
564 BT_CHECK_ENABLED_ANY(return);
567 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
569 g_array_append_vals(in_param1, &enable, sizeof(gboolean));
571 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_LE_STATIC_RANDOM_ADDRESS,
572 in_param1, in_param2, in_param3, in_param4, &out_param);
574 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
579 BT_EXPORT_API int bluetooth_check_privilege_advertising_parameter(void)
581 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_SET_ADVERTISING_PARAMETERS)
582 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
583 BT_ERR("Don't have a privilege to use this API");
584 return BLUETOOTH_ERROR_PERMISSION_DEINED;
587 return BLUETOOTH_ERROR_NONE;
590 BT_EXPORT_API int bluetooth_le_register_callback(bluetooth_cb_func_ptr callback_ptr, void *user_data)
594 ret = _bt_register_event(BT_LE_ADAPTER_EVENT, (void *)callback_ptr, user_data);
595 if (ret != BLUETOOTH_ERROR_NONE &&
596 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
597 BT_ERR("Fail to register BT_LE_ADAPTER_EVENT event : %d", ret);
601 return BLUETOOTH_ERROR_NONE;
604 BT_EXPORT_API int bluetooth_le_unregister_callback(void)
606 _bt_unregister_event(BT_LE_ADAPTER_EVENT);
608 return BLUETOOTH_ERROR_NONE;
611 BT_EXPORT_API int bluetooth_le_read_maximum_data_length(
612 bluetooth_le_read_maximum_data_length_t *max_le_datalength)
614 BT_CHECK_ENABLED_ANY(return);
617 bluetooth_le_read_maximum_data_length_t *datalength = NULL;
619 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
621 result = _bt_send_request(BT_BLUEZ_SERVICE,
622 BT_LE_READ_MAXIMUM_DATA_LENGTH,
623 in_param1, in_param2, in_param3, in_param4, &out_param);
625 if (result == BLUETOOTH_ERROR_NONE) {
626 datalength = &g_array_index(out_param,
627 bluetooth_le_read_maximum_data_length_t, 0);
628 max_le_datalength->max_tx_octets = datalength->max_tx_octets;
629 max_le_datalength->max_tx_time = datalength->max_tx_time;
630 max_le_datalength->max_rx_octets = datalength->max_rx_octets;
631 max_le_datalength->max_rx_time = datalength->max_rx_time;
634 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
639 BT_EXPORT_API int bluetooth_le_write_host_suggested_default_data_length(
640 const unsigned int def_tx_Octets, const unsigned int def_tx_Time)
642 BT_CHECK_ENABLED_ANY(return);
647 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
649 g_array_append_vals(in_param1, &def_tx_Octets, sizeof(guint));
650 g_array_append_vals(in_param2, &def_tx_Time, sizeof(guint));
652 result = _bt_send_request(BT_BLUEZ_SERVICE,
653 BT_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH,
654 in_param1, in_param2, in_param3, in_param4, &out_param);
656 if (result != BLUETOOTH_ERROR_NONE)
657 BT_ERR("Failed to Write the host suggested default data length values : %d", result);
659 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
664 BT_EXPORT_API int bluetooth_le_read_suggested_default_data_length(
665 bluetooth_le_read_host_suggested_data_length_t *le_data_length)
667 BT_CHECK_ENABLED_ANY(return);
671 bluetooth_le_read_host_suggested_data_length_t *data_values = NULL;
672 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
674 result = _bt_send_request(BT_BLUEZ_SERVICE,
675 BT_LE_READ_HOST_SUGGESTED_DATA_LENGTH,
676 in_param1, in_param2, in_param3, in_param4, &out_param);
678 if (result == BLUETOOTH_ERROR_NONE) {
679 data_values = &g_array_index(out_param,
680 bluetooth_le_read_host_suggested_data_length_t, 0);
682 le_data_length->def_tx_octets = data_values->def_tx_octets;
683 le_data_length->def_tx_time = data_values->def_tx_time;
686 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
691 BT_EXPORT_API int bluetooth_le_set_data_length(bluetooth_device_address_t *address,
692 const unsigned int max_tx_octets, const unsigned int max_tx_time)
694 BT_CHECK_ENABLED_ANY(return);
699 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
701 g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
702 g_array_append_vals(in_param2, &max_tx_octets, sizeof(guint));
703 g_array_append_vals(in_param3, &max_tx_time, sizeof(guint));
705 result = _bt_send_request(BT_BLUEZ_SERVICE,
706 BT_LE_SET_DATA_LENGTH,
707 in_param1, in_param2, in_param3, in_param4, &out_param);
709 if (result != BLUETOOTH_ERROR_NONE)
710 BT_ERR("Failed to Set data length values : %d", result);
712 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);