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 user_info = _bt_get_user_data(BT_COMMON);
92 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
95 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
97 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_ENABLE_ADAPTER,
98 in_param1, in_param2, in_param3, in_param4,
99 user_info->cb, user_info->user_data);
101 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
106 BT_EXPORT_API int bluetooth_disable_adapter(void)
109 bt_user_info_t *user_info;
112 BT_CHECK_ENABLED(return);
114 user_info = _bt_get_user_data(BT_COMMON);
115 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
118 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
120 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_DISABLE_ADAPTER,
121 in_param1, in_param2, in_param3, in_param4,
122 user_info->cb, user_info->user_data);
124 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
129 BT_EXPORT_API int bluetooth_recover_adapter(void)
134 BT_CHECK_ENABLED(return);
137 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
139 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_RECOVER_ADAPTER,
140 in_param1, in_param2, in_param3, in_param4, &out_param);
142 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
147 BT_EXPORT_API int bluetooth_reset_adapter(void)
153 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
155 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_RESET_ADAPTER,
156 in_param1, in_param2, in_param3, in_param4, &out_param);
158 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
163 BT_EXPORT_API int bluetooth_get_local_address(bluetooth_device_address_t *local_address)
167 BT_CHECK_PARAMETER(local_address, return);
168 BT_CHECK_ENABLED_ANY(return);
171 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
173 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_LOCAL_ADDRESS,
174 in_param1, in_param2, in_param3, in_param4, &out_param);
176 if (result == BLUETOOTH_ERROR_NONE) {
177 *local_address = g_array_index(out_param,
178 bluetooth_device_address_t, 0);
181 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
186 BT_EXPORT_API int bluetooth_get_local_version(bluetooth_version_t *local_version)
190 BT_CHECK_PARAMETER(local_version, return);
191 BT_CHECK_ENABLED_ANY(return);
194 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
196 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_LOCAL_VERSION,
197 in_param1, in_param2, in_param3, in_param4, &out_param);
199 if (result == BLUETOOTH_ERROR_NONE) {
200 *local_version = g_array_index(out_param, bluetooth_version_t, 0);
203 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
208 BT_EXPORT_API int bluetooth_get_local_name(bluetooth_device_name_t *local_name)
212 BT_CHECK_PARAMETER(local_name, return);
213 BT_CHECK_ENABLED_ANY(return);
216 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
218 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_LOCAL_NAME,
219 in_param1, in_param2, in_param3, in_param4, &out_param);
221 if (result == BLUETOOTH_ERROR_NONE) {
222 *local_name = g_array_index(out_param,
223 bluetooth_device_name_t, 0);
226 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
231 BT_EXPORT_API int bluetooth_set_local_name(const bluetooth_device_name_t *local_name)
235 BT_CHECK_PARAMETER(local_name, return);
236 BT_CHECK_ENABLED_ANY(return);
239 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
241 g_array_append_vals(in_param1, local_name, sizeof(bluetooth_device_name_t));
243 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_LOCAL_NAME,
244 in_param1, in_param2, in_param3, in_param4, &out_param);
246 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
251 BT_EXPORT_API int bluetooth_is_service_used(const char *service_uuid,
255 char uuid[BLUETOOTH_UUID_STRING_MAX];
257 BT_CHECK_PARAMETER(service_uuid, return);
258 BT_CHECK_PARAMETER(used, return);
259 BT_CHECK_ENABLED(return);
262 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
264 g_strlcpy(uuid, service_uuid, sizeof(uuid));
265 g_array_append_vals(in_param1, uuid, BLUETOOTH_UUID_STRING_MAX);
267 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_SERVICE_USED,
268 in_param1, in_param2, in_param3, in_param4, &out_param);
270 if (result == BLUETOOTH_ERROR_NONE) {
271 *used = g_array_index(out_param, gboolean, 0);
274 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
279 BT_EXPORT_API int bluetooth_get_discoverable_mode(bluetooth_discoverable_mode_t *
280 discoverable_mode_ptr)
284 BT_CHECK_PARAMETER(discoverable_mode_ptr, return);
286 #ifndef TIZEN_WEARABLE
288 /* Requirement in OSP */
289 if (bluetooth_check_adapter() == BLUETOOTH_ADAPTER_DISABLED) {
290 if (vconf_get_int(BT_FILE_VISIBLE_TIME, &timeout) != 0) {
291 BT_ERR("Fail to get the timeout value");
292 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
296 *discoverable_mode_ptr = BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE;
298 *discoverable_mode_ptr = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
301 return BLUETOOTH_ERROR_NONE;
304 BT_CHECK_ENABLED(return);
308 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
310 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_DISCOVERABLE_MODE,
311 in_param1, in_param2, in_param3, in_param4, &out_param);
313 if (result == BLUETOOTH_ERROR_NONE) {
314 *discoverable_mode_ptr = g_array_index(out_param, int, 0);
317 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
322 BT_EXPORT_API int bluetooth_set_discoverable_mode(bluetooth_discoverable_mode_t discoverable_mode,
327 BT_CHECK_ENABLED(return);
330 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
332 g_array_append_vals(in_param1, &discoverable_mode, sizeof(int));
333 g_array_append_vals(in_param2, &timeout, sizeof(int));
335 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_DISCOVERABLE_MODE,
336 in_param1, in_param2, in_param3, in_param4, &out_param);
338 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
343 BT_EXPORT_API int bluetooth_get_timeout_value(int *timeout)
347 BT_CHECK_PARAMETER(timeout, return);
348 BT_CHECK_ENABLED(return);
351 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
353 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_DISCOVERABLE_TIME,
354 in_param1, in_param2, in_param3, in_param4, &out_param);
356 if (result == BLUETOOTH_ERROR_NONE) {
357 *timeout = g_array_index(out_param, int, 0);
360 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
365 BT_EXPORT_API int bluetooth_start_discovery(unsigned short max_response,
366 unsigned short discovery_duration,
367 unsigned int classOfDeviceMask)
371 BT_CHECK_ENABLED(return);
374 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
376 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_START_DISCOVERY,
377 in_param1, in_param2, in_param3, in_param4, &out_param);
379 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
384 BT_EXPORT_API int bluetooth_start_custom_discovery(bt_discovery_role_type_t role,
385 unsigned short max_response,
386 unsigned short discovery_duration,
387 unsigned int classOfDeviceMask)
391 if (role == DISCOVERY_ROLE_LE)
392 BT_CHECK_ENABLED_LE(return);
394 BT_CHECK_ENABLED(return);
397 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
399 g_array_append_vals(in_param1, &role, sizeof(bt_discovery_role_type_t));
400 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_START_CUSTOM_DISCOVERY,
401 in_param1, in_param2, in_param3, in_param4, &out_param);
403 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
408 BT_EXPORT_API int bluetooth_cancel_discovery(void)
412 BT_CHECK_ENABLED(return);
415 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
417 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_CANCEL_DISCOVERY,
418 in_param1, in_param2, in_param3, in_param4, &out_param);
421 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
426 BT_EXPORT_API int bluetooth_is_discovering(void)
429 int is_discovering = FALSE;
431 BT_CHECK_ENABLED(return);
434 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
436 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_DISCOVERYING,
437 in_param1, in_param2, in_param3, in_param4, &out_param);
439 if (result == BLUETOOTH_ERROR_NONE) {
440 is_discovering = g_array_index(out_param,
443 BT_ERR("Fail to send request");
446 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
448 return is_discovering;
451 BT_EXPORT_API int bluetooth_is_connectable(gboolean *is_connectable)
455 BT_CHECK_ENABLED_ANY(return);
458 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
460 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_CONNECTABLE,
461 in_param1, in_param2, in_param3, in_param4, &out_param);
463 if (result == BLUETOOTH_ERROR_NONE) {
464 *is_connectable = g_array_index(out_param, int, 0);
466 BT_ERR("Fail to send request");
469 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
474 BT_EXPORT_API int bluetooth_set_connectable(gboolean is_connectable)
478 BT_CHECK_ENABLED_ANY(return);
481 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
483 g_array_append_vals(in_param1, &is_connectable, sizeof(gboolean));
485 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_CONNECTABLE,
486 in_param1, in_param2, in_param3, in_param4, &out_param);
488 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
493 BT_EXPORT_API int bluetooth_get_bonded_device_list(GPtrArray **dev_list)
497 BT_CHECK_PARAMETER(dev_list, return);
498 BT_CHECK_ENABLED(return);
501 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
503 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_BONDED_DEVICES,
504 in_param1, in_param2, in_param3, in_param4, &out_param);
506 if (result == BLUETOOTH_ERROR_NONE)
507 result = __bt_fill_device_list(out_param, dev_list);
509 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
514 BT_EXPORT_API int bluetooth_set_manufacturer_data(const bluetooth_manufacturer_data_t *value)
518 BT_CHECK_PARAMETER(value, return);
519 BT_CHECK_ENABLED_ANY(return);
521 if (value->data_len > BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX)
522 return BLUETOOTH_ERROR_INVALID_PARAM;
525 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
527 g_array_append_vals(in_param1, value, sizeof(bluetooth_manufacturer_data_t));
529 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_MANUFACTURER_DATA,
530 in_param1, in_param2, in_param3, in_param4, &out_param);
532 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);