Merge the code from private
[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
58         return BLUETOOTH_ERROR_NONE;
59 }
60
61 BT_EXPORT_API int bluetooth_check_adapter(void)
62 {
63         int value = VCONFKEY_BT_STATUS_OFF;
64
65 #ifndef TIZEN_TEST_EMUL
66         int ret;
67
68         ret = _bt_get_adapter_path(_bt_gdbus_get_system_gconn(), NULL);
69
70         if (ret != BLUETOOTH_ERROR_NONE) {
71                 return BLUETOOTH_ADAPTER_DISABLED;
72         }
73 #endif
74
75         /* check VCONFKEY_BT_STATUS */
76         if (vconf_get_int(VCONFKEY_BT_STATUS, &value) != 0) {
77                 BT_ERR("fail to get vconf key!");
78                 return BLUETOOTH_ADAPTER_DISABLED;
79         }
80
81         return value == VCONFKEY_BT_STATUS_OFF ? BLUETOOTH_ADAPTER_DISABLED :
82                                                 BLUETOOTH_ADAPTER_ENABLED;
83 }
84
85 BT_EXPORT_API int bluetooth_enable_adapter(void)
86 {
87         int result;
88
89         BT_INFO_C("### Enable adapter");
90         retv_if(bluetooth_check_adapter() == BLUETOOTH_ADAPTER_ENABLED,
91                                 BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED);
92
93 #ifdef TIZEN_DPM_VCONF_ENABLE
94         retv_if(bluetooth_dpm_is_mode_allowed() == BLUETOOTH_DPM_RESULT_ACCESS_DENIED,
95                                 BLUETOOTH_ERROR_PERMISSION_DEINED);
96 #endif
97
98         BT_INIT_PARAMS();
99         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
100
101         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_ENABLE_ADAPTER,
102                 in_param1, in_param2, in_param3, in_param4, &out_param);
103
104         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
105
106         return result;
107 }
108
109 BT_EXPORT_API int bluetooth_disable_adapter(void)
110 {
111         int result;
112
113         BT_INFO_C("### Disable adapter");
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("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
201         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
202
203         return result;
204 }
205
206 BT_EXPORT_API int bluetooth_get_local_name(bluetooth_device_name_t *local_name)
207 {
208         int result;
209
210         BT_CHECK_PARAMETER(local_name, return);
211         BT_CHECK_ENABLED_ANY(return);
212
213         BT_INIT_PARAMS();
214         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
215
216         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_LOCAL_NAME,
217                 in_param1, in_param2, in_param3, in_param4, &out_param);
218
219         if (result == BLUETOOTH_ERROR_NONE) {
220                 *local_name = g_array_index(out_param,
221                                 bluetooth_device_name_t, 0);
222         }
223
224         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
225
226         return result;
227 }
228
229 BT_EXPORT_API int bluetooth_set_local_name(const bluetooth_device_name_t *local_name)
230 {
231         int result;
232
233         BT_CHECK_PARAMETER(local_name, return);
234         BT_CHECK_ENABLED_ANY(return);
235
236         BT_INIT_PARAMS();
237         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
238
239         g_array_append_vals(in_param1, local_name, sizeof(bluetooth_device_name_t));
240
241         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_LOCAL_NAME,
242                 in_param1, in_param2, in_param3, in_param4, &out_param);
243
244         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
245
246         return result;
247 }
248
249 BT_EXPORT_API int bluetooth_is_service_used(const char *service_uuid,
250                                                 gboolean *used)
251 {
252         int result;
253         char uuid[BLUETOOTH_UUID_STRING_MAX];
254
255         BT_CHECK_PARAMETER(service_uuid, return);
256         BT_CHECK_PARAMETER(used, return);
257         BT_CHECK_ENABLED(return);
258
259         BT_INIT_PARAMS();
260         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
261
262         g_strlcpy(uuid, service_uuid, sizeof(uuid));
263         g_array_append_vals(in_param1, uuid, BLUETOOTH_UUID_STRING_MAX);
264
265         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_SERVICE_USED,
266                 in_param1, in_param2, in_param3, in_param4, &out_param);
267
268         if (result == BLUETOOTH_ERROR_NONE) {
269                 *used = g_array_index(out_param, gboolean, 0);
270         }
271
272         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
273
274         return result;
275 }
276
277 BT_EXPORT_API int bluetooth_get_discoverable_mode(bluetooth_discoverable_mode_t *
278                                                   discoverable_mode_ptr)
279 {
280         int result;
281
282         BT_CHECK_PARAMETER(discoverable_mode_ptr, return);
283
284 #ifndef TIZEN_PROFILE_WEARABLE
285         int timeout = 0;
286         /* Requirement in OSP */
287         if (bluetooth_check_adapter() == BLUETOOTH_ADAPTER_DISABLED) {
288                 if (vconf_get_int(BT_FILE_VISIBLE_TIME, &timeout) != 0) {
289                         BT_ERR("Fail to get the timeout value");
290                         return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
291                 }
292
293                 if (timeout == -1) {
294                         *discoverable_mode_ptr = BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE;
295                 } else {
296                         *discoverable_mode_ptr = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
297                 }
298
299                 return BLUETOOTH_ERROR_NONE;
300         }
301 #else
302         BT_CHECK_ENABLED(return);
303 #endif
304
305         BT_INIT_PARAMS();
306         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
307
308         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_DISCOVERABLE_MODE,
309                 in_param1, in_param2, in_param3, in_param4, &out_param);
310
311         if (result == BLUETOOTH_ERROR_NONE) {
312                 *discoverable_mode_ptr = g_array_index(out_param, int, 0);
313         }
314
315         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
316
317         return result;
318 }
319
320 BT_EXPORT_API int bluetooth_set_discoverable_mode(bluetooth_discoverable_mode_t discoverable_mode,
321                                                   int timeout)
322 {
323         int result;
324
325         BT_CHECK_ENABLED(return);
326
327         BT_INIT_PARAMS();
328         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
329
330         g_array_append_vals(in_param1, &discoverable_mode, sizeof(int));
331         g_array_append_vals(in_param2, &timeout, sizeof(int));
332
333         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_DISCOVERABLE_MODE,
334                 in_param1, in_param2, in_param3, in_param4, &out_param);
335
336         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
337
338         return result;
339 }
340
341 BT_EXPORT_API int bluetooth_get_timeout_value(int *timeout)
342 {
343         int result;
344
345         BT_CHECK_PARAMETER(timeout, return);
346         BT_CHECK_ENABLED(return);
347
348         BT_INIT_PARAMS();
349         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
350
351         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_DISCOVERABLE_TIME,
352                 in_param1, in_param2, in_param3, in_param4, &out_param);
353
354         if (result == BLUETOOTH_ERROR_NONE) {
355                 *timeout = g_array_index(out_param, int, 0);
356         }
357
358         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
359
360         return result;
361 }
362
363 BT_EXPORT_API int bluetooth_start_discovery(unsigned short max_response,
364                                             unsigned short discovery_duration,
365                                             unsigned int classOfDeviceMask)
366 {
367         int result;
368
369         BT_CHECK_ENABLED(return);
370
371         BT_INIT_PARAMS();
372         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
373
374         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_START_DISCOVERY,
375                 in_param1, in_param2, in_param3, in_param4, &out_param);
376
377         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
378
379         return result;
380 }
381
382 BT_EXPORT_API int bluetooth_start_custom_discovery(bt_discovery_role_type_t role,
383                                                 unsigned short max_response,
384                                                 unsigned short discovery_duration,
385                                                 unsigned int classOfDeviceMask)
386 {
387         int result;
388
389         if (role == DISCOVERY_ROLE_LE)
390                 BT_CHECK_ENABLED_LE(return);
391         else
392                 BT_CHECK_ENABLED(return);
393
394         BT_INIT_PARAMS();
395         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
396
397         g_array_append_vals(in_param1, &role, sizeof(bt_discovery_role_type_t));
398         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_START_CUSTOM_DISCOVERY,
399                 in_param1, in_param2, in_param3, in_param4, &out_param);
400
401         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
402
403         return result;
404 }
405
406 BT_EXPORT_API int bluetooth_cancel_discovery(void)
407 {
408         int result;
409
410         BT_CHECK_ENABLED(return);
411
412         BT_INIT_PARAMS();
413         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
414
415         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_CANCEL_DISCOVERY,
416                 in_param1, in_param2, in_param3, in_param4, &out_param);
417
418
419         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
420
421         return result;
422 }
423
424 BT_EXPORT_API int bluetooth_is_discovering(void)
425 {
426         int result;
427         int is_discovering = FALSE;
428
429         BT_CHECK_ENABLED(return);
430
431         BT_INIT_PARAMS();
432         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
433
434         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_DISCOVERYING,
435                 in_param1, in_param2, in_param3, in_param4, &out_param);
436
437         if (result == BLUETOOTH_ERROR_NONE) {
438                 is_discovering = g_array_index(out_param,
439                                 int, 0);
440         } else {
441                 BT_ERR("Fail to send request");
442                 is_discovering = result;
443         }
444
445         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
446
447         return is_discovering;
448 }
449
450 BT_EXPORT_API int bluetooth_is_connectable(gboolean *is_connectable)
451 {
452         int result;
453
454         BT_CHECK_ENABLED_ANY(return);
455
456         BT_INIT_PARAMS();
457         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
458
459         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_CONNECTABLE,
460                 in_param1, in_param2, in_param3, in_param4, &out_param);
461
462         if (result == BLUETOOTH_ERROR_NONE) {
463                 *is_connectable = g_array_index(out_param, int, 0);
464         } else {
465                 BT_ERR("Fail to send request");
466         }
467
468         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
469
470         return result;
471 }
472
473 BT_EXPORT_API int bluetooth_set_connectable(gboolean is_connectable)
474 {
475         int result;
476
477         BT_CHECK_ENABLED_ANY(return);
478
479         BT_INIT_PARAMS();
480         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
481
482         g_array_append_vals(in_param1, &is_connectable, sizeof(gboolean));
483
484         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_CONNECTABLE,
485                 in_param1, in_param2, in_param3, in_param4, &out_param);
486
487         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
488
489         return result;
490 }
491
492 BT_EXPORT_API int bluetooth_get_bonded_device_list(GPtrArray **dev_list)
493 {
494         int result;
495
496         BT_CHECK_PARAMETER(dev_list, return);
497         BT_CHECK_ENABLED(return);
498
499         BT_INIT_PARAMS();
500         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
501
502         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_BONDED_DEVICES,
503                 in_param1, in_param2, in_param3, in_param4, &out_param);
504
505         if (result == BLUETOOTH_ERROR_NONE)
506                 result = __bt_fill_device_list(out_param, dev_list);
507
508         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
509
510         return result;
511 }
512
513 BT_EXPORT_API int bluetooth_get_profile_connected_device_list(
514                 const char *profile_uuid, GPtrArray **addr_list)
515 {
516         char uuid[BLUETOOTH_UUID_STRING_MAX];
517         int result;
518         guint size;
519         int i;
520
521         BT_CHECK_PARAMETER(profile_uuid, return);
522         BT_CHECK_PARAMETER(addr_list, return);
523         BT_CHECK_ENABLED(return);
524
525         BT_INIT_PARAMS();
526         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
527
528         g_strlcpy(uuid, profile_uuid, sizeof(uuid));
529         g_array_append_vals(in_param1, uuid, BLUETOOTH_UUID_STRING_MAX);
530
531         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_PROFILE_CONNECTED_DEVICES,
532                 in_param1, in_param2, in_param3, in_param4, &out_param);
533
534         if (result == BLUETOOTH_ERROR_NONE) {
535                 if (out_param == NULL) {
536                         BT_ERR("out_param is NULL");
537                         result = BLUETOOTH_ERROR_INTERNAL;
538                 } else {
539                         size = (out_param->len) / sizeof(bluetooth_device_address_t);
540
541                         if (size == 0) {
542                                 BT_ERR("No connected device");
543                                 result = BLUETOOTH_ERROR_NOT_CONNECTED;
544                         }
545
546                         for (i = 0; i < size; i++) {
547                                 bluetooth_device_address_t *addr = NULL;
548                                 bluetooth_device_address_t *ptr = NULL;
549
550                                 ptr = &g_array_index(out_param,
551                                                 bluetooth_device_address_t, i);
552
553                                 addr = g_memdup(ptr, sizeof(bluetooth_device_address_t));
554
555                                 if (addr) {
556                                         g_ptr_array_add(*addr_list, (gpointer)addr);
557                                 }
558                         }
559                 }
560         }
561
562         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
563
564         return result;
565 }
566
567 BT_EXPORT_API int bluetooth_set_manufacturer_data(const bluetooth_manufacturer_data_t *value)
568 {
569         int result;
570
571         BT_CHECK_PARAMETER(value, return);
572         BT_CHECK_ENABLED_ANY(return);
573
574         if (value->data_len > BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX)
575                 return BLUETOOTH_ERROR_INVALID_PARAM;
576
577         BT_INIT_PARAMS();
578         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
579
580         g_array_append_vals(in_param1, value, sizeof(bluetooth_manufacturer_data_t));
581
582         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_MANUFACTURER_DATA,
583                 in_param1, in_param2, in_param3, in_param4, &out_param);
584
585         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
586
587         return result;
588 }
589
590 BT_EXPORT_API int bluetooth_set_passkey_notification(gboolean enable)
591 {
592         int result;
593
594         BT_CHECK_ENABLED_ANY(return);
595
596         BT_INIT_PARAMS();
597         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
598
599         g_array_append_vals(in_param1, &enable, sizeof(gboolean));
600
601         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_PASSKEY_NOTIFICATION,
602                 in_param1, in_param2, in_param3, in_param4, &out_param);
603
604         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
605
606         return result;
607 }
608