Merge "Check NULL condition" into tizen
[platform/core/connectivity/bluetooth-frwk.git] / bt-api / bt-adapter-le.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 <stdio.h>
19 #include <vconf.h>
20
21 #include "bluetooth-api.h"
22 #include "bt-internal-types.h"
23
24 #include "bt-common.h"
25 #include "bt-request-sender.h"
26 #include "bt-event-handler.h"
27
28 static gboolean is_le_scanning = FALSE;
29
30 BT_EXPORT_API int bluetooth_check_adapter_le(void)
31 {
32         int ret;
33         int value;
34
35         ret = _bt_get_adapter_path(_bt_get_system_private_conn(), NULL);
36
37         if (ret != BLUETOOTH_ERROR_NONE)
38                 return BLUETOOTH_ADAPTER_LE_DISABLED;
39
40         ret = vconf_get_int(VCONFKEY_BT_LE_STATUS, &value);
41         if (ret != 0) {
42                 BT_ERR("fail to get vconf key!");
43                 return ret;
44         }
45
46         BT_DBG("value : %d", value);
47         return value == VCONFKEY_BT_LE_STATUS_ON ? BLUETOOTH_ADAPTER_LE_ENABLED :
48                                                 BLUETOOTH_ADAPTER_LE_DISABLED;
49 }
50
51 BT_EXPORT_API int bluetooth_enable_adapter_le(void)
52 {
53         int result;
54
55         BT_INIT_PARAMS();
56         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
57
58         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_ENABLE_ADAPTER_LE,
59                 in_param1, in_param2, in_param3, in_param4, &out_param);
60
61         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
62         return result;
63 }
64
65 BT_EXPORT_API int bluetooth_disable_adapter_le(void)
66 {
67         int result;
68         retv_if(bluetooth_check_adapter_le() == BLUETOOTH_ADAPTER_LE_DISABLED,
69                                 BLUETOOTH_ERROR_DEVICE_NOT_ENABLED);
70
71         BT_INIT_PARAMS();
72         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
73
74         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_DISABLE_ADAPTER_LE,
75                 in_param1, in_param2, in_param3, in_param4, &out_param);
76
77         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
78
79         return result;
80 }
81
82 void _bt_set_le_scan_status(gboolean mode)
83 {
84         BT_DBG("set LE scan mode : %d -> %d", is_le_scanning, mode);
85         is_le_scanning = mode;
86 }
87
88 BT_EXPORT_API gboolean bluetooth_is_le_scanning(void)
89 {
90         return is_le_scanning;
91 }
92
93 BT_EXPORT_API int bluetooth_start_le_discovery(void)
94 {
95         int result;
96
97         BT_CHECK_ENABLED_ANY(return);
98
99         BT_INIT_PARAMS();
100         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
101
102         BT_INFO_C("### Start LE scan");
103         _bt_print_api_caller_name();
104         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_START_LE_DISCOVERY,
105                 in_param1, in_param2, in_param3, in_param4, &out_param);
106
107         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
108
109         if (result == BLUETOOTH_ERROR_NONE)
110                 _bt_set_le_scan_status(TRUE);
111
112         return result;
113 }
114
115 BT_EXPORT_API int bluetooth_stop_le_discovery(void)
116 {
117         int result;
118
119         BT_CHECK_ENABLED_ANY(return);
120
121         BT_INIT_PARAMS();
122         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
123
124         BT_INFO_C("### Stop LE scan");
125         _bt_print_api_caller_name();
126         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_STOP_LE_DISCOVERY,
127                 in_param1, in_param2, in_param3, in_param4, &out_param);
128
129         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
130
131         if (result == BLUETOOTH_ERROR_NONE)
132                 _bt_set_le_scan_status(FALSE);
133
134         return result;
135 }
136
137 BT_EXPORT_API int bluetooth_is_le_discovering(void)
138 {
139         int result;
140         int is_discovering = FALSE;
141
142         BT_CHECK_ENABLED_ANY(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_IS_LE_DISCOVERYING,
148                 in_param1, in_param2, in_param3, in_param4, &out_param);
149
150         if (result == BLUETOOTH_ERROR_NONE) {
151                 is_discovering = g_array_index(out_param,
152                                 int, 0);
153         } else {
154                 BT_ERR("Fail to send request");
155         }
156
157         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
158
159         return is_discovering;
160 }
161
162 BT_EXPORT_API int bluetooth_is_scan_filter_supported(gboolean *is_supported)
163 {
164         int result;
165
166         BT_CHECK_PARAMETER(is_supported, 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_IS_SCAN_FILTER_SUPPORTED,
172                         in_param1, in_param2, in_param3, in_param4, &out_param);
173
174         if (result == BLUETOOTH_ERROR_NONE) {
175                 *is_supported = g_array_index(out_param, int, 0);
176                 BT_INFO("Scan Filter Support[%s]", *is_supported ? "TRUE" : "FALSE");
177         } else
178                 BT_ERR("Fail to send request");
179
180         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
181
182         return result;
183 }
184
185 BT_EXPORT_API int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *filter, int *slot_id)
186 {
187         int result;
188
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         g_array_append_vals(in_param1, filter, sizeof(bluetooth_le_scan_filter_t));
195
196         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_REGISTER_SCAN_FILTER,
197                 in_param1, in_param2, in_param3, in_param4, &out_param);
198
199         if (result == BLUETOOTH_ERROR_NONE)
200                 *slot_id = g_array_index(out_param, int, 0);
201         else
202                 BT_ERR("Fail to send request");
203
204         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
205
206         return result;
207 }
208
209 BT_EXPORT_API int bluetooth_unregister_scan_filter(int slot_id)
210 {
211         int result;
212
213         BT_CHECK_ENABLED_ANY(return);
214
215         BT_INIT_PARAMS();
216         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
217
218         g_array_append_vals(in_param1, &slot_id, sizeof(int));
219
220         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_UNREGISTER_SCAN_FILTER,
221                 in_param1, in_param2, in_param3, in_param4, &out_param);
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_unregister_all_scan_filters(void)
229 {
230         int result;
231
232         BT_CHECK_ENABLED_ANY(return);
233
234         BT_INIT_PARAMS();
235         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
236
237         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_UNREGISTER_ALL_SCAN_FILTERS,
238                 in_param1, in_param2, in_param3, in_param4, &out_param);
239
240         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
241
242         return result;
243 }
244
245 gboolean __bluetooth_is_privileged_process(void)
246 {
247         FILE *fp = NULL;
248         char path[30] = {0, };
249         char buf[256] = {0, };
250
251         snprintf(path, sizeof(path), "/proc/%d/cmdline", getpid());
252         fp = fopen(path, "r");
253         if (fp == NULL)
254                 return FALSE;
255
256         if (fgets(buf, 256, fp) != NULL) {
257                 if (strstr(buf, "weconnd") != NULL) {
258                         fclose(fp);
259                         return TRUE;
260                 }
261         }
262
263         fclose(fp);
264         return FALSE;
265 }
266
267 BT_EXPORT_API int bluetooth_set_advertising(int handle, gboolean enable)
268 {
269         int result;
270         gboolean use_reserved_slot = TRUE;
271
272         BT_CHECK_ENABLED_ANY(return);
273
274         if (TIZEN_PROFILE_WEARABLE)
275                 use_reserved_slot = __bluetooth_is_privileged_process();
276
277         _bt_print_api_caller_name();
278
279         BT_INIT_PARAMS();
280         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
281
282         g_array_append_vals(in_param1, &handle, sizeof(int));
283         g_array_append_vals(in_param2, &enable, sizeof(gboolean));
284         g_array_append_vals(in_param3, &use_reserved_slot, sizeof(gboolean));
285
286         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_ADVERTISING,
287                 in_param1, in_param2, in_param3, in_param4, &out_param);
288
289         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
290
291         return result;
292 }
293
294 BT_EXPORT_API int bluetooth_set_custom_advertising(int handle, gboolean enable,
295                                                 bluetooth_advertising_params_t *params)
296 {
297         int result;
298         gboolean use_reserved_slot = TRUE;
299
300         BT_CHECK_ENABLED_ANY(return);
301
302         if (TIZEN_PROFILE_WEARABLE)
303         use_reserved_slot = __bluetooth_is_privileged_process();
304
305         _bt_print_api_caller_name();
306
307         BT_INIT_PARAMS();
308         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
309
310         g_array_append_vals(in_param1, &handle, sizeof(int));
311         g_array_append_vals(in_param2, &enable, sizeof(gboolean));
312         g_array_append_vals(in_param3, params, sizeof(bluetooth_advertising_params_t));
313         g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean));
314
315         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_CUSTOM_ADVERTISING,
316                 in_param1, in_param2, in_param3, in_param4, &out_param);
317
318         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
319
320         return result;
321 }
322
323 BT_EXPORT_API int bluetooth_get_advertising_data(bluetooth_advertising_data_t *adv_data, int *length)
324 {
325         int result;
326         guint8 *data;
327
328         BT_CHECK_PARAMETER(adv_data, return);
329         BT_CHECK_PARAMETER(length, return);
330         BT_CHECK_ENABLED_ANY(return);
331
332         BT_INIT_PARAMS();
333         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
334
335         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_ADVERTISING_DATA,
336                 in_param1, in_param2, in_param3, in_param4, &out_param);
337
338         if (result == BLUETOOTH_ERROR_NONE) {
339                 data = &g_array_index(out_param, guint8, 0);
340                 *length = out_param->len;
341
342                 memset(adv_data, 0x00, sizeof(bluetooth_advertising_data_t));
343                 memcpy(adv_data->data, data, *length);
344         }
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_set_advertising_data(int handle, const bluetooth_advertising_data_t *value, int length)
352 {
353         int result;
354         gboolean use_reserved_slot = TRUE;
355
356         BT_CHECK_PARAMETER(value, return);
357         BT_CHECK_ENABLED_ANY(return);
358
359         if (length > BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 3)
360                 return BLUETOOTH_ERROR_INVALID_PARAM;
361
362         if (TIZEN_PROFILE_WEARABLE)
363                 use_reserved_slot = __bluetooth_is_privileged_process();
364
365         BT_INIT_PARAMS();
366         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
367
368         g_array_append_vals(in_param1, &handle, sizeof(int));
369         g_array_append_vals(in_param2, value, sizeof(bluetooth_advertising_data_t));
370         g_array_append_vals(in_param3, &length, sizeof(int));
371         g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean));
372
373         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_ADVERTISING_DATA,
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_get_scan_response_data(bluetooth_scan_resp_data_t *value, int *length)
382 {
383         int result;
384         guint8 *data;
385
386         BT_CHECK_PARAMETER(value, return);
387         BT_CHECK_PARAMETER(length, return);
388         BT_CHECK_ENABLED_ANY(return);
389
390         BT_INIT_PARAMS();
391         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
392
393         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_SCAN_RESPONSE_DATA,
394                 in_param1, in_param2, in_param3, in_param4, &out_param);
395
396         if (result == BLUETOOTH_ERROR_NONE) {
397                 data = &g_array_index(out_param, guint8, 0);
398                 *length = out_param->len;
399
400                 memset(value, 0x00, sizeof(bluetooth_scan_resp_data_t));
401                 memcpy(value->data, data, *length);
402         }
403
404         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
405
406         return result;
407 }
408
409 BT_EXPORT_API int bluetooth_set_scan_response_data(int handle,
410                         const bluetooth_scan_resp_data_t *value, int length)
411 {
412         int result;
413         gboolean use_reserved_slot = TRUE;
414
415         BT_CHECK_PARAMETER(value, return);
416         BT_CHECK_ENABLED_ANY(return);
417
418         if (length > BLUETOOTH_SCAN_RESP_DATA_LENGTH_MAX)
419                 return BLUETOOTH_ERROR_INVALID_PARAM;
420
421         if (TIZEN_PROFILE_WEARABLE)
422                 use_reserved_slot = __bluetooth_is_privileged_process();
423
424         BT_INIT_PARAMS();
425         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
426
427         g_array_append_vals(in_param1, &handle, sizeof(int));
428         g_array_append_vals(in_param2, value, length);
429         g_array_append_vals(in_param3, &length, sizeof(int));
430         g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean));
431
432         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCAN_RESPONSE_DATA,
433                 in_param1, in_param2, in_param3, in_param4, &out_param);
434
435         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
436
437         return result;
438 }
439
440 BT_EXPORT_API int bluetooth_set_scan_parameters(bluetooth_le_scan_params_t *params)
441 {
442         int result;
443
444         BT_CHECK_ENABLED_ANY(return);
445
446         BT_INIT_PARAMS();
447         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
448
449         g_array_append_vals(in_param1, params, sizeof(bluetooth_le_scan_params_t));
450
451         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCAN_PARAMETERS,
452                 in_param1, in_param2, in_param3, in_param4, &out_param);
453
454         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
455
456         return result;
457 }
458
459 BT_EXPORT_API int bluetooth_set_scan_type(bluetooth_le_scan_type_t scan_type)
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         g_array_append_vals(in_param1, &scan_type, sizeof(int));
469
470         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCAN_TYPE,
471                 in_param1, in_param2, in_param3, in_param4, &out_param);
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_is_advertising(gboolean *is_advertising)
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         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_ADVERTISING,
488                 in_param1, in_param2, in_param3, in_param4, &out_param);
489
490         if (result == BLUETOOTH_ERROR_NONE)
491                 *is_advertising = g_array_index(out_param, int, 0);
492         else
493                 BT_ERR("Fail to send request");
494
495         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
496
497         return result;
498 }
499
500 BT_EXPORT_API int bluetooth_add_white_list(bluetooth_device_address_t *address, bluetooth_device_address_type_t address_type)
501 {
502         int result;
503
504         BT_CHECK_PARAMETER(address, return);
505         BT_CHECK_ENABLED_ANY(return);
506
507         BT_INIT_PARAMS();
508         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
509
510         g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
511         g_array_append_vals(in_param2, &address_type, sizeof(int));
512
513         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_ADD_WHITE_LIST,
514                 in_param1, in_param2, in_param3, in_param4, &out_param);
515
516         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
517
518         return result;
519 }
520
521 BT_EXPORT_API int bluetooth_remove_white_list(bluetooth_device_address_t *address, bluetooth_device_address_type_t address_type)
522 {
523         int result;
524
525         BT_CHECK_PARAMETER(address, return);
526         BT_CHECK_ENABLED_ANY(return);
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, address, sizeof(bluetooth_device_address_t));
532         g_array_append_vals(in_param2, &address_type, sizeof(int));
533
534         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_REMOVE_WHITE_LIST,
535                 in_param1, in_param2, in_param3, in_param4, &out_param);
536
537         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
538
539         return result;
540 }
541
542 BT_EXPORT_API int bluetooth_clear_white_list(void)
543 {
544         int result;
545
546         BT_CHECK_ENABLED_ANY(return);
547
548         BT_INIT_PARAMS();
549         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
550
551         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_CLEAR_WHITE_LIST,
552                 in_param1, in_param2, in_param3, in_param4, &out_param);
553
554         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
555
556         return result;
557 }
558
559 BT_EXPORT_API int bluetooth_enable_le_privacy(gboolean enable_privacy)
560 {
561         int result;
562
563         BT_CHECK_ENABLED_ANY(return);
564
565         BT_INIT_PARAMS();
566         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
567
568         g_array_append_vals(in_param1, &enable_privacy, sizeof(gboolean));
569
570         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_LE_PRIVACY,
571                 in_param1, in_param2, in_param3, in_param4, &out_param);
572
573         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
574
575         return result;
576 }
577
578 BT_EXPORT_API int bluetooth_set_le_static_random_address(gboolean enable)
579 {
580         int result;
581
582         BT_CHECK_ENABLED_ANY(return);
583
584         BT_INIT_PARAMS();
585         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
586
587         g_array_append_vals(in_param1, &enable, sizeof(gboolean));
588
589         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_LE_STATIC_RANDOM_ADDRESS,
590                 in_param1, in_param2, in_param3, in_param4, &out_param);
591
592         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
593
594         return result;
595 }
596
597 BT_EXPORT_API int bluetooth_check_privilege_advertising_parameter(void)
598 {
599         if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_SET_ADVERTISING_PARAMETERS)
600                      == BLUETOOTH_ERROR_PERMISSION_DEINED) {
601                 BT_ERR("Don't have a privilege to use this API");
602                 return BLUETOOTH_ERROR_PERMISSION_DEINED;
603         }
604
605         return BLUETOOTH_ERROR_NONE;
606 }
607
608 BT_EXPORT_API int bluetooth_le_register_callback(bluetooth_cb_func_ptr callback_ptr, void *user_data)
609 {
610         int ret;
611
612         ret = _bt_register_event(BT_LE_ADAPTER_EVENT, (void *)callback_ptr, user_data);
613         if (ret != BLUETOOTH_ERROR_NONE &&
614             ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
615                 BT_ERR("Fail to register BT_LE_ADAPTER_EVENT event : %d", ret);
616                 return ret;
617         }
618
619         return BLUETOOTH_ERROR_NONE;
620 }
621
622 BT_EXPORT_API int bluetooth_le_unregister_callback(void)
623 {
624         _bt_unregister_event(BT_LE_ADAPTER_EVENT);
625
626         return BLUETOOTH_ERROR_NONE;
627 }
628
629 BT_EXPORT_API int bluetooth_le_read_maximum_data_length(
630                         bluetooth_le_read_maximum_data_length_t *max_le_datalength)
631 {
632         BT_CHECK_ENABLED_ANY(return);
633         BT_INIT_PARAMS();
634         int result;
635         bluetooth_le_read_maximum_data_length_t *datalength = NULL;
636
637         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
638
639         result = _bt_send_request(BT_BLUEZ_SERVICE,
640                 BT_LE_READ_MAXIMUM_DATA_LENGTH,
641                 in_param1, in_param2, in_param3, in_param4, &out_param);
642
643         if (result == BLUETOOTH_ERROR_NONE) {
644                 datalength = &g_array_index(out_param,
645                         bluetooth_le_read_maximum_data_length_t, 0);
646                 max_le_datalength->max_tx_octets  = datalength->max_tx_octets;
647                 max_le_datalength->max_tx_time = datalength->max_tx_time;
648                 max_le_datalength->max_rx_octets = datalength->max_rx_octets;
649                 max_le_datalength->max_rx_time = datalength->max_rx_time;
650         }
651
652         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
653
654         return result;
655 }
656
657 BT_EXPORT_API int bluetooth_le_write_host_suggested_default_data_length(
658         const unsigned int def_tx_Octets, const unsigned int def_tx_Time)
659 {
660         BT_CHECK_ENABLED_ANY(return);
661         BT_INIT_PARAMS();
662
663         int result;
664
665         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
666
667         g_array_append_vals(in_param1, &def_tx_Octets, sizeof(guint));
668         g_array_append_vals(in_param2, &def_tx_Time, sizeof(guint));
669
670         result = _bt_send_request(BT_BLUEZ_SERVICE,
671                 BT_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH,
672                 in_param1, in_param2, in_param3, in_param4, &out_param);
673
674         if (result != BLUETOOTH_ERROR_NONE)
675                 BT_ERR("Failed to Write the host suggested default data length values : %d", result);
676
677         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
678
679         return result;
680 }
681
682 BT_EXPORT_API int bluetooth_le_read_suggested_default_data_length(
683         bluetooth_le_read_host_suggested_data_length_t *le_data_length)
684 {
685         BT_CHECK_ENABLED_ANY(return);
686         BT_INIT_PARAMS();
687
688         int result;
689         bluetooth_le_read_host_suggested_data_length_t *data_values = NULL;
690         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
691
692         result = _bt_send_request(BT_BLUEZ_SERVICE,
693                 BT_LE_READ_HOST_SUGGESTED_DATA_LENGTH,
694                 in_param1, in_param2, in_param3, in_param4, &out_param);
695
696         if (result == BLUETOOTH_ERROR_NONE) {
697                 data_values = &g_array_index(out_param,
698                         bluetooth_le_read_host_suggested_data_length_t, 0);
699
700                 le_data_length->def_tx_octets = data_values->def_tx_octets;
701                 le_data_length->def_tx_time = data_values->def_tx_time;
702         }
703
704         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
705
706         return result;
707 }
708
709 BT_EXPORT_API int bluetooth_le_set_data_length(bluetooth_device_address_t *address,
710         const unsigned int max_tx_octets, const unsigned int max_tx_time)
711 {
712         BT_CHECK_ENABLED_ANY(return);
713         BT_INIT_PARAMS();
714
715         int result;
716
717         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
718
719         g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
720         g_array_append_vals(in_param2, &max_tx_octets, sizeof(guint));
721         g_array_append_vals(in_param3, &max_tx_time, sizeof(guint));
722
723         result = _bt_send_request(BT_BLUEZ_SERVICE,
724                 BT_LE_SET_DATA_LENGTH,
725                 in_param1, in_param2, in_param3, in_param4, &out_param);
726
727         if (result != BLUETOOTH_ERROR_NONE)
728                 BT_ERR("Failed to Set data length values : %d", result);
729
730         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
731
732         return result;
733 }
734
735 BT_EXPORT_API int bluetooth_is_le_2m_phy_supported(gboolean *is_supported)
736 {
737         int result;
738
739         BT_CHECK_PARAMETER(is_supported, return);
740         BT_CHECK_ENABLED_ANY(return);
741
742         BT_INIT_PARAMS();
743         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
744
745         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_LE_2M_PHY_SUPPORTED,
746                         in_param1, in_param2, in_param3, in_param4, &out_param);
747
748         if (result == BLUETOOTH_ERROR_NONE) {
749                 *is_supported = g_array_index(out_param, int, 0);
750         } else {
751                 BT_ERR("Fail to send request");
752         }
753
754         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
755
756         BT_INFO("LE 2M PHY Support[%s]", *is_supported ? "TRUE" : "FALSE");
757         return result;
758 }
759
760 BT_EXPORT_API int bluetooth_is_le_coded_phy_supported(gboolean *is_supported)
761 {
762         int result;
763
764         BT_CHECK_PARAMETER(is_supported, return);
765         BT_CHECK_ENABLED_ANY(return);
766
767         BT_INIT_PARAMS();
768         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
769
770         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_LE_CODED_PHY_SUPPORTED,
771                         in_param1, in_param2, in_param3, in_param4, &out_param);
772
773         if (result == BLUETOOTH_ERROR_NONE) {
774                 *is_supported = g_array_index(out_param, int, 0);
775         } else {
776                 BT_ERR("Fail to send request");
777         }
778
779         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
780
781         BT_INFO("LE CODED PHY Support[%s]", *is_supported ? "TRUE" : "FALSE");
782         return result;
783 }