Apply the initial codes for BT emulator
[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;
64
65 #ifndef 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         bt_user_info_t *user_info;
89
90         BT_INFO("");
91         retv_if(bluetooth_check_adapter() == BLUETOOTH_ADAPTER_ENABLED,
92                                 BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED);
93
94 #ifdef TIZEN_DPM_VCONF_ENABLE
95         retv_if(bluetooth_dpm_is_mode_allowed() == BLUETOOTH_DPM_RESULT_ACCESS_DENIED,
96                                 BLUETOOTH_ERROR_PERMISSION_DEINED);
97 #endif
98
99         user_info = _bt_get_user_data(BT_COMMON);
100         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
101
102         BT_INIT_PARAMS();
103         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
104
105         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_ENABLE_ADAPTER,
106                 in_param1, in_param2, in_param3, in_param4,
107                 user_info->cb, user_info->user_data);
108
109         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
110
111         return result;
112 }
113
114 BT_EXPORT_API int bluetooth_disable_adapter(void)
115 {
116         int result;
117         bt_user_info_t *user_info;
118
119         BT_INFO("");
120         BT_CHECK_ENABLED(return);
121
122         user_info = _bt_get_user_data(BT_COMMON);
123         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
124
125         BT_INIT_PARAMS();
126         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
127
128         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_DISABLE_ADAPTER,
129                 in_param1, in_param2, in_param3, in_param4,
130                 user_info->cb, user_info->user_data);
131
132         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
133
134         return result;
135 }
136
137 BT_EXPORT_API int bluetooth_recover_adapter(void)
138 {
139         int result;
140
141         BT_INFO("");
142         BT_CHECK_ENABLED(return);
143
144         BT_INIT_PARAMS();
145         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
146
147         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_RECOVER_ADAPTER,
148                 in_param1, in_param2, in_param3, in_param4, &out_param);
149
150         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
151
152         return result;
153 }
154
155 BT_EXPORT_API int bluetooth_reset_adapter(void)
156 {
157         int result;
158
159         BT_INFO("");
160         BT_INIT_PARAMS();
161         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
162
163         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_RESET_ADAPTER,
164                 in_param1, in_param2, in_param3, in_param4, &out_param);
165
166         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
167
168         return result;
169 }
170
171 BT_EXPORT_API int bluetooth_get_local_address(bluetooth_device_address_t *local_address)
172 {
173         int result;
174
175         BT_CHECK_PARAMETER(local_address, return);
176         BT_CHECK_ENABLED_ANY(return);
177
178         BT_INIT_PARAMS();
179         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
180
181         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_LOCAL_ADDRESS,
182                 in_param1, in_param2, in_param3, in_param4, &out_param);
183
184         if (result == BLUETOOTH_ERROR_NONE) {
185                 *local_address = g_array_index(out_param,
186                         bluetooth_device_address_t, 0);
187         }
188
189         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
190
191         return result;
192 }
193
194 BT_EXPORT_API int bluetooth_get_local_version(bluetooth_version_t *local_version)
195 {
196         int result;
197
198         BT_CHECK_PARAMETER(local_version, return);
199         BT_CHECK_ENABLED_ANY(return);
200
201         BT_INIT_PARAMS();
202         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
203
204         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_LOCAL_VERSION,
205                 in_param1, in_param2, in_param3, in_param4, &out_param);
206
207         if (result == BLUETOOTH_ERROR_NONE) {
208                 *local_version = g_array_index(out_param, bluetooth_version_t, 0);
209         }
210
211         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
212
213         return result;
214 }
215
216 BT_EXPORT_API int bluetooth_get_local_name(bluetooth_device_name_t *local_name)
217 {
218         int result;
219
220         BT_CHECK_PARAMETER(local_name, return);
221         BT_CHECK_ENABLED_ANY(return);
222
223         BT_INIT_PARAMS();
224         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
225
226         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_LOCAL_NAME,
227                 in_param1, in_param2, in_param3, in_param4, &out_param);
228
229         if (result == BLUETOOTH_ERROR_NONE) {
230                 *local_name = g_array_index(out_param,
231                                 bluetooth_device_name_t, 0);
232         }
233
234         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
235
236         return result;
237 }
238
239 BT_EXPORT_API int bluetooth_set_local_name(const bluetooth_device_name_t *local_name)
240 {
241         int result;
242
243         BT_CHECK_PARAMETER(local_name, return);
244         BT_CHECK_ENABLED_ANY(return);
245
246         BT_INIT_PARAMS();
247         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
248
249         g_array_append_vals(in_param1, local_name, sizeof(bluetooth_device_name_t));
250
251         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_LOCAL_NAME,
252                 in_param1, in_param2, in_param3, in_param4, &out_param);
253
254         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
255
256         return result;
257 }
258
259 BT_EXPORT_API int bluetooth_is_service_used(const char *service_uuid,
260                                                 gboolean *used)
261 {
262         int result;
263         char uuid[BLUETOOTH_UUID_STRING_MAX];
264
265         BT_CHECK_PARAMETER(service_uuid, return);
266         BT_CHECK_PARAMETER(used, return);
267         BT_CHECK_ENABLED(return);
268
269         BT_INIT_PARAMS();
270         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
271
272         g_strlcpy(uuid, service_uuid, sizeof(uuid));
273         g_array_append_vals(in_param1, uuid, BLUETOOTH_UUID_STRING_MAX);
274
275         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_SERVICE_USED,
276                 in_param1, in_param2, in_param3, in_param4, &out_param);
277
278         if (result == BLUETOOTH_ERROR_NONE) {
279                 *used = g_array_index(out_param, gboolean, 0);
280         }
281
282         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
283
284         return result;
285 }
286
287 BT_EXPORT_API int bluetooth_get_discoverable_mode(bluetooth_discoverable_mode_t *
288                                                   discoverable_mode_ptr)
289 {
290         int result;
291
292         BT_CHECK_PARAMETER(discoverable_mode_ptr, return);
293
294 #ifndef TIZEN_WEARABLE
295         int timeout = 0;
296         /* Requirement in OSP */
297         if (bluetooth_check_adapter() == BLUETOOTH_ADAPTER_DISABLED) {
298                 if (vconf_get_int(BT_FILE_VISIBLE_TIME, &timeout) != 0) {
299                         BT_ERR("Fail to get the timeout value");
300                         return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
301                 }
302
303                 if (timeout == -1) {
304                         *discoverable_mode_ptr = BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE;
305                 } else {
306                         *discoverable_mode_ptr = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
307                 }
308
309                 return BLUETOOTH_ERROR_NONE;
310         }
311 #else
312         BT_CHECK_ENABLED(return);
313 #endif
314
315         BT_INIT_PARAMS();
316         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
317
318         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_DISCOVERABLE_MODE,
319                 in_param1, in_param2, in_param3, in_param4, &out_param);
320
321         if (result == BLUETOOTH_ERROR_NONE) {
322                 *discoverable_mode_ptr = g_array_index(out_param, int, 0);
323         }
324
325         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
326
327         return result;
328 }
329
330 BT_EXPORT_API int bluetooth_set_discoverable_mode(bluetooth_discoverable_mode_t discoverable_mode,
331                                                   int timeout)
332 {
333         int result;
334
335         BT_CHECK_ENABLED(return);
336
337         BT_INIT_PARAMS();
338         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
339
340         g_array_append_vals(in_param1, &discoverable_mode, sizeof(int));
341         g_array_append_vals(in_param2, &timeout, sizeof(int));
342
343         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_DISCOVERABLE_MODE,
344                 in_param1, in_param2, in_param3, in_param4, &out_param);
345
346         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
347
348         return result;
349 }
350
351 BT_EXPORT_API int bluetooth_get_timeout_value(int *timeout)
352 {
353         int result;
354
355         BT_CHECK_PARAMETER(timeout, return);
356         BT_CHECK_ENABLED(return);
357
358         BT_INIT_PARAMS();
359         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
360
361         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_DISCOVERABLE_TIME,
362                 in_param1, in_param2, in_param3, in_param4, &out_param);
363
364         if (result == BLUETOOTH_ERROR_NONE) {
365                 *timeout = g_array_index(out_param, int, 0);
366         }
367
368         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
369
370         return result;
371 }
372
373 BT_EXPORT_API int bluetooth_start_discovery(unsigned short max_response,
374                                             unsigned short discovery_duration,
375                                             unsigned int classOfDeviceMask)
376 {
377         int result;
378
379         BT_CHECK_ENABLED(return);
380
381         BT_INIT_PARAMS();
382         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
383
384         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_START_DISCOVERY,
385                 in_param1, in_param2, in_param3, in_param4, &out_param);
386
387         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
388
389         return result;
390 }
391
392 BT_EXPORT_API int bluetooth_start_custom_discovery(bt_discovery_role_type_t role,
393                                                 unsigned short max_response,
394                                                 unsigned short discovery_duration,
395                                                 unsigned int classOfDeviceMask)
396 {
397         int result;
398
399         if (role == DISCOVERY_ROLE_LE)
400                 BT_CHECK_ENABLED_LE(return);
401         else
402                 BT_CHECK_ENABLED(return);
403
404         BT_INIT_PARAMS();
405         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
406
407         g_array_append_vals(in_param1, &role, sizeof(bt_discovery_role_type_t));
408         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_START_CUSTOM_DISCOVERY,
409                 in_param1, in_param2, in_param3, in_param4, &out_param);
410
411         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
412
413         return result;
414 }
415
416 BT_EXPORT_API int bluetooth_cancel_discovery(void)
417 {
418         int result;
419
420         BT_CHECK_ENABLED(return);
421
422         BT_INIT_PARAMS();
423         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
424
425         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_CANCEL_DISCOVERY,
426                 in_param1, in_param2, in_param3, in_param4, &out_param);
427
428
429         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
430
431         return result;
432 }
433
434 BT_EXPORT_API int bluetooth_is_discovering(void)
435 {
436         int result;
437         int is_discovering = FALSE;
438
439         BT_CHECK_ENABLED(return);
440
441         BT_INIT_PARAMS();
442         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
443
444         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_DISCOVERYING,
445                 in_param1, in_param2, in_param3, in_param4, &out_param);
446
447         if (result == BLUETOOTH_ERROR_NONE) {
448                 is_discovering = g_array_index(out_param,
449                                 int, 0);
450         } else {
451                 BT_ERR("Fail to send request");
452         }
453
454         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
455
456         return is_discovering;
457 }
458
459 BT_EXPORT_API int bluetooth_is_connectable(gboolean *is_connectable)
460 {
461         int result;
462
463         BT_CHECK_ENABLED_ANY(return);
464
465         BT_INIT_PARAMS();
466         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
467
468         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_CONNECTABLE,
469                 in_param1, in_param2, in_param3, in_param4, &out_param);
470
471         if (result == BLUETOOTH_ERROR_NONE) {
472                 *is_connectable = g_array_index(out_param, int, 0);
473         } else {
474                 BT_ERR("Fail to send request");
475         }
476
477         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
478
479         return result;
480 }
481
482 BT_EXPORT_API int bluetooth_set_connectable(gboolean is_connectable)
483 {
484         int result;
485
486         BT_CHECK_ENABLED_ANY(return);
487
488         BT_INIT_PARAMS();
489         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
490
491         g_array_append_vals(in_param1, &is_connectable, sizeof(gboolean));
492
493         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_CONNECTABLE,
494                 in_param1, in_param2, in_param3, in_param4, &out_param);
495
496         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
497
498         return result;
499 }
500
501 BT_EXPORT_API int bluetooth_get_bonded_device_list(GPtrArray **dev_list)
502 {
503         int result;
504
505         BT_CHECK_PARAMETER(dev_list, return);
506         BT_CHECK_ENABLED(return);
507
508         BT_INIT_PARAMS();
509         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
510
511         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_BONDED_DEVICES,
512                 in_param1, in_param2, in_param3, in_param4, &out_param);
513
514         if (result == BLUETOOTH_ERROR_NONE)
515                 result = __bt_fill_device_list(out_param, dev_list);
516
517         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
518
519         return result;
520 }
521
522 BT_EXPORT_API int bluetooth_set_manufacturer_data(const bluetooth_manufacturer_data_t *value)
523 {
524         int result;
525
526         BT_CHECK_PARAMETER(value, return);
527         BT_CHECK_ENABLED_ANY(return);
528
529         if (value->data_len > BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX)
530                 return BLUETOOTH_ERROR_INVALID_PARAM;
531
532         BT_INIT_PARAMS();
533         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
534
535         g_array_append_vals(in_param1, value, sizeof(bluetooth_manufacturer_data_t));
536
537         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_MANUFACTURER_DATA,
538                 in_param1, in_param2, in_param3, in_param4, &out_param);
539
540         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
541
542         return result;
543 }