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.
18 #include "bluetooth-api.h"
19 #include "bt-internal-types.h"
21 #include "bt-common.h"
22 #include "bt-request-sender.h"
23 #include "bt-event-handler.h"
25 BT_EXPORT_API int bluetooth_bond_device(const bluetooth_device_address_t *device_address)
28 bt_user_info_t *user_info;
30 BT_CHECK_PARAMETER(device_address, return);
31 BT_CHECK_ENABLED(return);
33 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_BOND_DEVICE)
34 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
35 BT_ERR("Don't have a privilege to use this API");
36 return BLUETOOTH_ERROR_PERMISSION_DEINED;
39 user_info = _bt_get_user_data(BT_COMMON);
40 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
43 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
45 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
47 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_BOND_DEVICE,
48 in_param1, in_param2, in_param3, in_param4,
49 user_info->cb, user_info->user_data);
51 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
56 BT_EXPORT_API int bluetooth_bond_device_by_type(
57 const bluetooth_device_address_t *device_address,
58 bluetooth_conn_type_t conn_type)
61 bt_user_info_t *user_info;
63 BT_CHECK_PARAMETER(device_address, return);
64 if(conn_type == BLUETOOTH_DEV_CONN_BREDR)
65 BT_CHECK_ENABLED(return);
66 else if(conn_type == BLUETOOTH_DEV_CONN_LE)
67 BT_CHECK_ENABLED_LE(return);
68 else if(conn_type == BLUETOOTH_DEV_CONN_DEFAULT) {
69 BT_CHECK_ENABLED(return);
70 BT_CHECK_ENABLED_LE(return);
73 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_BOND_DEVICE_BY_TYPE)
74 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
75 BT_ERR("Don't have a privilege to use this API");
76 return BLUETOOTH_ERROR_PERMISSION_DEINED;
80 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
82 user_info = _bt_get_user_data(BT_COMMON);
83 retv_if(user_info == NULL, BLUETOOTH_ERROR_INTERNAL);
85 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
86 g_array_append_vals(in_param2, &conn_type, sizeof(unsigned short));
88 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_BOND_DEVICE_BY_TYPE,
89 in_param1, in_param2, in_param3, in_param4,
90 user_info->cb, user_info->user_data);
92 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
97 BT_EXPORT_API int bluetooth_cancel_bonding(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_CANCEL_BONDING,
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);
114 BT_EXPORT_API int bluetooth_unbond_device(const bluetooth_device_address_t *device_address)
117 bt_user_info_t *user_info;
119 BT_CHECK_PARAMETER(device_address, return);
120 BT_CHECK_ENABLED_ANY(return);
122 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_UNBOND_DEVICE)
123 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
124 BT_ERR("Don't have a privilege to use this API");
125 return BLUETOOTH_ERROR_PERMISSION_DEINED;
128 user_info = _bt_get_user_data(BT_COMMON);
129 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
132 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
134 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
136 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_UNBOND_DEVICE,
137 in_param1, in_param2, in_param3, in_param4,
138 user_info->cb, user_info->user_data);
140 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
145 BT_EXPORT_API int bluetooth_get_bonded_device(const bluetooth_device_address_t *device_address,
146 bluetooth_device_info_t *dev_info)
150 BT_CHECK_PARAMETER(device_address, return);
151 BT_CHECK_PARAMETER(dev_info, return);
152 BT_CHECK_ENABLED_ANY(return);
155 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
157 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
159 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_BONDED_DEVICE,
160 in_param1, in_param2, in_param3, in_param4, &out_param);
162 if (result == BLUETOOTH_ERROR_NONE) {
163 if (out_param->len > 0) {
164 *dev_info = g_array_index(out_param,
165 bluetooth_device_info_t, 0);
167 BT_ERR("out_param length is 0!!");
171 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
176 BT_EXPORT_API int bluetooth_get_remote_device(const bluetooth_device_address_t *device_address)
178 return BLUETOOTH_ERROR_NONE;
181 BT_EXPORT_API int bluetooth_search_service(const bluetooth_device_address_t *device_address)
184 bt_user_info_t *user_info;
186 BT_CHECK_PARAMETER(device_address, return);
187 BT_CHECK_ENABLED_ANY(return);
189 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_SEARCH_SERVICE)
190 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
191 BT_ERR("Don't have a privilege to use this API");
192 return BLUETOOTH_ERROR_PERMISSION_DEINED;
195 user_info = _bt_get_user_data(BT_COMMON);
196 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
199 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
201 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
203 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_SEARCH_SERVICE,
204 in_param1, in_param2, in_param3, in_param4,
205 user_info->cb, user_info->user_data);
207 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
212 BT_EXPORT_API int bluetooth_cancel_service_search(void)
216 BT_CHECK_ENABLED_ANY(return);
219 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
221 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_CANCEL_SEARCH_SERVICE,
222 in_param1, in_param2, in_param3, in_param4, &out_param);
224 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
229 BT_EXPORT_API int bluetooth_set_alias(const bluetooth_device_address_t *device_address,
233 char alias_name[BLUETOOTH_DEVICE_NAME_LENGTH_MAX];
235 BT_CHECK_PARAMETER(device_address, return);
236 BT_CHECK_PARAMETER(alias, return);
237 BT_CHECK_ENABLED_ANY(return);
240 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
242 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
243 g_strlcpy(alias_name, alias, sizeof(alias_name));
244 g_array_append_vals(in_param2, alias_name, BLUETOOTH_DEVICE_NAME_LENGTH_MAX);
246 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_ALIAS,
247 in_param1, in_param2, in_param3, in_param4, &out_param);
249 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
254 BT_EXPORT_API int bluetooth_authorize_device(const bluetooth_device_address_t *device_address,
259 BT_CHECK_PARAMETER(device_address, return);
260 BT_CHECK_ENABLED_ANY(return);
263 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
265 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
266 g_array_append_vals(in_param2, &authorized, sizeof(gboolean));
268 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_AUTHORIZATION,
269 in_param1, in_param2, in_param3, in_param4, &out_param);
271 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
276 BT_EXPORT_API int bluetooth_is_device_connected(const bluetooth_device_address_t *device_address,
277 bluetooth_service_type_t type,
278 gboolean *is_connected)
282 BT_CHECK_PARAMETER(device_address, return);
283 BT_CHECK_PARAMETER(is_connected, return);
284 BT_CHECK_ENABLED_ANY(return);
287 if (type & BLUETOOTH_RFCOMM_SERVICE) {
288 result = bluetooth_rfcomm_client_is_connected(device_address, is_connected);
289 if (*is_connected == FALSE)
290 result = bluetooth_rfcomm_server_is_connected(device_address, is_connected);
297 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
299 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
300 g_array_append_vals(in_param2, &type, sizeof(int));
302 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_DEVICE_CONNECTED,
303 in_param1, in_param2, in_param3, in_param4, &out_param);
305 if (result == BLUETOOTH_ERROR_NONE) {
306 *is_connected = g_array_index(out_param, gboolean, 0);
309 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
314 BT_EXPORT_API int bluetooth_connect_le(const bluetooth_device_address_t *device_address, gboolean auto_connect)
317 bt_user_info_t *user_info;
319 BT_CHECK_PARAMETER(device_address, return);
320 BT_CHECK_ENABLED_ANY(return);
323 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
325 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
326 g_array_append_vals(in_param2, &auto_connect, sizeof(gboolean));
328 user_info = _bt_get_user_data(BT_COMMON);
329 retv_if(user_info == NULL, BLUETOOTH_ERROR_INTERNAL);
331 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_CONNECT_LE,
332 in_param1, in_param2, in_param3, in_param4,
333 user_info->cb, user_info->user_data);
335 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
340 BT_EXPORT_API int bluetooth_disconnect_le(const bluetooth_device_address_t *device_address)
343 bt_user_info_t *user_info;
345 BT_CHECK_PARAMETER(device_address, return);
346 BT_CHECK_ENABLED_ANY(return);
349 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
351 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
353 user_info = _bt_get_user_data(BT_COMMON);
354 retv_if(user_info == NULL, BLUETOOTH_ERROR_INTERNAL);
356 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_DISCONNECT_LE,
357 in_param1, in_param2, in_param3, in_param4,
358 user_info->cb, user_info->user_data);
360 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
365 BT_EXPORT_API int bluetooth_enable_rssi(const bluetooth_device_address_t *remote_address,
366 int link_type, bt_rssi_threshold_t *rssi_threshold)
370 BT_CHECK_ENABLED_ANY(return);
373 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
374 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
375 g_array_append_vals(in_param2, &link_type, sizeof(int));
376 g_array_append_vals(in_param3, rssi_threshold, sizeof(bt_rssi_threshold_t));
378 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_ENABLE_RSSI,
379 in_param1, in_param2, in_param3, in_param4, &out_param);
381 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
386 BT_EXPORT_API int bluetooth_get_rssi_strength(const bluetooth_device_address_t *remote_address, int link_type)
390 BT_CHECK_ENABLED_ANY(return);
393 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
394 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
395 g_array_append_vals(in_param2, &link_type, sizeof(int));
397 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_RSSI,
398 in_param1, in_param2, in_param3, in_param4, &out_param);
400 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
405 BT_EXPORT_API int bluetooth_le_conn_update(const bluetooth_device_address_t *address,
406 const bluetooth_le_connection_param_t *parameters)
410 BT_CHECK_ENABLED_ANY(return);
411 BT_CHECK_PARAMETER(address, return);
412 BT_CHECK_PARAMETER(parameters, return);
415 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
417 g_array_append_vals(in_param1, address,
418 sizeof(bluetooth_device_address_t));
419 g_array_append_vals(in_param2, parameters,
420 sizeof(bluetooth_le_connection_param_t));
422 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_LE_CONN_UPDATE,
423 in_param1, in_param2, in_param3, in_param4, &out_param);
425 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
430 BT_EXPORT_API int bluetooth_get_connected_link_type(
431 const bluetooth_device_address_t *device_address,
432 bluetooth_connected_link_t *connected)
436 BT_CHECK_PARAMETER(device_address, return);
437 BT_CHECK_ENABLED_ANY(return);
440 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
442 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
444 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_CONNECTED_LINK_TYPE,
445 in_param1, in_param2, in_param3, in_param4, &out_param);
447 if (result == BLUETOOTH_ERROR_NONE) {
448 *connected = g_array_index(out_param, guint, 0);
451 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
456 BT_EXPORT_API int bluetooth_set_pin_code(
457 const bluetooth_device_address_t *device_address,
458 const bluetooth_device_pin_code_t *pin_code)
462 BT_CHECK_PARAMETER(device_address, return);
463 BT_CHECK_PARAMETER(pin_code, return);
464 BT_CHECK_ENABLED(return);
467 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
469 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
470 g_array_append_vals(in_param2, pin_code, sizeof(bluetooth_device_pin_code_t));
472 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_PIN_CODE,
473 in_param1, in_param2, in_param3, in_param4, &out_param);
475 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
480 BT_EXPORT_API int bluetooth_unset_pin_code(
481 const bluetooth_device_address_t *device_address)
485 BT_CHECK_PARAMETER(device_address, return);
486 BT_CHECK_ENABLED(return);
489 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
491 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
493 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_UNSET_PIN_CODE,
494 in_param1, in_param2, in_param3, in_param4, &out_param);
496 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
501 BT_EXPORT_API int bluetooth_update_le_connection_mode(const bluetooth_device_address_t *address,
502 const bluetooth_le_connection_mode_t mode)
506 BT_CHECK_ENABLED(return);
507 BT_CHECK_PARAMETER(address, return);
510 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
512 g_array_append_vals(in_param1, address,
513 sizeof(bluetooth_device_address_t));
514 g_array_append_vals(in_param2, &mode,
515 sizeof(bluetooth_le_connection_mode_t));
517 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_UPDATE_LE_CONNECTION_MODE,
518 in_param1, in_param2, in_param3, in_param4, &out_param);
520 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
525 BT_EXPORT_API int bluetooth_passkey_reply(char *passkey, gboolean reply)
529 char str_passkey[BLUETOOTH_DEVICE_PASSKEY_LENGTH_MAX];
531 BT_CHECK_PARAMETER(passkey, return);
532 BT_CHECK_ENABLED(return);
535 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
537 g_strlcpy(str_passkey, passkey, sizeof(str_passkey));
538 g_array_append_vals(in_param1, str_passkey, BLUETOOTH_DEVICE_PASSKEY_LENGTH_MAX);
539 g_array_append_vals(in_param2, &reply, sizeof(gboolean));
541 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_PASSKEY_REPLY,
542 in_param1, in_param2, in_param3, in_param4, &out_param);
544 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
549 BT_EXPORT_API int bluetooth_passkey_confirmation_reply(gboolean reply)
553 BT_CHECK_ENABLED(return);
556 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
557 g_array_append_vals(in_param1, &reply, sizeof(gboolean));
558 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_PASSKEY_CONFIRMATION_REPLY,
559 in_param1, in_param2, in_param3, in_param4, &out_param);
560 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);