2 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
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 <bluetooth-api.h>
26 #include "bluetooth.h"
27 #include "bluetooth_private.h"
29 int bt_adapter_enable(void)
31 int error_code = BT_ERROR_NONE;
33 BT_CHECK_INIT_STATUS();
34 error_code = _bt_get_error_code(bluetooth_enable_adapter());
35 if (error_code != BT_ERROR_NONE) {
36 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
41 int bt_adapter_disable(void)
43 int error_code = BT_ERROR_NONE;
45 BT_CHECK_INIT_STATUS();
46 error_code = _bt_get_error_code(bluetooth_disable_adapter());
47 if (error_code != BT_ERROR_NONE) {
48 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
53 int bt_adapter_reset(void)
55 int error_code = BT_ERROR_NONE;
57 BT_CHECK_INIT_STATUS();
58 error_code = _bt_get_error_code(bluetooth_reset_adapter());
59 if (error_code != BT_ERROR_NONE) {
60 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
65 int bt_adapter_get_state(bt_adapter_state_e *adapter_state)
67 BT_CHECK_INIT_STATUS();
68 BT_CHECK_INPUT_PARAMETER(adapter_state);
70 *adapter_state = bluetooth_check_adapter();
74 int bt_adapter_get_address(char **address)
76 bluetooth_device_address_t loc_address = { {0} };
77 int error_code = BT_ERROR_NONE;
79 BT_CHECK_INIT_STATUS();
80 BT_CHECK_INPUT_PARAMETER(address);
82 error_code = _bt_get_error_code(bluetooth_get_local_address(&loc_address));
83 if (error_code != BT_ERROR_NONE) {
84 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
88 error_code = _bt_convert_address_to_string(address, &loc_address);
89 if (error_code != BT_ERROR_NONE) {
90 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
97 int bt_adapter_get_name(char **name)
99 int ret = BT_ERROR_NONE;
100 bluetooth_device_name_t loc_name = { {0} };
102 BT_CHECK_INIT_STATUS();
103 BT_CHECK_INPUT_PARAMETER(name);
105 ret = _bt_get_error_code(bluetooth_get_local_name(&loc_name));
106 if (ret != BT_ERROR_NONE) {
107 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
111 *name = strdup(loc_name.name);
113 BT_ERR("OUT_OF_MEMORY(0x%08x)", BT_ERROR_OUT_OF_MEMORY);
114 return BT_ERROR_OUT_OF_MEMORY;
117 return BT_ERROR_NONE;
120 int bt_adapter_set_name(const char *name)
122 bluetooth_device_name_t loc_name = { {0} };
123 int ret = BT_ERROR_NONE;
125 BT_CHECK_INIT_STATUS();
126 BT_CHECK_INPUT_PARAMETER(name);
128 strncpy(loc_name.name, name, BLUETOOTH_DEVICE_NAME_LENGTH_MAX);
129 loc_name.name[BLUETOOTH_DEVICE_NAME_LENGTH_MAX] = '\0';
131 ret = _bt_get_error_code(bluetooth_set_local_name(&loc_name));
132 if (ret != BT_ERROR_NONE) {
133 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
139 int bt_adapter_get_visibility(bt_adapter_visibility_mode_e *mode, int *duration)
141 bluetooth_discoverable_mode_t discoverable_mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
142 int ret = BT_ERROR_NONE;
144 BT_CHECK_INIT_STATUS();
145 BT_CHECK_INPUT_PARAMETER(mode);
147 ret = _bt_get_error_code(bluetooth_get_discoverable_mode(&discoverable_mode));
148 if (ret != BT_ERROR_NONE) {
149 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
153 *mode = _bt_get_bt_visibility_mode_e(discoverable_mode);
158 if (discoverable_mode == BLUETOOTH_DISCOVERABLE_MODE_TIME_LIMITED_DISCOVERABLE) {
159 if (duration == NULL)
160 return BT_ERROR_NONE;
161 ret = bluetooth_get_timeout_value(duration);
162 if (ret != BT_ERROR_NONE) {
163 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
167 return BT_ERROR_NONE;
170 int bt_adapter_set_visibility(bt_adapter_visibility_mode_e visibility_mode, int timeout_sec)
172 bluetooth_discoverable_mode_t discoverable_mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
173 int error_code = BT_ERROR_NONE;
175 BT_CHECK_INIT_STATUS();
176 switch (visibility_mode) {
177 case BT_ADAPTER_VISIBILITY_MODE_LIMITED_DISCOVERABLE:
178 discoverable_mode = BLUETOOTH_DISCOVERABLE_MODE_TIME_LIMITED_DISCOVERABLE;
180 case BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE:
181 discoverable_mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
184 case BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE:
185 discoverable_mode = BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE;
189 BT_ERR("INVALID_PARAMETER(0x%08x)", BT_ERROR_INVALID_PARAMETER);
190 return BT_ERROR_INVALID_PARAMETER;
193 error_code = _bt_get_error_code(bluetooth_set_discoverable_mode(discoverable_mode, timeout_sec));
194 if (error_code != BT_ERROR_NONE) {
195 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
201 int bt_adapter_foreach_bonded_device(bt_adapter_bonded_device_cb foreach_cb, void *user_data)
203 GPtrArray *dev_list = NULL;
204 bt_device_info_s *dev_info = NULL;
205 bluetooth_device_info_t *ptr = NULL;
206 int ret = BT_ERROR_NONE;
209 BT_CHECK_INIT_STATUS();
210 BT_CHECK_INPUT_PARAMETER(foreach_cb);
212 dev_list = g_ptr_array_new();
213 if (dev_list == NULL) {
214 BT_ERR("OUT_OF_MEMORY(0x%08x)", BT_ERROR_OUT_OF_MEMORY);
215 return BT_ERROR_OUT_OF_MEMORY;
218 ret = _bt_get_error_code(bluetooth_get_bonded_device_list(&dev_list));
219 if (ret != BT_ERROR_NONE) {
220 BT_ERR("%s(0x%08x) : Failed to get bonded device list", _bt_convert_error_to_string(ret), ret);
224 for (i = 0; i < dev_list->len; i++) {
225 ptr = g_ptr_array_index(dev_list, i);
227 ret = _bt_get_bt_device_info_s(&dev_info, (bluetooth_device_info_t *)ptr);
228 if (ret != BT_ERROR_NONE) {
229 BT_ERR("%s(0x%08x) : Failed to get device info", _bt_convert_error_to_string(ret), ret);
233 if (!foreach_cb(dev_info, user_data)) {
234 _bt_free_bt_device_info_s(dev_info);
237 _bt_free_bt_device_info_s(dev_info);
239 BT_ERR("OPERATION_FAILED(0x%08x)", BT_ERROR_OPERATION_FAILED);
240 ret = BT_ERROR_OPERATION_FAILED;
245 if (dev_list != NULL) {
246 g_ptr_array_foreach(dev_list, (GFunc)g_free, NULL);
247 g_ptr_array_free(dev_list, TRUE);
253 int bt_adapter_get_bonded_device_info(const char *remote_address, bt_device_info_s **device_info)
256 bluetooth_device_address_t addr_hex = { {0,} };
257 bluetooth_device_info_t *info;
259 BT_CHECK_INIT_STATUS();
260 BT_CHECK_INPUT_PARAMETER(remote_address);
262 info = (bluetooth_device_info_t *)malloc(sizeof(bluetooth_device_info_t));
264 return BT_ERROR_OUT_OF_MEMORY;
266 _bt_convert_address_to_hex(&addr_hex, remote_address);
268 ret = _bt_get_error_code(bluetooth_get_bonded_device(&addr_hex, info));
269 if (ret != BT_ERROR_NONE) {
270 BT_ERR("%s(0x%08x) : Failed to run function",
271 _bt_convert_error_to_string(ret), ret);
273 ret = _bt_get_bt_device_info_s(device_info, info);
274 if (ret != BT_ERROR_NONE) {
275 BT_ERR("%s(0x%08x) : Failed to get device info",
276 _bt_convert_error_to_string(ret),
286 int bt_adapter_free_device_info(bt_device_info_s *device_info)
288 BT_CHECK_INIT_STATUS();
289 BT_CHECK_INPUT_PARAMETER(device_info);
291 _bt_free_bt_device_info_s(device_info);
293 return BT_ERROR_NONE;
296 int bt_adapter_is_service_used(const char *service_uuid, bool *used)
298 int ret = BT_ERROR_NONE;
300 BT_CHECK_INIT_STATUS();
301 BT_CHECK_INPUT_PARAMETER(service_uuid);
302 BT_CHECK_INPUT_PARAMETER(used);
304 if (strcmp(service_uuid, OPP_UUID) == 0) {
305 *used = bluetooth_obex_server_is_activated();
307 ret = _bt_get_error_code(bluetooth_is_service_used(service_uuid,
311 if (ret != BT_ERROR_NONE) {
312 BT_ERR("%s(0x%08x) : Failed to run function", _bt_convert_error_to_string(ret), ret);
318 int bt_adapter_set_state_changed_cb(bt_adapter_state_changed_cb callback, void *user_data)
320 int ret = BT_ERROR_NONE;
322 BT_CHECK_INIT_STATUS();
323 BT_CHECK_INPUT_PARAMETER(callback);
324 _bt_set_cb(BT_EVENT_STATE_CHANGED, callback, user_data);
325 if (ret != BT_ERROR_NONE) {
326 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
332 int bt_adapter_set_name_changed_cb(bt_adapter_name_changed_cb callback, void *user_data)
334 int ret = BT_ERROR_NONE;
336 BT_CHECK_INIT_STATUS();
337 BT_CHECK_INPUT_PARAMETER(callback);
338 _bt_set_cb(BT_EVENT_NAME_CHANGED, callback, user_data);
339 if (ret != BT_ERROR_NONE) {
340 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
346 int bt_adapter_set_visibility_mode_changed_cb(bt_adapter_visibility_mode_changed_cb callback, void *user_data)
348 int ret = BT_ERROR_NONE;
350 BT_CHECK_INIT_STATUS();
351 BT_CHECK_INPUT_PARAMETER(callback);
352 _bt_set_cb(BT_EVENT_VISIBILITY_MODE_CHANGED, callback, user_data);
353 if (ret != BT_ERROR_NONE) {
354 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
360 int bt_adapter_set_device_discovery_state_changed_cb(bt_adapter_device_discovery_state_changed_cb callback, void *user_data)
362 int ret = BT_ERROR_NONE;
364 BT_CHECK_INIT_STATUS();
365 BT_CHECK_INPUT_PARAMETER(callback);
366 _bt_set_cb(BT_EVENT_DEVICE_DISCOVERY_STATE_CHANGED, callback, user_data);
367 if (ret != BT_ERROR_NONE) {
368 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
374 int bt_adapter_unset_state_changed_cb(void)
376 BT_CHECK_INIT_STATUS();
377 _bt_unset_cb(BT_EVENT_STATE_CHANGED);
378 return BT_ERROR_NONE;
381 int bt_adapter_unset_name_changed_cb(void)
383 BT_CHECK_INIT_STATUS();
384 _bt_unset_cb(BT_EVENT_NAME_CHANGED);
385 return BT_ERROR_NONE;
388 int bt_adapter_unset_visibility_mode_changed_cb(void)
390 BT_CHECK_INIT_STATUS();
391 _bt_unset_cb(BT_EVENT_VISIBILITY_MODE_CHANGED);
392 return BT_ERROR_NONE;
395 int bt_adapter_set_visibility_duration_changed_cb(bt_adapter_visibility_duration_changed_cb callback, void *user_data)
397 BT_CHECK_INIT_STATUS();
399 /* Will impelement it */
401 return BT_ERROR_NONE;
404 int bt_adapter_unset_visibility_duration_changed_cb(void)
406 BT_CHECK_INIT_STATUS();
408 /* Will impelement it */
410 return BT_ERROR_NONE;
413 int bt_adapter_unset_device_discovery_state_changed_cb(void)
415 BT_CHECK_INIT_STATUS();
416 _bt_unset_cb(BT_EVENT_DEVICE_DISCOVERY_STATE_CHANGED);
417 return BT_ERROR_NONE;
420 int bt_adapter_start_device_discovery(void)
422 int error_code = BT_ERROR_NONE;
424 BT_CHECK_INIT_STATUS();
425 error_code = _bt_get_error_code(bluetooth_start_discovery(0, 0, BLUETOOTH_DEVICE_MAJOR_MASK_MISC));
426 if (error_code != BT_ERROR_NONE) {
427 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
432 int bt_adapter_start_discover_devices(bt_adapter_discover_devices_type_e type)
434 int error_code = BT_ERROR_NONE;
436 BT_CHECK_INIT_STATUS();
437 error_code = _bt_get_error_code(bluetooth_start_custom_discovery(type,
438 0, 0, BLUETOOTH_DEVICE_MAJOR_MASK_MISC));
439 if (error_code != BT_ERROR_NONE) {
440 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
445 int bt_adapter_stop_device_discovery(void)
447 int error_code = BT_ERROR_NONE;
449 BT_CHECK_INIT_STATUS();
450 error_code = _bt_get_error_code(bluetooth_cancel_discovery());
451 if (error_code != BT_ERROR_NONE) {
452 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
457 int bt_adapter_is_discovering(bool *is_discovering)
461 BT_CHECK_INIT_STATUS();
462 BT_CHECK_INPUT_PARAMETER(is_discovering);
464 ret = bluetooth_is_discovering();
465 if (ret >= BLUETOOTH_ERROR_BASE) {
466 *is_discovering = (ret == 1) ? true : false;
467 return BT_ERROR_NONE;
469 ret = _bt_get_error_code(ret);
470 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
475 int bt_adapter_get_local_oob_data(unsigned char **hash, unsigned char **randomizer,
476 int *hash_len, int *randomizer_len)
478 int ret = BT_ERROR_NONE;
480 BT_CHECK_INIT_STATUS();
481 BT_CHECK_INPUT_PARAMETER(hash);
482 BT_CHECK_INPUT_PARAMETER(randomizer);
483 BT_CHECK_INPUT_PARAMETER(hash_len);
484 BT_CHECK_INPUT_PARAMETER(randomizer_len);
486 bt_oob_data_t oob_data;
488 ret = _bt_get_error_code(bluetooth_oob_read_local_data(&oob_data));
489 if (BT_ERROR_NONE == ret) {
490 *hash = g_memdup(oob_data.hash, BLUETOOTH_OOB_DATA_LENGTH);
491 *randomizer = g_memdup(oob_data.randomizer,
492 BLUETOOTH_OOB_DATA_LENGTH);
493 *hash_len = BLUETOOTH_OOB_DATA_LENGTH;
494 *randomizer_len = BLUETOOTH_OOB_DATA_LENGTH;
496 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
501 int bt_adapter_set_remote_oob_data(const char *remote_address,
502 unsigned char *hash, unsigned char *randomizer,
503 int hash_len, int randomizer_len)
505 int ret = BT_ERROR_NONE;
506 bluetooth_device_address_t addr_hex = { {0,} };
507 bt_oob_data_t oob_data = { {0},};
509 BT_CHECK_INIT_STATUS();
510 BT_CHECK_INPUT_PARAMETER(remote_address);
512 _bt_convert_address_to_hex(&addr_hex, remote_address);
514 if (hash != NULL && randomizer != NULL) {
515 memcpy(oob_data.hash, hash, hash_len);
516 memcpy(oob_data.randomizer, randomizer, randomizer_len);
517 oob_data.hash_len = hash_len;
518 oob_data.randomizer_len = randomizer_len;
521 ret = _bt_get_error_code(bluetooth_oob_add_remote_data(&addr_hex, &oob_data));
522 if (BT_ERROR_NONE != ret) {
523 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
528 int bt_adapter_remove_remote_oob_data(const char *remote_address)
530 int ret = BT_ERROR_NONE;
531 bluetooth_device_address_t addr_hex = { {0,} };
533 BT_CHECK_INIT_STATUS();
534 BT_CHECK_INPUT_PARAMETER(remote_address);
536 _bt_convert_address_to_hex(&addr_hex, remote_address);
538 ret = _bt_get_error_code(bluetooth_oob_remove_remote_data(&addr_hex));
539 if (BT_ERROR_NONE != ret) {
540 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);