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