6eb7fe771d4a2e5991d9975e3cf1872f5ef1ba3e
[platform/core/connectivity/bluetooth-frwk.git] / bt-api / bt-adapter.c
1 /*
2  * Bluetooth-frwk
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact:  Hocheol Seo <hocheol.seo@samsung.com>
7  *               Girishashok Joshi <girish.joshi@samsung.com>
8  *               Chanyeol Park <chanyeol.park@samsung.com>
9  *
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
13  *
14  *              http://www.apache.org/licenses/LICENSE-2.0
15  *
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.
21  *
22  */
23
24 #include <vconf.h>
25
26 #include "bluetooth-api.h"
27 #include "bt-internal-types.h"
28
29 #include "bt-common.h"
30 #include "bt-request-sender.h"
31 #include "bt-event-handler.h"
32
33 static int __bt_fill_device_list(GArray *out_param2, GPtrArray **dev_list)
34 {
35         int i;
36         guint size;
37         bluetooth_device_info_t info;
38
39         BT_CHECK_PARAMETER(out_param2, return);
40         BT_CHECK_PARAMETER(dev_list, return);
41
42         size = out_param2->len;
43
44         if (size == 0) {
45                 BT_ERR("No bonded device");
46                 return BLUETOOTH_ERROR_NONE;
47         }
48
49         size = (out_param2->len) / sizeof(bluetooth_device_info_t);
50
51         for (i = 0; i < size; i++) {
52                 bluetooth_device_info_t *dev_info = NULL;
53
54                 info = g_array_index(out_param2,
55                                 bluetooth_device_info_t, i);
56
57                 dev_info = g_memdup(&info, sizeof(bluetooth_device_info_t));
58
59                 if (dev_info) {
60                         g_ptr_array_add(*dev_list, (gpointer)dev_info);
61                 }
62         }
63
64         return BLUETOOTH_ERROR_NONE;
65 }
66
67 BT_EXPORT_API int bluetooth_check_adapter(void)
68 {
69         int ret;
70         int value;
71
72         ret = _bt_get_adapter_path(_bt_gdbus_get_system_gconn(), NULL);
73
74         if (ret != BLUETOOTH_ERROR_NONE) {
75                 return BLUETOOTH_ADAPTER_DISABLED;
76         }
77
78         /* check VCONFKEY_BT_STATUS */
79         if (vconf_get_int(VCONFKEY_BT_STATUS, &value) != 0) {
80                 BT_ERR("fail to get vconf key!");
81                 return BLUETOOTH_ADAPTER_DISABLED;
82         }
83
84         return value == VCONFKEY_BT_STATUS_OFF ? BLUETOOTH_ADAPTER_DISABLED :
85                                                 BLUETOOTH_ADAPTER_ENABLED;
86 }
87
88 BT_EXPORT_API int bluetooth_enable_adapter(void)
89 {
90         int result;
91         bt_user_info_t *user_info;
92
93         BT_INFO("");
94         retv_if(bluetooth_check_adapter() == BLUETOOTH_ADAPTER_ENABLED,
95                                 BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED);
96
97         user_info = _bt_get_user_data(BT_COMMON);
98         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
99
100         BT_INIT_PARAMS();
101         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
102
103         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_ENABLE_ADAPTER,
104                 in_param1, in_param2, in_param3, in_param4,
105                 user_info->cb, user_info->user_data);
106
107         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
108
109         return result;
110 }
111
112 BT_EXPORT_API int bluetooth_disable_adapter(void)
113 {
114         int result;
115         bt_user_info_t *user_info;
116
117         BT_INFO("");
118         BT_CHECK_ENABLED(return);
119
120         user_info = _bt_get_user_data(BT_COMMON);
121         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
122
123         BT_INIT_PARAMS();
124         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
125
126         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_DISABLE_ADAPTER,
127                 in_param1, in_param2, in_param3, in_param4,
128                 user_info->cb, user_info->user_data);
129
130         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
131
132         return result;
133 }
134
135 BT_EXPORT_API int bluetooth_recover_adapter(void)
136 {
137         int result;
138
139         BT_INFO("");
140         BT_CHECK_ENABLED(return);
141
142         BT_INIT_PARAMS();
143         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
144
145         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_RECOVER_ADAPTER,
146                 in_param1, in_param2, in_param3, in_param4, &out_param);
147
148         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
149
150         return result;
151 }
152
153 BT_EXPORT_API int bluetooth_reset_adapter(void)
154 {
155         int result;
156
157         BT_INFO("");
158         BT_INIT_PARAMS();
159         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
160
161         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_RESET_ADAPTER,
162                 in_param1, in_param2, in_param3, in_param4, &out_param);
163
164         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
165
166         return result;
167 }
168
169 BT_EXPORT_API int bluetooth_get_local_address(bluetooth_device_address_t *local_address)
170 {
171         int result;
172
173         BT_CHECK_PARAMETER(local_address, return);
174         BT_CHECK_ENABLED_ANY(return);
175
176         BT_INIT_PARAMS();
177         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
178
179         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_LOCAL_ADDRESS,
180                 in_param1, in_param2, in_param3, in_param4, &out_param);
181
182         if (result == BLUETOOTH_ERROR_NONE) {
183                 *local_address = g_array_index(out_param,
184                         bluetooth_device_address_t, 0);
185         }
186
187         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
188
189         return result;
190 }
191
192 BT_EXPORT_API int bluetooth_get_local_version(bluetooth_version_t *local_version)
193 {
194         int result;
195
196         BT_CHECK_PARAMETER(local_version, return);
197         BT_CHECK_ENABLED_ANY(return);
198
199         BT_INIT_PARAMS();
200         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
201
202         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_LOCAL_VERSION,
203                 in_param1, in_param2, in_param3, in_param4, &out_param);
204
205         if (result == BLUETOOTH_ERROR_NONE) {
206                 *local_version = g_array_index(out_param, bluetooth_version_t, 0);
207         }
208
209         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
210
211         return result;
212 }
213
214 BT_EXPORT_API int bluetooth_get_local_name(bluetooth_device_name_t *local_name)
215 {
216         int result;
217
218         BT_CHECK_PARAMETER(local_name, return);
219         BT_CHECK_ENABLED_ANY(return);
220
221         BT_INIT_PARAMS();
222         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
223
224         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_LOCAL_NAME,
225                 in_param1, in_param2, in_param3, in_param4, &out_param);
226
227         if (result == BLUETOOTH_ERROR_NONE) {
228                 *local_name = g_array_index(out_param,
229                                 bluetooth_device_name_t, 0);
230         }
231
232         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
233
234         return result;
235 }
236
237 BT_EXPORT_API int bluetooth_set_local_name(const bluetooth_device_name_t *local_name)
238 {
239         int result;
240
241         BT_CHECK_PARAMETER(local_name, return);
242         BT_CHECK_ENABLED_ANY(return);
243
244         BT_INIT_PARAMS();
245         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
246
247         g_array_append_vals(in_param1, local_name, sizeof(bluetooth_device_name_t));
248
249         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_LOCAL_NAME,
250                 in_param1, in_param2, in_param3, in_param4, &out_param);
251
252         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
253
254         return result;
255 }
256
257 BT_EXPORT_API int bluetooth_is_service_used(const char *service_uuid,
258                                                 gboolean *used)
259 {
260         int result;
261         char uuid[BLUETOOTH_UUID_STRING_MAX];
262
263         BT_CHECK_PARAMETER(service_uuid, return);
264         BT_CHECK_PARAMETER(used, return);
265         BT_CHECK_ENABLED(return);
266
267         BT_INIT_PARAMS();
268         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
269
270         g_strlcpy(uuid, service_uuid, sizeof(uuid));
271         g_array_append_vals(in_param1, uuid, BLUETOOTH_UUID_STRING_MAX);
272
273         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_SERVICE_USED,
274                 in_param1, in_param2, in_param3, in_param4, &out_param);
275
276         if (result == BLUETOOTH_ERROR_NONE) {
277                 *used = g_array_index(out_param, gboolean, 0);
278         }
279
280         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
281
282         return result;
283 }
284
285 BT_EXPORT_API int bluetooth_get_discoverable_mode(bluetooth_discoverable_mode_t *
286                                                   discoverable_mode_ptr)
287 {
288         int result;
289
290         BT_CHECK_PARAMETER(discoverable_mode_ptr, return);
291
292 #ifndef TIZEN_WEARABLE
293         int timeout = 0;
294         /* Requirement in OSP */
295         if (bluetooth_check_adapter() == BLUETOOTH_ADAPTER_DISABLED) {
296                 if (vconf_get_int(BT_FILE_VISIBLE_TIME, &timeout) != 0) {
297                         BT_ERR("Fail to get the timeout value");
298                         return BLUETOOTH_ERROR_INTERNAL;
299                 }
300
301                 if (timeout == -1) {
302                         *discoverable_mode_ptr = BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE;
303                 } else {
304                         *discoverable_mode_ptr = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
305                 }
306
307                 return BLUETOOTH_ERROR_NONE;
308         }
309 #endif
310
311         BT_INIT_PARAMS();
312         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
313
314         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_DISCOVERABLE_MODE,
315                 in_param1, in_param2, in_param3, in_param4, &out_param);
316
317         if (result == BLUETOOTH_ERROR_NONE) {
318                 *discoverable_mode_ptr = g_array_index(out_param, int, 0);
319         }
320
321         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
322
323         return result;
324 }
325
326 BT_EXPORT_API int bluetooth_set_discoverable_mode(bluetooth_discoverable_mode_t discoverable_mode,
327                                                   int timeout)
328 {
329         int result;
330
331         BT_CHECK_ENABLED(return);
332
333         BT_INIT_PARAMS();
334         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
335
336         g_array_append_vals(in_param1, &discoverable_mode, sizeof(int));
337         g_array_append_vals(in_param2, &timeout, sizeof(int));
338
339         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_DISCOVERABLE_MODE,
340                 in_param1, in_param2, in_param3, in_param4, &out_param);
341
342         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
343
344         return result;
345 }
346
347 BT_EXPORT_API int bluetooth_get_timeout_value(int *timeout)
348 {
349         int result;
350
351         BT_CHECK_PARAMETER(timeout, return);
352         BT_CHECK_ENABLED(return);
353
354         BT_INIT_PARAMS();
355         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
356
357         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_DISCOVERABLE_TIME,
358                 in_param1, in_param2, in_param3, in_param4, &out_param);
359
360         if (result == BLUETOOTH_ERROR_NONE) {
361                 *timeout = g_array_index(out_param, int, 0);
362         }
363
364         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
365
366         return result;
367 }
368
369 BT_EXPORT_API int bluetooth_start_discovery(unsigned short max_response,
370                                             unsigned short discovery_duration,
371                                             unsigned int classOfDeviceMask)
372 {
373         int result;
374
375         BT_CHECK_ENABLED(return);
376
377         BT_INIT_PARAMS();
378         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
379
380         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_START_DISCOVERY,
381                 in_param1, in_param2, in_param3, in_param4, &out_param);
382
383         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
384
385         return result;
386 }
387
388 BT_EXPORT_API int bluetooth_start_custom_discovery(bt_discovery_role_type_t role,
389                                                 unsigned short max_response,
390                                                 unsigned short discovery_duration,
391                                                 unsigned int classOfDeviceMask)
392 {
393         int result;
394
395         if (role == DISCOVERY_ROLE_LE)
396                 BT_CHECK_ENABLED_LE(return);
397         else
398                 BT_CHECK_ENABLED(return);
399
400         BT_INIT_PARAMS();
401         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
402
403         g_array_append_vals(in_param1, &role, sizeof(bt_discovery_role_type_t));
404         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_START_CUSTOM_DISCOVERY,
405                 in_param1, in_param2, in_param3, in_param4, &out_param);
406
407         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
408
409         return result;
410 }
411
412 BT_EXPORT_API int bluetooth_cancel_discovery(void)
413 {
414         int result;
415
416         BT_CHECK_ENABLED(return);
417
418         BT_INIT_PARAMS();
419         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
420
421         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_CANCEL_DISCOVERY,
422                 in_param1, in_param2, in_param3, in_param4, &out_param);
423
424
425         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
426
427         return result;
428 }
429
430 BT_EXPORT_API int bluetooth_is_discovering(void)
431 {
432         int result;
433         int is_discovering = FALSE;
434
435         BT_CHECK_ENABLED(return);
436
437         BT_INIT_PARAMS();
438         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
439
440         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_DISCOVERYING,
441                 in_param1, in_param2, in_param3, in_param4, &out_param);
442
443         if (result == BLUETOOTH_ERROR_NONE) {
444                 is_discovering = g_array_index(out_param,
445                                 int, 0);
446         } else {
447                 BT_ERR("Fail to send request");
448         }
449
450         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
451
452         return is_discovering;
453 }
454
455 BT_EXPORT_API int bluetooth_is_connectable(gboolean *is_connectable)
456 {
457         int result;
458
459         BT_CHECK_ENABLED_ANY(return);
460
461         BT_INIT_PARAMS();
462         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
463
464         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_CONNECTABLE,
465                 in_param1, in_param2, in_param3, in_param4, &out_param);
466
467         if (result == BLUETOOTH_ERROR_NONE) {
468                 *is_connectable = g_array_index(out_param, int, 0);
469         } else {
470                 BT_ERR("Fail to send request");
471         }
472
473         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
474
475         return result;
476 }
477
478 BT_EXPORT_API int bluetooth_set_connectable(gboolean is_connectable)
479 {
480         int result;
481
482         BT_CHECK_ENABLED_ANY(return);
483
484         BT_INIT_PARAMS();
485         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
486
487         g_array_append_vals(in_param1, &is_connectable, sizeof(gboolean));
488
489         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_CONNECTABLE,
490                 in_param1, in_param2, in_param3, in_param4, &out_param);
491
492         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
493
494         return result;
495 }
496
497 BT_EXPORT_API int bluetooth_get_bonded_device_list(GPtrArray **dev_list)
498 {
499         int result;
500
501         BT_CHECK_PARAMETER(dev_list, return);
502         BT_CHECK_ENABLED(return);
503
504         BT_INIT_PARAMS();
505         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
506
507         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_BONDED_DEVICES,
508                 in_param1, in_param2, in_param3, in_param4, &out_param);
509
510         if (result == BLUETOOTH_ERROR_NONE)
511                 result = __bt_fill_device_list(out_param, dev_list);
512
513         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
514
515         return result;
516 }
517
518 BT_EXPORT_API int bluetooth_set_manufacturer_data(const bluetooth_manufacturer_data_t *value)
519 {
520         int result;
521
522         BT_CHECK_PARAMETER(value, return);
523         BT_CHECK_ENABLED_ANY(return);
524
525         if (value->data_len > BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX)
526                 return BLUETOOTH_ERROR_INVALID_PARAM;
527
528         BT_INIT_PARAMS();
529         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
530
531         g_array_append_vals(in_param1, value, sizeof(bluetooth_manufacturer_data_t));
532
533         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_MANUFACTURER_DATA,
534                 in_param1, in_param2, in_param3, in_param4, &out_param);
535
536         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
537
538         return result;
539 }