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.
20 #include "bluetooth-api.h"
21 #include "bt-internal-types.h"
23 #include "bt-common.h"
24 #include "bt-request-sender.h"
25 #include "bt-event-handler.h"
27 static int __bt_fill_device_list(GArray *out_param2, GPtrArray **dev_list)
31 bluetooth_device_info_t info;
33 BT_CHECK_PARAMETER(out_param2, return);
34 BT_CHECK_PARAMETER(dev_list, return);
36 size = out_param2->len;
39 BT_ERR("No bonded device");
40 return BLUETOOTH_ERROR_NONE;
43 size = (out_param2->len) / sizeof(bluetooth_device_info_t);
45 for (i = 0; i < size; i++) {
46 bluetooth_device_info_t *dev_info = NULL;
48 info = g_array_index(out_param2,
49 bluetooth_device_info_t, i);
51 dev_info = g_memdup(&info, sizeof(bluetooth_device_info_t));
54 g_ptr_array_add(*dev_list, (gpointer)dev_info);
58 return BLUETOOTH_ERROR_NONE;
61 BT_EXPORT_API int bluetooth_check_adapter(void)
66 ret = _bt_get_adapter_path(_bt_gdbus_get_system_gconn(), NULL);
68 if (ret != BLUETOOTH_ERROR_NONE) {
69 return BLUETOOTH_ADAPTER_DISABLED;
72 /* check VCONFKEY_BT_STATUS */
73 if (vconf_get_int(VCONFKEY_BT_STATUS, &value) != 0) {
74 BT_ERR("fail to get vconf key!");
75 return BLUETOOTH_ADAPTER_DISABLED;
78 return value == VCONFKEY_BT_STATUS_OFF ? BLUETOOTH_ADAPTER_DISABLED :
79 BLUETOOTH_ADAPTER_ENABLED;
82 BT_EXPORT_API int bluetooth_enable_adapter(void)
85 bt_user_info_t *user_info;
88 retv_if(bluetooth_check_adapter() == BLUETOOTH_ADAPTER_ENABLED,
89 BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED);
91 #ifdef TIZEN_DPM_VCONF_ENABLE
92 retv_if(bluetooth_dpm_is_mode_allowed() == BLUETOOTH_DPM_RESULT_ACCESS_DENIED,
93 BLUETOOTH_ERROR_PERMISSION_DEINED);
96 user_info = _bt_get_user_data(BT_COMMON);
97 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
100 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
102 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_ENABLE_ADAPTER,
103 in_param1, in_param2, in_param3, in_param4,
104 user_info->cb, user_info->user_data);
106 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
111 BT_EXPORT_API int bluetooth_disable_adapter(void)
114 bt_user_info_t *user_info;
117 BT_CHECK_ENABLED(return);
119 user_info = _bt_get_user_data(BT_COMMON);
120 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
123 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
125 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_DISABLE_ADAPTER,
126 in_param1, in_param2, in_param3, in_param4,
127 user_info->cb, user_info->user_data);
129 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
134 BT_EXPORT_API int bluetooth_recover_adapter(void)
139 BT_CHECK_ENABLED(return);
142 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
144 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_RECOVER_ADAPTER,
145 in_param1, in_param2, in_param3, in_param4, &out_param);
147 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
152 BT_EXPORT_API int bluetooth_reset_adapter(void)
158 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
160 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_RESET_ADAPTER,
161 in_param1, in_param2, in_param3, in_param4, &out_param);
163 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
168 BT_EXPORT_API int bluetooth_get_local_address(bluetooth_device_address_t *local_address)
172 BT_CHECK_PARAMETER(local_address, return);
173 BT_CHECK_ENABLED_ANY(return);
176 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
178 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_LOCAL_ADDRESS,
179 in_param1, in_param2, in_param3, in_param4, &out_param);
181 if (result == BLUETOOTH_ERROR_NONE) {
182 *local_address = g_array_index(out_param,
183 bluetooth_device_address_t, 0);
186 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
191 BT_EXPORT_API int bluetooth_get_local_version(bluetooth_version_t *local_version)
195 BT_CHECK_PARAMETER(local_version, return);
196 BT_CHECK_ENABLED_ANY(return);
199 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
201 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_LOCAL_VERSION,
202 in_param1, in_param2, in_param3, in_param4, &out_param);
204 if (result == BLUETOOTH_ERROR_NONE) {
205 *local_version = g_array_index(out_param, bluetooth_version_t, 0);
208 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
213 BT_EXPORT_API int bluetooth_get_local_name(bluetooth_device_name_t *local_name)
217 BT_CHECK_PARAMETER(local_name, return);
218 BT_CHECK_ENABLED_ANY(return);
221 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
223 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_LOCAL_NAME,
224 in_param1, in_param2, in_param3, in_param4, &out_param);
226 if (result == BLUETOOTH_ERROR_NONE) {
227 *local_name = g_array_index(out_param,
228 bluetooth_device_name_t, 0);
231 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
236 BT_EXPORT_API int bluetooth_set_local_name(const bluetooth_device_name_t *local_name)
240 BT_CHECK_PARAMETER(local_name, return);
241 BT_CHECK_ENABLED_ANY(return);
244 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
246 g_array_append_vals(in_param1, local_name, sizeof(bluetooth_device_name_t));
248 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_LOCAL_NAME,
249 in_param1, in_param2, in_param3, in_param4, &out_param);
251 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
256 BT_EXPORT_API int bluetooth_is_service_used(const char *service_uuid,
260 char uuid[BLUETOOTH_UUID_STRING_MAX];
262 BT_CHECK_PARAMETER(service_uuid, return);
263 BT_CHECK_PARAMETER(used, return);
264 BT_CHECK_ENABLED(return);
267 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
269 g_strlcpy(uuid, service_uuid, sizeof(uuid));
270 g_array_append_vals(in_param1, uuid, BLUETOOTH_UUID_STRING_MAX);
272 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_SERVICE_USED,
273 in_param1, in_param2, in_param3, in_param4, &out_param);
275 if (result == BLUETOOTH_ERROR_NONE) {
276 *used = g_array_index(out_param, gboolean, 0);
279 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
284 BT_EXPORT_API int bluetooth_get_discoverable_mode(bluetooth_discoverable_mode_t *
285 discoverable_mode_ptr)
289 BT_CHECK_PARAMETER(discoverable_mode_ptr, return);
291 #ifndef TIZEN_WEARABLE
293 /* Requirement in OSP */
294 if (bluetooth_check_adapter() == BLUETOOTH_ADAPTER_DISABLED) {
295 if (vconf_get_int(BT_FILE_VISIBLE_TIME, &timeout) != 0) {
296 BT_ERR("Fail to get the timeout value");
297 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
301 *discoverable_mode_ptr = BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE;
303 *discoverable_mode_ptr = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
306 return BLUETOOTH_ERROR_NONE;
309 BT_CHECK_ENABLED(return);
313 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
315 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_DISCOVERABLE_MODE,
316 in_param1, in_param2, in_param3, in_param4, &out_param);
318 if (result == BLUETOOTH_ERROR_NONE) {
319 *discoverable_mode_ptr = g_array_index(out_param, int, 0);
322 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
327 BT_EXPORT_API int bluetooth_set_discoverable_mode(bluetooth_discoverable_mode_t discoverable_mode,
332 BT_CHECK_ENABLED(return);
335 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
337 g_array_append_vals(in_param1, &discoverable_mode, sizeof(int));
338 g_array_append_vals(in_param2, &timeout, sizeof(int));
340 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_DISCOVERABLE_MODE,
341 in_param1, in_param2, in_param3, in_param4, &out_param);
343 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
348 BT_EXPORT_API int bluetooth_get_timeout_value(int *timeout)
352 BT_CHECK_PARAMETER(timeout, return);
353 BT_CHECK_ENABLED(return);
356 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
358 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_DISCOVERABLE_TIME,
359 in_param1, in_param2, in_param3, in_param4, &out_param);
361 if (result == BLUETOOTH_ERROR_NONE) {
362 *timeout = g_array_index(out_param, int, 0);
365 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
370 BT_EXPORT_API int bluetooth_start_discovery(unsigned short max_response,
371 unsigned short discovery_duration,
372 unsigned int classOfDeviceMask)
376 BT_CHECK_ENABLED(return);
379 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
381 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_START_DISCOVERY,
382 in_param1, in_param2, in_param3, in_param4, &out_param);
384 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
389 BT_EXPORT_API int bluetooth_start_custom_discovery(bt_discovery_role_type_t role,
390 unsigned short max_response,
391 unsigned short discovery_duration,
392 unsigned int classOfDeviceMask)
396 if (role == DISCOVERY_ROLE_LE)
397 BT_CHECK_ENABLED_LE(return);
399 BT_CHECK_ENABLED(return);
402 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
404 g_array_append_vals(in_param1, &role, sizeof(bt_discovery_role_type_t));
405 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_START_CUSTOM_DISCOVERY,
406 in_param1, in_param2, in_param3, in_param4, &out_param);
408 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
413 BT_EXPORT_API int bluetooth_cancel_discovery(void)
417 BT_CHECK_ENABLED(return);
420 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
422 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_CANCEL_DISCOVERY,
423 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_is_discovering(void)
434 int is_discovering = FALSE;
436 BT_CHECK_ENABLED(return);
439 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
441 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_DISCOVERYING,
442 in_param1, in_param2, in_param3, in_param4, &out_param);
444 if (result == BLUETOOTH_ERROR_NONE) {
445 is_discovering = g_array_index(out_param,
448 BT_ERR("Fail to send request");
451 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
453 return is_discovering;
456 BT_EXPORT_API int bluetooth_is_connectable(gboolean *is_connectable)
460 BT_CHECK_ENABLED_ANY(return);
463 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
465 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_CONNECTABLE,
466 in_param1, in_param2, in_param3, in_param4, &out_param);
468 if (result == BLUETOOTH_ERROR_NONE) {
469 *is_connectable = g_array_index(out_param, int, 0);
471 BT_ERR("Fail to send request");
474 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
479 BT_EXPORT_API int bluetooth_set_connectable(gboolean is_connectable)
483 BT_CHECK_ENABLED_ANY(return);
486 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
488 g_array_append_vals(in_param1, &is_connectable, sizeof(gboolean));
490 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_CONNECTABLE,
491 in_param1, in_param2, in_param3, in_param4, &out_param);
493 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
498 BT_EXPORT_API int bluetooth_get_bonded_device_list(GPtrArray **dev_list)
502 BT_CHECK_PARAMETER(dev_list, return);
503 BT_CHECK_ENABLED(return);
506 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
508 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_BONDED_DEVICES,
509 in_param1, in_param2, in_param3, in_param4, &out_param);
511 if (result == BLUETOOTH_ERROR_NONE)
512 result = __bt_fill_device_list(out_param, dev_list);
514 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
519 BT_EXPORT_API int bluetooth_set_manufacturer_data(const bluetooth_manufacturer_data_t *value)
523 BT_CHECK_PARAMETER(value, return);
524 BT_CHECK_ENABLED_ANY(return);
526 if (value->data_len > BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX)
527 return BLUETOOTH_ERROR_INVALID_PARAM;
530 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
532 g_array_append_vals(in_param1, value, sizeof(bluetooth_manufacturer_data_t));
534 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_MANUFACTURER_DATA,
535 in_param1, in_param2, in_param3, in_param4, &out_param);
537 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);