Merge branch 'tizen' into tizen_5.5
[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)
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         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
200
201         return result;
202 }
203
204 gboolean __bluetooth_is_privileged_process(void)
205 {
206         FILE *fp = NULL;
207         char path[30] = {0, };
208         char buf[256] = {0, };
209
210         snprintf(path, sizeof(path), "/proc/%d/cmdline", getpid());
211         fp = fopen(path, "r");
212         if (fp == NULL)
213                 return FALSE;
214
215         if (fgets(buf, 256, fp) != NULL) {
216                 if (strstr(buf, "weconnd") != NULL) {
217                         fclose(fp);
218                         return TRUE;
219                 }
220         }
221
222         fclose(fp);
223         return FALSE;
224 }
225
226 BT_EXPORT_API int bluetooth_set_advertising(int handle, gboolean enable)
227 {
228         int result;
229         gboolean use_reserved_slot = TRUE;
230
231         BT_CHECK_ENABLED_ANY(return);
232
233         if (TIZEN_PROFILE_WEARABLE)
234                 use_reserved_slot = __bluetooth_is_privileged_process();
235
236         _bt_print_api_caller_name();
237
238         BT_INIT_PARAMS();
239         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
240
241         g_array_append_vals(in_param1, &handle, sizeof(int));
242         g_array_append_vals(in_param2, &enable, sizeof(gboolean));
243         g_array_append_vals(in_param3, &use_reserved_slot, sizeof(gboolean));
244
245         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_ADVERTISING,
246                 in_param1, in_param2, in_param3, in_param4, &out_param);
247
248         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
249
250         return result;
251 }
252
253 BT_EXPORT_API int bluetooth_set_custom_advertising(int handle, gboolean enable,
254                                                 bluetooth_advertising_params_t *params)
255 {
256         int result;
257         gboolean use_reserved_slot = TRUE;
258
259         BT_CHECK_ENABLED_ANY(return);
260
261         if (TIZEN_PROFILE_WEARABLE)
262         use_reserved_slot = __bluetooth_is_privileged_process();
263
264         _bt_print_api_caller_name();
265
266         BT_INIT_PARAMS();
267         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
268
269         g_array_append_vals(in_param1, &handle, sizeof(int));
270         g_array_append_vals(in_param2, &enable, sizeof(gboolean));
271         g_array_append_vals(in_param3, params, sizeof(bluetooth_advertising_params_t));
272         g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean));
273
274         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_CUSTOM_ADVERTISING,
275                 in_param1, in_param2, in_param3, in_param4, &out_param);
276
277         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
278
279         return result;
280 }
281
282 BT_EXPORT_API int bluetooth_get_advertising_data(bluetooth_advertising_data_t *adv_data, int *length)
283 {
284         int result;
285         guint8 *data;
286
287         BT_CHECK_PARAMETER(adv_data, return);
288         BT_CHECK_PARAMETER(length, return);
289         BT_CHECK_ENABLED_ANY(return);
290
291         BT_INIT_PARAMS();
292         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
293
294         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_ADVERTISING_DATA,
295                 in_param1, in_param2, in_param3, in_param4, &out_param);
296
297         if (result == BLUETOOTH_ERROR_NONE) {
298                 data = &g_array_index(out_param, guint8, 0);
299                 *length = out_param->len;
300
301                 memset(adv_data, 0x00, sizeof(bluetooth_advertising_data_t));
302                 memcpy(adv_data->data, data, *length);
303         }
304
305         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
306
307         return result;
308 }
309
310 BT_EXPORT_API int bluetooth_set_advertising_data(int handle, const bluetooth_advertising_data_t *value, int length)
311 {
312         int result;
313         gboolean use_reserved_slot = TRUE;
314
315         BT_CHECK_PARAMETER(value, return);
316         BT_CHECK_ENABLED_ANY(return);
317
318         if (length > BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 3)
319                 return BLUETOOTH_ERROR_INVALID_PARAM;
320
321         if (TIZEN_PROFILE_WEARABLE)
322                 use_reserved_slot = __bluetooth_is_privileged_process();
323
324         BT_INIT_PARAMS();
325         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
326
327         g_array_append_vals(in_param1, &handle, sizeof(int));
328         g_array_append_vals(in_param2, value, sizeof(bluetooth_advertising_data_t));
329         g_array_append_vals(in_param3, &length, sizeof(int));
330         g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean));
331
332         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_ADVERTISING_DATA,
333                 in_param1, in_param2, in_param3, in_param4, &out_param);
334
335         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
336
337         return result;
338 }
339
340 BT_EXPORT_API int bluetooth_get_scan_response_data(bluetooth_scan_resp_data_t *value, int *length)
341 {
342         int result;
343         guint8 *data;
344
345         BT_CHECK_PARAMETER(value, return);
346         BT_CHECK_PARAMETER(length, return);
347         BT_CHECK_ENABLED_ANY(return);
348
349         BT_INIT_PARAMS();
350         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
351
352         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_SCAN_RESPONSE_DATA,
353                 in_param1, in_param2, in_param3, in_param4, &out_param);
354
355         if (result == BLUETOOTH_ERROR_NONE) {
356                 data = &g_array_index(out_param, guint8, 0);
357                 *length = out_param->len;
358
359                 memset(value, 0x00, sizeof(bluetooth_scan_resp_data_t));
360                 memcpy(value->data, data, *length);
361         }
362
363         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
364
365         return result;
366 }
367
368 BT_EXPORT_API int bluetooth_set_scan_response_data(int handle,
369                         const bluetooth_scan_resp_data_t *value, int length)
370 {
371         int result;
372         gboolean use_reserved_slot = TRUE;
373
374         BT_CHECK_PARAMETER(value, return);
375         BT_CHECK_ENABLED_ANY(return);
376
377         if (length > BLUETOOTH_SCAN_RESP_DATA_LENGTH_MAX)
378                 return BLUETOOTH_ERROR_INVALID_PARAM;
379
380         if (TIZEN_PROFILE_WEARABLE)
381                 use_reserved_slot = __bluetooth_is_privileged_process();
382
383         BT_INIT_PARAMS();
384         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
385
386         g_array_append_vals(in_param1, &handle, sizeof(int));
387         g_array_append_vals(in_param2, value, length);
388         g_array_append_vals(in_param3, &length, sizeof(int));
389         g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean));
390
391         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCAN_RESPONSE_DATA,
392                 in_param1, in_param2, in_param3, in_param4, &out_param);
393
394         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
395
396         return result;
397 }
398
399 BT_EXPORT_API int bluetooth_set_scan_parameters(bluetooth_le_scan_params_t *params)
400 {
401         int result;
402
403         BT_CHECK_ENABLED_ANY(return);
404
405         BT_INIT_PARAMS();
406         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
407
408         g_array_append_vals(in_param1, params, sizeof(bluetooth_le_scan_params_t));
409
410         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCAN_PARAMETERS,
411                 in_param1, in_param2, in_param3, in_param4, &out_param);
412
413         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
414
415         return result;
416 }
417
418 BT_EXPORT_API int bluetooth_set_scan_type(bluetooth_le_scan_type_t scan_type)
419 {
420         int result;
421
422         BT_CHECK_ENABLED_ANY(return);
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, &scan_type, sizeof(int));
428
429         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCAN_TYPE,
430                 in_param1, in_param2, in_param3, in_param4, &out_param);
431
432         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
433
434         return result;
435 }
436
437 BT_EXPORT_API int bluetooth_is_advertising(gboolean *is_advertising)
438 {
439         int result;
440
441         BT_CHECK_ENABLED_ANY(return);
442
443         BT_INIT_PARAMS();
444         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
445
446         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_ADVERTISING,
447                 in_param1, in_param2, in_param3, in_param4, &out_param);
448
449         if (result == BLUETOOTH_ERROR_NONE)
450                 *is_advertising = g_array_index(out_param, int, 0);
451         else
452                 BT_ERR("Fail to send request");
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_add_white_list(bluetooth_device_address_t *address, bluetooth_device_address_type_t address_type)
460 {
461         int result;
462
463         BT_CHECK_PARAMETER(address, return);
464         BT_CHECK_ENABLED_ANY(return);
465
466         BT_INIT_PARAMS();
467         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
468
469         g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
470         g_array_append_vals(in_param2, &address_type, sizeof(int));
471
472         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_ADD_WHITE_LIST,
473                 in_param1, in_param2, in_param3, in_param4, &out_param);
474
475         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
476
477         return result;
478 }
479
480 BT_EXPORT_API int bluetooth_remove_white_list(bluetooth_device_address_t *address, bluetooth_device_address_type_t address_type)
481 {
482         int result;
483
484         BT_CHECK_PARAMETER(address, return);
485         BT_CHECK_ENABLED_ANY(return);
486
487         BT_INIT_PARAMS();
488         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
489
490         g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
491         g_array_append_vals(in_param2, &address_type, sizeof(int));
492
493         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_REMOVE_WHITE_LIST,
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_clear_white_list(void)
502 {
503         int result;
504
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         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_CLEAR_WHITE_LIST,
511                 in_param1, in_param2, in_param3, in_param4, &out_param);
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_enable_le_privacy(gboolean enable_privacy)
519 {
520         int result;
521
522         BT_CHECK_ENABLED_ANY(return);
523
524         BT_INIT_PARAMS();
525         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
526
527         g_array_append_vals(in_param1, &enable_privacy, sizeof(gboolean));
528
529         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_LE_PRIVACY,
530                 in_param1, in_param2, in_param3, in_param4, &out_param);
531
532         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
533
534         return result;
535 }
536
537 BT_EXPORT_API int bluetooth_set_le_static_random_address(gboolean enable)
538 {
539         int result;
540
541         BT_CHECK_ENABLED_ANY(return);
542
543         BT_INIT_PARAMS();
544         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
545
546         g_array_append_vals(in_param1, &enable, sizeof(gboolean));
547
548         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_LE_STATIC_RANDOM_ADDRESS,
549                 in_param1, in_param2, in_param3, in_param4, &out_param);
550
551         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
552
553         return result;
554 }
555
556 BT_EXPORT_API int bluetooth_check_privilege_advertising_parameter(void)
557 {
558         if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_SET_ADVERTISING_PARAMETERS)
559                      == BLUETOOTH_ERROR_PERMISSION_DEINED) {
560                 BT_ERR("Don't have a privilege to use this API");
561                 return BLUETOOTH_ERROR_PERMISSION_DEINED;
562         }
563
564         return BLUETOOTH_ERROR_NONE;
565 }
566
567 BT_EXPORT_API int bluetooth_le_register_callback(bluetooth_cb_func_ptr callback_ptr, void *user_data)
568 {
569         int ret;
570
571         ret = _bt_register_event(BT_LE_ADAPTER_EVENT, (void *)callback_ptr, user_data);
572         if (ret != BLUETOOTH_ERROR_NONE &&
573             ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
574                 BT_ERR("Fail to register BT_LE_ADAPTER_EVENT event : %d", ret);
575                 return ret;
576         }
577
578         return BLUETOOTH_ERROR_NONE;
579 }
580
581 BT_EXPORT_API int bluetooth_le_unregister_callback(void)
582 {
583         _bt_unregister_event(BT_LE_ADAPTER_EVENT);
584
585         return BLUETOOTH_ERROR_NONE;
586 }
587
588 BT_EXPORT_API int bluetooth_le_read_maximum_data_length(
589                         bluetooth_le_read_maximum_data_length_t *max_le_datalength)
590 {
591         BT_CHECK_ENABLED_ANY(return);
592         BT_INIT_PARAMS();
593         int result;
594         bluetooth_le_read_maximum_data_length_t *datalength = NULL;
595
596         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
597
598         result = _bt_send_request(BT_BLUEZ_SERVICE,
599                 BT_LE_READ_MAXIMUM_DATA_LENGTH,
600                 in_param1, in_param2, in_param3, in_param4, &out_param);
601
602         if (result == BLUETOOTH_ERROR_NONE) {
603                 datalength = &g_array_index(out_param,
604                         bluetooth_le_read_maximum_data_length_t, 0);
605                 max_le_datalength->max_tx_octets  = datalength->max_tx_octets;
606                 max_le_datalength->max_tx_time = datalength->max_tx_time;
607                 max_le_datalength->max_rx_octets = datalength->max_rx_octets;
608                 max_le_datalength->max_rx_time = datalength->max_rx_time;
609         }
610
611         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
612
613         return result;
614 }
615
616 BT_EXPORT_API int bluetooth_le_write_host_suggested_default_data_length(
617         const unsigned int def_tx_Octets, const unsigned int def_tx_Time)
618 {
619         BT_CHECK_ENABLED_ANY(return);
620         BT_INIT_PARAMS();
621
622         int result;
623
624         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
625
626         g_array_append_vals(in_param1, &def_tx_Octets, sizeof(guint));
627         g_array_append_vals(in_param2, &def_tx_Time, sizeof(guint));
628
629         result = _bt_send_request(BT_BLUEZ_SERVICE,
630                 BT_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH,
631                 in_param1, in_param2, in_param3, in_param4, &out_param);
632
633         if (result != BLUETOOTH_ERROR_NONE)
634                 BT_ERR("Failed to Write the host suggested default data length values : %d", result);
635
636         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
637
638         return result;
639 }
640
641 BT_EXPORT_API int bluetooth_le_read_suggested_default_data_length(
642         bluetooth_le_read_host_suggested_data_length_t *le_data_length)
643 {
644         BT_CHECK_ENABLED_ANY(return);
645         BT_INIT_PARAMS();
646
647         int result;
648         bluetooth_le_read_host_suggested_data_length_t *data_values = NULL;
649         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
650
651         result = _bt_send_request(BT_BLUEZ_SERVICE,
652                 BT_LE_READ_HOST_SUGGESTED_DATA_LENGTH,
653                 in_param1, in_param2, in_param3, in_param4, &out_param);
654
655         if (result == BLUETOOTH_ERROR_NONE) {
656                 data_values = &g_array_index(out_param,
657                         bluetooth_le_read_host_suggested_data_length_t, 0);
658
659                 le_data_length->def_tx_octets = data_values->def_tx_octets;
660                 le_data_length->def_tx_time = data_values->def_tx_time;
661         }
662
663         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
664
665         return result;
666 }
667
668 BT_EXPORT_API int bluetooth_le_set_data_length(bluetooth_device_address_t *address,
669         const unsigned int max_tx_octets, const unsigned int max_tx_time)
670 {
671         BT_CHECK_ENABLED_ANY(return);
672         BT_INIT_PARAMS();
673
674         int result;
675
676         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
677
678         g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
679         g_array_append_vals(in_param2, &max_tx_octets, sizeof(guint));
680         g_array_append_vals(in_param3, &max_tx_time, sizeof(guint));
681
682         result = _bt_send_request(BT_BLUEZ_SERVICE,
683                 BT_LE_SET_DATA_LENGTH,
684                 in_param1, in_param2, in_param3, in_param4, &out_param);
685
686         if (result != BLUETOOTH_ERROR_NONE)
687                 BT_ERR("Failed to Set data length values : %d", result);
688
689         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
690
691         return result;
692 }
693
694 BT_EXPORT_API int bluetooth_is_le_2m_phy_supported(gboolean *is_supported)
695 {
696         int result;
697
698         BT_CHECK_PARAMETER(is_supported, return);
699         BT_CHECK_ENABLED_ANY(return);
700
701         BT_INIT_PARAMS();
702         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
703
704         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_LE_2M_PHY_SUPPORTED,
705                         in_param1, in_param2, in_param3, in_param4, &out_param);
706
707         if (result == BLUETOOTH_ERROR_NONE) {
708                 *is_supported = g_array_index(out_param, int, 0);
709         } else {
710                 BT_ERR("Fail to send request");
711         }
712
713         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
714
715         BT_INFO("LE 2M PHY Support[%s]", *is_supported ? "TRUE" : "FALSE");
716         return result;
717 }
718
719 BT_EXPORT_API int bluetooth_is_le_coded_phy_supported(gboolean *is_supported)
720 {
721         int result;
722
723         BT_CHECK_PARAMETER(is_supported, return);
724         BT_CHECK_ENABLED_ANY(return);
725
726         BT_INIT_PARAMS();
727         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
728
729         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_LE_CODED_PHY_SUPPORTED,
730                         in_param1, in_param2, in_param3, in_param4, &out_param);
731
732         if (result == BLUETOOTH_ERROR_NONE) {
733                 *is_supported = g_array_index(out_param, int, 0);
734         } else {
735                 BT_ERR("Fail to send request");
736         }
737
738         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
739
740         BT_INFO("LE CODED PHY Support[%s]", *is_supported ? "TRUE" : "FALSE");
741         return result;
742 }