Apply tizen 3.0 based product patchsets
[platform/core/connectivity/bluetooth-frwk.git] / bt-service / bt-service-adapter-le.c
old mode 100755 (executable)
new mode 100644 (file)
index 02ad31b..d6567b1
  */
 
 #include <stdio.h>
-#include <dbus/dbus.h>
 #include <gio/gio.h>
 #include <glib.h>
 #include <dlog.h>
 #include <string.h>
 #include <vconf.h>
-#if !defined(LIBNOTIFY_SUPPORT) && !defined(LIBNOTIFICATION_SUPPORT)
 #include <syspopup_caller.h>
-#endif
-#include <aul.h>
 
 #include "bt-internal-types.h"
 #include "bt-service-common.h"
@@ -43,6 +39,7 @@
 #define BT_ADV_FILTER_POLICY_DEFAULT   0x00
 #define BT_ADV_TYPE_DEFAULT    0x00
 #define BT_ADV_FILTER_POLICY_ALLOW_SCAN_CONN_WL_ONLY   0x03
+#define BT_ADV_MULTI_MAX   16
 
 typedef struct {
        int adv_inst_max;
@@ -54,6 +51,7 @@ typedef struct {
        char *sender;
        int adv_handle;
        gboolean is_advertising;
+       guint hold_timer_id;
 } bt_adapter_le_adv_slot_t;
 
 typedef struct {
@@ -81,87 +79,7 @@ static gboolean is_le_scanning = FALSE;
 static gboolean scan_filter_enabled = FALSE;
 static bt_le_scan_type_t le_scan_type = BT_LE_PASSIVE_SCAN;
 
-static GSList *gatt_client_senders = NULL;
-
-
-gboolean _bt_is_set_scan_parameter(void)
-{
-       return is_le_set_scan_parameter;
-}
-
-void _bt_init_gatt_client_senders(void)
-{
-       _bt_clear_request_list();
-}
-
-int _bt_insert_gatt_client_sender(char *sender)
-{
-       char *info;
-
-       retv_if(sender == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
-
-       info = g_strdup(sender);
-       retv_if(info == NULL, BLUETOOTH_ERROR_MEMORY_ALLOCATION);
-
-       gatt_client_senders = g_slist_append(gatt_client_senders, info);
-
-       BT_DBG("insert sender: %s", sender);
-
-       return BLUETOOTH_ERROR_NONE;
-}
-
-int _bt_delete_gatt_client_sender(char *sender)
-{
-       GSList *l;
-       char *info;
-
-       BT_DBG("remove sender: %s", sender);
-
-       for (l = gatt_client_senders; l != NULL; l = g_slist_next(l)) {
-               info = l->data;
-               if (info == NULL)
-                       continue;
-
-               if (g_strcmp0(info, sender) == 0) {
-                       BT_DBG("remove info");
-                       gatt_client_senders = g_slist_remove(gatt_client_senders, info);
-                       g_free(info);
-                       return BLUETOOTH_ERROR_NONE;
-               }
-       }
-
-       return BLUETOOTH_ERROR_NOT_FOUND;
-}
-
-void _bt_clear_gatt_client_senders(void)
-{
-       if (gatt_client_senders) {
-               g_slist_foreach(gatt_client_senders, (GFunc)g_free, NULL);
-               g_slist_free(gatt_client_senders);
-               gatt_client_senders = NULL;
-       }
-}
-
-static void __bt_send_foreach_event(gpointer data, gpointer user_data)
-{
-       char *sender = data;
-       GVariant *param = user_data;
-
-       _bt_send_event_to_dest(sender, BT_DEVICE_EVENT,BLUETOOTH_EVENT_GATT_CHAR_VAL_CHANGED,
-                                       param);
-}
-
-void _bt_send_char_value_changed_event(void *param)
-{
-#if 0
-       g_slist_foreach(gatt_client_senders, __bt_send_foreach_event,
-                                       (gpointer)param);
-#else
-       _bt_send_event(BT_DEVICE_EVENT, BLUETOOTH_EVENT_GATT_CHAR_VAL_CHANGED, param);
-#endif
-}
-
-void __bt_free_le_adv_slot(void)
+static void __bt_free_le_adv_slot(void)
 {
        int i;
 
@@ -176,33 +94,33 @@ void __bt_free_le_adv_slot(void)
        le_adv_slot = NULL;
 }
 
-int _bt_service_adapter_le_init(void)
-{
-       le_adv_slot = g_malloc0(sizeof(bt_adapter_le_adv_slot_t) * le_feature_info.adv_inst_max);
-
-       return BLUETOOTH_ERROR_NONE;
-}
-
-void _bt_service_adapter_le_deinit(void)
-{
-       __bt_free_le_adv_slot();
-}
-
 gboolean _bt_update_le_feature_support(const char *item, const char *value)
 {
-       if (item== NULL || value == NULL)
+       if (item == NULL || value == NULL)
                return FALSE;
 
+       if (!le_adv_slot)
+               _bt_service_adapter_le_init();
+
        if (g_strcmp0(item, "adv_inst_max") == 0) {
-               if (atoi(value) != le_feature_info.adv_inst_max) {
+               int slot_num;
+
+               slot_num = atoi(value);
+               retv_if(slot_num < 0, FALSE);
+               retv_if(slot_num > BT_ADV_MULTI_MAX, FALSE);
+
+               if (slot_num != le_feature_info.adv_inst_max) {
                        __bt_free_le_adv_slot();
-                       le_feature_info.adv_inst_max = atoi(value);
+                       le_feature_info.adv_inst_max = slot_num;
+                       BT_INFO("Advertising instance max : %d", le_feature_info.adv_inst_max);
                        le_adv_slot = g_malloc0(sizeof(bt_adapter_le_adv_slot_t) * le_feature_info.adv_inst_max);
                }
        } else if (g_strcmp0(item, "rpa_offloading") == 0) {
                le_feature_info.rpa_offloading = atoi(value);
+               BT_INFO("RPA offloading : %d", le_feature_info.rpa_offloading);
        } else if (g_strcmp0(item, "max_filter") == 0) {
                le_feature_info.max_filter = atoi(value);
+               BT_INFO("BLE Scan max filter : %d", le_feature_info.max_filter);
        } else {
                BT_DBG("No registered item");
                return FALSE;
@@ -214,12 +132,12 @@ gboolean _bt_update_le_feature_support(const char *item, const char *value)
 static gboolean __bt_is_factory_test_mode(void)
 {
        int mode = 0;
-#ifdef ENABLE_TIZEN_2_4
+
        if (vconf_get_bool(VCONFKEY_BT_DUT_MODE, &mode)) {
                BT_ERR("Get the DUT Mode fail");
                return TRUE;
        }
-#endif
+
        if (mode != FALSE) {
                BT_INFO("DUT Test Mode !!");
                return TRUE;
@@ -232,8 +150,12 @@ int __bt_get_available_adv_slot_id(const char *sender, int adv_handle, gboolean
 {
        int i;
 
-       if (le_adv_slot == NULL)
+       if (le_adv_slot == NULL) {
+               BT_ERR("le_adv_slot is NULL");
                return -1;
+       }
+
+       BT_DBG("adv_inst_max : %d", le_feature_info.adv_inst_max);
 
        for (i = 0; i < le_feature_info.adv_inst_max; i++) {
                if (le_adv_slot[i].sender == NULL)
@@ -257,8 +179,11 @@ int __bt_get_available_adv_slot_id(const char *sender, int adv_handle, gboolean
        return -1;
 }
 
-void _bt_register_adv_slot_owner(const char *sender, int adv_handle, int slot_id)
+static void __bt_register_adv_slot_owner(const char *sender, int adv_handle, int slot_id)
 {
+       if (le_adv_slot == NULL)
+               return;
+
        if (le_adv_slot[slot_id].sender == NULL) {
                le_adv_slot[slot_id].sender = strdup(sender);
                le_adv_slot[slot_id].adv_handle = adv_handle;
@@ -267,6 +192,14 @@ void _bt_register_adv_slot_owner(const char *sender, int adv_handle, int slot_id
 
 void _bt_unregister_adv_slot_owner(int slot_id)
 {
+       if (le_adv_slot == NULL)
+               return;
+
+       if (le_adv_slot[slot_id].hold_timer_id > 0) {
+               BT_INFO("Hold state adv is not unregistered");
+               return;
+       }
+
        g_free(le_adv_slot[slot_id].sender);
        le_adv_slot[slot_id].sender = NULL;
        le_adv_slot[slot_id].adv_handle = 0;
@@ -290,6 +223,9 @@ int _bt_get_adv_slot_adv_handle(int slot_id)
 
 void _bt_set_advertising_status(int slot_id, gboolean mode)
 {
+       if (le_adv_slot == NULL)
+               return;
+
        le_adv_slot[slot_id].is_advertising = mode;
 }
 
@@ -306,6 +242,11 @@ gboolean _bt_is_advertising(void)
        return status;
 }
 
+gboolean _bt_is_multi_adv_supported(void)
+{
+       return (le_feature_info.adv_inst_max > 1) ? TRUE : FALSE;
+}
+
 void _bt_stop_advertising_by_terminated_process(const char* terminated_name)
 {
        int i;
@@ -359,7 +300,13 @@ int _bt_set_advertising(const char *sender, int adv_handle, gboolean enable, gbo
        if (le_adv_slot[slot_id].is_advertising == TRUE && enable == TRUE)
                return BLUETOOTH_ERROR_IN_PROGRESS;
 
-       if (le_adv_slot[slot_id].sender != NULL && le_adv_slot[slot_id].is_advertising == FALSE && enable == FALSE)
+       if (le_adv_slot[slot_id].hold_timer_id > 0) {
+               g_source_remove(le_adv_slot[slot_id].hold_timer_id);
+               le_adv_slot[slot_id].hold_timer_id = 0;
+               _bt_unregister_adv_slot_owner(slot_id);
+       }
+
+       if (le_adv_slot[slot_id].is_advertising == FALSE && enable == FALSE)
                return BLUETOOTH_ERROR_NOT_IN_OPERATION;
 
        proxy = _bt_get_adapter_proxy();
@@ -379,10 +326,10 @@ int _bt_set_advertising(const char *sender, int adv_handle, gboolean enable, gbo
        }
 
        if (enable == TRUE)
-               _bt_register_adv_slot_owner(sender, adv_handle, slot_id);
+               __bt_register_adv_slot_owner(sender, adv_handle, slot_id);
 
        le_adv_slot[slot_id].is_advertising = enable;
-       BT_INFO("Set advertising [%d]", enable);
+       BT_INFO_C("### Set advertising [%d]", enable);
 
        if (ret)
                g_variant_unref(ret);
@@ -421,7 +368,13 @@ int _bt_set_custom_advertising(const char *sender, int adv_handle,
        if (le_adv_slot[slot_id].is_advertising == TRUE && enable == TRUE)
                return BLUETOOTH_ERROR_IN_PROGRESS;
 
-       if (le_adv_slot[slot_id].sender != NULL && le_adv_slot[slot_id].is_advertising == FALSE && enable == FALSE)
+       if (le_adv_slot[slot_id].hold_timer_id > 0) {
+               g_source_remove(le_adv_slot[slot_id].hold_timer_id);
+               le_adv_slot[slot_id].hold_timer_id = 0;
+               _bt_unregister_adv_slot_owner(slot_id);
+       }
+
+       if (le_adv_slot[slot_id].is_advertising == FALSE && enable == FALSE)
                return BLUETOOTH_ERROR_NOT_IN_OPERATION;
 
        proxy = _bt_get_adapter_proxy();
@@ -444,7 +397,7 @@ int _bt_set_custom_advertising(const char *sender, int adv_handle,
        max = params->interval_max / BT_ADV_INTERVAL_SPLIT;
 
        ret = g_dbus_proxy_call_sync(proxy, "SetAdvertisingParameters",
-                       g_variant_new("(uuuui)", min, max, 
+                       g_variant_new("(uuuui)", min, max,
                        params->filter_policy, params->type,
                        slot_id), G_DBUS_CALL_FLAGS_NONE,
                        -1, NULL, &error);
@@ -458,7 +411,7 @@ int _bt_set_custom_advertising(const char *sender, int adv_handle,
        adv_params.interval_min = params->interval_min;
        adv_params.interval_max = params->interval_max;
        adv_params.filter_policy = params->filter_policy;
-       adv_params.type= params->type;
+       adv_params.type = params->type;
 
        if (ret)
                g_variant_unref(ret);
@@ -477,15 +430,83 @@ int _bt_set_custom_advertising(const char *sender, int adv_handle,
        }
 
        if (enable == TRUE)
-               _bt_register_adv_slot_owner(sender, adv_handle, slot_id);
-       else
-               _bt_unregister_adv_slot_owner(slot_id);
+               __bt_register_adv_slot_owner(sender, adv_handle, slot_id);
 
        le_adv_slot[slot_id].is_advertising = enable;
-       BT_INFO_C("Set advertising [%d]", enable);
+       BT_INFO_C("### Set advertising [%d]", enable);
+       if (ret)
+               g_variant_unref(ret);
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+static gboolean __bt_hold_current_advertising_timeout_cb(gpointer user_data)
+{
+       GDBusProxy *proxy;
+       GError *error = NULL;
+       GVariant *ret;
+
+       BT_INFO("Restart advertising stopped by bt-service");
+
+       le_adv_slot[0].hold_timer_id = 0;
+
+       proxy = _bt_get_adapter_proxy();
+       retv_if(proxy == NULL, FALSE);
+
+       ret = g_dbus_proxy_call_sync(proxy, "SetAdvertising",
+                               g_variant_new("(bi)", TRUE, 0),
+                               G_DBUS_CALL_FLAGS_NONE,
+                               -1,
+                               NULL,
+                               &error);
+
+       if (error) {
+               BT_ERR("SetAdvertising Fail: %s", error->message);
+               g_clear_error(&error);
+               return FALSE;
+       }
+
        if (ret)
                g_variant_unref(ret);
 
+       return FALSE;
+}
+
+int _bt_hold_current_advertising(void)
+{
+       GDBusProxy *proxy;
+       GError *error = NULL;
+       GVariant *ret;
+
+       if (le_adv_slot[0].sender && le_adv_slot[0].is_advertising == TRUE) {
+               BT_INFO("Stop current advertising by bt-service");
+
+               proxy = _bt_get_adapter_proxy();
+               retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+               ret = g_dbus_proxy_call_sync(proxy, "SetAdvertising",
+                                       g_variant_new("(bi)", FALSE, 0),
+                                       G_DBUS_CALL_FLAGS_NONE,
+                                       -1,
+                                       NULL,
+                                       &error);
+
+               if (error) {
+                       BT_ERR("SetAdvertising Fail: %s", error->message);
+                       g_clear_error(&error);
+                       return BLUETOOTH_ERROR_INTERNAL;
+               }
+
+               if (ret)
+                       g_variant_unref(ret);
+
+               le_adv_slot[0].hold_timer_id = g_timeout_add(2000,
+                               __bt_hold_current_advertising_timeout_cb, NULL);
+       } else {
+               BT_INFO("It's NOT advertising");
+               return BLUETOOTH_ERROR_NOT_IN_OPERATION;
+       }
+
        return BLUETOOTH_ERROR_NONE;
 }
 
@@ -586,9 +607,8 @@ int _bt_set_advertising_data(const char *sender, int adv_handle,
        }
 
        builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
-       for (i = 0; i < length; i++) {
+       for (i = 0; i < length; i++)
                g_variant_builder_add(builder, "y", adv->data[i]);
-       }
 
        temp = g_variant_new("ay", builder);
        g_variant_builder_unref(builder);
@@ -603,7 +623,7 @@ int _bt_set_advertising_data(const char *sender, int adv_handle,
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
-       _bt_register_adv_slot_owner(sender, adv_handle, slot_id);
+       __bt_register_adv_slot_owner(sender, adv_handle, slot_id);
 
        __bt_get_ad_data_by_type((char *)adv_data.data, adv_data_len, 0xff,
                        &old_mdata, &old_len);
@@ -612,8 +632,8 @@ int _bt_set_advertising_data(const char *sender, int adv_handle,
        if (old_len != new_len ||
                        (old_mdata && new_mdata &&
                         memcmp(old_mdata, new_mdata, new_len))) {
-              ad_data = g_variant_new_from_data((const GVariantType *)"ay",
-                                            new_mdata, new_len, TRUE, NULL, NULL);
+               ad_data = g_variant_new_from_data((const GVariantType *)"ay",
+                               new_mdata, new_len, TRUE, NULL, NULL);
                param = g_variant_new("(@ay)", ad_data);
                _bt_send_event(BT_ADAPTER_EVENT,
                                BLUETOOTH_EVENT_ADVERTISING_MANUFACTURER_DATA_CHANGED,
@@ -680,9 +700,8 @@ int _bt_set_scan_response_data(const char *sender, int adv_handle,
                return BLUETOOTH_ERROR_NO_RESOURCES;
        }
        builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
-       for (i = 0; i < length; i++) {
+       for (i = 0; i < length; i++)
                g_variant_builder_add(builder, "y", response->data[i]);
-       }
 
        temp = g_variant_new("ay", builder);
        g_variant_builder_unref(builder);
@@ -697,7 +716,7 @@ int _bt_set_scan_response_data(const char *sender, int adv_handle,
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
-       _bt_register_adv_slot_owner(sender, adv_handle, slot_id);
+       __bt_register_adv_slot_owner(sender, adv_handle, slot_id);
 
        /* Compare with previous scan resp data */
        __bt_get_ad_data_by_type((char *)resp_data.data, resp_data_len, 0xff,
@@ -708,7 +727,7 @@ int _bt_set_scan_response_data(const char *sender, int adv_handle,
                        (old_mdata && new_mdata &&
                         memcmp(old_mdata, new_mdata, new_len))) {
                scan_data = g_variant_new_from_data((const GVariantType *)"ay",
-                                            new_mdata, new_len, TRUE, NULL, NULL);
+                                       new_mdata, new_len, TRUE, NULL, NULL);
                param = g_variant_new("(@ay)", scan_data);
                _bt_send_event(BT_ADAPTER_EVENT,
                                BLUETOOTH_EVENT_SCAN_RESPONSE_MANUFACTURER_DATA_CHANGED,
@@ -806,18 +825,13 @@ int __bt_get_available_scan_filter_slot_id(void)
                return -1;
        }
        slot_check_list = g_malloc0(sizeof(gboolean) * le_feature_info.max_filter);
-       if (slot_check_list == NULL) {
-               BT_ERR("Fail to allocate memory");
-               return -1;
-       }
 
        for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
                scanner = l->data;
                for (fl = scanner->filter_list; fl != NULL; fl = g_slist_next(fl)) {
                        filter_data = fl->data;
-                       if (filter_data->slot_id < le_feature_info.max_filter) {
+                       if (filter_data->slot_id < le_feature_info.max_filter)
                                slot_check_list[filter_data->slot_id] = TRUE;
-                       }
                }
        }
 
@@ -833,6 +847,14 @@ int __bt_get_available_scan_filter_slot_id(void)
        return -1;
 }
 
+gboolean _bt_is_scan_filter_supported(void)
+{
+       if (le_feature_info.max_filter > 0)
+               return TRUE;
+
+       return FALSE;
+}
+
 int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *filter, int *slot_id)
 {
        GDBusProxy *proxy;
@@ -944,9 +966,9 @@ int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *fil
                g_array_append_vals(arr_uuid_mask, filter->service_uuid_mask.data.data, filter->service_uuid_mask.data_len * sizeof(guint8));
 
                arr_uuid_param = g_variant_new_from_data((const GVariantType *)"ay",
-                                            arr_uuid->data, arr_uuid->len, TRUE, NULL, NULL);
+                                                       arr_uuid->data, arr_uuid->len, TRUE, NULL, NULL);
                arr_uuid_mask_param = g_variant_new_from_data((const GVariantType *)"ay",
-                                            arr_uuid_mask->data, arr_uuid_mask->len, TRUE, NULL, NULL);
+                                                       arr_uuid_mask->data, arr_uuid_mask->len, TRUE, NULL, NULL);
                arr_data_param = g_variant_new_from_data((const GVariantType *)"ay",
                                                                                        NULL, 0, TRUE, NULL, NULL);
                arr_data_mask_param = g_variant_new_from_data((const GVariantType *)"ay",
@@ -993,9 +1015,9 @@ int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *fil
                g_array_append_vals(arr_uuid_mask, filter->service_solicitation_uuid_mask.data.data, filter->service_solicitation_uuid_mask.data_len * sizeof(guint8));
 
                arr_uuid_param = g_variant_new_from_data((const GVariantType *)"ay",
-                                            arr_uuid->data, arr_uuid->len, TRUE, NULL, NULL);
+                                                       arr_uuid->data, arr_uuid->len, TRUE, NULL, NULL);
                arr_uuid_mask_param = g_variant_new_from_data((const GVariantType *)"ay",
-                                            arr_uuid_mask->data, arr_uuid_mask->len, TRUE, NULL, NULL);
+                                                       arr_uuid_mask->data, arr_uuid_mask->len, TRUE, NULL, NULL);
                arr_data_param = g_variant_new_from_data((const GVariantType *)"ay",
                                                                                        NULL, 0, TRUE, NULL, NULL);
                arr_data_mask_param = g_variant_new_from_data((const GVariantType *)"ay",
@@ -1044,9 +1066,9 @@ int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *fil
                arr_uuid_mask_param = g_variant_new_from_data((const GVariantType *)"ay",
                                                                                        NULL, 0, TRUE, NULL, NULL);
                arr_data_param = g_variant_new_from_data((const GVariantType *)"ay",
-                                            arr_data->data, arr_data->len, TRUE, NULL, NULL);
+                                                       arr_data->data, arr_data->len, TRUE, NULL, NULL);
                arr_data_mask_param = g_variant_new_from_data((const GVariantType *)"ay",
-                                            arr_data_mask->data, arr_data_mask->len, TRUE, NULL, NULL);
+                                                       arr_data_mask->data, arr_data_mask->len, TRUE, NULL, NULL);
 
                param = g_variant_new("(iiiiii@ay@aysu@ay@ay)",
                                        0,      // client_if
@@ -1091,9 +1113,9 @@ int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *fil
                arr_uuid_mask_param = g_variant_new_from_data((const GVariantType *)"ay",
                                                                                        NULL, 0, TRUE, NULL, NULL);
                arr_data_param = g_variant_new_from_data((const GVariantType *)"ay",
-                                            arr_data->data, arr_data->len, TRUE, NULL, NULL);
+                                                       arr_data->data, arr_data->len, TRUE, NULL, NULL);
                arr_data_mask_param = g_variant_new_from_data((const GVariantType *)"ay",
-                                            arr_data_mask->data, arr_data_mask->len, TRUE, NULL, NULL);
+                                                       arr_data_mask->data, arr_data_mask->len, TRUE, NULL, NULL);
 
                param = g_variant_new("(iiiiii@ay@aysu@ay@ay)",
                                        0,      // client_if
@@ -1151,19 +1173,17 @@ int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *fil
        scanner = __bt_find_scanner_from_list(sender);
        if (scanner == NULL) {
                scanner = g_malloc0(sizeof(bt_adapter_le_scanner_t));
-               if (scanner) {
-                       scanner->sender = strdup(sender);
-                       scanner_list = g_slist_append(scanner_list, scanner);
-               }
+               scanner->sender = g_strdup(sender);
+               scanner_list = g_slist_append(scanner_list, scanner);
        }
 
-       filter_data = g_malloc0(sizeof(bluetooth_le_scan_filter_t));
-       if (filter_data) {
+
+       if (scanner) {
+               filter_data = g_malloc0(sizeof(bluetooth_le_scan_filter_t));
                memcpy(filter_data, filter, sizeof(bluetooth_le_scan_filter_t));
                filter_data->slot_id = *slot_id;
 
-               if (scanner)
-                       scanner->filter_list = g_slist_append(scanner->filter_list, filter_data);
+               scanner->filter_list = g_slist_append(scanner->filter_list, filter_data);
        }
 
        if (ret)
@@ -1268,9 +1288,7 @@ int _bt_start_le_scan(const char *sender)
 
        if (scanner == NULL) {
                scanner = g_malloc0(sizeof(bt_adapter_le_scanner_t));
-               retv_if(scanner == NULL, BLUETOOTH_ERROR_INTERNAL);
-
-               scanner->sender = strdup(sender);
+               scanner->sender = g_strdup(sender);
                scanner_list = g_slist_append(scanner_list, scanner);
        }
 
@@ -1337,7 +1355,7 @@ int _bt_start_le_scan(const char *sender)
        }
 
        ret = g_dbus_proxy_call_sync(proxy, "StartLEDiscovery",
-                               NULL,G_DBUS_CALL_FLAGS_NONE,
+                               NULL, G_DBUS_CALL_FLAGS_NONE,
                                -1, NULL, &error);
 
        if (error) {
@@ -1417,7 +1435,7 @@ int _bt_stop_le_scan(const char *sender)
        }
 
        ret = g_dbus_proxy_call_sync(proxy, "StopLEDiscovery",
-                               NULL,G_DBUS_CALL_FLAGS_NONE,
+                               NULL, G_DBUS_CALL_FLAGS_NONE,
                                -1, NULL, &error);
        if (ret == NULL) {
                BT_ERR("LE Scan stop failed");
@@ -1442,6 +1460,26 @@ void _bt_disable_all_scanner_status(void)
        }
 }
 
+static void __bt_free_le_scanner(void)
+{
+       GSList *l;
+       bt_adapter_le_scanner_t *scanner;
+
+       for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
+               scanner = l->data;
+               g_free(scanner->sender);
+               g_slist_free_full(scanner->filter_list, g_free);
+               g_free(scanner);
+       }
+
+       g_slist_free(scanner_list);
+       scanner_list = NULL;
+
+       scan_filter_enabled = FALSE;
+       is_le_scanning = FALSE;
+       is_le_set_scan_parameter = FALSE;
+}
+
 void _bt_set_le_scan_status(gboolean mode)
 {
        is_le_scanning = mode;
@@ -1473,7 +1511,6 @@ static gboolean __bt_check_scan_result_uuid(const char *adv_data,
        __bt_get_ad_data_by_type((char*)adv_data, adv_data_len,
                        ad_type, &data, &data_len);
        if (data != NULL) {
-               _bt_swap_byte_ordering(data, data_len);
                for (i = 0; i < data_len; i += uuid_len) {
                        if (uuid_len > (data_len - i))
                                break;
@@ -1682,14 +1719,24 @@ static gboolean __bt_check_scan_result_with_filter(const char *device_address,
                                adv_data_len,
                                BT_LE_AD_TYPE_MANUFACTURER_SPECIFIC_DATA,
                                &data, &data_len);
+
                        if (data != NULL) {
-                               if (data_len >= BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX)
-                                       data_len = BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 1;
-                               if (_bt_byte_arr_cmp_with_mask(data,
-                                       (char*)filter_data->manufacturer_data.data.data,
-                                       (char*)filter_data->manufacturer_data_mask.data.data,
-                                       data_len) == 0) {
-                                       is_matched = TRUE;
+                               int manufacturer_id;
+                               manufacturer_id = (data[1] << 8) + data[0];
+
+                               if (filter_data->manufacturer_id == manufacturer_id) {
+                                       if (filter_data->manufacturer_data.data_len == 0) {
+                                               is_matched = TRUE;
+                                       } else {
+                                               if (data_len >= BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX)
+                                                       data_len = BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 1;
+                                               if (_bt_byte_arr_cmp_with_mask(data + 2,
+                                                       (char*)filter_data->manufacturer_data.data.data,
+                                                       (char*)filter_data->manufacturer_data_mask.data.data,
+                                                       data_len - 2) == 0) {
+                                                       is_matched = TRUE;
+                                               }
+                                       }
                                }
                                g_free(data);
                                data = NULL;
@@ -1698,14 +1745,24 @@ static gboolean __bt_check_scan_result_with_filter(const char *device_address,
                                scan_data_len,
                                BT_LE_AD_TYPE_MANUFACTURER_SPECIFIC_DATA,
                                &data, &data_len);
+
                        if (data != NULL) {
-                               if (data_len >= BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX)
-                                       data_len = BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 1;
-                               if (_bt_byte_arr_cmp_with_mask(data,
-                                       (char*)filter_data->manufacturer_data.data.data,
-                                       (char*)filter_data->manufacturer_data_mask.data.data,
-                                       data_len) == 0) {
-                                       is_matched = TRUE;
+                               int manufacturer_id;
+                               manufacturer_id = (data[1] << 8) + data[0];
+
+                               if (filter_data->manufacturer_id == manufacturer_id) {
+                                       if (filter_data->manufacturer_data.data_len == 0) {
+                                               is_matched = TRUE;
+                                       } else {
+                                               if (data_len >= BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX)
+                                                       data_len = BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 1;
+                                               if (_bt_byte_arr_cmp_with_mask(data + 2,
+                                                       (char*)filter_data->manufacturer_data.data.data,
+                                                       (char*)filter_data->manufacturer_data_mask.data.data,
+                                                       data_len - 2) == 0) {
+                                                       is_matched = TRUE;
+                                               }
+                                       }
                                }
                                g_free(data);
                                data = NULL;
@@ -1819,12 +1876,8 @@ void _bt_send_scan_result_event(const bt_remote_le_dev_info_t *le_dev_info,
                                        scan_data_len,
                                        scan_data_param);
 
-#if 0
                _bt_send_event_to_dest(scanner->sender, BT_LE_ADAPTER_EVENT,
                                BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND, param);
-#else
-               _bt_send_event(BT_LE_ADAPTER_EVENT, BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND, param);
-#endif
        }
 }
 
@@ -1925,7 +1978,7 @@ int _bt_clear_white_list(void)
        retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        ret = g_dbus_proxy_call_sync(proxy, "ClearDeviceWhiteList",
-                               NULL,G_DBUS_CALL_FLAGS_NONE,
+                               NULL, G_DBUS_CALL_FLAGS_NONE,
                                -1, NULL, &error);
 
        if (error) {
@@ -1957,7 +2010,7 @@ int _bt_initialize_ipsp(void)
        retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        ret = g_dbus_proxy_call_sync(proxy, "InitializeIpsp",
-                               NULL,G_DBUS_CALL_FLAGS_NONE,
+                               NULL, G_DBUS_CALL_FLAGS_NONE,
                                -1, NULL, &error);
        if (error) {
                BT_ERR("Initialize IPSP Failed :[%s]", error->message);
@@ -1988,7 +2041,7 @@ int _bt_deinitialize_ipsp(void)
        retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        ret = g_dbus_proxy_call_sync(proxy, "DeinitializeIpsp",
-                               NULL,G_DBUS_CALL_FLAGS_NONE,
+                               NULL, G_DBUS_CALL_FLAGS_NONE,
                                -1, NULL, &error);
        if (error) {
                BT_ERR("De-Initialize IPSP Failed :[%s]", error->message);
@@ -2018,8 +2071,6 @@ int _bt_le_read_maximum_data_length(
        reply = g_dbus_proxy_call_sync(proxy, "LEReadMaximumDataLength",
                        NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
 
-       g_object_unref(proxy);
-
        if (reply == NULL) {
                BT_ERR("LEReadMaximumDataLength dBUS-RPC failed");
                if (error != NULL) {
@@ -2030,7 +2081,7 @@ int _bt_le_read_maximum_data_length(
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
-       g_variant_get(reply ,"(qqqq)", &max_tx_octets, &max_tx_time,
+       g_variant_get(reply"(qqqq)", &max_tx_octets, &max_tx_time,
                                &max_rx_octets, &max_rx_time);
 
        max_le_datalength->max_tx_octets = max_tx_octets;
@@ -2060,8 +2111,6 @@ int _bt_le_write_host_suggested_default_data_length(
                        NULL,
                        &error);
 
-       g_object_unref(proxy);
-
        if (reply == NULL) {
                BT_ERR("_bt_le_write_host_suggested_default_data_length dBUS-RPC failed");
                if (error != NULL) {
@@ -2101,7 +2150,7 @@ int _bt_le_read_host_suggested_default_data_length(
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
-       g_variant_get(reply ,"(qq)", &def_tx_octets, &def_tx_time);
+       g_variant_get(reply"(qq)", &def_tx_octets, &def_tx_time);
 
        def_data_length->def_tx_octets = def_tx_octets;
        def_data_length->def_tx_time = def_tx_time;
@@ -2131,7 +2180,7 @@ int _bt_le_set_data_length(bluetooth_device_address_t *device_address,
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        if (conn == NULL) {
                BT_ERR("conn == NULL");
                g_free(device_path);
@@ -2163,3 +2212,16 @@ int _bt_le_set_data_length(bluetooth_device_address_t *device_address,
 
        return BLUETOOTH_ERROR_NONE;
 }
+
+int _bt_service_adapter_le_init(void)
+{
+       le_adv_slot = g_malloc0(sizeof(bt_adapter_le_adv_slot_t) * le_feature_info.adv_inst_max);
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+void _bt_service_adapter_le_deinit(void)
+{
+       __bt_free_le_adv_slot();
+       __bt_free_le_scanner();
+}