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;
42 ret = vconf_get_int(VCONFKEY_BT_LE_STATUS, &value);
44 BT_ERR("fail to get vconf key!");
48 BT_DBG("value : %d", value);
49 return value == VCONFKEY_BT_LE_STATUS_ON ? BLUETOOTH_ADAPTER_LE_ENABLED :
50 BLUETOOTH_ADAPTER_LE_DISABLED;
53 BT_EXPORT_API int bluetooth_enable_adapter_le(void)
58 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
60 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_ENABLE_ADAPTER_LE,
61 in_param1, in_param2, in_param3, in_param4, &out_param);
63 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
67 BT_EXPORT_API int bluetooth_disable_adapter_le(void)
70 retv_if(bluetooth_check_adapter_le() == BLUETOOTH_ADAPTER_LE_DISABLED,
71 BLUETOOTH_ERROR_DEVICE_NOT_ENABLED);
74 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
76 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_DISABLE_ADAPTER_LE,
77 in_param1, in_param2, in_param3, in_param4, &out_param);
79 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
84 void _bt_set_le_scan_status(gboolean mode)
86 BT_DBG("set LE scan mode : %d", mode);
87 is_le_scanning = mode;
90 BT_EXPORT_API gboolean bluetooth_is_le_scanning(void)
92 return is_le_scanning;
95 BT_EXPORT_API int bluetooth_start_le_discovery(void)
99 BT_CHECK_ENABLED_ANY(return);
102 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
104 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_START_LE_DISCOVERY,
105 in_param1, in_param2, in_param3, in_param4, &out_param);
107 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
109 if (result == BLUETOOTH_ERROR_NONE)
110 _bt_set_le_scan_status(TRUE);
115 BT_EXPORT_API int bluetooth_stop_le_discovery(void)
119 BT_CHECK_ENABLED_ANY(return);
122 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
124 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_STOP_LE_DISCOVERY,
125 in_param1, in_param2, in_param3, in_param4, &out_param);
127 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
129 if (result == BLUETOOTH_ERROR_NONE)
130 _bt_set_le_scan_status(FALSE);
135 BT_EXPORT_API int bluetooth_is_le_discovering(void)
138 int is_discovering = FALSE;
140 BT_CHECK_ENABLED_ANY(return);
143 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
145 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_LE_DISCOVERYING,
146 in_param1, in_param2, in_param3, in_param4, &out_param);
148 if (result == BLUETOOTH_ERROR_NONE) {
149 is_discovering = g_array_index(out_param,
152 BT_ERR("Fail to send request");
155 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
157 return is_discovering;
160 BT_EXPORT_API gboolean bluetooth_is_scan_filter_supported(void)
164 if (is_scan_filter_supported == -1) {
166 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
168 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_SCAN_FILTER_SUPPORTED,
169 in_param1, in_param2, in_param3, in_param4, &out_param);
171 if (result == BLUETOOTH_ERROR_NONE) {
172 is_scan_filter_supported = g_array_index(out_param, int, 0);
174 BT_ERR("Fail to send request");
177 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
180 if (is_scan_filter_supported == 1) {
187 BT_EXPORT_API int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *filter, int *slot_id)
191 BT_CHECK_ENABLED_ANY(return);
194 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
196 g_array_append_vals(in_param1, filter, sizeof(bluetooth_le_scan_filter_t));
198 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_REGISTER_SCAN_FILTER,
199 in_param1, in_param2, in_param3, in_param4, &out_param);
201 if (result == BLUETOOTH_ERROR_NONE) {
202 *slot_id = g_array_index(out_param, int, 0);
204 BT_ERR("Fail to send request");
207 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
212 BT_EXPORT_API int bluetooth_unregister_scan_filter(int slot_id)
216 BT_CHECK_ENABLED_ANY(return);
219 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
221 g_array_append_vals(in_param1, &slot_id, sizeof(int));
223 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_UNREGISTER_SCAN_FILTER,
224 in_param1, in_param2, in_param3, in_param4, &out_param);
226 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
231 BT_EXPORT_API int bluetooth_unregister_all_scan_filters(void)
235 BT_CHECK_ENABLED_ANY(return);
238 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
240 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_UNREGISTER_ALL_SCAN_FILTERS,
241 in_param1, in_param2, in_param3, in_param4, &out_param);
243 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
248 #ifdef TIZEN_WEARABLE
249 gboolean __bluetooth_is_privileged_process(void)
252 char path[30] = {0, };
253 char buf[256] = {0, };
255 snprintf(path, sizeof(path), "/proc/%d/cmdline", getpid());
256 fp = fopen(path, "r");
260 if (fgets(buf, 256, fp) != NULL) {
261 if (strstr(buf, "weconnd") != NULL) {
272 BT_EXPORT_API int bluetooth_set_advertising(int handle, gboolean enable)
275 gboolean use_reserved_slot = FALSE;
277 BT_CHECK_ENABLED_ANY(return);
279 #ifdef TIZEN_WEARABLE
280 use_reserved_slot = __bluetooth_is_privileged_process();
284 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
286 g_array_append_vals(in_param1, &handle, sizeof(int));
287 g_array_append_vals(in_param2, &enable, sizeof(gboolean));
288 g_array_append_vals(in_param3, &use_reserved_slot, sizeof(gboolean));
290 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_ADVERTISING,
291 in_param1, in_param2, in_param3, in_param4, &out_param);
293 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
298 BT_EXPORT_API int bluetooth_set_custom_advertising(int handle, gboolean enable,
299 bluetooth_advertising_params_t *params)
302 gboolean use_reserved_slot = FALSE;
304 BT_CHECK_ENABLED_ANY(return);
306 #ifdef TIZEN_WEARABLE
307 use_reserved_slot = __bluetooth_is_privileged_process();
311 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
313 g_array_append_vals(in_param1, &handle, sizeof(int));
314 g_array_append_vals(in_param2, &enable, sizeof(gboolean));
315 g_array_append_vals(in_param3, params, sizeof(bluetooth_advertising_params_t));
316 g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean));
318 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_CUSTOM_ADVERTISING,
319 in_param1, in_param2, in_param3, in_param4, &out_param);
321 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
326 BT_EXPORT_API int bluetooth_get_advertising_data(bluetooth_advertising_data_t *adv_data, int *length)
331 BT_CHECK_PARAMETER(adv_data, return);
332 BT_CHECK_PARAMETER(length, return);
333 BT_CHECK_ENABLED_ANY(return);
336 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
338 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_ADVERTISING_DATA,
339 in_param1, in_param2, in_param3, in_param4, &out_param);
341 if (result == BLUETOOTH_ERROR_NONE) {
342 data = &g_array_index(out_param, guint8, 0);
343 *length = out_param->len;
345 memset(adv_data, 0x00, sizeof(bluetooth_advertising_data_t));
346 memcpy(adv_data->data, data, *length);
349 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
354 BT_EXPORT_API int bluetooth_set_advertising_data(int handle, const bluetooth_advertising_data_t *value, int length)
357 gboolean use_reserved_slot = FALSE;
359 BT_CHECK_PARAMETER(value, return);
360 BT_CHECK_ENABLED_ANY(return);
362 if (length > BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 3)
363 return BLUETOOTH_ERROR_INVALID_PARAM;
365 #ifdef TIZEN_WEARABLE
366 use_reserved_slot = __bluetooth_is_privileged_process();
370 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
372 g_array_append_vals(in_param1, &handle, sizeof(int));
373 g_array_append_vals(in_param2, value, sizeof(bluetooth_advertising_data_t));
374 g_array_append_vals(in_param3, &length, sizeof(int));
375 g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean));
377 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_ADVERTISING_DATA,
378 in_param1, in_param2, in_param3, in_param4, &out_param);
380 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
385 BT_EXPORT_API int bluetooth_get_scan_response_data(bluetooth_scan_resp_data_t *value, int *length)
390 BT_CHECK_PARAMETER(value, return);
391 BT_CHECK_PARAMETER(length, return);
392 BT_CHECK_ENABLED_ANY(return);
395 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
397 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_SCAN_RESPONSE_DATA,
398 in_param1, in_param2, in_param3, in_param4, &out_param);
400 if (result == BLUETOOTH_ERROR_NONE) {
401 data = &g_array_index(out_param, guint8, 0);
402 *length = out_param->len;
404 memset(value, 0x00, sizeof(bluetooth_scan_resp_data_t));
405 memcpy(value->data, data, *length);
408 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
413 BT_EXPORT_API int bluetooth_set_scan_response_data(int handle,
414 const bluetooth_scan_resp_data_t *value, int length)
417 gboolean use_reserved_slot = FALSE;
419 BT_CHECK_PARAMETER(value, return);
420 BT_CHECK_ENABLED_ANY(return);
422 if (length > BLUETOOTH_SCAN_RESP_DATA_LENGTH_MAX)
423 return BLUETOOTH_ERROR_INVALID_PARAM;
425 #ifdef TIZEN_WEARABLE
426 use_reserved_slot = __bluetooth_is_privileged_process();
430 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
432 g_array_append_vals(in_param1, &handle, sizeof(int));
433 g_array_append_vals(in_param2, value, length);
434 g_array_append_vals(in_param3, &length, sizeof(int));
435 g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean));
437 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCAN_RESPONSE_DATA,
438 in_param1, in_param2, in_param3, in_param4, &out_param);
440 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
445 BT_EXPORT_API int bluetooth_set_scan_parameters(bluetooth_le_scan_params_t *params)
449 BT_CHECK_ENABLED_ANY(return);
452 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
454 g_array_append_vals(in_param1, params, sizeof(bluetooth_le_scan_params_t));
456 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCAN_PARAMETERS,
457 in_param1, in_param2, in_param3, in_param4, &out_param);
459 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
464 BT_EXPORT_API int bluetooth_is_advertising(gboolean *is_advertising)
468 BT_CHECK_ENABLED_ANY(return);
471 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
473 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_ADVERTISING,
474 in_param1, in_param2, in_param3, in_param4, &out_param);
476 if (result == BLUETOOTH_ERROR_NONE) {
477 *is_advertising = g_array_index(out_param, int, 0);
479 BT_ERR("Fail to send request");
482 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
487 BT_EXPORT_API int bluetooth_add_white_list(bluetooth_device_address_t *address, bluetooth_device_address_type_t address_type)
491 BT_CHECK_PARAMETER(address, return);
492 BT_CHECK_ENABLED_ANY(return);
495 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
497 g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
498 g_array_append_vals(in_param2, &address_type, sizeof(int));
500 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_ADD_WHITE_LIST,
501 in_param1, in_param2, in_param3, in_param4, &out_param);
503 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
508 BT_EXPORT_API int bluetooth_remove_white_list(bluetooth_device_address_t *address, bluetooth_device_address_type_t address_type)
512 BT_CHECK_PARAMETER(address, return);
513 BT_CHECK_ENABLED_ANY(return);
516 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
518 g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
519 g_array_append_vals(in_param2, &address_type, sizeof(int));
521 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_REMOVE_WHITE_LIST,
522 in_param1, in_param2, in_param3, in_param4, &out_param);
524 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
529 BT_EXPORT_API int bluetooth_clear_white_list(void)
533 BT_CHECK_ENABLED_ANY(return);
536 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
538 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_CLEAR_WHITE_LIST,
539 in_param1, in_param2, in_param3, in_param4, &out_param);
541 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
546 BT_EXPORT_API int bluetooth_enable_le_privacy(gboolean enable_privacy)
550 BT_CHECK_ENABLED_ANY(return);
553 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
555 g_array_append_vals(in_param1, &enable_privacy, sizeof(gboolean));
557 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_LE_PRIVACY,
558 in_param1, in_param2, in_param3, in_param4, &out_param);
560 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
565 BT_EXPORT_API int bluetooth_set_le_static_random_address(gboolean enable)
569 BT_CHECK_ENABLED_ANY(return);
572 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
574 g_array_append_vals(in_param1, &enable, sizeof(gboolean));
576 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_LE_STATIC_RANDOM_ADDRESS,
577 in_param1, in_param2, in_param3, in_param4, &out_param);
579 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
584 BT_EXPORT_API int bluetooth_check_privilege_advertising_parameter(void)
586 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_SET_ADVERTISING_PARAMETERS)
587 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
588 BT_ERR("Don't have a privilege to use this API");
589 return BLUETOOTH_ERROR_PERMISSION_DEINED;
592 return BLUETOOTH_ERROR_NONE;
595 BT_EXPORT_API int bluetooth_le_register_callback(bluetooth_cb_func_ptr callback_ptr, void *user_data)
599 ret = _bt_register_event(BT_LE_ADAPTER_EVENT, (void *)callback_ptr, user_data);
600 if (ret != BLUETOOTH_ERROR_NONE &&
601 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
602 BT_ERR("Fail to register BT_LE_ADAPTER_EVENT event : %d", ret);
606 return BLUETOOTH_ERROR_NONE;
609 BT_EXPORT_API int bluetooth_le_unregister_callback(void)
611 _bt_unregister_event(BT_LE_ADAPTER_EVENT);
613 return BLUETOOTH_ERROR_NONE;
616 BT_EXPORT_API int bluetooth_le_read_maximum_data_length(
617 bluetooth_le_read_maximum_data_length_t *max_le_datalength)
619 BT_CHECK_ENABLED_ANY(return);
622 bluetooth_le_read_maximum_data_length_t *datalength = NULL;
624 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
626 result = _bt_send_request(BT_BLUEZ_SERVICE,
627 BT_LE_READ_MAXIMUM_DATA_LENGTH,
628 in_param1, in_param2, in_param3, in_param4, &out_param);
630 if (result == BLUETOOTH_ERROR_NONE) {
631 datalength = &g_array_index(out_param,
632 bluetooth_le_read_maximum_data_length_t, 0);
633 max_le_datalength->max_tx_octets = datalength->max_tx_octets;
634 max_le_datalength->max_tx_time = datalength->max_tx_time;
635 max_le_datalength->max_rx_octets = datalength->max_rx_octets;
636 max_le_datalength->max_rx_time = datalength->max_rx_time;
639 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
644 BT_EXPORT_API int bluetooth_le_write_host_suggested_default_data_length(
645 const unsigned int def_tx_Octets, const unsigned int def_tx_Time)
647 BT_CHECK_ENABLED_ANY(return);
652 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
654 g_array_append_vals(in_param1, &def_tx_Octets, sizeof(guint));
655 g_array_append_vals(in_param2, &def_tx_Time, sizeof(guint));
657 result = _bt_send_request(BT_BLUEZ_SERVICE,
658 BT_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH,
659 in_param1, in_param2, in_param3, in_param4, &out_param);
661 if (result != BLUETOOTH_ERROR_NONE) {
662 BT_ERR("Failed to Write the host suggested default data length values : %d", result);
665 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
670 BT_EXPORT_API int bluetooth_le_read_suggested_default_data_length(
671 bluetooth_le_read_host_suggested_data_length_t *le_data_length)
673 BT_CHECK_ENABLED_ANY(return);
677 bluetooth_le_read_host_suggested_data_length_t *data_values = NULL;
678 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
680 result = _bt_send_request(BT_BLUEZ_SERVICE,
681 BT_LE_READ_HOST_SUGGESTED_DATA_LENGTH,
682 in_param1, in_param2, in_param3, in_param4, &out_param);
684 if (result == BLUETOOTH_ERROR_NONE) {
685 data_values = &g_array_index(out_param,
686 bluetooth_le_read_host_suggested_data_length_t, 0);
688 le_data_length->def_tx_octets = data_values->def_tx_octets;
689 le_data_length->def_tx_time = data_values->def_tx_time;
692 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
697 BT_EXPORT_API int bluetooth_le_set_data_length(bluetooth_device_address_t *address,
698 const unsigned int max_tx_octets, const unsigned int max_tx_time)
700 BT_CHECK_ENABLED_ANY(return);
705 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
707 g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
708 g_array_append_vals(in_param2, &max_tx_octets, sizeof(guint));
709 g_array_append_vals(in_param3, &max_tx_time, sizeof(guint));
711 result = _bt_send_request(BT_BLUEZ_SERVICE,
712 BT_LE_SET_DATA_LENGTH,
713 in_param1, in_param2, in_param3, in_param4, &out_param);
715 if (result != BLUETOOTH_ERROR_NONE) {
716 BT_ERR("Failed to Set data length values : %d", result);
719 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);