Fix the svace issue - DEREF_AFTER_NULL
[platform/core/connectivity/bluetooth-frwk.git] / bt-oal / oal-adapter-mgr.c
1 /*
2  * Open Adaptation Layer (OAL)
3  *
4  * Copyright (c) 2014-2015 Samsung Electronics Co., Ltd.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <dlog.h>
23 #include <string.h>
24 #include <vconf.h>
25 #include <sys/wait.h>
26
27 #include <bluetooth.h>
28
29 #include "oal-event.h"
30 #include "oal-internal.h"
31 #include "oal-manager.h"
32 #include "oal-hardware.h"
33 #include "oal-common.h"
34 #include "oal-utils.h"
35 #include "oal-gatt.h"
36
37 #define CHECK_MAX(max, x) (((max) > (x)) ? (x) : (max))
38
39 static const bt_interface_t * blued_api;
40
41 static bt_address_t local_address;
42 static char local_name[BT_DEVICE_NAME_LENGTH_MAX + 1] = {'O', 'A', 'L', 0};
43 static char local_version[BT_VERSION_STR_LEN_MAX + 1];
44 static bt_scan_mode_t scan_mode = BT_SCAN_MODE_NONE;
45 static int discoverable_timeout = 0;
46
47 /* Forward declarations */
48 oal_status_t convert_to_oal_status(bt_status_t status);
49 static gboolean retry_enable_adapter(gpointer data);
50 #ifdef TIZEN_BT_HAL
51 static gboolean retry_enable_le(gpointer data);
52 #endif
53 oal_status_t oal_mgr_init_internal(void);
54
55
56 /* Callback registered with Stack */
57 static void cb_adapter_state_change(bt_state_t status);
58 static void cb_adapter_discovery_state_changed(bt_discovery_state_t state);
59 static void cb_adapter_device_found(int num_properties, bt_property_t *properties);
60 static void cb_adapter_properties(bt_status_t status,
61                 int num_properties, bt_property_t *properties);
62 static void cb_adapter_profile_connected_devices(uint8_t count, uint8_t bdaddr_list[][6]);
63 extern void cb_device_properties(bt_status_t status, bt_bdaddr_t *bd_addr,
64                 int num_properties, bt_property_t *properties);
65 extern void cb_device_bond_state_changed(bt_status_t status, bt_bdaddr_t *bd_addr,
66                 bt_bond_state_t state);
67 extern void cb_device_acl_state_changed(bt_status_t status, bt_bdaddr_t *remote_bd_addr,
68                 bt_acl_state_t state);
69 extern void cb_device_pin_request(bt_bdaddr_t *bd_addr, bt_bdname_t *bdname, uint32_t device_class);
70 extern void cb_device_ssp_request(bt_bdaddr_t *bd_addr, bt_bdname_t *bdname, uint32_t device_class,
71                         bt_ssp_variant_t pairing_variant, uint32_t pass_key);
72 extern void cb_device_authorize_request(bt_bdaddr_t *remote_bd_addr, bt_service_id_t service_d);
73 extern void cb_device_trust_state_changed(bt_bdaddr_t *remote_bd_addr, bt_device_trust_state_t trusted);
74 #ifdef TIZEN_BT_HAL
75 extern void cb_socket_conn_authorize_request(bt_bdaddr_t *remote_bd_addr, bt_uuid_t *uuid, uint8_t *name, uint8_t *path, uint32_t fd);
76 static void cb_ble_state_change(bt_state_t status);
77 extern void cb_device_le_conn_state_changed(bt_status_t status, bt_bdaddr_t *bd_addr,
78                 bt_le_conn_state_t state);
79 extern void cb_device_trusted_profiles_changed(bt_bdaddr_t *bd_addr, uint32_t trust_val);
80 extern void cb_rssi_monitor_state_changed(bt_bdaddr_t *bd_addr, int32_t link_type, uint8_t state);
81 extern void cb_rssi_alert(bt_bdaddr_t *bd_addr, int32_t link_type, int32_t alert_type, int32_t rssi);
82 extern void cb_raw_rssi_received(bt_bdaddr_t *bd_addr, int32_t link_type, int32_t rssi);
83 extern void cb_dbfw_plus_info_received(unsigned char *data, uint32_t length, uint8_t event_code);
84 extern void cb_controller_error_received(uint8_t error_code);
85 #endif
86
87 static bt_callbacks_t callbacks = {
88         .size = sizeof(callbacks),
89         .adapter_state_changed_cb = cb_adapter_state_change,
90         .adapter_properties_cb = cb_adapter_properties,
91         .adapter_profile_connected_devices_cb = cb_adapter_profile_connected_devices,
92         .remote_device_properties_cb = cb_device_properties,
93         .device_found_cb = cb_adapter_device_found,
94         .discovery_state_changed_cb = cb_adapter_discovery_state_changed,
95         .pin_request_cb = cb_device_pin_request,
96         .ssp_request_cb = cb_device_ssp_request,
97         .bond_state_changed_cb = cb_device_bond_state_changed,
98         .acl_state_changed_cb = cb_device_acl_state_changed,
99         .thread_evt_cb = NULL,
100         .dut_mode_recv_cb = NULL,
101         .le_test_mode_cb = NULL,
102         .energy_info_cb = NULL,
103         .authorize_request_cb = cb_device_authorize_request,
104         .device_trust_state_changed_cb = cb_device_trust_state_changed,
105 #ifdef TIZEN_BT_HAL
106         .socket_authorize_request_cb = cb_socket_conn_authorize_request,
107         .le_state_changed_cb = cb_ble_state_change,
108         .le_conn_state_changed_cb = cb_device_le_conn_state_changed,
109         .device_trusted_profiles_changed_cb = cb_device_trusted_profiles_changed,
110         .rssi_monitor_state_changed_cb = cb_rssi_monitor_state_changed,
111         .rssi_alert_cb = cb_rssi_alert,
112         .raw_rssi_received_cb = cb_raw_rssi_received,
113         .dbfw_plus_info_received_cb = cb_dbfw_plus_info_received,
114         .controller_error_received_cb = cb_controller_error_received,
115 #endif
116 };
117
118 oal_status_t adapter_mgr_init(const bt_interface_t * stack_if)
119 {
120         int ret;
121         blued_api = stack_if;
122
123         ret = blued_api->init(&callbacks);
124
125         if (ret != BT_STATUS_SUCCESS) {
126                 BT_ERR("Adapter callback registration failed: [%s]", status2string(ret));
127                 blued_api->cleanup();
128                 return convert_to_oal_status(ret);
129         }
130
131         return OAL_STATUS_SUCCESS;
132 }
133
134 const bt_interface_t* adapter_get_stack_interface(void)
135 {
136         return blued_api;
137 }
138
139 void adapter_mgr_cleanup(void)
140 {
141         /* Nothing to clean yet , do not set blued_api NULL as it will be used to clean Bluedroid states */
142         BT_DBG();
143 }
144
145 #ifdef TIZEN_BT_HAL
146 int oal_set_adapter_request_state(int enable)
147 {
148         return blued_api->set_hal_adapter_request_state(enable);
149 }
150
151 int oal_set_le_request_state(int enable)
152 {
153         return blued_api->set_hal_le_request_state(enable);
154 }
155 #endif
156
157 oal_status_t adapter_enable(void)
158 {
159         int ret = BT_STATUS_SUCCESS;
160
161         API_TRACE();
162
163         if (blued_api == NULL) {
164                 BT_INFO("Stack is initializing, so pending enable");
165                 g_timeout_add(200, retry_enable_adapter, NULL);
166                 return OAL_STATUS_PENDING;
167         }
168
169         if (OAL_STATUS_SUCCESS != hw_is_module_ready()) {
170                 g_timeout_add(200, retry_enable_adapter, NULL);
171                 return OAL_STATUS_PENDING;
172         }
173
174         ret = blued_api->enable();
175
176         if (ret != BT_STATUS_SUCCESS) {
177                 BT_ERR("Enable failed: [%s]", status2string(ret));
178                 return convert_to_oal_status(ret);
179         }
180
181         return OAL_STATUS_SUCCESS;
182 }
183
184 oal_status_t adapter_disable(void)
185 {
186         int ret;
187
188         API_TRACE();
189
190         CHECK_OAL_INITIALIZED();
191
192         ret = blued_api->disable();
193
194         if (ret != BT_STATUS_SUCCESS) {
195                 BT_ERR("Disable failed: [%s]", status2string(ret));
196                 return convert_to_oal_status(ret);
197         }
198         return OAL_STATUS_SUCCESS;
199 }
200
201 oal_status_t le_enable(void)
202 {
203         int ret = BT_STATUS_SUCCESS;
204
205         API_TRACE();
206         CHECK_OAL_INITIALIZED();
207
208 #ifdef TIZEN_BT_HAL
209         if (OAL_STATUS_SUCCESS != hw_is_module_ready()) {
210                 g_timeout_add(200, retry_enable_le, NULL);
211                 return OAL_STATUS_PENDING;
212         }
213
214         ret = blued_api->le_enable();
215
216         if (ret != BT_STATUS_SUCCESS) {
217                 BT_ERR("Enable failed: [%s]", status2string(ret));
218                 return convert_to_oal_status(ret);
219         }
220 #else
221         BT_INFO("Not Supported");
222         ret = OAL_STATUS_NOT_SUPPORT;
223 #endif
224
225         return ret;
226 }
227
228 oal_status_t le_disable(void)
229 {
230         int ret;
231
232         API_TRACE();
233
234         CHECK_OAL_INITIALIZED();
235
236 #ifdef TIZEN_BT_HAL
237         ret = blued_api->le_disable();
238
239         if (ret != BT_STATUS_SUCCESS) {
240                 BT_ERR("Disable failed: [%s]", status2string(ret));
241                 return convert_to_oal_status(ret);
242         }
243 #else
244         BT_INFO("Not Supported");
245         ret = OAL_STATUS_NOT_SUPPORT;
246 #endif
247         return ret;
248 }
249
250 oal_status_t le_init(void)
251 {
252         int ret = BT_STATUS_SUCCESS;
253         API_TRACE();
254         CHECK_OAL_INITIALIZED();
255 #ifdef TIZEN_BT_HAL
256         if (OAL_STATUS_SUCCESS != hw_is_module_ready()) {
257                 g_timeout_add(200, retry_enable_le, NULL);
258                 return OAL_STATUS_PENDING;
259         }
260         ret = blued_api->le_init();
261         if (ret != BT_STATUS_SUCCESS) {
262                 BT_ERR("Enable failed: [%s]", status2string(ret));
263                 return convert_to_oal_status(ret);
264         }
265 #else
266         BT_INFO("Not Supported");
267         ret = OAL_STATUS_NOT_SUPPORT;
268 #endif
269         return ret;
270 }
271 oal_status_t le_deinit(void)
272 {
273         int ret = BT_STATUS_SUCCESS;
274         API_TRACE();
275         CHECK_OAL_INITIALIZED();
276 #ifdef TIZEN_BT_HAL
277         if (OAL_STATUS_SUCCESS != hw_is_module_ready()) {
278                 g_timeout_add(200, retry_enable_le, NULL);
279                 return OAL_STATUS_PENDING;
280         }
281         blued_api->le_deinit();
282 #else
283         BT_INFO("Not Supported");
284         ret = OAL_STATUS_NOT_SUPPORT;
285 #endif
286         return ret;
287 }
288 oal_status_t is_advertising(void)
289 {
290         int ret = BT_STATUS_SUCCESS;
291         API_TRACE();
292         CHECK_OAL_INITIALIZED();
293 #ifdef TIZEN_BT_HAL
294         if (OAL_STATUS_SUCCESS != hw_is_module_ready()) {
295                 g_timeout_add(200, retry_enable_le, NULL);
296                 return OAL_STATUS_PENDING;
297         }
298         int r = blued_api->is_advertising();
299         if (r == TRUE)
300                 ret = BT_STATUS_SUCCESS;
301         else
302                 ret = BT_STATUS_FAIL;
303 #else
304         BT_INFO("Not Supported");
305         ret = OAL_STATUS_NOT_SUPPORT;
306 #endif
307         return ret;
308 }
309 oal_status_t adapter_start_custom_inquiry(discovery_type_t disc_type)
310 {
311         int ret;
312
313         API_TRACE();
314
315         CHECK_OAL_INITIALIZED();
316         BT_INFO("Custom Discovery Type [0x%x]", disc_type);
317
318 #ifdef TIZEN_BT_HAL
319         ret = blued_api->start_custom_discovery(disc_type);
320         if (ret != BT_STATUS_SUCCESS) {
321                 BT_ERR("start_custom_discovery failed: [%s]", status2string(ret));
322                 return convert_to_oal_status(ret);
323         }
324 #else
325         BT_INFO("Not Supported");
326         ret = OAL_STATUS_NOT_SUPPORT;
327 #endif
328         return ret;
329 }
330
331 oal_status_t adapter_get_powered_status(gboolean *status)
332 {
333         int ret;
334         unsigned char powered = 0;
335
336         API_TRACE();
337
338         CHECK_OAL_INITIALIZED();
339
340         OAL_CHECK_PARAMETER(status, return);
341         BT_INFO("Get Adapter Powered status");
342
343 #ifdef TIZEN_BT_HAL
344         ret = blued_api->get_adapter_powered_status(&powered);
345         if (ret != BT_STATUS_SUCCESS) {
346                 BT_ERR("adapter_get_powered_status failed: [%s]", status2string(ret));
347                 *status = FALSE;
348                 return convert_to_oal_status(ret);
349         }
350         if (powered == 1)
351                 *status = TRUE;
352         else
353                 *status = FALSE;
354 #else
355         BT_INFO("Not Supported");
356         ret = OAL_STATUS_NOT_SUPPORT;
357 #endif
358         return ret;
359 }
360
361 oal_status_t adapter_get_energy_info(uint32_t *tx_time, uint32_t *rx_time,
362                                         uint32_t *idle_time, uint32_t *energy_used)
363 {
364         int ret;
365
366         API_TRACE();
367
368         CHECK_OAL_INITIALIZED();
369
370         OAL_CHECK_PARAMETER(tx_time, return);
371         OAL_CHECK_PARAMETER(rx_time, return);
372         OAL_CHECK_PARAMETER(idle_time, return);
373         OAL_CHECK_PARAMETER(energy_used, return);
374
375         BT_INFO("Get Adapter Energy Info");
376
377 #ifdef TIZEN_BT_HAL
378         ret = blued_api->get_adapter_energy_info(tx_time, rx_time, idle_time, energy_used);
379         if (ret != BT_STATUS_SUCCESS) {
380                 BT_ERR("get_adapter_energy_info failed: [%s]", status2string(ret));
381                 return convert_to_oal_status(ret);
382         }
383 #else
384         BT_INFO("Not Supported");
385         ret = OAL_STATUS_NOT_SUPPORT;
386 #endif
387         return ret;
388 }
389
390 oal_status_t adapter_reset(void)
391 {
392         int ret;
393
394         API_TRACE();
395
396         CHECK_OAL_INITIALIZED();
397         BT_INFO("Adapter Reset");
398
399 #ifdef TIZEN_BT_HAL
400         ret = blued_api->reset();
401         if (ret != BT_STATUS_SUCCESS) {
402                 BT_ERR("Adapter Reset failed: [%s]", status2string(ret));
403                 return convert_to_oal_status(ret);
404         }
405 #else
406         BT_INFO("Not Supported");
407         ret = OAL_STATUS_NOT_SUPPORT;
408 #endif
409         return ret;
410 }
411
412 oal_status_t adapter_recover(void)
413 {
414         int result;
415
416         API_TRACE();
417
418         CHECK_OAL_INITIALIZED();
419         BT_INFO("Adapter Recover");
420
421         result = blued_api->recover();
422         if (result != BT_STATUS_SUCCESS) {
423                 BT_ERR("Adapter Recover Failed: [%s]", status2string(result));
424                 return convert_to_oal_status(result);
425         }
426
427         return result;
428 }
429
430 oal_status_t adapter_start_inquiry(unsigned short duration)
431 {
432         int ret;
433
434         API_TRACE();
435
436         CHECK_OAL_INITIALIZED();
437
438         ret = blued_api->start_discovery();
439         if (ret != BT_STATUS_SUCCESS) {
440                 BT_ERR("start_discovery failed: [%s]", status2string(ret));
441                 return convert_to_oal_status(ret);
442         }
443
444         return OAL_STATUS_SUCCESS;
445 }
446
447 oal_status_t adapter_stop_inquiry(void)
448 {
449         int ret;
450
451         API_TRACE();
452
453         CHECK_OAL_INITIALIZED();
454
455         ret = blued_api->cancel_discovery();
456         if (ret != BT_STATUS_SUCCESS) {
457                 BT_ERR("cancel_discovery failed: [%s]", status2string(ret));
458                 return convert_to_oal_status(ret);
459         }
460
461         return OAL_STATUS_SUCCESS;
462 }
463
464 /* Callbacks from Stack */
465 static void cb_adapter_state_change(bt_state_t status)
466 {
467         BT_DBG("+");
468         oal_event_t event;
469
470         event = (BT_STATE_ON == status) ? OAL_EVENT_ADAPTER_ENABLED : OAL_EVENT_ADAPTER_DISABLED;
471
472         send_event(event, NULL, 0);
473 }
474
475 #ifdef TIZEN_BT_HAL
476 /* Callbacks from Stack */
477 static void cb_ble_state_change(bt_state_t status)
478 {
479         BT_DBG("+");
480         oal_event_t event;
481
482         event = (BT_STATE_ON == status) ? OAL_EVENT_BLE_ENABLED : OAL_EVENT_BLE_DISABLED;
483
484         send_event(event, NULL, 0);
485 }
486 #endif
487
488 static gboolean retry_enable_adapter(gpointer data)
489 {
490         adapter_enable();
491         return FALSE;
492 }
493
494 #ifdef TIZEN_BT_HAL
495 static gboolean retry_enable_le(gpointer data)
496 {
497         le_enable();
498         return FALSE;
499 }
500 #endif
501 oal_status_t adapter_get_properties(void)
502 {
503         int ret;
504
505         API_TRACE();
506         CHECK_OAL_INITIALIZED();
507
508         ret = blued_api->get_adapter_properties();
509         if (ret != BT_STATUS_SUCCESS) {
510                 BT_ERR("get_adapter_properties failed: [%s]", status2string(ret));
511                 return convert_to_oal_status(ret);
512         }
513
514         return OAL_STATUS_SUCCESS;
515 }
516
517 oal_status_t adapter_get_address(void)
518 {
519         int ret;
520
521         API_TRACE();
522         CHECK_OAL_INITIALIZED();
523
524         ret = blued_api->get_adapter_property(BT_PROPERTY_BDADDR);
525         if (ret != BT_STATUS_SUCCESS) {
526                 BT_ERR("get_adapter_property failed: [%s]", status2string(ret));
527                 return convert_to_oal_status(ret);
528         }
529
530         return OAL_STATUS_SUCCESS;
531 }
532
533 oal_status_t adapter_get_version(void)
534 {
535         int ret;
536
537         API_TRACE();
538         CHECK_OAL_INITIALIZED();
539
540         ret = blued_api->get_adapter_property(BT_PROPERTY_VERSION);
541         if (ret != BT_STATUS_SUCCESS) {
542                 BT_ERR("get_adapter_property failed: [%s]", status2string(ret));
543                 return convert_to_oal_status(ret);
544         }
545
546         return OAL_STATUS_SUCCESS;
547 }
548
549 oal_status_t adapter_get_name(void)
550 {
551         int ret;
552
553         CHECK_OAL_INITIALIZED();
554
555         API_TRACE();
556
557         ret = blued_api->get_adapter_property(BT_PROPERTY_BDNAME);
558         if (ret != BT_STATUS_SUCCESS) {
559                 BT_ERR("get_adapter_property failed: [%s]", status2string(ret));
560                 return convert_to_oal_status(ret);
561         }
562
563         return OAL_STATUS_SUCCESS;
564 }
565
566 oal_status_t adapter_get_connectable(void)
567 {
568         int ret;
569
570         CHECK_OAL_INITIALIZED();
571
572         API_TRACE();
573
574         ret = blued_api->get_adapter_property(BT_PROPERTY_ADAPTER_SCAN_MODE);
575         if (ret != BT_STATUS_SUCCESS) {
576                 BT_ERR("get_adapter_property failed: [%s]", status2string(ret));
577                 return convert_to_oal_status(ret);
578         }
579
580         return OAL_STATUS_SUCCESS;
581 }
582
583 oal_status_t adapter_set_name(char * name)
584 {
585         int ret;
586         bt_property_t prop;
587
588         CHECK_OAL_INITIALIZED();
589
590         OAL_CHECK_PARAMETER(name, return);
591         API_TRACE("Name: %s", name);
592
593         prop.type = BT_PROPERTY_BDNAME;
594         prop.len = strlen(name);
595         prop.val = name;
596
597         ret = blued_api->set_adapter_property(&prop);
598         if (ret != BT_STATUS_SUCCESS) {
599                 BT_ERR("set_adapter_property: [%s]", status2string(ret));
600                 ret = OAL_STATUS_INTERNAL_ERROR;
601         } else
602                 ret = OAL_STATUS_SUCCESS;
603
604         return ret;
605 }
606
607 oal_status_t adapter_is_discoverable(int *p_discoverable)
608 {
609         OAL_CHECK_PARAMETER(p_discoverable, return);
610
611         *p_discoverable = (scan_mode == BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE);
612
613         API_TRACE("%d", *p_discoverable);
614
615         return OAL_STATUS_SUCCESS;
616 }
617
618 oal_status_t adapter_is_connectable(int *p_connectable)
619 {
620         OAL_CHECK_PARAMETER(p_connectable, return);
621
622         *p_connectable = (scan_mode == BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE)
623                 || (scan_mode == BT_SCAN_MODE_CONNECTABLE);
624
625         API_TRACE("%d", *p_connectable);
626
627         return OAL_STATUS_SUCCESS;
628 }
629
630 oal_status_t adapter_get_discoverable_timeout(int *p_timeout)
631 {
632         API_TRACE("%d", discoverable_timeout);
633
634         *p_timeout = discoverable_timeout;
635
636         return OAL_STATUS_SUCCESS;
637 }
638
639 oal_status_t adapter_get_service_uuids(void)
640 {
641         int ret;
642
643         CHECK_OAL_INITIALIZED();
644
645         API_TRACE();
646         ret = blued_api->get_adapter_property(BT_PROPERTY_UUIDS);
647         if (ret != BT_STATUS_SUCCESS) {
648                 BT_ERR("get_adapter_property failed: [%s]", status2string(ret));
649                 return convert_to_oal_status(ret);
650         }
651         return OAL_STATUS_SUCCESS;
652 }
653
654 oal_status_t adapter_get_bonded_devices(void)
655 {
656         int ret;
657
658         CHECK_OAL_INITIALIZED();
659
660         API_TRACE();
661
662         ret = blued_api->get_adapter_property(BT_PROPERTY_ADAPTER_BONDED_DEVICES);
663         if (ret != BT_STATUS_SUCCESS) {
664                 BT_ERR("get_adapter_property failed: [%s]", status2string(ret));
665                 return convert_to_oal_status(ret);
666         }
667
668         return OAL_STATUS_SUCCESS;
669 }
670
671 oal_status_t adapter_get_profile_connected_devices(const char *profile_uuid)
672 {
673         int ret;
674
675         CHECK_OAL_INITIALIZED();
676
677         API_TRACE();
678
679         ret = blued_api->get_profile_connected_devices(profile_uuid);
680         if (ret != BT_STATUS_SUCCESS) {
681                 BT_ERR("get_profile_connected_devices failed: [%s]", status2string(ret));
682                 return convert_to_oal_status(ret);
683         }
684
685         return OAL_STATUS_SUCCESS;
686 }
687
688 static oal_status_t set_scan_mode(bt_scan_mode_t mode)
689 {
690         bt_property_t prop;
691         int res;
692
693         BT_DBG("+");
694
695         CHECK_OAL_INITIALIZED();
696
697         prop.type = BT_PROPERTY_ADAPTER_SCAN_MODE;
698         prop.len = sizeof(bt_scan_mode_t);
699         prop.val = &mode;
700         res = blued_api->set_adapter_property(&prop);
701         if (res != BT_STATUS_SUCCESS) {
702                 BT_ERR("set scan mode failed [%s]", status2string(res));
703                 return convert_to_oal_status(res);
704         }
705
706         BT_DBG("-");
707         return OAL_STATUS_SUCCESS;
708 }
709
710 oal_status_t adapter_set_connectable(int connectable)
711 {
712         bt_scan_mode_t mode;
713
714         API_TRACE("%d", connectable);
715
716         CHECK_OAL_INITIALIZED();
717
718         mode = connectable ? BT_SCAN_MODE_CONNECTABLE : BT_SCAN_MODE_NONE;
719
720         return set_scan_mode(mode);
721 }
722
723 oal_status_t adapter_set_discoverable(void)
724 {
725         CHECK_OAL_INITIALIZED();
726         API_TRACE();
727
728         return set_scan_mode(BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE);
729 }
730
731 oal_status_t adapter_set_discoverable_timeout(int timeout)
732 {
733         bt_property_t prop;
734         int res;
735         uint32_t prop_val = timeout;
736
737         CHECK_OAL_INITIALIZED();
738         API_TRACE("%d", timeout);
739
740         prop.type = BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT;
741         prop.len = sizeof(prop_val);
742         prop.val = &prop_val;
743         res = blued_api->set_adapter_property(&prop);
744         if (res != BT_STATUS_SUCCESS) {
745                 BT_ERR("set_adapter_property failed [%s]", status2string(res));
746                 return convert_to_oal_status(res);
747         }
748         return OAL_STATUS_SUCCESS;
749 }
750
751 oal_status_t adapter_ble_set_filter_policy(int filter_policy)
752 {
753         int ret = OAL_STATUS_SUCCESS;
754
755         CHECK_OAL_INITIALIZED();
756         API_TRACE();
757
758         BT_DBG("Filter policy applied is [%d]", filter_policy);
759
760         ret = gatts_set_filter_policy(filter_policy);
761
762         if (ret != OAL_STATUS_SUCCESS) {
763                 BT_ERR("gatts_set_filter_policy: [%d]", ret);
764                 return ret;
765         }
766
767         return OAL_STATUS_SUCCESS;
768 }
769
770 oal_status_t adapter_ble_multi_adv_update(int Ins_id, int min_intv, int max_intv,
771                         int adv_type, int chnl_map, int tx_power, int timeout_s)
772 {
773         int res;
774         CHECK_OAL_INITIALIZED();
775         API_TRACE();
776
777         res = gatts_multi_adv_update(Ins_id, min_intv, max_intv,
778                         adv_type, chnl_map, tx_power, timeout_s);
779         if (res != OAL_STATUS_SUCCESS) {
780                 BT_ERR("gatts_multi_adv_update: [%d]", res);
781                 return res;
782         }
783         return OAL_STATUS_SUCCESS;
784 }
785
786 oal_status_t adapter_ble_multi_adv_set_inst_data(int instance_id,
787                         oal_ble_multi_adv_param_setup_t * adv_param_setup)
788 {
789         int res;
790         CHECK_OAL_INITIALIZED();
791         OAL_CHECK_PARAMETER(adv_param_setup, return);
792
793         API_TRACE();
794
795         res = gatts_multi_adv_set_inst_data(instance_id, adv_param_setup);
796         if (res != OAL_STATUS_SUCCESS) {
797                 BT_ERR("failed: [%d]", res);
798                 return res;
799         }
800         return OAL_STATUS_SUCCESS;
801 }
802
803 oal_status_t adapter_ble_multi_adv_enable(int instance_id)
804 {
805         int res;
806         CHECK_OAL_INITIALIZED();
807         API_TRACE();
808
809         res = gatts_multi_adv_enable(instance_id);
810         if (res != OAL_STATUS_SUCCESS) {
811                 BT_ERR("failed: [%d]", res);
812                 return res;
813         }
814
815         return OAL_STATUS_SUCCESS;
816 }
817
818 oal_status_t adapter_ble_multi_adv_disable(int instance_id)
819 {
820         int res;
821         CHECK_OAL_INITIALIZED();
822         API_TRACE();
823
824         res = gatts_multi_adv_disable(instance_id);
825         if (res != OAL_STATUS_SUCCESS) {
826                 BT_ERR("failed: [%d]", res);
827                 return res;
828         }
829
830         return OAL_STATUS_SUCCESS;
831 }
832
833 oal_status_t adapter_set_le_static_random_address(int enable)
834 {
835         int ret;
836
837         CHECK_OAL_INITIALIZED();
838         API_TRACE("%d", enable);
839
840 #ifdef TIZEN_BT_HAL
841         ret = blued_api->set_le_static_random_address((enable ? 1 : 0));
842         if (ret != BT_STATUS_SUCCESS)
843                 BT_ERR("Static address set failed: [%s]", status2string(ret));
844         ret = convert_to_oal_status(ret);
845 #else
846         BT_INFO("Not Supported");
847         ret = OAL_STATUS_NOT_SUPPORT;
848 #endif
849
850         return ret;
851 }
852
853 oal_status_t adapter_set_manufacturer_data(oal_manufacturer_data_t *m_data)
854 {
855         int ret;
856
857         CHECK_OAL_INITIALIZED();
858         API_TRACE();
859
860         OAL_CHECK_PARAMETER(m_data, return);
861         ret = blued_api->adapter_le_set_manufacturer_data((bt_manufacturer_data_t*)m_data);
862         if (ret != BT_STATUS_SUCCESS)
863                 BT_ERR("Setting manufacturer data Failed: [%s]",status2string(ret));
864
865         ret = convert_to_oal_status(ret);
866         return ret;
867 }
868
869 oal_status_t adapter_set_white_list(bt_address_t *device_address, int address_type, bool is_add)
870 {
871         int ret;
872         bdstr_t bdstr;
873
874         CHECK_OAL_INITIALIZED();
875         API_TRACE();
876
877         BT_INFO("BT remote device Address: %s", bdt_bd2str(device_address, &bdstr));
878
879         ret = blued_api->adapter_le_set_white_list((bt_bdaddr_t*)device_address, address_type, is_add);
880         if (ret != BT_STATUS_SUCCESS) {
881                 if(is_add)
882                         BT_ERR("Add to White List Failed: [%s]",status2string(ret));
883                 else
884                         BT_ERR("Remove from White List Failed: [%s]",status2string(ret));
885         }
886         ret = convert_to_oal_status(ret);
887         return ret;
888 }
889
890 oal_status_t adapter_ble_set_privacy(int set_privacy)
891 {
892         int res;
893
894         CHECK_OAL_INITIALIZED();
895         API_TRACE();
896
897         res = blued_api->adapter_le_set_privacy(set_privacy);
898         if (res != BT_STATUS_SUCCESS)
899                 BT_ERR("Setting LE Privacy Failed: [%s]", status2string(res));
900         res = convert_to_oal_status(res);
901
902         return res;
903 }
904
905 static void cb_adapter_properties(bt_status_t status,
906                 int num_properties,
907                 bt_property_t *properties)
908 {
909         int i;
910
911         BT_DBG("status: %d, count: %d", status, num_properties);
912
913         print_bt_properties(num_properties, properties);
914
915         if (status != BT_STATUS_SUCCESS) {
916                 if (num_properties == 1) {
917                         BT_ERR("Adapter Prop failed: status: [%s], count: %d, prop: %d",
918                                 status2string(status), num_properties, properties[num_properties-1].type);
919                 } else {
920                         BT_ERR("Adapter Prop failed: status: [%s], count: %d", status2string(status), num_properties);
921                 }
922                 return;
923         }
924
925         for (i = 0; i < num_properties; i++) {
926                 BT_DBG("prop type %d, len %d", properties[i].type, properties[i].len);
927                 switch (properties[i].type) {
928                 case BT_PROPERTY_VERSION: {
929                         g_strlcpy(local_version, properties[i].val, BT_VERSION_STR_LEN_MAX);
930                         local_version[properties[i].len] = '\0';
931
932                         BT_DBG("Version: %s", local_version);
933                         /* Send event to application */
934                         if (num_properties == 1) {
935                                 char *adapter_ver = g_strdup(local_version);
936
937                                 /* Application has requested this property SET/GET hence send EVENT */
938                                 send_event(OAL_EVENT_ADAPTER_PROPERTY_VERSION, adapter_ver, strlen(adapter_ver));
939                         }
940                         break;
941                 }
942                 case BT_PROPERTY_BDNAME: {
943                         g_strlcpy(local_name, properties[i].val, BT_DEVICE_NAME_LENGTH_MAX);
944                         local_name[properties[i].len] = '\0';
945
946                         BT_DBG("Name: %s", local_name);
947                         /* Send event to application */
948                         if (num_properties == 1) {
949                                 char * adap_name = g_strdup(local_name);
950
951                                 /* Application has requested this property SET/GET hence send EVENT */
952                                 send_event(OAL_EVENT_ADAPTER_PROPERTY_NAME, adap_name, strlen(adap_name)+1);
953                         }
954                         break;
955                 }
956                 case BT_PROPERTY_BDADDR: {
957                         bt_bdaddr_t * addr;
958
959                         addr =  properties[i].val;
960                         memcpy(local_address.addr, addr->address, 6);
961                         if (num_properties == 1) {
962                                 /* Application has requested this property SET/GET hence send EVENT */
963                                 send_event(OAL_EVENT_ADAPTER_PROPERTY_ADDRESS,
964                                                 g_memdup(&local_address, sizeof(local_address)),
965                                                 sizeof(local_address));
966                         }
967                         break;
968                 }
969                 case BT_PROPERTY_UUIDS: {
970                         int num_uuid;
971
972                         num_uuid = properties[i].len/sizeof(bt_uuid_t);
973
974                         BT_DBG("num_uuid: %d", num_uuid);
975
976                         /* Send event to application */
977                         if (num_properties == 1) {
978                                 event_adapter_services_t *uuids_event;
979
980                                 uuids_event = g_malloc(sizeof(event_adapter_services_t) + properties[i].len);
981                                 memcpy(uuids_event->service_list, properties[i].val, properties[i].len);
982                                 uuids_event->num = num_uuid;
983
984                                 /* Application has requested this property SET/GET hence send EVENT */
985                                 send_event(OAL_EVENT_ADAPTER_PROPERTY_SERVICES,
986                                                 uuids_event, (sizeof(event_adapter_services_t) + num_uuid * sizeof(bt_uuid_t)));
987                         }
988                         break;
989                 }
990                 case BT_PROPERTY_ADAPTER_SCAN_MODE: {
991                         bt_scan_mode_t cur_mode = *((bt_scan_mode_t *)properties[i].val);
992
993                         BT_INFO("Scan mode (%d)", cur_mode);
994
995                         scan_mode = cur_mode;
996
997                         /* Send event to application */
998                         if (num_properties == 1) {
999                                 oal_event_t event = OAL_EVENT_ADAPTER_MODE_NON_CONNECTABLE;
1000
1001                                 if (BT_SCAN_MODE_CONNECTABLE == cur_mode)
1002                                         event = OAL_EVENT_ADAPTER_MODE_CONNECTABLE;
1003                                 else if (BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE == cur_mode)
1004                                         event = OAL_EVENT_ADAPTER_MODE_DISCOVERABLE;
1005
1006                                 /* Application has requested this property SET/GET hence send EVENT */
1007                                 send_event(event, NULL, 0);
1008                         }
1009                         break;
1010                 }
1011                 case BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT: {
1012                         int timeout;
1013
1014                         timeout = *((uint32_t*)properties[i].val);
1015
1016                         BT_INFO("Discoverability timeout: %d", timeout);
1017                         discoverable_timeout = timeout;
1018
1019                         send_event(OAL_EVENT_ADAPTER_MODE_DISCOVERABLE_TIMEOUT,
1020                                         g_memdup(properties[i].val, sizeof(uint32_t)),
1021                                         sizeof(uint32_t));
1022                         break;
1023                 }
1024                 case BT_PROPERTY_ADAPTER_BONDED_DEVICES: {
1025                         int j;
1026                         int num_bonded;
1027                         bt_bdaddr_t *bonded_addr_list;
1028                         event_device_list_t *event_data;
1029
1030                         num_bonded = properties[i].len/sizeof(bt_bdaddr_t);
1031                         BT_DBG("num_bonded %d", num_bonded);
1032
1033                         if (num_properties > 1) /* No explicit req for this prop, ignore */
1034                                 break;
1035
1036                         bonded_addr_list = properties[i].val;
1037                         event_data = g_malloc(sizeof(event_device_list_t) + num_bonded*sizeof(bt_address_t));
1038                         event_data->num = num_bonded;
1039
1040                         for (j = 0; j < num_bonded; j++)
1041                                 memcpy(event_data->devices[j].addr, bonded_addr_list[j].address, 6);
1042
1043                         send_event(OAL_EVENT_ADAPTER_BONDED_DEVICE_LIST,
1044                                         event_data, (sizeof(event_device_list_t) + num_bonded * sizeof(bt_bdaddr_t)));
1045                         break;
1046                 }
1047                 case BT_PROPERTY_A2DP_ROLE: {
1048                         unsigned int a2dp_role;
1049
1050                         a2dp_role = *((uint32_t*)properties[i].val);
1051
1052                         BT_INFO("A2DP role: %u", a2dp_role);
1053
1054                         send_event(OAL_EVENT_ADAPTER_PROPERTY_A2DP_ROLE,
1055                                         g_memdup(properties[i].val, sizeof(uint32_t)),
1056                                         sizeof(uint32_t));
1057                         break;
1058                 }
1059                 case BT_PROPERTY_LOCAL_LE_FEATURES: {
1060                         event_adapter_le_features_t *le_features;
1061
1062                         le_features = g_malloc(sizeof(event_adapter_le_features_t));
1063
1064                         le_features->max_adv_instance = ((bt_local_le_features_t *)(properties[i].val))->max_adv_instance;
1065                         le_features->rpa_offloading = ((bt_local_le_features_t *)(properties[i].val))->rpa_offload_supported;
1066                         le_features->max_adv_filter = ((bt_local_le_features_t *)(properties[i].val))->max_adv_filter_supported;
1067                         le_features->le_2m_phy_support = ((bt_local_le_features_t *)(properties[i].val))->le_2m_phy_supported;
1068                         le_features->le_coded_phy_support = ((bt_local_le_features_t *)(properties[i].val))->le_2m_phy_supported;
1069
1070                         BT_INFO("LE 2M PHY Support (%d)", le_features->le_2m_phy_support);
1071                         BT_INFO("LE CODED PHY Support (%d)", le_features->le_coded_phy_support);
1072
1073                         send_event(OAL_EVENT_BLE_LOCAL_FEATURES,
1074                                         le_features,
1075                                         sizeof(event_adapter_le_features_t));
1076                         break;
1077                 }
1078                 case BT_PROPERTY_ADAPTER_LE_DISCOVERY_STARTED: {
1079                         BT_INFO("LE Discovery started");
1080                         send_event(OAL_EVENT_BLE_DISCOVERY_STARTED, NULL, 0);
1081                         break;
1082                 }
1083                 case BT_PROPERTY_ADAPTER_LE_DISCOVERY_STOPPED: {
1084                         BT_INFO("LE Discovery stopped");
1085                         send_event(OAL_EVENT_BLE_DISCOVERY_STOPPED, NULL, 0);
1086                         break;
1087                 }
1088                 default:
1089                          BT_WARN("Unhandled property: %d", properties[i].type);
1090                          break;
1091                 }
1092         }
1093 }
1094
1095 static void cb_adapter_profile_connected_devices(uint8_t count, uint8_t addr_list[][6])
1096 {
1097         event_adapter_profile_connected_devices *event_data;
1098         int i;
1099
1100         event_data = g_malloc0(sizeof(event_adapter_profile_connected_devices));
1101         event_data->count = count;
1102         for (i = 0; i < count; i++) {
1103                 memcpy(event_data->addr_list[i].addr, addr_list[i], BT_ADDRESS_BYTES_NUM);
1104         }
1105         send_event(OAL_EVENT_ADAPTER_PROFILE_CONNECTED_DEVICES, event_data, sizeof(event_adapter_profile_connected_devices));
1106 }
1107
1108 static void cb_adapter_discovery_state_changed(bt_discovery_state_t state)
1109 {
1110         oal_event_t event;
1111
1112         event = (BT_DISCOVERY_STARTED == state) ? OAL_EVENT_ADAPTER_INQUIRY_STARTED : OAL_EVENT_ADAPTER_INQUIRY_FINISHED;
1113
1114         BT_DBG("%d", state);
1115         send_event(event, NULL, 0);
1116 }
1117
1118 static void cb_adapter_device_found(int num_properties, bt_property_t *properties)
1119 {
1120         remote_device_t dev_info;
1121         ble_adv_data_t adv_info;
1122         oal_event_t event;
1123         gpointer event_data;
1124         gsize size = 0;
1125         BT_DBG("+");
1126
1127         if (num_properties == 0) {
1128                 BT_ERR("Unexpected, properties count is zero!!");
1129                 return;
1130         }
1131
1132         memset(&dev_info, 0x00, sizeof(remote_device_t));
1133         memset(&adv_info, 0x00, sizeof(ble_adv_data_t));
1134
1135         print_bt_properties(num_properties, properties);
1136         parse_device_properties(num_properties, properties, &dev_info, &adv_info);
1137
1138         BT_INFO("number of properties= [%d] ", num_properties);
1139
1140         if (dev_info.type != DEV_TYPE_BREDR) {
1141                 /* BLE Single or DUAL mode found, so it should have Adv data */
1142                 event_ble_dev_found_t * ble_dev_event = g_new0(event_ble_dev_found_t, 1);
1143
1144                 ble_dev_event->adv_len = adv_info.len;
1145
1146                 if (adv_info.len > 0 && adv_info.adv_data) {
1147                         memcpy(ble_dev_event->adv_data, adv_info.adv_data, adv_info.len);
1148                         ble_dev_event->adv_len = adv_info.len;
1149                 } else
1150                         ble_dev_event->adv_len = 0;
1151
1152                 ble_dev_event->device_info = dev_info;
1153
1154                 event_data = ble_dev_event;
1155                 size = sizeof(event_ble_dev_found_t);
1156                 event = OAL_EVENT_ADAPTER_INQUIRY_RESULT_BLE;
1157         } else {
1158                 /* BREDR device, so No Adv data */
1159                 event_dev_found_t * dev_event = g_new0(event_dev_found_t, 1);
1160
1161                 memcpy(dev_event, &dev_info, sizeof(remote_device_t));
1162                 event_data = dev_event;
1163                 size = sizeof(remote_device_t);
1164                 event = OAL_EVENT_ADAPTER_INQUIRY_RESULT_BREDR_ONLY;
1165         }
1166
1167         send_event(event, event_data, size);
1168
1169         BT_DBG("-");
1170 }
1171
1172 void cb_controller_error_received(uint8_t error_code)
1173 {
1174         uint8_t *event_data;
1175
1176         event_data = g_new0(uint8_t, 1);
1177         *event_data = error_code;
1178
1179         send_event(OAL_EVENT_CONTROLLER_ERROR_RECEIVED,
1180                 (gpointer)event_data, sizeof(uint8_t));
1181 }