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.
24 #include "bluetooth-api.h"
25 #include "bt-internal-types.h"
27 #include "bt-common.h"
28 #include "bt-request-sender.h"
29 #include "bt-event-handler.h"
31 BT_EXPORT_API int bluetooth_bond_device(const bluetooth_device_address_t *device_address)
34 bt_user_info_t *user_info;
36 BT_CHECK_PARAMETER(device_address, return);
37 BT_CHECK_ENABLED(return);
39 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_BOND_DEVICE)
40 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
41 BT_ERR("Don't have a privilege to use this API");
42 return BLUETOOTH_ERROR_PERMISSION_DEINED;
45 user_info = _bt_get_user_data(BT_COMMON);
46 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
49 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
51 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
53 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_BOND_DEVICE,
54 in_param1, in_param2, in_param3, in_param4,
55 user_info->cb, user_info->user_data);
57 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
62 BT_EXPORT_API int bluetooth_bond_device_by_type(
63 const bluetooth_device_address_t *device_address,
64 bluetooth_conn_type_t conn_type)
67 bt_user_info_t *user_info;
69 BT_CHECK_PARAMETER(device_address, return);
70 BT_CHECK_ENABLED(return);
72 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_BOND_DEVICE_BY_TYPE)
73 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
74 BT_ERR("Don't have a privilege to use this API");
75 return BLUETOOTH_ERROR_PERMISSION_DEINED;
79 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
81 user_info = _bt_get_user_data(BT_COMMON);
82 retv_if(user_info == NULL, BLUETOOTH_ERROR_INTERNAL);
84 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
85 g_array_append_vals(in_param2, &conn_type, sizeof(unsigned short));
87 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_BOND_DEVICE_BY_TYPE,
88 in_param1, in_param2, in_param3, in_param4,
89 user_info->cb, user_info->user_data);
91 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
96 BT_EXPORT_API int bluetooth_cancel_bonding(void)
100 BT_CHECK_ENABLED(return);
103 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
105 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_CANCEL_BONDING,
106 in_param1, in_param2, in_param3, in_param4, &out_param);
108 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
113 BT_EXPORT_API int bluetooth_unbond_device(const bluetooth_device_address_t *device_address)
116 bt_user_info_t *user_info;
118 BT_CHECK_PARAMETER(device_address, return);
119 BT_CHECK_ENABLED(return);
121 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_UNBOND_DEVICE)
122 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
123 BT_ERR("Don't have a privilege to use this API");
124 return BLUETOOTH_ERROR_PERMISSION_DEINED;
127 user_info = _bt_get_user_data(BT_COMMON);
128 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
131 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
133 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
135 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_UNBOND_DEVICE,
136 in_param1, in_param2, in_param3, in_param4,
137 user_info->cb, user_info->user_data);
139 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
144 BT_EXPORT_API int bluetooth_get_bonded_device(const bluetooth_device_address_t *device_address,
145 bluetooth_device_info_t *dev_info)
149 BT_CHECK_PARAMETER(device_address, return);
150 BT_CHECK_PARAMETER(dev_info, return);
151 BT_CHECK_ENABLED(return);
154 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
156 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
158 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_BONDED_DEVICE,
159 in_param1, in_param2, in_param3, in_param4, &out_param);
161 if (result == BLUETOOTH_ERROR_NONE) {
162 if (out_param->len > 0) {
163 *dev_info = g_array_index(out_param,
164 bluetooth_device_info_t, 0);
166 BT_ERR("out_param length is 0!!");
170 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
175 BT_EXPORT_API int bluetooth_get_remote_device(const bluetooth_device_address_t *device_address)
177 return BLUETOOTH_ERROR_NONE;
180 BT_EXPORT_API int bluetooth_search_service(const bluetooth_device_address_t *device_address)
183 bt_user_info_t *user_info;
185 BT_CHECK_PARAMETER(device_address, return);
186 BT_CHECK_ENABLED(return);
188 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_SEARCH_SERVICE)
189 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
190 BT_ERR("Don't have a privilege to use this API");
191 return BLUETOOTH_ERROR_PERMISSION_DEINED;
194 user_info = _bt_get_user_data(BT_COMMON);
195 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
198 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
200 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
202 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_SEARCH_SERVICE,
203 in_param1, in_param2, in_param3, in_param4,
204 user_info->cb, user_info->user_data);
206 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
211 BT_EXPORT_API int bluetooth_cancel_service_search(void)
215 BT_CHECK_ENABLED(return);
218 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
220 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_CANCEL_SEARCH_SERVICE,
221 in_param1, in_param2, in_param3, in_param4, &out_param);
223 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
228 BT_EXPORT_API int bluetooth_set_alias(const bluetooth_device_address_t *device_address,
232 char alias_name[BLUETOOTH_DEVICE_NAME_LENGTH_MAX];
234 BT_CHECK_PARAMETER(device_address, return);
235 BT_CHECK_PARAMETER(alias, return);
236 BT_CHECK_ENABLED(return);
239 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
241 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
242 g_strlcpy(alias_name, alias, sizeof(alias_name));
243 g_array_append_vals(in_param2, alias_name, BLUETOOTH_DEVICE_NAME_LENGTH_MAX);
245 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_ALIAS,
246 in_param1, in_param2, in_param3, in_param4, &out_param);
248 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
253 BT_EXPORT_API int bluetooth_authorize_device(const bluetooth_device_address_t *device_address,
258 BT_CHECK_PARAMETER(device_address, return);
259 BT_CHECK_ENABLED(return);
262 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
264 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
265 g_array_append_vals(in_param2, &authorized, sizeof(gboolean));
267 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_AUTHORIZATION,
268 in_param1, in_param2, in_param3, in_param4, &out_param);
270 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
275 BT_EXPORT_API int bluetooth_is_device_connected(const bluetooth_device_address_t *device_address,
276 bluetooth_service_type_t type,
277 gboolean *is_connected)
281 BT_CHECK_PARAMETER(device_address, return);
282 BT_CHECK_PARAMETER(is_connected, return);
283 BT_CHECK_ENABLED(return);
286 if (type & BLUETOOTH_RFCOMM_SERVICE) {
287 result = bluetooth_rfcomm_client_is_connected(device_address, is_connected);
288 if (*is_connected == FALSE)
289 result = bluetooth_rfcomm_server_is_connected(device_address, is_connected);
296 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
298 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
299 g_array_append_vals(in_param2, &type, sizeof(int));
301 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_DEVICE_CONNECTED,
302 in_param1, in_param2, in_param3, in_param4, &out_param);
304 if (result == BLUETOOTH_ERROR_NONE) {
305 *is_connected = g_array_index(out_param, gboolean, 0);
308 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
313 BT_EXPORT_API int bluetooth_connect_le(const bluetooth_device_address_t *device_address, gboolean auto_connect)
317 BT_CHECK_PARAMETER(device_address, return);
318 BT_CHECK_ENABLED_ANY(return);
321 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
323 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
324 g_array_append_vals(in_param2, &auto_connect, sizeof(gboolean));
326 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_CONNECT_LE,
327 in_param1, in_param2, in_param3, in_param4, &out_param);
329 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
334 BT_EXPORT_API int bluetooth_disconnect_le(const bluetooth_device_address_t *device_address)
338 BT_CHECK_PARAMETER(device_address, return);
339 BT_CHECK_ENABLED_ANY(return);
342 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
344 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
346 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_DISCONNECT_LE,
347 in_param1, in_param2, in_param3, in_param4, &out_param);
349 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
354 BT_EXPORT_API int bluetooth_enable_rssi(const bluetooth_device_address_t *remote_address,
355 int link_type, bt_rssi_threshold_t *rssi_threshold)
359 BT_CHECK_ENABLED(return);
362 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
363 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
364 g_array_append_vals(in_param2, &link_type, sizeof(int));
365 g_array_append_vals(in_param3, rssi_threshold, sizeof(bt_rssi_threshold_t));
367 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_ENABLE_RSSI,
368 in_param1, in_param2, in_param3, in_param4, &out_param);
370 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
375 BT_EXPORT_API int bluetooth_get_rssi_strength(const bluetooth_device_address_t *remote_address, int link_type)
379 BT_CHECK_ENABLED(return);
382 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
383 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
384 g_array_append_vals(in_param2, &link_type, sizeof(int));
386 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_RSSI,
387 in_param1, in_param2, in_param3, in_param4, &out_param);
389 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
394 BT_EXPORT_API int bluetooth_le_conn_update(const bluetooth_device_address_t *address,
395 const bluetooth_le_conn_update_t *parameters)
399 BT_CHECK_ENABLED(return);
400 BT_CHECK_PARAMETER(address, return);
401 BT_CHECK_PARAMETER(parameters, return);
404 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
406 g_array_append_vals(in_param1, address,
407 sizeof(bluetooth_device_address_t));
408 g_array_append_vals(in_param2, parameters,
409 sizeof(bluetooth_le_conn_update_t));
411 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_LE_CONN_UPDATE,
412 in_param1, in_param2, in_param3, in_param4, &out_param);
414 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
419 BT_EXPORT_API int bluetooth_get_connected_link_type(
420 const bluetooth_device_address_t *device_address,
421 bluetooth_connected_link_t *connected)
425 BT_CHECK_PARAMETER(device_address, return);
426 BT_CHECK_ENABLED(return);
429 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
431 g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
433 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_CONNECTED_LINK_TYPE,
434 in_param1, in_param2, in_param3, in_param4, &out_param);
436 if (result == BLUETOOTH_ERROR_NONE) {
437 *connected = g_array_index(out_param, guint, 0);
440 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);