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;
30 BT_EXPORT_API int bluetooth_check_adapter_le(void)
35 ret = _bt_get_adapter_path(_bt_gdbus_get_system_gconn(), NULL);
37 if (ret != BLUETOOTH_ERROR_NONE) {
38 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)
56 retv_if(bluetooth_check_adapter_le() == BLUETOOTH_ADAPTER_LE_ENABLED,
57 BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED);
60 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
62 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_ENABLE_ADAPTER_LE,
63 in_param1, in_param2, in_param3, in_param4, &out_param);
65 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
69 BT_EXPORT_API int bluetooth_disable_adapter_le(void)
72 retv_if(bluetooth_check_adapter_le() == BLUETOOTH_ADAPTER_LE_DISABLED,
73 BLUETOOTH_ERROR_DEVICE_NOT_ENABLED);
76 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
78 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_DISABLE_ADAPTER_LE,
79 in_param1, in_param2, in_param3, in_param4, &out_param);
81 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
86 void _bt_set_le_scan_status(gboolean mode)
88 BT_DBG("set LE scan mode : %d", mode);
89 is_le_scanning = mode;
92 BT_EXPORT_API gboolean bluetooth_is_le_scanning(void)
94 return is_le_scanning;
97 BT_EXPORT_API int bluetooth_start_le_discovery(void)
101 BT_CHECK_ENABLED_ANY(return);
104 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
106 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_START_LE_DISCOVERY,
107 in_param1, in_param2, in_param3, in_param4, &out_param);
109 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
111 if (result == BLUETOOTH_ERROR_NONE)
112 _bt_set_le_scan_status(TRUE);
117 BT_EXPORT_API int bluetooth_stop_le_discovery(void)
121 BT_CHECK_ENABLED_ANY(return);
124 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
126 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_STOP_LE_DISCOVERY,
127 in_param1, in_param2, in_param3, in_param4, &out_param);
129 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
131 if (result == BLUETOOTH_ERROR_NONE)
132 _bt_set_le_scan_status(FALSE);
137 BT_EXPORT_API int bluetooth_is_le_discovering(void)
140 int is_discovering = FALSE;
142 BT_CHECK_ENABLED_ANY(return);
145 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
147 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_LE_DISCOVERYING,
148 in_param1, in_param2, in_param3, in_param4, &out_param);
150 if (result == BLUETOOTH_ERROR_NONE) {
151 is_discovering = g_array_index(out_param,
154 BT_ERR("Fail to send request");
157 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
159 return is_discovering;
162 BT_EXPORT_API int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *filter, int *slot_id)
166 BT_CHECK_ENABLED_ANY(return);
169 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
171 g_array_append_vals(in_param1, filter, sizeof(bluetooth_le_scan_filter_t));
173 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_REGISTER_SCAN_FILTER,
174 in_param1, in_param2, in_param3, in_param4, &out_param);
176 if (result == BLUETOOTH_ERROR_NONE) {
177 *slot_id = g_array_index(out_param, int, 0);
179 BT_ERR("Fail to send request");
182 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
187 BT_EXPORT_API int bluetooth_unregister_scan_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, &slot_id, sizeof(int));
198 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_UNREGISTER_SCAN_FILTER,
199 in_param1, in_param2, in_param3, in_param4, &out_param);
201 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
206 BT_EXPORT_API int bluetooth_unregister_all_scan_filters(void)
210 BT_CHECK_ENABLED_ANY(return);
213 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
215 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_UNREGISTER_ALL_SCAN_FILTERS,
216 in_param1, in_param2, in_param3, in_param4, &out_param);
218 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
223 #ifdef TIZEN_WEARABLE
224 gboolean __bluetooth_is_privileged_process(void)
227 char path[30] = {0, };
228 char buf[256] = {0, };
230 snprintf(path, sizeof(path), "/proc/%d/cmdline", getpid());
231 fp = fopen(path, "r");
235 if (fgets(buf, 256, fp) != NULL) {
236 if (strstr(buf, "weconnd") != NULL) {
247 BT_EXPORT_API int bluetooth_set_advertising(int handle, gboolean enable)
250 gboolean use_reserved_slot = FALSE;
252 BT_CHECK_ENABLED_ANY(return);
254 #ifdef TIZEN_WEARABLE
255 use_reserved_slot = __bluetooth_is_privileged_process();
259 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
261 g_array_append_vals(in_param1, &handle, sizeof(int));
262 g_array_append_vals(in_param2, &enable, sizeof(gboolean));
263 g_array_append_vals(in_param3, &use_reserved_slot, sizeof(gboolean));
265 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_ADVERTISING,
266 in_param1, in_param2, in_param3, in_param4, &out_param);
268 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
273 BT_EXPORT_API int bluetooth_set_custom_advertising(int handle, gboolean enable,
274 bluetooth_advertising_params_t *params)
277 gboolean use_reserved_slot = FALSE;
279 BT_CHECK_ENABLED_ANY(return);
281 #ifdef TIZEN_WEARABLE
282 use_reserved_slot = __bluetooth_is_privileged_process();
286 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
288 g_array_append_vals(in_param1, &handle, sizeof(int));
289 g_array_append_vals(in_param2, &enable, sizeof(gboolean));
290 g_array_append_vals(in_param3, params, sizeof(bluetooth_advertising_params_t));
291 g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean));
293 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_CUSTOM_ADVERTISING,
294 in_param1, in_param2, in_param3, in_param4, &out_param);
296 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
301 BT_EXPORT_API int bluetooth_get_advertising_data(bluetooth_advertising_data_t *adv_data, int *length)
306 BT_CHECK_PARAMETER(adv_data, return);
307 BT_CHECK_PARAMETER(length, return);
308 BT_CHECK_ENABLED_ANY(return);
311 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
313 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_ADVERTISING_DATA,
314 in_param1, in_param2, in_param3, in_param4, &out_param);
316 if (result == BLUETOOTH_ERROR_NONE) {
317 data = &g_array_index(out_param, guint8, 0);
318 *length = out_param->len;
320 memset(adv_data, 0x00, sizeof(bluetooth_advertising_data_t));
321 memcpy(adv_data->data, data, *length);
324 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
329 BT_EXPORT_API int bluetooth_set_advertising_data(int handle, const bluetooth_advertising_data_t *value, int length)
332 gboolean use_reserved_slot = FALSE;
334 BT_CHECK_PARAMETER(value, return);
335 BT_CHECK_ENABLED_ANY(return);
337 if (length > BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 3)
338 return BLUETOOTH_ERROR_INVALID_PARAM;
340 #ifdef TIZEN_WEARABLE
341 use_reserved_slot = __bluetooth_is_privileged_process();
345 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
347 g_array_append_vals(in_param1, &handle, sizeof(int));
348 g_array_append_vals(in_param2, value, sizeof(bluetooth_advertising_data_t));
349 g_array_append_vals(in_param3, &length, sizeof(int));
350 g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean));
352 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_ADVERTISING_DATA,
353 in_param1, in_param2, in_param3, in_param4, &out_param);
355 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
360 BT_EXPORT_API int bluetooth_get_scan_response_data(bluetooth_scan_resp_data_t *value, int *length)
365 BT_CHECK_PARAMETER(value, return);
366 BT_CHECK_PARAMETER(length, return);
367 BT_CHECK_ENABLED_ANY(return);
370 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
372 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_SCAN_RESPONSE_DATA,
373 in_param1, in_param2, in_param3, in_param4, &out_param);
375 if (result == BLUETOOTH_ERROR_NONE) {
376 data = &g_array_index(out_param, guint8, 0);
377 *length = out_param->len;
379 memset(value, 0x00, sizeof(bluetooth_scan_resp_data_t));
380 memcpy(value->data, data, *length);
383 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
388 BT_EXPORT_API int bluetooth_set_scan_response_data(int handle,
389 const bluetooth_scan_resp_data_t *value, int length)
392 gboolean use_reserved_slot = FALSE;
394 BT_CHECK_PARAMETER(value, return);
395 BT_CHECK_ENABLED_ANY(return);
397 if (length > BLUETOOTH_SCAN_RESP_DATA_LENGTH_MAX)
398 return BLUETOOTH_ERROR_INVALID_PARAM;
400 #ifdef TIZEN_WEARABLE
401 use_reserved_slot = __bluetooth_is_privileged_process();
405 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
407 g_array_append_vals(in_param1, &handle, sizeof(int));
408 g_array_append_vals(in_param2, value, length);
409 g_array_append_vals(in_param3, &length, sizeof(int));
410 g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean));
412 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCAN_RESPONSE_DATA,
413 in_param1, in_param2, in_param3, in_param4, &out_param);
415 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
420 BT_EXPORT_API int bluetooth_set_scan_parameters(bluetooth_le_scan_params_t *params)
424 BT_CHECK_ENABLED_ANY(return);
427 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
429 g_array_append_vals(in_param1, params, sizeof(bluetooth_le_scan_params_t));
431 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCAN_PARAMETERS,
432 in_param1, in_param2, in_param3, in_param4, &out_param);
434 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
439 BT_EXPORT_API int bluetooth_is_advertising(gboolean *is_advertising)
443 BT_CHECK_ENABLED_ANY(return);
446 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
448 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_ADVERTISING,
449 in_param1, in_param2, in_param3, in_param4, &out_param);
451 if (result == BLUETOOTH_ERROR_NONE) {
452 *is_advertising = g_array_index(out_param, int, 0);
454 BT_ERR("Fail to send request");
457 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
462 BT_EXPORT_API int bluetooth_add_white_list(bluetooth_device_address_t *address, bluetooth_device_address_type_t address_type)
466 BT_CHECK_PARAMETER(address, return);
467 BT_CHECK_ENABLED_ANY(return);
470 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
472 g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
473 g_array_append_vals(in_param2, &address_type, sizeof(int));
475 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_ADD_WHITE_LIST,
476 in_param1, in_param2, in_param3, in_param4, &out_param);
478 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
483 BT_EXPORT_API int bluetooth_remove_white_list(bluetooth_device_address_t *address, bluetooth_device_address_type_t address_type)
487 BT_CHECK_PARAMETER(address, return);
488 BT_CHECK_ENABLED_ANY(return);
491 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
493 g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
494 g_array_append_vals(in_param2, &address_type, sizeof(int));
496 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_REMOVE_WHITE_LIST,
497 in_param1, in_param2, in_param3, in_param4, &out_param);
499 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
504 BT_EXPORT_API int bluetooth_clear_white_list(void)
508 BT_CHECK_ENABLED_ANY(return);
511 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
513 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_CLEAR_WHITE_LIST,
514 in_param1, in_param2, in_param3, in_param4, &out_param);
516 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
521 BT_EXPORT_API int bluetooth_enable_le_privacy(gboolean enable_privacy)
525 BT_CHECK_ENABLED_ANY(return);
528 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
530 g_array_append_vals(in_param1, &enable_privacy, sizeof(gboolean));
532 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_LE_PRIVACY,
533 in_param1, in_param2, in_param3, in_param4, &out_param);
535 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
540 BT_EXPORT_API int bluetooth_check_privilege_advertising_parameter(void)
542 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_SET_ADVERTISING_PARAMETERS)
543 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
544 BT_ERR("Don't have a privilege to use this API");
545 return BLUETOOTH_ERROR_PERMISSION_DEINED;
548 return BLUETOOTH_ERROR_NONE;
551 BT_EXPORT_API int bluetooth_le_register_callback(bluetooth_cb_func_ptr callback_ptr, void *user_data)
555 ret = _bt_register_event(BT_LE_ADAPTER_EVENT, (void *)callback_ptr, user_data);
556 if (ret != BLUETOOTH_ERROR_NONE &&
557 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
558 BT_ERR("Fail to register BT_LE_ADAPTER_EVENT event : %d", ret);
562 return BLUETOOTH_ERROR_NONE;
565 BT_EXPORT_API int bluetooth_le_unregister_callback(void)
567 _bt_unregister_event(BT_LE_ADAPTER_EVENT);
569 return BLUETOOTH_ERROR_NONE;
572 BT_EXPORT_API int bluetooth_le_read_maximum_data_length(
573 bluetooth_le_read_maximum_data_length_t *max_le_datalength)
575 BT_CHECK_ENABLED_ANY(return);
578 bluetooth_le_read_maximum_data_length_t *datalength = NULL;
580 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
582 result = _bt_send_request(BT_BLUEZ_SERVICE,
583 BT_LE_READ_MAXIMUM_DATA_LENGTH,
584 in_param1, in_param2, in_param3, in_param4, &out_param);
586 if (result == BLUETOOTH_ERROR_NONE) {
587 datalength = &g_array_index(out_param,
588 bluetooth_le_read_maximum_data_length_t, 0);
589 max_le_datalength->max_tx_octets = datalength->max_tx_octets;
590 max_le_datalength->max_tx_time = datalength->max_tx_time;
591 max_le_datalength->max_rx_octets = datalength->max_rx_octets;
592 max_le_datalength->max_rx_time = datalength->max_rx_time;
595 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
600 BT_EXPORT_API int bluetooth_le_write_host_suggested_default_data_length(
601 const unsigned int def_tx_Octets, const unsigned int def_tx_Time)
603 BT_CHECK_ENABLED_ANY(return);
608 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
610 g_array_append_vals(in_param1, &def_tx_Octets, sizeof(guint));
611 g_array_append_vals(in_param2, &def_tx_Time, sizeof(guint));
613 result = _bt_send_request(BT_BLUEZ_SERVICE,
614 BT_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH,
615 in_param1, in_param2, in_param3, in_param4, &out_param);
617 if (result != BLUETOOTH_ERROR_NONE) {
618 BT_ERR("Failed to Write the host suggested default data length values : %d", result);
621 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
626 BT_EXPORT_API int bluetooth_le_read_suggested_default_data_length(
627 bluetooth_le_read_host_suggested_data_length_t *le_data_length)
629 BT_CHECK_ENABLED_ANY(return);
633 bluetooth_le_read_host_suggested_data_length_t *data_values = NULL;
634 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
636 result = _bt_send_request(BT_BLUEZ_SERVICE,
637 BT_LE_READ_HOST_SUGGESTED_DATA_LENGTH,
638 in_param1, in_param2, in_param3, in_param4, &out_param);
640 if (result == BLUETOOTH_ERROR_NONE) {
641 data_values = &g_array_index(out_param,
642 bluetooth_le_read_host_suggested_data_length_t, 0);
644 le_data_length->def_tx_octets = data_values->def_tx_octets;
645 le_data_length->def_tx_time = data_values->def_tx_time;
648 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
653 BT_EXPORT_API int bluetooth_le_set_data_length(bluetooth_device_address_t *address,
654 const unsigned int max_tx_octets, const unsigned int max_tx_time)
656 BT_CHECK_ENABLED_ANY(return);
661 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
663 g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
664 g_array_append_vals(in_param2, &max_tx_octets, sizeof(guint));
665 g_array_append_vals(in_param3, &max_tx_time, sizeof(guint));
667 result = _bt_send_request(BT_BLUEZ_SERVICE,
668 BT_LE_SET_DATA_LENGTH,
669 in_param1, in_param2, in_param3, in_param4, &out_param);
671 if (result != BLUETOOTH_ERROR_NONE) {
672 BT_ERR("Failed to Set data length values : %d", result);
675 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);