gatt client adaptation feature changes bt-api bt-service OAL
[platform/core/connectivity/bluetooth-frwk.git] / bt-service-adaptation / services / adapter / bt-service-core-adapter-le.c
1 /*
2  * Copyright (c) 2016 2017 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Contact: Anupam Roy <anupam.r@samsung.com>
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 <gio/gio.h>
22 #include <glib.h>
23 #include <dlog.h>
24 #include <string.h>
25 #include <vconf.h>
26
27 #include "bt-internal-types.h"
28 #include "bt-service-common.h"
29 #include "bt-service-event.h"
30 #include "bt-service-core-adapter.h"
31 #include "bt-service-core-adapter-le.h"
32 #include "bt-service-event-receiver.h"
33 #include "bt-service-gatt.h"
34 #include "bt-service-util.h"
35 #include "bt-service-core-device.h"
36
37 #include <oal-hardware.h>
38 #include <oal-manager.h>
39 #include <oal-event.h>
40 #include <oal-adapter-mgr.h>
41 #include <oal-device-mgr.h>
42 #include <oal-gatt.h>
43
44 #define BT_UUID_128 16
45 #define BT_ADV_DEFAULT_TIMEOUT 0
46 #define BT_ADV_DEFAULT_TX_POWER 4
47 #define BT_ADV_DEFAULT_CHANNEL_MAP 0
48
49 static const char BASE_UUID_CONVERTED[BT_UUID_128] = {
50         0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
51         0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
52 };
53
54 typedef struct {
55         int adv_handle;
56         char *sender;
57         int data_len;
58         unsigned char data[31];
59         gboolean is_adv;/* Adv or Scan Response: Only applicable if is_data_set_pending is TRUE */
60         gboolean is_data_set_pending; /* Data Set pending or Adv enable request at one time */
61         gboolean is_custom_adv; /* If Adv enable is custom adv enable request */
62         bluetooth_advertising_params_t params; /* Adv Parameters */
63 } bt_pending_adv_data_set_t;
64
65 static guint timer_id = 0;
66
67 static GSList *adv_data_pending_list = NULL;
68 static bt_le_status_t adapter_le_state = BT_LE_DEACTIVATED;
69 static bt_le_discovery_state_t adapter_le_discovery_state = LE_DISCOVERY_STOPPED;
70
71 /******************************************* LE Scan *********************************************/
72 #define BT_LE_SCAN_INTERVAL_MIN 2.5
73 #define BT_LE_SCAN_INTERVAL_MAX 10240
74 #define BT_LE_SCAN_WINDOW_MIN 2.5
75 #define BT_LE_SCAN_WINDOW_MAX 10240
76
77 #define BT_ADV_INTERVAL_SPLIT 0.625
78
79 typedef struct {
80         char *sender;
81         GSList *filter_list;
82         gboolean is_scanning;
83 } bt_adapter_le_scanner_t;
84
85 GSList *scanner_list = NULL;
86 static gboolean is_le_set_scan_parameter = FALSE;
87 static gboolean is_le_scanning = FALSE;
88
89 static int g_gatt_client_id = 0;
90
91 /******************************************* LE Scan *********************************************/
92
93 void _bt_adapter_set_le_status(bt_le_status_t status)
94 {
95         BT_INFO("adapter_le_state changed [%d] -> [%d]", adapter_le_state, status);
96         adapter_le_state = status;
97 }
98
99 bt_le_status_t _bt_adapter_get_le_status(void)
100 {
101         return adapter_le_state;
102 }
103
104
105 /* Internal functions of core adapter service */
106 static void __bt_le_handle_pending_requests(int service_function, void *user_data, unsigned int size)
107 {
108         GSList *l;
109         GArray *out_param;
110         invocation_info_t *req_info;
111         BT_INFO("+");
112
113         /* Get method invocation context */
114         for (l = _bt_get_invocation_list(); l != NULL; l = g_slist_next(l)) {
115                 req_info = l->data;
116                 if (req_info == NULL || req_info->service_function != service_function)
117                         continue;
118
119                 /* Create out param */
120                 out_param = g_array_new(FALSE, FALSE, sizeof(gchar));
121
122                 switch (service_function) {
123                 case BT_ENABLE_ADAPTER_LE:
124                 case BT_DISABLE_ADAPTER_LE: {
125                         gboolean done = TRUE;
126                         g_array_append_vals(out_param, &done, sizeof(gboolean));
127                         break;
128                 }
129                 default:
130                         BT_ERR("Unknown service function[%d]", service_function);
131                 }
132
133                 _bt_service_method_return(req_info->context, out_param, req_info->result);
134                 g_array_free(out_param, TRUE);
135                 /* Now free invocation info for this request*/
136                 _bt_free_info_from_invocation_list(req_info);
137         }
138 }
139
140
141 /* Request return handlings */
142 static gboolean __bt_le_post_set_enabled(gpointer user_data)
143 {
144         BT_INFO("__bt_adapter_post_set_enabled>>");
145
146         /* Add LE enabled post processing codes */
147
148         return FALSE;
149 }
150
151
152 static gboolean __bt_le_post_set_disabled(gpointer user_data)
153 {
154         BT_INFO("_bt_adapter_post_set_disabled>>");
155
156         /* Add LE disabled post processing codes */
157
158         return FALSE;
159 }
160
161 static void __bt_le_update_bt_enabled(void)
162 {
163         int result = BLUETOOTH_ERROR_NONE;
164         BT_ERR("_bt_adapter_update_bt_enabled>>");
165         /* Update Bluetooth Status to notify other modules */
166         if (vconf_set_int(VCONFKEY_BT_LE_STATUS, VCONFKEY_BT_LE_STATUS_ON) != 0)
167                 BT_ERR("Set vconf failed\n");
168
169         /* TODO:Add timer function to handle any further post processing */
170         g_idle_add((GSourceFunc)__bt_le_post_set_enabled, NULL);
171
172         /*Return BT_ADAPTER_ENABLE Method invocation context */
173         __bt_le_handle_pending_requests(BT_ENABLE_ADAPTER_LE, NULL, 0);
174         /*Send BT Enabled event to application */
175         _bt_send_event(BT_LE_ADAPTER_EVENT, BLUETOOTH_EVENT_LE_ENABLED,
176                         g_variant_new("(i)", result));
177 }
178
179 static void __bt_le_update_bt_disabled(void)
180 {
181         int result = BLUETOOTH_ERROR_NONE;
182         BT_INFO("_bt_adapter_update_bt_disabled>>");
183
184         int power_off_status = 0;
185         int ret;
186
187         /* Update the vconf LE status in normal Deactivation case only */
188         ret = vconf_get_int(VCONFKEY_SYSMAN_POWER_OFF_STATUS, &power_off_status);
189         BT_DBG("ret : %d, power_off_status : %d", ret, power_off_status);
190
191         /* Update LE Status to notify other modules */
192         if (vconf_set_int(VCONFKEY_BT_LE_STATUS, VCONFKEY_BT_LE_STATUS_OFF) != 0)
193                 BT_ERR("Set vconf failed");
194
195         /* TODO:Add timer function to handle any further post processing */
196         g_idle_add((GSourceFunc)__bt_le_post_set_disabled, NULL);
197
198         /* Return BT_ADAPTER_DISABLE Method invocation context */
199         __bt_le_handle_pending_requests(BT_DISABLE_ADAPTER_LE, NULL, 0);
200
201         /* Send BT Disabled event to application */
202         _bt_send_event(BT_LE_ADAPTER_EVENT, BLUETOOTH_EVENT_LE_DISABLED,
203                         g_variant_new("(i)", result));
204 }
205
206
207 static void __bt_set_le_scan_status(gboolean mode)
208 {
209         is_le_scanning = mode;
210 }
211
212 gboolean _bt_is_le_scanning(void)
213 {
214         return is_le_scanning;
215 }
216
217 bt_adapter_le_scanner_t* __bt_find_scanner_from_list(const char *sender)
218 {
219         GSList *l;
220         bt_adapter_le_scanner_t *scanner;
221
222         for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
223                 scanner = l->data;
224                 if (g_strcmp0(scanner->sender, sender) == 0)
225                         return scanner;
226         }
227
228         return NULL;
229 }
230
231 /* Event handlers */
232 static void __bt_adapter_le_handle_pending_request_info(int result,
233                 int service_function, void *param, unsigned int size)
234 {
235         GSList *l;
236         GArray *out_param;
237         invocation_info_t *req_info = NULL;
238         BT_DBG("+");
239
240         for (l = _bt_get_invocation_list(); l != NULL; ) {
241                 req_info = l->data;
242                 l = g_slist_next(l);
243                 if (req_info == NULL || req_info->service_function != service_function)
244                         continue;
245
246                 switch (service_function) {
247                 case BT_SET_ADVERTISING:
248                 case BT_SET_CUSTOM_ADVERTISING:
249                 case BT_SET_ADVERTISING_DATA:
250                 case BT_SET_SCAN_RESPONSE_DATA: {
251                         int *saved_handle;
252                         bt_pending_adv_data_set_t *data;
253
254                         BT_DBG("Service function: [%d]", service_function);
255                         ret_if(param == NULL);
256
257                         saved_handle = (int*)req_info->user_data;
258                         data = (bt_pending_adv_data_set_t*)param;
259                         BT_DBG("Current Sender [%s] Current Handle [%d]", data->sender, data->adv_handle);
260
261                         if (!g_strcmp0(req_info->sender, data->sender) && (*saved_handle == data->adv_handle)) {
262                                 BT_DBG("Requester found [%s] ADV Handle [%d]", req_info->sender, *saved_handle);
263                                 out_param = g_array_new(FALSE, FALSE, sizeof(gchar));
264                                 g_array_append_vals(out_param, &data->adv_handle, sizeof(int));
265                                 _bt_service_method_return(req_info->context, out_param, result);
266
267                                 /* Free data */
268                                 g_free(req_info->user_data);
269                                 _bt_free_info_from_invocation_list(req_info);
270                                 g_array_free(out_param, TRUE);
271                         }
272                         break;
273                 }
274                 case BT_START_LE_DISCOVERY: {
275                         bt_adapter_le_scanner_t *scanner;
276
277                         BT_DBG("Request Sender: [%s]", req_info->sender);
278                         if (BLUETOOTH_ERROR_NONE != result) {
279                                 scanner = __bt_find_scanner_from_list(req_info->sender);
280                                 if (scanner && scanner->is_scanning)
281                                         scanner->is_scanning = FALSE;
282                         }
283
284                         out_param = g_array_new(FALSE, FALSE, sizeof(gchar));
285                         _bt_service_method_return(req_info->context, out_param, result);
286                         _bt_free_info_from_invocation_list(req_info);
287                         g_array_free(out_param, TRUE);
288                         break;
289                 }
290                 case BT_STOP_LE_DISCOVERY: {
291                         BT_DBG("Request Sender: [%s]", req_info->sender);
292                         out_param = g_array_new(FALSE, FALSE, sizeof(gchar));
293                         _bt_service_method_return(req_info->context, out_param, result);
294                         _bt_free_info_from_invocation_list(req_info);
295                         g_array_free(out_param, TRUE);
296                         break;
297                 }
298                 default:
299                         break;
300                 }
301         }
302         BT_DBG("-");
303 }
304
305 static void __bt_le_handle_server_instance_registered(event_gatts_register_t *data)
306 {
307         int adv_handle;
308         GSList *l;
309         char uuid_string[BLUETOOTH_UUID_STRING_MAX];
310         bluetooth_advertising_data_t adv;
311         bluetooth_scan_resp_data_t scan_rsp;
312         int result = BLUETOOTH_ERROR_NONE;
313         bt_pending_adv_data_set_t *info = NULL;
314
315         memset(adv.data, 0, sizeof(adv.data));
316         memset(scan_rsp.data, 0, sizeof(scan_rsp.data));
317
318         _bt_uuid_to_string(&(data->server_uuid), uuid_string);
319         BT_INFO("Instance ID is Intialized [%d] UUID initialized [%s]", data->server_inst, uuid_string);
320
321         /* Get sender and adv handle for the server instance */
322         _bt_get_adv_handle_from_instance(data->server_inst, &adv_handle);
323
324                 /* Check if pending Adv Data set or Scan response data set request is pending*/
325                 for (l = adv_data_pending_list; l != NULL; l = l->next) {
326                         info = l->data;
327
328                         if (info && (adv_handle == info->adv_handle)) {
329                                 if (info->is_data_set_pending) {
330                                         BT_INFO("LE Data set request is pending");
331                                         if (info->is_adv) {
332                                                 memcpy(&adv.data, info->data, info->data_len);
333                                                 result = _bt_set_advertising_data(info->sender,
334                                                         info->adv_handle, &adv, info->data_len, FALSE);
335                                                 if (result != BLUETOOTH_ERROR_NONE) {
336                                                         __bt_adapter_le_handle_pending_request_info(result,
337                                                                 BT_SET_ADVERTISING_DATA,
338                                                                 (void*)info, sizeof(bt_pending_adv_data_set_t));
339                                                 }
340                                                 goto data_free;
341                                         } else {
342                                                 memcpy(&scan_rsp.data, info->data, info->data_len);
343                                                 result = _bt_set_scan_response_data(info->sender,
344                                                                 info->adv_handle, &scan_rsp, info->data_len, FALSE);
345                                                 if (result != BLUETOOTH_ERROR_NONE) {
346                                                         __bt_adapter_le_handle_pending_request_info(result,
347                                                                 BT_SET_SCAN_RESPONSE_DATA, (void*)info,
348                                                                 sizeof(bt_pending_adv_data_set_t));
349                                                 }
350                                                 goto data_free;
351                                         }
352                                 } else {
353                                         BT_INFO("LE Enable Adv request is pending");
354                                         if (info->is_custom_adv) {
355                                                 result = _bt_set_custom_advertising(info->sender, info->adv_handle,
356                                                                         TRUE, &info->params, FALSE/*Reserved Slot*/);
357                                                 if (result != BLUETOOTH_ERROR_NONE) {
358                                                         __bt_adapter_le_handle_pending_request_info(result,
359                                                                 BT_SET_CUSTOM_ADVERTISING,
360                                                                 (void*)info, sizeof(bt_pending_adv_data_set_t));
361                                                 }
362                                                 goto data_free;
363                                         } else {
364                                                 result = _bt_set_advertising(info->sender, info->adv_handle,
365                                                                 TRUE, FALSE/*Reserved Slot*/);
366                                                 if (result != BLUETOOTH_ERROR_NONE) {
367                                                         __bt_adapter_le_handle_pending_request_info(result,
368                                                                 BT_SET_ADVERTISING,
369                                                                 (void*)info, sizeof(bt_pending_adv_data_set_t));
370                                                 }
371                                                 goto data_free;
372                                 }
373                         }
374                 }
375         }
376         BT_DBG("-");
377         return;
378
379 data_free:
380         adv_data_pending_list = g_slist_remove(adv_data_pending_list, info);
381         g_free(info->sender);
382         g_free(info);
383 }
384
385 static void __bt_le_multi_advertising_enabled(event_ble_multiadv_status *event)
386 {
387         char *sender;
388         int adv_handle;
389         bt_pending_adv_data_set_t *info = NULL;
390         GVariant *param = NULL;
391         int result = BLUETOOTH_ERROR_NONE;
392
393         sender = _bt_get_sender_and_handle(event->server_inst, &adv_handle);
394         if (sender == NULL) {
395                 BT_ERR("Abnormal!!");
396         } else {
397                 if (event->status != OAL_STATUS_SUCCESS)
398                         result = BLUETOOTH_ERROR_INTERNAL;
399                 info = g_malloc0(sizeof(bt_pending_adv_data_set_t));
400                 info->sender = sender;
401                 info->adv_handle = adv_handle;
402                 __bt_adapter_le_handle_pending_request_info(result,
403                                 BT_SET_CUSTOM_ADVERTISING,
404                                 (void*)info, sizeof(bt_pending_adv_data_set_t));
405                 __bt_adapter_le_handle_pending_request_info(result,
406                                 BT_SET_ADVERTISING,
407                                 (void*)info, sizeof(bt_pending_adv_data_set_t));
408
409                 /* Send event */
410                 param = g_variant_new("(ii)", result, info->adv_handle);
411                 _bt_send_event_to_dest(info->sender, BT_ADAPTER_EVENT, BLUETOOTH_EVENT_ADVERTISING_STARTED, param);
412
413                 /* Free data */
414                 g_free(info->sender);
415                 g_free(info);
416         }
417 }
418
419 static void __bt_le_multi_advertising_disabled(event_ble_multiadv_status *event)
420 {
421         char *sender;
422         int adv_handle;
423         bt_pending_adv_data_set_t *info = NULL;
424         GVariant *param = NULL;
425         int result = BLUETOOTH_ERROR_NONE;
426         sender = _bt_get_sender_and_handle(event->server_inst, &adv_handle);
427
428         if (sender == NULL) {
429                 BT_INFO("Means application containing the adv info is already freed!!");
430         } else {
431                 if (event->status != OAL_STATUS_SUCCESS)
432                         result = BLUETOOTH_ERROR_INTERNAL;
433                 info = g_malloc0(sizeof(bt_pending_adv_data_set_t));
434                 info->sender = sender;
435                 info->adv_handle = adv_handle;
436                 __bt_adapter_le_handle_pending_request_info(result,
437                                 BT_SET_CUSTOM_ADVERTISING,
438                                 (void*)info, sizeof(bt_pending_adv_data_set_t));
439                 __bt_adapter_le_handle_pending_request_info(result,
440                                 BT_SET_ADVERTISING,
441                                 (void*)info, sizeof(bt_pending_adv_data_set_t));
442                 /* Send event */
443                 param = g_variant_new("(ii)", result, info->adv_handle);
444                 _bt_send_event_to_dest(info->sender, BT_ADAPTER_EVENT, BLUETOOTH_EVENT_ADVERTISING_STOPPED, param);
445
446                 /* Free allocated slot or server instance from stack to be used for other advertisng */
447                 result = _bt_unregister_server_instance(sender, adv_handle);
448
449                 /* Free data */
450                 g_free(info->sender);
451                 g_free(info);
452         }
453 }
454
455 static void __bt_le_multi_advertising_set_data(event_ble_multiadv_status *event)
456 {
457         char *sender = NULL;
458         int adv_handle;
459         bt_pending_adv_data_set_t *info = NULL;
460         int result = BLUETOOTH_ERROR_NONE;
461         sender = _bt_get_sender_and_handle(event->server_inst, &adv_handle);
462
463         if (sender == NULL) {
464                 BT_ERR("Abnormal!!");
465         } else {
466                 BT_DBG("Sender [%s], adv handle [%d]",  sender, adv_handle);
467                 if (event->status != OAL_STATUS_SUCCESS)
468                         result = BLUETOOTH_ERROR_INTERNAL;
469
470                 info = g_malloc0(sizeof(bt_pending_adv_data_set_t));
471                 info->sender = sender;
472                 info->adv_handle = adv_handle;
473                 BT_DBG("Sender [%s], adv handle [%d]",  info->sender, info->adv_handle);
474                 __bt_adapter_le_handle_pending_request_info(result,
475                                 BT_SET_SCAN_RESPONSE_DATA,
476                                 (void*)info, sizeof(bt_pending_adv_data_set_t));
477                 __bt_adapter_le_handle_pending_request_info(result,
478                                 BT_SET_ADVERTISING_DATA,
479                                 (void*)info, sizeof(bt_pending_adv_data_set_t));
480                 g_free(info->sender);
481                 g_free(info);
482         }
483 }
484
485 static int __get_advertisement_data(unsigned char *dest, unsigned char *src)
486 {
487         int length = 0;
488         int i = 0;
489
490         while (i <= 31) {
491                 int len = src[i];
492
493                 if ((len == 0) || (31 < (i + len))) {
494                         BT_INFO("length: %d", length);
495                         memcpy(dest, src, length);
496                         break;
497                 }
498
499                 length += (len + 1);
500                 i += (len + 1);
501         }
502
503         return length;
504 }
505
506 static void __bt_le_handle_device_found(event_ble_scan_result_info *scan_result)
507 {
508         int result = BLUETOOTH_ERROR_NONE;
509         bt_adapter_le_scanner_t *scanner = NULL;
510         char address[BT_ADDRESS_STRING_SIZE];
511         int addr_type = 0x01; /* TODO: Need to get correct address type */
512         unsigned char adv_ind_data[31];
513         unsigned char scan_resp_data[31];
514         int adv_ind_len = 0;
515         int scan_resp_len = 0;
516         char *tmp_str = NULL;
517         GVariant *scan_data_param;
518         GVariant *adv_data_param;
519         GVariant *param;
520         GSList *l;
521
522         BT_DBG("+");
523         ret_if(NULL == scan_result);
524
525         _bt_convert_addr_type_to_string(address, scan_result->address.addr);
526
527         memset(adv_ind_data, 0x00, sizeof(adv_ind_data));
528         adv_ind_len = __get_advertisement_data(
529                         adv_ind_data, &(scan_result->adv_data[0]));
530
531         memset(scan_resp_data, 0x00, sizeof(scan_resp_data));
532         scan_resp_len = __get_advertisement_data(
533                         scan_resp_data, &(scan_result->adv_data[adv_ind_len]));
534
535         BT_INFO("Address: %s, RSSI: %d, adv_ind_len: %d, scan_resp_len: %d",
536                         address, scan_result->rssi, adv_ind_len, scan_resp_len);
537
538         tmp_str = _bt_service_convert_hex_to_string(scan_result->adv_data, 62);
539         BT_INFO("Complete Data: [%s]", tmp_str);
540         g_free(tmp_str);
541         tmp_str = NULL;
542
543         tmp_str = _bt_service_convert_hex_to_string(adv_ind_data, adv_ind_len);
544         BT_INFO("Adv Ind Data: [%s]", tmp_str);
545         g_free(tmp_str);
546         tmp_str = NULL;
547
548         tmp_str = _bt_service_convert_hex_to_string(scan_resp_data, scan_resp_len);
549         BT_INFO("Scan resp Data: [%s]", tmp_str);
550         g_free(tmp_str);
551         tmp_str = NULL;
552
553         for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
554                 scanner = l->data;
555                 if (scanner->is_scanning == FALSE)
556                         continue;
557
558                 adv_data_param = g_variant_new_from_data((const GVariantType *)"ay",
559                                 adv_ind_data, adv_ind_len, TRUE, NULL, NULL);
560                 scan_data_param = g_variant_new_from_data((const GVariantType *)"ay",
561                                 scan_resp_data, scan_resp_len, TRUE, NULL, NULL);
562
563                 param = g_variant_new("(isnnn@ayn@ay)",
564                                 result, address,
565                                 addr_type, scan_result->rssi,
566                                 adv_ind_len, adv_data_param,
567                                 scan_resp_len, scan_data_param);
568
569                 _bt_send_event_to_dest(scanner->sender, BT_LE_ADAPTER_EVENT,
570                                 BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND, param);
571         }
572
573         BT_DBG("-");
574 }
575
576 static void __bt_le_state_change_callback(int bt_status)
577 {
578         BT_INFO("__bt_le_state_change_callback: status [%d]", bt_status);
579
580         switch (bt_status) {
581         case BT_LE_DEACTIVATED:
582                 _bt_adapter_set_le_status(bt_status);
583
584                 /* Add Adapter disabled post processing codes */
585                 __bt_le_update_bt_disabled();
586                 break;
587         case BT_LE_ACTIVATED:
588                 _bt_adapter_set_le_status(bt_status);
589
590                 /* Add Adapter enabled post processing codes */
591                 if (timer_id > 0) {
592                         BT_DBG("g_source is removed");
593                         g_source_remove(timer_id);
594                         timer_id = 0;
595                 }
596                 __bt_le_update_bt_enabled();
597                 break;
598         default:
599                 BT_ERR("Incorrect Bluetooth adapter state changed status");
600                 break;
601
602         }
603 }
604
605 static void __bt_le_event_handler(int event_type, gpointer event_data)
606 {
607         BT_INFO("OAL event = 0x%x, \n", event_type);
608
609         switch (event_type) {
610         case OAL_EVENT_BLE_ENABLED: {
611                 __bt_le_state_change_callback(BT_LE_ACTIVATED);
612                 break;
613         }
614         case OAL_EVENT_BLE_DISABLED: {
615                 __bt_le_state_change_callback(BT_LE_DEACTIVATED);
616                 break;
617         }
618         case OAL_EVENT_BLE_SERVER_INSTANCE_INITIALISED: {
619                 BT_INFO("OAL Event: Server Instance Registered");
620                 event_gatts_register_t* event = g_memdup(event_data, sizeof(event_gatts_register_t));
621                 /* GATT Server Registered event is handled in MAIN thread context */
622                 __bt_le_handle_server_instance_registered(event);
623                 break;
624         }
625         case OAL_EVENT_BLE_ADVERTISING_STARTED: {
626                 BT_INFO("OAL Event: Legacy Advertising Enabled: Not Supported!!");
627                 break;
628         }
629         case OAL_EVENT_BLE_ADVERTISING_STOPPED: {
630                 BT_INFO("OAL Event: Legacy Advertising Disabled: Not Supported!!");
631                 break;
632         }
633         case OAL_EVENT_BLE_MULTI_ADVERTISING_ENABLE: {
634                 BT_INFO("OAL Event: Advertising Enabled");
635                 event_ble_multiadv_status* event = (event_ble_multiadv_status*)g_memdup(event_data,
636                                                                 sizeof(event_ble_multiadv_status));
637                 __bt_le_multi_advertising_enabled(event);
638                 break;
639         }
640         case OAL_EVENT_BLE_MULTI_ADVERTISING_DISABLE: {
641                 BT_INFO("OAL Event: Advertising Disabled");
642                 event_ble_multiadv_status* event = (event_ble_multiadv_status*)g_memdup(event_data,
643                                                                 sizeof(event_ble_multiadv_status));
644                 __bt_le_multi_advertising_disabled(event);
645                 break;
646         }
647         case OAL_EVENT_BLE_MULTI_ADVERTISING_SET_INST_DATA: {
648                 BT_INFO("OAL Event: Advertising Data set successfully");
649                 event_ble_multiadv_status* event = (event_ble_multiadv_status*)g_memdup(event_data,
650                                                                 sizeof(event_ble_multiadv_status));
651                 __bt_le_multi_advertising_set_data(event);
652                 break;
653         }
654         case OAL_EVENT_BLE_MULTI_ADVERTISING_UPDATE: {
655                         BT_INFO("OAL Event: Advertising Params updated");
656                 break;
657         }
658         case OAL_EVENT_BLE_DISCOVERY_STARTED: {
659                 __bt_set_le_scan_status(TRUE);
660
661                 __bt_adapter_le_handle_pending_request_info(
662                                 BLUETOOTH_ERROR_NONE,
663                                 BT_START_LE_DISCOVERY, NULL, 0);
664                 break;
665         }
666         case OAL_EVENT_BLE_DISCOVERY_STOPPED: {
667                 if (!_bt_is_le_scanning()) {
668                         BT_ERR("LE discovery start failed");
669                         __bt_adapter_le_handle_pending_request_info(
670                                         BLUETOOTH_ERROR_INTERNAL,
671                                         BT_START_LE_DISCOVERY, NULL, 0);
672                         break;
673                 }
674
675                 __bt_set_le_scan_status(FALSE);
676                 __bt_adapter_le_handle_pending_request_info(
677                                 BLUETOOTH_ERROR_NONE,
678                                 BT_STOP_LE_DISCOVERY, NULL, 0);
679                 break;
680         }
681         case OAL_EVENT_BLE_REMOTE_DEVICE_FOUND: {
682                 event_ble_scan_result_info *scan_result = event_data;
683                 BT_INFO("OAL Event: OAL_EVENT_BLE_REMOTE_DEVICE_FOUND");
684                 __bt_le_handle_device_found(scan_result);
685                 break;
686         }
687         case OAL_EVENT_GATTC_REGISTRATION: {
688                 event_gattc_register_t *gattc_event = event_data;
689                 char uuid_str[BLUETOOTH_UUID_STRING_MAX];
690                 char *default_uuid_string;
691
692                 default_uuid_string = _bt_gatt_get_default_gatt_client_uuid();
693                 _bt_uuid_to_string((service_uuid_t*)&(gattc_event->client_uuid), uuid_str);
694                 BT_INFO("default UUID [%s] current registered uuid [%s]",
695                                 default_uuid_string, uuid_str);
696                 if (g_strcmp0(uuid_str, default_uuid_string)) {
697                         BT_INFO("This is not the default GATT client that is registered");
698
699                         g_free(default_uuid_string);
700                         break;
701                 }
702                 BT_INFO("GATT CLient instance registered is default client: ID [%d]",
703                                 gattc_event->client_if);
704                 g_free(default_uuid_string);
705
706                 g_gatt_client_id = gattc_event->client_if;
707                 break;
708         }
709         default:
710                 break;
711         }
712 }
713
714 int _bt_le_init(void)
715 {
716         BT_DBG("+");
717         /* Register LE event handler */
718         _bt_service_register_event_handler_callback(BT_ADAPTER_LE_MODULE, __bt_le_event_handler);
719         BT_DBG("-");
720         return BLUETOOTH_ERROR_NONE;
721 }
722
723 void _bt_le_deinit(void)
724 {
725         BT_DBG("+");
726         /* Un-register LE event handler */
727         _bt_service_unregister_event_handler_callback(BT_ADAPTER_LE_MODULE);
728         BT_DBG("-");
729 }
730
731 static void __bt_le_update_discovery_status(bt_adapter_discovery_state_t status)
732 {
733         BT_INFO("adapter_discovery_status changed [%d] -> [%d]", adapter_le_discovery_state, status);
734         adapter_le_discovery_state = status;
735 }
736
737 static int __bt_le_state_handle_request(gboolean enable)
738 {
739         int result = BLUETOOTH_ERROR_NONE;
740         BT_DBG("");
741
742         switch (_bt_adapter_get_le_status()) {
743         case BT_LE_ACTIVATING: {
744                 BT_INFO("LE is currently in activating state, state [%d]",
745                                 _bt_adapter_get_le_status());
746                 if (enable) {
747                         return BLUETOOTH_ERROR_IN_PROGRESS;
748                 } else {
749                         if (adapter_le_discovery_state == LE_DISCOVERY_STARTED ||
750                                         adapter_le_discovery_state == LE_DISCOVERY_STARTING) {
751                                 /*TODO Stop Discovery*/
752                                 __bt_le_update_discovery_status(FALSE);
753                         }
754                         result = le_disable();  //change
755                         if (result != OAL_STATUS_SUCCESS) {
756                                 BT_ERR("LE_enable failed: [%d]", result);
757                                 result = BLUETOOTH_ERROR_INTERNAL;
758                                 /*TODO: perform if anything more needs to be done to handle failure */
759                         } else {
760                                 /* TODO: To be handled */
761                                 _bt_adapter_set_le_status(BT_LE_DEACTIVATING);
762                                 result = BLUETOOTH_ERROR_NONE;
763                         }
764                 }
765                 break;
766         }
767         case BT_LE_ACTIVATED: {
768                 BT_INFO("LE is currently in activated state, state [%d]",
769                                 _bt_adapter_get_le_status());
770                 if (enable) {
771                         return BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED;
772                 } else {
773                         if (adapter_le_discovery_state == LE_DISCOVERY_STARTED ||
774                                         adapter_le_discovery_state == LE_DISCOVERY_STARTING) {
775                                 /*TODO Stop Discovery*/
776                                 __bt_le_update_discovery_status(FALSE);
777                         }
778                         result = le_disable();
779                         if (result != OAL_STATUS_SUCCESS) {
780                                 BT_ERR("LE_enable failed: [%d]", result);
781                                 result = BLUETOOTH_ERROR_INTERNAL;
782                                 /*TODO: perform if anything more needs to be done to handle failure */
783                         } else {
784                                 /* TODO: To be handled */
785                                 _bt_adapter_set_le_status(BT_LE_DEACTIVATING);
786                                 result = BLUETOOTH_ERROR_NONE;
787                         }
788                 }
789                 break;
790         }
791         case BT_LE_DEACTIVATING: {
792                 BT_INFO("LE is currently in deactivating state, state [%d]",
793                                 _bt_adapter_get_le_status());
794                 if (!enable) {
795                         return BLUETOOTH_ERROR_IN_PROGRESS;
796
797                 } else {
798                         result = le_enable();
799                         if (result != OAL_STATUS_SUCCESS && result != OAL_STATUS_PENDING) {
800                                 BT_ERR("LE_enable failed: [%d]", result);
801                                 le_disable();
802                                 result = BLUETOOTH_ERROR_INTERNAL;
803                                 /*TODO: perform if anything more needs to be done to handle failure */
804                         } else {
805                                 /* TODO: To be handled */
806                                 _bt_adapter_set_le_status(BT_LE_ACTIVATING);
807                                 result = BLUETOOTH_ERROR_NONE;
808                         }
809                 }
810                 break;
811         }
812         case BT_LE_DEACTIVATED: {
813                 BT_INFO("LE is currently in deactivated state, state [%d]",
814                                 _bt_adapter_get_le_status());
815                 if (!enable) {
816                         return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
817                 } else {
818                         result = le_enable();
819                         if (result != OAL_STATUS_SUCCESS && result != OAL_STATUS_PENDING) {
820                                 BT_ERR("LE_enable failed: [%d]", result);
821                                 le_disable();
822                                 result = BLUETOOTH_ERROR_INTERNAL;
823                                 /*TODO: perform if anything more needs to be done to handle failure */
824                         } else {
825                                 /* TODO: To be handled */
826                                 _bt_adapter_set_le_status(BT_LE_ACTIVATING);
827                                 result = BLUETOOTH_ERROR_NONE;
828                         }
829                 }
830                 break;
831         }
832         default:
833                 BT_ERR("Unknown state: %d", _bt_adapter_get_le_status);
834                 break;
835         }
836
837         if (enable && result == BLUETOOTH_ERROR_NONE) {
838                 /* Adapter enable request is successful, setup event handlers */
839                 _bt_service_register_event_handler_callback(
840                                 BT_ADAPTER_LE_MODULE, __bt_le_event_handler);
841                 _bt_device_state_handle_callback_set_request();
842         }
843         return result;
844 }
845
846 int _bt_enable_adapter_le(void)
847 {
848         return __bt_le_state_handle_request(TRUE);
849 }
850
851 int _bt_disable_adapter_le(void)
852 {
853         return __bt_le_state_handle_request(FALSE);
854 }
855
856
857 static gboolean __bt_is_factory_test_mode(void)
858 {
859         int mode = 0;
860
861         if (vconf_get_bool(VCONFKEY_BT_DUT_MODE, &mode)) {
862                 BT_ERR("Get the DUT Mode fail");
863                 return TRUE;
864         }
865
866         if (mode != FALSE) {
867                 BT_INFO("DUT Test Mode !!");
868                 return TRUE;
869         }
870
871         return FALSE;
872 }
873
874 int _bt_set_advertising(const char *sender, int adv_handle, gboolean enable, gboolean use_reserved_slot)
875 {
876         BT_CHECK_PARAMETER(sender, return);
877         int server_instance;
878         bt_pending_adv_data_set_t *info = NULL;
879         int result = OAL_STATUS_SUCCESS;
880         BT_DBG("+");
881
882         if (__bt_is_factory_test_mode()) {
883                 BT_ERR("Unable to start advertising in factory binary !!");
884                 return BLUETOOTH_ERROR_NOT_SUPPORT;
885         }
886
887         server_instance = _bt_get_allocated_server_instance(sender, adv_handle, use_reserved_slot);
888
889         if (server_instance == -1) {
890                 BT_DBG("No available slot for the current sender and handle combination");
891
892                 if (enable == FALSE) {
893                         BT_ERR("Advertising not even enabled on adv handle [%d] sender [%s]", adv_handle, sender);
894                         return BLUETOOTH_ERROR_NOT_IN_OPERATION;
895                 }
896
897                 server_instance = _bt_is_sender_gatt_server_with_no_adv(sender, adv_handle);
898
899                 if (server_instance == -1) {
900                         /* Internal Logic to register server instance if not initialized, store adv handle for future use */
901                         if (_bt_register_server_instance(sender, adv_handle) != BLUETOOTH_ERROR_NONE)
902                                 return BLUETOOTH_ERROR_INTERNAL;
903                         else {
904                                 /* Allocate a pending structure and mark Adv data set pending */
905                                 info = g_malloc0(sizeof(bt_pending_adv_data_set_t));
906                                 info->adv_handle = adv_handle;
907                                 info->sender = g_strdup(sender);
908                                 info->is_data_set_pending = FALSE;
909                                 adv_data_pending_list = g_slist_append(adv_data_pending_list, info);
910                                 return BLUETOOTH_ERROR_NONE;
911                         }
912                 }
913         }
914
915         if (enable)
916                 result = adapter_ble_multi_adv_enable(server_instance);
917         else
918                 result = adapter_ble_multi_adv_disable(server_instance);
919         if (result != OAL_STATUS_SUCCESS) {
920                 BT_ERR("OAL API adapter_ble_multi_adv_enable Fail %d", result);
921                 return BLUETOOTH_ERROR_INTERNAL;
922         }
923
924         /* Update adv handle in table */
925         _bt_update_adv_handle(sender, adv_handle);
926
927         return BLUETOOTH_ERROR_NONE;
928 }
929
930 int _bt_set_custom_advertising(const char *sender, int adv_handle,
931                 gboolean enable, bluetooth_advertising_params_t *params, gboolean use_reserved_slot)
932 {
933         BT_CHECK_PARAMETER(sender, return);
934         int server_instance;
935         bt_pending_adv_data_set_t *info = NULL;
936         int result = OAL_STATUS_SUCCESS;
937         BT_DBG("+");
938
939         if (__bt_is_factory_test_mode()) {
940                 BT_ERR("Unable to start advertising in factory binary !!");
941                 return BLUETOOTH_ERROR_NOT_SUPPORT;
942         }
943
944         server_instance = _bt_get_allocated_server_instance(sender, adv_handle, use_reserved_slot);
945
946         if (server_instance == -1) {
947                 BT_DBG("No available slot for the current sender and handle combination");
948
949                 if (enable == FALSE) {
950                         BT_ERR("Advertising not even enabled on adv handle [%d] sender [%s]", adv_handle, sender);
951                         return BLUETOOTH_ERROR_NOT_IN_OPERATION;
952                 }
953                 /* Below logic is only valid only when enabling advertising */
954                 server_instance = _bt_is_sender_gatt_server_with_no_adv(sender, adv_handle);
955
956                 if (server_instance == -1) {
957                         /* Internal Logic to register server instance if not initialized, store adv handle for future use */
958                         if (_bt_register_server_instance(sender, adv_handle) != BLUETOOTH_ERROR_NONE)
959                                 return BLUETOOTH_ERROR_INTERNAL;
960                         else {
961                                 /* Allocate a pending structure and mark Adv data set pending */
962                                 info = g_malloc0(sizeof(bt_pending_adv_data_set_t));
963                                 info->adv_handle = adv_handle;
964                                 info->sender = g_strdup(sender);
965                                 info->is_custom_adv = TRUE;
966                                 info->is_data_set_pending = FALSE;
967                                 memcpy(&info->params, params, sizeof(bluetooth_advertising_params_t));
968                                 adv_data_pending_list = g_slist_append(adv_data_pending_list, info);
969                                 return BLUETOOTH_ERROR_NONE;
970                         }
971                 }
972         }
973
974         if (enable) {
975                 /* Set Advertising parameters to Stack */
976                 result = adapter_ble_multi_adv_update(server_instance, params->interval_min, params->interval_max,
977                                 params->type, BT_ADV_DEFAULT_CHANNEL_MAP, BT_ADV_DEFAULT_TX_POWER, BT_ADV_DEFAULT_TIMEOUT);
978                 if (result != OAL_STATUS_SUCCESS) {
979                         BT_ERR("OAL API adapter_ble_multi_adv_update Fail %d", result);
980                         return BLUETOOTH_ERROR_INTERNAL;
981                 }
982                 /* Start Advertising when Adv update event is received */
983                 result = adapter_ble_multi_adv_enable(server_instance);
984                 if (result != OAL_STATUS_SUCCESS) {
985                         BT_ERR("OAL API adapter_ble_multi_adv_enable Fail %d", result);
986                         return BLUETOOTH_ERROR_INTERNAL;
987                 }
988                 /* Update adv handle in table */
989                 _bt_update_adv_handle(sender, adv_handle);
990
991                 return BLUETOOTH_ERROR_NONE;
992         } else
993                 result = adapter_ble_multi_adv_disable(server_instance);
994
995         if (result != OAL_STATUS_SUCCESS) {
996                 BT_ERR("OAL API adapter_ble_multi_adv_disable Fail %d", result);
997                 return BLUETOOTH_ERROR_INTERNAL;
998         }
999         return BLUETOOTH_ERROR_NONE;
1000 }
1001
1002 int _bt_get_advertising_data(char *sender, int adv_handle, bluetooth_advertising_data_t *adv, int *length)
1003 {
1004         BT_CHECK_PARAMETER(adv, return);
1005         BT_CHECK_PARAMETER(length, return);
1006         BT_CHECK_PARAMETER(sender, return);
1007
1008         int server_instance;
1009
1010         server_instance = _bt_get_allocated_server_instance(sender, adv_handle, FALSE);
1011
1012         if (server_instance == -1) {
1013                 BT_DBG("No available slot for the current sender and handle combination");
1014                 return BLUETOOTH_ERROR_INTERNAL;
1015         }
1016
1017         _bt_get_previous_adv_data(adv, length, server_instance);
1018         BT_DBG("ADV Data length [%d] Server Instance [%d] Adv handle [%d]", *length, server_instance, adv_handle);
1019
1020         return BLUETOOTH_ERROR_NONE;
1021 }
1022
1023 int _bt_get_scan_response_data(char *sender, int adv_handle, bluetooth_scan_resp_data_t *response, int *length)
1024 {
1025         BT_CHECK_PARAMETER(response, return);
1026         BT_CHECK_PARAMETER(length, return);
1027         BT_CHECK_PARAMETER(sender, return);
1028
1029         int server_instance;
1030
1031         server_instance = _bt_get_allocated_server_instance(sender, adv_handle, FALSE);
1032
1033         if (server_instance == -1) {
1034                 BT_DBG("No available slot for the current sender and handle combination");
1035                 return BLUETOOTH_ERROR_INTERNAL;
1036         }
1037
1038         _bt_get_previous_scan_rsp_data(response, length, server_instance);
1039         BT_DBG("SCAN RSP Data length [%d] Server Instance [%d] Adv handle [%d]", *length, server_instance, adv_handle);
1040
1041         return BLUETOOTH_ERROR_NONE;
1042 }
1043
1044 static int __bt_set_multi_adv_param(oal_ble_multi_adv_param_setup_t *adv_setup,
1045                 bluetooth_advertising_data_t *adv_data, int length)
1046 {
1047         unsigned char *ptr;
1048         int num_uuids;
1049
1050         BT_INFO("+");
1051         retv_if(NULL == adv_data, BLUETOOTH_ERROR_INVALID_PARAM);
1052         retv_if(NULL == adv_setup, BLUETOOTH_ERROR_INVALID_PARAM);
1053
1054         for (ptr = adv_data->data; NULL != ptr && length > 0;) {
1055                 int len = ptr[0];
1056                 int type = ptr[1];
1057
1058                 BT_INFO("len: %d, type: %x", len, type);
1059
1060                 switch (type) {
1061                 case 0xFF: /* Manufacturer Data */
1062                         adv_setup->manufacturer_data = g_malloc0(sizeof(char) * (len - 1));
1063                         memcpy(adv_setup->manufacturer_data, (ptr + 2), (len - 1));
1064                         adv_setup->manufacturer_data_len = len - 1;
1065                         break;
1066                 case 0x15: /* 128 bit Solicit UUID */
1067                         adv_setup->solicit_uuid = g_malloc0(sizeof(char) * (len - 1));
1068                         memcpy((adv_setup->solicit_uuid), (ptr + 2), (len - 1));
1069                         adv_setup->solicit_uuid_len = len;
1070                         break;
1071                 case 0x06: /* 128 bit Service UUID */
1072                         adv_setup->service_uuid = g_malloc0(sizeof(char) * (len - 1));
1073                         memcpy((adv_setup->service_uuid), (ptr + 2), (len - 1));
1074                         adv_setup->service_uuid_len = len;
1075                         break;
1076                         case 0x14: {  /* 16 bit Solicit UUID */
1077                         int c;
1078                         int k;
1079                         num_uuids = (len -1)/2;
1080                         adv_setup->solicit_uuid = g_malloc0(sizeof(char) * 16 * num_uuids);
1081                         char *tmp = adv_setup->solicit_uuid;
1082                         adv_setup->solicit_uuid_len = 0;
1083
1084                         for (c = 1; c <= num_uuids; c++) {
1085                                 adv_setup->solicit_uuid_len += 16;;
1086                                 memcpy(tmp, BASE_UUID_CONVERTED, BT_UUID_128);
1087                                 memcpy(tmp+12, &ptr[c*2/* Byte Length*/], 2/* Byte Length */);
1088
1089                                 if (c < num_uuids)
1090                                         tmp += 16;
1091                         }
1092                         /* DEBUG: Test*/
1093                         for (k = 0; k < 16 * num_uuids; k++)
1094                                 BT_DBG("%x", adv_setup->solicit_uuid[k]);
1095                         break;
1096                 }
1097                 case 0x02: { /* 16 bit Service UUID */
1098                         int c;
1099                         int k;
1100                         num_uuids = (len -1)/2;
1101                         adv_setup->service_uuid = g_malloc0(sizeof(char) * 16 * num_uuids);
1102                         char *tmp = adv_setup->service_uuid;
1103                         adv_setup->service_uuid_len = 0;
1104
1105                         for (c = 1; c <= num_uuids; c++) {
1106                                 adv_setup->service_uuid_len += 16;;
1107                                 memcpy(tmp, BASE_UUID_CONVERTED, BT_UUID_128);
1108                                 memcpy(tmp+12, &ptr[c*2/* Byte Length */], 2/* Byte Length */);
1109
1110                                 if (c < num_uuids)
1111                                         tmp += 16;
1112                         }
1113                         /* DEBUG: Test*/
1114                         for (k = 0; k < 16 * num_uuids; k++)
1115                                 BT_DBG("%x", adv_setup->service_uuid[k]);
1116                         break;
1117                 }
1118                 case 0x16: { /* Service Data */
1119                         adv_setup->service_data = g_malloc0(sizeof(char) * (len - 1));
1120                         memcpy(adv_setup->service_data, (ptr + 2), (len - 1));
1121                         adv_setup->service_data_len = len - 1;
1122                         break;
1123                 }
1124                 case 0x21: {
1125                         BT_INFO("128 Bit Service Data Not Supported!!");
1126                         break;
1127                 }
1128                 case 0x0A: {
1129                         adv_setup->include_txpower = 1;
1130                         break;
1131                 }
1132                 case 0x09:
1133                 case 0x08: {
1134                         adv_setup->include_name = 1;
1135                         break;
1136                 }
1137                 case 0x19: {
1138                         memcpy(&adv_setup->appearance, (ptr + 2), (len - 1));
1139                         break;
1140                 }
1141                 default:
1142                         BT_ERR("Unknown type: %x", type);
1143                         break;
1144         }
1145
1146                 length -= len + 1;
1147                 ptr += len + 1;
1148         }
1149
1150         BT_INFO("-");
1151         return BLUETOOTH_ERROR_NONE;
1152 }
1153
1154 int _bt_set_advertising_data(const char *sender, int adv_handle,
1155                 bluetooth_advertising_data_t *adv, int length, gboolean use_reserved_slot)
1156 {
1157         BT_CHECK_PARAMETER(adv, return);
1158         BT_CHECK_PARAMETER(sender, return);
1159         bt_pending_adv_data_set_t *info = NULL;
1160         int server_instance;
1161         bluetooth_advertising_data_t adv_old;
1162         int adv_data_len;
1163         char *old_mdata = NULL;
1164         int old_len = 0;
1165         GVariant *ad_data, *param = NULL;
1166         oal_ble_multi_adv_param_setup_t adv_setup;
1167         int result = OAL_STATUS_SUCCESS;
1168         BT_DBG("+");
1169
1170         if (length > BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX)
1171                 return BLUETOOTH_ERROR_INVALID_PARAM;
1172
1173         if (__bt_is_factory_test_mode()) {
1174                 BT_ERR("Unable to set advertising data in factory binary !!");
1175                 return BLUETOOTH_ERROR_NOT_SUPPORT;
1176         }
1177
1178         server_instance = _bt_get_allocated_server_instance(sender, adv_handle, use_reserved_slot);
1179
1180         if (server_instance == -1) {
1181                 BT_DBG("No available slot for the current sender and handle combination");
1182
1183                 server_instance = _bt_is_sender_gatt_server_with_no_adv(sender, adv_handle);
1184
1185                 if (server_instance == -1) {
1186                         /* Internal Logic to register server instance if not initialized, store adv handle for future use */
1187                         if (_bt_register_server_instance(sender, adv_handle) != BLUETOOTH_ERROR_NONE)
1188                                 return BLUETOOTH_ERROR_INTERNAL;
1189                         else {
1190                                 /* Allocate a pending structure and mark Adv data set pending */
1191                                 info = g_malloc0(sizeof(bt_pending_adv_data_set_t));
1192                                 info->adv_handle = adv_handle;
1193                                 info->sender = g_strdup(sender);
1194                                 info->data_len = length;
1195                                 info->is_adv = TRUE;
1196                                 info->is_data_set_pending = TRUE;
1197                                 memcpy(&info->data, &(adv->data[0]), length);
1198                                 adv_data_pending_list = g_slist_append(adv_data_pending_list, info);
1199                                 return BLUETOOTH_ERROR_NONE;
1200                         }
1201                 }
1202         }
1203
1204         /* Server Instance is already allocated, set Adv data to stack */
1205         /* First check if adv data is already present for slot server_instance*/
1206         memset(&adv_old.data, 0, sizeof(adv_old.data));
1207         _bt_get_previous_adv_data(&adv_old, &adv_data_len, server_instance);
1208
1209         /* Send Data to stack */
1210         memset(&adv_setup, 0, sizeof(oal_ble_multi_adv_param_setup_t));
1211
1212         if (BLUETOOTH_ERROR_NONE !=
1213                         __bt_set_multi_adv_param(&adv_setup, adv, length)) {
1214                 if (adv_setup.manufacturer_data)
1215                         g_free(adv_setup.manufacturer_data);
1216                 if (adv_setup.service_uuid)
1217                         g_free(adv_setup.service_uuid);
1218                 if (adv_setup.service_data)
1219                         g_free(adv_setup.service_data);
1220                 return BLUETOOTH_ERROR_INTERNAL;
1221         }
1222         /* Set Scan response false */
1223         adv_setup.set_scan_rsp = FALSE;
1224
1225         /* Set Server instance */
1226         adv_setup.server_if = server_instance;
1227
1228         /* Set Server instance[Product Requirement] */
1229         adv_setup.tx_power = 4;
1230
1231         BT_DBG("####Service UUID len [%d], service data len [%d] Solicit UUID len [%d]",
1232                                 adv_setup.solicit_uuid_len, adv_setup.service_uuid_len, adv_setup.service_data_len);
1233         result = adapter_ble_multi_adv_set_inst_data(server_instance, &adv_setup);
1234         if (result != OAL_STATUS_SUCCESS) {
1235                 BT_ERR("OAL API adapter_ble_multi_adv_set_inst_data Fail %d", result);
1236                 /* Free the data */
1237                 if (adv_setup.manufacturer_data)
1238                         g_free(adv_setup.manufacturer_data);
1239                 if (adv_setup.service_data)
1240                         g_free(adv_setup.service_data);
1241                 if (adv_setup.service_uuid)
1242                         g_free(adv_setup.service_uuid);
1243                 return BLUETOOTH_ERROR_INTERNAL;
1244         }
1245
1246         /* Data sent to Stack successfully, send manuf data changed event if applicable */
1247         if (adv_setup.manufacturer_data_len != 0) {
1248                 if (adv_data_len > 0) {
1249                         _bt_get_ad_data_by_type((char *)adv_old.data, adv_data_len, 0xff,
1250                                         &old_mdata, &old_len);
1251                 }
1252
1253                 if (old_len != adv_setup.manufacturer_data_len ||
1254                                 (old_mdata && adv_setup.manufacturer_data &&
1255                                  memcmp(old_mdata, adv_setup.manufacturer_data, adv_setup.manufacturer_data_len))) {
1256
1257                         ad_data = g_variant_new_from_data((const GVariantType *)"ay",
1258                                         adv_setup.manufacturer_data, adv_setup.manufacturer_data_len, TRUE, NULL, NULL);
1259                         param = g_variant_new("(@ay)", ad_data);
1260                         _bt_send_event(BT_ADAPTER_EVENT,
1261                                         BLUETOOTH_EVENT_ADVERTISING_MANUFACTURER_DATA_CHANGED,
1262                                         param);
1263                 }
1264         }
1265
1266         /* Time to update new ADV data completely in Table */
1267         _bt_set_new_adv_data(adv, length, server_instance);
1268
1269         /* Free the data */
1270         if (adv_setup.manufacturer_data)
1271                 g_free(adv_setup.manufacturer_data);
1272         if (adv_setup.service_data)
1273                 g_free(adv_setup.service_data);
1274         if (adv_setup.service_uuid)
1275                 g_free(adv_setup.service_uuid);
1276
1277         /* Update adv handle in table */
1278         _bt_update_adv_handle(sender, adv_handle);
1279
1280         return BLUETOOTH_ERROR_NONE;
1281 }
1282
1283 int _bt_set_scan_response_data(const char *sender, int adv_handle,
1284                                 bluetooth_scan_resp_data_t *response, int length, gboolean use_reserved_slot)
1285 {
1286         BT_CHECK_PARAMETER(response, return);
1287         BT_CHECK_PARAMETER(sender, return);
1288         bt_pending_adv_data_set_t *info = NULL;
1289         bluetooth_scan_resp_data_t scan_rsp_old;
1290         int scan_rsp_data_len;
1291         GVariant *ad_data, *param = NULL;
1292         oal_ble_multi_adv_param_setup_t adv_setup;
1293         char *old_mdata = NULL;
1294         int old_len = 0;
1295         int server_instance;
1296         int result = OAL_STATUS_SUCCESS;
1297         BT_DBG("+");
1298
1299         if (length > BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX)
1300                 return BLUETOOTH_ERROR_INVALID_PARAM;
1301
1302         if (__bt_is_factory_test_mode()) {
1303                 BT_ERR("Unable to set Scan Response data in factory binary !!");
1304                 return BLUETOOTH_ERROR_NOT_SUPPORT;
1305         }
1306
1307         server_instance = _bt_get_allocated_server_instance(sender, adv_handle, use_reserved_slot);
1308         if (server_instance == -1) {
1309                 BT_DBG("No available slot for the current sender and handle combination");
1310
1311                 server_instance = _bt_is_sender_gatt_server_with_no_adv(sender, adv_handle);
1312
1313                 if (server_instance == -1) {
1314                         /* Internal Logic to register server instance if not initialized */
1315                         if (_bt_register_server_instance(sender, adv_handle) != BLUETOOTH_ERROR_NONE)
1316                                 return BLUETOOTH_ERROR_INTERNAL;
1317                         else {
1318                                 /* Allocate a pending structure and mark Adv data set pending */
1319                                 info = g_malloc0(sizeof(bt_pending_adv_data_set_t));
1320                                 info->adv_handle = adv_handle;
1321                                 info->sender = g_strdup(sender);
1322                                 info->data_len = length;
1323                                 info->is_adv = FALSE;
1324                                 info->is_data_set_pending = TRUE;
1325                                 memcpy(&info->data, &(response->data[0]), length);
1326                                 adv_data_pending_list = g_slist_append(adv_data_pending_list, info);
1327                                 return BLUETOOTH_ERROR_NONE;
1328                         }
1329                 }
1330         }
1331
1332         /* Server Instance is already allocated, set Adv data to stack */
1333         /* First check if adv data is already present for slot server_instance*/
1334         memset(&scan_rsp_old.data, 0, sizeof(scan_rsp_old.data));
1335         _bt_get_previous_scan_rsp_data(&scan_rsp_old, &scan_rsp_data_len, server_instance);
1336
1337         /* Send Data to stack */
1338         memset(&adv_setup, 0, sizeof(oal_ble_multi_adv_param_setup_t));
1339
1340         if (BLUETOOTH_ERROR_NONE !=
1341                         __bt_set_multi_adv_param(&adv_setup, (bluetooth_advertising_data_t*)response, length)) {
1342                 if (adv_setup.manufacturer_data)
1343                         g_free(adv_setup.manufacturer_data);
1344                 if (adv_setup.service_uuid)
1345                         g_free(adv_setup.service_uuid);
1346                 if (adv_setup.service_data)
1347                         g_free(adv_setup.service_data);
1348                 return BLUETOOTH_ERROR_INTERNAL;
1349         }
1350
1351         /* Set Scan response to TRUE */
1352         adv_setup.set_scan_rsp = TRUE;
1353
1354         /* Set Server instance */
1355         adv_setup.server_if = server_instance;
1356
1357         /* Set Server instance[Product Requirement] */
1358         adv_setup.tx_power = 4;
1359
1360         result = adapter_ble_multi_adv_set_inst_data(server_instance, &adv_setup);
1361         if (result != OAL_STATUS_SUCCESS) {
1362                 BT_ERR("OAL API adapter_ble_multi_adv_set_inst_data Fail %d", result);
1363                 /* Free the data */
1364                 if (adv_setup.manufacturer_data)
1365                         g_free(adv_setup.manufacturer_data);
1366                 if (adv_setup.service_data)
1367                         g_free(adv_setup.service_data);
1368                 if (adv_setup.service_uuid)
1369                         g_free(adv_setup.service_uuid);
1370                 return BLUETOOTH_ERROR_INTERNAL;
1371         }
1372
1373         /* Data sent to Stack successfully, send manuf data changed event if applicable */
1374         if (adv_setup.manufacturer_data_len != 0) {
1375                 if (scan_rsp_data_len > 0) {
1376                         _bt_get_ad_data_by_type((char *)scan_rsp_old.data, scan_rsp_data_len, 0xff,
1377                                         &old_mdata, &old_len);
1378                 }
1379
1380                 if (old_len != adv_setup.manufacturer_data_len ||
1381                                 (old_mdata && adv_setup.manufacturer_data &&
1382                                  memcmp(old_mdata, adv_setup.manufacturer_data, adv_setup.manufacturer_data_len))) {
1383
1384                         ad_data = g_variant_new_from_data((const GVariantType *)"ay",
1385                                         adv_setup.manufacturer_data, adv_setup.manufacturer_data_len, TRUE, NULL, NULL);
1386                         param = g_variant_new("(@ay)", ad_data);
1387                         _bt_send_event(BT_ADAPTER_EVENT,
1388                                         BLUETOOTH_EVENT_ADVERTISING_MANUFACTURER_DATA_CHANGED,
1389                                         param);
1390                 }
1391         }
1392
1393         /* Time to update new Scan Response data completely in Table */
1394         _bt_set_new_scan_rsp_data(response, length, server_instance);
1395
1396         /* Free the data */
1397         if (adv_setup.manufacturer_data)
1398                 g_free(adv_setup.manufacturer_data);
1399         if (adv_setup.service_data)
1400                 g_free(adv_setup.service_data);
1401         if (adv_setup.service_uuid)
1402                 g_free(adv_setup.service_uuid);
1403
1404         /* Update adv handle in table */
1405         _bt_update_adv_handle(sender, adv_handle);
1406         return BLUETOOTH_ERROR_NONE;
1407 }
1408
1409 /*************************************** LE Scan APIs *********************************************/
1410 int _bt_set_scan_parameters(bluetooth_le_scan_params_t *params)
1411 {
1412         int itv = 0;
1413         int win = 0;
1414         int ret;
1415
1416         BT_CHECK_PARAMETER(params, return);
1417
1418         if (_bt_adapter_get_status() != BT_ACTIVATED &&
1419                         _bt_adapter_get_le_status() != BT_LE_ACTIVATED) {
1420                 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
1421         }
1422
1423         if (params->interval < BT_LE_SCAN_INTERVAL_MIN ||
1424                         params->interval > BT_LE_SCAN_INTERVAL_MAX)
1425                 return BLUETOOTH_ERROR_INVALID_PARAM;
1426
1427         if (params->window < BT_LE_SCAN_WINDOW_MIN ||
1428                         params->window > BT_LE_SCAN_WINDOW_MAX)
1429                 return BLUETOOTH_ERROR_INVALID_PARAM;
1430
1431         if (params->window > params->interval)
1432                 return BLUETOOTH_ERROR_INVALID_PARAM;
1433
1434         itv = params->interval / BT_ADV_INTERVAL_SPLIT;
1435         win = params->window / BT_ADV_INTERVAL_SPLIT;
1436
1437         ret = gattc_set_le_scan_param(params->type, itv, win);
1438         if (OAL_STATUS_SUCCESS != ret) {
1439                 BT_ERR("gattc_set_le_scan_param failed");
1440                 return BLUETOOTH_ERROR_INTERNAL;
1441         }
1442
1443         is_le_set_scan_parameter = TRUE;
1444         BT_INFO("Set scan parameters");
1445
1446         return BLUETOOTH_ERROR_NONE;
1447 }
1448
1449 gboolean __send_le_scan_reply(gpointer data)
1450 {
1451         int value = (int)data;
1452
1453         if (0 == value) {
1454                 BT_DBG("Send reply to BT_STOP_LE_DISCOVERY");
1455                 __bt_adapter_le_handle_pending_request_info(
1456                                 BLUETOOTH_ERROR_NONE,
1457                                 BT_STOP_LE_DISCOVERY, NULL, 0);
1458         } else {
1459                 BT_DBG("Send reply to BT_START_LE_DISCOVERY");
1460                 __bt_adapter_le_handle_pending_request_info(
1461                                 BLUETOOTH_ERROR_NONE,
1462                                 BT_START_LE_DISCOVERY, NULL, 0);
1463         }
1464
1465         return FALSE;
1466 }
1467
1468 int _bt_start_le_scan(const char *sender)
1469 {
1470         bt_adapter_le_scanner_t *scanner;
1471         int ret;
1472
1473         scanner = __bt_find_scanner_from_list(sender);
1474         if (!scanner) {
1475                 scanner = g_malloc0(sizeof(bt_adapter_le_scanner_t));
1476                 retv_if(scanner == NULL, BLUETOOTH_ERROR_INTERNAL);
1477
1478                 scanner->sender = g_strdup(sender);
1479                 scanner_list = g_slist_append(scanner_list, scanner);
1480         }
1481
1482         if (scanner->is_scanning) {
1483                 BT_ERR("BT is already in LE scanning");
1484                 return BLUETOOTH_ERROR_IN_PROGRESS;
1485         }
1486
1487         if (_bt_is_le_scanning()) {
1488                 int value = 1;
1489
1490                 BT_INFO("LE Full Scan is already on progress");
1491                 g_idle_add(__send_le_scan_reply, (void *)value);
1492                 goto done;
1493         }
1494
1495         if (is_le_set_scan_parameter == FALSE) {
1496                 bluetooth_le_scan_params_t scan_params;
1497
1498                 /* Set default scan parameter same with BT_ADAPTER_LE_SCAN_MODE_LOW_ENERGY */
1499                 scan_params.type = 0x01;
1500                 scan_params.interval = 5000;
1501                 scan_params.window = 500;
1502                 _bt_set_scan_parameters(&scan_params);
1503         }
1504
1505         BT_INFO("Start LE Full Scan");
1506         ret = gattc_start_le_discovery(g_gatt_client_id);
1507
1508         if (OAL_STATUS_SUCCESS != ret) {
1509                 BT_ERR("gattc_start_le_discovery failed");
1510                 return BLUETOOTH_ERROR_INTERNAL;
1511         }
1512
1513 done:
1514         scanner->is_scanning = TRUE;
1515         return BLUETOOTH_ERROR_NONE;
1516 }
1517
1518 int _bt_stop_le_scan(const char *sender)
1519 {
1520         bt_adapter_le_scanner_t *scanner;
1521         gboolean next_scanning = FALSE;
1522         GSList *l;
1523         int ret;
1524
1525         scanner = __bt_find_scanner_from_list(sender);
1526         if (scanner == NULL || scanner->is_scanning == FALSE)
1527                 return BLUETOOTH_ERROR_NOT_IN_OPERATION;
1528
1529         scanner->is_scanning = FALSE;
1530
1531         for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
1532                 scanner = l->data;
1533                 if (scanner->is_scanning == TRUE)
1534                         next_scanning = TRUE;
1535         }
1536
1537         if (next_scanning == TRUE) {
1538                 int value = 0;
1539
1540                 g_idle_add(__send_le_scan_reply, (void *)value);
1541                 return BLUETOOTH_ERROR_NONE;
1542         } else {
1543                 BT_INFO("Just stop LE scan");
1544         }
1545
1546         ret = gattc_stop_le_discovery(g_gatt_client_id);
1547
1548         if (OAL_STATUS_SUCCESS != ret) {
1549                 BT_ERR("gattc_start_le_discovery failed");
1550                 return BLUETOOTH_ERROR_INTERNAL;
1551         }
1552
1553         is_le_set_scan_parameter = FALSE;
1554         return BLUETOOTH_ERROR_NONE;
1555 }
1556
1557 void _bt_check_le_scanner_app_termination(const char *sender)
1558 {
1559         bt_adapter_le_scanner_t *scanner;
1560
1561         scanner = __bt_find_scanner_from_list(sender);
1562         if (!scanner)
1563                 return;
1564
1565         if (scanner->is_scanning)
1566                 _bt_stop_le_scan(sender);
1567
1568         scanner_list = g_slist_remove(scanner_list, scanner);
1569         g_free(scanner->sender);
1570         g_free(scanner);
1571 }
1572
1573 int _bt_service_le_init(void)
1574 {
1575         le_init();
1576
1577         return BLUETOOTH_ERROR_NONE;
1578 }
1579
1580 void _bt_service_le_deinit(void)
1581 {
1582         le_deinit();
1583 }
1584
1585 int _bt_is_advertising(void)
1586 {
1587         int ret = is_advertising();
1588
1589         if (ret == BLUETOOTH_ERROR_NONE)
1590                 return TRUE;
1591         else
1592                 return FALSE;
1593 }
1594
1595 /*************************************** LE Scan APIs *********************************************/