4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Hocheol Seo <hocheol.seo@samsung.com>
7 * Girishashok Joshi <girish.joshi@samsung.com>
8 * Chanyeol Park <chanyeol.park@samsung.com>
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
14 * http://www.apache.org/licenses/LICENSE-2.0
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
27 #include "bluetooth-api.h"
28 #include "bt-internal-types.h"
30 #include "bt-common.h"
31 #include "bt-request-sender.h"
32 #include "bt-event-handler.h"
34 BT_EXPORT_API int bluetooth_check_adapter_le(void)
39 ret = _bt_get_adapter_path(_bt_gdbus_get_system_gconn(), NULL);
41 if (ret != BLUETOOTH_ERROR_NONE) {
42 return BLUETOOTH_ADAPTER_LE_DISABLED;
45 #ifdef ENABLE_TIZEN_2_4
46 ret = vconf_get_int(VCONFKEY_BT_LE_STATUS, &value);
48 BT_ERR("fail to get vconf key!");
52 BT_DBG("value : %d", value);
53 return value == VCONFKEY_BT_LE_STATUS_ON ? BLUETOOTH_ADAPTER_LE_ENABLED :
54 BLUETOOTH_ADAPTER_LE_DISABLED;
56 return value = BLUETOOTH_ADAPTER_LE_DISABLED;
60 BT_EXPORT_API int bluetooth_enable_adapter_le(void)
64 retv_if(bluetooth_check_adapter_le() == BLUETOOTH_ADAPTER_LE_ENABLED,
65 BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED);
68 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
70 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_ENABLE_ADAPTER_LE,
71 in_param1, in_param2, in_param3, in_param4, &out_param);
73 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
77 BT_EXPORT_API int bluetooth_disable_adapter_le(void)
80 retv_if(bluetooth_check_adapter_le() == BLUETOOTH_ADAPTER_LE_DISABLED,
81 BLUETOOTH_ERROR_DEVICE_NOT_ENABLED);
84 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
86 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_DISABLE_ADAPTER_LE,
87 in_param1, in_param2, in_param3, in_param4, &out_param);
89 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
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);
111 BT_EXPORT_API int bluetooth_stop_le_discovery(void)
115 BT_CHECK_ENABLED_ANY(return);
118 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
120 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_STOP_LE_DISCOVERY,
121 in_param1, in_param2, in_param3, in_param4, &out_param);
124 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
129 BT_EXPORT_API int bluetooth_is_le_discovering(void)
132 int is_discovering = FALSE;
134 BT_CHECK_ENABLED_ANY(return);
137 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
139 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_LE_DISCOVERYING,
140 in_param1, in_param2, in_param3, in_param4, &out_param);
142 if (result == BLUETOOTH_ERROR_NONE) {
143 is_discovering = g_array_index(out_param,
146 BT_ERR("Fail to send request");
149 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
151 return is_discovering;
154 #ifdef TIZEN_WEARABLE
155 gboolean __bluetooth_is_privileged_process(void)
158 char path[30] = {0, };
159 char buf[256] = {0, };
161 snprintf(path, sizeof(path), "/proc/%d/cmdline", getpid());
162 fp = fopen(path, "r");
166 if (fgets(buf, 256, fp) != NULL) {
167 if (strstr(buf, "weconnd") != NULL) {
178 BT_EXPORT_API int bluetooth_set_advertising(gboolean enable)
181 gboolean use_reserved_slot = FALSE;
183 BT_CHECK_ENABLED_ANY(return);
185 #ifdef TIZEN_WEARABLE
186 use_reserved_slot = __bluetooth_is_privileged_process();
190 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
192 g_array_append_vals(in_param1, &enable, sizeof(gboolean));
193 g_array_append_vals(in_param2, &use_reserved_slot, sizeof(gboolean));
195 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_ADVERTISING,
196 in_param1, in_param2, in_param3, in_param4, &out_param);
198 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
203 BT_EXPORT_API int bluetooth_set_custom_advertising(gboolean enable,
204 bluetooth_advertising_params_t *params)
207 gboolean use_reserved_slot = FALSE;
209 BT_CHECK_ENABLED_ANY(return);
211 #ifdef TIZEN_WEARABLE
212 use_reserved_slot = __bluetooth_is_privileged_process();
216 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
218 g_array_append_vals(in_param1, &enable, sizeof(gboolean));
219 g_array_append_vals(in_param2, params, sizeof(bluetooth_advertising_params_t));
220 g_array_append_vals(in_param3, &use_reserved_slot, sizeof(gboolean));
222 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_CUSTOM_ADVERTISING,
223 in_param1, in_param2, in_param3, in_param4, &out_param);
225 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
230 BT_EXPORT_API int bluetooth_get_advertising_data(bluetooth_advertising_data_t *adv_data, int *length)
235 BT_CHECK_PARAMETER(adv_data, return);
236 BT_CHECK_PARAMETER(length, return);
237 BT_CHECK_ENABLED_ANY(return);
240 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
242 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_ADVERTISING_DATA,
243 in_param1, in_param2, in_param3, in_param4, &out_param);
245 if (result == BLUETOOTH_ERROR_NONE) {
246 data = &g_array_index(out_param, guint8, 0);
247 *length = out_param->len;
249 memset(adv_data, 0x00, sizeof(bluetooth_advertising_data_t));
250 memcpy(adv_data->data, data, *length);
253 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
258 BT_EXPORT_API int bluetooth_set_advertising_data(const bluetooth_advertising_data_t *value, int length)
261 gboolean use_reserved_slot = FALSE;
263 BT_CHECK_PARAMETER(value, return);
264 BT_CHECK_ENABLED_ANY(return);
266 if (length > BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 3)
267 return BLUETOOTH_ERROR_INVALID_PARAM;
269 #ifdef TIZEN_WEARABLE
270 use_reserved_slot = __bluetooth_is_privileged_process();
274 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
276 g_array_append_vals(in_param1, value, sizeof(bluetooth_advertising_data_t));
277 g_array_append_vals(in_param2, &length, sizeof(int));
278 g_array_append_vals(in_param3, &use_reserved_slot, sizeof(gboolean));
280 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_ADVERTISING_DATA,
281 in_param1, in_param2, in_param3, in_param4, &out_param);
283 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
288 BT_EXPORT_API int bluetooth_get_scan_response_data(bluetooth_scan_resp_data_t *value, int *length)
293 BT_CHECK_PARAMETER(value, return);
294 BT_CHECK_PARAMETER(length, return);
295 BT_CHECK_ENABLED_ANY(return);
298 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
300 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_SCAN_RESPONSE_DATA,
301 in_param1, in_param2, in_param3, in_param4, &out_param);
303 if (result == BLUETOOTH_ERROR_NONE) {
304 data = &g_array_index(out_param, guint8, 0);
305 *length = out_param->len;
307 memset(value, 0x00, sizeof(bluetooth_scan_resp_data_t));
308 memcpy(value->data, data, *length);
311 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
316 BT_EXPORT_API int bluetooth_set_scan_response_data(
317 const bluetooth_scan_resp_data_t *value, int length)
320 gboolean use_reserved_slot = FALSE;
322 BT_CHECK_PARAMETER(value, return);
323 BT_CHECK_ENABLED_ANY(return);
325 if (length > BLUETOOTH_SCAN_RESP_DATA_LENGTH_MAX)
326 return BLUETOOTH_ERROR_INVALID_PARAM;
328 #ifdef TIZEN_WEARABLE
329 use_reserved_slot = __bluetooth_is_privileged_process();
333 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
335 g_array_append_vals(in_param1, value, length);
336 g_array_append_vals(in_param2, &length, sizeof(int));
337 g_array_append_vals(in_param3, &use_reserved_slot, sizeof(gboolean));
339 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCAN_RESPONSE_DATA,
340 in_param1, in_param2, in_param3, in_param4, &out_param);
342 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
347 BT_EXPORT_API int bluetooth_set_scan_parameters(bluetooth_le_scan_params_t *params)
351 BT_CHECK_ENABLED_ANY(return);
354 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
356 g_array_append_vals(in_param1, params, sizeof(bluetooth_le_scan_params_t));
358 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCAN_PARAMETERS,
359 in_param1, in_param2, in_param3, in_param4, &out_param);
361 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
366 BT_EXPORT_API int bluetooth_is_advertising(gboolean *is_advertising)
370 BT_CHECK_ENABLED_ANY(return);
373 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
375 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_ADVERTISING,
376 in_param1, in_param2, in_param3, in_param4, &out_param);
378 if (result == BLUETOOTH_ERROR_NONE) {
379 *is_advertising = g_array_index(out_param, int, 0);
381 BT_ERR("Fail to send request");
384 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
389 BT_EXPORT_API int bluetooth_add_white_list(bluetooth_device_address_t *address, bluetooth_device_address_type_t address_type)
393 BT_CHECK_PARAMETER(address, return);
394 BT_CHECK_ENABLED_ANY(return);
397 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
399 g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
400 g_array_append_vals(in_param2, &address_type, sizeof(int));
402 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_ADD_WHITE_LIST,
403 in_param1, in_param2, in_param3, in_param4, &out_param);
405 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
410 BT_EXPORT_API int bluetooth_remove_white_list(bluetooth_device_address_t *address, bluetooth_device_address_type_t address_type)
414 BT_CHECK_PARAMETER(address, return);
415 BT_CHECK_ENABLED_ANY(return);
418 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
420 g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
421 g_array_append_vals(in_param2, &address_type, sizeof(int));
423 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_REMOVE_WHITE_LIST,
424 in_param1, in_param2, in_param3, in_param4, &out_param);
426 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
431 BT_EXPORT_API int bluetooth_clear_white_list(void)
435 BT_CHECK_ENABLED_ANY(return);
438 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
440 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_CLEAR_WHITE_LIST,
441 in_param1, in_param2, in_param3, in_param4, &out_param);
443 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
448 BT_EXPORT_API int bluetooth_enable_le_privacy(gboolean enable_privacy)
452 BT_CHECK_ENABLED_ANY(return);
455 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
457 g_array_append_vals(in_param1, &enable_privacy, sizeof(gboolean));
459 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_LE_PRIVACY,
460 in_param1, in_param2, in_param3, in_param4, &out_param);
462 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
467 BT_EXPORT_API int bluetooth_le_register_callback(bluetooth_cb_func_ptr callback_ptr, void *user_data)
471 ret = _bt_register_event(BT_LE_ADAPTER_EVENT, (void *)callback_ptr, user_data);
472 if (ret != BLUETOOTH_ERROR_NONE &&
473 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
474 BT_ERR("Fail to register BT_LE_ADAPTER_EVENT event : %d", ret);
478 return BLUETOOTH_ERROR_NONE;
481 BT_EXPORT_API int bluetooth_le_unregister_callback(void)
483 _bt_unregister_event(BT_LE_ADAPTER_EVENT);
485 return BLUETOOTH_ERROR_NONE;