[Adapt] Code sync from tizen branch 49/98049/1
authorAtul Rai <a.rai@samsung.com>
Fri, 11 Nov 2016 09:47:24 +0000 (15:17 +0530)
committerAtul Rai <a.rai@samsung.com>
Wed, 16 Nov 2016 04:28:30 +0000 (09:58 +0530)
This patch imports bluetooth-frwk tizen branch changes to tizen_next
branch till following commit:

commit 14054febb93ce9b5a2259745e29d9d069cc96158
Author: DoHyun Pyun <dh79.pyun@samsung.com>
Date:   Fri Nov 11 14:25:39 2016 +0900

   Add the bluetooth_opp_get_transfer_progress function

Change-Id: I294c3515c2ecab7fd61c11366f61cd06cc837b57
Signed-off-by: Atul Rai <a.rai@samsung.com>
116 files changed:
AUTHORS
CMakeLists.txt
bt-api/CMakeLists.txt
bt-api/bt-adapter-le.c
bt-api/bt-adapter.c
bt-api/bt-audio.c
bt-api/bt-avrcp.c
bt-api/bt-common.c
bt-api/bt-device.c
bt-api/bt-dpm.c
bt-api/bt-event-handler.c
bt-api/bt-gatt-client.c
bt-api/bt-gatt-service.c
bt-api/bt-hid-device.c
bt-api/bt-hid.c
bt-api/bt-ipsp.c
bt-api/bt-obex-server.c
bt-api/bt-oob.c
bt-api/bt-opp-client.c
bt-api/bt-pbap.c
bt-api/bt-proximity.c [new file with mode: 0644]
bt-api/bt-request-sender.c
bt-api/bt-rfcomm-client.c
bt-api/bt-rfcomm-server.c
bt-api/bt-telephony.c
bt-api/include/bt-common.h
bt-api/include/bt-event-handler.h
bt-api/include/bt-gatt-client.h [new file with mode: 0644]
bt-api/include/bt-request-sender.h
bt-core/bt-core-adapter.c
bt-core/bt-core-dbus-handler.c
bt-core/bt-core-main.c
bt-core/bt-core-noti-handler.c
bt-core/include/bt-core-adapter.h
bt-core/include/bt-core-common.h
bt-core/include/bt-core-dbus-handler.h
bt-httpproxy/bt-httpproxy.c
bt-service-adaptation/CMakeLists.txt
bt-service-adaptation/services/bt-request-handler.c
bt-service-adaptation/services/bt-service-event-sender.c
bt-service-adaptation/services/health/bt-service-hdp.c
bt-service-emul/CMakeLists.txt
bt-service-emul/bt-request-handler.c
bt-service-emul/bt-service-adapter.c
bt-service-emul/bt-service-common.c
bt-service-emul/bt-service-dpm.c
bt-service-emul/bt-service-event-sender.c
bt-service-emul/bt-service-main.c
bt-service-emul/include/bt-service-common.h
bt-service-emul/include/bt-service-dpm.h
bt-service-emul/include/bt-service-pbap.h
bt-service/CMakeLists.txt
bt-service/auto-pair-blacklist
bt-service/bt-request-handler.c
bt-service/bt-service-adapter-le.c [changed mode: 0755->0644]
bt-service/bt-service-adapter.c
bt-service/bt-service-agent.c
bt-service/bt-service-audio.c [changed mode: 0755->0644]
bt-service/bt-service-avrcp-controller.c [changed mode: 0755->0644]
bt-service/bt-service-avrcp.c [changed mode: 0755->0644]
bt-service/bt-service-common.c [changed mode: 0755->0644]
bt-service/bt-service-device.c [changed mode: 0755->0644]
bt-service/bt-service-dpm.c
bt-service/bt-service-event-receiver.c
bt-service/bt-service-event-sender.c
bt-service/bt-service-gap-agent.c [changed mode: 0755->0644]
bt-service/bt-service-gap-agent.xml
bt-service/bt-service-headset-connection.c [changed mode: 0755->0644]
bt-service/bt-service-hid.c [changed mode: 0755->0644]
bt-service/bt-service-main.c [changed mode: 0755->0644]
bt-service/bt-service-network.c [changed mode: 0755->0644]
bt-service/bt-service-obex-agent.c [changed mode: 0755->0644]
bt-service/bt-service-obex-server.c
bt-service/bt-service-oob.c [changed mode: 0755->0644]
bt-service/bt-service-opp-client.c [changed mode: 0755->0644]
bt-service/bt-service-pbap.c
bt-service/bt-service-proximity.c [new file with mode: 0644]
bt-service/bt-service-rfcomm-server.c
bt-service/include/bt-service-adapter-le.h [changed mode: 0755->0644]
bt-service/include/bt-service-adapter.h [changed mode: 0755->0644]
bt-service/include/bt-service-agent.h [changed mode: 0755->0644]
bt-service/include/bt-service-audio.h [changed mode: 0755->0644]
bt-service/include/bt-service-common.h [changed mode: 0755->0644]
bt-service/include/bt-service-device.h [changed mode: 0755->0644]
bt-service/include/bt-service-dpm.h
bt-service/include/bt-service-event.h [changed mode: 0755->0644]
bt-service/include/bt-service-gap-agent.h [changed mode: 0755->0644]
bt-service/include/bt-service-hid.h [changed mode: 0755->0644]
bt-service/include/bt-service-main.h [changed mode: 0755->0644]
bt-service/include/bt-service-obex-server.h [changed mode: 0755->0644]
bt-service/include/bt-service-opp-client.h [changed mode: 0755->0644]
bt-service/include/bt-service-pbap.h
bt-service/include/bt-service-proximity.h [new file with mode: 0644]
include/bluetooth-api.h
include/bluetooth-audio-api.h
include/bluetooth-hid-api.h
include/bluetooth-ipsp-api.h
include/bluetooth-media-control.h
include/bluetooth-telephony-api.h
include/bt-internal-types.h
packaging/bluetooth-frwk-common.service
packaging/bluetooth-frwk-mobile-sprd.service
packaging/bluetooth-frwk-mobile.service
packaging/bluetooth-frwk-tv.service
packaging/bluetooth-frwk-wearable.service
packaging/bluetooth-frwk.spec
test/CMakeLists.txt
test/bluetooth-frwk-test.c
test/gatt-test/bluetooth-gatt-test.c
test/handsfree/CMakeLists.txt [deleted file]
test/handsfree/bluetooth-hf-test.c [deleted file]
test/le-adv/bluetooth-advertising-test.c
test/media-control/CMakeLists.txt [deleted file]
test/media-control/bluetooth-media-control-test.c [deleted file]
test/telephony/CMakeLists.txt [deleted file]
test/telephony/bluetooth-telephony-test.c [deleted file]

diff --git a/AUTHORS b/AUTHORS
index c743861..2d52145 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,3 +1,4 @@
 Taesoo Jun <steve.jun@samsung.com>
 DoHyun Pyun <dh79.pyun@samsung.com>
 Anupam Roy <anupam.r@samsung.com>
+Atul Rai <a.rai@samsung.com>
index 5f3d6b3..41d5c77 100644 (file)
@@ -2,7 +2,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
 
 ADD_SUBDIRECTORY(bt-api)
 
-IF("$ENV{CFLAGS}" MATCHES "-DEMUL")
+IF("$ENV{CFLAGS}" MATCHES "-DTIZEN_TEST_EMUL")
 ADD_SUBDIRECTORY(bt-service-emul)
 ELSE()
 IF("$ENV{BT_INCLUDE_OAL}" STREQUAL "ENABLED")
index 0aa3b80..abb47be 100644 (file)
@@ -25,7 +25,8 @@ bt-pbap.c
 bt-hid-device.c
 bt-gatt-client.c
 bt-ipsp.c
-bt-dpm.c)
+bt-dpm.c
+bt-proximity.c)
 
 SET(HEADERS
 bluetooth-api.h
index 0995f35..a7f38eb 100755 (executable)
@@ -26,6 +26,7 @@
 #include "bt-event-handler.h"
 
 static gboolean is_le_scanning = FALSE;
+static int is_scan_filter_supported = -1;
 
 BT_EXPORT_API int bluetooth_check_adapter_le(void)
 {
@@ -34,9 +35,8 @@ BT_EXPORT_API int bluetooth_check_adapter_le(void)
 
        ret = _bt_get_adapter_path(_bt_gdbus_get_system_gconn(), NULL);
 
-       if (ret != BLUETOOTH_ERROR_NONE) {
+       if (ret != BLUETOOTH_ERROR_NONE)
                return BLUETOOTH_ADAPTER_LE_DISABLED;
-       }
 
        ret = vconf_get_int(VCONFKEY_BT_LE_STATUS, &value);
        if (ret != 0) {
@@ -53,9 +53,6 @@ BT_EXPORT_API int bluetooth_enable_adapter_le(void)
 {
        int result;
 
-       retv_if(bluetooth_check_adapter_le() == BLUETOOTH_ADAPTER_LE_ENABLED,
-                               BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED);
-
        BT_INIT_PARAMS();
        BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
@@ -159,6 +156,31 @@ BT_EXPORT_API int bluetooth_is_le_discovering(void)
        return is_discovering;
 }
 
+BT_EXPORT_API gboolean bluetooth_is_scan_filter_supported(void)
+{
+       int result;
+
+       if (is_scan_filter_supported == -1) {
+               BT_INIT_PARAMS();
+               BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+               result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_SCAN_FILTER_SUPPORTED,
+                       in_param1, in_param2, in_param3, in_param4, &out_param);
+
+               if (result == BLUETOOTH_ERROR_NONE)
+                       is_scan_filter_supported = g_array_index(out_param, int, 0);
+               else
+                       BT_ERR("Fail to send request");
+
+               BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+       }
+
+       if (is_scan_filter_supported == 1)
+               return TRUE;
+
+       return FALSE;
+}
+
 BT_EXPORT_API int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *filter, int *slot_id)
 {
        int result;
@@ -173,11 +195,10 @@ BT_EXPORT_API int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *fil
        result = _bt_send_request(BT_BLUEZ_SERVICE, BT_REGISTER_SCAN_FILTER,
                in_param1, in_param2, in_param3, in_param4, &out_param);
 
-       if (result == BLUETOOTH_ERROR_NONE) {
+       if (result == BLUETOOTH_ERROR_NONE)
                *slot_id = g_array_index(out_param, int, 0);
-       } else {
+       else
                BT_ERR("Fail to send request");
-       }
 
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
@@ -220,7 +241,7 @@ BT_EXPORT_API int bluetooth_unregister_all_scan_filters(void)
        return result;
 }
 
-#ifdef TIZEN_WEARABLE
+#ifdef TIZEN_PROFILE_WEARABLE
 gboolean __bluetooth_is_privileged_process(void)
 {
        FILE *fp = NULL;
@@ -251,7 +272,7 @@ BT_EXPORT_API int bluetooth_set_advertising(int handle, gboolean enable)
 
        BT_CHECK_ENABLED_ANY(return);
 
-#ifdef TIZEN_WEARABLE
+#ifdef TIZEN_PROFILE_WEARABLE
        use_reserved_slot = __bluetooth_is_privileged_process();
 #endif
 
@@ -278,7 +299,7 @@ BT_EXPORT_API int bluetooth_set_custom_advertising(int handle, gboolean enable,
 
        BT_CHECK_ENABLED_ANY(return);
 
-#ifdef TIZEN_WEARABLE
+#ifdef TIZEN_PROFILE_WEARABLE
        use_reserved_slot = __bluetooth_is_privileged_process();
 #endif
 
@@ -337,7 +358,7 @@ BT_EXPORT_API int bluetooth_set_advertising_data(int handle, const bluetooth_adv
        if (length > BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 3)
                return BLUETOOTH_ERROR_INVALID_PARAM;
 
-#ifdef TIZEN_WEARABLE
+#ifdef TIZEN_PROFILE_WEARABLE
        use_reserved_slot = __bluetooth_is_privileged_process();
 #endif
 
@@ -397,7 +418,7 @@ BT_EXPORT_API int bluetooth_set_scan_response_data(int handle,
        if (length > BLUETOOTH_SCAN_RESP_DATA_LENGTH_MAX)
                return BLUETOOTH_ERROR_INVALID_PARAM;
 
-#ifdef TIZEN_WEARABLE
+#ifdef TIZEN_PROFILE_WEARABLE
        use_reserved_slot = __bluetooth_is_privileged_process();
 #endif
 
@@ -448,11 +469,10 @@ BT_EXPORT_API int bluetooth_is_advertising(gboolean *is_advertising)
        result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_ADVERTISING,
                in_param1, in_param2, in_param3, in_param4, &out_param);
 
-       if (result == BLUETOOTH_ERROR_NONE) {
+       if (result == BLUETOOTH_ERROR_NONE)
                *is_advertising = g_array_index(out_param, int, 0);
-       } else {
+       else
                BT_ERR("Fail to send request");
-       }
 
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
@@ -537,6 +557,25 @@ BT_EXPORT_API int bluetooth_enable_le_privacy(gboolean enable_privacy)
        return result;
 }
 
+BT_EXPORT_API int bluetooth_set_le_static_random_address(gboolean enable)
+{
+       int result;
+
+       BT_CHECK_ENABLED_ANY(return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       g_array_append_vals(in_param1, &enable, sizeof(gboolean));
+
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_LE_STATIC_RANDOM_ADDRESS,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
 BT_EXPORT_API int bluetooth_check_privilege_advertising_parameter(void)
 {
        if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_SET_ADVERTISING_PARAMETERS)
@@ -614,9 +653,8 @@ BT_EXPORT_API int bluetooth_le_write_host_suggested_default_data_length(
                BT_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH,
                in_param1, in_param2, in_param3, in_param4, &out_param);
 
-       if (result != BLUETOOTH_ERROR_NONE) {
+       if (result != BLUETOOTH_ERROR_NONE)
                BT_ERR("Failed to Write the host suggested default data length values : %d", result);
-       }
 
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
@@ -668,9 +706,8 @@ BT_EXPORT_API int bluetooth_le_set_data_length(bluetooth_device_address_t *addre
                BT_LE_SET_DATA_LENGTH,
                in_param1, in_param2, in_param3, in_param4, &out_param);
 
-       if (result != BLUETOOTH_ERROR_NONE) {
+       if (result != BLUETOOTH_ERROR_NONE)
                BT_ERR("Failed to Set data length values : %d", result);
-       }
 
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
index a8a68eb..0b43812 100644 (file)
@@ -50,9 +50,8 @@ static int __bt_fill_device_list(GArray *out_param2, GPtrArray **dev_list)
 
                dev_info = g_memdup(&info, sizeof(bluetooth_device_info_t));
 
-               if (dev_info) {
+               if (dev_info)
                        g_ptr_array_add(*dev_list, (gpointer)dev_info);
-               }
        }
 
        return BLUETOOTH_ERROR_NONE;
@@ -60,16 +59,15 @@ static int __bt_fill_device_list(GArray *out_param2, GPtrArray **dev_list)
 
 BT_EXPORT_API int bluetooth_check_adapter(void)
 {
-       int value;
+       int value = VCONFKEY_BT_STATUS_OFF;
 
-#ifndef EMUL
+#ifndef TIZEN_TEST_EMUL
        int ret;
 
        ret = _bt_get_adapter_path(_bt_gdbus_get_system_gconn(), NULL);
 
-       if (ret != BLUETOOTH_ERROR_NONE) {
+       if (ret != BLUETOOTH_ERROR_NONE)
                return BLUETOOTH_ADAPTER_DISABLED;
-       }
 #endif
 
        /* check VCONFKEY_BT_STATUS */
@@ -85,9 +83,8 @@ BT_EXPORT_API int bluetooth_check_adapter(void)
 BT_EXPORT_API int bluetooth_enable_adapter(void)
 {
        int result;
-       bt_user_info_t *user_info;
 
-       BT_INFO("");
+       BT_INFO_C("### Enable adapter");
        retv_if(bluetooth_check_adapter() == BLUETOOTH_ADAPTER_ENABLED,
                                BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED);
 
@@ -96,15 +93,11 @@ BT_EXPORT_API int bluetooth_enable_adapter(void)
                                BLUETOOTH_ERROR_PERMISSION_DEINED);
 #endif
 
-       user_info = _bt_get_user_data(BT_COMMON);
-       retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
-
        BT_INIT_PARAMS();
        BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
-       result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_ENABLE_ADAPTER,
-               in_param1, in_param2, in_param3, in_param4,
-               user_info->cb, user_info->user_data);
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_ENABLE_ADAPTER,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
 
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
@@ -114,20 +107,15 @@ BT_EXPORT_API int bluetooth_enable_adapter(void)
 BT_EXPORT_API int bluetooth_disable_adapter(void)
 {
        int result;
-       bt_user_info_t *user_info;
 
-       BT_INFO("");
+       BT_INFO_C("### Disable adapter");
        BT_CHECK_ENABLED(return);
 
-       user_info = _bt_get_user_data(BT_COMMON);
-       retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
-
        BT_INIT_PARAMS();
        BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
-       result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_DISABLE_ADAPTER,
-               in_param1, in_param2, in_param3, in_param4,
-               user_info->cb, user_info->user_data);
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_DISABLE_ADAPTER,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
 
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
@@ -138,7 +126,7 @@ BT_EXPORT_API int bluetooth_recover_adapter(void)
 {
        int result;
 
-       BT_INFO("");
+       BT_INFO("Recover adapter");
        BT_CHECK_ENABLED(return);
 
        BT_INIT_PARAMS();
@@ -204,9 +192,8 @@ BT_EXPORT_API int bluetooth_get_local_version(bluetooth_version_t *local_version
        result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_LOCAL_VERSION,
                in_param1, in_param2, in_param3, in_param4, &out_param);
 
-       if (result == BLUETOOTH_ERROR_NONE) {
+       if (result == BLUETOOTH_ERROR_NONE)
                *local_version = g_array_index(out_param, bluetooth_version_t, 0);
-       }
 
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
@@ -275,9 +262,8 @@ BT_EXPORT_API int bluetooth_is_service_used(const char *service_uuid,
        result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_SERVICE_USED,
                in_param1, in_param2, in_param3, in_param4, &out_param);
 
-       if (result == BLUETOOTH_ERROR_NONE) {
+       if (result == BLUETOOTH_ERROR_NONE)
                *used = g_array_index(out_param, gboolean, 0);
-       }
 
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
@@ -291,7 +277,7 @@ BT_EXPORT_API int bluetooth_get_discoverable_mode(bluetooth_discoverable_mode_t
 
        BT_CHECK_PARAMETER(discoverable_mode_ptr, return);
 
-#ifndef TIZEN_WEARABLE
+#ifndef TIZEN_PROFILE_WEARABLE
        int timeout = 0;
        /* Requirement in OSP */
        if (bluetooth_check_adapter() == BLUETOOTH_ADAPTER_DISABLED) {
@@ -300,11 +286,10 @@ BT_EXPORT_API int bluetooth_get_discoverable_mode(bluetooth_discoverable_mode_t
                        return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
                }
 
-               if (timeout == -1) {
+               if (timeout == -1)
                        *discoverable_mode_ptr = BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE;
-               } else {
+               else
                        *discoverable_mode_ptr = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
-               }
 
                return BLUETOOTH_ERROR_NONE;
        }
@@ -318,9 +303,8 @@ BT_EXPORT_API int bluetooth_get_discoverable_mode(bluetooth_discoverable_mode_t
        result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_DISCOVERABLE_MODE,
                in_param1, in_param2, in_param3, in_param4, &out_param);
 
-       if (result == BLUETOOTH_ERROR_NONE) {
+       if (result == BLUETOOTH_ERROR_NONE)
                *discoverable_mode_ptr = g_array_index(out_param, int, 0);
-       }
 
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
@@ -361,9 +345,8 @@ BT_EXPORT_API int bluetooth_get_timeout_value(int *timeout)
        result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_DISCOVERABLE_TIME,
                in_param1, in_param2, in_param3, in_param4, &out_param);
 
-       if (result == BLUETOOTH_ERROR_NONE) {
+       if (result == BLUETOOTH_ERROR_NONE)
                *timeout = g_array_index(out_param, int, 0);
-       }
 
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
@@ -449,6 +432,7 @@ BT_EXPORT_API int bluetooth_is_discovering(void)
                                int, 0);
        } else {
                BT_ERR("Fail to send request");
+               is_discovering = result;
        }
 
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
@@ -468,11 +452,10 @@ BT_EXPORT_API int bluetooth_is_connectable(gboolean *is_connectable)
        result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_CONNECTABLE,
                in_param1, in_param2, in_param3, in_param4, &out_param);
 
-       if (result == BLUETOOTH_ERROR_NONE) {
+       if (result == BLUETOOTH_ERROR_NONE)
                *is_connectable = g_array_index(out_param, int, 0);
-       } else {
+       else
                BT_ERR("Fail to send request");
-       }
 
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
@@ -519,6 +502,59 @@ BT_EXPORT_API int bluetooth_get_bonded_device_list(GPtrArray **dev_list)
        return result;
 }
 
+BT_EXPORT_API int bluetooth_get_profile_connected_device_list(
+               const char *profile_uuid, GPtrArray **addr_list)
+{
+       char uuid[BLUETOOTH_UUID_STRING_MAX];
+       int result;
+       guint size;
+       int i;
+
+       BT_CHECK_PARAMETER(profile_uuid, return);
+       BT_CHECK_PARAMETER(addr_list, return);
+       BT_CHECK_ENABLED(return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       g_strlcpy(uuid, profile_uuid, sizeof(uuid));
+       g_array_append_vals(in_param1, uuid, BLUETOOTH_UUID_STRING_MAX);
+
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_PROFILE_CONNECTED_DEVICES,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       if (result == BLUETOOTH_ERROR_NONE) {
+               if (out_param == NULL) {
+                       BT_ERR("out_param is NULL");
+                       result = BLUETOOTH_ERROR_INTERNAL;
+               } else {
+                       size = (out_param->len) / sizeof(bluetooth_device_address_t);
+
+                       if (size == 0) {
+                               BT_ERR("No connected device");
+                               result = BLUETOOTH_ERROR_NOT_CONNECTED;
+                       }
+
+                       for (i = 0; i < size; i++) {
+                               bluetooth_device_address_t *addr = NULL;
+                               bluetooth_device_address_t *ptr = NULL;
+
+                               ptr = &g_array_index(out_param,
+                                               bluetooth_device_address_t, i);
+
+                               addr = g_memdup(ptr, sizeof(bluetooth_device_address_t));
+
+                               if (addr)
+                                       g_ptr_array_add(*addr_list, (gpointer)addr);
+                       }
+               }
+       }
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
 BT_EXPORT_API int bluetooth_set_manufacturer_data(const bluetooth_manufacturer_data_t *value)
 {
        int result;
@@ -541,3 +577,22 @@ BT_EXPORT_API int bluetooth_set_manufacturer_data(const bluetooth_manufacturer_d
 
        return result;
 }
+
+BT_EXPORT_API int bluetooth_set_passkey_notification(gboolean enable)
+{
+       int result;
+
+       BT_CHECK_ENABLED_ANY(return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       g_array_append_vals(in_param1, &enable, sizeof(gboolean));
+
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_PASSKEY_NOTIFICATION,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
index bbfe6da..a6666ce 100644 (file)
@@ -28,7 +28,6 @@
 #include "bt-dpm.h"
 #endif
 
-
 BT_EXPORT_API int bluetooth_audio_init(bt_audio_func_ptr cb, void *user_data)
 {
        int ret;
@@ -216,6 +215,7 @@ BT_EXPORT_API int bluetooth_ag_connect(bluetooth_device_address_t *remote_addres
 
        g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
 
+       BT_INFO_C("### Connect AG");
        result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_AG_CONNECT,
                in_param1, in_param2, in_param3, in_param4,
                user_info->cb, user_info->user_data);
@@ -541,6 +541,21 @@ static int __bt_hf_agent_read_call_list(GVariant *reply,
        return BLUETOOTH_ERROR_NONE;
 }
 
+static int __bluetooth_hf_get_error(const char *error_message)
+{
+       if (error_message == NULL) {
+               BT_ERR("Error message NULL");
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       BT_ERR("Error message = %s", error_message);
+
+       if (g_strcmp0(error_message, "NotConnected") == 0)
+               return BLUETOOTH_ERROR_NOT_CONNECTED;
+       else
+               return BLUETOOTH_ERROR_INTERNAL;
+}
+
 BT_EXPORT_API int bluetooth_hf_init(bt_hf_func_ptr cb, void *user_data)
 {
        int ret;
@@ -606,6 +621,7 @@ BT_EXPORT_API int bluetooth_hf_connect(bluetooth_device_address_t *remote_addres
 
        g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
 
+       BT_INFO_C("### Connect HF");
        result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_HF_CONNECT,
                in_param1, in_param2, in_param3, in_param4,
                user_info->cb, user_info->user_data);
@@ -838,8 +854,9 @@ BT_EXPORT_API int bluetooth_hf_send_xsat_cmd(int app_id, char *xsat_cmd)
 
        BT_CHECK_ENABLED(return);
 
-       strncpy(buffer, "AT+XSAT=", strlen("AT+XSAT="));
-       snprintf(buffer + strlen(buffer), sizeof(buffer), "%d,", app_id);
+       strncpy(buffer, "AT+XSAT=\0", 200);
+       snprintf(buffer + strlen(buffer), sizeof(buffer) - strlen(buffer),
+               "%d,", app_id);
        strncat(buffer, xsat_cmd, (sizeof(buffer) - 1) - strlen(buffer));
        BT_DBG("Xsat cmd received = %s", buffer);
 
@@ -1072,11 +1089,10 @@ BT_EXPORT_API int bluetooth_hf_get_audio_connected(unsigned int *audio_connected
        g_variant_get(reply, "(i)", &sco_audio_connected_from_bt_agent);
        *audio_connected = sco_audio_connected_from_bt_agent;
 
-       if (*audio_connected == BLUETOOTH_HF_AUDIO_CONNECTED) {
+       if (*audio_connected == BLUETOOTH_HF_AUDIO_CONNECTED)
                BT_DBG("SCO Audio is Connected");
-       } else {
+       else
                BT_DBG("SCO Audio is Disconnected");
-       }
 
        g_variant_unref(reply);
        return BLUETOOTH_ERROR_NONE;
@@ -1110,3 +1126,33 @@ BT_EXPORT_API int bluetooth_hf_is_connected(gboolean *hf_connected)
        return BLUETOOTH_ERROR_NONE;
 }
 
+BT_EXPORT_API int bluetooth_hf_is_ibr_supported(gboolean *ibr_supported)
+{
+       GVariant *reply = NULL;
+       GError *err = NULL;
+       gboolean is_supported;
+       int ret = BLUETOOTH_ERROR_NONE;
+
+       BT_CHECK_ENABLED(return);
+
+       reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
+                       "IsInbandRingtoneSupported", &err, NULL);
+       if (!reply) {
+               BT_ERR("Error returned in method call");
+               if (err) {
+                       g_dbus_error_strip_remote_error(err);
+                       ret = __bluetooth_hf_get_error(err->message);
+                       g_error_free(err);
+                       return ret;
+               }
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       g_variant_get(reply, "(b)", &is_supported);
+       *ibr_supported = is_supported;
+
+       BT_DBG("%s", *ibr_supported ? "Supported" : "Not Supported");
+
+       g_variant_unref(reply);
+       return ret;
+}
index 4dc7173..50cab77 100644 (file)
@@ -28,7 +28,6 @@
 #include "bt-dpm.h"
 #endif
 
-
 BT_EXPORT_API int bluetooth_media_player_init(media_cb_func_ptr callback_ptr,
                                                void *user_data)
 {
@@ -293,6 +292,80 @@ BT_EXPORT_API int bluetooth_media_control_disconnect(
        return result;
 }
 
+BT_EXPORT_API int bluetooth_media_target_connect(
+                       bluetooth_device_address_t *remote_address)
+{
+       int result;
+       bt_user_info_t *user_info;
+
+       BT_CHECK_PARAMETER(remote_address, return);
+       BT_CHECK_ENABLED(return);
+
+       if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AVRCP_TARGET_CONNECT)
+                       == BLUETOOTH_ERROR_PERMISSION_DEINED) {
+               BT_ERR("Don't have a privilege to use this API");
+               return BLUETOOTH_ERROR_PERMISSION_DEINED;
+       }
+
+#ifdef TIZEN_DPM_ENABLE
+       if (_bt_check_dpm(BT_DPM_AVRCP, NULL) == BT_DPM_RESTRICTED) {
+               BT_ERR("Not allow to use AVRCP profile");
+               return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
+       }
+#endif
+       user_info = _bt_get_user_data(BT_AVRCP);
+       retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       g_array_append_vals(in_param1, remote_address,
+                                       sizeof(bluetooth_device_address_t));
+
+       result = _bt_send_request_async(BT_BLUEZ_SERVICE,
+                               BT_AVRCP_TARGET_CONNECT, in_param1,
+                               in_param2, in_param3, in_param4,
+                               user_info->cb, user_info->user_data);
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
+BT_EXPORT_API int bluetooth_media_target_disconnect(
+                       bluetooth_device_address_t *remote_address)
+{
+       int result;
+       bt_user_info_t *user_info;
+
+       BT_CHECK_PARAMETER(remote_address, return);
+       BT_CHECK_ENABLED(return);
+
+       if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AVRCP_TARGET_DISCONNECT)
+                               == BLUETOOTH_ERROR_PERMISSION_DEINED) {
+               BT_ERR("Don't have a privilege to use this API");
+               return BLUETOOTH_ERROR_PERMISSION_DEINED;
+       }
+
+       user_info = _bt_get_user_data(BT_AVRCP);
+       retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       g_array_append_vals(in_param1, remote_address,
+                                       sizeof(bluetooth_device_address_t));
+
+       result = _bt_send_request_async(BT_BLUEZ_SERVICE,
+                               BT_AVRCP_TARGET_DISCONNECT, in_param1,
+                               in_param2, in_param3, in_param4,
+                               user_info->cb, user_info->user_data);
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
 BT_EXPORT_API int bluetooth_media_control_command(
                                                media_player_control_cmd type)
 {
@@ -306,7 +379,6 @@ BT_EXPORT_API int bluetooth_media_control_command(
                return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
        }
 #endif
-
        BT_INIT_PARAMS();
        BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
index 5e0518c..fe9ddcf 100644 (file)
@@ -50,6 +50,8 @@ static guint bus_id;
 
 static GDBusConnection *system_gconn = NULL;
 
+static gboolean bt_enabled = FALSE;
+
 #define DBUS_TIMEOUT 20 * 1000 /* 20 Seconds */
 
 GDBusConnection *g_bus_get_private_conn(void)
@@ -98,13 +100,10 @@ GDBusConnection *_bt_gdbus_init_system_gconn(void)
 
 GDBusConnection *_bt_gdbus_get_system_gconn(void)
 {
-
-
-       if (system_gconn == NULL) {
+       if (system_gconn == NULL)
                system_gconn = _bt_gdbus_init_system_gconn();
-       } else if (g_dbus_connection_is_closed(system_gconn)) {
+       else if (g_dbus_connection_is_closed(system_gconn))
                system_gconn = g_bus_get_private_conn();
-       }
 
        return system_gconn;
 }
@@ -222,21 +221,40 @@ void _bt_divide_device_class(bluetooth_device_class_t *device_class,
 void _bt_convert_addr_string_to_type(unsigned char *addr,
                                        const char *address)
 {
-        int i;
-        char *ptr = NULL;
+       int i;
+       char *ptr = NULL;
 
        ret_if(address == NULL);
        ret_if(addr == NULL);
 
-        for (i = 0; i < BT_ADDRESS_LENGTH_MAX; i++) {
-                addr[i] = strtol(address, &ptr, 16);
-                if (ptr[0] != '\0') {
-                        if (ptr[0] != ':')
-                                return;
+       for (i = 0; i < BT_ADDRESS_LENGTH_MAX; i++) {
+               addr[i] = strtol(address, &ptr, 16);
+               if (ptr[0] != '\0') {
+                       if (ptr[0] != ':')
+                               return;
 
-                        address = ptr + 1;
-                }
-        }
+                       address = ptr + 1;
+               }
+       }
+}
+
+void _bt_convert_addr_string_to_secure_string(char *addr,
+                                       const char *address)
+{
+       int len;
+
+       ret_if(address == NULL);
+       ret_if(addr == NULL);
+
+       len = strlen(address);
+       ret_if(len != BT_ADDRESS_STRING_SIZE - 1);
+
+       strncpy(addr, address, len);
+
+       addr[len-1] = 'X';
+       addr[len-2] = 'X';
+
+       return;
 }
 
 void _bt_convert_addr_type_to_string(char *address,
@@ -339,6 +357,7 @@ static void __new_connection_method(GDBusConnection *connection,
                char addr[20];
                bluetooth_device_address_t  remote_addr1;
                bt_new_connection_cb cb = user_data;
+               char secure_address[BT_ADDRESS_STRING_SIZE] = { 0 };
                int fd;
 
                g_variant_get(parameters, "(oha{sv})", &obj_path, &index,
@@ -364,11 +383,12 @@ static void __new_connection_method(GDBusConnection *connection,
                        g_error_free(err);
                        return;
                }
-               BT_INFO("Object Path %s", obj_path);
 
-               _bt_device_path_to_address(obj_path, addr);
+               _bt_convert_device_path_to_address(obj_path, addr);
                _bt_convert_addr_string_to_type(remote_addr1.addr, (const char *)addr);
-               BT_INFO("fd: %d, address %s", fd, addr);
+
+               _bt_convert_addr_string_to_secure_string(secure_address, addr);
+               BT_INFO("fd: %d, address %s", fd, secure_address);
 
                g_dbus_method_invocation_return_value(invocation, NULL);
 
@@ -992,9 +1012,7 @@ int _bt_discover_services(char *address, char *uuid, void *cb,
                }
                if (ret)
                        g_variant_unref(ret);
-
                g_object_unref(adapter_proxy);
-
                object_path = _bt_get_device_object_path(address);
                if (object_path == NULL)
                        return BLUETOOTH_ERROR_INTERNAL;
@@ -1020,6 +1038,7 @@ int _bt_cancel_discovers(char *address)
        char *object_path;
        GDBusProxy *proxy;
        GDBusProxy *adapter_proxy;
+       GVariant *ret = NULL;
        GError *err = NULL;
        object_path = _bt_get_device_object_path(address);
        if (object_path == NULL) {
@@ -1038,16 +1057,14 @@ int _bt_cancel_discovers(char *address)
                }
                if (ret)
                        g_variant_unref(ret);
-
                g_object_unref(adapter_proxy);
-
                object_path = _bt_get_device_object_path(address);
                if (object_path == NULL)
                        return BLUETOOTH_ERROR_INTERNAL;
        }
        proxy = __bt_gdbus_get_device_proxy(object_path);
        g_free(object_path);
-       g_dbus_proxy_call_sync(proxy, "CancelDiscovery",
+       ret = g_dbus_proxy_call_sync(proxy, "CancelDiscovery",
                NULL,
                G_DBUS_CALL_FLAGS_NONE,
                DBUS_TIMEOUT, NULL,
@@ -1057,6 +1074,8 @@ int _bt_cancel_discovers(char *address)
                g_clear_error(&err);
                return BLUETOOTH_ERROR_INTERNAL;
        }
+       if (ret)
+               g_variant_unref(ret);
        if (proxy)
                g_object_unref(proxy);
        return BLUETOOTH_ERROR_NONE;
@@ -1276,10 +1295,12 @@ int _bt_get_adapter_path(GDBusConnection *conn, char *path)
        result = g_dbus_proxy_call_sync(manager_proxy, "DefaultAdapter", NULL,
                        G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
        if (!result) {
-               if (err != NULL)
-                       BT_ERR("Fail to get DefaultAdapter (Error: %s)", err->message);
-               else
+               if (err != NULL) {
+                       if (!g_strrstr(err->message, "ServiceUnknown"))
+                               BT_ERR("Fail to get DefaultAdapter (Error: %s)", err->message);
+               } else {
                        BT_ERR("Fail to get DefaultAdapter");
+               }
 
                goto fail;
        }
@@ -1333,9 +1354,8 @@ void _bt_convert_device_path_to_address(const char *device_path,
                dev_addr += 4;
                g_strlcpy(address, dev_addr, sizeof(address));
 
-               while ((pos = strchr(address, '_')) != NULL) {
+               while ((pos = strchr(address, '_')) != NULL)
                        *pos = ':';
-               }
 
                g_strlcpy(device_address, address, BT_ADDRESS_STRING_SIZE);
        }
@@ -1351,9 +1371,8 @@ static char *__bt_extract_device_path(GVariantIter *iter, char *address)
                retv_if(object_path == NULL, NULL);
                _bt_convert_device_path_to_address(object_path, device_address);
 
-               if (g_strcmp0(address, device_address) == 0) {
+               if (g_strcmp0(address, device_address) == 0)
                        return g_strdup(object_path);
-               }
        }
        return NULL;
 }
@@ -1410,28 +1429,6 @@ fail:
        return object_path;
 }
 
-void _bt_device_path_to_address(const char *device_path, char *device_address)
-{
-       char address[BT_ADDRESS_STRING_SIZE] = { 0 };
-       char *dev_addr = NULL;
-
-       if (!device_path || !device_address)
-               return;
-
-       dev_addr = strstr(device_path, "dev_");
-       if (dev_addr != NULL) {
-               char *pos = NULL;
-               dev_addr += 4;
-               g_strlcpy(address, dev_addr, sizeof(address));
-
-               while ((pos = strchr(address, '_')) != NULL) {
-                       *pos = ':';
-               }
-
-               g_strlcpy(device_address, address, BT_ADDRESS_STRING_SIZE);
-       }
-}
-
 GDBusConnection *_bt_init_system_gdbus_conn(void)
 {
        GError *error = NULL;
@@ -1499,6 +1496,8 @@ int _bt_check_privilege(int service_type, int service_function)
 {
        int result;
 
+       BT_CHECK_ENABLED(return);
+
        BT_INIT_PARAMS();
        BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
@@ -1551,6 +1550,135 @@ GVariant *_bt_get_managed_objects(void)
        return result;
 }
 
+gboolean _bt_check_enabled_internal(void)
+{
+       if (bt_enabled == TRUE)
+               return TRUE;
+
+       if (bluetooth_check_adapter() == BLUETOOTH_ADAPTER_ENABLED)
+               bt_enabled = TRUE;
+
+       return bt_enabled;
+}
+
+void _bt_set_adapter_internal_status(gboolean enabled)
+{
+       bt_enabled = enabled;
+}
+
+int _bt_get_uuid_specification_name(const char *uuid, char **name)
+{
+       int i;
+       int offset = 0;
+       int uuid_len = 4;
+       static struct {
+               const char *uuid;
+               const char *specification_name;
+       } bt_uuid_name[] = {
+               /* GATT Services */
+               {"1800", "Generic Access"},
+               {"1801", "Generic Attribute"},
+               {"1802", "Immediate Alert"},
+               {"1803", "Link Loss"},
+               {"1804", "Tx Power"},
+               {"1805", "Current Time Service"},
+               {"1806", "Reference Time Update Service"},
+               {"1807", "Next DST Change Service"},
+               {"1808", "Glucose"},
+               {"1809", "Health Thermometer"},
+               {"180A", "Device Information"},
+               {"180D", "Heart Rate"},
+               {"180F", "Battery Service"},
+               {"1810", "Blood Pressure"},
+               {"1811", "Alert Notification Service"},
+               {"1812", "Human Interface Device"},
+
+               /* GATT Declarations */
+               {"2800", "Primary Service Declaration"},
+               {"2801", "Secondary Service Declaration"},
+               {"2802", "Include Declaration"},
+               {"2803", "Characteristic Declaration"},
+
+               /* GATT Descriptors */
+               {"2900", "Characteristic Extended Properties"},
+               {"2901", "Characteristic User Description"},
+               {"2902", "Client Characteristic Configuration"},
+               {"2903", "Server Characteristic Configuration"},
+               {"2904", "Characteristic Format"},
+               {"2905", "Characteristic Aggregate Formate"},
+               {"2906", "Valid Range"},
+               {"2907", "External Report Reference"},
+               {"2908", "Report Reference"},
+
+               /* GATT Characteristics */
+               {"2A00", "Device Name"},
+               {"2A01", "Appearance"},
+               {"2A02", "Peripheral Privacy Flag"},
+               {"2A03", "Reconnection Address"},
+               {"2A04", "Peripheral Preferred Connection Parameters"},
+               {"2A05", "Service Changed"},
+               {"2A06", "Alert Level"},
+               {"2A07", "Tx Power Level"},
+               {"2A08", "Date Time"},
+               {"2A09", "Day of Week"},
+               {"2A0A", "Day Date Time"},
+               {"2A19", "Battery Level"},
+               {"2A1E", "Intermediate Temperature"},
+               {"2A23", "System ID"},
+               {"2A24", "Model Number String"},
+               {"2A25", "Serial Number String"},
+               {"2A26", "Firmware Revision String"},
+               {"2A27", "Hardware Revision String"},
+               {"2A28", "Software Revision String"},
+               {"2A29", "Manufacturer Name String"},
+               {"2A2A", "IEEE 11073-20601 Regulatory Certification Data List"},
+               {"2A2B", "Current Time"},
+               {"2A37", "Heart Rate Measurement"},
+               {"2A38", "Body Sensor Location"},
+               {"2A3F", "Alert Status"},
+               {"2A46", "New Alert"},
+               {"2A4A", "HID Information"},
+               {"2A4C", "HID Control Point"},
+               {"2A50", "PnP ID"},
+
+               /* Custom uuids */
+               {"7905F431-B5CE-4E99-A40F-4B1E122D00D0", "Apple Notification Center Service"},
+               {"9FBF120D-6301-42D9-8C58-25E699A21DBD", "Notifications Source"},
+               {"69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9", "Control Point"},
+               {"22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB", "Data Source"},
+               {"89D3502B-0F36-433A-8EF4-C502AD55F8DC", "Apple Media Service"},
+               {"9B3C81D8-57B1-4A8A-B8DF-0E56F7CA51C2", "Remote Command"},
+               {"2F7CABCE-808D-411F-9A0C-BB92BA96C102", "Entity Update"},
+               {"C6B2F38C-23AB-46D8-A6AB-A3A870BBD5D7", "Entity Attribute"},
+               {"9A3F68E0-86CE-11E5-A309-0002A5D5C51B", "Samsung Gear Manager Service"},
+               {"c2f2cc0f-c085-4dd4-be5a-aca3074bbc72", "Control Point"},
+               {"cece518b-28d7-4171-92d5-76a1e249a3b9", "Notifications Source"},
+               {NULL, NULL}
+       };
+
+       if (!uuid || !name)
+               return BLUETOOTH_ERROR_INVALID_PARAM;
+       if (strlen(uuid) == 36) {
+               if (!g_ascii_strncasecmp(uuid + 9, "0000-1000-8000-00805F9B34FB", 27))
+                       offset = 4;
+               else {
+                       offset = 0;
+                       uuid_len = 36;
+               }
+       } else if (strlen(uuid) >= 8)
+               offset = 4;
+
+       for (i = 0; bt_uuid_name[i].uuid; i++) {
+               if (!g_ascii_strncasecmp(uuid + offset, bt_uuid_name[i].uuid, uuid_len)) {
+                       *name = g_strdup(bt_uuid_name[i].specification_name);
+                       return BLUETOOTH_ERROR_NONE;
+               }
+       }
+
+       *name = g_strdup("Unknown");
+       return BLUETOOTH_ERROR_NONE;
+}
+
 BT_EXPORT_API int bluetooth_is_supported(void)
 {
        int is_supported = 0;
@@ -1612,29 +1740,32 @@ BT_EXPORT_API int bluetooth_register_callback(bluetooth_cb_func_ptr callback_ptr
        _bt_set_user_data(BT_COMMON, (void *)callback_ptr, user_data);
 
        /* Register All events */
-       ret = _bt_register_event(BT_ADAPTER_EVENT, (void *)callback_ptr, user_data);
-       if (ret != BLUETOOTH_ERROR_NONE)
-               goto fail;
-       ret = _bt_register_event(BT_DEVICE_EVENT, (void *)callback_ptr, user_data);
-       if (ret != BLUETOOTH_ERROR_NONE)
-               goto fail;
-       ret = _bt_register_event(BT_NETWORK_EVENT, (void *)callback_ptr, user_data);
-       if (ret != BLUETOOTH_ERROR_NONE)
-               goto fail;
-       ret = _bt_register_event(BT_RFCOMM_CLIENT_EVENT, (void *)callback_ptr, user_data);
-       if (ret != BLUETOOTH_ERROR_NONE)
-               goto fail;
-       ret = _bt_register_event(BT_RFCOMM_SERVER_EVENT, (void *)callback_ptr, user_data);
-       if (ret != BLUETOOTH_ERROR_NONE)
-               goto fail;
+       if (ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
+               ret = _bt_register_event(BT_ADAPTER_EVENT, (void *)callback_ptr, user_data);
+               if (ret != BLUETOOTH_ERROR_NONE)
+                       goto fail;
+               ret = _bt_register_event(BT_DEVICE_EVENT, (void *)callback_ptr, user_data);
+               if (ret != BLUETOOTH_ERROR_NONE)
+                       goto fail;
+               ret = _bt_register_event(BT_NETWORK_EVENT, (void *)callback_ptr, user_data);
+               if (ret != BLUETOOTH_ERROR_NONE)
+                       goto fail;
+               ret = _bt_register_event(BT_RFCOMM_CLIENT_EVENT, (void *)callback_ptr, user_data);
+               if (ret != BLUETOOTH_ERROR_NONE)
+                       goto fail;
+               ret = _bt_register_event(BT_RFCOMM_SERVER_EVENT, (void *)callback_ptr, user_data);
+               if (ret != BLUETOOTH_ERROR_NONE)
+                       goto fail;
+
 #ifdef GATT_NO_RELAY
-       ret = _bt_register_event(BT_GATT_BLUEZ_EVENT, (void *)callback_ptr, user_data);
-       if (ret != BLUETOOTH_ERROR_NONE)
-               goto fail;
+               ret = _bt_register_event(BT_GATT_BLUEZ_EVENT, (void *)callback_ptr, user_data);
+               if (ret != BLUETOOTH_ERROR_NONE)
+                       goto fail;
 #endif
-       ret = _bt_register_event(BT_HDP_EVENT, (void *)callback_ptr, user_data);
-       if (ret != BLUETOOTH_ERROR_NONE)
-               goto fail;
+               ret = _bt_register_event(BT_HDP_EVENT, (void *)callback_ptr, user_data);
+               if (ret != BLUETOOTH_ERROR_NONE)
+                       goto fail;
+       }
 
        _bt_register_name_owner_changed();
 
@@ -1651,9 +1782,8 @@ BT_EXPORT_API int bluetooth_unregister_callback(void)
 
 
        ret = _bt_deinit_event_handler();
-       if (ret != BLUETOOTH_ERROR_NONE) {
+       if (ret != BLUETOOTH_ERROR_NONE)
                BT_ERR("Fail to deinit the event handler");
-       }
 
        _bt_unregister_name_owner_changed();
 
index b7c0da4..157d7e9 100644 (file)
@@ -77,14 +77,7 @@ BT_EXPORT_API int bluetooth_bond_device_by_type(
        bt_user_info_t *user_info;
 
        BT_CHECK_PARAMETER(device_address, return);
-       if (conn_type == BLUETOOTH_DEV_CONN_BREDR) {
-               BT_CHECK_ENABLED(return);
-       } else if (conn_type == BLUETOOTH_DEV_CONN_LE) {
-               BT_CHECK_ENABLED_LE(return);
-       } else if (conn_type == BLUETOOTH_DEV_CONN_DEFAULT) {
-               BT_CHECK_ENABLED(return);
-               BT_CHECK_ENABLED_LE(return);
-       }
+       BT_CHECK_ENABLED(return);
 
        if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_BOND_DEVICE_BY_TYPE)
             == BLUETOOTH_ERROR_PERMISSION_DEINED) {
@@ -114,7 +107,7 @@ BT_EXPORT_API int bluetooth_cancel_bonding(void)
 {
        int result;
 
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        BT_INIT_PARAMS();
        BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
@@ -133,7 +126,7 @@ BT_EXPORT_API int bluetooth_unbond_device(const bluetooth_device_address_t *devi
        bt_user_info_t *user_info;
 
        BT_CHECK_PARAMETER(device_address, return);
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_UNBOND_DEVICE)
             == BLUETOOTH_ERROR_PERMISSION_DEINED) {
@@ -165,7 +158,7 @@ BT_EXPORT_API int bluetooth_get_bonded_device(const bluetooth_device_address_t *
 
        BT_CHECK_PARAMETER(device_address, return);
        BT_CHECK_PARAMETER(dev_info, return);
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        BT_INIT_PARAMS();
        BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
@@ -189,6 +182,31 @@ BT_EXPORT_API int bluetooth_get_bonded_device(const bluetooth_device_address_t *
        return result;
 }
 
+BT_EXPORT_API int bluetooth_get_is_alias_set(const bluetooth_device_address_t *device_address,
+                               gboolean *is_alias_set)
+{
+       int result;
+
+       BT_CHECK_PARAMETER(device_address, return);
+       BT_CHECK_PARAMETER(is_alias_set, return);
+       BT_CHECK_ENABLED(return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
+
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_IS_ALIAS_SET,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       if (result == BLUETOOTH_ERROR_NONE)
+               *is_alias_set = g_array_index(out_param, gboolean, 0);
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
 BT_EXPORT_API int bluetooth_get_remote_device(const bluetooth_device_address_t *device_address)
 {
        return BLUETOOTH_ERROR_NONE;
@@ -200,7 +218,7 @@ BT_EXPORT_API int bluetooth_search_service(const bluetooth_device_address_t *dev
        bt_user_info_t *user_info;
 
        BT_CHECK_PARAMETER(device_address, return);
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_SEARCH_SERVICE)
             == BLUETOOTH_ERROR_PERMISSION_DEINED) {
@@ -229,7 +247,7 @@ BT_EXPORT_API int bluetooth_cancel_service_search(void)
 {
        int result;
 
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        BT_INIT_PARAMS();
        BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
@@ -250,7 +268,7 @@ BT_EXPORT_API int bluetooth_set_alias(const bluetooth_device_address_t *device_a
 
        BT_CHECK_PARAMETER(device_address, return);
        BT_CHECK_PARAMETER(alias, return);
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        BT_INIT_PARAMS();
        BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
@@ -273,7 +291,7 @@ BT_EXPORT_API int bluetooth_authorize_device(const bluetooth_device_address_t *d
        int result;
 
        BT_CHECK_PARAMETER(device_address, return);
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        BT_INIT_PARAMS();
        BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
@@ -297,15 +315,13 @@ BT_EXPORT_API int bluetooth_is_device_connected(const bluetooth_device_address_t
 
        BT_CHECK_PARAMETER(device_address, return);
        BT_CHECK_PARAMETER(is_connected, return);
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        if (type & BLUETOOTH_RFCOMM_SERVICE) {
                result = bluetooth_rfcomm_client_is_connected(device_address, is_connected);
-               /* TODO: Enable below code once rfcomm server implementation is done */
-#if 0
                if (*is_connected == FALSE)
                        result = bluetooth_rfcomm_server_is_connected(device_address, is_connected);
-#endif
+
                return result;
        }
 
@@ -318,9 +334,8 @@ BT_EXPORT_API int bluetooth_is_device_connected(const bluetooth_device_address_t
        result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_DEVICE_CONNECTED,
                in_param1, in_param2, in_param3, in_param4, &out_param);
 
-       if (result == BLUETOOTH_ERROR_NONE) {
+       if (result == BLUETOOTH_ERROR_NONE)
                *is_connected = g_array_index(out_param, gboolean, 0);
-       }
 
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
@@ -350,6 +365,7 @@ BT_EXPORT_API int bluetooth_connect_le(const bluetooth_device_address_t *device_
        user_info = _bt_get_user_data(BT_COMMON);
        retv_if(user_info == NULL, BLUETOOTH_ERROR_INTERNAL);
 
+       BT_INFO_C("### Connect LE");
        result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_CONNECT_LE,
                in_param1, in_param2, in_param3, in_param4,
                user_info->cb, user_info->user_data);
@@ -367,14 +383,20 @@ BT_EXPORT_API int bluetooth_disconnect_le(const bluetooth_device_address_t *devi
        BT_CHECK_PARAMETER(device_address, return);
        BT_CHECK_ENABLED_ANY(return);
 
+       if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_DISCONNECT_LE)
+            == BLUETOOTH_ERROR_PERMISSION_DEINED) {
+               BT_ERR("Don't have a privilege to use this API");
+               return BLUETOOTH_ERROR_PERMISSION_DEINED;
+       }
+
        BT_INIT_PARAMS();
        BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
        g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
-
        user_info = _bt_get_user_data(BT_COMMON);
        retv_if(user_info == NULL, BLUETOOTH_ERROR_INTERNAL);
 
+       BT_INFO_C("### Disconnect LE");
        result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_DISCONNECT_LE,
                in_param1, in_param2, in_param3, in_param4,
                user_info->cb, user_info->user_data);
@@ -387,9 +409,10 @@ BT_EXPORT_API int bluetooth_disconnect_le(const bluetooth_device_address_t *devi
 BT_EXPORT_API int bluetooth_enable_rssi(const bluetooth_device_address_t *remote_address,
                int link_type, bt_rssi_threshold_t *rssi_threshold)
 {
+#ifdef __BROADCOM_PATCH__
        int result;
 
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        BT_INIT_PARAMS();
        BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
@@ -403,13 +426,18 @@ BT_EXPORT_API int bluetooth_enable_rssi(const bluetooth_device_address_t *remote
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
        return result;
+#else
+       BT_ERR("Current chipset does not support this function.");
+       return BLUETOOTH_ERROR_NOT_SUPPORT;
+#endif
 }
 
 BT_EXPORT_API int bluetooth_get_rssi_strength(const bluetooth_device_address_t *remote_address, int link_type)
 {
+#ifdef __BROADCOM_PATCH__
        int result;
 
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        BT_INIT_PARAMS();
        BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
@@ -422,6 +450,10 @@ BT_EXPORT_API int bluetooth_get_rssi_strength(const bluetooth_device_address_t *
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
        return result;
+#else
+       BT_ERR("Current chipset does not support this function.");
+       return BLUETOOTH_ERROR_NOT_SUPPORT;
+#endif
 }
 
 BT_EXPORT_API int bluetooth_le_conn_update(const bluetooth_device_address_t *address,
@@ -429,7 +461,7 @@ BT_EXPORT_API int bluetooth_le_conn_update(const bluetooth_device_address_t *add
 {
        int result;
 
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
        BT_CHECK_PARAMETER(address, return);
        BT_CHECK_PARAMETER(parameters, return);
 
@@ -456,7 +488,7 @@ BT_EXPORT_API int bluetooth_get_connected_link_type(
        int result;
 
        BT_CHECK_PARAMETER(device_address, return);
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        BT_INIT_PARAMS();
        BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
@@ -466,9 +498,8 @@ BT_EXPORT_API int bluetooth_get_connected_link_type(
        result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_CONNECTED_LINK_TYPE,
                        in_param1, in_param2, in_param3, in_param4, &out_param);
 
-       if (result == BLUETOOTH_ERROR_NONE) {
+       if (result == BLUETOOTH_ERROR_NONE)
                *connected = g_array_index(out_param, guint, 0);
-       }
 
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
@@ -544,6 +575,224 @@ BT_EXPORT_API int bluetooth_update_le_connection_mode(const bluetooth_device_add
        return result;
 }
 
+BT_EXPORT_API int bluetooth_request_att_mtu(const bluetooth_device_address_t *device_address, unsigned int mtu)
+{
+       int result;
+       bt_user_info_t *user_info;
+
+       BT_CHECK_PARAMETER(device_address, return);
+       BT_CHECK_ENABLED_ANY(return);
+
+       if (mtu > BLUETOOTH_MAX_ATT_MTU)
+               return BLUETOOTH_ERROR_INVALID_PARAM;
+
+       if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_REQ_ATT_MTU)
+            == BLUETOOTH_ERROR_PERMISSION_DEINED) {
+               BT_ERR("Don't have a privilege to use this API");
+               return BLUETOOTH_ERROR_PERMISSION_DEINED;
+       }
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
+       g_array_append_vals(in_param2, &mtu, sizeof(unsigned int));
+
+       user_info = _bt_get_user_data(BT_COMMON);
+       retv_if(user_info == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_REQ_ATT_MTU,
+               in_param1, in_param2, in_param3, in_param4,
+               user_info->cb, user_info->user_data);
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
+BT_EXPORT_API int bluetooth_get_att_mtu(const bluetooth_device_address_t *device_address,
+                               unsigned int *mtu)
+{
+       int result;
+
+       BT_CHECK_PARAMETER(device_address, return);
+       BT_CHECK_PARAMETER(mtu, return);
+       BT_CHECK_ENABLED(return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
+
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_ATT_MTU,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       if (result == BLUETOOTH_ERROR_NONE)
+               *mtu = g_array_index(out_param, unsigned int, 0);
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
+BT_EXPORT_API int bluetooth_get_device_ida(const bluetooth_device_address_t *device_rpa,
+       bluetooth_device_address_t *id_address)
+{
+       int result;
+
+       BT_CHECK_PARAMETER(device_rpa, return);
+       BT_CHECK_PARAMETER(id_address, return);
+       BT_CHECK_ENABLED_ANY(return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       g_array_append_vals(in_param1, device_rpa, sizeof(bluetooth_device_address_t));
+
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_DEVICE_IDA,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       if (result == BLUETOOTH_ERROR_NONE) {
+               *id_address = g_array_index(out_param,
+                       bluetooth_device_address_t, 0);
+       }
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
+BT_EXPORT_API int bluetooth_force_hcidump(int timeout)
+{
+       int result;
+
+       BT_CHECK_ENABLED_ANY(return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       g_array_append_vals(in_param1, &timeout, sizeof(int));
+
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_ENABLE_FORCE_HCI_DUMP,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
+BT_EXPORT_API int bluetooth_set_profile_trusted(
+               const bluetooth_device_address_t *device_address,
+               int profile, int trust)
+{
+       int result;
+
+       BT_CHECK_PARAMETER(device_address, return);
+       BT_CHECK_ENABLED(return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
+       g_array_append_vals(in_param2, &profile, sizeof(int));
+       g_array_append_vals(in_param3, &trust, sizeof(int));
+
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_PROFILE_TRUSTED,
+                       in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       if (result == BLUETOOTH_ERROR_NONE)
+               BT_DBG("SUCCESSFUL");
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
+BT_EXPORT_API int bluetooth_get_profile_trusted(
+               const bluetooth_device_address_t *device_address,
+               int profile, int *trust)
+{
+       int result;
+       int trust_profile = 0;
+       BT_CHECK_PARAMETER(device_address, return);
+       BT_CHECK_ENABLED(return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
+       g_array_append_vals(in_param2, &profile, sizeof(int));
+
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_PROFILE_TRUSTED,
+                       in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       if (result == BLUETOOTH_ERROR_NONE) {
+               trust_profile = g_array_index(out_param, guint, 0);
+               BT_DBG("SUCCESSFUL");
+       }
+       BT_DBG("TRUST %d", trust_profile);
+       *trust = trust_profile;
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
+BT_EXPORT_API int bluetooth_set_profile_restricted(
+               const bluetooth_device_address_t *device_address,
+               int profile, int restricted)
+{
+       int result;
+
+       BT_CHECK_PARAMETER(device_address, return);
+       BT_CHECK_ENABLED(return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
+       g_array_append_vals(in_param2, &profile, sizeof(int));
+       g_array_append_vals(in_param3, &restricted, sizeof(int));
+
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_PROFILE_RESTRICTED,
+                       in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       if (result == BLUETOOTH_ERROR_NONE)
+               BT_DBG("SUCCESSFUL");
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
+BT_EXPORT_API int bluetooth_get_profile_restricted(
+               const bluetooth_device_address_t *device_address,
+               int profile, int *restricted)
+{
+       int result;
+       int restrict_profile = 0;
+       BT_CHECK_PARAMETER(device_address, return);
+       BT_CHECK_ENABLED(return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
+       g_array_append_vals(in_param2, &profile, sizeof(int));
+
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_PROFILE_RESTRICTED,
+                       in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       if (result == BLUETOOTH_ERROR_NONE) {
+               restrict_profile = g_array_index(out_param, guint, 0);
+               BT_DBG("SUCCESSFUL");
+       }
+       BT_DBG("Restricted %d", restrict_profile);
+       *restricted = restrict_profile;
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
 BT_EXPORT_API int bluetooth_passkey_reply(char *passkey, gboolean reply)
 {
        int result;
index cf0fecc..2ec42ac 100644 (file)
@@ -183,9 +183,8 @@ static bt_dpm_status_e _bt_check_dpm_transfer_restriction(void)
 
        dpm_status = _bt_check_dpm_blacklist_uuid(BT_OPP_UUID);
 
-       if (dpm_status == BT_DPM_NO_SERVICE || dpm_status == BT_DPM_RESTRICTED) {
+       if (dpm_status == BT_DPM_NO_SERVICE || dpm_status == BT_DPM_RESTRICTED)
                return dpm_status;
-       }
 
        bluetooth_dpm_get_data_transfer_state(&dpm_value);
 
@@ -198,14 +197,13 @@ static bt_dpm_status_e _bt_check_dpm_hsp_restriction(void)
 
        dpm_status = _bt_check_dpm_blacklist_uuid(BT_HFP_AUDIO_GATEWAY_UUID);
 
-       if (dpm_status == BT_DPM_NO_SERVICE || dpm_status == BT_DPM_RESTRICTED) {
+       if (dpm_status == BT_DPM_NO_SERVICE || dpm_status == BT_DPM_RESTRICTED)
                return dpm_status;
-       }
 
        dpm_status = _bt_check_dpm_blacklist_uuid(BT_HSP_AUDIO_GATEWAY_UUID);
-       if (dpm_status == BT_DPM_NO_SERVICE || dpm_status == BT_DPM_RESTRICTED) {
+       if (dpm_status == BT_DPM_NO_SERVICE || dpm_status == BT_DPM_RESTRICTED)
                return dpm_status;
-       }
+
        return dpm_status;
 }
 
@@ -215,9 +213,8 @@ static bt_dpm_status_e _bt_check_dpm_a2dp_restriction(void)
 
        dpm_status = _bt_check_dpm_blacklist_uuid(BT_A2DP_UUID);
 
-       if (dpm_status == BT_DPM_NO_SERVICE || dpm_status == BT_DPM_RESTRICTED) {
+       if (dpm_status == BT_DPM_NO_SERVICE || dpm_status == BT_DPM_RESTRICTED)
                return dpm_status;
-       }
 
        return dpm_status;
 }
@@ -228,9 +225,8 @@ static bt_dpm_status_e _bt_check_dpm_avrcp_restriction(void)
 
        dpm_status = _bt_check_dpm_blacklist_uuid(BT_AVRCP_TARGET_UUID);
 
-       if (dpm_status == BT_DPM_NO_SERVICE || dpm_status == BT_DPM_RESTRICTED) {
+       if (dpm_status == BT_DPM_NO_SERVICE || dpm_status == BT_DPM_RESTRICTED)
                return dpm_status;
-       }
 
        return dpm_status;
 }
@@ -241,9 +237,8 @@ static bt_dpm_status_e _bt_check_dpm_spp_restriction(void)
 
        dpm_status = _bt_check_dpm_blacklist_uuid(BT_SPP_UUID);
 
-       if (dpm_status == BT_DPM_NO_SERVICE || dpm_status == BT_DPM_RESTRICTED) {
+       if (dpm_status == BT_DPM_NO_SERVICE || dpm_status == BT_DPM_RESTRICTED)
                return dpm_status;
-       }
 
        return dpm_status;
 }
@@ -312,16 +307,17 @@ BT_EXPORT_API int bluetooth_dpm_set_allow_mode(bt_dpm_allow_t value)
 #endif
 
 #ifdef TIZEN_DPM_VCONF_ENABLE
-       if (vconf_get_int(VCONFKEY_BT_STATUS, &bt_status) < 0) {
+       if (vconf_get_int(VCONFKEY_BT_STATUS, &bt_status) < 0)
                BT_ERR("Error in reading VCONFKEY_BT_STATUS");
-       }
 
        if (bt_status == VCONFKEY_BT_STATUS_ON) {
                if (vconf_set_int(VCONFKEY_BT_DPM_STATUS, value) != 0) {
                        BT_ERR("Set VCONFKEY_BT_DPM_STATUS failed\n");
                        result = BLUETOOTH_DPM_RESULT_FAIL;
-               } else
+               } else {
+                       BT_ERR("Set VCONFKEY_BT_DPM_STATUS success\n");
                        result = BLUETOOTH_DPM_RESULT_SUCCESS;
+               }
 
                BT_INIT_PARAMS();
                BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
@@ -663,10 +659,10 @@ static void _bluetooth_extract_dpm_device_info(int count,
 
        for (i = 0; i < count; i++) {
                memset(dst_info->addresses[i].addr, 0,
-                       BT_ADDRESS_STRING_SIZE);
+                       BLUETOOTH_ADDRESS_LENGTH);
 
                g_strlcpy((gchar *)dst_info->addresses[i].addr, (gchar *)src_info->addresses[i].addr,
-                       BT_ADDRESS_STRING_SIZE);
+                       BLUETOOTH_ADDRESS_LENGTH);
 
 //             BT_DBG("address[%d] : %s", i, dst_info->addresses[i].addr);
        }
index cf6f74f..bed2f92 100644 (file)
 
 #include "bluetooth-api.h"
 #include "bluetooth-audio-api.h"
+#include "bluetooth-hid-api.h"
 #include "bt-internal-types.h"
 #include "bluetooth-media-control.h"
 
 #include "bt-common.h"
 #include "bt-event-handler.h"
+#include "bt-gatt-client.h"
 #include "bt-request-sender.h"
 
+#define PROFILE_SUPPORTED 0x3 /* This corresponds to binary 0b11*/
 #define BT_RELIABLE_DISABLE_TIME 300 /* 300 ms */
 
 typedef struct {
@@ -47,7 +50,6 @@ static GSList *sending_list = NULL;
 static GSList *server_list = NULL;
 static GSList *event_list = NULL;
 static int owner_sig_id = -1;
-static gboolean is_adapter_enabled = TRUE;
 
 void _bt_add_push_request_id(int request_id)
 {
@@ -368,6 +370,43 @@ done:
        return le_dev_info;
 }
 
+static bluetooth_ibeacon_device_info_t *__bt_get_ibeacon_device_info_in_message(GVariant *parameters, int *ret)
+{
+       bluetooth_ibeacon_device_info_t *ibeacon_dev_info = NULL;
+       const char *address = NULL;
+       short addr_type = 0;
+       int company_id = 0;
+       int ibeacon_type = 0;
+       int major_id = 0;
+       int minor_id = 0;
+       int measured_power = 0;
+       const char *uuid = NULL;
+       int result = BLUETOOTH_ERROR_NONE;
+
+       g_variant_get(parameters, "(i&snnn&snnn)", &result, &address,
+                       &addr_type, &company_id, &ibeacon_type, &uuid, &major_id, &minor_id, &measured_power);
+       ibeacon_dev_info = g_malloc0(sizeof(bluetooth_ibeacon_device_info_t));
+       if (ibeacon_dev_info == NULL) {
+               result = BLUETOOTH_ERROR_MEMORY_ALLOCATION;
+               goto done;
+       }
+
+       _bt_convert_addr_string_to_type(ibeacon_dev_info->device_address.addr, address);
+       ibeacon_dev_info->addr_type = addr_type;
+       ibeacon_dev_info->company_id = company_id;
+       ibeacon_dev_info->ibeacon_type = ibeacon_type;
+       ibeacon_dev_info->major_id = major_id;
+       ibeacon_dev_info->minor_id = minor_id;
+       ibeacon_dev_info->measured_power = measured_power;
+       ibeacon_dev_info->uuid_len = strlen(uuid);
+       memcpy(ibeacon_dev_info->uuid, uuid, ibeacon_dev_info->uuid_len);
+done:
+
+       *ret = result;
+
+       return ibeacon_dev_info;
+}
+
 gboolean __bt_reliable_disable_cb(gpointer user_data)
 {
        BT_DBG("+");
@@ -375,16 +414,12 @@ gboolean __bt_reliable_disable_cb(gpointer user_data)
 
        _bt_set_le_scan_status(FALSE);
 
+       _bt_set_adapter_internal_status(FALSE);
+
        if (is_initialized != FALSE) {
-               if (is_adapter_enabled == TRUE) {
-                       is_adapter_enabled = FALSE;
-                       _bt_common_event_cb(BLUETOOTH_EVENT_DISABLED,
-                                       BLUETOOTH_ERROR_NONE, NULL,
-                                       event_info->cb, event_info->user_data);
-                       _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISABLED,
-                                       BLUETOOTH_ERROR_NONE, NULL,
-                                       event_info->cb, event_info->user_data);
-               }
+               _bt_common_event_cb(BLUETOOTH_EVENT_DISABLED,
+                               BLUETOOTH_ERROR_NONE, NULL,
+                               event_info->cb, event_info->user_data);
        }
 
        obex_server_id = BT_NO_SERVER;
@@ -393,6 +428,9 @@ gboolean __bt_reliable_disable_cb(gpointer user_data)
 #ifdef RFCOMM_DIRECT
         _bt_rfcomm_server_free_all();
 #endif
+
+       _bluetooth_hid_free_hid_info();
+
        BT_DBG("-");
        return FALSE;
 }
@@ -419,54 +457,20 @@ void __bt_adapter_event_filter(GDBusConnection *connection,
        if (strcasecmp(signal_name, BT_ENABLED) == 0) {
                BT_INFO("BT_ENABLED");
                g_variant_get(parameters, "(i)", &result);
-               if (result == BLUETOOTH_ERROR_NONE) {
-                       if (vconf_set_int(BT_OFF_DUE_TO_FLIGHT_MODE, 0) != 0)
-                               BT_ERR("Set vconf failed");
-
-                       if (vconf_set_int(BT_OFF_DUE_TO_POWER_SAVING_MODE, 0) != 0)
-                               BT_ERR("Set vconf failed");
-
-                       if (vconf_set_int(BT_OFF_DUE_TO_TIMEOUT, 0) != 0)
-                               BT_ERR("Set vconf failed");
-               }
-
-               is_adapter_enabled = TRUE;
 
                _bt_common_event_cb(BLUETOOTH_EVENT_ENABLED,
                                result, NULL,
                                event_info->cb, event_info->user_data);
        } else if (strcasecmp(signal_name, BT_DISABLED) == 0) {
                BT_INFO("BT_DISABLED");
-               int flight_mode_value = 0;
-               int ps_mode_value = 0;
-
-               if (vconf_get_int(BT_OFF_DUE_TO_FLIGHT_MODE,
-                                               &flight_mode_value) != 0)
-                       BT_ERR("Fail to get the flight_mode_deactivated value");
 
-               if (vconf_get_int(BT_OFF_DUE_TO_POWER_SAVING_MODE,
-                                                       &ps_mode_value) != 0)
-                       BT_ERR("Fail to get the ps_mode_deactivated value");
-
-               if (flight_mode_value == 1 || ps_mode_value > 0) {
-                       BT_INFO("Flight mode deactivation");
-                       if (disable_timer_id > 0)
-                               g_source_remove(disable_timer_id);
-
-                       disable_timer_id = g_timeout_add(BT_RELIABLE_DISABLE_TIME,
-                                       (GSourceFunc)__bt_reliable_disable_cb,
-                                       event_info);
-               } else {
-                       is_adapter_enabled = FALSE;
-
-                       _bt_common_event_cb(BLUETOOTH_EVENT_DISABLED,
-                                       result, NULL,
-                                       event_info->cb, event_info->user_data);
-               }
+               /* Wait for the termining time of bt-service  */
+               if (disable_timer_id > 0)
+                       g_source_remove(disable_timer_id);
 
-               _bt_common_event_cb(BLUETOOTH_EVENT_DISABLED,
-                               result, NULL,
-                               event_info->cb, event_info->user_data);
+               disable_timer_id = g_timeout_add(BT_RELIABLE_DISABLE_TIME,
+                               (GSourceFunc)__bt_reliable_disable_cb,
+                               event_info);
        } else if (strcasecmp(signal_name, BT_DISCOVERABLE_MODE_CHANGED) == 0) {
                int mode = 0;
 
@@ -562,6 +566,18 @@ void __bt_adapter_event_filter(GDBusConnection *connection,
                                event_info->cb, event_info->user_data);
 
                g_variant_unref(var);
+       } else if (strcasecmp(signal_name, BT_PASSKEY_NOTIFICATION) == 0) {
+               const char *address = NULL;
+               const char *passkey = NULL;
+               const char *passkey_info[2];
+
+               g_variant_get(parameters, "(&s&s)", &address, &passkey);
+               passkey_info[0] = address;
+               passkey_info[1] = passkey;
+
+               _bt_common_event_cb(BLUETOOTH_EVENT_PASSKEY_NOTIFICATION,
+                               BLUETOOTH_ERROR_NONE, (void*)passkey_info,
+                               event_info->cb, event_info->user_data);
        } else if (strcasecmp(signal_name, BT_DEVICE_FOUND) == 0) {
                int event;
                bluetooth_device_info_t *device_info;
@@ -763,11 +779,25 @@ void __bt_adapter_le_event_filter(GDBusConnection *connection,
                                                                &result);
                ret_if(le_device_info == NULL);
 
-               _bt_common_event_cb(BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND,
+               if (bluetooth_is_le_scanning() == TRUE) {
+                       _bt_common_event_cb(BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND,
                                result, le_device_info,
                                event_info->cb, event_info->user_data);
+               }
 
                g_free(le_device_info);
+       } else if (strcasecmp(signal_name, BT_IBEACON_DEVICE_FOUND) == 0) {
+               bluetooth_ibeacon_device_info_t *ibeacon_device_info;
+               BT_DBG("BT_IBEACON_DEVICE_FOUND");
+               ibeacon_device_info = __bt_get_ibeacon_device_info_in_message(parameters,
+                                                               &result);
+               ret_if(ibeacon_device_info == NULL);
+
+               _bt_common_event_cb(BLUETOOTH_EVENT_REMOTE_IBEACON_DEVICE_FOUND,
+                               result, ibeacon_device_info,
+                               event_info->cb, event_info->user_data);
+
+               g_free(ibeacon_device_info);
        }
 }
 
@@ -828,6 +858,28 @@ void __bt_device_event_filter(GDBusConnection *connection,
                _bt_common_event_cb(BLUETOOTH_EVENT_GATT_DISCONNECTED,
                                result, &dev_address,
                                event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, BT_GATT_REQ_ATT_MTU_CHANGED) == 0) {
+               const char *address = NULL;
+               bluetooth_device_address_t dev_address = { {0} };
+               bluetooth_le_att_mtu_info_t att_mtu_info;
+               guint16 mtu;
+               guint8 status;
+               BT_DBG("BT_GATT_REQ_ATT_MTU_CHANGED");
+               g_variant_get(parameters, "(i&sqy)", &result, &address, &mtu, &status);
+
+               _bt_convert_addr_string_to_type(dev_address.addr, address);
+
+               memset(&att_mtu_info, 0x00, sizeof(bluetooth_le_att_mtu_info_t));
+               memcpy(att_mtu_info.device_address.addr,
+                                       dev_address.addr,
+                                       BLUETOOTH_ADDRESS_LENGTH);
+
+               att_mtu_info.mtu = mtu;
+               att_mtu_info.status = status;
+
+               _bt_common_event_cb(BLUETOOTH_EVENT_GATT_ATT_MTU_CHANGED,
+                               result, &att_mtu_info,
+                               event_info->cb, event_info->user_data);
 #ifdef GATT_NO_RELAY
        } else if (strcasecmp(signal_name, BT_GATT_BLUEZ_CHAR_VAL_CHANGED) == 0) {
 #else
@@ -843,6 +895,8 @@ void __bt_device_event_filter(GDBusConnection *connection,
                g_variant_get(parameters, "(i&s@ay)", &result, &char_handle, &char_value_var);
 
                len = g_variant_get_size(char_value_var);
+               ret_if(char_value_var == NULL);
+
                if (len > 0)
                        value = (char *)g_variant_get_data(char_value_var);
 
@@ -855,8 +909,7 @@ void __bt_device_event_filter(GDBusConnection *connection,
                        if (char_val.char_value == NULL) {
                                BT_ERR("BLUETOOTH_ERROR_OUT_OF_MEMORY");
                                g_free(char_val.char_handle);
-                               if (char_value_var)
-                                       g_variant_unref(char_value_var);
+                               g_variant_unref(char_value_var);
                                return;
                        }
                        memcpy(char_val.char_value, value, len);
@@ -864,8 +917,7 @@ void __bt_device_event_filter(GDBusConnection *connection,
                                        result, &char_val,
                                        event_info->cb, event_info->user_data);
                        g_free(char_val.char_value);
-                       if (char_value_var)
-                               g_variant_unref(char_value_var);
+                       g_variant_unref(char_value_var);
                }
                g_free(char_val.char_handle);
        } else if (strcasecmp(signal_name, BT_DEVICE_CONNECTED) == 0) {
@@ -996,44 +1048,81 @@ void __bt_device_event_filter(GDBusConnection *connection,
                _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_UNAUTHORIZED,
                                result, &dev_address,
                                event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, BT_SUPPORTED_PROFILE_TRUSTED) == 0) {
+               char *address;
+               bt_supported_profile_trusted_t profile_info = { 0, };
+               int trust;
+
+               g_variant_get(parameters, "(i&si)", &result,
+                                       &address, &trust);
+
+               BT_DBG("Address [%s] trust[%d]", address, trust);
+               profile_info.address = address;
+               if (trust & (PROFILE_SUPPORTED << 0)) { /* Bit 0 & 1 - for PBAP Supported */
+                       profile_info.profile = TRUSTED_PROFILE_PBAP;
+                       profile_info.supported = TRUE;
+                       if (trust & (1 << 1)) /* Bit 1 - for PBAP Trusted */
+                               profile_info.trusted = TRUE;
+                       else
+                               profile_info.trusted = FALSE;
+
+                       _bt_common_event_cb(BLUETOOTH_EVENT_SUPPORTED_PROFILE_TRUSTED,
+                                       result, &profile_info,
+                                       event_info->cb, event_info->user_data);
+               }
+               if (trust & (PROFILE_SUPPORTED << 2)) { /* Bit 2 & 3 - for MAP Supported */
+                       profile_info.profile = TRUSTED_PROFILE_MAP;
+                       profile_info.supported = TRUE;
+                       if (trust & (1 << 3)) /* Bit 3 - for PBAP Trusted */
+                               profile_info.trusted = TRUE;
+                       else
+                               profile_info.trusted = FALSE;
+
+                       _bt_common_event_cb(BLUETOOTH_EVENT_SUPPORTED_PROFILE_TRUSTED,
+                                       result, &profile_info,
+                                       event_info->cb, event_info->user_data);
+               }
+               if (trust & (PROFILE_SUPPORTED << 4)) { /* Bit 4 & 5- for SAP Supported */
+                       profile_info.profile = TRUSTED_PROFILE_SAP;
+                       profile_info.supported = TRUE;
+                       if (trust & (1 << 5)) /* Bit 5 - for SAP Trusted */
+                               profile_info.trusted = TRUE;
+                       else
+                               profile_info.trusted = FALSE;
+
+                       _bt_common_event_cb(BLUETOOTH_EVENT_SUPPORTED_PROFILE_TRUSTED,
+                                       result, &profile_info,
+                                       event_info->cb, event_info->user_data);
+               }
        } else if (strcasecmp(signal_name, BT_IPSP_CONNECTED) == 0) {
                const char *address = NULL;
-               bluetooth_device_address_t dev_address = { {0} };
+               const char *if_name = NULL;
+               bt_ipsp_connection_info_t bt_ipsp_iface_info;
+               memset(&bt_ipsp_iface_info, 0, sizeof(bt_ipsp_iface_info));
 
                BT_DBG("BT_IPSP_CONNECTED");
-               g_variant_get(parameters, "(i&s)", &result, &address);
+               g_variant_get(parameters, "(i&s&s)", &result, &address, &if_name);
 
-               _bt_convert_addr_string_to_type(dev_address.addr, address);
+               _bt_convert_addr_string_to_type(bt_ipsp_iface_info.btaddr.addr, address);
+               memcpy(bt_ipsp_iface_info.if_name, if_name, 16);
 
                _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_CONNECTED,
-                               result, &dev_address,
+                               result, &bt_ipsp_iface_info,
                                event_info->cb, event_info->user_data);
        } else if (strcasecmp(signal_name, BT_IPSP_DISCONNECTED) == 0) {
                const char *address = NULL;
-               bluetooth_device_address_t dev_address = { {0} };
-               BT_DBG("BT_IPSP_DISCONNECTED");
-
-               g_variant_get(parameters, "(i&s)", &result, &address);
-
-               _bt_convert_addr_string_to_type(dev_address.addr, address);
-
-               _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_DISCONNECTED,
-                               result, &dev_address,
-                               event_info->cb, event_info->user_data);
-       } else if (strcasecmp(signal_name, BT_IPSP_BT_INTERFACE_INFO) == 0) {
-               const char *address = NULL;
                const char *if_name = NULL;
-               bt_ipsp_interface_info_t ipsp_iface_info;
-               memset(&ipsp_iface_info, 0, sizeof(ipsp_iface_info));
+               bt_ipsp_connection_info_t bt_ipsp_iface_info;
+               memset(&bt_ipsp_iface_info, 0, sizeof(bt_ipsp_iface_info));
 
-               BT_DBG("BT_IPSP_BT_INTERFACE_INFO");
+               BT_DBG("BT_IPSP_DISCONNECTED");
                g_variant_get(parameters, "(i&s&s)", &result, &address, &if_name);
 
-               _bt_convert_addr_string_to_type(ipsp_iface_info.btaddr.addr, address);
-               memcpy(ipsp_iface_info.if_name, if_name, 16);
+               _bt_convert_addr_string_to_type(bt_ipsp_iface_info.btaddr.addr, address);
+               memcpy(bt_ipsp_iface_info.if_name, if_name, 16);
 
-               _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_BT_INTERFACE_INFO,
-                               result, &ipsp_iface_info,
+               _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_DISCONNECTED,
+                               result, &bt_ipsp_iface_info,
                                event_info->cb, event_info->user_data);
        } else if (strcasecmp(signal_name, BT_LE_DATA_LENGTH_CHANGED) == 0) {
                const char *address = NULL;
@@ -1061,6 +1150,24 @@ void __bt_device_event_filter(GDBusConnection *connection,
 
                _bt_common_event_cb(BLUETOOTH_EVENT_LE_DATA_LENGTH_CHANGED,
                                result, &params, event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, BT_PXP_PROPERTY_CHANGED) == 0) {
+               const char *address = NULL;
+               bluetooth_device_address_t dev_address = { {0} };
+               int role, type, level;
+               bt_pxp_property_changed_params_t params;
+
+               BT_DBG("BT_PXP_PROPERTY_CHANGED");
+
+               g_variant_get(parameters, "(isiii)", &result, &address, &role, &type, &level);
+
+               _bt_convert_addr_string_to_type(dev_address.addr, address);
+               memcpy(&params.device_address, &dev_address, BLUETOOTH_ADDRESS_LENGTH);
+               params.role = role;
+               params.service_type = type;
+               params.alert_lvl = level;
+
+               _bt_common_event_cb(BLUETOOTH_EVENT_PXP_PROPERTY_CHANGED,
+                               result, &params, event_info->cb, event_info->user_data);
        }
 }
 
@@ -1221,7 +1328,6 @@ void __bt_hid_device_event_filter(GDBusConnection *connection,
 
        event_info = (bt_event_info_t *)user_data;
        ret_if(event_info == NULL);
-
        if (strcasecmp(object_path, BT_HID_DEVICE_PATH) != 0)
                return;
        if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
@@ -1255,6 +1361,27 @@ void __bt_hid_device_event_filter(GDBusConnection *connection,
                _bt_input_event_cb(BLUETOOTH_HID_DEVICE_DISCONNECTED,
                                result, &dev_address,
                                event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, BT_INPUT_HID_DEVICE_CONNECTED) == 0) {
+               BT_INFO_C("Type %s", g_variant_get_type_string(parameters));
+               const char *address = NULL;
+               bluetooth_device_address_t dev_address = { {0} };
+
+               g_variant_get(parameters, "(i&s)", &result, &address);
+
+               BT_DBG("address: %s", address);
+               _bt_convert_addr_string_to_type(dev_address.addr,
+                                               address);
+               int ctrl = -1, intr = -1;
+               _bt_hid_device_get_fd(address, &ctrl, &intr);
+               if (ctrl != -1 && intr != -1) {
+                       new_hid_connection(NULL, ctrl, &dev_address);
+                       new_hid_connection(NULL, intr, &dev_address);
+               }
+       } else if (strcasecmp(signal_name, BT_INPUT_HID_DEVICE_DISCONNECTED) == 0) {
+               const char *address = NULL;
+               g_variant_get(parameters, "(i&s)", &result, &address);
+
+               BT_DBG("address: %s", address);
        }
 }
 void __bt_a2dp_source_event_filter(GDBusConnection *connection,
@@ -1596,9 +1723,9 @@ void __bt_opp_client_event_filter(GDBusConnection *connection,
                                result, &dev_address,
                                event_info->cb, event_info->user_data);
 
-               if (result != BLUETOOTH_ERROR_NONE) {
+               if (result != BLUETOOTH_ERROR_NONE)
                        __bt_remove_push_request_id(request_id);
-               }
+
        } else if (strcasecmp(signal_name, BT_OPP_DISCONNECTED) == 0) {
                const char *address = NULL;
                int request_id = 0;
@@ -1622,11 +1749,12 @@ void __bt_opp_client_event_filter(GDBusConnection *connection,
                __bt_remove_push_request_id(request_id);
        } else if (strcasecmp(signal_name, BT_TRANSFER_STARTED) == 0) {
                const char *file_name = NULL;
+               const char *device_addr = NULL;
                int request_id = 0;
                guint64 size = 0;
                bt_opc_transfer_info_t transfer_info;
 
-               g_variant_get(parameters, "(i&sti)", &result, &file_name,
+               g_variant_get(parameters, "(i&s&sti)", &result, &device_addr, &file_name,
                                                &size, &request_id);
 
                if (__bt_is_request_id_exist(request_id) == FALSE) {
@@ -1637,12 +1765,14 @@ void __bt_opp_client_event_filter(GDBusConnection *connection,
                memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
 
                transfer_info.filename = g_strdup(file_name);
+               transfer_info.device_addr = g_strdup(device_addr);
                transfer_info.size = size;
 
                _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_STARTED,
                                result, &transfer_info,
                                event_info->cb, event_info->user_data);
 
+               g_free(transfer_info.device_addr);
                g_free(transfer_info.filename);
        } else if (strcasecmp(signal_name, BT_TRANSFER_PROGRESS) == 0) {
                const char *file_name = NULL;
@@ -1672,11 +1802,12 @@ void __bt_opp_client_event_filter(GDBusConnection *connection,
                g_free(transfer_info.filename);
        } else if (strcasecmp(signal_name, BT_TRANSFER_COMPLETED) == 0) {
                const char *file_name = NULL;
+               const char *device_addr = NULL;
                int request_id = 0;
                guint64 size = 0;
                bt_opc_transfer_info_t transfer_info;
 
-               g_variant_get(parameters, "(i&sti)", &result,
+               g_variant_get(parameters, "(i&s&sti)", &result, &device_addr,
                                        &file_name, &size, &request_id);
 
                if (__bt_is_request_id_exist(request_id) == FALSE) {
@@ -1686,6 +1817,7 @@ void __bt_opp_client_event_filter(GDBusConnection *connection,
 
                memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
 
+               transfer_info.device_addr = g_strdup(device_addr);
                transfer_info.filename = g_strdup(file_name);
                transfer_info.size = size;
 
@@ -1693,6 +1825,7 @@ void __bt_opp_client_event_filter(GDBusConnection *connection,
                                result, &transfer_info,
                                event_info->cb, event_info->user_data);
 
+               g_free(transfer_info.device_addr);
                g_free(transfer_info.filename);
        }
 }
@@ -1720,10 +1853,13 @@ void __bt_opp_server_event_filter(GDBusConnection *connection,
        if (strcasecmp(signal_name, BT_TRANSFER_AUTHORIZED) == 0) {
                /* Native only event */
                const char *file_name = NULL;
+               const char *address = NULL;
+               const char *device_name = NULL;
                guint64 size = 0;
                bt_obex_server_authorize_into_t auth_info;
 
-               g_variant_get(parameters, "(i&st)", &result, &file_name, &size);
+               g_variant_get(parameters, "(i&st&s&s)", &result, &file_name, &size,
+                               &address, &device_name);
 
                /* OSP server: Don't get this event */
                ret_if(obex_server_id == BT_CUSTOM_SERVER);
@@ -1732,12 +1868,15 @@ void __bt_opp_server_event_filter(GDBusConnection *connection,
 
                auth_info.filename = g_strdup(file_name);
                auth_info.length = size;
-
+               auth_info.address = g_strdup(address);
+               auth_info.name = g_strdup(device_name);
                _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE,
                                result, &auth_info,
                                event_info->cb, event_info->user_data);
 
                g_free(auth_info.filename);
+               g_free(auth_info.address);
+               g_free(auth_info.name);
        } else if (strcasecmp(signal_name, BT_CONNECTION_AUTHORIZED) == 0) {
                /* OSP only event */
                const char *address = NULL;
@@ -1756,29 +1895,52 @@ void __bt_opp_server_event_filter(GDBusConnection *connection,
                                result, &dev_address,
                                event_info->cb, event_info->user_data);
        } else if (strcasecmp(signal_name, BT_TRANSFER_CONNECTED) == 0) {
+               bt_obex_server_connection_info_t conn_info = {0, };
+               char *address = NULL;
+               char *name = NULL;
+               int transfer_id = -1;
+               g_variant_get(parameters, "(i&s&si)", &result,
+                               &address, &name, &transfer_id);
 
-               g_variant_get(parameters, "(i)", &result);
+               conn_info.address = g_strdup(address);
+               conn_info.device_name = g_strdup(name);
+               conn_info.transfer_id = transfer_id;
 
                _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_CONNECTED,
-                                       result, NULL, event_info->cb,
+                                       result, &conn_info, event_info->cb,
                                        event_info->user_data);
+
+               g_free(conn_info.address);
+               g_free(conn_info.device_name);
        } else if (strcasecmp(signal_name, BT_TRANSFER_DISCONNECTED) == 0) {
+               bt_obex_server_transfer_info_t transfer_info = {0, };
+               char *address = NULL;
+               int transfer_id = -1;
+               g_variant_get(parameters, "(i&si)", &result, &address, &transfer_id);
+               DBG_SECURE("address: %s, transfer_id: %d", address, transfer_id);
 
-               g_variant_get(parameters, "(i)", &result);
+               transfer_info.address = g_strdup(address);
+               transfer_info.transfer_id = transfer_id;
 
                _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_DISCONNECTED,
-                                       result, NULL, event_info->cb,
+                                       result, &transfer_info, event_info->cb,
                                        event_info->user_data);
+               g_free(transfer_info.address);
        } else if (strcasecmp(signal_name, BT_TRANSFER_STARTED) == 0) {
+               const char *device_name = NULL;
                const char *file_name = NULL;
                const char *type = NULL;
+               const char *address = NULL;
+               GVariantIter *iter = NULL;
+               int i = 0;
+               guchar byte;
                int transfer_id = 0;
                int server_type = 0; /* bt_server_type_t */
                guint64 size = 0;
                bt_obex_server_transfer_info_t transfer_info;
 
-               g_variant_get(parameters, "(i&s&stii)", &result, &file_name,
-                               &type, &size, &transfer_id, &server_type);
+               g_variant_get(parameters, "(i&s&s&s&stii(ay))", &result, &device_name,
+                       &file_name, &type, &address, &size, &transfer_id, &server_type, &iter);
 
                /* Other server's event */
                ret_if(obex_server_id != server_type &&
@@ -1786,8 +1948,15 @@ void __bt_opp_server_event_filter(GDBusConnection *connection,
 
                memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
 
+               transfer_info.contact_auth_info = g_malloc0(sizeof(unsigned char) * 5);
+
+               for (i = 0; i < 5 && g_variant_iter_loop(iter, "y", &byte); ++i)
+                       transfer_info.contact_auth_info[i] = byte;
+
+               transfer_info.device_name = g_strdup(device_name);
                transfer_info.filename = g_strdup(file_name);
                transfer_info.type = g_strdup(type);
+               transfer_info.address = g_strdup(address);
                transfer_info.file_size = size;
                transfer_info.transfer_id = transfer_id;
                transfer_info.server_type = (server_type == BT_FTP_SERVER) ?
@@ -1799,17 +1968,23 @@ void __bt_opp_server_event_filter(GDBusConnection *connection,
 
                g_free(transfer_info.filename);
                g_free(transfer_info.type);
+               g_free(transfer_info.device_name);
+               g_free(transfer_info.address);
+               g_free(transfer_info.contact_auth_info);
+               g_variant_iter_free(iter);
        } else if (strcasecmp(signal_name, BT_TRANSFER_PROGRESS) == 0) {
                const char *file_name = NULL;
                const char *type = NULL;
+               const char *device_name = NULL;
+               const char *address = NULL;
                int transfer_id = 0;
                int progress = 0;
                int server_type = 0; /* bt_server_type_t */
                guint64 size = 0;
                bt_obex_server_transfer_info_t transfer_info;
 
-               g_variant_get(parameters, "(i&s&stiii)", &result, &file_name,
-                                               &type, &size, &transfer_id,
+               g_variant_get(parameters, "(i&s&s&s&stiii)", &result, &file_name,
+                                               &type, &device_name, &address, &size, &transfer_id,
                                                &progress, &server_type);
 
                /* Other server's event */
@@ -1820,6 +1995,8 @@ void __bt_opp_server_event_filter(GDBusConnection *connection,
 
                transfer_info.filename = g_strdup(file_name);
                transfer_info.type = g_strdup(type);
+               transfer_info.device_name = g_strdup(device_name);
+               transfer_info.address = g_strdup(address);
                transfer_info.file_size = size;
                transfer_info.transfer_id = transfer_id;
                transfer_info.percentage = progress;
@@ -1831,10 +2008,13 @@ void __bt_opp_server_event_filter(GDBusConnection *connection,
                                event_info->cb, event_info->user_data);
 
                g_free(transfer_info.filename);
+               g_free(transfer_info.device_name);
+               g_free(transfer_info.address);
                g_free(transfer_info.type);
        } else if (strcasecmp(signal_name, BT_TRANSFER_COMPLETED) == 0) {
                const char *file_name = NULL;
                const char *device_name = NULL;
+               const char *address = NULL;
                const char *type = NULL;
                const char *file_path;
                int transfer_id = 0;
@@ -1842,8 +2022,8 @@ void __bt_opp_server_event_filter(GDBusConnection *connection,
                guint64 size = 0;
                bt_obex_server_transfer_info_t transfer_info;
 
-               g_variant_get(parameters, "(i&s&s&s&stii)", &result, &file_name,
-                                       &type, &device_name, &file_path, &size,
+               g_variant_get(parameters, "(i&s&s&s&s&stii)", &result, &file_name,
+                                       &type, &device_name, &file_path, &address, &size,
                                        &transfer_id, &server_type);
 
                /* Other server's event */
@@ -1856,6 +2036,7 @@ void __bt_opp_server_event_filter(GDBusConnection *connection,
                transfer_info.type = g_strdup(type);
                transfer_info.device_name = g_strdup(device_name);
                transfer_info.file_path = g_strdup(file_path);
+               transfer_info.address = g_strdup(address);
                transfer_info.file_size = size;
                transfer_info.transfer_id = transfer_id;
                transfer_info.server_type = (server_type == BT_FTP_SERVER) ?
@@ -1868,6 +2049,7 @@ void __bt_opp_server_event_filter(GDBusConnection *connection,
                g_free(transfer_info.filename);
                g_free(transfer_info.type);
                g_free(transfer_info.device_name);
+               g_free(transfer_info.address);
                g_free(transfer_info.file_path);
        }
 }
@@ -1883,57 +2065,48 @@ void __bt_pbap_client_event_filter(GDBusConnection *connection,
        bt_event_info_t *event_info;
        int result = BLUETOOTH_ERROR_NONE;
        event_info = (bt_event_info_t *)user_data;
+
        ret_if(event_info == NULL);
 
        if (strcasecmp(object_path, BT_PBAP_CLIENT_PATH) != 0)
                return;
+
        if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
                return;
 
        ret_if(signal_name == NULL);
+
        BT_DBG("Type: %s", g_variant_get_type_string(parameters));
+
        if (strcasecmp(signal_name, BT_PBAP_CONNECTED) == 0) {
                bt_pbap_connected_t connected = { { { 0 }, }, };
                char *address = NULL;
 
-               g_variant_get(parameters, "(is)", &result, &address);
+               g_variant_get(parameters, "(i&s)", &result, &address);
                BT_DBG("address: %s", address);
 
                _bt_convert_addr_string_to_type(connected.btaddr.addr,
                                                address);
-
-               connected.connected = 1;
+               if (result == 0)
+                       connected.connected = 1;
+               else
+                       connected.connected = 0;
 
                _bt_common_event_cb(BLUETOOTH_PBAP_CONNECTED,
                                result, &connected,
                                event_info->cb, event_info->user_data);
        } else if (strcasecmp(signal_name, BT_PBAP_DISCONNECTED) == 0) {
-               bt_pbap_connected_t connected = { { { 0 }, }, };
-               char *address = NULL;
-
-               g_variant_get(parameters, "(is)", &result, &address);
-               BT_DBG("address: %s", address);
-
-               _bt_convert_addr_string_to_type(connected.btaddr.addr,
-                                               address);
-
-               connected.connected = 0;
-
-               _bt_common_event_cb(BLUETOOTH_PBAP_DISCONNECTED,
-                               result, &connected,
-                               event_info->cb, event_info->user_data);
-       } else if (strcasecmp(signal_name, BT_PBAP_DISCONNECTED) == 0) {
                bt_pbap_connected_t disconnected = { { { 0 }, }, };
                char *address = NULL;
 
-               g_variant_get(parameters, "(is)", &result, &address);
+               g_variant_get(parameters, "(i&s)", &result, &address);
                BT_DBG("address: %s", address);
 
                _bt_convert_addr_string_to_type(disconnected.btaddr.addr,
                                                address);
                disconnected.connected = 0;
 
-               _bt_common_event_cb(BLUETOOTH_PBAP_CONNECTED,
+               _bt_common_event_cb(BLUETOOTH_PBAP_DISCONNECTED,
                                result, &disconnected,
                                event_info->cb, event_info->user_data);
        } else if (strcasecmp(signal_name, BT_PBAP_PHONEBOOK_SIZE) == 0) {
@@ -1941,10 +2114,9 @@ void __bt_pbap_client_event_filter(GDBusConnection *connection,
                char *address = NULL;
                int size = 0;
 
-               g_variant_get(parameters, "(isi)", &result, &address, &size);
+               g_variant_get(parameters, "(i&si)", &result, &address, &size);
 
-               BT_DBG("address: %s", address);
-               BT_DBG("size: %d", size);
+               BT_DBG("address: %s, size: %d", address, size);
 
                _bt_convert_addr_string_to_type(pb_size.btaddr.addr,
                                                address);
@@ -1959,11 +2131,10 @@ void __bt_pbap_client_event_filter(GDBusConnection *connection,
                char *vcf_file = NULL;
                int success = -1;
 
-               g_variant_get(parameters, "(issi)", &result, &address, &vcf_file, &success);
+               g_variant_get(parameters, "(i&s&si)", &result, &address, &vcf_file, &success);
 
-               BT_DBG("address: %s", address);
-               BT_DBG("vcf_file: %s", vcf_file);
-               BT_DBG("success: %d", success);
+               BT_DBG("address: %s, vcf_file: %s, success: %d",
+                                               address, vcf_file, success);
 
                _bt_convert_addr_string_to_type(pb_pull.btaddr.addr,
                                                address);
@@ -1981,17 +2152,17 @@ void __bt_pbap_client_event_filter(GDBusConnection *connection,
                int success = -1;
                int i = 0;
 
-               g_variant_get(parameters, "(isv)", &result, &address, &string_var);
+               g_variant_get(parameters, "(i&sv)", &result, &address, &string_var);
 
                list = (gchar **)g_variant_get_strv(string_var, &count);
 
                success = !result;
-               BT_DBG("address: %s", address);
-               BT_DBG("result: %d", result);
-               BT_DBG("count: %d", count);
+
                for (i = 0; i < count; i++)
                        BT_DBG("%s", list[i]);
-               BT_DBG("success: %d", success);
+
+               BT_DBG("address: %s, result: %d, count: %d, success: %d",
+                                       address, result, count, success);
 
                _bt_convert_addr_string_to_type(vc_list.btaddr.addr,
                                                address);
@@ -2010,14 +2181,13 @@ void __bt_pbap_client_event_filter(GDBusConnection *connection,
                char *vcf_file = NULL;
                int success = -1;
 
-               g_variant_get(parameters, "(issi)", &result, &address, &vcf_file, &success);
+               g_variant_get(parameters, "(i&s&si)",
+                                       &result, &address, &vcf_file, &success);
 
-               BT_DBG("address: %s", address);
-               BT_DBG("vcf_file: %s", vcf_file);
-               BT_DBG("success: %d", success);
+               BT_DBG("address: %s, vcf_file: %s, success: %d",
+                                               address, vcf_file, success);
 
-               _bt_convert_addr_string_to_type(vc_pull.btaddr.addr,
-                                               address);
+               _bt_convert_addr_string_to_type(vc_pull.btaddr.addr, address);
                vc_pull.vcf_file = vcf_file;
                vc_pull.success = success;
                _bt_common_event_cb(BLUETOOTH_PBAP_VCARD_PULL,
@@ -2032,17 +2202,16 @@ void __bt_pbap_client_event_filter(GDBusConnection *connection,
                int success = -1;
                int i = 0;
 
-               g_variant_get(parameters, "(is@as)", &result, &address, &string_var);
+               g_variant_get(parameters, "(i&s@as)", &result, &address, &string_var);
 
                list = (gchar **)g_variant_get_strv(string_var, &count);
                success = !result;
-               BT_DBG("address: %s", address);
                for (i = 0; i < count; i++)
                        BT_DBG("%s", list[i]);
-               BT_DBG("success: %d", success);
 
-               _bt_convert_addr_string_to_type(vc_list.btaddr.addr,
-                                               address);
+               BT_DBG("address: %s success: %d", address, success);
+
+               _bt_convert_addr_string_to_type(vc_list.btaddr.addr, address);
                vc_list.vcards = list;
                vc_list.length = count;
                vc_list.success = success;
@@ -2227,6 +2396,7 @@ void __bt_rfcomm_server_event_filter(GDBusConnection *connection,
                memset(&req_ind, 0x00, sizeof(bluetooth_rfcomm_connection_request_t));
                _bt_convert_addr_string_to_type(req_ind.device_addr.addr,
                                                address);
+
                req_ind.socket_fd = socket_fd;
 
                _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_AUTHORIZE,
@@ -2331,6 +2501,26 @@ void __bt_hf_agent_event_filter(GDBusConnection *connection,
                _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_TERMINATED,
                                result, NULL,
                                event_info->cb, event_info->user_data);
+       }  else if (strcasecmp(signal_name, "FailedToDial") == 0) {
+               _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_FAILED_TO_DIAL,
+                               result, NULL,
+                               event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, "CallIdle") == 0) {
+               _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_IDLE,
+                               result, NULL,
+                               event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, "CallSetupIncoming") == 0) {
+               _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALLSETUP_INCOMING,
+                               result, NULL,
+                               event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, "CallSetupDialing") == 0) {
+               _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALLSETUP_DIALING,
+                               result, NULL,
+                               event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, "CallSetupAlerting") == 0) {
+               _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALLSETUP_ALERTING,
+                               result, NULL,
+                               event_info->cb, event_info->user_data);
        } else if (strcasecmp(signal_name, "CallStarted") == 0) {
                _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_STARTED,
                                result, NULL,
@@ -2419,6 +2609,33 @@ void __bt_hf_agent_event_filter(GDBusConnection *connection,
                _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VENDOR_DEP_CMD,
                                result, &cmd,
                                event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, "PropertyChanged") == 0) {
+               GVariant *value;
+               gchar *property;
+               bluetooth_hf_ciev_device_event_t dev_event;
+
+               g_variant_get(parameters, "(&sv)", &property, &value);
+               dev_event.value  = g_variant_get_uint16(value);
+
+               BT_DBG("Property: %s , value: %d", property, dev_event.value);
+               g_variant_unref(value);
+
+               if (strcasecmp(property, "BatteryCharge") == 0) {
+                       dev_event.event = BLUETOOTH_HF_CIEV_BATTCHG;
+                       _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CIEV_DEVICE_STATUS_CHANGED,
+                                       result, &dev_event,
+                                       event_info->cb, event_info->user_data);
+               } else if (strcasecmp(property, "SignalStrength") == 0) {
+                       dev_event.event = BLUETOOTH_HF_CIEV_SIGNAL;
+                       _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CIEV_DEVICE_STATUS_CHANGED,
+                                       result, &dev_event,
+                                       event_info->cb, event_info->user_data);
+               } else if (strcasecmp(property, "RegistrationStatus") == 0) {
+                       dev_event.event = BLUETOOTH_HF_CIEV_SERVICE;
+                       _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CIEV_DEVICE_STATUS_CHANGED,
+                                       result, &dev_event,
+                                       event_info->cb, event_info->user_data);
+               }
        }
        BT_DBG("-\n");
 }
@@ -2487,18 +2704,15 @@ void __bt_hdp_event_filter(GDBusConnection *connection,
 
 static void __bt_remove_all_events(void)
 {
-       GSList *l;
        bt_event_info_t *info;
 
-       for (l = event_list; l != NULL; l = g_slist_next(l)) {
-               info = l->data;
+       while ((info = g_slist_nth_data(event_list, 0)) != NULL)
+               _bt_unregister_event(info->event_type);
 
-               if (info)
-                       _bt_unregister_event(info->event_type);
+       if (event_list) {
+               g_slist_free(event_list);
+               event_list = NULL;
        }
-
-       g_slist_free(event_list);
-       event_list = NULL;
 }
 
 static gboolean __bt_event_is_registered(int event_type)
@@ -2555,9 +2769,8 @@ void _bt_remove_server(int server_fd)
                if (info == NULL)
                        continue;
 
-               if (info->server_fd == server_fd) {
+               if (info->server_fd == server_fd)
                        server_list = g_slist_remove(server_list, (void *)info);
-               }
 
                g_free(info);
        }
@@ -2829,3 +3042,132 @@ void _bt_unregister_name_owner_changed(void)
                owner_sig_id = -1;
        }
 }
+
+static void __bt_manager_event_filter(GDBusConnection *connection,
+                                       const gchar *sender_name,
+                                       const gchar *object_path,
+                                       const gchar *interface_name,
+                                       const gchar *signal_name,
+                                       GVariant *parameters,
+                                       gpointer user_data)
+{
+       char *path = NULL;
+       GVariantIter *interface_iter = NULL;
+       char *interface_str = NULL;
+       bt_gatt_service_change_t change;
+       char address[BT_ADDRESS_STRING_SIZE] = { 0 };
+       char secure_address[BT_ADDRESS_STRING_SIZE] = { 0 };
+       bt_user_info_t *user_info = NULL;
+
+       if (strcasecmp(signal_name, "GattServiceAdded") == 0) {
+               g_variant_get(parameters, "(&s)", &path);
+
+               _bt_convert_device_path_to_address(path, address);
+               _bt_convert_addr_string_to_type(change.device_addr.addr, address);
+               _bt_convert_addr_string_to_secure_string(secure_address, address);
+
+               if (_bluetooth_gatt_check_service_change_watcher_address(&change.device_addr)
+                       == FALSE) {
+                       BT_INFO("GATT Service [%s] added, but no watcher for %s",
+                                       path, secure_address);
+                       return;
+               } else
+                       BT_INFO("GATT Service [%s] added : %s",
+                                       path, secure_address);
+
+               change.svc_path = g_strdup(path);
+               change.change_type = BLUETOOTH_GATT_SERVICE_CHANGE_TYPE_ADD;
+
+               user_info = _bt_get_user_data(BT_COMMON);
+               if (user_info != NULL) {
+                       _bt_common_event_cb(
+                               BLUETOOTH_EVENT_GATT_CLIENT_SERVICE_CHANGED,
+                               BLUETOOTH_ERROR_NONE, &change,
+                               user_info->cb, user_info->user_data);
+               }
+
+               g_free(change.svc_path);
+       } else if (strcasecmp(signal_name, "InterfacesRemoved") == 0) {
+               g_variant_get(parameters, "(&oas)",
+                                                       &path, &interface_iter);
+
+               if (!path) {
+                       BT_ERR("Invalid adapter path");
+                       return;
+               }
+
+               _bt_convert_device_path_to_address(path, address);
+               _bt_convert_addr_string_to_type(change.device_addr.addr, address);
+               _bt_convert_addr_string_to_secure_string(secure_address, address);
+
+               if (_bluetooth_gatt_check_service_change_watcher_address(&change.device_addr)
+                       == FALSE) {
+                       BT_INFO("GATT Service [%s] removed, but no watcher for %s",
+                                       path, secure_address);
+                       return;
+               }
+
+               while (g_variant_iter_loop(interface_iter, "s", &interface_str)) {
+                       if (g_strcmp0(interface_str, GATT_SERV_INTERFACE) == 0) {
+                               change.svc_path = g_strdup(path);
+                               change.change_type = BLUETOOTH_GATT_SERVICE_CHANGE_TYPE_REMOVE;
+
+                               BT_INFO("GATT Service [%s] is removed : %s",
+                                               path, secure_address);
+
+                               user_info = _bt_get_user_data(BT_COMMON);
+                               if (user_info != NULL) {
+                                       _bt_common_event_cb(
+                                               BLUETOOTH_EVENT_GATT_CLIENT_SERVICE_CHANGED,
+                                               BLUETOOTH_ERROR_NONE, &change,
+                                               user_info->cb, user_info->user_data);
+                               }
+
+                               g_free(change.svc_path);
+                               break;
+                       }
+               }
+               g_variant_iter_free(interface_iter);
+       }
+}
+
+int _bt_register_manager_subscribe_signal(gboolean subscribe)
+{
+       GDBusConnection *g_conn;
+       static int service_added_id = -1;
+       static int interface_removed_id = -1;
+
+       g_conn = _bt_gdbus_get_system_gconn();
+       if (g_conn == NULL)
+               return BLUETOOTH_ERROR_INTERNAL;
+
+       if (subscribe == TRUE) {
+               if (service_added_id == -1) {
+                       service_added_id = g_dbus_connection_signal_subscribe(g_conn,
+                                       NULL, GATT_SERV_INTERFACE,
+                                       "GattServiceAdded", NULL, NULL, 0,
+                                       __bt_manager_event_filter,
+                                       NULL, NULL);
+               }
+               if (interface_removed_id == -1) {
+                       interface_removed_id = g_dbus_connection_signal_subscribe(g_conn,
+                                       NULL, BT_MANAGER_INTERFACE,
+                                       "InterfacesRemoved", NULL, NULL, 0,
+                                       __bt_manager_event_filter,
+                                       NULL, NULL);
+               }
+       } else {
+               if (service_added_id != -1) {
+                       g_dbus_connection_signal_unsubscribe(g_conn,
+                                       service_added_id);
+                       service_added_id = -1;
+               }
+               if (interface_removed_id != -1) {
+                       g_dbus_connection_signal_unsubscribe(g_conn,
+                                       interface_removed_id);
+                       interface_removed_id = -1;
+               }
+       }
+
+       return BLUETOOTH_ERROR_NONE;
+}
index 117e08d..aa0c4c4 100755 (executable)
 #include <stdint.h>
 
 #include "bt-common.h"
+#include "bt-event-handler.h"
+#include "bt-gatt-client.h"
 #include "bt-internal-types.h"
 #include "bt-request-sender.h"
 
-#define GATT_SERV_INTERFACE            "org.bluez.GattService1"
-#define GATT_CHAR_INTERFACE            "org.bluez.GattCharacteristic1"
-#define GATT_DESC_INTERFACE            "org.bluez.GattDescriptor1"
-
-#define GATT_USER_DESC_UUID             "00002901-0000-1000-8000-00805f9b34fb"
-#define GATT_CHAR_CLIENT_CONF          "00002902-0000-1000-8000-00805f9b34fb"
-#define GATT_CHAR_SERVER_CONF           "00002903-0000-1000-8000-00805f9b34fb"
-#define GATT_CHAR_FORMAT               "00002904-0000-1000-8000-00805f9b34fb"
+#define GATT_DEFAULT_TIMEOUT  (6 * 1000) // Dependent on supervision timeout 6 sec
 
 typedef enum {
        TYPE_NONE,
@@ -43,6 +38,8 @@ typedef enum {
        CHAR_FORMAT
 } char_descriptor_type_t;
 
+static GSList *service_monitor_list = NULL;
+
 BT_EXPORT_API int bluetooth_gatt_free_service_property(bt_gatt_service_property_t *svc_pty)
 {
        BT_DBG("+");
@@ -119,6 +116,95 @@ static char **__get_string_array_from_gptr_array(GPtrArray *gp)
        return path;
 }
 
+gboolean _bluetooth_gatt_check_service_change_watcher_address(
+               const bluetooth_device_address_t *device_addr)
+{
+       GSList *l;
+       char device_address[BT_ADDRESS_STRING_SIZE] = { 0 };
+       char secure_address[BT_ADDRESS_STRING_SIZE] = { 0 };
+
+       _bt_convert_addr_type_to_string(device_address,
+                       (unsigned char *)device_addr->addr);
+
+       for (l = service_monitor_list; l != NULL; l = l->next) {
+               char device_address2[BT_ADDRESS_STRING_SIZE] = { 0 };
+               char secure_address2[BT_ADDRESS_STRING_SIZE] = { 0 };
+               bluetooth_device_address_t *addr = l->data;
+
+               _bt_convert_addr_type_to_string(device_address2,
+                               (unsigned char *)addr->addr);
+               _bt_convert_addr_string_to_secure_string(secure_address,
+                               device_address);
+               _bt_convert_addr_string_to_secure_string(secure_address2,
+                               device_address2);
+               BT_INFO("service_monitor_list [%s] - Input [%s]",
+                               secure_address2, secure_address);
+
+               if (!memcmp(device_addr, addr,
+                               sizeof(bluetooth_device_address_t)))
+                       return TRUE;
+       }
+
+       return FALSE;
+}
+
+BT_EXPORT_API int bluetooth_gatt_set_service_change_watcher(
+               const bluetooth_device_address_t *address, gboolean enable)
+{
+       GSList *l;
+       bluetooth_device_address_t *addr = NULL;
+       char device_address[BT_ADDRESS_STRING_SIZE] = { 0 };
+       char secure_address[BT_ADDRESS_STRING_SIZE] = { 0 };
+
+       _bt_convert_addr_type_to_string(device_address,
+                       (unsigned char *)address->addr);
+       _bt_convert_addr_string_to_secure_string(secure_address,
+                       device_address);
+       BT_INFO("Set watcher for %s with %d", secure_address, enable);
+
+       if (enable == TRUE) {
+               if (service_monitor_list == NULL)
+                       _bt_register_manager_subscribe_signal(TRUE);
+
+               if (_bluetooth_gatt_check_service_change_watcher_address(address)
+                               == TRUE) {
+                       BT_INFO("The watcher is already set");
+                       return BLUETOOTH_ERROR_NONE;
+               }
+               addr = g_malloc0(sizeof(bluetooth_device_address_t));
+               memcpy(addr, address, sizeof(bluetooth_device_address_t));
+
+               if (service_monitor_list == NULL) {
+                       BT_ERR("There is NO watcher");
+                       return BLUETOOTH_ERROR_NONE;
+               }
+
+               service_monitor_list =
+                       g_slist_append(service_monitor_list, addr);
+       } else {
+               if (service_monitor_list == NULL) {
+                       BT_ERR("There is NO watcher");
+                       return BLUETOOTH_ERROR_NONE;
+               }
+
+               for (l = service_monitor_list; l != NULL; l = l->next) {
+                       addr = l->data;
+                       if (!memcmp(address, addr,
+                                       sizeof(bluetooth_device_address_t))) {
+                               service_monitor_list =
+                                       g_slist_remove(service_monitor_list, addr);
+                               g_free(addr);
+                               break;
+                       }
+               }
+
+               if (service_monitor_list == NULL)
+                       _bt_register_manager_subscribe_signal(FALSE);
+       }
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
 BT_EXPORT_API int bluetooth_gatt_get_service_property(const char *service_handle,
                                                bt_gatt_service_property_t *service)
 {
@@ -129,13 +215,13 @@ BT_EXPORT_API int bluetooth_gatt_get_service_property(const char *service_handle
        gsize len;
        char *char_handle = NULL;
        GPtrArray *gp_array  = NULL ;
-       GVariantIter *property_iter, *char_iter;
+       GVariantIter *property_iter, *char_iter = NULL;
        const gchar *key;
        GVariant *value;
 
        BT_CHECK_PARAMETER(service_handle, return);
        BT_CHECK_PARAMETER(service, return);
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        g_conn = _bt_gdbus_get_system_gconn();
        retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
@@ -173,34 +259,41 @@ BT_EXPORT_API int bluetooth_gatt_get_service_property(const char *service_handle
 
        while (g_variant_iter_loop(property_iter, "{sv}", &key, &value)) {
                if (!g_strcmp0(key, "UUID")) {
+                       char *name = NULL;
                        service->uuid = g_variant_dup_string(value, &len);
+                       _bt_get_uuid_specification_name(service->uuid, &name);
+                       BT_INFO("======> Service : %s [%s]", service->uuid, name);
+                       g_free(name);
                } else if (!g_strcmp0(key, "Primary")) {
                        service->primary = g_variant_get_boolean(value);
 
                } else if (!g_strcmp0(key, "Includes")) {
                        g_variant_get(value, "ao", &char_iter);
                        gp_array = g_ptr_array_new();
-                       while (g_variant_iter_loop(char_iter, "&o", &char_handle)) {
+                       while (g_variant_iter_loop(char_iter, "&o", &char_handle))
                                g_ptr_array_add(gp_array, (gpointer)char_handle);
-                       }
+
                        if (gp_array->len != 0) {
                                service->include_handles.count = gp_array->len;
                                service->include_handles.handle =
                                                __get_string_array_from_gptr_array(gp_array);
                        }
                        g_ptr_array_free(gp_array, TRUE);
+                       g_variant_iter_free(char_iter);
                } else if (!g_strcmp0(key, "Characteristics")) {
                        g_variant_get(value, "ao", &char_iter);
                        gp_array = g_ptr_array_new();
-                       while (g_variant_iter_loop(char_iter, "&o", &char_handle)) {
+                       while (g_variant_iter_loop(char_iter, "&o", &char_handle))
                                g_ptr_array_add(gp_array, (gpointer)char_handle);
-                       }
+
                        if (gp_array->len != 0) {
                                service->char_handle.count = gp_array->len;
                                service->char_handle.handle =
                                                __get_string_array_from_gptr_array(gp_array);
                        }
+                       BT_DBG("Characteristics count : %d", service->char_handle.count);
                        g_ptr_array_free(gp_array, TRUE);
+                       g_variant_iter_free(char_iter);
                }
        }
 
@@ -233,7 +326,7 @@ BT_EXPORT_API int bluetooth_gatt_get_primary_services(
        BT_INFO("+");
        BT_CHECK_PARAMETER(address, return);
        BT_CHECK_PARAMETER(prim_svc, return);
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        result = _bt_get_managed_objects();
        if (result == NULL)
@@ -303,7 +396,7 @@ BT_EXPORT_API int bluetooth_gatt_get_service_from_uuid(bluetooth_device_address_
        BT_CHECK_PARAMETER(address, return);
        BT_CHECK_PARAMETER(service_uuid, return);
        BT_CHECK_PARAMETER(service, return);
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        result = _bt_get_managed_objects();
        if (result == NULL)
@@ -415,6 +508,7 @@ static void __bluetooth_internal_get_char_cb(GDBusProxy *proxy,
        g_strfreev(svc_char.handle_info.handle);
        g_free(svc_char.service_handle);
        g_variant_iter_free(char_iter);
+       g_variant_unref(value);
        g_object_unref(proxy);
 }
 
@@ -429,7 +523,7 @@ BT_EXPORT_API int bluetooth_gatt_discover_service_characteristics(
        BT_DBG("+");
 
        BT_CHECK_PARAMETER(service_handle, return);
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        g_conn = _bt_gdbus_get_system_gconn();
        retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
@@ -465,27 +559,34 @@ static int __get_permission_flag(char *permission)
 
        retv_if(permission == NULL, ret);
 
-       BT_DBG("permission = %s", permission);
+       BT_INFO("permission = %s", permission);
 
-       if (!g_strcmp0(permission, "broadcast")) {
+       if (!g_strcmp0(permission, "broadcast"))
                ret = BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_BROADCAST;
-       } else if (!g_strcmp0(permission, "read")) {
+       else if (!g_strcmp0(permission, "read"))
                ret = BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_READ;
-       } else if (!g_strcmp0(permission, "write-without-response")) {
+       else if (!g_strcmp0(permission, "write-without-response"))
                ret = BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_WRITE_NO_RESPONSE;
-       } else if (!g_strcmp0(permission, "write")) {
+       else if (!g_strcmp0(permission, "write"))
                ret = BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_WRITE;
-       } else if (!g_strcmp0(permission, "notify")) {
+       else if (!g_strcmp0(permission, "notify"))
                ret = BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_NOTIFY;
-       } else if (!g_strcmp0(permission, "indicate")) {
+       else if (!g_strcmp0(permission, "indicate"))
                ret = BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_INDICATE;
-       } else if (!g_strcmp0(permission, "authenticated-signed-writes")) {
+       else if (!g_strcmp0(permission, "authenticated-signed-writes"))
                ret = BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_SIGNED_WRITE;
-       } else if (!g_strcmp0(permission, "reliable-write")) {
-               ret = BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_EXTENDED_PROPS;
-       } else if (!g_strcmp0(permission, "writable-auxiliaries")) {
-               ret = BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_EXTENDED_PROPS;
-       }
+       else if (!g_strcmp0(permission, "reliable-write"))
+               ret = BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_RELIABLE_WRITE;
+       else if (!g_strcmp0(permission, "writable-auxiliaries"))
+               ret = BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_WRITABLE_AUXILIARIES;
+       else if (!g_strcmp0(permission, "encrypt-read"))
+               ret = BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_ENCRYPT_READ;
+       else if (!g_strcmp0(permission, "encrypt-write"))
+               ret = BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_ENCRYPT_WRITE;
+       else if (!g_strcmp0(permission, "encrypt-authenticated-read"))
+               ret = BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_ENCRYPT_AUTHENTICATED_READ;
+       else if (!g_strcmp0(permission, "encrypt-authenticated-write"))
+               ret = BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_ENCRYPT_AUTHENTICATED_WRITE;
 
        return ret;
 }
@@ -514,7 +615,7 @@ BT_EXPORT_API int bluetooth_gatt_get_characteristics_property(
        BT_CHECK_PARAMETER(char_handle, return);
        BT_CHECK_PARAMETER(characteristic, return);
 
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        g_conn = _bt_gdbus_get_system_gconn();
        retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
@@ -552,15 +653,17 @@ BT_EXPORT_API int bluetooth_gatt_get_characteristics_property(
        characteristic->handle = g_strdup(char_handle);
 
        while (g_variant_iter_loop(property_iter, "{sv}", &key, &value)) {
-               BT_DBG("property");
                if (!g_strcmp0(key, "UUID")) {
+                       char *name = NULL;
                        characteristic->uuid = g_variant_dup_string(value, &len);
-                       BT_DBG("UUID of the char = %s", characteristic->uuid);
+                       _bt_get_uuid_specification_name(characteristic->uuid, &name);
+                       BT_INFO("Characteristic : %s [%s]", characteristic->uuid, name);
+                       g_free(name);
                } else if (!g_strcmp0(key, "Value")) {
                        gb_array = g_byte_array_new();
                        g_variant_get(value, "ay", &char_value_iter);
                        while (g_variant_iter_loop(char_value_iter, "y",  &char_value)) {
-                               BT_DBG("value of char = %d", char_value);
+                       //      BT_DBG("value of char = %d",char_value);
                                g_byte_array_append(gb_array, &char_value, 1);
                        }
                        g_variant_iter_free(char_value_iter);
@@ -584,9 +687,9 @@ BT_EXPORT_API int bluetooth_gatt_get_characteristics_property(
                } else if (!g_strcmp0(key, "Descriptors")) {
                        g_variant_get(value, "ao", &char_desc_iter);
                        gp_array = g_ptr_array_new();
-                       while (g_variant_iter_loop(char_desc_iter, "&o", &char_desc_handle)) {
+                       while (g_variant_iter_loop(char_desc_iter, "&o", &char_desc_handle))
                                g_ptr_array_add(gp_array, (gpointer)char_desc_handle);
-                       }
+
                        g_variant_iter_free(char_desc_iter);
                        if (gp_array->len != 0) {
                                characteristic->char_desc_handle.count = gp_array->len;
@@ -610,7 +713,6 @@ void bluetooth_gatt_get_char_from_uuid_cb(GDBusProxy *proxy,
 {
        GVariant *value;
        GVariantIter *char_iter;
-       int i, len;
        char *char_handle;
        GError *error = NULL;
        bt_user_info_t *user_info;
@@ -641,10 +743,7 @@ void bluetooth_gatt_get_char_from_uuid_cb(GDBusProxy *proxy,
 
        g_variant_get(value, "(ao)", &char_iter);
 
-       len = g_variant_get_size((GVariant *)char_iter);
-
-       for (i = 0; i < len; i++) {
-               g_variant_iter_loop(char_iter, "o",  &char_handle);
+       while (g_variant_iter_loop(char_iter, "&o",  &char_handle)) {
                if (!char_handle)
                        continue;
                ret = bluetooth_gatt_get_characteristics_property(char_handle,
@@ -668,6 +767,7 @@ void bluetooth_gatt_get_char_from_uuid_cb(GDBusProxy *proxy,
 
        bluetooth_gatt_free_char_property(&characteristic);
        g_variant_iter_free(char_iter);
+       g_variant_unref(value);
        g_free(user_data);
 }
 
@@ -681,7 +781,7 @@ BT_EXPORT_API int bluetooth_gatt_get_char_from_uuid(const char *service_handle,
 
        BT_CHECK_PARAMETER(service_handle, return);
        BT_CHECK_PARAMETER(char_uuid, return);
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        g_conn = _bt_gdbus_get_system_gconn();
        retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
@@ -728,7 +828,7 @@ BT_EXPORT_API int bluetooth_gatt_get_char_descriptor_property(
        BT_CHECK_PARAMETER(descriptor_handle, return);
        BT_CHECK_PARAMETER(descriptor, return);
 
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        g_conn = _bt_gdbus_get_system_gconn();
        retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
@@ -766,10 +866,12 @@ BT_EXPORT_API int bluetooth_gatt_get_char_descriptor_property(
        descriptor->handle = g_strdup(descriptor_handle);
 
        while (g_variant_iter_loop(property_iter, "{sv}", &key, &value)) {
-               BT_DBG("property");
                if (!g_strcmp0(key, "UUID")) {
+                       char *name = NULL;
                        descriptor->uuid = g_variant_dup_string(value, &len);
-                       BT_DBG("UUID of the char_desc = %s", descriptor->uuid);
+                       _bt_get_uuid_specification_name(descriptor->uuid, &name);
+                       BT_INFO("Descriptor : %s [%s]", descriptor->uuid, name);
+                       g_free(name);
                } else if (!g_strcmp0(key, "Value")) {
                        gb_array = g_byte_array_new();
                        g_variant_get(value, "ay", &desc_value_iter);
@@ -778,6 +880,7 @@ BT_EXPORT_API int bluetooth_gatt_get_char_descriptor_property(
                                g_byte_array_append(gb_array, &char_value, 1);
                        }
                        g_variant_iter_free(desc_value_iter);
+
                        if (gb_array->len != 0) {
                                descriptor->val = g_malloc0(gb_array->len *
                                                                sizeof(unsigned char));
@@ -808,6 +911,7 @@ static void __bluetooth_internal_read_cb(GObject *source_object,
        GByteArray *gp_byte_array = NULL;
        GVariantIter *iter;
        guint8 g_byte;
+       int ret = BLUETOOTH_ERROR_NONE;
 
        BT_DBG("+");
        user_info = _bt_get_user_data(BT_COMMON);
@@ -817,10 +921,15 @@ static void __bluetooth_internal_read_cb(GObject *source_object,
 
        if (error) {
                BT_ERR("Error : %s \n", error->message);
+               if (g_strrstr(error->message, "Not paired"))
+                       ret = BLUETOOTH_ERROR_NOT_PAIRED;
+               else
+                       ret = BLUETOOTH_ERROR_INTERNAL;
+
                g_clear_error(&error);
                if (user_info) {
                        _bt_common_event_cb(BLUETOOTH_EVENT_GATT_READ_CHAR,
-                               BLUETOOTH_ERROR_INTERNAL, NULL,
+                               ret, NULL,
                                user_info->cb, user_info->user_data);
                }
                g_free(user_data);
@@ -831,9 +940,8 @@ static void __bluetooth_internal_read_cb(GObject *source_object,
        gp_byte_array = g_byte_array_new();
        g_variant_get(value, "(ay)", &iter);
 
-       while (g_variant_iter_loop(iter, "y", &g_byte)) {
+       while (g_variant_iter_loop(iter, "y", &g_byte))
                g_byte_array_append(gp_byte_array, &g_byte, 1);
-       }
 
        if (gp_byte_array->len != 0) {
                char_value.val_len = gp_byte_array->len;
@@ -860,7 +968,7 @@ BT_EXPORT_API int bluetooth_gatt_read_characteristic_value(const char *character
        char *handle;
 
        BT_CHECK_PARAMETER(characteristic, return);
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
@@ -896,16 +1004,15 @@ BT_EXPORT_API int bluetooth_gatt_set_characteristics_value(
        BT_CHECK_PARAMETER(char_handle, return);
        BT_CHECK_PARAMETER(value, return);
        retv_if(length == 0, BLUETOOTH_ERROR_INVALID_PARAM);
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        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", value[i]);
-       }
 
        val = g_variant_new("(ay)", builder);
 
@@ -942,6 +1049,7 @@ static void __bluetooth_internal_write_cb(GObject *source_object,
        GDBusConnection *system_gconn = NULL;
        GVariant *value;
        int result = BLUETOOTH_ERROR_NONE;
+       guint8 att_ecode = 0;
 
        user_info = _bt_get_user_data(BT_COMMON);
 
@@ -952,12 +1060,20 @@ static void __bluetooth_internal_write_cb(GObject *source_object,
                BT_ERR("Error : %s \n", error->message);
                g_clear_error(&error);
                result = BLUETOOTH_ERROR_INTERNAL;
+       } else {
+               g_variant_get(value, "(y)", &att_ecode);
+               if (att_ecode) {
+                       result =  att_ecode;
+                       BT_ERR("ATT Error code: %d \n", att_ecode);
+               }
        }
+
        if (user_info) {
-               BT_DBG("result = %d", result);
                _bt_common_event_cb(BLUETOOTH_EVENT_GATT_WRITE_CHAR,
                                result, NULL,
                                user_info->cb, user_info->user_data);
+       } else {
+               BT_ERR("user info is null");
        }
 
        if (value)
@@ -978,16 +1094,15 @@ BT_EXPORT_API int bluetooth_gatt_set_characteristics_value_by_type(
        BT_CHECK_PARAMETER(char_handle, return);
        BT_CHECK_PARAMETER(value, return);
        retv_if(length == 0, BLUETOOTH_ERROR_INVALID_PARAM);
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED_INTERNAL(return);
 
        conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        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", value[i]);
-       }
 
        val = g_variant_new("ay", builder);
        g_dbus_connection_call(conn,
@@ -996,7 +1111,7 @@ BT_EXPORT_API int bluetooth_gatt_set_characteristics_value_by_type(
                        GATT_CHAR_INTERFACE,
                        "WriteValuebyType",
                        g_variant_new("(y@ay)", write_type, val),
-                       NULL,
+                       G_VARIANT_TYPE("(y)"),
                        G_DBUS_CALL_FLAGS_NONE,
                        -1, NULL,
                        (GAsyncReadyCallback)__bluetooth_internal_write_cb,
@@ -1018,7 +1133,7 @@ BT_EXPORT_API int bluetooth_gatt_set_characteristics_value_request(
        BT_CHECK_PARAMETER(char_handle, return);
        BT_CHECK_PARAMETER(value, return);
        retv_if(length == 0, BLUETOOTH_ERROR_INVALID_PARAM);
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
@@ -1221,6 +1336,7 @@ static void bluetooth_gatt_get_char_desc_cb(GDBusProxy *proxy,
        bluetooth_gatt_free_char_property(&characteristic);
 
        g_variant_iter_free(char_iter);
+       g_variant_unref(value);
        BT_DBG("-");
 }
 
@@ -1233,7 +1349,7 @@ BT_EXPORT_API int bluetooth_gatt_discover_characteristic_descriptor(
        GError *error = NULL;
 
        BT_CHECK_PARAMETER(characteristic_handle, return);
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        g_conn = _bt_gdbus_get_system_gconn();
        retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
@@ -1324,7 +1440,7 @@ BT_EXPORT_API int bluetooth_gatt_read_descriptor_value(const char *char_descript
 
        BT_DBG("+");
        BT_CHECK_PARAMETER(char_descriptor, return);
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
@@ -1357,6 +1473,7 @@ static void __bluetooth_internal_write_desc_cb(GObject *source_object,
        GDBusConnection *system_gconn = NULL;
        GVariant *value;
        int result = BLUETOOTH_ERROR_NONE;
+       guint8 att_ecode = 0;
 
        BT_DBG("+");
        user_info = _bt_get_user_data(BT_COMMON);
@@ -1368,7 +1485,14 @@ static void __bluetooth_internal_write_desc_cb(GObject *source_object,
                BT_ERR("Error : %s \n", error->message);
                g_clear_error(&error);
                result = BLUETOOTH_ERROR_INTERNAL;
+       } else {
+               g_variant_get(value, "(y)", &att_ecode);
+               if (att_ecode) {
+                       result =  att_ecode;
+                       BT_ERR("ATT Error code: %d \n", att_ecode);
+               }
        }
+
        if (user_info) {
                _bt_common_event_cb(BLUETOOTH_EVENT_GATT_WRITE_DESC,
                                result, NULL,
@@ -1393,16 +1517,15 @@ BT_EXPORT_API int bluetooth_gatt_write_descriptor_value(
        BT_CHECK_PARAMETER(desc_handle, return);
        BT_CHECK_PARAMETER(value, return);
        retv_if(length == 0, BLUETOOTH_ERROR_INVALID_PARAM);
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
        conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        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", value[i]);
-       }
 
        val = g_variant_new("(ay)", builder);
 
@@ -1412,7 +1535,7 @@ BT_EXPORT_API int bluetooth_gatt_write_descriptor_value(
                                GATT_DESC_INTERFACE,
                                "WriteValue",
                                val,
-                               NULL,
+                               G_VARIANT_TYPE("(y)"),
                                G_DBUS_CALL_FLAGS_NONE,
                                -1, NULL,
                                (GAsyncReadyCallback)__bluetooth_internal_write_desc_cb,
@@ -1440,22 +1563,21 @@ static int __bluetooth_gatt_watch_characteristics(void)
                        BT_ERR("Watch Characteristic request failed !");
 
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
        return result;
 }
 #endif
 
 BT_EXPORT_API int bluetooth_gatt_watch_characteristics(const char *char_handle)
 {
-
        GDBusConnection *conn;
        GError *error = NULL;
        int ret = BLUETOOTH_ERROR_NONE;
-       BT_DBG("+");
-       BT_CHECK_PARAMETER(char_handle, return);
 
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_PARAMETER(char_handle, return);
+       BT_CHECK_ENABLED(return);
 
-       BT_DBG("Entered characteristic handle:%s \n ", char_handle);
+       BT_INFO_C("### Enable CCCD : %s", char_handle);
 
        conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
@@ -1468,10 +1590,11 @@ BT_EXPORT_API int bluetooth_gatt_watch_characteristics(const char *char_handle)
                        NULL,
                        NULL,
                        G_DBUS_CALL_FLAGS_NONE,
-                       -1, NULL, &error);
+                       GATT_DEFAULT_TIMEOUT, NULL, &error);
 
        if (error) {
-               BT_ERR("Watch Failed: %s", error->message);
+               g_dbus_error_strip_remote_error(error);
+               BT_ERR_C("### Watch Failed: %s", error->message);
                if (g_strrstr(error->message, "Already notifying"))
                        ret = BLUETOOTH_ERROR_NONE;
                else if (g_strrstr(error->message, "In Progress"))
@@ -1502,7 +1625,7 @@ BT_EXPORT_API int bluetooth_gatt_watch_characteristics(const char *char_handle)
 }
 
 #ifndef GATT_NO_RELAY
-static void __bluetooth_gatt_unwatch_characteristics(void)
+static int __bluetooth_gatt_unwatch_characteristics(void)
 {
        int result = BLUETOOTH_ERROR_NONE;
 
@@ -1517,6 +1640,8 @@ static void __bluetooth_gatt_unwatch_characteristics(void)
                        BT_ERR("Unwatch Characteristic request failed !");
 
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
 }
 #endif
 
@@ -1529,9 +1654,9 @@ BT_EXPORT_API int bluetooth_gatt_unwatch_characteristics(const char *char_handle
        BT_DBG("+");
        BT_CHECK_PARAMETER(char_handle, return);
 
-       BT_CHECK_ENABLED_ANY(return);
+       BT_CHECK_ENABLED(return);
 
-       BT_DBG("Entered characteristic handle:%s \n ", char_handle);
+       BT_INFO("Disable CCCD : %s", char_handle);
 
        conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
@@ -1544,7 +1669,7 @@ BT_EXPORT_API int bluetooth_gatt_unwatch_characteristics(const char *char_handle
                        NULL,
                        NULL,
                        G_DBUS_CALL_FLAGS_NONE,
-                       -1, NULL, &error);
+                       GATT_DEFAULT_TIMEOUT, NULL, &error);
 
        if (error) {
                BT_ERR("Watch Failed: %s", error->message);
@@ -1554,7 +1679,7 @@ BT_EXPORT_API int bluetooth_gatt_unwatch_characteristics(const char *char_handle
 #ifndef GATT_NO_RELAY
        else {
                /* Unregister the client sender to bt-service */
-               __bluetooth_gatt_unwatch_characteristics();
+               ret = __bluetooth_gatt_unwatch_characteristics();
        }
 #endif
        BT_DBG("-");
index bfef525..2b3af4c 100644 (file)
@@ -21,6 +21,7 @@
 #include<stdlib.h>
 #include<unistd.h>
 #include<stdint.h>
+#include<stdbool.h>
 
 #include "bt-common.h"
 #include "bt-internal-types.h"
@@ -34,6 +35,7 @@ static gboolean new_service = FALSE;
 static gboolean new_char = FALSE;
 static int serv_id = 1;
 static int register_pending_cnt = 0;
+static bool is_server_started = false;
 
 /* Introspection data for the service we are exporting */
 static const gchar service_introspection_xml[] =
@@ -204,6 +206,34 @@ static struct gatt_desc_info *__bt_gatt_find_gatt_desc_info(
 
 static struct gatt_req_info *__bt_gatt_find_request_info(guint request_id);
 
+static void __bt_gatt_close_gdbus_connection(void)
+{
+       GError *err = NULL;
+
+       BT_DBG("+");
+
+       ret_if(g_conn == NULL);
+
+       if (!g_dbus_connection_flush_sync(g_conn, NULL, &err)) {
+               BT_ERR("Fail to flush the connection: %s", err->message);
+               g_error_free(err);
+               err = NULL;
+       }
+
+       if (!g_dbus_connection_close_sync(g_conn, NULL, &err)) {
+               if (err) {
+                       BT_ERR("Fail to close the dbus connection: %s", err->message);
+                       g_error_free(err);
+               }
+       }
+
+       g_object_unref(g_conn);
+
+       g_conn = NULL;
+
+       BT_DBG("-");
+}
+
 #ifdef HPS_FEATURE
 static int __bt_send_event_to_hps(int event, GVariant *var)
 {
@@ -269,7 +299,7 @@ static void __bt_gatt_manager_method_call(GDBusConnection *connection,
                                        GDBusMethodInvocation *invocation,
                                        gpointer user_data)
 {
-       GSList *l1;
+       GSList *l1 = NULL;
        int len = 0;
        int i = 0;
 
@@ -292,13 +322,19 @@ static void __bt_gatt_manager_method_call(GDBusConnection *connection,
                        GVariantBuilder *svc_builder = NULL;
                        GVariantBuilder *inner_builder = NULL;
 
-                       if (register_pending_cnt > 1) {
+                       if (register_pending_cnt > 1)
                                l1 = g_slist_nth(gatt_services, len - register_pending_cnt);
-                       } else {
+                       else
                                l1 = g_slist_last(gatt_services);
-                       }
+
                        register_pending_cnt--;
 
+                       if (l1 == NULL) {
+                               BT_ERR("gatt service list is NULL");
+                               g_dbus_method_invocation_return_value(invocation, NULL);
+                               return;
+                       }
+
                        struct gatt_service_info *serv_info = l1->data;
                        if (serv_info == NULL) {
                                BT_ERR("service info value is NULL");
@@ -1008,12 +1044,16 @@ static GDBusNodeInfo *__bt_gatt_create_method_node_info(
        if (introspection_data == NULL)
                return NULL;
 
+
+       BT_DBG("Create new node info");
        node_info = g_dbus_node_info_new_for_xml(introspection_data, &err);
 
        if (err) {
                BT_ERR("Unable to create node: %s", err->message);
                g_clear_error(&err);
+               return NULL;
        }
+
        return node_info;
 }
 
@@ -1094,9 +1134,8 @@ static struct gatt_req_info *__bt_gatt_find_request_info(guint request_id)
        for (l = gatt_requests; l != NULL; l = l->next) {
                struct gatt_req_info *req_info = l->data;
 
-               if (req_info && req_info->request_id == request_id) {
+               if (req_info && req_info->request_id == request_id)
                        return req_info;
-               }
        }
        BT_ERR("Gatt Request not found");
        return NULL;
@@ -1357,6 +1396,8 @@ void register_application_cb(GObject *object, GAsyncResult *res, gpointer user_d
                                                error->code, error->message);
                        g_clear_error(&error);
                }
+       } else {
+               g_variant_unref(result);
        }
 }
 
@@ -1380,6 +1421,8 @@ void unregister_application_cb(GObject *object, GAsyncResult *res,
                                        error->code, error->message);
                        g_clear_error(&error);
                }
+       } else {
+               g_variant_unref(result);
        }
 }
 
@@ -1397,43 +1440,78 @@ BT_EXPORT_API int bluetooth_gatt_unregister_application(void)
 {
        GDBusProxy *proxy = NULL;
 
-       proxy = __bt_gatt_gdbus_get_manager_proxy("org.bluez",
-                                       "/org/bluez/hci0", GATT_MNGR_INTERFACE);
+       if (is_server_started) {
+               proxy = __bt_gatt_gdbus_get_manager_proxy("org.bluez",
+                               "/org/bluez/hci0", GATT_MNGR_INTERFACE);
 
-       if (proxy == NULL || app_path == NULL)
-               return BLUETOOTH_ERROR_INTERNAL;
+               if (proxy == NULL || app_path == NULL)
+                       return BLUETOOTH_ERROR_INTERNAL;
 
-       BT_INFO("UnregisterApplication");
+               BT_INFO("UnregisterApplication");
 
-       /* Async Call to Unregister Service */
-       g_dbus_proxy_call(proxy,
+               /* Async Call to Unregister Service */
+               g_dbus_proxy_call(proxy,
                                "UnregisterApplication",
                                g_variant_new("(o)",
-                               app_path),
+                                       app_path),
                                G_DBUS_CALL_FLAGS_NONE, -1,
                                NULL,
                                (GAsyncReadyCallback) unregister_application_cb,
                                NULL);
 
+               is_server_started = false;
+               return BLUETOOTH_ERROR_NONE;
+       }
+
+       BT_INFO("GATT server not started");
        return BLUETOOTH_ERROR_NONE;
 }
 
 static GDBusConnection *__bt_gatt_get_gdbus_connection(void)
 {
        GDBusConnection *local_system_gconn = NULL;
+       char *address;
        GError *err = NULL;
 
        if (g_conn == NULL) {
-               g_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
+               address = g_dbus_address_get_for_bus_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
+               if (address == NULL) {
+                       if (err) {
+                               BT_ERR("Failed to get bus address: %s", err->message);
+                               g_clear_error(&err);
+                       }
+                       return NULL;
+               }
+
+               g_conn = g_dbus_connection_new_for_address_sync(address,
+                                       G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT |
+                                       G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION,
+                                       NULL, /* GDBusAuthObserver */
+                                       NULL,
+                                       &err);
                if (!g_conn) {
                        if (err) {
                                BT_ERR("Unable to connect to dbus: %s", err->message);
                                g_clear_error(&err);
                        }
-                       g_conn = NULL;
+                       return NULL;
                }
        } else if (g_dbus_connection_is_closed(g_conn)) {
-               local_system_gconn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
+               address = g_dbus_address_get_for_bus_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
+               if (address == NULL) {
+                       if (err) {
+                               BT_ERR("Failed to get bus address: %s", err->message);
+                               g_clear_error(&err);
+                       }
+                       return NULL;
+               }
+
+               local_system_gconn = g_dbus_connection_new_for_address_sync(address,
+                                       G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT |
+                                       G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION,
+                                       NULL, /* GDBusAuthObserver */
+                                       NULL,
+                                       &err);
 
                if (!local_system_gconn) {
                        BT_ERR("Unable to connect to dbus: %s", err->message);
@@ -1449,13 +1527,20 @@ static GDBusConnection *__bt_gatt_get_gdbus_connection(void)
 BT_EXPORT_API int bluetooth_gatt_init(void)
 {
        GDBusConnection *conn;
-       GDBusNodeInfo *obj_info;
        GError *error = NULL;
+       GDBusNodeInfo *node_info = NULL;
 
-       owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
-                               BT_GATT_SERVICE_NAME,
-                               G_BUS_NAME_OWNER_FLAGS_NONE,
-                               NULL, NULL, NULL, NULL, NULL);
+       if (app_path != NULL) {
+               BT_ERR("app path already exists! initialized");
+               return BLUETOOTH_ERROR_ALREADY_INITIALIZED;
+       }
+
+       if (owner_id == 0) {
+               owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
+                                       BT_GATT_SERVICE_NAME,
+                                       G_BUS_NAME_OWNER_FLAGS_NONE,
+                                       NULL, NULL, NULL, NULL, NULL);
+       }
 
        BT_DBG("owner_id is [%d]", owner_id);
        app_path = g_strdup_printf("/com/%d", getpid());
@@ -1465,30 +1550,47 @@ BT_EXPORT_API int bluetooth_gatt_init(void)
        conn = __bt_gatt_get_gdbus_connection();
        if (!conn) {
                BT_ERR("Unable to get connection");
-               return BLUETOOTH_ERROR_INTERNAL;
+               goto failed;
        }
 
        /* Register ObjectManager interface */
-       obj_info = __bt_gatt_create_method_node_info(
+       node_info = __bt_gatt_create_method_node_info(
                                        manager_introspection_xml);
 
-       if (obj_info == NULL) {
+       if (node_info == NULL) {
                BT_ERR("failed to get node info");
-               return BLUETOOTH_ERROR_INTERNAL;
+               goto failed;
        }
 
-       manager_id = g_dbus_connection_register_object(g_conn, app_path,
-                                               obj_info->interfaces[0],
-                                               &manager_interface_vtable,
-                                               NULL, NULL, &error);
+       if (manager_id == 0) {
+               BT_INFO("manager_id does not exists");
+
+               manager_id = g_dbus_connection_register_object(g_conn, app_path,
+                                                       node_info->interfaces[0],
+                                                       &manager_interface_vtable,
+                                                       NULL, NULL, &error);
+       }
 
        if (manager_id == 0) {
                BT_ERR("failed to register: %s", error->message);
                g_error_free(error);
-               return BLUETOOTH_ERROR_INTERNAL;
+               goto failed;
        }
 
        return BLUETOOTH_ERROR_NONE;
+
+failed:
+       if (owner_id)
+               g_bus_unown_name(owner_id);
+
+       g_free(app_path);
+
+       app_path = NULL;
+       owner_id = 0;
+
+       __bt_gatt_close_gdbus_connection();
+
+       return BLUETOOTH_ERROR_INTERNAL;
 }
 
 BT_EXPORT_API int bluetooth_gatt_deinit()
@@ -1496,32 +1598,41 @@ BT_EXPORT_API int bluetooth_gatt_deinit()
        int ret = BLUETOOTH_ERROR_NONE;
        /* Unown gdbus bus */
        if (owner_id) {
-
                /* remove/unregister all services */
                BT_DBG("removing all registered gatt service\n");
                bluetooth_gatt_delete_services();
 
-               g_bus_unown_name(owner_id);
-
                /* unregister the exported interface for object manager */
                g_dbus_connection_unregister_object(g_conn,
                                        manager_id);
 
+               manager_id = 0;
+
+               ret = bluetooth_gatt_unregister_application();
+               if (ret != BLUETOOTH_ERROR_NONE)
+                       BT_ERR("Fail to unregister application\n");
+
+               g_bus_unown_name(owner_id);
+               owner_id = 0;
+
+               g_free(app_path);
+               app_path = NULL;
+
                BT_DBG("Gatt service deinitialized \n");
 
                g_slist_free(gatt_services);
                gatt_services = NULL;
 
-               ret = bluetooth_gatt_unregister_application();
+               g_object_unref(manager_gproxy);
+               manager_gproxy = NULL;
 
-               if (ret == BLUETOOTH_ERROR_NONE) {
-                       g_free(app_path);
-                       app_path = NULL;
-               }
+               __bt_gatt_close_gdbus_connection();
 
                return ret;
        }
 
+       __bt_gatt_close_gdbus_connection();
+
        return BLUETOOTH_ERROR_NOT_FOUND;
 }
 
@@ -1681,9 +1792,9 @@ BT_EXPORT_API int bluetooth_gatt_add_new_characteristic(
        char_info->char_id = object_id;
        char_info->char_uuid = g_strdup(char_uuid);
 
-       for (i = 0; i < flag_count; i++) {
+       for (i = 0; i < flag_count; i++)
                char_info->char_flags[i] = char_flags[i];
-               }
+
 
        char_info->flags_length = flag_count;
 
@@ -1699,9 +1810,8 @@ BT_EXPORT_API int bluetooth_gatt_add_new_characteristic(
 
        builder2 = g_variant_builder_new(G_VARIANT_TYPE("as"));
 
-       for (i = 0; i < flag_count; i++) {
+       for (i = 0; i < flag_count; i++)
                g_variant_builder_add(builder2, "s", char_flags[i]);
-       }
 
        flags_val = g_variant_new("as", builder2);
        g_variant_builder_add(inner_builder, "{sv}", "Flags",
@@ -1780,9 +1890,8 @@ BT_EXPORT_API int bluetooth_gatt_set_characteristic_value(
 
        builder1 = g_variant_builder_new(G_VARIANT_TYPE_ARRAY);
 
-       for (i = 0; i < value_length; i++) {
+       for (i = 0; i < value_length; i++)
                g_variant_builder_add(builder1, "y", char_value[i]);
-       }
 
        char_val = g_variant_new("ay", builder1);
                g_variant_builder_add(inner_builder, "{sv}", "Value", char_val);
@@ -1841,6 +1950,7 @@ BT_EXPORT_API int bluetooth_gatt_add_descriptor(
        char_info = __bt_gatt_find_gatt_char_info(serv_path, char_path);
        if (char_info == NULL) {
                g_strfreev(line_argv);
+               g_free(serv_path);
                return BLUETOOTH_ERROR_INVALID_PARAM;
        }
 
@@ -1849,6 +1959,7 @@ BT_EXPORT_API int bluetooth_gatt_add_descriptor(
 
        if (node_info == NULL) {
                g_strfreev(line_argv);
+               g_free(serv_path);
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
@@ -1865,6 +1976,7 @@ BT_EXPORT_API int bluetooth_gatt_add_descriptor(
                g_error_free(error);
                g_free(path);
                g_strfreev(line_argv);
+               g_free(serv_path);
 
                return BLUETOOTH_ERROR_INTERNAL;
        }
@@ -1877,9 +1989,8 @@ BT_EXPORT_API int bluetooth_gatt_add_descriptor(
        desc_info->desc_id = object_id;
        desc_info->desc_uuid = g_strdup(desc_uuid);
 
-       for (i = 0; i < flag_count; i++) {
+       for (i = 0; i < flag_count; i++)
                desc_info->desc_flags[i] = desc_flags[i];
-               }
 
        desc_info->flags_length = flag_count;
 
@@ -1895,9 +2006,8 @@ BT_EXPORT_API int bluetooth_gatt_add_descriptor(
 
        builder2 = g_variant_builder_new(G_VARIANT_TYPE("as"));
 
-       for (i = 0; i < flag_count; i++) {
+       for (i = 0; i < flag_count; i++)
                g_variant_builder_add(builder2, "s", desc_flags[i]);
-       }
 
        flags_val = g_variant_new("as", builder2);
        g_variant_builder_add(inner_builder, "{sv}", "Flags",
@@ -1917,6 +2027,7 @@ BT_EXPORT_API int bluetooth_gatt_add_descriptor(
        *desc_path = g_strdup(path);
 
        g_free(path);
+       g_free(serv_path);
        g_strfreev(line_argv);
        g_variant_builder_unref(inner_builder);
        g_variant_builder_unref(builder);
@@ -1968,9 +2079,9 @@ BT_EXPORT_API int bluetooth_gatt_set_descriptor_value(
 
        builder1 = g_variant_builder_new(G_VARIANT_TYPE_ARRAY);
 
-       for (i = 0; i < value_length; i++) {
+       for (i = 0; i < value_length; i++)
                g_variant_builder_add(builder1, "y", desc_value[i]);
-       }
+
        desc_val = g_variant_new("ay", builder1);
        g_variant_builder_add(inner_builder, "{sv}", "Value", desc_val);
 
@@ -2043,27 +2154,36 @@ BT_EXPORT_API int bluetooth_gatt_register_application(void)
 {
        GDBusProxy *proxy = NULL;
 
-       if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_GATT_REGISTER_APPLICATION)
-                       == BLUETOOTH_ERROR_PERMISSION_DEINED) {
-               BT_ERR("Don't have aprivilege to use this API");
-               return BLUETOOTH_ERROR_PERMISSION_DEINED;
-       }
+       if (!is_server_started) {
 
-       proxy = __bt_gatt_gdbus_get_manager_proxy("org.bluez",
-                                       "/org/bluez/hci0", GATT_MNGR_INTERFACE);
-       if (proxy == NULL || app_path == NULL)
-               return BLUETOOTH_ERROR_INTERNAL;
+               if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_GATT_REGISTER_APPLICATION)
+                               == BLUETOOTH_ERROR_PERMISSION_DEINED) {
+                       BT_ERR("Don't have aprivilege to use this API");
+                       return BLUETOOTH_ERROR_PERMISSION_DEINED;
+               }
 
-       BT_INFO("RegisterApplication");
+               proxy = __bt_gatt_gdbus_get_manager_proxy("org.bluez",
+                               "/org/bluez/hci0", GATT_MNGR_INTERFACE);
+               if (proxy == NULL || app_path == NULL)
+                       return BLUETOOTH_ERROR_INTERNAL;
 
-       g_dbus_proxy_call(proxy,
-                       "RegisterApplication",
-                       g_variant_new("(oa{sv})",
-                       app_path, NULL),
-                       G_DBUS_CALL_FLAGS_NONE, -1,
-                       NULL,
-                       (GAsyncReadyCallback) register_application_cb,
-                       NULL);
+               BT_INFO("RegisterApplication");
+
+               g_dbus_proxy_call(proxy,
+                               "RegisterApplication",
+                               g_variant_new("(oa{sv})",
+                                       app_path, NULL),
+                               G_DBUS_CALL_FLAGS_NONE, -1,
+                               NULL,
+                               (GAsyncReadyCallback) register_application_cb,
+                               NULL);
+
+               is_server_started = true;
+
+               return BLUETOOTH_ERROR_NONE;
+       }
+
+       BT_INFO("Already RegisterApplication");
 
        return BLUETOOTH_ERROR_NONE;
 }
@@ -2120,6 +2240,7 @@ BT_EXPORT_API int bluetooth_gatt_update_characteristic(
 
        if (!__bt_gatt_get_service_state(serv_path)) {
                BT_DBG("service not registered for this characteristic \n");
+               g_free(serv_path);
                g_strfreev(line_argv);
                return BLUETOOTH_ERROR_INTERNAL;
        }
@@ -2128,9 +2249,8 @@ BT_EXPORT_API int bluetooth_gatt_update_characteristic(
        invalidated_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
 
        inner_builder = g_variant_builder_new(G_VARIANT_TYPE_ARRAY);
-       for (i = 0; i < value_length; i++) {
+       for (i = 0; i < value_length; i++)
                g_variant_builder_add(inner_builder, "y", char_value[i]);
-       }
 
        update_value = g_variant_new("ay", inner_builder);
 
@@ -2161,6 +2281,12 @@ BT_EXPORT_API int bluetooth_gatt_update_characteristic(
 
                char_info = __bt_gatt_find_gatt_char_info(serv_path, char_path);
                if (char_info == NULL) {
+                       g_free(serv_path);
+                       g_strfreev(line_argv);
+                       g_variant_builder_unref(inner_builder);
+                       g_variant_builder_unref(outer_builder);
+                       g_variant_builder_unref(invalidated_builder);
+
                        return BLUETOOTH_ERROR_INVALID_DATA;
                }
 
@@ -2168,12 +2294,12 @@ BT_EXPORT_API int bluetooth_gatt_update_characteristic(
 
                char_info->char_value = (char *)realloc(char_info->char_value, value_length);
                if (char_info->char_value) {
-                       for (i = 0; i < value_length; i++) {
+                       for (i = 0; i < value_length; i++)
                                char_info->char_value[i] = char_value[i];
-                       }
                }
        }
 
+       g_free(serv_path);
        g_strfreev(line_argv);
        g_variant_builder_unref(inner_builder);
        g_variant_builder_unref(outer_builder);
@@ -2182,13 +2308,56 @@ BT_EXPORT_API int bluetooth_gatt_update_characteristic(
        return err;
 }
 
+static void __bt_gatt_free_descriptor_info(struct gatt_desc_info *desc_info)
+{
+       int i;
+
+       if (!desc_info)
+               return;
+
+       g_free(desc_info->desc_path);
+       g_free(desc_info->desc_uuid);
+       g_free(desc_info->desc_value);
+
+       for (i = 0; i < desc_info->flags_length; i++)
+               g_free(desc_info->desc_flags[i]);
+
+       g_free(desc_info);
+}
+
+static void __bt_gatt_free_characteristic_info(struct gatt_char_info *char_info)
+{
+       int i;
+
+       if (!char_info)
+               return;
+
+       g_free(char_info->char_path);
+       g_free(char_info->char_uuid);
+       g_free(char_info->char_value);
+
+       for (i = 0; i < char_info->flags_length; i++)
+               g_free(char_info->char_flags[i]);
+
+       g_free(char_info);
+}
+
+static void __bt_gatt_free_service_info(struct gatt_service_info *svc_info)
+{
+       if (!svc_info)
+               return;
+
+       g_free(svc_info->serv_path);
+       g_free(svc_info->service_uuid);
+       g_free(svc_info);
+}
+
 BT_EXPORT_API int bluetooth_gatt_unregister_service(const char *svc_path)
 {
        GSList *l, *l1;
        struct gatt_service_info *svc_info;
        gboolean ret;
        int err = BLUETOOTH_ERROR_NONE;
-       GSList *tmp;
 
        BT_DBG("svc_path %s", svc_path);
        svc_info = __bt_gatt_find_gatt_service_info(svc_path);
@@ -2207,9 +2376,15 @@ BT_EXPORT_API int bluetooth_gatt_unregister_service(const char *svc_path)
        for (l = svc_info->char_data; l != NULL; l = l->next) {
                struct gatt_char_info *char_info = l->data;
 
+               if (char_info == NULL)
+                       break;
+
                for (l1 = char_info->desc_data; l1 != NULL; l1 = l1->next) {
                        struct gatt_desc_info *desc_info = l1->data;
 
+                       if (desc_info == NULL)
+                               break;
+
                        ret = g_dbus_connection_unregister_object(g_conn,
                                                desc_info->desc_id);
                        if (ret) {
@@ -2219,7 +2394,15 @@ BT_EXPORT_API int bluetooth_gatt_unregister_service(const char *svc_path)
                        } else {
                                err = BLUETOOTH_ERROR_INTERNAL;
                        }
+
+                       /* list remove & free */
+                       char_info->desc_data = g_slist_remove(char_info->desc_data, desc_info);
+                       __bt_gatt_free_descriptor_info(desc_info);
                }
+
+               g_slist_free(char_info->desc_data);
+               char_info->desc_data = NULL;
+
                ret = g_dbus_connection_unregister_object(g_conn,
                                        char_info->char_id);
                if (ret) {
@@ -2228,7 +2411,15 @@ BT_EXPORT_API int bluetooth_gatt_unregister_service(const char *svc_path)
                } else {
                        err = BLUETOOTH_ERROR_INTERNAL;
                }
+
+               /* list remove & free */
+               svc_info->char_data = g_slist_remove(svc_info->char_data, char_info);
+               __bt_gatt_free_characteristic_info(char_info);
        }
+
+       g_slist_free(svc_info->char_data);
+       svc_info->char_data = NULL;
+
        ret = g_dbus_connection_unregister_object(g_conn, svc_info->serv_id);
        if (ret) {
                __bt_gatt_emit_interface_removed(svc_info->serv_path,
@@ -2238,21 +2429,18 @@ BT_EXPORT_API int bluetooth_gatt_unregister_service(const char *svc_path)
        }
 
        ret = g_dbus_connection_unregister_object(g_conn, svc_info->prop_id);
-       if (ret) {
+       if (ret)
                BT_DBG("Unregistered the service on properties interface");
-       }
-
-       for (tmp = gatt_services; tmp != NULL; tmp = tmp->next) {
-               struct gatt_service_info *info = tmp->data;
 
-               if (g_strcmp0(info->serv_path, svc_path) == 0) {
-                       gatt_services = g_slist_delete_link(gatt_services, tmp->data);
-               }
-       }
+       /* list remove & free */
+       gatt_services = g_slist_remove(gatt_services, svc_info);
+       __bt_gatt_free_service_info(svc_info);
 
        new_service = FALSE;
 
-       if (gatt_services->next == NULL)
+       if (gatt_services == NULL)
+               serv_id = 1;
+       else if (gatt_services->next == NULL)
                serv_id--;
 
        return err;
@@ -2273,11 +2461,8 @@ BT_EXPORT_API int bluetooth_gatt_send_response(int request_id, guint req_type,
 
        if (req_info) {
                if (resp_state != BLUETOOTH_ERROR_NONE) {
-
-                       GQuark quark = g_quark_from_string("gatt-server");
-                       GError *err = g_error_new(quark, 0, "Application Error");
-                       g_dbus_method_invocation_return_gerror(req_info->context, err);
-                       g_error_free(err);
+                       g_dbus_method_invocation_return_dbus_error(req_info->context,
+                                               "org.bluez.Error.Failed", "Application Error");
 
                        gatt_requests = g_slist_remove(gatt_requests, req_info);
 
@@ -2337,10 +2522,13 @@ BT_EXPORT_API int bluetooth_gatt_server_set_notification(const char *char_path,
 
        if (!__bt_gatt_get_service_state(serv_path)) {
                BT_DBG("service not registered for this characteristic \n");
+               g_free(serv_path);
                g_strfreev(line_argv);
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
+       g_free(serv_path);
+
        outer_builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
        invalidated_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
 
index 9494ec1..e61a908 100755 (executable)
 #include "bt-event-handler.h"
 
 #define HID_UUID               "00001124-0000-1000-8000-00805f9b34fb"
+#define HID_DEVICE_UUID        "00001124-0000-1000-8000-00805f9b43bf"
 #define        REPORTID_MOUSE  1
 #define BT_HID_BUFFER_LEN 100
 
-/* The types of HIDP transaction */
-#define BT_HIDP_TRANSACTION_SET_PROTOCOL               0x70
-#define BT_HIDP_TRANSACTION_GET_IDLE                   0x80
-#define BT_HIDP_TRANSACTION_SET_IDLE                   0x90
-#define BT_HIDP_TRANSACTION_DATA                       0xa0
-#define BT_HIDP_TRANSACTION_DATC                       0xb0
-#define BT_HIDP_TRANSACTION_HANDSHAKE                   0x00
-#define BT_HIDP_TRANSACTION_HID_CONTROL                 0x10
-#define BT_HIDP_TRANSACTION_GET_REPORT                  0x40
-#define BT_HIDP_TRANSACTION_SET_REPORT                  0x50
-#define BT_HIDP_TRANSACTION_GET_PROTOCOL                0x60
-
-#define BT_HIDP_DATA_OUT_RTYPE                         0x02
-#define BT_HIDP_DATA_IN_RTYPE                          0x01
-
-#define BT_HIDP_HSHK_ERROR_UNSUPPORTED_REQUEST          0x03
-#define BT_HIDP_HSHK_ERROR_INVALID_PARAM                0x04
-#define BT_HIDP_HSHK_ERROR_UNKNOWN                      0x0E
-#define BT_HIDP_HSHK_ERROR_FATAL                        0x0F
-#define BT_HIDP_HSHK_OK_SUCCESSFUL                     0x00
-#define BT_HIDP_HSHK_NOT_AVAILABLE                     0x01
-#define BT_HIDP_HSHK_ERROR_INVALID_REPORT_ID           0x02
-
-/* The masks of BT_HIDP header */
-#define BT_HIDP_HEADER_PARAMETER_MASK                   0x0f
-#define BT_HIDP_HEADER_TRANSACTION_MASK                 0xf0
+/* HIDP header masks */
+#define BT_HID_HEADER_TRANS_MASK                       0xf0
+#define BT_HID_HEADER_PARAM_MASK                       0x0f
+
+/* HIDP transaction types */
+#define BT_HID_TRANS_HANDSHAKE                 0x00
+#define BT_HID_TRANS_HID_CONTROL                       0x10
+#define BT_HID_TRANS_GET_REPORT                        0x40
+#define BT_HID_TRANS_SET_REPORT                        0x50
+#define BT_HID_TRANS_GET_PROTOCOL                      0x60
+#define BT_HID_TRANS_SET_PROTOCOL                      0x70
+#define BT_HID_TRANS_GET_IDLE                  0x80
+#define BT_HID_TRANS_SET_IDLE                  0x90
+#define BT_HID_TRANS_DATA                              0xa0
+#define BT_HID_TRANS_DATC                              0xb0
+
+#define BT_HID_DATA_RTYPE_INPUT                        0x01
+#define BT_HID_DATA_RTYPE_OUTPUT                       0x02
+
+#define BT_HID_HSHK_SUCCESSFUL 0x00
+#define BT_HID_HSHK_NOT_READY  0x01
+#define BT_HID_HSHK_ERR_INVALID_REPORT_ID      0x02
+#define BT_HID_HSHK_ERR_UNSUPPORTED_REQUEST    0x03
+#define BT_HID_HSHK_ERR_INVALID_PARAMETER      0x04
+#define BT_HID_HSHK_ERR_UNKNOWN        0x0E
+#define BT_HID_HSHK_ERR_FATAL  0x0F
 
 typedef struct {
        guint object_id;
@@ -94,6 +95,67 @@ static int privilege_token_reply = 0;
 
 static gboolean __hid_disconnect(hid_connected_device_info_t *info);
 
+int _bt_hid_device_get_fd(const char *address, int *ctrl, int *intr)
+{
+
+       int ret = BLUETOOTH_ERROR_NONE;
+       char *adapter_path;
+       GVariant *result = NULL;
+       GError *err = NULL;
+       GDBusConnection *conn;
+       GDBusProxy *server_proxy;
+       int index1 = 0;
+       int index2 = 0;
+       GUnixFDList *out_fd_list = NULL;
+       conn = _bt_gdbus_get_system_gconn();
+       retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       adapter_path = _bt_get_device_object_path((char *)address);
+       retv_if(adapter_path == NULL, BLUETOOTH_ERROR_INTERNAL);
+       BT_INFO_C("Device : %s", adapter_path);
+       server_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+                       NULL, BT_BLUEZ_NAME,
+                       adapter_path, "org.bluez.Input1",  NULL, NULL);
+       g_free(adapter_path);
+
+       if (server_proxy == NULL) {
+               BT_ERR("Failed to get the network server proxy\n");
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       result = g_dbus_proxy_call_with_unix_fd_list_sync(server_proxy, "GetFD",
+                                NULL,
+                                G_DBUS_CALL_FLAGS_NONE,
+                                -1,
+                                NULL,
+                                &out_fd_list,
+                                NULL,
+                                &err);
+       if (result == NULL) {
+               if (err != NULL) {
+                       g_dbus_error_strip_remote_error(err);
+                       BT_ERR("INPUT server register Error: %s\n", err->message);
+                       if (g_strcmp0(err->message, "Already Exists") == 0)
+                               ret = BLUETOOTH_ERROR_ALREADY_INITIALIZED;
+                       else
+                               ret = BLUETOOTH_ERROR_INTERNAL;
+
+                       g_error_free(err);
+               }
+       } else {
+               g_variant_get(result, "(hh)", &index1, &index2);
+               int fd1 = g_unix_fd_list_get(out_fd_list, index1, NULL);
+               int fd2 = g_unix_fd_list_get(out_fd_list, index2, NULL);
+
+               *ctrl = fd1;
+               *intr = fd2;
+               g_object_unref(out_fd_list);
+               g_variant_unref(result);
+       }
+       g_object_unref(server_proxy);
+       return ret;
+}
+
 static hid_connected_device_info_t *__find_hid_info_with_address(const char *remote_addr)
 {
        GSList *l;
@@ -107,9 +169,14 @@ static hid_connected_device_info_t *__find_hid_info_with_address(const char *rem
 }
 
 static void __hid_connected_cb(hid_connected_device_info_t *info,
-                       bt_event_info_t *event_info)
+                       int result)
 {
        bluetooth_hid_request_t conn_info;
+       bt_event_info_t *event_info = NULL;
+
+       event_info = _bt_event_get_cb_data(BT_HID_DEVICE_EVENT);
+       if (event_info == NULL)
+               return;
 
        memset(&conn_info, 0x00, sizeof(bluetooth_hid_request_t));
        if (info->intr_fd != -1 && info->ctrl_fd == -1)
@@ -118,12 +185,59 @@ static void __hid_connected_cb(hid_connected_device_info_t *info,
                conn_info.socket_fd = info->ctrl_fd;
        _bt_convert_addr_string_to_type(conn_info.device_addr.addr, info->address);
 
-       BT_INFO_C("Connected [HID Device]");
+       if (result == BLUETOOTH_ERROR_NONE)
+               BT_INFO_C("Connected [HID Device]");
+
        _bt_common_event_cb(BLUETOOTH_HID_DEVICE_CONNECTED,
-                       BLUETOOTH_ERROR_NONE, &conn_info,
+                       result, &conn_info,
                        event_info->cb, event_info->user_data);
 }
 
+static void __hid_connect_response_cb(GDBusProxy *proxy, GAsyncResult *res,
+                       gpointer user_data)
+
+{
+       int result;
+       GError *error = NULL;
+       GVariant *ret = NULL;
+       hid_connected_device_info_t info;
+       const char *path;
+
+       BT_DBG("+");
+
+       ret = g_dbus_proxy_call_finish(proxy, res, &error);
+       if (ret == NULL) {
+               g_dbus_error_strip_remote_error(error);
+               BT_ERR("Error : %s \n", error->message);
+
+               if (g_strcmp0(error->message, "In Progress") == 0)
+                       result = BLUETOOTH_ERROR_DEVICE_BUSY;
+               else
+                       result = BLUETOOTH_ERROR_INTERNAL;
+
+               info.ctrl_fd = -1;
+               info.intr_fd = -1;
+
+               info.address = g_malloc0(BT_ADDRESS_STRING_SIZE);
+
+               path = g_dbus_proxy_get_object_path(proxy);
+               _bt_convert_device_path_to_address(path, info.address);
+
+               __hid_connected_cb(&info, result);
+
+               g_free(info.address);
+
+               g_error_free(error);
+       } else {
+               g_variant_unref(ret);
+       }
+
+       if (proxy)
+               g_object_unref(proxy);
+
+       BT_DBG("-");
+}
+
 static gboolean __hid_disconnect(hid_connected_device_info_t *info)
 {
        bluetooth_hid_request_t disconn_info;
@@ -141,13 +255,6 @@ static gboolean __hid_disconnect(hid_connected_device_info_t *info)
                info->intr_data_id = 0;
        }
 
-       if (info->intr_fd >= 0) {
-               close(info->ctrl_fd);
-               close(info->intr_fd);
-               info->intr_fd = -1;
-               info->ctrl_fd = -1;
-       }
-
        if (info->ctrl_data_io) {
                g_io_channel_shutdown(info->ctrl_data_io, TRUE, NULL);
                g_io_channel_unref(info->ctrl_data_io);
@@ -158,6 +265,12 @@ static gboolean __hid_disconnect(hid_connected_device_info_t *info)
                g_io_channel_unref(info->intr_data_io);
                info->intr_data_io = NULL;
        }
+       if (info->intr_fd >= 0) {
+               close(info->ctrl_fd);
+               close(info->intr_fd);
+               info->intr_fd = -1;
+               info->ctrl_fd = -1;
+       }
        info->disconnect_idle_id = 0;
        event_info = _bt_event_get_cb_data(BT_HID_DEVICE_EVENT);
        if (event_info == NULL)
@@ -165,7 +278,7 @@ static gboolean __hid_disconnect(hid_connected_device_info_t *info)
 
        memset(&disconn_info, 0x00, sizeof(bluetooth_hid_request_t));
        disconn_info.socket_fd = fd;
-       _bt_convert_addr_string_to_type(disconn_info.device_addr.addr, info->address);
+       _bt_convert_addr_string_to_type(disconn_info.device_addr.addr , info->address);
        _bt_common_event_cb(BLUETOOTH_HID_DEVICE_DISCONNECTED,
                        BLUETOOTH_ERROR_NONE, &disconn_info,
                        event_info->cb, event_info->user_data);
@@ -200,6 +313,13 @@ void __free_hid_info(hid_info_t *info)
        g_free(info);
 }
 
+static gboolean __is_error_by_disconnect(GError *err)
+{
+       return !g_strcmp0(err->message, "Connection reset by peer") ||
+                       !g_strcmp0(err->message, "Connection timed out") ||
+                       !g_strcmp0(err->message, "Software caused connection abort");
+}
+
 static gboolean __received_cb(GIOChannel *chan, GIOCondition cond,
                                                                gpointer data)
 {
@@ -214,140 +334,163 @@ static gboolean __received_cb(GIOChannel *chan, GIOCondition cond,
 
        if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR)) {
                BT_ERR_C("HID  disconnected: %d", info->ctrl_fd);
-               if (info->disconnect_idle_id > 0) {
-                       BT_INFO("Disconnect idle still not process remove source");
-                       g_source_remove(info->disconnect_idle_id);
-                       info->disconnect_idle_id = 0;
-               }
+                       if (info->disconnect_idle_id > 0) {
+                               BT_INFO("Disconnect idle still not process remove source");
+                               g_source_remove(info->disconnect_idle_id);
+                               info->disconnect_idle_id = 0;
+                       }
                __hid_disconnect(info);
                return FALSE;
        }
+
        status = g_io_channel_read_chars(chan, buffer, BT_RFCOMM_BUFFER_LEN,
                        &len, &err);
        if (status == G_IO_STATUS_NORMAL) {
                BT_INFO("Parsing Data");
                bluetooth_hid_received_data_t data = {0};
                header = buffer[0];
-               type = header & BT_HIDP_HEADER_TRANSACTION_MASK;
-               param = header & BT_HIDP_HEADER_PARAMETER_MASK;
+               type = header & BT_HID_HEADER_TRANS_MASK;
+               param = header & BT_HID_HEADER_PARAM_MASK;
                BT_INFO("type %d , param %d", type, param);
                BT_INFO("Data Reveived from %s" , info->address);
+
+               event_info = _bt_event_get_cb_data(BT_HID_DEVICE_EVENT);
+               if (event_info == NULL)
+                       return FALSE;
+
                data.address = g_strdup(info->address);
                switch (type) {
-                       case BT_HIDP_TRANSACTION_HANDSHAKE:
-                               BT_INFO("TRANS HANDSHAKE");
-                               data.type = HTYPE_TRANS_HANDSHAKE;
-                               data.buffer_size = len;
-                               data.buffer = (char *) malloc(sizeof(char) * len);
-                               if (data.buffer)
-                                       memcpy(data.buffer, buffer, len);
-                       break;
-                       case BT_HIDP_TRANSACTION_HID_CONTROL:
-                               BT_INFO("HID CONTROL");
-                               data.type = HTYPE_TRANS_HID_CONTROL;
-                               data.buffer_size = len;
-                               data.buffer = (char *) malloc(sizeof(char) * len);
-                               if (data.buffer)
-                                       memcpy(data.buffer, buffer, len);
-                       break;
-                       case BT_HIDP_TRANSACTION_DATA:
-                               BT_INFO("TRANS DATA");
-                               data.type = HTYPE_TRANS_DATA;
-                               if (param & BT_HIDP_DATA_IN_RTYPE) {
-                                       BT_INFO("Input Report");
-                                       data.param = PTYPE_DATA_RTYPE_INPUT;
-                                       data.buffer_size = len;
-                                       data.buffer = (char *) malloc(sizeof(char) * len);
-                                       if (data.buffer)
-                                               memcpy(data.buffer, buffer, len);
-                               } else {
-                                       BT_INFO("Out Report");
-                                       data.param = PTYPE_DATA_RTYPE_OUTPUT;
-                                       data.buffer_size = len;
-                                       data.buffer = (char *) malloc(sizeof(char) * len);
-                                       if (data.buffer)
-                                               memcpy(data.buffer, buffer, len);
-                               }
-                       break;
-                       case BT_HIDP_TRANSACTION_GET_REPORT: {
-                               BT_INFO("Get Report");
-                               data.type = HTYPE_TRANS_GET_REPORT;
-                               if (param & BT_HIDP_DATA_IN_RTYPE) {
-                                       BT_INFO("Input Report");
-                                       data.param = PTYPE_DATA_RTYPE_INPUT;
-                               } else {
-                                       BT_INFO("Output Report");
-                                       data.param = PTYPE_DATA_RTYPE_OUTPUT;
-                               }
+               case BT_HID_TRANS_HANDSHAKE:
+                       BT_INFO("TRANS HANDSHAKE");
+                       data.type = HTYPE_TRANS_HANDSHAKE;
+                       data.buffer_size = len;
+                       data.buffer = (char *) malloc(sizeof(char) * len);
+                       if (data.buffer)
+                               memcpy(data.buffer, buffer, len);
+               break;
+
+               case BT_HID_TRANS_HID_CONTROL:
+                       BT_INFO("HID CONTROL");
+                       data.type = HTYPE_TRANS_HID_CONTROL;
+                       data.buffer_size = len;
+                       data.buffer = (char *) malloc(sizeof(char) * len);
+                       if (data.buffer)
+                               memcpy(data.buffer, buffer, len);
+               break;
+
+               case BT_HID_TRANS_DATA:
+                       BT_INFO("TRANS DATA");
+                       data.type = HTYPE_TRANS_DATA;
+                       if (param & BT_HID_DATA_RTYPE_INPUT) {
+                               BT_INFO("Input Report");
+                               data.param = PTYPE_DATA_RTYPE_INPUT;
                                data.buffer_size = len;
                                data.buffer = (char *) malloc(sizeof(char) * len);
                                if (data.buffer)
                                        memcpy(data.buffer, buffer, len);
-                               break;
-                       }
-                       case BT_HIDP_TRANSACTION_SET_REPORT: {
-                               BT_INFO("Set Report");
-                               data.type = HTYPE_TRANS_SET_REPORT;
-                               if (param & BT_HIDP_DATA_IN_RTYPE) {
-                                       BT_INFO("Input Report");
-                                       data.param = PTYPE_DATA_RTYPE_INPUT;
-                               } else {
-                                       BT_INFO("Output Report");
-                                       data.param = PTYPE_DATA_RTYPE_OUTPUT;
-                               }
+                       } else {
+                               BT_INFO("Out Report");
+                               data.param = PTYPE_DATA_RTYPE_OUTPUT;
                                data.buffer_size = len;
                                data.buffer = (char *) malloc(sizeof(char) * len);
                                if (data.buffer)
                                        memcpy(data.buffer, buffer, len);
-                               break;
                        }
-                       case BT_HIDP_TRANSACTION_GET_PROTOCOL:{
-                               BT_INFO("Get_PROTOCOL");
-                               data.type = HTYPE_TRANS_GET_PROTOCOL;
+               break;
+
+               case BT_HID_TRANS_GET_REPORT: {
+                       BT_INFO("Get Report");
+                       data.type = HTYPE_TRANS_GET_REPORT;
+                       if (param & BT_HID_DATA_RTYPE_INPUT) {
+                               BT_INFO("Input Report");
                                data.param = PTYPE_DATA_RTYPE_INPUT;
-                               data.buffer_size = len;
-                               data.buffer = (char *) malloc(sizeof(char) * len);
-                               if (data.buffer)
-                                       memcpy(data.buffer, buffer, len);
-                               break;
+                       } else {
+                               BT_INFO("Output Report");
+                               data.param = PTYPE_DATA_RTYPE_OUTPUT;
                        }
-                       case BT_HIDP_TRANSACTION_SET_PROTOCOL:{
-                               BT_INFO("Set_PROTOCOL");
-                               data.type = HTYPE_TRANS_SET_PROTOCOL;
+                       data.buffer_size = len;
+                       data.buffer = (char *) malloc(sizeof(char) * len);
+                       if (data.buffer)
+                               memcpy(data.buffer, buffer, len);
+                       break;
+               }
+
+               case BT_HID_TRANS_SET_REPORT: {
+                       BT_INFO("Set Report");
+                       data.type = HTYPE_TRANS_SET_REPORT;
+                       if (param & BT_HID_DATA_RTYPE_INPUT) {
+                               BT_INFO("Input Report");
                                data.param = PTYPE_DATA_RTYPE_INPUT;
-                               data.buffer_size = len;
-                               data.buffer = (char *) malloc(sizeof(char) * len);
-                               if (data.buffer)
-                                       memcpy(data.buffer, buffer, len);
-                               break;
-                       }
-                       default: {
-                               BT_INFO("unsupported HIDP control message");
-                               BT_ERR("Send Handshake Message");
-                               guint8 type = BT_HIDP_TRANSACTION_HANDSHAKE |
-                                       BT_HIDP_HSHK_ERROR_UNSUPPORTED_REQUEST;
-                               data.type = HTYPE_TRANS_UNKNOWN;
-                               int fd = g_io_channel_unix_get_fd(chan);
-                               int bytes = write(fd,  &type, sizeof(type));
-                               BT_INFO("Bytes Written %d", bytes);
-                               break;
+                       } else {
+                               BT_INFO("Output Report");
+                               data.param = PTYPE_DATA_RTYPE_OUTPUT;
                        }
+                       data.buffer_size = len;
+                       data.buffer = (char *) malloc(sizeof(char) * len);
+                       if (data.buffer)
+                               memcpy(data.buffer, buffer, len);
+                       break;
                }
-               event_info = _bt_event_get_cb_data(BT_HID_DEVICE_EVENT);
-               if (event_info == NULL) {
-                       g_free(data.buffer);
-                       g_free((char *)data.address);
-                       return FALSE;
+
+               case BT_HID_TRANS_GET_PROTOCOL:{
+                       BT_INFO("Get_PROTOCOL");
+                       data.type = HTYPE_TRANS_GET_PROTOCOL;
+                       data.param = PTYPE_DATA_RTYPE_INPUT;
+                       data.buffer_size = len;
+                       data.buffer = (char *) malloc(sizeof(char) * len);
+                       if (data.buffer)
+                               memcpy(data.buffer, buffer, len);
+                       break;
                }
 
-               _bt_common_event_cb(BLUETOOTH_HID_DEVICE_DATA_RECEIVED,
+               case BT_HID_TRANS_SET_PROTOCOL:{
+                       BT_INFO("Set_PROTOCOL");
+                       data.type = HTYPE_TRANS_SET_PROTOCOL;
+                       data.param = PTYPE_DATA_RTYPE_INPUT;
+                       data.buffer_size = len;
+                       data.buffer = (char *) malloc(sizeof(char) * len);
+                       if (data.buffer)
+                               memcpy(data.buffer, buffer, len);
+                       break;
+               }
+
+               default: {
+                       BT_INFO("unsupported HIDP control message");
+                       BT_ERR("Send Handshake Message");
+                       guint8 type = BT_HID_TRANS_HANDSHAKE |
+                               BT_HID_HSHK_ERR_UNSUPPORTED_REQUEST;
+                       data.type = HTYPE_TRANS_UNKNOWN;
+                       int fd = g_io_channel_unix_get_fd(chan);
+                       int bytes = write(fd,  &type, sizeof(type));
+                       BT_INFO("Bytes Written %d", bytes);
+                       break;
+               }
+       }
+
+       _bt_common_event_cb(BLUETOOTH_HID_DEVICE_DATA_RECEIVED,
                                BLUETOOTH_ERROR_NONE, &data,
                                event_info->cb, event_info->user_data);
-
+       if (data.buffer)
                g_free(data.buffer);
+
+       if (data.address)
                g_free((char *)data.address);
        } else {
-               BT_INFO("Error while reading data");
+               BT_ERR("Error while reading data %d [%s]", status, info->address);
+               if (err) {
+                       BT_ERR("IO Channel read error [%s]", err->message);
+                       if (status == G_IO_STATUS_ERROR &&
+                                       __is_error_by_disconnect(err)) {
+                               BT_DBG("cond : %d", cond);
+                               g_error_free(err);
+                               __hid_disconnect(info);
+                               return FALSE;
+                       }
+                       g_error_free(err);
+               } else if (status == G_IO_STATUS_EOF) {
+                       __hid_disconnect(info);
+                       return FALSE;
+               }
        }
        return TRUE;
 }
@@ -356,7 +499,6 @@ int new_hid_connection(const char *path, int fd, bluetooth_device_address_t *add
 {
        hid_info_t *info = NULL;
        hid_connected_device_info_t *dev_info = NULL;
-       bt_event_info_t *event_info = NULL;
        char address[18];
        info = hid_info;
 
@@ -380,7 +522,7 @@ int new_hid_connection(const char *path, int fd, bluetooth_device_address_t *add
                dev_info->intr_data_io = g_io_channel_unix_new(dev_info->intr_fd);
                g_io_channel_set_encoding(dev_info->intr_data_io, NULL, NULL);
                g_io_channel_set_flags(dev_info->intr_data_io, G_IO_FLAG_NONBLOCK, NULL);
-
+               g_io_channel_set_close_on_unref(dev_info->intr_data_io, TRUE);
                dev_info->intr_data_id = g_io_add_watch(dev_info->intr_data_io,
                                G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
                                __received_cb, dev_info);
@@ -390,16 +532,14 @@ int new_hid_connection(const char *path, int fd, bluetooth_device_address_t *add
                dev_info->ctrl_data_io = g_io_channel_unix_new(dev_info->ctrl_fd);
                g_io_channel_set_encoding(dev_info->ctrl_data_io, NULL, NULL);
                g_io_channel_set_flags(dev_info->ctrl_data_io, G_IO_FLAG_NONBLOCK, NULL);
-
+               g_io_channel_set_close_on_unref(dev_info->ctrl_data_io, TRUE);
                dev_info->ctrl_data_id = g_io_add_watch(dev_info->ctrl_data_io,
                                G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
                                __received_cb, dev_info);
        }
-       if (dev_info->ctrl_fd != -1 && dev_info->intr_fd != -1) {
-               event_info = _bt_event_get_cb_data(BT_HID_DEVICE_EVENT);
-               if (event_info)
-                       __hid_connected_cb(dev_info, event_info);
-       }
+
+       if (dev_info->ctrl_fd != -1 && dev_info->intr_fd != -1)
+               __hid_connected_cb(dev_info, BLUETOOTH_ERROR_NONE);
 
        return 0;
 }
@@ -411,9 +551,9 @@ static hid_info_t *__register_method()
        path = g_strdup_printf("/org/socket/server/%d", getpid());
 
        object_id = _bt_register_new_conn(path, new_hid_connection);
-       if (object_id < 0) {
+       if (object_id < 0)
                return NULL;
-       }
+
        info = g_new(hid_info_t, 1);
        info->object_id = (guint)object_id;
        info->path = path;
@@ -423,6 +563,17 @@ static hid_info_t *__register_method()
        return info;
 }
 
+void _bluetooth_hid_free_hid_info(void)
+{
+       if (hid_info == NULL) {
+               BT_DBG("hid_info is already NULL");
+               return;
+       }
+
+       __free_hid_info(hid_info);
+       hid_info = NULL;
+}
+
 BT_EXPORT_API int bluetooth_hid_device_init(hid_cb_func_ptr callback_ptr, void *user_data)
 {
        int ret;
@@ -476,7 +627,7 @@ BT_EXPORT_API int bluetooth_hid_device_activate(void)
        if (hid_info == NULL)
                return BLUETOOTH_ERROR_INTERNAL;
 
-       hid_info->uuid = g_strdup(HID_UUID);
+       hid_info->uuid = g_strdup(HID_DEVICE_UUID);
 
        profile_info.authentication = TRUE;
        profile_info.authorization = TRUE;
@@ -486,7 +637,7 @@ BT_EXPORT_API int bluetooth_hid_device_activate(void)
        profile_info.uuid = hid_info->uuid;
 
        BT_INFO("uuid %s", profile_info.uuid);
-       result = _bt_register_profile_platform(&profile_info, FALSE);
+       result = _bt_register_profile(&profile_info, FALSE);
 
        return result;
 }
@@ -504,8 +655,8 @@ BT_EXPORT_API int bluetooth_hid_device_deactivate(void)
 
        _bt_unregister_profile(hid_info->path);
 
-       __free_hid_info(hid_info);
-       hid_info = NULL;
+       _bluetooth_hid_free_hid_info();
+
        return BLUETOOTH_ERROR_NONE;
 }
 
@@ -529,24 +680,28 @@ BT_EXPORT_API int bluetooth_hid_device_connect(const char *remote_addr)
        }
 
        memcpy(device_address, remote_addr, BT_ADDRESS_STRING_SIZE);
-       ret = _bt_connect_profile(device_address, HID_UUID, NULL, NULL);
+       ret = _bt_connect_profile(device_address, HID_DEVICE_UUID,
+                               __hid_connect_response_cb, NULL);
 
        return ret;
 }
 BT_EXPORT_API int bluetooth_hid_device_disconnect(const char *remote_addr)
 {
+       BT_CHECK_PARAMETER(remote_addr, return);
+
        if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_HID_DEVICE_DISCONNECT)
                 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
                BT_ERR("Don't have a privilege to use this API");
                return BLUETOOTH_ERROR_PERMISSION_DEINED;
        }
+
        hid_connected_device_info_t *info = NULL;
 
        info = __find_hid_info_with_address(remote_addr);
        if (info == NULL)
                return BLUETOOTH_ERROR_INVALID_PARAM;
 
-       _bt_disconnect_profile((char *)remote_addr, HID_UUID, NULL, NULL);
+       _bt_disconnect_profile((char *)remote_addr, HID_DEVICE_UUID, NULL, NULL);
 
        info->disconnect_idle_id = g_idle_add((GSourceFunc)__hid_disconnect, info);
 
@@ -558,12 +713,13 @@ BT_EXPORT_API int bluetooth_hid_device_send_mouse_event(const char *remote_addr,
 {
        int result;
        int written = 0;
-       int socket_fd;
        hid_connected_device_info_t *info = NULL;
 
+       BT_CHECK_PARAMETER(remote_addr, return);
+
        switch (privilege_token_send_mouse) {
        case 0:
-               result = _bt_check_privilege(BT_BLUEZ_SERVICE, BT_HID_DEVICE_SEND_MOUSE_EVENT);
+               result = _bt_check_privilege(BT_CHECK_PRIVILEGE, BT_HID_DEVICE_SEND_MOUSE_EVENT);
 
                if (result == BLUETOOTH_ERROR_NONE) {
                        privilege_token_send_mouse = 1; /* Have a permission */
@@ -589,6 +745,7 @@ BT_EXPORT_API int bluetooth_hid_device_send_mouse_event(const char *remote_addr,
                BT_ERR("Connection Information not found");
                return BLUETOOTH_ERROR_INVALID_PARAM;
        }
+       int socket_fd;
 
        if (info->intr_fd != -1 && info->ctrl_fd == -1)
                socket_fd = info->intr_fd;
@@ -605,12 +762,13 @@ BT_EXPORT_API int bluetooth_hid_device_send_key_event(const char *remote_addr,
 {
        int result;
        int written = 0;
-       int socket_fd;
        hid_connected_device_info_t *info = NULL;
 
+       BT_CHECK_PARAMETER(remote_addr, return);
+
        switch (privilege_token_send_key) {
        case 0:
-               result = _bt_check_privilege(BT_BLUEZ_SERVICE, BT_HID_DEVICE_SEND_KEY_EVENT);
+               result = _bt_check_privilege(BT_CHECK_PRIVILEGE, BT_HID_DEVICE_SEND_KEY_EVENT);
 
                if (result == BLUETOOTH_ERROR_NONE) {
                        privilege_token_send_key = 1; /* Have a permission */
@@ -638,6 +796,8 @@ BT_EXPORT_API int bluetooth_hid_device_send_key_event(const char *remote_addr,
                return BLUETOOTH_ERROR_INVALID_PARAM;
        }
 
+       int socket_fd;
+
        if (info->intr_fd != -1 && info->ctrl_fd == -1)
                socket_fd = info->intr_fd;
        else
@@ -647,9 +807,72 @@ BT_EXPORT_API int bluetooth_hid_device_send_key_event(const char *remote_addr,
        return written;
 }
 
+BT_EXPORT_API int bluetooth_hid_device_send_custom_event(const char *remote_addr,
+                       unsigned char btcode, unsigned char report_id,
+                       const char *data, unsigned int data_len)
+{
+       int result;
+       int written = 0;
+       int socket_fd;
+       hid_connected_device_info_t *info = NULL;
+       char *send_event = NULL;
+
+       BT_CHECK_PARAMETER(remote_addr, return);
+       BT_CHECK_PARAMETER(data, return);
+
+       switch (privilege_token_send_key) {
+       case 0:
+               result = _bt_check_privilege(BT_CHECK_PRIVILEGE, BT_HID_DEVICE_SEND_CUSTOM_EVENT);
+
+               if (result == BLUETOOTH_ERROR_NONE) {
+                       privilege_token_send_key = 1; /* Have a permission */
+               } else if (result == BLUETOOTH_ERROR_PERMISSION_DEINED) {
+                       BT_ERR("Don't have a privilege to use this API");
+                       privilege_token_send_key = -1; /* Don't have a permission */
+                       return BLUETOOTH_ERROR_PERMISSION_DEINED;
+               } else {
+                       /* Just break - It is not related with permission error */
+               }
+               break;
+       case 1:
+               /* Already have a privilege */
+               break;
+       case -1:
+               return BLUETOOTH_ERROR_PERMISSION_DEINED;
+       default:
+               /* Invalid privilge token value */
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       info = __find_hid_info_with_address(remote_addr);
+       if (info == NULL) {
+               BT_ERR("Connection Information not found");
+               return BLUETOOTH_ERROR_INVALID_PARAM;
+       }
+
+       if (info->intr_fd != -1 && info->ctrl_fd == -1)
+               socket_fd = info->intr_fd;
+       else
+               socket_fd = info->ctrl_fd;
+
+       send_event = (char*)g_malloc0(data_len + 2);
+       if (send_event == NULL)
+               return BLUETOOTH_ERROR_OUT_OF_MEMORY;
+
+       send_event[0] = (char)btcode;
+       send_event[1] = (char)report_id;
+       memcpy(send_event + 2, data, data_len);
+
+       written = write(socket_fd, send_event, data_len + 2);
+
+       g_free(send_event);
+
+       return written;
+}
+
 BT_EXPORT_API int bluetooth_hid_device_reply_to_report(const char *remote_addr,
-                               bluetooth_hid_header_type_t htype,
-                               bluetooth_hid_param_type_t ptype,
+                               bt_hid_header_type_t htype,
+                               bt_hid_param_type_t ptype,
                                const char *data,
                                unsigned int data_len)
 {
@@ -663,9 +886,11 @@ BT_EXPORT_API int bluetooth_hid_device_reply_to_report(const char *remote_addr,
                return BLUETOOTH_ERROR_INVALID_PARAM;
        }
 
+       BT_CHECK_PARAMETER(remote_addr, return);
+
        switch (privilege_token_reply) {
        case 0:
-               result = _bt_check_privilege(BT_BLUEZ_SERVICE, BT_HID_DEVICE_SEND_REPLY_TO_REPORT);
+               result = _bt_check_privilege(BT_CHECK_PRIVILEGE, BT_HID_DEVICE_SEND_REPLY_TO_REPORT);
 
                if (result == BLUETOOTH_ERROR_NONE) {
                        privilege_token_reply = 1; /* Have a permission */
@@ -689,50 +914,53 @@ BT_EXPORT_API int bluetooth_hid_device_reply_to_report(const char *remote_addr,
 
        BT_INFO("htype %d ptype %d", htype, ptype);
        switch (htype) {
-               case HTYPE_TRANS_GET_REPORT: {
-                       switch (ptype) {
-                               case PTYPE_DATA_RTYPE_INPUT: {
-                                       output_report.type = BT_HIDP_TRANSACTION_DATA |
-                                                       BT_HIDP_DATA_IN_RTYPE;
-                                       memcpy(output_report.rep_data, data, data_len);
-                                       bytes = write(info->intr_fd, &output_report,
-                                                               sizeof(output_report));
-                                       BT_DBG("Bytes Written %d", bytes);
-                                       break;
-                               }
-                               default:
-                                       BT_INFO("Not Supported");
-                                       break;
-                       }
-                       break;
-               case HTYPE_TRANS_GET_PROTOCOL: {
-                       BT_DBG("Replying to Get_PROTOCOL");
-                       output_report.type = BT_HIDP_TRANSACTION_DATA | BT_HIDP_DATA_OUT_RTYPE;
-                       output_report.rep_data[0] = data[0];
-                       bytes = write(info->intr_fd, &output_report, 2);
-                       BT_DBG("Bytes Written %d", bytes);
-                       break;
-               }
-               case HTYPE_TRANS_SET_PROTOCOL: {
-                       BT_DBG("Reply to Set_Protocol");
-                       output_report.type = BT_HIDP_TRANSACTION_DATA | BT_HIDP_DATA_IN_RTYPE;
+       case HTYPE_TRANS_GET_REPORT: {
+               switch (ptype) {
+               case PTYPE_DATA_RTYPE_INPUT: {
+                       output_report.type = BT_HID_TRANS_DATA |
+                                       BT_HID_DATA_RTYPE_INPUT;
                        memcpy(output_report.rep_data, data, data_len);
-                       bytes = write(info->ctrl_fd, &output_report,
-                                       sizeof(output_report));
+                       bytes = write(info->intr_fd, &output_report,
+                                               sizeof(output_report));
                        BT_DBG("Bytes Written %d", bytes);
                        break;
                }
-               case HTYPE_TRANS_HANDSHAKE: {
-                       BT_DBG("Replying Handshake");
-                       output_report.type = BT_HIDP_TRANSACTION_HANDSHAKE | data[0];
-                       memset(output_report.rep_data, 0, sizeof(output_report.rep_data));
-                       bytes = write(info->intr_fd,  &output_report.type,
-                                       sizeof(output_report.type));
-                       BT_DBG("Bytes Written %d", bytes);
+               default:
+                       BT_INFO("Not Supported");
                        break;
-               }
-                       default:
-                               break;
+       }
+       break;
+
+       case HTYPE_TRANS_GET_PROTOCOL: {
+               BT_DBG("Replying to Get_PROTOCOL");
+               output_report.type = BT_HID_TRANS_DATA | BT_HID_DATA_RTYPE_OUTPUT;
+               output_report.rep_data[0] = data[0];
+               bytes = write(info->intr_fd, &output_report, 2);
+               BT_DBG("Bytes Written %d", bytes);
+               break;
+       }
+
+       case HTYPE_TRANS_SET_PROTOCOL: {
+               BT_DBG("Reply to Set_Protocol");
+               output_report.type = BT_HID_TRANS_DATA | BT_HID_DATA_RTYPE_INPUT;
+               memcpy(output_report.rep_data, data, data_len);
+               bytes = write(info->ctrl_fd, &output_report,
+                               sizeof(output_report));
+               BT_DBG("Bytes Written %d", bytes);
+               break;
+       }
+
+       case HTYPE_TRANS_HANDSHAKE: {
+               BT_DBG("Replying Handshake");
+               output_report.type = BT_HID_TRANS_HANDSHAKE | data[0];
+               memset(output_report.rep_data, 0, sizeof(output_report.rep_data));
+               bytes = write(info->intr_fd,  &output_report.type,
+                               sizeof(output_report.type));
+               BT_DBG("Bytes Written %d", bytes);
+               break;
+       }
+       default:
+               break;
                }
        }
        return bytes;
index 6616778..0b99621 100644 (file)
@@ -134,3 +134,18 @@ BT_EXPORT_API int bluetooth_hid_disconnect(hid_device_address_t *device_address)
        return result;
 }
 
+BT_EXPORT_API int bluetooth_hid_enable_barcode_feature(void)
+{
+       int result;
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_HID_ENABLE_BARCODE_FEATURE,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
index b689294..590d8d1 100755 (executable)
@@ -23,7 +23,7 @@
 #include "bt-request-sender.h"
 #include "bt-event-handler.h"
 
-BT_EXPORT_API int bluetooth_le_ipsp_init(void)
+BT_EXPORT_API int bluetooth_ipsp_init(void)
 {
        int ret = IPSP_ERROR_NONE;
 
@@ -41,7 +41,7 @@ BT_EXPORT_API int bluetooth_le_ipsp_init(void)
        return ret;
 }
 
-BT_EXPORT_API int bluetooth_le_ipsp_deinit(void)
+BT_EXPORT_API int bluetooth_ipsp_deinit(void)
 {
        int ret = IPSP_ERROR_NONE;
 
@@ -59,7 +59,7 @@ BT_EXPORT_API int bluetooth_le_ipsp_deinit(void)
        return ret;
 }
 
-BT_EXPORT_API int bluetooth_le_ipsp_connect(const ipsp_device_address_t *device_address)
+BT_EXPORT_API int bluetooth_ipsp_connect(const ipsp_device_address_t *device_address)
 {
        int ret = IPSP_ERROR_NONE;
 
@@ -79,7 +79,7 @@ BT_EXPORT_API int bluetooth_le_ipsp_connect(const ipsp_device_address_t *device_
        return ret;
 }
 
-BT_EXPORT_API int bluetooth_le_ipsp_disconnect(const ipsp_device_address_t *device_address)
+BT_EXPORT_API int bluetooth_ipsp_disconnect(const ipsp_device_address_t *device_address)
 {
        int ret = IPSP_ERROR_NONE;
 
index c5744d9..1204d4a 100755 (executable)
@@ -57,7 +57,7 @@ BT_EXPORT_API int bluetooth_obex_server_init(const char *dst_path)
        if (result == BLUETOOTH_ERROR_NONE) {
                _bt_set_obex_server_id(BT_NATIVE_SERVER);
                res = _bt_register_event(BT_OPP_SERVER_EVENT, user_info->cb,
-                                       user_info->user_data);
+                       user_info->user_data);
                if (res != BLUETOOTH_ERROR_NONE)
                        BT_ERR("Fail to _bt_register_event(%d)", res);
        } else {
@@ -132,7 +132,7 @@ BT_EXPORT_API int bluetooth_obex_server_init_without_agent(const char *dst_path)
        if (result == BLUETOOTH_ERROR_NONE) {
                _bt_set_obex_server_id(BT_CUSTOM_SERVER);
                res = _bt_register_event(BT_OPP_SERVER_EVENT, user_info->cb,
-                                       user_info->user_data);
+                               user_info->user_data);
                if (res != BLUETOOTH_ERROR_NONE)
                        BT_ERR("Fail to _bt_register_event(%d)", res);
 
@@ -188,11 +188,10 @@ BT_EXPORT_API gboolean bluetooth_obex_server_is_activated(void)
        result = _bt_send_request(BT_OBEX_SERVICE, BT_OBEX_SERVER_IS_ACTIVATED,
                in_param1, in_param2, in_param3, in_param4, &out_param);
 
-       if (result == BLUETOOTH_ERROR_NONE) {
+       if (result == BLUETOOTH_ERROR_NONE)
                is_activated = g_array_index(out_param, gboolean, 0);
-       } else {
+       else
                BT_ERR("Fail to send request");
-       }
 
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
@@ -407,11 +406,10 @@ BT_EXPORT_API int bluetooth_obex_server_is_receiving(gboolean *is_receiving)
        result = _bt_send_request(BT_OBEX_SERVICE, BT_OBEX_SERVER_IS_RECEIVING,
                in_param1, in_param2, in_param3, in_param4, &out_param);
 
-       if (result == BLUETOOTH_ERROR_NONE) {
+       if (result == BLUETOOTH_ERROR_NONE)
                *is_receiving = g_array_index(out_param, gboolean, 0);
-       } else {
+       else
                BT_ERR("Fail to send request");
-       }
 
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
index dd94e69..aefd7c9 100755 (executable)
@@ -35,10 +35,8 @@ BT_EXPORT_API int bluetooth_oob_read_local_data(bt_oob_data_t *local_oob_data)
        result = _bt_send_request(BT_BLUEZ_SERVICE, BT_OOB_READ_LOCAL_DATA,
                in_param1, in_param2, in_param3, in_param4, &out_param);
 
-       if (result == BLUETOOTH_ERROR_NONE) {
-               *local_oob_data = g_array_index(out_param,
-                       bt_oob_data_t, 0);
-       }
+       if (result == BLUETOOTH_ERROR_NONE)
+               *local_oob_data = g_array_index(out_param, bt_oob_data_t, 0);
 
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
index 014806f..06f22ea 100644 (file)
@@ -58,7 +58,7 @@ BT_EXPORT_API int bluetooth_opc_deinit(void)
 }
 
 BT_EXPORT_API int bluetooth_opc_push_files(bluetooth_device_address_t *remote_address,
-                                char **file_name_array)
+                       char **file_name_array)
 {
        int result;
        int i;
@@ -191,14 +191,45 @@ BT_EXPORT_API int bluetooth_opc_is_sending(gboolean *is_sending)
        result = _bt_send_request(BT_OBEX_SERVICE, BT_OPP_IS_PUSHING_FILES,
                in_param1, in_param2, in_param3, in_param4, &out_param);
 
-       if (result == BLUETOOTH_ERROR_NONE) {
+       if (result == BLUETOOTH_ERROR_NONE)
                *is_sending = g_array_index(out_param, gboolean, 0);
-       } else {
+       else
                BT_ERR("Fail to send request");
-       }
+
 
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
        return result;
 }
 
+BT_EXPORT_API int bluetooth_opp_get_transfer_progress(bluetooth_opp_transfer_type_t transfer_type,
+               int transfer_id, unsigned char *progress)
+{
+       int result;
+       int direction = transfer_type;
+       int percentage = 0;
+       BT_CHECK_ENABLED(return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       g_array_append_vals(in_param1, &direction, sizeof(int));
+       g_array_append_vals(in_param2, &transfer_id, sizeof(int));
+
+       result = _bt_send_request(BT_OBEX_SERVICE, BT_OPP_GET_TRANSFER_PROGRESS,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       if (result == BLUETOOTH_ERROR_NONE) {
+               percentage = g_array_index(out_param, guint8, 0);
+               BT_DBG("Percentage: %d", percentage);
+       } else {
+               BT_ERR("Fail to send request");
+       }
+
+       if (progress)
+               *progress = percentage;
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
\ No newline at end of file
index 1e17ba9..1d018f8 100755 (executable)
@@ -40,7 +40,6 @@ BT_EXPORT_API int bluetooth_pbap_init(void)
        bt_user_info_t *user_info;
        int ret;
 
-       BT_CHECK_ENABLED(return);
        if (is_pbap_initialized)
                return BLUETOOTH_ERROR_ALREADY_INITIALIZED;
 
@@ -58,7 +57,7 @@ BT_EXPORT_API int bluetooth_pbap_init(void)
 BT_EXPORT_API int bluetooth_pbap_deinit(void)
 {
        int ret;
-       BT_CHECK_ENABLED(return);
+
        BT_CHECK_PBAP_INITIALIZED(return);
 
        ret = _bt_unregister_event(BT_PBAP_CLIENT_EVENT);
diff --git a/bt-api/bt-proximity.c b/bt-api/bt-proximity.c
new file mode 100644 (file)
index 0000000..6832e3f
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "bluetooth-api.h"
+#include "bt-internal-types.h"
+
+#include "bt-common.h"
+#include "bt-request-sender.h"
+#include "bt-event-handler.h"
+
+BT_EXPORT_API int bluetooth_set_proximity_property(const bluetooth_device_address_t *device_address,
+                                                       bluetooth_pxp_poperty_t property, int value)
+{
+       int result = BLUETOOTH_ERROR_INTERNAL;
+
+       BT_CHECK_PARAMETER(device_address, return);
+       BT_CHECK_ENABLED(return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+       BT_DBG("");
+
+       g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
+       g_array_append_vals(in_param2, &property, sizeof(int));
+       g_array_append_vals(in_param3, &value, sizeof(int));
+
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_PXP_SET_PROPERTY,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
+BT_EXPORT_API int bluetooth_get_proximity_property(const bluetooth_device_address_t *device_address,
+                                                       bluetooth_pxp_poperty_t property, int *value)
+{
+       int result = BLUETOOTH_ERROR_INTERNAL;
+
+       BT_CHECK_PARAMETER(device_address, return);
+       BT_CHECK_ENABLED(return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+       BT_DBG("");
+
+       g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
+       g_array_append_vals(in_param2, &property, sizeof(int));
+
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_PXP_GET_PROPERTY,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       if (result == BLUETOOTH_ERROR_NONE) {
+               if (out_param->len > 0) {
+                       *value = g_array_index(out_param,
+                                       int, 0);
+               } else {
+                       BT_ERR("out_param length is 0!!");
+               }
+       }
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
+BT_EXPORT_API int bluetooth_get_proximity_supported_services(const bluetooth_device_address_t *device_address,
+                                                       int *services_supported)
+{
+       int result = BLUETOOTH_ERROR_INTERNAL;
+
+       BT_CHECK_PARAMETER(device_address, return);
+       BT_CHECK_ENABLED(return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+       BT_DBG("");
+
+       g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
+
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_PXP_GET_SUPPORTED_SERIVCES,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       if (result == BLUETOOTH_ERROR_NONE) {
+               if (out_param->len > 0) {
+                       *services_supported = g_array_index(out_param,
+                                       int, 0);
+               } else {
+                       BT_ERR("out_param length is 0!!");
+               }
+       }
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
+BT_EXPORT_API int bluetooth_register_proximity_reporter()
+{
+       int result = BLUETOOTH_ERROR_INTERNAL;
+
+       BT_CHECK_ENABLED(return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+       BT_DBG("");
+
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_PXP_REGISTER_REPORTER,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
+BT_EXPORT_API int bluetooth_unregister_proximity_reporter()
+{
+       int result = BLUETOOTH_ERROR_INTERNAL;
+
+       BT_CHECK_ENABLED(return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+       BT_DBG("");
+
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_PXP_UNREGISTER_REPORTER,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
index bcc3c2a..943fd2a 100644 (file)
@@ -207,6 +207,13 @@ void _bt_get_event_info(int service_function, GArray *output,
                ret_if(output == NULL);
                *param_data = &g_array_index(output, char, 0);
                break;
+       case BT_REQ_ATT_MTU:
+               *event_type = BT_DEVICE_EVENT;
+               *event = BLUETOOTH_EVENT_GATT_ATT_MTU_CHANGED;
+               ret_if(output == NULL);
+               *param_data = &g_array_index(output,
+                               bluetooth_device_address_t, 0);
+               break;
        case BT_CONNECT_LE:
                *event_type = BT_DEVICE_EVENT;
                *event = BLUETOOTH_EVENT_GATT_CONNECTED;
@@ -261,8 +268,8 @@ static void __bt_fill_garray_from_variant(GVariant *var, GArray *param)
 }
 
 static void __send_request_cb(GDBusProxy *proxy,
-                     GAsyncResult *res,
-                     gpointer      user_data)
+                               GAsyncResult *res,
+                               gpointer user_data)
 {
        bluetooth_event_param_t bt_event;
        bt_req_info_t *cb_data = user_data;
@@ -329,7 +336,6 @@ static void __send_request_cb(GDBusProxy *proxy,
 
                        goto done;
                }
-
        }
 
        if (cb_data->cb == NULL)
@@ -427,7 +433,7 @@ int _bt_sync_send_request(int service_type, int service_function,
                                        in_param4->data, in_param4->len,
                                        TRUE, NULL, NULL);
                param5 = g_variant_new_from_data((const GVariantType *)"ay",
-                                       in_param5->data,        in_param5->len,
+                                       in_param5->data, in_param5->len,
                                        TRUE, NULL, NULL);
 
                ret = g_dbus_proxy_call_sync(proxy, "service_request",
index e352b81..5ee2d61 100644 (file)
@@ -54,7 +54,7 @@ static GSList *rfcomm_clients;
 typedef struct {
        char bt_addr[BT_ADDRESS_STRING_SIZE];
        int fd;
-       int watch_id;
+       guint watch_id;
        gboolean disconnected;
 } rfcomm_conn_info_t;
 
@@ -130,12 +130,11 @@ static void __bt_free_conn(rfcomm_conn_info_t *conn)
        if (conn == NULL)
                return;
 
-       if (conn->fd > 0)
-               close(conn->fd);
        if (conn->watch_id > 0) {
                g_source_remove(conn->watch_id);
                conn->watch_id = 0;
        }
+
        g_free(conn);
 
        BT_DBG("-");
@@ -182,6 +181,11 @@ static rfcomm_conn_info_t *__get_conn_info_from_address(rfcomm_cb_data_t *info,
 static void __rfcomm_client_connected_cb(rfcomm_cb_data_t *info,
        char *dev_address, int result)
 {
+       if (g_slist_find(rfcomm_clients, info) == NULL) {
+               BT_INFO("rfcomm resource is already freed");
+               return;
+       }
+
        __client_connected_cb(info, dev_address, result);
        __rfcomm_remove_conn_info_t(info, dev_address);
 
@@ -241,21 +245,26 @@ static void _bt_rfcomm_disconnect_conn_info(rfcomm_conn_info_t *conn_info,
 
        bluetooth_rfcomm_disconnection_t disconn_info;
        bt_event_info_t *event_info = NULL;
+
        if (conn_info->disconnected == FALSE)
                return;
+
        event_info = _bt_event_get_cb_data(BT_RFCOMM_CLIENT_EVENT);
        if (event_info == NULL) {
+               __rfcomm_remove_conn_info_t(info, conn_info->bt_addr);
+
                if (info->rfcomm_conns == NULL)
                        rfcomm_cb_data_remove(info);
                return;
        }
+
        memset(&disconn_info, 0x00, sizeof(bluetooth_rfcomm_disconnection_t));
        disconn_info.device_role = RFCOMM_ROLE_CLIENT;
        g_strlcpy(disconn_info.uuid, info->uuid, BLUETOOTH_UUID_STRING_MAX);
-       BT_DBG("Disconnected FD [%d]", conn_info->fd);
        _bt_convert_addr_string_to_type(disconn_info.device_addr.addr,
                                        conn_info->bt_addr);
 
+       BT_DBG("Disconnected FD [%d]", conn_info->fd);
        disconn_info.socket_fd = conn_info->fd;
 
        BT_DBG("Disconnection Result[%d] BT_ADDRESS[%s] UUID[%s] FD[%d]",
@@ -265,10 +274,8 @@ static void _bt_rfcomm_disconnect_conn_info(rfcomm_conn_info_t *conn_info,
                        BLUETOOTH_ERROR_NONE, &disconn_info,
                        event_info->cb, event_info->user_data);
 
-       if (conn_info) {
-               BT_DBG("List is present deleting it");
-               __rfcomm_remove_conn_info_t(info, conn_info->bt_addr);
-       }
+       __rfcomm_remove_conn_info_t(info, conn_info->bt_addr);
+
        if (info->rfcomm_conns == NULL)
                rfcomm_cb_data_remove(info);
 
@@ -277,8 +284,10 @@ static void _bt_rfcomm_disconnect_conn_info(rfcomm_conn_info_t *conn_info,
 
 static gboolean __rfcomm_client_disconnect(gpointer user_data)
 {
-       rfcomm_cb_data_t *info = (rfcomm_cb_data_t *) user_data;
-       BT_INFO_C("Disconnected [RFCOMM Client]");
+       rfcomm_cb_data_t *info = (rfcomm_cb_data_t *)user_data;
+
+       BT_INFO_C("### Disconnected [RFCOMM Client]");
+
        retv_if(info == NULL, FALSE);
 
        if (g_slist_find(rfcomm_clients, info) == NULL) {
@@ -286,8 +295,10 @@ static gboolean __rfcomm_client_disconnect(gpointer user_data)
                return FALSE;
        }
        info->idle_id = 0;
+
        g_slist_foreach(info->rfcomm_conns,
-               (GFunc) _bt_rfcomm_disconnect_conn_info, info);
+               (GFunc)_bt_rfcomm_disconnect_conn_info, info);
+
        BT_DBG("-");
        return FALSE;
 }
@@ -318,12 +329,17 @@ static gboolean __client_data_received_cb(GIOChannel *chan, GIOCondition cond,
        fd = g_io_channel_unix_get_fd(chan);
        if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR)) {
                BT_ERR_C("RFComm Client  disconnected: %d", fd);
+
                conn_info = __get_conn_info_from_fd(info, fd);
                if (conn_info == NULL) {
                        BT_ERR("No Connection info found with FD [%d]", fd);
                        return FALSE;
                }
-               conn_info->disconnected = TRUE;
+
+               if (conn_info->disconnected == FALSE) {
+                       close(conn_info->fd);
+                       conn_info->disconnected = TRUE;
+               }
                __rfcomm_client_disconnect(info);
                return FALSE;
        }
@@ -342,12 +358,17 @@ static gboolean __client_data_received_cb(GIOChannel *chan, GIOCondition cond,
                                        __is_error_by_disconnect(err)) {
                                BT_ERR("cond : %d", cond);
                                g_error_free(err);
+
                                conn_info = __get_conn_info_from_fd(info, fd);
                                if (conn_info == NULL) {
                                        BT_ERR("No Connection info found with FD [%d]", fd);
                                        return FALSE;
                                }
-                               conn_info->disconnected = TRUE;
+
+                               if (conn_info->disconnected == FALSE) {
+                                       close(conn_info->fd);
+                                       conn_info->disconnected = TRUE;
+                               }
                                __rfcomm_client_disconnect(info);
                                return FALSE;
                        }
@@ -380,7 +401,9 @@ static void __client_connected_cb(rfcomm_cb_data_t *cb_data, char *dev_address,
        bluetooth_rfcomm_connection_t conn_info;
        bt_event_info_t *event_info;
        rfcomm_conn_info_t *conn_list_info = NULL;
-       BT_INFO_C("Connected [RFCOMM Client]");
+
+       if (result == BLUETOOTH_ERROR_NONE)
+               BT_INFO_C("### Connected [RFCOMM Client]");
 
        event_info = _bt_event_get_cb_data(BT_RFCOMM_CLIENT_EVENT);
        if (event_info == NULL)
@@ -446,6 +469,7 @@ static void __bt_connect_response_cb(GDBusProxy *proxy, GAsyncResult *res,
 
 {
        GError *error = NULL;
+       GVariant *value;
        rfcomm_cb_data_t *cb_data;
        char dev_address[BT_ADDRESS_STRING_SIZE];
        const char *path;
@@ -455,7 +479,8 @@ static void __bt_connect_response_cb(GDBusProxy *proxy, GAsyncResult *res,
 
        cb_data = user_data;
 
-       if (!g_dbus_proxy_call_finish(proxy, res, &error)) {
+       value = g_dbus_proxy_call_finish(proxy, res, &error);
+       if (value == NULL) {
                int result;
                g_dbus_error_strip_remote_error(error);
                BT_ERR("Error : %s \n", error->message);
@@ -469,7 +494,10 @@ static void __bt_connect_response_cb(GDBusProxy *proxy, GAsyncResult *res,
                __rfcomm_client_connected_cb(cb_data, dev_address, result);
 
                g_error_free(error);
+       } else {
+               g_variant_unref(value);
        }
+
        if (proxy)
                g_object_unref(proxy);
 
@@ -482,6 +510,7 @@ static void __bt_discover_service_response_cb(GDBusProxy *proxy,
        rfcomm_cb_data_t *cb_data;
        int ret = 0;
        GError *err = NULL;
+       GVariant *value;
        bt_register_profile_info_t info = {0};
        int result = BLUETOOTH_ERROR_NONE;
        char dev_address[BT_ADDRESS_STRING_SIZE];
@@ -497,9 +526,11 @@ static void __bt_discover_service_response_cb(GDBusProxy *proxy,
 
        _bt_convert_device_path_to_address(path, dev_address);
        BT_DBG("Device Adress [%s]", dev_address);
-       g_dbus_proxy_call_finish(proxy, res, &err);
+       value = g_dbus_proxy_call_finish(proxy, res, &err);
        if (proxy)
                g_object_unref(proxy);
+       if (value)
+               g_variant_unref(value);
 
        if (err != NULL) {
                g_dbus_error_strip_remote_error(err);
@@ -904,7 +935,7 @@ BT_EXPORT_API int bluetooth_rfcomm_connect(
 #endif
 
 #ifdef RFCOMM_DIRECT
-       BT_INFO_C("<<<<<<<<< RFCOMM Connect request from app >>>>>>>>>>>");
+       BT_INFO_C("### Connect RFCOMM");
        int ret;
        int id, object_id;
        char *path;
@@ -935,6 +966,7 @@ BT_EXPORT_API int bluetooth_rfcomm_connect(
                cb_data->object_id = object_id;
                cb_data->id = id;
        }
+
        conn = g_new0(rfcomm_conn_info_t, 1);
        conn->fd = -1;
        _bt_convert_addr_type_to_string(conn->bt_addr,
@@ -942,6 +974,7 @@ BT_EXPORT_API int bluetooth_rfcomm_connect(
 
        BT_DBG("Connecting to %s uuid %s", conn->bt_addr, remote_uuid);
        cb_data->rfcomm_conns = g_slist_append(cb_data->rfcomm_conns, conn);
+
        ret = _bt_discover_services(conn->bt_addr, (char *)remote_uuid,
                                __bt_discover_service_response_cb, cb_data);
        if (ret != BLUETOOTH_ERROR_NONE) {
@@ -951,6 +984,7 @@ BT_EXPORT_API int bluetooth_rfcomm_connect(
                        rfcomm_cb_data_remove(cb_data);
                return BLUETOOTH_ERROR_INTERNAL;
        }
+
        if (g_slist_find(rfcomm_clients, cb_data) == NULL) {
                BT_INFO("Adding callback information to rfcomm_clients");
                rfcomm_clients = g_slist_append(rfcomm_clients, cb_data);
@@ -1087,7 +1121,9 @@ BT_EXPORT_API int bluetooth_rfcomm_disconnect(int socket_fd)
 #ifdef RFCOMM_DIRECT
        rfcomm_cb_data_t *info;
        rfcomm_conn_info_t *conn_info;
-       BT_INFO_C("<<<<<<<<< RFCOMM Disconnect request from app >>>>>>>>");
+
+       BT_INFO_C("### Disconnect RFCOMM");
+
        BT_CHECK_ENABLED(return);
 
        if (_bt_check_privilege(BT_BLUEZ_SERVICE, BT_RFCOMM_SOCKET_DISCONNECT)
@@ -1096,6 +1132,7 @@ BT_EXPORT_API int bluetooth_rfcomm_disconnect(int socket_fd)
                return BLUETOOTH_ERROR_PERMISSION_DEINED;
        }
 
+       BT_DBG("Requested FD %d", socket_fd);
        if (socket_fd < 0) {
                BT_ERR("Invalid FD");
                return BLUETOOTH_ERROR_INVALID_PARAM;
@@ -1107,19 +1144,28 @@ BT_EXPORT_API int bluetooth_rfcomm_disconnect(int socket_fd)
                BT_DBG("Could not find in client, so check in server");
                return bluetooth_rfcomm_server_disconnect(socket_fd);
        }
+
        conn_info = __get_conn_info_from_fd(info, socket_fd);
        if (conn_info == NULL) {
-               BT_ERR("FATAL Error");
+               BT_ERR("Could not find connection info");
                return BLUETOOTH_ERROR_INTERNAL;
        }
-       if (conn_info->watch_id <= 0) {
+
+       if (conn_info->watch_id == 0 || conn_info->disconnected) {
                BT_ERR("Invalid state");
                return BLUETOOTH_ERROR_NOT_CONNECTED;
        }
+
+       close(conn_info->fd);
        conn_info->disconnected = TRUE;
-       close(socket_fd);
+
        BT_INFO("conn_info %s", conn_info->bt_addr);
        _bt_disconnect_profile(conn_info->bt_addr, info->uuid, NULL, NULL);
+
+       /*
+        * ToDo : If idle_id is not zero, it means disconnect request is
+        * going on. Such a case, in-progress error should be returned.
+        */
        if (info->idle_id == 0)
                info->idle_id = g_idle_add(__rfcomm_client_disconnect, info);
 
@@ -1162,6 +1208,8 @@ BT_EXPORT_API int bluetooth_rfcomm_disconnect(int socket_fd)
 #endif
 }
 
+#ifdef RFCOMM_DIRECT
+#else
 static int __write_all(int fd, const char *buf, int len)
 {
        int sent = 0;
@@ -1189,6 +1237,7 @@ static int __write_all(int fd, const char *buf, int len)
        BT_DBG("-");
        return sent;
 }
+#endif
 
 BT_EXPORT_API int bluetooth_rfcomm_write(int fd, const char *buf, int length)
 {
index 016b198..86425b5 100644 (file)
 static GSList *rfcomm_nodes;
 
 typedef struct {
+       bluetooth_device_address_t addr;
+       int fd;
+       guint watch_id;
+       gboolean disconnected;
+} rfcomm_conn_t;
+
+typedef struct {
        guint object_id;
        gchar *path;
        int id;
        char *uuid;
-       int fd;
-       GIOChannel *data_io;
-       guint data_id;
-       bluetooth_device_address_t addr;
+       GSList *rfcomm_conns;
        guint disconnect_idle_id;
 } rfcomm_info_t;
 
@@ -69,12 +73,17 @@ static rfcomm_info_t *__find_rfcomm_info_with_id(int id)
 static rfcomm_info_t *__find_rfcomm_info_with_fd(int fd)
 {
        GSList *l;
+       GSList *ll;
 
        for (l = rfcomm_nodes; l != NULL; l = l->next) {
                rfcomm_info_t *info = l->data;
 
-               if (info->fd == fd)
-                       return info;
+               for (ll = info->rfcomm_conns; ll; ll = ll->next) {
+                       rfcomm_conn_t *conn = ll->data;
+
+                       if (conn && conn->fd == fd)
+                               return info;
+               }
        }
 
        return NULL;
@@ -108,6 +117,37 @@ static rfcomm_info_t *__find_rfcomm_info_with_uuid(const char *uuid)
        return NULL;
 }
 
+static rfcomm_conn_t *__find_rfcomm_conn_with_fd(rfcomm_info_t *info,
+                                                     int fd)
+{
+       GSList *l;
+       rfcomm_conn_t *conn;
+
+       for (l = info->rfcomm_conns; l; l = l->next) {
+               conn = l->data;
+
+               if (conn && conn->fd == fd)
+                       return conn;
+       }
+
+       return NULL;
+}
+
+static void __rfcomm_remove_conn(rfcomm_info_t *info, int fd)
+{
+       rfcomm_conn_t *conn;
+
+       conn = __find_rfcomm_conn_with_fd(info, fd);
+       if (conn == NULL)
+               return;
+
+       info->rfcomm_conns = g_slist_remove(info->rfcomm_conns, conn);
+
+       if (conn->watch_id > 0)
+               g_source_remove(conn->watch_id);
+       g_free(conn);
+}
+
 gboolean _check_uuid_path(char *path, char *uuid)
 {
        rfcomm_info_t *info = NULL;
@@ -121,65 +161,88 @@ gboolean _check_uuid_path(char *path, char *uuid)
        return FALSE;
 }
 
-static void __connected_cb(rfcomm_info_t *info, bt_event_info_t *event_info)
+static void __connected_cb(rfcomm_info_t *info, rfcomm_conn_t *conn,
+                          bt_event_info_t *event_info)
 {
        bluetooth_rfcomm_connection_t conn_info;
 
        memset(&conn_info, 0x00, sizeof(bluetooth_rfcomm_connection_t));
+
        conn_info.device_role = RFCOMM_ROLE_SERVER;
        g_strlcpy(conn_info.uuid, info->uuid, BLUETOOTH_UUID_STRING_MAX);
-       conn_info.socket_fd = info->fd;
-       conn_info.device_addr = info->addr;
+       conn_info.socket_fd = conn->fd;
+       conn_info.device_addr = conn->addr;
        conn_info.server_id = info->id;
 
-       BT_INFO_C("Connected [RFCOMM Server]");
+       BT_INFO_C("### Connected [RFCOMM Server]");
        _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_CONNECTED,
                        BLUETOOTH_ERROR_NONE, &conn_info,
                        event_info->cb, event_info->user_data);
 }
 
-static gboolean __rfcomm_server_disconnect(rfcomm_info_t *info)
+static void __rfcomm_server_disconnect_conn(rfcomm_conn_t *conn,
+                                           rfcomm_info_t *info)
 {
        bluetooth_rfcomm_disconnection_t disconn_info;
-       int fd = info->fd;
        bt_event_info_t *event_info;
 
-       BT_INFO_C("Disconnected [RFCOMM Server]");
+       if (conn == NULL)
+               return;
 
-       if (info->data_id > 0) {
-               g_source_remove(info->data_id);
-               info->data_id = 0;
-       }
+       if (conn->disconnected == FALSE)
+               return;
 
-       if (info->fd >= 0) {
-               close(info->fd);
-               info->fd = -1;
+       if (conn->watch_id > 0) {
+               g_source_remove(conn->watch_id);
+               conn->watch_id = 0;
        }
 
-       if (info->data_io) {
-               g_io_channel_shutdown(info->data_io, TRUE, NULL);
-               g_io_channel_unref(info->data_io);
-               info->data_io = NULL;
-       }
-       info->disconnect_idle_id = 0;
        event_info = _bt_event_get_cb_data(BT_RFCOMM_SERVER_EVENT);
-       if (event_info == NULL)
-               return FALSE;
+       if (event_info == NULL) {
+               __rfcomm_remove_conn(info, conn->fd);
+               return;
+       }
 
        memset(&disconn_info, 0x00, sizeof(bluetooth_rfcomm_disconnection_t));
        disconn_info.device_role = RFCOMM_ROLE_SERVER;
        g_strlcpy(disconn_info.uuid, info->uuid, BLUETOOTH_UUID_STRING_MAX);
-       disconn_info.socket_fd = fd;
-       disconn_info.device_addr = info->addr;
+       disconn_info.device_addr = conn->addr;
+
+       BT_DBG("Disconnected FD [%d]", conn->fd);
+       disconn_info.socket_fd = conn->fd;
 
        _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DISCONNECTED,
                        BLUETOOTH_ERROR_NONE, &disconn_info,
                        event_info->cb, event_info->user_data);
 
+       __rfcomm_remove_conn(info, conn->fd);
+}
+
+static gboolean __rfcomm_server_disconnect(rfcomm_info_t *info)
+{
+       BT_INFO_C("### Disconnected [RFCOMM Server]");
+
+       if (g_slist_find(rfcomm_nodes, info) == NULL) {
+               BT_INFO("rfcomm resource is already freed");
+               return FALSE;
+       }
+
+       info->disconnect_idle_id = 0;
+
+       g_slist_foreach(info->rfcomm_conns,
+                       (GFunc)__rfcomm_server_disconnect_conn, info);
+
        BT_DBG("-");
        return FALSE;
 }
 
+static gboolean __is_error_by_disconnect(GError *err)
+{
+       return !g_strcmp0(err->message, "Connection reset by peer") ||
+                       !g_strcmp0(err->message, "Connection timed out") ||
+                       !g_strcmp0(err->message, "Software caused connection abort");
+}
+
 static gboolean __data_received_cb(GIOChannel *chan, GIOCondition cond,
                                                                gpointer data)
 {
@@ -187,17 +250,18 @@ static gboolean __data_received_cb(GIOChannel *chan, GIOCondition cond,
        gsize len = 0;
        int result = BLUETOOTH_ERROR_NONE;
        rfcomm_info_t *info = data;
+       rfcomm_conn_t *conn;
        bt_event_info_t *event_info;
        bluetooth_rfcomm_received_data_t data_r;
        GIOStatus status = G_IO_STATUS_NORMAL;
        GError *err = NULL;
+       int fd;
 
        retv_if(info == NULL, FALSE);
 
-       event_info = _bt_event_get_cb_data(BT_RFCOMM_SERVER_EVENT);
-
+       fd = g_io_channel_unix_get_fd(chan);
        if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR)) {
-               BT_ERR_C("RFComm Server  disconnected: %d", info->fd);
+               BT_ERR_C("RFComm Server disconnected: %d", fd);
 
                if (info->disconnect_idle_id > 0) {
                        BT_INFO("Disconnect idle still not process remove source");
@@ -205,6 +269,16 @@ static gboolean __data_received_cb(GIOChannel *chan, GIOCondition cond,
                        info->disconnect_idle_id = 0;
                }
 
+               conn = __find_rfcomm_conn_with_fd(info, fd);
+               if (conn == NULL) {
+                       BT_ERR("No Connection info found with FD [%d]", fd);
+                       return FALSE;
+               }
+
+               if (conn->disconnected == FALSE) {
+                       close(conn->fd);
+                       conn->disconnected = TRUE;
+               }
                __rfcomm_server_disconnect(info);
                return FALSE;
        }
@@ -212,39 +286,53 @@ static gboolean __data_received_cb(GIOChannel *chan, GIOCondition cond,
        buffer = g_malloc0(BT_RFCOMM_BUFFER_LEN + 1);
 
        status =  g_io_channel_read_chars(chan, buffer, BT_RFCOMM_BUFFER_LEN,
-                       &len, &err);
+                                               &len, &err);
        if (status != G_IO_STATUS_NORMAL) {
                BT_ERR("IO Channel read is failed with %d", status);
 
                g_free(buffer);
-               if (err) {
-                       BT_ERR("IO Channel read error [%s]", err->message);
-                       if (status == G_IO_STATUS_ERROR &&
-                           !g_strcmp0(err->message, "Connection reset by peer")) {
-                               BT_ERR("cond : %d", cond);
-                               g_error_free(err);
-                               if (info->disconnect_idle_id > 0) {
-                                       BT_INFO("Disconnect idle still not process remove source");
-                                       g_source_remove(info->disconnect_idle_id);
-                                       info->disconnect_idle_id = 0;
-                               }
-                               __rfcomm_server_disconnect(info);
+               if (!err)
+                       return TRUE;
+
+               BT_ERR("IO Channel read error [%s]", err->message);
+               if (status == G_IO_STATUS_ERROR &&
+                   __is_error_by_disconnect(err)) {
+                       BT_ERR("cond : %d", cond);
+                       g_error_free(err);
+
+                       if (info->disconnect_idle_id > 0) {
+                               BT_INFO("Disconnect idle still not process remove source");
+                               g_source_remove(info->disconnect_idle_id);
+                               info->disconnect_idle_id = 0;
+                       }
+
+                       conn = __find_rfcomm_conn_with_fd(info, fd);
+                       if (conn == NULL) {
+                               BT_ERR("No Connection info found with FD [%d]", fd);
                                return FALSE;
                        }
-                       g_error_free(err);
+
+                       if (conn->disconnected == FALSE) {
+                               close(conn->fd);
+                               conn->disconnected = TRUE;
+                       }
+                       __rfcomm_server_disconnect(info);
+                       return FALSE;
                }
+               g_error_free(err);
                return TRUE;
        }
 
        if (len == 0)
                BT_ERR("Length is zero");
 
+       event_info = _bt_event_get_cb_data(BT_RFCOMM_SERVER_EVENT);
        if (event_info == NULL) {
                g_free(buffer);
                return TRUE;
        }
 
-       data_r.socket_fd = info->fd;
+       data_r.socket_fd = fd;
        data_r.buffer_size = len;
        data_r.buffer = buffer;
 
@@ -260,6 +348,8 @@ static gboolean __data_received_cb(GIOChannel *chan, GIOCondition cond,
 int new_server_connection(const char *path, int fd, bluetooth_device_address_t *addr)
 {
        rfcomm_info_t *info;
+       rfcomm_conn_t *conn;
+       GIOChannel *data_io;
        bt_event_info_t *event_info;
 
        BT_DBG("%s %d", path, fd);
@@ -268,22 +358,25 @@ int new_server_connection(const char *path, int fd, bluetooth_device_address_t *
        if (info == NULL)
                return -1;
 
-       info->fd = fd;
-       memcpy(&info->addr, addr, sizeof(bluetooth_device_address_t));
+       conn = g_new0(rfcomm_conn_t, 1);
+       conn->fd = fd;
+       memcpy(&conn->addr, addr, sizeof(bluetooth_device_address_t));
+       info->rfcomm_conns = g_slist_append(info->rfcomm_conns, conn);
 
-       info->data_io = g_io_channel_unix_new(info->fd);
+       data_io = g_io_channel_unix_new(conn->fd);
 
-       g_io_channel_set_encoding(info->data_io, NULL, NULL);
-       g_io_channel_set_flags(info->data_io, G_IO_FLAG_NONBLOCK, NULL);
+       g_io_channel_set_encoding(data_io, NULL, NULL);
+       g_io_channel_set_flags(data_io, G_IO_FLAG_NONBLOCK, NULL);
 
-       info->data_id = g_io_add_watch(info->data_io,
+       conn->watch_id = g_io_add_watch(data_io,
                           G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
                           __data_received_cb, info);
 
+       g_io_channel_unref(data_io);
+
        event_info = _bt_event_get_cb_data(BT_RFCOMM_SERVER_EVENT);
-       if (event_info) {
-               __connected_cb(info, event_info);
-       }
+       if (event_info)
+               __connected_cb(info, conn, event_info);
 
        return 0;
 }
@@ -306,11 +399,10 @@ static rfcomm_info_t *__register_method()
                __rfcomm_delete_id(id);
                return NULL;
        }
-       info = g_new(rfcomm_info_t, 1);
+       info = g_new0(rfcomm_info_t, 1);
        info->object_id = (guint)object_id;
        info->path = path;
        info->id = id;
-       info->fd = -1;
 
        rfcomm_nodes = g_slist_append(rfcomm_nodes, info);
 
@@ -323,25 +415,32 @@ static rfcomm_info_t *__register_method_2(const char *path, const char *bus_name
        int object_id;
 
        object_id = _bt_register_new_conn_ex(path, bus_name, new_server_connection);
-       if (object_id < 0) {
+       if (object_id < 0)
                return NULL;
-       }
-       info = g_new(rfcomm_info_t, 1);
+
+       info = g_new0(rfcomm_info_t, 1);
        info->object_id = (guint)object_id;
        info->path = g_strdup(path);
        info->id = -1;
-       info->fd = -1;
 
        rfcomm_nodes = g_slist_append(rfcomm_nodes, info);
 
        return info;
 }
 
-void free_rfcomm_info(rfcomm_info_t *info)
+void free_rfcomm_conn(rfcomm_conn_t *conn, rfcomm_info_t *info)
 {
-       bt_event_info_t *event_info;
+       if (conn->disconnected == FALSE) {
+               close(conn->fd);
+               conn->disconnected = TRUE;
+       }
+       __rfcomm_server_disconnect_conn(conn, info);
+}
 
+void free_rfcomm_info(rfcomm_info_t *info)
+{
        BT_DBG("");
+
        if (info->disconnect_idle_id > 0) {
                BT_INFO("Disconnect idle still not process remove source");
                g_source_remove(info->disconnect_idle_id);
@@ -351,12 +450,7 @@ void free_rfcomm_info(rfcomm_info_t *info)
        __rfcomm_delete_id(info->id);
        _bt_unregister_gdbus(info->object_id);
 
-       if (info->fd >= 0) {
-               event_info = _bt_event_get_cb_data(BT_RFCOMM_SERVER_EVENT);
-               if (event_info)
-                       BT_DBG("event type %d", event_info->event_type);
-               __rfcomm_server_disconnect(info);
-       }
+       g_slist_foreach(info->rfcomm_conns, (GFunc)free_rfcomm_conn, info);
 
        g_free(info->path);
        g_free(info->uuid);
@@ -937,7 +1031,7 @@ BT_EXPORT_API int bluetooth_rfcomm_create_socket(const char *uuid)
        BT_INFO("UUID Provided %s", uuid);
 
        if (_bt_check_privilege(BT_BLUEZ_SERVICE, BT_RFCOMM_CREATE_SOCKET)
-                       == BLUETOOTH_ERROR_PERMISSION_DEINED) {
+               == BLUETOOTH_ERROR_PERMISSION_DEINED) {
                BT_ERR("Don't have a privilege to use this API");
                return BLUETOOTH_ERROR_PERMISSION_DEINED;
        }
@@ -1075,7 +1169,7 @@ BT_EXPORT_API int bluetooth_rfcomm_remove_socket_ex(const char *uuid)
                return BLUETOOTH_ERROR_PERMISSION_DEINED;
        }
 
-       BT_INFO("<<<<<<<<< RFCOMM Remove socket request from app, uuid=[%s] >>>>>>>>>>>", uuid);
+       BT_INFO("RFCOMM Remove socket request from app, uuid=[%s]", uuid);
 
        info = __find_rfcomm_info_with_uuid(uuid);
        if (info == NULL)
@@ -1097,10 +1191,11 @@ BT_EXPORT_API int bluetooth_rfcomm_server_disconnect(int socket_fd)
 {
 #ifdef RFCOMM_DIRECT
        rfcomm_info_t *info;
+       rfcomm_conn_t *conn;
 
        char address[20];
 
-       BT_INFO(">>>>>>>>RFCOMM server disconnect request from APP>>>>>>>>>");
+       BT_INFO("### Disconnect RFCOMM server");
        if (socket_fd < 0) {
                BT_ERR("Invalid FD");
                return BLUETOOTH_ERROR_INVALID_PARAM;
@@ -1110,19 +1205,24 @@ BT_EXPORT_API int bluetooth_rfcomm_server_disconnect(int socket_fd)
        if (info == NULL)
                return BLUETOOTH_ERROR_INVALID_PARAM;
 
-       if (info->data_io == NULL)
+       conn = __find_rfcomm_conn_with_fd(info, socket_fd);
+       if (conn == NULL)
+               return BLUETOOTH_ERROR_INVALID_PARAM;
+
+       if (conn->watch_id == 0 || conn->disconnected)
                return BLUETOOTH_ERROR_NOT_CONNECTED;
 
-       g_io_channel_shutdown(info->data_io, TRUE, NULL);
-       g_io_channel_unref(info->data_io);
-       info->data_io = NULL;
+       close(conn->fd);
+       conn->disconnected = TRUE;
+
+       _bt_convert_addr_type_to_string(address, conn->addr.addr);
 
-       _bt_convert_addr_type_to_string(address, info->addr.addr);
        BT_DBG("Address %s", address);
        _bt_disconnect_profile(address, info->uuid, NULL, NULL);
 
-       info->disconnect_idle_id = g_idle_add((GSourceFunc)
-                                                       __rfcomm_server_disconnect, info);
+       if (info->disconnect_idle_id == 0)
+               info->disconnect_idle_id = g_idle_add(
+                               (GSourceFunc)__rfcomm_server_disconnect, info);
        BT_DBG("-");
 
        return BLUETOOTH_ERROR_NONE;
@@ -1173,9 +1273,8 @@ BT_EXPORT_API gboolean bluetooth_rfcomm_is_server_uuid_available(const char *uui
 
        BT_DBG("result: %x", result);
 
-       if (result == BLUETOOTH_ERROR_NONE) {
+       if (result == BLUETOOTH_ERROR_NONE)
                available = g_array_index(out_param, gboolean, 0);
-       }
 
        BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
@@ -1186,12 +1285,13 @@ BT_EXPORT_API gboolean bluetooth_rfcomm_is_server_uuid_available(const char *uui
 
 BT_EXPORT_API int bluetooth_rfcomm_server_is_connected(const bluetooth_device_address_t *device_address, gboolean *connected)
 {
-       char input_addr[BT_ADDRESS_STRING_SIZE] = { 0 };
 #ifdef RFCOMM_DIRECT
        GSList *l;
+       GSList *ll;
        rfcomm_info_t *info;
-       char connected_addr[BT_ADDRESS_STRING_SIZE] = { 0 };
+       rfcomm_conn_t *conn;
 #else
+       char input_addr[BT_ADDRESS_STRING_SIZE] = { 0 };
        rfcomm_remote_client_info_t *info;
 #endif
 
@@ -1199,17 +1299,21 @@ BT_EXPORT_API int bluetooth_rfcomm_server_is_connected(const bluetooth_device_ad
        BT_CHECK_PARAMETER(connected, return);
 
        *connected = FALSE;
-       _bt_convert_addr_type_to_string(input_addr, (unsigned char *)device_address->addr);
 
 #ifdef RFCOMM_DIRECT
-       for (l = rfcomm_nodes; l != NULL; l = l->next) {
+       for (l = rfcomm_nodes; l; l = l->next) {
                info = l->data;
 
-               if (info == NULL)
+               if (info == NULL || info->rfcomm_conns == NULL)
                        continue;
-               _bt_convert_addr_type_to_string(connected_addr, info->addr.addr);
 
-               if (g_strcmp0(connected_addr, input_addr) == 0) {
+               for (ll = info->rfcomm_conns; ll; ll = ll->next) {
+                       conn = ll->data;
+
+                       if (memcmp(device_address, &conn->addr,
+                                       sizeof(bluetooth_device_address_t)))
+                               continue;
+
                        *connected = TRUE;
                        return BLUETOOTH_ERROR_NONE;
                }
@@ -1217,11 +1321,12 @@ BT_EXPORT_API int bluetooth_rfcomm_server_is_connected(const bluetooth_device_ad
 
        return BLUETOOTH_ERROR_NONE;
 #else
+       _bt_convert_addr_type_to_string(input_addr, (unsigned char *)device_address->addr);
        info = __get_rfcomm_rem_client_info_with_addr(input_addr);
        if (info)
                *connected = TRUE;
 
-       return BLUETOOTH_ERROR_NOT_SUPPORT;
+       return BLUETOOTH_ERROR_NONE;
 #endif
 }
 
@@ -1248,7 +1353,7 @@ BT_EXPORT_API int bluetooth_rfcomm_listen_and_accept(int socket_fd, int max_pend
        }
 
 #ifdef RFCOMM_DIRECT
-       BT_INFO("<<<<<<<<< RFCOMM Listen & accept from app >>>>>>>>>>>");
+       BT_INFO("RFCOMM Listen & accept from app");
 
        info = __find_rfcomm_info_with_id(socket_fd);
        if (info == NULL)
@@ -1289,7 +1394,9 @@ BT_EXPORT_API int bluetooth_rfcomm_listen_and_accept(int socket_fd, int max_pend
 #endif
 }
 
-BT_EXPORT_API int bluetooth_rfcomm_listen_and_accept_ex(const char *uuid, int max_pending_connection, const char *bus_name, const char *path)
+BT_EXPORT_API int bluetooth_rfcomm_listen_and_accept_ex(const char *uuid,
+                                       int max_pending_connection,
+                                       const char *bus_name, const char *path)
 {
 #ifdef RFCOMM_DIRECT
        rfcomm_info_t *info;
@@ -1303,7 +1410,7 @@ BT_EXPORT_API int bluetooth_rfcomm_listen_and_accept_ex(const char *uuid, int ma
        }
 #endif
 
-       BT_INFO("<<<<<<<<< RFCOMM Listen & accept from app >>>>>>>>>>>");
+       BT_INFO("RFCOMM Listen & accept from app");
 
        info = __find_rfcomm_info_with_uuid(uuid);
        if (info == NULL)
@@ -1351,7 +1458,7 @@ BT_EXPORT_API int bluetooth_rfcomm_listen(int socket_fd, int max_pending_connect
        }
 
 #ifdef RFCOMM_DIRECT
-       BT_INFO("<<<<<<<<< RFCOMM Listen >>>>>>>>>>>");
+       BT_INFO("RFCOMM Listen");
 
        info = __find_rfcomm_info_with_id(socket_fd);
        if (info == NULL)
index 246fc3d..2f550d6 100755 (executable)
@@ -308,7 +308,7 @@ static GVariant *__bluetooth_telephony_dbus_method_send(const char *path,
                const char *interface, const char *method,
                GError **err, GVariant *parameters)
 {
-#ifdef TIZEN_WEARABLE
+#if defined(TIZEN_PROFILE_WEARABLE) || defined(TIZEN_PROFILE_IVI)
        int timeout = 4000;
 #else
        int timeout = -1;
@@ -800,7 +800,7 @@ static  int __bluetooth_telephony_unregister(void)
        return BLUETOOTH_TELEPHONY_ERROR_NONE;
 }
 
-#ifndef TIZEN_WEARABLE
+#if defined(TIZEN_PROFILE_WEARABLE) || defined(TIZEN_PROFILE_IVI)
 static void __bluetooth_telephony_init_headset_state(void)
 {
        GVariant *reply;
@@ -1311,7 +1311,7 @@ BT_EXPORT_API int bluetooth_telephony_init(bt_telephony_func_ptr cb,
 
        if (is_initialized == TRUE) {
                BT_ERR("Bluetooth telephony already initilized");
-               return BLUETOOTH_TELEPHONY_ERROR_ALREADY_INITIALIZED;
+               return BLUETOOTH_TELEPHONY_ERROR_NONE;
        }
 
        is_initialized = TRUE;
@@ -1326,7 +1326,7 @@ BT_EXPORT_API int bluetooth_telephony_init(bt_telephony_func_ptr cb,
        /* Call Path */
        snprintf(telephony_info.call_path, sizeof(telephony_info.call_path),
                                        CSD_CALL_APP_PATH, getpid());
-       BT_DBG("Call Path = %s", telephony_info.call_path);
+       BT_INFO("Call Path = %s", telephony_info.call_path);
        memset(telephony_info.address, 0x00, sizeof(telephony_info.address));
 
        if (__bluetooth_telephony_proxy_init()) {
@@ -1406,7 +1406,7 @@ BT_EXPORT_API int bluetooth_telephony_init(bt_telephony_func_ptr cb,
                goto fail;
        }
 
-#ifndef TIZEN_WEARABLE
+#if defined(TIZEN_PROFILE_WEARABLE) || defined(TIZEN_PROFILE_IVI)
        __bluetooth_telephony_init_headset_state();
 #endif
 
@@ -1450,9 +1450,8 @@ BT_EXPORT_API int bluetooth_telephony_deinit(void)
                telephony_dbus_info.manager_proxy = NULL;
        }
 
-       if (telephony_dbus_info.conn != NULL) {
+       if (telephony_dbus_info.conn != NULL)
                telephony_dbus_info.conn = NULL;
-       }
 
        if (telephony_dbus_info.dbus_proxy != NULL) {
                g_object_unref(telephony_dbus_info.dbus_proxy);
@@ -1489,7 +1488,7 @@ BT_EXPORT_API gboolean bluetooth_telephony_is_sco_connected(void)
        g_variant_get(reply, "(b)", &status);
        g_variant_unref(reply);
 
-#ifdef TIZEN_WEARABLE
+#if defined(TIZEN_PROFILE_WEARABLE) || defined(TIZEN_PROFILE_IVI)
        if (status == TRUE && telephony_info.headset_state != BLUETOOTH_STATE_PLAYING)
                telephony_info.headset_state = BLUETOOTH_STATE_PLAYING;
 #endif
index 3f77709..595eaaf 100755 (executable)
@@ -48,11 +48,11 @@ extern "C" {
 #define LOG_COLOR_PURPLE   "\033[35m"
 
 #define BT_DBG(fmt, args...) \
-        SLOGD(fmt, ##args)
+       SLOGD(fmt, ##args)
 #define BT_INFO(fmt, args...) \
-        SLOGI(fmt, ##args)
+       SLOGI(fmt, ##args)
 #define BT_ERR(fmt, args...) \
-        SLOGE(fmt, ##args)
+       SLOGE(fmt, ##args)
 
 #define BT_DBG_UUID(uuids, len, i) \
        BT_DBG("***UUIDs***"); \
@@ -116,10 +116,10 @@ extern "C" {
 
 #define BT_ALLOC_PARAMS(IP1, IP2, IP3, IP4, OP) \
        do { \
-               IP1 = g_array_new(TRUE, TRUE, sizeof(gchar));   \
-               IP2 = g_array_new(TRUE, TRUE, sizeof(gchar));   \
-               IP3 = g_array_new(TRUE, TRUE, sizeof(gchar));   \
-               IP4 = g_array_new(TRUE, TRUE, sizeof(gchar)); \
+               IP1 = g_array_new(TRUE, TRUE, sizeof(gchar));   \
+               IP2 = g_array_new(TRUE, TRUE, sizeof(gchar));   \
+               IP3 = g_array_new(TRUE, TRUE, sizeof(gchar));   \
+               IP4 = g_array_new(TRUE, TRUE, sizeof(gchar)); \
        } while (0)
 
 #define BT_INIT_AGENT_PARAMS() \
@@ -136,7 +136,7 @@ extern "C" {
 
 #define BT_ALLOC_AGENT_PARAMS(IP, OP) \
        do { \
-               IP = g_array_new(FALSE, FALSE, sizeof(gchar));  \
+               IP = g_array_new(FALSE, FALSE, sizeof(gchar));  \
        } while (0)
 
 #define BT_CHECK_PARAMETER(arg, func) \
@@ -172,6 +172,14 @@ extern "C" {
                } \
        } while (0)
 
+#define BT_CHECK_ENABLED_INTERNAL(func) \
+       do { \
+               if (_bt_check_enabled_internal() == FALSE) { \
+                       BT_ERR("BT BREDR is not enabled"); \
+                       func BLUETOOTH_ERROR_DEVICE_NOT_ENABLED; \
+               } \
+       } while (0)
+
 #define BT_ADDRESS_LENGTH_MAX 6
 #define BT_ADDRESS_STRING_SIZE 18
 #define BT_ADAPTER_OBJECT_PATH_MAX 50
@@ -209,23 +217,23 @@ extern "C" {
 #define RFKILL_NODE "/dev/rfkill"
 
 typedef enum {
-        RFKILL_TYPE_ALL = 0,
-        RFKILL_TYPE_WLAN,
-        RFKILL_TYPE_BLUETOOTH,
-        RFKILL_TYPE_UWB,
-        RFKILL_TYPE_WIMAX,
-        RFKILL_TYPE_WWAN,
-        RFKILL_TYPE_GPS,
-        RFKILL_TYPE_FM,
-        NUM_RFKILL_TYPES,
+       RFKILL_TYPE_ALL = 0,
+       RFKILL_TYPE_WLAN,
+       RFKILL_TYPE_BLUETOOTH,
+       RFKILL_TYPE_UWB,
+       RFKILL_TYPE_WIMAX,
+       RFKILL_TYPE_WWAN,
+       RFKILL_TYPE_GPS,
+       RFKILL_TYPE_FM,
+       NUM_RFKILL_TYPES,
 } rfkill_type;
 
 typedef struct {
-        unsigned int idx;
-        unsigned char type;
-        unsigned char op;
-        unsigned char soft;
-        unsigned char hard;
+       unsigned int idx;
+       unsigned char type;
+       unsigned char op;
+       unsigned char soft;
+       unsigned char hard;
 } rfkill_event;
 
 typedef enum {
@@ -274,6 +282,9 @@ void _bt_divide_device_class(bluetooth_device_class_t *device_class,
 void _bt_convert_addr_string_to_type(unsigned char *addr,
                                        const char *address);
 
+void _bt_convert_addr_string_to_secure_string(char *addr,
+                                       const char *address);
+
 void _bt_convert_addr_type_to_string(char *address,
                                unsigned char *addr);
 
@@ -323,7 +334,7 @@ int _bt_register_new_conn(const char *path, bt_new_connection_cb cb);
 int _bt_register_new_conn_ex(const char *path, const char *bus_name, bt_new_connection_cb cb);
 void _bt_swap_addr(unsigned char *dst, const unsigned char *src);
 
-void _bt_device_path_to_address(const char *device_path, char *device_address);
+GDBusConnection *_bt_init_system_gdbus_conn(void);
 
 GDBusConnection *g_bus_get_private_conn(void);
 
@@ -343,6 +354,12 @@ GDBusConnection *_bt_gdbus_get_system_gconn(void);
 
 GVariant *_bt_get_managed_objects(void);
 
+gboolean _bt_check_enabled_internal(void);
+
+void _bt_set_adapter_internal_status(gboolean enabled);
+
+int _bt_get_uuid_specification_name(const char *uuid, char **name);
+
 void _bt_convert_device_path_to_address(const char *device_path,
                                char *device_address);
 
@@ -355,6 +372,8 @@ int _get_rfcomm_server_id(char *uuid, gboolean *auto_accept);
 void _bt_rfcomm_server_set_pending_conn(int server_id, char *address);
 #endif
 
+void _bluetooth_hid_free_hid_info(void);
+
 void _bt_hdp_app_remove_obj_info(unsigned int channe_id);
 int _bt_hdp_app_acquire_fd(bt_hdp_connected_t *conn_info);
 
index e984651..72c178f 100755 (executable)
@@ -62,6 +62,12 @@ void _bt_register_name_owner_changed(void);
 
 void _bt_unregister_name_owner_changed(void);
 
+int _bt_register_manager_subscribe_signal(gboolean subscribe);
+
+int _bt_hid_device_get_fd(const char *address, int *ctrl, int *intr);
+
+int new_hid_connection(const char *path, int fd, bluetooth_device_address_t *addr);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/bt-api/include/bt-gatt-client.h b/bt-api/include/bt-gatt-client.h
new file mode 100644 (file)
index 0000000..d39671c
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Bluetooth-frwk
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact:  Hocheol Seo <hocheol.seo@samsung.com>
+ *              Girishashok Joshi <girish.joshi@samsung.com>
+ *              Chanyeol Park <chanyeol.park@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+#ifndef _BT_GATT_CLIENT_H_
+#define _BT_GATT_CLIENT_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#define GATT_SERV_INTERFACE            "org.bluez.GattService1"
+#define GATT_CHAR_INTERFACE            "org.bluez.GattCharacteristic1"
+#define GATT_DESC_INTERFACE            "org.bluez.GattDescriptor1"
+
+#define GATT_USER_DESC_UUID             "00002901-0000-1000-8000-00805f9b34fb"
+#define GATT_CHAR_CLIENT_CONF          "00002902-0000-1000-8000-00805f9b34fb"
+#define GATT_CHAR_SERVER_CONF           "00002903-0000-1000-8000-00805f9b34fb"
+#define GATT_CHAR_FORMAT               "00002904-0000-1000-8000-00805f9b34fb"
+
+gboolean _bluetooth_gatt_check_service_change_watcher_address(
+               const bluetooth_device_address_t *device_addr);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /*_BT_GATT_CLIENT_H_*/
index 5424672..c4bcc93 100755 (executable)
@@ -41,7 +41,13 @@ int _bt_sync_send_request(int service_type, int service_function,
 
 #define _bt_send_request(a, b, format ...) ( \
        { \
-       BT_INFO_C("Sync Request => type=%s, fn=%s(0x%x)", #a, #b, b); \
+       if ((a != BT_CHECK_PRIVILEGE && (a == BT_BLUEZ_SERVICE || a == BT_OBEX_SERVICE)) && \
+               (b != BT_GET_LOCAL_NAME && b != BT_GET_LOCAL_ADDRESS && \
+                b != BT_GET_BONDED_DEVICE && b != BT_IS_DEVICE_CONNECTED && \
+                b != BT_GET_BONDED_DEVICES && b != BT_GET_DISCOVERABLE_MODE)) \
+               BT_INFO_C("Sync Request => type=%s, fn=%s(0x%x)", #a, #b, b); \
+       else \
+               BT_DBG("Sync Request => type=%s, fn=%s(0x%x)", #a, #b, b); \
        _bt_sync_send_request(a, b, format); \
        } \
        )
@@ -53,7 +59,13 @@ int _bt_async_send_request(int service_type, int service_function,
 
 #define _bt_send_request_async(a, b, format ...) ( \
        { \
-       BT_INFO_C("Async Request => type=%s, fn=%s(0x%x)", #a, #b, b); \
+       if ((a != BT_CHECK_PRIVILEGE && (a == BT_BLUEZ_SERVICE || a == BT_OBEX_SERVICE)) && \
+               (b != BT_GET_LOCAL_NAME && b != BT_GET_LOCAL_ADDRESS && \
+                b != BT_GET_BONDED_DEVICE && b != BT_IS_DEVICE_CONNECTED && \
+                b != BT_GET_BONDED_DEVICES && b != BT_GET_DISCOVERABLE_MODE)) \
+               BT_INFO_C("Async Request => type=%s, fn=%s(0x%x)", #a, #b, b); \
+       else \
+               BT_DBG("Async Request => type=%s, fn=%s(0x%x)", #a, #b, b); \
        _bt_async_send_request(a, b, format); \
        } \
        )
index 490175c..a502856 100755 (executable)
@@ -17,6 +17,7 @@
 
 #include <vconf.h>
 #include <vconf-keys.h>
+#include <vconf-internal-radio-keys.h>
 #include <bundle.h>
 #include <eventsystem.h>
 
 static bt_status_t adapter_status = BT_DEACTIVATED;
 static bt_le_status_t adapter_le_status = BT_LE_DEACTIVATED;
 static gboolean is_recovery_mode = FALSE;
+static guint core_enable_timer_id;
+
 
 static int bt_status_before[BT_MODE_MAX] = { VCONFKEY_BT_STATUS_OFF, };
 static int bt_le_status_before[BT_MODE_MAX] = { VCONFKEY_BT_LE_STATUS_OFF, };
 
+static int __bt_eventsystem_set_value(const char *event, const char *key, const char *value);
+
 static void __bt_core_set_status(bt_status_t status)
 {
        adapter_status = status;
@@ -91,14 +96,14 @@ static gboolean __bt_core_idle_terminate(gpointer data)
 
 gboolean _bt_core_is_flight_mode_enabled(void)
 {
-#ifdef TIZEN_BT_FLIGHTMODE_ENABLED
+#ifdef TIZEN_FEATURE_FLIGHTMODE_ENABLED
        int isFlightMode = 0;
        int ret = -1;
 
        ret = vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &isFlightMode);
-       if (ret != 0) {
+       if (ret != 0)
                BT_ERR("vconf_get_bool failed");
-       }
+
        return isFlightMode;
 #else
        return FALSE;
@@ -143,16 +148,19 @@ int _bt_enable_adapter(void)
 {
        int ret;
        bt_status_t status;
+#if 0
        bt_le_status_t le_status;
-
+#endif
        BT_INFO("");
 
        status = _bt_core_get_status();
        if (status != BT_DEACTIVATED) {
                BT_ERR("Invalid state %d", status);
+               g_timeout_add(BT_CORE_IDLE_TERM_TIME, __bt_core_idle_terminate, NULL);
                return -1;
        }
 
+#if 0 /* only the concept of private */
        le_status = _bt_core_get_le_status();
        if (le_status == BT_LE_ACTIVATED) {
                /* Turn on PSCAN, (ISCAN if needed) */
@@ -162,6 +170,7 @@ int _bt_enable_adapter(void)
                g_timeout_add(BT_CORE_IDLE_TERM_TIME, __bt_core_idle_terminate, NULL);
                return 0;
        }
+#endif
 
        __bt_core_set_status(BT_ACTIVATING);
 #ifdef USB_BLUETOOTH
@@ -188,13 +197,15 @@ int _bt_enable_adapter(void)
 int _bt_disable_adapter(void)
 {
        bt_status_t status;
+#if 0
        bt_le_status_t le_status;
+#endif
 
        BT_INFO_C("Disable adapter");
 
+#if 0 /* only the concept of private */
        le_status = _bt_core_get_le_status();
        BT_DBG("le_status : %d", le_status);
-#if 0 /* only the concept of private */
        if (le_status == BT_LE_ACTIVATED) {
                /* Turn off PSCAN, (ISCAN if needed) */
                /* Return with 0 for the Disabled response. */
@@ -210,29 +221,77 @@ int _bt_disable_adapter(void)
                /* Forcely terminate */
 #ifdef USB_BLUETOOTH
                char *argv_down[] = {"/usr/bin/hciconfig", "/usr/bin/hciconfig", "hci0", "down", NULL};
-               if (__execute_command("/usr/bin/hciconfig", argv_down) < 0) {
-#else
-               if (__execute_command("/usr/etc/bluetooth/bt-stack-down.sh", NULL) < 0) {
-#endif
+               if (__execute_command("/usr/bin/hciconfig", argv_down) < 0)
                        BT_ERR("running script failed");
+#else
+
+#ifdef TIZEN_FEATURE_RADIO
+               int radio_status = VCONFKEY_RADIO_STATUS_OFF;
+
+               /* Check if radio status on or off */
+               if (vconf_get_int(VCONFKEY_RADIO_STATUS, &radio_status) < 0)
+                       BT_ERR("Fail to get radio status");
+
+               BT_DBG("Radio status: %d", radio_status);
+
+               if (radio_status == VCONFKEY_RADIO_STATUS_ON) {
+                       if (__execute_command("/usr/etc/bluetooth/bt-stack-down-with-radio.sh", NULL) < 0)
+                               BT_ERR("running script failed");
+               } else {
+                       if (__execute_command("/usr/etc/bluetooth/bt-stack-down.sh", NULL) < 0)
+                               BT_ERR("running script failed");
                }
+#else
+               if (__execute_command("/usr/etc/bluetooth/bt-stack-down.sh", NULL) < 0)
+                       BT_ERR("running script failed");
+#endif
+#endif
                _bt_core_terminate();
                return 0;
        } else if (status != BT_ACTIVATED) {
                BT_ERR("Invalid state %d", status);
+               g_timeout_add(BT_CORE_IDLE_TERM_TIME, __bt_core_idle_terminate, NULL);
        }
 
        __bt_core_set_status(BT_DEACTIVATING);
 #ifdef USB_BLUETOOTH
        char *argv_down[] = {"/usr/bin/hciconfig", "/usr/bin/hciconfig", "hci0", "down", NULL};
        if (__execute_command("/usr/bin/hciconfig", argv_down) < 0) {
-#else
-       if (__execute_command("/usr/etc/bluetooth/bt-stack-down.sh", NULL) < 0) {
-#endif
                BT_ERR("running script failed");
                __bt_core_set_status(BT_ACTIVATED);
                return -1;
        }
+#else
+#ifdef TIZEN_FEATURE_RADIO
+       int radio_status = VCONFKEY_RADIO_STATUS_OFF;
+
+       /* Check if radio status on or off */
+       if (vconf_get_int(VCONFKEY_RADIO_STATUS, &radio_status) < 0)
+               BT_ERR("Fail to get radio status");
+
+       BT_DBG("Radio status: %d", radio_status);
+
+       if (radio_status == VCONFKEY_RADIO_STATUS_ON) {
+               if (__execute_command("/usr/etc/bluetooth/bt-stack-down-with-radio.sh", NULL) < 0) {
+                       BT_ERR("running script failed");
+                       __bt_core_set_status(BT_ACTIVATED);
+                       return -1;
+               }
+       } else {
+               if (__execute_command("/usr/etc/bluetooth/bt-stack-down.sh", NULL) < 0) {
+                       BT_ERR("running script failed");
+                       __bt_core_set_status(BT_ACTIVATED);
+                       return -1;
+               }
+       }
+#else
+       if (__execute_command("/usr/etc/bluetooth/bt-stack-down.sh", NULL) < 0) {
+                       BT_ERR("running script failed");
+                       __bt_core_set_status(BT_ACTIVATED);
+                       return -1;
+       }
+#endif
+#endif
 
        return 0;
 }
@@ -275,9 +334,8 @@ int _bt_enable_adapter_le(void)
        }
 #ifdef HPS_FEATURE
        ret = _bt_core_start_httpproxy();
-       if (ret < 0) {
+       if (ret < 0)
                BT_ERR("_bt_core_start_httpproxy() failed");
-       }
 #endif
 
        return 0;
@@ -472,8 +530,9 @@ gboolean _bt_core_disable_adapter(void)
 gboolean _bt_core_recover_adapter(void)
 {
        int ret;
+#if 0
        int ret_le;
-
+#endif
        BT_INFO_C("Recover bt adapter");
 
        _bt_set_flightmode_request(FALSE);
@@ -486,20 +545,27 @@ gboolean _bt_core_recover_adapter(void)
 
        if (_bt_core_get_status() == BT_ACTIVATED) {
                _bt_core_set_bt_status(BT_RECOVERY_MODE, 1);
+#ifdef TIZEN_FEATURE_BUSACT
                _bt_core_service_request_adapter(BT_DISABLE_ADAPTER);
+#endif
        }
        if (_bt_core_get_le_status() == BT_LE_ACTIVATED) {
                _bt_core_set_bt_le_status(BT_RECOVERY_MODE, 1);
+#ifdef TIZEN_FEATURE_BUSACT
                _bt_core_service_request_adapter(BT_DISABLE_ADAPTER_LE);
+#endif
        }
 
        ret = _bt_disable_adapter();
        if (ret < 0)
                BT_ERR("_bt_disable_adapter() failed");
+
+/* In platform, don't seperate BR/EDR and LE status */
+#if 0
        ret_le = _bt_disable_adapter_le();
        if (ret_le < 0)
                BT_ERR("_bt_disable_adapter_le() failed");
-
+#endif
        return TRUE;
 }
 
@@ -530,9 +596,9 @@ gboolean _bt_core_disable_adapter_le(void)
 gboolean __bt_core_reset_adapter(void)
 {
        /* Forcely terminate */
-       if (__execute_command("/usr/etc/bluetooth/bt-reset-env.sh", NULL) < 0) {
+       if (__execute_command("/usr/etc/bluetooth/bt-reset-env.sh", NULL) < 0)
                BT_ERR("running script failed");
-       }
+
        _bt_core_terminate();
 
        return TRUE;
@@ -542,6 +608,8 @@ static gboolean __bt_core_enable_core_timeout_cb(gpointer data)
 {
        BT_DBG("+");
 
+       core_enable_timer_id = 0;
+
        _bt_core_init_vconf_value();
 
        return FALSE;
@@ -553,12 +621,39 @@ gboolean _bt_core_enable_core(void)
 
        _bt_core_update_status();
 
-       g_timeout_add(200, (GSourceFunc)__bt_core_enable_core_timeout_cb, NULL);
+       if (core_enable_timer_id > 0)
+               g_source_remove(core_enable_timer_id);
+
+       core_enable_timer_id = g_timeout_add(200, (GSourceFunc)__bt_core_enable_core_timeout_cb, NULL);
 
        BT_DBG("-");
        return TRUE;
 }
 
+gboolean _bt_core_set_transfer_value(gboolean value)
+{
+       const char *event_val = NULL;
+       gboolean ret = TRUE;
+
+       BT_DBG("value: %d", value);
+
+       event_val = value ? EVT_VAL_BT_TRANSFERING : EVT_VAL_BT_NON_TRANSFERING;
+
+       if (__bt_eventsystem_set_value(SYS_EVENT_BT_STATE, EVT_KEY_BT_TRANSFERING_STATE,
+                                               event_val) != ES_R_OK) {
+               BT_ERR("Fail to set BT state value");
+               ret = FALSE;
+       }
+
+       if (ret == FALSE || value == FALSE) {
+               BT_DBG("Terminate bt-core process");
+               g_timeout_add(BT_CORE_IDLE_TERM_TIME, __bt_core_idle_terminate, NULL);
+       }
+
+       BT_DBG("-");
+       return ret;
+}
+
 gboolean _bt_core_factory_test_mode(const char *type, const char *arg)
 {
 
@@ -593,9 +688,8 @@ gboolean _bt_core_factory_test_mode(const char *type, const char *arg)
        }
 
        BT_DBG("Run %s", cmd);
-       if (__execute_command(cmd, arg_list) < 0) {
+       if (__execute_command(cmd, arg_list) < 0)
                BT_ERR("running script failed");
-       }
 
        _bt_core_terminate();
        return TRUE;
@@ -604,11 +698,14 @@ gboolean _bt_core_factory_test_mode(const char *type, const char *arg)
 static gboolean __bt_core_recovery_cb(gpointer data)
 {
        int ret = 0;
+#ifdef TIZEN_FEATURE_BUSACT
        gboolean is_request_failed = FALSE;
        static gboolean is_first_failure = TRUE;
+#endif
 
        BT_DBG("+");
 
+#ifdef TIZEN_FEATURE_BUSACT
        if (_bt_core_get_bt_status(BT_RECOVERY_MODE) == 1) {
                ret = _bt_core_service_request_adapter(BT_ENABLE_ADAPTER);
                if (ret < 0)
@@ -633,6 +730,7 @@ static gboolean __bt_core_recovery_cb(gpointer data)
                }
        } else
                is_first_failure = TRUE;
+#endif
 
        if (_bt_core_get_bt_status(BT_RECOVERY_MODE) == 1) {
                _bt_core_set_bt_status(BT_RECOVERY_MODE, 0);
@@ -640,13 +738,15 @@ static gboolean __bt_core_recovery_cb(gpointer data)
                if (ret < 0)
                        BT_ERR("_bt_enable_adapter() failed");
        }
+
+#if 0
        if (_bt_core_get_bt_le_status(BT_RECOVERY_MODE) == 1) {
                _bt_core_set_bt_le_status(BT_RECOVERY_MODE, 0);
                ret = _bt_enable_adapter_le();
                if (ret < 0)
                        BT_ERR("_bt_enable_adapter_le() failed");
        }
-
+#endif
        is_recovery_mode = FALSE;
 
        BT_DBG("-");
@@ -703,7 +803,9 @@ static gboolean __bt_core_disable_timeout_cb(gpointer data)
                if (vconf_get_int(VCONFKEY_BT_STATUS, &bt_status_before_mode) == 0)
                        _bt_core_set_bt_status(BT_FLIGHT_MODE, bt_status_before_mode);
 
+#ifdef TIZEN_FEATURE_BUSACT
                _bt_core_service_request_adapter(BT_DISABLE_ADAPTER);
+#endif
                _bt_disable_adapter();
        }
 
@@ -713,7 +815,9 @@ static gboolean __bt_core_disable_timeout_cb(gpointer data)
                if (vconf_get_int(VCONFKEY_BT_LE_STATUS, &bt_le_status_before_mode) == 0)
                        _bt_core_set_bt_le_status(BT_FLIGHT_MODE, bt_le_status_before_mode);
 
+#ifdef TIZEN_FEATURE_BUSACT
                _bt_core_service_request_adapter(BT_DISABLE_ADAPTER_LE);
+#endif
                _bt_disable_adapter_le();
        }
 
@@ -764,6 +868,15 @@ void _bt_core_adapter_added_cb(void)
                return;
        }
        _bt_set_flightmode_request(FALSE);
+
+       if (__bt_eventsystem_set_value(SYS_EVENT_BT_STATE, EVT_KEY_BT_STATE,
+                                               EVT_VAL_BT_ON) != ES_R_OK)
+               BT_ERR("Fail to set BT state value");
+
+       if (__bt_eventsystem_set_value(SYS_EVENT_BT_STATE, EVT_KEY_BT_LE_STATE,
+                                               EVT_VAL_BT_LE_ON) != ES_R_OK)
+               BT_ERR("Fail to set BT LE state value");
+
        _bt_core_terminate();
 }
 
@@ -774,7 +887,7 @@ void _bt_core_adapter_removed_cb(void)
        gboolean flight_mode_status;
        static int timer_id = -1;
 
-       BT_DBG("");
+       BT_DBG("is_recovery_mode: %d", is_recovery_mode);
 
        __bt_core_set_status(BT_DEACTIVATED);
        __bt_core_set_le_status(BT_LE_DEACTIVATED);
index 6894cbc..b6a0e77 100755 (executable)
@@ -324,6 +324,9 @@ static const gchar bt_core_introspection_xml[] =
 "     </method>"
 "     <method name='EnableCore'>"
 "     </method>"
+"        <method name='SetTransferValue'>"
+"          <arg type='b' name='value' direction='in'/>"
+"        </method>"
 "     <method name='FactoryTestMode'>"
 "          <arg type='s' name='type' direction='in'/>"
 "          <arg type='s' name='arg' direction='in'/>"
@@ -361,6 +364,13 @@ static void __bt_core_dbus_method(GDBusConnection *connection,
                ret = _bt_core_disable_adapter_le();
        } else if (g_strcmp0(method_name, "EnableCore") == 0) {
                ret = _bt_core_enable_core();
+       } else if (g_strcmp0(method_name, "SetTransferValue") == 0) {
+               gboolean value = FALSE;
+
+               g_variant_get(parameters, "(b)", &value);
+               BT_DBG("Transfer value: %d", value);
+
+               ret = _bt_core_set_transfer_value(value);
        } else if (g_strcmp0(method_name, "FactoryTestMode") == 0) {
                const char *type = NULL;
                const char *arg = NULL;
@@ -467,9 +477,9 @@ static void __bt_core_event_filter(GDBusConnection *connection,
                g_variant_get(parameters, "(&o@a{sa{sv}})",
                                                &obj_path, &optional_param);
 
-               if (g_strcmp0(obj_path, "/org/bluez/hci0") == 0) {
+               if (g_strcmp0(obj_path, "/org/bluez/hci0") == 0)
                        _bt_core_adapter_added_cb();
-               }
+
        } else if (!g_strcmp0(signal_name, "InterfacesRemoved")) {
                char *obj_path = NULL;
                GVariant *optional_param;
@@ -477,9 +487,9 @@ static void __bt_core_event_filter(GDBusConnection *connection,
                g_variant_get(parameters, "(&o@as)", &obj_path,
                                                        &optional_param);
 
-               if (g_strcmp0(obj_path, "/org/bluez/hci0") == 0) {
+               if (g_strcmp0(obj_path, "/org/bluez/hci0") == 0)
                        _bt_core_adapter_removed_cb();
-               }
+
        } else { /* NameOwnerChanged */
                const char *name = NULL;
                const char *old_owner = NULL;
index 1b6e183..bdfdaee 100755 (executable)
@@ -85,14 +85,12 @@ static gboolean __bt_check_bt_core(void *data)
        le_status = _bt_core_get_le_status();
        BT_DBG("State: %d, LE State: %d", status, le_status);
 
-       if (vconf_get_int(VCONFKEY_BT_STATUS, &bt_status) < 0) {
+       if (vconf_get_int(VCONFKEY_BT_STATUS, &bt_status) < 0)
                BT_DBG("no bluetooth device info, so BT was disabled at previous session");
-       }
 
 #ifdef ENABLE_TIZEN_2_4
-       if (vconf_get_int(VCONFKEY_BT_LE_STATUS, &bt_le_status) < 0) {
+       if (vconf_get_int(VCONFKEY_BT_LE_STATUS, &bt_le_status) < 0)
                BT_ERR("no bluetooth le info, so BT LE was disabled at previous session");
-       }
 #endif
 
        if (vconf_get_int(BT_OFF_DUE_TO_FLIGHT_MODE, &flight_mode_deactivation) != 0)
index fa94f49..fe49f4e 100755 (executable)
@@ -84,7 +84,9 @@ static void __bt_core_handle_adapter_with_flight_mode(gboolean flight_mode)
                        if (vconf_get_int(VCONFKEY_BT_STATUS, &bt_status_before_mode) == 0)
                                _bt_core_set_bt_status(BT_FLIGHT_MODE, bt_status_before_mode);
 
+#ifdef TIZEN_FEATURE_BUSACT
                        _bt_core_service_request_adapter(BT_DISABLE_ADAPTER);
+#endif
 #ifndef USB_BLUETOOTH
                        _bt_disable_adapter();
 #endif
@@ -96,7 +98,9 @@ static void __bt_core_handle_adapter_with_flight_mode(gboolean flight_mode)
                        if (vconf_get_int(VCONFKEY_BT_LE_STATUS, &bt_le_status_before_mode) == 0)
                                _bt_core_set_bt_le_status(BT_FLIGHT_MODE, bt_le_status_before_mode);
 
+#ifdef TIZEN_FEATURE_BUSACT
                        _bt_core_service_request_adapter(BT_DISABLE_ADAPTER_LE);
+#endif
 #ifndef USB_BLUETOOTH
                        _bt_disable_adapter_le();
 #endif
@@ -165,7 +169,9 @@ static void __bt_core_handle_adapter_with_power_saving_mode(int power_saving_mod
                        if (vconf_get_int(VCONFKEY_BT_STATUS, &bt_status_before_mode) == 0)
                                _bt_core_set_bt_status(BT_POWER_SAVING_MODE, bt_status_before_mode);
 
+#ifdef TIZEN_FEATURE_BUSACT
                        _bt_core_service_request_adapter(BT_DISABLE_ADAPTER);
+#endif
 #ifndef USB_BLUETOOTH
                        _bt_disable_adapter();
 #endif
@@ -176,8 +182,10 @@ static void __bt_core_handle_adapter_with_power_saving_mode(int power_saving_mod
                        if (vconf_get_int(VCONFKEY_BT_LE_STATUS, &bt_le_status_before_mode) == 0)
                                _bt_core_set_bt_le_status(BT_POWER_SAVING_MODE, bt_le_status_before_mode);
 
+#ifdef TIZEN_FEATURE_BUSACT
                        /* Disable the BT LE */
                        _bt_core_service_request_adapter(BT_DISABLE_ADAPTER_LE);
+#endif
 #ifndef USB_BLUETOOTH
                        _bt_disable_adapter_le();
 #endif
@@ -218,7 +226,7 @@ static void __bt_core_handle_adapter_with_power_saving_mode(int power_saving_mod
                }
        }
 }
-#ifdef TIZEN_BT_FLIGHTMODE_ENABLED
+#ifdef TIZEN_FEATURE_FLIGHTMODE_ENABLED
 static void __bt_core_flight_mode_cb(keynode_t *node, void *data)
 {
        gboolean flight_mode = FALSE;
@@ -238,7 +246,7 @@ static void __bt_core_flight_mode_cb(keynode_t *node, void *data)
 }
 #endif
 
-#ifndef TIZEN_WEARABLE
+#ifndef TIZEN_PROFILE_WEARABLE
 #ifdef ENABLE_TIZEN_2_4
 static void __bt_core_power_saving_mode_cb(keynode_t *node, void *data)
 {
@@ -274,7 +282,7 @@ void _bt_core_init_vconf_value(void)
 
        flight_mode = _bt_core_is_flight_mode_enabled();
 
-#ifndef TIZEN_WEARABLE
+#ifndef TIZEN_PROFILE_WEARABLE
 #ifndef ENABLE_TIZEN_2_4
        if (vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &power_saving_mode) != 0)
                BT_ERR("Fail to get the power_saving_mode status value");
@@ -303,7 +311,7 @@ void _bt_core_init_vconf_value(void)
 
 void _bt_core_handle_flight_mode_noti(void)
 {
-#ifdef TIZEN_BT_FLIGHTMODE_ENABLED
+#ifdef TIZEN_FEATURE_FLIGHTMODE_ENABLED
        int ret;
 
        BT_DBG("+");
@@ -319,7 +327,7 @@ void _bt_core_handle_flight_mode_noti(void)
 
 void _bt_core_handle_power_saving_mode_noti(void)
 {
-#ifndef TIZEN_WEARABLE
+#ifndef TIZEN_PROFILE_WEARABLE
        int ret = 0;
 
        BT_DBG("+");
@@ -334,12 +342,12 @@ void _bt_core_handle_power_saving_mode_noti(void)
 
 void _bt_core_unregister_vconf_handler(void)
 {
-#ifdef TIZEN_BT_FLIGHTMODE_ENABLED
+#ifdef TIZEN_FEATURE_FLIGHTMODE_ENABLED
        vconf_ignore_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
                        (vconf_callback_fn)__bt_core_flight_mode_cb);
 #endif
 
-#ifndef TIZEN_WEARABLE
+#ifndef TIZEN_PROFILE_WEARABLE
 #ifdef ENABLE_TIZEN_2_4
        vconf_ignore_key_changed(VCONFKEY_SETAPPL_PSMODE,
                        (vconf_callback_fn)__bt_core_power_saving_mode_cb);
index 54091ad..f56d8eb 100755 (executable)
@@ -83,6 +83,7 @@ gboolean _bt_core_enable_adapter_le(void);
 gboolean _bt_core_disable_adapter_le(void);
 gboolean __bt_core_reset_adapter(void);
 gboolean _bt_core_enable_core(void);
+gboolean _bt_core_set_transfer_value(gboolean value);
 gboolean _bt_core_factory_test_mode(const char *type, const char *arg);
 
 void _bt_core_update_status(void);
index b1bf5e6..9d512a9 100755 (executable)
@@ -36,11 +36,11 @@ extern "C" {
 #define LOG_COLOR_PURPLE   "\033[35m"
 
 #define BT_DBG(fmt, args...) \
-        SLOGD(fmt, ##args)
+       SLOGD(fmt, ##args)
 #define BT_INFO(fmt, args...) \
        SLOGI(fmt, ##args)
 #define BT_ERR(fmt, args...) \
-        SLOGE(fmt, ##args)
+       SLOGE(fmt, ##args)
 
 #define BT_INFO_C(fmt, arg...) \
        SLOGI_IF(TRUE,  LOG_COLOR_GREEN" "fmt" "LOG_COLOR_RESET, ##arg)
@@ -82,10 +82,10 @@ extern "C" {
 
 #define BT_ALLOC_PARAMS(IP1, IP2, IP3, IP4, OP) \
        do { \
-               IP1 = g_array_new(TRUE, TRUE, sizeof(gchar));   \
-               IP2 = g_array_new(TRUE, TRUE, sizeof(gchar));   \
-               IP3 = g_array_new(TRUE, TRUE, sizeof(gchar));   \
-               IP4 = g_array_new(TRUE, TRUE, sizeof(gchar));   \
+               IP1 = g_array_new(TRUE, TRUE, sizeof(gchar));   \
+               IP2 = g_array_new(TRUE, TRUE, sizeof(gchar));   \
+               IP3 = g_array_new(TRUE, TRUE, sizeof(gchar));   \
+               IP4 = g_array_new(TRUE, TRUE, sizeof(gchar));   \
        } while (0)
 
 #ifdef __cplusplus
index 0af2153..e868087 100755 (executable)
@@ -36,11 +36,11 @@ extern "C" {
 #define LOG_TAG "BLUETOOTH_FRWK_CORE"
 
 #define BT_DBG(fmt, args...) \
-        SLOGD(fmt, ##args)
+       SLOGD(fmt, ##args)
 #define BT_INFO(fmt, args...) \
        SLOGI(fmt, ##args)
 #define BT_ERR(fmt, args...) \
-        SLOGE(fmt, ##args)
+       SLOGE(fmt, ##args)
 
 #define BT_CORE_NAME "org.projectx.bt_core"
 #define BT_CORE_PATH "/org/projectx/bt_core"
index a1f4ddd..50e3de4 100644 (file)
@@ -103,13 +103,11 @@ static void _hps_convert_address_to_hex(bluetooth_device_address_t *addr_hex, co
                return;
 
        i = sscanf(addr_str, "%X:%X:%X:%X:%X:%X", &addr[0], &addr[1], &addr[2], &addr[3], &addr[4], &addr[5]);
-       if (i != BLUETOOTH_ADDRESS_LENGTH) {
+       if (i != BLUETOOTH_ADDRESS_LENGTH)
                BT_ERR("Invalid format string - [%s]", addr_str);
-       }
 
-       for (i = 0; i < BLUETOOTH_ADDRESS_LENGTH; i++) {
+       for (i = 0; i < BLUETOOTH_ADDRESS_LENGTH; i++)
                addr_hex->addr[i] = (unsigned char)addr[i];
-       }
 }
 
 static void _bt_hps_send_status_notification(unsigned short http_status,
@@ -593,9 +591,9 @@ void _bt_hps_head_response_cb(SoupSession *session,
                // Write Data to Status Code Characteristic
 #ifdef HPS_GATT_DB
                data_status = (hdr_len > MAX_ENTITY_LENGTH) ? DS_HEADER_TRUNCATED : DS_HEADER_RECEIVED;
-               if (data_status == DS_BODY_TRUNCATED && SOUP_STATUS_IS_SUCCESSFUL(http_status)) {
+               if (data_status == DS_BODY_TRUNCATED && SOUP_STATUS_IS_SUCCESSFUL(http_status))
                        _bt_hps_set_notify_read_status(http_hdr_obj_path, data_status, 0, http_status);
-               }
+
                _bt_hps_send_status_notification(http_status, data_status, &addr_hex);
 #else
                status[0] = http_status & 0x0F;
@@ -715,9 +713,9 @@ void _bt_hps_get_response_cb(SoupSession *session,
                // Write Data to Status Code Characteristic
 #ifdef HPS_GATT_DB
                data_status = (body->length > MAX_ENTITY_LENGTH) ? DS_BODY_TRUNCATED : DS_BODY_RECEIVED;
-               if (data_status == DS_BODY_TRUNCATED && SOUP_STATUS_IS_SUCCESSFUL(http_status)) {
+               if (data_status == DS_BODY_TRUNCATED && SOUP_STATUS_IS_SUCCESSFUL(http_status))
                        _bt_hps_set_notify_read_status(http_entity_obj_path, data_status, 0, http_status);
-               }
+
                _bt_hps_send_status_notification(http_status, data_status, &addr_hex);
 
 #else
@@ -766,9 +764,9 @@ void _bt_hps_get_response_cb(SoupSession *session,
                // Write Data to Status Code Characteristic
 #ifdef HPS_GATT_DB
                data_status = (hdr_len > MAX_HEADER_LENGTH) ? DS_HEADER_TRUNCATED : DS_HEADER_RECEIVED;
-               if (data_status == DS_HEADER_TRUNCATED && SOUP_STATUS_IS_SUCCESSFUL(http_status)) {
+               if (data_status == DS_HEADER_TRUNCATED && SOUP_STATUS_IS_SUCCESSFUL(http_status))
                        _bt_hps_set_notify_read_status(http_hdr_obj_path, data_status, 0, http_status);
-               }
+
                _bt_hps_send_status_notification(http_status, data_status, &addr_hex);
 #else
                status[0] = http_status & 0x0F;
@@ -805,284 +803,284 @@ int _bt_hps_control_point_write_cb(char *value, int len)
 #endif
 
        switch (opcode) {
-               case HTTP_GET_REQUEST:
-                       if (req_state == HTTP_REQ_STATE_EXECUTED) {
-                               req_state = HTTP_REQ_STATE_INPROGRESS;
-                               hps_soup_msg = soup_message_new("GET", g_uri);
+       case HTTP_GET_REQUEST:
+               if (req_state == HTTP_REQ_STATE_EXECUTED) {
+                       req_state = HTTP_REQ_STATE_INPROGRESS;
+                       hps_soup_msg = soup_message_new("GET", g_uri);
 #ifdef HPS_GATT_DB
-                               g_object_ref(hps_soup_msg);
-                               soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_get_response_cb, addr);
+                       g_object_ref(hps_soup_msg);
+                       soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_get_response_cb, addr);
 #else
-                               soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_get_response_cb, NULL);
+                       soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_get_response_cb, NULL);
 #endif
-                       } else {
-                               BT_ERR("HTTP GET request in progress, message dropped");
+               } else {
+                       BT_ERR("HTTP GET request in progress, message dropped");
+                       result = BLUETOOTH_ERROR_INTERNAL;
+               }
+               break;
+
+       case HTTP_POST_REQUEST:
+               if (req_state == HTTP_REQ_STATE_EXECUTED) {
+                       req_state = HTTP_REQ_STATE_INPROGRESS;
+                       hps_soup_msg = soup_message_new("POST", g_uri);
+                       if (hps_soup_msg == NULL || g_entity == NULL) {
+                               BT_ERR("Soup Message NULL");
                                result = BLUETOOTH_ERROR_INTERNAL;
+                               req_state = HTTP_REQ_STATE_EXECUTED;
+                               break;
                        }
-                       break;
-
-               case HTTP_POST_REQUEST:
-                       if (req_state == HTTP_REQ_STATE_EXECUTED) {
-                               req_state = HTTP_REQ_STATE_INPROGRESS;
-                               hps_soup_msg = soup_message_new("POST", g_uri);
-                               if (hps_soup_msg == NULL || g_entity == NULL) {
-                                       BT_ERR("Soup Message NULL");
-                                       result = BLUETOOTH_ERROR_INTERNAL;
-                                       req_state = HTTP_REQ_STATE_EXECUTED;
-                                       break;
-                               }
-                               soup_message_set_request(hps_soup_msg, "text/xml", SOUP_MEMORY_COPY,
-                                                         g_entity, strlen(g_entity));
+                       soup_message_set_request(hps_soup_msg, "text/xml", SOUP_MEMORY_COPY,
+                                                 g_entity, strlen(g_entity));
 #ifdef HPS_GATT_DB
-                               g_object_ref(hps_soup_msg);
-                               soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, addr);
+                       g_object_ref(hps_soup_msg);
+                       soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, addr);
 #else
-                               soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, NULL);
+                       soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, NULL);
 #endif
-                       } else {
-                               BT_ERR("HTTP POST request in progress, message dropped");
+               } else {
+                       BT_ERR("HTTP POST request in progress, message dropped");
+                       result = BLUETOOTH_ERROR_INTERNAL;
+               }
+               break;
+
+       case HTTP_HEAD_REQUEST:
+               if (req_state == HTTP_REQ_STATE_EXECUTED) {
+                       req_state = HTTP_REQ_STATE_INPROGRESS;
+                       hps_soup_msg = soup_message_new("HEAD", g_uri);
+                       if (hps_soup_msg == NULL) {
+                               BT_ERR("Soup Message NULL");
                                result = BLUETOOTH_ERROR_INTERNAL;
+                               req_state = HTTP_REQ_STATE_EXECUTED;
+                               break;
                        }
-                       break;
-
-               case HTTP_HEAD_REQUEST:
-                       if (req_state == HTTP_REQ_STATE_EXECUTED) {
-                               req_state = HTTP_REQ_STATE_INPROGRESS;
-                               hps_soup_msg = soup_message_new("HEAD", g_uri);
-                               if (hps_soup_msg == NULL) {
-                                       BT_ERR("Soup Message NULL");
-                                       result = BLUETOOTH_ERROR_INTERNAL;
-                                       req_state = HTTP_REQ_STATE_EXECUTED;
-                                       break;
-                               }
 #ifdef HPS_GATT_DB
-                               g_object_ref(hps_soup_msg);
-                               soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_head_response_cb, addr);
+                       g_object_ref(hps_soup_msg);
+                       soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_head_response_cb, addr);
 #else
-                               soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_head_response_cb, NULL);
+                       soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_head_response_cb, NULL);
 #endif
-                       } else {
-                               BT_ERR("HTTP HEAD request in progress, message dropped");
+               } else {
+                       BT_ERR("HTTP HEAD request in progress, message dropped");
+                       result = BLUETOOTH_ERROR_INTERNAL;
+               }
+               break;
+
+       case HTTP_PUT_REQUEST:
+               if (req_state == HTTP_REQ_STATE_EXECUTED) {
+                       SoupBuffer *buf;
+                       req_state = HTTP_REQ_STATE_INPROGRESS;
+                       hps_soup_msg = soup_message_new("PUT", g_uri);
+                       if (hps_soup_msg == NULL  || g_entity == NULL) {
+                               BT_ERR("Soup Message NULL");
                                result = BLUETOOTH_ERROR_INTERNAL;
+                               req_state = HTTP_REQ_STATE_EXECUTED;
+                               break;
                        }
-                       break;
-
-               case HTTP_PUT_REQUEST:
-                       if (req_state == HTTP_REQ_STATE_EXECUTED) {
-                               SoupBuffer *buf;
-                               req_state = HTTP_REQ_STATE_INPROGRESS;
-                               hps_soup_msg = soup_message_new("PUT", g_uri);
-                               if (hps_soup_msg == NULL  || g_entity == NULL) {
-                                       BT_ERR("Soup Message NULL");
-                                       result = BLUETOOTH_ERROR_INTERNAL;
-                                       req_state = HTTP_REQ_STATE_EXECUTED;
-                                       break;
-                               }
-                               buf = soup_buffer_new(SOUP_MEMORY_TAKE, g_entity, strlen(g_entity));
-                               soup_message_body_append_buffer(hps_soup_msg->request_body, buf);
-                               soup_message_body_set_accumulate(hps_soup_msg->request_body, FALSE);
+                       buf = soup_buffer_new(SOUP_MEMORY_TAKE, g_entity, strlen(g_entity));
+                       soup_message_body_append_buffer(hps_soup_msg->request_body, buf);
+                       soup_message_body_set_accumulate(hps_soup_msg->request_body, FALSE);
 #ifdef HPS_GATT_DB
-                               g_object_ref(hps_soup_msg);
-                               soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, addr);
+                       g_object_ref(hps_soup_msg);
+                       soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, addr);
 #else
-                               soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, NULL);
+                       soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, NULL);
 #endif
 
-                       } else {
-                               BT_ERR("HTTP PUT request in progress, message dropped");
+               } else {
+                       BT_ERR("HTTP PUT request in progress, message dropped");
+                       result = BLUETOOTH_ERROR_INTERNAL;
+               }
+               break;
+
+       case HTTP_DELETE_REQUEST:
+               if (req_state == HTTP_REQ_STATE_EXECUTED) {
+                       req_state = HTTP_REQ_STATE_INPROGRESS;
+                       hps_soup_msg = soup_message_new("DELETE", g_uri);
+                       if (hps_soup_msg == NULL) {
+                               BT_ERR("Soup Message NULL");
                                result = BLUETOOTH_ERROR_INTERNAL;
+                               req_state = HTTP_REQ_STATE_EXECUTED;
+                               break;
                        }
-                       break;
-
-               case HTTP_DELETE_REQUEST:
-                       if (req_state == HTTP_REQ_STATE_EXECUTED) {
-                               req_state = HTTP_REQ_STATE_INPROGRESS;
-                               hps_soup_msg = soup_message_new("DELETE", g_uri);
-                               if (hps_soup_msg == NULL) {
-                                       BT_ERR("Soup Message NULL");
-                                       result = BLUETOOTH_ERROR_INTERNAL;
-                                       req_state = HTTP_REQ_STATE_EXECUTED;
-                                       break;
-                               }
 #ifdef HPS_GATT_DB
-                               g_object_ref(hps_soup_msg);
-                               soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, addr);
+                       g_object_ref(hps_soup_msg);
+                       soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, addr);
 #else
-                               soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, NULL);
+                       soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, NULL);
 #endif
-                       } else {
-                               BT_ERR("HTTP DELETE request in progress, message dropped");
+               } else {
+                       BT_ERR("HTTP DELETE request in progress, message dropped");
+                       result = BLUETOOTH_ERROR_INTERNAL;
+               }
+               break;
+
+       case HTTPS_GET_REQUEST:
+               if (req_state == HTTP_REQ_STATE_EXECUTED) {
+                       req_state = HTTP_REQ_STATE_INPROGRESS;
+                       hps_soup_msg = soup_message_new("GET", g_uri);
+                       if (hps_soup_msg == NULL) {
+                               BT_ERR("Soup Message NULL");
                                result = BLUETOOTH_ERROR_INTERNAL;
+                               req_state = HTTP_REQ_STATE_EXECUTED;
+                               break;
                        }
-                       break;
-
-               case HTTPS_GET_REQUEST:
-                       if (req_state == HTTP_REQ_STATE_EXECUTED) {
-                               req_state = HTTP_REQ_STATE_INPROGRESS;
-                               hps_soup_msg = soup_message_new("GET", g_uri);
-                               if (hps_soup_msg == NULL) {
-                                       BT_ERR("Soup Message NULL");
-                                       result = BLUETOOTH_ERROR_INTERNAL;
-                                       req_state = HTTP_REQ_STATE_EXECUTED;
-                                       break;
-                               }
 #ifdef HPS_GATT_DB
-                               g_object_ref(hps_soup_msg);
-                               soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_get_response_cb, addr);
+                       g_object_ref(hps_soup_msg);
+                       soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_get_response_cb, addr);
 #else
-                               soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_get_response_cb, NULL);
+                       soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_get_response_cb, NULL);
 #endif
-                               https_status = soup_message_get_https_status(hps_soup_msg, &cert, &flags);
+                       https_status = soup_message_get_https_status(hps_soup_msg, &cert, &flags);
 #ifdef HPS_GATT_DB
-                               _bt_hps_set_char_value(http_security_obj_path, (const char *)&https_status, 1);
+                       _bt_hps_set_char_value(http_security_obj_path, (const char *)&https_status, 1);
 #else
-                               bluetooth_gatt_set_characteristic_value(http_security_obj_path, (char *)&https_status, 1);
+                       bluetooth_gatt_set_characteristic_value(http_security_obj_path, (char *)&https_status, 1);
 #endif
-                       } else {
-                               BT_ERR("HTTPS GET request in progress, message dropped");
+               } else {
+                       BT_ERR("HTTPS GET request in progress, message dropped");
+                       result = BLUETOOTH_ERROR_INTERNAL;
+               }
+               break;
+
+       case HTTPS_HEAD_REQUEST:
+               if (req_state == HTTP_REQ_STATE_EXECUTED) {
+                       req_state = HTTP_REQ_STATE_INPROGRESS;
+                       hps_soup_msg = soup_message_new("HEAD", g_uri);
+                       if (hps_soup_msg == NULL) {
+                               BT_ERR("Soup Message NULL");
                                result = BLUETOOTH_ERROR_INTERNAL;
+                               req_state = HTTP_REQ_STATE_EXECUTED;
+                               break;
                        }
-                       break;
-
-               case HTTPS_HEAD_REQUEST:
-                       if (req_state == HTTP_REQ_STATE_EXECUTED) {
-                               req_state = HTTP_REQ_STATE_INPROGRESS;
-                               hps_soup_msg = soup_message_new("HEAD", g_uri);
-                               if (hps_soup_msg == NULL) {
-                                       BT_ERR("Soup Message NULL");
-                                       result = BLUETOOTH_ERROR_INTERNAL;
-                                       req_state = HTTP_REQ_STATE_EXECUTED;
-                                       break;
-                               }
 #ifdef HPS_GATT_DB
-                               g_object_ref(hps_soup_msg);
-                               soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_head_response_cb, addr);
+                       g_object_ref(hps_soup_msg);
+                       soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_head_response_cb, addr);
 #else
-                               soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_head_response_cb, NULL);
+                       soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_head_response_cb, NULL);
 #endif
-                               https_status = soup_message_get_https_status(hps_soup_msg, &cert, &flags);
+                       https_status = soup_message_get_https_status(hps_soup_msg, &cert, &flags);
 #ifdef HPS_GATT_DB
-                               _bt_hps_set_char_value(http_security_obj_path, (const char *)&https_status, 1);
+                       _bt_hps_set_char_value(http_security_obj_path, (const char *)&https_status, 1);
 #else
-                               bluetooth_gatt_set_characteristic_value(http_security_obj_path, (char *)&https_status, 1);
+                       bluetooth_gatt_set_characteristic_value(http_security_obj_path, (char *)&https_status, 1);
 #endif
-                       } else {
-                               BT_ERR("HTTPS HEAD request in progress, message dropped");
+               } else {
+                       BT_ERR("HTTPS HEAD request in progress, message dropped");
+                       result = BLUETOOTH_ERROR_INTERNAL;
+               }
+               break;
+
+       case HTTPS_POST_REQUEST:
+               if (req_state == HTTP_REQ_STATE_EXECUTED) {
+                       req_state = HTTP_REQ_STATE_INPROGRESS;
+                       hps_soup_msg = soup_message_new("POST", g_uri);
+                       if (hps_soup_msg == NULL) {
+                               BT_ERR("Soup Message NULL");
                                result = BLUETOOTH_ERROR_INTERNAL;
+                               req_state = HTTP_REQ_STATE_EXECUTED;
+                               break;
                        }
-                       break;
-
-               case HTTPS_POST_REQUEST:
-                       if (req_state == HTTP_REQ_STATE_EXECUTED) {
-                               req_state = HTTP_REQ_STATE_INPROGRESS;
-                               hps_soup_msg = soup_message_new("POST", g_uri);
-                               if (hps_soup_msg == NULL) {
-                                       BT_ERR("Soup Message NULL");
-                                       result = BLUETOOTH_ERROR_INTERNAL;
-                                       req_state = HTTP_REQ_STATE_EXECUTED;
-                                       break;
-                               }
-                               soup_message_set_request(hps_soup_msg, "text/xml", SOUP_MEMORY_STATIC,
-                                                         g_entity, strlen(g_entity));
+                       soup_message_set_request(hps_soup_msg, "text/xml", SOUP_MEMORY_STATIC,
+                                                 g_entity, strlen(g_entity));
 #ifdef HPS_GATT_DB
-                               g_object_ref(hps_soup_msg);
-                               soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, addr);
+                       g_object_ref(hps_soup_msg);
+                       soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, addr);
 #else
-                               soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, NULL);
+                       soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, NULL);
 
 #endif
-                               https_status = soup_message_get_https_status(hps_soup_msg, &cert, &flags);
+                       https_status = soup_message_get_https_status(hps_soup_msg, &cert, &flags);
 #ifdef HPS_GATT_DB
-                               _bt_hps_set_char_value(http_security_obj_path, (const char *)&https_status, 1);
+                       _bt_hps_set_char_value(http_security_obj_path, (const char *)&https_status, 1);
 #else
-                               bluetooth_gatt_set_characteristic_value(http_security_obj_path, (char *)&https_status, 1);
+                       bluetooth_gatt_set_characteristic_value(http_security_obj_path, (char *)&https_status, 1);
 #endif
-                       } else {
-                               BT_ERR("HTTPS POST request in progress, message dropped");
+               } else {
+                       BT_ERR("HTTPS POST request in progress, message dropped");
+                       result = BLUETOOTH_ERROR_INTERNAL;
+               }
+               break;
+
+       case HTTPS_PUT_REQUEST:
+               if (req_state == HTTP_REQ_STATE_EXECUTED) {
+                       SoupBuffer *buf;
+                       req_state = HTTP_REQ_STATE_INPROGRESS;
+                       hps_soup_msg = soup_message_new("PUT", g_uri);
+                       if (hps_soup_msg == NULL) {
+                               BT_ERR("Soup Message NULL");
                                result = BLUETOOTH_ERROR_INTERNAL;
+                               req_state = HTTP_REQ_STATE_EXECUTED;
+                               break;
                        }
-                       break;
-
-               case HTTPS_PUT_REQUEST:
-                       if (req_state == HTTP_REQ_STATE_EXECUTED) {
-                               SoupBuffer *buf;
-                               req_state = HTTP_REQ_STATE_INPROGRESS;
-                               hps_soup_msg = soup_message_new("PUT", g_uri);
-                               if (hps_soup_msg == NULL) {
-                                       BT_ERR("Soup Message NULL");
-                                       result = BLUETOOTH_ERROR_INTERNAL;
-                                       req_state = HTTP_REQ_STATE_EXECUTED;
-                                       break;
-                               }
-                               buf = soup_buffer_new(SOUP_MEMORY_TAKE, g_entity, strlen(g_entity));
-                               soup_message_body_append_buffer(hps_soup_msg->request_body, buf);
-                               soup_message_body_set_accumulate(hps_soup_msg->request_body, FALSE);
+                       buf = soup_buffer_new(SOUP_MEMORY_TAKE, g_entity, strlen(g_entity));
+                       soup_message_body_append_buffer(hps_soup_msg->request_body, buf);
+                       soup_message_body_set_accumulate(hps_soup_msg->request_body, FALSE);
 #ifdef HPS_GATT_DB
-                               g_object_ref(hps_soup_msg);
-                               soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, addr);
+                       g_object_ref(hps_soup_msg);
+                       soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, addr);
 #else
-                               soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, NULL);
+                       soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, NULL);
 #endif
-                               https_status = soup_message_get_https_status(hps_soup_msg, &cert, &flags);
+                       https_status = soup_message_get_https_status(hps_soup_msg, &cert, &flags);
 #ifdef HPS_GATT_DB
-                               _bt_hps_set_char_value(http_security_obj_path, (const char *)&https_status, 1);
+                       _bt_hps_set_char_value(http_security_obj_path, (const char *)&https_status, 1);
 #else
-                               bluetooth_gatt_set_characteristic_value(http_security_obj_path, (char *)&https_status, 1);
+                       bluetooth_gatt_set_characteristic_value(http_security_obj_path, (char *)&https_status, 1);
 #endif
-                       } else {
-                               BT_ERR("HTTPS PUT request in progress, message dropped");
+               } else {
+                       BT_ERR("HTTPS PUT request in progress, message dropped");
+                       result = BLUETOOTH_ERROR_INTERNAL;
+               }
+               break;
+
+       case HTTPS_DELETE_REQUEST:
+               if (req_state == HTTP_REQ_STATE_EXECUTED) {
+                       req_state = HTTP_REQ_STATE_INPROGRESS;
+                       hps_soup_msg = soup_message_new("DELETE", g_uri);
+                       if (hps_soup_msg == NULL) {
+                               BT_ERR("Soup Message NULL");
                                result = BLUETOOTH_ERROR_INTERNAL;
+                               req_state = HTTP_REQ_STATE_EXECUTED;
+                               break;
                        }
-                       break;
-
-               case HTTPS_DELETE_REQUEST:
-                       if (req_state == HTTP_REQ_STATE_EXECUTED) {
-                               req_state = HTTP_REQ_STATE_INPROGRESS;
-                               hps_soup_msg = soup_message_new("DELETE", g_uri);
-                               if (hps_soup_msg == NULL) {
-                                       BT_ERR("Soup Message NULL");
-                                       result = BLUETOOTH_ERROR_INTERNAL;
-                                       req_state = HTTP_REQ_STATE_EXECUTED;
-                                       break;
-                               }
 #ifdef HPS_GATT_DB
-                               g_object_ref(hps_soup_msg);
-                               soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, addr);
+                       g_object_ref(hps_soup_msg);
+                       soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, addr);
 #else
-                               soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, NULL);
+                       soup_session_queue_message(hps_soup_session, hps_soup_msg, _bt_hps_http_response_cb, NULL);
 #endif
 
-                               https_status = soup_message_get_https_status(hps_soup_msg, &cert, &flags);
+                       https_status = soup_message_get_https_status(hps_soup_msg, &cert, &flags);
 #ifdef HPS_GATT_DB
-                               _bt_hps_set_char_value(http_security_obj_path, (const char *)&https_status, 1);
+                       _bt_hps_set_char_value(http_security_obj_path, (const char *)&https_status, 1);
 #else
-                               bluetooth_gatt_set_characteristic_value(http_security_obj_path, (char *)&https_status, 1);
+                       bluetooth_gatt_set_characteristic_value(http_security_obj_path, (char *)&https_status, 1);
 #endif
-                       } else {
-                               BT_ERR("HTTPS DELETE request in progress, message dropped");
+               } else {
+                       BT_ERR("HTTPS DELETE request in progress, message dropped");
+                       result = BLUETOOTH_ERROR_INTERNAL;
+               }
+               break;
+
+       case HTTP_REQUEST_CANCEL:
+               /* Cancel the outstanding request */
+               if (req_state == HTTP_REQ_STATE_INPROGRESS) {
+                       req_state = HTTP_REQ_STATE_IDLE;
+                       if (hps_soup_msg == NULL) {
+                               BT_ERR("Soup Message NULL");
                                result = BLUETOOTH_ERROR_INTERNAL;
+                               req_state = HTTP_REQ_STATE_EXECUTED;
+                               break;
                        }
-                       break;
-
-               case HTTP_REQUEST_CANCEL:
-                       /* Cancel the outstanding request */
-                       if (req_state == HTTP_REQ_STATE_INPROGRESS) {
-                               req_state = HTTP_REQ_STATE_IDLE;
-                               if (hps_soup_msg == NULL) {
-                                       BT_ERR("Soup Message NULL");
-                                       result = BLUETOOTH_ERROR_INTERNAL;
-                                       req_state = HTTP_REQ_STATE_EXECUTED;
-                                       break;
-                               }
-                               soup_session_cancel_message(hps_soup_session, hps_soup_msg, SOUP_STATUS_CANCELLED);
-                               hps_soup_msg = NULL;
-                       }
-                       break;
+                       soup_session_cancel_message(hps_soup_session, hps_soup_msg, SOUP_STATUS_CANCELLED);
+                       hps_soup_msg = NULL;
+               }
+               break;
 
-               default:
-                       BT_ERR("Unknown opcode %0x", opcode);
-                       result = BLUETOOTH_ERROR_INTERNAL;
-                       break;
+       default:
+               BT_ERR("Unknown opcode %0x", opcode);
+               result = BLUETOOTH_ERROR_INTERNAL;
+               break;
        }
 
        return result;
@@ -1392,7 +1390,7 @@ int _bt_hps_set_advertising_data(void)
        int ret;
        BT_DBG("");
 
-    // Temporary UUID is used. SIG have not yet defined the UUID yet
+       // Temporary UUID is used. SIG have not yet defined the UUID yet
        guint8 data[4]  = {0x03, 0x02, 0x00, 0x19};
        bluetooth_advertising_data_t adv;
 
@@ -1619,18 +1617,18 @@ static void _bt_hps_sig_handler(int sig)
        BT_DBG("");
 
        switch (sig) {
-               case SIGTERM:
-                       BT_DBG("caught signal - sigterm\n");
-                       break;
-               case SIGINT:
-                       BT_DBG("caught signal - sigint\n");
-                       break;
-               case SIGKILL:
-                       BT_DBG("caught signal - sigkill\n");
-                       break;
-               default:
-                       BT_DBG("caught signal %d and ignored\n", sig);
-                       break;
+       case SIGTERM:
+               BT_DBG("caught signal - sigterm\n");
+               break;
+       case SIGINT:
+               BT_DBG("caught signal - sigint\n");
+               break;
+       case SIGKILL:
+               BT_DBG("caught signal - sigkill\n");
+               break;
+       default:
+               BT_DBG("caught signal %d and ignored\n", sig);
+               break;
        }
 }
 
@@ -1674,9 +1672,8 @@ void _bt_hps_exit(void)
 
        _bt_hps_unregister_interface();
 
-       if (main_loop != NULL) {
+       if (main_loop != NULL)
                g_main_loop_quit(main_loop);
-       }
 }
 
 void bt_hps_event_callback(int event, bluetooth_event_param_t* param,
@@ -1747,9 +1744,8 @@ int main(void)
 
        BT_DBG("g_main_loop_quit called!");
 
-       if (main_loop != NULL) {
+       if (main_loop != NULL)
                g_main_loop_unref(main_loop);
-       }
 
        return 0;
 }
index 02f0b93..311bab0 100644 (file)
@@ -42,6 +42,7 @@ SET(PKG_MODULES
         dbus-glib-1
         dbus-1
         gio-2.0
+       gio-unix-2.0
         alarm-service
         capi-content-mime-type
         capi-network-connection
@@ -52,9 +53,9 @@ SET(PKG_MODULES
         storage
 )
 
-IF("$ENV{CFLAGS}" MATCHES "-DTIZEN_NETWORK_TETHERING_ENABLE")
+IF("$ENV{CFLAGS}" MATCHES "-DTIZEN_FEATURE_NETWORK_TETHERING_ENABLE")
 SET(PKG_MODULES ${PKG_MODULES}
-        capi-network-tethering
+       capi-network-tethering
 )
 ENDIF()
 
@@ -92,11 +93,6 @@ ADD_DEFINITIONS("-DAPP_SYSCONFDIR=\"${APP_SYSCONFDIR}\"")
 ADD_DEFINITIONS("-DHPS_FEATURE")
 ADD_DEFINITIONS("-DTIZEN_DPM_ENABLE")
 
-IF(LIBNOTIFY_SUPPORT OR LIBNOTIFICATION_SUPPORT)
-        ADD_DEFINITIONS("-DDATA_DIR_ICON=\"${SHARE_INSTALL_PREFIX}\"")
-        MESSAGE("Icon used for notification is : ${SHARE_INSTALL_PREFIX}/icons/default/bt-icon.png")
-ENDIF(LIBNOTIFY_SUPPORT OR LIBNOTIFICATION_SUPPORT)
-
 SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie")
 
 ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS})
index 50798a6..c584dbd 100644 (file)
@@ -157,7 +157,9 @@ static void __bt_service_get_parameters(GVariant *in_param,
 static gboolean __bt_is_sync_function(int service_function)
 {
        /*TODO: Keep adding sync methods with expect replies from bluetooth service */
-       if (service_function == BT_GET_LOCAL_ADDRESS
+       if (service_function == BT_ENABLE_ADAPTER
+                       || service_function == BT_DISABLE_ADAPTER
+                       || service_function == BT_GET_LOCAL_ADDRESS
                        || service_function == BT_GET_LOCAL_NAME
                        || service_function == BT_GET_LOCAL_VERSION
                        || service_function == BT_GET_BONDED_DEVICES
index 99a912a..1e32cb7 100644 (file)
@@ -395,9 +395,9 @@ int _bt_send_event(int event_type, int event, GVariant *param)
        case BLUETOOTH_EVENT_IPSP_DISCONNECTED:
                signal = BT_IPSP_DISCONNECTED;
                break;
-       case BLUETOOTH_EVENT_IPSP_BT_INTERFACE_INFO:
-               signal = BT_IPSP_BT_INTERFACE_INFO;
-               break;
+//     case BLUETOOTH_EVENT_IPSP_BT_INTERFACE_INFO:
+//             signal = BT_IPSP_BT_INTERFACE_INFO;
+//             break;
        case BLUETOOTH_EVENT_GATT_CHAR_VAL_CHANGED:
                signal = BT_GATT_CHAR_VAL_CHANGED;
                break;
index 8c24644..0ed8e72 100644 (file)
@@ -553,7 +553,6 @@ void _bt_check_hdp_app_termination(const char *name)
                if (app->owner && !strncasecmp(app->owner, name, strlen(name))) {
                        BT_DBG("Match found, name: %s", name);
                        _bt_hdp_app_unregister(app->app_id);
-                       break;
                }
        }
 
index a0e1702..abb9180 100644 (file)
@@ -90,11 +90,11 @@ INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/auto-pair-blacklist DESTINATION /opt/v
 # install booting script
 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/bluetooth-frwk-service.conf.in ${CMAKE_CURRENT_SOURCE_DIR}/bluetooth-frwk-service.conf)
 
-IF (TIZEN_WEARABLE)
+IF (TIZEN_PROFILE_WEARABLE)
        INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/wearable/stack_info DESTINATION /usr/etc/bluetooth/)
 ELSE ()
        INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/mobile/stack_info DESTINATION /usr/etc/bluetooth/)
-ENDIF (TIZEN_WEARABLE)
+ENDIF (TIZEN_PROFILE_WEARABLE)
 
 INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/bluetooth-frwk-service.conf DESTINATION /etc/dbus-1/system.d)
 
index f3b0055..8292362 100644 (file)
@@ -236,9 +236,8 @@ static void __bt_service_method(GDBusConnection *connection,
                        goto fail;
                }
 
-               if (result != BLUETOOTH_ERROR_NONE) {
+               if (result != BLUETOOTH_ERROR_NONE)
                        goto fail;
-               }
 
                if ((request_type == BT_ASYNC_REQ ||
                        service_function == BT_OBEX_SERVER_ACCEPT_CONNECTION) &&
@@ -249,10 +248,10 @@ static void __bt_service_method(GDBusConnection *connection,
                } else {
                        /* Return result */
                        if (service_type == BT_CHECK_PRIVILEGE ||
-                                       service_function != BT_OPP_PUSH_FILES) {
+                               service_function != BT_OPP_PUSH_FILES) {
                                out_var = g_variant_new_from_data((const GVariantType *)"ay",
-                                               out_param1->data, out_param1->len,
-                                               TRUE, NULL, NULL);
+                                                               out_param1->data, out_param1->len,
+                                                               TRUE, NULL, NULL);
 
                                GVariant *temp = g_variant_new("(iv)", result, out_var);
                                g_dbus_method_invocation_return_value(invocation, temp);
@@ -613,9 +612,9 @@ int __bt_bluez_request(int function_name,
                int length = 0;
 
                result = _bt_get_advertising_data(&adv, &length);
-               if (result == BLUETOOTH_ERROR_NONE) {
+               if (result == BLUETOOTH_ERROR_NONE)
                        g_array_append_vals(*out_param1, adv.data, length);
-               }
+
                break;
        }
        case BT_SET_ADVERTISING_DATA: {
@@ -645,9 +644,8 @@ int __bt_bluez_request(int function_name,
                int length = 0;
 
                result = _bt_get_scan_response_data(&rsp, &length);
-               if (result == BLUETOOTH_ERROR_NONE) {
+               if (result == BLUETOOTH_ERROR_NONE)
                        g_array_append_vals(*out_param1, rsp.data, length);
-               }
 
                break;
        }
@@ -2002,15 +2000,15 @@ int __bt_obexd_request(int function_name,
                                                                &address, file_path,
                                                                file_count);
                } else {
-            BT_DBG("normal case");
-            result = _bt_opp_client_push_files(request_id, context,
+                       BT_DBG("normal case");
+                       result = _bt_opp_client_push_files(request_id, context,
                                                        &address, file_path,
                                                        file_count);
                }
 
-               for (i = 0; i < file_count; i++) {
+               for (i = 0; i < file_count; i++)
                        g_free(file_path[i]);
-               }
+
                g_free(file_path);
                g_array_free(param2, TRUE);
                if (process_proxy)
@@ -2389,302 +2387,303 @@ gboolean __bt_service_check_privilege(int function_name,
                                        int service_type,
                                        const char *unique_name)
 {
-        int ret_val;
-        gboolean result = TRUE;
-        char *client_creds = NULL;
-        char *user_creds = NULL;
-        char *client_session = "";
-        enum cynara_client_creds client_creds_method = CLIENT_METHOD_SMACK;
-        enum cynara_user_creds user_creds_method = USER_METHOD_UID;
-        char err_msg[256] = {0, };
-
-        retv_if(unique_name == NULL, FALSE);
-
-        BT_DBG("unique_name: %s", unique_name);
-
-        retv_if(bt_service_conn == NULL, FALSE);
-
-        ret_val = cynara_creds_get_default_client_method(&client_creds_method);
-        if (ret_val != CYNARA_API_SUCCESS) {
-                cynara_strerror(ret_val, err_msg, sizeof(err_msg));
-                BT_ERR("Fail to get default client method: %s", err_msg);
-                return FALSE;
-        }
-
-        ret_val = cynara_creds_get_default_user_method(&user_creds_method);
-        if (ret_val != CYNARA_API_SUCCESS) {
-                cynara_strerror(ret_val, err_msg, sizeof(err_msg));
-                BT_ERR("Fail to get default user method: %s", err_msg);
-                return FALSE;
-        }
-
-        ret_val = cynara_creds_gdbus_get_client(bt_service_conn, unique_name, client_creds_method, &client_creds);
-        if (ret_val != CYNARA_API_SUCCESS) {
-                cynara_strerror(ret_val, err_msg, sizeof(err_msg));
-                BT_ERR("Fail to get client credential: %s", err_msg);
-                return FALSE;
-        }
-
-        BT_DBG("client_creds: %s", client_creds);
-
-        ret_val = cynara_creds_gdbus_get_user(bt_service_conn, unique_name, user_creds_method, &user_creds);
-        if (ret_val != CYNARA_API_SUCCESS) {
-                cynara_strerror(ret_val, err_msg, sizeof(err_msg));
-                BT_ERR("Fail to get user credential: %s", err_msg);
-                if (client_creds)
-                        free(client_creds);
-                return FALSE;
-        }
-
-        BT_DBG("user_creds: %s", user_creds);
-
-        switch (function_name) {
-        case BT_SET_LOCAL_NAME:
-        case BT_START_DISCOVERY:
-        case BT_START_CUSTOM_DISCOVERY:
-        case BT_CANCEL_DISCOVERY:
-        case BT_OOB_ADD_REMOTE_DATA:
-        case BT_OOB_REMOVE_REMOTE_DATA:
-        case BT_SET_ADVERTISING:
-        case BT_SET_CUSTOM_ADVERTISING:
-        case BT_SET_ADVERTISING_PARAMETERS:
-        case BT_START_LE_DISCOVERY:
-        case BT_STOP_LE_DISCOVERY:
-
-        case BT_BOND_DEVICE:
-        case BT_CANCEL_BONDING:
-        case BT_UNBOND_DEVICE:
-        case BT_SET_ALIAS:
-        case BT_SET_AUTHORIZATION:
-        case BT_UNSET_AUTHORIZATION:
-        case BT_SEARCH_SERVICE:
-
-        case BT_RFCOMM_CLIENT_CONNECT:
-        case BT_RFCOMM_CLIENT_CANCEL_CONNECT:
-        case BT_RFCOMM_SOCKET_DISCONNECT:
-        case BT_RFCOMM_SOCKET_WRITE:
-        case BT_RFCOMM_CREATE_SOCKET:
-        case BT_RFCOMM_REMOVE_SOCKET:
-
-        case BT_OPP_PUSH_FILES:
-        case BT_OPP_CANCEL_PUSH:
-
-        case BT_OBEX_SERVER_ACCEPT_CONNECTION:
-        case BT_OBEX_SERVER_REJECT_CONNECTION:
-        case BT_OBEX_SERVER_ACCEPT_FILE:
-        case BT_OBEX_SERVER_REJECT_FILE:
-        case BT_OBEX_SERVER_SET_PATH:
-        case BT_OBEX_SERVER_SET_ROOT:
-        case BT_OBEX_SERVER_CANCEL_TRANSFER:
-        case BT_OBEX_SERVER_CANCEL_ALL_TRANSFERS:
-
-        case BT_AUDIO_CONNECT:
-        case BT_AUDIO_DISCONNECT:
-        case BT_AG_CONNECT:
-        case BT_AG_DISCONNECT:
-        case BT_AV_CONNECT:
-        case BT_AV_DISCONNECT:
-        case BT_AV_SOURCE_CONNECT:
-        case BT_AV_SOURCE_DISCONNECT:
-        case BT_AVRCP_CONTROL_CONNECT:
-        case BT_AVRCP_CONTROL_DISCONNECT:
-        case BT_AVRCP_HANDLE_CONTROL:
-        case BT_AVRCP_SET_TRACK_INFO:
-        case BT_AVRCP_SET_PROPERTY:
-        case BT_AVRCP_SET_PROPERTIES:
-        case BT_AVRCP_CONTROL_SET_PROPERTY:
-
-        case BT_HF_CONNECT:
-        case BT_HF_DISCONNECT:
-
-        case BT_HID_CONNECT:
-        case BT_HID_DISCONNECT:
-
-        case BT_HID_DEVICE_ACTIVATE:
-        case BT_HID_DEVICE_DEACTIVATE:
-        case BT_HID_DEVICE_CONNECT:
-        case BT_HID_DEVICE_DISCONNECT:
-        case BT_HID_DEVICE_SEND_MOUSE_EVENT:
-        case BT_HID_DEVICE_SEND_KEY_EVENT:
-        case BT_HID_DEVICE_SEND_REPLY_TO_REPORT:
-
-        case BT_CONNECT_LE:
-        case BT_DISCONNECT_LE:
-
-        case BT_SET_ADVERTISING_DATA:
-        case BT_SET_SCAN_RESPONSE_DATA:
-
-        case BT_HDP_CONNECT:
-        case BT_HDP_DISCONNECT:
-        case BT_HDP_SEND_DATA:
-
-        case BT_DPM_SET_ALLOW_BT_MODE:
-        case BT_DPM_GET_ALLOW_BT_MODE:
-        case BT_DPM_SET_DEVICE_RESTRITION:
-        case BT_DPM_GET_DEVICE_RESTRITION:
-        case BT_DPM_SET_UUID_RESTRITION:
-        case BT_DPM_GET_UUID_RESTRITION:
-        case BT_DPM_ADD_DEVICES_BLACKLIST:
-        case BT_DPM_ADD_DEVICES_WHITELIST:
-        case BT_DPM_ADD_UUIDS_BLACKLIST:
-        case BT_DPM_ADD_UUIDS_WHITELIST:
-        case BT_DPM_CLEAR_DEVICES_BLACKLIST:
-        case BT_DPM_CLEAR_DEVICES_WHITELIST:
-        case BT_DPM_CLEAR_UUIDS_BLACKLIST:
-        case BT_DPM_CLEAR_UUIDS_WHITELIST:
-        case BT_DPM_REMOVE_DEVICE_BLACKLIST:
-        case BT_DPM_REMOVE_DEVICE_WHITELIST:
-        case BT_DPM_REMOVE_UUID_BLACKLIST:
-        case BT_DPM_REMOVE_UUID_WHITELIST:
-        case BT_DPM_GET_DEVICES_BLACKLIST:
-        case BT_DPM_GET_DEVICES_WHITELIST:
-        case BT_DPM_GET_UUIDS_BLACKLIST:
-        case BT_DPM_GET_UUIDS_WHITELIST:
-        case BT_DPM_SET_ALLOW_OUTGOING_CALL:
-        case BT_DPM_GET_ALLOW_OUTGOING_CALL:
-        case BT_DPM_SET_PAIRING_STATE:
-        case BT_DPM_GET_PAIRING_STATE:
-        case BT_DPM_SET_PROFILE_STATE:
-        case BT_DPM_GET_PROFILE_STATE:
-        case BT_DPM_SET_DESKROP_CONNECTIVITY_STATE:
-        case BT_DPM_GET_DESKROP_CONNECTIVITY_STATE:
-        case BT_DPM_SET_DISCOVERABLE_STATE:
-        case BT_DPM_GET_DISCOVERABLE_STATE:
-        case BT_DPM_SET_LIMITED_DISCOVERABLE_STATE:
-        case BT_DPM_GET_LIMITED_DISCOVERABLE_STATE:
-        case BT_DPM_SET_DATA_TRANSFER_STATE:
-        case BT_DPM_GET_DATA_TRANSFER_STATE:
-
-        case BT_NETWORK_ACTIVATE:
-        case BT_NETWORK_DEACTIVATE:
-        case BT_NETWORK_CONNECT:
-        case BT_NETWORK_DISCONNECT:
-        case BT_NETWORK_SERVER_DISCONNECT:
-
-        case BT_GATT_GET_PRIMARY_SERVICES:
-        case BT_GATT_DISCOVER_CHARACTERISTICS:
-        case BT_GATT_SET_PROPERTY_REQUEST:
-        case BT_GATT_READ_CHARACTERISTIC:
-        case BT_GATT_DISCOVER_CHARACTERISTICS_DESCRIPTOR:
-        case BT_GATT_REGISTER_APPLICATION:
-        case BT_GATT_REGISTER_SERVICE:
-        case BT_GATT_SEND_RESPONSE:
-               case BT_PBAP_CONNECT:
-               case BT_PBAP_DISCONNECT:
-               case BT_PBAP_GET_PHONEBOOK_SIZE:
-               case BT_PBAP_GET_PHONEBOOK:
-               case BT_PBAP_GET_LIST:
-               case BT_PBAP_PULL_VCARD:
-               case BT_PBAP_PHONEBOOK_SEARCH:
-
-                ret_val = cynara_check(p_cynara, client_creds, client_session, user_creds,
-                                                                                 BT_PRIVILEGE_PUBLIC);
-
-                if (ret_val != CYNARA_API_ACCESS_ALLOWED) {
-                        BT_ERR("Fail to access: %s", BT_PRIVILEGE_PUBLIC);
-                        result = FALSE;
-                }
-
-                               /* Need to check mediastorage privilege */
-                               if (function_name == BT_PBAP_GET_PHONEBOOK ||
-                                        function_name == BT_PBAP_PULL_VCARD) {
-                       ret_val = cynara_check(p_cynara, client_creds, client_session, user_creds,
-                                                                    MEDIASTORAGE_PRIVILEGE);
-
-                       if (ret_val != CYNARA_API_ACCESS_ALLOWED) {
-                               BT_ERR("Fail to access: %s", MEDIASTORAGE_PRIVILEGE);
-                               result = FALSE;
-                       }
-                               }
-        break;
-
-        case BT_ENABLE_ADAPTER:
-        case BT_DISABLE_ADAPTER:
-        case BT_RESET_ADAPTER:
-        case BT_RECOVER_ADAPTER:
-        case BT_ENABLE_ADAPTER_LE:
-        case BT_DISABLE_ADAPTER_LE:
-        case BT_SET_CONNECTABLE:
-        case BT_SET_DISCOVERABLE_MODE:
-        case BT_ADD_WHITE_LIST:
-        case BT_REMOVE_WHITE_LIST:
-        case BT_CLEAR_WHITE_LIST:
-        case BT_SET_MANUFACTURER_DATA:
-        case BT_SET_SCAN_PARAMETERS:
-
-        case BT_CANCEL_SEARCH_SERVICE:
-        case BT_ENABLE_RSSI:
-
-        case BT_RFCOMM_ACCEPT_CONNECTION:
-        case BT_RFCOMM_REJECT_CONNECTION:
-        case BT_RFCOMM_LISTEN:
-
-        case BT_AVRCP_CONTROL_GET_PROPERTY:
-        case BT_AVRCP_GET_TRACK_INFO:
-
-        case BT_SET_CONTENT_PROTECT:
-        case BT_BOND_DEVICE_BY_TYPE:
-        case BT_SET_LE_PRIVACY:
-        case BT_LE_CONN_UPDATE:
-        case BT_LE_READ_MAXIMUM_DATA_LENGTH:
-        case BT_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH:
-        case BT_LE_READ_HOST_SUGGESTED_DATA_LENGTH:
-        case BT_LE_SET_DATA_LENGTH:
-
-        case BT_LE_IPSP_INIT:
-        case BT_LE_IPSP_DEINIT:
-        case BT_LE_IPSP_CONNECT:
-        case BT_LE_IPSP_DISCONNECT:
-                ret_val = cynara_check(p_cynara, client_creds, client_session, user_creds,
-                                                                                 BT_PRIVILEGE_PLATFORM);
-
-                if (ret_val != CYNARA_API_ACCESS_ALLOWED) {
-                        BT_ERR("Fail to access: %s", BT_PRIVILEGE_PLATFORM);
-                        result = FALSE;
-                }
-        break;
-
-        case BT_CHECK_ADAPTER:
-        case BT_GET_RSSI:
-
-        case BT_GET_LOCAL_NAME:
-        case BT_GET_LOCAL_ADDRESS:
-        case BT_GET_LOCAL_VERSION:
-        case BT_IS_SERVICE_USED:
-        case BT_GET_DISCOVERABLE_MODE:
-        case BT_GET_DISCOVERABLE_TIME:
-        case BT_IS_DISCOVERYING:
-        case BT_IS_LE_DISCOVERYING:
-        case BT_IS_CONNECTABLE:
-        case BT_GET_BONDED_DEVICES:
-        case BT_GET_BONDED_DEVICE:
-        case BT_IS_DEVICE_CONNECTED:
-        case BT_GET_SPEAKER_GAIN:
-        case BT_SET_SPEAKER_GAIN:
-        case BT_OOB_READ_LOCAL_DATA:
-        case BT_RFCOMM_CLIENT_IS_CONNECTED:
-        case BT_RFCOMM_IS_UUID_AVAILABLE:
-        case BT_GET_ADVERTISING_DATA:
-        case BT_GET_SCAN_RESPONSE_DATA:
-        case BT_IS_ADVERTISING:
-
-        case BT_OBEX_SERVER_ALLOCATE:
-        case BT_OBEX_SERVER_DEALLOCATE:
-                /* Non-privilege control */
-                break;
-        default:
-                BT_ERR("Unknown function!");
-                result = FALSE;
-                break;
-        }
-
-        if (client_creds)
-                free(client_creds);
-
-        if (user_creds)
-                free(user_creds);
-
-        return result;
+       int ret_val;
+       gboolean result = TRUE;
+       char *client_creds = NULL;
+       char *user_creds = NULL;
+       char *client_session = "";
+       enum cynara_client_creds client_creds_method = CLIENT_METHOD_SMACK;
+       enum cynara_user_creds user_creds_method = USER_METHOD_UID;
+       char err_msg[256] = {0, };
+
+       retv_if(unique_name == NULL, FALSE);
+
+       BT_DBG("unique_name: %s", unique_name);
+
+       retv_if(bt_service_conn == NULL, FALSE);
+
+       ret_val = cynara_creds_get_default_client_method(&client_creds_method);
+       if (ret_val != CYNARA_API_SUCCESS) {
+               cynara_strerror(ret_val, err_msg, sizeof(err_msg));
+               BT_ERR("Fail to get default client method: %s", err_msg);
+               return FALSE;
+       }
+
+       ret_val = cynara_creds_get_default_user_method(&user_creds_method);
+       if (ret_val != CYNARA_API_SUCCESS) {
+               cynara_strerror(ret_val, err_msg, sizeof(err_msg));
+               BT_ERR("Fail to get default user method: %s", err_msg);
+               return FALSE;
+       }
+
+       ret_val = cynara_creds_gdbus_get_client(bt_service_conn, unique_name, client_creds_method, &client_creds);
+       if (ret_val != CYNARA_API_SUCCESS) {
+               cynara_strerror(ret_val, err_msg, sizeof(err_msg));
+               BT_ERR("Fail to get client credential: %s", err_msg);
+               return FALSE;
+       }
+
+       BT_DBG("client_creds: %s", client_creds);
+
+       ret_val = cynara_creds_gdbus_get_user(bt_service_conn, unique_name, user_creds_method, &user_creds);
+       if (ret_val != CYNARA_API_SUCCESS) {
+               cynara_strerror(ret_val, err_msg, sizeof(err_msg));
+               BT_ERR("Fail to get user credential: %s", err_msg);
+
+               if (client_creds)
+                       free(client_creds);
+               return FALSE;
+       }
+
+       BT_DBG("user_creds: %s", user_creds);
+
+       switch (function_name) {
+       case BT_SET_LOCAL_NAME:
+       case BT_START_DISCOVERY:
+       case BT_START_CUSTOM_DISCOVERY:
+       case BT_CANCEL_DISCOVERY:
+       case BT_OOB_ADD_REMOTE_DATA:
+       case BT_OOB_REMOVE_REMOTE_DATA:
+       case BT_SET_ADVERTISING:
+       case BT_SET_CUSTOM_ADVERTISING:
+       case BT_SET_ADVERTISING_PARAMETERS:
+       case BT_START_LE_DISCOVERY:
+       case BT_STOP_LE_DISCOVERY:
+
+       case BT_BOND_DEVICE:
+       case BT_CANCEL_BONDING:
+       case BT_UNBOND_DEVICE:
+       case BT_SET_ALIAS:
+       case BT_SET_AUTHORIZATION:
+       case BT_UNSET_AUTHORIZATION:
+       case BT_SEARCH_SERVICE:
+
+       case BT_RFCOMM_CLIENT_CONNECT:
+       case BT_RFCOMM_CLIENT_CANCEL_CONNECT:
+       case BT_RFCOMM_SOCKET_DISCONNECT:
+       case BT_RFCOMM_SOCKET_WRITE:
+       case BT_RFCOMM_CREATE_SOCKET:
+       case BT_RFCOMM_REMOVE_SOCKET:
+
+       case BT_OPP_PUSH_FILES:
+       case BT_OPP_CANCEL_PUSH:
+
+       case BT_OBEX_SERVER_ACCEPT_CONNECTION:
+       case BT_OBEX_SERVER_REJECT_CONNECTION:
+       case BT_OBEX_SERVER_ACCEPT_FILE:
+       case BT_OBEX_SERVER_REJECT_FILE:
+       case BT_OBEX_SERVER_SET_PATH:
+       case BT_OBEX_SERVER_SET_ROOT:
+       case BT_OBEX_SERVER_CANCEL_TRANSFER:
+       case BT_OBEX_SERVER_CANCEL_ALL_TRANSFERS:
+
+       case BT_AUDIO_CONNECT:
+       case BT_AUDIO_DISCONNECT:
+       case BT_AG_CONNECT:
+       case BT_AG_DISCONNECT:
+       case BT_AV_CONNECT:
+       case BT_AV_DISCONNECT:
+       case BT_AV_SOURCE_CONNECT:
+       case BT_AV_SOURCE_DISCONNECT:
+       case BT_AVRCP_CONTROL_CONNECT:
+       case BT_AVRCP_CONTROL_DISCONNECT:
+       case BT_AVRCP_HANDLE_CONTROL:
+       case BT_AVRCP_SET_TRACK_INFO:
+       case BT_AVRCP_SET_PROPERTY:
+       case BT_AVRCP_SET_PROPERTIES:
+       case BT_AVRCP_CONTROL_SET_PROPERTY:
+
+       case BT_HF_CONNECT:
+       case BT_HF_DISCONNECT:
+
+       case BT_HID_CONNECT:
+       case BT_HID_DISCONNECT:
+
+       case BT_HID_DEVICE_ACTIVATE:
+       case BT_HID_DEVICE_DEACTIVATE:
+       case BT_HID_DEVICE_CONNECT:
+       case BT_HID_DEVICE_DISCONNECT:
+       case BT_HID_DEVICE_SEND_MOUSE_EVENT:
+       case BT_HID_DEVICE_SEND_KEY_EVENT:
+       case BT_HID_DEVICE_SEND_REPLY_TO_REPORT:
+
+       case BT_CONNECT_LE:
+       case BT_DISCONNECT_LE:
+
+       case BT_SET_ADVERTISING_DATA:
+       case BT_SET_SCAN_RESPONSE_DATA:
+
+       case BT_HDP_CONNECT:
+       case BT_HDP_DISCONNECT:
+       case BT_HDP_SEND_DATA:
+
+       case BT_DPM_SET_ALLOW_BT_MODE:
+       case BT_DPM_GET_ALLOW_BT_MODE:
+       case BT_DPM_SET_DEVICE_RESTRITION:
+       case BT_DPM_GET_DEVICE_RESTRITION:
+       case BT_DPM_SET_UUID_RESTRITION:
+       case BT_DPM_GET_UUID_RESTRITION:
+       case BT_DPM_ADD_DEVICES_BLACKLIST:
+       case BT_DPM_ADD_DEVICES_WHITELIST:
+       case BT_DPM_ADD_UUIDS_BLACKLIST:
+       case BT_DPM_ADD_UUIDS_WHITELIST:
+       case BT_DPM_CLEAR_DEVICES_BLACKLIST:
+       case BT_DPM_CLEAR_DEVICES_WHITELIST:
+       case BT_DPM_CLEAR_UUIDS_BLACKLIST:
+       case BT_DPM_CLEAR_UUIDS_WHITELIST:
+       case BT_DPM_REMOVE_DEVICE_BLACKLIST:
+       case BT_DPM_REMOVE_DEVICE_WHITELIST:
+       case BT_DPM_REMOVE_UUID_BLACKLIST:
+       case BT_DPM_REMOVE_UUID_WHITELIST:
+       case BT_DPM_GET_DEVICES_BLACKLIST:
+       case BT_DPM_GET_DEVICES_WHITELIST:
+       case BT_DPM_GET_UUIDS_BLACKLIST:
+       case BT_DPM_GET_UUIDS_WHITELIST:
+       case BT_DPM_SET_ALLOW_OUTGOING_CALL:
+       case BT_DPM_GET_ALLOW_OUTGOING_CALL:
+       case BT_DPM_SET_PAIRING_STATE:
+       case BT_DPM_GET_PAIRING_STATE:
+       case BT_DPM_SET_PROFILE_STATE:
+       case BT_DPM_GET_PROFILE_STATE:
+       case BT_DPM_SET_DESKROP_CONNECTIVITY_STATE:
+       case BT_DPM_GET_DESKROP_CONNECTIVITY_STATE:
+       case BT_DPM_SET_DISCOVERABLE_STATE:
+       case BT_DPM_GET_DISCOVERABLE_STATE:
+       case BT_DPM_SET_LIMITED_DISCOVERABLE_STATE:
+       case BT_DPM_GET_LIMITED_DISCOVERABLE_STATE:
+       case BT_DPM_SET_DATA_TRANSFER_STATE:
+       case BT_DPM_GET_DATA_TRANSFER_STATE:
+
+       case BT_NETWORK_ACTIVATE:
+       case BT_NETWORK_DEACTIVATE:
+       case BT_NETWORK_CONNECT:
+       case BT_NETWORK_DISCONNECT:
+       case BT_NETWORK_SERVER_DISCONNECT:
+
+       case BT_GATT_GET_PRIMARY_SERVICES:
+       case BT_GATT_DISCOVER_CHARACTERISTICS:
+       case BT_GATT_SET_PROPERTY_REQUEST:
+       case BT_GATT_READ_CHARACTERISTIC:
+       case BT_GATT_DISCOVER_CHARACTERISTICS_DESCRIPTOR:
+       case BT_GATT_REGISTER_APPLICATION:
+       case BT_GATT_REGISTER_SERVICE:
+       case BT_GATT_SEND_RESPONSE:
+       case BT_PBAP_CONNECT:
+       case BT_PBAP_DISCONNECT:
+       case BT_PBAP_GET_PHONEBOOK_SIZE:
+       case BT_PBAP_GET_PHONEBOOK:
+       case BT_PBAP_GET_LIST:
+       case BT_PBAP_PULL_VCARD:
+       case BT_PBAP_PHONEBOOK_SEARCH:
+
+       ret_val = cynara_check(p_cynara, client_creds, client_session, user_creds,
+                                       BT_PRIVILEGE_PUBLIC);
+
+       if (ret_val != CYNARA_API_ACCESS_ALLOWED) {
+               BT_ERR("Fail to access: %s", BT_PRIVILEGE_PUBLIC);
+               result = FALSE;
+       }
+
+       /* Need to check mediastorage privilege */
+       if (function_name == BT_PBAP_GET_PHONEBOOK ||
+               function_name == BT_PBAP_PULL_VCARD) {
+               ret_val = cynara_check(p_cynara, client_creds, client_session, user_creds,
+                               MEDIASTORAGE_PRIVILEGE);
+
+               if (ret_val != CYNARA_API_ACCESS_ALLOWED) {
+                       BT_ERR("Fail to access: %s", MEDIASTORAGE_PRIVILEGE);
+                       result = FALSE;
+               }
+       }
+break;
+
+       case BT_ENABLE_ADAPTER:
+       case BT_DISABLE_ADAPTER:
+       case BT_RESET_ADAPTER:
+       case BT_RECOVER_ADAPTER:
+       case BT_ENABLE_ADAPTER_LE:
+       case BT_DISABLE_ADAPTER_LE:
+       case BT_SET_CONNECTABLE:
+       case BT_SET_DISCOVERABLE_MODE:
+       case BT_ADD_WHITE_LIST:
+       case BT_REMOVE_WHITE_LIST:
+       case BT_CLEAR_WHITE_LIST:
+       case BT_SET_MANUFACTURER_DATA:
+       case BT_SET_SCAN_PARAMETERS:
+
+       case BT_CANCEL_SEARCH_SERVICE:
+       case BT_ENABLE_RSSI:
+
+       case BT_RFCOMM_ACCEPT_CONNECTION:
+       case BT_RFCOMM_REJECT_CONNECTION:
+       case BT_RFCOMM_LISTEN:
+
+       case BT_AVRCP_CONTROL_GET_PROPERTY:
+       case BT_AVRCP_GET_TRACK_INFO:
+
+       case BT_SET_CONTENT_PROTECT:
+       case BT_BOND_DEVICE_BY_TYPE:
+       case BT_SET_LE_PRIVACY:
+       case BT_LE_CONN_UPDATE:
+       case BT_LE_READ_MAXIMUM_DATA_LENGTH:
+       case BT_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH:
+       case BT_LE_READ_HOST_SUGGESTED_DATA_LENGTH:
+       case BT_LE_SET_DATA_LENGTH:
+
+       case BT_LE_IPSP_INIT:
+       case BT_LE_IPSP_DEINIT:
+       case BT_LE_IPSP_CONNECT:
+       case BT_LE_IPSP_DISCONNECT:
+       ret_val = cynara_check(p_cynara, client_creds, client_session, user_creds,
+                       BT_PRIVILEGE_PLATFORM);
+
+       if (ret_val != CYNARA_API_ACCESS_ALLOWED) {
+               BT_ERR("Fail to access: %s", BT_PRIVILEGE_PLATFORM);
+               result = FALSE;
+       }
+       break;
+
+       case BT_CHECK_ADAPTER:
+       case BT_GET_RSSI:
+
+       case BT_GET_LOCAL_NAME:
+       case BT_GET_LOCAL_ADDRESS:
+       case BT_GET_LOCAL_VERSION:
+       case BT_IS_SERVICE_USED:
+       case BT_GET_DISCOVERABLE_MODE:
+       case BT_GET_DISCOVERABLE_TIME:
+       case BT_IS_DISCOVERYING:
+       case BT_IS_LE_DISCOVERYING:
+       case BT_IS_CONNECTABLE:
+       case BT_GET_BONDED_DEVICES:
+       case BT_GET_BONDED_DEVICE:
+       case BT_IS_DEVICE_CONNECTED:
+       case BT_GET_SPEAKER_GAIN:
+       case BT_SET_SPEAKER_GAIN:
+       case BT_OOB_READ_LOCAL_DATA:
+       case BT_RFCOMM_CLIENT_IS_CONNECTED:
+       case BT_RFCOMM_IS_UUID_AVAILABLE:
+       case BT_GET_ADVERTISING_DATA:
+       case BT_GET_SCAN_RESPONSE_DATA:
+       case BT_IS_ADVERTISING:
+
+       case BT_OBEX_SERVER_ALLOCATE:
+       case BT_OBEX_SERVER_DEALLOCATE:
+               /* Non-privilege control */
+               break;
+       default:
+               BT_ERR("Unknown function!");
+               result = FALSE;
+               break;
+       }
+
+       if (client_creds)
+               free(client_creds);
+
+       if (user_creds)
+               free(user_creds);
+
+       return result;
 }
 
 GDBusNodeInfo *__bt_service_create_method_node_info
@@ -2800,38 +2799,38 @@ void _bt_service_unregister(void)
 
 int _bt_service_cynara_init(void)
 {
-        int result;
-        char err_msg[256] = {0, };
+       int result;
+       char err_msg[256] = {0, };
 
-        retv_if(p_cynara != NULL, BLUETOOTH_ERROR_ALREADY_INITIALIZED);
+       retv_if(p_cynara != NULL, BLUETOOTH_ERROR_ALREADY_INITIALIZED);
 
-        result = cynara_initialize(&p_cynara, conf);
+       result = cynara_initialize(&p_cynara, conf);
 
-        if (result != CYNARA_API_SUCCESS) {
-                cynara_strerror(result, err_msg, sizeof(err_msg));
-                BT_ERR("Fail to initialize cynara: [%s]", err_msg);
-                return BLUETOOTH_ERROR_INTERNAL;
-        }
+       if (result != CYNARA_API_SUCCESS) {
+               cynara_strerror(result, err_msg, sizeof(err_msg));
+               BT_ERR("Fail to initialize cynara: [%s]", err_msg);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
 
-        return BLUETOOTH_ERROR_NONE;
+       return BLUETOOTH_ERROR_NONE;
 }
 
 void _bt_service_cynara_deinit(void)
 {
-        int result;
-        char err_msg[256] = {0, };
+       int result;
+       char err_msg[256] = {0, };
 
-        ret_if(p_cynara == NULL);
+       ret_if(p_cynara == NULL);
 
-        result = cynara_finish(p_cynara);
+       result = cynara_finish(p_cynara);
 
-        if (result != CYNARA_API_SUCCESS) {
-                cynara_strerror(result, err_msg, sizeof(err_msg));
-                BT_ERR("Fail to finish cynara: [%s]", err_msg);
-                return;
-        }
+       if (result != CYNARA_API_SUCCESS) {
+               cynara_strerror(result, err_msg, sizeof(err_msg));
+               BT_ERR("Fail to finish cynara: [%s]", err_msg);
+               return;
+       }
 
-        p_cynara = NULL;
-        conf = NULL;
+       p_cynara = NULL;
+       conf = NULL;
 }
 
index 01a85fb..2d418ac 100644 (file)
@@ -79,7 +79,7 @@ static gboolean __bt_timeout_handler(gpointer user_data)
                visible_timer.event_id = 0;
                visible_timer.timeout = 0;
 
-#ifndef TIZEN_WEARABLE
+#ifndef TIZEN_PROFILE_WEARABLE
                if (vconf_set_int(BT_FILE_VISIBLE_TIME, 0) != 0)
                        BT_ERR("Set vconf failed\n");
 #endif
@@ -107,7 +107,7 @@ static int __bt_visibility_alarm_cb(alarm_id_t alarm_id, void* user_param)
                visible_timer.event_id = 0;
                visible_timer.timeout = 0;
 
-#ifndef TIZEN_WEARABLE
+#ifndef TIZEN_PROFILE_WEARABLE
                if (vconf_set_int(BT_FILE_VISIBLE_TIME, 0) != 0)
                        BT_ERR("Set vconf failed\n");
 #endif
@@ -154,7 +154,7 @@ int __bt_set_visible_time(int timeout)
 
        visible_timer.timeout = timeout;
 
-#ifndef TIZEN_WEARABLE
+#ifndef TIZEN_PROFILE_WEARABLE
        if (vconf_set_int(BT_FILE_VISIBLE_TIME, timeout) != 0)
                BT_ERR("Set vconf failed");
 #endif
@@ -234,22 +234,21 @@ static void __bt_phone_name_changed_cb(keynode_t *node, void *data)
                phone_name = vconf_keynode_get_str(node);
 
                if (phone_name && strlen(phone_name) != 0) {
-                        if (!g_utf8_validate(phone_name, -1,
-                                                       (const char **)&ptr))
-                                *ptr = '\0';
+                       if (!g_utf8_validate(phone_name, -1, (const char **)&ptr))
+                               *ptr = '\0';
 
                        _bt_set_local_name(phone_name);
                }
        }
 }
 
-#ifdef TIZEN_MOBILE
+#ifdef TIZEN_PROFILE_MOBILE
 static void __bt_set_visible_mode(void)
 {
        int timeout = 0;
 
        if (vconf_get_int(BT_FILE_VISIBLE_TIME, &timeout) != 0)
-                BT_ERR("Fail to get the timeout value");
+               BT_ERR("Fail to get the timeout value");
 
        if (timeout == -1) {
                if (_bt_set_discoverable_mode(
@@ -292,7 +291,7 @@ static int __bt_set_enabled(void)
        BT_DBG("+");
        int result = BLUETOOTH_ERROR_NONE;
 
-#ifdef TIZEN_MOBILE
+#ifdef TIZEN_PROFILE_MOBILE
        __bt_set_visible_mode();
 #else
 #ifdef TIZEN_TV
@@ -428,7 +427,7 @@ void _bt_set_le_disabled(int result)
                        g_variant_new_int32(result));
 }
 
-#if defined(TIZEN_BT_FLIGHTMODE_ENABLED) || (!defined(TIZEN_WEARABLE) && defined(ENABLE_TIZEN_2_4))
+#if defined(TIZEN_FEATURE_FLIGHTMODE_ENABLED) || (!defined(TIZEN_PROFILE_WEARABLE) && defined(ENABLE_TIZEN_2_4))
 static void __bt_service_flight_ps_mode_cb(keynode_t *node, void *data)
 {
        gboolean flight_mode = FALSE;
@@ -460,7 +459,7 @@ void _bt_service_register_vconf_handler(void)
 {
        BT_DBG("+");
 
-#ifdef TIZEN_BT_FLIGHTMODE_ENABLED
+#ifdef TIZEN_FEATURE_FLIGHTMODE_ENABLED
        if (vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
                        (vconf_callback_fn)__bt_service_flight_ps_mode_cb, NULL) < 0)
                BT_ERR("Unable to register key handler");
@@ -468,7 +467,7 @@ void _bt_service_register_vconf_handler(void)
        BT_DBG("Telephony is disabled");
 #endif
 
-#ifndef TIZEN_WEARABLE
+#ifndef TIZEN_PROFILE_WEARABLE
 #ifdef ENABLE_TIZEN_2_4
        if (vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE,
                        (vconf_callback_fn)__bt_service_flight_ps_mode_cb, NULL) < 0)
@@ -481,12 +480,12 @@ void _bt_service_unregister_vconf_handler(void)
 {
        BT_DBG("+");
 
-#ifdef TIZEN_BT_FLIGHTMODE_ENABLED
+#ifdef TIZEN_FEATURE_FLIGHTMODE_ENABLED
        vconf_ignore_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
                        (vconf_callback_fn)__bt_service_flight_ps_mode_cb);
 #endif
 
-#ifndef TIZEN_WEARABLE
+#ifndef TIZEN_PROFILE_WEARABLE
 #ifdef ENABLE_TIZEN_2_4
        vconf_ignore_key_changed(VCONFKEY_SETAPPL_PSMODE,
                        (vconf_callback_fn)__bt_service_flight_ps_mode_cb);
@@ -577,15 +576,13 @@ static gboolean __bt_adapter_disable_cb(gpointer user_data)
 
        ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_DEVICE_NAME_STR,
                                (vconf_callback_fn)__bt_phone_name_changed_cb);
-       if (0 != ret) {
+       if (0 != ret)
                BT_ERR("vconf_ignore_key_changed failed\n");
-       }
 
        _bt_reliable_terminate_service(NULL);
 
-       if (eventsystem_unregister_event(status_reg_id) != ES_R_OK) {
+       if (eventsystem_unregister_event(status_reg_id) != ES_R_OK)
                BT_ERR("Fail to unregister system event");
-       }
 
        _bt_delete_event_timer(BT_EVENT_TIMER_DISABLE);
 
@@ -1080,9 +1077,8 @@ int _bt_get_bonded_device_info(bluetooth_device_address_t *device_address,
 {
        BT_CHECK_PARAMETER(device_address, return);
        BT_CHECK_PARAMETER(dev_info, return);
-       
-       /* Should implement this */
 
+       /* Should implement this */
        return BLUETOOTH_ERROR_NONE;
 }
 
index 348fa6f..2b31b22 100644 (file)
@@ -109,11 +109,10 @@ GDBusConnection *_bt_get_system_conn(void)
 {
        GDBusConnection *g_conn;
 
-       if (system_conn == NULL) {
+       if (system_conn == NULL)
                g_conn = __bt_init_system_gconn();
-       } else {
+       else
                g_conn = system_conn;
-       }
 
        retv_if(g_conn == NULL, NULL);
 
@@ -148,9 +147,8 @@ void _bt_convert_device_path_to_address(const char *device_path,
                dev_addr += 4;
                g_strlcpy(address, dev_addr, sizeof(address));
 
-               while ((pos = strchr(address, '_')) != NULL) {
+               while ((pos = strchr(address, '_')) != NULL)
                        *pos = ':';
-               }
 
                g_strlcpy(device_address, address, BT_ADDRESS_STRING_SIZE);
        }
@@ -160,21 +158,21 @@ void _bt_convert_device_path_to_address(const char *device_path,
 void _bt_convert_addr_string_to_type(unsigned char *addr,
                                        const char *address)
 {
-        int i;
-        char *ptr = NULL;
+       int i;
+       char *ptr = NULL;
 
        ret_if(address == NULL);
        ret_if(addr == NULL);
 
-        for (i = 0; i < BT_ADDRESS_LENGTH_MAX; i++) {
-                addr[i] = strtol(address, &ptr, 16);
-                if (ptr[0] != '\0') {
-                        if (ptr[0] != ':')
-                                return;
+       for (i = 0; i < BT_ADDRESS_LENGTH_MAX; i++) {
+               addr[i] = strtol(address, &ptr, 16);
+               if (ptr[0] != '\0') {
+                       if (ptr[0] != ':')
+                               return;
 
-                        address = ptr + 1;
-                }
-        }
+                       address = ptr + 1;
+               }
+       }
 }
 
 void _bt_convert_addr_type_to_string(char *address,
@@ -308,9 +306,8 @@ int _bt_set_socket_non_blocking(int socket_fd)
        if (arg < 0)
                return -errno;
 
-       if (arg & O_NONBLOCK) {
+       if (arg & O_NONBLOCK)
                BT_ERR("Already Non-blocking \n");
-       }
 
        arg |= O_NONBLOCK;
 
index e5540f1..a77d123 100644 (file)
@@ -309,7 +309,7 @@ dpm_result_t _bt_dpm_get_bluetooth_uuids_from_whitelist(GArray **out_param1)
 
        if (_bt_dpm_get_allow_bluetooth_mode() == DPM_BT_RESTRICTED)
                return ret;
-       
+
        if (list) {
                ret = DPM_RESULT_SUCCESS;
                uuids_list.count = g_slist_length(policy_table[DPM_POLICY_BLUETOOTH_UUIDS_WHITELIST].list);
index 6cb2e96..101f8ac 100644 (file)
@@ -77,9 +77,9 @@ int _bt_send_event(int event_type, int event, GVariant *param)
        case BT_RFCOMM_SERVER_EVENT:
                path = BT_RFCOMM_SERVER_PATH;
                break;
-        case BT_A2DP_SOURCE_EVENT:
-                path = BT_A2DP_SOURCE_PATH;
-                break;
+       case BT_A2DP_SOURCE_EVENT:
+               path = BT_A2DP_SOURCE_PATH;
+               break;
        default:
                BT_ERR("Unknown event");
                return BLUETOOTH_ERROR_INTERNAL;
@@ -311,10 +311,10 @@ int _bt_send_event(int event_type, int event, GVariant *param)
                signal = BT_A2DP_SOURCE_CONNECTED;
                BT_INFO_C("Connected [A2DP Source]");
                break;
-    case BLUETOOTH_EVENT_AV_SOURCE_DISCONNECTED:
-        signal = BT_A2DP_SOURCE_DISCONNECTED;
-        BT_INFO_C("Disconnected [A2DP Source]");
-        break;
+       case BLUETOOTH_EVENT_AV_SOURCE_DISCONNECTED:
+               signal = BT_A2DP_SOURCE_DISCONNECTED;
+               BT_INFO_C("Disconnected [A2DP Source]");
+               break;
        case BLUETOOTH_EVENT_AVRCP_CONNECTED:
        case BLUETOOTH_EVENT_AVRCP_CONTROL_CONNECTED:
                signal = BT_AVRCP_CONNECTED;
@@ -365,9 +365,6 @@ int _bt_send_event(int event_type, int event, GVariant *param)
        case BLUETOOTH_EVENT_IPSP_DISCONNECTED:
                signal = BT_IPSP_DISCONNECTED;
                break;
-       case BLUETOOTH_EVENT_IPSP_BT_INTERFACE_INFO:
-               signal = BT_IPSP_BT_INTERFACE_INFO;
-               break;
        case BLUETOOTH_EVENT_GATT_CHAR_VAL_CHANGED:
                signal = BT_GATT_CHAR_VAL_CHANGED;
                break;
@@ -384,9 +381,8 @@ int _bt_send_event(int event_type, int event, GVariant *param)
 
        msg1 = g_dbus_message_new_signal(path, BT_EVENT_SERVICE, signal);
        g_dbus_message_set_body(msg1, param);
-       if (!g_dbus_connection_send_message(event_conn, msg1, G_DBUS_SEND_MESSAGE_FLAGS_NONE, 0, NULL)) {
+       if (!g_dbus_connection_send_message(event_conn, msg1, G_DBUS_SEND_MESSAGE_FLAGS_NONE, 0, NULL))
                BT_ERR("Error while sending");
-       }
 
        g_object_unref(msg1);
 
@@ -414,7 +410,7 @@ int _bt_send_event_to_dest(const char* dest, int event_type,
                path = BT_LE_ADAPTER_PATH;
                break;
        case BT_DEVICE_EVENT:
-                path = BT_DEVICE_PATH;
+               path = BT_DEVICE_PATH;
                break;
        default:
                BT_ERR("Unknown event");
index a6591df..a1e125a 100644 (file)
@@ -117,11 +117,10 @@ gboolean _bt_reliable_terminate_service(gpointer user_data)
 
        BT_INFO_C("Terminating the bt-service daemon");
 
-       if (main_loop != NULL) {
+       if (main_loop != NULL)
                g_main_loop_quit(main_loop);
-       } else {
+       else
                exit(0);
-       }
 
        return FALSE;
 }
@@ -142,13 +141,11 @@ static gboolean __bt_check_bt_service(void *data)
 #ifdef TIZEN_TV
        _bt_enable_adapter();
 #else
-       if (vconf_get_int(VCONFKEY_BT_STATUS, &bt_status) < 0) {
+       if (vconf_get_int(VCONFKEY_BT_STATUS, &bt_status) < 0)
                BT_DBG("no bluetooth device info, so BT was disabled at previous session");
-       }
 
-       if (vconf_get_int(VCONFKEY_BT_LE_STATUS, &bt_le_status) < 0) {
+       if (vconf_get_int(VCONFKEY_BT_LE_STATUS, &bt_le_status) < 0)
                BT_ERR("no bluetooth le info, so BT LE was disabled at previous session");
-       }
 
        if ((bt_status != VCONFKEY_BT_STATUS_OFF) &&
                (status == BT_DEACTIVATED)) {
@@ -221,9 +218,8 @@ int main(void)
        g_main_loop_run(main_loop);
        BT_DBG("g_main_loop_quit called!");
 
-       if (main_loop != NULL) {
+       if (main_loop != NULL)
                g_main_loop_unref(main_loop);
-       }
 
        if (terminated == FALSE)
                __bt_release_service();
index adcd4d9..e1a7580 100644 (file)
@@ -49,11 +49,11 @@ extern "C" {
 #define LOG_COLOR_PURPLE   "\033[35m"
 
 #define BT_DBG(fmt, args...) \
-        SLOGD(fmt, ##args)
+       SLOGD(fmt, ##args)
 #define BT_INFO(fmt, args...) \
-        SLOGI(fmt, ##args)
+       SLOGI(fmt, ##args)
 #define BT_ERR(fmt, args...) \
-        SLOGE(fmt, ##args)
+       SLOGE(fmt, ##args)
 
 #define BT_INFO_C(fmt, arg...) \
        SLOGI_IF(TRUE,  LOG_COLOR_GREEN" "fmt" "LOG_COLOR_RESET, ##arg)
@@ -198,29 +198,30 @@ extern "C" {
 /* UUID */
 #define GENERIC_AUDIO_UUID      "00001203-0000-1000-8000-00805f9b34fb"
 
-#define OBEX_OPP_UUID          "00001105-0000-1000-8000-00805f9b34fb"
-
-#define HSP_HS_UUID             "00001108-0000-1000-8000-00805f9b34fb"
-#define HSP_AG_UUID             "00001112-0000-1000-8000-00805f9b34fb"
+#define AVRCP_TARGET_UUID       "0000110c-0000-1000-8000-00805f9b34fb"
+#define AVRCP_REMOTE_UUID       "0000110e-0000-1000-8000-00805f9b34fb"
+#define ADVANCED_AUDIO_UUID     "0000110d-0000-1000-8000-00805f9b34fb"
+#define A2DP_SINK_UUID          "0000110b-0000-1000-8000-00805f9b34fb"
+#define A2DP_SOURCE_UUID        "0000110a-0000-1000-8000-00805f9b34fb"
 
 #define HFP_HS_UUID             "0000111e-0000-1000-8000-00805f9b34fb"
 #define HFP_AG_UUID             "0000111f-0000-1000-8000-00805f9b34fb"
 
-#define ADVANCED_AUDIO_UUID     "0000110d-0000-1000-8000-00805f9b34fb"
-
-#define A2DP_SOURCE_UUID        "0000110a-0000-1000-8000-00805f9b34fb"
-#define A2DP_SINK_UUID          "0000110b-0000-1000-8000-00805f9b34fb"
-
-#define AVRCP_REMOTE_UUID       "0000110e-0000-1000-8000-00805f9b34fb"
-#define AVRCP_TARGET_UUID       "0000110c-0000-1000-8000-00805f9b34fb"
+#define HSP_HS_UUID             "00001108-0000-1000-8000-00805f9b34fb"
+#define HSP_AG_UUID             "00001112-0000-1000-8000-00805f9b34fb"
 
+#define RFCOMM_UUID_STR                        "00000003-0000-1000-8000-00805f9b34fb"
+#define HID_DEVICE_UUID                        "00001124-0000-1000-8000-00805f9b43bf"
 #define HID_UUID                "00001124-0000-1000-8000-00805f9b34fb"
+#define PANU_UUID                              "00001115-0000-1000-8000-00805f9b34fb"
+#define NAP_UUID                               "00001116-0000-1000-8000-00805f9b34fb"
 #define PNP_UUID                "00001200-0000-1000-8000-00805f9b34fb"
-#define RFCOMM_UUID_STR                "00000003-0000-1000-8000-00805f9b34fb"
-#define PANU_UUID              "00001115-0000-1000-8000-00805f9b34fb"
-#define NAP_UUID               "00001116-0000-1000-8000-00805f9b34fb"
-#define OBEX_PSE_UUID          "0000112f-0000-1000-8000-00805f9b34fb"
-#define GATT_UUID              "00001801-0000-1000-8000-00805f9b34fb"
+#define PBAP_UUID               "0000112f-0000-1000-8000-00805f9b34fb"
+
+#define OBEX_OPP_UUID                  "00001105-0000-1000-8000-00805f9b34fb"
+#define OBEX_PSE_UUID                  "0000112f-0000-1000-8000-00805f9b34fb"
+
+#define GATT_UUID                              "00001801-0000-1000-8000-00805f9b34fb"
 
 /* Privilege */
 #define BT_PRIVILEGE_PUBLIC "http://tizen.org/privilege/bluetooth"
@@ -263,6 +264,7 @@ typedef enum {
        BT_PROFILE_CONN_GATT = 0x40,
        BT_PROGILE_CONN_NAP = 0x80,
        BT_PROFILE_CONN_A2DP_SINK = 0x100,
+       BT_PROFILE_CONN_PBAP = 0x200,
        BT_PROFILE_CONN_ALL = 0xffffffff,
 } bt_profile_type_t;
 
index 9b31549..f73b48a 100644 (file)
@@ -24,7 +24,7 @@
 #include "bluetooth-api.h"
 
 #ifdef __cplusplus
- extern "C" {
+extern "C" {
 #endif
 
 
  * @brief DPM BT allowance state
  * @see
  */
- typedef enum {
-        DPM_BT_ERROR    = -1,   /**< bluetooth allowance error */
-        DPM_BT_ALLOWED,                 /**< bluetooth allowance allowed */
-        DPM_BT_HANDSFREE_ONLY,  /**< bluetooth allowance handsfree only */
-        DPM_BT_RESTRICTED,      /**< bluetooth allowance restricted */
- } dpm_bt_allow_t;
+typedef enum {
+       DPM_BT_ERROR     = -1,   /**< bluetooth allowance error */
+       DPM_BT_ALLOWED,          /**< bluetooth allowance allowed */
+       DPM_BT_HANDSFREE_ONLY,  /**< bluetooth allowance handsfree only */
+       DPM_BT_RESTRICTED,       /**< bluetooth allowance restricted */
+} dpm_bt_allow_t;
 
  /**
  * @brief DPM API result
index f988769..692f459 100644 (file)
@@ -32,6 +32,9 @@ int _bt_pbap_connect(const bluetooth_device_address_t *address);
 
 int _bt_pbap_disconnect(const bluetooth_device_address_t *address);
 
+int _bt_pbap_is_connected(bluetooth_device_address_t *device_address,
+                                       gboolean *connected);
+
 int _bt_pbap_get_phonebook_size(const bluetooth_device_address_t *address,
                int source, int type);
 
index 5d6da03..2fb2d45 100644 (file)
@@ -28,6 +28,7 @@ bt-service-agent.c
 bt-service-gap-agent.c
 bt-service-pbap.c
 bt-service-dpm.c
+bt-service-proximity.c
 )
 
 IF(LIBNOTIFY_SUPPORT)
@@ -68,7 +69,7 @@ SET(PKG_MODULES
        storage
 )
 
-IF("$ENV{CFLAGS}" MATCHES "-DTIZEN_NETWORK_TETHERING_ENABLE")
+IF("$ENV{CFLAGS}" MATCHES "-DTIZEN_FEATURE_NETWORK_TETHERING_ENABLE")
 SET(PKG_MODULES ${PKG_MODULES}
        capi-network-tethering
 )
@@ -114,25 +115,11 @@ ADD_DEFINITIONS("-DAPP_SYSCONFDIR=\"${APP_SYSCONFDIR}\"")
 ADD_DEFINITIONS("-DHPS_FEATURE")
 ADD_DEFINITIONS("-DTIZEN_DPM_ENABLE")
 
-IF(LIBNOTIFY_SUPPORT OR LIBNOTIFICATION_SUPPORT)
-       ADD_DEFINITIONS("-DDATA_DIR_ICON=\"${SHARE_INSTALL_PREFIX}\"")
-       MESSAGE("Icon used for notification is : ${SHARE_INSTALL_PREFIX}/icons/default/bt-icon.png")
-ENDIF(LIBNOTIFY_SUPPORT OR LIBNOTIFICATION_SUPPORT)
-
 SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie")
 
 ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS})
 TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${service_pkgs_LDFLAGS})
 
-# to permit usage of bluetooth_cancel_bonding in bt-popup.c. This build bluetooth-api first.
-IF(LIBNOTIFY_SUPPORT)
-       ADD_DEPENDENCIES(${PROJECT_NAME} bluetooth-api)
-       TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${service_pkgs_LDFLAGS} bluetooth-api)
-ELSE(LIBNOTIFY_SUPPORT)
-       TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${service_pkgs_LDFLAGS})
-ENDIF(LIBNOTIFY_SUPPORT)
-
-#CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/org.projectx.bt.service.in ${CMAKE_CURRENT_SOURCE_DIR}/org.projectx.bt.service)
 INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/org.projectx.bt.service DESTINATION share/dbus-1/system-services)
 INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin)
 
@@ -141,11 +128,11 @@ INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/auto-pair-blacklist DESTINATION /opt/v
 # install booting script
 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/bluetooth-frwk-service.conf.in ${CMAKE_CURRENT_SOURCE_DIR}/bluetooth-frwk-service.conf)
 
-IF (TIZEN_WEARABLE)
+IF (TIZEN_PROFILE_WEARABLE)
        INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/wearable/stack_info DESTINATION /usr/etc/bluetooth/)
 ELSE ()
        INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/mobile/stack_info DESTINATION /usr/etc/bluetooth/)
-ENDIF (TIZEN_WEARABLE)
+ENDIF (TIZEN_PROFILE_WEARABLE)
 
 INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/bluetooth-frwk-service.conf DESTINATION /etc/dbus-1/system.d)
 
index 9f15b76..b9ccbd3 100644 (file)
@@ -1,4 +1,4 @@
-AddressBlacklist=00:02:C7,00:16:FE,00:19:C1,00:1B:FB,00:1E:3D,00:21:4F,00:23:06,00:24:33,00:A0:79,00:0E:6D,00:13:E0,00:21:E8,00:60:57,00:0E:9F,00:12:1C,00:18:91,00:18:96,00:13:04,00:16:FD,00:22:A0,00:0B:4C,00:60:6F,00:23:3D,00:C0:59,00:0A:30,00:1E:AE,00:1C:D7,00:80:F0,00:12:8A,00:09:93,00:80:37,00:26:7E,00:1A:1B,00:14:9A,00:0B:24,08:76:95,00:14:09,00:1E:B2\r
-ExactNameBlacklist=Motorola IHF1000,i.TechBlueBAND,X5 Stereo v1.3,KML_CAN,SYNC,UConnect\r
-PartialNameBlacklist=BMW,Audi,Parrot,HandsFreeLink,Car,MB PhoneSystem,CAR MULTIMEDIA,MB Bluetooth,Pama\r
-KeyboardAutoPair=00:0F:F6\r
+AddressBlacklist=00:02:C7,00:16:FE,00:19:C1,00:1B:FB,00:1E:3D,00:21:4F,00:23:06,00:24:33,00:A0:79,00:0E:6D,00:13:E0,00:21:E8,00:60:57,00:0E:9F,00:12:1C,00:18:91,00:18:96,00:13:04,00:16:FD,00:22:A0,00:0B:4C,00:60:6F,00:23:3D,00:C0:59,00:0A:30,00:1E:AE,00:1C:D7,00:80:F0,00:12:8A,00:09:93,00:80:37,00:26:7E,08:76:95,00:1E:B2,00:26:E8,60:38:0E
+ExactNameBlacklist=Motorola IHF1000,i.TechBlueBAND,X5 Stereo v1.3,KML_CAN,SYNC,UConnect,Blue&Me
+PartialNameBlacklist=BMW,Audi,Parrot,HandsFreeLink,Car,MB PhoneSystem,CAR MULTIMEDIA,MB Bluetooth,Pama
+KeyboardAutoPair=00:0F:F6
index 2a97c5f..e7336e4 100644 (file)
@@ -42,6 +42,8 @@
 #include "bt-request-handler.h"
 #include "bt-service-pbap.h"
 #include "bt-service-dpm.h"
+#include "bt-service-agent.h"
+#include "bt-service-proximity.h"
 
 static GDBusConnection *bt_service_conn;
 static guint owner_id = 0;
@@ -70,6 +72,8 @@ static const gchar bt_service_introspection_xml[] =
 
 GDBusNodeInfo *node_info = NULL;
 
+static char *current_sender_playing = NULL;
+
 static void __bt_service_method(GDBusConnection *connection,
                const gchar *sender,
                const gchar *object_path,
@@ -96,7 +100,6 @@ int __bt_obexd_request(int function_name,
                GVariant *in_param2,
                GVariant *in_param3,
                GVariant *in_param4,
-               GVariant *in_param5,
                GArray **out_param1);
 int __bt_agent_request(int function_name,
                int request_type,
@@ -213,7 +216,7 @@ static void __bt_service_method(GDBusConnection *connection,
                                        request_type, request_id,
                                        invocation, param1,
                                        param2, param3,
-                                       param4, param5, &out_param1);
+                                       param4, &out_param1);
                        break;
                case BT_AGENT_SERVICE:
                        result = __bt_agent_request(service_function,
@@ -236,9 +239,8 @@ static void __bt_service_method(GDBusConnection *connection,
                        goto fail;
                }
 
-               if (result != BLUETOOTH_ERROR_NONE) {
+               if (result != BLUETOOTH_ERROR_NONE)
                        goto fail;
-               }
 
                if ((request_type == BT_ASYNC_REQ ||
                        service_function == BT_OBEX_SERVER_ACCEPT_CONNECTION) &&
@@ -329,9 +331,11 @@ int __bt_bluez_request(int function_name,
                result = _bt_recover_adapter();
                break;
        case BT_ENABLE_ADAPTER_LE:
+               _bt_set_le_intended_status(TRUE);
                result = _bt_enable_adapter_le();
                break;
        case BT_DISABLE_ADAPTER_LE:
+               _bt_set_le_intended_status(FALSE);
                result = _bt_disable_adapter_le();
                break;
        case BT_RESET_ADAPTER:
@@ -508,6 +512,17 @@ int __bt_bluez_request(int function_name,
 
                break;
        }
+       case BT_IS_SCAN_FILTER_SUPPORTED:{
+               int is_supported = 0;
+
+               if (_bt_is_scan_filter_supported() == TRUE)
+                       is_supported = 1;
+
+               g_array_append_vals(*out_param1,
+                               &is_supported, sizeof(int));
+
+               break;
+       }
        case BT_ENABLE_RSSI: {
                bluetooth_device_address_t bd_addr;
                int link_type;
@@ -613,9 +628,9 @@ int __bt_bluez_request(int function_name,
                int length = 0;
 
                result = _bt_get_advertising_data(&adv, &length);
-               if (result == BLUETOOTH_ERROR_NONE) {
+               if (result == BLUETOOTH_ERROR_NONE)
                        g_array_append_vals(*out_param1, adv.data, length);
-               }
+
                break;
        }
        case BT_SET_ADVERTISING_DATA: {
@@ -645,9 +660,8 @@ int __bt_bluez_request(int function_name,
                int length = 0;
 
                result = _bt_get_scan_response_data(&rsp, &length);
-               if (result == BLUETOOTH_ERROR_NONE) {
+               if (result == BLUETOOTH_ERROR_NONE)
                        g_array_append_vals(*out_param1, rsp.data, length);
-               }
 
                break;
        }
@@ -750,6 +764,23 @@ int __bt_bluez_request(int function_name,
                result = _bt_get_bonded_devices(out_param1);
                break;
        }
+       case BT_GET_PROFILE_CONNECTED_DEVICES: {
+               char *uuid;
+               uuid = (char *)g_variant_get_data(in_param1);
+               result = _bt_get_profile_connected_devices(uuid, out_param1);
+               break;
+       }
+       case BT_SET_PASSKEY_NOTIFICATION: {
+               char *sender = NULL;
+               gboolean enable;
+
+               sender = (char *)g_dbus_method_invocation_get_sender(context);
+               __bt_service_get_parameters(in_param1,
+                               &enable, sizeof(gboolean));
+
+               result = _bt_set_passkey_notification(sender, enable);
+               break;
+       }
        case BT_GET_BONDED_DEVICE: {
                bluetooth_device_address_t address = { {0} };
                bluetooth_device_info_t dev_info;
@@ -766,6 +797,19 @@ int __bt_bluez_request(int function_name,
                }
                break;
        }
+       case BT_GET_IS_ALIAS_SET: {
+               bluetooth_device_address_t address = { {0} };
+               gboolean is_alias_set = FALSE;
+
+               __bt_service_get_parameters(in_param1,
+                               &address, sizeof(bluetooth_device_address_t));
+
+               result = _bt_is_alias_set(&address, &is_alias_set);
+               if (result == BLUETOOTH_ERROR_NONE)
+                       g_array_append_vals(*out_param1, &is_alias_set, sizeof(gboolean));
+
+               break;
+       }
        case BT_BOND_DEVICE: {
                bluetooth_device_address_t address = { {0} };
 
@@ -939,6 +983,68 @@ int __bt_bluez_request(int function_name,
                break;
        }
 
+       case BT_SET_PROFILE_TRUSTED: {
+               bluetooth_device_address_t bd_addr = { {0} };
+               int profile;
+               int trust;
+
+               __bt_service_get_parameters(in_param1, &bd_addr,
+                               sizeof(bluetooth_device_address_t));
+               __bt_service_get_parameters(in_param2, &profile, sizeof(int));
+               __bt_service_get_parameters(in_param3, &trust, sizeof(int));
+
+               result = _bt_set_trust_profile(&bd_addr, profile, trust);
+               break;
+       }
+       case BT_GET_PROFILE_TRUSTED: {
+               bluetooth_device_address_t bd_addr = { {0} };
+               int profile;
+               guint trusted_profile = 0;
+
+               __bt_service_get_parameters(in_param1, &bd_addr,
+                               sizeof(bluetooth_device_address_t));
+               __bt_service_get_parameters(in_param2, &profile, sizeof(int));
+
+               result = _bt_get_trust_profile(&bd_addr, profile, &trusted_profile);
+               BT_DBG("TRUST %d", trusted_profile);
+               if (result == BLUETOOTH_ERROR_NONE) {
+                       g_array_append_vals(*out_param1, &trusted_profile,
+                                       sizeof(guint));
+               }
+
+               break;
+       }
+       case BT_SET_PROFILE_RESTRICTED: {
+               bluetooth_device_address_t bd_addr = { {0} };
+               int profile;
+               int restricted;
+
+               __bt_service_get_parameters(in_param1, &bd_addr,
+                               sizeof(bluetooth_device_address_t));
+               __bt_service_get_parameters(in_param2, &profile, sizeof(int));
+               __bt_service_get_parameters(in_param3, &restricted, sizeof(int));
+
+               result = _bt_set_restrict_profile(&bd_addr, profile, restricted);
+               break;
+       }
+       case BT_GET_PROFILE_RESTRICTED: {
+               bluetooth_device_address_t bd_addr = { {0} };
+               int profile;
+               guint restricted_profile = 0;
+
+               __bt_service_get_parameters(in_param1, &bd_addr,
+                               sizeof(bluetooth_device_address_t));
+               __bt_service_get_parameters(in_param2, &profile, sizeof(int));
+
+               result = _bt_get_restrict_profile(&bd_addr, profile, &restricted_profile);
+               BT_DBG("Restricted %d", restricted_profile);
+               if (result == BLUETOOTH_ERROR_NONE) {
+                       g_array_append_vals(*out_param1, &restricted_profile,
+                                       sizeof(guint));
+               }
+
+               break;
+       }
        case BT_HID_CONNECT: {
                bluetooth_device_address_t address = { {0} };
 
@@ -965,6 +1071,10 @@ int __bt_bluez_request(int function_name,
                }
                break;
        }
+       case BT_HID_ENABLE_BARCODE_FEATURE: {
+               result = _bt_hid_enable_barcode_feature();
+               break;
+       }
        case BT_NETWORK_ACTIVATE:
                result = _bt_network_activate();
                break;
@@ -1021,7 +1131,7 @@ int __bt_bluez_request(int function_name,
                                &address, sizeof(bluetooth_device_address_t));
 
                result = _bt_audio_connect(request_id, BT_AUDIO_ALL,
-                                       &address, out_param1);
+                                       &address, *out_param1);
                break;
        }
        case BT_AUDIO_DISCONNECT: {
@@ -1031,7 +1141,7 @@ int __bt_bluez_request(int function_name,
                                &address, sizeof(bluetooth_device_address_t));
 
                result = _bt_audio_disconnect(request_id, BT_AUDIO_ALL,
-                                       &address, out_param1);
+                                       &address, *out_param1);
                break;
        }
        case BT_AG_CONNECT: {
@@ -1041,7 +1151,7 @@ int __bt_bluez_request(int function_name,
                                &address, sizeof(bluetooth_device_address_t));
 
                result = _bt_audio_connect(request_id, BT_AUDIO_HSP,
-                                       &address, out_param1);
+                                       &address, *out_param1);
                break;
        }
        case BT_AG_DISCONNECT: {
@@ -1051,7 +1161,7 @@ int __bt_bluez_request(int function_name,
                                &address, sizeof(bluetooth_device_address_t));
 
                result = _bt_audio_disconnect(request_id, BT_AUDIO_HSP,
-                                       &address, out_param1);
+                                       &address, *out_param1);
                break;
        }
        case BT_AV_CONNECT: {
@@ -1061,7 +1171,7 @@ int __bt_bluez_request(int function_name,
                                &address, sizeof(bluetooth_device_address_t));
 
                result = _bt_audio_connect(request_id, BT_AUDIO_A2DP,
-                                       &address, out_param1);
+                                       &address, *out_param1);
                break;
        }
        case BT_AV_DISCONNECT: {
@@ -1071,7 +1181,7 @@ int __bt_bluez_request(int function_name,
                                &address, sizeof(bluetooth_device_address_t));
 
                result = _bt_audio_disconnect(request_id, BT_AUDIO_A2DP,
-                                       &address, out_param1);
+                                       &address, *out_param1);
                break;
        }
        case BT_AVRCP_CONTROL_CONNECT: {
@@ -1081,7 +1191,7 @@ int __bt_bluez_request(int function_name,
                                &address, sizeof(bluetooth_device_address_t));
 
                result = _bt_audio_connect(request_id, BT_AVRCP,
-                                       &address, out_param1);
+                                       &address, *out_param1);
                break;
        }
        case BT_AVRCP_CONTROL_DISCONNECT: {
@@ -1091,9 +1201,25 @@ int __bt_bluez_request(int function_name,
                                &address, sizeof(bluetooth_device_address_t));
 
                result = _bt_audio_disconnect(request_id, BT_AVRCP,
-                                       &address, out_param1);
+                                       &address, *out_param1);
                break;
        }
+       case BT_AVRCP_TARGET_CONNECT: {
+               bluetooth_device_address_t address = { {0} };
+               __bt_service_get_parameters(in_param1,
+                               &address, sizeof(bluetooth_device_address_t));
+               result = _bt_audio_connect(request_id, BT_AVRCP_TARGET,
+                                       &address, *out_param1);
+               break;
+               }
+       case BT_AVRCP_TARGET_DISCONNECT: {
+               bluetooth_device_address_t address = { {0} };
+               __bt_service_get_parameters(in_param1,
+                               &address, sizeof(bluetooth_device_address_t));
+               result = _bt_audio_disconnect(request_id, BT_AVRCP_TARGET,
+                                       &address, *out_param1);
+               break;
+               }
        case BT_AV_SOURCE_CONNECT: {
                bluetooth_device_address_t address = { {0} };
 
@@ -1101,7 +1227,7 @@ int __bt_bluez_request(int function_name,
                                sizeof(bluetooth_device_address_t));
 
                result = _bt_audio_connect(request_id, BT_AUDIO_A2DP_SOURCE,
-                                       &address, out_param1);
+                                       &address, *out_param1);
                break;
        }
        case BT_AV_SOURCE_DISCONNECT: {
@@ -1111,7 +1237,7 @@ int __bt_bluez_request(int function_name,
                                sizeof(bluetooth_device_address_t));
 
                result = _bt_audio_disconnect(request_id, BT_AUDIO_A2DP_SOURCE,
-                                       &address, out_param1);
+                                       &address, *out_param1);
                break;
        }
        case BT_HF_CONNECT: {
@@ -1120,7 +1246,7 @@ int __bt_bluez_request(int function_name,
                __bt_service_get_parameters(in_param1,
                                &address, sizeof(bluetooth_device_address_t));
 
-               result = _bt_hf_connect(request_id, &address, out_param1);
+               result = _bt_hf_connect(request_id, &address, *out_param1);
                break;
        }
        case BT_HF_DISCONNECT: {
@@ -1129,7 +1255,7 @@ int __bt_bluez_request(int function_name,
                __bt_service_get_parameters(in_param1,
                                &address, sizeof(bluetooth_device_address_t));
 
-               result = _bt_hf_disconnect(request_id, &address, out_param1);
+               result = _bt_hf_disconnect(request_id, &address, *out_param1);
                break;
        }
        case BT_SET_CONTENT_PROTECT: {
@@ -1155,14 +1281,14 @@ int __bt_bluez_request(int function_name,
        }
        case BT_OOB_ADD_REMOTE_DATA: {
                bluetooth_device_address_t address = { {0} };
-               bt_oob_data_t local_oob_data;
+               bt_oob_data_t remote_oob_data;
 
                __bt_service_get_parameters(in_param1,
                                &address, sizeof(bluetooth_device_address_t));
                __bt_service_get_parameters(in_param2,
-                               &local_oob_data, sizeof(bt_oob_data_t));
+                               &remote_oob_data, sizeof(bt_oob_data_t));
 
-               result = _bt_oob_add_remote_data(&address, &local_oob_data);
+               result = _bt_oob_add_remote_data(&address, &remote_oob_data);
 
                break;
        }
@@ -1206,12 +1332,28 @@ int __bt_bluez_request(int function_name,
        case BT_AVRCP_SET_PROPERTY: {
                int type;
                unsigned int value;
+               char *sender = NULL;
+               sender = (char *)g_dbus_method_invocation_get_sender(context);
+               BT_INFO("Sender %s", sender);
 
                __bt_service_get_parameters(in_param1,
                                &type, sizeof(int));
                __bt_service_get_parameters(in_param2,
                                &value, sizeof(unsigned int));
 
+               if (value == STATUS_PLAYING) {
+                       if (current_sender_playing)
+                               g_free(current_sender_playing);
+                       current_sender_playing = g_strdup(sender);
+               }
+               if (g_strcmp0(sender, current_sender_playing) == 0 ||
+                       current_sender_playing == NULL) {
+                       BT_INFO("Current Player Status %d type %d", value, type);
+               } else {
+                       BT_INFO("Current Player and this sender are different");
+                       result = BLUETOOTH_ERROR_NONE;
+                       break;
+               }
                result = _bt_avrcp_set_property(type, value);
 
                break;
@@ -1473,11 +1615,13 @@ int __bt_bluez_request(int function_name,
                __bt_service_get_parameters(in_param2,
                                &auto_connect, sizeof(gboolean));
 
-               result = _bt_connect_le_device(request_id, &address, auto_connect);
+               result = _bt_connect_le_device(request_id, &address,
+                               auto_connect);
                if (result != BLUETOOTH_ERROR_NONE) {
                        g_array_append_vals(*out_param1, &address,
                                        sizeof(bluetooth_device_address_t));
                }
+
                break;
        }
        case BT_DISCONNECT_LE: {
@@ -1491,6 +1635,7 @@ int __bt_bluez_request(int function_name,
                        g_array_append_vals(*out_param1, &address,
                                        sizeof(bluetooth_device_address_t));
                }
+
                break;
        }
        case BT_SET_LE_PRIVACY: {
@@ -1503,6 +1648,62 @@ int __bt_bluez_request(int function_name,
 
                break;
        }
+       case BT_REQ_ATT_MTU: {
+               bluetooth_device_address_t address = { {0} };
+               unsigned int mtu;
+
+               __bt_service_get_parameters(in_param1,
+                               &address, sizeof(bluetooth_device_address_t));
+               __bt_service_get_parameters(in_param2,
+                               &mtu, sizeof(unsigned int));
+
+               result = _bt_request_att_mtu(request_id, &address, mtu);
+               if (result != BLUETOOTH_ERROR_NONE) {
+                       g_array_append_vals(*out_param1, &address,
+                                       sizeof(bluetooth_device_info_t));
+               }
+               break;
+       }
+       case BT_GET_ATT_MTU: {
+               bluetooth_device_address_t address = { {0} };
+               unsigned int mtu = 0;
+
+               __bt_service_get_parameters(in_param1,
+                               &address, sizeof(bluetooth_device_address_t));
+
+               result = _bt_get_att_mtu(&address, &mtu);
+               BT_DBG("MTU: %d", mtu);
+               if (result == BLUETOOTH_ERROR_NONE) {
+                       g_array_append_vals(*out_param1, &mtu,
+                                               sizeof(unsigned int));
+               }
+               break;
+       }
+       case BT_GET_DEVICE_IDA: {
+               bluetooth_device_address_t address = { {0} };
+               bluetooth_device_address_t id_addr = { {0} };
+
+               __bt_service_get_parameters(in_param1,
+                               &address, sizeof(bluetooth_device_address_t));
+
+               result = _bt_get_device_ida(&address, &id_addr);
+
+               if (result == BLUETOOTH_ERROR_NONE) {
+                       g_array_append_vals(*out_param1, &id_addr,
+                                       sizeof(bluetooth_device_address_t));
+               }
+               break;
+       }
+       case BT_SET_LE_STATIC_RANDOM_ADDRESS: {
+               gboolean is_enable;
+
+               __bt_service_get_parameters(in_param1, &is_enable,
+                               sizeof(gboolean));
+
+               result = _bt_set_le_static_random_address(is_enable);
+
+               break;
+       }
        case BT_HDP_CONNECT:
        case BT_HDP_DISCONNECT:
        case BT_HDP_SEND_DATA:
@@ -1907,6 +2108,60 @@ int __bt_bluez_request(int function_name,
 
                break;
        }
+       case BT_PXP_SET_PROPERTY: {
+               bluetooth_device_address_t address = { {0} };
+               unsigned int property = 0;
+               unsigned int value = 0;
+
+               __bt_service_get_parameters(in_param1,
+                               &address, sizeof(bluetooth_device_address_t));
+               __bt_service_get_parameters(in_param2,
+                               &property, sizeof(int));
+               __bt_service_get_parameters(in_param3,
+                               &value, sizeof(int));
+
+               result = bt_set_proximity_property(&address, property, value);
+               break;
+       }
+       case BT_PXP_GET_PROPERTY: {
+               bluetooth_device_address_t address = { {0} };
+               unsigned int property = 0;
+               int value = 0;
+
+               __bt_service_get_parameters(in_param1,
+                               &address, sizeof(bluetooth_device_address_t));
+               __bt_service_get_parameters(in_param2,
+                               &property, sizeof(unsigned int));
+
+               result = bt_get_proximity_property(&address, property, &value);
+               if (result == BLUETOOTH_ERROR_NONE) {
+                       g_array_append_vals(*out_param1, &value,
+                                               sizeof(int));
+               }
+               break;
+       }
+       case BT_PXP_GET_SUPPORTED_SERIVCES: {
+               bluetooth_device_address_t address = { {0} };
+               unsigned int property = 0;
+
+               __bt_service_get_parameters(in_param1,
+                               &address, sizeof(bluetooth_device_address_t));
+
+               result = bt_get_proximity_supported_services(&address, &property);
+               if (result == BLUETOOTH_ERROR_NONE) {
+                       g_array_append_vals(*out_param1, &property,
+                                               sizeof(int));
+               }
+               break;
+       }
+       case BT_PXP_REGISTER_REPORTER: {
+               result = bt_register_proximity_reporter();
+               break;
+       }
+       case BT_PXP_UNREGISTER_REPORTER: {
+               result = bt_unregister_proximity_reporter();
+               break;
+       }
        default:
                result = BLUETOOTH_ERROR_INTERNAL;
                break;
@@ -1923,7 +2178,6 @@ int __bt_obexd_request(int function_name,
                GVariant *in_param2,
                GVariant *in_param3,
                GVariant *in_param4,
-               GVariant *in_param5,
                GArray **out_param1)
 {
        BT_DBG("+");
@@ -1940,14 +2194,6 @@ int __bt_obexd_request(int function_name,
                bt_file_path_t path;
                char **file_path;
                int file_count;
-               GDBusProxy *process_proxy;
-               guint owner_pid = 0;
-               int opp_server_pid = 0;
-               const gchar *owner_sender_name =  NULL;
-               GDBusConnection *owner_connection = NULL;
-               GVariant *val_get = NULL;
-               GError *error_connection = NULL;
-               GError *errro_proxy = NULL;
                GArray *param2;
 
                __bt_service_get_parameters(in_param1, &address,
@@ -1964,77 +2210,17 @@ int __bt_obexd_request(int function_name,
                        path = g_array_index(param2, bt_file_path_t, i);
                        file_path[i] = g_strdup(path.path);
                }
+               BT_DBG("_bt_opp_client_push_files");
+               result = _bt_opp_client_push_files(request_id, context,
+                                               &address, file_path,
+                                               file_count);
 
-               owner_connection = g_dbus_method_invocation_get_connection(context);
-               owner_sender_name = g_dbus_method_invocation_get_sender(context);
-
-               BT_DBG("sender = %s", owner_sender_name);
-
-               process_proxy = g_dbus_proxy_new_sync(owner_connection,
-                                                 G_DBUS_PROXY_FLAGS_NONE,
-                                                 NULL,
-                                                 "org.freedesktop.DBus",
-                                                 "/org/freedesktop/DBus",
-                                                 "org.freedesktop.DBus",
-                                                 NULL, &error_connection);
-
-               if (process_proxy == NULL)
-                       BT_DBG("Fail to get process_proxy");
-
-               if (error_connection) {
-                       BT_DBG("Fail to get proxy : %s", error_connection->message);
-                       g_error_free(error_connection);
-                       error_connection = NULL;
-               }
-
-               if (process_proxy) {
-                       val_get = g_dbus_proxy_call_sync(process_proxy,
-                                                       "GetConnectionUnixProcessID",
-                                                       g_variant_new("(s)", owner_sender_name),
-                                                       G_DBUS_CALL_FLAGS_NONE,
-                                                       -1,     NULL,
-                                                       &errro_proxy);
-
-                       if (val_get == NULL) {
-                               BT_DBG("Fail to get pid");
-                       } else {
-                               g_variant_get(val_get, "(u)", &owner_pid);
-                               BT_DBG("request is from pid %d\n", owner_pid);
-                       }
-
-                       if (errro_proxy) {
-                               g_error("Unable to get PID for %s: %s",
-                                                 owner_sender_name, errro_proxy->message);
-                               g_error_free(errro_proxy);
-                               errro_proxy = NULL;
-                       }
-               } else {
-                       BT_DBG("fail to get proxy");
-               }
-
-               opp_server_pid = _bt_obex_get_native_pid();
-
-               BT_DBG("owner_pid, agent_info.native_server->app_pid = %d, %d",
-                                       owner_pid, opp_server_pid);
-               if (opp_server_pid == owner_pid) {
-                       BT_DBG("The exception case : _bt_opp_client_push_files");
-                       result = _bt_opp_client_push_files(request_id, context,
-                                                               &address, file_path,
-                                                               file_count);
-               } else {
-            BT_DBG("normal case");
-            result = _bt_opp_client_push_files(request_id, context,
-                                                       &address, file_path,
-                                                       file_count);
-               }
-
-               for (i = 0; i < file_count; i++) {
+               for (i = 0; i < file_count; i++)
                        g_free(file_path[i]);
-               }
+
                g_free(file_path);
                g_array_free(param2, TRUE);
-               if (process_proxy)
-                       g_object_unref(process_proxy);
+
                break;
        }
        case BT_OPP_CANCEL_PUSH: {
@@ -2051,6 +2237,25 @@ int __bt_obexd_request(int function_name,
                                sizeof(gboolean));
                break;
        }
+       case BT_OPP_GET_TRANSFER_PROGRESS: {
+               int direction;
+               int transfer_id;
+               guint8 progress = 0;
+
+               __bt_service_get_parameters(in_param1, &direction,
+                               sizeof(int));
+               __bt_service_get_parameters(in_param2, &transfer_id,
+                               sizeof(int));
+               if (direction)
+                       result = _bt_opp_get_client_progress(&progress);
+               else
+                       result = _bt_opp_get_server_progress(transfer_id, &progress);
+
+               g_array_append_vals(*out_param1, &progress,
+                               sizeof(guint8));
+
+               break;
+       }
        case BT_OBEX_SERVER_ALLOCATE: {
                int app_pid;
                gboolean is_native;
@@ -2064,6 +2269,7 @@ int __bt_obexd_request(int function_name,
                                sizeof(gboolean));
                __bt_service_get_parameters(in_param3, &app_pid,
                                sizeof(int));
+
                result = _bt_obex_server_allocate(sender,
                                path, app_pid, is_native);
 
@@ -2105,6 +2311,7 @@ int __bt_obexd_request(int function_name,
                char *file_name;
 
                file_name = (char *)g_variant_get_data(in_param1);
+
                result = _bt_obex_server_accept_authorize(file_name, TRUE);
 
                break;
@@ -2122,8 +2329,8 @@ int __bt_obexd_request(int function_name,
                __bt_service_get_parameters(in_param2, &is_native,
                                sizeof(gboolean));
 
-               result = _bt_obex_server_set_destination_path(
-                               destination_path, is_native);
+               result = _bt_obex_server_set_destination_path(destination_path,
+                                                       is_native);
 
                break;
        }
@@ -2409,304 +2616,315 @@ gboolean __bt_service_check_privilege(int function_name,
                                        int service_type,
                                        const char *unique_name)
 {
-        int ret_val;
-        gboolean result = TRUE;
-        char *client_creds = NULL;
-        char *user_creds = NULL;
-        char *client_session = "";
-        enum cynara_client_creds client_creds_method = CLIENT_METHOD_SMACK;
-        enum cynara_user_creds user_creds_method = USER_METHOD_UID;
-        char err_msg[256] = {0, };
-
-        retv_if(unique_name == NULL, FALSE);
-
-        BT_DBG("unique_name: %s", unique_name);
-
-        retv_if(bt_service_conn == NULL, FALSE);
-
-        ret_val = cynara_creds_get_default_client_method(&client_creds_method);
-        if (ret_val != CYNARA_API_SUCCESS) {
-                cynara_strerror(ret_val, err_msg, sizeof(err_msg));
-                BT_ERR("Fail to get default client method: %s", err_msg);
-                return FALSE;
-        }
-
-        ret_val = cynara_creds_get_default_user_method(&user_creds_method);
-        if (ret_val != CYNARA_API_SUCCESS) {
-                cynara_strerror(ret_val, err_msg, sizeof(err_msg));
-                BT_ERR("Fail to get default user method: %s", err_msg);
-                return FALSE;
-        }
-
-        ret_val = cynara_creds_gdbus_get_client(bt_service_conn, unique_name, client_creds_method, &client_creds);
-        if (ret_val != CYNARA_API_SUCCESS) {
-                cynara_strerror(ret_val, err_msg, sizeof(err_msg));
-                BT_ERR("Fail to get client credential: %s", err_msg);
-                return FALSE;
-        }
-
-        BT_DBG("client_creds: %s", client_creds);
-
-        ret_val = cynara_creds_gdbus_get_user(bt_service_conn, unique_name, user_creds_method, &user_creds);
-        if (ret_val != CYNARA_API_SUCCESS) {
-                cynara_strerror(ret_val, err_msg, sizeof(err_msg));
-                BT_ERR("Fail to get user credential: %s", err_msg);
-                if (client_creds)
-                        free(client_creds);
-                return FALSE;
-        }
-
-        BT_DBG("user_creds: %s", user_creds);
-
-        switch (function_name) {
-        case BT_SET_LOCAL_NAME:
-        case BT_START_DISCOVERY:
-        case BT_START_CUSTOM_DISCOVERY:
-        case BT_CANCEL_DISCOVERY:
-        case BT_OOB_ADD_REMOTE_DATA:
-        case BT_OOB_REMOVE_REMOTE_DATA:
-        case BT_SET_ADVERTISING:
-        case BT_SET_CUSTOM_ADVERTISING:
-        case BT_SET_ADVERTISING_PARAMETERS:
-        case BT_START_LE_DISCOVERY:
-        case BT_STOP_LE_DISCOVERY:
-
-        case BT_BOND_DEVICE:
-        case BT_CANCEL_BONDING:
-        case BT_UNBOND_DEVICE:
-        case BT_SET_ALIAS:
-        case BT_SET_AUTHORIZATION:
-        case BT_UNSET_AUTHORIZATION:
-        case BT_SEARCH_SERVICE:
-
-        case BT_RFCOMM_CLIENT_CONNECT:
-        case BT_RFCOMM_CLIENT_CANCEL_CONNECT:
-        case BT_RFCOMM_SOCKET_DISCONNECT:
-        case BT_RFCOMM_SOCKET_WRITE:
-        case BT_RFCOMM_CREATE_SOCKET:
-        case BT_RFCOMM_REMOVE_SOCKET:
-
-        case BT_OPP_PUSH_FILES:
-        case BT_OPP_CANCEL_PUSH:
-
-        case BT_OBEX_SERVER_ACCEPT_CONNECTION:
-        case BT_OBEX_SERVER_REJECT_CONNECTION:
-        case BT_OBEX_SERVER_ACCEPT_FILE:
-        case BT_OBEX_SERVER_REJECT_FILE:
-        case BT_OBEX_SERVER_SET_PATH:
-        case BT_OBEX_SERVER_SET_ROOT:
-        case BT_OBEX_SERVER_CANCEL_TRANSFER:
-        case BT_OBEX_SERVER_CANCEL_ALL_TRANSFERS:
-
-        case BT_AUDIO_CONNECT:
-        case BT_AUDIO_DISCONNECT:
-        case BT_AG_CONNECT:
-        case BT_AG_DISCONNECT:
-        case BT_AV_CONNECT:
-        case BT_AV_DISCONNECT:
-        case BT_AV_SOURCE_CONNECT:
-        case BT_AV_SOURCE_DISCONNECT:
-        case BT_AVRCP_CONTROL_CONNECT:
-        case BT_AVRCP_CONTROL_DISCONNECT:
-        case BT_AVRCP_HANDLE_CONTROL:
-        case BT_AVRCP_SET_TRACK_INFO:
-        case BT_AVRCP_SET_PROPERTY:
-        case BT_AVRCP_SET_PROPERTIES:
-        case BT_AVRCP_CONTROL_SET_PROPERTY:
-
-        case BT_HF_CONNECT:
-        case BT_HF_DISCONNECT:
-
-        case BT_HID_CONNECT:
-        case BT_HID_DISCONNECT:
-
-        case BT_HID_DEVICE_ACTIVATE:
-        case BT_HID_DEVICE_DEACTIVATE:
-        case BT_HID_DEVICE_CONNECT:
-        case BT_HID_DEVICE_DISCONNECT:
-        case BT_HID_DEVICE_SEND_MOUSE_EVENT:
-        case BT_HID_DEVICE_SEND_KEY_EVENT:
-        case BT_HID_DEVICE_SEND_REPLY_TO_REPORT:
-
-        case BT_CONNECT_LE:
-        case BT_DISCONNECT_LE:
-
-        case BT_SET_ADVERTISING_DATA:
-        case BT_SET_SCAN_RESPONSE_DATA:
-
-        case BT_HDP_CONNECT:
-        case BT_HDP_DISCONNECT:
-        case BT_HDP_SEND_DATA:
-        case BT_HDP_REGISTER_SINK_APP:
-        case BT_HDP_UNREGISTER_SINK_APP:
-
-        case BT_DPM_SET_ALLOW_BT_MODE:
-        case BT_DPM_GET_ALLOW_BT_MODE:
-        case BT_DPM_SET_DEVICE_RESTRITION:
-        case BT_DPM_GET_DEVICE_RESTRITION:
-        case BT_DPM_SET_UUID_RESTRITION:
-        case BT_DPM_GET_UUID_RESTRITION:
-        case BT_DPM_ADD_DEVICES_BLACKLIST:
-        case BT_DPM_ADD_DEVICES_WHITELIST:
-        case BT_DPM_ADD_UUIDS_BLACKLIST:
-        case BT_DPM_ADD_UUIDS_WHITELIST:
-        case BT_DPM_CLEAR_DEVICES_BLACKLIST:
-        case BT_DPM_CLEAR_DEVICES_WHITELIST:
-        case BT_DPM_CLEAR_UUIDS_BLACKLIST:
-        case BT_DPM_CLEAR_UUIDS_WHITELIST:
-        case BT_DPM_REMOVE_DEVICE_BLACKLIST:
-        case BT_DPM_REMOVE_DEVICE_WHITELIST:
-        case BT_DPM_REMOVE_UUID_BLACKLIST:
-        case BT_DPM_REMOVE_UUID_WHITELIST:
-        case BT_DPM_GET_DEVICES_BLACKLIST:
-        case BT_DPM_GET_DEVICES_WHITELIST:
-        case BT_DPM_GET_UUIDS_BLACKLIST:
-        case BT_DPM_GET_UUIDS_WHITELIST:
-        case BT_DPM_SET_ALLOW_OUTGOING_CALL:
-        case BT_DPM_GET_ALLOW_OUTGOING_CALL:
-        case BT_DPM_SET_PAIRING_STATE:
-        case BT_DPM_GET_PAIRING_STATE:
-        case BT_DPM_SET_PROFILE_STATE:
-        case BT_DPM_GET_PROFILE_STATE:
-        case BT_DPM_SET_DESKROP_CONNECTIVITY_STATE:
-        case BT_DPM_GET_DESKROP_CONNECTIVITY_STATE:
-        case BT_DPM_SET_DISCOVERABLE_STATE:
-        case BT_DPM_GET_DISCOVERABLE_STATE:
-        case BT_DPM_SET_LIMITED_DISCOVERABLE_STATE:
-        case BT_DPM_GET_LIMITED_DISCOVERABLE_STATE:
-        case BT_DPM_SET_DATA_TRANSFER_STATE:
-        case BT_DPM_GET_DATA_TRANSFER_STATE:
-
-        case BT_NETWORK_ACTIVATE:
-        case BT_NETWORK_DEACTIVATE:
-        case BT_NETWORK_CONNECT:
-        case BT_NETWORK_DISCONNECT:
-        case BT_NETWORK_SERVER_DISCONNECT:
-
-        case BT_GATT_GET_PRIMARY_SERVICES:
-        case BT_GATT_DISCOVER_CHARACTERISTICS:
-        case BT_GATT_SET_PROPERTY_REQUEST:
-        case BT_GATT_READ_CHARACTERISTIC:
-        case BT_GATT_DISCOVER_CHARACTERISTICS_DESCRIPTOR:
-        case BT_GATT_REGISTER_APPLICATION:
-        case BT_GATT_REGISTER_SERVICE:
-        case BT_GATT_SEND_RESPONSE:
-               case BT_PBAP_CONNECT:
-               case BT_PBAP_DISCONNECT:
-               case BT_PBAP_GET_PHONEBOOK_SIZE:
-               case BT_PBAP_GET_PHONEBOOK:
-               case BT_PBAP_GET_LIST:
-               case BT_PBAP_PULL_VCARD:
-               case BT_PBAP_PHONEBOOK_SEARCH:
-
-                ret_val = cynara_check(p_cynara, client_creds, client_session, user_creds,
-                                                                                 BT_PRIVILEGE_PUBLIC);
-
-                if (ret_val != CYNARA_API_ACCESS_ALLOWED) {
-                        BT_ERR("Fail to access: %s", BT_PRIVILEGE_PUBLIC);
-                        result = FALSE;
-                }
-
-                               /* Need to check mediastorage privilege */
-                               if (function_name == BT_PBAP_GET_PHONEBOOK ||
-                                        function_name == BT_PBAP_PULL_VCARD) {
-                       ret_val = cynara_check(p_cynara, client_creds, client_session, user_creds,
-                                                                    MEDIASTORAGE_PRIVILEGE);
-
-                       if (ret_val != CYNARA_API_ACCESS_ALLOWED) {
-                               BT_ERR("Fail to access: %s", MEDIASTORAGE_PRIVILEGE);
-                               result = FALSE;
-                       }
-                               }
-        break;
-
-        case BT_ENABLE_ADAPTER:
-        case BT_DISABLE_ADAPTER:
-        case BT_RESET_ADAPTER:
-        case BT_RECOVER_ADAPTER:
-        case BT_ENABLE_ADAPTER_LE:
-        case BT_DISABLE_ADAPTER_LE:
-        case BT_SET_CONNECTABLE:
-        case BT_SET_DISCOVERABLE_MODE:
-        case BT_ADD_WHITE_LIST:
-        case BT_REMOVE_WHITE_LIST:
-        case BT_CLEAR_WHITE_LIST:
-        case BT_SET_MANUFACTURER_DATA:
-        case BT_SET_SCAN_PARAMETERS:
-
-        case BT_CANCEL_SEARCH_SERVICE:
-        case BT_ENABLE_RSSI:
-
-        case BT_RFCOMM_ACCEPT_CONNECTION:
-        case BT_RFCOMM_REJECT_CONNECTION:
-        case BT_RFCOMM_LISTEN:
-
-        case BT_AVRCP_CONTROL_GET_PROPERTY:
-        case BT_AVRCP_GET_TRACK_INFO:
-
-        case BT_SET_CONTENT_PROTECT:
-        case BT_BOND_DEVICE_BY_TYPE:
-        case BT_SET_LE_PRIVACY:
-        case BT_LE_CONN_UPDATE:
-        case BT_LE_READ_MAXIMUM_DATA_LENGTH:
-        case BT_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH:
-        case BT_LE_READ_HOST_SUGGESTED_DATA_LENGTH:
-        case BT_LE_SET_DATA_LENGTH:
-
-        case BT_LE_IPSP_INIT:
-        case BT_LE_IPSP_DEINIT:
-        case BT_LE_IPSP_CONNECT:
-        case BT_LE_IPSP_DISCONNECT:
-                ret_val = cynara_check(p_cynara, client_creds, client_session, user_creds,
-                                                                                 BT_PRIVILEGE_PLATFORM);
-
-                if (ret_val != CYNARA_API_ACCESS_ALLOWED) {
-                        BT_ERR("Fail to access: %s", BT_PRIVILEGE_PLATFORM);
-                        result = FALSE;
-                }
-        break;
-
-        case BT_CHECK_ADAPTER:
-        case BT_GET_RSSI:
-
-        case BT_GET_LOCAL_NAME:
-        case BT_GET_LOCAL_ADDRESS:
-        case BT_GET_LOCAL_VERSION:
-        case BT_IS_SERVICE_USED:
-        case BT_GET_DISCOVERABLE_MODE:
-        case BT_GET_DISCOVERABLE_TIME:
-        case BT_IS_DISCOVERYING:
-        case BT_IS_LE_DISCOVERYING:
-        case BT_IS_CONNECTABLE:
-        case BT_GET_BONDED_DEVICES:
-        case BT_GET_BONDED_DEVICE:
-        case BT_IS_DEVICE_CONNECTED:
-        case BT_GET_SPEAKER_GAIN:
-        case BT_SET_SPEAKER_GAIN:
-        case BT_OOB_READ_LOCAL_DATA:
-        case BT_RFCOMM_CLIENT_IS_CONNECTED:
-        case BT_RFCOMM_IS_UUID_AVAILABLE:
-        case BT_GET_ADVERTISING_DATA:
-        case BT_GET_SCAN_RESPONSE_DATA:
-        case BT_IS_ADVERTISING:
-
-        case BT_OBEX_SERVER_ALLOCATE:
-        case BT_OBEX_SERVER_DEALLOCATE:
-                /* Non-privilege control */
-                break;
-        default:
-                BT_ERR("Unknown function!");
-                result = FALSE;
-                break;
-        }
-
-        if (client_creds)
-                free(client_creds);
-
-        if (user_creds)
-                free(user_creds);
-
-        return result;
+       int ret_val;
+       gboolean result = TRUE;
+       char *client_creds = NULL;
+       char *user_creds = NULL;
+       char *client_session = "";
+       enum cynara_client_creds client_creds_method = CLIENT_METHOD_SMACK;
+       enum cynara_user_creds user_creds_method = USER_METHOD_UID;
+       char err_msg[256] = {0, };
+
+       retv_if(unique_name == NULL, FALSE);
+
+       BT_DBG("unique_name: %s", unique_name);
+
+       retv_if(bt_service_conn == NULL, FALSE);
+
+       ret_val = cynara_creds_get_default_client_method(&client_creds_method);
+       if (ret_val != CYNARA_API_SUCCESS) {
+               cynara_strerror(ret_val, err_msg, sizeof(err_msg));
+               BT_ERR("Fail to get default client method: %s", err_msg);
+               return FALSE;
+       }
+
+       ret_val = cynara_creds_get_default_user_method(&user_creds_method);
+       if (ret_val != CYNARA_API_SUCCESS) {
+               cynara_strerror(ret_val, err_msg, sizeof(err_msg));
+               BT_ERR("Fail to get default user method: %s", err_msg);
+               return FALSE;
+       }
+
+       ret_val = cynara_creds_gdbus_get_client(bt_service_conn, unique_name, client_creds_method, &client_creds);
+       if (ret_val != CYNARA_API_SUCCESS) {
+               cynara_strerror(ret_val, err_msg, sizeof(err_msg));
+               BT_ERR("Fail to get client credential: %s", err_msg);
+               return FALSE;
+       }
+
+       BT_DBG("client_creds: %s", client_creds);
+
+       ret_val = cynara_creds_gdbus_get_user(bt_service_conn, unique_name, user_creds_method, &user_creds);
+       if (ret_val != CYNARA_API_SUCCESS) {
+               cynara_strerror(ret_val, err_msg, sizeof(err_msg));
+               BT_ERR("Fail to get user credential: %s", err_msg);
+               if (client_creds)
+                       free(client_creds);
+               return FALSE;
+       }
+
+       BT_DBG("user_creds: %s", user_creds);
+
+       switch (function_name) {
+       case BT_SET_LOCAL_NAME:
+       case BT_START_DISCOVERY:
+       case BT_START_CUSTOM_DISCOVERY:
+       case BT_CANCEL_DISCOVERY:
+       case BT_OOB_ADD_REMOTE_DATA:
+       case BT_OOB_REMOVE_REMOTE_DATA:
+       case BT_SET_ADVERTISING:
+       case BT_SET_CUSTOM_ADVERTISING:
+       case BT_SET_ADVERTISING_PARAMETERS:
+       case BT_START_LE_DISCOVERY:
+       case BT_STOP_LE_DISCOVERY:
+       case BT_SET_SCAN_PARAMETERS:
+
+       case BT_BOND_DEVICE:
+       case BT_CANCEL_BONDING:
+       case BT_UNBOND_DEVICE:
+       case BT_SET_ALIAS:
+       case BT_SET_AUTHORIZATION:
+       case BT_UNSET_AUTHORIZATION:
+       case BT_SEARCH_SERVICE:
+
+       case BT_RFCOMM_CLIENT_CONNECT:
+       case BT_RFCOMM_CLIENT_CANCEL_CONNECT:
+       case BT_RFCOMM_SOCKET_DISCONNECT:
+       case BT_RFCOMM_SOCKET_WRITE:
+       case BT_RFCOMM_CREATE_SOCKET:
+       case BT_RFCOMM_REMOVE_SOCKET:
+
+       case BT_OPP_PUSH_FILES:
+       case BT_OPP_CANCEL_PUSH:
+
+       case BT_OBEX_SERVER_ACCEPT_CONNECTION:
+       case BT_OBEX_SERVER_REJECT_CONNECTION:
+       case BT_OBEX_SERVER_ACCEPT_FILE:
+       case BT_OBEX_SERVER_REJECT_FILE:
+       case BT_OBEX_SERVER_SET_PATH:
+       case BT_OBEX_SERVER_SET_ROOT:
+       case BT_OBEX_SERVER_CANCEL_TRANSFER:
+       case BT_OBEX_SERVER_CANCEL_ALL_TRANSFERS:
+
+       case BT_AUDIO_CONNECT:
+       case BT_AUDIO_DISCONNECT:
+       case BT_AG_CONNECT:
+       case BT_AG_DISCONNECT:
+       case BT_AV_CONNECT:
+       case BT_AV_DISCONNECT:
+       case BT_AV_SOURCE_CONNECT:
+       case BT_AV_SOURCE_DISCONNECT:
+       case BT_AVRCP_CONTROL_CONNECT:
+       case BT_AVRCP_CONTROL_DISCONNECT:
+       case BT_AVRCP_HANDLE_CONTROL:
+       case BT_AVRCP_SET_TRACK_INFO:
+       case BT_AVRCP_SET_PROPERTY:
+       case BT_AVRCP_SET_PROPERTIES:
+       case BT_AVRCP_CONTROL_SET_PROPERTY:
+
+       case BT_HF_CONNECT:
+       case BT_HF_DISCONNECT:
+
+       case BT_HID_CONNECT:
+       case BT_HID_DISCONNECT:
+
+       case BT_HID_DEVICE_ACTIVATE:
+       case BT_HID_DEVICE_DEACTIVATE:
+       case BT_HID_DEVICE_CONNECT:
+       case BT_HID_DEVICE_DISCONNECT:
+       case BT_HID_DEVICE_SEND_MOUSE_EVENT:
+       case BT_HID_DEVICE_SEND_KEY_EVENT:
+       case BT_HID_DEVICE_SEND_REPLY_TO_REPORT:
+       case BT_HID_DEVICE_SEND_CUSTOM_EVENT:
+
+       case BT_CONNECT_LE:
+       case BT_DISCONNECT_LE:
+
+       case BT_SET_ADVERTISING_DATA:
+       case BT_SET_SCAN_RESPONSE_DATA:
+
+       case BT_HDP_CONNECT:
+       case BT_HDP_DISCONNECT:
+       case BT_HDP_SEND_DATA:
+       case BT_HDP_REGISTER_SINK_APP:
+       case BT_HDP_UNREGISTER_SINK_APP:
+
+       case BT_DPM_SET_ALLOW_BT_MODE:
+       case BT_DPM_GET_ALLOW_BT_MODE:
+       case BT_DPM_SET_DEVICE_RESTRITION:
+       case BT_DPM_GET_DEVICE_RESTRITION:
+       case BT_DPM_SET_UUID_RESTRITION:
+       case BT_DPM_GET_UUID_RESTRITION:
+       case BT_DPM_ADD_DEVICES_BLACKLIST:
+       case BT_DPM_ADD_DEVICES_WHITELIST:
+       case BT_DPM_ADD_UUIDS_BLACKLIST:
+       case BT_DPM_ADD_UUIDS_WHITELIST:
+       case BT_DPM_CLEAR_DEVICES_BLACKLIST:
+       case BT_DPM_CLEAR_DEVICES_WHITELIST:
+       case BT_DPM_CLEAR_UUIDS_BLACKLIST:
+       case BT_DPM_CLEAR_UUIDS_WHITELIST:
+       case BT_DPM_REMOVE_DEVICE_BLACKLIST:
+       case BT_DPM_REMOVE_DEVICE_WHITELIST:
+       case BT_DPM_REMOVE_UUID_BLACKLIST:
+       case BT_DPM_REMOVE_UUID_WHITELIST:
+       case BT_DPM_GET_DEVICES_BLACKLIST:
+       case BT_DPM_GET_DEVICES_WHITELIST:
+       case BT_DPM_GET_UUIDS_BLACKLIST:
+       case BT_DPM_GET_UUIDS_WHITELIST:
+       case BT_DPM_SET_ALLOW_OUTGOING_CALL:
+       case BT_DPM_GET_ALLOW_OUTGOING_CALL:
+       case BT_DPM_SET_PAIRING_STATE:
+       case BT_DPM_GET_PAIRING_STATE:
+       case BT_DPM_SET_PROFILE_STATE:
+       case BT_DPM_GET_PROFILE_STATE:
+       case BT_DPM_SET_DESKROP_CONNECTIVITY_STATE:
+       case BT_DPM_GET_DESKROP_CONNECTIVITY_STATE:
+       case BT_DPM_SET_DISCOVERABLE_STATE:
+       case BT_DPM_GET_DISCOVERABLE_STATE:
+       case BT_DPM_SET_LIMITED_DISCOVERABLE_STATE:
+       case BT_DPM_GET_LIMITED_DISCOVERABLE_STATE:
+       case BT_DPM_SET_DATA_TRANSFER_STATE:
+       case BT_DPM_GET_DATA_TRANSFER_STATE:
+
+       case BT_NETWORK_ACTIVATE:
+       case BT_NETWORK_DEACTIVATE:
+       case BT_NETWORK_CONNECT:
+       case BT_NETWORK_DISCONNECT:
+       case BT_NETWORK_SERVER_DISCONNECT:
+
+       case BT_GATT_GET_PRIMARY_SERVICES:
+       case BT_GATT_DISCOVER_CHARACTERISTICS:
+       case BT_GATT_SET_PROPERTY_REQUEST:
+       case BT_GATT_READ_CHARACTERISTIC:
+       case BT_GATT_DISCOVER_CHARACTERISTICS_DESCRIPTOR:
+       case BT_GATT_REGISTER_APPLICATION:
+       case BT_GATT_REGISTER_SERVICE:
+       case BT_GATT_SEND_RESPONSE:
+       case BT_PBAP_CONNECT:
+       case BT_PBAP_DISCONNECT:
+       case BT_PBAP_GET_PHONEBOOK_SIZE:
+       case BT_PBAP_GET_PHONEBOOK:
+       case BT_PBAP_GET_LIST:
+       case BT_PBAP_PULL_VCARD:
+       case BT_PBAP_PHONEBOOK_SEARCH:
+
+       ret_val = cynara_check(p_cynara, client_creds, client_session, user_creds,
+                                               BT_PRIVILEGE_PUBLIC);
+
+       if (ret_val != CYNARA_API_ACCESS_ALLOWED) {
+               BT_ERR("Fail to access: %s", BT_PRIVILEGE_PUBLIC);
+               result = FALSE;
+       }
+
+       /* Need to check mediastorage privilege */
+       if (function_name == BT_PBAP_GET_PHONEBOOK ||
+               function_name == BT_PBAP_PULL_VCARD) {
+               ret_val = cynara_check(p_cynara, client_creds, client_session, user_creds,
+                                                       MEDIASTORAGE_PRIVILEGE);
+
+               if (ret_val != CYNARA_API_ACCESS_ALLOWED) {
+               BT_ERR("Fail to access: %s", MEDIASTORAGE_PRIVILEGE);
+               result = FALSE;
+               }
+       }
+       break;
+
+       case BT_ENABLE_ADAPTER:
+       case BT_DISABLE_ADAPTER:
+       case BT_RESET_ADAPTER:
+       case BT_RECOVER_ADAPTER:
+       case BT_ENABLE_ADAPTER_LE:
+       case BT_DISABLE_ADAPTER_LE:
+       case BT_SET_CONNECTABLE:
+       case BT_SET_DISCOVERABLE_MODE:
+       case BT_ADD_WHITE_LIST:
+       case BT_REMOVE_WHITE_LIST:
+       case BT_CLEAR_WHITE_LIST:
+       case BT_SET_MANUFACTURER_DATA:
+       case BT_SET_PROFILE_RESTRICTED:
+
+       case BT_CANCEL_SEARCH_SERVICE:
+       case BT_ENABLE_RSSI:
+
+       case BT_RFCOMM_ACCEPT_CONNECTION:
+       case BT_RFCOMM_REJECT_CONNECTION:
+       case BT_RFCOMM_LISTEN:
+
+       case BT_AVRCP_CONTROL_GET_PROPERTY:
+       case BT_AVRCP_GET_TRACK_INFO:
+
+       case BT_SET_CONTENT_PROTECT:
+       case BT_BOND_DEVICE_BY_TYPE:
+       case BT_SET_LE_PRIVACY:
+       case BT_LE_CONN_UPDATE:
+       case BT_LE_READ_MAXIMUM_DATA_LENGTH:
+       case BT_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH:
+       case BT_LE_READ_HOST_SUGGESTED_DATA_LENGTH:
+       case BT_LE_SET_DATA_LENGTH:
+
+       case BT_GET_ATT_MTU:
+
+       case BT_LE_IPSP_INIT:
+       case BT_LE_IPSP_DEINIT:
+       case BT_LE_IPSP_CONNECT:
+       case BT_LE_IPSP_DISCONNECT:
+       case BT_PXP_SET_PROPERTY:
+       case BT_PXP_GET_PROPERTY:
+       case BT_PXP_GET_SUPPORTED_SERIVCES:
+       case BT_PXP_REGISTER_REPORTER:
+       case BT_PXP_UNREGISTER_REPORTER:
+       ret_val = cynara_check(p_cynara, client_creds, client_session, user_creds,
+                               BT_PRIVILEGE_PLATFORM);
+
+       if (ret_val != CYNARA_API_ACCESS_ALLOWED) {
+               BT_ERR("Fail to access: %s", BT_PRIVILEGE_PLATFORM);
+               result = FALSE;
+       }
+       break;
+
+       case BT_CHECK_ADAPTER:
+       case BT_GET_RSSI:
+
+       case BT_GET_LOCAL_NAME:
+       case BT_GET_LOCAL_ADDRESS:
+       case BT_GET_LOCAL_VERSION:
+       case BT_IS_SERVICE_USED:
+       case BT_GET_DISCOVERABLE_MODE:
+       case BT_GET_DISCOVERABLE_TIME:
+       case BT_IS_DISCOVERYING:
+       case BT_IS_LE_DISCOVERYING:
+       case BT_IS_CONNECTABLE:
+       case BT_GET_BONDED_DEVICES:
+       case BT_GET_BONDED_DEVICE:
+       case BT_GET_IS_ALIAS_SET:
+       case BT_IS_DEVICE_CONNECTED:
+       case BT_GET_SPEAKER_GAIN:
+       case BT_SET_SPEAKER_GAIN:
+       case BT_OOB_READ_LOCAL_DATA:
+       case BT_RFCOMM_CLIENT_IS_CONNECTED:
+       case BT_RFCOMM_IS_UUID_AVAILABLE:
+       case BT_GET_ADVERTISING_DATA:
+       case BT_GET_SCAN_RESPONSE_DATA:
+       case BT_IS_ADVERTISING:
+       case BT_GET_PROFILE_RESTRICTED:
+
+       case BT_OBEX_SERVER_ALLOCATE:
+       case BT_OBEX_SERVER_DEALLOCATE:
+               /* Non-privilege control */
+               break;
+       default:
+               BT_ERR("Unknown function!");
+               result = FALSE;
+               break;
+       }
+
+       if (client_creds)
+               free(client_creds);
+
+       if (user_creds)
+               free(user_creds);
+
+       return result;
 }
 
 GDBusNodeInfo *__bt_service_create_method_node_info
@@ -2822,38 +3040,38 @@ void _bt_service_unregister(void)
 
 int _bt_service_cynara_init(void)
 {
-        int result;
-        char err_msg[256] = {0, };
+       int result;
+       char err_msg[256] = {0, };
 
-        retv_if(p_cynara != NULL, BLUETOOTH_ERROR_ALREADY_INITIALIZED);
+       retv_if(p_cynara != NULL, BLUETOOTH_ERROR_ALREADY_INITIALIZED);
 
-        result = cynara_initialize(&p_cynara, conf);
+       result = cynara_initialize(&p_cynara, conf);
 
-        if (result != CYNARA_API_SUCCESS) {
-                cynara_strerror(result, err_msg, sizeof(err_msg));
-                BT_ERR("Fail to initialize cynara: [%s]", err_msg);
-                return BLUETOOTH_ERROR_INTERNAL;
-        }
+       if (result != CYNARA_API_SUCCESS) {
+               cynara_strerror(result, err_msg, sizeof(err_msg));
+               BT_ERR("Fail to initialize cynara: [%s]", err_msg);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
 
-        return BLUETOOTH_ERROR_NONE;
+       return BLUETOOTH_ERROR_NONE;
 }
 
 void _bt_service_cynara_deinit(void)
 {
-        int result;
-        char err_msg[256] = {0, };
+       int result;
+       char err_msg[256] = {0, };
 
-        ret_if(p_cynara == NULL);
+       ret_if(p_cynara == NULL);
 
-        result = cynara_finish(p_cynara);
+       result = cynara_finish(p_cynara);
 
-        if (result != CYNARA_API_SUCCESS) {
-                cynara_strerror(result, err_msg, sizeof(err_msg));
-                BT_ERR("Fail to finish cynara: [%s]", err_msg);
-                return;
-        }
+       if (result != CYNARA_API_SUCCESS) {
+               cynara_strerror(result, err_msg, sizeof(err_msg));
+               BT_ERR("Fail to finish cynara: [%s]", err_msg);
+               return;
+       }
 
-        p_cynara = NULL;
-        conf = NULL;
+       p_cynara = NULL;
+       conf = NULL;
 }
 
old mode 100755 (executable)
new mode 100644 (file)
index 3c9f549..e124352
@@ -22,9 +22,7 @@
 #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"
@@ -43,6 +41,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 +53,7 @@ typedef struct {
        char *sender;
        int adv_handle;
        gboolean is_advertising;
+       guint hold_timer_id;
 } bt_adapter_le_adv_slot_t;
 
 typedef struct {
@@ -194,15 +194,24 @@ gboolean _bt_update_le_feature_support(const char *item, const char *value)
                return FALSE;
 
        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 +223,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 +241,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,7 +270,7 @@ 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[slot_id].sender == NULL) {
                le_adv_slot[slot_id].sender = strdup(sender);
@@ -362,6 +375,11 @@ int _bt_set_advertising(const char *sender, int adv_handle, gboolean enable, gbo
        if (le_adv_slot[slot_id].sender != NULL && le_adv_slot[slot_id].is_advertising == FALSE && enable == FALSE)
                return BLUETOOTH_ERROR_NOT_IN_OPERATION;
 
+       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;
+       }
+
        proxy = _bt_get_adapter_proxy();
        retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
@@ -379,10 +397,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);
@@ -424,6 +442,11 @@ int _bt_set_custom_advertising(const char *sender, int adv_handle,
        if (le_adv_slot[slot_id].sender != NULL && le_adv_slot[slot_id].is_advertising == FALSE && enable == FALSE)
                return BLUETOOTH_ERROR_NOT_IN_OPERATION;
 
+       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;
+       }
+
        proxy = _bt_get_adapter_proxy();
        retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
@@ -444,7 +467,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);
@@ -477,18 +500,88 @@ int _bt_set_custom_advertising(const char *sender, int adv_handle,
        }
 
        if (enable == TRUE)
-               _bt_register_adv_slot_owner(sender, adv_handle, slot_id);
+               __bt_register_adv_slot_owner(sender, adv_handle, slot_id);
        else
                _bt_unregister_adv_slot_owner(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_ERR("It's NOT advertising");
+               return BLUETOOTH_ERROR_NOT_IN_OPERATION;
+       }
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
 static int __bt_get_ad_data_by_type(char *in_data, int in_len,
                char in_type, char **data, int *data_len)
 {
@@ -586,9 +679,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 +695,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 +704,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 +772,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 +788,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 +799,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,
@@ -815,9 +906,8 @@ int __bt_get_available_scan_filter_slot_id(void)
                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 +923,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 +1042,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 +1091,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 +1142,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 +1189,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
@@ -1473,7 +1571,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 +1779,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 +1805,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;
@@ -1828,6 +1945,36 @@ void _bt_send_scan_result_event(const bt_remote_le_dev_info_t *le_dev_info,
        }
 }
 
+void _bt_send_ibeacon_scan_result_event(const bt_remote_ibeacon_dev_info_t *ibeacon_dev_info)
+{
+       int result = BLUETOOTH_ERROR_NONE;
+       GSList *l;
+       GVariant *param;
+       bt_adapter_le_scanner_t *scanner = NULL;
+
+       ret_if(ibeacon_dev_info == NULL);
+       BT_DBG("_bt_send_ibeacon_scan_result_event");
+
+       for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
+               scanner = l->data;
+               if (scanner->is_scanning == FALSE)
+                       continue;
+
+               param = g_variant_new("(isnnnsnnn)",
+                                       result,
+                                       ibeacon_dev_info->address,
+                                       ibeacon_dev_info->addr_type,
+                                       ibeacon_dev_info->company_id,
+                                       ibeacon_dev_info->ibeacon_type,
+                                       ibeacon_dev_info->uuid,
+                                       ibeacon_dev_info->major_id,
+                                       ibeacon_dev_info->minor_id,
+                                       ibeacon_dev_info->measured_power);
+
+               _bt_send_event(BT_LE_ADAPTER_EVENT, BLUETOOTH_EVENT_REMOTE_IBEACON_DEVICE_FOUND, param);
+       }
+}
+
 int _bt_add_white_list(bluetooth_device_address_t *device_address, bluetooth_device_address_type_t address_type)
 {
        GDBusProxy *proxy;
@@ -2131,7 +2278,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);
index fb16d2c..656595f 100644 (file)
@@ -21,9 +21,7 @@
 #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 <dbus/dbus-glib.h>
 #include <dbus/dbus.h>
@@ -40,6 +38,7 @@
 #include "bt-service-util.h"
 #include "bt-service-network.h"
 #include "bt-service-obex-server.h"
+#include "bt-service-opp-client.h"
 #include "bt-service-agent.h"
 #include "bt-service-main.h"
 #include "bt-service-avrcp.h"
@@ -52,20 +51,34 @@ typedef struct {
        guint event_id;
        int timeout;
        time_t start_time;
-       gboolean alarm_init;
        int alarm_id;
 } bt_adapter_timer_t;
 
 bt_adapter_timer_t visible_timer = {0, };
 
+typedef struct {
+       alarm_id_t alarm_id;
+       bt_set_alarm_cb callback;
+       void *user_data;
+} bt_service_alarm_t;
+
+typedef struct {
+       gboolean is_alarm_initialized;
+       GList *g_alarm_list;
+} bt_service_alarm_mgr_t;
+
+static bt_service_alarm_mgr_t alarm_mgr = {0, };
+
 static gboolean is_discovering;
 static gboolean cancel_by_user;
 static bt_status_t adapter_status = BT_DEACTIVATED;
 static bt_le_status_t adapter_le_status = BT_LE_DEACTIVATED;
+static gboolean is_le_intended = FALSE;
 static void *adapter_agent = NULL;
 static GDBusProxy *core_proxy = NULL;
 static guint timer_id = 0;
 static guint le_timer_id = 0;
+static gboolean is_recovery_mode;
 
 static uint status_reg_id;
 
@@ -75,12 +88,15 @@ static uint status_reg_id;
 
 #define BT_DISABLE_TIME 500 /* 500 ms */
 
+static int alarm_cb(alarm_id_t alarm_id, void* user_param);
+static void alarm_data_free(void *data);
+
 GDBusProxy *_bt_init_core_proxy(void)
 {
        GDBusProxy *proxy;
        GDBusConnection *conn;
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        if (!conn)
                return NULL;
 
@@ -101,19 +117,17 @@ GDBusProxy *_bt_init_core_proxy(void)
 
 static GDBusProxy *__bt_get_core_proxy(void)
 {
-       return (core_proxy) ? core_proxy : _bt_init_core_proxy();
+       return (core_proxy) ? core_proxy : _bt_init_core_proxy();
 }
 
 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 !!");
@@ -143,7 +157,7 @@ static gboolean __bt_timeout_handler(gpointer user_data)
                visible_timer.event_id = 0;
                visible_timer.timeout = 0;
 
-#ifndef TIZEN_WEARABLE
+#ifndef TIZEN_PROFILE_WEARABLE
                if (vconf_set_int(BT_FILE_VISIBLE_TIME, 0) != 0)
                        BT_ERR("Set vconf failed\n");
 #endif
@@ -155,7 +169,6 @@ static gboolean __bt_timeout_handler(gpointer user_data)
 
 static int __bt_visibility_alarm_cb(alarm_id_t alarm_id, void* user_param)
 {
-       BT_DBG("__bt_visibility_alarm_cb - alram id = [%d] \n", alarm_id);
 
        int result = BLUETOOTH_ERROR_NONE;
        int timeout = 0;
@@ -171,7 +184,7 @@ static int __bt_visibility_alarm_cb(alarm_id_t alarm_id, void* user_param)
                visible_timer.event_id = 0;
                visible_timer.timeout = 0;
 
-#ifndef TIZEN_WEARABLE
+#ifndef TIZEN_PROFILE_WEARABLE
                if (vconf_set_int(BT_FILE_VISIBLE_TIME, 0) != 0)
                        BT_ERR("Set vconf failed\n");
 #endif
@@ -182,21 +195,6 @@ static int __bt_visibility_alarm_cb(alarm_id_t alarm_id, void* user_param)
        return 0;
 }
 
-static void __bt_visibility_alarm_create()
-{
-       alarm_id_t alarm_id;
-       int result;
-
-       result = alarmmgr_add_alarm(ALARM_TYPE_VOLATILE, visible_timer.timeout,
-                                               0, NULL, &alarm_id);
-       if (result < 0) {
-               BT_ERR("Failed to create alarm error = %d\n", result);
-       } else {
-               BT_DBG("Alarm created = %d\n", alarm_id);
-               visible_timer.alarm_id = alarm_id;
-       }
-}
-
 static void __bt_visibility_alarm_remove()
 {
        if (visible_timer.event_id > 0) {
@@ -205,7 +203,7 @@ static void __bt_visibility_alarm_remove()
        }
 
        if (visible_timer.alarm_id > 0) {
-               alarmmgr_remove_alarm(visible_timer.alarm_id);
+               _bt_service_remove_alarm(visible_timer.alarm_id);
                visible_timer.alarm_id = 0;
        }
 }
@@ -213,12 +211,13 @@ static void __bt_visibility_alarm_remove()
 int __bt_set_visible_time(int timeout)
 {
        int result;
+       alarm_id_t alarm_id;
 
        __bt_visibility_alarm_remove();
 
        visible_timer.timeout = timeout;
 
-#ifndef TIZEN_WEARABLE
+#ifndef TIZEN_PROFILE_WEARABLE
 #ifdef TIZEN_DPM_ENABLE
        if (_bt_dpm_get_bluetooth_limited_discoverable_state() != DPM_RESTRICTED) {
 #endif
@@ -229,29 +228,20 @@ int __bt_set_visible_time(int timeout)
 #endif
 #endif
 
+
        if (timeout <= 0)
                return BLUETOOTH_ERROR_NONE;
 
-       if (!visible_timer.alarm_init) {
-               /* Set Alarm timer to switch off BT */
-               result = alarmmgr_init("bt-service");
-               if (result != 0)
-                       return BLUETOOTH_ERROR_INTERNAL;
-
-               visible_timer.alarm_init = TRUE;
-       }
-
-       result = alarmmgr_set_cb(__bt_visibility_alarm_cb, NULL);
-       if (result != 0)
+       result = _bt_service_set_alarm(visible_timer.timeout,
+                                               __bt_visibility_alarm_cb, NULL, &alarm_id);
+       if (result != BLUETOOTH_ERROR_NONE)
                return BLUETOOTH_ERROR_INTERNAL;
-
+       visible_timer.alarm_id = alarm_id;
        /* Take start time */
        time(&(visible_timer.start_time));
        visible_timer.event_id = g_timeout_add_seconds(1,
                                __bt_timeout_handler, NULL);
 
-       __bt_visibility_alarm_create();
-
        return BLUETOOTH_ERROR_NONE;
 }
 
@@ -311,7 +301,7 @@ static int __bt_get_bonded_device_info(gchar *device_path,
        BT_CHECK_PARAMETER(device_path, return);
        BT_CHECK_PARAMETER(dev_info, return);
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
@@ -370,7 +360,6 @@ static int __bt_get_bonded_device_info(gchar *device_path,
                } else if (!g_strcmp0(key, "ManufacturerData")) {
                        manufacturer_data = g_byte_array_new();
                        g_variant_get(value, "ay", &char_value_iter);
-
                        while (g_variant_iter_loop(char_value_iter, "y",  &char_value))
                                g_byte_array_append(manufacturer_data, &char_value, 1);
 
@@ -382,6 +371,7 @@ static int __bt_get_bonded_device_info(gchar *device_path,
                                                manufacturer_data->len);
                                }
                        }
+                       g_byte_array_free(manufacturer_data, TRUE);
                }
        }
        g_variant_iter_free(property_iter);
@@ -391,6 +381,8 @@ static int __bt_get_bonded_device_info(gchar *device_path,
        g_variant_unref(result);
 
        if ((paired == FALSE) && (trust == FALSE)) {
+               g_free(address);
+               g_free(name);
                return BLUETOOTH_ERROR_NOT_PAIRED;
        }
 
@@ -450,6 +442,12 @@ bt_le_status_t _bt_adapter_get_le_status(void)
        return adapter_le_status;
 }
 
+
+void _bt_set_le_intended_status(gboolean value)
+{
+       is_le_intended = value;
+}
+
 static void __bt_phone_name_changed_cb(keynode_t *node, void *data)
 {
        char *phone_name = NULL;
@@ -462,83 +460,50 @@ static void __bt_phone_name_changed_cb(keynode_t *node, void *data)
                phone_name = vconf_keynode_get_str(node);
 
                if (phone_name && strlen(phone_name) != 0) {
-                        if (!g_utf8_validate(phone_name, -1,
+                       if (!g_utf8_validate(phone_name, -1,
                                                        (const char **)&ptr))
-                                *ptr = '\0';
+                                       *ptr = '\0';
 
                        _bt_set_local_name(phone_name);
                }
        }
 }
 
-#ifdef TIZEN_MOBILE
-static void __bt_set_visible_mode(void)
-{
-       int timeout = 0;
-
-       if (vconf_get_int(BT_FILE_VISIBLE_TIME, &timeout) != 0)
-                BT_ERR("Fail to get the timeout value");
-
-#ifdef TIZEN_DPM_ENABLE
-       if (timeout == -1 ||
-       _bt_dpm_get_bluetooth_limited_discoverable_state() == DPM_RESTRICTED) {
-               if (_bt_set_discoverable_mode(
-                       BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE,
-                       timeout) != BLUETOOTH_ERROR_NONE) {
-                       if (vconf_set_int(BT_FILE_VISIBLE_TIME, 0) != 0)
-                               BT_ERR("Set vconf failed");
-               }
-       } else {
-               if (_bt_set_discoverable_mode(
-                       BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE,
-                       timeout) != BLUETOOTH_ERROR_NONE) {
-                               BT_ERR("Set connectable mode failed");
-               }
-       }
-#else
-       if (timeout == -1) {
-               if (_bt_set_discoverable_mode(
-                       BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE,
-                       timeout) != BLUETOOTH_ERROR_NONE) {
-                       if (vconf_set_int(BT_FILE_VISIBLE_TIME, 0) != 0)
-                               BT_ERR("Set vconf failed");
-               }
-       } else {
-               if (_bt_set_discoverable_mode(
-                       BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE,
-                       timeout) != BLUETOOTH_ERROR_NONE) {
-                               BT_ERR("Set connectable mode failed");
-               }
-       }
-#endif
-}
-#endif
-
 static void __bt_set_local_name(void)
 {
+       bluetooth_device_name_t local_name;
        char *phone_name = NULL;
        char *ptr = NULL;
+       char *temp = NULL;
 
-       phone_name = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
+       if (_bt_get_local_name(&local_name) != BLUETOOTH_ERROR_NONE ||
+               (temp = strstr(local_name.name, "BlueZ")) != NULL) {
+               phone_name = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
 
-       if (!phone_name)
-               return;
+               if (!phone_name)
+                       return;
 
-       if (strlen(phone_name) != 0) {
-               if (!g_utf8_validate(phone_name, -1, (const char **)&ptr))
-                       *ptr = '\0';
+               if (strlen(phone_name) != 0) {
+                       if (!g_utf8_validate(phone_name, -1, (const char **)&ptr))
+                               *ptr = '\0';
 
-               _bt_set_local_name(phone_name);
+                       _bt_set_local_name(phone_name);
+               }
+               free(phone_name);
        }
-       free(phone_name);
 }
 
 static int __bt_set_enabled(void)
 {
-       BT_DBG("+");
        int adapter_status = BT_ADAPTER_DISABLED;
        int result = BLUETOOTH_ERROR_NONE;
 
+       if (timer_id > 0) {
+               BT_DBG("g_source is removed");
+               g_source_remove(timer_id);
+               timer_id = 0;
+       }
+
        _bt_check_adapter(&adapter_status);
 
        if (adapter_status == BT_ADAPTER_DISABLED) {
@@ -546,8 +511,11 @@ static int __bt_set_enabled(void)
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
-#ifdef TIZEN_MOBILE
-       __bt_set_visible_mode();
+#ifdef TIZEN_PROFILE_MOBILE || defined(TIZEN_PROFILE_IVI)
+       /* BT setting UI will control Mobile's visible mode. So in the FRWK...set the visible mode as off: */
+       if (_bt_set_discoverable_mode(
+               BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE, 0) != BLUETOOTH_ERROR_NONE)
+                       BT_ERR("Set connectable mode failed");
 #else
 #ifdef TIZEN_TV
        if (_bt_set_discoverable_mode(
@@ -555,7 +523,6 @@ static int __bt_set_enabled(void)
                        BT_ERR("Fail to set discoverable mode");
 #endif
 #endif
-       __bt_set_local_name();
 
        /* Update Bluetooth Status to notify other modules */
        if (vconf_set_int(VCONFKEY_BT_STATUS, VCONFKEY_BT_STATUS_ON) != 0)
@@ -563,16 +530,21 @@ static int __bt_set_enabled(void)
 
        if (vconf_set_int(VCONFKEY_BT_DEVICE, VCONFKEY_BT_DEVICE_NONE) != 0)
                BT_ERR("Set vconf failed\n");
-#if 0
+
        if (_bt_eventsystem_set_value(SYS_EVENT_BT_STATE, EVT_KEY_BT_STATE,
                                                EVT_VAL_BT_ON) != ES_R_OK)
                BT_ERR("Fail to set value");
-#endif
 
        /* Send enabled event to API */
        _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_ENABLED,
                                g_variant_new("(i)", result));
-       BT_DBG("-");
+
+#ifdef TIZEN_BT_A2DP_SINK_AUTO_CONNECT
+       _bt_audio_start_auto_connect(FALSE);
+#endif
+
+       __bt_set_local_name();
+       _bt_set_discovery_status(FALSE);
 
        return BLUETOOTH_ERROR_NONE;
 }
@@ -611,13 +583,19 @@ void _bt_set_disabled(int result)
        if (vconf_set_int(VCONFKEY_BT_DEVICE, VCONFKEY_BT_DEVICE_NONE) != 0)
                BT_ERR("Set vconf failed\n");
 
+       _bt_cancel_queued_transfers();
        _bt_adapter_set_status(BT_DEACTIVATED);
+       _bt_set_discovery_status(FALSE);
 
+#ifndef USB_BLUETOOTH
        if (_bt_adapter_get_le_status() != BT_LE_DEACTIVATED) {
+#endif
                /* Send disabled event */
                _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_DISABLED,
                                g_variant_new("(i)", result));
+#ifndef USB_BLUETOOTH
        }
+#endif
 
        BT_INFO("Adapter disabled");
 }
@@ -628,8 +606,6 @@ static int __bt_set_le_enabled(void)
        int result = BLUETOOTH_ERROR_NONE;
        bt_status_t status;
 
-       __bt_set_local_name();
-
        /* Update Bluetooth Status to notify other modules */
        if (vconf_set_int(VCONFKEY_BT_LE_STATUS, VCONFKEY_BT_LE_STATUS_ON) != 0)
                BT_ERR("Set vconf failed\n");
@@ -657,6 +633,8 @@ static int __bt_set_le_enabled(void)
        _bt_send_event(BT_LE_ADAPTER_EVENT, BLUETOOTH_EVENT_LE_ENABLED,
                                g_variant_new("(i)", result));
 
+       __bt_set_local_name();
+
        BT_DBG("-");
        return BLUETOOTH_ERROR_NONE;
 }
@@ -682,7 +660,7 @@ void _bt_set_le_disabled(int result)
 
        /* Send disabled event */
        _bt_send_event(BT_LE_ADAPTER_EVENT, BLUETOOTH_EVENT_LE_DISABLED,
-                       g_variant_new_int32(result));
+                       g_variant_new("(i)", result));
 }
 
 void *_bt_get_adapter_agent(void)
@@ -721,7 +699,7 @@ int _bt_enable_core(void)
        return BLUETOOTH_ERROR_NONE;
 }
 
-#if defined(TIZEN_BT_FLIGHTMODE_ENABLED) || (!defined(TIZEN_WEARABLE) && defined(ENABLE_TIZEN_2_4))
+#if defined(TIZEN_FEATURE_FLIGHTMODE_ENABLED) || (!defined(TIZEN_PROFILE_WEARABLE))
 static void __bt_service_flight_ps_mode_cb(keynode_t *node, void *data)
 {
        gboolean flight_mode = FALSE;
@@ -755,7 +733,7 @@ void _bt_service_register_vconf_handler(void)
 {
        BT_DBG("+");
 
-#ifdef TIZEN_BT_FLIGHTMODE_ENABLED
+#ifdef TIZEN_FEATURE_FLIGHTMODE_ENABLED
        if (vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
                        (vconf_callback_fn)__bt_service_flight_ps_mode_cb, NULL) < 0)
                BT_ERR("Unable to register key handler");
@@ -763,44 +741,39 @@ void _bt_service_register_vconf_handler(void)
        BT_DBG("Telephony is disabled");
 #endif
 
-#ifndef TIZEN_WEARABLE
-#ifdef ENABLE_TIZEN_2_4
+#ifndef TIZEN_PROFILE_WEARABLE
        if (vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE,
                        (vconf_callback_fn)__bt_service_flight_ps_mode_cb, NULL) < 0)
                BT_ERR("Unable to register key handler");
 #endif
-#endif
 }
 
 void _bt_service_unregister_vconf_handler(void)
 {
        BT_DBG("+");
 
-#ifdef TIZEN_BT_FLIGHTMODE_ENABLED
+#ifdef TIZEN_FEATURE_FLIGHTMODE_ENABLED
        vconf_ignore_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
                        (vconf_callback_fn)__bt_service_flight_ps_mode_cb);
 #endif
 
-#ifndef TIZEN_WEARABLE
-#ifdef ENABLE_TIZEN_2_4
+#ifndef TIZEN_PROFILE_WEARABLE
        vconf_ignore_key_changed(VCONFKEY_SETAPPL_PSMODE,
                        (vconf_callback_fn)__bt_service_flight_ps_mode_cb);
 #endif
-#endif
 }
 
 static void __bt_state_event_handler(const char *event_name, bundle *data, void *user_data)
 {
-#ifdef ENABLE_TIZEN_2_4
        const char *bt_status = NULL;
        const char *bt_le_status = NULL;
        BT_DBG("bt state set event(%s) received", event_name);
+
        bt_status = bundle_get_val(data, EVT_KEY_BT_STATE);
        BT_DBG("bt_state: (%s)", bt_status);
 
        bt_le_status = bundle_get_val(data, EVT_KEY_BT_LE_STATE);
        BT_DBG("bt_state: (%s)", bt_le_status);
-#endif
 }
 
 void _bt_handle_adapter_added(void)
@@ -809,23 +782,34 @@ void _bt_handle_adapter_added(void)
        bt_status_t status;
        bt_le_status_t le_status;
        int ret;
-
+/*
        if (timer_id > 0) {
                BT_DBG("g_source is removed");
                g_source_remove(timer_id);
                timer_id = 0;
        }
+*/
 
        status = _bt_adapter_get_status();
        le_status = _bt_adapter_get_le_status();
        BT_DBG("status : %d", status);
        BT_DBG("le_status : %d", le_status);
 
+#ifndef USB_BLUETOOTH
        adapter_agent = _bt_create_agent(BT_ADAPTER_AGENT_PATH, TRUE);
        if (!adapter_agent) {
                BT_ERR("Fail to register agent");
                return;
        }
+#else
+       if (adapter_agent == NULL) {
+               adapter_agent = _bt_create_agent(BT_ADAPTER_AGENT_PATH, TRUE);
+               if (!adapter_agent) {
+                       BT_ERR("Fail to register agent");
+                       return;
+               }
+       }
+#endif
 
        if (_bt_register_media_player() != BLUETOOTH_ERROR_NONE)
                BT_ERR("Fail to register media player");
@@ -833,7 +817,7 @@ void _bt_handle_adapter_added(void)
        if (_bt_register_obex_server() != BLUETOOTH_ERROR_NONE)
                BT_ERR("Fail to init obex server");
 
-#ifdef TIZEN_BT_PAN_NAP_ENABLE
+#ifdef TIZEN_BT_PAN_NAP_ENABLED
        if (_bt_network_activate() != BLUETOOTH_ERROR_NONE)
                BT_ERR("Fail to activate network");
 #endif
@@ -854,11 +838,6 @@ void _bt_handle_adapter_added(void)
                __bt_set_enabled();
                _bt_adapter_set_status(BT_ACTIVATED);
        }
-#ifdef ENABLE_TIZEN_2_4
-       journal_bt_on();
-#endif
-
-       _bt_service_register_vconf_handler();
 
        /* eventsystem */
        if (eventsystem_register_event(SYS_EVENT_BT_STATE, &status_reg_id,
@@ -872,32 +851,45 @@ void _bt_handle_adapter_removed(void)
        int ret;
 
        _bt_adapter_set_status(BT_DEACTIVATED);
-#ifdef ENABLE_TIZEN_2_4
-       journal_bt_off();
-#endif
 
        __bt_visibility_alarm_remove();
 
-       if (visible_timer.alarm_init) {
+       if (alarm_mgr.is_alarm_initialized == TRUE) {
                alarmmgr_fini();
-               visible_timer.alarm_init = FALSE;
+               alarm_mgr.is_alarm_initialized = FALSE;
+               g_list_free_full(alarm_mgr.g_alarm_list, alarm_data_free);
+               alarm_mgr.g_alarm_list = NULL;
        }
 
+#ifdef TIZEN_BT_A2DP_SINK_AUTO_CONNECT
+       _bt_audio_stop_auto_connect();
+#endif
+
        ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_DEVICE_NAME_STR,
                                (vconf_callback_fn)__bt_phone_name_changed_cb);
-       if (0 != ret) {
+       if (0 != ret)
                ERR("vconf_ignore_key_changed failed\n");
-       }
 
+#ifndef USB_BLUETOOTH
        _bt_destroy_agent(adapter_agent);
        adapter_agent = NULL;
 
-       _bt_reliable_terminate_service(NULL);
+       if (is_recovery_mode == TRUE) {
+               /* Send disabled event */
+               _bt_set_disabled(BLUETOOTH_ERROR_NONE);
 
-       if (eventsystem_unregister_event(status_reg_id) != ES_R_OK) {
-               BT_ERR("Fail to unregister system event");
+               /* Will recover BT by bt-core, so set the mode as activating */
+               _bt_adapter_set_status(BT_ACTIVATING);
+               is_recovery_mode = FALSE;
+       } else {
+               _bt_reliable_terminate_service(NULL);
        }
+#else
+       _bt_set_disabled(BLUETOOTH_ERROR_NONE);
+#endif
 
+       if (eventsystem_unregister_event(status_reg_id) != ES_R_OK)
+               BT_ERR("Fail to unregister system event");
 }
 
 static gboolean __bt_enable_timeout_cb(gpointer user_data)
@@ -938,7 +930,9 @@ static gboolean __bt_enable_timeout_cb(gpointer user_data)
        g_variant_unref(result);
        _bt_set_disabled(BLUETOOTH_ERROR_TIMEOUT);
 
+#ifndef USB_BLUETOOTH
        _bt_terminate_service(NULL);
+#endif
 
        return FALSE;
 }
@@ -1026,6 +1020,31 @@ static gboolean __bt_adapter_enabled_cb(gpointer user_data)
 }
 #endif
 
+int _bt_enable_adapter_check_status(void)
+{
+       bt_status_t status = _bt_adapter_get_status();
+       bt_le_status_t le_status = _bt_adapter_get_le_status();
+
+       BT_DBG("");
+
+       if (status == BT_ACTIVATING) {
+               BT_ERR("Enabling in progress");
+               return BLUETOOTH_ERROR_IN_PROGRESS;
+       }
+
+       if (status == BT_ACTIVATED) {
+               BT_ERR("Already enabled");
+               return BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED;
+       }
+
+       if (status == BT_DEACTIVATING || le_status == BT_LE_DEACTIVATING) {
+               BT_ERR("Disabling in progress");
+               return BLUETOOTH_ERROR_DEVICE_BUSY;
+       }
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
 int _bt_enable_adapter(void)
 {
        GDBusProxy *proxy;
@@ -1077,11 +1096,10 @@ int _bt_enable_adapter(void)
        if (le_status == BT_LE_ACTIVATED) {
                BT_INFO("LE Already enabled. Just turn on PSCAN");
                ret = _bt_set_connectable(TRUE);
-               if (ret == BLUETOOTH_ERROR_NONE) {
+               if (ret == BLUETOOTH_ERROR_NONE)
                        _bt_adapter_set_status(BT_ACTIVATED);
-               } else {
+               else
                        return BLUETOOTH_ERROR_INTERNAL;
-               }
        }
 
        result = g_dbus_proxy_call_sync(proxy, "EnableAdapter",
@@ -1089,8 +1107,8 @@ int _bt_enable_adapter(void)
                                         G_DBUS_CALL_FLAGS_NONE, BT_ENABLE_TIMEOUT,
                                         NULL, &error);
         if (error) {
-                BT_ERR("EnableAdapterLe failed: %s", error->message);
-               _bt_adapter_set_status(BT_DEACTIVATED);
+               BT_ERR("EnableAdapterLe failed: %s", error->message);
+               _bt_adapter_set_status(BT_DEACTIVATED);
                g_clear_error(&error);
                error = NULL;
                result = g_dbus_proxy_call_sync(proxy,
@@ -1106,16 +1124,17 @@ int _bt_enable_adapter(void)
                                g_clear_error(&error);
                }
                g_variant_unref(result);
+#ifndef USB_BLUETOOTH
                /* Terminate myself */
                g_idle_add((GSourceFunc)_bt_terminate_service, NULL);
+#endif
                return BLUETOOTH_ERROR_INTERNAL;
        }
        g_variant_unref(result);
-       if (le_status == BT_LE_ACTIVATED) {
+       if (le_status == BT_LE_ACTIVATED)
                __bt_set_enabled();
-       } else {
+       else
                _bt_adapter_start_enable_timer();
-       }
 
        return BLUETOOTH_ERROR_NONE;
 }
@@ -1137,7 +1156,7 @@ static gboolean __bt_disconnect_all(void)
 
        BT_DBG("");
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
 
        device_list = g_array_new(FALSE, FALSE, sizeof(gchar));
 
@@ -1201,6 +1220,7 @@ static gboolean __bt_disconnect_all(void)
        return ret;
 }
 
+#if 0
 static gboolean __bt_set_disabled_timeout_cb(gpointer user_data)
 {
        BT_DBG("");
@@ -1208,17 +1228,21 @@ static gboolean __bt_set_disabled_timeout_cb(gpointer user_data)
 
        return FALSE;
 }
+#endif
 
-int __bt_disable_cb(void)
+int _bt_disable_cb(void)
 {
        FN_START;
        GDBusProxy *proxy;
-       bt_le_status_t le_status;
+#if 0
        int ret;
+#endif
        GVariant *result;
        GError *error = NULL;
 
        _bt_adapter_set_status(BT_DEACTIVATING);
+#if 0
+       bt_le_status_t le_status;
        le_status = _bt_adapter_get_le_status();
        BT_DBG("le_status : %d", le_status);
        if (le_status == BT_LE_ACTIVATED) {
@@ -1238,7 +1262,7 @@ int __bt_disable_cb(void)
                        }
                }
        }
-
+#endif
        proxy = __bt_get_core_proxy();
        retv_if(!proxy, BLUETOOTH_ERROR_INTERNAL);
 
@@ -1264,6 +1288,25 @@ int __bt_disable_cb(void)
        return BLUETOOTH_ERROR_NONE;
 }
 
+int _bt_disable_adapter_check_status(void)
+{
+       bt_status_t status = _bt_adapter_get_status();
+
+       BT_DBG("");
+
+       if (status == BT_DEACTIVATING) {
+               BT_DBG("Disabling in progress");
+               return BLUETOOTH_ERROR_IN_PROGRESS;
+       }
+
+       if (status == BT_DEACTIVATED) {
+               BT_DBG("Already disabled");
+               return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
+       }
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
 int _bt_disable_adapter(void)
 {
        BT_DBG("+");
@@ -1285,7 +1328,7 @@ int _bt_disable_adapter(void)
        }
 
        __bt_disconnect_all();
-       ret = __bt_disable_cb();
+       ret = _bt_disable_cb();
 
        BT_DBG("-");
        return ret;
@@ -1330,6 +1373,8 @@ int _bt_recover_adapter(void)
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
+       is_recovery_mode = TRUE;
+
        g_variant_unref(result);
        __bt_disconnect_all();
 
@@ -1368,9 +1413,8 @@ int _bt_reset_adapter(void)
 
        g_variant_unref(result);
        /* Terminate myself */
-       if (_bt_adapter_get_status() == BT_DEACTIVATED) {
+       if (_bt_adapter_get_status() == BT_DEACTIVATED)
                g_idle_add((GSourceFunc)_bt_terminate_service, NULL);
-       }
 
        return BLUETOOTH_ERROR_NONE;
 }
@@ -1602,11 +1646,10 @@ int _bt_get_local_address(bluetooth_device_address_t *local_address)
        address = g_variant_get_string(temp, NULL);
        BT_DBG("Address:%s", address);
 
-       if (address) {
+       if (address)
                _bt_convert_addr_string_to_type(local_address->addr, address);
-       } else {
+       else
                return BLUETOOTH_ERROR_INTERNAL;
-       }
 
        g_variant_unref(result);
        g_variant_unref(temp);
@@ -1764,9 +1807,9 @@ int _bt_is_service_used(char *service_uuid, gboolean *used)
        GError *error = NULL;
        int ret = BLUETOOTH_ERROR_NONE;
        GVariant *result;
-       GVariant *value;
+       GVariant *temp = NULL;
        GVariantIter *iter = NULL;
-       gchar *uuid;
+       gchar *uuid = NULL;
 
        BT_DBG("+");
        BT_CHECK_PARAMETER(service_uuid, return);
@@ -1793,31 +1836,21 @@ int _bt_is_service_used(char *service_uuid, gboolean *used)
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
-       g_variant_get(result, "(v)", &value);
-       g_variant_get(value, "as", &iter);
-       if (iter == NULL) {
-               BT_ERR("Failed to get UUIDs(%s)", service_uuid);
-               *used = FALSE;
-               g_variant_unref(result);
-               g_variant_unref(value);
-               return ret;
-       }
+       g_variant_get(result, "(v)", &temp);
+       g_variant_get(temp, "as", &iter);
 
-       while (g_variant_iter_loop(iter, "s", &uuid)) {
+       *used = FALSE;
+       while (g_variant_iter_loop(iter, "&s", &uuid)) {
                if (strcasecmp(uuid, service_uuid) == 0) {
                        *used = TRUE;
-                       g_free(uuid);
-                       goto done;
+                       break;
                }
        }
-
-       *used = FALSE;
-
-done:
        g_variant_iter_free(iter);
-       g_variant_unref(value);
        g_variant_unref(result);
+
        BT_DBG("Service Used? %d", *used);
+
        return ret;
 }
 
@@ -2106,12 +2139,19 @@ int _bt_cancel_discovery(void)
                                &error);
 
        if (!result) {
+               int ret = BLUETOOTH_ERROR_INTERNAL;
                if (error != NULL) {
                        BT_ERR("StopDiscovery failed (Error: %s)", error->message);
+
+                       if (g_strrstr(error->message, "No discovery started"))
+                               ret = BLUETOOTH_ERROR_NOT_IN_OPERATION;
+
                        g_clear_error(&error);
-               } else
+               } else {
                        BT_ERR("StopDiscovery failed");
-               return BLUETOOTH_ERROR_INTERNAL;
+               }
+
+               return ret;
        }
 
        cancel_by_user = TRUE;
@@ -2198,7 +2238,7 @@ int _bt_set_connectable(gboolean is_connectable)
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
-       BT_INFO("Set connectable [%d]", is_connectable);
+       BT_INFO("### Set connectable [%d]", is_connectable);
        g_variant_unref(result);
        return BLUETOOTH_ERROR_NONE;
 }
@@ -2330,6 +2370,8 @@ static bluetooth_device_info_t *__bt_parse_device_info(GVariantIter *item_iter)
                                g_strlcpy(dev_info->device_name.name, alias,
                                                BLUETOOTH_DEVICE_NAME_LENGTH_MAX+1);
                        }
+               } else if (!g_strcmp0(key, "IsAliasSet")) {
+                       dev_info->is_alias_set = g_variant_get_boolean(value);
                } else if (!g_strcmp0(key, "Connected")) {
                        dev_info->connected = g_variant_get_byte(value);
                } else if (!g_strcmp0(key, "Paired")) {
@@ -2367,14 +2409,12 @@ static bluetooth_device_info_t *__bt_parse_device_info(GVariantIter *item_iter)
                } else if (strcasecmp(key, "ManufacturerData") == 0) {
                        manufacturer_data = g_byte_array_new();
                        g_variant_get(value, "ay", &char_value_iter);
-
                        while (g_variant_iter_loop(char_value_iter, "y",  &char_value))
                                g_byte_array_append(manufacturer_data, &char_value, 1);
 
                        if (manufacturer_data) {
-                               if (manufacturer_data->len > 0) {
+                               if (manufacturer_data->len > 0)
                                        memcpy(dev_info->manufacturer_data.data, manufacturer_data->data, manufacturer_data->len);
-                               }
                        }
                        g_variant_iter_free(char_value_iter);
                        g_byte_array_free(manufacturer_data, TRUE);
@@ -2430,7 +2470,7 @@ int _bt_get_bonded_devices(GArray **dev_list)
        GVariantIter *iter = NULL;
        GError *error = NULL;
 
-       conn = _bt_get_system_conn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        manager_proxy = _bt_get_manager_proxy();
@@ -2463,6 +2503,114 @@ int _bt_get_bonded_devices(GArray **dev_list)
        return BLUETOOTH_ERROR_NONE;
 }
 
+int _bt_get_profile_connected_devices(char *profile_uuid, GArray **addr_list)
+{
+       BT_DBG("+");
+       GDBusConnection *conn;
+       GDBusProxy *manager_proxy;
+       GVariant *result = NULL;
+       GVariant *result1 = NULL;
+       GVariantIter *iter = NULL;
+       GError *error = NULL;
+       char *object_path = NULL;
+       GVariantIter *interface_iter;
+       char *interface_str = NULL;
+       GDBusProxy *device_proxy = NULL;
+       gboolean is_connected = FALSE;
+
+       conn = _bt_gdbus_get_system_gconn();
+       retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       manager_proxy = _bt_get_manager_proxy();
+       retv_if(manager_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       result = g_dbus_proxy_call_sync(manager_proxy, "GetManagedObjects",
+                               NULL,
+                               G_DBUS_CALL_FLAGS_NONE,
+                               -1,
+                               NULL,
+                               NULL);
+
+       if (!result) {
+               if (error != NULL) {
+                       BT_ERR("Failed to GetManagedObjects (Error: %s)", error->message);
+                       g_clear_error(&error);
+                       error = NULL;
+               } else
+                       BT_ERR("Failed to Failed to GetManagedObjects");
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       /* signature of GetManagedObjects:  a{oa{sa{sv}}} */
+       g_variant_get(result, "(a{oa{sa{sv}}})", &iter);
+
+       /* Parse the signature:  oa{sa{sv}}} */
+       while (g_variant_iter_loop(iter, "{&oa{sa{sv}}}", &object_path, &interface_iter)) {
+               if (object_path == NULL)
+                       continue;
+
+               while (g_variant_iter_loop(interface_iter, "{sa{sv}}",
+                               &interface_str, NULL)) {
+                       if (g_strcmp0(interface_str, "org.bluez.Device1") == 0) {
+                               BT_DBG("Found a device: %s", object_path);
+                               g_free(interface_str);
+
+                               device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+                                                                                       NULL, BT_BLUEZ_NAME,
+                                                                                       object_path, BT_DEVICE_INTERFACE,  NULL, NULL);
+
+                               if (device_proxy == NULL) {
+                                       BT_DBG("Device don't have this service");
+                                       break;
+                               }
+
+                               result1 = g_dbus_proxy_call_sync(device_proxy, "IsConnectedProfile",
+                                                       g_variant_new("(s)", profile_uuid),
+                                                       G_DBUS_CALL_FLAGS_NONE,
+                                                       -1,
+                                                       NULL,
+                                                       &error);
+
+                               if (result1 == NULL) {
+                                       BT_ERR("Error occured in Proxy call");
+                                       if (error) {
+                                               BT_ERR("Error occured in Proxy call [%s]\n", error->message);
+                                               g_error_free(error);
+                                               error = NULL;
+                                       }
+                                       g_object_unref(device_proxy);
+                                       break;
+                               }
+                               g_variant_get(result1, "(b)", &is_connected);
+
+                               if (is_connected == TRUE) {
+                                       char address[BT_ADDRESS_STRING_SIZE];
+                                       bluetooth_device_address_t *addr = NULL;
+
+                                       _bt_convert_device_path_to_address(object_path, address);
+
+                                       addr = g_malloc0(sizeof(bluetooth_device_address_t));
+                                       _bt_convert_addr_string_to_type(addr->addr, address);
+
+                                       g_array_append_vals(*addr_list, addr,
+                                                       sizeof(bluetooth_device_address_t));
+                               }
+
+                               g_variant_unref(result1);
+                               g_object_unref(device_proxy);
+
+                               break;
+                       }
+               }
+       }
+
+       g_variant_unref(result);
+       g_variant_iter_free(iter);
+
+       BT_DBG("-");
+       return BLUETOOTH_ERROR_NONE;
+}
+
 int _bt_get_bonded_device_info(bluetooth_device_address_t *device_address,
                                bluetooth_device_info_t *dev_info)
 {
@@ -2489,6 +2637,75 @@ int _bt_get_bonded_device_info(bluetooth_device_address_t *device_address,
        return ret;
 }
 
+int _bt_is_alias_set(bluetooth_device_address_t *device_address, gboolean *is_alias_set)
+{
+       char *object_path = NULL;
+       char address[BT_ADDRESS_STRING_SIZE] = { 0 };
+       gboolean alias_set = FALSE;
+
+       GDBusConnection *conn;
+       GDBusProxy *device_proxy;
+       GError *error = NULL;
+       GVariant *result = NULL;
+       GVariant *temp = NULL;
+
+
+       BT_CHECK_PARAMETER(device_address, return);
+       BT_CHECK_PARAMETER(is_alias_set, return);
+
+       _bt_convert_addr_type_to_string(address, device_address->addr);
+
+       object_path = _bt_get_device_object_path(address);
+       retv_if(object_path == NULL, BLUETOOTH_ERROR_NOT_PAIRED);
+
+       conn = _bt_gdbus_get_system_gconn();
+       if (conn == NULL) {
+               g_free(object_path);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+                       NULL,
+                       BT_BLUEZ_NAME,
+                       object_path,
+                       BT_PROPERTIES_INTERFACE,
+                       NULL, NULL);
+       if (device_proxy == NULL) {
+               g_free(object_path);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       result = g_dbus_proxy_call_sync(device_proxy, "Get",
+                       g_variant_new("(ss)", BT_DEVICE_INTERFACE, "IsAliasSet"),
+                       G_DBUS_CALL_FLAGS_NONE,
+                       -1,
+                       NULL,
+                       &error);
+
+       if (!result) {
+               BT_ERR("Error occured in Proxy call");
+               if (error != NULL) {
+                       BT_ERR("Getting is_alias_set property failed: [%s]\n", error->message);
+                       g_error_free(error);
+               }
+               g_object_unref(device_proxy);
+               g_free(object_path);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       g_variant_get(result, "(v)", &temp);
+       alias_set = g_variant_get_boolean(temp);
+       *is_alias_set = alias_set;
+       BT_DBG("address: [%s] | *is_alias_set: %s", address, *is_alias_set ? "TRUE" : "FALSE");
+       g_variant_unref(temp);
+       g_variant_unref(result);
+       g_object_unref(device_proxy);
+
+       g_free(object_path);
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
 int _bt_get_timeout_value(int *timeout)
 {
        time_t current_time;
@@ -2546,6 +2763,47 @@ int _bt_set_le_privacy(gboolean set_privacy)
        return BLUETOOTH_ERROR_NONE;
 }
 
+int _bt_set_le_static_random_address(gboolean is_enable)
+{
+       GDBusProxy *proxy;
+       GError *error = NULL;
+       GVariant *result = NULL;
+
+       if (__bt_is_factory_test_mode()) {
+               BT_ERR("Unable to set le random address in factory binary !!");
+               return BLUETOOTH_ERROR_NOT_SUPPORT;
+       }
+
+       if (_bt_adapter_get_status() != BT_ACTIVATED &&
+               _bt_adapter_get_le_status() != BT_LE_ACTIVATED) {
+               return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
+       }
+
+       proxy = _bt_get_adapter_proxy();
+       retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       result = g_dbus_proxy_call_sync(proxy,
+                               "SetLeStaticRandomAddress",
+                               g_variant_new("(b)", is_enable),
+                               G_DBUS_CALL_FLAGS_NONE,
+                               -1,
+                               NULL,
+                               &error);
+
+       if (!result) {
+               if (error != NULL) {
+                       BT_ERR("Failed to SetLeStaticRandomAddress (Error: %s)", error->message);
+                       g_clear_error(&error);
+               } else
+                       BT_ERR("Failed to SetLeStaticRandomAddress");
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       g_variant_unref(result);
+       BT_INFO("SetLeStaticRandomAddress as %d", is_enable);
+       return BLUETOOTH_ERROR_NONE;
+}
+
 int _bt_set_manufacturer_data(bluetooth_manufacturer_data_t *m_data)
 {
        GDBusProxy *proxy;
@@ -2567,9 +2825,8 @@ int _bt_set_manufacturer_data(bluetooth_manufacturer_data_t *m_data)
 
        builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
 
-       for (i = 0; i < (m_data->data_len) + 2; i++) {
+       for (i = 0; i < (m_data->data_len) + 2; i++)
                g_variant_builder_add(builder, "y", m_data->data[i]);
-       }
 
        val = g_variant_new("(ay)", builder);
 
@@ -2592,9 +2849,8 @@ int _bt_set_manufacturer_data(bluetooth_manufacturer_data_t *m_data)
        }
        builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
 
-       for (i = 0; i < (m_data->data_len) + 2; i++) {
+       for (i = 0; i < (m_data->data_len) + 2; i++)
                g_variant_builder_add(builder, "y", m_data->data[i]);
-       }
 
        val = g_variant_new("(ay)", builder);
 
@@ -2610,6 +2866,179 @@ int _bt_set_manufacturer_data(bluetooth_manufacturer_data_t *m_data)
        return BLUETOOTH_ERROR_NONE;
 }
 
+
+int _bt_service_set_alarm(int timeout, bt_set_alarm_cb call_back, void *user_data, alarm_id_t *alarm_id)
+{
+       int result = BLUETOOTH_ERROR_NONE;
+       bt_service_alarm_t *alarm = NULL;
+
+       if (!call_back || !alarm_id)
+               return BLUETOOTH_ERROR_INVALID_PARAM;
+
+       if (!alarm_mgr.is_alarm_initialized) {
+               result = alarmmgr_init("bt-service");
+               if (result != 0) {
+                       BT_ERR("Failed to initialize alarm = %d", result);
+                       result = BLUETOOTH_ERROR_INTERNAL;
+                       goto finish;
+               }
+               result = alarmmgr_set_cb(alarm_cb, NULL);
+               if (result != 0) {
+                       BT_ERR("Failed to set the callback = %d", result);
+                       result = BLUETOOTH_ERROR_INTERNAL;
+                       goto finish;
+               }
+               alarm_mgr.is_alarm_initialized = TRUE;
+       }
+
+       alarm = g_malloc0(sizeof(bt_service_alarm_t));
+       if (!alarm)
+               return BLUETOOTH_ERROR_MEMORY_ALLOCATION;
+
+       result = alarmmgr_add_alarm(ALARM_TYPE_VOLATILE, timeout,
+                                               0, NULL, alarm_id);
+       if (result != 0) {
+               BT_ERR("Failed to create alarm error = %d", result);
+               result = BLUETOOTH_ERROR_INTERNAL;
+               g_free(alarm);
+               goto finish;
+       }
+       alarm->alarm_id = *alarm_id;
+       alarm->callback = call_back;
+       alarm->user_data = user_data;
+
+       alarm_mgr.g_alarm_list = g_list_append(alarm_mgr.g_alarm_list, alarm);
+       result = BLUETOOTH_ERROR_NONE;
+finish:
+       return result;
+}
+
+static int alarm_cb(alarm_id_t alarm_id, void* user_param)
+{
+       GList *node = NULL;
+       bt_service_alarm_t *p_data;
+       bt_set_alarm_cb callback = NULL;
+       void *user_data = NULL;
+
+       node = g_list_find_custom(alarm_mgr.g_alarm_list,
+                       GINT_TO_POINTER(alarm_id), compare_alarm);
+       if (!node)
+               return 0;
+
+       p_data = (bt_service_alarm_t *)node->data;
+       alarm_mgr.g_alarm_list = g_list_delete_link(alarm_mgr.g_alarm_list,
+                       node);
+
+       if (!p_data)
+               return 0;
+
+       callback = p_data->callback;
+       user_data = p_data->user_data;
+       g_free(p_data);
+
+       if (callback)
+               callback(alarm_id, user_data);
+
+       return 0;
+}
+
+int _bt_service_remove_alarm(alarm_id_t alarm_id)
+{
+       GList *list = NULL;
+       bt_service_alarm_t *p_data;
+       list = g_list_find_custom(alarm_mgr.g_alarm_list, GINT_TO_POINTER(alarm_id), compare_alarm);
+
+       if (list != NULL) {
+               alarmmgr_remove_alarm(alarm_id);
+               p_data = (bt_service_alarm_t *)list->data;
+               alarm_mgr.g_alarm_list = g_list_remove(alarm_mgr.g_alarm_list, list->data);
+               g_free(p_data);
+       }
+
+       return 0;
+}
+
+gint compare_alarm(gconstpointer list_data, gconstpointer data)
+{
+       alarm_id_t alarm_id = (alarm_id_t)data;
+       bt_service_alarm_t *p_data = (bt_service_alarm_t *)list_data;
+
+       if (p_data->alarm_id == alarm_id)
+               return 0;
+
+       return 1;
+}
+
+static void alarm_data_free(void *data)
+{
+       bt_service_alarm_t *p_data = (bt_service_alarm_t *)data;
+       g_free(p_data);
+       return;
+}
+
+static gboolean _bt_adapter_request_delayed_cb(gpointer user_data)
+{
+       int result;
+       int function = (int)user_data;
+
+       switch (function) {
+       case BT_ENABLE_ADAPTER:
+               result = _bt_enable_adapter();
+               if (result != BLUETOOTH_ERROR_NONE) {
+                       BT_ERR("_bt_enable_adapter is failed");
+                       /* Send enabled event to API */
+                       _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_ENABLED,
+                                       g_variant_new("(i)", result));
+               }
+               break;
+       case BT_DISABLE_ADAPTER:
+               result = _bt_disable_adapter();
+               if (result != BLUETOOTH_ERROR_NONE) {
+                       BT_ERR("_bt_disable_adapter is failed");
+                       /* Send disabled event to API */
+                       _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_DISABLED,
+                                       g_variant_new("(i)", result));
+               }
+               break;
+       default:
+               BT_ERR("function is NOT matched");
+               break;
+       }
+
+       return FALSE;
+}
+
+int _bt_adapter_request_delayed(int function)
+{
+       int ret;
+
+       switch (function) {
+       case BT_ENABLE_ADAPTER:
+               ret = _bt_enable_adapter_check_status();
+               if (ret == BLUETOOTH_ERROR_NONE)
+                       _bt_adapter_set_status(BT_ACTIVATING);
+               else
+                       return ret;
+
+               break;
+       case BT_DISABLE_ADAPTER:
+               ret = _bt_disable_adapter_check_status();
+               if (ret == BLUETOOTH_ERROR_NONE)
+                       _bt_adapter_set_status(BT_DEACTIVATING);
+               else
+                       return ret;
+
+               break;
+       default:
+               BT_ERR("function is NOT matched");
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       g_idle_add((GSourceFunc)_bt_adapter_request_delayed_cb, (void*)function);
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
 #ifdef TIZEN_TV
 int _bt_get_enable_timer_id(void)
 {
index c65d602..bda1d43 100644 (file)
 #include <string.h>
 #include <malloc.h>
 #include <stacktrim.h>
-
-#if defined(LIBNOTIFY_SUPPORT)
-#include "bt-popup.h"
-#elif defined(LIBNOTIFICATION_SUPPORT)
-#include "bt-service-agent-notification.h"
-#else
 #include <syspopup_caller.h>
-#endif
-
 #include <vconf.h>
 #include <bundle_internal.h>
 
-#ifdef TIZEN_NETWORK_TETHERING_ENABLE
+#ifdef TIZEN_FEATURE_NETWORK_TETHERING_ENABLE
 #include <tethering.h>
 #endif
 
 #define GN_UUID "00001117-0000-1000-8000-00805f9b34fb"
 #define BNEP_UUID "0000000f-0000-1000-8000-00805f9b34fb"
 #define HID_UUID "00001124-0000-1000-8000-00805f9b34fb"
+#define HID_DEVICE_UUID                "00001124-0000-1000-8000-00805f9b43bf"
 #define SAP_UUID_OLD "a49eb41e-cb06-495c-9f4f-bb80a90cdf00"
 #define SAP_UUID_NEW "a49eb41e-cb06-495c-9f4f-aa80a90cdf4a"
+#define IOTIVITY_UUID "12341234-1C25-481F-9DFB-59193D238280"
 
 #define BT_AGENT_OBJECT "/org/bluez/agent/frwk_agent"
 
 #define BT_AGENT_SIGNAL_RFCOMM_AUTHORIZE "RfcommAuthorize"
 #define BT_AGENT_SIGNAL_OBEX_AUTHORIZE "ObexAuthorize"
 
-#define BT_PIN_MAX_LENGTH 16
 #define BT_PASSKEY_MAX_LENGTH 4
 
 #define BT_AGENT_SYSPOPUP_TIMEOUT_FOR_MULTIPLE_POPUPS 200
 #define BT_AGENT_SYSPOPUP_MAX_ATTEMPT 3
 #define BT_PAN_MAX_CONNECTION 4
+
 extern guint nap_connected_device_count;
 
+static char *passkey_watcher = NULL;
+
 #define G_VARIANT_UNREF(variant) \
        g_variant_unref(variant); \
        variant = NULL
 
-static gboolean syspopup_mode = TRUE;
-
 static int __bt_agent_is_auto_response(uint32_t dev_class, const gchar *address,
                                                        const gchar *name);
 static gboolean __bt_agent_is_hid_keyboard(uint32_t dev_class);
@@ -103,7 +97,6 @@ static void __bt_agent_release_memory(void)
        /* Release Stack Memory*/
        stack_trim();
 }
-
 static gboolean __bt_agent_system_popup_timer_cb(gpointer user_data)
 {
        int ret;
@@ -112,13 +105,8 @@ static gboolean __bt_agent_system_popup_timer_cb(gpointer user_data)
        retv_if(user_data == NULL, FALSE);
 
        ++retry_count;
-#if defined(LIBNOTIFY_SUPPORT)
-        ret = notify_launch(b);
-#elif defined(LIBNOTIFICATION_SUPPORT)
-        ret = notification_launch(b);
-#else
-        ret = syspopup_launch("bt-syspopup", b);
-#endif
+
+       ret = syspopup_launch("bt-syspopup", b);
        if (ret < 0) {
                BT_ERR("Sorry! Can't launch popup, ret=%d, Re-try[%d] time..",
                                                        ret, retry_count);
@@ -137,113 +125,9 @@ static gboolean __bt_agent_system_popup_timer_cb(gpointer user_data)
        return (ret < 0) ? TRUE : FALSE;
 }
 
-#ifdef TIZEN_WEARABLE
-static void __bt_popup_event_filter(GDBusConnection *connection,
-               const gchar *sender_name,
-               const gchar *object_path,
-               const gchar *interface_name,
-               const gchar *signal_name,
-               GVariant *parameters,
-               gpointer user_data)
-{
-       BT_DBG("Sender Name[%s] Object Path[%s] Interface[%s] Signal[%s]",
-                       sender_name, object_path, interface_name, signal_name);
-
-       if (g_strcmp0(interface_name, "User.Bluetooth.syspopup") == 0 &&
-                       g_strcmp0(signal_name, "ResetResponse") == 0) {
-               int response;
-
-               g_variant_get(parameters, "(i)", &response);
-               BT_DBG("response = %d", response);
-       }
-}
-
-int __bt_service_subscribe_popup(GDBusConnection *conn,
-               gboolean subscribe)
-{
-       static guint subs_interface_added_id = 0;
-
-       if (conn == NULL)
-               return BLUETOOTH_ERROR_INVALID_PARAM;
-
-       if (subscribe) {
-               if (subs_interface_added_id == 0) {
-                       subs_interface_added_id = g_dbus_connection_signal_subscribe(conn,
-                                       NULL, "User.Bluetooth.syspopup", "ResetResponse", NULL, NULL, 0,
-                                       __bt_popup_event_filter, NULL, NULL);
-               }
-       } else {
-               if (subs_interface_added_id > 0) {
-                       g_dbus_connection_signal_unsubscribe(conn,
-                                       subs_interface_added_id);
-                       subs_interface_added_id = 0;
-               }
-       }
-       return BLUETOOTH_ERROR_NONE;
-}
-
-static void  __bt_register_popup_event_signal(void)
-{
-       GDBusConnection *conn;
-
-       BT_DBG("+\n");
-
-       conn = _bt_get_system_gconn();
-       if (conn == NULL)
-               return;
-
-       __bt_service_subscribe_popup(conn, TRUE);
-
-       BT_DBG("-\n");
-       return;
-}
-
-static gboolean __is_reset_required(const gchar *address)
-{
-       GArray *device_list;
-       uint32_t no_of_device;
-       uint32_t i;
-       bluetooth_device_info_t info;
-       gboolean is_required = FALSE;
-
-       device_list = g_array_new(FALSE, FALSE, sizeof(gchar));
-       if (device_list == NULL) {
-               BT_ERR("g_array_new is failed");
-               return FALSE;
-       }
-
-       if (_bt_get_bonded_devices(&device_list) != BLUETOOTH_ERROR_NONE) {
-               BT_ERR("_bt_get_bonded_devices is failed");
-               g_array_free(device_list, TRUE);
-               return FALSE;
-       }
-
-       no_of_device = device_list->len / sizeof(bluetooth_device_info_t);
-       for (i = 0; i < no_of_device; i++) {
-               char addr[BT_ADDRESS_STRING_SIZE] = { 0 };
-
-               info = g_array_index(device_list, bluetooth_device_info_t, i);
-
-               _bt_convert_addr_type_to_string(addr, info.device_address.addr);
-               if (g_strcmp0(address, addr) == 0) {
-                       BT_DBG("This device is already in paired list");
-                       is_required = FALSE;
-                       break;
-               }
-
-               if (info.device_class.major_class != BLUETOOTH_DEVICE_MAJOR_CLASS_AUDIO) {
-                       is_required = TRUE;
-                       break;
-               }
-       }
-       g_array_free(device_list, TRUE);
-
-       return is_required;
-}
-#endif
-
 int _bt_launch_system_popup(bt_agent_event_type_t event_type,
                                                        const char *device_name,
+                                                       const unsigned char *auth_info,
                                                        char *passkey,
                                                        const char *filename,
                                                        const char *agent_path)
@@ -259,6 +143,7 @@ int _bt_launch_system_popup(bt_agent_event_type_t event_type,
        }
 
        bundle_add(b, "device-name", device_name);
+       bundle_add(b, "auth-info", (const char *)auth_info);
        bundle_add(b, "passkey", passkey);
        bundle_add(b, "file", filename);
        bundle_add(b, "agent-path", agent_path);
@@ -273,11 +158,6 @@ int _bt_launch_system_popup(bt_agent_event_type_t event_type,
                                                sizeof(event_str));
                break;
 
-       case BT_AGENT_EVENT_PASSKEY_AUTO_ACCEPTED:
-               g_strlcpy(event_str, "passkey-auto-accepted",
-                                               sizeof(event_str));
-               break;
-
        case BT_AGENT_EVENT_PASSKEY_REQUEST:
                g_strlcpy(event_str, "passkey-request", sizeof(event_str));
                break;
@@ -322,13 +202,6 @@ int _bt_launch_system_popup(bt_agent_event_type_t event_type,
                g_strlcpy(event_str, "message-request", sizeof(event_str));
                break;
 
-#ifdef TIZEN_WEARABLE
-       case BT_AGENT_EVENT_SYSTEM_RESET_REQUEST:
-               __bt_register_popup_event_signal();
-               g_strlcpy(event_str, "system-reset-request", sizeof(event_str));
-               break;
-#endif
-
        case BT_AGENT_EVENT_LEGACY_PAIR_FAILED_FROM_REMOTE:
                g_strlcpy(event_str, "remote-legacy-pair-failed", sizeof(event_str));
                break;
@@ -342,9 +215,7 @@ int _bt_launch_system_popup(bt_agent_event_type_t event_type,
 
        bundle_add(b, "event-type", event_str);
 
-#if !defined(LIBNOTIFY_SUPPORT) && !defined(LIBNOTIFICATION_SUPPORT)
        ret = syspopup_launch("bt-syspopup", b);
-#endif
        if (0 > ret) {
                BT_ERR("Popup launch failed...retry %d", ret);
 
@@ -383,13 +254,13 @@ static GVariant *__bt_service_getall(GDBusProxy *device, const char *interface)
 static gboolean __pincode_request(GapAgentPrivate *agent, GDBusProxy *device)
 {
        uint32_t device_class;
-       const gchar *address;
-       const gchar *name;
+       gchar *address = NULL;
+       unsigned char auth_info[5] = {0, };
+       gchar *name = NULL;
        GVariant *reply = NULL;
        GVariant *reply_temp = NULL;
        GVariant *tmp_value;
-       GVariant *param;
-       int result = BLUETOOTH_ERROR_NONE;
+       char pin_code[BLUETOOTH_PIN_CODE_MAX_LENGTH + 1];
 
        BT_DBG("+");
 
@@ -427,9 +298,19 @@ static gboolean __pincode_request(GapAgentPrivate *agent, GDBusProxy *device)
        tmp_value = g_variant_lookup_value(reply, "Name", G_VARIANT_TYPE_STRING);
        g_variant_get(tmp_value, "s", &name);
        G_VARIANT_UNREF(tmp_value);
-       if (!name)
-               name = address;
+       if (!name) {
+               BT_DBG("Replacing the name with address");
+               name = g_strdup(address);
+       } else {
+               BT_INFO("Name = %s, Address = %s, Class = 0x%x", name, address, device_class);
+               if (name[0] == '\0') {
+                       g_free(name);
+                       BT_DBG("Name[0]=NULL, Replacing the name with address");
+                       name = g_strdup(address);
+               }
+       }
 
+       __bt_get_auth_info(reply, (char *)auth_info);
        if (_bt_is_device_creating() == TRUE &&
                _bt_is_bonding_device_address(address) == TRUE &&
                __bt_agent_is_auto_response(device_class, address, name)) {
@@ -452,40 +333,26 @@ static gboolean __pincode_request(GapAgentPrivate *agent, GDBusProxy *device)
                gap_agent_reply_pin_code(agent, GAP_AGENT_ACCEPT,
                                                        str_passkey, NULL);
 
-#ifdef AUTO_ACCEPT
-               gap_agent_reply_pin_code(agent, GAP_AGENT_ACCEPT, "0000",
-                                                                                       NULL);
-#else
-               if (syspopup_mode) {
-                       BT_DBG("LAUNCH SYSPOPUP");
-                       _bt_launch_system_popup(BT_AGENT_EVENT_KEYBOARD_PASSKEY_REQUEST,
-                                       name, str_passkey, NULL,
-                                       _gap_agent_get_path(agent));
-               } else {
-                       BT_DBG("Send BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY");
-                       param = g_variant_new("(isss)", result, address, name, str_passkey);
-                       _bt_send_event(BT_ADAPTER_EVENT,
-                                       BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY, param);
-               }
-#endif
+               _bt_launch_system_popup(BT_AGENT_EVENT_KEYBOARD_PASSKEY_REQUEST,
+                                               name, auth_info, str_passkey, NULL,
+                                               _gap_agent_get_path(agent));
+       } else if (_bt_get_device_pin_code(address, pin_code)
+                               == BLUETOOTH_ERROR_NONE) {
+               BT_DBG("Use stored PIN code(%s)", pin_code);
+               gap_agent_reply_pin_code(agent, GAP_AGENT_ACCEPT, pin_code,
+                                                                       NULL);
+               goto done;
        } else {
                BT_DBG("Show Pin entry");
-
-               if (syspopup_mode) {
-                       BT_DBG("LAUNCH SYSPOPUP");
-                       _bt_launch_system_popup(BT_AGENT_EVENT_PIN_REQUEST, name, NULL,
-                                       NULL, _gap_agent_get_path(agent));
-               } else {
-                       BT_DBG("Send BLUETOOTH_EVENT_PIN_REQUEST");
-                       param = g_variant_new("(iss)", result, address, name);
-                       _bt_send_event(BT_ADAPTER_EVENT,
-                                       BLUETOOTH_EVENT_PIN_REQUEST, param);
-               }
+               _bt_launch_system_popup(BT_AGENT_EVENT_PIN_REQUEST, name, auth_info,
+                                       NULL, NULL, _gap_agent_get_path(agent));
        }
 
 done:
        g_variant_unref(reply);
        g_variant_unref(reply_temp);
+       g_free(address);
+       g_free(name);
        __bt_agent_release_memory();
        BT_DBG("-");
 
@@ -494,8 +361,9 @@ done:
 
 static gboolean __passkey_request(GapAgentPrivate *agent, GDBusProxy *device)
 {
-       const gchar *address;
-       const gchar *name;
+       gchar *address = NULL;
+       gchar *name = NULL;
+       unsigned char auth_info[5] = {0, };
        GVariant *reply = NULL;
        GVariant *reply_temp = NULL;
        GVariant *tmp_value;
@@ -532,30 +400,18 @@ static gboolean __passkey_request(GapAgentPrivate *agent, GDBusProxy *device)
        g_variant_get(tmp_value, "s", &name);
        G_VARIANT_UNREF(tmp_value);
        if (!name)
-               name = address;
-
-#ifdef AUTO_ACCEPT
-       gap_agent_reply_pin_code(agent, GAP_AGENT_ACCEPT, "0000",
-                                                                               NULL);
-#else
-       if (syspopup_mode) {
-               BT_DBG("LAUNCH SYSPOPUP");
-               _bt_launch_system_popup(BT_AGENT_EVENT_PASSKEY_REQUEST, name, NULL, NULL,
-                                       _gap_agent_get_path(agent));
-       } else {
-               int result = BLUETOOTH_ERROR_NONE;
-               GVariant *param;
+               name = g_strdup(address);
 
-               BT_DBG("Send BLUETOOTH_EVENT_PASSKEY_REQUEST");
-               param = g_variant_new("(iss)", result, address, name);
-               _bt_send_event(BT_ADAPTER_EVENT,
-                               BLUETOOTH_EVENT_PASSKEY_REQUEST, param);
-       }
-#endif
+       __bt_get_auth_info(reply, (char *)auth_info);
+
+       _bt_launch_system_popup(BT_AGENT_EVENT_PASSKEY_REQUEST, name, auth_info,
+                                               NULL, NULL, _gap_agent_get_path(agent));
 
 done:
        g_variant_unref(reply);
        g_variant_unref(reply_temp);
+       g_free(address);
+       g_free(name);
        __bt_agent_release_memory();
 
        BT_DBG("-");
@@ -565,8 +421,9 @@ done:
 static gboolean __display_request(GapAgentPrivate *agent, GDBusProxy *device,
                                                                guint passkey)
 {
-       const gchar *address;
-       const gchar *name;
+       gchar *address = NULL;
+       gchar *name = NULL;
+       unsigned char auth_info[5] = {0, };
        char *str_passkey;
        GVariant *reply = NULL;
        GVariant *reply_temp = NULL;
@@ -595,35 +452,34 @@ static gboolean __display_request(GapAgentPrivate *agent, GDBusProxy *device,
        g_variant_get(tmp_value, "s", &name);
        G_VARIANT_UNREF(tmp_value);
        if (!name)
-               name = address;
+               name = g_strdup(address);
 
-       str_passkey = g_strdup_printf("%d", passkey);
+       __bt_get_auth_info(reply, (char *)auth_info);
 
-#ifdef AUTO_ACCEPT
-       gap_agent_reply_pin_code(agent, GAP_AGENT_ACCEPT, str_passkey,
-                                                                               NULL);
-#else
-       if (syspopup_mode) {
-               BT_DBG("LAUNCH SYSPOPUP");
-               _bt_launch_system_popup(BT_AGENT_EVENT_KEYBOARD_PASSKEY_REQUEST, name,
-                               str_passkey, NULL,
-                               _gap_agent_get_path(agent));
-       } else {
-               int result = BLUETOOTH_ERROR_NONE;
-               GVariant *param;
+       str_passkey = g_strdup_printf("%06d", passkey);
 
-               BT_DBG("Send BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY");
-               param = g_variant_new("(isss)", result, address, name, str_passkey);
-               _bt_send_event(BT_ADAPTER_EVENT,
-                               BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY, param);
+       if (passkey_watcher) {
+               GVariant *param = NULL;
+
+               BT_INFO("Send passkey to %s", passkey_watcher);
+
+               param = g_variant_new("(ss)", address, str_passkey);
+
+               _bt_send_event_to_dest(passkey_watcher, BT_ADAPTER_EVENT,
+                               BLUETOOTH_EVENT_PASSKEY_NOTIFICATION, param);
+       } else {
+               _bt_launch_system_popup(BT_AGENT_EVENT_KEYBOARD_PASSKEY_REQUEST, name,
+                                               auth_info, str_passkey, NULL,
+                                               _gap_agent_get_path(agent));
        }
 
-#endif
        g_free(str_passkey);
 
 done:
        g_variant_unref(reply);
        g_variant_unref(reply_temp);
+       g_free(address);
+       g_free(name);
        __bt_agent_release_memory();
 
        BT_DBG("-");
@@ -633,8 +489,9 @@ done:
 static gboolean __confirm_request(GapAgentPrivate *agent, GDBusProxy *device,
                                                                guint passkey)
 {
-       const gchar *address;
-       const gchar *name;
+       gchar *address = NULL;
+       gchar *name = NULL;
+       unsigned char auth_info[5] = {0, };
        char str_passkey[7];
        GVariant *reply_temp = NULL;
        GVariant *reply = NULL;
@@ -675,61 +532,19 @@ static gboolean __confirm_request(GapAgentPrivate *agent, GDBusProxy *device,
        g_variant_get(tmp_value, "s", &name);
        G_VARIANT_UNREF(tmp_value);
        if (!name)
-               name = address;
-
-#ifdef TIZEN_WEARABLE
-       uint32_t device_class = 0x00;
-       uint32_t major_class;
-
-       tmp_value = g_variant_lookup_value(reply, "Class", G_VARIANT_TYPE_UINT32);
-       g_variant_get(tmp_value, "u", &device_class);
-       G_VARIANT_UNREF(tmp_value);
-
-       major_class = (device_class & 0x1f00) >> 8;
-
-       if (major_class == BLUETOOTH_DEVICE_MAJOR_CLASS_AUDIO) {
-               BT_DBG("Audio device. Launch passkey pop-up");
-               _bt_launch_system_popup(BT_AGENT_EVENT_PASSKEY_CONFIRM_REQUEST, name,
-                               str_passkey, NULL, _gap_agent_get_path(agent));
-               goto done;
-       }
+               name = g_strdup(address);
+       __bt_get_auth_info(reply, (char *)auth_info);
 
-       if (__is_reset_required(address)) {
-               BT_INFO("Launch system reset pop-up");
-               _bt_launch_system_popup(BT_AGENT_EVENT_SYSTEM_RESET_REQUEST, name,
-                               NULL, NULL, _gap_agent_get_path(agent));
-       } else {
-               BT_INFO("Launch passkey pop-up");
-               _bt_launch_system_popup(BT_AGENT_EVENT_PASSKEY_AUTO_ACCEPTED, name,
-                               str_passkey, NULL, _gap_agent_get_path(agent));
-
-               gap_agent_reply_confirmation(agent, GAP_AGENT_ACCEPT, NULL);
-       }
-#else
-#ifdef AUTO_ACCEPT
-       BT_DBG("Confirm reply");
-       gap_agent_reply_confirmation(agent, GAP_AGENT_ACCEPT, NULL);
-#else
-       if (syspopup_mode) {
-               BT_DBG("LAUNCH SYSPOPUP");
-               _bt_launch_system_popup(BT_AGENT_EVENT_PASSKEY_CONFIRM_REQUEST, name,
-                               str_passkey, NULL,
-                               _gap_agent_get_path(agent));
-       } else {
-               int result = BLUETOOTH_ERROR_NONE;
-               GVariant *param;
-
-               BT_DBG("Send BLUETOOTH_EVENT_PASSKEY_CONFIRM_REQUEST");
-               param = g_variant_new("(isss)", result, address, name, str_passkey);
-               _bt_send_event(BT_ADAPTER_EVENT,
-                               BLUETOOTH_EVENT_PASSKEY_CONFIRM_REQUEST, param);
-       }
-#endif
-#endif
+       BT_DBG("LAUNCH SYSPOPUP");
+       _bt_launch_system_popup(BT_AGENT_EVENT_PASSKEY_CONFIRM_REQUEST, name,
+                                               auth_info, str_passkey, NULL,
+                                               _gap_agent_get_path(agent));
 
 done:
        g_variant_unref(reply);
        g_variant_unref(reply_temp);
+       g_free(address);
+       g_free(name);
        __bt_agent_release_memory();
        BT_DBG("-");
 
@@ -740,9 +555,7 @@ static gboolean __pairing_cancel_request(GapAgentPrivate *agent, const char *add
 {
        BT_DBG("On Going Pairing is cancelled by remote\n");
 
-#if !defined(LIBNOTIFY_SUPPORT) && !defined(LIBNOTIFICATION_SUPPORT)
        syspopup_destroy_all();
-#endif
 
        __bt_agent_release_memory();
 
@@ -758,30 +571,22 @@ static gboolean __a2dp_authorize_request_check(void)
 static gboolean __authorize_request(GapAgentPrivate *agent, GDBusProxy *device,
                                                        const char *uuid)
 {
-       const gchar *address;
-       const gchar *name;
+       gchar *address = NULL;
+       gchar *name = NULL;
+       unsigned char auth_info[5] = {0, };
        gboolean trust;
-       gboolean paired;
        GVariant *reply = NULL;
        GVariant *reply_temp = NULL;
        GVariant *tmp_value;
-#ifdef TIZEN_NETWORK_TETHERING_ENABLE
+#ifdef TIZEN_FEATURE_NETWORK_TETHERING_ENABLE
        bool enabled;
        tethering_h tethering = NULL;
 #endif
        int result = BLUETOOTH_ERROR_NONE;
-#ifndef AUTO_ACCEPT
        int request_type = BT_AGENT_EVENT_AUTHORIZE_REQUEST;
-#endif
 
        BT_DBG("+");
 
-#ifdef AUTO_ACCEPT
-       gap_agent_reply_authorize(agent, GAP_AGENT_ACCEPT,
-                                         NULL);
-       goto done;
-#endif
-
        /* Check if already Media connection exsist */
        if (!strcasecmp(uuid, A2DP_UUID)) {
                gboolean ret = FALSE;
@@ -803,8 +608,10 @@ static gboolean __authorize_request(GapAgentPrivate *agent, GDBusProxy *device,
             !strcasecmp(uuid, HSP_HS_UUID) ||
             !strcasecmp(uuid, A2DP_UUID) ||
             !strcasecmp(uuid, HID_UUID) ||
+            !strcasecmp(uuid, HID_DEVICE_UUID) ||
             !strcasecmp(uuid, SAP_UUID_OLD) ||
             !strcasecmp(uuid, SAP_UUID_NEW) ||
+            !strcasecmp(uuid, IOTIVITY_UUID) ||
             !strcasecmp(uuid, AVRCP_TARGET_UUID)) {
                BT_DBG("Auto accept authorization for audio device (HFP, A2DP, AVRCP) [%s]", uuid);
                gap_agent_reply_authorize(agent, GAP_AGENT_ACCEPT,
@@ -818,7 +625,7 @@ static gboolean __authorize_request(GapAgentPrivate *agent, GDBusProxy *device,
              !strcasecmp(uuid, BNEP_UUID)) {
 
                BT_DBG("Network connection request: %s", uuid);
-#ifdef TIZEN_NETWORK_TETHERING_ENABLE
+#ifdef TIZEN_FEATURE_NETWORK_TETHERING_ENABLE
                if (nap_connected_device_count >=
                                        BT_PAN_MAX_CONNECTION) {
                        BT_ERR("Max connection exceeded");
@@ -836,9 +643,8 @@ static gboolean __authorize_request(GapAgentPrivate *agent, GDBusProxy *device,
 
                ret = tethering_destroy(tethering);
 
-               if (ret != TETHERING_ERROR_NONE) {
+               if (ret != TETHERING_ERROR_NONE)
                        BT_ERR("Fail to create tethering: %d", ret);
-               }
 
                if (enabled != true) {
                        BT_ERR("BT tethering is not enabled");
@@ -849,7 +655,7 @@ static gboolean __authorize_request(GapAgentPrivate *agent, GDBusProxy *device,
                gap_agent_reply_authorize(agent, GAP_AGENT_ACCEPT,
                                              NULL);
                goto done;
-#ifdef TIZEN_NETWORK_TETHERING_ENABLE
+#ifdef TIZEN_FEATURE_NETWORK_TETHERING_ENABLE
 fail:
                gap_agent_reply_authorize(agent, GAP_AGENT_REJECT,
                      NULL);
@@ -879,21 +685,13 @@ fail:
        g_variant_get(tmp_value, "s", &name);
        G_VARIANT_UNREF(tmp_value);
        if (!name)
-               name = address;
+               name = g_strdup(address);
 
        tmp_value = g_variant_lookup_value(reply, "Trusted", G_VARIANT_TYPE_BOOLEAN);
        g_variant_get(tmp_value, "b", &trust);
        G_VARIANT_UNREF(tmp_value);
 
-       tmp_value = g_variant_lookup_value(reply, "Paired", G_VARIANT_TYPE_BOOLEAN);
-       g_variant_get(tmp_value, "b", &paired);
-       G_VARIANT_UNREF(tmp_value);
-       if ((paired == FALSE) && (trust == FALSE)) {
-               BT_ERR("No paired & No trusted device");
-               gap_agent_reply_authorize(agent,
-                               GAP_AGENT_REJECT, NULL);
-               goto done;
-       }
+       __bt_get_auth_info(reply, (char *)auth_info);
 
        BT_INFO("Authorization request for device [%s] Service:[%s]\n", address, uuid);
 
@@ -923,29 +721,31 @@ fail:
                goto done;
        }
 
+       if (!strcasecmp(uuid, OPP_UUID))
+               request_type = BT_AGENT_EVENT_EXCHANGE_REQUEST;
+       else if (!strcasecmp(uuid, PBAP_UUID))
+               request_type = BT_AGENT_EVENT_PBAP_REQUEST;
+       else if (!strcasecmp(uuid, MAP_UUID))
+               request_type = BT_AGENT_EVENT_MAP_REQUEST;
+
        if (trust) {
                BT_INFO("Trusted device, so authorize\n");
                gap_agent_reply_authorize(agent,
-                               GAP_AGENT_ACCEPT, NULL);
+                                             GAP_AGENT_ACCEPT, NULL);
        } else {
-#ifdef AUTO_ACCEPT
-               gap_agent_reply_authorize(agent, GAP_AGENT_ACCEPT, NULL);
-#else
-               if (!strcasecmp(uuid, OPP_UUID))
-                       request_type = BT_AGENT_EVENT_EXCHANGE_REQUEST;
-               else if (!strcasecmp(uuid, PBAP_UUID))
-                       request_type = BT_AGENT_EVENT_PBAP_REQUEST;
-               else if (!strcasecmp(uuid, MAP_UUID))
-                       request_type = BT_AGENT_EVENT_MAP_REQUEST;
-
-               _bt_launch_system_popup(request_type, name, NULL, NULL,
-                               _gap_agent_get_path(agent));
-#endif
+               _bt_launch_system_popup(request_type, name, auth_info, NULL, NULL,
+                                               _gap_agent_get_path(agent));
        }
 
 done:
-       g_variant_unref(reply);
-       g_variant_unref(reply_temp);
+       if (reply)
+               g_variant_unref(reply);
+
+       if (reply_temp)
+               g_variant_unref(reply_temp);
+
+       g_free(name);
+       g_free(address);
        __bt_agent_release_memory();
        BT_DBG("-");
 
@@ -959,9 +759,7 @@ static gboolean __authorization_cancel_request(GapAgentPrivate *agent,
 
        gap_agent_reply_authorize(agent, GAP_AGENT_CANCEL, NULL);
 
-#if !defined(LIBNOTIFY_SUPPORT) && !defined(LIBNOTIFICATION_SUPPORT)
        syspopup_destroy_all();
-#endif
 
        __bt_agent_release_memory();
 
@@ -1317,3 +1115,17 @@ static int __bt_agent_generate_passkey(char *passkey, int size)
 
        return 0;
 }
+
+int _bt_set_passkey_notification(const char *sender, gboolean enable)
+{
+       BT_INFO("Set passkey notification(sender:%s, %s)",
+                       sender, enable ? "Enable" : "Disable");
+
+       g_free(passkey_watcher);
+       if (enable == TRUE)
+               passkey_watcher = g_strdup(sender);
+       else
+               passkey_watcher = NULL;
+
+       return BLUETOOTH_ERROR_NONE;
+}
old mode 100755 (executable)
new mode 100644 (file)
index 9d4eca6..3b32b20
 #include <glib.h>
 #include <dlog.h>
 #include <string.h>
-#if !defined(LIBNOTIFY_SUPPORT) && !defined(LIBNOTIFICATION_SUPPORT)
-#include <syspopup_caller.h>
+#ifdef TIZEN_BT_A2DP_SINK_AUTO_CONNECT
+#include <vconf.h>
 #endif
+#include <syspopup_caller.h>
 
 #include "bluetooth-api.h"
 #include "bt-internal-types.h"
@@ -36,7 +37,7 @@
 #include "bt-service-headset-connection.h"
 
 #ifdef TIZEN_SUPPORT_DUAL_HF
-#ifdef TIZEN_WEARABLE
+#ifdef TIZEN_PROFILE_WEARABLE
 #define VCONF_KEY_BT_HOST_BT_MAC_ADDR "db/wms/host_bt_mac"
 #endif
 #endif
@@ -47,6 +48,15 @@ typedef struct {
        char device_address[BT_ADDRESS_STRING_SIZE + 1];
 } bt_connected_headset_data_t;
 
+#ifdef TIZEN_BT_A2DP_SINK_AUTO_CONNECT
+typedef struct {
+       int alarm_id;
+       int retry_count;
+} bt_auto_connect_timer_t;
+
+bt_auto_connect_timer_t auto_connect_timer = {0, };
+#endif
+
 static GList *g_connected_list;
 
 static bt_headset_wait_t *g_wait_data;
@@ -60,6 +70,10 @@ static void __bt_free_wait_data();
 static gboolean __bt_device_support_uuid(char *remote_address,
                                bt_audio_type_t type);
 
+#ifdef TIZEN_BT_A2DP_SINK_AUTO_CONNECT
+static int __bt_auto_connect_alarm_cb(alarm_id_t alarm_id, void* user_param);
+#endif
+
 static void __bt_hf_request_cb(GDBusProxy *proxy, GAsyncResult *res,
                                    gpointer user_data)
 {
@@ -89,11 +103,11 @@ static void __bt_hf_request_cb(GDBusProxy *proxy, GAsyncResult *res,
 
        if (reply == NULL) {
                BT_ERR("HF Connect Dbus Call Error");
+               result = _bt_convert_gerror(g_error);
                if (g_error) {
                        BT_ERR("Error: %s\n", g_error->message);
                        g_clear_error(&g_error);
                }
-               result = BLUETOOTH_ERROR_INTERNAL;
        } else {
                g_variant_unref(reply);
        }
@@ -131,7 +145,7 @@ void _bt_audio_check_pending_connect()
                _bt_audio_connect(pdata->req_id,
                                BT_AUDIO_A2DP,
                                &device_address,
-                               pdata->out_param);
+                               NULL);
 
                g_free(pdata->address);
                g_free(pdata);
@@ -165,7 +179,6 @@ static void __bt_audio_request_cb(GDBusProxy *proxy, GAsyncResult *res,
        }
 
        if (func_data->pending != BT_PENDING_NONE && g_error == NULL) {
-
                bluetooth_device_address_t device_address;
                _bt_convert_addr_string_to_type(device_address.addr,
                                        func_data->address);
@@ -177,20 +190,16 @@ static void __bt_audio_request_cb(GDBusProxy *proxy, GAsyncResult *res,
 
                                pdata = g_new0(bt_audio_function_data_t, 1);
                                pdata->req_id = func_data->req_id;
-                               pdata->out_param = func_data->out_param;
                                pdata->address = strdup(func_data->address);
                                pdata->pending = func_data->pending;
                        } else
                                goto check_req_info;
 
                } else {
-
                        if (_bt_is_service_connected(func_data->address
-                                                       , BT_AUDIO_A2DP)) {
+                                                       , BT_AUDIO_HSP)) {
                                _bt_audio_disconnect(func_data->req_id,
-                                       BT_AUDIO_A2DP,
-                                       &device_address,
-                                       func_data->out_param);
+                                       BT_AUDIO_HSP, &device_address, NULL);
                        } else
                                goto check_req_info;
                }
@@ -211,6 +220,11 @@ check_req_info:
        BT_ERR("Audio Connect/Disconnect Dbus Call Error: %s\n", g_error->message);
 
        result = BLUETOOTH_ERROR_INTERNAL;
+       /* If there is error then we need to set local initiated connection as false
+         * If don't do this then when headset initiate connection for HFP then we don't
+         * initiate connection for A2dp to headset as this flag was set to true in first
+         * connection failure attempt and not set in error case.*/
+       _bt_headset_set_local_connection(FALSE);
 
        /* Remove the device from the list */
        _bt_remove_headset_from_list(func_data->type, func_data->address);
@@ -224,7 +238,7 @@ check_req_info:
                _bt_convert_addr_string_to_type(device_address.addr,
                                g_wait_data->address);
                _bt_audio_connect(g_wait_data->req_id, g_wait_data->type,
-                               &device_address, g_wait_data->out_param1);
+                               &device_address, NULL);
        }
 
        /* Event will be sent by the event reciever */
@@ -320,7 +334,7 @@ gboolean _bt_is_headset_type_connected(int type, char *address)
 #ifdef TIZEN_SUPPORT_DUAL_HF
 gboolean __bt_is_companion_device(const char *addr)
 {
-#ifdef TIZEN_WEARABLE
+#ifdef TIZEN_PROFILE_WEARABLE
        char *host_device_address = NULL;
        host_device_address = vconf_get_str(VCONF_KEY_BT_HOST_BT_MAC_ADDR);
 
@@ -330,10 +344,12 @@ gboolean __bt_is_companion_device(const char *addr)
        }
 
        if (g_strcmp0(host_device_address, addr) == 0) {
-               BT_INFO("addr[%s] is companion device", addr);
+               BT_INFO("Found companion device");
+               free(host_device_address);
                return TRUE;
        }
 
+       free(host_device_address);
        return FALSE;
 #else
        /* TODO : Need to add companion device check condition for Phone models */
@@ -343,7 +359,7 @@ gboolean __bt_is_companion_device(const char *addr)
 #endif
 
 static int __bt_is_headset_connected(int type, int req_id,
-                               const char *address, GArray **out_param1)
+                               const char *address)
 {
        gboolean connected = FALSE;
        char connected_address[BT_ADDRESS_STRING_SIZE + 1];
@@ -359,7 +375,7 @@ static int __bt_is_headset_connected(int type, int req_id,
        node = g_list_first(g_connected_list);
        while (node != NULL) {
                connected_device = node->data;
-               if ((connected_device->type & type) == type) {
+               if ((connected_device->type & type)) {
                        g_strlcpy(connected_address, connected_device->device_address,
                                        BT_ADDRESS_STRING_SIZE + 1);
 #ifdef TIZEN_SUPPORT_DUAL_HF
@@ -390,29 +406,69 @@ static int __bt_is_headset_connected(int type, int req_id,
                return BLUETOOTH_ERROR_NOT_CONNECTED;
 #endif
 
+       /* Convert BD adress from string type */
+       _bt_convert_addr_string_to_type(device_address.addr, connected_address);
+       int value = BLUETOOTH_ERROR_NONE;
+       value = _bt_audio_disconnect(0, connected_device->type & type, &device_address, NULL);
+
        /* If already one device is waiting, remove current waiting device and add new */
-       if (g_wait_data != NULL) {
-               if (g_strcmp0(g_wait_data->address, address) != 0) {
-                       __bt_remove_device_from_wait_list();
-                       __bt_free_wait_data();
+       if (value == BLUETOOTH_ERROR_NONE) {
+               if (g_wait_data != NULL) {
+                       if (g_strcmp0(g_wait_data->address, address) != 0) {
+                               __bt_remove_device_from_wait_list();
+                               __bt_free_wait_data();
+                       }
+               }
+
+               if (g_wait_data == NULL) {
+                       g_wait_data = g_malloc0(sizeof(bt_headset_wait_t));
+                       g_wait_data->address = g_strdup(address);
+                       g_wait_data->req_id = req_id;
+                       g_wait_data->type = type;
+                       g_wait_data->ag_flag = FALSE;
+
+                       /* Set disconnection type */
+                       __bt_set_headset_disconnection_type(connected_address);
                }
        }
 
-       if (g_wait_data == NULL) {
-               g_wait_data = g_malloc0(sizeof(bt_headset_wait_t));
-               g_wait_data->address = g_strdup(address);
-               g_wait_data->req_id = req_id;
-               g_wait_data->type = type;
-               g_wait_data->ag_flag = FALSE;
-               g_wait_data->out_param1 = out_param1;
+       return value;
+}
+
+static int __bt_is_headset_connecting(int type)
+{
+       bt_connected_headset_data_t *connected_device = NULL;
+
+       /* Check if any other headset is connected */
+       GList *node = NULL;
 
-               /* Set disconnection type */
-               __bt_set_headset_disconnection_type(connected_address);
+       node = g_list_first(g_connected_list);
+       while (node != NULL) {
+               connected_device = node->data;
+               if (connected_device->device_state == BT_STATE_CONNECTING)
+                       return BLUETOOTH_ERROR_CONNECTION_BUSY;
+               node = g_list_next(node);
+       }
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+int __bt_is_headset_disconnecting(int type)
+{
+       bt_connected_headset_data_t *connected_device = NULL;
+
+       /* Check if any other headset is connected */
+       GList *node = NULL;
+
+       node = g_list_first(g_connected_list);
+       while (node != NULL) {
+               connected_device = node->data;
+               if (connected_device->device_state == BT_STATE_DISCONNECTING)
+                       return BLUETOOTH_ERROR_CONNECTION_BUSY;
+
+               node = g_list_next(node);
        }
 
-       /* Convert BD adress from string type */
-       _bt_convert_addr_string_to_type(device_address.addr, connected_address);
-       _bt_audio_disconnect(0, connected_device->type & type, &device_address, NULL);
        return BLUETOOTH_ERROR_NONE;
 }
 
@@ -527,6 +583,9 @@ void _bt_remove_headset_from_list(int type, const char *address)
                        if (connected_device->type & BT_AVRCP)
                                connected_device->type &= ~(BT_AVRCP);
                        break;
+               case BT_AUDIO_A2DP_SOURCE:
+                       if (connected_device->type & BT_AUDIO_A2DP_SOURCE)
+                               connected_device->type &= ~(BT_AUDIO_A2DP_SOURCE);
                }
 
                BT_DBG("Connection type = %x\n", connected_device->type);
@@ -534,6 +593,8 @@ void _bt_remove_headset_from_list(int type, const char *address)
                if (connected_device->type == 0x00) {
                        g_connected_list = g_list_remove(g_connected_list, connected_device);
                        g_free(connected_device);
+               } else {
+                       connected_device->device_state = BT_STATE_CONNECTED;
                }
 
                node = g_list_next(node);
@@ -612,23 +673,25 @@ gboolean _bt_is_service_connected(char* address, int type)
 
 int _bt_audio_connect(int request_id, int type,
                bluetooth_device_address_t *device_address,
-               GArray **out_param1)
+               GArray *out_param1)
 {
        int result = BLUETOOTH_ERROR_NONE;
        char address[BT_ADDRESS_STRING_SIZE] = { 0 };
        GDBusProxy *adapter_proxy;
        GDBusConnection *g_conn;
        int ret;
-       char *uuid;
+       char *uuid = NULL;
        int value = BLUETOOTH_ERROR_NONE;
        bt_audio_function_data_t *func_data;
+       guint hfp_hs_restricted = 0x0; /* set default "allowed" */
+       guint a2dp_restricted = 0x0;
 
        BT_CHECK_PARAMETER(device_address, return);
 
        adapter_proxy = _bt_get_adapter_proxy();
        retv_if(adapter_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       g_conn = _bt_get_system_gconn();
+       g_conn = _bt_gdbus_get_system_gconn();
        retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        _bt_convert_addr_type_to_string(address, device_address->addr);
@@ -644,7 +707,14 @@ int _bt_audio_connect(int request_id, int type,
        func_data->req_id = request_id;
        func_data->type = type;
        func_data->pending = BT_PENDING_NONE;
-       func_data->out_param = out_param1;
+
+       result = _bt_get_restrict_profile(device_address, RESTRICTED_PROFILE_HFP_HS, &hfp_hs_restricted);
+       if (result != BLUETOOTH_ERROR_NONE)
+               BT_ERR("Can't get hfp_hs restriction info");
+
+       result = _bt_get_restrict_profile(device_address, RESTRICTED_PROFILE_A2DP, &a2dp_restricted);
+       if (result != BLUETOOTH_ERROR_NONE)
+               BT_ERR("Can't get a2dp restriction info");
 
        switch (type) {
        case BT_AUDIO_HSP:
@@ -660,19 +730,46 @@ int _bt_audio_connect(int request_id, int type,
                uuid = A2DP_SOURCE_UUID;
                break;
        case BT_AUDIO_ALL:
-               if (__bt_device_support_uuid(address, BT_AUDIO_HSP)) {
-                       uuid = HFP_HS_UUID;
-                       func_data->pending = BT_PENDING_CONNECT;
-                       type = BT_AUDIO_HSP;
-               } else if (__bt_device_support_uuid(address, BT_AUDIO_A2DP)) {
-                       uuid = A2DP_SINK_UUID;
-                       type = BT_AUDIO_A2DP;
-               } else {
-                       BT_ERR("No audio role supported");
-                       result = BLUETOOTH_ERROR_SERVICE_NOT_FOUND;
+               if ((hfp_hs_restricted == 0x0) && (a2dp_restricted == 0x0)) { /* in case of both profiles are not restricted */
+                       if (__bt_device_support_uuid(address, BT_AUDIO_HSP)) {
+                               uuid = HFP_HS_UUID;
+                               func_data->pending = BT_PENDING_CONNECT;
+                               type = BT_AUDIO_HSP;
+                       } else if (__bt_device_support_uuid(address, BT_AUDIO_A2DP)) {
+                               uuid = A2DP_SINK_UUID;
+                               type = BT_AUDIO_A2DP;
+                       } else {
+                               BT_ERR("No audio role supported");
+                               result = BLUETOOTH_ERROR_SERVICE_NOT_FOUND;
+                               goto fail;
+                       }
+               } else if ((hfp_hs_restricted == 0x1) && (a2dp_restricted == 0x1)) { /* in case of both profiles are restricted */
+                       BT_ERR("All profiles are restricted");
+                       result = BLUETOOTH_ERROR_INTERNAL;
                        goto fail;
+               } else if (a2dp_restricted == 0x01) { /* in case of a2dp is restricted, only connection for hfp_hs */
+                       if (__bt_device_support_uuid(address, BT_AUDIO_HSP)) {
+                               uuid = HFP_HS_UUID;
+                               type = BT_AUDIO_HSP;
+                       } else {
+                               BT_ERR("HFP_HS role is not supported");
+                               result = BLUETOOTH_ERROR_SERVICE_NOT_FOUND;
+                               goto fail;
+                       }
+               } else if (hfp_hs_restricted == 0x01) { /* in case of hfp_hs is restricted, only connection for a2dp */
+                       if (__bt_device_support_uuid(address, BT_AUDIO_A2DP)) {
+                               uuid = A2DP_SINK_UUID;
+                               type = BT_AUDIO_A2DP;
+                       } else {
+                               BT_ERR("A2DP role is not supported");
+                               result = BLUETOOTH_ERROR_SERVICE_NOT_FOUND;
+                               goto fail;
+                       }
                }
                break;
+       case BT_AVRCP_TARGET:
+               uuid = AVRCP_REMOTE_UUID;
+               break;
        default:
                BT_ERR("Unknown role");
                result = BLUETOOTH_ERROR_INTERNAL;
@@ -680,11 +777,16 @@ int _bt_audio_connect(int request_id, int type,
        }
        BT_INFO("Connecting to service %s", uuid);
 
-       value = __bt_is_headset_connected(type, request_id, address, out_param1);
+       value = __bt_is_headset_connected(type, request_id, address);
 
        if (value == BLUETOOTH_ERROR_ALREADY_CONNECT) {
                return BLUETOOTH_ERROR_ALREADY_CONNECT;
        } else if (value == BLUETOOTH_ERROR_NOT_CONNECTED) {
+               value = __bt_is_headset_connecting(type);
+               if (value != BLUETOOTH_ERROR_NONE) {
+                       result = BLUETOOTH_ERROR_IN_PROGRESS;
+                       goto fail;
+               }
                _bt_headset_set_local_connection(TRUE);
                ret = _bt_connect_profile(address, uuid,
                                __bt_audio_request_cb, func_data);
@@ -699,19 +801,25 @@ int _bt_audio_connect(int request_id, int type,
 
                /* Add data to the connected list */
                _bt_add_headset_to_list(type, BT_STATE_CONNECTING, address);
+       } else if (value == BLUETOOTH_ERROR_IN_PROGRESS) {
+               return BLUETOOTH_ERROR_IN_PROGRESS;
        }
 
+       if (out_param1)
+               g_array_free(out_param1, TRUE);
+
        return BLUETOOTH_ERROR_NONE;
 fail:
-       g_array_append_vals(*out_param1, address,
-                       BT_ADDRESS_STR_LEN);
+       if (out_param1 != NULL)
+               g_array_append_vals(out_param1, address,
+                               BT_ADDRESS_STR_LEN);
 
        return result;
 }
 
 int _bt_audio_disconnect(int request_id, int type,
                bluetooth_device_address_t *device_address,
-               GArray **out_param1)
+               GArray *out_param1)
 {
        int result = BLUETOOTH_ERROR_NONE;
        char address[BT_ADDRESS_STRING_SIZE] = { 0 };
@@ -721,24 +829,28 @@ int _bt_audio_disconnect(int request_id, int type,
        GList *node;
        int ret;
        char *uuid;
+       int value = BLUETOOTH_ERROR_NONE;
 
        BT_CHECK_PARAMETER(device_address, return);
 
        adapter_proxy = _bt_get_adapter_proxy();
        retv_if(adapter_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       g_conn = _bt_get_system_gconn();
+       g_conn = _bt_gdbus_get_system_gconn();
        retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        _bt_convert_addr_type_to_string(address, device_address->addr);
 
        func_data = g_malloc0(sizeof(bt_audio_function_data_t));
-       retv_if(func_data == NULL, BLUETOOTH_ERROR_INTERNAL);
-
+       /* Fix : NULL_RETURNS */
+       if (func_data == NULL) {
+               BT_ERR("Memory allocation error");
+               result = BLUETOOTH_ERROR_MEMORY_ALLOCATION;
+               goto fail;
+       }
        func_data->address = g_strdup(address);
        func_data->req_id = request_id;
        func_data->pending = BT_PENDING_NONE;
-       func_data->out_param = out_param1;
        func_data->type = type;
 
        switch (type) {
@@ -755,23 +867,31 @@ int _bt_audio_disconnect(int request_id, int type,
                uuid = A2DP_SOURCE_UUID;
                break;
        case BT_AUDIO_ALL:
-               if (_bt_is_service_connected(address, BT_AUDIO_HSP)) {
-                       uuid = HFP_HS_UUID;
-                       func_data->pending = BT_PENDING_DISCONNECT;
-               } else if (_bt_is_service_connected(address, BT_AUDIO_A2DP)) {
+               if (_bt_is_service_connected(address, BT_AUDIO_A2DP)) {
                        uuid = A2DP_SINK_UUID;
+                       func_data->pending = BT_PENDING_DISCONNECT;
+               } else if (_bt_is_service_connected(address, BT_AUDIO_HSP)) {
+                       uuid = HFP_HS_UUID;
                } else {
                        BT_ERR("No audio service connected");
                        result = BLUETOOTH_ERROR_NOT_CONNECTED;
                        goto fail;
                }
                break;
+       case BT_AVRCP_TARGET:
+               uuid = AVRCP_REMOTE_UUID;
+               break;
        default:
                BT_ERR("Unknown role");
                result = BLUETOOTH_ERROR_INTERNAL;
                goto fail;
        }
-
+       value = __bt_is_headset_disconnecting(type);
+       if (value != BLUETOOTH_ERROR_NONE) {
+               BT_INFO("Disconnect in progress");
+               result = BLUETOOTH_ERROR_IN_PROGRESS;
+               goto fail;
+       }
        BT_INFO("Disconnecting service %s", uuid);
        ret = _bt_disconnect_profile(address, uuid,
                        __bt_audio_request_cb, func_data);
@@ -799,10 +919,13 @@ int _bt_audio_disconnect(int request_id, int type,
        }
        _bt_add_headset_to_list(type, BT_STATE_DISCONNECTING, address);
 
+       if (out_param1)
+               g_array_free(out_param1, TRUE);
+
        return BLUETOOTH_ERROR_NONE;
 fail:
        if (out_param1 != NULL)
-               g_array_append_vals(*out_param1, address,
+               g_array_append_vals(out_param1, address,
                                BT_ADDRESS_STR_LEN);
 
        return result;
@@ -829,13 +952,14 @@ void _bt_remove_from_connected_list(const char *address)
 
 int _bt_hf_connect(int request_id,
                bluetooth_device_address_t *device_address,
-               GArray **out_param1)
+               GArray *out_param1)
 {
        int result = BLUETOOTH_ERROR_NONE;
        char address[BT_ADDRESS_STRING_SIZE] = { 0 };
        bt_function_data_t *func_data;
        GDBusProxy *adapter_proxy;
        GDBusConnection *g_conn;
+       gboolean connected = FALSE;
        int ret;
        char *uuid;
 
@@ -849,12 +973,20 @@ int _bt_hf_connect(int request_id,
                goto fail;
        }
 
-       g_conn = _bt_get_system_gconn();
+       g_conn = _bt_gdbus_get_system_gconn();
        if (g_conn == NULL) {
                result = BLUETOOTH_ERROR_INTERNAL;
                goto fail;
        }
 
+       /* Check if HF is connected or not */
+       result = _bt_is_device_connected(device_address, BT_PROFILE_CONN_HFG, &connected);
+       if (connected == TRUE) {
+               BT_ERR("HF is already connected");
+               result = BLUETOOTH_ERROR_ALREADY_CONNECT;
+               goto fail;
+       }
+
        func_data = g_malloc0(sizeof(bt_function_data_t));
        /* Fix : NULL_RETURNS */
        if (func_data == NULL) {
@@ -879,10 +1011,13 @@ int _bt_hf_connect(int request_id,
                return ret;
        }
        g_free(uuid);
+       if (out_param1)
+               g_array_free(out_param1, TRUE);
+
        return BLUETOOTH_ERROR_NONE;
 fail:
        if (out_param1 != NULL)
-               g_array_append_vals(*out_param1, address,
+               g_array_append_vals(out_param1, address,
                                BT_ADDRESS_STR_LEN);
 
        return result;
@@ -890,7 +1025,7 @@ fail:
 
 int _bt_hf_disconnect(int request_id,
                bluetooth_device_address_t *device_address,
-               GArray **out_param1)
+               GArray *out_param1)
 {
        int result = BLUETOOTH_ERROR_NONE;
        char address[BT_ADDRESS_STRING_SIZE] = { 0 };
@@ -911,7 +1046,7 @@ int _bt_hf_disconnect(int request_id,
                goto fail;
        }
 
-       g_conn = _bt_get_system_gconn();
+       g_conn = _bt_gdbus_get_system_gconn();
        if (g_conn == NULL) {
                result = BLUETOOTH_ERROR_INTERNAL;
                goto fail;
@@ -940,10 +1075,13 @@ int _bt_hf_disconnect(int request_id,
                return ret;
        }
        g_free(uuid);
+       if (out_param1)
+               g_array_free(out_param1, TRUE);
+
        return BLUETOOTH_ERROR_NONE;
 fail:
        if (out_param1 != NULL)
-               g_array_append_vals(*out_param1, address,
+               g_array_append_vals(out_param1, address,
                                BT_ADDRESS_STR_LEN);
 
        return result;
@@ -956,7 +1094,7 @@ int _bt_audio_set_content_protect(gboolean status)
 
        BT_DBG("+\n");
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        BT_DBG("Content Protection status = [%d]", status);
@@ -979,3 +1117,163 @@ int _bt_audio_set_content_protect(gboolean status)
        BT_DBG("Emit Signal done = [ProtectionRequired]");
        return BLUETOOTH_ERROR_NONE;
 }
+
+#ifdef TIZEN_BT_A2DP_SINK_AUTO_CONNECT
+static void __bt_auto_connect_request_cb(GDBusProxy *proxy, GAsyncResult *res,
+                                   gpointer user_data)
+{
+       GError *err = NULL;
+       GVariant *reply = NULL;
+
+       reply = g_dbus_proxy_call_finish(proxy, res, &err);
+       g_object_unref(proxy);
+       g_variant_unref(reply);
+
+       BT_DBG("+");
+       if (err != NULL) {
+               g_dbus_error_strip_remote_error(err);
+               BT_INFO("Auto_connect_request Dbus Call Error: %s", err->message);
+
+               if (strcmp("Host is down", err->message)) {
+                       BT_INFO("Fail reason is not 'Host Down'. Terminate auto connect");
+                       _bt_audio_stop_auto_connect();
+                       vconf_set_str(BT_LAST_CONNECTED_DEVICE, "");
+               }
+       }
+       g_clear_error(&err);
+}
+
+
+// It is the function that retry to create alarm.
+// Sometimes alarm mgr service is created later than bluetooth-frwk service in booting time.
+// So, in this case, we have to retry alarmmgr_add_alarm.
+static gboolean __bt_audio_alarm_retry_cb(gpointer data)
+{
+       int result;
+       alarm_id_t alarm_id;
+
+       BT_DBG("__bt_audio_alarm_retry_cb called.");
+       result = _bt_service_set_alarm(BT_AUTO_CONNECT_TIMEOUT_AFTER_LINKLOSS,
+                                               __bt_auto_connect_alarm_cb, NULL, &alarm_id);
+
+       if (result != BLUETOOTH_ERROR_NONE)
+               return TRUE;
+       else
+               auto_connect_timer.alarm_id = alarm_id;
+
+       return FALSE;
+}
+
+static int __bt_auto_connect_alarm_cb(alarm_id_t alarm_id, void* user_param)
+{
+       int result = BLUETOOTH_ERROR_NONE;
+       char *address = NULL;
+       alarm_id_t new_alarm_id;
+
+       BT_INFO("alram id = [%d] , retry_count [%d] ",
+                                               alarm_id, auto_connect_timer.retry_count);
+
+       if (alarm_id != auto_connect_timer.alarm_id)
+               return 0;
+
+       address = vconf_get_str(BT_LAST_CONNECTED_DEVICE);
+
+       if (address == NULL) {
+               BT_ERR("Address vconf is null");
+               auto_connect_timer.alarm_id = 0;
+               return 0;
+       }
+
+       BT_DBG("ADDRESS [%s]", address);
+
+       result = _bt_connect_profile(address, A2DP_SOURCE_UUID,
+                       __bt_auto_connect_request_cb, NULL);
+
+       auto_connect_timer.retry_count--;
+
+       BT_DBG("result [%d]", result);
+
+       if (auto_connect_timer.retry_count <= 0) {
+               BT_INFO("Stopping Auto connect retry");
+               auto_connect_timer.alarm_id = 0;
+       } else {
+               result = _bt_service_set_alarm(BT_AUTO_CONNECT_TIMEOUT_AFTER_LINKLOSS,
+                                               __bt_auto_connect_alarm_cb, NULL, &new_alarm_id);
+               if (result == BLUETOOTH_ERROR_NONE)
+                       auto_connect_timer.alarm_id = new_alarm_id;
+       }
+
+       free(address);
+       return 0;
+}
+
+static void __bt_auto_connect_alarm_remove()
+{
+       BT_DBG("");
+       if (auto_connect_timer.alarm_id > 0) {
+               _bt_service_remove_alarm(auto_connect_timer.alarm_id);
+               auto_connect_timer.alarm_id = 0;
+       }
+       auto_connect_timer.retry_count = 0;
+}
+
+int _bt_audio_start_auto_connect(gboolean linkloss_flag)
+{
+       int result = BLUETOOTH_ERROR_NONE;
+       char *address = NULL;
+       alarm_id_t alarm_id = 0;
+
+       BT_DBG("");
+
+       address = vconf_get_str(BT_LAST_CONNECTED_DEVICE);
+
+       if (address == NULL) {
+               BT_ERR("No target device");
+               return 0;
+       }
+
+       __bt_auto_connect_alarm_remove();
+
+       auto_connect_timer.retry_count =  BT_AUTO_CONNECT_TIMEOUT_RETRY_TIME /
+                                               BT_AUTO_CONNECT_TIMEOUT_AFTER_LINKLOSS;
+
+       if (linkloss_flag) {
+               BT_INFO("Start auto connection after linkloss");
+               result = _bt_service_set_alarm(BT_AUTO_CONNECT_TIMEOUT_AFTER_LINKLOSS,
+                                               __bt_auto_connect_alarm_cb, NULL, &alarm_id);
+               if (result != BLUETOOTH_ERROR_NONE)
+                       g_timeout_add(500, (GSourceFunc)__bt_audio_alarm_retry_cb, NULL);
+               else
+                       auto_connect_timer.alarm_id = alarm_id;
+
+       } else {
+               BT_INFO("Start auto connection after BT activated");
+               result = _bt_service_set_alarm(BT_AUTO_CONNECT_TIMEOUT_AFTER_BT_ACTIVATED,
+                                               __bt_auto_connect_alarm_cb, NULL, &alarm_id);
+               if (result == BLUETOOTH_ERROR_NONE)
+                       auto_connect_timer.alarm_id = alarm_id;
+       }
+
+       free(address);
+       return BLUETOOTH_ERROR_NONE;
+}
+
+int _bt_audio_stop_auto_connect(void)
+{
+       BT_DBG("");
+       __bt_auto_connect_alarm_remove();
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+void _bt_audio_set_auto_connect_device_addr(const char *address)
+{
+       if (address == NULL) {
+               BT_ERR("address is null");
+               return;
+       }
+
+       BT_INFO("Last connected device is [%s]", address);
+       vconf_set_str(BT_LAST_CONNECTED_DEVICE, address);
+}
+#endif /*TIZEN_BT_A2DP_SINK_AUTO_CONNECT */
old mode 100755 (executable)
new mode 100644 (file)
index dc4f3d5..ba406f0
@@ -85,7 +85,8 @@ static char *__bt_get_control_device_path(void)
 
        BT_DBG("+");
 
-       retv_if(avrcp_control_path != NULL, avrcp_control_path);
+       if (avrcp_control_path != NULL)
+               return avrcp_control_path;
 
        retv_if(!_bt_is_headset_type_connected(BT_AVRCP,
                        connected_address), NULL);
@@ -113,7 +114,9 @@ static int __bt_media_send_control_msg(const char *name)
 
        retv_if(name == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       conn = _bt_get_system_conn();
+       BT_INFO("Command [%s]", name);
+
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        control_path = __bt_get_control_device_path();
@@ -173,11 +176,17 @@ int _bt_avrcp_control_cmd(int type)
        case PREVIOUS:
                ret = __bt_media_send_control_msg("Previous");
                break;
-       case FAST_FORWARD:
-               ret = __bt_media_send_control_msg("FastForward");
+       case PRESS_FAST_FORWARD:
+               ret = __bt_media_send_control_msg("PressFastForward");
+               break;
+       case RELEASE_FAST_FORWARD:
+               ret = __bt_media_send_control_msg("ReleaseFastForward");
+               break;
+       case PRESS_REWIND:
+               ret = __bt_media_send_control_msg("PressRewind");
                break;
-       case REWIND:
-               ret = __bt_media_send_control_msg("Rewind");
+       case RELEASE_REWIND:
+               ret = __bt_media_send_control_msg("ReleaseRewind");
                break;
        default:
                BT_DBG("Invalid Type\n");
@@ -198,7 +207,7 @@ GDBusProxy *__bt_get_control_properties_proxy(void)
        retv_if(control_path == NULL, NULL);
        BT_DBG("control_path = %s", control_path);
 
-       conn = _bt_get_system_conn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, NULL);
 
        proxy = g_dbus_proxy_new_sync(conn,
@@ -353,6 +362,7 @@ int _bt_avrcp_control_get_property(int type, unsigned int *value)
        int ret = BLUETOOTH_ERROR_NONE;
        GError *err = NULL;
        GVariant *reply = NULL;
+       GVariant *temp = NULL;
 
        BT_CHECK_PARAMETER(value, return);
 
@@ -360,7 +370,7 @@ int _bt_avrcp_control_get_property(int type, unsigned int *value)
        retv_if(proxy == NULL, BLUETOOTH_ERROR_NOT_CONNECTED);
 
        reply = g_dbus_proxy_call_sync(proxy,
-                                       "Get", g_variant_new("ss", BT_PLAYER_CONTROL_INTERFACE, __bt_media_type_to_str(type)),
+                                       "Get", g_variant_new("(ss)", BT_PLAYER_CONTROL_INTERFACE, __bt_media_type_to_str(type)),
                                        G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
 
        g_object_unref(proxy);
@@ -379,15 +389,19 @@ int _bt_avrcp_control_get_property(int type, unsigned int *value)
                        case SHUFFLE:
                        case SCAN:
                        case STATUS:
-                               name = (char *)g_variant_get_string(reply, NULL);
-                               *value = __bt_media_attrval_to_val(type, name);
-                               BT_DBG("Type[%s] and Value[%s]", __bt_media_type_to_str(type), name);
+                               name = (char *)g_variant_get_data(reply);
+                               if (name)
+                                       *value = __bt_media_attrval_to_val(type, name);
+                               BT_INFO("Type[%s] and Value[%s]", __bt_media_type_to_str(type), name);
                                break;
                        case POSITION:
-                               *value = g_variant_get_uint32(reply);
+                               g_variant_get(reply, "(v)", &temp);
+                               *value = g_variant_get_uint32(temp);
+                               g_variant_unref(temp);
+                               BT_INFO("Type[%s] and Value[%d]", __bt_media_type_to_str(type), *value);
                                break;
                        default:
-                               BT_DBG("Invalid Type\n");
+                               BT_ERR("Invalid Type [%d]", type);
                                ret =  BLUETOOTH_ERROR_INTERNAL;
                        }
                }
@@ -407,19 +421,19 @@ int _bt_avrcp_control_set_property(int type, unsigned int value)
        switch (type) {
        case EQUALIZER:
                param = g_variant_new("s", equalizer_status[value].property);
-               BT_DBG("equalizer_status %s", equalizer_status[value].property);
+               BT_INFO("equalizer_status %s", equalizer_status[value].property);
                break;
        case REPEAT:
                param = g_variant_new("s", repeat_status[value].property);
-               BT_DBG("repeat_status %s", repeat_status[value].property);
+               BT_INFO("repeat_status %s", repeat_status[value].property);
                break;
        case SHUFFLE:
                param = g_variant_new("s", shuffle_settings[value].property);
-               BT_DBG("shuffle_settings %s", shuffle_settings[value].property);
+               BT_INFO("shuffle_settings %s", shuffle_settings[value].property);
                break;
        case SCAN:
                param = g_variant_new("s", scan_status[value].property);
-               BT_DBG("scan_status %s", scan_status[value].property);
+               BT_INFO("scan_status %s", scan_status[value].property);
                break;
        default:
                BT_ERR("Invalid property type: %d", type);
@@ -431,7 +445,7 @@ int _bt_avrcp_control_set_property(int type, unsigned int value)
        retv_if(proxy == NULL, BLUETOOTH_ERROR_NOT_CONNECTED);
 
        reply = g_dbus_proxy_call_sync(proxy,
-                                       "Set", g_variant_new("ssv", BT_PLAYER_CONTROL_INTERFACE, __bt_media_type_to_str(type), param),
+                                       "Set", g_variant_new("(ssv)", BT_PLAYER_CONTROL_INTERFACE, __bt_media_type_to_str(type), param),
                                        G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
 
        g_object_unref(proxy);
@@ -467,19 +481,19 @@ static int __bt_avrcp_control_parse_properties(
                if (strcasecmp(key, "Title") == 0) {
                        value_string = (char *)g_variant_get_string(value, NULL);
                        BT_DBG("Value : %s ", value_string);
-                       metadata->title = value_string;
+                       metadata->title = g_strdup(value_string);
                } else if (strcasecmp(key, "Artist") == 0) {
                        value_string = (char *)g_variant_get_string(value, NULL);
                        BT_DBG("Value : %s ", value_string);
-                       metadata->artist = value_string;
+                       metadata->artist = g_strdup(value_string);
                } else if (strcasecmp(key, "Album") == 0) {
                        value_string = (char *)g_variant_get_string(value, NULL);
                        BT_DBG("Value : %s ", value_string);
-                       metadata->album = value_string;
+                       metadata->album = g_strdup(value_string);
                } else if (strcasecmp(key, "Genre") == 0) {
                        value_string = (char *)g_variant_get_string(value, NULL);
                        BT_DBG("Value : %s ", value_string);
-                       metadata->genre = value_string;
+                       metadata->genre = g_strdup(value_string);
                } else if (strcasecmp(key, "Duration") == 0) {
                        value_uint = g_variant_get_uint32(value);
                        metadata->duration = value_uint;
@@ -521,7 +535,7 @@ int _bt_avrcp_control_get_track_info(media_metadata_attributes_t *metadata)
 
        retv_if(metadata == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       conn = _bt_get_system_conn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        control_path = __bt_get_control_device_path();
@@ -592,12 +606,13 @@ void _bt_handle_avrcp_control_event(GVariant *reply, const char *path)
                        (strcasecmp(property, "Scan") == 0) ||
                        (strcasecmp(property, "Status") == 0)) {
                                const char *valstr;
-                               unsigned int type, val;
+                               unsigned int type, val = 0;
 
                                valstr = g_variant_get_string(value, NULL);
                                BT_DBG("Value : %s ", valstr);
                                type = __bt_media_attr_to_type(property);
-                               val = __bt_media_attrval_to_val(type, valstr);
+                               if (valstr)
+                                       val = __bt_media_attrval_to_val(type, valstr);
 
                                /* Send event to application */
                                param = g_variant_new("(u)", val);
@@ -620,11 +635,15 @@ void _bt_handle_avrcp_control_event(GVariant *reply, const char *path)
                        memset(&metadata, 0x00, sizeof(media_metadata_attributes_t));
 
                        ret = __bt_avrcp_control_parse_properties(
-                                                               &metadata, reply);
+                                                               &metadata, value);
                        if (BLUETOOTH_ERROR_NONE != ret) {
                                /* Free key and value because of break unless free not required */
                                free((char *)property);
                                g_variant_unref(value);
+                               g_free((char *)metadata.title);
+                               g_free((char *)metadata.artist);
+                               g_free((char *)metadata.album);
+                               g_free((char *)metadata.genre);
                                break;
                        }
 
old mode 100755 (executable)
new mode 100644 (file)
index 61dfd1b..cd6c898
@@ -19,9 +19,7 @@
 #include <glib.h>
 #include <dlog.h>
 #include <string.h>
-#if !defined(LIBNOTIFY_SUPPORT) && !defined(LIBNOTIFICATION_SUPPORT)
 #include <syspopup_caller.h>
-#endif
 #include <dbus/dbus.h>
 
 #include "bluetooth-api.h"
@@ -58,9 +56,7 @@ static bt_player_settinngs_t player_status[] = {
        { STATUS_INVALID, "" }
 };
 
-GDBusConnection *bt_gdbus_conn = NULL;
 static guint avrcp_reg_id = 0;
-static GDBusProxy *service_gproxy = NULL;
 
 /* Introspection data exposed from bt-service */
 static const gchar bt_avrcp_bluez_introspection_xml[] =
@@ -247,59 +243,13 @@ static GDBusNodeInfo *__bt_avrcp_create_method_node_info
        return node_info;
 }
 
-static GDBusProxy *__bt_avrcp_gdbus_init_service_proxy(void)
-{
-       BT_DBG("+");
-       GDBusProxy *proxy;
-       GError *err = NULL;
-       char *adapter_path;
-
-       if (bt_gdbus_conn == NULL)
-               bt_gdbus_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
-
-       if (!bt_gdbus_conn) {
-               if (err) {
-                       BT_ERR("Unable to connect to gdbus: %s", err->message);
-                       g_clear_error(&err);
-               }
-               return NULL;
-       }
-
-       adapter_path = _bt_get_adapter_path();
-       retv_if(adapter_path == NULL, NULL);
-
-       proxy =  g_dbus_proxy_new_sync(bt_gdbus_conn,
-                       G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       BT_BLUEZ_NAME, adapter_path,
-                       BT_MEDIA_INTERFACE, NULL, &err);
-       g_free(adapter_path);
-
-       if (!proxy) {
-               BT_ERR("Unable to create proxy");
-               if (err) {
-                       BT_ERR("Error: %s", err->message);
-                       g_clear_error(&err);
-               }
-               return NULL;
-       }
-
-       BT_DBG("-");;
-       return proxy;
-}
-
-static GDBusProxy *__bt_avrcp_gdbus_get_service_proxy(void)
-{
-       return (service_gproxy) ? service_gproxy :
-                       __bt_avrcp_gdbus_init_service_proxy();
-}
-
 int _bt_register_media_player(void)
 {
        BT_DBG("+");
+       GDBusConnection *g_conn;
        gchar *adapter_path;
        gboolean shuffle_status;
        gchar *path;
-       GDBusConnection *conn;
        GDBusNodeInfo *node_info;
        GDBusProxy *proxy;
        GVariantBuilder *builder;
@@ -313,16 +263,15 @@ int _bt_register_media_player(void)
        player_settings.position = 0;
        shuffle_status = FALSE;
 
-       conn = _bt_get_system_gconn();
-       retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
-       bt_gdbus_conn = conn;
+       g_conn = _bt_gdbus_get_system_gconn();
+       retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        node_info = __bt_avrcp_create_method_node_info(
                                bt_avrcp_bluez_introspection_xml);
        if (node_info == NULL)
                return BLUETOOTH_ERROR_INTERNAL;
 
-       avrcp_reg_id = g_dbus_connection_register_object(bt_gdbus_conn,
+       avrcp_reg_id = g_dbus_connection_register_object(g_conn,
                                        BT_MEDIA_OBJECT_PATH,
                                        node_info->interfaces[0],
                                        &method_table,
@@ -338,7 +287,7 @@ int _bt_register_media_player(void)
        adapter_path = _bt_get_adapter_path();
        retv_if(adapter_path == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       proxy =  g_dbus_proxy_new_sync(conn,
+       proxy =  g_dbus_proxy_new_sync(g_conn,
                        G_DBUS_PROXY_FLAGS_NONE, NULL,
                        BT_BLUEZ_NAME, adapter_path,
                        BT_MEDIA_INTERFACE, NULL, &error);
@@ -397,8 +346,13 @@ int _bt_register_media_player(void)
 
 static void __bt_avrcp_unregister_object_path(void)
 {
+       GDBusConnection *g_conn;
+
+       g_conn = _bt_gdbus_get_system_gconn();
+       ret_if(g_conn == NULL);
+
        if (avrcp_reg_id > 0) {
-               g_dbus_connection_unregister_object(bt_gdbus_conn,
+               g_dbus_connection_unregister_object(g_conn,
                                                        avrcp_reg_id);
                avrcp_reg_id = 0;
        }
@@ -407,18 +361,43 @@ static void __bt_avrcp_unregister_object_path(void)
 int _bt_unregister_media_player(void)
 {
        BT_DBG("+");
+       GDBusConnection *g_conn;
        GDBusProxy *proxy;
+       gchar *adapter_path;
        GVariant *ret;
        GError *error = NULL;
-       GDBusConnection *conn;
        gchar *path;
+       int result = BLUETOOTH_ERROR_NONE;
 
-       conn = bt_gdbus_conn;
-       retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+       adapter_path = _bt_get_adapter_path();
+       if (adapter_path == NULL) {
+               result = BLUETOOTH_ERROR_INTERNAL;
+               goto FAIL;
+       }
 
-       proxy = __bt_avrcp_gdbus_get_service_proxy();
-       if (proxy == NULL)
-               return BLUETOOTH_ERROR_INTERNAL;
+       g_conn = _bt_gdbus_get_system_gconn();
+       if (g_conn == NULL) {
+               BT_ERR("g_conn is NULL");
+               g_free(adapter_path);
+               result = BLUETOOTH_ERROR_INTERNAL;
+               goto FAIL;
+       }
+
+       proxy =  g_dbus_proxy_new_sync(g_conn,
+                       G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       BT_BLUEZ_NAME, adapter_path,
+                       BT_MEDIA_INTERFACE, NULL, &error);
+       g_free(adapter_path);
+
+       if (proxy == NULL) {
+               BT_ERR("Unable to create proxy");
+               if (error) {
+                       BT_ERR("Error: %s", error->message);
+                       g_clear_error(&error);
+               }
+               result = BLUETOOTH_ERROR_INTERNAL;
+               goto FAIL;
+       }
 
        path = g_strdup(BT_MEDIA_OBJECT_PATH);
        BT_DBG("path is [%s]", path);
@@ -428,6 +407,7 @@ int _bt_unregister_media_player(void)
                        G_DBUS_CALL_FLAGS_NONE, -1,
                        NULL, &error);
        g_free(path);
+       g_object_unref(proxy);
 
        if (ret == NULL) {
                BT_ERR("UnregisterPlayer failed");
@@ -436,24 +416,22 @@ int _bt_unregister_media_player(void)
                                        error->code, error->message);
                        g_clear_error(&error);
                }
-               return BLUETOOTH_ERROR_INTERNAL;
+               result = BLUETOOTH_ERROR_INTERNAL;
        }
+       g_variant_unref(ret);
 
+FAIL:
        __bt_avrcp_unregister_object_path();
 
-       g_variant_unref(ret);
-       g_object_unref(bt_gdbus_conn);
-       bt_gdbus_conn = NULL;
-
        BT_DBG("-");
-       return BLUETOOTH_ERROR_NONE;
+       return result;
 }
 
 int _bt_avrcp_set_track_info(media_metadata_attributes_t *meta_data)
 {
        BT_DBG("+");
        char *interface = BT_MEDIA_PLAYER_INTERFACE;
-       GDBusConnection *conn;
+       GDBusConnection *g_conn;
        GError *error = NULL;
        GVariantBuilder *builder = NULL;
        GVariantBuilder *inner_builder = NULL;
@@ -462,8 +440,8 @@ int _bt_avrcp_set_track_info(media_metadata_attributes_t *meta_data)
 
        retv_if(meta_data == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       conn = bt_gdbus_conn;
-       retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+       g_conn = _bt_gdbus_get_system_gconn();;
+       retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
        inner_builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
@@ -491,12 +469,12 @@ int _bt_avrcp_set_track_info(media_metadata_attributes_t *meta_data)
                "xesam:trackNumber", g_variant_new_int32(meta_data->number));
 
        g_variant_builder_add(inner_builder, "{sv}",
-               "mpris:lenght", g_variant_new_int64(meta_data->duration));
+               "mpris:length", g_variant_new_int64(meta_data->duration));
 
        g_variant_builder_add(builder, "{sv}",
                "Metadata", g_variant_new("a{sv}", inner_builder));
 
-       ret = g_dbus_connection_emit_signal(conn, NULL, BT_MEDIA_OBJECT_PATH,
+       ret = g_dbus_connection_emit_signal(g_conn, NULL, BT_MEDIA_OBJECT_PATH,
                                DBUS_INTERFACE_PROPERTIES,
                                "PropertiesChanged",
                                g_variant_new("(sa{sv})",
@@ -521,20 +499,20 @@ int _bt_avrcp_set_track_info(media_metadata_attributes_t *meta_data)
 int _bt_avrcp_set_interal_property(int type, media_player_settings_t *properties)
 {
        BT_DBG("+");
-       GDBusConnection *conn;
+       GDBusConnection *g_conn;
        int value;
        media_metadata_attributes_t meta_data;
        gboolean shuffle;
        GVariantBuilder *builder = NULL;
        GVariant *children[1];
 
-       conn = bt_gdbus_conn;
-       retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+       g_conn = _bt_gdbus_get_system_gconn();;
+       retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        switch (type) {
        case REPEAT:
                value = properties->repeat;
-               if (!__bt_media_emit_property_changed(conn, BT_MEDIA_OBJECT_PATH,
+               if (!__bt_media_emit_property_changed(g_conn, BT_MEDIA_OBJECT_PATH,
                                BT_MEDIA_PLAYER_INTERFACE, "LoopStatus",
                                g_variant_new_string(loopstatus_settings[value].property))) {
                        BT_ERR("Error sending the PropertyChanged signal \n");
@@ -548,7 +526,7 @@ int _bt_avrcp_set_interal_property(int type, media_player_settings_t *properties
                else
                        shuffle = TRUE;
 
-               if (!__bt_media_emit_property_changed(conn, BT_MEDIA_OBJECT_PATH,
+               if (!__bt_media_emit_property_changed(g_conn, BT_MEDIA_OBJECT_PATH,
                                BT_MEDIA_PLAYER_INTERFACE, "Shuffle",
                                g_variant_new_boolean(shuffle))) {
                        BT_ERR("Error sending the PropertyChanged signal \n");
@@ -557,7 +535,7 @@ int _bt_avrcp_set_interal_property(int type, media_player_settings_t *properties
                break;
        case STATUS:
                value = properties->status;
-               if (!__bt_media_emit_property_changed(conn, BT_MEDIA_OBJECT_PATH,
+               if (!__bt_media_emit_property_changed(g_conn, BT_MEDIA_OBJECT_PATH,
                                BT_MEDIA_PLAYER_INTERFACE, "PlaybackStatus",
                                g_variant_new_string(player_status[value].property))) {
                        BT_ERR("Error sending the PropertyChanged signal \n");
@@ -566,7 +544,7 @@ int _bt_avrcp_set_interal_property(int type, media_player_settings_t *properties
                break;
        case POSITION:
                value = properties->position;
-               if (!__bt_media_emit_property_changed(conn, BT_MEDIA_OBJECT_PATH,
+               if (!__bt_media_emit_property_changed(g_conn, BT_MEDIA_OBJECT_PATH,
                                BT_MEDIA_PLAYER_INTERFACE, "Position",
                                g_variant_new_uint32(value))) {
                        BT_ERR("Error sending the PropertyChanged signal \n");
@@ -600,9 +578,9 @@ int _bt_avrcp_set_interal_property(int type, media_player_settings_t *properties
                                "xesam:trackNumber", g_variant_new_int32(meta_data.number));
 
                g_variant_builder_add(builder, "{sv}",
-                               "mpris:lenght", g_variant_new_int64(meta_data.duration));
+                               "mpris:length", g_variant_new_int64(meta_data.duration));
 
-               if (!__bt_media_emit_property_changed(conn, BT_MEDIA_OBJECT_PATH,
+               if (!__bt_media_emit_property_changed(g_conn, BT_MEDIA_OBJECT_PATH,
                                BT_MEDIA_PLAYER_INTERFACE, "Metadata",
                                g_variant_new("a{sv}", builder))) {
                        BT_ERR("Error sending the PropertyChanged signal \n");
old mode 100755 (executable)
new mode 100644 (file)
index 4c82de9..88b8ee4
@@ -45,25 +45,23 @@ static void *net_conn;
 
 static GDBusProxy *adapter_properties_proxy;
 
-static GDBusConnection *system_gconn = NULL;
-
 GDBusConnection *_bt_gdbus_init_system_gconn(void)
 {
        GError *error = NULL;
 
        dbus_threads_init_default();
 
-       if (system_gconn != NULL)
-               return system_gconn;
+       if (system_conn != NULL)
+               return system_conn;
 
-       system_gconn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+       system_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
 
-       if (!system_gconn) {
+       if (!system_conn) {
                BT_ERR("Unable to connect to dbus: %s", error->message);
                g_clear_error(&error);
        }
 
-       return system_gconn;
+       return system_conn;
 }
 
 GDBusConnection *_bt_gdbus_get_system_gconn(void)
@@ -71,10 +69,9 @@ GDBusConnection *_bt_gdbus_get_system_gconn(void)
        GDBusConnection *local_system_gconn = NULL;
        GError *error = NULL;
 
-       if (system_gconn == NULL) {
-               system_gconn = _bt_gdbus_init_system_gconn();
-       } else if (g_dbus_connection_is_closed(system_gconn)) {
-
+       if (system_conn == NULL) {
+               system_conn = _bt_gdbus_init_system_gconn();
+       } else if (g_dbus_connection_is_closed(system_conn)) {
                local_system_gconn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
 
                if (!local_system_gconn) {
@@ -82,26 +79,73 @@ GDBusConnection *_bt_gdbus_get_system_gconn(void)
                        g_clear_error(&error);
                }
 
-               system_gconn = local_system_gconn;
+               system_conn = local_system_gconn;
+       }
+
+       return system_conn;
+}
+
+GDBusConnection *_bt_gdbus_init_session_gconn(void)
+{
+       GError *error = NULL;
+
+       if (!g_thread_supported())
+               g_thread_init(NULL);
+
+       dbus_threads_init_default();
+
+       if (session_conn != NULL)
+               return session_conn;
+
+       session_conn = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error);
+
+       if (!session_conn) {
+               BT_ERR("Unable to connect to dbus: %s", error->message);
+               g_clear_error(&error);
+       }
+
+       return session_conn;
+}
+
+GDBusConnection *_bt_gdbus_get_session_gconn(void)
+{
+       GDBusConnection *local_session_gconn = NULL;
+       GError *error = NULL;
+
+       if (session_conn == NULL) {
+               session_conn = _bt_gdbus_init_session_gconn();
+       } else if (g_dbus_connection_is_closed(session_conn)) {
+               local_session_gconn = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error);
+
+               if (!local_session_gconn) {
+                       BT_ERR("Unable to connect to dbus: %s", error->message);
+                       g_clear_error(&error);
+               }
+
+               session_conn = local_session_gconn;
        }
 
-       return system_gconn;
+       return session_conn;
 }
 
 static GDBusProxy *__bt_init_manager_proxy(void)
 {
+       GDBusConnection *g_conn;
        GDBusProxy *proxy;
 
-       if (system_conn == NULL) {
-               system_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL);
-               retv_if(system_conn == NULL, NULL);
-       }
+       dbus_threads_init_default();
 
-       proxy = g_dbus_proxy_new_sync(system_conn, G_DBUS_PROXY_FLAGS_NONE,
+       g_conn = _bt_gdbus_get_system_gconn();
+       retv_if(g_conn == NULL, NULL);
+
+       proxy = g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE,
                                                                NULL, BT_BLUEZ_NAME,
                                                                BT_MANAGER_PATH, BT_MANAGER_INTERFACE,  NULL, NULL);
 
-       retv_if(proxy == NULL, NULL);
+       if (!proxy) {
+               BT_ERR("Unable to get proxy");
+               return NULL;
+       }
 
        manager_proxy = proxy;
 
@@ -110,14 +154,15 @@ static GDBusProxy *__bt_init_manager_proxy(void)
 
 static GDBusProxy *__bt_init_adapter_proxy(void)
 {
+       GDBusConnection *g_conn;
        GDBusProxy *manager_proxy;
        GDBusProxy *proxy;
        char *adapter_path = NULL;
 
-       if (system_conn == NULL) {
-               system_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL);
-               retv_if(system_conn == NULL, NULL);
-       }
+       dbus_threads_init_default();
+
+       g_conn = _bt_gdbus_get_system_gconn();
+       retv_if(g_conn == NULL, NULL);
 
        manager_proxy = _bt_get_manager_proxy();
        retv_if(manager_proxy == NULL, NULL);
@@ -125,7 +170,7 @@ static GDBusProxy *__bt_init_adapter_proxy(void)
        adapter_path = _bt_get_adapter_path();
        retv_if(adapter_path == NULL, NULL);
 
-       proxy = g_dbus_proxy_new_sync(system_conn, G_DBUS_PROXY_FLAGS_NONE,
+       proxy = g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE,
                                                                NULL, BT_BLUEZ_NAME,
                                                                adapter_path, BT_ADAPTER_INTERFACE,  NULL, NULL);
 
@@ -140,14 +185,15 @@ static GDBusProxy *__bt_init_adapter_proxy(void)
 
 static GDBusProxy *__bt_init_adapter_properties_proxy(void)
 {
+       GDBusConnection *g_conn;
        GDBusProxy *manager_proxy;
        GDBusProxy *proxy;
        char *adapter_path = NULL;
 
-       if (system_conn == NULL) {
-               system_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL);
-               retv_if(system_conn == NULL, NULL);
-       }
+       dbus_threads_init_default();
+
+       g_conn = _bt_gdbus_get_system_gconn();
+       retv_if(g_conn == NULL, NULL);
 
        manager_proxy = _bt_get_manager_proxy();
        retv_if(manager_proxy == NULL, NULL);
@@ -155,7 +201,7 @@ static GDBusProxy *__bt_init_adapter_properties_proxy(void)
        adapter_path = _bt_get_adapter_path();
        retv_if(adapter_path == NULL, NULL);
 
-       proxy = g_dbus_proxy_new_sync(system_conn, G_DBUS_PROXY_FLAGS_NONE,
+       proxy = g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE,
                                                                        NULL, BT_BLUEZ_NAME,
                                                                        adapter_path, BT_PROPERTIES_INTERFACE,  NULL, NULL);
 
@@ -168,47 +214,6 @@ static GDBusProxy *__bt_init_adapter_properties_proxy(void)
        return proxy;
 }
 
-GDBusConnection *__bt_init_system_gconn(void)
-{
-       if (system_conn == NULL)
-               system_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL);
-
-       return system_conn;
-}
-
-GDBusConnection *__bt_init_session_conn(void)
-{
-       if (session_conn == NULL)
-               session_conn = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL);
-
-       return session_conn;
-}
-
-GDBusConnection *_bt_get_session_gconn(void)
-{
-       return (session_conn) ? session_conn : __bt_init_session_conn();
-}
-
-GDBusConnection *_bt_get_system_gconn(void)
-{
-       return (system_conn) ? system_conn : __bt_init_system_gconn();
-}
-
-GDBusConnection *_bt_get_system_conn(void)
-{
-       GDBusConnection *g_conn;
-
-       if (system_conn == NULL) {
-               g_conn = __bt_init_system_gconn();
-       } else {
-               g_conn = system_conn;
-       }
-
-       retv_if(g_conn == NULL, NULL);
-
-       return g_conn;
-}
-
 GDBusProxy *_bt_get_manager_proxy(void)
 {
        if (manager_proxy) {
@@ -303,7 +308,7 @@ char *_bt_get_adapter_path(void)
        GVariantIter *iter = NULL;
        char *adapter_path = NULL;
 
-       conn = _bt_get_system_conn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, NULL);
 
        manager_proxy = _bt_get_manager_proxy();
@@ -384,9 +389,8 @@ void _bt_convert_device_path_to_address(const char *device_path,
                dev_addr += 4;
                g_strlcpy(address, dev_addr, sizeof(address));
 
-               while ((pos = strchr(address, '_')) != NULL) {
+               while ((pos = strchr(address, '_')) != NULL)
                        *pos = ':';
-               }
 
                g_strlcpy(device_address, address, BT_ADDRESS_STRING_SIZE);
        }
@@ -396,21 +400,40 @@ void _bt_convert_device_path_to_address(const char *device_path,
 void _bt_convert_addr_string_to_type(unsigned char *addr,
                                        const char *address)
 {
-        int i;
-        char *ptr = NULL;
+       int i;
+       char *ptr = NULL;
+
+       ret_if(address == NULL);
+       ret_if(addr == NULL);
+
+       for (i = 0; i < BT_ADDRESS_LENGTH_MAX; i++) {
+               addr[i] = strtol(address, &ptr, 16);
+               if (ptr[0] != '\0') {
+                       if (ptr[0] != ':')
+                               return;
+
+               address = ptr + 1;
+               }
+       }
+}
+
+void _bt_convert_addr_string_to_secure_string(char *addr,
+                                       const char *address)
+{
+       int len;
 
        ret_if(address == NULL);
        ret_if(addr == NULL);
 
-        for (i = 0; i < BT_ADDRESS_LENGTH_MAX; i++) {
-                addr[i] = strtol(address, &ptr, 16);
-                if (ptr[0] != '\0') {
-                        if (ptr[0] != ':')
-                                return;
+       len = strlen(address);
+       ret_if(len != BT_ADDRESS_STRING_SIZE - 1);
 
-                        address = ptr + 1;
-                }
-        }
+       strncpy(addr, address, len);
+
+       addr[len-1] = 'X';
+       addr[len-2] = 'X';
+
+       return;
 }
 
 void _bt_convert_addr_type_to_string(char *address,
@@ -552,9 +575,8 @@ int _bt_set_socket_non_blocking(int socket_fd)
        if (arg < 0)
                return -errno;
 
-       if (arg & O_NONBLOCK) {
+       if (arg & O_NONBLOCK)
                BT_ERR("Already Non-blocking \n");
-       }
 
        arg |= O_NONBLOCK;
 
@@ -593,12 +615,17 @@ static char *__bt_extract_device_path(GVariantIter *iter, char *address)
        /* Parse the signature: oa{sa{sv}}} */
        while (g_variant_iter_loop(iter, "{&oa{sa{sv}}}", &object_path,
                        NULL)) {
-               retv_if(object_path == NULL, NULL);
+               if (!object_path) {
+                       BT_ERR("Unable to get object path");
+                       return NULL;
+               }
                _bt_convert_device_path_to_address(object_path, device_address);
-               if (g_strcmp0(address, device_address) == 0) {
+               if (g_strcmp0(address, device_address) == 0)
                        return g_strdup(object_path);
-               }
+
        }
+
+       BT_ERR("Unable to get object path");
        return NULL;
 }
 
@@ -610,7 +637,7 @@ char *_bt_get_device_object_path(char *address)
        GVariant *result = NULL;
        GVariantIter *iter = NULL;
 
-       conn = _bt_get_system_conn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, NULL);
 
        manager_proxy = _bt_get_manager_proxy();
@@ -652,6 +679,8 @@ char *_bt_get_profile_uuid128(bt_profile_type_t profile_type)
                return strdup(NAP_UUID);
        case BT_PROFILE_CONN_HFG:
                return strdup(HFP_AG_UUID);
+       case BT_PROFILE_CONN_PBAP:
+               return strdup(PBAP_UUID);
        case BT_PROFILE_CONN_GATT:
        case BT_PROFILE_CONN_ALL: /* NULL UUID will connect to both the audio profiles*/
        default:
@@ -735,6 +764,8 @@ char *_bt_convert_error_to_string(int error)
                return "ALREADY_DEACTIVATED";
        case BLUETOOTH_ERROR_NOT_INITIALIZED:
                return "NOT_INITIALIZED";
+       case BLUETOOTH_ERROR_AUTHENTICATION_REJECTED:
+               return "AUTHENTICATION REJECTED";
        default:
                return "UNKNOWN";
        }
@@ -743,13 +774,26 @@ char *_bt_convert_error_to_string(int error)
 char * _bt_convert_disc_reason_to_string(int reason)
 {
        switch (reason) {
-       case 1:
+       case (int)BLUETOOTH_ERROR_PAGE_TIMEOUT:
+               return "Page timeout";
+       case (int)BLUETOOTH_ERROR_CONNECTION_TIMEOUT:
                return "Link loss";
-       case 2:
+       case (int)BLUETOOTH_ERROR_PIN_OR_KEY_MISSING:
+               return "PIN or Key missing";
+       case (int)BLUETOOTH_ERROR_LOCAL_HOST_TERM:
                return "Connection terminated by local host";
-       case 3:
+       case (int)BLUETOOTH_ERROR_REMOTE_USER_TERM:
+       case (int)BLUETOOTH_ERROR_REMOTE_LOW_RESOURCES:
+       case (int)BLUETOOTH_ERROR_REMOTE_POWER_OFF:
                return "Remote user terminated connection";
-       case 0:
+       case (int)BLUETOOTH_ERROR_AUTH_FAILURE:
+               return "Authentication Failure";
+       case (int)BLUETOOTH_ERROR_REPEATED_ATTEMPTS:
+               return "Repeated attempts";
+       case (int)BLUETOOTH_ERROR_LMP_RESPONSE_TIMEOUT:
+               return "LMP response timeout";
+       case (int)BLUETOOTH_ERROR_CONNECTION_FAILED_TO_BE_ESTABLISHED:
+               return "Connection failed to be established";
        default:
                return "Unknown";
        }
@@ -778,36 +822,19 @@ void _bt_logging_connection(gboolean connect, int addr_type)
                        le_conn, le_disc, edr_conn, edr_disc);
 }
 
-int _bt_eventsystem_set_value(const char *event, const char *key, const char *value)
-{
-       int ret;
-       bundle *b = NULL;
-
-       b = bundle_create();
-
-       bundle_add_str(b, key, value);
-
-       ret = eventsystem_send_system_event(event, b);
-
-       BT_DBG("eventsystem_send_system_event result: %d", ret);
-
-       bundle_free(b);
-
-       return ret;
-}
-
 void _bt_swap_byte_ordering(char *data, int data_len)
 {
        char temp;
        int i, j;
+       int half = data_len / 2;
 
        ret_if(data == NULL);
        /* Swap to opposite endian */
-       for (i = 0, j = data_len - 1; i < data_len; i++, j--) {
+       for (i = 0, j = data_len - 1; i < half; i++, j--) {
                temp = data[i];
                data[i] = data[j];
                data[j] = temp;
-               }
+       }
 }
 
 int _bt_byte_arr_cmp(const char *data1, const char *data2, int data_len)
@@ -839,3 +866,118 @@ int _bt_byte_arr_cmp_with_mask(const char *data1, const char *data2,
                }
        return 0;
 }
+
+int _bt_eventsystem_set_value(const char *event, const char *key, const char *value)
+{
+       int ret = ES_R_OK;
+/* Send event system event in bt-core process because bt-service's permission is not system in now */
+\r#if 0
+       bundle *b = NULL;
+
+       b = bundle_create();
+
+       bundle_add_str(b, key, value);
+
+       ret = eventsystem_send_system_event(event, b);
+
+       BT_DBG("eventsystem_send_system_event result: %d", ret);
+
+       bundle_free(b);
+#endif
+       return ret;
+}
+
+void __bt_get_auth_info(GVariant *reply, char *auth_info)
+{
+       int cursor;
+       GVariant *tmp_value;
+       char *manufacturer_data = NULL;
+       int manufacturer_data_len;
+       gboolean is_alias_set;
+       GVariantIter *value_iter;
+       guint8 m_value;
+       int i = 0;
+
+       tmp_value = g_variant_lookup_value(reply, "IsAliasSet",
+                                                               G_VARIANT_TYPE_BOOLEAN);
+       if (tmp_value) {
+               is_alias_set = g_variant_get_boolean(tmp_value);
+               g_variant_unref(tmp_value);
+       } else {
+               is_alias_set = FALSE;
+       }
+       if (is_alias_set == FALSE) {
+               tmp_value = g_variant_lookup_value(reply, "ManufacturerDataLen",
+                                                               G_VARIANT_TYPE_UINT16);
+               if (tmp_value) {
+                       manufacturer_data_len = g_variant_get_uint16(tmp_value);
+                       if (manufacturer_data_len >
+                                       BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX) {
+                               BT_ERR("manufacturer_data_len is too long");
+                               manufacturer_data_len = BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX;
+                       }
+                       g_variant_unref(tmp_value);
+               } else
+                       manufacturer_data_len = 0;
+
+               tmp_value = g_variant_lookup_value(reply, "ManufacturerData",
+                                                               G_VARIANT_TYPE_ARRAY);
+               if (tmp_value) {
+                       if ((manufacturer_data_len == 0) ||
+                                       manufacturer_data_len != g_variant_get_size(tmp_value)) {
+                               BT_ERR("manufacturer data length doesn't match");
+                               manufacturer_data_len = 0;
+                               manufacturer_data = NULL;
+                       } else {
+                               manufacturer_data = g_malloc0(manufacturer_data_len);
+                               g_variant_get(tmp_value, "ay", &value_iter);
+                               while (g_variant_iter_loop(value_iter, "y", &m_value))
+                                       manufacturer_data[i++] = m_value;
+                       }
+                       g_variant_unref(tmp_value);
+               } else {
+                       BT_INFO("manufacture data is not a G_VARIANT_TYPE_ARRAY ");
+                       manufacturer_data_len = 0;
+                       manufacturer_data = NULL;
+               }
+               /*minimum Size of the samsung specific manufacturer data is greater than 30 */
+               if (manufacturer_data_len < 30) {
+                       g_free(manufacturer_data);
+                       return;
+               }
+               if (manufacturer_data[0] != 0x00 || manufacturer_data[1] != 0x75) {
+                       BT_DBG("This is not a samsung specific manufaturer data");
+                       g_free(manufacturer_data);
+                       return;
+               }
+
+               /* 2  samsung (0x00 0x75) + 1 (control and version) + 1 (service ID) +
+               1 (discovery version) + 1 (associated service ID)
+               2 (Proxamity and locality) + 2 (Device type and icon) */
+
+               cursor = 10;
+
+               memcpy(auth_info, &(manufacturer_data[cursor]), 5);
+       }
+        g_free(manufacturer_data);
+}
+
+int _bt_convert_gerror(GError *g_error)
+{
+       int ret = BLUETOOTH_ERROR_INTERNAL;
+       gchar *str;
+
+       if (!g_dbus_error_strip_remote_error(g_error))
+               return ret;
+
+       str = g_error->message;
+
+       if (g_strcmp0(str, "Connection refused") == 0)
+               ret = BLUETOOTH_ERROR_AUTHENTICATION_REJECTED;
+       else if (g_strcmp0(str, "Connection timed out") == 0)
+               ret = BLUETOOTH_ERROR_TIMEOUT;
+       else if (g_strcmp0(str, "In Progress") == 0)
+               ret = BLUETOOTH_ERROR_IN_PROGRESS;
+
+       return ret;
+}
old mode 100755 (executable)
new mode 100644 (file)
index 8f6a3f7..630e23c
 #include <gio/gio.h>
 #include <dlog.h>
 #include <string.h>
-#if !defined(LIBNOTIFY_SUPPORT) && !defined(LIBNOTIFICATION_SUPPORT)
 #include <syspopup_caller.h>
-#endif
+#include <vconf.h>
 #include <bundle_internal.h>
 
+
 #include "bluetooth-api.h"
 #include "bt-internal-types.h"
 
 #include "bt-service-common.h"
+#include "bt-service-adapter-le.h"
 #include "bt-service-event.h"
 #include "bt-service-device.h"
-#include "bt-service-adapter-le.h"
 #include "bt-service-rfcomm-client.h"
 #include "bt-service-util.h"
 #include "bt-service-agent.h"
 #define BT_LE_CONN_TO_SPLIT 10 /* msec */
 #define BT_DEVICE_PIN_CODE_SLOT_MAX 10
 
-#define BT_LE_CONN_PARAM_DEFAULT_SUPERVISION_TIMEOUT   20000   /* msec */
+#define BT_LE_CONN_PARAM_DEFAULT_SUPERVISION_TIMEOUT   6000    /* msec */
 
 #define BT_LE_CONN_PARAM_BALANCED_MIN_INTERVAL 30      /* msec */
 #define BT_LE_CONN_PARAM_BALANCED_MAX_INTERVAL 50      /* msec */
 #define BT_LE_CONN_PARAM_BALANCED_SLAVE_LATENCY        0       /* event */
 
-#define BT_LE_CONN_PARAM_LOW_LATENCY_MIN_INTERVAL      7.5     /* msec */
-#define BT_LE_CONN_PARAM_LOW_LATENCY_MAX_INTERVAL      10      /* msec */
+#define BT_LE_CONN_PARAM_LOW_LATENCY_MIN_INTERVAL      10      /* msec */
+#define BT_LE_CONN_PARAM_LOW_LATENCY_MAX_INTERVAL      30      /* msec */
 #define BT_LE_CONN_PARAM_LOW_LATENCY_SLAVE_LATENCY     0       /* event */
 
 #define BT_LE_CONN_PARAM_LOW_POWER_MIN_INTERVAL                80      /* msec */
 #define BT_LE_CONN_PARAM_LOW_POWER_MAX_INTERVAL                100     /* msec */
 #define BT_LE_CONN_PARAM_LOW_POWER_SLAVE_LATENCY       2       /* event */
 
+#define PROFILE_SUPPORTED 0x3 /* This corresponds to binary 0b11*/
+
 typedef struct {
        int req_id;
        int result;
@@ -74,6 +76,7 @@ typedef struct {
        GDBusProxy *adapter_proxy;
        void *agent;
        unsigned short conn_type;
+       gboolean bonding_wo_discovery;
 } bt_funcion_data_t;
 
 typedef struct {
@@ -81,12 +84,20 @@ typedef struct {
        char *pin_code;
 } bt_pin_code_info_t;
 
+typedef struct {
+       int req_id;
+       bluetooth_device_address_t bd_addr;
+       gboolean auto_connect;
+} bt_pending_le_conn_info_s;
+
 gboolean is_device_creating;
 bt_funcion_data_t *bonding_info;
 bt_funcion_data_t *searching_info;
-bt_funcion_data_t *le_connection_info;
+bt_funcion_data_t *att_mtu_req_info;
 
 static GSList *pin_info_list = NULL;
+static bt_pending_le_conn_info_s *pending_le_conn_info = NULL;
+static guint pending_le_conn_timer_id = 0;
 
 /* This HID Mouse does not support pairing precedure. need to skip it. */
 #define SMB_MOUSE_LAP_ADDR "00:12:A1"
@@ -180,7 +191,7 @@ done:
        BT_DBG("-");
 } */
 
-#ifdef TIZEN_WEARABLE
+#ifdef TIZEN_PROFILE_WEARABLE
 static gboolean __bt_syspopup_timer_cb(gpointer user_data)
 {
        int ret;
@@ -189,9 +200,7 @@ static gboolean __bt_syspopup_timer_cb(gpointer user_data)
 
        b = (bundle *)user_data;
 
-#if !defined(LIBNOTIFY_SUPPORT) && !defined(LIBNOTIFICATION_SUPPORT)
        ret = syspopup_launch("bt-syspopup", b);
-#endif
        if (ret < 0) {
                BT_ERR("Sorry!! Cannot launch popup return = %d, Retrying...", ret);
        } else {
@@ -208,7 +217,7 @@ static gboolean __bt_launch_unable_to_pairing_syspopup(int result)
        bundle *b = NULL;
        GDBusConnection *conn;
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        if (conn == NULL)
                return FALSE;
 
@@ -225,9 +234,7 @@ static gboolean __bt_launch_unable_to_pairing_syspopup(int result)
        else
                bundle_add(b, "error", "error");
 
-#if !defined(LIBNOTIFY_SUPPORT) && !defined(LIBNOTIFICATION_SUPPORT)
        ret = syspopup_launch("bt-syspopup", b);
-#endif
        if (0 > ret) {
                BT_ERR("Popup launch failed...retry %d \n", ret);
                g_timeout_add(200, (GSourceFunc) __bt_syspopup_timer_cb,
@@ -266,29 +273,6 @@ void _bt_set_autopair_status_in_bonding_info(gboolean is_autopair)
        bonding_info->is_autopair = is_autopair;
 }
 
-void _bt_device_path_to_address(const char *device_path,
-                                       char *device_address)
-{
-       char address[BT_ADDRESS_STRING_SIZE] = { 0 };
-       char *dev_addr;
-       char *pos;
-
-       ret_if(device_path == NULL);
-       ret_if(device_address == NULL);
-
-       dev_addr = strstr(device_path, "dev_");
-       ret_if(dev_addr == NULL);
-
-       dev_addr += 4;
-       g_strlcpy(address, dev_addr, sizeof(address));
-
-       while ((pos = strchr(address, '_')) != NULL) {
-               *pos = ':';
-       }
-
-       g_strlcpy(device_address, address, BT_ADDRESS_STRING_SIZE);
-}
-
 void __bt_cancel_search_service_done(void)
 {
        int result = BLUETOOTH_ERROR_CANCEL_BY_USER;
@@ -338,40 +322,52 @@ static void __bt_get_uuids(GVariant *value, bt_remote_dev_info_t *info)
 
 bt_remote_dev_info_t *_bt_get_remote_device_info(char *address)
 {
-       bt_remote_dev_info_t *dev_info;
        char *object_path = NULL;
+       bt_remote_dev_info_t *dev_info;
+
+       retv_if(address == NULL, NULL);
+
+       object_path = _bt_get_device_object_path(address);
+       retv_if(object_path == NULL, NULL);
+
+       dev_info = _bt_get_remote_device_info_by_object_path(object_path);
+
+       g_free(object_path);
+       return dev_info;
+}
+
+bt_remote_dev_info_t *_bt_get_remote_device_info_by_object_path(
+                                                       const char *object_path)
+{
+       bt_remote_dev_info_t *dev_info;
        GDBusProxy *adapter_proxy;
        GDBusProxy *device_proxy;
        GVariant *value;
        GVariant *tmp_value;
        gchar *name;
-       gchar *manufacturer_data = NULL;
+       gchar * address;
        GDBusConnection *conn;
        GError *error = NULL;
        GVariant *result = NULL;
-
-       retv_if(address == NULL, NULL);
+       GVariantIter *value_iter;
+       guint8 m_value;
+       int i = 0;
 
        adapter_proxy = _bt_get_adapter_proxy();
        retv_if(adapter_proxy == NULL, NULL);
 
-
-       object_path = _bt_get_device_object_path(address);
-
        retv_if(object_path == NULL, NULL);
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        if (conn == NULL) {
                BT_ERR("conn == NULL");
-               g_free(object_path);
                return NULL;
        }
 
        device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
-                                                               NULL, BT_BLUEZ_NAME,
-                                                               object_path, BT_PROPERTIES_INTERFACE,  NULL, NULL);
+                                       NULL, BT_BLUEZ_NAME, object_path,
+                                       BT_PROPERTIES_INTERFACE,  NULL, NULL);
 
-       g_free(object_path);
        retv_if(device_proxy == NULL, NULL);
 
        result = g_dbus_proxy_call_sync(device_proxy, "GetAll",
@@ -401,52 +397,97 @@ bt_remote_dev_info_t *_bt_get_remote_device_info(char *address)
                        g_variant_unref(tmp_value);
                }
 
+               tmp_value = g_variant_lookup_value(value, "IsAliasSet", G_VARIANT_TYPE_BOOLEAN);
+               if (tmp_value) {
+                       dev_info->is_alias_set = g_variant_get_boolean(tmp_value);
+                       g_variant_unref(tmp_value);
+               } else {
+                       dev_info->is_alias_set = FALSE;
+               }
+               BT_DBG("IsAliasSet: [%s]", dev_info->is_alias_set ? "TRUE" : "FALSE");
+
                tmp_value = g_variant_lookup_value(value, "Class", G_VARIANT_TYPE_UINT32);
-               dev_info->class = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
-               g_variant_unref(tmp_value);
+               if (tmp_value) {
+                       dev_info->class = g_variant_get_uint32(tmp_value);
+                       g_variant_unref(tmp_value);
+               } else
+                       dev_info->class = 0;
 
-               tmp_value = g_variant_lookup_value(value, "Connected",  G_VARIANT_TYPE_BOOLEAN);
-               dev_info->connected = tmp_value ? g_variant_get_boolean(tmp_value) : BLUETOOTH_CONNECTED_LINK_NONE;
-               g_variant_unref(tmp_value);
+               tmp_value = g_variant_lookup_value(value, "Connected",  G_VARIANT_TYPE_BYTE);
+               if (tmp_value) {
+                       dev_info->connected = g_variant_get_byte(tmp_value);
+                       g_variant_unref(tmp_value);
+               } else
+                       dev_info->connected = BLUETOOTH_CONNECTED_LINK_NONE;
+               BT_DBG("connected link : %d", dev_info->connected);
 
                tmp_value = g_variant_lookup_value(value, "Trusted",  G_VARIANT_TYPE_BOOLEAN);
-               dev_info->trust = tmp_value ? g_variant_get_boolean(tmp_value) : FALSE;
-               g_variant_unref(tmp_value);
+               if (tmp_value) {
+                       dev_info->trust = g_variant_get_boolean(tmp_value);
+                       g_variant_unref(tmp_value);
+               } else
+                       dev_info->trust = FALSE;
 
                tmp_value = g_variant_lookup_value(value, "Paired",  G_VARIANT_TYPE_BOOLEAN);
-               dev_info->paired = tmp_value ? g_variant_get_boolean(tmp_value) : FALSE;
-               g_variant_unref(tmp_value);
-
-               BT_DBG("Paired %d", dev_info->paired);
+               if (tmp_value) {
+                       dev_info->paired = g_variant_get_boolean(tmp_value);
+                       g_variant_unref(tmp_value);
+               } else
+                       dev_info->paired = FALSE;
 
-               tmp_value = g_variant_lookup_value(value, "RSSI", G_VARIANT_TYPE_INT32);
-               dev_info->rssi = tmp_value ? g_variant_get_int32(tmp_value) : 0;
-               g_variant_unref(tmp_value);
+               tmp_value = g_variant_lookup_value(value, "RSSI", G_VARIANT_TYPE_INT16);
+               if (tmp_value) {
+                       dev_info->rssi = g_variant_get_int16(tmp_value);
+                       g_variant_unref(tmp_value);
+               } else
+                       dev_info->rssi = 0;
 
-               tmp_value = g_variant_lookup_value(value, "LastAddrType", G_VARIANT_TYPE_UINT32);
-               dev_info->addr_type = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
-               g_variant_unref(tmp_value);
+               tmp_value = g_variant_lookup_value(value, "LastAddrType", G_VARIANT_TYPE_BYTE);
+               if (tmp_value) {
+                       dev_info->addr_type = g_variant_get_byte(tmp_value);
+                       g_variant_unref(tmp_value);
+               } else
+                       dev_info->addr_type = 0;
 
                tmp_value = g_variant_lookup_value(value, "UUIDs", G_VARIANT_TYPE_STRING_ARRAY);
-               __bt_get_uuids(tmp_value, dev_info);
-               g_variant_unref(tmp_value);
-
-               tmp_value = g_variant_lookup_value(value, "ManufacturerDataLen", G_VARIANT_TYPE_UINT32);
-               dev_info->manufacturer_data_len = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
-               if (dev_info->manufacturer_data_len > BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX) {
-                       BT_ERR("manufacturer_data_len is too long(len = %d)", dev_info->manufacturer_data_len);
-                       dev_info->manufacturer_data_len = BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX;
+               if (tmp_value) {
+                       __bt_get_uuids(tmp_value, dev_info);
+                       g_variant_unref(tmp_value);
                }
-               g_variant_unref(tmp_value);
 
-               tmp_value = g_variant_lookup_value(value, "ManufacturerData", G_VARIANT_TYPE_BYTESTRING);
-               manufacturer_data = value ? (gchar *)g_variant_get_bytestring(tmp_value) : NULL;
-               if (manufacturer_data) {
-                       if (dev_info->manufacturer_data_len > 0) {
+               tmp_value = g_variant_lookup_value(value, "ManufacturerDataLen", G_VARIANT_TYPE_UINT16);
+               if (tmp_value) {
+                       dev_info->manufacturer_data_len = g_variant_get_uint16(tmp_value);
+                       if (dev_info->manufacturer_data_len > BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX) {
+                               BT_ERR("manufacturer_data_len is too long(len = %d)", dev_info->manufacturer_data_len);
+                               dev_info->manufacturer_data_len = BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX;
+                       }
+                       g_variant_unref(tmp_value);
+               } else
+                       dev_info->manufacturer_data_len = 0;
+
+               tmp_value = g_variant_lookup_value(value, "ManufacturerData", G_VARIANT_TYPE_ARRAY);
+               if (tmp_value) {
+                       if ((dev_info->manufacturer_data_len == 0) ||
+                                       dev_info->manufacturer_data_len != g_variant_get_size(tmp_value)) {
+                               BT_ERR("manufacturer data length doesn't match");
+                               dev_info->manufacturer_data_len = 0;
+                               dev_info->manufacturer_data = NULL;
+                       } else {
                                dev_info->manufacturer_data = g_malloc0(dev_info->manufacturer_data_len);
-                               memcpy(dev_info->manufacturer_data, manufacturer_data, dev_info->manufacturer_data_len);
+                               g_variant_get(tmp_value, "ay", &value_iter);
+                               while (g_variant_iter_loop(value_iter, "y", &m_value))
+                                       dev_info->manufacturer_data[i++] = m_value;
                        }
+                       g_variant_unref(tmp_value);
+               } else {
+                       BT_INFO("manufacture data is not a G_VARIANT_TYPE_ARRAY ");
+                       dev_info->manufacturer_data_len = 0;
+                       dev_info->manufacturer_data = NULL;
                }
+
+               tmp_value = g_variant_lookup_value(value, "Address", G_VARIANT_TYPE_STRING);
+               g_variant_get(tmp_value, "s", &address);
                g_variant_unref(tmp_value);
 
                dev_info->address = g_strdup(address);
@@ -571,6 +612,25 @@ static gboolean __ignore_auto_pairing_request(const char *address)
        return FALSE;
 }
 
+static int __bt_cancel_bonding(void)
+{
+       BT_CHECK_PARAMETER(bonding_info, return);
+       BT_CHECK_PARAMETER(bonding_info->addr, return);
+       /* First Cancel the ongoing pairing in bluez otherwise if we send
+        * pair request bluez will send inprogress and we again retry bond so
+        * this cycle continues */
+        GError *err = NULL;
+       g_dbus_proxy_call_sync(bonding_info->device_proxy, "CancelPairing",
+                       NULL, G_DBUS_CALL_FLAGS_NONE,
+                       10000, NULL, &err);
+       if (err) {
+               BT_ERR("Cancelling bonding request error msg (%s)", err->message);
+               g_clear_error(&err);
+               return BLUETOOTH_ERROR_PARING_FAILED;
+       }
+       return BLUETOOTH_ERROR_NONE;
+}
+
 static int __bt_retry_bond(void)
 {
        BT_CHECK_PARAMETER(bonding_info, return);
@@ -588,26 +648,40 @@ static int __bt_retry_bond(void)
 }
 
 
-static int __bt_remove_and_bond(char *device_path)
+static int __bt_remove_and_bond(void)
 {
        GDBusProxy *adapter_proxy;
+       GVariant *result = NULL;
        GError *err = NULL;
+       char *device_path = NULL;
 
        BT_CHECK_PARAMETER(bonding_info, return);
        BT_CHECK_PARAMETER(bonding_info->addr, return);
 
-       retv_if(device_path == NULL, BLUETOOTH_ERROR_INTERNAL);
-
        adapter_proxy = _bt_get_adapter_proxy();
        retv_if(adapter_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       g_dbus_proxy_call_sync(adapter_proxy, "UnpairDevice",
-                       g_variant_new("(o)", device_path),
-                       G_DBUS_CALL_FLAGS_NONE,
-                       -1,
-                       NULL,
-                       &err);
+       result = g_dbus_proxy_call_sync(adapter_proxy, "FindDevice",
+                               g_variant_new("(s)", bonding_info->addr),
+                               G_DBUS_CALL_FLAGS_NONE,
+                               -1,
+                               NULL,
+                               NULL);
+       if (result == NULL)
+               return BLUETOOTH_ERROR_INTERNAL;
+
+       g_variant_get(result , "(o)", &device_path);
+       g_variant_unref(result);
 
+       retv_if(device_path == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       result = g_dbus_proxy_call_sync(adapter_proxy, "UnpairDevice",
+                               g_variant_new("(o)", device_path),
+                               G_DBUS_CALL_FLAGS_NONE,
+                               -1,
+                               NULL,
+                               &err);
+       g_free(device_path);
        if (err != NULL) {
                BT_ERR("UnpairDevice Fail: %s", err->message);
                g_error_free(err);
@@ -626,7 +700,6 @@ static int __bt_cancel_and_bond(void)
                BT_ERR("Fail to call reply cancellation");
                return ret;
        }
-
        return __bt_retry_bond();
 }
 
@@ -636,20 +709,20 @@ static void __bt_bond_device_cb(GDBusProxy *proxy, GAsyncResult *res,
 {
        int result = BLUETOOTH_ERROR_NONE;
        GError *err = NULL;
+       GVariant *reply;
        GVariant *out_param1;
        request_info_t *req_info;
        bluetooth_device_info_t dev_info;
        bt_remote_dev_info_t *remote_dev_info;
        GVariant *manufacture_data;
        GVariant *param;
-       const char *device_path;
 
-#if !defined(LIBNOTIFY_SUPPORT) && !defined(LIBNOTIFICATION_SUPPORT)
        /* Terminate ALL system popup */
        syspopup_destroy_all();
-#endif
 
-        g_dbus_proxy_call_finish(proxy, res, &err);
+       reply = g_dbus_proxy_call_finish(proxy, res, &err);
+       if (reply)
+               g_variant_unref(reply);
 
        is_device_creating = FALSE;
 
@@ -667,19 +740,13 @@ static void __bt_bond_device_cb(GDBusProxy *proxy, GAsyncResult *res,
                goto done;
        }
 
-       device_path = g_dbus_proxy_get_object_path(proxy);
-
-       BT_DBG("device path: %s", device_path);
-
        if (err != NULL) {
                g_dbus_error_strip_remote_error(err);
                BT_ERR("Error occured in CreateBonding [%s]", err->message);
 
                if (g_strrstr(err->message, "Already Exists")) {
                        BT_INFO("Existing Bond, remove and retry");
-                       ret_if(__bt_remove_and_bond((char *)device_path) == BLUETOOTH_ERROR_NONE);
-
-                       BT_INFO("Fail to retry bonding");
+                       ret_if(__bt_remove_and_bond() == BLUETOOTH_ERROR_NONE);
 
                        result = BLUETOOTH_ERROR_PARING_FAILED;
                } else if (_bt_agent_is_canceled() ||
@@ -709,14 +776,12 @@ static void __bt_bond_device_cb(GDBusProxy *proxy, GAsyncResult *res,
                             the procedure is stopped. So 'Cancle' error is not return.
                        */
                        result = BLUETOOTH_ERROR_HOST_DOWN;
-               } else if (g_strrstr(err->message, BT_TIMEOUT_MESSAGE)) {
-                       g_dbus_proxy_call_sync(proxy, "CancelDeviceCreation",
-                                               g_variant_new("(s)", bonding_info->addr),
-                                               G_DBUS_CALL_FLAGS_NONE,
-                                               -1,
-                                               NULL,
-                                               NULL);
-
+               } else if (g_strrstr(err->message, BT_DBUS_TIMEOUT_MESSAGE)) {
+                       BT_INFO("Cancel already running bonding");
+                       if (__bt_cancel_bonding() != BLUETOOTH_ERROR_NONE) {
+                               BT_INFO("Error while Cancelling bonding");
+                               /* we need to unref proxy so continue */
+                       }
                        result = BLUETOOTH_ERROR_INTERNAL;
                } else if (g_strrstr(err->message, "Connection Timeout")) {
                        /* Pairing request timeout */
@@ -734,20 +799,65 @@ static void __bt_bond_device_cb(GDBusProxy *proxy, GAsyncResult *res,
                        result == BLUETOOTH_ERROR_AUTHENTICATION_FAILED ||
                        result == BLUETOOTH_ERROR_TIMEOUT ||
                        result == BLUETOOTH_ERROR_HOST_DOWN) {
-               bonding_info->result = result;
-#ifdef TIZEN_WEARABLE
-               __bt_launch_unable_to_pairing_syspopup(result);
+#ifdef TIZEN_PROFILE_WEARABLE
+               int is_sw_running = 0;
+
+               if (vconf_get_int(VCONFKEY_SETUP_WIZARD_STATE, &is_sw_running))
+                       BT_ERR("vconf_get_int for setup wizard state failed");
+
+               if (!is_sw_running)
+                       __bt_launch_unable_to_pairing_syspopup(result);
+               else
+                       BT_ERR("Unable to pair");
 #endif
+               bonding_info->result = result;
        }
 
        g_object_unref(proxy);
        bonding_info->device_proxy = NULL;
 
-       if (result != BLUETOOTH_ERROR_NONE)
+       if (result != BLUETOOTH_ERROR_NONE) {
+               if (bonding_info->bonding_wo_discovery) {
+                       GDBusProxy *adapter_proxy;
+                       GVariant *ret = NULL;
+                       GError *error = NULL;
+                       char *device_path;
+
+                       BT_ERR("Bond was tried without discovery. Remove it");
+
+                       adapter_proxy = _bt_get_adapter_proxy();
+                       if (adapter_proxy == NULL) {
+                               BT_ERR("Cannot get adapter_proxy");
+                               goto dbus_return;
+                       }
+
+                       device_path = _bt_get_device_object_path(bonding_info->addr);
+                       if (device_path == NULL) {
+                               BT_ERR("Cannot get device path");
+                               goto dbus_return;
+                       }
+
+                       ret = g_dbus_proxy_call_sync(adapter_proxy,
+                                       "RemoveDevice",
+                                       g_variant_new("(o)", device_path),
+                                       G_DBUS_CALL_FLAGS_NONE, -1, NULL,
+                                       &error);
+                       if (error != NULL) {
+                               BT_ERR("RemoveDevice Fail: %s", error->message);
+                               g_clear_error(&error);
+                       }
+
+                       if (ret)
+                               g_variant_unref(ret);
+
+                       g_free(device_path);
+               }
+
                goto dbus_return;
+       }
 
        remote_dev_info = _bt_get_remote_device_info(bonding_info->addr);
-       if (remote_dev_info == NULL)
+       if (!remote_dev_info)
                goto dbus_return;
 
        GVariant *uuids = NULL;
@@ -803,7 +913,6 @@ dbus_return:
                        g_variant_new("(iv)", result, out_param1));
 
        g_variant_unref(out_param1);
-//     g_variant_unref(out_param2);
 
        _bt_delete_request_list(req_info->req_id);
 done:
@@ -830,6 +939,7 @@ int _bt_bond_device(int request_id,
        char *device_path = NULL;
        GDBusProxy *adapter_proxy;
        GError *error = NULL;
+       gboolean bonding_wo_discovery = FALSE;
 
        BT_CHECK_PARAMETER(device_address, return);
 
@@ -846,7 +956,7 @@ int _bt_bond_device(int request_id,
                return BLUETOOTH_ERROR_DEVICE_BUSY;
        }
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        _bt_convert_addr_type_to_string(address, device_address->addr);
@@ -885,6 +995,7 @@ int _bt_bond_device(int request_id,
                } else {
                        BT_INFO("device_path is created[%s]", device_path);
                }
+               bonding_wo_discovery = TRUE;
        }
 
        proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
@@ -900,6 +1011,7 @@ int _bt_bond_device(int request_id,
 
        bonding_info->device_proxy = proxy;
        bonding_info->conn_type = conn_type;
+       bonding_info->bonding_wo_discovery = bonding_wo_discovery;
 
        is_device_creating = TRUE;
 
@@ -952,13 +1064,16 @@ static void __bt_unbond_cb(GDBusProxy *proxy, GAsyncResult *res,
                                        gpointer user_data)
 {
        GError *err = NULL;
+       GVariant *reply;
        GVariant *out_param1;
        int result = BLUETOOTH_ERROR_NONE;
        bt_funcion_data_t *unbonding_info;
        bluetooth_device_info_t dev_info;
        request_info_t *req_info;
 
-       g_dbus_proxy_call_finish(proxy, res, &err);
+       reply = g_dbus_proxy_call_finish(proxy, res, &err);
+       if (reply)
+               g_variant_unref(reply);
 
        unbonding_info = user_data;
 
@@ -1046,7 +1161,7 @@ int _bt_unbond_device(int request_id,
                goto fail;
        }
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        if (conn == NULL) {
                BT_ERR("conn is NULL");
                result = BLUETOOTH_ERROR_INTERNAL;
@@ -1088,7 +1203,7 @@ int _bt_unbond_device(int request_id,
                                BT_MAX_DBUS_TIMEOUT,
                                NULL,
                                (GAsyncReadyCallback)__bt_unbond_cb,
-                               NULL);
+                               unbonding_info);
 
        g_free(device_path);
        return BLUETOOTH_ERROR_NONE;
@@ -1110,6 +1225,7 @@ static void __bt_discover_cb(GDBusProxy *proxy, GAsyncResult *res,
                                        gpointer user_data)
 {
        GError *err = NULL;
+       GVariant *reply;
        GVariant *out_param1;
        int result = BLUETOOTH_ERROR_NONE;
        bluetooth_device_info_t dev_info;
@@ -1120,7 +1236,9 @@ static void __bt_discover_cb(GDBusProxy *proxy, GAsyncResult *res,
        GVariantBuilder *builder = NULL;
        int i = 0;
 
-       g_dbus_proxy_call_finish(proxy, res, &err);
+       reply = g_dbus_proxy_call_finish(proxy, res, &err);
+       if (reply)
+               g_variant_unref(reply);
 
        g_object_unref(proxy);
 
@@ -1140,15 +1258,14 @@ static void __bt_discover_cb(GDBusProxy *proxy, GAsyncResult *res,
                g_dbus_error_strip_remote_error(err);
                BT_ERR("Error occured in Proxy call [%s]\n", err->message);
 
-               if (g_strrstr("Operation canceled", err->message)) {
+               if (g_strrstr("Operation canceled", err->message))
                        result = BLUETOOTH_ERROR_CANCEL_BY_USER;
-               } else if (g_strrstr("In Progress", err->message)) {
+               else if (g_strrstr("In Progress", err->message))
                        result = BLUETOOTH_ERROR_IN_PROGRESS;
-               } else if (g_strrstr("Host is down", err->message)) {
+               else if (g_strrstr("Host is down", err->message))
                        result = BLUETOOTH_ERROR_HOST_DOWN;
-               } else {
+               else
                        result = BLUETOOTH_ERROR_CONNECTION_ERROR;
-               }
 
                if (result == BLUETOOTH_ERROR_HOST_DOWN ||
                     result == BLUETOOTH_ERROR_CONNECTION_ERROR) {
@@ -1164,7 +1281,7 @@ static void __bt_discover_cb(GDBusProxy *proxy, GAsyncResult *res,
        }
 
        remote_dev_info = _bt_get_remote_device_info(searching_info->addr);
-       if (remote_dev_info == NULL)
+       if (!remote_dev_info)
                goto dbus_return;
 
 event:
@@ -1259,7 +1376,7 @@ int _bt_search_device(int request_id,
        _bt_convert_addr_type_to_string(searching_info->addr,
                                        device_address->addr);
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
 
@@ -1292,6 +1409,7 @@ int _bt_search_device(int request_id,
 
        return BLUETOOTH_ERROR_NONE;
 fail:
+
        g_free(searching_info->addr);
        g_free(searching_info);
        searching_info = NULL;
@@ -1300,17 +1418,20 @@ fail:
 
 int _bt_cancel_search_device(void)
 {
+       GVariant *ret = NULL;
        GError *err = NULL;
 
        retv_if(searching_info == NULL, BLUETOOTH_ERROR_NOT_IN_OPERATION);
 
        if (searching_info->device_proxy) {
-               g_dbus_proxy_call_sync(searching_info->device_proxy, "CancelDiscovery",
+               ret = g_dbus_proxy_call_sync(searching_info->device_proxy, "CancelDiscovery",
                                NULL,
                                G_DBUS_CALL_FLAGS_NONE,
                                -1,
                                NULL,
                                &err);
+               if (ret)
+                       g_variant_unref(ret);
        }
        __bt_cancel_search_service_done();
 
@@ -1324,6 +1445,7 @@ int _bt_set_alias(bluetooth_device_address_t *device_address,
        gchar *device_path = NULL;
        GDBusProxy *adapter_proxy;
        GDBusProxy *device_proxy;
+       GVariant *ret = NULL;
        GError *error = NULL;
        GDBusConnection *conn;
 
@@ -1333,7 +1455,7 @@ int _bt_set_alias(bluetooth_device_address_t *device_address,
        adapter_proxy = _bt_get_adapter_proxy();
        retv_if(adapter_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        _bt_convert_addr_type_to_string(address, device_address->addr);
@@ -1352,12 +1474,14 @@ int _bt_set_alias(bluetooth_device_address_t *device_address,
        g_free(device_path);
        retv_if(device_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       g_dbus_proxy_call_sync(device_proxy, "Set",
+       ret = g_dbus_proxy_call_sync(device_proxy, "Set",
                                g_variant_new("(ssv)", BT_DEVICE_INTERFACE,  "Alias", g_variant_new("s", alias)),
                                G_DBUS_CALL_FLAGS_NONE,
                                -1,
                                NULL,
                                &error);
+       if (ret)
+               g_variant_unref(ret);
 
        g_object_unref(device_proxy);
 
@@ -1380,11 +1504,12 @@ int _bt_set_authorization(bluetooth_device_address_t *device_address,
        GError *error = NULL;
        GDBusConnection *conn;
        GVariant *result = NULL;
+       GVariant *temp = NULL;
        int ret = BLUETOOTH_ERROR_NONE;
 
        BT_CHECK_PARAMETER(device_address, return);
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        _bt_convert_addr_type_to_string(address, device_address->addr);
@@ -1416,7 +1541,9 @@ int _bt_set_authorization(bluetooth_device_address_t *device_address,
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
-       previous_value = g_variant_get_boolean(result);
+       g_variant_get(result, "(v)", &temp);
+       previous_value = g_variant_get_boolean(temp);
+       g_variant_unref(temp);
        g_variant_unref(result);
        /* If the input is same with previous value, return error. */
        if (previous_value == authorize) {
@@ -1426,7 +1553,7 @@ int _bt_set_authorization(bluetooth_device_address_t *device_address,
                goto done;
        }
 
-       g_dbus_proxy_call_sync(device_proxy, "Set",
+       result = g_dbus_proxy_call_sync(device_proxy, "Set",
                                 g_variant_new("(ssv)", BT_DEVICE_INTERFACE, "Trusted", g_variant_new("b", authorize)),
                                 G_DBUS_CALL_FLAGS_NONE,
                                 -1,
@@ -1440,6 +1567,9 @@ int _bt_set_authorization(bluetooth_device_address_t *device_address,
                 ret = BLUETOOTH_ERROR_INTERNAL;
        }
 done:
+       if (result)
+               g_variant_unref(result);
+
        return ret;
 }
 
@@ -1459,7 +1589,7 @@ int _bt_is_gatt_connected(bluetooth_device_address_t *device_address,
 
        BT_CHECK_PARAMETER(device_address, return);
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        _bt_convert_addr_type_to_string(address, device_address->addr);
@@ -1468,18 +1598,18 @@ int _bt_is_gatt_connected(bluetooth_device_address_t *device_address,
        retv_if(object_path == NULL, BLUETOOTH_ERROR_NOT_PAIRED);
 
        device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
-                                                               NULL, BT_BLUEZ_NAME,
-                                                               object_path, BT_PROPERTIES_INTERFACE,  NULL, NULL);
+                       NULL, BT_BLUEZ_NAME, object_path,
+                       BT_PROPERTIES_INTERFACE,  NULL, NULL);
        g_free(object_path);
        retv_if(device_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        result = g_dbus_proxy_call_sync(device_proxy, "GetAll",
-                         g_variant_new("(s)", BT_DEVICE_INTERFACE),
-                               G_DBUS_CALL_FLAGS_NONE,
-                               -1,
-                               NULL,
-                               &error);
-       if (error != NULL || result == NULL) {
+                       g_variant_new("(s)", BT_DEVICE_INTERFACE),
+                       G_DBUS_CALL_FLAGS_NONE,
+                       -1,
+                       NULL,
+                       &error);
+       if (result == NULL) {
                if (error != NULL) {
                        BT_ERR("Error occured in Proxy call [%s]\n", error->message);
                        g_error_free(error);
@@ -1492,15 +1622,16 @@ int _bt_is_gatt_connected(bluetooth_device_address_t *device_address,
        g_variant_unref(result);
 
        tmp_value = g_variant_lookup_value(value, "GattConnected", G_VARIANT_TYPE_BOOLEAN);
-
        if (tmp_value == NULL) {
                g_object_unref(device_proxy);
+               g_variant_unref(value);
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
        *is_connected = g_variant_get_boolean(tmp_value);
 
        BT_DBG("gatt is connected : %d", *is_connected);
+
        g_variant_unref(tmp_value);
        g_variant_unref(value);
        g_object_unref(device_proxy);
@@ -1532,16 +1663,18 @@ int _bt_is_device_connected(bluetooth_device_address_t *device_address,
                                                is_connected);
        else if (connection_type == BLUETOOTH_GATT_SERVICE)
                return _bt_is_gatt_connected(device_address, is_connected);
+       else if (connection_type == BLUETOOTH_PBAP_SERVICE)
+               return _bt_pbap_is_connected(device_address, is_connected);
 
        adapter_proxy = _bt_get_adapter_proxy();
        retv_if(adapter_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        _bt_convert_addr_type_to_string(address, device_address->addr);
 
-       if (connection_type == BLUETOOTH_NAP_SERVER_SERVICE)    {
+       if (connection_type == BLUETOOTH_NAP_SERVER_SERVICE) {
                object_path = _bt_get_adapter_path();
                device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
                                                                        NULL, BT_BLUEZ_NAME,
@@ -1549,7 +1682,7 @@ int _bt_is_device_connected(bluetooth_device_address_t *device_address,
                g_free(object_path);
                if (device_proxy == NULL) {
                        BT_DBG("Device don't have this service");
-                       return BLUETOOTH_ERROR_NONE;
+                       return BLUETOOTH_ERROR_INTERNAL;
                }
 
                result = g_dbus_proxy_call_sync(device_proxy, "GetProperties",
@@ -1560,11 +1693,12 @@ int _bt_is_device_connected(bluetooth_device_address_t *device_address,
                                        &error);
 
                if (result == NULL) {
-                       BT_ERR("Error occured in Proxy call");
+                       BT_ERR("[GetProperties] Error occured in Proxy call");
                        if (error) {
-                               BT_ERR("Error occured in Proxy call [%s]\n", error->message);
+                               BT_ERR("%s", error->message);
                                g_error_free(error);
                        }
+                       *is_connected = FALSE;
                        g_object_unref(device_proxy);
                        return BLUETOOTH_ERROR_NONE;
                }
@@ -1588,7 +1722,7 @@ int _bt_is_device_connected(bluetooth_device_address_t *device_address,
                uuid = _bt_get_profile_uuid128(connection_type);
                if (uuid == NULL) {
                        BT_ERR("uuid is NULL");
-                       return BLUETOOTH_ERROR_NONE;
+                       return BLUETOOTH_ERROR_INTERNAL;
                }
 
                BT_DBG("uuid: %s", uuid);
@@ -1603,7 +1737,7 @@ int _bt_is_device_connected(bluetooth_device_address_t *device_address,
                if (device_proxy == NULL) {
                        BT_DBG("Device don't have this service");
                        g_free(uuid);
-                       return BLUETOOTH_ERROR_NONE;
+                       return BLUETOOTH_ERROR_INTERNAL;
                }
 
                result = g_dbus_proxy_call_sync(device_proxy, "IsConnectedProfile",
@@ -1614,16 +1748,21 @@ int _bt_is_device_connected(bluetooth_device_address_t *device_address,
                                        &error);
 
                if (result == NULL) {
-                       BT_ERR("Error occured in Proxy call");
+                       BT_ERR("[IsConnectedProfile] Error occured in Proxy call");
                        if (error) {
-                               BT_ERR("Error occured in Proxy call [%s]\n", error->message);
+                               BT_ERR("%s", error->message);
+                               if (g_strrstr(error->message, "Not Connected"))
+                                       BT_DBG("Not connected");
                                g_error_free(error);
                        }
-               } else {
-                       g_variant_get(result, "(b)", is_connected);
+                       *is_connected = FALSE;
+                       g_object_unref(device_proxy);
                        g_free(uuid);
-                       g_variant_unref(result);
+                       return BLUETOOTH_ERROR_NONE;
                }
+               g_variant_get(result, "(b)", is_connected);
+               g_free(uuid);
+               g_variant_unref(result);
        }
 
        g_object_unref(device_proxy);
@@ -1643,11 +1782,9 @@ int _bt_get_connected_link(bluetooth_device_address_t *device_address,
        GVariant *value = NULL;
        GVariant *result = NULL;
 
-       int ret = BLUETOOTH_ERROR_NONE;
-
        BT_CHECK_PARAMETER(device_address, return);
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        _bt_convert_addr_type_to_string(address, device_address->addr);
@@ -1681,261 +1818,212 @@ int _bt_get_connected_link(bluetooth_device_address_t *device_address,
        g_variant_get(result , "(@a{sv})", &value);
        g_variant_unref(result);
 
-       tmp_value = g_variant_lookup_value(value, "Connected", G_VARIANT_TYPE_BOOLEAN);
+       tmp_value = g_variant_lookup_value(value, "Connected", G_VARIANT_TYPE_BYTE);
        if (tmp_value != NULL) {
+               *connected = g_variant_get_byte(tmp_value);
+               g_variant_unref(tmp_value);
                g_object_unref(device_proxy);
-               g_variant_unref(value);
+               return BLUETOOTH_ERROR_NONE;
+       } else  {
+               BT_ERR("g_variant value is NULL");
                return BLUETOOTH_ERROR_INTERNAL;
        }
-       *connected = g_variant_get_boolean(tmp_value);
-       g_variant_unref(tmp_value);
-       g_variant_unref(value);
-       g_object_unref(device_proxy);
-
-       return ret;
 }
 
-static void __bt_connect_le_device_cb(GDBusProxy *proxy, GAsyncResult *res,
-                                       gpointer user_data)
+static void __le_connection_req_cb(GDBusProxy *proxy, GAsyncResult *res,
+               gpointer user_data)
 {
        GError *err = NULL;
        GVariant *out_param1;
-       request_info_t *req_info;
-       bluetooth_device_address_t device_addr = { {0} };
+       GVariant *reply;
        int result = BLUETOOTH_ERROR_NONE;
+       bt_function_data_t *func_data = user_data;
+       request_info_t *req_info = NULL;
+       bluetooth_device_address_t device_addr = { {0} };
 
-       BT_DBG("+");
-       g_dbus_proxy_call_finish(proxy, res, &err);
+       reply = g_dbus_proxy_call_finish(proxy, res, &err);
+       g_object_unref(proxy);
 
-       /* When cb datas of lescan are received, back to parameta values for Web TCT */
-       if (_bt_is_set_scan_parameter() == FALSE) {
-               bluetooth_le_scan_params_t scan_params;
-               BT_ERR("set parameter of lescan when receive cb data");
-               scan_params.type = BT_LE_ACTIVE_SCAN;
-               scan_params.interval = 5000;
-               scan_params.window = 500;
-               _bt_set_scan_parameters(&scan_params);
+       if (reply == NULL) {
+               BT_ERR("ConnectLE / DisconnectLE DBus call error");
+               if (err) {
+                       BT_ERR("Error: %s", err->message);
+                       g_clear_error(&err);
+               }
+               result = BLUETOOTH_ERROR_INTERNAL;
+       } else {
+               g_variant_unref(reply);
        }
 
-       req_info = _bt_get_request_info(le_connection_info->req_id);
-       if (req_info == NULL) {
-               BT_ERR("req_info == NULL");
-               g_object_unref(proxy);
-               le_connection_info->device_proxy = NULL;
+       if (func_data == NULL) {
+               BT_ERR("func_data is NULL");
                goto done;
        }
 
-       if (err != NULL) {
-               BT_ERR("Error occured in ConnectLE [%s]", err->message);
-
-               if (g_strrstr(err->message, "NotSupported")) {
-                       BT_INFO("Connection Not Supported");
-                       result = BLUETOOTH_ERROR_CONNECTION_ERROR;
-               } else if (g_strrstr(err->message, "AlreadyConnected")) {
-                       BT_INFO("Connection already exists");
-                       result = BLUETOOTH_ERROR_ALREADY_CONNECT;
-               } else if (g_strrstr(err->message, "Connection Timeout")) {
-                       BT_INFO("Connection Timeout");
-                       result = BLUETOOTH_ERROR_TIMEOUT;
-               } else {
-                       BT_DBG("Default case");
-                       result = BLUETOOTH_ERROR_CONNECTION_ERROR;
-               }
+       req_info = _bt_get_request_info(func_data->req_id);
+       if (req_info == NULL) {
+               BT_ERR("req_info is NULL");
+               goto done;
        }
 
-       g_object_unref(proxy);
-       le_connection_info->device_proxy = NULL;
+       if (req_info->context == NULL) {
+               BT_ERR("req_info->context is NULL");
+               goto done;
+       }
 
        _bt_convert_addr_string_to_type(device_addr.addr,
-                                       le_connection_info->addr);
-
-       if (req_info->context == NULL)
-               goto done;
+                       (const char *)func_data->address);
 
        out_param1 = g_variant_new_from_data((const GVariantType *)"ay",
-                       &device_addr, sizeof(bluetooth_device_address_t), TRUE, NULL, NULL);
+                       &device_addr, sizeof(bluetooth_device_address_t), TRUE,
+                       NULL, NULL);
+
        g_dbus_method_invocation_return_value(req_info->context,
                        g_variant_new("(iv)", result, out_param1));
 
-       g_variant_unref(out_param1);
-
-       _bt_delete_request_list(req_info->req_id);
 done:
-       if (err)
-               g_error_free(err);
-
-       g_free(le_connection_info->addr);
-       g_free(le_connection_info);
-       le_connection_info = NULL;
+       if (req_info)
+               _bt_delete_request_list(req_info->req_id);
 
-       BT_DBG("-");
+       if (func_data) {
+               g_free(func_data->address);
+               g_free(func_data);
+       }
 }
 
-int _bt_connect_le_device(int request_id,
-               const bluetooth_device_address_t *bd_addr,
-               gboolean auto_connect)
+static int __bt_connect_le_device_internal(int req_id, const bluetooth_device_address_t *bd_addr,
+       gboolean auto_connect)
 {
        char device_address[BT_ADDRESS_STRING_SIZE] = { 0 };
        gchar *device_path = NULL;
        GDBusProxy *device_proxy = NULL;
-       GDBusProxy *adapter_proxy;
        GDBusConnection *conn;
        int ret = BLUETOOTH_ERROR_NONE;
+       bt_function_data_t *func_data;
 
        BT_CHECK_PARAMETER(bd_addr, return);
 
-       _bt_convert_addr_type_to_string(device_address,
-                       (unsigned char *)bd_addr->addr);
-
-       if (le_connection_info) {
-               BT_ERR("LE Connection in progress");
-               return BLUETOOTH_ERROR_DEVICE_BUSY;
-       }
-
-/* When auto_connect is true, Web TCT fail. It need to be checked */
-       auto_connect = FALSE;
-
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       adapter_proxy = _bt_get_adapter_proxy();
-       retv_if(adapter_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
-
+       _bt_convert_addr_type_to_string(device_address,
+                       (unsigned char *)bd_addr->addr);
        device_path = _bt_get_device_object_path(device_address);
        if (device_path == NULL) {
-               BT_DBG("device_path NULL");
+               BT_ERR_C("device_path NULL : [%s]", device_address);
                ret = BLUETOOTH_ERROR_INTERNAL;
                return ret;
        }
 
-       retv_if(device_path == NULL, BLUETOOTH_ERROR_INTERNAL);
-
        device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
-                                                               NULL, BT_BLUEZ_NAME,
-                                                               device_path, BT_DEVICE_INTERFACE,  NULL, NULL);
+                       NULL, BT_BLUEZ_NAME,
+                       device_path, BT_DEVICE_INTERFACE,  NULL, NULL);
        g_free(device_path);
        retv_if(device_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
+       func_data = g_malloc0(sizeof(bt_function_data_t));
+       if (func_data == NULL) {
+               BT_ERR("Unable to allocate memory for address");
+               ret = BLUETOOTH_ERROR_MEMORY_ALLOCATION;
+               goto fail;
+       }
 
-       le_connection_info = g_malloc0(sizeof(bt_funcion_data_t));
-       le_connection_info->addr = g_strdup(device_address);
-       le_connection_info->req_id = request_id;
-       le_connection_info->device_proxy = device_proxy;
-
-/* The connection between Ble device and TM1 often fail. So It need to be set for Web TCT*/
-       if (_bt_is_set_scan_parameter() == FALSE) {
-               BT_ERR("set parameter of le scan when connect device");
-               bluetooth_le_scan_params_t scan_params;
-               scan_params.type = BT_LE_ACTIVE_SCAN;
-               scan_params.interval = 60;
-               scan_params.window = 60;
-               _bt_set_scan_parameters(&scan_params);
+       func_data->address = g_strdup(device_address);
+       if (func_data->address == NULL) {
+               BT_ERR("Unable to allocate memory for address");
+               ret = BLUETOOTH_ERROR_MEMORY_ALLOCATION;
+               goto fail;
        }
 
-       auto_connect = FALSE;
+       func_data->req_id = req_id;
 
        g_dbus_proxy_call(device_proxy, "ConnectLE",
-                                g_variant_new("(b)", auto_connect),
-                                G_DBUS_CALL_FLAGS_NONE,
-                                BT_MAX_DBUS_TIMEOUT,
-                                NULL,
-                                (GAsyncReadyCallback)__bt_connect_le_device_cb,
-                                NULL);
+                       g_variant_new("(b)", auto_connect),
+                       G_DBUS_CALL_FLAGS_NONE,
+                       BT_MAX_DBUS_TIMEOUT,
+                       NULL,
+                       (GAsyncReadyCallback)__le_connection_req_cb, func_data);
 
+       return ret;
 
+fail:
+       if (device_proxy)
+               g_object_unref(device_proxy);
+       if (func_data) {
+               g_free(func_data->address);
+               g_free(func_data);
+       }
        return ret;
 }
 
-static void __bt_disconnect_le_device_cb(GDBusProxy *proxy, GAsyncResult *res,
-                                       gpointer user_data)
+static gboolean __bt_connect_le_timer_cb(gpointer user_data)
 {
-       GError *err = NULL;
-       GVariant *out_param1;
-       request_info_t *req_info;
-       bt_funcion_data_t *le_disconnection_info = user_data;
-       bluetooth_device_address_t device_addr = { {0} };
-       int result = BLUETOOTH_ERROR_NONE;
+       BT_INFO("Try to initiate pending LE connection");
 
-       BT_DBG("+");
-       g_dbus_proxy_call_finish(proxy, res, &err);
+       pending_le_conn_timer_id = 0;
 
-       req_info = _bt_get_request_info(le_disconnection_info->req_id);
-       if (req_info == NULL) {
-               BT_ERR("req_info == NULL");
-               g_object_unref(proxy);
-               le_disconnection_info->device_proxy = NULL;
-               goto done;
-       }
-
-       if (err != NULL) {
-               BT_ERR("Error occured in DisconnectLE [%s]", err->message);
+       __bt_connect_le_device_internal(pending_le_conn_info->req_id,
+               &pending_le_conn_info->bd_addr,
+               pending_le_conn_info->auto_connect);
 
-               if (g_strrstr(err->message, "NotSupported")) {
-                       BT_INFO("Connection Not Supported");
-                       result = BLUETOOTH_ERROR_CONNECTION_ERROR;
-               } else if (g_strrstr(err->message, "NotConnected")) {
-                       BT_INFO("Connection does not exists");
-                       result = BLUETOOTH_ERROR_NOT_CONNECTED;
-               } else if (g_strrstr(err->message, "Cancelled")) {
-                       BT_INFO("User Cancelled");
-                       result = BLUETOOTH_ERROR_CANCEL_BY_USER;
-               } else {
-                       BT_DBG("Default case");
-                       result = BLUETOOTH_ERROR_CONNECTION_ERROR;
-               }
-       }
+       g_free(pending_le_conn_info);
+       pending_le_conn_info = NULL;
 
-       g_object_unref(proxy);
-       le_disconnection_info->device_proxy = NULL;
+       return FALSE;
+}
 
-       _bt_convert_addr_string_to_type(device_addr.addr,
-                                       le_disconnection_info->addr);
+void _bt_pending_connect_le_device(void)
+{
+       if (pending_le_conn_timer_id > 0) {
+               g_source_remove(pending_le_conn_timer_id);
+               __bt_connect_le_timer_cb(NULL);
+       }
+}
 
-       if (req_info->context == NULL)
-               goto done;
+int _bt_connect_le_device(int req_id, const bluetooth_device_address_t *bd_addr,
+               gboolean auto_connect)
+{
+       int ret = BLUETOOTH_ERROR_NONE;
 
-       out_param1 = g_variant_new_from_data((const GVariantType *)"ay",
-               &device_addr, sizeof(bluetooth_device_address_t), TRUE, NULL, NULL);
+       BT_CHECK_PARAMETER(bd_addr, return);
 
-       g_dbus_method_invocation_return_value(req_info->context,
-                       g_variant_new("(iv)", result, out_param1));
+       ret = _bt_hold_current_advertising();
+       if (ret == BLUETOOTH_ERROR_NONE) {
+               BT_INFO("Current advertising is held");
+               pending_le_conn_info = g_malloc0(sizeof(bt_pending_le_conn_info_s));
+               pending_le_conn_info->req_id = req_id;
+               memcpy(pending_le_conn_info->bd_addr.addr, bd_addr->addr,
+                               BLUETOOTH_ADDRESS_LENGTH);
+               pending_le_conn_info->auto_connect = auto_connect;
 
-       g_variant_unref(out_param1);
+               pending_le_conn_timer_id =
+                       g_timeout_add(1000, __bt_connect_le_timer_cb, NULL);
 
-       _bt_delete_request_list(req_info->req_id);
-done:
-       if (err)
-               g_error_free(err);
+               return BLUETOOTH_ERROR_NONE;
+       }
 
-       g_free(le_disconnection_info->addr);
-       g_free(le_disconnection_info);
-       le_disconnection_info = NULL;
+       BT_ERR("Unable to hold advertising");
 
-       BT_DBG("-");
+       return __bt_connect_le_device_internal(req_id, bd_addr, auto_connect);
 }
 
-int _bt_disconnect_le_device(int request_id,
+int _bt_disconnect_le_device(int req_id,
                const bluetooth_device_address_t *bd_addr)
 {
        char device_address[BT_ADDRESS_STRING_SIZE] = { 0 };
-       gchar *device_path = NULL;
-       GDBusProxy *device_proxy = NULL;
-       GDBusProxy *adapter_proxy;
+       gchar *device_path;
+       GDBusProxy *device_proxy;
        GDBusConnection *conn;
        int ret = BLUETOOTH_ERROR_NONE;
-       bt_funcion_data_t *le_disconnection_info = NULL;
+       bt_function_data_t *func_data;
 
        BT_CHECK_PARAMETER(bd_addr, return);
 
-       _bt_convert_addr_type_to_string(device_address,
-                       (unsigned char *)bd_addr->addr);
-
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       adapter_proxy = _bt_get_adapter_proxy();
-       retv_if(adapter_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
-
+       _bt_convert_addr_type_to_string(device_address,
+                       (unsigned char *)bd_addr->addr);
        device_path = _bt_get_device_object_path(device_address);
        if (device_path == NULL) {
                BT_DBG("device_path NULL");
@@ -1946,24 +2034,42 @@ int _bt_disconnect_le_device(int request_id,
        retv_if(device_path == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
-                                                               NULL, BT_BLUEZ_NAME,
-                                                               device_path, BT_DEVICE_INTERFACE,  NULL, NULL);
+                       NULL, BT_BLUEZ_NAME,
+                       device_path, BT_DEVICE_INTERFACE,  NULL, NULL);
        g_free(device_path);
        retv_if(device_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       le_disconnection_info = g_malloc0(sizeof(bt_funcion_data_t));
-       le_disconnection_info->addr = g_strdup(device_address);
-       le_disconnection_info->req_id = request_id;
-       le_disconnection_info->device_proxy = device_proxy;
+       func_data = g_malloc0(sizeof(bt_function_data_t));
+       if (func_data == NULL) {
+               BT_ERR("Unable to allocate memory for address");
+               ret = BLUETOOTH_ERROR_MEMORY_ALLOCATION;
+               goto fail;
+       }
+
+       func_data->address = g_strdup(device_address);
+       if (func_data->address == NULL) {
+               BT_ERR("Unable to allocate memory for address");
+               ret = BLUETOOTH_ERROR_MEMORY_ALLOCATION;
+               goto fail;
+       }
+
+       func_data->req_id = req_id;
 
        g_dbus_proxy_call(device_proxy, "DisconnectLE",
-                                NULL,
-                                G_DBUS_CALL_FLAGS_NONE,
-                                BT_MAX_DBUS_TIMEOUT,
-                                NULL,
-                                (GAsyncReadyCallback)__bt_disconnect_le_device_cb,
-                                le_disconnection_info);
+                       NULL,
+                       G_DBUS_CALL_FLAGS_NONE,
+                       BT_MAX_DBUS_TIMEOUT,
+                       NULL,
+                       (GAsyncReadyCallback)__le_connection_req_cb, func_data);
+       return ret;
 
+fail:
+       if (device_proxy)
+               g_object_unref(device_proxy);
+       if (func_data) {
+               g_free(func_data->address);
+               g_free(func_data);
+       }
        return ret;
 }
 
@@ -1982,7 +2088,7 @@ int _bt_connect_le_ipsp_device(const bluetooth_device_address_t *bd_addr)
        _bt_convert_addr_type_to_string(device_address,
                        (unsigned char *)bd_addr->addr);
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        adapter_proxy = _bt_get_adapter_proxy();
@@ -2036,7 +2142,7 @@ int _bt_disconnect_le_ipsp_device(const bluetooth_device_address_t *bd_addr)
        _bt_convert_addr_type_to_string(device_address,
                        (unsigned char *)bd_addr->addr);
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        adapter_proxy = _bt_get_adapter_proxy();
@@ -2082,9 +2188,10 @@ int _bt_connect_profile(char *address, char *uuid,
        GDBusProxy *proxy;
        GDBusConnection *conn;
        GDBusProxy *adapter_proxy;
+       GVariant *result = NULL;
        GError *error = NULL;
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        object_path = _bt_get_device_object_path(address);
@@ -2094,7 +2201,7 @@ int _bt_connect_profile(char *address, char *uuid,
                adapter_proxy = _bt_get_adapter_proxy();
                retv_if(adapter_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-               g_dbus_proxy_call_sync(adapter_proxy, "CreateDevice",
+               result = g_dbus_proxy_call_sync(adapter_proxy, "CreateDevice",
                                         g_variant_new("(s)", address),
                                         G_DBUS_CALL_FLAGS_NONE,
                                         -1,
@@ -2105,6 +2212,8 @@ int _bt_connect_profile(char *address, char *uuid,
                        BT_ERR("CreateDevice Fail: %s", error->message);
                        g_error_free(error);
                }
+               if (result)
+                       g_variant_unref(result);
 
                object_path = _bt_get_device_object_path(address);
        }
@@ -2134,7 +2243,7 @@ int _bt_disconnect_profile(char *address, char *uuid,
        GDBusProxy *proxy;
        GDBusConnection *conn;
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        object_path = _bt_get_device_object_path(address);
@@ -2162,6 +2271,7 @@ int _bt_enable_rssi(bluetooth_device_address_t *bd_addr, int link_type,
 {
        int ret = BLUETOOTH_ERROR_NONE;
        GDBusProxy *proxy;
+       GVariant *result = NULL;
        GError *error = NULL;
        char address[BT_ADDRESS_STRING_SIZE] = { 0 };
 
@@ -2179,7 +2289,7 @@ int _bt_enable_rssi(bluetooth_device_address_t *bd_addr, int link_type,
        proxy = _bt_get_adapter_proxy();
        retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       g_dbus_proxy_call_sync(proxy, "EnableRssi",
+       result = g_dbus_proxy_call_sync(proxy, "EnableRssi",
                                g_variant_new("(siiii)", address, link_type, low_threshold, in_range_threshold, high_threshold),
                                G_DBUS_CALL_FLAGS_NONE,
                                -1,
@@ -2190,6 +2300,10 @@ int _bt_enable_rssi(bluetooth_device_address_t *bd_addr, int link_type,
                        g_error_free(error);
                        ret = BLUETOOTH_ERROR_INTERNAL;
        }
+
+       if (result)
+               g_variant_unref(result);
+
        return ret;
 }
 
@@ -2198,6 +2312,7 @@ int _bt_get_rssi_strength(bluetooth_device_address_t *bd_addr,
 {
        int ret = BLUETOOTH_ERROR_NONE;
        GDBusProxy *proxy;
+       GVariant *result = NULL;
        GError *error = NULL;
        char address[BT_ADDRESS_STRING_SIZE] = { 0 };
 
@@ -2213,7 +2328,7 @@ int _bt_get_rssi_strength(bluetooth_device_address_t *bd_addr,
        proxy = _bt_get_adapter_proxy();
        retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       g_dbus_proxy_call_sync(proxy, "GetRssiStrength",
+       result = g_dbus_proxy_call_sync(proxy, "GetRssiStrength",
                                g_variant_new("(si)", address, link_type),
                                G_DBUS_CALL_FLAGS_NONE,
                                -1,
@@ -2225,11 +2340,15 @@ int _bt_get_rssi_strength(bluetooth_device_address_t *bd_addr,
                        g_error_free(error);
                        ret = BLUETOOTH_ERROR_INTERNAL;
        }
+
+       if (result)
+               g_variant_unref(result);
+
        return ret;
 }
 
 int _bt_le_conn_update(unsigned char *device_address,
-                               guint16 interval_min, guint16 interval_max,
+                               float interval_min, float interval_max,
                                guint16 latency, guint16 time_out)
 {
        char address[BT_ADDRESS_STRING_SIZE] = { 0 };
@@ -2242,11 +2361,9 @@ int _bt_le_conn_update(unsigned char *device_address,
        guint32 min_supervision_to;
        int ret = BLUETOOTH_ERROR_NONE;
 
-       BT_DBG("+");
-
        BT_CHECK_PARAMETER(device_address, return);
 
-       BT_DBG("Min interval: %u, Max interval: %u, Latency: %u, Supervision timeout: %u",
+       BT_INFO("Min interval: %f, Max interval: %f, Latency: %u, Supervision timeout: %u",
                        interval_min, interval_max, latency, time_out);
 
        if (interval_min > interval_max ||
@@ -2285,14 +2402,14 @@ int _bt_le_conn_update(unsigned char *device_address,
        device_path = _bt_get_device_object_path(address);
 
        if (device_path == NULL) {
-               BT_DBG("device_path NULL");
+               BT_ERR("device_path NULL");
                ret = BLUETOOTH_ERROR_INTERNAL;
                goto fail;
        }
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        if (conn == NULL) {
-               BT_DBG("conn NULL");
+               BT_ERR("conn NULL");
                ret = BLUETOOTH_ERROR_INTERNAL;
                goto fail;
        }
@@ -2316,16 +2433,18 @@ int _bt_le_conn_update(unsigned char *device_address,
                                &error);
 
        g_object_unref(device_proxy);
-       BT_ERR("LeConnUpdate Call Error for %s", address);
        if (reply == NULL) {
                if (error) {
                        BT_ERR("Error %s[%s]", error->message, address);
+                       if (g_strrstr(error->message, "In Progress"))
+                               ret = BLUETOOTH_ERROR_IN_PROGRESS;
+                       else
+                               ret = BLUETOOTH_ERROR_INTERNAL;
                        g_error_free(error);
-                       return BLUETOOTH_ERROR_INTERNAL;
+                       return ret;
                }
        }
        g_variant_unref(reply);
-       BT_DBG("-");
 
 fail:
        return ret;
@@ -2356,14 +2475,11 @@ int _bt_set_pin_code(bluetooth_device_address_t *device_address,
        }
 
        pin_info = g_malloc0(sizeof(bt_pin_code_info_t));
-       if (pin_info != NULL) {
-               pin_info->address = g_strdup(address);
-               pin_info->pin_code = g_strdup(pin_code->pin_code);
-               pin_info_list = g_slist_append(pin_info_list, pin_info);
-               return BLUETOOTH_ERROR_NONE;
-       }
+       pin_info->address = g_strdup(address);
+       pin_info->pin_code = g_strdup(pin_code->pin_code);
+       pin_info_list = g_slist_append(pin_info_list, pin_info);
 
-       return BLUETOOTH_ERROR_INTERNAL;
+       return BLUETOOTH_ERROR_NONE;
 }
 
 gint __bt_compare_address(gpointer *a, gpointer *b)
@@ -2460,6 +2576,643 @@ int _bt_get_le_connection_parameter(bluetooth_le_connection_mode_t mode,
        return BLUETOOTH_ERROR_NONE;
 }
 
+int _bt_get_trusted_profile_from_flag(bluetooth_trusted_profile_t profile,
+               guint trusted_profile_flag, guint *trusted)
+{
+       int trust_profile;
+       *trusted = FALSE;
+
+       switch (profile) {
+       case TRUSTED_PROFILE_PBAP:
+               if (trusted_profile_flag & (PROFILE_SUPPORTED << 0))
+                       trust_profile = trusted_profile_flag & (1 << 1);
+               else
+                       return BLUETOOTH_ERROR_NOT_SUPPORT;
+               break;
+       case TRUSTED_PROFILE_MAP:
+               if (trusted_profile_flag & (PROFILE_SUPPORTED << 2))
+                       trust_profile = trusted_profile_flag & (1 << 3);
+               else
+                       return BLUETOOTH_ERROR_NOT_SUPPORT;
+               break;
+       case TRUSTED_PROFILE_SAP:
+               if (trusted_profile_flag & (PROFILE_SUPPORTED << 4))
+                       trust_profile = trusted_profile_flag & (1 << 5);
+               else
+                       return BLUETOOTH_ERROR_NOT_SUPPORT;
+               break;
+       case TRUSTED_PROFILE_ALL: /* Return Flag for All profiles*/
+               *trusted = trusted_profile_flag;
+               return BLUETOOTH_ERROR_NONE;
+       default:
+               return BLUETOOTH_ERROR_NOT_SUPPORT;
+       }
+
+       if (trust_profile)
+               *trusted = TRUE;
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+int _bt_get_restricted_profile_from_flag(bluetooth_restricted_profile_t profile,
+               guint restricted_profile_flag, guint *restricted)
+{
+       int restrict_profile;
+       *restricted = FALSE;
+
+       switch (profile) {
+       case RESTRICTED_PROFILE_HFP_HS:
+                       restrict_profile = restricted_profile_flag & (1 << 0);
+               break;
+       case RESTRICTED_PROFILE_A2DP:
+                       restrict_profile = restricted_profile_flag & (1 << 2);
+               break;
+       default:
+               return BLUETOOTH_ERROR_NOT_SUPPORT;
+       }
+
+       if (restrict_profile)
+               *restricted = TRUE;
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+char *_bt_get_trusted_profile_uuid(bluetooth_trusted_profile_t profile)
+{
+       switch (profile) {
+       case TRUSTED_PROFILE_PBAP:
+               return g_strdup("00001130-0000-1000-8000-00805f9b34fb");
+       case TRUSTED_PROFILE_MAP:
+               return g_strdup("00001134-0000-1000-8000-00805f9b34fb");
+       case TRUSTED_PROFILE_SAP:
+               return g_strdup("0000112D-0000-1000-8000-00805f9b34fb");
+       case TRUSTED_PROFILE_ALL:
+               return NULL;
+       }
+
+       return NULL;
+}
+
+char *_bt_get_restricted_profile_uuid(bluetooth_restricted_profile_t profile)
+{
+       switch (profile) {
+       case RESTRICTED_PROFILE_HFP_HS:
+               return g_strdup("0000111e-0000-1000-8000-00805f9b34fb");
+       case RESTRICTED_PROFILE_A2DP:
+               return g_strdup("0000110b-0000-1000-8000-00805f9b34fb");
+       }
+
+       return NULL;
+}
+
+bluetooth_trusted_profile_t _bt_get_trusted_profile_enum(const char *uuid)
+{
+       if (g_strcmp0("0000112f-0000-1000-8000-00805f9b34fb", uuid) == 0)
+               return TRUSTED_PROFILE_PBAP;
+       else if (g_strcmp0("00001132-0000-1000-8000-00805f9b34fb", uuid) == 0)
+               return TRUSTED_PROFILE_MAP;
+       else if (g_strcmp0("0000112D-0000-1000-8000-00805f9b34fb", uuid) == 0)
+               return TRUSTED_PROFILE_SAP;
+
+       return 0; /* 0 - Unknown Profile */
+}
+
+int _bt_set_trust_profile(bluetooth_device_address_t *bd_addr,
+               bluetooth_trusted_profile_t profile, gboolean trust)
+{
+       int ret = BLUETOOTH_ERROR_NONE;
+       GDBusConnection *conn;
+       GDBusProxy *proxy;
+       GError *error = NULL;
+       char *device_path = NULL;
+       char *uuid = NULL;
+       char address[BT_ADDRESS_STRING_SIZE] = { 0 };
+       GVariant *reply;
+
+       BT_CHECK_PARAMETER(bd_addr, return);
+       BT_DBG("BD Address [%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X] profile[%d] trust[%d]",
+                       bd_addr->addr[0], bd_addr->addr[1],
+                       bd_addr->addr[2], bd_addr->addr[3],
+                       bd_addr->addr[4], bd_addr->addr[5],
+                       profile, trust);
+
+       conn = _bt_gdbus_get_system_gconn();
+       retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       _bt_convert_addr_type_to_string(address, bd_addr->addr);
+
+       device_path = _bt_get_device_object_path(address);
+       retv_if(device_path == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+                       NULL, BT_BLUEZ_NAME, device_path,
+                       BT_DEVICE_INTERFACE, NULL, NULL);
+
+       g_free(device_path);
+       retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       uuid = _bt_get_trusted_profile_uuid(profile);
+       if (uuid == NULL) {
+               g_object_unref(proxy);
+               return BLUETOOTH_ERROR_NOT_SUPPORT;
+       }
+
+       reply = g_dbus_proxy_call_sync(proxy, "SetTrustedProfile",
+                       g_variant_new("(sb)", uuid, trust),
+                       G_DBUS_CALL_FLAGS_NONE, -1,
+                       NULL, &error);
+       g_object_unref(proxy);
+
+       if (reply == NULL) {
+               BT_ERR("Failed to Set Profile Trusted");
+               ret = BLUETOOTH_ERROR_INTERNAL;
+               if (error) {
+                       BT_ERR("Error %s[%s]", error->message, address);
+                       g_error_free(error);
+               }
+               goto finish;
+       }
+       g_variant_unref(reply);
+
+finish:
+       g_free(uuid);
+       return ret;
+}
+
+int _bt_get_trust_profile(bluetooth_device_address_t *bd_addr,
+               bluetooth_trusted_profile_t profile, guint *trust)
+{
+       int ret = BLUETOOTH_ERROR_NONE;
+       GDBusConnection *conn;
+       GDBusProxy *proxy;
+       GError *error = NULL;
+       char *device_path = NULL;
+       guint trusted_profile_flag;
+       char address[BT_ADDRESS_STRING_SIZE] = { 0 };
+       GVariant *reply;
+
+       BT_CHECK_PARAMETER(bd_addr, return);
+       BT_DBG("BD Address [%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X] profile[%d] trust[%d]",
+                       bd_addr->addr[0], bd_addr->addr[1],
+                       bd_addr->addr[2], bd_addr->addr[3],
+                       bd_addr->addr[4], bd_addr->addr[5],
+                       profile, *trust);
+
+       conn = _bt_gdbus_get_system_gconn();
+       retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       _bt_convert_addr_type_to_string(address, bd_addr->addr);
+
+       device_path = _bt_get_device_object_path(address);
+       retv_if(device_path == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+                       NULL, BT_BLUEZ_NAME, device_path,
+                       BT_PROPERTIES_INTERFACE, NULL, NULL);
+
+       g_free(device_path);
+       retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       reply = g_dbus_proxy_call_sync(proxy, "Get",
+                       g_variant_new("(ss)", BT_DEVICE_INTERFACE, "TrustedProfiles"),
+                       G_DBUS_CALL_FLAGS_NONE, -1,
+                       NULL, &error);
+       g_object_unref(proxy);
+
+       if (reply == NULL) {
+               BT_ERR("Failed to Get Profile Trusted");
+               ret = BLUETOOTH_ERROR_INTERNAL;
+               if (error) {
+                       BT_ERR("Error %s[%s]", error->message, address);
+                       g_error_free(error);
+               }
+               *trust = 0;
+       } else {
+               GVariant *temp;
+               g_variant_get(reply, "(v)", &temp);
+               trusted_profile_flag = g_variant_get_uint32(temp);
+               BT_DBG("TRUST_FLAG %d", trusted_profile_flag);
+
+               ret = _bt_get_trusted_profile_from_flag(profile,
+                               trusted_profile_flag, trust);
+               g_variant_unref(temp);
+               g_variant_unref(reply);
+       }
+
+       BT_DBG("TRUST %d", *trust);
+       return ret;
+}
+
+int _bt_set_restrict_profile(bluetooth_device_address_t *bd_addr,
+               bluetooth_restricted_profile_t profile, gboolean restricted)
+{
+       int ret = BLUETOOTH_ERROR_NONE;
+       GDBusConnection *conn;
+       GDBusProxy *proxy;
+       GError *error = NULL;
+       char *device_path = NULL;
+       char *uuid = NULL;
+       char address[BT_ADDRESS_STRING_SIZE] = { 0 };
+       GVariant *reply;
+
+       BT_CHECK_PARAMETER(bd_addr, return);
+       BT_DBG("BD Address [%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X] profile[%d] restricted[%d]",
+                       bd_addr->addr[0], bd_addr->addr[1],
+                       bd_addr->addr[2], bd_addr->addr[3],
+                       bd_addr->addr[4], bd_addr->addr[5],
+                       profile, restricted);
+
+       conn = _bt_gdbus_get_system_gconn();
+       retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       _bt_convert_addr_type_to_string(address, bd_addr->addr);
+
+       device_path = _bt_get_device_object_path(address);
+       retv_if(device_path == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+                       NULL, BT_BLUEZ_NAME, device_path,
+                       BT_DEVICE_INTERFACE, NULL, NULL);
+
+       g_free(device_path);
+       retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       uuid = _bt_get_restricted_profile_uuid(profile);
+       if (uuid == NULL) {
+               g_object_unref(proxy);
+               return BLUETOOTH_ERROR_NOT_SUPPORT;
+       }
+
+       reply = g_dbus_proxy_call_sync(proxy, "SetRestrictedProfile",
+                       g_variant_new("(sb)", uuid, restricted),
+                       G_DBUS_CALL_FLAGS_NONE, -1,
+                       NULL, &error);
+       g_object_unref(proxy);
+
+       if (reply == NULL) {
+               BT_ERR("Failed to Set Profile Restricted");
+               ret = BLUETOOTH_ERROR_INTERNAL;
+               if (error) {
+                       BT_ERR("Error %s[%s]", error->message, address);
+                       g_error_free(error);
+               }
+               goto finish;
+       }
+       g_variant_unref(reply);
+
+finish:
+       g_free(uuid);
+       return ret;
+}
+
+int _bt_get_restrict_profile(bluetooth_device_address_t *bd_addr,
+               bluetooth_restricted_profile_t profile, guint *restricted)
+{
+       int ret = BLUETOOTH_ERROR_NONE;
+       GDBusConnection *conn;
+       GDBusProxy *proxy;
+       GError *error = NULL;
+       char *device_path = NULL;
+       guint restricted_profile_flag;
+       char address[BT_ADDRESS_STRING_SIZE] = { 0 };
+       GVariant *reply;
+
+       BT_CHECK_PARAMETER(bd_addr, return);
+       BT_DBG("BD Address [%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X] profile[%d] restricted[%d]",
+                       bd_addr->addr[0], bd_addr->addr[1],
+                       bd_addr->addr[2], bd_addr->addr[3],
+                       bd_addr->addr[4], bd_addr->addr[5],
+                       profile, *restricted);
+
+       conn = _bt_gdbus_get_system_gconn();
+       retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       _bt_convert_addr_type_to_string(address, bd_addr->addr);
+
+       device_path = _bt_get_device_object_path(address);
+       retv_if(device_path == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+                       NULL, BT_BLUEZ_NAME, device_path,
+                       BT_PROPERTIES_INTERFACE, NULL, NULL);
+
+       g_free(device_path);
+       retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       reply = g_dbus_proxy_call_sync(proxy, "Get",
+                       g_variant_new("(ss)", BT_DEVICE_INTERFACE, "RestrictedProfiles"),
+                       G_DBUS_CALL_FLAGS_NONE, -1,
+                       NULL, &error);
+       g_object_unref(proxy);
+
+       if (reply == NULL) {
+               BT_ERR("Failed to Get Profile Restricted");
+               ret = BLUETOOTH_ERROR_INTERNAL;
+               if (error) {
+                       BT_ERR("Error %s[%s]", error->message, address);
+                       g_error_free(error);
+               }
+               *restricted = 0;
+       } else {
+               GVariant *temp;
+               g_variant_get(reply, "(v)", &temp);
+               restricted_profile_flag = g_variant_get_uint32(temp);
+               BT_DBG("Restricted_FLAG %d", restricted_profile_flag);
+
+               ret = _bt_get_restricted_profile_from_flag(profile,
+                               restricted_profile_flag, restricted);
+               g_variant_unref(temp);
+               g_variant_unref(reply);
+       }
+
+       BT_DBG("TRUST %d", *restricted);
+       return ret;
+}
+
+static void __bt_request_att_mtu_device_cb(GDBusProxy *proxy, GAsyncResult *res,
+                                       gpointer user_data)
+{
+       GError *err = NULL;
+       GVariant *out_param1;
+       request_info_t *req_info;
+       GVariant *val = NULL;
+       GVariant *param = NULL;
+       guint8 status = 0;
+       guint16 mtu = 0;
+       bluetooth_device_address_t device_addr = { {0} };
+       int result = BLUETOOTH_ERROR_NONE;
+
+       BT_DBG("+");
+       val = g_dbus_proxy_call_finish(proxy, res, &err);
+
+       req_info = _bt_get_request_info(att_mtu_req_info->req_id);
+       if (req_info == NULL) {
+               BT_ERR("req_info == NULL");
+               g_object_unref(proxy);
+               att_mtu_req_info->device_proxy = NULL;
+               goto done;
+       }
+
+       if (err != NULL) {
+               BT_ERR("Error occured in RequestAttMtu [%s]", err->message);
+
+               if (g_strrstr(err->message, "NotSupported")) {
+                       BT_INFO("Connection Not Supported");
+                       result = BLUETOOTH_ERROR_NOT_SUPPORT;
+               } else if (g_strrstr(err->message, "NotConnected")) {
+                       BT_INFO("Not connected");
+                       result = BLUETOOTH_ERROR_NOT_CONNECTED;
+               } else if (g_strrstr(err->message, "InvalidArguments")) {
+                       BT_INFO("Not connected");
+                       result = BLUETOOTH_ERROR_INVALID_PARAM;
+               } else {
+                       BT_DBG("Default case");
+                       result = BLUETOOTH_ERROR_INTERNAL;
+               }
+       }
+
+       g_object_unref(proxy);
+       att_mtu_req_info->device_proxy = NULL;
+
+       if (result != BLUETOOTH_ERROR_NONE)
+               goto dbus_return;
+
+       if (val) {
+                g_variant_get(val, "(qy)", &mtu, &status);
+                g_variant_unref(val);
+       }
+
+       BT_DBG("MTU %d, Status %d, %s", mtu, status, att_mtu_req_info->addr);
+
+       param = g_variant_new("(isqy)",
+                       result,
+                       att_mtu_req_info->addr,
+                       mtu,
+                       status);
+
+       /* Send the event to application */
+       _bt_send_event(BT_DEVICE_EVENT,
+               BLUETOOTH_EVENT_GATT_ATT_MTU_CHANGED,
+               param);
+
+dbus_return:
+       if (req_info->context == NULL)
+               goto done;
+
+       _bt_convert_addr_string_to_type(device_addr.addr,
+                                       (const char *)att_mtu_req_info->addr);
+
+       out_param1 = g_variant_new_from_data((const GVariantType *)"ay",
+                       &device_addr, sizeof(bluetooth_device_address_t), TRUE, NULL, NULL);
+       g_dbus_method_invocation_return_value(req_info->context,
+                       g_variant_new("(iv)", result, out_param1));
+
+       _bt_delete_request_list(req_info->req_id);
+done:
+       if (err)
+               g_error_free(err);
+
+       g_free(att_mtu_req_info->addr);
+       g_free(att_mtu_req_info);
+       att_mtu_req_info = NULL;
+
+       BT_DBG("-");
+}
+
+int _bt_request_att_mtu(int request_id, bluetooth_device_address_t *device_address,
+                                                               unsigned int mtu)
+{
+       char address[BT_ADDRESS_STRING_SIZE] = { 0 };
+       gchar *device_path = NULL;
+       GDBusProxy *adapter_proxy;
+       GDBusProxy *device_proxy;
+       GDBusConnection *conn;
+       int ret = BLUETOOTH_ERROR_NONE;
+
+       BT_CHECK_PARAMETER(device_address, return);
+
+       if (att_mtu_req_info) {
+               BT_ERR("ATT MTU request in progress");
+               return BLUETOOTH_ERROR_DEVICE_BUSY;
+       }
+
+       conn = _bt_gdbus_get_system_gconn();
+       retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       adapter_proxy = _bt_get_adapter_proxy();
+       retv_if(adapter_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       _bt_convert_addr_type_to_string(address, device_address->addr);
+
+       BT_DBG("Remote device address: %s", address);
+
+       device_path = _bt_get_device_object_path(address);
+
+       retv_if(device_path == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+                                                               NULL, BT_BLUEZ_NAME,
+                                                               device_path, BT_DEVICE_INTERFACE,  NULL, NULL);
+       g_free(device_path);
+       retv_if(device_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       if (device_path == NULL) {
+               BT_DBG("device_path NULL");
+               ret = BLUETOOTH_ERROR_INTERNAL;
+               goto fail;
+       }
+
+       att_mtu_req_info = g_malloc0(sizeof(bt_funcion_data_t));
+       att_mtu_req_info->addr = (char *)g_strdup(address);
+       att_mtu_req_info->req_id = request_id;
+       att_mtu_req_info->device_proxy = device_proxy;
+
+       g_dbus_proxy_call(device_proxy, "RequestAttMtu",
+                               g_variant_new("(q)", mtu),
+                               G_DBUS_CALL_FLAGS_NONE,
+                               BT_MAX_DBUS_TIMEOUT,
+                               NULL,
+                               (GAsyncReadyCallback)__bt_request_att_mtu_device_cb,
+                               NULL);
+fail:
+       return ret;
+}
+
+int _bt_get_att_mtu(bluetooth_device_address_t *device_address,
+                       unsigned int *mtu)
+{
+       char address[BT_ADDRESS_STRING_SIZE] = { 0 };
+       char *object_path = NULL;
+
+       GDBusProxy *device_proxy;
+       GError *error = NULL;
+       GVariant *value;
+       GVariant *tmp_value;
+       GDBusConnection *conn;
+       GVariant *result = NULL;
+       int ret = BLUETOOTH_ERROR_NONE;
+
+       BT_CHECK_PARAMETER(device_address, return);
+
+       conn = _bt_gdbus_get_system_gconn();
+       retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       _bt_convert_addr_type_to_string(address, device_address->addr);
+
+       object_path = _bt_get_device_object_path(address);
+       retv_if(object_path == NULL, BLUETOOTH_ERROR_NOT_PAIRED);
+
+       device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+                       NULL, BT_BLUEZ_NAME, object_path,
+                       BT_PROPERTIES_INTERFACE,  NULL, NULL);
+       g_free(object_path);
+       retv_if(device_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       result = g_dbus_proxy_call_sync(device_proxy, "GetAll",
+                       g_variant_new("(s)", BT_DEVICE_INTERFACE),
+                       G_DBUS_CALL_FLAGS_NONE,
+                       -1,
+                       NULL,
+                       &error);
+       if (result == NULL) {
+               if (error != NULL) {
+                       BT_ERR("Error occured in Proxy call [%s]\n", error->message);
+                       g_error_free(error);
+               }
+               g_object_unref(device_proxy);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       g_variant_get(result , "(@a{sv})", &value);
+       g_variant_unref(result);
+
+       tmp_value = g_variant_lookup_value(value, "AttMtu", G_VARIANT_TYPE_UINT16);
+       if (tmp_value == NULL) {
+               g_object_unref(device_proxy);
+               g_variant_unref(value);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       *mtu = g_variant_get_uint16(tmp_value);
+
+       BT_DBG("ATT MTU : %d", *mtu);
+
+       g_variant_unref(tmp_value);
+       g_variant_unref(value);
+       g_object_unref(device_proxy);
+
+       return ret;
+}
+
+int _bt_get_device_ida(bluetooth_device_address_t *device_address,
+                       bluetooth_device_address_t *id_address)
+{
+       char address[BT_ADDRESS_STRING_SIZE] = { 0 };
+       gchar *device_path = NULL;
+       const gchar *idaddress = NULL;
+       GDBusProxy *device_proxy;
+       GError *error = NULL;
+       GVariant *result = NULL;
+       GDBusConnection *conn;
+       int ret = BLUETOOTH_ERROR_NONE;
+
+       BT_CHECK_PARAMETER(device_address, return);
+
+       conn = _bt_gdbus_get_system_gconn();
+       retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       _bt_convert_addr_type_to_string(address, device_address->addr);
+
+       device_path = _bt_get_device_object_path(address);
+       retv_if(device_path == NULL, BLUETOOTH_ERROR_NOT_PAIRED);
+
+       device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+                                                               NULL, BT_BLUEZ_NAME,
+                                                               device_path, BT_DEVICE_INTERFACE,  NULL, NULL);
+       g_free(device_path);
+       if (!device_proxy) {
+               BT_ERR("Unable to get proxy");
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       result = g_dbus_proxy_call_sync(device_proxy, "GetIDAddress",
+                                NULL,
+                                G_DBUS_CALL_FLAGS_NONE,
+                                -1,
+                                NULL,
+                                &error);
+
+       if (result == NULL) {
+               BT_ERR("Failed to get device ID address");
+               if (error != NULL) {
+                       BT_ERR("Error occured in Proxy call [%s]\n", error->message);
+                       g_error_free(error);
+               }
+               g_object_unref(device_proxy);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       g_variant_get(result , "(s)", &idaddress);
+       g_variant_unref(result);
+
+       if (idaddress == NULL) {
+               BT_ERR("No paired device");
+               g_object_unref(device_proxy);
+               return BLUETOOTH_ERROR_NOT_PAIRED;
+       }
+
+       BT_DBG("ID Address:%s", idaddress);
+
+       if (idaddress)
+               _bt_convert_addr_string_to_type(id_address->addr, idaddress);
+       else
+               ret = BLUETOOTH_ERROR_INTERNAL;
+
+       g_object_unref(device_proxy);
+
+       return ret;
+}
+
 int _bt_passkey_reply(const char *passkey, gboolean authentication_reply)
 {
        GapAgentPrivate *agent = _bt_get_adapter_agent();
index 47c4805..eedba13 100644 (file)
@@ -194,7 +194,7 @@ dpm_result_t _bt_dpm_get_bluetooth_devices_from_blacklist(GArray **out_param1)
        if (list) {
                ret = DPM_RESULT_SUCCESS;
                for (; list; list = list->next, i++) {
-                       memset(device_list.addresses[i].addr, 0, BT_ADDRESS_STRING_SIZE);
+                       memset(device_list.addresses[i].addr, 0, BLUETOOTH_ADDRESS_LENGTH);
                        _bt_convert_addr_string_to_type(device_list.addresses[i].addr, list->data);
                }
                device_list.count = g_slist_length(policy_table[DPM_POLICY_BLUETOOTH_DEVICES_BLACKLIST].list);
@@ -244,7 +244,7 @@ dpm_result_t _bt_dpm_get_bluetooth_devices_from_whitelist(GArray **out_param1)
        if (list) {
                ret = DPM_RESULT_SUCCESS;
                for (; list; list = list->next, i++) {
-                       memset(device_list.addresses[i].addr, 0, BT_ADDRESS_STRING_SIZE);
+                       memset(device_list.addresses[i].addr, 0, BLUETOOTH_ADDRESS_LENGTH);
                        _bt_convert_addr_string_to_type(device_list.addresses[i].addr, list->data);
 
                }
@@ -330,7 +330,7 @@ dpm_result_t _bt_dpm_get_bluetooth_uuids_from_whitelist(GArray **out_param1)
 
        if (_bt_dpm_get_allow_bluetooth_mode() == DPM_BT_RESTRICTED)
                return ret;
-       
+
        if (list) {
                ret = DPM_RESULT_SUCCESS;
                uuids_list.count = g_slist_length(policy_table[DPM_POLICY_BLUETOOTH_UUIDS_WHITELIST].list);
index 5ffc0ab..f49f812 100644 (file)
@@ -38,6 +38,8 @@
 #include "bt-service-pbap.h"
 #include "bt-service-headset-connection.h"
 #include "bt-service-avrcp-controller.h"
+#include "bt-service-hid.h"
+#include "bt-service-proximity.h"
 
 #include "bt-service-opp-client.h"
 
@@ -53,9 +55,10 @@ static GDBusConnection *opc_obexd_conn;
 static GList *p_cache_list = NULL;
 
 static guint event_id;
+static guint session_reinit_timer;
 guint nap_connected_device_count = 0;
 static guint hid_connected_device_count = 0;
-static GList *p_adv_ind_list;
+static GList *p_adv_ind_list = NULL;
 
 typedef struct {
        bt_remote_dev_info_t *dev_info;
@@ -71,7 +74,7 @@ typedef enum {
        OBEX_PBAP = (1 << 4),
        OBEX_IRMC = (1 << 5),
        OBEX_PCSUITE = (1 << 6),
-       OBEX_SYNCEVOLUTION =    (1 << 7),
+       OBEX_SYNCEVOLUTION = (1 << 7),
        OBEX_MAS = (1 << 8),
 } bluetooth_obex_connection_type_t;
 
@@ -85,8 +88,14 @@ void _bt_handle_network_client_event(GVariant *msg_iter,
 void __bt_gatt_char_property_changed_event(GVariant *msg_iter,
                                const char *path);
 
-static void __bt_free_bt_le_adv_info_t(bt_le_adv_info_t *adv_info)
+static void __bt_free_bt_le_adv_info_t(gpointer data)
 {
+       bt_le_adv_info_t *adv_info = data;
+
+       if (adv_info->timer_id)
+               g_source_remove(adv_info->timer_id);
+       adv_info->timer_id = 0;
+
        g_free(adv_info->addr);
        g_free(adv_info->data);
        g_free(adv_info);
@@ -99,21 +108,23 @@ static bt_le_adv_info_t *__bt_get_adv_ind_info(char *addr)
        GList *current = g_list_first((GList *)p_adv_ind_list);
        while (current && current->data) {
                adv_info = (bt_le_adv_info_t *)current->data;
-               retv_if(adv_info && !g_strcmp0(adv_info->addr, addr), adv_info);
+               if (adv_info && !g_strcmp0(adv_info->addr, addr))
+                       return adv_info;
                current = g_list_next(current);
        }
        return NULL;
 }
 
-static void __bt_add_adv_ind_info(bt_le_adv_info_t *adv_info)
+static int __bt_add_adv_ind_info(bt_le_adv_info_t *adv_info)
 {
-       ret_if(!adv_info);
+       retv_if(!adv_info, -1);
        if (__bt_get_adv_ind_info(adv_info->addr) != NULL) {
-               BT_ERR("adv_info is already added");
                __bt_free_bt_le_adv_info_t(adv_info);
-               return;
+               return -1;
        }
        p_adv_ind_list = g_list_append(p_adv_ind_list, adv_info);
+
+       return 0;
 }
 
 static void __bt_del_adv_ind_info(char *addr)
@@ -133,6 +144,26 @@ static void __bt_del_adv_ind_info(char *addr)
        }
 }
 
+static gboolean __bt_adv_scan_req_timeout_cb(gpointer user_data)
+{
+       bt_remote_le_dev_info_t le_dev_info;
+       bt_le_adv_info_t *adv_info = (bt_le_adv_info_t*)user_data;
+
+       memset(&le_dev_info, 0x00, sizeof(bt_remote_le_dev_info_t));
+
+       le_dev_info.address = adv_info->addr;
+       le_dev_info.addr_type = adv_info->addr_type;
+       le_dev_info.rssi = adv_info->rssi;
+       le_dev_info.adv_data = adv_info->data;
+       le_dev_info.adv_data_len = 0;
+       adv_info->timer_id = 0;
+
+       _bt_send_scan_result_event(&le_dev_info, adv_info);
+       __bt_del_adv_ind_info(adv_info->addr);
+
+       return FALSE;
+}
+
 static void __bt_free_cache_info(bt_cache_info_t *cache_info)
 {
        ret_if(cache_info == NULL);
@@ -160,7 +191,7 @@ static gboolean __bt_parse_device_properties(GVariant *item,
                        if (dev_info->name == NULL)
                                dev_info->name = g_variant_dup_string(val, &len);
                } else if (strcasecmp(key, "Connected") == 0) {
-                       dev_info->connected = g_variant_get_uint32(val);
+                       dev_info->connected = g_variant_get_byte(val);
                } else if (strcasecmp(key, "paired") == 0) {
                        dev_info->paired = g_variant_get_boolean(val);
                } else if (strcasecmp(key, "Trusted") == 0) {
@@ -187,7 +218,7 @@ static gboolean __bt_parse_device_properties(GVariant *item,
                                g_free(uuid_value);
                        }
                } else if (strcasecmp(key, "ManufacturerDataLen") == 0) {
-                       g_variant_get(val, "(i)", &dev_info->manufacturer_data_len);
+                       g_variant_get(val, "q", &dev_info->manufacturer_data_len);
                        if (dev_info->manufacturer_data_len > BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX) {
                                BT_ERR("manufacturer_data_len is too long(len = %d)", dev_info->manufacturer_data_len);
                                dev_info->manufacturer_data_len = BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX;
@@ -196,18 +227,21 @@ static gboolean __bt_parse_device_properties(GVariant *item,
                        if (dev_info->manufacturer_data_len == 0)
                                dev_info->manufacturer_data = g_strdup("");
                } else if (strcasecmp(key, "ManufacturerData") == 0) {
+                       int i = 0;
                        int len = 0;
-                       GVariant *manufacturer_var;
-                       g_variant_get(val, "@ay", &manufacturer_var);
-                       len = g_variant_get_size(manufacturer_var);
-                       if (len > 0) {
-                               char *manufacturer_data = (char *)g_variant_get_data(manufacturer_var);
-                               dev_info->manufacturer_data = g_malloc0(len);
-                               if (dev_info->manufacturer_data)
-                                       memcpy(dev_info->manufacturer_data, manufacturer_data,
-                                               len);
-                       }
-                       g_variant_unref(manufacturer_var);
+                       GVariantIter *value_iter;
+                       guint8 m_value;
+
+                       len = g_variant_get_size(val);
+                       if (len <= 0)
+                               continue;
+
+                       dev_info->manufacturer_data = g_malloc0(len);
+
+                       g_variant_get(val, "ay", &value_iter);
+                       while (g_variant_iter_loop(value_iter, "y", &m_value))
+                               dev_info->manufacturer_data[i++] = m_value;
+                       g_variant_iter_free(value_iter);
                }
        }
 
@@ -219,7 +253,7 @@ static gboolean __bt_parse_interface(GVariant *msg,
                                        bt_remote_dev_info_t *dev_info)
 {
        char *path = NULL;
-       GVariant *optional_param;
+       GVariant *optional_param = NULL;
        GVariantIter iter;
        GVariant *child;
        char *interface_name = NULL;
@@ -228,6 +262,8 @@ static gboolean __bt_parse_interface(GVariant *msg,
                                        &path, &optional_param);
        g_variant_iter_init(&iter, optional_param);
 
+       retv_if(optional_param == NULL, FALSE);
+
        while ((child = g_variant_iter_next_value(&iter))) {
                g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
                if (g_strcmp0(interface_name, BT_DEVICE_INTERFACE) == 0) {
@@ -247,7 +283,7 @@ static gboolean __bt_parse_interface(GVariant *msg,
                        }
                }
                g_variant_unref(inner_iter);
-       g_variant_unref(child);
+               g_variant_unref(child);
        }
 
        g_variant_unref(optional_param);
@@ -273,18 +309,16 @@ void __bt_set_device_values(gboolean connected, int state)
 {
        int bt_device_state = VCONFKEY_BT_DEVICE_NONE;
 
-       if (vconf_get_int(VCONFKEY_BT_DEVICE, &bt_device_state) != 0) {
+       if (vconf_get_int(VCONFKEY_BT_DEVICE, &bt_device_state) != 0)
                BT_ERR("vconf_get_int failed");
-       }
 
        if (connected == TRUE)
                bt_device_state |= state;
        else if (bt_device_state & state)
                bt_device_state ^= state;
 
-       if (vconf_set_int(VCONFKEY_BT_DEVICE, bt_device_state) != 0) {
+       if (vconf_set_int(VCONFKEY_BT_DEVICE, bt_device_state) != 0)
                BT_ERR("vconf_set_int failed");
-       }
 }
 
 gboolean _bt_discovery_finished_cb(gpointer user_data)
@@ -293,9 +327,8 @@ gboolean _bt_discovery_finished_cb(gpointer user_data)
        event_id = 0;
        GVariant *param = NULL;
        if (_bt_get_discovering_property(DISCOVERY_ROLE_BREDR) == FALSE) {
-               if (_bt_get_cancel_by_user() == TRUE) {
+               if (_bt_get_cancel_by_user() == TRUE)
                        result = BLUETOOTH_ERROR_CANCEL_BY_USER;
-               }
 
                _bt_set_cancel_by_user(FALSE);
                _bt_set_discovery_status(FALSE);
@@ -314,12 +347,14 @@ static gboolean __bt_le_discovery_finished_cb(gpointer user_data)
        event_id = 0;
        GVariant *param = NULL;
        if (_bt_get_discovering_property(DISCOVERY_ROLE_LE) == FALSE) {
-               if (_bt_get_cancel_by_user() == TRUE) {
+               if (_bt_get_cancel_by_user() == TRUE)
                        result = BLUETOOTH_ERROR_CANCEL_BY_USER;
-               }
+
+               g_list_free_full(p_adv_ind_list, __bt_free_bt_le_adv_info_t);
+               p_adv_ind_list = NULL;
 
                _bt_set_cancel_by_user(FALSE);
-                _bt_disable_all_scanner_status();
+               _bt_disable_all_scanner_status();
                _bt_set_le_scan_status(FALSE);
                param = g_variant_new("(i)", result);
                _bt_send_event(BT_LE_ADAPTER_EVENT,
@@ -395,6 +430,22 @@ static void __bt_device_remote_connected_properties(
        BT_DBG("-");
 }
 
+gboolean __bt_handle_is_flight_mode_enabled(void)
+{
+#ifdef TIZEN_FEATURE_FLIGHTMODE_ENABLED
+       int is_flight_mode = 0;
+       int ret = -1;
+
+       ret = vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &is_flight_mode);
+       if (ret != 0)
+               BT_ERR("vconf_get_bool failed");
+
+       return (is_flight_mode == 0) ? FALSE : TRUE;
+#else
+       return FALSE;
+#endif
+}
+
 void _bt_handle_adapter_event(GVariant *msg, const char *member)
 {
        BT_DBG("+");
@@ -416,7 +467,7 @@ void _bt_handle_adapter_event(GVariant *msg, const char *member)
                g_variant_get(msg, "(&o)", &object_path);
                _bt_convert_device_path_to_address((const char*)object_path, address);
 
-               remote_dev_info = _bt_get_remote_device_info(address);
+               remote_dev_info = _bt_get_remote_device_info_by_object_path(object_path);
                if (remote_dev_info == NULL) {
                        g_free(address);
                        return;
@@ -433,12 +484,11 @@ void _bt_handle_adapter_event(GVariant *msg, const char *member)
 
                /* Bonding from remote device */
                address = g_malloc0(BT_ADDRESS_STRING_SIZE);
-               g_variant_get(msg, "(&o)", &object_path);
-
-               /* Fix : NULL_RETURNS */
                if (address == NULL)
                        return;
 
+               g_variant_get(msg, "(&o)", &object_path);
+
                _bt_convert_device_path_to_address((const char *)object_path, address);
 
                node = g_list_first(p_cache_list);
@@ -544,10 +594,16 @@ void _bt_handle_adapter_event(GVariant *msg, const char *member)
                g_free(address);
        } else if (strcasecmp(member, BT_HARDWARE_ERROR) == 0) {
                BT_ERR_C("Hardware error received from BLUEZ");
+/* Don't add the recovery logic into platform */
+#if 0
                _bt_recover_adapter();
+#endif
        } else if (strcasecmp(member, BT_TX_TIMEOUT_ERROR) == 0) {
                BT_ERR_C("Tx timeout error received from BLUEZ");
+/* Don't add the recovery logic into platform */
+#if 0
                _bt_recover_adapter();
+#endif
        }
        BT_DBG("-");
 }
@@ -559,6 +615,7 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path)
        int result = BLUETOOTH_ERROR_NONE;
        GVariantIter value_iter;
        GVariant *val = NULL;
+       GVariant *ret = NULL;
        GError *err = NULL;
        char *property = NULL;
        GVariant *param = NULL;
@@ -584,7 +641,7 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path)
                                ret_if(adapter_proxy == NULL);
 
                                /* Need to stop searching */
-                               g_dbus_proxy_call_sync(adapter_proxy, "StopDiscovery",
+                               ret = g_dbus_proxy_call_sync(adapter_proxy, "StopDiscovery",
                                        NULL,
                                        G_DBUS_CALL_FLAGS_NONE,
                                        DBUS_TIMEOUT, NULL,
@@ -593,6 +650,8 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path)
                                        BT_ERR("Dbus Error : %s", err->message);
                                        g_clear_error(&err);
                                }
+                               if (ret)
+                                       g_variant_unref(ret);
 
                                event_id = g_timeout_add(BT_DISCOVERY_FINISHED_DELAY,
                                  (GSourceFunc)_bt_discovery_finished_cb, NULL);
@@ -615,7 +674,7 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path)
                                ret_if(adapter_proxy == NULL);
 
                                /* Need to stop searching */
-                               g_dbus_proxy_call_sync(adapter_proxy, "StopLEDiscovery",
+                               ret = g_dbus_proxy_call_sync(adapter_proxy, "StopLEDiscovery",
                                        NULL,
                                        G_DBUS_CALL_FLAGS_NONE,
                                        DBUS_TIMEOUT, NULL,
@@ -624,6 +683,8 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path)
                                        BT_ERR("Dbus Error %s", err->message);
                                        g_clear_error(&err);
                                }
+                               if (ret)
+                                       g_variant_unref(ret);
 
                                event_id = g_timeout_add(BT_DISCOVERY_FINISHED_DELAY,
                                                (GSourceFunc)__bt_le_discovery_finished_cb, NULL);
@@ -657,18 +718,20 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path)
                                        int time = 0;
                                        adapter_proxy = _bt_get_adapter_properties_proxy();
                                        ret_if(adapter_proxy == NULL);
-                                       g_dbus_proxy_call_sync(adapter_proxy, "Set",
-                                       g_variant_new("(ssv)", BT_ADAPTER_INTERFACE,
+                                       ret = g_dbus_proxy_call_sync(adapter_proxy, "Set",
+                                               g_variant_new("(ssv)", BT_ADAPTER_INTERFACE,
                                                "DiscoverableTimeout",
                                                g_variant_new("i", time)),
-                                       G_DBUS_CALL_FLAGS_NONE,
-                                       DBUS_TIMEOUT, NULL,
-                                       &err);
+                                               G_DBUS_CALL_FLAGS_NONE,
+                                               DBUS_TIMEOUT, NULL,
+                                               &err);
 
                                        if (err != NULL) {
                                                BT_ERR("StopLEDiscovery Failed: %s", err->message);
                                                g_error_free(err);
                                        }
+                                       if (ret)
+                                               g_variant_unref(ret);
                                }
 
                                mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
@@ -727,7 +790,10 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path)
 #else
                                if (vconf_get_int(VCONFKEY_BT_STATUS, &bt_state) == 0 &&
                                bt_state != VCONFKEY_BT_STATUS_OFF) {
-                                       _bt_disable_adapter();
+                                       if (__bt_handle_is_flight_mode_enabled() == FALSE)
+                                               _bt_disable_adapter();
+                                       else
+                                               _bt_handle_adapter_removed();
                                }
 #endif
                                if (vconf_get_int(VCONFKEY_BT_LE_STATUS, &bt_state) == 0 &&
@@ -749,25 +815,26 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path)
                        _bt_send_event(BT_ADAPTER_EVENT,
                                BLUETOOTH_EVENT_CONNECTABLE_CHANGED,
                                param);
+#if 0
                        if (_bt_adapter_get_status() == BT_DEACTIVATING &&
                        _bt_adapter_get_le_status() == BT_LE_ACTIVATED &&
                        connectable == 0)
                        _bt_set_disabled(BLUETOOTH_ERROR_NONE);
+#endif
                } else if (strcasecmp(property, "SupportedLEFeatures") == 0) {
                        char *name = NULL;
                        char *value = NULL;
                        GVariantIter *iter = NULL;
                        g_variant_get(val, "as", &iter);
-                       if (iter) {
-                               while (g_variant_iter_loop(iter, "s", &name)) {
-                                       BT_DBG("name = %s", name);
-                                       g_variant_iter_loop(iter, "s", &value);
-                                       BT_DBG("Value = %s", value);
-                                       if (FALSE == _bt_update_le_feature_support(name, value))
-                                               BT_INFO("Fail to update LE feature info");
-                               }
-                               g_variant_iter_free(iter);
+                       while (g_variant_iter_loop(iter, "s", &name)) {
+                               BT_DBG("name = %s", name);
+                               g_variant_iter_loop(iter, "s", &value);
+                               BT_DBG("Value = %s", value);
+                               if (FALSE == _bt_update_le_feature_support(name, value))
+                                       BT_INFO("Fail to update LE feature info");
                        }
+                       if (iter)
+                               g_variant_iter_free(iter);
                } else if (strcasecmp(property, "IpspInitStateChanged") == 0) {
                        gboolean ipsp_initialized = FALSE;
 
@@ -779,6 +846,8 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path)
                        _bt_send_event(BT_ADAPTER_EVENT,
                                        BLUETOOTH_EVENT_IPSP_INIT_STATE_CHANGED,
                                        param);
+               } else {
+                       BT_DBG("property : [%s]", property);
                }
        }
 }
@@ -813,7 +882,11 @@ static void __bt_obex_property_changed_event(GVariant *msg, const char *path)
                        }
                        g_free(status);
                } else if (strcasecmp(property, "Transferred") == 0) {
-                       static int transferred  = 0;
+                       guint64 transferred  = 0;
+                       /* As Transferred is expected guint64 so change int to guint64 and
+                        * eariler transferred is static because of it can overwrite data
+                        * on present on opc_obex_conn or obexd_conn as these are
+                        * static memory are in sequential */
                        g_variant_get(val, "t", &transferred);
 
                        _bt_obex_transfer_progress(path, transferred);
@@ -856,7 +929,7 @@ static void __bt_device_property_changed_event(GVariant *msg, const char *path)
                        BT_DBG("connected: %d", connected);
                        BT_DBG("address: %s", address);
 
-                       remote_dev_info = _bt_get_remote_device_info(address);
+                       remote_dev_info = _bt_get_remote_device_info_by_object_path(path);
 
                        if (remote_dev_info != NULL) {
                                __bt_device_remote_connected_properties(
@@ -879,7 +952,7 @@ static void __bt_device_property_changed_event(GVariant *msg, const char *path)
                        _bt_convert_device_path_to_address(path, address);
                        BT_DBG("address: %s", address);
 
-                       remote_dev_info = _bt_get_remote_device_info(address);
+                       remote_dev_info = _bt_get_remote_device_info_by_object_path(path);
                        if (remote_dev_info == NULL) {
                                g_free(property);
                                g_variant_unref(val);
@@ -981,7 +1054,7 @@ static void __bt_device_property_changed_event(GVariant *msg, const char *path)
 
                        _bt_convert_device_path_to_address(path, address);
 
-                       remote_dev_info = _bt_get_remote_device_info(address);
+                       remote_dev_info = _bt_get_remote_device_info_by_object_path(path);
                        if (remote_dev_info == NULL) {
                                g_free(property);
                                g_variant_unref(val);
@@ -996,8 +1069,21 @@ static void __bt_device_property_changed_event(GVariant *msg, const char *path)
                                _bt_send_event(BT_ADAPTER_EVENT,
                                        BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED,
                                        param);
+#ifdef TIZEN_BT_A2DP_SINK_AUTO_CONNECT
+                               {
+                                       char *last_connected = NULL;
+                                       last_connected = vconf_get_str(BT_LAST_CONNECTED_DEVICE);
+                                       if (!g_strcmp0(address, last_connected))
+                                               _bt_audio_set_auto_connect_device_addr("");
+                                       if (last_connected)
+                                               free(last_connected);
+                               }
+#endif
                        } else {
-                               BT_INFO("Paired: %s", address);
+                               char secure_addr[BT_ADDRESS_STRING_SIZE] = { 0 };
+
+                               _bt_convert_addr_string_to_secure_string(secure_addr, address);
+                               BT_INFO("### Paired: %s", secure_addr);
                                __bt_update_remote_cache_devinfo(address, TRUE);
 
                                if (_bt_is_device_creating() == TRUE) {
@@ -1044,6 +1130,7 @@ static void __bt_device_property_changed_event(GVariant *msg, const char *path)
                } else if (strcasecmp(property, "LegacyPaired") == 0) {
                        gboolean paired = FALSE;
                        bt_remote_dev_info_t *remote_dev_info;
+                       unsigned char auth_info[5] = {0, };
 
                        if (_bt_adapter_get_status() != BT_ACTIVATED) {
                                BT_DBG("BT is not activated, so ignore this");
@@ -1057,18 +1144,30 @@ static void __bt_device_property_changed_event(GVariant *msg, const char *path)
                        BT_DBG("LegacyPaired: %d", paired);
                        _bt_convert_device_path_to_address(path, address);
 
-                       remote_dev_info = _bt_get_remote_device_info(address);
+                       remote_dev_info = _bt_get_remote_device_info_by_object_path(path);
                        if (remote_dev_info == NULL) {
                                g_free(address);
                                g_free(property);
                                g_variant_unref(val);
                                return;
                        }
+                       if (remote_dev_info->is_alias_set == FALSE) {
+                               /*minimum Size of the samsung specific manufacturer data is greater than 30 */
+                               if ((remote_dev_info->manufacturer_data_len > 30) &&
+                                       (remote_dev_info->manufacturer_data[0] == 0x00) &&
+                                       (remote_dev_info->manufacturer_data[1] == 0x75)) {
+
+                                       /* 2  samsung (0x00 0x75) + 1 (control and version) + 1 (service ID) +
+                                       1 (discovery version) + 1 (associated service ID)
+                                       2 (Proxamity and locality) + 2 (Device type and icon) = 10 */
+
+                                       memcpy(auth_info, &(remote_dev_info->manufacturer_data[10]), 5);
+                               }
+                       }
 
-                       BT_DBG("LegacyPairing Failed with %s. Show Error Popup",
-                                       remote_dev_info->name);
+                       BT_DBG("LegacyPairing Failed with %s. Show Error Popup", remote_dev_info->name);
                        _bt_launch_system_popup(BT_AGENT_EVENT_LEGACY_PAIR_FAILED_FROM_REMOTE,
-                                               remote_dev_info->name, NULL, NULL, NULL);
+                                               remote_dev_info->name, auth_info, NULL, NULL, NULL);
 
                        _bt_free_device_info(remote_dev_info);
                        g_free(address);
@@ -1092,6 +1191,19 @@ static void __bt_device_property_changed_event(GVariant *msg, const char *path)
                                        event,
                                        param);
                        g_free(address);
+               } else if (strcasecmp(property, "TrustedProfiles") == 0) {
+                       int trusted = 0;
+
+                       g_variant_get(val, "u", &trusted);
+
+                       address = g_malloc0(BT_ADDRESS_STRING_SIZE);
+                       _bt_convert_device_path_to_address(path, address);
+
+                       BT_DBG("Address: %s, TrustedProfiles: %d", address, trusted);
+                       _bt_send_event(BT_DEVICE_EVENT,
+                                       BLUETOOTH_EVENT_SUPPORTED_PROFILE_TRUSTED,
+                                       g_variant_new("(isi)", result, address, trusted));
+                       g_free(address);
                } else if (strcasecmp(property, "IpspConnected") == 0) {
                        gboolean connected = FALSE;
 
@@ -1099,7 +1211,7 @@ static void __bt_device_property_changed_event(GVariant *msg, const char *path)
 
 
                        event = connected ? BLUETOOTH_EVENT_IPSP_CONNECTED :
-                                       BLUETOOTH_EVENT_IPSP_DISCONNECTED;
+                                                       BLUETOOTH_EVENT_IPSP_DISCONNECTED;
 
                        address = g_malloc0(BT_ADDRESS_STRING_SIZE);
 
@@ -1129,7 +1241,7 @@ static void __bt_device_property_changed_event(GVariant *msg, const char *path)
 
                        /* Send event to application */
                        _bt_send_event(BT_DEVICE_EVENT,
-                                       BLUETOOTH_EVENT_IPSP_BT_INTERFACE_INFO,
+                                       BLUETOOTH_EVENT_IPSP_INTERFACE_INFO,
                                        param);
                        g_free(address);
                }
@@ -1188,6 +1300,70 @@ static void __bt_media_control_changed_event(GVariant *msg, const char *path)
        BT_DBG("-");
 }
 
+int get_alert_level_enum(const char *alert)
+{
+       int lvl = -1;
+
+       if (strcmp(alert, "none") == 0)
+               lvl = BT_PXP_ALERT_NONE;
+       else if (strcmp(alert, "mild") == 0)
+               lvl = BT_PXP_ALERT_MILD;
+       else if (strcmp(alert, "high") == 0)
+               lvl = BT_PXP_ALERT_HIGH;
+
+       return lvl;
+}
+
+static void _bt_handle_pxp_property_changed_event(GVariant *msg, const char *path, int role)
+{
+       int result = BLUETOOTH_ERROR_NONE;
+       int service_type;
+       int alert_lvl;
+       GVariantIter value_iter;
+       char *property = NULL;
+       char *address;
+       GVariant *val = NULL;
+       GVariant *child = NULL;
+       GVariant *param = NULL;
+       g_variant_iter_init(&value_iter, msg);
+
+       BT_DBG("+");
+       while ((child = g_variant_iter_next_value(&value_iter))) {
+               g_variant_get(child, "{sv}", &property, &val);
+               BT_INFO("Property %s", property);
+
+               if ((strcasecmp(property, "LinkLossAlertLevel") == 0) ||
+                       (strcasecmp(property, "ImmediateAlertLevel") == 0)) {
+                       char *alert_str = NULL;
+
+                       address = g_malloc0(BT_ADDRESS_STRING_SIZE);
+                       _bt_convert_device_path_to_address(path, address);
+
+                       if (strcasecmp(property, "LinkLossAlertLevel") == 0)
+                               service_type = BT_PXP_PROPERTY_LLS;
+                       else
+                               service_type = BT_PXP_PROPERTY_IAS;
+
+                       g_variant_get(val, "s", &alert_str);
+                       alert_lvl = get_alert_level_enum(alert_str);
+
+                       param = g_variant_new("(isiii)", result, address,
+                                                               role, service_type, alert_lvl);
+
+                       /* Send event to application */
+                       _bt_send_event(BT_DEVICE_EVENT,
+                                       BLUETOOTH_EVENT_PXP_PROPERTY_CHANGED,
+                                       param);
+                       g_free(address);
+                       g_free(alert_str);
+               }
+               g_free(property);
+               g_variant_unref(child);
+               g_variant_unref(val);
+       }
+       BT_DBG("-");
+}
+
 void _bt_handle_property_changed_event(GVariant *msg, const char *object_path)
 {
        char *interface_name = NULL;
@@ -1217,6 +1393,14 @@ void _bt_handle_property_changed_event(GVariant *msg, const char *object_path)
        } else if (strcasecmp(interface_name, BT_GATT_CHAR_INTERFACE) == 0) {
                __bt_gatt_char_property_changed_event(val,
                                        object_path);
+       } else if (strcasecmp(interface_name, BT_PROXIMITY_REPORTER_INTERFACE) == 0) {
+               BT_DBG("BT_PROXIMITY_REPORTER_INTERFACE");
+               _bt_handle_pxp_property_changed_event(val,
+                                       object_path, BT_PXP_REPORTER_ROLE);
+       } else if (strcasecmp(interface_name, BT_PROXIMITY_MONITOR_INTERFACE) == 0) {
+               BT_DBG("BT_PROXIMITY_MONITOR_INTERFACE");
+               _bt_handle_pxp_property_changed_event(val,
+                                       object_path, BT_PXP_MONITOR_ROLE);
        }
        g_variant_unref(val);
 }
@@ -1239,16 +1423,16 @@ void __bt_opc_property_changed_event(GVariant *msg,
                        g_variant_get(val, "s", &status);
                        BT_DBG("Status is %s", status);
 
-                       if (strcasecmp(status, "active") == 0) {
+                       if (strcasecmp(status, "active") == 0)
                                _bt_obex_client_started(path);
-                       } else if (strcasecmp(status, "complete") == 0) {
+                       else if (strcasecmp(status, "complete") == 0)
                                _bt_obex_client_completed(path, TRUE);
-                       } else if (strcasecmp(status, "error") == 0) {
+                       else if (strcasecmp(status, "error") == 0)
                                _bt_obex_client_completed(path, FALSE);
-                       }
+
                        g_free(status);
                } else if (strcasecmp(property, "Transferred") == 0) {
-                       static int transferred  = 0;
+                       guint64 transferred  = 0;
                        g_variant_get(val, "t", &transferred);
 
                        _bt_obex_client_progress(path, transferred);
@@ -1308,7 +1492,7 @@ void _bt_handle_input_event(GVariant *msg, const char *path)
                        _bt_send_event(BT_HID_EVENT, event,
                                param);
                        /* Check HID connection type (Keyboard or Mouse) and update the status */
-                       remote_dev_info = _bt_get_remote_device_info(address);
+                       remote_dev_info = _bt_get_remote_device_info_by_object_path(path);
 
                        if (property_flag == TRUE) {
                                hid_connected_device_count++;
@@ -1325,19 +1509,15 @@ void _bt_handle_input_event(GVariant *msg, const char *path)
                                BT_DBG("HID device class [%x]", remote_dev_info->class);
                                if (remote_dev_info->class &
                                        BLUETOOTH_DEVICE_MINOR_CLASS_KEY_BOARD) {
-#ifdef ENABLE_TIZEN_2_4
                                        __bt_set_device_values(property_flag,
                                                VCONFKEY_BT_DEVICE_HID_KEYBOARD_CONNECTED);
-#endif
 
                                }
 
                                if (remote_dev_info->class &
                                                BLUETOOTH_DEVICE_MINOR_CLASS_POINTING_DEVICE) {
-#ifdef ENABLE_TIZEN_2_4
                                        __bt_set_device_values(property_flag,
                                                        VCONFKEY_BT_DEVICE_HID_MOUSE_CONNECTED);
-#endif
                                }
                                _bt_free_device_info(remote_dev_info);
                        }
@@ -1521,9 +1701,10 @@ void _bt_handle_device_event(GVariant *msg, const char *member, const char *path
        int event = 0;
        int result = BLUETOOTH_ERROR_NONE;
        char *address;
-       char *dev_name;
+       char *dev_name = NULL;
        const char *property = NULL;
        GVariant *param = NULL;
+       char secure_address[BT_ADDRESS_STRING_SIZE] = { 0 };
        ret_if(path == NULL);
 
        if (strcasecmp(member, "PropertyChanged") == 0) {
@@ -1573,7 +1754,7 @@ void _bt_handle_device_event(GVariant *msg, const char *member, const char *path
 
                        _bt_convert_device_path_to_address(path, address);
 
-                       remote_dev_info = _bt_get_remote_device_info(address);
+                       remote_dev_info = _bt_get_remote_device_info_by_object_path(path);
                        if (remote_dev_info == NULL) {
                                g_free(address);
                                return;
@@ -1624,7 +1805,7 @@ void _bt_handle_device_event(GVariant *msg, const char *member, const char *path
 
                        _bt_convert_device_path_to_address(path, address);
 
-                       remote_dev_info = _bt_get_remote_device_info(address);
+                       remote_dev_info = _bt_get_remote_device_info_by_object_path(path);
                        if (remote_dev_info == NULL) {
                                g_free(address);
                                return;
@@ -1675,15 +1856,13 @@ void _bt_handle_device_event(GVariant *msg, const char *member, const char *path
                _bt_convert_device_path_to_address(path, address);
                dev_name = _bt_get_bonded_device_name(address);
 
-               BT_INFO("Address : %s Type : %d", address, addr_type);
-               BT_ERR_C("Connected [%s] [%s]", !addr_type ? "BREDR" : "LE",
-                               !addr_type ? dev_name : address);
+               _bt_convert_addr_string_to_secure_string(secure_address, address);
+               BT_INFO("Address : %s Type : %d", secure_address, addr_type);
+               BT_ERR_C("### Connected [%s] [%s]", !addr_type ? "BREDR" : "LE",
+                               !addr_type ? dev_name : secure_address);
                g_free(dev_name);
 
                _bt_logging_connection(TRUE, addr_type);
-#ifdef ENABLE_TIZEN_2_4
-               journal_bt_connected();
-#endif
                param = g_variant_new("(isy)", result, address, addr_type);
                /*Send event to application*/
                _bt_send_event(BT_DEVICE_EVENT,
@@ -1693,9 +1872,10 @@ void _bt_handle_device_event(GVariant *msg, const char *member, const char *path
        } else if (strcasecmp(member, "Disconnected") == 0) {
                unsigned char disc_reason = 0;
                unsigned char addr_type = 0;
+               char *dev_name = NULL;
                gboolean sending = FALSE;
 
-               g_variant_get(msg, "(yy)", &addr_type, &disc_reason);
+               g_variant_get(msg, "(yys)", &addr_type, &disc_reason, &dev_name);
 
                result = disc_reason;
 
@@ -1703,30 +1883,55 @@ void _bt_handle_device_event(GVariant *msg, const char *member, const char *path
                ret_if(address == NULL);
 
                _bt_convert_device_path_to_address(path, address);
-               dev_name = _bt_get_bonded_device_name(address);
-#ifdef ENABLE_TIZEN_2_4
-               journal_bt_disconnected();
-#endif
 
                /* 0x00 BDADDR_BRDER
                      0x01 BDADDR_LE_PUBLIC
                      0x02 BDADDR_LE_RANDOM */
-               BT_INFO("Address : %s Type : %d", address, addr_type);
-               BT_ERR_C("Disconnected [%s] [%d : %s] [%s]", !addr_type ? "BREDR" : "LE",
+               _bt_convert_addr_string_to_secure_string(secure_address, address);
+               BT_INFO("Address : %s Type : %d", secure_address, addr_type);
+               BT_ERR_C("### Disconnected [%s] [%d : %s] [%s]", !addr_type ? "BREDR" : "LE",
                                disc_reason, _bt_convert_disc_reason_to_string(disc_reason),
-                               !addr_type ? dev_name : address);
+                               !addr_type ? dev_name : secure_address);
                g_free(dev_name);
 
                _bt_headset_set_local_connection(FALSE);
                _bt_logging_connection(FALSE, addr_type);
 
-               /*Check for any OPP transfer on the device and cancel
-                * the transfer
-                */
-               _bt_obex_check_pending_transfer(address);
-               _bt_opp_client_is_sending(&sending);
-               if (sending == TRUE)
-                       _bt_opp_client_check_pending_transfer(address);
+               if (!addr_type) {
+#ifdef TIZEN_BT_A2DP_SINK_AUTO_CONNECT
+                       {
+                               int bt_device_state = VCONFKEY_BT_DEVICE_NONE;
+
+                               if (vconf_get_int(VCONFKEY_BT_DEVICE, &bt_device_state) != 0)
+                                       BT_ERR("vconf_get_int failed");
+
+                               BT_INFO("conn_state[0x%x], adapter_state [%d]",
+                                                       bt_device_state, _bt_adapter_get_status());
+
+                               if (disc_reason == BLUETOOTH_ERROR_CONNECTION_TIMEOUT) {
+                                       _bt_audio_start_auto_connect(TRUE);
+                               } else if (bt_device_state &
+                                                       VCONFKEY_BT_DEVICE_A2DP_SOURCE_CONNECTED) {
+                                       BT_INFO("Disconnected due to turning BT off. Skip a address");
+                               } else {
+                                       char *last_connected = NULL;
+                                       last_connected = vconf_get_str(BT_LAST_CONNECTED_DEVICE);
+                                       if (!g_strcmp0(address, last_connected))
+                                               _bt_audio_set_auto_connect_device_addr("");
+                                       if (last_connected)
+                                               free(last_connected);
+                               }
+                       }
+
+#endif
+                       /*Check for any OPP transfer on the device and cancel
+                        * the transfer
+                        */
+                       _bt_obex_check_pending_transfer(address);
+                       _bt_opp_client_is_sending(&sending);
+                       if (sending == TRUE)
+                               _bt_opp_client_check_pending_transfer(address);
+               }
                param = g_variant_new("(isy)", result, address, addr_type);
                _bt_send_event(BT_DEVICE_EVENT,
                                        BLUETOOTH_EVENT_DEVICE_DISCONNECTED,
@@ -1736,6 +1941,7 @@ void _bt_handle_device_event(GVariant *msg, const char *member, const char *path
                int state = 0;
                char *profile_uuid = NULL;
                bt_headset_wait_t *wait_list;
+               bluetooth_device_address_t bd_addr;
 
                g_variant_get(msg, "(si)", &profile_uuid, &state);
 
@@ -1743,8 +1949,10 @@ void _bt_handle_device_event(GVariant *msg, const char *member, const char *path
                ret_if(address == NULL);
 
                _bt_convert_device_path_to_address(path, address);
+               _bt_convert_addr_string_to_type(bd_addr.addr, address);
 
-               BT_DBG("Address: %s", address);
+               _bt_convert_addr_string_to_secure_string(secure_address, address);
+               BT_DBG("Address: %s", secure_address);
                BT_DBG("Profile UUID: %s", profile_uuid);
                BT_DBG("State: %d", state);
 
@@ -1756,15 +1964,19 @@ void _bt_handle_device_event(GVariant *msg, const char *member, const char *path
                        bluetooth_device_address_t device_address;
                        gboolean connected;
                        bt_headset_wait_t *wait_list;
+                       guint restricted = 0x0;
 
                        __bt_set_device_values(TRUE,
                                VCONFKEY_BT_DEVICE_A2DP_HEADSET_CONNECTED);
 
                        __bt_connection_manager_set_state(address, event);
 
-                       if (_bt_headset_get_local_connection() == FALSE)
-                               _bt_start_timer_for_connection(address, BT_AUDIO_HSP);
-                       else {
+                       _bt_get_restrict_profile(&bd_addr, RESTRICTED_PROFILE_HFP_HS, &restricted);
+
+                       if (_bt_headset_get_local_connection() == FALSE) {
+                               if (restricted == 0x0) /* not restricted*/
+                                       _bt_start_timer_for_connection(address, BT_AUDIO_HSP);
+                       } else {
                                /* Connection Started from local device therefore no need to
                                 * intiate connection for pending profile */
                                _bt_headset_set_local_connection(FALSE);
@@ -1832,7 +2044,7 @@ void _bt_handle_device_event(GVariant *msg, const char *member, const char *path
                                _bt_audio_connect(wait_list->req_id,
                                                        wait_list->type,
                                                        &device_address,
-                                                       wait_list->out_param1);
+                                                       NULL);
                        }
                } else if (strcmp(profile_uuid, AVRCP_TARGET_UUID) == 0) {
 
@@ -1873,13 +2085,44 @@ void _bt_handle_device_event(GVariant *msg, const char *member, const char *path
                        if (state == BT_PROFILE_STATE_CONNECTED) {
                                int event = BLUETOOTH_EVENT_AV_SOURCE_CONNECTED;
                                BT_INFO("A2DP Source is connected");
+#ifdef TIZEN_BT_A2DP_SINK_ENABLE
+                               __bt_set_device_values(TRUE,
+                                               VCONFKEY_BT_DEVICE_A2DP_SOURCE_CONNECTED);
+#endif
+
+#ifdef TIZEN_BT_A2DP_SINK_AUTO_CONNECT
+                               _bt_audio_set_auto_connect_device_addr(address);
+                               _bt_audio_stop_auto_connect();
+#endif
+                               _bt_add_headset_to_list(BT_AUDIO_A2DP_SOURCE,
+                                               BT_STATE_CONNECTED, address);
                                _bt_send_event(BT_A2DP_SOURCE_EVENT, event,
                                        g_variant_new("(is)", result, address));
                        } else if (state == BT_PROFILE_STATE_DISCONNECTED) {
                                int event = BLUETOOTH_EVENT_AV_SOURCE_DISCONNECTED;
                                BT_INFO("A2DP Source Disconnected");
+#ifdef TIZEN_BT_A2DP_SINK_ENABLE
+                               __bt_set_device_values(FALSE,
+                                               VCONFKEY_BT_DEVICE_A2DP_SOURCE_CONNECTED);
+#endif
+                               _bt_remove_headset_from_list(BT_AUDIO_A2DP_SOURCE, address);
                                _bt_send_event(BT_A2DP_SOURCE_EVENT, event,
                                                g_variant_new("(is)", result, address));
+
+                               wait_list = _bt_get_audio_wait_data();
+                               if (wait_list && wait_list->type == BT_AUDIO_A2DP_SOURCE) {
+                                       bluetooth_device_address_t device_address;
+                                       _bt_convert_addr_string_to_type(
+                                                       device_address.addr,
+                                                       wait_list->address);
+
+                                       _bt_audio_connect(wait_list->req_id,
+                                                       wait_list->type,
+                                                       &device_address,
+                                                       NULL);
+                                       /* Now free the wait list */
+                                       _bt_rel_wait_data();
+                               }
                        }
                } else if ((strcmp(profile_uuid, HID_UUID) == 0) &&
                        ((state == BT_PROFILE_STATE_CONNECTED) ||
@@ -1892,13 +2135,19 @@ void _bt_handle_device_event(GVariant *msg, const char *member, const char *path
                        param = g_variant_new("(is)", result, address);
                        _bt_send_event(BT_HID_EVENT, event,
                                param);
-
-                       if (state == BT_PROFILE_STATE_CONNECTED)
-                               __bt_set_device_values(TRUE,
-                                       VCONFKEY_BT_DEVICE_HID_CONNECTED);
-                       else
-                               __bt_set_device_values(FALSE,
-                                       VCONFKEY_BT_DEVICE_HID_CONNECTED);
+               } else if (strcmp(profile_uuid, HID_DEVICE_UUID) == 0) {
+                       if (state == BT_PROFILE_STATE_CONNECTED) {
+                               int event;
+                               event = BLUETOOTH_HID_DEVICE_CONNECTED;
+                               param = g_variant_new("(is)", result, address);
+                               _bt_send_event(BT_HID_DEVICE_EVENT, event,
+                                       param);
+                       } else if (state == BT_PROFILE_STATE_DISCONNECTED) {
+                               event = BLUETOOTH_HID_DEVICE_DISCONNECTED;
+                               param = g_variant_new("(is)", result, address);
+                               _bt_send_event(BT_HID_DEVICE_EVENT, event,
+                                       param);
+                       }
                }
                g_free(address);
                g_free(profile_uuid);
@@ -1921,6 +2170,8 @@ void _bt_handle_device_event(GVariant *msg, const char *member, const char *path
                                                &le_dev_info->rssi,
                                                &le_dev_info->adv_data_len,
                                                &value);
+               _bt_convert_device_path_to_address(path, le_dev_info->address);
+
                buffer_len = g_variant_get_size(value);
                if (buffer_len > 0)
                        buffer = (char *)g_variant_get_data(value);
@@ -1949,15 +2200,19 @@ void _bt_handle_device_event(GVariant *msg, const char *member, const char *path
                        }
 
                        adv_info->addr = g_strdup(le_dev_info->address);
+                       adv_info->addr_type = le_dev_info->addr_type;
+                       adv_info->rssi = le_dev_info->rssi;
                        adv_info->data_len = le_dev_info->adv_data_len;
                        adv_info->data = g_malloc0(le_dev_info->adv_data_len);
                        if (adv_info->data) {
                                memcpy(adv_info->data, le_dev_info->adv_data,
                                                le_dev_info->adv_data_len);
-
-                               __bt_add_adv_ind_info(adv_info);
                        }
 
+                       if (__bt_add_adv_ind_info(adv_info) == 0) {
+                               adv_info->timer_id = g_timeout_add(1000,
+                                       (GSourceFunc)__bt_adv_scan_req_timeout_cb, (void*)adv_info);
+                       }
                } else {     /* SCAN_RSP */
                        adv_info = __bt_get_adv_ind_info(le_dev_info->address);
                        if (adv_info) {
@@ -1968,13 +2223,13 @@ void _bt_handle_device_event(GVariant *msg, const char *member, const char *path
                _bt_free_le_device_info(le_dev_info);
                g_variant_unref(value);
        } else if  (strcasecmp(member, "LEDataLengthChanged") == 0) {
-               int tx_octets = 0;
-               int tx_time = 0;
-               int rx_octets = 0;
-               int rx_time = 0;
+               guint16 tx_octets = 0;
+               guint16 tx_time = 0;
+               guint16 rx_octets = 0;
+               guint16 rx_time = 0;
 
                g_variant_get(msg, "(qqqq)",
-                               tx_octets, tx_time, rx_octets, rx_time);
+                               &tx_octets, &tx_time, &rx_octets, &rx_time);
 
                address = g_malloc0(BT_ADDRESS_STRING_SIZE);
                _bt_convert_device_path_to_address(path, address);
@@ -1982,10 +2237,50 @@ void _bt_handle_device_event(GVariant *msg, const char *member, const char *path
                param = g_variant_new("(isqqqq)", result, address, tx_octets, tx_time,
                                rx_octets, rx_time);
                /* Send event to application */
-               _bt_send_event(BT_DEVICE_EVENT, event, param);
+               _bt_send_event(BT_DEVICE_EVENT,
+                               BLUETOOTH_EVENT_LE_DATA_LENGTH_CHANGED, param);
                g_free(address);
-       }
+       } else if  (strcasecmp(member, "IpspStateChanged") == 0) {
+               gboolean connected = FALSE;
+               char *ifname = NULL;
+
+               g_variant_get(msg, "(bs)", &connected, &ifname);
+
+               event = connected ? BLUETOOTH_EVENT_IPSP_CONNECTED :
+                                               BLUETOOTH_EVENT_IPSP_DISCONNECTED;
 
+               address = g_malloc0(BT_ADDRESS_STRING_SIZE);
+               _bt_convert_device_path_to_address(path, address);
+
+               BT_DBG("Ipsp BT Interface Name: %s", ifname);
+               BT_DBG("address: %s", address);
+               param = g_variant_new("(iss)", result, address, ifname);
+
+               /* Send event to application */
+               _bt_send_event(BT_DEVICE_EVENT,
+                                               event,
+                                               param);
+               g_free(address);
+       } else if (strcasecmp(member, "iBeaconReport") == 0) {
+               bt_remote_ibeacon_dev_info_t *ibeacon_dev_info = NULL;
+
+               ret_if(_bt_is_le_scanning() == FALSE);
+
+               ibeacon_dev_info = g_malloc0(sizeof(bt_remote_ibeacon_dev_info_t));
+               if (ibeacon_dev_info == NULL)
+                       return;
+
+               g_variant_get(msg, "(syuusuuy)", &ibeacon_dev_info->address,
+                                               &ibeacon_dev_info->addr_type,
+                                               &ibeacon_dev_info->company_id,
+                                               &ibeacon_dev_info->ibeacon_type,
+                                               &ibeacon_dev_info->uuid,
+                                               &ibeacon_dev_info->major_id,
+                                               &ibeacon_dev_info->minor_id,
+                                               &ibeacon_dev_info->measured_power);
+               _bt_send_ibeacon_scan_result_event(ibeacon_dev_info);
+               g_free(ibeacon_dev_info);
+       }
 }
 
 void __bt_set_audio_values(gboolean connected, char *address)
@@ -1994,24 +2289,19 @@ void __bt_set_audio_values(gboolean connected, char *address)
        int bt_device_state = VCONFKEY_BT_DEVICE_NONE;
 
        /*  Set the headset name */
-       if (connected == TRUE) {
+       if (connected == TRUE)
                name = _bt_get_bonded_device_name(address);
-       } else {
+       else
                name = g_strdup("");
-       }
 
-       if (vconf_set_str(VCONFKEY_BT_HEADSET_NAME,
-                                       name) != 0) {
+       if (vconf_set_str(VCONFKEY_BT_HEADSET_NAME, name) != 0)
                BT_ERR("vconf_set_str failed");
-       }
 
        g_free(name);
 
        /*  Set the headset state */
-       if (vconf_get_int(VCONFKEY_BT_DEVICE,
-                               &bt_device_state) != 0) {
-               BT_ERR("vconf_get_str failed");
-       }
+       if (vconf_get_int(VCONFKEY_BT_DEVICE, &bt_device_state) != 0)
+               BT_ERR("vconf_get_int failed");
 
 #ifdef TIZEN_SUPPORT_DUAL_HF
        if ((connected == TRUE) &&
@@ -2022,11 +2312,10 @@ void __bt_set_audio_values(gboolean connected, char *address)
                bt_device_state ^= VCONFKEY_BT_DEVICE_HEADSET_CONNECTED;
        }
 #else
-       if (connected == TRUE) {
+       if (connected == TRUE)
                bt_device_state |= VCONFKEY_BT_DEVICE_HEADSET_CONNECTED;
-       } else if (bt_device_state & VCONFKEY_BT_DEVICE_HEADSET_CONNECTED) {
+       else if (bt_device_state & VCONFKEY_BT_DEVICE_HEADSET_CONNECTED)
                bt_device_state ^= VCONFKEY_BT_DEVICE_HEADSET_CONNECTED;
-       }
 #endif
 
        if (vconf_set_int(VCONFKEY_BT_DEVICE,
@@ -2043,6 +2332,7 @@ void _bt_handle_headset_event(GVariant *msg, const char *path)
        GVariant *value = NULL;
        GVariant *param = NULL;
        g_variant_get(msg, "(sv)", &property, &value);
+       bluetooth_device_address_t bd_addr;
 
        ret_if(property == NULL);
 
@@ -2052,21 +2342,24 @@ void _bt_handle_headset_event(GVariant *msg, const char *path)
                int event = BLUETOOTH_EVENT_NONE;
                bt_headset_wait_t *wait_list;
                char *address;
+               guint restricted = 0x0;
                g_variant_get(value, "b", &property_flag);
 
                address = g_malloc0(BT_ADDRESS_STRING_SIZE);
-
-               /* Fix : NULL_RETURNS */
                if (address == NULL)
                        return;
 
                _bt_convert_device_path_to_address(path, address);
+               _bt_convert_addr_string_to_type(bd_addr.addr, address);
 
                if (property_flag == TRUE) {
                        event = BLUETOOTH_EVENT_AG_CONNECTED;
-                       if (_bt_headset_get_local_connection() == FALSE)
-                               _bt_start_timer_for_connection(address, BT_AUDIO_A2DP);
-                       else
+                       _bt_get_restrict_profile(&bd_addr, RESTRICTED_PROFILE_A2DP, &restricted);
+
+                       if (_bt_headset_get_local_connection() == FALSE) {
+                               if (restricted == 0x0) /* not restricted*/
+                                       _bt_start_timer_for_connection(address, BT_AUDIO_A2DP);
+                       } else
                                _bt_headset_set_local_connection(FALSE);
                } else {
                        int previous_state;
@@ -2101,7 +2394,7 @@ void _bt_handle_headset_event(GVariant *msg, const char *path)
                        _bt_convert_addr_string_to_type(device_address.addr,
                                                        wait_list->address);
                        _bt_audio_connect(wait_list->req_id, wait_list->type,
-                                       &device_address, wait_list->out_param1);
+                                       &device_address, NULL);
                        _bt_rel_wait_data();
                } else if (event == BLUETOOTH_EVENT_AG_CONNECTED) {
                        /* Add data to the connected list */
@@ -2143,8 +2436,11 @@ void _bt_handle_headset_event(GVariant *msg, const char *path)
 
                _bt_convert_device_path_to_address(path, address);
 
-               g_variant_get(value, "i", &spkr_gain);
-               param = g_variant_new("(isq)", result, address, spkr_gain);
+               spkr_gain = g_variant_get_uint16(value);
+
+               BT_DBG("spkr_gain: %d", spkr_gain);
+
+               param = g_variant_new("(i&sq)", result, address, spkr_gain);
                _bt_send_event(BT_HEADSET_EVENT, BLUETOOTH_EVENT_AG_SPEAKER_GAIN,
                        param);
 
@@ -2157,8 +2453,9 @@ void _bt_handle_headset_event(GVariant *msg, const char *path)
 
                _bt_convert_device_path_to_address(path, address);
 
-               g_variant_get(value, "i", &mic_gain);
-               param = g_variant_new("(isq)", result, address, mic_gain);
+               mic_gain = g_variant_get_uint16(value);
+
+               param = g_variant_new("(i&sq)", result, address, mic_gain);
                _bt_send_event(BT_HEADSET_EVENT, BLUETOOTH_EVENT_AG_MIC_GAIN,
                        param);
                g_free(address);
@@ -2167,7 +2464,7 @@ void _bt_handle_headset_event(GVariant *msg, const char *path)
        if (property)
                g_free(property);
        g_variant_unref(value);
- }
+}
 
 void _bt_handle_sink_event(GVariant *msg, const char *path)
 {
@@ -2234,7 +2531,7 @@ void _bt_handle_sink_event(GVariant *msg, const char *path)
                                        _bt_audio_connect(wait_list->req_id,
                                                                wait_list->type,
                                                                &device_address,
-                                                               wait_list->out_param1);
+                                                               NULL);
                                }
                                g_free(address);
                        } else if (strcasecmp(value, "Connected") == 0) {
@@ -2502,13 +2799,13 @@ static  void __bt_manager_event_filter(GDBusConnection *connection,
                BT_DBG("InterfacesRemoved");
                _bt_handle_adapter_removed();
 #endif
-               if (g_strcmp0(interface_name, BT_MEDIATRANSPORT_INTERFACE) == 0) {
+               if (g_strcmp0(interface_name, BT_MEDIATRANSPORT_INTERFACE) == 0)
                        bt_event = BT_MEDIA_TRANSFER_EVENT;
-               } else if (g_strcmp0(interface_name, BT_DEVICE_INTERFACE) == 0) {
+               else if (g_strcmp0(interface_name, BT_DEVICE_INTERFACE) == 0)
                        bt_event = BT_DEVICE_EVENT;
-               } else if (g_strcmp0(interface_name, BT_PLAYER_CONTROL_INTERFACE) == 0) {
+               else if (g_strcmp0(interface_name, BT_PLAYER_CONTROL_INTERFACE) == 0)
                        bt_event = BT_AVRCP_CONTROL_EVENT;
-               }
+
                if ((bt_event != 0) && (bt_event != BT_MEDIA_TRANSFER_EVENT)) {
                        _bt_handle_adapter_event(parameters, signal_name);
                        if (bt_event == BT_AVRCP_CONTROL_EVENT) {
@@ -2539,7 +2836,7 @@ static  void __bt_manager_event_filter(GDBusConnection *connection,
                if (strcasecmp(name, BT_BLUEZ_NAME) == 0) {
                        BT_DBG("Bluetoothd is terminated");
                        if (_bt_adapter_get_status() == BT_ACTIVATED)
-                                __bt_disable_cb();
+                                _bt_disable_cb();
 
                        _bt_handle_adapter_removed();
                        __bt_devices_list_free();
@@ -2630,7 +2927,7 @@ static  void __bt_obexd_event_filter(GDBusConnection *connection,
                        BT_ERR("Fail to get the path");
                        return;
                }
-               BT_INFO("object_path = [%s]", object_path);
+               BT_INFO("object_path = [%s]", obj_path);
 
                /*Handle OPP_SERVER_CONNECTED_EVENT here */
                if (strncmp(obj_path, BT_SESSION_BASEPATH_SERVER,
@@ -2641,7 +2938,7 @@ static  void __bt_obexd_event_filter(GDBusConnection *connection,
 
                if (g_strrstr(obj_path, "session") && g_strrstr(obj_path, "transfer")) {
                        BT_DBG("Obex_Server_Session_Transfer connected");
-                       _bt_obex_transfer_connected();
+                       _bt_obex_transfer_connected(obj_path);
                }
                g_free(obj_path);
        } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
@@ -2650,7 +2947,7 @@ static  void __bt_obexd_event_filter(GDBusConnection *connection,
                        BT_ERR("Fail to get the path");
                        return;
                }
-               BT_INFO("object_path = [%s]", object_path);
+               BT_INFO("object_path = [%s]", obj_path);
 
                if (strncmp(obj_path, BT_SESSION_BASEPATH_CLIENT,
                                strlen(BT_SESSION_BASEPATH_CLIENT)) == 0) {
@@ -2665,8 +2962,10 @@ static  void __bt_obexd_event_filter(GDBusConnection *connection,
                }
 
                if (g_strrstr(obj_path, "session") && g_strrstr(obj_path, "transfer")) {
-                       BT_DBG("Obex_Server_Session_Transfer disconnected");
-                       _bt_obex_transfer_disconnected();
+                       BT_DBG("Obex_Server_Session_Transfer disconnected %s",
+                                                               obj_path);
+
+                       _bt_obex_transfer_disconnected(obj_path);
                }
                g_free(obj_path);
        } else if (__bt_is_obexd_event(parameters, interface_name) == TRUE) {
@@ -3158,6 +3457,43 @@ int _bt_register_a2dp_subscribe_signal(GDBusConnection *conn,
        return 0;
 }
 
+static void __bt_dump_event_filter(GDBusConnection *connection,
+                                       const gchar *sender_name,
+                                       const gchar *object_path,
+                                       const gchar *interface_name,
+                                       const gchar *signal_name,
+                                       GVariant *parameters,
+                                       gpointer user_data)
+{
+       return;
+}
+
+int __bt_register_dump_subscribe_signal(GDBusConnection *conn,
+               gboolean subscribe)
+{
+       if (conn == NULL)
+               return -1;
+
+       static int subs_source_id = -1;
+
+       if (subscribe) {
+               if (subs_source_id == -1) {
+                       subs_source_id = g_dbus_connection_signal_subscribe(conn,
+                               NULL, BT_DUMP_SERVICE_INTERFACE,
+                               BT_DUMP_SERVICE_SIGNAL, BT_DUMP_SERVICE_PATH, NULL, 0,
+                               __bt_dump_event_filter,
+                               NULL, NULL);
+               }
+       } else {
+               if (subs_source_id != -1) {
+                       g_dbus_connection_signal_unsubscribe(conn,
+                                       subs_source_id);
+                       subs_source_id = -1;
+               }
+       }
+       return 0;
+}
+
 int _bt_register_service_event(GDBusConnection *g_conn, int event_type)
 {
        BT_DBG("+");
@@ -3262,6 +3598,8 @@ static int __bt_init_manager_receiver(void)
        if (_bt_register_service_event(manager_conn,
                                BT_NETWORK_EVENT) != BLUETOOTH_ERROR_NONE)
                goto fail;
+
+       __bt_register_dump_subscribe_signal(manager_conn, TRUE);
        return BLUETOOTH_ERROR_NONE;
 fail:
        if (manager_conn) {
@@ -3302,6 +3640,36 @@ static int __bt_init_obexd_receiver(void)
        return BLUETOOTH_ERROR_NONE;
 }
 
+gboolean __bt_reinit_obexd_receiver(gpointer user_data)
+{
+       static int retry_cnt = 0;
+       int result = BLUETOOTH_ERROR_NONE;
+
+       BT_DBG("+");
+
+       result = __bt_init_obexd_receiver();
+       if (result != BLUETOOTH_ERROR_NONE) {
+               /* 20 ms * 50 = 10 seconds. During 10 seconds fail to initialize,
+                  then it is not the timing issue. Just can't use the session bus connection */
+               if (retry_cnt > 100) {
+                       BT_ERR("Fail to init obexd receiver by 50 times.");
+                       retry_cnt = 0;
+                       session_reinit_timer = 0;
+                       return FALSE;
+               }
+               retry_cnt++;
+               BT_DBG("Retry to initialize the obexd receiver");
+               return TRUE;
+       }
+
+       retry_cnt = 0;
+       session_reinit_timer = 0;
+
+       BT_DBG("-");
+
+       return FALSE;
+}
+
 /* To receive the event from bluez */
 int _bt_init_service_event_receiver(void)
 {
@@ -3313,9 +3681,17 @@ int _bt_init_service_event_receiver(void)
        retv_if(result != BLUETOOTH_ERROR_NONE, result);
 
        result = __bt_init_obexd_receiver();
-       if (result != BLUETOOTH_ERROR_NONE)
+       if (result != BLUETOOTH_ERROR_NONE) {
                BT_ERR("Fail to init obexd receiver");
 
+               /* Try to re-initialize obexd receiver in the timer */
+               if (session_reinit_timer > 0)
+                       g_source_remove(session_reinit_timer);
+
+               session_reinit_timer = g_timeout_add(BT_SESSION_BUS_GET_TIMEOUT,
+                                                       (GSourceFunc)__bt_reinit_obexd_receiver, NULL);
+       }
+
        BT_DBG("-");
 
        return BLUETOOTH_ERROR_NONE;
@@ -3329,6 +3705,8 @@ void _bt_deinit_service_event_receiver(void)
 
        _bt_unregister_service_event(obexd_conn, BT_OPP_SERVER_EVENT);
 
+       __bt_register_dump_subscribe_signal(manager_conn, FALSE);
+
        if (manager_conn) {
                g_object_unref(manager_conn);
                manager_conn = NULL;
@@ -3341,6 +3719,7 @@ void _bt_deinit_service_event_receiver(void)
 
        if (event_id > 0)
                g_source_remove(event_id);
+       event_id = 0;
 
        BT_DBG("-");
 }
index f539589..0fda180 100644 (file)
@@ -58,7 +58,6 @@ int _bt_send_to_hps(void)
 
 int _bt_send_event(int event_type, int event, GVariant *param)
 {
-       BT_DBG("+");
        char *path;
        char *signal;
        GDBusMessage *msg1 = NULL;
@@ -80,6 +79,9 @@ int _bt_send_event(int event_type, int event, GVariant *param)
        case BT_HID_EVENT:
                path = BT_HID_PATH;
                break;
+       case BT_HID_DEVICE_EVENT:
+               path = BT_HID_DEVICE_PATH;
+               break;
        case BT_HEADSET_EVENT:
                path = BT_HEADSET_PATH;
                break;
@@ -107,9 +109,9 @@ int _bt_send_event(int event_type, int event, GVariant *param)
        case BT_RFCOMM_SERVER_EVENT:
                path = BT_RFCOMM_SERVER_PATH;
                break;
-        case BT_A2DP_SOURCE_EVENT:
-                path = BT_A2DP_SOURCE_PATH;
-                break;
+       case BT_A2DP_SOURCE_EVENT:
+               path = BT_A2DP_SOURCE_PATH;
+               break;
        default:
                BT_ERR("Unknown event");
                return BLUETOOTH_ERROR_INTERNAL;
@@ -118,9 +120,11 @@ int _bt_send_event(int event_type, int event, GVariant *param)
        switch (event) {
        case BLUETOOTH_EVENT_ENABLED:
                signal = BT_ENABLED;
+               BT_INFO_C("### BT Enabled");
                break;
        case BLUETOOTH_EVENT_DISABLED:
                signal = BT_DISABLED;
+               BT_INFO_C("### BT Disabled");
                break;
        case BLUETOOTH_EVENT_LE_ENABLED:
                signal = BT_LE_ENABLED;
@@ -194,6 +198,9 @@ int _bt_send_event(int event_type, int event, GVariant *param)
        case BLUETOOTH_EVENT_RAW_RSSI:
                signal = BT_RAW_RSSI_EVENT;
                break;
+       case BLUETOOTH_EVENT_SUPPORTED_PROFILE_TRUSTED:
+               signal = BT_SUPPORTED_PROFILE_TRUSTED;
+               break;
        case BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY:
                signal = BT_KBD_PASSKEY_DISPLAY_REQ_RECEIVED;
                break;
@@ -217,6 +224,14 @@ int _bt_send_event(int event_type, int event, GVariant *param)
                signal = BT_INPUT_DISCONNECTED;
                BT_INFO_C("Disconnected [HID]");
                break;
+       case BLUETOOTH_HID_DEVICE_CONNECTED:
+               signal = BT_INPUT_HID_DEVICE_CONNECTED;
+               BT_INFO_C("Connected [HIDDevice]");
+               break;
+       case BLUETOOTH_HID_DEVICE_DISCONNECTED:
+               signal = BT_INPUT_HID_DEVICE_DISCONNECTED;
+               BT_INFO_C("Disconnected [HIDDevice]");
+               break;
        case BLUETOOTH_PBAP_CONNECTED:
                signal = BT_PBAP_CONNECTED;
                BT_INFO_C("Connected [PBAP Client]");
@@ -256,6 +271,14 @@ int _bt_send_event(int event_type, int event, GVariant *param)
                signal = BT_STEREO_HEADSET_DISCONNECTED;
                BT_INFO_C("Disconnected [A2DP]");
                break;
+       case BLUETOOTH_EVENT_AV_SOURCE_CONNECTED:
+               signal = BT_A2DP_SOURCE_CONNECTED;
+               BT_INFO_C("Connected [A2DP Source]");
+               break;
+       case BLUETOOTH_EVENT_AV_SOURCE_DISCONNECTED:
+               signal = BT_A2DP_SOURCE_DISCONNECTED;
+               BT_INFO_C("Disconnected [A2DP Source]");
+               break;
        case BLUETOOTH_EVENT_AG_AUDIO_CONNECTED:
                signal = BT_SCO_CONNECTED;
                BT_INFO_C("Connected [SCO]");
@@ -337,14 +360,6 @@ int _bt_send_event(int event_type, int event, GVariant *param)
        case BLUETOOTH_EVENT_DEVICE_DISCONNECTED:
                signal = BT_DEVICE_DISCONNECTED;
                break;
-       case BLUETOOTH_EVENT_AV_SOURCE_CONNECTED:
-               signal = BT_A2DP_SOURCE_CONNECTED;
-               BT_INFO_C("Connected [A2DP Source]");
-               break;
-    case BLUETOOTH_EVENT_AV_SOURCE_DISCONNECTED:
-        signal = BT_A2DP_SOURCE_DISCONNECTED;
-        BT_INFO_C("Disconnected [A2DP Source]");
-        break;
        case BLUETOOTH_EVENT_AVRCP_CONNECTED:
        case BLUETOOTH_EVENT_AVRCP_CONTROL_CONNECTED:
                signal = BT_AVRCP_CONNECTED;
@@ -382,9 +397,14 @@ int _bt_send_event(int event_type, int event, GVariant *param)
                break;
        case BLUETOOTH_EVENT_GATT_CONNECTED:
                signal = BT_GATT_CONNECTED;
+               BT_INFO_C("### Connected [GATT]");
                break;
        case BLUETOOTH_EVENT_GATT_DISCONNECTED:
                signal = BT_GATT_DISCONNECTED;
+               BT_INFO_C("### Disconnected [GATT]");
+               break;
+       case BLUETOOTH_EVENT_GATT_ATT_MTU_CHANGED:
+               signal = BT_GATT_REQ_ATT_MTU_CHANGED;
                break;
        case BLUETOOTH_EVENT_IPSP_INIT_STATE_CHANGED:
                signal = BT_IPSP_INITIALIZED;
@@ -395,15 +415,18 @@ int _bt_send_event(int event_type, int event, GVariant *param)
        case BLUETOOTH_EVENT_IPSP_DISCONNECTED:
                signal = BT_IPSP_DISCONNECTED;
                break;
-       case BLUETOOTH_EVENT_IPSP_BT_INTERFACE_INFO:
-               signal = BT_IPSP_BT_INTERFACE_INFO;
-               break;
        case BLUETOOTH_EVENT_GATT_CHAR_VAL_CHANGED:
                signal = BT_GATT_CHAR_VAL_CHANGED;
                break;
        case BLUETOOTH_EVENT_LE_DATA_LENGTH_CHANGED:
                signal = BT_LE_DATA_LENGTH_CHANGED;
                break;
+       case BLUETOOTH_EVENT_REMOTE_IBEACON_DEVICE_FOUND:
+               signal = BT_IBEACON_DEVICE_FOUND;
+               break;
+       case BLUETOOTH_EVENT_PXP_PROPERTY_CHANGED:
+               signal = BT_PXP_PROPERTY_CHANGED;
+               break;
        default:
                BT_ERR("Unknown event");
                return BLUETOOTH_ERROR_INTERNAL;
@@ -414,9 +437,8 @@ int _bt_send_event(int event_type, int event, GVariant *param)
 
        msg1 = g_dbus_message_new_signal(path, BT_EVENT_SERVICE, signal);
        g_dbus_message_set_body(msg1, param);
-       if (!g_dbus_connection_send_message(event_conn, msg1, G_DBUS_SEND_MESSAGE_FLAGS_NONE, 0, NULL)) {
+       if (!g_dbus_connection_send_message(event_conn, msg1, G_DBUS_SEND_MESSAGE_FLAGS_NONE, 0, NULL))
                BT_ERR("Error while sending");
-       }
 
        g_object_unref(msg1);
 
@@ -431,14 +453,12 @@ int _bt_send_event(int event_type, int event, GVariant *param)
 int _bt_send_event_to_dest(const char* dest, int event_type,
                int event, GVariant *param)
 {
-       BT_DBG("+");
        char *path;
        char *signal;
        GError *error = NULL;
 
        retv_if(event_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       BT_DBG("dest : %s", dest);
        BT_DBG("event_type [%d], event [%d]", event_type, event);
 
        switch (event_type) {
@@ -449,7 +469,7 @@ int _bt_send_event_to_dest(const char* dest, int event_type,
                path = BT_LE_ADAPTER_PATH;
                break;
        case BT_DEVICE_EVENT:
-                path = BT_DEVICE_PATH;
+               path = BT_DEVICE_PATH;
                break;
        default:
                BT_ERR("Unknown event");
@@ -463,6 +483,9 @@ int _bt_send_event_to_dest(const char* dest, int event_type,
        case BLUETOOTH_EVENT_ADVERTISING_STOPPED:
                signal = BT_ADVERTISING_STOPPED;
                break;
+       case BLUETOOTH_EVENT_PASSKEY_NOTIFICATION:
+               signal = BT_PASSKEY_NOTIFICATION;
+               break;
        case BLUETOOTH_EVENT_LE_DISCOVERY_STARTED:
                signal = BT_LE_DISCOVERY_STARTED;
                break;
@@ -480,7 +503,6 @@ int _bt_send_event_to_dest(const char* dest, int event_type,
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
-       BT_DBG("Path : %s", path);
        BT_INFO_C("Signal : %s", signal);
 
        if (!g_dbus_connection_emit_signal(event_conn, dest, path, BT_EVENT_SERVICE,
@@ -493,7 +515,6 @@ int _bt_send_event_to_dest(const char* dest, int event_type,
                }
        }
 
-       BT_DBG("-");
        return BLUETOOTH_ERROR_NONE;
 }
 
@@ -590,3 +611,26 @@ void _bt_deinit_hf_local_term_event_sender(void)
                hf_local_term_event_conn = NULL;
        }
 }
+
+int _bt_send_dump_signal(char *signal)
+{
+       GError *error = NULL;
+       int32_t pid = getpid();
+
+       retv_if(event_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       if (!g_dbus_connection_emit_signal(event_conn, NULL,
+                       BT_DUMP_SERVICE_PATH,
+                       BT_DUMP_SERVICE_INTERFACE,
+                       signal, g_variant_new("(i)", pid),
+                       &error)) {
+               BT_ERR("Error while sending Signal: %s", signal);
+               if (error) {
+                       BT_ERR("Error Code [%d], Error Message [%s]",
+                                       error->code, error->message);
+                       g_clear_error(&error);
+               }
+       }
+
+       return BLUETOOTH_ERROR_NONE;
+}
old mode 100755 (executable)
new mode 100644 (file)
index f5ba554..150a1f0
@@ -112,8 +112,6 @@ gboolean _gap_agent_register_osp_server(GapAgentPrivate *agent,
                return FALSE;
 
        server = g_malloc0(sizeof(bt_agent_osp_server_t));
-
-       /* Fix : NULL_RETURNS */
        retv_if(server == NULL, FALSE);
 
        server->type = type;
@@ -169,8 +167,6 @@ gboolean gap_agent_reply_pin_code(GapAgentPrivate *agent, const guint accept,
        BT_DBG("+");
 
        GapAgentPrivate *priv = agent;
-
-       /* Fix : NULL_RETURNS */
        retv_if(priv == NULL, FALSE);
 
        if (priv->exec_type != GAP_AGENT_EXEC_NO_OPERATION &&
@@ -215,8 +211,6 @@ gboolean gap_agent_reply_passkey(GapAgentPrivate *agent, const guint accept,
        BT_DBG("+");
 
        GapAgentPrivate *priv = agent;
-
-       /* Fix : NULL_RETURNS */
        retv_if(priv == NULL, FALSE);
 
        if (priv->exec_type != GAP_AGENT_EXEC_NO_OPERATION &&
@@ -261,8 +255,6 @@ gboolean gap_agent_reply_confirmation(GapAgentPrivate *agent, const guint accept
        BT_DBG("+");
 
        GapAgentPrivate *priv = agent;
-
-       /* Fix : NULL_RETURNS */
        retv_if(priv == NULL, FALSE);
 
        if (priv->exec_type != GAP_AGENT_EXEC_NO_OPERATION &&
@@ -307,8 +299,6 @@ gboolean gap_agent_reply_authorize(GapAgentPrivate *agent, const guint accept,
        BT_DBG("+");
 
        GapAgentPrivate *priv = agent;
-
-       /* Fix : NULL_RETURNS */
        retv_if(priv == NULL, FALSE);
 
        if (priv->exec_type != GAP_AGENT_EXEC_NO_OPERATION &&
@@ -316,15 +306,20 @@ gboolean gap_agent_reply_authorize(GapAgentPrivate *agent, const guint accept,
                if (accept == GAP_AGENT_ACCEPT) {
                        g_dbus_method_invocation_return_value(priv->reply_context, NULL);
                } else if (accept == GAP_AGENT_ACCEPT_ALWAYS) {
-                       bluetooth_device_address_t addr = { {0,} };
+                       bluetooth_device_address_t addr = { { 0, } };
                        int result;
 
                        _bt_convert_addr_string_to_type(addr.addr,
                                                        priv->authorize_addr);
 
-                       result = _bt_set_authorization(&addr, TRUE);
+                       /* Do not set device as Trusted*/
+                       /* result = _bt_set_authorization(&addr, TRUE); */
+                       result = _bt_set_trust_profile(&addr,
+                                       _bt_get_trusted_profile_enum(priv->uuid),
+                                       TRUE);
                        if (result == BLUETOOTH_ERROR_NONE) {
-                               BT_INFO("[%s] Device added to trusted", priv->authorize_addr);
+                               BT_INFO("[%s] Profile added as trusted for Device[%s]",
+                                               priv->uuid, priv->authorize_addr);
                        }
 
                        g_dbus_method_invocation_return_value(priv->reply_context, NULL);
@@ -335,8 +330,28 @@ gboolean gap_agent_reply_authorize(GapAgentPrivate *agent, const guint accept,
                                                GAP_AGENT_ERROR, GAP_AGENT_ERROR_CANCEL,
                                                "CanceledbyUser");
                                break;
+                       case GAP_AGENT_REJECT: {
+                               bluetooth_device_address_t addr = { { 0, } };
+                               int result;
+
+                               _bt_convert_addr_string_to_type(addr.addr,
+                                                               priv->authorize_addr);
+
+                               /* Set Profile as blocked */
+                               result = _bt_set_trust_profile(&addr,
+                                               _bt_get_trusted_profile_enum(priv->uuid),
+                                               FALSE);
+                               if (result == BLUETOOTH_ERROR_NONE) {
+                                       BT_INFO("[%s] Profile added as blocked for Device[%s]",
+                                                       priv->uuid, priv->authorize_addr);
+                               }
+
+                               g_dbus_method_invocation_return_error(priv->reply_context,
+                                               GAP_AGENT_ERROR, GAP_AGENT_ERROR_REJECT,
+                                               "Authorization request rejected");
+                               break;
+                       }
                        case GAP_AGENT_TIMEOUT:
-                       case GAP_AGENT_REJECT:
                        default:
                                g_dbus_method_invocation_return_error(priv->reply_context,
                                                GAP_AGENT_ERROR, GAP_AGENT_ERROR_REJECT,
@@ -357,9 +372,13 @@ gboolean gap_agent_reply_authorize(GapAgentPrivate *agent, const guint accept,
                ret = FALSE;
        }
 
-       priv->exec_type = GAP_AGENT_EXEC_NO_OPERATION;
-       priv->reply_context = NULL;
-       memset(priv->authorize_addr, 0x00, sizeof(priv->authorize_addr));
+       if (priv->exec_type != GAP_AGENT_EXEC_NO_OPERATION) {
+               priv->exec_type = GAP_AGENT_EXEC_NO_OPERATION;
+               priv->reply_context = NULL;
+               memset(priv->authorize_addr, 0x00, sizeof(priv->authorize_addr));
+               g_free(priv->uuid);
+               priv->uuid = NULL;
+       }
 
        BT_DBG("-");
 
@@ -395,8 +414,10 @@ gboolean _gap_agent_register(GapAgentPrivate *agent)
        reply = g_dbus_proxy_call_sync(agent_manager, "RegisterAgent",
 #ifdef TIZEN_BT_IO_CAPA_NO_INPUT_OUTPUT
                        g_variant_new("(os)", priv->path, "NoInputNoOutput"),
+#elif defined(TIZEN_BT_IO_CAPA_DISPLAY_ONLY)
+                       g_variant_new("(os)", priv->path, "DisplayOnly"),
 #else
-                       g_variant_new("(os)", priv->path, "DisplayYesNo"),
+                       g_variant_new("(os)", priv->path, "KeyboardDisplay"),
 #endif
                                G_DBUS_CALL_FLAGS_NONE, -1,
                                NULL, &error);
@@ -466,7 +487,7 @@ static gboolean __gap_agent_unregister(GapAgentPrivate *agent)
        }
 
        reply = g_dbus_proxy_call_sync(agent_manager, "UnregisterAgent",
-                       g_variant_new("o", priv->path),
+                       g_variant_new("(o)", priv->path),
                        G_DBUS_CALL_FLAGS_NONE, -1,
                        NULL, &error);
        g_object_unref(agent_manager);
@@ -489,53 +510,53 @@ static gboolean __gap_agent_unregister(GapAgentPrivate *agent)
 static const gchar gap_agent_bluez_introspection_xml[] =
 "<node name='/'>"
 "  <interface name='org.bluez.Agent1'>"
-"       <method name='GetDiscoverableTimeout'>"
-"         <arg type='u' name='timeout' direction='out'/>"
-"       </method>"
-"    <method name='Cancel'>"
-"    </method>"
-"       <method name='RequestPasskey'>"
-"         <arg type='o' name='device' direction='in'/>"
-"         <arg type='u' name='passkey' direction='out'/>"
-"       </method>"
-"    <method name='Release'>"
-"    </method>"
 "       <method name='RequestConfirmation'>"
-"         <arg type='o' name='device' direction='in'/>"
+"         <arg type='o' name='target' direction='in'/>"
 "         <arg type='u' name='passkey' direction='in'/>"
 "       </method>"
+"       <method name='RequestPinCode'>"
+"         <arg type='o' name='target' direction='in'/>"
+"         <arg type='s' name='pincode' direction='out'/>"
+"       </method>"
 "       <method name='RequestAuthorization'>"
-"         <arg type='o' name='device' direction='in'/>"
+"         <arg type='o' name='target' direction='in'/>"
 "       </method>"
-"    <method name='ReplyPasskey'>"
-"      <arg type='u' name='accept' direction='in'/>"
-"      <arg type='s' name='passkey' direction='in'/>"
+"       <method name='RequestPasskey'>"
+"         <arg type='o' name='target' direction='in'/>"
+"         <arg type='u' name='passkey' direction='out'/>"
+"       </method>"
+"       <method name='AuthorizeService'>"
+"         <arg type='o' name='target' direction='in'/>"
+"         <arg type='s' name='uuid' direction='in'/>"
+"       </method>"
+"    <method name='DisplayPasskey'>"
+"      <arg type='o' name='target' direction='in'/>"
+"      <arg type='u' name='passkey' direction='in'/>"
+"      <arg type='q' name='entered' direction='in'/>"
 "    </method>"
-"       <method name='DisplayPasskey'>"
-"         <arg type='o' name='device' direction='in'/>"
-"         <arg type='u' name='passkey' direction='in'/>"
-"         <arg type='q' name='entered' direction='in'/>"
+"       <method name='ReplyConfirmation'>"
+"         <arg type='u' name='accept' direction='in'/>"
 "       </method>"
-"    <method name='ReplyConfirmation'>"
+"    <method name='ReplyPinCode'>"
 "      <arg type='u' name='accept' direction='in'/>"
+"      <arg type='s' name='pincode' direction='in'/>"
 "    </method>"
-"       <method name='ReplyPinCode'>"
+"       <method name='ReplyAuthorize'>"
 "         <arg type='u' name='accept' direction='in'/>"
-"         <arg type='s' name='pincode' direction='in'/>"
 "       </method>"
-"    <method name='ReplyAuthorize'>"
+"    <method name='ReplyPasskey'>"
 "      <arg type='u' name='accept' direction='in'/>"
+"      <arg type='s' name='passkey' direction='in'/>"
 "    </method>"
-"       <method name='RequestPinCode'>"
-"         <arg type='o' name='device' direction='in'/>"
-"         <arg type='s' name='pincode' direction='out'/>"
+"       <method name='GetDiscoverableTimeout'>"
+"         <arg type='u' name='timeout' direction='out'/>"
 "       </method>"
 "    <method name='ConfirmModeChange'>"
 "      <arg type='s' name='mode' direction='in'/>"
 "    </method>"
-"       <method name='AuthorizeService'>"
-"         <arg type='o' name='device' direction='in'/>"
-"         <arg type='s' name='uuid' direction='in'/>"
+"       <method name='Cancel'>"
+"       </method>"
+"       <method name='Release'>"
 "       </method>"
 "  </interface>"
 "</node>";
@@ -596,7 +617,7 @@ static void __bt_gap_agent_method(GDBusConnection *connection,
                if (!agent->cb.passkey_func)
                        return;
 
-               conn = _bt_get_system_gconn();
+               conn = _bt_gdbus_get_system_gconn();
                if (conn == NULL)
                        return;
 
@@ -629,9 +650,8 @@ static void __bt_gap_agent_method(GDBusConnection *connection,
                        addr += 4;
                        g_strlcpy(agent->pairing_addr, addr, sizeof(agent->pairing_addr));
 
-                       while ((pos = strchr(agent->pairing_addr, '_')) != NULL) {
+                       while ((pos = strchr(agent->pairing_addr, '_')) != NULL)
                                *pos = ':';
-                       }
                }
 
                agent->cb.pincode_func(agent, device);
@@ -662,7 +682,7 @@ static void __bt_gap_agent_method(GDBusConnection *connection,
                if (!priv->cb.passkey_func)
                        return;
 
-               conn = _bt_get_system_gconn();
+               conn = _bt_gdbus_get_system_gconn();
                if (conn == NULL)
                        return;
 
@@ -695,9 +715,8 @@ static void __bt_gap_agent_method(GDBusConnection *connection,
                        addr += 4;
                        g_strlcpy(priv->pairing_addr, addr, sizeof(priv->pairing_addr));
 
-                       while ((pos = strchr(priv->pairing_addr, '_')) != NULL) {
+                       while ((pos = strchr(priv->pairing_addr, '_')) != NULL)
                                *pos = ':';
-                       }
                }
 
                priv->cb.passkey_func(priv, device);
@@ -719,7 +738,7 @@ static void __bt_gap_agent_method(GDBusConnection *connection,
 
                g_variant_get(parameters, "(&ouq)", &path, &passkey, &entered);
                BT_INFO("Request passkey display :sender %s priv->busname %s"
-                               " Device Path :%s, Passkey: %d, Entered: %d",
+                               " Device Path :%s, Passkey: %06d, Entered: %d",
                                sender, priv->busname, path, passkey, entered);
 
                /* Do not show popup for Key event while typing*/
@@ -734,7 +753,7 @@ static void __bt_gap_agent_method(GDBusConnection *connection,
                if (!priv->cb.display_func)
                        return;
 
-               conn = _bt_get_system_gconn();
+               conn = _bt_gdbus_get_system_gconn();
                if (conn == NULL)
                        return;
 
@@ -778,8 +797,8 @@ static void __bt_gap_agent_method(GDBusConnection *connection,
                        return;
 
                g_variant_get(parameters, "(&ou)", &path, &passkey);
-               BT_INFO("Request passkey confirmation, Device Path :%s, Passkey: %d",
-                               path, passkey);
+               BT_INFO_C("### Request passkey confirmation");
+               INFO_SECURE("Device Path :%s, Passkey: %d", path, passkey);
 
                BT_DBG("Sender: [%s] priv->busname: [%s]", sender, priv->busname);
                /* Need to check
@@ -791,7 +810,7 @@ static void __bt_gap_agent_method(GDBusConnection *connection,
                if (!priv->cb.confirm_func)
                        return;
 
-               conn = _bt_get_system_gconn();
+               conn = _bt_gdbus_get_system_gconn();
                if (conn == NULL)
                        return;
 
@@ -824,9 +843,8 @@ static void __bt_gap_agent_method(GDBusConnection *connection,
                        addr += 4;
                        g_strlcpy(priv->pairing_addr, addr, sizeof(priv->pairing_addr));
 
-                       while ((pos = strchr(priv->pairing_addr, '_')) != NULL) {
+                       while ((pos = strchr(priv->pairing_addr, '_')) != NULL)
                                *pos = ':';
-                       }
                }
 
                priv->cb.confirm_func(priv, device, passkey);
@@ -859,7 +877,7 @@ static void __bt_gap_agent_method(GDBusConnection *connection,
                if (!priv->cb.authorize_func)
                        return;
 
-               conn = _bt_get_system_gconn();
+               conn = _bt_gdbus_get_system_gconn();
                if (conn == NULL)
                        return;
 
@@ -885,6 +903,7 @@ static void __bt_gap_agent_method(GDBusConnection *connection,
 
                priv->exec_type = GAP_AGENT_EXEC_AUTHORZATION;
                priv->reply_context = invocation;
+               priv->uuid = g_strdup(uuid);
 
                addr = strstr(path, "dev_");
                if (addr != NULL) {
@@ -893,9 +912,8 @@ static void __bt_gap_agent_method(GDBusConnection *connection,
                        g_strlcpy(priv->authorize_addr, addr,
                                                        sizeof(priv->authorize_addr));
 
-                       while ((pos = strchr(priv->authorize_addr, '_')) != NULL) {
+                       while ((pos = strchr(priv->authorize_addr, '_')) != NULL)
                                *pos = ':';
-                       }
                }
 
                priv->cb.authorize_func(priv, device, uuid);
@@ -1035,7 +1053,6 @@ void _gap_agent_setup_dbus(GapAgentPrivate *agent, GAP_AGENT_FUNC_CB *func_cb,
        GDBusNodeInfo *node_info;
        GError *error = NULL;
 
-
        priv->path = g_strdup(path);
 
 
@@ -1046,14 +1063,16 @@ void _gap_agent_setup_dbus(GapAgentPrivate *agent, GAP_AGENT_FUNC_CB *func_cb,
 
        BT_DBG("path is [%s]", path);
 
-       connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
-       if (!connection) {
-               if (error) {
-                       ERR("Unable to connect to gdbus: %s", error->message);
-                       g_clear_error(&error);
+       if (connection == NULL) {
+               connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+               if (!connection) {
+                       if (error) {
+                               ERR("Unable to connect to gdbus: %s", error->message);
+                               g_clear_error(&error);
+                       }
+                       g_dbus_node_info_unref(node_info);
+                       return;
                }
-               g_dbus_node_info_unref(node_info);
-               return;
        }
 
        if (gap_agent_id == -1) {
@@ -1106,17 +1125,20 @@ void _gap_agent_setup_dbus(GapAgentPrivate *agent, GAP_AGENT_FUNC_CB *func_cb,
 void _gap_agent_reset_dbus(GapAgentPrivate *agent)
 {
        GapAgentPrivate *priv = agent;
-
-       /* Fix : NULL_RETURNS */
        if (priv == NULL)
-               return ;
+               return;
 
        __gap_agent_unregister(agent);
 
        if (gap_agent_id > 0) {
                g_dbus_connection_unregister_object(connection,
                                gap_agent_id);
-               gap_agent_id = 0;
+               gap_agent_id = -1;
+       }
+
+       if (connection) {
+               g_object_unref(connection);
+               connection = NULL;
        }
 
        if (priv->osp_servers) {
@@ -1125,9 +1147,6 @@ void _gap_agent_reset_dbus(GapAgentPrivate *agent)
                priv->osp_servers = NULL;
        }
 
-       g_object_ref(priv->adapter);
-       priv->adapter = NULL;
-
        g_free(priv->path);
        priv->path = NULL;
 
@@ -1139,8 +1158,8 @@ gboolean _gap_agent_exist_osp_server(GapAgentPrivate *agent, int type, char *uui
 {
        GapAgentPrivate *priv = agent;
 
-       /* Fix : NULL_RETURNS */
-       retv_if(priv == NULL, FALSE);
+       if (priv == NULL)
+               return FALSE;
 
        if (__gap_agent_find_server(priv->osp_servers,
                                type, uuid) != NULL) {
@@ -1160,9 +1179,8 @@ bt_agent_osp_server_t *_gap_agent_get_osp_server(GapAgentPrivate *agent, int typ
 
        osp_serv = __gap_agent_find_server(priv->osp_servers,
                        type, uuid);
-       if (!osp_serv) {
+       if (!osp_serv)
                return NULL;
-       }
 
        return osp_serv;
 }
@@ -1170,8 +1188,6 @@ bt_agent_osp_server_t *_gap_agent_get_osp_server(GapAgentPrivate *agent, int typ
 gchar* _gap_agent_get_path(GapAgentPrivate *agent)
 {
        GapAgentPrivate *priv = agent;
-
-       /* Fix : NULL_RETURNS */
        if (priv == NULL)
                return NULL;
 
@@ -1182,17 +1198,12 @@ gboolean _gap_agent_is_canceled(GapAgentPrivate *agent)
 {
        GapAgentPrivate *priv = agent;
 
-       /* Fix : NULL_RETURNS */
-       retv_if(priv == NULL, FALSE);
-
        return priv->canceled;
 }
 
 void _gap_agent_set_canceled(GapAgentPrivate *agent, gboolean value)
 {
        GapAgentPrivate *priv = agent;
-
-       /* Fix : NULL_RETURNS */
        if (priv == NULL)
                return;
 
index f3438cb..b019a20 100644 (file)
@@ -4,31 +4,31 @@
   <interface name="org.bluez.Agent">
     <method name="RequestPinCode">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="o" name="device"/>
+      <arg type="o" name="target"/>
       <arg type="s" name="pincode" direction="out"/>
     </method>
 
     <method name="RequestPasskey">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="o" name="device"/>
+      <arg type="o" name="target"/>
       <arg type="u" name="passkey" direction="out"/>
     </method>
 
     <method name="DisplayPasskey">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="o" name="device"/>
+      <arg type="o" name="target"/>
       <arg type="u" name="passkey"/>
     </method>
 
     <method name="RequestConfirmation">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="o" name="device"/>
+      <arg type="o" name="target"/>
       <arg type="u" name="passkey"/>
     </method>
 
     <method name="Authorize">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="o" name="device"/>
+      <arg type="o" name="target"/>
       <arg type="s" name="uuid"/>
     </method>
 
old mode 100755 (executable)
new mode 100644 (file)
index bb76def..f88ffce
@@ -88,6 +88,7 @@ gboolean connect_remote_media_audio(gpointer user_data)
        _bt_convert_addr_type_to_string(remote_address, conn_info->dev_info.device_address.addr);
        if (p_connection_list == NULL) {
                BT_INFO("None of device connected and this hasbeen triggered");
+               g_free(conn_info);
                return FALSE;
        }
        if (conn_info->connection_type == BT_AUDIO_A2DP) {
@@ -97,6 +98,7 @@ gboolean connect_remote_media_audio(gpointer user_data)
                if (list == NULL) {
                        BT_INFO("Head Set didn't initiated a2dp connection");
                        BT_INFO("local device initiating A2DP connection");
+
                        _bt_audio_connect(0, BT_AUDIO_A2DP,
                                        &conn_info->dev_info.device_address, NULL);
                } else {
@@ -110,6 +112,7 @@ gboolean connect_remote_media_audio(gpointer user_data)
                if (list == NULL) {
                        BT_INFO("Headset didn't initiated HFP connection");
                        BT_INFO("local device intiating HFP Connection");
+
                        _bt_audio_connect(0, BT_AUDIO_HSP,
                                        &conn_info->dev_info.device_address, NULL);
                } else {
@@ -127,9 +130,12 @@ void _bt_get_bluetooth_device_info(char *remote_address, bluetooth_device_info_t
        int i = 0;
        bluetooth_device_info_t info;
        char bond_address[BT_ADDRESS_STRING_SIZE] = { 0 };
-       dev_list = g_array_new(FALSE, FALSE, sizeof(gchar));
+
        if (device == NULL)
                return;
+
+       dev_list = g_array_new(FALSE, FALSE, sizeof(gchar));
+
        _bt_get_bonded_devices(&dev_list);
        size = (dev_list->len) / sizeof(bluetooth_device_info_t);
        for (i = 0; i < size; i++) {
@@ -207,10 +213,11 @@ end:
 
 void __bt_connection_manager_set_state(char *remote_address, int event)
 {
-       bt_connection_node_info_t *info = g_new0(bt_connection_node_info_t, 1);
+       bt_connection_node_info_t *info;
 
        char bond_address[BT_ADDRESS_STRING_SIZE] = { 0 };
        if (event == BLUETOOTH_EVENT_AG_CONNECTED) {
+               info = g_new0(bt_connection_node_info_t, 1);
                info->state = BLUETOOTH_HFP_CONNECTED;
                _bt_get_bluetooth_device_info(remote_address, &info->dev_info);
                _bt_convert_addr_type_to_string(bond_address,
@@ -234,6 +241,7 @@ void __bt_connection_manager_set_state(char *remote_address, int event)
                p_connection_list = g_list_remove(p_connection_list, h_conn);
                g_free(h_conn);
        } else if (event == BLUETOOTH_EVENT_AV_CONNECTED) {
+               info = g_new0(bt_connection_node_info_t, 1);
                info->state = BLUETOOTH_A2DP_CONNECTED;
                _bt_get_bluetooth_device_info(remote_address, &info->dev_info);
                _bt_convert_addr_type_to_string(bond_address,
old mode 100755 (executable)
new mode 100644 (file)
index e6951e4..f319faf
@@ -19,9 +19,8 @@
 #include <gio/gio.h>
 #include <dlog.h>
 #include <string.h>
-#if !defined(LIBNOTIFY_SUPPORT) && !defined(LIBNOTIFICATION_SUPPORT)
 #include <syspopup_caller.h>
-#endif
+#include <vconf.h>
 #include "bluetooth-api.h"
 
 #include "bt-service-common.h"
@@ -30,6 +29,8 @@
 #include "bt-service-event.h"
 #include "bt-service-util.h"
 
+#define BT_HID_BARCODE_SUPPORT "file/bluetooth/hid/barcode_support"
+
 static void __bt_hid_connect_cb(GDBusProxy *proxy, GAsyncResult *res,
                                        gpointer user_data)
 {
@@ -172,7 +173,7 @@ int _bt_hid_connect(int request_id,
        adapter_proxy = _bt_get_adapter_proxy();
        retv_if(adapter_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
        */
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        _bt_convert_addr_type_to_string(address, device_address->addr);
@@ -211,7 +212,7 @@ int _bt_hid_disconnect(int request_id,
        adapter_proxy = _bt_get_adapter_proxy();
        retv_if(adapter_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
        */
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        _bt_convert_addr_type_to_string(address, device_address->addr);
@@ -233,3 +234,13 @@ int _bt_hid_disconnect(int request_id,
 
        return BLUETOOTH_ERROR_NONE;
 }
+
+int _bt_hid_enable_barcode_feature(void)
+{
+       if (vconf_set_int(BT_HID_BARCODE_SUPPORT, 1) != 0) {
+               BT_ERR("Set vconf failed\n");
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       return BLUETOOTH_ERROR_NONE;
+}
old mode 100755 (executable)
new mode 100644 (file)
index a5e73d6..3b5adb0
@@ -34,6 +34,7 @@
 
 static GMainLoop *main_loop;
 static gboolean terminated = FALSE;
+static gboolean is_initialized = FALSE;
 
 static void __bt_release_service(void)
 {
@@ -53,6 +54,7 @@ static void __bt_release_service(void)
 #ifndef GATT_NO_RELAY
        _bt_clear_gatt_client_senders();
 #endif
+       is_initialized = FALSE;
        _bt_service_cynara_deinit();
 
        BT_DBG("Terminating the bt-service daemon");
@@ -73,41 +75,16 @@ static void __bt_sigterm_handler(int signo, siginfo_t *info, void *data)
 
 gboolean _bt_terminate_service(gpointer user_data)
 {
-       int bt_status = VCONFKEY_BT_STATUS_OFF;
+       __bt_release_service();
 
-       if (vconf_get_int(VCONFKEY_BT_STATUS, &bt_status) < 0) {
-               BT_ERR("no bluetooth device info, so BT was disabled at previous session");
-       } else {
-               if (bt_status != VCONFKEY_BT_STATUS_OFF) {
-                       if (vconf_set_int(VCONFKEY_BT_STATUS,
-                                       VCONFKEY_BT_STATUS_OFF) != 0)
-                               BT_ERR("Set vconf failed\n");
-
-                       if (_bt_eventsystem_set_value(SYS_EVENT_BT_STATE, EVT_KEY_BT_STATE,
-                                                       EVT_VAL_BT_OFF) != ES_R_OK)
-                               BT_ERR("Fail to set value");
-               }
-       }
+       terminated = TRUE;
 
-       if (vconf_get_int(VCONFKEY_BT_LE_STATUS, &bt_status) < 0) {
-               BT_ERR("no bluetooth device info, so BT was disabled at previous session");
-       } else {
-               if (bt_status != VCONFKEY_BT_LE_STATUS_OFF) {
-                       if (vconf_set_int(VCONFKEY_BT_LE_STATUS,
-                                       VCONFKEY_BT_LE_STATUS_OFF) != 0)
-                               BT_ERR("Set vconf failed\n");
-                       if (_bt_eventsystem_set_value(SYS_EVENT_BT_STATE, EVT_KEY_BT_LE_STATE,
-                                                       EVT_VAL_BT_LE_OFF) != ES_R_OK)
-                               BT_ERR("Fail to set value");
-               }
-       }
+       BT_INFO_C("Terminating the bt-service daemon");
 
        if (main_loop != NULL) {
                g_main_loop_quit(main_loop);
        } else {
                BT_ERR("main_loop == NULL");
-               __bt_release_service();
-               terminated = TRUE;
                exit(0);
        }
 
@@ -116,17 +93,13 @@ gboolean _bt_terminate_service(gpointer user_data)
 
 gboolean _bt_reliable_terminate_service(gpointer user_data)
 {
-       _bt_deinit_service_event_receiver();
-
        _bt_deinit_proxys();
 
        _bt_clear_request_list();
 
        _bt_set_disabled(BLUETOOTH_ERROR_NONE);
 
-       _bt_service_adapter_le_deinit();
        _bt_deinit_service_event_sender();
-       _bt_deinit_hf_local_term_event_sender();
 
        _bt_service_unregister();
 
@@ -134,11 +107,10 @@ gboolean _bt_reliable_terminate_service(gpointer user_data)
 
        BT_INFO_C("Terminating the bt-service daemon");
 
-       if (main_loop != NULL) {
+       if (main_loop != NULL)
                g_main_loop_quit(main_loop);
-       } else {
+       else
                exit(0);
-       }
 
        return FALSE;
 }
@@ -165,13 +137,11 @@ static gboolean __bt_check_bt_service(void *data)
        if (_bt_get_enable_timer_id() == 0)
                _bt_enable_adapter();
 #else
-       if (vconf_get_int(VCONFKEY_BT_STATUS, &bt_status) < 0) {
+       if (vconf_get_int(VCONFKEY_BT_STATUS, &bt_status) < 0)
                BT_DBG("no bluetooth device info, so BT was disabled at previous session");
-       }
 
-       if (vconf_get_int(VCONFKEY_BT_LE_STATUS, &bt_le_status) < 0) {
+       if (vconf_get_int(VCONFKEY_BT_LE_STATUS, &bt_le_status) < 0)
                BT_ERR("no bluetooth le info, so BT LE was disabled at previous session");
-       }
 
        if (vconf_get_int(BT_OFF_DUE_TO_FLIGHT_MODE, &flight_mode_deactivation) != 0)
                BT_ERR("Fail to get the flight_mode_deactivation value");
@@ -213,16 +183,12 @@ static gboolean __bt_check_bt_service(void *data)
        return FALSE;
 }
 
-int main(void)
+int _bt_service_initialize(void)
 {
-       struct sigaction sa;
-       BT_INFO_C("Starting the bt-service daemon");
+       int ret;
 
-       memset(&sa, 0, sizeof(sa));
-       sa.sa_sigaction = __bt_sigterm_handler;
-       sa.sa_flags = SA_SIGINFO;
-       sigaction(SIGINT, &sa, NULL);
-       sigaction(SIGTERM, &sa, NULL);
+       if (is_initialized == TRUE)
+               return BLUETOOTH_ERROR_NONE;
 
        /* Security Initialization */
        if (_bt_service_cynara_init() != BLUETOOTH_ERROR_NONE) {
@@ -230,31 +196,38 @@ int main(void)
                return EXIT_FAILURE;
        }
 
+       _bt_service_register_vconf_handler();
+
        /* Event reciever Init */
-       if (_bt_init_service_event_receiver() != BLUETOOTH_ERROR_NONE) {
+       ret = _bt_init_service_event_receiver();
+       if (ret != BLUETOOTH_ERROR_NONE) {
                BT_ERR("Fail to init event reciever");
-               return 0;
+               return ret;
        }
 
        /* Event sender Init */
-       if (_bt_init_service_event_sender() != BLUETOOTH_ERROR_NONE) {
+       ret = _bt_init_service_event_sender();
+       if (ret != BLUETOOTH_ERROR_NONE) {
                BT_ERR("Fail to init event sender");
-               return 0;
+               return ret;
        }
 
-       if (_bt_init_hf_local_term_event_sender() != BLUETOOTH_ERROR_NONE) {
+       ret = _bt_init_hf_local_term_event_sender();
+       if (ret != BLUETOOTH_ERROR_NONE) {
                BT_ERR("Fail to init core event sender");
-               return 0;
+               return ret;
        }
 
-       if (_bt_service_register() != BLUETOOTH_ERROR_NONE) {
+       ret = _bt_service_register();
+       if (ret != BLUETOOTH_ERROR_NONE) {
                BT_ERR("Fail to register service");
-               return 0;
+               return ret;
        }
 
-       if (_bt_service_adapter_le_init() != BLUETOOTH_ERROR_NONE) {
+       ret = _bt_service_adapter_le_init();
+       if (ret != BLUETOOTH_ERROR_NONE) {
                BT_ERR("Fail to init le");
-               return 0;
+               return ret;
        }
 
        _bt_init_request_id();
@@ -265,6 +238,25 @@ int main(void)
        _bt_init_gatt_client_senders();
 #endif
 
+       is_initialized = TRUE;
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+int main(void)
+{
+       struct sigaction sa;
+       BT_INFO_C("### Starting the bt-service daemon");
+
+       memset(&sa, 0, sizeof(sa));
+       sa.sa_sigaction = __bt_sigterm_handler;
+       sa.sa_flags = SA_SIGINFO;
+       sigaction(SIGINT, &sa, NULL);
+       sigaction(SIGTERM, &sa, NULL);
+
+       if (_bt_service_initialize() != BLUETOOTH_ERROR_NONE)
+               return 0;
+
        g_timeout_add(500, (GSourceFunc)__bt_check_bt_service, NULL);
 
        if (terminated == TRUE) {
@@ -277,9 +269,8 @@ int main(void)
        g_main_loop_run(main_loop);
        BT_DBG("g_main_loop_quit called!");
 
-       if (main_loop != NULL) {
+       if (main_loop != NULL)
                g_main_loop_unref(main_loop);
-       }
 
        if (terminated == FALSE)
                __bt_release_service();
old mode 100755 (executable)
new mode 100644 (file)
index 78e7cb5..3e643b7
@@ -20,9 +20,7 @@
 #include <dlog.h>
 #include <string.h>
 #include <stdio.h>
-#if !defined(LIBNOTIFY_SUPPORT) && !defined(LIBNOTIFICATION_SUPPORT)
 #include <syspopup_caller.h>
-#endif
 #include <net_connection.h>
 
 #include "bluetooth-api.h"
@@ -252,11 +250,12 @@ int _bt_network_activate(void)
 {
        int ret = BLUETOOTH_ERROR_NONE;
        char *adapter_path;
+       GVariant *result = NULL;
        GError *err = NULL;
        GDBusConnection *conn;
        GDBusProxy *server_proxy;
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        adapter_path = _bt_get_adapter_path();
@@ -272,22 +271,27 @@ int _bt_network_activate(void)
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
-       g_dbus_proxy_call_sync(server_proxy, "Register",
+       result = g_dbus_proxy_call_sync(server_proxy, "Register",
                                 g_variant_new("(ss)", NAP_UUID_NAME, NET_BRIDGE_INTERFACE),
                                 G_DBUS_CALL_FLAGS_NONE,
                                 -1,
                                 NULL,
                                 &err);
-       if (err != NULL) {
-               g_dbus_error_strip_remote_error(err);
-               BT_ERR("Network server register Error: %s\n", err->message);
-               if (g_strcmp0(err->message, "Already Exists") == 0) {
-                       ret = BLUETOOTH_ERROR_ALREADY_INITIALIZED;
-               } else {
-                       ret = BLUETOOTH_ERROR_INTERNAL;
+       if (result == NULL) {
+               if (err != NULL) {
+                       g_dbus_error_strip_remote_error(err);
+                       BT_ERR("Network server register Error: %s\n", err->message);
+                       if (g_strcmp0(err->message, "Already Exists") == 0)
+                               ret = BLUETOOTH_ERROR_ALREADY_INITIALIZED;
+                       else
+                               ret = BLUETOOTH_ERROR_INTERNAL;
+
+                       g_error_free(err);
                }
-               g_error_free(err);
+       } else {
+               g_variant_unref(result);
        }
+
        g_object_unref(server_proxy);
 
        return ret;
@@ -296,12 +300,13 @@ int _bt_network_activate(void)
 int _bt_network_deactivate(void)
 {
        char *adapter_path;
+       GVariant *result = NULL;
        GError *err = NULL;
        GDBusConnection *conn;
        GDBusProxy *server_proxy;
        int ret = BLUETOOTH_ERROR_NONE;
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        adapter_path = _bt_get_adapter_path();
@@ -317,23 +322,28 @@ int _bt_network_deactivate(void)
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
-       g_dbus_proxy_call_sync(server_proxy, "Unregister",
+       result = g_dbus_proxy_call_sync(server_proxy, "Unregister",
                                 g_variant_new("(s)", NAP_UUID_NAME),
                                 G_DBUS_CALL_FLAGS_NONE,
                                 -1,
                                 NULL,
                                 &err);
-       if (err != NULL) {
-               g_dbus_error_strip_remote_error(err);
-               BT_ERR("Network server unregister Error: %s\n", err->message);
-               if (g_strcmp0(err->message,
-                               "Operation currently not available") == 0) {
-                       ret = BLUETOOTH_ERROR_ALREADY_DEACTIVATED;
-               } else {
-                       ret = BLUETOOTH_ERROR_INTERNAL;
+       if (result == NULL) {
+               if (err != NULL) {
+                       g_dbus_error_strip_remote_error(err);
+                       BT_ERR("Network server unregister Error: %s\n", err->message);
+                       if (g_strcmp0(err->message,
+                                       "Operation currently not available") == 0) {
+                               ret = BLUETOOTH_ERROR_ALREADY_DEACTIVATED;
+                       } else {
+                               ret = BLUETOOTH_ERROR_INTERNAL;
+                       }
+                       g_error_free(err);
                }
-               g_error_free(err);
+       } else {
+               g_variant_unref(result);
        }
+
        g_object_unref(server_proxy);
 
        return ret;
@@ -374,7 +384,7 @@ int _bt_network_connect(int request_id, int role,
        adapter_proxy = _bt_get_adapter_proxy();
        retv_if(adapter_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        _bt_convert_addr_type_to_string(address, device_address->addr);
@@ -406,6 +416,7 @@ int _bt_network_connect(int request_id, int role,
        g_variant_unref(result);
        retv_if(profile_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
        func_data = g_malloc0(sizeof(bt_function_data_t));
+       retv_if(func_data == NULL, BLUETOOTH_ERROR_MEMORY_ALLOCATION);
 
        func_data->address = g_strdup(address);
        func_data->req_id = request_id;
@@ -438,7 +449,7 @@ int _bt_network_disconnect(int request_id,
        adapter_proxy = _bt_get_adapter_proxy();
        retv_if(adapter_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        _bt_convert_addr_type_to_string(address, device_address->addr);
@@ -459,6 +470,7 @@ int _bt_network_disconnect(int request_id,
        device_path =  g_variant_get_string(result, NULL);
        if (device_path == NULL) {
                BT_ERR("No paired device");
+               g_variant_unref(result);
                return BLUETOOTH_ERROR_NOT_PAIRED;
        }
 
@@ -469,6 +481,7 @@ int _bt_network_disconnect(int request_id,
        g_variant_unref(result);
        retv_if(profile_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
        func_data = g_malloc0(sizeof(bt_function_data_t));
+       retv_if(func_data == NULL, BLUETOOTH_ERROR_MEMORY_ALLOCATION);
 
        func_data->address = g_strdup(address);
        func_data->req_id = request_id;
@@ -495,7 +508,7 @@ int _bt_network_server_disconnect(int request_id,
 
        BT_CHECK_PARAMETER(device_address, return);
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        adapter_path = _bt_get_adapter_path();
old mode 100755 (executable)
new mode 100644 (file)
index 08f60eb..f8f3af7
 #include "bt-service-event.h"
 #include "bt-service-util.h"
 #include "bt-service-obex-agent.h"
+#include "bt-service-obex-server.h"
 #include "marshal.h"
 
 static GDBusConnection *conn = NULL;
+static GDBusConnection *auth_reply_conn = NULL;
 static GSList *obex_agent_list = NULL;
 
 typedef struct {
@@ -36,6 +38,7 @@ typedef struct {
 
        int openobex_id;
        int obex_agent_id;
+       int obex_reply_id;
 
        /* callback data */
        gpointer authorize_data;
@@ -84,7 +87,7 @@ static const gchar obex_service_agent_xml1[] =
 "    <method name='Complete'>"
 "      <annotation name='org.freedesktop.DBus.GLib.Async' value=''/>"
 "      <arg type='o' name='transfer'/>"
- "   </method>"
+"   </method>"
 "    <method name='Release'>"
 "      <annotation name='org.freedesktop.DBus.GLib.Async' value=''/>"
 "    </method>"
@@ -117,6 +120,15 @@ static const gchar obex_service_agent_xml2[] =
 "  </interface>"
 "</node>";
 
+static const gchar obex_service_reply_xml3[] =
+"<node name='/'>"
+"      <interface name='org.bluez.obex.reply'>"
+"              <method name='ReplyAuthorize'>"
+"                      <arg type='u' name='accept' direction='in'/>"
+"              </method>"
+"      </interface>"
+"</node>";
+
 static bt_obex_agent_info *__find_obex_agent_info(char *path)
 {
        GSList *l;
@@ -182,9 +194,8 @@ static void __new_connection_method(GDBusConnection *connection,
                if (info->name == NULL) {
                        info->name = sender;
                } else {
-                       if (g_strcmp0(sender, info->name) != 0) {
+                       if (g_strcmp0(sender, info->name) != 0)
                                goto fail;
-                       }
                }
 
                if (info->request_cb == NULL)
@@ -228,9 +239,8 @@ static void __new_connection_method(GDBusConnection *connection,
 
                sender = (char *)g_dbus_method_invocation_get_sender(invocation);
 
-               if (g_strcmp0(sender, info->name) != 0) {
+               if (g_strcmp0(sender, info->name) != 0)
                        goto fail;
-               }
 
                if (info->progress_cb == NULL)
                        goto fail;
@@ -273,9 +283,8 @@ static void __new_connection_method(GDBusConnection *connection,
 
                sender = (char *)g_dbus_method_invocation_get_sender(invocation);
 
-               if (g_strcmp0(sender, info->name) != 0) {
+               if (g_strcmp0(sender, info->name) != 0)
                        goto fail;
-               }
 
                if (info->error_cb == NULL)
                        goto fail;
@@ -313,9 +322,8 @@ static void __new_connection_method(GDBusConnection *connection,
 
                sender = (char *)g_dbus_method_invocation_get_sender(invocation);
 
-               if (g_strcmp0(sender, info->name) != 0) {
+               if (g_strcmp0(sender, info->name) != 0)
                        goto fail;
-               }
 
                if (info->complete_cb == NULL)
                        goto fail;
@@ -352,9 +360,8 @@ static void __new_connection_method(GDBusConnection *connection,
                if (info->name) {
                        /*In H2 if user denies auth,release will come without request and hence
                        info->name will be NULL */
-                       if (g_strcmp0(sender, info->name) != 0) {
+                       if (g_strcmp0(sender, info->name) != 0)
                                goto fail;
-                       }
                }
 
                if (info->release_cb == NULL)
@@ -363,6 +370,19 @@ static void __new_connection_method(GDBusConnection *connection,
                info->release_cb(invocation, info->release_data);
 
                return;
+       } else if (g_strcmp0(method_name, "ReplyAuthorize") == 0) {
+               const guint accept;
+
+               g_variant_get(parameters, "(u)", &accept);
+               BT_DBG("Accept: %d", accept);
+
+               if (accept == 0) {
+                       BT_DBG("Transfer accepted");
+                       _bt_obex_server_reply_accept();
+               } else {
+                       BT_ERR("Transfer denied");
+                       _bt_obex_server_reject_authorize();
+               }
        }
 fail:
                BT_ERR("Fail case");
@@ -381,6 +401,12 @@ void _bt_obex_agent_new(char *path)
                        g_error_free(error);
                        return;
                }
+               auth_reply_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+               if (error != NULL) {
+                       BT_ERR("Fail to get dbus: %s", error->message);
+                       g_error_free(error);
+                       return;
+               }
        }
        info = (bt_obex_agent_info *)malloc(sizeof(bt_obex_agent_info));
        if (info) {
@@ -409,6 +435,9 @@ void _bt_obex_agent_destroy(char *path)
        if (info->obex_agent_id)
                g_dbus_connection_unregister_object(conn,
                        info->obex_agent_id);
+       if (info->obex_reply_id)
+               g_dbus_connection_unregister_object(auth_reply_conn,
+                                       info->obex_reply_id);
 
        g_free(info);
 }
@@ -416,7 +445,8 @@ gboolean _bt_obex_setup(const char *path)
 {
        bt_obex_agent_info *info;
        GDBusProxy *proxy;
-       GDBusNodeInfo *new_conn_node;
+       GDBusNodeInfo *new_conn_node = NULL;
+       GDBusNodeInfo *auth_reply_node = NULL;
        GError *err = NULL;
 
        info = __find_obex_agent_info((char *)path);
@@ -451,13 +481,16 @@ gboolean _bt_obex_setup(const char *path)
                                                NULL, NULL, &err);
        g_dbus_node_info_unref(new_conn_node);
        if (err) {
-               BT_INFO("Dbus Err: %s", err->message);
+               BT_ERR("Dbus Err: %s", err->message);
                g_clear_error(&err);
                return FALSE;
        }
        if (info->openobex_id == 0)
                BT_ERR("Error while registering object");
+
        new_conn_node = g_dbus_node_info_new_for_xml(obex_service_agent_xml2, NULL);
+       if (new_conn_node == NULL)
+               return FALSE;
 
        info->obex_agent_id = g_dbus_connection_register_object(conn, info->path,
                                                new_conn_node->interfaces[0],
@@ -467,7 +500,25 @@ gboolean _bt_obex_setup(const char *path)
        if (info->obex_agent_id == 0)
                BT_ERR("Error while registering object");
        if (err) {
-               BT_INFO("Dbus Err: %s", err->message);
+               BT_ERR("Dbus Err: %s", err->message);
+               g_clear_error(&err);
+               return FALSE;
+       }
+
+       auth_reply_node = g_dbus_node_info_new_for_xml(obex_service_reply_xml3, NULL);
+
+       if (auth_reply_node == NULL) {
+               BT_ERR("Fail to create the node info for xml");
+               return FALSE;
+       }
+
+       info->obex_reply_id = g_dbus_connection_register_object(auth_reply_conn, info->path,
+               auth_reply_node->interfaces[0], &method_table, NULL, NULL, &err);
+       g_dbus_node_info_unref(auth_reply_node);
+       if (info->obex_reply_id == 0)
+               BT_ERR("Error while registering object");
+       if (err) {
+               BT_ERR("Dbus Err: %s", err->message);
                g_clear_error(&err);
                return FALSE;
        }
@@ -478,19 +529,17 @@ void _bt_obex_set_authorize_cb(char *object_path,
                         bt_obex_authorize_cb func, gpointer data)
 {
        bt_obex_agent_info *info = __find_obex_agent_info(object_path);;
+       if (info == NULL)
+               return;
 
-       if (info) {
-               info->authorize_cb = func;
-               info->authorize_data = data;
-       }
+       info->authorize_cb = func;
+       info->authorize_data = data;
 }
 
 void _bt_obex_set_release_cb(char *object_path,
                       bt_obex_release_cb func, gpointer data)
 {
        bt_obex_agent_info *info = __find_obex_agent_info(object_path);;
-
-       /* Fix : NULL_RETURNS */
        if (info == NULL)
                return;
 
@@ -502,8 +551,6 @@ void _bt_obex_set_request_cb(char *object_path,
                       bt_obex_request_cb func, gpointer data)
 {
        bt_obex_agent_info *info = __find_obex_agent_info(object_path);;
-
-       /* Fix : NULL_RETURNS */
        if (info == NULL)
                return;
 
@@ -515,8 +562,6 @@ void _bt_obex_set_progress_cb(char *object_path,
                        bt_obex_progress_cb func, gpointer data)
 {
        bt_obex_agent_info *info = __find_obex_agent_info(object_path);;
-
-       /* Fix : NULL_RETURNS */
        if (info == NULL)
                return;
 
@@ -528,8 +573,6 @@ void _bt_obex_set_complete_cb(char *object_path,
                        bt_obex_complete_cb func, gpointer data)
 {
        bt_obex_agent_info *info = __find_obex_agent_info(object_path);;
-
-       /* Fix : NULL_RETURNS */
        if (info == NULL)
                return;
 
@@ -541,8 +584,6 @@ void _bt_obex_set_error_cb(char *object_path,
                        bt_obex_error_cb func, gpointer data)
 {
        bt_obex_agent_info *info = __find_obex_agent_info(object_path);;
-
-       /* Fix : NULL_RETURNS */
        if (info == NULL)
                return;
 
index ebc4915..4363a7e 100644 (file)
 #define BT_OBEX_MANAGER "org.bluez.obex.AgentManager1"
 #define BT_OBEX_PATH "/org/bluez/obex"
 
+#define BT_OBEX_PATH_PREFIX "/opt/usr/media"
+#define BT_OBEX_DEFAULT_PATH "/opt/usr/home/owner/media"
+#define BT_OBEX_PATH_MAX_LENGTH 255
+
 
 typedef struct {
        char *filename;
@@ -54,6 +58,7 @@ typedef struct {
        char *device_name;
        int transfer_id;
        gint64 file_size;
+       gint64 progress;
        char *address;
 } bt_transfer_info_t;
 
@@ -65,6 +70,7 @@ typedef struct {
        char *device_name;
        char *transfer_path;
        char *address;
+       unsigned char contact_auth_info[5];
 } bt_auth_info_t;
 
 typedef struct {
@@ -82,12 +88,34 @@ typedef struct {
        bt_server_info_t *custom_server;
 } bt_obex_agent_info_t;
 
+typedef struct {
+       char *path;
+       char *address;
+       gboolean authorized;
+} bt_session_info_t;
+
 static GSList *transfers;
 static bt_obex_agent_info_t agent_info;
+static GSList *session_list = NULL;
 
-int _bt_obex_get_native_pid(void)
+static bt_session_info_t *__bt_find_session_by_path(char *transfer_path)
 {
-       return agent_info.native_server->app_pid;
+       GSList *l;
+       bt_session_info_t *session;
+
+       retv_if(transfer_path == NULL, NULL);
+
+       for (l = session_list; l != NULL; l = l->next) {
+               session = l->data;
+
+               if (session == NULL)
+                       continue;
+
+               if (g_strcmp0(session->path, transfer_path) == 0)
+                       return session;
+       }
+
+       return NULL;
 }
 
 static GQuark __bt_obex_error_quark(void)
@@ -198,11 +226,12 @@ void _bt_obex_check_pending_transfer(const char *address)
        bt_transfer_info_t *transfer_info = __bt_find_transfer_by_address(address);
        if (transfer_info != NULL) {
                int result = BLUETOOTH_ERROR_CANCEL;
-               param = g_variant_new("(isssstii)", result,
+               param = g_variant_new("(issssstii)", result,
                                        transfer_info->filename,
                                        transfer_info->type,
                                        transfer_info->device_name,
                                        transfer_info->file_path,
+                                       transfer_info->address,
                                        transfer_info->file_size,
                                        transfer_info->transfer_id,
                                        agent_info.server_type);
@@ -230,7 +259,7 @@ static char *__bt_get_remote_device_name(const char *bdaddress)
        device_path = _bt_get_device_object_path((char *)bdaddress);
        retv_if(device_path == NULL, NULL);
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, NULL);
        BT_INFO("Device_path %s", device_path);
        device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
@@ -257,19 +286,107 @@ static char *__bt_get_remote_device_name(const char *bdaddress)
                return NULL;
        }
        g_variant_get(result, "(@a{sv})", &value);
-       g_variant_unref(result);
 
+       if (value) {
+               GVariant *temp_value = g_variant_lookup_value(value, "Alias",
+                       G_VARIANT_TYPE_STRING);
+               g_variant_get(temp_value, "s", &name);
+               if (temp_value)
+                       g_variant_unref(temp_value);
+
+               if (name != NULL)
+                       DBG_SECURE("Alias Name [%s]", name);
+               else {
+                       temp_value = g_variant_lookup_value(value, "Name", G_VARIANT_TYPE_STRING);
+                       g_variant_get(temp_value, "s", &name);
+                       if (temp_value)
+                               g_variant_unref(temp_value);
+                       DBG_SECURE("Name = %s", name);
+               }
+       }
+       g_variant_unref(result);
        g_object_unref(device_proxy);
+       return name;
+}
+
+static void __bt_get_remote_device_name_authinfo(const char *bdaddress,
+                                       char **device_name, unsigned char *auth_info)
+{
+       char *device_path = NULL;
+       char *name = NULL;
+       gboolean is_alias_set;
+       GVariant *value;
+       GVariant *result = NULL;
+       GError *err = NULL;
+       GDBusProxy *device_proxy;
+       GDBusConnection *conn;
+
+       ret_if(bdaddress == NULL);
+
+       device_path = _bt_get_device_object_path((char *)bdaddress);
+       ret_if(device_path == NULL);
+
+       conn = _bt_gdbus_get_system_gconn();
+       ret_if(conn == NULL);
+       BT_INFO("Device_path %s", device_path);
+       device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+                                               NULL, BT_BLUEZ_NAME,
+                                               device_path,
+                                               BT_PROPERTIES_INTERFACE,
+                                               NULL, &err);
+
+       g_free(device_path);
+       ret_if(device_proxy == NULL);
+
+       result = g_dbus_proxy_call_sync(device_proxy, "GetAll",
+                       g_variant_new("(s)", BT_DEVICE_INTERFACE),
+                       G_DBUS_CALL_FLAGS_NONE,
+                       DBUS_TIMEOUT, NULL,
+                       &err);
+       if (err) {
+               BT_ERR("DBus Error : %s", err->message);
+               g_clear_error(&err);
+               return;
+       }
+       if (result == NULL) {
+               BT_ERR("g_dbus_proxy_call_sync function return NULL");
+               return;
+       }
+       g_variant_get(result, "(@a{sv})", &value);
+
        if (value) {
                GVariant *temp_value = g_variant_lookup_value(value, "Alias",
                        G_VARIANT_TYPE_STRING);
-               g_variant_get(temp_value, "(s)", &name);
+               g_variant_get(temp_value, "s", &name);
                if (temp_value)
                        g_variant_unref(temp_value);
-               BT_INFO("Alias Name: %s", name);
+
+               if (name != NULL)
+                       DBG_SECURE("Alias Name [%s]", name);
+               else {
+                       temp_value = g_variant_lookup_value(value, "Name", G_VARIANT_TYPE_STRING);
+                       g_variant_get(temp_value, "s", &name);
+                       if (temp_value)
+                               g_variant_unref(temp_value);
+                       DBG_SECURE("Name = %s", name);
+               }
+               temp_value = g_variant_lookup_value(value, "IsAliasSet", G_VARIANT_TYPE_BOOLEAN);
+               if (temp_value) {
+                       is_alias_set = g_variant_get_boolean(temp_value);
+                       g_variant_unref(temp_value);
+               } else {
+                       is_alias_set = FALSE;
+               }
+
+               if (is_alias_set == FALSE)
+                       __bt_get_auth_info(value, (char *)auth_info);
        }
+       g_variant_unref(result);
+       g_object_unref(device_proxy);
 
-       return name;
+       *device_name = g_strdup(name);
+       g_free(name);
+       return;
 }
 
 static int __bt_get_transfer_id(const char *path)
@@ -290,7 +407,7 @@ static GDBusProxy *__bt_get_transfer_proxy(const char *transfer_path)
        GDBusProxy *proxy;
        GError *err = NULL;
 
-       conn = _bt_get_session_gconn();
+       conn = _bt_gdbus_get_session_gconn();
        retv_if(conn == NULL, NULL);
 
        proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
@@ -313,7 +430,7 @@ static GDBusProxy *__bt_get_transfer_properties_proxy(const char *transfer_path)
        GDBusConnection *conn;
        GDBusProxy *proxy;
        GError *err = NULL;
-       conn = _bt_get_session_gconn();
+       conn = _bt_gdbus_get_session_gconn();
        retv_if(conn == NULL, NULL);
 
        proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
@@ -333,7 +450,6 @@ static int __bt_get_transfer_properties(bt_transfer_info_t *transfer_info,
                                        const char *transfer_path)
 {
        GDBusProxy *transfer_proxy;
-       char *bdaddress = NULL;
        GVariant *result = NULL;
        GError *err = NULL;
        GVariantIter *iter = NULL;
@@ -383,17 +499,18 @@ static int __bt_get_transfer_properties(bt_transfer_info_t *transfer_info,
                        }
                }
                g_variant_iter_free(iter);
-               if (transfer_info->type == NULL)
-                       goto fail;
+
                if (transfer_info->address == NULL)
                        goto fail;
-
                transfer_info->device_name = __bt_get_remote_device_name(transfer_info->address);
-
+               transfer_info->transfer_id = __bt_get_transfer_id(transfer_path);
                if (!transfer_info->device_name)
-                       transfer_info->device_name = g_strdup(bdaddress);
+                       transfer_info->device_name = g_strdup(transfer_info->address);
+
+               if (transfer_info->type == NULL)
+                       goto fail;
+
                transfer_info->path = g_strdup(transfer_path);
-               transfer_info->transfer_id = __bt_get_transfer_id(transfer_path);
        }
 
        g_object_unref(transfer_proxy);
@@ -409,13 +526,15 @@ static gboolean __bt_authorize_cb(GDBusMethodInvocation *context,
                                        gpointer user_data)
 {
        char *device_name = NULL;
+       unsigned char auth_info[5] = {0, };
        int result = BLUETOOTH_ERROR_NONE;
        GDBusProxy *transfer_properties_proxy;
-       char *bdaddress = NULL;
+       char * bdaddress = NULL;
        GVariant *ret;
        GVariantIter *iter;
        GVariant *param = NULL;
        GError *err = NULL;
+       bt_session_info_t *session_info = NULL;
 
        BT_DBG(" path [%s] \n", path);
 
@@ -461,43 +580,60 @@ static gboolean __bt_authorize_cb(GDBusMethodInvocation *context,
                return FALSE;
        }
 #endif
-
        if (iter) {
                const gchar *key;
                GVariant *val;
                gsize len = 0;
                while (g_variant_iter_loop(iter, "{sv}", &key, &val)) {
-                       if (g_strcmp0(key, "Name") == 0) {
+                       if (g_strcmp0(key, "Name") == 0)
                                agent_info.auth_info->filename = g_variant_dup_string(val, &len);
-                       } else if (g_strcmp0(key, "Address") == 0) {
+                       else if (g_strcmp0(key, "Address") == 0)
                                bdaddress = g_variant_dup_string(val, &len);
-                       } else if (g_strcmp0(key, "Size") == 0) {
+                       else if (g_strcmp0(key, "Size") == 0)
                                agent_info.auth_info->file_size = g_variant_get_uint64(val);
-                       }
                }
                g_variant_iter_free(iter);
        }
 
-       device_name = __bt_get_remote_device_name(bdaddress);
+       __bt_get_remote_device_name_authinfo(bdaddress, &device_name, auth_info);
 
        if (!device_name)
                device_name = g_strdup(bdaddress);
 
+       agent_info.auth_info->address = g_strdup(bdaddress);
        agent_info.auth_info->device_name = device_name;
+       memcpy(agent_info.auth_info->contact_auth_info, auth_info, 5);
+
+       session_info = __bt_find_session_by_path((char *)path);
+       if (NULL == session_info) {
+               session_info = g_malloc0(sizeof(bt_session_info_t));
+               session_info->path = g_strdup(path);
+               session_info->address = g_strdup(bdaddress);
+               session_info->authorized = FALSE;
+               session_list = g_slist_append(session_list, session_info);
+       }
 
        g_object_unref(transfer_properties_proxy);
+       g_free(bdaddress);
 
        if (agent_info.server_type == BT_CUSTOM_SERVER) {
                /* No need to send the event */
                _bt_obex_server_accept_authorize(agent_info.auth_info->filename, FALSE);
                return TRUE;
        }
-       param = g_variant_new("(ist)", result,
-                               agent_info.auth_info->filename,
-                               agent_info.auth_info->file_size);
-       _bt_send_event(BT_OPP_SERVER_EVENT,
-               BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE,
-               param);
+
+       if (session_info->authorized == FALSE) {
+               _bt_launch_system_popup(BT_AGENT_EVENT_EXCHANGE_REQUEST, device_name,
+                                       auth_info, NULL, NULL, BT_OBEX_SERVER_AGENT_PATH);
+       } else {
+               param = g_variant_new("(istss)", result,
+                       agent_info.auth_info->filename,
+                       agent_info.auth_info->file_size,
+                       agent_info.auth_info->address,
+                       agent_info.auth_info->device_name);
+               _bt_send_event(BT_OPP_SERVER_EVENT,
+                       BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE, param);
+       }
 
        return TRUE;
 }
@@ -508,7 +644,9 @@ void _bt_obex_transfer_started(const char *transfer_path)
        request_info_t *req_info;
        GVariant *out_param1 = NULL;
        GVariant *param = NULL;
+       GVariantBuilder *builder = NULL;
        int result = BLUETOOTH_ERROR_NONE;
+       int i = 0;
 
        BT_DBG("%s", transfer_path);
 
@@ -524,23 +662,21 @@ void _bt_obex_transfer_started(const char *transfer_path)
                transfer_info->transfer_id = __bt_get_transfer_id(transfer_path);
                transfer_info->file_path = agent_info.auth_info->file_path;
                transfer_info->address = g_strdup(agent_info.auth_info->address);
+
        } else {
                if (__bt_get_transfer_properties(transfer_info, transfer_path) < 0) {
                        BT_ERR("Get Properties failed");
-                       __bt_free_auth_info(agent_info.auth_info);
                        __bt_free_transfer_info(transfer_info);
-                       agent_info.auth_info = NULL;
                        return;
                }
                agent_info.server_type = BT_FTP_SERVER;
        }
 
-       __bt_free_auth_info(agent_info.auth_info);
-       agent_info.auth_info = NULL;
-
        if (agent_info.server_type == BT_CUSTOM_SERVER) {
                if (agent_info.custom_server == NULL) {
                        __bt_free_transfer_info(transfer_info);
+                       __bt_free_auth_info(agent_info.auth_info);
+                       agent_info.auth_info = NULL;
                        return;
                }
 
@@ -568,39 +704,67 @@ void _bt_obex_transfer_started(const char *transfer_path)
 done:
        transfers = g_slist_append(transfers, transfer_info);
 
-       BT_DBG("Transfer id %d\n", transfer_info->transfer_id);
-       param = g_variant_new("(isstii)", result,
+       BT_DBG("Transfer id %d", transfer_info->transfer_id);
+
+       builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+       for (i = 0; i < 5; i++) {
+               if (agent_info.auth_info)
+                       g_variant_builder_add(builder, "y", agent_info.auth_info->contact_auth_info[i]);
+       }
+
+       param = g_variant_new("(isssstii(ay))", result,
+                               transfer_info->device_name,
                                transfer_info->filename,
                                transfer_info->type,
+                               transfer_info->address,
                                transfer_info->file_size,
                                transfer_info->transfer_id,
-                               agent_info.server_type);
+                               agent_info.server_type,
+                               builder);
+
+       __bt_free_auth_info(agent_info.auth_info);
+       agent_info.auth_info = NULL;
+
+       g_variant_builder_unref(builder);
+
        _bt_send_event(BT_OPP_SERVER_EVENT,
                BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED,
                param);
 }
 
 void _bt_obex_transfer_progress(const char *transfer_path,
-                                       int transferred)
+                                       guint64 transferred)
 {
        BT_DBG("+");
        bt_transfer_info_t *transfer_info;
-       int progress = 0;
+       int current_progress = 0;
+       int previous_progress;
        GVariant *param = NULL;
        int result = BLUETOOTH_ERROR_NONE;
 
        transfer_info = __bt_find_transfer_by_path(transfer_path);
        ret_if(transfer_info == NULL);
 
-       progress = (int)(((gdouble)transferred /
+       current_progress = (int)(((gdouble)transferred /
+                       (gdouble)transfer_info->file_size) * 100);
+
+       previous_progress = (int)(((gdouble)transfer_info->progress /
                        (gdouble)transfer_info->file_size) * 100);
 
-       param = g_variant_new("(isstiii)", result,
+       if (current_progress == previous_progress) {
+               BT_DBG("Same Percentage Value: Do not emit Signal");
+               return;
+       }
+
+       transfer_info->progress = transferred;
+       param = g_variant_new("(isssstiii)", result,
                                transfer_info->filename,
                                transfer_info->type,
+                               transfer_info->device_name,
+                               transfer_info->address,
                                transfer_info->file_size,
                                transfer_info->transfer_id,
-                               progress,
+                               current_progress,
                                agent_info.server_type);
        _bt_send_event(BT_OPP_SERVER_EVENT,
                BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_PROGRESS,
@@ -611,8 +775,10 @@ void _bt_obex_transfer_progress(const char *transfer_path,
 void _bt_obex_transfer_completed(const char *transfer_path, gboolean success)
 {
        bt_transfer_info_t *transfer_info;
+       GVariantBuilder *builder = NULL;
        GVariant *param = NULL;
        int result;
+       int i = 0;
        BT_DBG("Transfer [%s] Success [%d] \n", transfer_path, success);
 
        result = (success == TRUE) ? BLUETOOTH_ERROR_NONE
@@ -638,22 +804,32 @@ void _bt_obex_transfer_completed(const char *transfer_path, gboolean success)
                transfer_info->device_name = g_strdup(agent_info.auth_info->device_name);
                transfer_info->transfer_id = __bt_get_transfer_id(transfer_path);
                transfer_info->file_path = agent_info.auth_info->file_path;
+               transfer_info->address = g_strdup(agent_info.auth_info->address);
+
+               builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+               for (i = 0; i < 5; i++)
+                       g_variant_builder_add(builder, "y", agent_info.auth_info->contact_auth_info[i]);
 
-               param = g_variant_new("(isstii)", result,
+               param = g_variant_new("(isssstii(ay))", result,
                                        transfer_info->filename,
                                        transfer_info->type,
+                                       transfer_info->device_name,
+                                       transfer_info->address,
                                        transfer_info->file_size,
                                        transfer_info->transfer_id,
-                                       agent_info.server_type);
+                                       agent_info.server_type,
+                                       builder);
                _bt_send_event(BT_OPP_SERVER_EVENT,
                        BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED,
                        param);
+               g_variant_builder_unref(builder);
        }
-       param = g_variant_new("(isssstii)", result,
+       param = g_variant_new("(issssstii)", result,
                                transfer_info->filename,
                                transfer_info->type,
                                transfer_info->device_name,
                                transfer_info->file_path,
+                               transfer_info->address,
                                transfer_info->file_size,
                                transfer_info->transfer_id,
                                agent_info.server_type);
@@ -664,32 +840,54 @@ void _bt_obex_transfer_completed(const char *transfer_path, gboolean success)
        __bt_free_transfer_info(transfer_info);
 }
 
-void _bt_obex_transfer_connected()
+void _bt_obex_transfer_connected(const char *obj_path)
 {
        BT_DBG("+");
 
        int result = BLUETOOTH_ERROR_NONE;
        GVariant *param = NULL;
+       bt_transfer_info_t *transfer_info = NULL;
+
+       transfer_info = g_new0(bt_transfer_info_t, 1);
+       __bt_get_transfer_properties(transfer_info, obj_path);
+       INFO_SECURE("Address[%s] Name[%s] TransferID[%d] ", transfer_info->address,
+                       transfer_info->device_name, transfer_info->transfer_id);
 
-       param = g_variant_new("(i)", result);
+       param = g_variant_new("(issi)", result, transfer_info->address,
+                       transfer_info->device_name, transfer_info->transfer_id);
 
        _bt_send_event(BT_OPP_SERVER_EVENT,
                BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_CONNECTED,
                param);
+
+       __bt_free_transfer_info(transfer_info);
        BT_DBG("-");
 }
 
-void _bt_obex_transfer_disconnected()
+void _bt_obex_transfer_disconnected(char * obj_path)
 {
        BT_DBG("+");
 
        int result = BLUETOOTH_ERROR_NONE;
        GVariant *param = NULL;
+       bt_session_info_t *session = NULL;
+       int transfer_id = -1;
+
+       session = __bt_find_session_by_path(obj_path);
+       ret_if(session == NULL);
 
-       param = g_variant_new("(i)", result);
+       transfer_id = __bt_get_transfer_id(obj_path);
+       DBG_SECURE("transfer_id: [%d]", transfer_id);
+
+       DBG_SECURE("%s", session->address);
+       param = g_variant_new("(isi)", result, session->address, transfer_id);
        _bt_send_event(BT_OPP_SERVER_EVENT,
                BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_DISCONNECTED,
                param);
+       session_list = g_slist_remove(session_list, session);
+       g_free(session->address);
+       g_free(session->path);
+       g_free(session);
        BT_DBG("-");
 }
 
@@ -697,10 +895,11 @@ int _bt_register_obex_server(void)
 {
        GDBusConnection *g_conn;
        GDBusProxy *manager_proxy;
+       GVariant *result = NULL;
        GError *g_error = NULL;
 
        /* Get the session bus. */
-       g_conn = _bt_get_session_gconn();
+       g_conn = _bt_gdbus_get_session_gconn();
        retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        _bt_obex_agent_new(BT_OBEX_SERVER_AGENT_PATH);
@@ -716,11 +915,10 @@ int _bt_register_obex_server(void)
                                                BT_OBEX_MANAGER,
                                                NULL, &g_error);
 
-       if (manager_proxy == NULL) {
+       if (manager_proxy == NULL)
                return BLUETOOTH_ERROR_INTERNAL;
-       }
 
-       g_dbus_proxy_call_sync(manager_proxy, "RegisterAgent",
+       result = g_dbus_proxy_call_sync(manager_proxy, "RegisterAgent",
                                g_variant_new("(o)", BT_OBEX_SERVER_AGENT_PATH),
                                G_DBUS_CALL_FLAGS_NONE,
                                DBUS_TIMEOUT, NULL,
@@ -733,6 +931,9 @@ int _bt_register_obex_server(void)
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
+       if (result)
+               g_variant_unref(result);
+
        agent_info.proxy = manager_proxy;
 
        return BLUETOOTH_ERROR_NONE;
@@ -740,12 +941,13 @@ int _bt_register_obex_server(void)
 
 int _bt_unregister_obex_server(void)
 {
+       GVariant *result = NULL;
        GError *g_error = NULL;
 
        retv_if(agent_info.proxy == NULL,
                                BLUETOOTH_ERROR_INTERNAL);
 
-       g_dbus_proxy_call_sync(agent_info.proxy, "UnregisterAgent",
+       result = g_dbus_proxy_call_sync(agent_info.proxy, "UnregisterAgent",
                                g_variant_new("(o)", BT_OBEX_SERVER_AGENT_PATH),
                                G_DBUS_CALL_FLAGS_NONE,
                                DBUS_TIMEOUT, NULL,
@@ -754,6 +956,10 @@ int _bt_unregister_obex_server(void)
                BT_ERR("Agent unregistration failed: %s", g_error->message);
                g_error_free(g_error);
        }
+
+       if (result)
+               g_variant_unref(result);
+
        _bt_obex_agent_destroy(BT_OBEX_SERVER_AGENT_PATH);
        g_object_unref(agent_info.proxy);
        agent_info.proxy = NULL;
@@ -779,35 +985,61 @@ gboolean __bt_check_folder_path(const char *dest_path)
        return TRUE;
 }
 
+char *__bt_transfer_folder_path(char *dest_path)
+{
+       char *dst_path = (char *)g_malloc0(BT_OBEX_PATH_MAX_LENGTH);
+       if (g_str_has_prefix(dest_path, BT_OBEX_PATH_PREFIX))
+               snprintf(dst_path, BT_OBEX_PATH_MAX_LENGTH, BT_OBEX_DEFAULT_PATH"%s", dest_path + strlen(BT_OBEX_PATH_PREFIX));
+       else
+               snprintf(dst_path, BT_OBEX_PATH_MAX_LENGTH, "%s", dest_path);
+
+       BT_INFO("obex transfed path : %s", dst_path);
+       return dst_path;
+}
+
 int _bt_obex_server_allocate(char *sender, const char *dest_path, int app_pid, gboolean is_native)
 {
        BT_DBG("+");
-       if (__bt_check_folder_path(dest_path) == FALSE)
+
+       char *dst_path;
+       dst_path = __bt_transfer_folder_path((char *)dest_path);
+
+       if (__bt_check_folder_path(dst_path) == FALSE) {
+               g_free(dst_path);
                return BLUETOOTH_ERROR_INVALID_PARAM;
+       }
 
        if (is_native == TRUE) {
-               retv_if(agent_info.native_server,
-                               BLUETOOTH_ERROR_DEVICE_BUSY);
+               if (agent_info.native_server) {
+                       BT_ERR("obex native server busy");
+                       g_free(dst_path);
+                       return BLUETOOTH_ERROR_DEVICE_BUSY;
+               }
 
                /* Force to change the control to native */
                agent_info.native_server = g_malloc0(sizeof(bt_server_info_t));
-               agent_info.native_server->dest_path = g_strdup(dest_path);
+               agent_info.native_server->dest_path = g_strdup(dst_path);
                agent_info.native_server->sender = g_strdup(sender);
                agent_info.native_server->app_pid = app_pid;
                agent_info.server_type = BT_NATIVE_SERVER;
                _bt_unregister_osp_server_in_agent(BT_OBEX_SERVER, NULL);
        } else {
-               retv_if(agent_info.custom_server,
-                               BLUETOOTH_ERROR_DEVICE_BUSY);
+               if (agent_info.custom_server) {
+                       BT_ERR("obex custom server busy");
+                       g_free(dst_path);
+                       return BLUETOOTH_ERROR_DEVICE_BUSY;
+               }
 
                /* Force to change the control to custom */
                agent_info.custom_server = g_malloc0(sizeof(bt_server_info_t));
-               agent_info.custom_server->dest_path = g_strdup(dest_path);
+               agent_info.custom_server->dest_path = g_strdup(dst_path);
                agent_info.custom_server->sender = g_strdup(sender);
                agent_info.custom_server->app_pid = app_pid;
                agent_info.server_type = BT_CUSTOM_SERVER;
                _bt_register_osp_server_in_agent(BT_OBEX_SERVER, NULL, NULL, -1);
        }
+
+       g_free(dst_path);
        BT_DBG("-");
        return BLUETOOTH_ERROR_NONE;
 }
@@ -879,10 +1111,33 @@ int _bt_obex_server_accept_authorize(const char *filename, gboolean is_native)
                g_variant_new("(s)", &file_path));
        agent_info.auth_info->reply_context = NULL;
        agent_info.auth_info->file_path = g_strdup(file_path);
+       g_free(agent_info.auth_info->filename);
+       agent_info.auth_info->filename = g_strdup(filename);
 
        return BLUETOOTH_ERROR_NONE;
 }
 
+void _bt_obex_server_reply_accept(void)
+{
+       GVariant *param = NULL;
+       bt_session_info_t *session_info = NULL;
+       int result = BLUETOOTH_ERROR_NONE;
+       param = g_variant_new("(istss)", result,
+                       agent_info.auth_info->filename,
+                       agent_info.auth_info->file_size,
+                       agent_info.auth_info->address,
+                       agent_info.auth_info->device_name);
+       BT_INFO("Send Obex Authorize");
+       _bt_send_event(BT_OPP_SERVER_EVENT, BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE, param);
+
+       session_info = __bt_find_session_by_path(agent_info.auth_info->transfer_path);
+
+       if (NULL == session_info)
+               BT_ERR("Couldn't get the session info from the list");
+       else
+               session_info->authorized = TRUE;
+}
+
 int _bt_obex_server_reject_authorize(void)
 {
        GError *g_error;
@@ -908,15 +1163,18 @@ int _bt_obex_server_set_destination_path(const char *dest_path,
                                                gboolean is_native)
 {
        bt_server_info_t *server_info;
-
        BT_CHECK_PARAMETER(dest_path, return);
 
+       char *dst_path;
+       dst_path = __bt_transfer_folder_path((char *)dest_path);
+
        DIR *dp = NULL;
 
-       dp = opendir(dest_path);
+       dp = opendir(dst_path);
 
        if (dp == NULL) {
                BT_ERR("The directory does not exist");
+               g_free(dst_path);
                return BLUETOOTH_ERROR_INVALID_PARAM;
        }
 
@@ -927,17 +1185,22 @@ int _bt_obex_server_set_destination_path(const char *dest_path,
        else
                server_info = agent_info.custom_server;
 
-       retv_if(server_info == NULL,
-                       BLUETOOTH_ERROR_AGENT_DOES_NOT_EXIST);
+       if (!server_info) {
+               BT_ERR("obex server info is NULL");
+               g_free(dst_path);
+               return BLUETOOTH_ERROR_AGENT_DOES_NOT_EXIST;
+       }
 
        g_free(server_info->dest_path);
-       server_info->dest_path = g_strdup(dest_path);
+       server_info->dest_path = g_strdup(dst_path);
 
+       g_free(dst_path);
        return BLUETOOTH_ERROR_NONE;
 }
 
 int _bt_obex_server_set_root(const char *root)
 {
+       GVariant *result = NULL;
        GError *g_error = NULL;
        GVariant *folder = NULL;
        char *string = "Root";
@@ -945,20 +1208,27 @@ int _bt_obex_server_set_root(const char *root)
 
        BT_CHECK_PARAMETER(root, return);
 
-       retv_if(agent_info.proxy == NULL,
-                               BLUETOOTH_ERROR_INTERNAL);
+       char *dst_root;
+       dst_root = __bt_transfer_folder_path((char *)root);
+
+       if (!agent_info.proxy) {
+               BT_ERR("obex agent_info proxy error");
+               g_free(dst_root);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
 
-       dp = opendir(root);
+       dp = opendir(dst_root);
 
        if (dp == NULL) {
                BT_ERR("The directory does not exist");
+               g_free(dst_root);
                return BLUETOOTH_ERROR_INVALID_PARAM;
        }
 
        closedir(dp);
 
-       folder = g_variant_new_string(root);
-       g_dbus_proxy_call_sync(agent_info.proxy, "SetProperty",
+       folder = g_variant_new_string(dst_root);
+       result = g_dbus_proxy_call_sync(agent_info.proxy, "SetProperty",
                        g_variant_new("(sv)", string, folder),
                        G_DBUS_CALL_FLAGS_NONE,
                        DBUS_TIMEOUT, NULL,
@@ -967,9 +1237,14 @@ int _bt_obex_server_set_root(const char *root)
        if (g_error) {
                BT_ERR("SetProperty Fail: %s", g_error->message);
                g_error_free(g_error);
+               g_free(dst_root);
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
+       if (result)
+               g_variant_unref(result);
+
+       g_free(dst_root);
        return BLUETOOTH_ERROR_NONE;
 }
 
@@ -977,6 +1252,7 @@ int _bt_obex_server_cancel_transfer(int transfer_id)
 {
        bt_transfer_info_t *transfer = NULL;
        GDBusProxy *proxy;
+       GVariant *result = NULL;
        GError *err = NULL;
        BT_DBG("+");
        transfer = __bt_find_transfer_by_id(transfer_id);
@@ -986,15 +1262,19 @@ int _bt_obex_server_cancel_transfer(int transfer_id)
 
        retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       g_dbus_proxy_call_sync(proxy, "Cancel", NULL,
+       result = g_dbus_proxy_call_sync(proxy, "Cancel", NULL,
                G_DBUS_CALL_FLAGS_NONE,
                DBUS_TIMEOUT, NULL, &err);
        if (err) {
                BT_ERR("Dbus Err: %s", err->message);
                g_clear_error(&err);
        }
+
        g_object_unref(proxy);
 
+       if (result)
+               g_variant_unref(result);
+
        return BLUETOOTH_ERROR_NONE;
 }
 
@@ -1019,11 +1299,10 @@ int _bt_obex_server_is_activated(gboolean *activated)
 {
        BT_CHECK_PARAMETER(activated, return);
 
-       if (agent_info.custom_server) {
+       if (agent_info.custom_server)
                *activated = TRUE;
-       } else {
+       else
                *activated = FALSE;
-       }
 
        return BLUETOOTH_ERROR_NONE;
 }
@@ -1032,11 +1311,10 @@ int _bt_obex_server_check_allocation(gboolean *allocation)
 {
        BT_CHECK_PARAMETER(allocation, return);
 
-       if (agent_info.native_server || agent_info.custom_server) {
+       if (agent_info.native_server || agent_info.custom_server)
                *allocation = TRUE;
-       } else {
+       else
                *allocation = FALSE;
-       }
 
        return BLUETOOTH_ERROR_NONE;
 }
@@ -1066,11 +1344,10 @@ int _bt_obex_server_is_receiving(gboolean *receiving)
 {
        BT_CHECK_PARAMETER(receiving, return);
 
-       if (transfers == NULL || g_slist_length(transfers) == 0) {
+       if (transfers == NULL || g_slist_length(transfers) == 0)
                *receiving = FALSE;
-       } else {
+       else
                *receiving = TRUE;
-       }
 
        return BLUETOOTH_ERROR_NONE;
 }
@@ -1131,3 +1408,18 @@ int _bt_obex_server_reject_connection(void)
        return BLUETOOTH_ERROR_NONE;
 }
 
+int _bt_opp_get_server_progress(int transfer_id, guint8 *progress)
+{
+       bt_transfer_info_t *requested_transfer = NULL;
+       requested_transfer = __bt_find_transfer_by_id(transfer_id);
+       if (requested_transfer == NULL) {
+               BT_ERR("No Matching Inbound transfer");
+               return BLUETOOTH_ERROR_NOT_FOUND;
+       }
+
+       *progress = (int)(((double)requested_transfer->progress /
+                       requested_transfer->file_size) * 100);
+
+       BT_DBG("Percentage: %d", *progress);
+       return BLUETOOTH_ERROR_NONE;
+}
old mode 100755 (executable)
new mode 100644 (file)
index df637aa..c5dcc71
@@ -1,5 +1,11 @@
 /*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ * Bluetooth-frwk
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact:  Hocheol Seo <hocheol.seo@samsung.com>
+ *              Girishashok Joshi <girish.joshi@samsung.com>
+ *              Chanyeol Park <chanyeol.park@samsung.com>
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 #include "bt-service-oob.h"
 #include "bt-service-event.h"
 
+static int __get_oob_data_from_variant(GVariant *variant,
+               unsigned char *buf, int size)
+{
+       int i;
+       unsigned char *v;
+
+       i = g_variant_get_size(variant);
+       v = (unsigned char *)g_variant_get_data(variant);
+       if (i && v) {
+               i = i > size ? size : i;
+               memcpy(buf, v, i);
+       }
+
+       return i;
+}
+
 int _bt_oob_read_local_data(bt_oob_data_t *local_oob_data)
 {
        GDBusProxy *proxy;
        GVariant *reply;
        GError *err = NULL;
        char *adapter_path;
-       unsigned char *local_hash = NULL;
-       unsigned char *local_randomizer = NULL;
        GDBusConnection *conn;
-       GVariant *hash = NULL;
-       GVariant *randomizer = NULL;
+       GVariant *hash192 = NULL;
+       GVariant *randomizer192 = NULL;
+       GVariant *hash256 = NULL;
+       GVariant *randomizer256 = NULL;
 
        BT_CHECK_PARAMETER(local_oob_data, return);
 
-       conn = _bt_get_system_conn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        adapter_path = _bt_get_adapter_path();
        retv_if(adapter_path == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-
        proxy =  g_dbus_proxy_new_sync(conn,
                        G_DBUS_PROXY_FLAGS_NONE, NULL,
                        BT_BLUEZ_NAME, adapter_path,
@@ -76,35 +97,37 @@ int _bt_oob_read_local_data(bt_oob_data_t *local_oob_data)
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
-       g_variant_get(reply, "(@ay@ay)", &hash, &randomizer);
+       g_variant_get(reply, "(@ay@ay@ay@ay)", &hash192, &randomizer192,
+                       &hash256, &randomizer256);
        g_variant_unref(reply);
 
-       if (hash != NULL) {
-               local_oob_data->hash_len = (unsigned int)g_variant_get_size(hash);
-               local_hash = (unsigned char *)g_variant_get_data(hash);
-       } else {
-               BT_ERR("hash is NULL");
-               return BLUETOOTH_ERROR_INTERNAL;
+       if (hash192) {
+               local_oob_data->hash_len = __get_oob_data_from_variant(hash192,
+                               local_oob_data->hash,
+                               sizeof(local_oob_data->hash));
+               g_variant_unref(hash192);
        }
 
-       g_variant_unref(hash);
-
-       if (randomizer != NULL) {
-               local_oob_data->randomizer_len = (unsigned int)g_variant_get_size(randomizer);
-               local_randomizer = (unsigned char *)g_variant_get_data(randomizer);
-       } else {
-               BT_ERR("randomizer is NULL");
-               return BLUETOOTH_ERROR_INTERNAL;
+       if (randomizer192) {
+               local_oob_data->randomizer_len = __get_oob_data_from_variant(randomizer192,
+                               local_oob_data->randomizer,
+                               sizeof(local_oob_data->randomizer));
+               g_variant_unref(randomizer192);
        }
 
-       g_variant_unref(randomizer);
-
-       if (local_oob_data->hash_len > 0)
-               memcpy(local_oob_data->hash, local_hash, local_oob_data->hash_len);
+       if (hash256) {
+               local_oob_data->hash256_len = __get_oob_data_from_variant(hash256,
+                               local_oob_data->hash256,
+                               sizeof(local_oob_data->hash256));
+               g_variant_unref(hash256);
+       }
 
-       if (local_oob_data->randomizer_len > 0)
-               memcpy(local_oob_data->randomizer, local_randomizer,
-                               local_oob_data->randomizer_len);
+       if (randomizer256) {
+               local_oob_data->randomizer256_len = __get_oob_data_from_variant(randomizer256,
+                               local_oob_data->randomizer256,
+                               sizeof(local_oob_data->randomizer256));
+               g_variant_unref(randomizer256);
+       }
 
        return BLUETOOTH_ERROR_NONE;
 }
@@ -113,6 +136,7 @@ int _bt_oob_add_remote_data(
                        bluetooth_device_address_t *remote_device_address,
                        bt_oob_data_t *remote_oob_data)
 {
+       int i;
        GDBusProxy *proxy;
        GVariant *reply;
        GError *err = NULL;
@@ -122,22 +146,23 @@ int _bt_oob_add_remote_data(
        unsigned char *remote_hash;
        unsigned char *remote_randomizer;
        GDBusConnection *conn;
-       GArray *in_param1 = NULL;
-       GArray *in_param2 = NULL;
-       GVariant *hash;
-       GVariant *randomizer;
+       GVariantBuilder *builder;
+       GVariantBuilder *builder2;
+       GVariant *hash192;
+       GVariant *randomizer192;
+       GVariant *hash256;
+       GVariant *randomizer256;
 
        BT_CHECK_PARAMETER(remote_device_address, return);
        BT_CHECK_PARAMETER(remote_oob_data, return);
 
-       conn = _bt_get_system_conn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        adapter_path = _bt_get_adapter_path();
        retv_if(adapter_path == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       _bt_convert_addr_type_to_string(address,
-               remote_device_address->addr);
+       _bt_convert_addr_type_to_string(address, remote_device_address->addr);
 
        proxy =  g_dbus_proxy_new_sync(conn,
                        G_DBUS_PROXY_FLAGS_NONE, NULL,
@@ -153,41 +178,57 @@ int _bt_oob_add_remote_data(
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
+       /* Remote address */
+       dev_addr = g_strdup(address);
+
+       /* P-192 */
        remote_hash = remote_oob_data->hash;
        remote_randomizer = remote_oob_data->randomizer;
-       dev_addr = g_strdup(address);
 
-       BT_DBG("remote hash len = [%d] and remote random len = [%d]\n",
-               remote_oob_data->hash_len, remote_oob_data->randomizer_len);
-       /*Create array of bytes variant*/
-       in_param1 = g_array_new(TRUE, TRUE, sizeof(gchar));
-       in_param2 = g_array_new(TRUE, TRUE, sizeof(gchar));
+       builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+       builder2 = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+
+       for (i = 0; i < remote_oob_data->hash_len; i++)
+               g_variant_builder_add(builder, "y", remote_hash[i]);
+
+       for (i = 0; i < remote_oob_data->randomizer_len; i++)
+               g_variant_builder_add(builder2, "y", remote_randomizer[i]);
+
+       hash192 = g_variant_new("ay", builder);
+       randomizer192 = g_variant_new("ay", builder2);
 
-       g_array_append_vals(in_param1, remote_hash,
-                       remote_oob_data->hash_len);
-       g_array_append_vals(in_param2, remote_randomizer,
-                       remote_oob_data->randomizer_len);
+       g_variant_builder_unref(builder2);
+       g_variant_builder_unref(builder);
 
-       hash = g_variant_new_from_data((const GVariantType *)"ay",
-                       in_param1->data, in_param1->len,
-                       TRUE, NULL, NULL);
+       /* P-256 */
+       remote_hash = remote_oob_data->hash256;
+       remote_randomizer = remote_oob_data->randomizer256;
 
-       randomizer = g_variant_new_from_data((const GVariantType *)"ay",
-                       in_param2->data, in_param2->len,
-                       TRUE, NULL, NULL);
+       builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+       builder2 = g_variant_builder_new(G_VARIANT_TYPE("ay"));
 
-       g_array_free(in_param1, TRUE);
-       g_array_free(in_param2, TRUE);
+       for (i = 0; i < remote_oob_data->hash256_len; i++)
+               g_variant_builder_add(builder, "y", remote_hash[i]);
 
-       /* Call AddRemoteData Method*/
+       for (i = 0; i < remote_oob_data->randomizer256_len; i++)
+               g_variant_builder_add(builder2, "y", remote_randomizer[i]);
+
+       hash256 = g_variant_new("ay", builder);
+       randomizer256 = g_variant_new("ay", builder2);
+
+       g_variant_builder_unref(builder2);
+       g_variant_builder_unref(builder);
+
+       /* Call AddRemoteData Method */
        reply = g_dbus_proxy_call_sync(proxy, "AddRemoteData",
-                       g_variant_new("(s@ay@ay)", dev_addr, hash, randomizer),
+                       g_variant_new("(s@ay@ay@ay@ay)", dev_addr,
+                               hash192, randomizer192, hash256, randomizer256),
                        G_DBUS_CALL_FLAGS_NONE, -1,
                        NULL, &err);
        g_object_unref(proxy);
        g_free(dev_addr);
 
-       /* Check the reply*/
+       /* Check the reply */
        if (reply == NULL) {
                BT_ERR("AddRemoteData dBUS-RPC is failed");
                if (err != NULL) {
@@ -197,8 +238,8 @@ int _bt_oob_add_remote_data(
                }
                return BLUETOOTH_ERROR_INTERNAL;
        }
-
        g_variant_unref(reply);
+
        return BLUETOOTH_ERROR_NONE;
 }
 
@@ -215,7 +256,7 @@ int _bt_oob_remove_remote_data(
 
        BT_CHECK_PARAMETER(remote_device_address, return);
 
-       conn = _bt_get_system_conn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        adapter_path = _bt_get_adapter_path();
@@ -262,4 +303,3 @@ int _bt_oob_remove_remote_data(
        g_variant_unref(reply);
        return BLUETOOTH_ERROR_NONE;
 }
-
old mode 100755 (executable)
new mode 100644 (file)
index 9b229ec..3e83f72
@@ -19,7 +19,7 @@
 #include <dlog.h>
 #include <string.h>
 #include <mime_type.h>
-
+#include <aul.h>
 #include <glib.h>
 #include <gio/gio.h>
 
@@ -31,6 +31,9 @@
 #include "bt-service-util.h"
 #include "bt-service-opp-client.h"
 #include "bt-service-obex-agent.h"
+#include "bt-service-adapter.h"
+
+#define BT_MIME_TYPE_MAX_LEN   20
 
 static GSList *transfer_list = NULL;
 bt_sending_info_t *sending_info;
@@ -38,7 +41,7 @@ static int file_offset = 0;
 
 #define DBUS_TIEMOUT 20 * 1000  /* 20 Seconds */
 static gboolean __bt_sending_release();
-static void _bt_remove_session();
+static int _bt_remove_session();
 
 static int __bt_opp_client_start_sending(int request_id, char *address,
                                        char **file_name_array, int file_count);
@@ -126,12 +129,13 @@ static gboolean __bt_cancel_push_cb(gpointer data)
        return FALSE;
 }
 
-gboolean _bt_obex_client_progress(const char *transfer_path, int transferred)
+gboolean _bt_obex_client_progress(const char *transfer_path, guint64 transferred)
 {
        BT_DBG("+");
 
        int percentage_progress;
-       gint64 size;
+       int previous_progress;
+       guint64 size;
        int result = BLUETOOTH_ERROR_NONE;
        GVariant *param = NULL;
        retv_if(sending_info == NULL, TRUE);
@@ -144,22 +148,33 @@ gboolean _bt_obex_client_progress(const char *transfer_path, int transferred)
        }
 
        size = sending_info->transfer_info->size;
-
        if (size != 0)
-               percentage_progress = (int)(((gdouble)transferred /
-                               (gdouble)size) * 100);
+               percentage_progress = (int)(((gdouble)transferred /(gdouble)size) * 100);
        else
                percentage_progress = 0;
 
        sending_info->transfer_info->transfer_status = BT_TRANSFER_STATUS_PROGRESS;
        sending_info->result = result;
 
+       previous_progress = (int)(((gdouble)sending_info->transfer_info->progress /(gdouble)size) * 100);
+       if (percentage_progress == previous_progress &&
+                                                       sending_info->transfer_info->progress) {
+               sending_info->transfer_info->progress = transferred;
+               return TRUE;
+       }
+               BT_DBG("Sending progress [prev %d] [curr %d]",
+                                                       previous_progress, percentage_progress);
+
+       sending_info->transfer_info->progress = transferred;
+
        /* Send the event in only error none case */
        param = g_variant_new("(istii)", result,
                                sending_info->transfer_info->file_name,
                                sending_info->transfer_info->size,
                                percentage_progress,
                                sending_info->request_id);
+
+
        _bt_send_event(BT_OPP_CLIENT_EVENT,
                        BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS,
                        param);
@@ -191,7 +206,8 @@ gboolean _bt_obex_client_completed(const char *transfer_path, gboolean success)
        if (!success) { /*In case of remote device reject, we need to send BLUETOOTH_EVENT_OPC_DISCONNECTED */
                BT_DBG("completed with error");
                if (!sending_info->is_canceled) {
-                       param = g_variant_new("(isti)", result,
+                       param = g_variant_new("(issti)", result,
+                                               sending_info->address,
                                                sending_info->transfer_info->file_name,
                                                sending_info->transfer_info->size,
                                                sending_info->request_id);
@@ -219,7 +235,8 @@ gboolean _bt_obex_client_completed(const char *transfer_path, gboolean success)
        } else {
                BT_DBG("complete success");
                /* Send the event in only error none case */
-               param = g_variant_new("(isti)", result,
+               param = g_variant_new("(issti)", result,
+                                       sending_info->address,
                                        sending_info->transfer_info->file_name,
                                        sending_info->transfer_info->size,
                                        sending_info->request_id);
@@ -252,7 +269,7 @@ gboolean _bt_obex_client_started(const char *transfer_path)
        }
 
        /* Get the session bus. */
-       g_conn = _bt_get_session_gconn();
+       g_conn = _bt_gdbus_get_session_gconn();
        retv_if(g_conn == NULL, FALSE);
        properties_proxy = g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE,
                                                NULL, BT_OBEXD_DBUS_NAME,
@@ -274,7 +291,9 @@ gboolean _bt_obex_client_started(const char *transfer_path)
 
        sending_info->transfer_info->transfer_status = BT_TRANSFER_STATUS_STARTED;
        sending_info->result = result;
-       param = g_variant_new("(isti)", result,
+
+       param = g_variant_new("(issti)", result,
+                               sending_info->address,
                                sending_info->transfer_info->file_name,
                                sending_info->transfer_info->size,
                                sending_info->request_id);
@@ -301,9 +320,8 @@ static void __bt_free_sending_data(gpointer data)
 
        ret_if(info == NULL);
 
-       for (i = 0; i < info->file_count; i++) {
+       for (i = 0; i < info->file_count; i++)
                g_free(info->file_path[i]);
-       }
 
        _bt_delete_request_id(info->request_id);
 
@@ -321,9 +339,13 @@ static void __bt_sending_release_cb(GDBusProxy *proxy,
        GError *error = NULL;
        int result = BLUETOOTH_ERROR_NONE;
        GVariant *param = NULL;
-       g_dbus_proxy_call_finish(proxy, res, &error);
+       GVariant *reply = NULL;
+
+       reply = g_dbus_proxy_call_finish(proxy, res, &error);
        if (proxy)
                g_object_unref(proxy);
+       if (reply)
+               g_variant_unref(reply);
 
        if (error) {
                BT_ERR("%s", error->message);
@@ -335,9 +357,7 @@ static void __bt_sending_release_cb(GDBusProxy *proxy,
                BT_DBG("Session Removed");
        }
 
-       if (sending_info->result != BLUETOOTH_ERROR_CANCEL_BY_USER)
-               sending_info->result = result;
-
+       sending_info->result = result;
        param = g_variant_new("(isi)", sending_info->result,
                                sending_info->address,
                                sending_info->request_id);
@@ -381,15 +401,15 @@ fail:
        return;
 }
 
-static void _bt_remove_session()
+static int _bt_remove_session()
 {
        GDBusConnection *g_conn;
        GDBusProxy *session_proxy;
        GError *err = NULL;
 
-       g_conn = _bt_get_session_gconn();
-       ret_if(g_conn == NULL);
-       ret_if(sending_info->session_path == NULL);
+       g_conn = _bt_gdbus_get_session_gconn();
+       retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+       retv_if(sending_info->session_path == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
 
        session_proxy = g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE,
                                                NULL, BT_OBEXD_DBUS_NAME,
@@ -397,7 +417,7 @@ static void _bt_remove_session()
                                                BT_OBEX_CLIENT_INTERFACE,
                                                NULL, &err);
 
-       ret_if(session_proxy == NULL);
+       retv_if(session_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        g_dbus_proxy_call(session_proxy, "RemoveSession",
                g_variant_new("(o)", sending_info->session_path),
@@ -406,6 +426,7 @@ static void _bt_remove_session()
                (GAsyncReadyCallback)__bt_sending_release_cb,
                NULL);
 
+       return BLUETOOTH_ERROR_NONE;
 }
 
 static gboolean __bt_sending_release()
@@ -414,7 +435,8 @@ static gboolean __bt_sending_release()
 
        retv_if(sending_info == NULL, FALSE);
 
-       _bt_remove_session();
+       retv_if(_bt_remove_session() != BLUETOOTH_ERROR_NONE, FALSE);
+
        BT_DBG("-");
        return TRUE;
 }
@@ -435,7 +457,8 @@ void _bt_opc_disconnected(const char *session_path)
                if (sending_info->transfer_info->transfer_status == BT_TRANSFER_STATUS_PROGRESS ||
                                sending_info->transfer_info->transfer_status == BT_TRANSFER_STATUS_STARTED) {
                        BT_INFO("Abnormal termination");
-                       param = g_variant_new("(isti)", sending_info->result,
+                       param = g_variant_new("(issti)", sending_info->result,
+                                               sending_info->address,
                                                sending_info->transfer_info->file_name,
                                                sending_info->transfer_info->size,
                                                sending_info->request_id);
@@ -471,10 +494,38 @@ static void __bt_send_file_cb(GDBusProxy *proxy,
        GVariantIter *iter = NULL;
        value = g_dbus_proxy_call_finish(proxy, res, &error);
        if (error) {
+               g_dbus_error_strip_remote_error(error);
                BT_ERR("%s", error->message);
-               g_error_free(error);
-               if (proxy)
-                       g_object_unref(proxy);
+               /* If Obex is not able to open a file then continue with other if any */
+               if (g_strcmp0("Unable to open file", error->message) == 0) {
+                       GVariant *param = NULL;
+                       gint64 size = 0;
+
+                       BT_ERR("Unable to open file [%s]", sending_info->file_name_array[file_offset]);
+
+                       param = g_variant_new("(issti)", BLUETOOTH_ERROR_NOT_FOUND,
+                                       sending_info->address,
+                                       sending_info->file_name_array[file_offset],
+                                       size,
+                                       sending_info->request_id);
+                       _bt_send_event(BT_OPP_CLIENT_EVENT,
+                                       BLUETOOTH_EVENT_OPC_TRANSFER_STARTED,
+                                       param);
+
+                       param = g_variant_new("(issti)", BLUETOOTH_ERROR_NOT_FOUND,
+                                               sending_info->address,
+                                               sending_info->file_name_array[file_offset],
+                                               size,
+                                               sending_info->request_id);
+                       _bt_send_event(BT_OPP_CLIENT_EVENT,
+                                       BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE,
+                                       param);
+                       g_error_free(error);
+                       if (proxy)
+                               g_object_unref(proxy);
+                       file_offset++;
+                       _bt_sending_files();
+               }
                return;
        }
        if (proxy)
@@ -494,13 +545,12 @@ static void __bt_send_file_cb(GDBusProxy *proxy,
                GVariant *val;
                gsize len = 0;
                while (g_variant_iter_loop(iter, "{sv}", &key, &val)) {
-                       if (g_strcmp0(key, "Name") == 0) {
+                       if (g_strcmp0(key, "Name") == 0)
                                transfer_name = g_variant_dup_string(val, &len);
-                       } else if (g_strcmp0(key, "Filename") == 0) {
+                       else if (g_strcmp0(key, "Filename") == 0)
                                file_name = g_variant_dup_string(val, &len);
-                       } else if (g_strcmp0(key, "Size") == 0) {
+                       else if (g_strcmp0(key, "Size") == 0)
                                size = g_variant_get_uint64(val);
-                       }
                }
                g_variant_iter_free(iter);
        }
@@ -508,11 +558,14 @@ static void __bt_send_file_cb(GDBusProxy *proxy,
        sending_info->transfer_info->transfer_name = g_strdup(transfer_name);
        sending_info->transfer_info->file_name = g_strdup(file_name);
        sending_info->transfer_info->size = size;
+       sending_info->transfer_info->progress = 0;
        sending_info->transfer_info->transfer_path = session_path;
        sending_info->transfer_info->transfer_status = BT_TRANSFER_STATUS_QUEUED;
        sending_info->result = BLUETOOTH_ERROR_NONE;
        file_offset++;
 
+       g_free((gchar *)transfer_name);
+       g_free((gchar *)file_name);
 }
 
 void _bt_sending_files(void)
@@ -522,14 +575,13 @@ void _bt_sending_files(void)
        GError *err = NULL;
        GDBusConnection *g_conn;
        GDBusProxy *client_proxy;
-       char *mimetype = NULL;
-       char *ext = NULL;
+       char mime_type[BT_MIME_TYPE_MAX_LEN + 1] = { 0 };
 
        if (sending_info == NULL)
                return;
        if (file_offset < sending_info->file_count) {
                /* Get the session bus. */
-               g_conn = _bt_get_session_gconn();
+               g_conn = _bt_gdbus_get_session_gconn();
                ret_if(g_conn == NULL);
 
                client_proxy = g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE,
@@ -538,15 +590,27 @@ void _bt_sending_files(void)
                                                BT_OBEX_OBJECT_PUSH_INTERFACE,
                                                NULL, &err);
                ret_if(client_proxy == NULL);
+               if (aul_get_mime_from_file(sending_info->file_name_array[file_offset],
+                               mime_type, BT_MIME_TYPE_MAX_LEN) == AUL_R_OK) {
+                               BT_DBG("MLME type = %s", mime_type);
+
+                               /* For IOPT compliance, change "text/x-iMelody" to "audio/imelody"
+                                * because few devices(multimedia players) reject the OPP put for text objects
+                                * since they support only multimedia files exchange */
+                               if (!strcasecmp(mime_type, "text/x-iMelody")) {
+                                       strncpy(mime_type, "audio/imelody", BT_MIME_TYPE_MAX_LEN);
+                                       BT_DBG("over writing mime type to  = %s", mime_type);
+                               }
+                               if (!strcasecmp(mime_type, "text/vcard")) {
+                                       strncpy(mime_type, "text/x-vcard", BT_MIME_TYPE_MAX_LEN);
+                                       BT_DBG("over writing mime type to  = %s", mime_type);
+                               }
+               }
 
                BT_DBG("Calling SendFile");
-               ext = strrchr(sending_info->file_name_array[file_offset], '.');
-
-               if (ext != NULL && (!strcmp(ext, ".imy")))
-                       mimetype = g_strdup("audio/imelody");
                g_dbus_proxy_call(client_proxy, "SendFile",
                                g_variant_new("(ss)", sending_info->file_name_array[file_offset],
-                                                               mimetype),
+                                                               mime_type),
                                G_DBUS_CALL_FLAGS_NONE,
                                DBUS_TIEMOUT, NULL,
                                (GAsyncReadyCallback)__bt_send_file_cb,
@@ -554,11 +618,9 @@ void _bt_sending_files(void)
                if (err != NULL) {
                        BT_ERR("Calling SendFile failed: [%s]\n", err->message);
                        g_clear_error(&err);
-                       g_free(mimetype);
                        return;
                }
 
-               g_free(mimetype);
        } else {
                file_offset = 0;
                __bt_sending_release();
@@ -579,9 +641,6 @@ static void __bt_create_session_cb(GDBusProxy *proxy,
        GVariant *param = NULL;
 
        value = g_dbus_proxy_call_finish(proxy, res, &error);
-       if (proxy)
-               g_object_unref(proxy);
-
        if (value) {
                g_variant_get(value, "(o)", &session_path);
                g_variant_unref(value);
@@ -598,6 +657,7 @@ static void __bt_create_session_cb(GDBusProxy *proxy,
                        sending_info->session_path = g_strdup(session_path);
        }
        g_free(session_path);
+       g_object_unref(proxy);
        ret_if(sending_info == NULL);
 
        sending_info->result = result;
@@ -611,10 +671,31 @@ static void __bt_create_session_cb(GDBusProxy *proxy,
 
        if (result != BLUETOOTH_ERROR_NONE) {
                BT_ERR("Calling __bt_sending_release");
-               __bt_sending_release();
+               gboolean ret = __bt_sending_release();
 
                __bt_free_sending_info(sending_info);
                sending_info = NULL;
+
+               if (ret == FALSE) {
+                       BT_DBG("ReleaseSession Not called");
+                       /* Operate remain works */
+                       if (g_slist_length(transfer_list) > 0) {
+                               bt_sending_data_t *data = NULL;
+
+                               data = transfer_list->data;
+                               ret_if(data == NULL);
+
+                               transfer_list = g_slist_remove(transfer_list, data);
+
+                               BT_DBG("calling __bt_opp_client_start_sending");
+
+                               if (__bt_opp_client_start_sending(data->request_id,
+                                               data->address, data->file_path,
+                                               data->file_count) != BLUETOOTH_ERROR_NONE) {
+                                       BT_ERR("Sending Enqueued Transfer Failed");
+                               }
+                       }
+               }
        } else {
                BT_DBG("Calling sending_files");
                _bt_sending_files();
@@ -637,7 +718,7 @@ static int __bt_opp_client_start_sending(int request_id, char *address,
        BT_CHECK_PARAMETER(file_name_array, return);
 
        /* Get the session bus. */
-       g_conn = _bt_get_session_gconn();
+       g_conn = _bt_gdbus_get_session_gconn();
        retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        client_proxy =  g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE,
@@ -678,14 +759,25 @@ static int __bt_opp_client_start_sending(int request_id, char *address,
        _bt_opp_client_event_init();
        //_bt_obex_client_started(agent_path);
 
-       BT_DBG("Going to call CreateSession");
-
-       g_dbus_proxy_call(client_proxy, "CreateSession",
+       BT_DBG("Adapter Status %d", _bt_adapter_get_status());
+       if (_bt_adapter_get_status() == BT_ACTIVATED) {
+               BT_DBG("Going to call CreateSession");
+               g_dbus_proxy_call(client_proxy, "CreateSession",
                                                g_variant_new("(sa{sv})", address, builder),
                                                G_DBUS_CALL_FLAGS_NONE,
                                                DBUS_TIEMOUT, NULL,
                                                (GAsyncReadyCallback)__bt_create_session_cb,
                                                NULL);
+       } else {
+               GVariant *param = g_variant_new("(isi)", BLUETOOTH_ERROR_INTERNAL,
+                               sending_info->address, sending_info->request_id);
+
+               BT_DBG("Address[%s] RequestID[%d]", sending_info->address, sending_info->request_id);
+               _bt_send_event(BT_OPP_CLIENT_EVENT, BLUETOOTH_EVENT_OPC_CONNECTED,
+                                                                       param);
+               __bt_free_sending_info(sending_info);
+               sending_info = NULL;
+       }
        g_variant_builder_unref(builder);
 
        BT_DBG("-");
@@ -720,7 +812,6 @@ int _bt_opp_client_push_files(int request_id, GDBusMethodInvocation *context,
        } else {
                /* Insert data in the queue */
                data = g_malloc0(sizeof(bt_sending_data_t));
-               /* Fix : NULL_RETURNS */
                if (data == NULL)
                        return BLUETOOTH_ERROR_MEMORY_ALLOCATION;
 
@@ -756,6 +847,7 @@ int _bt_opp_client_cancel_push(void)
 
        GError *err = NULL;
        int result = BLUETOOTH_ERROR_CANCEL_BY_USER;
+       GVariant *ret = NULL;
        GVariant *param = NULL;
        retv_if(sending_info == NULL, BLUETOOTH_ERROR_NOT_IN_OPERATION);
 
@@ -764,11 +856,21 @@ int _bt_opp_client_cancel_push(void)
 
        if (sending_info->transfer_info) {
 
-               g_dbus_proxy_call_sync(sending_info->transfer_info->proxy,
+               ret = g_dbus_proxy_call_sync(sending_info->transfer_info->proxy,
                                        "Cancel", NULL,
                                        G_DBUS_CALL_FLAGS_NONE, -1,
                                        NULL, &err);
-               param = g_variant_new("(isti)", result,
+               if (ret == NULL) {
+                       if (err != NULL) {
+                               BT_ERR("Cancel Error: %s\n", err->message);
+                               g_error_free(err);
+                       }
+               } else {
+                       g_variant_unref(ret);
+               }
+
+               param = g_variant_new("(issti)", result,
+                                       sending_info->address,
                                        sending_info->transfer_info->file_name,
                                        sending_info->transfer_info->size,
                                        sending_info->request_id);
@@ -830,7 +932,8 @@ void _bt_opp_client_check_pending_transfer(const char *address)
                sending_info->result = result;
 
                if (!sending_info->is_canceled) {
-                       param = g_variant_new("(isti)", result,
+                       param = g_variant_new("(issti)", result,
+                                               sending_info->address,
                                                sending_info->transfer_info->file_name,
                                                sending_info->transfer_info->size,
                                                sending_info->request_id);
@@ -853,3 +956,38 @@ void _bt_opp_client_check_pending_transfer(const char *address)
        }
        BT_DBG("-");
 }
+
+int _bt_opp_get_client_progress(guint8 *progress)
+{
+       if (sending_info == NULL || sending_info->transfer_info == NULL) {
+               BT_ERR("No Active Outbound transfer");
+               return BLUETOOTH_ERROR_NOT_FOUND;
+       }
+
+       *progress = (int)(((double)sending_info->transfer_info->progress /
+                       sending_info->transfer_info->size) * 100);
+
+       BT_DBG("Percentage: %d", *progress);
+       return BLUETOOTH_ERROR_NONE;
+}
+
+void _bt_cancel_queued_transfers(void)
+{
+       bt_sending_data_t *data = NULL;
+       GVariant *param = NULL;
+
+       BT_INFO("Cancel queued Transfers:: Length of transfer list is %d",
+                                       g_slist_length(transfer_list));
+
+       while (transfer_list) {
+               data = transfer_list->data;
+               param = g_variant_new("(isi)", BLUETOOTH_ERROR_INTERNAL,
+                               data->address, data->request_id);
+
+               BT_DBG("Address[%s] RequestID[%d]", data->address, data->request_id);
+               _bt_send_event(BT_OPP_CLIENT_EVENT, BLUETOOTH_EVENT_OPC_CONNECTED,
+                                                                       param);
+
+               transfer_list = g_slist_remove(transfer_list, data);
+       }
+}
index 46f5254..d69b66a 100644 (file)
@@ -20,9 +20,7 @@
 #include <string.h>
 #include <malloc.h>
 #include <stacktrim.h>
-#if !defined(LIBNOTIFY_SUPPORT) && !defined(LIBNOTIFICATION_SUPPORT)
 #include <syspopup_caller.h>
-#endif
 #include <vconf.h>
 #include <storage.h>
 
@@ -33,7 +31,6 @@
 #include <glib.h>
 #include <gio/gio.h>
 
-#define         PBAP_UUID "0000112f-0000-1000-8000-00805f9b34fb"
 #define         PBAP_OBEX_CLIENT_SERVICE "org.bluez.obex"
 #define         PBAP_OBEX_CLIENT_PATH "/org/bluez/obex"
 #define         PBAP_OBEX_CLIENT_INTERFACE "org.bluez.obex.Client1"
@@ -45,7 +42,7 @@
 #define        PBAP_NUM_OF_FIELDS_ENTRY 29
 #define        PBAP_FIELD_ALL (0xFFFFFFFFFFFFFFFFULL)
 
-#define PBAP_DEFAULT_DOWNLAOD_PATH "/opt/usr/media/Downloads/"
+#define PBAP_DEFAULT_DOWNLAOD_PATH "/opt/usr/home/owner/media/Downloads"
 #define PBAP_DEFAULT_FILE_NAME "pb.vcf"
 
 char *FIELDS[] = {
@@ -112,7 +109,6 @@ char *SEARCH_FIELD[] = {
 
 static char *g_pbap_session_path = NULL;
 static char *g_pbap_server_address = NULL;
-static GDBusConnection *dbus_connection = NULL;
 static GDBusProxy *g_pbap_proxy = NULL;
 
 static struct {
@@ -286,6 +282,8 @@ void __bt_pbap_connect_cb(GDBusProxy *proxy,
                BT_DBG("Session Path = %s\n", g_pbap_session_path);
                result = BLUETOOTH_ERROR_NONE;
                g_pbap_server_address = g_strdup(address_string);
+
+               g_variant_unref(value);
        }
 
        signal = g_variant_new("(is)", result, address_string);
@@ -301,6 +299,7 @@ void __bt_pbap_connect_cb(GDBusProxy *proxy,
 int _bt_pbap_connect(const bluetooth_device_address_t *address)
 {
        BT_DBG("+");
+       GDBusConnection *g_conn;
        GError *error = NULL;
        char address_string[18] = { 0, };
        char *ptr = NULL;
@@ -320,13 +319,12 @@ int _bt_pbap_connect(const bluetooth_device_address_t *address)
 
        _bt_convert_addr_type_to_string(address_string, (unsigned char *)address->addr);
        BT_DBG("Address String: %s", address_string);
-       dbus_connection = _bt_get_session_gconn();
-       if (dbus_connection == NULL) {
-                       BT_ERR("Couldn't connect to system bus");
+       g_conn = _bt_gdbus_get_session_gconn();
+       if (g_conn == NULL) {
+                       BT_ERR("Couldn't connect to session bus");
                        return EXIT_FAILURE;
        }
-
-       g_pbap_proxy =  g_dbus_proxy_new_sync(dbus_connection,
+       g_pbap_proxy =  g_dbus_proxy_new_sync(g_conn,
                        G_DBUS_PROXY_FLAGS_NONE, NULL,
                        PBAP_OBEX_CLIENT_SERVICE, PBAP_OBEX_CLIENT_PATH,
                        PBAP_OBEX_CLIENT_INTERFACE, NULL, &error);
@@ -364,6 +362,7 @@ void __bt_pbap_disconnect_cb(GDBusProxy *proxy,
        char *address_string = user_data;
        GError *error = NULL;
        GVariant *value;
+       int result = BLUETOOTH_ERROR_INTERNAL ;
 
        BT_DBG("Address = %s", address_string);
 
@@ -387,11 +386,22 @@ void __bt_pbap_disconnect_cb(GDBusProxy *proxy,
                g_free(g_pbap_server_address);
                g_pbap_server_address = NULL;
 
+               result = BLUETOOTH_ERROR_NONE;
                selected_path.folder = -1;
                selected_path.type = -1;
+
+               g_variant_unref(value);
        }
 
-       /* PBAP disconnected event will be sent in event reciever */
+       /* If the result is success, the event reciever will send the disconnect event */
+       if (result != BLUETOOTH_ERROR_NONE) {
+               GVariant *signal = NULL;
+
+               signal = g_variant_new("(is)", result, address_string);
+               _bt_send_event(BT_PBAP_CLIENT_EVENT,
+                               BLUETOOTH_PBAP_DISCONNECTED,
+                               signal);
+       }
 
        g_free(address_string);
        BT_DBG("-");
@@ -565,6 +575,8 @@ void __bt_pbap_get_phonebook_cb(GDBusProxy *proxy,
                transfer_info->filename = (char *)filename;
                transfer_info->operation = PULL_ALL;
                transfers = g_slist_append(transfers, transfer_info);
+
+               g_variant_unref(value);
        }
 
        g_object_unref(proxy);
@@ -630,7 +642,7 @@ void __bt_pbap_get_vcard_list_cb(GDBusProxy *proxy,
        }
 
        BT_DBG("Address = %s", address_string);
-       GVariant *temp = g_variant_new_strv((const gchar*)vcard_list, length);
+       GVariant *temp = g_variant_new_strv((const gchar * const *)vcard_list, length);
        signal = g_variant_new("(isv)", result, address_string, temp);
 
        _bt_send_event(BT_PBAP_CLIENT_EVENT,
@@ -747,7 +759,7 @@ void __bt_pbap_search_phonebook_cb(GDBusProxy *proxy,
        BT_DBG("Address = %s", address_string);
 
        signal = g_variant_new("(is@as)", result, address_string,
-                       g_variant_new_strv((const gchar *)vcard_list, length));
+                       g_variant_new_strv((const gchar * const *)vcard_list, length));
 
        _bt_send_event(BT_PBAP_CLIENT_EVENT,
                                BLUETOOTH_PBAP_PHONEBOOK_SEARCH,
@@ -872,6 +884,7 @@ int __bt_pbap_call_get_phonebook(GDBusProxy *proxy, bt_pbap_data_t *pbap_data)
 
        g_free(format_str);
        g_free(order_str);
+       g_free(target_file);
 
        BT_DBG("-");
        return BLUETOOTH_ERROR_NONE;
@@ -940,7 +953,7 @@ int __bt_pbap_call_get_vcard(GDBusProxy *proxy, bt_pbap_data_t *pbap_data)
        char *target_file = NULL;
        char *download_path = NULL;
        char *vcard_handle = NULL;
-       char vcard[10] = { 0, };
+       char vcard[20] = { 0, };
        GVariantBuilder builder;
        GVariantBuilder inner_builder;
        GVariant *filters;
@@ -1020,6 +1033,7 @@ int __bt_pbap_call_get_vcard(GDBusProxy *proxy, bt_pbap_data_t *pbap_data)
 
        g_free(format_str);
        g_free(vcard_handle);
+       g_free(target_file);
 
        BT_DBG("-");
        return BLUETOOTH_ERROR_NONE;
@@ -1074,10 +1088,37 @@ int __bt_pbap_call_search_phonebook(GDBusProxy *proxy, bt_pbap_data_t *pbap_data
        return BLUETOOTH_ERROR_NONE;
 }
 
+int _bt_pbap_is_connected(bluetooth_device_address_t *device_address,
+                                       gboolean *connected)
+{
+       char address_string[18] = { 0, };
+
+       BT_CHECK_PARAMETER(device_address, return);
+       BT_CHECK_PARAMETER(connected, return);
+
+       /* In now, only 1 pbap connection is allowed */
+       if (g_pbap_server_address == NULL) {
+               *connected = FALSE;
+               return 0;
+       }
+
+       _bt_convert_addr_type_to_string(address_string,
+                                                       (unsigned char *)device_address->addr);
+       BT_DBG("Address String: %s", address_string);
+
+       if (g_strcmp0(address_string, g_pbap_server_address) == 0)
+               *connected = TRUE;
+       else
+               *connected = FALSE;
+
+       return 0;
+}
+
 int _bt_pbap_get_phonebook_size(const bluetooth_device_address_t *address,
                int source, int type)
 {
        BT_DBG("+");
+       GDBusConnection *g_conn;
        GDBusProxy *g_pbap_session_proxy = NULL;
        char address_string[18] = { 0, };
        char *source_string = NULL;
@@ -1106,7 +1147,15 @@ int _bt_pbap_get_phonebook_size(const bluetooth_device_address_t *address,
        BT_DBG("Address[%s] Source[%s] Type[%s]",
                        address_string, source_string, type_string);
        BT_DBG("Session Path = %s\n", g_pbap_session_path);
-       g_pbap_session_proxy =  g_dbus_proxy_new_sync(dbus_connection,
+
+       g_conn = _bt_gdbus_get_session_gconn();
+       if (g_conn == NULL) {
+               BT_ERR("Couldn't connect to session bus");
+               g_free(source_string);
+               g_free(type_string);
+               return 0;
+       }
+       g_pbap_session_proxy =  g_dbus_proxy_new_sync(g_conn,
                        G_DBUS_PROXY_FLAGS_NONE, NULL,
                        PBAP_SESSION_SERVICE, g_pbap_session_path,
                        PBAP_SESSION_INTERFACE, NULL, &err);
@@ -1154,6 +1203,7 @@ int _bt_pbap_get_phonebook(const bluetooth_device_address_t *address,
                int source, int type, bt_pbap_pull_parameters_t *app_param)
 {
        BT_DBG("+");
+       GDBusConnection *g_conn;
        GDBusProxy *g_pbap_session_proxy = NULL;
        char address_string[18] = { 0, };
        char *source_string = NULL;
@@ -1186,7 +1236,15 @@ int _bt_pbap_get_phonebook(const bluetooth_device_address_t *address,
                        address_string, source_string, type_string);
 
        BT_DBG("Session Path = %s\n", g_pbap_session_path);
-       g_pbap_session_proxy =  g_dbus_proxy_new_sync(dbus_connection,
+
+       g_conn = _bt_gdbus_get_session_gconn();
+       if (g_conn == NULL) {
+               BT_ERR("Couldn't connect to session bus");
+               g_free(source_string);
+               g_free(type_string);
+               return 0;
+       }
+       g_pbap_session_proxy =  g_dbus_proxy_new_sync(g_conn,
                        G_DBUS_PROXY_FLAGS_NONE, NULL,
                        PBAP_SESSION_SERVICE, g_pbap_session_path,
                        PBAP_SESSION_INTERFACE, NULL, &err);
@@ -1210,6 +1268,8 @@ int _bt_pbap_get_phonebook(const bluetooth_device_address_t *address,
        pbap_data->app_param = param;
 
        if (source ==  selected_path.folder && type == selected_path.type) {
+               g_free(source_string);
+               g_free(type_string);
                return __bt_pbap_call_get_phonebook(g_pbap_session_proxy, pbap_data);
        }
 
@@ -1231,6 +1291,7 @@ int _bt_pbap_get_list(const bluetooth_device_address_t *address, int source,
                int type,  bt_pbap_list_parameters_t *app_param)
 {
        BT_DBG("+");
+       GDBusConnection *g_conn;
        GDBusProxy *g_pbap_session_proxy = NULL;
        char address_string[18] = { 0, };
        char *source_string = NULL;
@@ -1263,7 +1324,15 @@ int _bt_pbap_get_list(const bluetooth_device_address_t *address, int source,
                        address_string, source_string, type_string);
 
        BT_DBG("Session Path = %s\n", g_pbap_session_path);
-       g_pbap_session_proxy =  g_dbus_proxy_new_sync(dbus_connection,
+
+       g_conn = _bt_gdbus_get_session_gconn();
+       if (g_conn == NULL) {
+               BT_ERR("Couldn't connect to session bus");
+               g_free(source_string);
+               g_free(type_string);
+               return 0;
+       }
+       g_pbap_session_proxy =  g_dbus_proxy_new_sync(g_conn,
                        G_DBUS_PROXY_FLAGS_NONE, NULL,
                        PBAP_SESSION_SERVICE, g_pbap_session_path,
                        PBAP_SESSION_INTERFACE, NULL, &err);
@@ -1312,6 +1381,7 @@ int _bt_pbap_pull_vcard(const bluetooth_device_address_t *address,
                int source, int type, bt_pbap_pull_vcard_parameters_t *app_param)
 {
        BT_DBG("+");
+       GDBusConnection *g_conn;
        GDBusProxy *g_pbap_session_proxy = NULL;
        char address_string[18] = { 0, };
        char *source_string = NULL;
@@ -1343,7 +1413,15 @@ int _bt_pbap_pull_vcard(const bluetooth_device_address_t *address,
                        address_string, source_string, type_string);
 
        BT_DBG("Session Path = %s\n", g_pbap_session_path);
-       g_pbap_session_proxy =  g_dbus_proxy_new_sync(dbus_connection,
+
+       g_conn = _bt_gdbus_get_session_gconn();
+       if (g_conn == NULL) {
+               BT_ERR("Couldn't connect to session bus");
+               g_free(source_string);
+               g_free(type_string);
+               return 0;
+       }
+       g_pbap_session_proxy =  g_dbus_proxy_new_sync(g_conn,
                        G_DBUS_PROXY_FLAGS_NONE, NULL,
                        PBAP_SESSION_SERVICE, g_pbap_session_path,
                        PBAP_SESSION_INTERFACE, NULL, &err);
@@ -1354,6 +1432,8 @@ int _bt_pbap_pull_vcard(const bluetooth_device_address_t *address,
                        ERR("Unable to create proxy: %s", err->message);
                        g_clear_error(&err);
                }
+               g_free(source_string);
+               g_free(type_string);
                return -1;
        }
 
@@ -1365,6 +1445,8 @@ int _bt_pbap_pull_vcard(const bluetooth_device_address_t *address,
        pbap_data->app_param = param;
 
        if (source ==  selected_path.folder && type == selected_path.type) {
+               g_free(source_string);
+               g_free(type_string);
                return __bt_pbap_call_get_vcard(g_pbap_session_proxy, pbap_data);
        }
 
@@ -1386,6 +1468,7 @@ int _bt_pbap_phonebook_search(const bluetooth_device_address_t *address,
                int source, int type, bt_pbap_search_parameters_t *app_param)
 {
        BT_DBG("+");
+       GDBusConnection *g_conn;
        GDBusProxy *g_pbap_session_proxy = NULL;
        char address_string[18] = { 0, };
        char *source_string = NULL;
@@ -1418,7 +1501,14 @@ int _bt_pbap_phonebook_search(const bluetooth_device_address_t *address,
 
        BT_DBG("Session Path = %s\n", g_pbap_session_path);
 
-       g_pbap_session_proxy =  g_dbus_proxy_new_sync(dbus_connection,
+       g_conn = _bt_gdbus_get_session_gconn();
+       if (g_conn == NULL) {
+               BT_ERR("Couldn't connect to session bus");
+               g_free(source_string);
+               g_free(type_string);
+               return 0;
+       }
+       g_pbap_session_proxy =  g_dbus_proxy_new_sync(g_conn,
                        G_DBUS_PROXY_FLAGS_NONE, NULL,
                        PBAP_SESSION_SERVICE, g_pbap_session_path,
                        PBAP_SESSION_INTERFACE, NULL, &err);
diff --git a/bt-service/bt-service-proximity.c b/bt-service/bt-service-proximity.c
new file mode 100644 (file)
index 0000000..957bd6f
--- /dev/null
@@ -0,0 +1,385 @@
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <glib.h>
+#include <gio/gio.h>
+#include <dlog.h>
+#include <string.h>
+#include <syspopup_caller.h>
+#include <vconf.h>
+#include <bundle_internal.h>
+
+#include "bluetooth-api.h"
+#include "bt-internal-types.h"
+
+#include "bt-service-common.h"
+#include "bt-service-device.h"
+#include "bt-service-proximity.h"
+
+char *_bt_convert_alert_level_to_string(int value)
+{
+       if (value == BT_PXP_ALERT_MILD)
+               return g_strdup("mild");
+       else if (value == BT_PXP_ALERT_HIGH)
+               return g_strdup("high");
+       else
+               return g_strdup("none");
+}
+
+int _bt_convert_string_to_alert_level(const char *str)
+{
+       if (g_strcmp0("high", str) == 0)
+               return BT_PXP_ALERT_HIGH;
+       else if (g_strcmp0("mild", str) == 0)
+               return BT_PXP_ALERT_MILD;
+
+       return BT_PXP_ALERT_NONE;
+}
+
+char *_bt_convert_property_to_string(int value)
+{
+       if (value == BT_PXP_PROPERTY_LLS)
+               return g_strdup("LinkLossAlertLevel");
+       else if (value == BT_PXP_PROPERTY_IAS)
+               return g_strdup("ImmediateAlertLevel");
+       else if (value == BT_PXP_PROPERTY_TX_POWER)
+               return g_strdup("SignalLevel");
+
+       return NULL;
+}
+
+int bt_set_proximity_property(bluetooth_device_address_t *device_address,
+               unsigned int property, int alert_level)
+{
+       GDBusProxy *proxy;
+       char address[BT_ADDRESS_STRING_SIZE] = { 0 };
+
+       GDBusConnection *conn;
+       char *device_path = NULL;
+       GError *error = NULL;
+       GVariant *ret = NULL;
+       char *value_str = NULL;
+       char *property_str = NULL;
+
+       BT_CHECK_PARAMETER(device_address, return);
+
+       conn = _bt_gdbus_get_system_gconn();
+       retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       _bt_convert_addr_type_to_string(address, device_address->addr);
+
+       device_path = _bt_get_device_object_path(address);
+
+       if (device_path == NULL) {
+               return BLUETOOTH_ERROR_NOT_CONNECTED;
+       } else {
+               BT_INFO("device_path is created[%s]", device_path);
+       }
+
+       value_str = _bt_convert_alert_level_to_string(alert_level);
+       property_str =_bt_convert_property_to_string(property);
+
+       if (value_str == NULL || property_str == NULL) {
+               g_free(property_str);
+               g_free(value_str);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+                                                       NULL, BT_BLUEZ_NAME,
+                                                       device_path, BT_PROPERTIES_INTERFACE,  NULL, NULL);
+
+       g_free(device_path);
+       retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       ret = g_dbus_proxy_call_sync(proxy, "Set",
+                               g_variant_new("(ssv)", BT_PROXIMITY_MONITOR_INTERFACE,  property_str, g_variant_new("s", value_str)),
+                               G_DBUS_CALL_FLAGS_NONE,
+                               -1,
+                               NULL,
+                               &error);
+       if (ret)
+               g_variant_unref(ret);
+       g_object_unref(proxy);
+       g_free(property_str);
+       g_free(value_str);
+
+       if (error) {
+                BT_ERR("SetProperty error: [%s]", error->message);
+                g_error_free(error);
+                return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+int bt_get_proximity_property(bluetooth_device_address_t *device_address,
+               unsigned int property, int *alert_level)
+{
+       GDBusProxy *proxy;
+       char address[BT_ADDRESS_STRING_SIZE] = { 0 };
+       GDBusConnection *conn;
+       char *device_path = NULL;
+       GError *error = NULL;
+       GVariant *result = NULL;
+       GVariant *tmp_value;
+       GVariant *value;
+       char *value_str = NULL;
+       char *property_str = NULL;
+
+       BT_CHECK_PARAMETER(device_address, return);
+
+       conn = _bt_gdbus_get_system_gconn();
+       retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       _bt_convert_addr_type_to_string(address, device_address->addr);
+
+       device_path = _bt_get_device_object_path(address);
+
+       if (device_path == NULL) {
+               return BLUETOOTH_ERROR_NOT_CONNECTED;
+       } else {
+               BT_INFO("device_path is created[%s]", device_path);
+       }
+
+       property_str = _bt_convert_property_to_string(property);
+
+       if (property_str == NULL)
+               return BLUETOOTH_ERROR_INTERNAL;
+
+       proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+                                                       NULL, BT_BLUEZ_NAME,
+                                                       device_path, BT_PROPERTIES_INTERFACE,  NULL, NULL);
+
+       g_free(device_path);
+       retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       result = g_dbus_proxy_call_sync(proxy, "GetAll",
+                       g_variant_new("(s)", BT_PROXIMITY_MONITOR_INTERFACE),
+                       G_DBUS_CALL_FLAGS_NONE,
+                       -1,
+                       NULL,
+                       &error);
+       if (result == NULL) {
+               if (error != NULL) {
+                       BT_ERR("Error occured in Proxy call [%s]\n", error->message);
+                       g_error_free(error);
+               }
+               g_object_unref(proxy);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+       g_variant_get(result , "(@a{sv})", &value);
+       g_variant_unref(result);
+
+       tmp_value = g_variant_lookup_value(value, property_str, G_VARIANT_TYPE_STRING);
+       if (tmp_value == NULL) {
+               g_object_unref(proxy);
+               g_variant_unref(value);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       value_str = (char *)g_variant_get_string(tmp_value, NULL);
+       if (value_str)
+               *alert_level = _bt_convert_string_to_alert_level(value_str);
+
+       g_variant_unref(tmp_value);
+       g_variant_unref(value);
+       g_object_unref(proxy);
+       g_free(property_str);
+       g_free(value_str);
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+int bt_get_proximity_supported_services(bluetooth_device_address_t *device_address,
+               unsigned int *supported_services)
+{
+       GDBusProxy *proxy;
+       char address[BT_ADDRESS_STRING_SIZE] = { 0 };
+
+       GDBusConnection *conn;
+       char *device_path = NULL;
+       GError *error = NULL;
+       GVariant *result = NULL;
+       GVariant *tmp_value;
+       GVariant *value;
+
+       BT_CHECK_PARAMETER(device_address, return);
+
+       conn = _bt_gdbus_get_system_gconn();
+       retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       _bt_convert_addr_type_to_string(address, device_address->addr);
+
+       device_path = _bt_get_device_object_path(address);
+
+       if (device_path == NULL) {
+               return BLUETOOTH_ERROR_NOT_CONNECTED;
+       } else {
+               BT_INFO("device_path is created[%s]", device_path);
+       }
+
+       proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+                                                       NULL, BT_BLUEZ_NAME,
+                                                       device_path, BT_PROPERTIES_INTERFACE,  NULL, NULL);
+
+       g_free(device_path);
+       retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       result = g_dbus_proxy_call_sync(proxy, "GetAll",
+                       g_variant_new("(s)", BT_PROXIMITY_MONITOR_INTERFACE),
+                       G_DBUS_CALL_FLAGS_NONE,
+                       -1,
+                       NULL,
+                       &error);
+       if (result == NULL) {
+               if (error != NULL) {
+                       BT_ERR("Error occured in Proxy call [%s]\n", error->message);
+                       g_error_free(error);
+               }
+               g_object_unref(proxy);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+       g_variant_get(result , "(@a{sv})", &value);
+       g_variant_unref(result);
+
+       *supported_services = 0;
+       tmp_value = g_variant_lookup_value(value, "LinkLossAlertLevel", G_VARIANT_TYPE_STRING);
+       if (tmp_value == NULL) {
+               g_object_unref(proxy);
+               g_variant_unref(value);
+               return BLUETOOTH_ERROR_INTERNAL;
+       } else {
+               *supported_services |= BT_PXP_PROPERTY_LLS;
+               g_variant_unref(tmp_value);
+       }
+
+       tmp_value = g_variant_lookup_value(value, "ImmediateAlertLevel", G_VARIANT_TYPE_STRING);
+       if (tmp_value == NULL) {
+               if (*supported_services == 0) {
+                       g_object_unref(proxy);
+                       g_variant_unref(value);
+                       return BLUETOOTH_ERROR_INTERNAL;
+               }
+       } else {
+               *supported_services |= BT_PXP_PROPERTY_IAS;
+               g_variant_unref(tmp_value);
+       }
+
+       tmp_value = g_variant_lookup_value(value, "SignalLevel", G_VARIANT_TYPE_STRING);
+       if (tmp_value == NULL) {
+               if (*supported_services == 0) {
+                       g_object_unref(proxy);
+                       g_variant_unref(value);
+                       return BLUETOOTH_ERROR_INTERNAL;
+               }
+       } else {
+               *supported_services |= BT_PXP_PROPERTY_TX_POWER;
+               g_variant_unref(tmp_value);
+       }
+
+       g_variant_unref(value);
+       g_object_unref(proxy);
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+int bt_register_proximity_reporter()
+{
+       GDBusProxy *proxy;
+
+       GDBusConnection *conn;
+       char *adapter_path = NULL;
+       GError *error = NULL;
+       GVariant *result = NULL;
+
+       conn = _bt_gdbus_get_system_gconn();
+       retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       adapter_path = _bt_get_adapter_path();
+       if (adapter_path == NULL) {
+               BT_ERR("Could not get adapter path\n");
+               return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
+       }
+
+       BT_INFO("Adapter path %s", adapter_path);
+
+       proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+                                       NULL, BT_BLUEZ_NAME, adapter_path,
+                                       BT_PROXIMITY_REPORTER_INTERFACE, NULL, NULL);
+
+       g_free(adapter_path);
+       retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       result = g_dbus_proxy_call_sync(proxy, "RegisterProximity",
+                       NULL, G_DBUS_CALL_FLAGS_NONE, -1,
+                       NULL, &error);
+       if (result == NULL) {
+               if (error != NULL) {
+                       BT_ERR("Error occured in Proxy call [%s]\n", error->message);
+                       g_error_free(error);
+               }
+               g_object_unref(proxy);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+       g_object_unref(proxy);
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+int bt_unregister_proximity_reporter()
+{
+       GDBusProxy *proxy;
+
+       GDBusConnection *conn;
+       char *adapter_path = NULL;
+       GError *error = NULL;
+       GVariant *result = NULL;
+
+       conn = _bt_gdbus_get_system_gconn();
+       retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       adapter_path = _bt_get_adapter_path();
+       if (adapter_path == NULL) {
+               BT_ERR("Could not get adapter path\n");
+               return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
+       }
+
+       BT_INFO("Adapter path %s", adapter_path);
+
+       proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+                                       NULL, BT_BLUEZ_NAME, adapter_path,
+                                       BT_PROXIMITY_REPORTER_INTERFACE, NULL, NULL);
+
+       g_free(adapter_path);
+       retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       result = g_dbus_proxy_call_sync(proxy, "UnregisterProximity",
+                       NULL, G_DBUS_CALL_FLAGS_NONE, -1,
+                       NULL, &error);
+       if (result == NULL) {
+               if (error != NULL) {
+                       BT_ERR("Error occured in Proxy call [%s]\n", error->message);
+                       g_error_free(error);
+               }
+               g_object_unref(proxy);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+       g_object_unref(proxy);
+
+       return BLUETOOTH_ERROR_NONE;
+}
index 82cba5c..ad82518 100755 (executable)
@@ -139,11 +139,10 @@ int _bt_rfcomm_server_check_existence(gboolean *existence)
 {
        BT_CHECK_PARAMETER(existence, return);
 
-       if (server_list && g_slist_length(server_list) > 0) {
+       if (server_list && g_slist_length(server_list) > 0)
                *existence = TRUE;
-       } else {
+       else
                *existence = FALSE;
-       }
 
        return BLUETOOTH_ERROR_NONE;
 }
@@ -161,9 +160,9 @@ int _bt_rfcomm_server_check_termination(char *name)
                if (server_info == NULL)
                        continue;
 
-               if (g_strcmp0(server_info->sender, name) == 0) {
+               if (g_strcmp0(server_info->sender, name) == 0)
                        _bt_rfcomm_remove_socket(server_info->control_fd);
-               }
+
        }
 
        return BLUETOOTH_ERROR_NONE;
old mode 100755 (executable)
new mode 100644 (file)
index 1e2008b..6c79a6e
@@ -52,8 +52,11 @@ typedef enum {
 
 typedef struct {
        char *addr;
+       int addr_type;
+       int rssi;
        int data_len;
        char *data;
+       guint timer_id;
 } bt_le_adv_info_t;
 
 int _bt_service_adapter_le_init(void);
@@ -76,6 +79,8 @@ int _bt_set_advertising(const char *sender, int adv_handle, gboolean enable, gbo
 
 int _bt_set_custom_advertising(const char *sender, int adv_handle, gboolean enable, bluetooth_advertising_params_t *params, gboolean use_reserved_slot);
 
+int _bt_hold_current_advertising(void);
+
 int _bt_get_advertising_data(bluetooth_advertising_data_t *adv, int *length);
 
 int _bt_set_advertising_data(const char *sender, int adv_handle, bluetooth_advertising_data_t *data, int length, gboolean use_reserved_slot);
@@ -86,6 +91,8 @@ int _bt_set_scan_response_data(const char *sender, int adv_handle, bluetooth_sca
 
 int _bt_set_scan_parameters(bluetooth_le_scan_params_t *params);
 
+gboolean _bt_is_scan_filter_supported(void);
+
 int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *filter, int *slot_id);
 
 int _bt_unregister_scan_filter(const char *sender, int slot_id);
@@ -108,6 +115,8 @@ bt_le_scan_type_t _bt_get_le_scan_type(void);
 
 void _bt_send_scan_result_event(const bt_remote_le_dev_info_t *le_dev_info, const bt_le_adv_info_t *adv_info);
 
+void _bt_send_ibeacon_scan_result_event(const bt_remote_ibeacon_dev_info_t *ibeacon_dev_info);
+
 int _bt_add_white_list(bluetooth_device_address_t *device_address, bluetooth_device_address_type_t address_type);
 
 int _bt_remove_white_list(bluetooth_device_address_t *device_address, bluetooth_device_address_type_t address_type);
@@ -138,8 +147,6 @@ void _bt_send_char_value_changed_event(void *param);
 
 gboolean _bt_is_set_scan_parameter(void);
 
-void _bt_register_adv_slot_owner(const char *sender, int adv_handle, int slot_id);
-
 void _bt_unregister_adv_slot_owner(int slot_id);
 
 #ifdef __cplusplus
old mode 100755 (executable)
new mode 100644 (file)
index e206845..1787cc5
@@ -22,6 +22,7 @@
 #include <glib.h>
 #include <sys/types.h>
 #include "bluetooth-api.h"
+#include "alarm.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -41,8 +42,16 @@ typedef enum {
        BT_LE_DEACTIVATING,
 } bt_le_status_t;
 
+int _bt_adapter_request_delayed(int function);
+
+int _bt_enable_adapter_check_status(void);
+
 int _bt_enable_adapter(void);
 
+int _bt_disable_adapter_check_status(void);
+
+void _bt_keep_bt_status_vconf(void);
+
 int _bt_disable_adapter(void);
 
 int _bt_recover_adapter(void);
@@ -53,6 +62,8 @@ int _bt_disable_adapter_le(void);
 
 int _bt_reset_adapter(void);
 
+void _bt_set_bluetooth_status(void);
+
 int _bt_enable_core(void);
 
 void _bt_handle_adapter_added(void);
@@ -67,6 +78,8 @@ void _bt_service_register_vconf_handler(void);
 
 void _bt_service_unregister_vconf_handler(void);
 
+gboolean _bt_is_deactivated_by_flight_ps_mode(void);
+
 void _bt_set_discovery_status(gboolean mode);
 
 int _bt_get_local_address(bluetooth_device_address_t *local_address);
@@ -95,9 +108,13 @@ int _bt_cancel_discovery(void);
 
 int _bt_get_bonded_devices(GArray **dev_list);
 
+int _bt_get_profile_connected_devices(char *profile_uuid, GArray **addr_list);
+
 int _bt_get_bonded_device_info(bluetooth_device_address_t *device_address,
                                bluetooth_device_info_t *dev_info);
 
+int _bt_is_alias_set(bluetooth_device_address_t *device_address, gboolean *is_alias_set);
+
 int _bt_get_timeout_value(int *timeout);
 
 gboolean _bt_is_discovering(void);
@@ -126,6 +143,12 @@ void _bt_adapter_set_le_status(bt_le_status_t status);
 
 bt_le_status_t _bt_adapter_get_le_status(void);
 
+void _bt_adapter_set_vconf_status(gboolean enable);
+
+void _bt_set_booting_time_flag(gboolean flag);
+
+void _bt_set_le_intended_status(gboolean value);
+
 void _bt_adapter_start_enable_timer(void);
 
 void _bt_adapter_start_le_enable_timer(void);
@@ -136,12 +159,26 @@ void _bt_set_le_disabled(int result);
 
 int _bt_set_le_privacy(gboolean set_privacy);
 
+int _bt_set_le_static_random_address(gboolean is_enable);
+
 int _bt_set_manufacturer_data(bluetooth_manufacturer_data_t *m_data);
 
-int __bt_disable_cb(void);
+void _bt_start_log_dump(const char *path);
+
+int _bt_disable_cb(void);
 
 int _bt_get_enable_timer_id(void);
 
+void _bt_force_hci_dump(int timeout);
+
+typedef int (*bt_set_alarm_cb) (alarm_id_t alarm_id, void* user_param);
+
+int _bt_service_set_alarm(int timeout, bt_set_alarm_cb call_back,
+                               void *user_data, alarm_id_t *alarm_id);
+
+int _bt_service_remove_alarm(alarm_id_t alarm_id);
+
+gint compare_alarm(gconstpointer list_data, gconstpointer data);
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
old mode 100755 (executable)
new mode 100644 (file)
index d1ade4f..54716d2
@@ -30,7 +30,7 @@
 
 #define BT_MAX_EVENT_STR_LENGTH        50
 
-#ifndef TIZEN_WEARABLE
+#ifndef TIZEN_PROFILE_WEARABLE
 #define BT_FILE_VISIBLE_TIME "file/private/libug-setting-bluetooth-efl/visibility_time"
 #endif
 
@@ -89,7 +89,11 @@ int _bt_agent_reply_cancellation(void);
 
 int _bt_launch_system_popup(bt_agent_event_type_t event_type,
                                                        const char *device_name,
+                                                       const unsigned char *auth_info,
                                                        char *passkey,
                                                        const char *filename,
                                                        const char *agent_path);
+
+int _bt_set_passkey_notification(const char *sender, gboolean enable);
+
 #endif
old mode 100755 (executable)
new mode 100644 (file)
index a1ce381..8bc9875
@@ -33,7 +33,6 @@ typedef struct {
        int disconnection_type;
        char *address;
        gboolean ag_flag;
-       GArray **out_param1;
 } bt_headset_wait_t;
 
 typedef struct {
@@ -51,7 +50,6 @@ typedef struct {
        int req_id;
        char *address;
        bt_pending_request_t  pending;
-       GArray **out_param;
        int type;
 } bt_audio_function_data_t;
 
@@ -60,7 +58,8 @@ typedef enum {
        BT_AUDIO_A2DP,
        BT_AUDIO_ALL,
        BT_AVRCP,
-       BT_AUDIO_A2DP_SOURCE
+       BT_AUDIO_A2DP_SOURCE,
+       BT_AVRCP_TARGET
 } bt_audio_type_t;
 
 typedef enum {
@@ -74,21 +73,27 @@ typedef enum {
 #define BT_CONTENT_PROTECTION_PATH "/org/tizen/bluetooth/a2dpcontentprotection"
 #define BT_CONTENT_PROTECTION_INTERFACE "org.tizen.bluetooth.A2dpContentProtection"
 
+#ifdef TIZEN_BT_A2DP_SINK_AUTO_CONNECT
+#define BT_AUTO_CONNECT_TIMEOUT_AFTER_BT_ACTIVATED 2     /* 2 sec */
+#define BT_AUTO_CONNECT_TIMEOUT_AFTER_LINKLOSS 30     /* 30 sec */
+#define BT_AUTO_CONNECT_TIMEOUT_RETRY_TIME 3600     /* 60 minute */
+#endif
+
 int _bt_audio_connect(int request_id, int type,
                bluetooth_device_address_t *device_address,
-               GArray **out_param1);
+               GArray *out_param1);
 
 int _bt_audio_disconnect(int request_id, int type,
                bluetooth_device_address_t *device_address,
-               GArray **out_param1);
+               GArray *out_param1);
 
 int _bt_hf_connect(int request_id,
                bluetooth_device_address_t *device_address,
-               GArray **out_param1);
+               GArray *out_param1);
 
 int _bt_hf_disconnect(int request_id,
                bluetooth_device_address_t *device_address,
-               GArray **out_param1);
+               GArray *out_param1);
 
 int _bt_audio_get_speaker_gain(unsigned int *gain);
 
@@ -117,6 +122,14 @@ void _bt_audio_check_pending_connect();
 
 gboolean _bt_is_service_connected(char *address, int type);
 
+#ifdef TIZEN_BT_A2DP_SINK_AUTO_CONNECT
+int _bt_audio_start_auto_connect(gboolean linkloss_flag);
+
+int _bt_audio_stop_auto_connect(void);
+
+void _bt_audio_set_auto_connect_device_addr(const char *address);
+#endif
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
old mode 100755 (executable)
new mode 100644 (file)
index 40d7e38..2753d13
@@ -48,12 +48,22 @@ extern "C" {
 #define LOG_COLOR_BLUE          "\033[36m"
 #define LOG_COLOR_PURPLE   "\033[35m"
 
+
+#ifndef TIZEN_TV
+#define BT_DBG(fmt, args...) \
+       SLOGD(fmt, ##args)
+#define BT_INFO(fmt, args...) \
+       SLOGI(fmt, ##args)
+#define BT_ERR(fmt, args...) \
+       SLOGE(fmt, ##args)
+#else
 #define BT_DBG(fmt, args...) \
-        SLOGD(fmt, ##args)
+       LOGI(fmt, ##args)
 #define BT_INFO(fmt, args...) \
-        SLOGI(fmt, ##args)
+       LOGI(fmt, ##args)
 #define BT_ERR(fmt, args...) \
-        SLOGE(fmt, ##args)
+       LOGE(fmt, ##args)
+#endif
 
 #define BT_INFO_C(fmt, arg...) \
        SLOGI_IF(TRUE,  LOG_COLOR_GREEN" "fmt" "LOG_COLOR_RESET, ##arg)
@@ -61,6 +71,7 @@ extern "C" {
        SLOGI_IF(TRUE,  LOG_COLOR_RED" "fmt" "LOG_COLOR_RESET, ##arg)
 
 #define DBG_SECURE(fmt, args...) SECURE_SLOGD(fmt, ##args)
+#define INFO_SECURE(fmt, args...) SECURE_SLOGI(fmt, ##args)
 #define ERR_SECURE(fmt, args...) SECURE_SLOGE(fmt, ##args)
 
 #define ret_if(expr) \
@@ -104,6 +115,8 @@ extern "C" {
 #endif
 #define BT_DISCOVERY_FINISHED_DELAY 200
 
+#define BT_SESSION_BUS_GET_TIMEOUT 200 /* 200 ms */
+
 #define MANAGER_EVENT_MATCH_RULE \
                        "type='signal'," \
                        "interface='%s'," \
@@ -121,6 +134,8 @@ extern "C" {
                        "the reply timeout expired, or the network connection " \
                        "was broken."
 
+#define BT_DBUS_TIMEOUT_MESSAGE "Timeout was reached"
+
 #define BT_BLUEZ_NAME "org.bluez"
 
 #define BT_BLUEZ_PATH "/org/bluez"
@@ -160,10 +175,11 @@ extern "C" {
 #define BT_OBEXD_MANAGER_INTERFACE "org.openobex.Manager"
 #define BT_OBEXD_TRANSFER_INTERFACE "org.openobex.Transfer"
 #define BT_A2DP_SOURCE_INTERFACE "org.bluez.AudioSource"
+#define BT_PROXIMITY_MONITOR_INTERFACE "org.bluez.ProximityMonitor1"
+#define BT_PROXIMITY_REPORTER_INTERFACE "org.bluez.ProximityReporter1"
 
 #define BT_PROPERTIES_INTERFACE "org.freedesktop.DBus.Properties"
 
-
 #define BT_OBEX_SERVICE_NAME "org.bluez.obex"
 #define BT_OBEX_CLIENT_PATH "/org/bluez/obex"
 #define BT_OBEX_CLIENT_INTERFACE "org.bluez.obex.Client1"
@@ -183,6 +199,15 @@ extern "C" {
 #define BT_FREEDESKTOP_PATH "/org/freedesktop/DBus"
 
 
+#define BT_DUMP_SERVICE_NAME "org.tizen.system.dumpservice"
+#define BT_DUMP_SERVICE_PATH "/Org/Tizen/System/DumpService"
+#define BT_DUMP_SERVICE_INTERFACE BT_DUMP_SERVICE_NAME
+
+#define BT_DUMP_SERVICE_SIGNAL "Dump"
+#define BT_DUMP_SERVICE_START_SIGNAL "Start"
+#define BT_DUMP_SERVICE_FINISH_SIGNAL "Finish"
+
+
 #define BT_INTERFACES_ADDED "InterfacesAdded"
 #define BT_INTERFACES_REMOVED "InterfacesRemoved"
 #define BT_NAME_OWNER_CHANGED "NameOwnerChanged"
@@ -198,29 +223,30 @@ extern "C" {
 /* UUID */
 #define GENERIC_AUDIO_UUID      "00001203-0000-1000-8000-00805f9b34fb"
 
-#define OBEX_OPP_UUID          "00001105-0000-1000-8000-00805f9b34fb"
-
-#define HSP_HS_UUID             "00001108-0000-1000-8000-00805f9b34fb"
-#define HSP_AG_UUID             "00001112-0000-1000-8000-00805f9b34fb"
+#define AVRCP_TARGET_UUID       "0000110c-0000-1000-8000-00805f9b34fb"
+#define AVRCP_REMOTE_UUID       "0000110e-0000-1000-8000-00805f9b34fb"
+#define ADVANCED_AUDIO_UUID     "0000110d-0000-1000-8000-00805f9b34fb"
+#define A2DP_SINK_UUID          "0000110b-0000-1000-8000-00805f9b34fb"
+#define A2DP_SOURCE_UUID        "0000110a-0000-1000-8000-00805f9b34fb"
 
 #define HFP_HS_UUID             "0000111e-0000-1000-8000-00805f9b34fb"
 #define HFP_AG_UUID             "0000111f-0000-1000-8000-00805f9b34fb"
 
-#define ADVANCED_AUDIO_UUID     "0000110d-0000-1000-8000-00805f9b34fb"
-
-#define A2DP_SOURCE_UUID        "0000110a-0000-1000-8000-00805f9b34fb"
-#define A2DP_SINK_UUID          "0000110b-0000-1000-8000-00805f9b34fb"
-
-#define AVRCP_REMOTE_UUID       "0000110e-0000-1000-8000-00805f9b34fb"
-#define AVRCP_TARGET_UUID       "0000110c-0000-1000-8000-00805f9b34fb"
+#define HSP_HS_UUID             "00001108-0000-1000-8000-00805f9b34fb"
+#define HSP_AG_UUID             "00001112-0000-1000-8000-00805f9b34fb"
 
+#define RFCOMM_UUID_STR                        "00000003-0000-1000-8000-00805f9b34fb"
+#define HID_DEVICE_UUID                        "00001124-0000-1000-8000-00805f9b43bf"
 #define HID_UUID                "00001124-0000-1000-8000-00805f9b34fb"
+#define PANU_UUID                              "00001115-0000-1000-8000-00805f9b34fb"
+#define NAP_UUID                               "00001116-0000-1000-8000-00805f9b34fb"
 #define PNP_UUID                "00001200-0000-1000-8000-00805f9b34fb"
-#define RFCOMM_UUID_STR                "00000003-0000-1000-8000-00805f9b34fb"
-#define PANU_UUID              "00001115-0000-1000-8000-00805f9b34fb"
-#define NAP_UUID               "00001116-0000-1000-8000-00805f9b34fb"
-#define OBEX_PSE_UUID          "0000112f-0000-1000-8000-00805f9b34fb"
-#define GATT_UUID              "00001801-0000-1000-8000-00805f9b34fb"
+#define PBAP_UUID               "0000112f-0000-1000-8000-00805f9b34fb"
+
+#define OBEX_OPP_UUID                  "00001105-0000-1000-8000-00805f9b34fb"
+#define OBEX_PSE_UUID                  "0000112f-0000-1000-8000-00805f9b34fb"
+
+#define GATT_UUID                              "00001801-0000-1000-8000-00805f9b34fb"
 
 /* Privilege */
 #define BT_PRIVILEGE_PUBLIC "http://tizen.org/privilege/bluetooth"
@@ -263,6 +289,7 @@ typedef enum {
        BT_PROFILE_CONN_GATT = 0x40,
        BT_PROGILE_CONN_NAP = 0x80,
        BT_PROFILE_CONN_A2DP_SINK = 0x100,
+       BT_PROFILE_CONN_PBAP = 0x200,
        BT_PROFILE_CONN_ALL = 0xffffffff,
 } bt_profile_type_t;
 
@@ -277,6 +304,19 @@ typedef struct {
 } bt_remote_le_dev_info_t;
 
 typedef struct {
+       char *address;
+       int addr_type;
+       int rssi;
+       int adv_type;
+       int company_id;
+       int ibeacon_type;
+       int major_id;
+       int minor_id;
+       int measured_power;
+       char *uuid;
+} bt_remote_ibeacon_dev_info_t;
+
+typedef struct {
        int rssi;
        int class;
        char *address;
@@ -286,6 +326,7 @@ typedef struct {
        gboolean paired;
        bluetooth_connected_link_t connected;
        gboolean trust;
+       gboolean is_alias_set;
        char *manufacturer_data;
        int manufacturer_data_len;
        guchar addr_type;
@@ -309,11 +350,9 @@ typedef struct {
        char *address;
 } bt_function_data_t;
 
-GDBusConnection *_bt_get_system_conn(void);
+GDBusConnection *_bt_gdbus_get_system_gconn(void);
 
-GDBusConnection *_bt_get_system_gconn(void);
-
-GDBusConnection *_bt_get_session_gconn(void);
+GDBusConnection *_bt_gdbus_get_session_gconn(void);
 
 void *_bt_get_net_conn(void);
 
@@ -343,6 +382,9 @@ void _bt_convert_device_path_to_address(const char *device_path,
 void _bt_convert_addr_string_to_type(unsigned char *addr,
                                        const char *address);
 
+void _bt_convert_addr_string_to_secure_string(char *addr,
+                                       const char *address);
+
 void _bt_convert_addr_type_to_string(char *address,
                                unsigned char *addr);
 
@@ -378,6 +420,10 @@ void _bt_deinit_bluez_proxy(void);
 
 int _bt_eventsystem_set_value(const char *event, const char *key, const char *value);
 
+void __bt_get_auth_info(GVariant *reply,  char *auth_info);
+
+int _bt_convert_gerror(GError *g_error);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
old mode 100755 (executable)
new mode 100644 (file)
index caf2553..5391e22
@@ -74,19 +74,22 @@ void _bt_set_autopair_status_in_bonding_info(gboolean is_autopair);
 
 bt_remote_dev_info_t *_bt_get_remote_device_info(char *address);
 
+bt_remote_dev_info_t *_bt_get_remote_device_info_by_object_path(const char *object_path);
+
 char *_bt_get_bonded_device_name(char *address);
 
 gboolean _bt_is_bonding_device_address(const char *address);
 
-int _bt_connect_le_device(int request_id,
-               const bluetooth_device_address_t *bd_addr,
+void _bt_pending_connect_le_device(void);
+
+int _bt_connect_le_device(int req_id, const bluetooth_device_address_t *bd_addr,
                gboolean auto_connect);
 
-int _bt_disconnect_le_device(int request_id,
+int _bt_disconnect_le_device(int req_id,
                const bluetooth_device_address_t *bd_addr);
 
 int _bt_le_conn_update(unsigned char *device_address,
-                               guint16 interval_min, guint16 interval_max,
+                               float interval_min, float interval_max,
                                guint16 latency, guint16 time_out);
 
 int _bt_get_le_connection_parameter(bluetooth_le_connection_mode_t mode,
@@ -97,6 +100,30 @@ int _bt_connect_profile(char *address, char *uuid,
 
 int _bt_disconnect_profile(char *address, char *uuid,
                                                void *cb, gpointer func_data);
+
+int _bt_request_att_mtu(int request_id, bluetooth_device_address_t *device_address,
+                                                               unsigned int mtu);
+
+int _bt_get_att_mtu(bluetooth_device_address_t *device_address,
+                                                               unsigned int *mtu);
+
+int _bt_get_device_ida(bluetooth_device_address_t *device_address,
+                                                       bluetooth_device_address_t *id_address);
+
+int _bt_set_trust_profile(bluetooth_device_address_t *bd_addr,
+               bluetooth_trusted_profile_t profile, gboolean trust);
+
+int _bt_get_trust_profile(bluetooth_device_address_t *bd_addr,
+               bluetooth_trusted_profile_t profile, guint *trust);
+
+int _bt_set_restrict_profile(bluetooth_device_address_t *bd_addr,
+               bluetooth_restricted_profile_t profile, gboolean restricted);
+
+int _bt_get_restrict_profile(bluetooth_device_address_t *bd_addr,
+               bluetooth_restricted_profile_t profile, guint *restricted);
+
+bluetooth_trusted_profile_t _bt_get_trusted_profile_enum(const char *uuid);
+
 int _bt_connect_le_ipsp_device(const bluetooth_device_address_t *bd_addr);
 
 int _bt_disconnect_le_ipsp_device(const bluetooth_device_address_t *bd_addr);
index 30e10ee..6f67ce4 100644 (file)
@@ -24,7 +24,7 @@
 #include "bluetooth-api.h"
 
 #ifdef __cplusplus
- extern "C" {
+extern "C" {
 #endif
 
 
  * @brief DPM BT allowance state
  * @see
  */
- typedef enum {
-        DPM_BT_ERROR    = -1,   /**< bluetooth allowance error */
-        DPM_BT_ALLOWED,                 /**< bluetooth allowance allowed */
-        DPM_BT_HANDSFREE_ONLY,  /**< bluetooth allowance handsfree only */
-        DPM_BT_RESTRICTED,      /**< bluetooth allowance restricted */
- } dpm_bt_allow_t;
+typedef enum {
+       DPM_BT_ERROR     = -1,   /**< bluetooth allowance error */
+       DPM_BT_ALLOWED,          /**< bluetooth allowance allowed */
+       DPM_BT_HANDSFREE_ONLY,  /**< bluetooth allowance handsfree only */
+       DPM_BT_RESTRICTED,       /**< bluetooth allowance restricted */
+} dpm_bt_allow_t;
 
  /**
  * @brief DPM API result
old mode 100755 (executable)
new mode 100644 (file)
index 3d9ad98..1a4cd75
@@ -42,6 +42,8 @@ int _bt_send_hf_local_term_event(char *address);
 int _bt_init_hf_local_term_event_sender(void);
 void _bt_deinit_hf_local_term_event_sender(void);
 
+int _bt_send_dump_signal(char *signal);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
old mode 100755 (executable)
new mode 100644 (file)
index d27e82d..c31851d
@@ -70,7 +70,6 @@ typedef enum {
 struct _GapAgentPrivate {
        gchar *busname;
        gchar *path;
-       GDBusProxy *adapter;
 
        GDBusProxy *agent_manager;
 
@@ -78,6 +77,7 @@ struct _GapAgentPrivate {
 
        GapAgentExecType exec_type;
        GDBusMethodInvocation *reply_context;
+       char *uuid;
 
        char pairing_addr[18];
        char authorize_addr[18];
old mode 100755 (executable)
new mode 100644 (file)
index ce3d0dd..c945acc
@@ -33,6 +33,8 @@ int _bt_hid_connect(int request_id,
 int _bt_hid_disconnect(int request_id,
                bluetooth_device_address_t *device_address);
 
+int _bt_hid_enable_barcode_feature(void);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
old mode 100755 (executable)
new mode 100644 (file)
index 866df9b..06e948b
@@ -29,6 +29,8 @@ gboolean _bt_terminate_service(gpointer user_data);
 
 gboolean _bt_reliable_terminate_service(gpointer user_data);
 
+int _bt_service_initialize(void);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
old mode 100755 (executable)
new mode 100644 (file)
index 95c569b..f0be8da
@@ -59,23 +59,27 @@ int _bt_obex_server_accept_connection(int request_id);
 
 int _bt_obex_server_reject_connection(void);
 
+int _bt_opp_get_server_progress(int transfer_id, guint8 *progress);
+
 int _bt_obex_server_is_receiving(gboolean *receiving);
 
 
 void _bt_obex_transfer_progress(const char *transfer_path,
-                                       int transferred);
+                                       guint64 transferred);
 void _bt_obex_transfer_completed(const char *transfer_path, gboolean success);
 
 void _bt_obex_transfer_started(const char *transfer_path);
 
 void _bt_obex_check_pending_transfer(const char *address);
 
-void _bt_obex_transfer_connected(void);
+void _bt_obex_transfer_connected(const char *obj_path);
 
-void _bt_obex_transfer_disconnected(void);
+void _bt_obex_transfer_disconnected(char *address);
 
 int _bt_obex_get_native_pid(void);
 
+void _bt_obex_server_reply_accept(void);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
old mode 100755 (executable)
new mode 100644 (file)
index be9ca06..5c65ef2
@@ -50,6 +50,7 @@ typedef struct {
        char *transfer_path;
        bt_transfer_status_t transfer_status;
        gint64 size;
+       guint64 progress;
 } bt_transfer_info_t;
 
 typedef struct {
@@ -88,7 +89,7 @@ void _bt_sending_files(void);
 
 void _bt_opc_disconnected(const char *session_path);
 
-gboolean _bt_obex_client_progress(const char *transfer_path, int transferred);
+gboolean _bt_obex_client_progress(const char *transfer_path, guint64 transferred);
 
 gboolean _bt_obex_client_started(const char *transfer_path);
 
@@ -96,6 +97,9 @@ gboolean _bt_obex_client_completed(const char *transfer_path, gboolean success);
 
 void _bt_opp_client_check_pending_transfer(const char *address);
 
+int _bt_opp_get_client_progress(guint8 *progress);
+
+void _bt_cancel_queued_transfers(void);
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
index 705eb1a..6ac1749 100755 (executable)
@@ -32,6 +32,9 @@ int _bt_pbap_connect(const bluetooth_device_address_t *address);
 
 int _bt_pbap_disconnect(const bluetooth_device_address_t *address);
 
+int _bt_pbap_is_connected(bluetooth_device_address_t *device_address,
+                                       gboolean *connected);
+
 int _bt_pbap_get_phonebook_size(const bluetooth_device_address_t *address,
                int source, int type);
 
diff --git a/bt-service/include/bt-service-proximity.h b/bt-service/include/bt-service-proximity.h
new file mode 100644 (file)
index 0000000..c76131d
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+#ifndef _BT_SERVICE_PROXIMITY_H_
+#define _BT_SERVICE_PROXIMITY_H_
+
+#include <glib.h>
+#include <sys/types.h>
+#include "bluetooth-api.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+typedef enum {
+       BT_PXP_ALERT_NONE = 0,
+       BT_PXP_ALERT_MILD,
+       BT_PXP_ALERT_HIGH
+} bt_proximity_alert_value_t;
+
+typedef enum {
+       BT_PXP_PROPERTY_LLS = 0x01,
+       BT_PXP_PROPERTY_IAS = 0x02,
+       BT_PXP_PROPERTY_TX_POWER = 0x04
+} bt_proximity_alert_property_t;
+
+typedef enum {
+        BT_PXP_REPORTER_ROLE = 0x00,
+        BT_PXP_MONITOR_ROLE = 0x01,
+} bt_proximity_role_t;
+
+int bt_set_proximity_property(bluetooth_device_address_t *device_address,
+               unsigned int property, int value);
+
+int bt_get_proximity_property(bluetooth_device_address_t *device_address,
+               unsigned int property, int *value);
+
+int bt_get_proximity_supported_services(bluetooth_device_address_t *device_address,
+               unsigned int *supported_services);
+
+int bt_register_proximity_reporter();
+
+int bt_unregister_proximity_reporter();
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /*_BT_SERVICE_PROXIMITY_H_*/
index 7bcc6cd..8c94c80 100644 (file)
@@ -35,18 +35,20 @@ extern "C" {
  * @{
  */
 
-#define BLUETOOTH_ADDRESS_LENGTH            6 /**< This specifies bluetooth device address length */
-#define BLUETOOTH_VERSION_LENGTH_MAX       30 /**< This specifies bluetooth device version length */
-#define BLUETOOTH_INTERFACE_NAME_LENGTH        16
-#define BLUETOOTH_DEVICE_NAME_LENGTH_MAX       248 /**< This specifies maximum device name length */
+#define BLUETOOTH_ADDRESS_LENGTH               6 /**< This specifies bluetooth device address length */
+#define BLUETOOTH_VERSION_LENGTH_MAX           30 /**< This specifies bluetooth device version length */
+#define BLUETOOTH_INTERFACE_NAME_LENGTH                16
+#define BLUETOOTH_DEVICE_NAME_LENGTH_MAX       248 /**< This specifies maximum device name length */
 #define BLUETOOTH_DEVICE_PASSKEY_LENGTH_MAX       50 /**< This specifies maximum length of the passkey */
 #define BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX  31 /**< This specifies maximum AD data length */
-#define BLUETOOTH_SCAN_RESP_DATA_LENGTH_MAX     31 /**< This specifies maximum LE Scan response data length */
+#define BLUETOOTH_SCAN_RESP_DATA_LENGTH_MAX    31 /**< This specifies maximum LE Scan response data length */
 #define BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX 240 /**< This specifies maximum manufacturer data length */
 
-#define BLUETOOTH_MAX_SERVICES_FOR_DEVICE       40  /**< This specifies maximum number of services
+#define BLUETOOTH_MAX_SERVICES_FOR_DEVICE      40  /**< This specifies maximum number of services
                                                        a device can support */
 
+#define BLUETOOTH_MAX_ATT_MTU  512             /**< This specifies the maximum  ATT MTU Value*/
+
 #define BLUETOOTH_UUID_STRING_MAX 50
 #define BLUETOOTH_PATH_STRING 50
 
@@ -165,10 +167,30 @@ extern "C" {
 #define BLUETOOTH_ERROR_NOT_INITIALIZED    ((int)BLUETOOTH_ERROR_BASE - 0x26)
                                                                /**< Not initialized */
 
-#define BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION    ((int)BLUETOOTH_ERROR_BASE - 0x27)
+#define BLUETOOTH_ERROR_AUTHENTICATION_REJECTED        ((int)BLUETOOTH_ERROR_BASE - 0x27)
+                                                               /**< Authentication rejected */
+
+#define BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION    ((int)BLUETOOTH_ERROR_BASE - 0x28)
                                                                /**< Device Policy Restricted */
 
 /**
+ * Device disconnection reasons; received from stack
+ */
+#define BLUETOOTH_ERROR_PAGE_TIMEOUT   0x04
+#define BLUETOOTH_ERROR_AUTH_FAILURE   0x05
+#define BLUETOOTH_ERROR_PIN_OR_KEY_MISSING     0x06
+#define BLUETOOTH_ERROR_CONNECTION_TIMEOUT     0x08
+#define BLUETOOTH_ERROR_REMOTE_USER_TERM       0x13
+#define BLUETOOTH_ERROR_REMOTE_LOW_RESOURCES   0x14
+#define BLUETOOTH_ERROR_REMOTE_POWER_OFF       0x15
+#define BLUETOOTH_ERROR_LOCAL_HOST_TERM        0x16
+#define BLUETOOTH_ERROR_REPEATED_ATTEMPTS      0x17
+#define BLUETOOTH_ERROR_LMP_RESPONSE_TIMEOUT 0x22
+#define BLUETOOTH_ERROR_CONNECTION_FAILED_TO_BE_ESTABLISHED    0x3e
+
+
+
+/**
 * Device disconnect reason
 */
 typedef enum {
@@ -276,16 +298,18 @@ typedef enum {
        BLUETOOTH_GATT_SERVICE = 0x40,
        BLUETOOTH_NAP_SERVER_SERVICE = 0x80,
        BLUETOOTH_A2DP_SINK_SERVICE = 0x100,
+       BLUETOOTH_PBAP_SERVICE = 0x200,
 } bluetooth_service_type_t;
 
 /**
  * Service type
  */
 typedef enum {
-        BLUETOOTH_DEV_CONN_DEFAULT = 0xFF, /* represents that connection
-                                        * type can both BR/EDR and LE */
-        BLUETOOTH_DEV_CONN_BREDR = 0x00,
-        BLUETOOTH_DEV_CONN_LE = 0x01,
+       BLUETOOTH_DEV_CONN_DEFAULT = 0xFF,
+       /* represents that connection
+        * type can both BR/EDR and LE */
+       BLUETOOTH_DEV_CONN_BREDR = 0x00,
+       BLUETOOTH_DEV_CONN_LE = 0x01,
 } bluetooth_conn_type_t;
 
 /**
@@ -340,6 +364,11 @@ typedef enum {
 } bluetooth_advertising_type_t;
 
 typedef enum {
+       BLUETOOTH_GATT_SERVICE_CHANGE_TYPE_ADD = 0x01,
+       BLUETOOTH_GATT_SERVICE_CHANGE_TYPE_REMOVE = 0x02,
+} bluetooth_gatt_service_change_type_t;
+
+typedef enum {
        BLUETOOTH_GATT_PERMISSION_READ = 0x01,
        BLUETOOTH_GATT_PERMISSION_WRITE = 0x02,
        BLUETOOTH_GATT_PERMISSION_ENCRYPT_READ = 0x04,
@@ -374,6 +403,15 @@ typedef enum {
 } bluetooth_gatt_att_request_tyep_t;
 
 /**
+ * Proximity Property Type
+ */
+typedef enum {
+               BLUETOOTH_PXP_PROPERTY_LLS = 0x01,      /* Link Loss Alert Proeprty */
+               BLUETOOTH_PXP_PROPERTY_IAS = 0x02,      /* Immediate Alert Proeprty */
+               BLUETOOTH_PXP_PROPERTY_TX_POWER = 0x04, /* TX Power */
+} bluetooth_pxp_poperty_t;
+
+/**
 * Advertising parameters
 */
 typedef struct {
@@ -396,8 +434,8 @@ typedef struct {
        LE Connection Update
  */
 typedef struct {
-       guint16 interval_min;
-       guint16 interval_max;
+       float interval_min;
+       float interval_max;
        guint16 latency;
        guint16 timeout;
 } bluetooth_le_connection_param_t;
@@ -428,6 +466,18 @@ typedef struct {
        char *message;
 } bluetooth_vendor_dep_at_cmd_t;
 
+/**
+ * Transfer Types
+ */
+typedef enum {
+       BLUETOOTH_TRANSFER_INBOUND,         /**< Inbound Transfer Type */
+       BLUETOOTH_TRANSFER_OUTBOUND,        /**< Outbound Transfer Type */
+} bluetooth_opp_transfer_type_t;
+
+typedef struct {
+       gint event;
+       gint value;
+} bluetooth_hf_ciev_device_event_t;
 
 #define BLUETOOTH_EVENT_BASE            ((int)(0x0000))                /**< No event */
 #define BLUETOOTH_EVENT_GAP_BASE        ((int)(BLUETOOTH_EVENT_BASE + 0x0010))
@@ -479,8 +529,9 @@ typedef enum {
        BLUETOOTH_EVENT_DISCOVERY_FINISHED,         /**< Bluetooth event discovery finished */
        BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND,        /**< Bluetooth event remote deice found */
        BLUETOOTH_EVENT_LE_DISCOVERY_STARTED,           /**< Bluetooth event LE discovery started */
-       BLUETOOTH_EVENT_LE_DISCOVERY_FINISHED,  /**< Bluetooth event LE discovery finished */
+       BLUETOOTH_EVENT_LE_DISCOVERY_FINISHED,  /**< Bluetooth event LE discovery finished */
        BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND,     /**< Bluetooth event remote deice found (LE dev) */
+       BLUETOOTH_EVENT_REMOTE_IBEACON_DEVICE_FOUND,    /**< Bluetooth event remote ibeacon device found (iBeacon LE dev) */
        BLUETOOTH_EVENT_REMOTE_DEVICE_NAME_UPDATED,/**< Bluetooth event remote device name updated*/
        BLUETOOTH_EVENT_BONDING_FINISHED,           /**< Bluetooth event bonding completed */
        BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED,      /**< Bluetooth event bonding removed */
@@ -498,6 +549,8 @@ typedef enum {
        BLUETOOTH_EVENT_RSSI_ENABLED,           /**< Bluetooth event RSSI monitoring enabled */
        BLUETOOTH_EVENT_RSSI_ALERT,                             /**< Bluetooth event RSSI Alert */
        BLUETOOTH_EVENT_RAW_RSSI,                               /**< Bluetooth event Raw RSSI */
+       BLUETOOTH_EVENT_SUPPORTED_PROFILE_TRUSTED,      /**< Bluetooth event Supported Profile Trusted */
+       BLUETOOTH_EVENT_PASSKEY_NOTIFICATION,       /**< Bluetooth event passkey notification */
 
        BLUETOOTH_EVENT_SERVICE_SEARCHED = BLUETOOTH_EVENT_SDP_BASE,
                                                    /**< Bluetooth event serice search base id */
@@ -531,7 +584,7 @@ typedef enum {
 
        BLUETOOTH_EVENT_OPC_CONNECTED = BLUETOOTH_EVENT_OPC_BASE,
                                                                /* OPC Connected event */
-       BLUETOOTH_EVENT_OPC_DISCONNECTED,               /* OPC Disonnected event */
+       BLUETOOTH_EVENT_OPC_DISCONNECTED,               /* OPC Disonnected event */
        BLUETOOTH_EVENT_OPC_TRANSFER_STARTED,   /* OPC Transfer started event */
        BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS,  /* OPC Transfer progress event */
        BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE,  /* OPC Transfer Complete event */
@@ -557,11 +610,13 @@ typedef enum {
        BLUETOOTH_EVENT_GATT_SVC_CHAR_DESC_DISCOVERED, /**<Gatt Char Descriptors Discovered Event*/
        BLUETOOTH_EVENT_GATT_CONNECTED,/**<Gatt connected event */
        BLUETOOTH_EVENT_GATT_DISCONNECTED, /**<Gatt Disconnected event */
+       BLUETOOTH_EVENT_GATT_ATT_MTU_CHANGED, /**<Attribute protocol MTU changed event */
        BLUETOOTH_EVENT_GATT_SERVER_CHARACTERISTIC_VALUE_CHANGED, /**<Gatt Char write callback event */
        BLUETOOTH_EVENT_GATT_SERVER_READ_REQUESTED, /** <GATT Characteristic/Descriptor Read Request event */
        BLUETOOTH_EVENT_GATT_SERVER_VALUE_CHANGED, /** <GATT Characteristic/Descriptor Value change event */
        BLUETOOTH_EVENT_GATT_SERVER_NOTIFICATION_STATE_CHANGED, /** <GATT Characteristic Notification change event */
        BLUETOOTH_EVENT_GATT_SERVER_NOTIFICATION_COMPLETED, /** <GATT Characteristic Notification or Indication completed event */
+       BLUETOOTH_EVENT_GATT_CLIENT_SERVICE_CHANGED, /** <GATT Client service change event */
 
        BLUETOOTH_EVENT_AG_CONNECTED = BLUETOOTH_EVENT_AUDIO_BASE, /**<AG service connected event*/
        BLUETOOTH_EVENT_AG_DISCONNECTED, /**<AG service disconnected event*/
@@ -596,6 +651,12 @@ typedef enum {
        BLUETOOTH_EVENT_HF_VOICE_RECOGNITION_DISABLED,
        BLUETOOTH_EVENT_HF_VOLUME_SPEAKER,
        BLUETOOTH_EVENT_HF_VENDOR_DEP_CMD,
+       BLUETOOTH_EVENT_HF_CALLSETUP_INCOMING,
+       BLUETOOTH_EVENT_HF_CALL_FAILED_TO_DIAL,
+       BLUETOOTH_EVENT_HF_CALL_IDLE,
+       BLUETOOTH_EVENT_HF_CALLSETUP_DIALING,
+       BLUETOOTH_EVENT_HF_CALLSETUP_ALERTING,
+       BLUETOOTH_EVENT_HF_CIEV_DEVICE_STATUS_CHANGED,
 
        BLUETOOTH_HID_CONNECTED = BLUETOOTH_EVENT_HID_BASE, /**< Input connectd event*/
        BLUETOOTH_HID_DISCONNECTED, /**< Input disconnectd event*/
@@ -633,8 +694,9 @@ typedef enum {
        BLUETOOTH_EVENT_IPSP_INIT_STATE_CHANGED = BLUETOOTH_EVENT_IPSP_BASE, /**<IPSP init event*/
        BLUETOOTH_EVENT_IPSP_CONNECTED, /**< IPSP connected event  */
        BLUETOOTH_EVENT_IPSP_DISCONNECTED, /**< IPSP Disconnected event */
-       BLUETOOTH_EVENT_IPSP_BT_INTERFACE_INFO, /** IPSP BT Interface Info after connection */
+       BLUETOOTH_EVENT_IPSP_INTERFACE_INFO, /** IPSP BT Interface Info after connection */
        BLUETOOTH_EVENT_LE_DATA_LENGTH_CHANGED,  /** LE data length values changed */
+       BLUETOOTH_EVENT_PXP_PROPERTY_CHANGED, /** Proximity property changed */
 } bluetooth_event_type_t;
 
  /**
@@ -699,7 +761,7 @@ typedef enum {
        BLUETOOTH_GENERIC_FILE_TRANSFER_UUID = ((unsigned short)0x1202),/**<GENERIC FILE TRANSFER*/
        BLUETOOTH_GENERIC_AUDIO_UUID = ((unsigned short)0x1203),        /**<GENERIC AUDIO*/
        BLUETOOTH_GENERIC_TELEPHONY_UUID = ((unsigned short)0x1204),    /**<GENERIC TELEPHONY*/
-       BLUETOOTH_VIDEO_SOURCE_UUID = ((unsigned short)0x1303),         /**<VEDIO SOURCE*/
+       BLUETOOTH_VIDEO_SOURCE_UUID = ((unsigned short)0x1303), /**<VEDIO SOURCE*/
        BLUETOOTH_VIDEO_SINK_UUID = ((unsigned short)0x1304),           /**<VEDIO SINK*/
        BLUETOOTH_VIDEO_DISTRIBUTION_UUID = ((unsigned short)0x1305),   /**<VEDIO DISTRIBUTION*/
        BLUETOOTH_HDP_UUID = ((unsigned short)0x1400),                  /**<HDP*/
@@ -928,6 +990,7 @@ typedef struct {
        gboolean paired;                        /**< paired flag */
        bluetooth_connected_link_t connected;   /**< connected link type */
        gboolean trust;                         /**< trust flag */
+       gboolean is_alias_set;          /** is device alias set flag**/
        bluetooth_manufacturer_data_t manufacturer_data;        /**< manafacturer specific class */
 } bluetooth_device_info_t;
 
@@ -948,6 +1011,20 @@ typedef struct {
 } bluetooth_le_device_info_t;
 
 typedef struct {
+       bluetooth_device_address_t device_address;      /**< device address */
+       int addr_type;                  /**< address type*/
+       int rssi;                       /**< received strength signal*/
+       int adv_type;
+       int company_id;         /** <Company ID> */
+       int ibeacon_type;       /** <iBeacon type> */
+       int major_id;           /** <Major ID> */
+       int minor_id;           /** <Minor ID> */
+       int measured_power; /** <Measured Power value for proximity> */
+       int uuid_len;           /** <uuid string len> */
+       char uuid[BLUETOOTH_UUID_STRING_MAX];   /** <customr/specific UUID> */
+} bluetooth_ibeacon_device_info_t;
+
+typedef struct {
        int slot_id;
        bluetooth_le_scan_filter_feature_t added_features;              /**< added features */
        bluetooth_device_address_t device_address;                      /**< device address */
@@ -963,6 +1040,12 @@ typedef struct {
        bluetooth_le_advertising_data_t manufacturer_data_mask;         /**< manufacturer data mask */
 } bluetooth_le_scan_filter_t;
 
+typedef struct {
+       bluetooth_device_address_t device_address;      /**< device address */
+       unsigned int mtu;       /** < MTU set for the ATT connection */
+       unsigned int status; /** < status of the MTU exchange */
+} bluetooth_le_att_mtu_info_t;
+
 /**
  * structure to hold the paired device information
  */
@@ -1062,7 +1145,7 @@ typedef enum {
        HTYPE_TRANS_SET_PROTOCOL,
        HTYPE_TRANS_DATA,
        HTYPE_TRANS_UNKNOWN
-} bluetooth_hid_header_type_t;
+} bt_hid_header_type_t;
 
 /**
  * HID Param type
@@ -1070,16 +1153,16 @@ typedef enum {
 typedef enum {
        PTYPE_DATA_RTYPE_INPUT,
        PTYPE_DATA_RTYPE_OUTPUT
-} bluetooth_hid_param_type_t;
+} bt_hid_param_type_t;
 
 /**
  * Stucture to hid receive data
  */
 typedef struct {
        const char *address;
-       bluetooth_hid_header_type_t type;
+       bt_hid_header_type_t type;
                /**< Header type containing */
-       bluetooth_hid_param_type_t param;
+       bt_hid_param_type_t param;
                /**< Param type in header like INPUT Report or OutPut Report */
        int buffer_size;/**< the length of the receive buffer */
        char *buffer;
@@ -1175,6 +1258,7 @@ typedef struct {
  * Stucture to OPP client transfer information
  */
 typedef struct {
+       char *device_addr;
        char *filename;
        unsigned long size;
        int percentage;
@@ -1189,6 +1273,8 @@ typedef struct {
 typedef struct {
        char *filename;
        int length;
+       char *address;
+       char *name;
 } bt_obex_server_authorize_into_t;
 
 /**
@@ -1211,9 +1297,21 @@ typedef struct {
        unsigned long file_size;
        int percentage;
        bt_obex_server_type_t server_type;
+       char *address;
+       unsigned char *contact_auth_info;
 } bt_obex_server_transfer_info_t;
 
 /**
+ * Stucture to OPP/FTP server connection/disconnection information
+ */
+typedef struct {
+       char *address;
+       char *device_name;
+       int transfer_id;
+} bt_obex_server_connection_info_t;
+
+
+/**
  * Stucture to OOB data
  */
 
@@ -1222,6 +1320,11 @@ typedef struct {
        unsigned char randomizer[BLUETOOTH_OOB_DATA_LENGTH];
        unsigned int hash_len;
        unsigned int randomizer_len;
+
+       unsigned char hash256[BLUETOOTH_OOB_DATA_LENGTH];
+       unsigned char randomizer256[BLUETOOTH_OOB_DATA_LENGTH];
+       unsigned int hash256_len;
+       unsigned int randomizer256_len;
 } bt_oob_data_t;
 
 /**
@@ -1328,6 +1431,12 @@ typedef struct {
        guint32 val_len;
 } bt_gatt_value_change_t;
 
+typedef struct {
+       bluetooth_device_address_t device_addr;
+       char *svc_path;
+       bluetooth_gatt_service_change_type_t change_type;
+} bt_gatt_service_change_t;
+
 /**
  * Structure to GATT characteristc Notification change
  */
@@ -1345,7 +1454,7 @@ typedef struct {
        char *service_handle;
        char *address;
        gboolean complete;
- } bt_gatt_indicate_confirm_t;
+} bt_gatt_indicate_confirm_t;
 
 /**
  * Structure to RSSI Signal Strength Alert
@@ -1388,6 +1497,17 @@ typedef struct {
        int high_threshold;
 } bt_rssi_threshold_t;
 
+
+/**
+ * Structure for Suppoted Profiles and Trusted Profiles
+ */
+typedef struct {
+       char *address;
+       int profile;
+       gboolean supported;
+       gboolean trusted;
+} bt_supported_profile_trusted_t;
+
 /**
  * Structure for PBAP Folder Parameters
  */
@@ -1508,9 +1628,26 @@ typedef struct {
 } bt_hf_call_list_s;
 
 /**
- * Structure for LE data length change params
+ * Profile types
  */
+typedef enum {
+       TRUSTED_PROFILE_PBAP = 1,
+       TRUSTED_PROFILE_MAP,
+       TRUSTED_PROFILE_SAP,
+       TRUSTED_PROFILE_ALL = 0xFFFFFFFF,
+} bluetooth_trusted_profile_t;
 
+/**
+ * Restricted Profile types
+ */
+typedef enum {
+       RESTRICTED_PROFILE_HFP_HS = 1,
+       RESTRICTED_PROFILE_A2DP,
+} bluetooth_restricted_profile_t;
+
+/**
+ * Structure for LE data length change params
+ */
 typedef struct {
        bluetooth_device_address_t device_address;
        guint16 max_tx_octets;
@@ -1519,17 +1656,26 @@ typedef struct {
        guint16 max_rx_time;
 } bt_le_data_length_params_t;
 
+/**
+ * Structure for proximity property change params
+ */
+typedef struct {
+       bluetooth_device_address_t device_address;
+       int role;
+       int service_type;
+       int alert_lvl;
+} bt_pxp_property_changed_params_t;
 
  /**
  * @brief DPM BT allowance state
  * @see
  */
- typedef enum {
-        BLUETOOTH_DPM_ERROR     = -1,   /**< bluetooth allowance error */
-        BLUETOOTH_DPM_BT_ALLOWED,               /**< bluetooth allowance allowed */
-        BLUETOOTH_DPM_HANDSFREE_ONLY,  /**< bluetooth allowance handsfree only */
-        BLUETOOTH_DPM_BT_RESTRICTED,  /**< bluetooth allowance restricted */
- } bt_dpm_allow_t;
+typedef enum {
+       BLUETOOTH_DPM_ERROR      = -1,   /**< bluetooth allowance error */
+       BLUETOOTH_DPM_BT_ALLOWED,                /**< bluetooth allowance allowed */
+       BLUETOOTH_DPM_HANDSFREE_ONLY,  /**< bluetooth allowance handsfree only */
+       BLUETOOTH_DPM_BT_RESTRICTED,  /**< bluetooth allowance restricted */
+} bt_dpm_allow_t;
 
  /**
  * @brief DPM API result
@@ -1629,7 +1775,7 @@ typedef struct {
 typedef struct {
        bluetooth_device_address_t btaddr;
        char if_name[16];
-} bt_ipsp_interface_info_t;
+} bt_ipsp_connection_info_t;
 
 /**
  * Callback pointer type
@@ -1673,6 +1819,7 @@ int main()
 {
        GMainLoop *main_loop = NULL;
        int ret = 0;
+       g_type_init();
        main_loop = g_main_loop_new(NULL, FALSE);
        ret = bluetooth_register_callback(bt_event_callback, (void*)main_loop);
        if (ret >= BLUETOOTH_ERROR_NONE)
@@ -1768,6 +1915,7 @@ int main()
 {
        GMainLoop *main_loop = NULL;
        int ret = 0;
+       g_type_init();
        main_loop = g_main_loop_new(NULL, FALSE);
        ret = bluetooth_register_callback(bt_event_callback, (void*)main_loop);
        if (ret >= BLUETOOTH_ERROR_NONE)
@@ -2165,6 +2313,98 @@ int bluetooth_get_connected_link_type(const bluetooth_device_address_t *device_a
                                bluetooth_connected_link_t *connected_link);
 
 /**
+ * @fn int bluetooth_set_profile_trusted(const bluetooth_device_address_t *device_address, int profile, int trust)
+ * @brief Sets a profile trusted for a device
+ *
+ * This function is used to Set a profile as trusted for a device
+ *
+ * This function is a synchronous call.
+ *
+ * @param[in]  device_address  a device address of remote bluetooth device
+ * @param[in]  profile profile which is to be set as trusted[0-PBAP, 1-MAP, 2-SAP]
+ * @param[in]  trust   to set as trusted or untrusted[1-trusted 0-untrusted]
+ *
+ * @return     BLUETOOTH_ERROR_NONE - Success \n
+ *             BLUETOOTH_ERROR_DEVICE_NOT_ENABLED - Adapter is not enabled \n
+ *             BLUETOOTH_ERROR_INVALID_PARAM - Bluetooth name parameter is incorrect \n
+ *             BLUETOOTH_ERROR_INTERNAL - The dbus method call is fail \n
+ *
+ * @remark      None
+ */
+int bluetooth_set_profile_trusted(
+               const bluetooth_device_address_t *device_address,
+               int profile, int trust);
+
+/**
+ * @fn int bluetooth_get_profile_trusted(const bluetooth_device_address_t *device_address, int profile, int *trust)
+ * @brief Gets a profile is trusted for a device
+ *
+ * This function is used to Get a profile is trusted or not for a device
+ *
+ * This function is a synchronous call.
+ *
+ * @param[in]  device_address  a device address of remote bluetooth device
+ * @param[in]  profile profile whose trust status is needed[0-PBAP, 1-MAP, 2-SAP]
+ * @param[out] trust   profile is set as trusted or untrusted[1-trusted 0-untrusted]
+ *
+ * @return     BLUETOOTH_ERROR_NONE - Success \n
+ *             BLUETOOTH_ERROR_DEVICE_NOT_ENABLED - Adapter is not enabled \n
+ *             BLUETOOTH_ERROR_INVALID_PARAM - Bluetooth name parameter is incorrect \n
+ *             BLUETOOTH_ERROR_INTERNAL - The dbus method call is fail \n
+ *
+ * @remark      None
+ */
+int bluetooth_get_profile_trusted(
+               const bluetooth_device_address_t *device_address,
+               int profile, int *trust);
+
+/**
+ * @fn int bluetooth_set_profile_restricted(const bluetooth_device_address_t *device_address, int profile, int restricted)
+ * @brief Sets a profile restricted connection for a device
+ *
+ * This function is used to Set a profile as restricted for a device
+ *
+ * This function is a synchronous call.
+ *
+ * @param[in]  device_address  a device address of remote bluetooth device
+ * @param[in]  profile profile which is to be set as restricted[1-HFP_HS, 2-A2DP]
+ * @param[in]  restricted      to set as restricted or not[1-restricted 0-permitted]
+ *
+ * @return     BLUETOOTH_ERROR_NONE - Success \n
+ *             BLUETOOTH_ERROR_DEVICE_NOT_ENABLED - Adapter is not enabled \n
+ *             BLUETOOTH_ERROR_INVALID_PARAM - Bluetooth name parameter is incorrect \n
+ *             BLUETOOTH_ERROR_INTERNAL - The dbus method call is fail \n
+ *
+ * @remark      None
+ */
+int bluetooth_set_profile_restricted(
+               const bluetooth_device_address_t *device_address,
+               int profile, int restricted);
+
+/**
+ * @fn int bluetooth_get_profile_restricted(const bluetooth_device_address_t *device_address, int profile, int *restricted)
+ * @brief Gets a restricted connection state
+ *
+ * This function is used to Get a profile is restricted or not for a device
+ *
+ * This function is a synchronous call.
+ *
+ * @param[in]  device_address  a device address of remote bluetooth device
+ * @param[in]  profile profile whose restricted status is needed[1-HFP_HS, 2-A2DP]
+ * @param[out] restricted      profile is set as restricted or not[1-restricted 0-permitted]
+ *
+ * @return     BLUETOOTH_ERROR_NONE - Success \n
+ *             BLUETOOTH_ERROR_DEVICE_NOT_ENABLED - Adapter is not enabled \n
+ *             BLUETOOTH_ERROR_INVALID_PARAM - Bluetooth name parameter is incorrect \n
+ *             BLUETOOTH_ERROR_INTERNAL - The dbus method call is fail \n
+ *
+ * @remark      None
+ */
+int bluetooth_get_profile_restricted(
+               const bluetooth_device_address_t *device_address,
+               int profile, int *restricted);
+
+/**
  * @fn int bluetooth_get_discoverable_mode(bluetooth_discoverable_mode_t *discoverable_mode_ptr)
  * @brief Get the visibility mode
  *
@@ -2696,6 +2936,27 @@ is_le_scanning = bluetooth_is_le_scanning ();
  */
 gboolean bluetooth_is_le_scanning(void);
 
+gboolean bluetooth_is_scan_filter_supported(void);
+
+/**
+ * @fn int bluetooth_force_hcidump(int timeout)
+ * @brief Enable /disable force-hcidump
+ *
+ * This function control force-hcidump.
+ *
+ * This function is a synchronous call.
+ *
+ * @return     BLUETOOTH_ERROR_NONE - Success \n
+ *             BLUETOOTH_ERROR_DEVICE_NOT_ENABLED - Adapter is not enabled \n
+ *             BLUETOOTH_ERROR_INTERNAL - Internal IPC error \n
+ *
+ * @param[in]   start  To enable or disable force-hcidump[TRUE / FALSE]
+ *
+ *
+ * @remark      None
+ */
+int bluetooth_force_hcidump(int timeout);
+
 /**
  * @fn int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *filter, int *slot_id)
  * @brief Register scan filter.
@@ -3071,6 +3332,9 @@ void bt_get_bonded_devices(void)
  */
 int bluetooth_get_bonded_device_list(GPtrArray **dev_list);
 
+int bluetooth_get_profile_connected_device_list(
+               const char *profile_uuid, GPtrArray **addr_list);
+
 /**
  * @fn int bluetooth_get_bonded_device(const bluetooth_device_address_t *device_address,
  *                                     bluetooth_device_info_t *dev_info)
@@ -3124,6 +3388,31 @@ int bluetooth_get_bonded_device(const bluetooth_device_address_t *device_address
                                        bluetooth_device_info_t *dev_info);
 
 /**
+ * @fn int bluetooth_get_is_alias_set(const bluetooth_device_address_t *device_address,
+ *                                     gboolean *is_alias_set)
+ * @brief Get is_alias_set property of device
+ *
+ * This API gets is_alias_set property of a bonded device.
+ *
+ * This function is a synchronous call.
+ * Information for is_alias_set property can be obtained only when result code is BLUETOOTH_ERROR_NONE.
+ * If not,there is no valid information in the is_alias_set.
+ *
+ * @return     BLUETOOTH_ERROR_NONE - Success \n
+ *                     BLUETOOTH_ERROR_NOT_SUPPORT - Opreation not supported \n
+ * @remark None
+ @code
+       int ret = 0;
+       gboolean alias_set;
+       bluetooth_device_address_t device_address = {{0x00,0x1C,0x43,0x2B,0x1A,0xE5}};
+
+       ret = bluetooth_get_is_alias_set(&device_address, &alias_set);
+ @endcode
+ */
+int bluetooth_get_is_alias_set(const bluetooth_device_address_t *device_address,
+                               gboolean *is_alias_set);
+
+/**
  * @fn int bluetooth_set_alias(const bluetooth_device_address_t *device_address, const char *alias)
  * @brief set alias for bonded device
  *
@@ -3655,7 +3944,7 @@ int bluetooth_rfcomm_listen(int socket_fd, int max_pending_connection);
  *
  * @exception   None
  * @remark       None
- * @see          bluetooth_rfcomm_reject_connection
+ * @see        bluetooth_rfcomm_reject_connection
  */
 int bluetooth_rfcomm_accept_connection(int server_fd);
 
@@ -3673,7 +3962,7 @@ int bluetooth_rfcomm_accept_connection(int server_fd);
  *
  * @exception   None
  * @remark       None
- * @see          bluetooth_rfcomm_accept_connection
+ * @see        bluetooth_rfcomm_accept_connection
  */
 int bluetooth_rfcomm_reject_connection(int server_fd);
 
@@ -3985,7 +4274,7 @@ int bluetooth_network_server_disconnect(const bluetooth_device_address_t *device
  *                             should be HDP_QOS_ANY.
  * @param[out]  app_handle    The application handler against corresponding service
  * @remark       None
- * @see           bluetooth_hdp_deactivate
+ * @see        bluetooth_hdp_deactivate
  */
 int bluetooth_hdp_activate(unsigned short  data_type,
                                bt_hdp_role_type_t role,
@@ -4005,7 +4294,7 @@ int bluetooth_hdp_activate(unsigned short  data_type,
  * @exception   None
  * @param[in]  app_handle   The application handler against corresponding service
  * @remark       None
- * @see           bluetooth_hdp_deactivate
+ * @see        bluetooth_hdp_deactivate
  */
 int bluetooth_hdp_deactivate(const char *app_handle);
 
@@ -4027,7 +4316,7 @@ int bluetooth_hdp_deactivate(const char *app_handle);
  * @param[in]  buffer   The pdu buffer.
  * @param[in]  size   Size of the buffer.
  * @remark       None
- * @see           bluetooth_hdp_connect
+ * @see        bluetooth_hdp_connect
  */
 int bluetooth_hdp_send_data(unsigned int channel_id,
                                const char *buffer, unsigned int size);
@@ -4053,7 +4342,7 @@ int bluetooth_hdp_send_data(unsigned int channel_id,
  * @param[in]  device_address   The remote device Bd address.
  *
  * @remark       None
- * @see           bluetooth_hdp_disconnect
+ * @see        bluetooth_hdp_disconnect
  */
 int bluetooth_hdp_connect(const char *app_handle,
                        bt_hdp_qos_type_t channel_type,
@@ -4077,7 +4366,7 @@ int bluetooth_hdp_connect(const char *app_handle,
  * @param[in]  device_address   The remote device Bd address.
  *
  * @remark       None
- * @see           bluetooth_hdp_connect
+ * @see        bluetooth_hdp_connect
  */
 int bluetooth_hdp_disconnect(unsigned int channel_id,
                        const bluetooth_device_address_t  *device_address);
@@ -4099,7 +4388,7 @@ int bluetooth_hdp_disconnect(unsigned int channel_id,
  * @exception   None
  *
  * @remark       None
- * @see          bluetooth_opc_deinit
+ * @see        bluetooth_opc_deinit
  */
 int bluetooth_opc_init(void);
 
@@ -4117,10 +4406,10 @@ int bluetooth_opc_init(void);
  * @exception   None
  *
  * @remark       None
- * @see          bluetooth_opc_init
+ * @see        bluetooth_opc_init
  */
 
- int bluetooth_opc_deinit(void);
+int bluetooth_opc_deinit(void);
 
 /**
  * @fn int bluetooth_opc_push_files(bluetooth_device_address_t *remote_address,
@@ -4143,11 +4432,11 @@ int bluetooth_opc_init(void);
  * @param[in]  file_name_array  Array of filepaths to be sent.
  *
  * @remark       None
- * @see         bluetooth_opc_cancel_push
+ * @see        bluetooth_opc_cancel_push
  */
 
 int bluetooth_opc_push_files(bluetooth_device_address_t *remote_address,
-                               char **file_name_array);
+                               char **file_name_array);
 
 /**
  * @fn int bluetooth_opc_cancel_push(void)
@@ -4164,7 +4453,7 @@ int bluetooth_opc_push_files(bluetooth_device_address_t *remote_address,
  * @exception   None
  *
  * @remark       None
- * @see          bluetooth_opc_push_files
+ * @see        bluetooth_opc_push_files
  */
 
 int bluetooth_opc_cancel_push(void);
@@ -4181,7 +4470,7 @@ int bluetooth_opc_cancel_push(void);
  * @exception   None
  *
  * @remark       None
- * @see         None
+ * @see        None
  */
 
 gboolean bluetooth_opc_session_is_exist(void);
@@ -4205,6 +4494,27 @@ gboolean bluetooth_opc_session_is_exist(void);
 int bluetooth_opc_is_sending(gboolean *is_sending);
 
 /**
+ * @fn int bluetooth_opp_get_transfer_progress(bluetooth_opp_transfer_type_t transfer_type,
+               int transfer_id, unsigned char *progress)
+ * @brief Gets the percentage progress for ongoing transfers.
+ *
+ * This function is a synchronous call.
+ *
+ * @return   BLUETOOTH_ERROR_NONE  - Success \n
+ *               BLUETOOTH_ERROR_DEVICE_NOT_ENABLED - Not enabled \n
+ *               BLUETOOTH_ERROR_NOT_FOUND - Not found \n
+ *
+ * @exception   None
+ * @param[in] transfer_type    Transfer Type: (@c BLUETOOTH_TRANSFER_INBOUND = receiving , @c  BLUETOOTH_TRANSFER_OUTBOUND = sending)
+ * @param[in] transfer_id      Transfer ID
+ * @param[out] progress                Percentage Progress
+ * @remark       None
+ * @see            None
+ */
+int bluetooth_opp_get_transfer_progress(bluetooth_opp_transfer_type_t transfer_type,
+               int transfer_id, unsigned char *progress);
+
+/**
  * @fn int bluetooth_obex_server_init(const char *dst_path)
  * @brief Initialize OPP and FTP server.
  *
@@ -4220,7 +4530,7 @@ int bluetooth_opc_is_sending(gboolean *is_sending);
  * @exception   None
  * @param[in]  dst_path   OPS destination file path.
  * @remark       None
- * @see          bluetooth_obex_server_deinit
+ * @see        bluetooth_obex_server_deinit
  */
 int bluetooth_obex_server_init(const char *dst_path);
 
@@ -4239,7 +4549,7 @@ int bluetooth_obex_server_init(const char *dst_path);
  * @exception   None
  *
  * @remark       None
- * @see          bluetooth_obex_server_init
+ * @see        bluetooth_obex_server_init
  */
 int bluetooth_obex_server_deinit(void);
 
@@ -4278,7 +4588,7 @@ gboolean bluetooth_obex_server_is_activated(void);
  * @exception   None
  * @param[in]  dst_path   OPS destination file path.
  * @remark       None
- * @see          bluetooth_obex_server_deinit_without_agent
+ * @see        bluetooth_obex_server_deinit_without_agent
  */
 int bluetooth_obex_server_init_without_agent(const char *dst_path);
 
@@ -4297,7 +4607,7 @@ int bluetooth_obex_server_init_without_agent(const char *dst_path);
  * @exception   None
  *
  * @remark       None
- * @see          bluetooth_obex_server_init_without_agent
+ * @see        bluetooth_obex_server_init_without_agent
  */
 int bluetooth_obex_server_deinit_without_agent(void);
 
@@ -4315,7 +4625,7 @@ int bluetooth_obex_server_deinit_without_agent(void);
  *
  * @exception   None
  * @remark       None
- * @see          bluetooth_obex_server_reject_authorize
+ * @see        bluetooth_obex_server_reject_authorize
  */
 int bluetooth_obex_server_accept_connection(void);
 
@@ -4333,7 +4643,7 @@ int bluetooth_obex_server_accept_connection(void);
  *
  * @exception   None
  * @remark       None
- * @see          bluetooth_obex_server_reject_authorize
+ * @see        bluetooth_obex_server_reject_authorize
  */
 int bluetooth_obex_server_reject_connection(void);
 
@@ -4355,7 +4665,7 @@ int bluetooth_obex_server_reject_connection(void);
  * @param[in]  filename   Authorized filename.
 
  * @remark       None
- * @see          bluetooth_obex_server_reject_authorize
+ * @see        bluetooth_obex_server_reject_authorize
  */
 
 int bluetooth_obex_server_accept_authorize(const char *filename);
@@ -4375,7 +4685,7 @@ int bluetooth_obex_server_accept_authorize(const char *filename);
  * @exception   None
 
  * @remark       None
- * @see          bluetooth_obex_server_accept_authorize
+ * @see        bluetooth_obex_server_accept_authorize
  */
 
 int bluetooth_obex_server_reject_authorize(void);
@@ -4396,7 +4706,7 @@ int bluetooth_obex_server_reject_authorize(void);
  * @param[in]  dst_path   OPS destination file path.
 
  * @remark       None
- * @see         None
+ * @see        None
  */
 
 int bluetooth_obex_server_set_destination_path(const char *dst_path);
@@ -4419,7 +4729,7 @@ int bluetooth_obex_server_set_destination_path(const char *dst_path);
  * @param[in]   root   FTS root folder.
 
  * @remark       None
- * @see         None
+ * @see        None
  */
 
 int bluetooth_obex_server_set_root(const char *root);
@@ -4444,7 +4754,7 @@ int bluetooth_obex_server_set_root(const char *root);
  * @param[in] transfer_id transfer ID
 
  * @remark       None
- * @see         None
+ * @see        None
  */
 int bluetooth_obex_server_cancel_transfer(int transfer_id);
 
@@ -4468,7 +4778,7 @@ int bluetooth_obex_server_cancel_transfer(int transfer_id);
  * @exception None
  *
  * @remark       None
- * @see         None
+ * @see        None
  */
 int bluetooth_obex_server_cancel_all_transfers(void);
 
@@ -4487,7 +4797,7 @@ int bluetooth_obex_server_cancel_all_transfers(void);
  * @param[out] is_receiving The receiving status: (@c TRUE = in receiving , @c  false = not in receiving)
  *
  * @remark       None
- * @see            None
+ * @see        None
  */
 int bluetooth_obex_server_is_receiving(gboolean *is_receiving);
 
@@ -4506,7 +4816,7 @@ int bluetooth_obex_server_is_receiving(gboolean *is_receiving);
  * @param[out] local_oob_data - Pointer to the local OOB data
  *
  * @remark       None
- * @see         None
+ * @see        None
  */
 
 int bluetooth_oob_read_local_data(bt_oob_data_t *local_oob_data);
@@ -4552,7 +4862,7 @@ int bluetooth_oob_add_remote_data(
  * @param[in] remote_device_address - Remote device address
  *
  * @remark       None
- * @see         None
+ * @see        None
  */
 
 int bluetooth_oob_remove_remote_data(
@@ -4603,6 +4913,9 @@ int bluetooth_gatt_get_primary_services(const bluetooth_device_address_t *addres
  */
 int bluetooth_gatt_discover_service_characteristics(const char *service_handle);
 
+int bluetooth_gatt_set_service_change_watcher(
+               const bluetooth_device_address_t *address, gboolean enable);
+
 /**
  * @fn int bluetooth_gatt_get_service_property(const char *service_handle,
  *                                             bt_gatt_service_property_t *service);
@@ -4644,7 +4957,7 @@ int bluetooth_gatt_get_service_property(const char *service_handle,
  * @param[in]  service_handle - Handle for remote service.
  *
  * @remark     None
- * @see        None
+ * @see        None
  */
 int bluetooth_gatt_watch_characteristics(const char *service_handle);
 
@@ -4835,7 +5148,7 @@ int bluetooth_gatt_read_characteristic_value(const char *char_handle);
  * @remark     None
  * @see                None
  */
- int bluetooth_gatt_get_service_from_uuid(bluetooth_device_address_t *address,
+int bluetooth_gatt_get_service_from_uuid(bluetooth_device_address_t *address,
                                        const char *service_uuid,
                                        bt_gatt_service_property_t *service);
 
@@ -4918,7 +5231,7 @@ int bluetooth_gatt_free_service_property(bt_gatt_service_property_t *svc_pty);
  * @remark     None
  * @see                bluetooth_gatt_get_characteristics_property()
  */
- int bluetooth_gatt_free_char_property(bt_gatt_char_property_t *char_pty);
+int bluetooth_gatt_free_char_property(bt_gatt_char_property_t *char_pty);
 
 /**
  * @fn int bluetooth_gatt_free_desc_property(bt_gatt_char_descriptor_property_t *desc_pty);
@@ -4937,12 +5250,11 @@ int bluetooth_gatt_free_service_property(bt_gatt_service_property_t *svc_pty);
  * @remark     None
  * @see                bluetooth_gatt_get_char_descriptor_property()
  */
- int bluetooth_gatt_free_desc_property(bt_gatt_char_descriptor_property_t *desc_pty);
-
+int bluetooth_gatt_free_desc_property(bt_gatt_char_descriptor_property_t *desc_pty);
 
- int bluetooth_connect_le(const bluetooth_device_address_t *device_address, gboolean auto_connect);
+int bluetooth_connect_le(const bluetooth_device_address_t *device_address, gboolean auto_connect);
 
- int bluetooth_disconnect_le(const bluetooth_device_address_t *device_address);
+int bluetooth_disconnect_le(const bluetooth_device_address_t *device_address);
 
  /**
  * @fn int bluetooth_gatt_discover_characteristic_descriptor(const char *characteristic_handle);
@@ -4979,7 +5291,7 @@ int bluetooth_gatt_discover_characteristic_descriptor(const char *characteristic
  * @remark     None
  * @see        None
  */
- int bluetooth_gatt_read_descriptor_value(const char *desc_handle);
+int bluetooth_gatt_read_descriptor_value(const char *desc_handle);
 
 /**
  * @fn int bluetooth_gatt_write_descriptor_value(const char *desc_handle,
@@ -5002,7 +5314,7 @@ int bluetooth_gatt_discover_characteristic_descriptor(const char *characteristic
  * @remark     None
  * @see        None
  */
- int bluetooth_gatt_write_descriptor_value(const char *desc_handle,
+int bluetooth_gatt_write_descriptor_value(const char *desc_handle,
                        const guint8 *value, int length);
 
 /* @fn int bluetooth_gatt_init(void)
@@ -5011,9 +5323,9 @@ int bluetooth_gatt_discover_characteristic_descriptor(const char *characteristic
 *
 * This function is a synchronous call.
 * @return   BLUETOOTH_ERROR_NONE       - Success \n
-*       BLUETOOTH_ERROR_INTERNAL - Internal Error \n
-*       BLUETOOTH_ERROR_INVALID_PARAM -Invalid Parameters \n
-*       BLUETOOTH_ERROR_DEVICE_NOT_ENABLED - Adapter is disabled \n
+*      BLUETOOTH_ERROR_INTERNAL - Internal Error \n
+*      BLUETOOTH_ERROR_INVALID_PARAM -Invalid Parameters \n
+*      BLUETOOTH_ERROR_DEVICE_NOT_ENABLED - Adapter is disabled \n
 *
 * @exception    None
 * @remark  Adapter should be enabled
@@ -5027,9 +5339,9 @@ int bluetooth_gatt_init(void);
 *
 * This function is a synchronous call.
 * @return   BLUETOOTH_ERROR_NONE       - Success \n
-*       BLUETOOTH_ERROR_INTERNAL - Internal Error \n
-*       BLUETOOTH_ERROR_INVALID_PARAM -Invalid Parameters \n
-*       BLUETOOTH_ERROR_DEVICE_NOT_ENABLED - Adapter is disabled \n
+*      BLUETOOTH_ERROR_INTERNAL - Internal Error \n
+*      BLUETOOTH_ERROR_INVALID_PARAM -Invalid Parameters \n
+*      BLUETOOTH_ERROR_DEVICE_NOT_ENABLED - Adapter is disabled \n
 *
 * @exception    None
 * @remark  Adapter should be enabled
@@ -5123,13 +5435,13 @@ int bluetooth_gatt_set_characteristic_value(
 *       BLUETOOTH_ERROR_INVALID_PARAM -Invalid Parameters \n
 *       BLUETOOTH_ERROR_DEVICE_NOT_ENABLED - Adapter is disabled \n
 *
-* @exception    None
-* @param[in]   desc_uuid  Gatt descriptor uuid.
-* @param[in]   desc_value      GATT descriptor value.
-* @param[in]   value_length    Length of GATT descriptor value.
-* @param[in]   permissions     descriptor permissions.
-* @param[in]   properties      GATT descriptor properties.
-* @param[in]  char_path        characteristics object path of the exported character.
+* @exception   None
+* @param[in]   desc_uuid  Gatt descriptor uuid.
+* @param[in]   desc_value      GATT descriptor value.
+* @param[in]   value_length    Length of GATT descriptor value.
+* @param[in]   permissions     descriptor permissions.
+* @param[in]   properties      GATT descriptor properties.
+* @param[in]   char_path       characteristics object path of the exported character.
 *
 * @remark  Adapter should be enabled
 * @see bluetooth_gatt_add_service()
@@ -5155,8 +5467,8 @@ int bluetooth_gatt_add_descriptor(
 *
 * @exception    None
 * @param[in]   desc_value      GATT descriptor value.
-* @param[in]   value_length    Length of GATT descriptor value.
-* @param[in]  desc_path descriptor path to which the value needs to be added.
+* @param[in]   value_length    Length of GATT descriptor value.
+* @param[in]   desc_path descriptor path to which the value needs to be added.
 *
 * @remark  Adapter should be enabled
 * @see bluetooth_gatt_add_service()
@@ -5187,7 +5499,7 @@ int bluetooth_gatt_get_service(const char *svc_uuid);
 
 /* @fn int bluetooth_gatt_register_service(const  char *svc_path)
 *
-* @brief Registers the given service path with the bluez gatt server.
+* @brief Registers the given service path with the library.
 *
 * This function is a synchronous call.
 *
@@ -5662,8 +5974,7 @@ int bluetooth_clear_white_list(void);
  * @see     bluetooth_bond_device
  */
 int bluetooth_le_conn_update(const bluetooth_device_address_t *address,
-            const bluetooth_le_connection_param_t *parameters);
-
+               const bluetooth_le_connection_param_t *parameters);
 
 /**
  * @fn int bluetooth_enable_le_privacy(gboolean enable_privacy);
@@ -5687,6 +5998,26 @@ int bluetooth_le_conn_update(const bluetooth_device_address_t *address,
 int bluetooth_enable_le_privacy(gboolean enable_privacy);
 
 /**
+ * @fn int bluetooth_set_le_static_random_address(gboolean enable);
+ *
+ * @brief Enable/Disable LE static random address.
+ *
+ * This function is used to enable or disable LE static random address.
+ *
+ * This function is a synchronous call.
+ *
+ * @return     BLUETOOTH_ERROR_NONE - Success \n
+ *             BLUETOOTH_ERROR_DEVICE_NOT_ENABLED - Adapter is not enabled \n
+ *             BLUETOOTH_ERROR_INTERNAL - Internal IPC error \n
+ *
+ * @exception  None
+ * @param[in]  enable - The status of LE static random address to be activated/deactivated[True/False].
+ *
+ * @remark     None
+ */
+int bluetooth_set_le_static_random_address(gboolean enable);
+
+/**
  * @fn int bluetooth_update_le_connection_mode(bluetooth_device_address_t *address,
  *                                             bluetooth_le_connection_mode_t mode)
  * @brief update connection paramter of LE connection.
@@ -5707,6 +6038,64 @@ int bluetooth_update_le_connection_mode(const bluetooth_device_address_t *addres
                bluetooth_le_connection_mode_t mode);
 
 /**
+ * @fn int bluetooth_request_att_mtu(const bluetooth_device_address_t *device_address, guint16 mtu)
+ * @brief Request for new ATT MTU value.
+ *
+ * This function is a asynchronous call.
+ *
+ * @return   BLUETOOTH_ERROR_NONE  - Success \n
+ *           BLUETOOTH_ERROR_INTERNAL - Internal Error \n
+ *           BLUETOOTH_ERROR_INVALID_PARAM - Parameter is not valid \n
+ *
+ * @exception  None
+ * @param[in]  address - remote device address value.
+ * @param[in]  mtu - MTU value to be set.
+ *
+ * @remark       None
+ */
+int bluetooth_request_att_mtu(const bluetooth_device_address_t *device_address, unsigned int mtu);
+
+/**
+ * @fn int bluetooth_get_att_mtu(const bluetooth_device_address_t *device_address,
+ *                             unsigned int *mtu)
+ * @brief Gets the xisting MTU value set for a connection.
+ *
+ * This function is a synchronous call.
+ *
+ * @return      BLUETOOTH_ERROR_NONE  - Success \n
+ *                      BLUETOOTH_ERROR_INTERNAL - Internal Error \n
+ *                      BLUETOOTH_ERROR_INVALID_PARAM - Parameter is not valid \n
+ *
+ * @exception  None
+ * @param[in]  address - remote device address value.
+ * @param[out]  mtu - MTU value set for the connection.
+ *
+ * @remark              None
+ */
+int bluetooth_get_att_mtu(const bluetooth_device_address_t *device_address,
+                               unsigned int *mtu);
+
+/**
+ * @fn int bluetooth_get_device_ida(const bluetooth_device_address_t *device_rpa,
+ *                                     bluetooth_device_address_t *id_address)
+ * @brief Gets the Identity address of remote device.
+ *
+ * This function is a synchronous call.
+ *
+ * @return             BLUETOOTH_ERROR_NONE  - Success \n
+ *                     BLUETOOTH_ERROR_INTERNAL - Internal Error \n
+ *                     BLUETOOTH_ERROR_INVALID_PARAM - Parameter is not valid \n
+ *
+ * @exception  None
+ * @param[in]  device_rpa - remote Resolvable private address.
+ * @param[out] id_address - remote Identity device address value.
+ *
+ * @remark              None
+ */
+int bluetooth_get_device_ida(const bluetooth_device_address_t *device_rpa,
+       bluetooth_device_address_t *id_address);
+
+/**
  * @fn int bluetooth_le_read_maximum_data_length()
  * @brief reads the maximum LE data length supported in the controller.
  *
@@ -5779,6 +6168,8 @@ int bluetooth_pbap_phonebook_search(const bluetooth_device_address_t *address,
  */
 int bluetooth_set_manufacturer_data(const bluetooth_manufacturer_data_t *value);
 
+int bluetooth_set_passkey_notification(gboolean enable);
+
 #ifdef TIZEN_DPM_VCONF_ENABLE
 /**
  * @fn int bluetooth_dpm_is_mode_allowed(void);
@@ -5835,10 +6226,10 @@ int bluetooth_dpm_set_allow_mode(bt_dpm_allow_t value);
  * @exception  None
  *  @param[in] None
  * @param[out] value - BT Allow value.
- *             BLUETOOTH_DPM_ERROR      = -1,   < bluetooth allowance error
- *             BLUETOOTH_DPM_BT_ALLOWED,                < bluetooth allowance allowed
- *             BLUETOOTH_DPM_HANDSFREE_ONLY,  < bluetooth allowance handsfree only
- *             BLUETOOTH_DPM_BT_RESTRICTED,  < bluetooth allowance restricted
+ *             BLUETOOTH_DPM_ERROR      = -1,   < bluetooth allowance error
+ *             BLUETOOTH_DPM_BT_ALLOWED,                < bluetooth allowance allowed
+ *             BLUETOOTH_DPM_HANDSFREE_ONLY,  < bluetooth allowance handsfree only
+ *             BLUETOOTH_DPM_BT_RESTRICTED,  < bluetooth allowance restricted
  *
  * @remark     None
  */
@@ -5857,7 +6248,7 @@ int bluetooth_dpm_get_allow_mode(bt_dpm_allow_t *value);
  *
  * @exception  None
  * @param[in]  value - State value.
- *             BLUETOOTH_DPM_ALLOWED           = 0,    < DPM Policy status allowed.
+ *             BLUETOOTH_DPM_ALLOWED           = 0,    < DPM Policy status allowed.
  *             BLUETOOTH_DPM_RESTRICTED                = 1,    < DPM Policy status restricted.
  *
  * @remark     None
@@ -6525,6 +6916,107 @@ int bluetooth_dpm_set_data_transfer_state(bt_dpm_status_t value);
 int bluetooth_dpm_get_data_transfer_state(bt_dpm_status_t *value);
 
 /**
+ * @fn int bluetooth_set_proximity_property(const bluetooth_device_address_t *device_address,
+ *                                             bluetooth_pxp_poperty_t property, int value);
+ *
+ * @brief Sets the Proximity alert level/properties.
+ *
+ * This function is a synchronous call.
+ *
+ * @return   BLUETOOTH_ERROR_NONE - Success \n
+ *               BLUETOOTH_ERROR_DEVICE_NOT_ENABLED - Device is not enabled \n
+ *               BLUETOOTH_ERROR_NOT_FOUND - Cannot find the proxy\n
+ *               BLUETOOTH_ERROR_INVALID_PARAM - Invalid parameter \n
+ *
+ * @exception  None
+ * @param[in] device_address remote device address
+ * @param[in] property proximity profile property
+ * @param[in] value alert level/property value to be set
+ * @param[out] None
+ *
+ * @remark     None
+ */
+int bluetooth_set_proximity_property(const bluetooth_device_address_t *device_address,
+                                                       bluetooth_pxp_poperty_t property, int value);
+
+/**
+ * @fn int bluetooth_get_proximity_property(const bluetooth_device_address_t *device_address,
+ *                                             bluetooth_pxp_poperty_t property, int *value);
+ *
+ * @brief Reads the Proximity alert level/properties.
+ *
+ * This function is a synchronous call.
+ *
+ * @return   BLUETOOTH_ERROR_NONE - Success \n
+ *               BLUETOOTH_ERROR_DEVICE_NOT_ENABLED - Device is not enabled \n
+ *               BLUETOOTH_ERROR_NOT_FOUND - Cannot find the proxy\n
+ *               BLUETOOTH_ERROR_INVALID_PARAM - Invalid parameter \n
+ *
+ * @exception  None
+ * @param[in] device_address remote device address
+ * @param[in] property proximity profile property
+ * @param[out] value alert level/property value
+ *
+ * @remark     None
+ */
+int bluetooth_get_proximity_property(const bluetooth_device_address_t *device_address,
+                                                       bluetooth_pxp_poperty_t property, int *value);
+
+/**
+ * @fn int bluetooth_get_proximity_supported_services(const bluetooth_device_address_t *device_address,
+ *                                             int *services_supported);
+ *
+ * @brief Reads the Proximity profile supported properties/services.
+ *
+ * This function is a synchronous call.
+ *
+ * @return   BLUETOOTH_ERROR_NONE - Success \n
+ *               BLUETOOTH_ERROR_DEVICE_NOT_ENABLED - Device is not enabled \n
+ *               BLUETOOTH_ERROR_NOT_FOUND - Cannot find the proxy\n
+ *               BLUETOOTH_ERROR_INVALID_PARAM - Invalid parameter \n
+ *
+ * @exception  None
+ * @param[in] device_address remote device address
+ * @param[out] services_supported proximity profile property/service
+ *
+ * @remark     None
+ */
+int bluetooth_get_proximity_supported_services(const bluetooth_device_address_t *device_address,
+                                                       int *services_supported);
+
+/**
+ * @fn int bluetooth_register__proximity_reporter();
+ *
+ * @brief Register all proximity related services in BlueZ.
+ *
+ * This function is a synchronous call.
+ *
+ * @return   BLUETOOTH_ERROR_NONE - Success \n
+ *           BLUETOOTH_ERROR_NOT_FOUND - Cannot find the proxy\n
+ *
+ * @exception  None
+ *
+ * @remark     None
+ */
+int bluetooth_register_proximity_reporter();
+
+/**
+ * @fn int bluetooth_unregister__proximity_reporter();
+ *
+ * @brief Unregister all proximity related services in BlueZ.
+ *
+ * This function is a synchronous call.
+ *
+ * @return   BLUETOOTH_ERROR_NONE - Success \n
+ *           BLUETOOTH_ERROR_NOT_FOUND - Cannot find the proxy\n
+ *
+ * @exception  None
+ *
+ * @remark     None
+ */
+int bluetooth_unregister_proximity_reporter();
+
+/**
  * @}
  */
 
index 000bc18..9fb39dd 100755 (executable)
@@ -61,6 +61,13 @@ typedef enum {
        BLUETOOTH_AV_STATE_DISCONNECTED,
 } bt_av_conn_status_t;
 
+typedef enum {
+       BLUETOOTH_HF_CIEV_BATTCHG,  /* BT_HF_REMOTE_DEVICE_STATE_BATTERY_LEVEL */
+       BLUETOOTH_HF_CIEV_SIGNAL,  /* BT_HF_REMOTE_DEVICE_STATE_SIGNAL_STRENGTH */
+       BLUETOOTH_HF_CIEV_SERVICE,  /* BT_HF_REMOTE_DEVICE_STATE_NETWORK_SERVICE */
+       BLUETOOTH_HF_VR_STATUS, /* BT_HF_REMOTE_DEVICE_STATE_VOICE_RECOGNITON */
+} bt_hf_ciev_device_state_t;
+
 typedef void (*bt_audio_func_ptr) (int, bt_audio_event_param_t *, void *);
 
 typedef struct {
@@ -75,14 +82,14 @@ typedef struct {
 } bt_audio_info_t;
 
 typedef enum {
-                BLUETOOTH_STATE_NONE = 0x0000,
-                BLUETOOTH_STATE_HEADSET_CONNECTED = 0x0004,
-                BLUETOOTH_STATE_A2DP_HEADSET_CONNECTED = 0x0010,
+       BLUETOOTH_STATE_NONE = 0x0000,
+       BLUETOOTH_STATE_HEADSET_CONNECTED = 0x0004,
+       BLUETOOTH_STATE_A2DP_HEADSET_CONNECTED = 0x0010,
 } bluetooth_device_state_t;
 
 /**
  * @brief      The function bluetooth_audio_init called to initializes the Audio
- *     service to bluetoothD and Global data related to audio.
+ *     service to bluetoothD and Global data related to audio.
  * @param[in]  cb      Callback function
  * @param[in]  user_data       Data sent by application, which will be
  *                             returned in event handler.
@@ -254,6 +261,8 @@ int bluetooth_hf_get_audio_connected(unsigned int *audio_connected);
 
 int bluetooth_hf_is_connected(gboolean *hf_connected);
 
+int bluetooth_hf_is_ibr_supported(gboolean*ibr_supported);
+
 #ifdef __cplusplus
 }
 #endif /*__cplusplus*/
index 47782c5..917d9f5 100755 (executable)
@@ -143,6 +143,8 @@ int bluetooth_hid_connect(hid_device_address_t *device_address);
  */
 int bluetooth_hid_disconnect(hid_device_address_t *device_address);
 
+int bluetooth_hid_enable_barcode_feature(void);
+
 /**
  * @fn int bluetooth_hid_device_init(hid_cb_func_ptr callback_ptr, void *user_data)
  * @brief Initialize HID Device service and register the callback
@@ -284,9 +286,36 @@ int bluetooth_hid_device_send_key_event(const char *remote_addr,
                hid_send_key_event_t send_event);
 
 /**
+ * @fn int bluetooth_hid_device_send_custom_event(const char *remote_addr,
+ *             unsigned char btcode, unsigned char report_id,
+ *             const char *data, unsigned int data_len)
+ *
+ * @brief write the event data on the socket.
+ *
+ * This function is a asynchronous call.
+ *
+ * @return  HID_ERROR_NONE  - Success \n
+ *              HID_ERROR_INVALID_PARAM - Invalid parameter \n
+ *              HID_ERROR_NOT_INITIALIZED - Internal Error \n
+ *              HID_ERROR_NOT_ENABLED - Not enabled \n
+ *              HID_ERROR_INTERNAL - Not enabled \n
+ *
+ * @exception   None
+ * @param[in]  remote_addr   device address of remote device.
+ * @param[in]  btcode   The btcode
+ * @param[in]  report_id   The report id
+ * @param[in]  data   This indicates the event data to send to remote device.
+ * @param[in]  data_len   The length of the data
+ * @remark      None
+ */
+int bluetooth_hid_device_send_custom_event(const char *remote_addr,
+               unsigned char btcode, unsigned char report_id,
+               const char *data, unsigned int data_len);
+
+/**
  * @fn int bluetooth_hid_device_reply_to_report(const char *remote_addr,
- *                     bluetooth_hid_header_type_t htype,
- *                     bluetooth_hid_param_type_t ptype,
+ *                     bt_hid_header_type_t htype,
+ *                     bt_hid_param_type_t ptype,
  *                     char *buffer)
  *
  * @brief write the event data on the socket.
@@ -307,8 +336,8 @@ int bluetooth_hid_device_send_key_event(const char *remote_addr,
  * @remark      None
  */
 int bluetooth_hid_device_reply_to_report(const char *remote_addr,
-               bluetooth_hid_header_type_t htype,
-               bluetooth_hid_param_type_t ptype,
+               bt_hid_header_type_t htype,
+               bt_hid_param_type_t ptype,
                const char *data,
                unsigned int data_len);
 
index d65bbc1..aac199a 100755 (executable)
@@ -51,7 +51,7 @@ typedef struct {
 } ipsp_device_address_t;
 
 /**
- * @fn int bluetooth_le_ipsp_init(void)
+ * @fn int bluetooth_ipsp_init(void)
  *
  * @brief Initializes IPSP service and register the service to Bluez
  *
@@ -68,10 +68,10 @@ typedef struct {
  * @remark      None
  *
  */
-int bluetooth_le_ipsp_init(void);
+int bluetooth_ipsp_init(void);
 
 /**
- * @fn int bluetooth_le_ipsp_deinit(void)
+ * @fn int bluetooth_ipsp_deinit(void)
  *
  * @brief De-Initialize IPSP service and un-register the callback
  * The IPSP De-Initialize request is responded by BLUETOOTH_EVENT_IPSP_INIT_STATE_CHANGED event.
@@ -86,10 +86,10 @@ int bluetooth_le_ipsp_init(void);
  * @remark      None
  *
  */
-int bluetooth_le_ipsp_deinit(void);
+int bluetooth_ipsp_deinit(void);
 
 /**
- * @fn int bluetooth_le_ipsp_connect(const ipsp_device_address_t *device_address);
+ * @fn int bluetooth_ipsp_connect(const ipsp_device_address_t *device_address);
  *
  * @brief Connects to IPSP Router device. It establishes connection for 6Lowpan over LE.
  *
@@ -103,12 +103,12 @@ int bluetooth_le_ipsp_deinit(void);
  * @param[in]  device_address - remote device address.
  *
  * @remark     None
- * @see        bluetooth_le_ipsp_disconnect()
+ * @see        bluetooth_ipsp_disconnect()
  */
-int bluetooth_le_ipsp_connect(const ipsp_device_address_t *device_address);
+int bluetooth_ipsp_connect(const ipsp_device_address_t *device_address);
 
 /**
- * @fn int bluetooth_le_ipsp_disconnect(const ipsp_device_address_t *device_address);
+ * @fn int bluetooth_ipsp_disconnect(const ipsp_device_address_t *device_address);
  *
  * @brief Disconnects to IPSP Router device. It disconnects connection for 6Lowpan over LE.
  *
@@ -122,9 +122,9 @@ int bluetooth_le_ipsp_connect(const ipsp_device_address_t *device_address);
  * @param[in]  device_address - remote device address.
  *
  * @remark     None
- * @see        bluetooth_le_ipsp_disconnect()
+ * @see        bluetooth_ipsp_disconnect()
  */
-int bluetooth_le_ipsp_disconnect(const ipsp_device_address_t *device_address);
+int bluetooth_ipsp_disconnect(const ipsp_device_address_t *device_address);
 
 
 #ifdef __cplusplus
index 493cb2f..f94a961 100755 (executable)
@@ -83,8 +83,10 @@ typedef enum {
        STOP,
        NEXT,
        PREVIOUS,
-       FAST_FORWARD,
-       REWIND
+       PRESS_FAST_FORWARD,
+       RELEASE_FAST_FORWARD,
+       PRESS_REWIND,
+       RELEASE_REWIND
 } media_player_control_cmd;
 
 typedef struct {
@@ -164,7 +166,7 @@ int bluetooth_media_player_deinit(void);
  * @param[in]   setting - The music player properties
  *
  * @remark       None
- * @see         None
+ * @see        None
  */
 int bluetooth_media_player_set_properties(
                        media_player_settings_t *setting);
@@ -185,7 +187,7 @@ int bluetooth_media_player_set_properties(
  *                      value - Value of the property which is changed
  *
  * @remark       None
- * @see         None
+ * @see        None
  */
 int bluetooth_media_player_change_property(
                        media_player_property_type type,
@@ -202,10 +204,10 @@ int bluetooth_media_player_change_property(
  *              BT_MEDIA_CONTROL_ERROR - Error \n
  *
  * @exception   None
- * @param[in]    metadata -Meida attributes
+ * @param[in]  metadata -Meida attributes
  *
  * @remark       None
- * @see         None
+ * @see        None
  */
 int bluetooth_media_player_change_track(
                        media_metadata_attributes_t *metadata);
@@ -241,7 +243,7 @@ int bluetooth_media_control_init(media_cb_func_ptr callback_ptr,
  * @remark      None
  *
  */
- int bluetooth_media_control_deinit(void);
+int bluetooth_media_control_deinit(void);
 
 /**
  * @brief      The function bluetooth_media_control_connect is called to establish an AVRCP
@@ -264,10 +266,30 @@ int bluetooth_media_control_connect(bluetooth_device_address_t *remote_address);
 int bluetooth_media_control_disconnect(bluetooth_device_address_t *remote_address);
 
 /**
+ * @brief      The function bluetooth_media_target_connect is called to establish an AVRCP
+ *     target role connection with  the specified device.
+ *
+ * @param[in]  remote_address  Bluetooth device address.
+ * @return     int     Zero on Success or reason for error if any.
+ *
+ */
+int bluetooth_media_target_connect(bluetooth_device_address_t *remote_address);
+
+/**
+ * @brief      The function bluetooth_media_target_disconnect is called to disconnect an
+ *     existing AVRCP target role connection with the specified device.
+ *
+ * @param[in]  remote_address  Bluetooth device address.
+ * @return     int     Zero on Success or reason for error if any.
+ *
+ */
+int bluetooth_media_target_disconnect(bluetooth_device_address_t *remote_address);
+
+/**
  * @brief      The function bluetooth_media_control_command is called to send
  *     the  AVRCP Control command like Play, Pause, FF, Rewind to the target device.
  *
- * @param[in]  type    media_player_control_cmd.
+ * @param[in]  type    media_player_control_cmd.
  * @return     int     Zero on Success or reason for error if any.
  *
  */
@@ -287,9 +309,9 @@ int bluetooth_media_control_command(media_player_control_cmd type);
  * @param[in]   setting - The music control properties
  *
  * @remark       None
- * @see         None
+ * @see        None
  */
- int bluetooth_media_control_set_property(media_player_property_type type, unsigned int value);
+int bluetooth_media_control_set_property(media_player_property_type type, unsigned int value);
 
 /**
  * @fn int bluetooth_media_control_get_property(media_player_property_type type, unsigned int *value)
@@ -305,7 +327,7 @@ int bluetooth_media_control_command(media_player_control_cmd type);
  * @param[in]   setting - The music control properties
  *
  * @remark       None
- * @see         None
+ * @see        None
  */
 int bluetooth_media_control_get_property(media_player_property_type type, unsigned int *value);
 
@@ -323,9 +345,9 @@ int bluetooth_media_control_get_property(media_player_property_type type, unsign
  * @param[in]   metadata - The music meta data information.
  *
  * @remark       None
- * @see         None
+ * @see        None
  */
- int bluetooth_media_control_get_track_info(media_metadata_attributes_t *metadata);
+int bluetooth_media_control_get_track_info(media_metadata_attributes_t *metadata);
 
 #ifdef __cplusplus
 }
index 17dd1d9..adc011e 100755 (executable)
@@ -146,6 +146,29 @@ typedef enum {
        BLUETOOTH_CALL_STATE_ERROR,
 } bt_telephony_call_state_t;
 
+typedef enum {
+       BLUETOOTH_AGENT_ERROR_NONE,
+       BLUETOOTH_AGENT_ERROR_INTERNAL,
+       BLUETOOTH_AGENT_ERROR_NOT_AVAILABLE,
+       BLUETOOTH_AGENT_ERROR_NOT_CONNECTED,
+       BLUETOOTH_AGENT_ERROR_BUSY,
+       BLUETOOTH_AGENT_ERROR_INVALID_PARAM,
+       BLUETOOTH_AGENT_ERROR_ALREADY_EXSIST,
+       BLUETOOTH_AGENT_ERROR_ALREADY_CONNECTED,
+       BLUETOOTH_AGENT_ERROR_NO_MEMORY,
+       BLUETOOTH_AGENT_ERROR_I_O_ERROR,
+       BLUETOOTH_AGENT_ERROR_OPERATION_NOT_AVAILABLE,
+       BLUETOOTH_AGENT_ERROR_NO_CALL_LOGS,
+       BLUETOOTH_AGENT_ERROR_INVALID_MEMORY_INDEX,
+       BLUETOOTH_AGENT_ERROR_INVALID_CHLD_INDEX,
+       BLUETOOTH_AGENT_ERROR_BATTERY_STATUS,
+       BLUETOOTH_AGENT_ERROR_SIGNAL_STATUS,
+       BLUETOOTH_AGENT_ERROR_NOT_SUPPORTED,
+       BLUETOOTH_AGENT_ERROR_INVALID_NUMBER,
+       BLUETOOTH_AGENT_ERROR_APPLICATION,
+       BLUETOOTH_AGENT_ERROR_INVALID_DTMF,
+} bluetooth_telephony_agent_error_t;
+
 typedef struct {
        unsigned int call_id;
        bt_telephony_call_state_t call_status;
@@ -301,7 +324,7 @@ gboolean bluetooth_telephony_is_sco_connected(void);
  * @return     int     Zero on Success or reason for error if any.
  *
  */
- int bluetooth_telephony_is_nrec_enabled(gboolean *status);
+int bluetooth_telephony_is_nrec_enabled(gboolean *status);
 
 /**
  * @brief      The function bluetooth_telephony_is_nrec_enabled  to check
@@ -310,14 +333,14 @@ gboolean bluetooth_telephony_is_sco_connected(void);
  * @return     int     Zero on Success or reason for error if any.
  *
  */
- int bluetooth_telephony_is_wbs_mode(gboolean *status);
+int bluetooth_telephony_is_wbs_mode(gboolean *status);
 
 /**
  * @brief This function send XSAT vendor specific AT command
  *
  * @return     int     Zero on Success or reason for error if any.
  */
- int bluetooth_telephony_send_vendor_cmd(const char *cmd);
+int bluetooth_telephony_send_vendor_cmd(const char *cmd);
 
 
 /**
@@ -325,14 +348,14 @@ gboolean bluetooth_telephony_is_sco_connected(void);
  *
  * @return     int     Zero on Success or reason for error if any.
  */
- int bluetooth_telephony_start_voice_recognition(void);
+int bluetooth_telephony_start_voice_recognition(void);
 
 /**
  * @brief This function sends request to disable voice recognition feature
  *
  * @return     int     Zero on Success or reason for error if any.
  */
- int bluetooth_telephony_stop_voice_recognition(void);
+int bluetooth_telephony_stop_voice_recognition(void);
 
 
 /**
index 64db6e4..2527ec4 100644 (file)
@@ -131,6 +131,7 @@ typedef enum {
 #define BT_FUNC_GATT_BASE ((int)(BT_FUNC_HDP_BASE + 0x0020))
 #define BT_FUNC_IPSP_BASE ((int)(BT_FUNC_GATT_BASE + 0x0020))
 #define BT_FUNC_DPM_BASE ((int)(BT_FUNC_IPSP_BASE + 0x0020))
+#define BT_FUNC_PXP_BASE ((int)(BT_FUNC_DPM_BASE + 0x0030)) /* Adding 0x0030 to base, as DPM has more use case */
 
 typedef enum {
        BT_CHECK_ADAPTER = BT_FUNC_BASE,
@@ -181,6 +182,10 @@ typedef enum {
        BT_REGISTER_SCAN_FILTER,
        BT_UNREGISTER_SCAN_FILTER,
        BT_UNREGISTER_ALL_SCAN_FILTERS,
+       BT_IS_SCAN_FILTER_SUPPORTED,
+       BT_GET_PROFILE_CONNECTED_DEVICES,
+       BT_ENABLE_FORCE_HCI_DUMP,
+       BT_SET_PASSKEY_NOTIFICATION,
        BT_BOND_DEVICE = BT_FUNC_DEVICE_BASE,
        BT_BOND_DEVICE_BY_TYPE,
        BT_CANCEL_BONDING,
@@ -190,6 +195,7 @@ typedef enum {
        BT_SEARCH_SERVICE,
        BT_CANCEL_SEARCH_SERVICE,
        BT_GET_BONDED_DEVICE,
+       BT_GET_IS_ALIAS_SET,
        BT_SET_ALIAS,
        BT_SET_AUTHORIZATION,
        BT_UNSET_AUTHORIZATION,
@@ -198,6 +204,10 @@ typedef enum {
        BT_SET_PIN_CODE,
        BT_UNSET_PIN_CODE,
        BT_UPDATE_LE_CONNECTION_MODE,
+       BT_SET_PROFILE_TRUSTED,
+       BT_GET_PROFILE_TRUSTED,
+       BT_SET_PROFILE_RESTRICTED,
+       BT_GET_PROFILE_RESTRICTED,
        BT_HID_CONNECT = BT_FUNC_HID_BASE,
        BT_HID_DISCONNECT,
        BT_HID_DEVICE_ACTIVATE,
@@ -206,7 +216,9 @@ typedef enum {
        BT_HID_DEVICE_DISCONNECT,
        BT_HID_DEVICE_SEND_MOUSE_EVENT,
        BT_HID_DEVICE_SEND_KEY_EVENT,
+       BT_HID_DEVICE_SEND_CUSTOM_EVENT,
        BT_HID_DEVICE_SEND_REPLY_TO_REPORT,
+       BT_HID_ENABLE_BARCODE_FEATURE,
        BT_NETWORK_ACTIVATE = BT_FUNC_NETWORK_BASE,
        BT_NETWORK_DEACTIVATE,
        BT_NETWORK_CONNECT,
@@ -233,6 +245,8 @@ typedef enum {
        BT_AVRCP_SET_PROPERTIES,
        BT_AVRCP_CONTROL_CONNECT,
        BT_AVRCP_CONTROL_DISCONNECT,
+       BT_AVRCP_TARGET_CONNECT,
+       BT_AVRCP_TARGET_DISCONNECT,
        BT_AVRCP_HANDLE_CONTROL,
        BT_AVRCP_CONTROL_SET_PROPERTY,
        BT_AVRCP_CONTROL_GET_PROPERTY,
@@ -240,6 +254,7 @@ typedef enum {
        BT_OPP_PUSH_FILES = BT_FUNC_OPP_BASE,
        BT_OPP_CANCEL_PUSH,
        BT_OPP_IS_PUSHING_FILES,
+       BT_OPP_GET_TRANSFER_PROGRESS,
        BT_OBEX_SERVER_ALLOCATE,
        BT_OBEX_SERVER_DEALLOCATE,
        BT_OBEX_SERVER_IS_ACTIVATED,
@@ -279,7 +294,10 @@ typedef enum {
        BT_CONNECT_LE,
        BT_DISCONNECT_LE,
        BT_SET_LE_PRIVACY,
-
+       BT_REQ_ATT_MTU,
+       BT_GET_ATT_MTU,
+       BT_GET_DEVICE_IDA,
+       BT_SET_LE_STATIC_RANDOM_ADDRESS,
        BT_HDP_CONNECT = BT_FUNC_HDP_BASE,
        BT_HDP_DISCONNECT,
        BT_HDP_SEND_DATA,
@@ -339,6 +357,11 @@ typedef enum {
        BT_DPM_GET_LIMITED_DISCOVERABLE_STATE,
        BT_DPM_SET_DATA_TRANSFER_STATE,
        BT_DPM_GET_DATA_TRANSFER_STATE,
+       BT_PXP_SET_PROPERTY = BT_FUNC_PXP_BASE,
+       BT_PXP_GET_PROPERTY,
+       BT_PXP_GET_SUPPORTED_SERIVCES,
+       BT_PXP_REGISTER_REPORTER,
+       BT_PXP_UNREGISTER_REPORTER,
 } bt_function_t;
 
 typedef struct {
@@ -360,13 +383,14 @@ typedef struct {
 #define BT_DPM_SYSPOPUP "dpm-syspopup"
 #endif
 
-#ifndef TIZEN_WEARABLE
+#ifndef TIZEN_PROFILE_WEARABLE
 #define BT_FILE_VISIBLE_TIME "file/private/libug-setting-bluetooth-efl/visibility_time"
 #endif
 
 #define BT_OFF_DUE_TO_FLIGHT_MODE "file/private/bt-core/flight_mode_deactivated"
 #define BT_OFF_DUE_TO_POWER_SAVING_MODE "file/private/bt-core/powersaving_mode_deactivated"
 #define BT_OFF_DUE_TO_TIMEOUT "file/private/bt-service/bt_off_due_to_timeout"
+#define BT_LAST_CONNECTED_DEVICE "file/private/bt-service/last_connected_device"
 
 #define BT_EVENT_SERVICE "org.projectx.bt_event"
 #define BT_HF_AGENT_SERVICE    "org.bluez.HandsfreeAgent"
@@ -417,6 +441,7 @@ typedef struct {
 #define BT_ADVERTISING_MANUFACTURER_DATA_CHANGED "AdvertisingManufacturerDataChanged"
 #define BT_SCAN_RESPONSE_MANUFACTURER_DATA_CHANGED "ScanResponseManufacturerDataChanged"
 #define BT_MANUFACTURER_DATA_CHANGED "ManufacturerDataChanged"
+#define BT_PASSKEY_NOTIFICATION "PasskeyNotification"
 #define BT_DEVICE_CONNECTED "DeviceConnected"
 #define BT_DEVICE_DISCONNECTED "DeviceDisconnected"
 #define BT_DEVICE_PROFILE_STATE_CHANGED "ProfileStateChanged"
@@ -431,9 +456,12 @@ typedef struct {
 #define BT_RSSI_MONITORING_ENABLED "RssiMonitoringEnabled"
 #define BT_RSSI_ALERT "RssiMonitoringAlert"
 #define BT_RAW_RSSI_EVENT "RawRssiEvent"
+#define BT_SUPPORTED_PROFILE_TRUSTED "SupportedProfileTrusted"
 #define BT_SERVICE_SEARCHED "ServiceSearched"
 #define BT_INPUT_CONNECTED "InputConnected"
 #define BT_INPUT_DISCONNECTED "InputDisconnected"
+#define BT_INPUT_HID_DEVICE_CONNECTED "HidDeviceConnected"
+#define BT_INPUT_HID_DEVICE_DISCONNECTED "HidDeviceDisconnected"
 #define BT_PBAP_CONNECTED "PbapConnected"
 #define BT_PBAP_DISCONNECTED "PbapDisconnected"
 #define BT_PBAP_PHONEBOOK_SIZE "PbapPhonebookSize"
@@ -484,6 +512,7 @@ typedef struct {
 #define BT_NAME_OWNER_CHANGED "NameOwnerChanged"
 #define BT_GATT_CONNECTED "GattConnected"
 #define BT_GATT_DISCONNECTED "GattDisconnected"
+#define BT_GATT_REQ_ATT_MTU_CHANGED "GattReqAttMtuChanged"
 #define BT_GATT_CHAR_VAL_CHANGED "GattCharValueChanged"
 #ifdef GATT_NO_RELAY
 #define BT_GATT_BLUEZ_CHAR_VAL_CHANGED "GattValueChanged"
@@ -496,10 +525,11 @@ typedef struct {
 #define BT_IPSP_INITIALIZED "IpspInitStateChanged"
 #define BT_IPSP_CONNECTED "IpspConnected"
 #define BT_IPSP_DISCONNECTED "IpspDisconnected"
-#define BT_IPSP_BT_INTERFACE_INFO "IpspBtInterfaceInfo"
 #define BT_LE_DATA_LENGTH_CHANGED "LEDataLengthChanged"
 #define BT_HDP_CONNECTED "HDPConnected"
 #define BT_HDP_DISCONNECTED "HDPDisconnected"
+#define BT_IBEACON_DEVICE_FOUND "iBeaconDeviceFound"
+#define BT_PXP_PROPERTY_CHANGED "PxpValueChanged"
 
 #ifdef __cplusplus
 }
index c4a37a3..859bada 100644 (file)
@@ -7,6 +7,7 @@ User=owner
 Group=users
 Type=dbus
 BusName=org.projectx.bt
+SmackProcessLabel=User
 ExecStart=/usr/bin/bt-service
 Restart=always
 RestartSec=1
index 1ca392f..894980e 100644 (file)
@@ -5,7 +5,7 @@ After=multi-user.target
 [Service]
 User=owner
 Group=users
-SupplementaryGroups=priv_mediastorage
+SupplementaryGroups=priv_mediastorage priv_externalstorage
 Type=dbus
 BusName=org.projectx.bt
 SmackProcessLabel=User
index a8c5a10..52815c3 100644 (file)
@@ -8,6 +8,7 @@ User=owner
 Group=users
 Type=dbus
 BusName=org.projectx.bt
+SmackProcessLabel=User
 ExecStart=/usr/bin/bt-service
 KillMode=process
 Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5001/dbus/user_bus_socket
index c8e953e..793d274 100644 (file)
@@ -1,15 +1,17 @@
 [Unit]
 Description=Bluetooth service
-After=multi-user.target
+After=bluetooth.service
 
 [Service]
 User=owner
 Group=users
+SupplementaryGroups=priv_mediastorage priv_externalstorage
 Type=dbus
 BusName=org.projectx.bt
+SmackProcessLabel=User
 ExecStart=/usr/bin/bt-service
 KillMode=process
 Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5001/dbus/user_bus_socket
 
 [Install]
-WantedBy=starter.target
+WantedBy=multi-user.target
\ No newline at end of file
index a8c5a10..52815c3 100644 (file)
@@ -8,6 +8,7 @@ User=owner
 Group=users
 Type=dbus
 BusName=org.projectx.bt
+SmackProcessLabel=User
 ExecStart=/usr/bin/bt-service
 KillMode=process
 Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5001/dbus/user_bus_socket
index fe06311..ee02f97 100644 (file)
@@ -4,15 +4,12 @@
 
 Name:       bluetooth-frwk
 Summary:    Bluetooth framework for BlueZ and Obexd.
-Version:    0.2.151
+Version:    0.2.152
 Release:    1
 Group:      Network & Connectivity/Bluetooth
 License:    Apache-2.0
 Source0:    %{name}-%{version}.tar.gz
 Source1001: bluetooth-frwk.manifest
-%if %{with bluetooth_frwk_libnotify} || %{with bluetooth_frwk_libnotification}
-Source1002: bt-icon.png
-%endif
 
 Requires: dbus
 Requires: syspopup
@@ -29,22 +26,10 @@ BuildRequires:  pkgconfig(dlog)
 BuildRequires:  pkgconfig(glib-2.0)
 BuildRequires:  pkgconfig(gio-2.0)
 BuildRequires:  pkgconfig(gio-unix-2.0)
-%if %{with bluetooth_frwk_libnotify}
-BuildRequires:  pkgconfig(libnotify)
-BuildRequires:  pkgconfig(gdk-pixbuf-2.0)
-BuildRequires:  pkgconfig(gtk+-3.0)
-%elif %{without bluetooth_frwk_libnotification}
-BuildRequires:  pkgconfig(syspopup-caller)
-Requires:       syspopup
-%else
 BuildRequires:  pkgconfig(syspopup-caller)
-%endif
 BuildRequires:  pkgconfig(vconf)
 BuildRequires:  pkgconfig(libxml-2.0)
 BuildRequires:  pkgconfig(dbus-1)
-%if %{with x}
-BuildRequires:  pkgconfig(utilX)
-%endif
 BuildRequires:  pkgconfig(capi-network-connection)
 BuildRequires:  pkgconfig(alarm-service)
 BuildRequires:  pkgconfig(capi-content-mime-type)
@@ -137,7 +122,7 @@ export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE"
 %define _servicedir starter.target.wants
 
 %if "%{?profile}" == "mobile"
-export CFLAGS="$CFLAGS -DTIZEN_NETWORK_TETHERING_ENABLE -DTIZEN_BT_FLIGHTMODE_ENABLED -DTIZEN_MOBILE -DTIZEN_TELEPHONY_ENABLED"
+export CFLAGS="$CFLAGS -DTIZEN_FEATURE_NETWORK_TETHERING_ENABLE -DTIZEN_FEATURE_FLIGHTMODE_ENABLED -DTIZEN_PROFILE_MOBILE -DTIZEN_FEATURE_TELEPHONY_ENABLED"
 %if "%{?tizen_target_name}" == "TM1"
 %define _servicefile packaging/bluetooth-frwk-mobile-sprd.service
 %else
@@ -147,14 +132,20 @@ export CFLAGS="$CFLAGS -DTIZEN_NETWORK_TETHERING_ENABLE -DTIZEN_BT_FLIGHTMODE_EN
 %endif
 
 %if "%{?profile}" == "wearable"
-export CFLAGS="$CFLAGS -DTIZEN_WEARABLE -DTIZEN_BT_FLIGHTMODE_ENABLED"
+export CFLAGS="$CFLAGS -DTIZEN_PROFILE_WEARABLE -DTIZEN_FEATURE_FLIGHTMODE_ENABLED"
 %define _servicefile packaging/bluetooth-frwk-wearable.service
 %define _servicedir multi-user.target.wants
 %endif
 
 %if "%{?profile}" == "tv"
 export CFLAGS="$CFLAGS -DUSB_BLUETOOTH -DTIZEN_TV -DAUTO_ACCEPT"
-%define _servicefile packaging/bluetooth-frwk-mobile.service
+%define _servicefile packaging/bluetooth-frwk-tv.service
+%define _servicedir multi-user.target.wants
+%endif
+
+%if "%{?profile}" == "ivi"
+export CFLAGS="$CFLAGS -DTIZEN_PROFILE_IVI"
+%define _servicefile packaging/bluetooth-frwk-wearable.service
 %define _servicedir multi-user.target.wants
 %endif
 
@@ -173,9 +164,15 @@ export CFLAGS="$CFLAGS -DRFCOMM_DIRECT"
 export LDFLAGS="$CFLAGS -Wl,--rpath=%{_libdir} -Wl,--as-needed -Wl,--unresolved-symbols=ignore-in-shared-libs"
 
 %if "%{?_with_emulator}" == "1"
-export CFLAGS="$CFLAGS -DEMUL"
-export CXXFLAGS="$CXXFLAGS -DEMUL"
-export FFLAGS="$FFLAGS -DEMUL"
+export CFLAGS="$CFLAGS -DTIZEN_TEST_EMUL"
+export CXXFLAGS="$CXXFLAGS -DTIZEN_TEST_EMUL"
+export FFLAGS="$FFLAGS -DTIZEN_TEST_EMUL"
+%endif
+
+%if "%{?tizen_target_name}" == "TM1"
+export CFLAGS="${CFLAGS} -DTIZEN_FEATURE_RADIO"
+export CXXFLAGS="$CXXFLAGS -DTIZEN_FEATURE_RADIO"
+export FFLAGS="$FFLAGS -DTIZEN_FEATURE_RADIO"
 %endif
 
 %if %{bt_hal} == ENABLED
@@ -195,27 +192,18 @@ cmake . -DCMAKE_INSTALL_PREFIX=/usr \
 -DCMAKE_LIB_DIR=%{_libdir} \
 -DTZ_SYS_USER_GROUP=%TZ_SYS_USER_GROUP \
 -DTZ_SYS_DEFAULT_USER=%TZ_SYS_DEFAULT_USER \
-%if %{with bluetooth_frwk_libnotify}
-       -DLIBNOTIFY_SUPPORT=On \
-%else
        -DLIBNOTIFY_SUPPORT=Off \
-%endif
-%if %{with bluetooth_frwk_libnotification}
-       -DLIBNOTIFICATION_SUPPORT=On
-%else
        -DLIBNOTIFICATION_SUPPORT=Off
-%endif
-
 make
 
 %cmake \
 %if "%{?profile}" == "wearable"
-       -DTIZEN_WEARABLE=YES \
+       -DTIZEN_PROFILE_WEARABLE=YES \
 %else
-       -DTIZEN_WEARABLE=NO \
+       -DTIZEN_PROFILE_WEARABLE=NO \
 %endif
 %if "%{?profile}" == "common"
-        -DTIZEN_WEARABLE=NO \
+        -DTIZEN_PROFILE_WEARABLE=NO \
 %endif
 
 %install
@@ -233,11 +221,6 @@ mkdir -p %{buildroot}%{_unitdir}/%{_servicedir}
 install -m 0644 %{_servicefile} %{buildroot}%{_unitdir}/bluetooth-frwk.service
 ln -s ../bluetooth-frwk.service %{buildroot}%{_unitdir}/%{_servicedir}/bluetooth-frwk.service
 
-%if %{with bluetooth_frwk_libnotify} || %{with bluetooth_frwk_libnotification}
-mkdir -p %{buildroot}%{_datadir}/icons/default
-install -m 0644 %{SOURCE1002} %{buildroot}%{_datadir}/icons/default/bt-icon.png
-%endif
-
 # On IVI bt-service needs to be run as 'app' even if there is a 'guest' user.
 %if "%{profile}"=="ivi"
 sed -i 's/%TZ_SYS_DEFAULT_USER/app/' %{buildroot}%{_datadir}/dbus-1/system-services/org.projectx.bt.service
@@ -310,12 +293,7 @@ sed -i 's/%TZ_SYS_DEFAULT_USER/app/' %{buildroot}%{_datadir}/dbus-1/system-servi
 #%attr(0666,-,-) %{_varlibdir}/bluetooth/auto-pair-blacklist
 #%attr(0666,-,-) %{_prefix}/etc/bluetooth/stack_info
 #%{_dumpdir}/bluetooth_log_dump.sh
-
-
 %{_datadir}/license/bluetooth-frwk-service
-%if %{with bluetooth_frwk_libnotify} || %{with bluetooth_frwk_libnotification}
-%{_datadir}/icons/default/bt-icon.png
-%endif
 
 %files httpproxy
 %manifest %{name}.manifest
index 37e1396..bd40794 100644 (file)
@@ -34,8 +34,5 @@ TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${package_LDFLAGS}
 
 INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin)
 
-#ADD_SUBDIRECTORY(media-control)
-#ADD_SUBDIRECTORY(telephony)
 ADD_SUBDIRECTORY(gatt-test)
-#ADD_SUBDIRECTORY(handsfree)
 ADD_SUBDIRECTORY(le-adv)
index 79c663d..643679b 100644 (file)
@@ -243,11 +243,10 @@ void tc_usage_print(void)
        int i = 0;
 
        while (tc_table[i].tc_name) {
-               if (tc_table[i].tc_code != 0x00ff) {
+               if (tc_table[i].tc_code != 0x00ff)
                        TC_PRT("Key %d : usage %s", tc_table[i].tc_code, tc_table[i].tc_name);
-               } else {
+               else
                        TC_PRT("Key %d : usage %s\n\n", 0x00ff, tc_table[i].tc_name);
-               }
 
                i++;
        }
@@ -275,892 +274,964 @@ int test_input_callback(void *data)
        TC_PRT("TC : %s[%d]", tc_table[test_id].tc_name, tc_table[test_id].tc_code);
 
        switch (tc_table[test_id].tc_code) {
-               case 0x00ff:
-                       TC_PRT("Finished");
-                       g_main_loop_quit(main_loop);
-                       break;
+       case 0x00ff:
+               TC_PRT("Finished");
+               g_main_loop_quit(main_loop);
+               break;
+
+       case 1:
+               bluetooth_register_callback(bt_event_callback, NULL);
+               if (ret < 0) {
+                       TC_PRT("%s failed with [0x%04x]", tc_table[0].tc_name, ret);
+                       tc_result(TC_FAIL, 1);
+               }
+               break;
+
+       case 2:
+               bluetooth_unregister_callback();
+               if (ret < 0) {
+                       TC_PRT("%s failed with [0x%04x]", tc_table[1].tc_name, ret);
+                       tc_result(TC_FAIL, 1);
+               }
+               break;
+
+       case 3:
+       ret = bluetooth_enable_adapter();
+       if (ret < 0) {
+                       TC_PRT("%s failed with [0x%04x]", tc_table[2].tc_name, ret);
+                       tc_result(TC_FAIL, 1);
+               }
+               break;
+
+       case 4:
+               ret = bluetooth_disable_adapter();
+               if (ret < 0) {
+                       TC_PRT("%s failed with [0x%04x]", tc_table[3].tc_name, ret);
+                       tc_result(TC_FAIL, 2);
+               }
+               break;
+
+       case 5:
+       {
+               ret = bluetooth_check_adapter();
+               TC_PRT("state: %d", ret);
+               break;
+       }
 
-               case 1:
-                       bluetooth_register_callback(bt_event_callback, NULL);
-                       if (ret < 0) {
-                               TC_PRT("%s failed with [0x%04x]", tc_table[0].tc_name, ret);
-                               tc_result(TC_FAIL, 1);
-                       }
-                       break;
+       case 6:
+       {
+               bluetooth_device_address_t address = { {0} };
+               ret = bluetooth_get_local_address(&address);
+               if (ret < 0) {
+                       TC_PRT("%s failed with [0x%04x]", tc_table[5].tc_name, ret);
+               } else {
+                       TC_PRT("dev [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]", \
+                               address.addr[0], address.addr[1], address.addr[2], \
+                               address.addr[3], address.addr[4], address.addr[5]);
+               }
+               break;
+       }
 
-               case 2:
-                       bluetooth_unregister_callback();
-                       if (ret < 0) {
-                               TC_PRT("%s failed with [0x%04x]", tc_table[1].tc_name, ret);
-                               tc_result(TC_FAIL, 1);
-                       }
-                       break;
+       case 7:
+       {
+               bluetooth_device_name_t local_name = { {0} };
+                       ret = bluetooth_get_local_name(&local_name);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[6].tc_name, ret);
+               else
+                       TC_PRT("name: %s", local_name.name);
 
-               case 3:
-                       ret = bluetooth_enable_adapter();
-                       if (ret < 0) {
-                               TC_PRT("%s failed with [0x%04x]", tc_table[2].tc_name, ret);
-                               tc_result(TC_FAIL, 1);
-                       }
-                       break;
+               break;
+       }
 
-               case 4:
-                       ret = bluetooth_disable_adapter();
-                       if (ret < 0) {
-                               TC_PRT("%s failed with [0x%04x]", tc_table[3].tc_name, ret);
-                               tc_result(TC_FAIL, 2);
-                       }
-                       break;
+       case 8:
+       {
+               bluetooth_device_name_t local_name = { {0} };
+               snprintf(local_name.name, sizeof(local_name.name),
+                       "bt-frwk-pid-%d", getpid());
+               ret = bluetooth_set_local_name(&local_name);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[7].tc_name, ret);
 
-               case 5:
-               {
-                       ret = bluetooth_check_adapter();
-                       TC_PRT("state: %d", ret);
-                       break;
-               }
+               break;
+       }
 
-               case 6:
-               {
-                       bluetooth_device_address_t address = { {0} };
-                       ret = bluetooth_get_local_address(&address);
-                       if (ret < 0) {
-                               TC_PRT("%s failed with [0x%04x]", tc_table[5].tc_name, ret);
-                       } else {
-                               TC_PRT("dev [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]", \
-                                       address.addr[0], address.addr[1], address.addr[2], \
-                                       address.addr[3], address.addr[4], address.addr[5]);
-                       }
-                       break;
-               }
+       case 90:
+       {
+               bluetooth_version_t local_version = { {0} };
+               snprintf(local_version.version, sizeof(local_version.version),
+                               "version%d", getpid());
+                       ret = bluetooth_get_local_version(&local_version);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[89].tc_name, ret);
+               else
+                       TC_PRT("version: %s", local_version.version);
+               break;
+       }
 
-               case 7:
-               {
-                       bluetooth_device_name_t local_name = { {0} };
+       case 9:
+       {
+               gboolean used = FALSE;
+                       ret = bluetooth_is_service_used(rfcomm_test_uuid_spp, &used);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[8].tc_name, ret);
+               else
+                       TC_PRT("used: %d", used);
+               break;
+       }
 
-                       ret = bluetooth_get_local_name(&local_name);
-                       if (ret < 0) {
-                               TC_PRT("%s failed with [0x%04x]", tc_table[6].tc_name, ret);
-                       } else {
-                               TC_PRT("name: %s", local_name.name);
-                       }
-                       break;
-               }
+       case 10:
+       {
+               bluetooth_discoverable_mode_t mode;
+               ret = bluetooth_get_discoverable_mode(&mode);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[9].tc_name, ret);
+               else
+                       TC_PRT("BT Get Discoverable mode [%d]", mode);
+               break;
+       }
 
-               case 8:
-               {
-                       bluetooth_device_name_t local_name = { {0} };
-                       snprintf(local_name.name, sizeof(local_name.name),
-                                       "bt-frwk-pid-%d", getpid());
+       case 11:
+       {
+               bluetooth_discoverable_mode_t mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
+               ret = bluetooth_set_discoverable_mode(mode, 0);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[10].tc_name, ret);
+               else
+                       TC_PRT("BT Set Discoverable mode [%d]", mode);
+               break;
+       }
 
-                       ret = bluetooth_set_local_name(&local_name);
-                       if (ret < 0) {
-                               TC_PRT("%s failed with [0x%04x]", tc_table[7].tc_name, ret);
-                       }
-                       break;
-               }
+       case 12:
+       {
+               bluetooth_discoverable_mode_t mode = BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE;
+               ret = bluetooth_set_discoverable_mode(mode, 0);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[11].tc_name, ret);
+               else
+                       TC_PRT("BT Set Discoverable mode [%d]", mode);
+               break;
+       }
 
-               case 90:
-               {
-                       bluetooth_version_t local_version = { {0} };
-                       snprintf(local_version.version, sizeof(local_version.version),
-                                       "version%d", getpid());
+       case 13:
+       {
+               bluetooth_discoverable_mode_t mode = BLUETOOTH_DISCOVERABLE_MODE_TIME_LIMITED_DISCOVERABLE;
+               ret = bluetooth_set_discoverable_mode(mode, 5);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[12].tc_name, ret);
+               else
+                       TC_PRT("BT Set Discoverable mode [%d]", mode);
+               break;
+       }
 
-                       ret = bluetooth_get_local_version(&local_version);
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[89].tc_name, ret);
-                       else
-                               TC_PRT("version: %s", local_version.version);
-                       break;
-               }
+       case 14:
+               ret = bluetooth_start_discovery(0, 0, 0);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[13].tc_name, ret);
+               break;
+
+       case 15:
+               ret = bluetooth_cancel_discovery();
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[14].tc_name, ret);
+               break;
+
+       case 16:
+       {
+               ret = bluetooth_is_discovering();
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[15].tc_name, ret);
+               else
+                       TC_PRT("Discovering [%d]", ret);
+               break;
+       }
 
-               case 9:
-               {
-                       gboolean used = FALSE;
+       case 17: /*Get paired device list */
+       {
+               GPtrArray *devinfo = NULL;
+               devinfo = g_ptr_array_new();
+               TC_PRT("g pointer arrary count : [%d]", devinfo->len);
 
-                       ret = bluetooth_is_service_used(rfcomm_test_uuid_spp, &used);
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[8].tc_name, ret);
-                       else
-                               TC_PRT("used: %d", used);
-                       break;
+               ret = bluetooth_get_bonded_device_list(&devinfo);
+               if (ret < 0) {
+                       TC_PRT("%s failed with [0x%04x]", tc_table[16].tc_name, ret);
+               } else {
+                       int i;
+                       bluetooth_device_info_t *ptr;
+                       TC_PRT("g pointer arrary count : [%d]", devinfo->len);
+                               for (i = 0; i < devinfo->len; i++) {
+                               ptr = g_ptr_array_index(devinfo, i);
+                               if (ptr != NULL) {
+                                       TC_PRT("Name [%s]", ptr->device_name.name);
+                                       TC_PRT("Major Class [%d]", ptr->device_class.major_class);
+                                       TC_PRT("Minor Class [%d]", ptr->device_class.minor_class);
+                                       TC_PRT("Service Class [%d]", ptr->device_class.service_class);
+                                       TC_PRT("%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X", ptr->device_address.addr[0], ptr->device_address.addr[1], ptr->device_address.addr[2], ptr->device_address.addr[3], ptr->device_address.addr[4], ptr->device_address.addr[5]);
+                                       TC_PRT("\n");
+                               }
+                       }
                }
+               g_ptr_array_free(devinfo, TRUE);
 
-               case 10:
-               {
-                       bluetooth_discoverable_mode_t mode;
-                       ret = bluetooth_get_discoverable_mode(&mode);
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[9].tc_name, ret);
-                       else
-                               TC_PRT("BT Get Discoverable mode [%d]", mode);
-                       break;
-               }
+               break;
+       }
 
-               case 11:
-               {
-                       bluetooth_discoverable_mode_t mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
-                       ret = bluetooth_set_discoverable_mode(mode, 0);
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[10].tc_name, ret);
-                       else
-                               TC_PRT("BT Set Discoverable mode [%d]", mode);
+       case 18:
+       {
+               bluetooth_device_address_t device_address = { {0xDC, 0x2C, 0x26, 0xD0, 0xF3, 0xC1} }; /* BT Keyboard */
+                       TC_PRT("dev [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]", \
+                       device_address.addr[0], device_address.addr[1], device_address.addr[2], \
+                       device_address.addr[3], device_address.addr[4], device_address.addr[5]);
+                       ret = bluetooth_bond_device(&device_address);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[17].tc_name, ret);
                        break;
-               }
+       }
 
-               case 12:
-               {
-                       bluetooth_discoverable_mode_t mode = BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE;
-                       ret = bluetooth_set_discoverable_mode(mode, 0);
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[11].tc_name, ret);
-                       else
-                               TC_PRT("BT Set Discoverable mode [%d]", mode);
+       case 19: /*Cancel bonding */
+       {
+               ret = bluetooth_cancel_bonding();
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[18].tc_name, ret);
                        break;
-               }
+       }
 
-               case 13:
-               {
-                       bluetooth_discoverable_mode_t mode = BLUETOOTH_DISCOVERABLE_MODE_TIME_LIMITED_DISCOVERABLE;
-                       ret = bluetooth_set_discoverable_mode(mode, 5);
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[12].tc_name, ret);
-                       else
-                               TC_PRT("BT Set Discoverable mode [%d]", mode);
+       case 20: /*unbonding */
+       {
+               bluetooth_device_address_t device_address = { {0x00, 0x19, 0x0E, 0x01, 0x61, 0x17} }; /* DO-DH79-PYUN04 */
+               ret = bluetooth_unbond_device(&device_address);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[19].tc_name, ret);
                        break;
+       }
+
+       case 21: /*Get paired device */
+       {
+               bluetooth_device_info_t devinfo;
+               bluetooth_device_address_t device_address = { {0x00, 0x16, 0x38, 0xC3, 0x1F, 0xD2} };
+                       memset(&devinfo, 0x00, sizeof(bluetooth_device_info_t));
+                       ret = bluetooth_get_bonded_device(&device_address, &devinfo);
+               if (ret != BLUETOOTH_ERROR_NONE) {
+                       TC_PRT("bluetooth_get_bonded_device failed with [%d]", ret);
+               } else {
+                       TC_PRT("Name [%s]", devinfo.device_name.name);
+                       TC_PRT("Major Class [%d]", devinfo.device_class.major_class);
+                       TC_PRT("Minor Class [%d]", devinfo.device_class.minor_class);
+                       TC_PRT("Service Class [%d]", devinfo.device_class.service_class);
+                       TC_PRT("%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X", devinfo.device_address.addr[0], devinfo.device_address.addr[1], devinfo.device_address.addr[2], devinfo.device_address.addr[3], devinfo.device_address.addr[4], devinfo.device_address.addr[5]);
                }
 
-               case 14:
-                       ret = bluetooth_start_discovery(0, 0, 0);
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[13].tc_name, ret);
-                       break;
+               break;
+       }
 
-               case 15:
-                       ret = bluetooth_cancel_discovery();
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[14].tc_name, ret);
-                       break;
+       case 22: /*set alias for bonded device */
+       {
+               bluetooth_device_address_t device_address = { {0x00, 0x16, 0x38, 0xC3, 0x1F, 0xD2} };
 
-               case 16:
-               {
-                       ret = bluetooth_is_discovering();
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[15].tc_name, ret);
-                       else
-                               TC_PRT("Discovering [%d]", ret);
-                       break;
-               }
+               ret = bluetooth_set_alias(&device_address, "Renamed device");
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[21].tc_name, ret);
 
-               case 17: /*Get paired device list */
-               {
-                       GPtrArray *devinfo = NULL;
-                       devinfo = g_ptr_array_new();
-                       TC_PRT("g pointer arrary count : [%d]", devinfo->len);
+               break;
+       }
 
-                       ret = bluetooth_get_bonded_device_list(&devinfo);
-                       if (ret < 0) {
-                               TC_PRT("%s failed with [0x%04x]", tc_table[16].tc_name, ret);
-                       } else {
-                               int i;
-                               bluetooth_device_info_t *ptr;
-                               TC_PRT("g pointer arrary count : [%d]", devinfo->len);
+       case 23:
+       {
+               bluetooth_device_address_t device_address = { {0x00, 0x16, 0x38, 0xC3, 0x1F, 0xD2} };
+               ret = bluetooth_authorize_device(&device_address, TRUE);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[22].tc_name, ret);
 
-                               for (i = 0; i < devinfo->len; i++) {
-                                       ptr = g_ptr_array_index(devinfo, i);
-                                       if (ptr != NULL) {
-                                               TC_PRT("Name [%s]", ptr->device_name.name);
-                                               TC_PRT("Major Class [%d]", ptr->device_class.major_class);
-                                               TC_PRT("Minor Class [%d]", ptr->device_class.minor_class);
-                                               TC_PRT("Service Class [%d]", ptr->device_class.service_class);
-                                               TC_PRT("%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X", ptr->device_address.addr[0], ptr->device_address.addr[1], ptr->device_address.addr[2], ptr->device_address.addr[3], ptr->device_address.addr[4], ptr->device_address.addr[5]);
-                                               TC_PRT("\n");
-                                       }
-                               }
-                       }
-                       g_ptr_array_free(devinfo, TRUE);
+               break;
+       }
 
+       case 24:
+       {
+               bluetooth_device_address_t device_address = { {0x00, 0x16, 0x38, 0xC3, 0x1F, 0xD2} };
+               ret = bluetooth_authorize_device(&device_address, FALSE);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[23].tc_name, ret);
                        break;
-               }
+       }
+       case 25:
+       {
+               bluetooth_device_address_t device_address = { {0x00, 0x16, 0x38, 0xC3, 0x1F, 0xD2} };
 
-               case 18:
-               {
-                       bluetooth_device_address_t device_address = { {0xDC, 0x2C, 0x26, 0xD0, 0xF3, 0xC1} }; /* BT Keyboard */
+               ret = bluetooth_search_service(&device_address);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[24].tc_name, ret);
 
-                       TC_PRT("dev [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]", \
-                               device_address.addr[0], device_address.addr[1], device_address.addr[2], \
-                               device_address.addr[3], device_address.addr[4], device_address.addr[5]);
+               break;
+       }
 
-                       ret = bluetooth_bond_device(&device_address);
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[17].tc_name, ret);
-                       break;
+       case 26:
+       {
+               ret = bluetooth_cancel_service_search();
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[24].tc_name, ret);
+               break;
+       }
+
+       case 27:
+       {
+               gboolean connected = FALSE;
+               bluetooth_device_address_t device_address = { {0x00, 0x1B, 0x66, 0x01, 0x23, 0x1C} }; /* Gennheiser PX210BT */
+
+               ret = bluetooth_is_device_connected(&device_address, BLUETOOTH_A2DP_SERVICE, &connected);
+               if (ret < 0) {
+                       TC_PRT("%s failed with [0x%04x]", tc_table[24].tc_name, ret);
+                       TC_PRT("connected : %d", connected);
                }
 
+               break;
+       }
 
-               case 19: /*Cancel bonding */
-               {
-                       ret = bluetooth_cancel_bonding();
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[18].tc_name, ret);
+       case 28:
+       {
+               ret = bluetooth_reset_adapter();
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[27].tc_name, ret);
 
-                       break;
-               }
+               break;
+       }
 
-               case 20: /*unbonding */
-               {
-                       bluetooth_device_address_t device_address = { {0x00, 0x19, 0x0E, 0x01, 0x61, 0x17} }; /* DO-DH79-PYUN04 */
-                       ret = bluetooth_unbond_device(&device_address);
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[19].tc_name, ret);
+       case 91:
+       {
+               bluetooth_manufacturer_data_t m_data;
+               guint8 data[6]  = {0x05, 0xFF, 0x02, 0x03, 0x04, 0x05};
+               TC_PRT("%x %x %x %x %x %x", data[0], data[1], data[2], data[3],
+                               data[4], data[5]);
+
+               memcpy(m_data.data, data, sizeof(data));
+               m_data.data_len = sizeof(data) - 2;
+               ret = bluetooth_set_manufacturer_data(&m_data);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[90].tc_name, ret);
+               break;
+       }
 
-                       break;
-               }
+       case 29:
+       {
+               ret = bluetooth_audio_init(bt_audio_event_callback, NULL);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[28].tc_name, ret);
 
-               case 21: /*Get paired device */
-               {
-                       bluetooth_device_info_t devinfo;
-                       bluetooth_device_address_t device_address = { {0x00, 0x16, 0x38, 0xC3, 0x1F, 0xD2} };
+               break;
+       }
 
-                       memset(&devinfo, 0x00, sizeof(bluetooth_device_info_t));
+       case 30:
+       {
+               ret = bluetooth_audio_deinit();
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[29].tc_name, ret);
 
-                       ret = bluetooth_get_bonded_device(&device_address, &devinfo);
-                       if (ret != BLUETOOTH_ERROR_NONE) {
-                               TC_PRT("bluetooth_get_bonded_device failed with [%d]", ret);
-                       } else {
-                               TC_PRT("Name [%s]", devinfo.device_name.name);
-                               TC_PRT("Major Class [%d]", devinfo.device_class.major_class);
-                               TC_PRT("Minor Class [%d]", devinfo.device_class.minor_class);
-                               TC_PRT("Service Class [%d]", devinfo.device_class.service_class);
-                               TC_PRT("%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X", devinfo.device_address.addr[0], devinfo.device_address.addr[1], devinfo.device_address.addr[2], devinfo.device_address.addr[3], devinfo.device_address.addr[4], devinfo.device_address.addr[5]);
-                       }
+               break;
+       }
 
-                       break;
-               }
+       case 31:
+       {
+               bluetooth_device_address_t device_address = { {0x00, 0x0D, 0xFD, 0x24, 0x5E, 0xFF} }; /* Motorola S9 */
 
-               case 22: /*set alias for bonded device */
-               {
-                       bluetooth_device_address_t device_address = { {0x00, 0x16, 0x38, 0xC3, 0x1F, 0xD2} };
+               ret = bluetooth_audio_connect(&device_address);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[30].tc_name, ret);
 
-                       ret = bluetooth_set_alias(&device_address, "Renamed device");
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[21].tc_name, ret);
-                       break;
-               }
+               break;
+       }
 
-               case 23:
-               {
-                       bluetooth_device_address_t device_address = { {0x00, 0x16, 0x38, 0xC3, 0x1F, 0xD2} };
+       case 32:
+       {
+               bluetooth_device_address_t device_address = { {0x00, 0x0D, 0xFD, 0x24, 0x5E, 0xFF} }; /* Motorola S9 */
 
-                       ret = bluetooth_authorize_device(&device_address, TRUE);
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[22].tc_name, ret);
-                       break;
-               }
-               case 24:
-               {
-                       bluetooth_device_address_t device_address = { {0x00, 0x16, 0x38, 0xC3, 0x1F, 0xD2} };
+               ret = bluetooth_audio_disconnect(&device_address);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[31].tc_name, ret);
+               break;
+       }
 
-                       ret = bluetooth_authorize_device(&device_address, FALSE);
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[23].tc_name, ret);
-                       break;
-               }
-               case 25:
-               {
-                       bluetooth_device_address_t device_address = { {0x00, 0x16, 0x38, 0xC3, 0x1F, 0xD2} };
+       case 33:
+       {
+               /* MW600 */
+               bluetooth_device_address_t device_address = { {0x58, 0x17, 0x0C, 0xEC, 0x6A, 0xF3} };
 
-                       ret = bluetooth_search_service(&device_address);
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[24].tc_name, ret);
-                       break;
-               }
-               case 26:
-               {
-                       ret = bluetooth_cancel_service_search();
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[24].tc_name, ret);
-                       break;
-               }
-               case 27:
-               {
-                       gboolean connected = FALSE;
-                       bluetooth_device_address_t device_address = { {0x00, 0x1B, 0x66, 0x01, 0x23, 0x1C} }; /* Gennheiser PX210BT */
+               ret = bluetooth_ag_connect(&device_address);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[32].tc_name, ret);
+               break;
+       }
+       case 34:
+       {
+               /* MW600 */
+               bluetooth_device_address_t device_address = { {0x58, 0x17, 0x0C, 0xEC, 0x6A, 0xF3} };
+
+               ret = bluetooth_ag_disconnect(&device_address);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[33].tc_name, ret);
+               break;
+       }
 
-                       ret = bluetooth_is_device_connected(&device_address, BLUETOOTH_A2DP_SERVICE, &connected);
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[24].tc_name, ret);
+       case 35:
+       {
+               /* MW600 */
+               bluetooth_device_address_t device_address = { {0x58, 0x17, 0x0C, 0xEC, 0x6A, 0xF3} };
 
-                       TC_PRT("connected : %d", connected);
-                       break;
-               }
-               case 28:
-               {
-                       ret = bluetooth_reset_adapter();
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[27].tc_name, ret);
-                       break;
-               }
-               case 91:
-               {
-                       bluetooth_manufacturer_data_t m_data;
-                       guint8 data[6]  = {0x05, 0xFF, 0x02, 0x03, 0x04, 0x05};
-
-                       TC_PRT("%x %x %x %x %x %x", data[0], data[1], data[2], data[3],
-                                       data[4], data[5]);
-                       memcpy(m_data.data, data, sizeof(data));
-                       m_data.data_len = sizeof(data) - 2;
-                       ret = bluetooth_set_manufacturer_data(&m_data);
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[90].tc_name, ret);
-                       break;
-               }
-               case 29:
-               {
-                       ret = bluetooth_audio_init(bt_audio_event_callback, NULL);
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[28].tc_name, ret);
-                       break;
-               }
-               case 30:
-               {
-                       ret = bluetooth_audio_deinit();
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[29].tc_name, ret);
-                       break;
-               }
-               case 31:
-               {
-                       bluetooth_device_address_t device_address = { {0x00, 0x0D, 0xFD, 0x24, 0x5E, 0xFF} }; /* Motorola S9 */
+               ret = bluetooth_av_connect(&device_address);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[34].tc_name, ret);
+               break;
+       }
 
-                       ret = bluetooth_audio_connect(&device_address);
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[30].tc_name, ret);
-                       break;
-               }
-               case 32:
-               {
-                       bluetooth_device_address_t device_address = { {0x00, 0x0D, 0xFD, 0x24, 0x5E, 0xFF} }; /* Motorola S9 */
+       case 36:
+       {
+               /* MW600 */
+               bluetooth_device_address_t device_address = { {0x58, 0x17, 0x0C, 0xEC, 0x6A, 0xF3} };
 
-                       ret = bluetooth_audio_disconnect(&device_address);
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[31].tc_name, ret);
-                       break;
-               }
-               case 33:
-               {
-                       /* MW600 */
-                       bluetooth_device_address_t device_address = { {0x58, 0x17, 0x0C, 0xEC, 0x6A, 0xF3} };
-
-                       ret = bluetooth_ag_connect(&device_address);
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[32].tc_name, ret);
-                       break;
-               }
-               case 34:
-               {
-                       /* MW600 */
-                       bluetooth_device_address_t device_address = { {0x58, 0x17, 0x0C, 0xEC, 0x6A, 0xF3} };
-
-                       ret = bluetooth_ag_disconnect(&device_address);
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[33].tc_name, ret);
-                       break;
-               }
-               case 35:
-               {
-                       /* MW600 */
-                       bluetooth_device_address_t device_address = { {0x58, 0x17, 0x0C, 0xEC, 0x6A, 0xF3} };
-
-                       ret = bluetooth_av_connect(&device_address);
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[34].tc_name, ret);
-                       break;
-               }
-               case 36:
-               {
-                       /* MW600 */
-                       bluetooth_device_address_t device_address = { {0x58, 0x17, 0x0C, 0xEC, 0x6A, 0xF3} };
-
-                       ret = bluetooth_av_disconnect(&device_address);
-                       if (ret < 0)
-                               TC_PRT("%s failed with [0x%04x]", tc_table[35].tc_name, ret);
-                       break;
-               }
-               case 37:
-               {
-                       unsigned int volume = 0;
+               ret = bluetooth_av_disconnect(&device_address);
+               if (ret < 0)
+                       TC_PRT("%s failed with [0x%04x]", tc_table[35].tc_name, ret);
 
-                       ret = bluetooth_ag_get_headset_volume(&volume);
-                       if (ret < 0)
-                               TC_PRT("failed with [0x%04x]", ret);
+               break;
+       }
+
+       case 37:
+       {
+               unsigned int volume = 0;
 
+               ret = bluetooth_ag_get_headset_volume(&volume);
+               if (ret < 0) {
+                       TC_PRT("failed with [0x%04x]", ret);
                        TC_PRT("volume: %d", volume);
-                       break;
-               }
-               case 38:
-               {
-                       ret = bluetooth_ag_set_speaker_gain(10);
-                       if (ret < 0)
-                               TC_PRT("failed with [0x%04x]", ret);
-                       break;
                }
 
-               case 39:
-               {
-                       if (bluetooth_oob_read_local_data(&g_local_oob_data.oob_data)) {
-                               TC_PRT("ERROR in bluetooth_oob_read_local_data\n");
-                       } else {
-                               TC_PRT("SUCESS in bluetooth_oob_read_local_data\n");
-                               TC_PRT("hash = [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X"
-                                       "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]\n",
-                                       g_local_oob_data.oob_data.hash[0],
-                                       g_local_oob_data.oob_data.hash[1],
-                                       g_local_oob_data.oob_data.hash[2],
-                                       g_local_oob_data.oob_data.hash[3],
-                                       g_local_oob_data.oob_data.hash[4],
-                                       g_local_oob_data.oob_data.hash[5],
-                                       g_local_oob_data.oob_data.hash[6],
-                                       g_local_oob_data.oob_data.hash[7],
-                                       g_local_oob_data.oob_data.hash[8],
-                                       g_local_oob_data.oob_data.hash[9],
-                                       g_local_oob_data.oob_data.hash[10],
-                                       g_local_oob_data.oob_data.hash[11],
-                                       g_local_oob_data.oob_data.hash[12],
-                                       g_local_oob_data.oob_data.hash[13],
-                                       g_local_oob_data.oob_data.hash[14],
-                                       g_local_oob_data.oob_data.hash[15]);
-
-                               TC_PRT("randomizer = [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X"
-                                       "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]\n",
-                                       g_local_oob_data.oob_data.randomizer[0],
-                                       g_local_oob_data.oob_data.randomizer[1],
-                                       g_local_oob_data.oob_data.randomizer[2],
-                                       g_local_oob_data.oob_data.randomizer[3],
-                                       g_local_oob_data.oob_data.randomizer[4],
-                                       g_local_oob_data.oob_data.randomizer[5],
-                                       g_local_oob_data.oob_data.randomizer[6],
-                                       g_local_oob_data.oob_data.randomizer[7],
-                                       g_local_oob_data.oob_data.randomizer[8],
-                                       g_local_oob_data.oob_data.randomizer[9],
-                                       g_local_oob_data.oob_data.randomizer[10],
-                                       g_local_oob_data.oob_data.randomizer[11],
-                                       g_local_oob_data.oob_data.randomizer[12],
-                                       g_local_oob_data.oob_data.randomizer[13],
-                                       g_local_oob_data.oob_data.randomizer[14],
-                                       g_local_oob_data.oob_data.randomizer[15]);
-
-                               TC_PRT("hash_len: %d\n", g_local_oob_data.oob_data.hash_len);
-                               TC_PRT("randomizer_len: %d\n", g_local_oob_data.oob_data.randomizer_len);
-                       }
-                       break;
-               }
-               case 40:
-               {
-                       ret = bluetooth_get_local_address(&g_local_oob_data.address);
+               break;
+       }
+
+       case 38:
+       {
+               ret = bluetooth_ag_set_speaker_gain(10);
+               if (ret < 0)
+                       TC_PRT("failed with [0x%04x]", ret);
+
+               break;
+       }
+
+       case 39:
+       {
+               if (bluetooth_oob_read_local_data(&g_local_oob_data.oob_data)) {
+                       TC_PRT("ERROR in bluetooth_oob_read_local_data\n");
+               } else {
+                       TC_PRT("SUCESS in bluetooth_oob_read_local_data\n");
+                       TC_PRT("hash = [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X"
+                               "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]\n",
+                               g_local_oob_data.oob_data.hash[0],
+                               g_local_oob_data.oob_data.hash[1],
+                               g_local_oob_data.oob_data.hash[2],
+                               g_local_oob_data.oob_data.hash[3],
+                               g_local_oob_data.oob_data.hash[4],
+                               g_local_oob_data.oob_data.hash[5],
+                               g_local_oob_data.oob_data.hash[6],
+                               g_local_oob_data.oob_data.hash[7],
+                               g_local_oob_data.oob_data.hash[8],
+                               g_local_oob_data.oob_data.hash[9],
+                               g_local_oob_data.oob_data.hash[10],
+                               g_local_oob_data.oob_data.hash[11],
+                               g_local_oob_data.oob_data.hash[12],
+                               g_local_oob_data.oob_data.hash[13],
+                               g_local_oob_data.oob_data.hash[14],
+                               g_local_oob_data.oob_data.hash[15]);
+
+                       TC_PRT("randomizer = [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X"
+                               "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]\n",
+                               g_local_oob_data.oob_data.randomizer[0],
+                               g_local_oob_data.oob_data.randomizer[1],
+                               g_local_oob_data.oob_data.randomizer[2],
+                               g_local_oob_data.oob_data.randomizer[3],
+                               g_local_oob_data.oob_data.randomizer[4],
+                               g_local_oob_data.oob_data.randomizer[5],
+                               g_local_oob_data.oob_data.randomizer[6],
+                               g_local_oob_data.oob_data.randomizer[7],
+                               g_local_oob_data.oob_data.randomizer[8],
+                               g_local_oob_data.oob_data.randomizer[9],
+                               g_local_oob_data.oob_data.randomizer[10],
+                               g_local_oob_data.oob_data.randomizer[11],
+                               g_local_oob_data.oob_data.randomizer[12],
+                               g_local_oob_data.oob_data.randomizer[13],
+                               g_local_oob_data.oob_data.randomizer[14],
+                               g_local_oob_data.oob_data.randomizer[15]);
+
                        TC_PRT("hash_len: %d\n", g_local_oob_data.oob_data.hash_len);
                        TC_PRT("randomizer_len: %d\n", g_local_oob_data.oob_data.randomizer_len);
-
-                       if (bluetooth_oob_add_remote_data(&g_local_oob_data.address,
-                               &g_local_oob_data.oob_data))
-                               TC_PRT("ERROR in bluetooth_oob_add_remote_data\n");
-                       else
-                               TC_PRT(" bluetooth_oob_add_remote_data SUCCESS\n");
-                       break;
                }
 
-               case 41:
-               {
-                       if (bluetooth_oob_remove_remote_data(&g_local_oob_data.address))
-                               TC_PRT("ERROR in bluetooth_oob_remove_remote_data\n");
-                       else
-                               TC_PRT(" bluetooth_oob_remove_remote_data SUCCESS\n");
-                       break;
-               }
-               case 42:
-               {
-                       bluetooth_opc_init();
-                       break;
-               }
-               case 43:
-               {
-                       bluetooth_opc_deinit();
-                       break;
-               }
-               case 44:
-               {
-                       bluetooth_device_address_t remote_address = { {0} };
+               break;
+       }
 
-                       /* Grey dongle */
-                       remote_address.addr[0] = 0x00; remote_address.addr[1] = 0x02; remote_address.addr[2] = 0x70;
-                       remote_address.addr[3] = 0x2B; remote_address.addr[4] = 0xD3; remote_address.addr[5] = 0xAF;
+       case 40:
+       {
+               ret = bluetooth_get_local_address(&g_local_oob_data.address);
+               TC_PRT("hash_len: %d\n", g_local_oob_data.oob_data.hash_len);
+               TC_PRT("randomizer_len: %d\n", g_local_oob_data.oob_data.randomizer_len);
 
-                       char *files[5] = {NULL};
+               if (bluetooth_oob_add_remote_data(&g_local_oob_data.address,
+                       &g_local_oob_data.oob_data))
+                       TC_PRT("ERROR in bluetooth_oob_add_remote_data\n");
+               else
+                       TC_PRT(" bluetooth_oob_add_remote_data SUCCESS\n");
 
-                       files[0] = "/opt/media/Images/image1.jpg";
-//                     files[1] = "/opt/media/Images/image2.jpg";
-//                     files[2] = "/opt/media/Images/image3.jpg";
-                       bluetooth_opc_push_files(&remote_address, files);
-                       break;
-               }
-               case 45:
-               {
-                       bluetooth_opc_cancel_push();
-                       break;
-               }
-               case 46:
-               {
-                       gboolean exist;
-                       exist = bluetooth_opc_session_is_exist();
-                       TC_PRT("exist: %d", exist);
-                       break;
-               }
-               case 47:
-               {
-                       bluetooth_network_activate_server();
-                       break;
-               }
-               case 48:
-               {
-                       bluetooth_network_deactivate_server();
-                       break;
-               }
-               case 49:
-               {
-                       bluetooth_device_address_t device_address = { {0x00, 0x02, 0xA2, 0x14, 0x40, 0x51} };
-                       bluetooth_network_connect(&device_address, BLUETOOTH_NETWORK_NAP_ROLE, NULL);
-                       break;
-               }
-               case 50:
-               {
-                       bluetooth_device_address_t device_address = { {0x00, 0x02, 0xA2, 0x14, 0x40, 0x51} };
-                       bluetooth_network_disconnect(&device_address);
-                       break;
-               }
-               case 51:
-               {
-                       bluetooth_obex_server_init("/opt/media/Downloads");
-                       break;
-               }
-               case 52:
-               {
-                       bluetooth_obex_server_deinit();
-                       break;
-               }
-               case 53:
-               {
-                       bluetooth_obex_server_init_without_agent("/opt/media/Downloads");
-                       break;
-               }
-               case 54:
-               {
-                       bluetooth_obex_server_deinit_without_agent();
-                       break;
-               }
-               case 55:
-               {
-                       bluetooth_obex_server_is_activated();
-                       break;
-               }
-               case 56:
-               {
-                       bluetooth_obex_server_accept_connection();
-                       TC_PRT(" bluetooth_obex_server_accept_connection SUCCESS\n");
-                       break;
-               }
-               case 57:
-               {
-                       bluetooth_obex_server_reject_connection();
-                       break;
-               }
-               case 58:
-               {
-                       bluetooth_obex_server_accept_authorize("abc");
-                       break;
-               }
-               case 59:
-               {
-                       bluetooth_obex_server_reject_authorize();
-                       break;
-               }
-               case 60:
-               {
-                       bluetooth_obex_server_set_destination_path("/opt/media");
-                       break;
-               }
-               case 61:
-               {
-                       bluetooth_obex_server_set_root("/opt/media");
-                       break;
-               }
-               case 62:
-               {
-                       bluetooth_obex_server_cancel_transfer(0);
-                       break;
-               }
-               case 63:
-               {
-                       bluetooth_obex_server_cancel_all_transfers();
-                       break;
-               }
+               break;
+       }
 
-               case 65:
-               {
-                       ret = bluetooth_hid_init(bt_hid_event_callback, NULL);
-                       if (ret < 0)
-                               TC_PRT("Failed with [0x%04x]", ret);
-                       break;
-               }
-               case 66:
-               {
-                       ret = bluetooth_hid_deinit();
-                       if (ret < 0)
-                               TC_PRT("Failed with [0x%04x]", ret);
-                       break;
-               }
-               case 67:
-               {
-                       /* Apple wireless keyboard */
-                       hid_device_address_t device_address = { {0xE8, 0x06, 0x88, 0x3B, 0x18, 0xBA} };
-
-                       ret = bluetooth_hid_connect(&device_address);
-                       if (ret < 0)
-                               TC_PRT("Failed with [0x%04x]", ret);
-                       break;
-               }
-               case 68:
-               {
-                       /* Apple wireless keyboard */
-                       hid_device_address_t device_address = { {0xE8, 0x06, 0x88, 0x3B, 0x18, 0xBA} };
-
-                       ret = bluetooth_hid_disconnect(&device_address);
-                       if (ret < 0)
-                               TC_PRT("Failed with [0x%04x]", ret);
-                       break;
-               }
+       case 41:
+       {
+               if (bluetooth_oob_remove_remote_data(&g_local_oob_data.address))
+                       TC_PRT("ERROR in bluetooth_oob_remove_remote_data\n");
+               else
+                       TC_PRT(" bluetooth_oob_remove_remote_data SUCCESS\n");
+               break;
+       }
 
-               case 70:
-               {
-                       bluetooth_device_address_t device_address = { {0x00, 0x02, 0x2F, 0x92, 0x7B, 0xF5} };
+       case 42:
+       {
+               bluetooth_opc_init();
+               break;
+       }
 
-                       ret = bluetooth_rfcomm_connect(&device_address, rfcomm_test_uuid_spp);
-                       //ret = bluetooth_rfcomm_connect(&device_address, "1");
+       case 43:
+       {
+               bluetooth_opc_deinit();
+               break;
+       }
 
-                       if (ret < 0)
-                               TC_PRT("Failed with [0x%04x]", ret);
-                       break;
-               }
-               case 71:
-               {
-                       ret = bluetooth_rfcomm_disconnect(-1);
+       case 44:
+       {
+               bluetooth_device_address_t remote_address = { {0} };
 
-                       if (ret < 0)
-                               TC_PRT("Failed with [0x%04x]", ret);
-                       break;
-               }
-               case 72:
-               {
-                       ret = bluetooth_rfcomm_disconnect(g_ret_client_fd1);
+               /* Grey dongle */
+               remote_address.addr[0] = 0x00; remote_address.addr[1] = 0x02; remote_address.addr[2] = 0x70;
+               remote_address.addr[3] = 0x2B; remote_address.addr[4] = 0xD3; remote_address.addr[5] = 0xAF;
 
-                       if (ret < 0)
-                               TC_PRT("Failed with [0x%04x]", ret);
-                       break;
-               }
-               case 73:
-               {
-                       const char rd_data[] = "123456789 12345";
-                       ret = bluetooth_rfcomm_write(g_ret_client_fd1, rd_data, sizeof(rd_data));
+               char *files[5] = {NULL};
 
-                       if (ret < 0)
-                               TC_PRT("Failed with [0x%04x]", ret);
-                       break;
-               }
-               case 74:
-               {
-                       gboolean is_connected;
+               files[0] = "/opt/media/Images/image1.jpg";
+//             files[1] = "/opt/media/Images/image2.jpg";
+//             files[2] = "/opt/media/Images/image3.jpg";
+               bluetooth_opc_push_files(&remote_address, files);
+               break;
+       }
+
+       case 45:
+       {
+               bluetooth_opc_cancel_push();
+               break;
+       }
 
-                       is_connected = bluetooth_rfcomm_is_client_connected();
+       case 46:
+       {
+               gboolean exist;
+               exist = bluetooth_opc_session_is_exist();
+               TC_PRT("exist: %d", exist);
+               break;
+       }
 
-                       TC_PRT("Connected: %d", is_connected);
-                       break;
-               }
-               case 80:
-               {
-                       ret = bluetooth_rfcomm_create_socket(rfcomm_test_uuid_spp);
-                       if (ret < 0)
-                               TC_PRT("Failed with [0x%04x]", ret);
+       case 47:
+       {
+               bluetooth_network_activate_server();
+               break;
+       }
+
+       case 48:
+       {
+               bluetooth_network_deactivate_server();
+               break;
+       }
+
+       case 49:
+       {
+               bluetooth_device_address_t device_address = { {0x00, 0x02, 0xA2, 0x14, 0x40, 0x51} };
+               bluetooth_network_connect(&device_address, BLUETOOTH_NETWORK_NAP_ROLE, NULL);
+               break;
+       }
+
+       case 50:
+       {
+               bluetooth_device_address_t device_address = { {0x00, 0x02, 0xA2, 0x14, 0x40, 0x51} };
+               bluetooth_network_disconnect(&device_address);
+               break;
+       }
+
+       case 51:
+       {
+               bluetooth_obex_server_init("/opt/media/Downloads");
+               break;
+       }
+
+       case 52:
+       {
+               bluetooth_obex_server_deinit();
+               break;
+       }
+
+       case 53:
+       {
+               bluetooth_obex_server_init_without_agent("/opt/media/Downloads");
+               break;
+       }
+
+       case 54:
+       {
+               bluetooth_obex_server_deinit_without_agent();
+               break;
+       }
+
+       case 55:
+       {
+               bluetooth_obex_server_is_activated();
+               break;
+       }
+
+       case 56:
+       {
+               bluetooth_obex_server_accept_connection();
+               TC_PRT(" bluetooth_obex_server_accept_connection SUCCESS\n");
+               break;
+       }
+
+       case 57:
+       {
+               bluetooth_obex_server_reject_connection();
+               break;
+       }
+
+       case 58:
+       {
+               bluetooth_obex_server_accept_authorize("abc");
+               break;
+       }
 
+       case 59:
+       {
+               bluetooth_obex_server_reject_authorize();
+               break;
+       }
+
+       case 60:
+       {
+               bluetooth_obex_server_set_destination_path("/opt/media");
+               break;
+       }
+
+       case 61:
+       {
+               bluetooth_obex_server_set_root("/opt/media");
+               break;
+       }
+
+       case 62:
+       {
+               bluetooth_obex_server_cancel_transfer(0);
+               break;
+       }
+
+       case 63:
+       {
+               bluetooth_obex_server_cancel_all_transfers();
+               break;
+       }
+
+       case 65:
+       {
+               ret = bluetooth_hid_init(bt_hid_event_callback, NULL);
+               if (ret < 0)
+                       TC_PRT("Failed with [0x%04x]", ret);
+
+               break;
+       }
+
+       case 66:
+       {
+               ret = bluetooth_hid_deinit();
+               if (ret < 0)
+                       TC_PRT("Failed with [0x%04x]", ret);
+
+               break;
+       }
+
+       case 67:
+       {
+               /* Apple wireless keyboard */
+               hid_device_address_t device_address = { {0xE8, 0x06, 0x88, 0x3B, 0x18, 0xBA} };
+
+               ret = bluetooth_hid_connect(&device_address);
+               if (ret < 0)
+                       TC_PRT("Failed with [0x%04x]", ret);
+
+               break;
+       }
+
+       case 68:
+       {
+               /* Apple wireless keyboard */
+               hid_device_address_t device_address = { {0xE8, 0x06, 0x88, 0x3B, 0x18, 0xBA} };
+
+               ret = bluetooth_hid_disconnect(&device_address);
+               if (ret < 0)
+                       TC_PRT("Failed with [0x%04x]", ret);
+
+               break;
+       }
+
+       case 70:
+       {
+               bluetooth_device_address_t device_address = { {0x00, 0x02, 0x2F, 0x92, 0x7B, 0xF5} };
+
+               ret = bluetooth_rfcomm_connect(&device_address, rfcomm_test_uuid_spp);
+               //ret = bluetooth_rfcomm_connect(&device_address, "1");
+
+               if (ret < 0)
+                       TC_PRT("Failed with [0x%04x]", ret);
+
+               break;
+       }
+
+       case 71:
+       {
+               ret = bluetooth_rfcomm_disconnect(-1);
+               if (ret < 0)
+                       TC_PRT("Failed with [0x%04x]", ret);
+
+               break;
+       }
+
+       case 72:
+       {
+               ret = bluetooth_rfcomm_disconnect(g_ret_client_fd1);
+               if (ret < 0)
+                       TC_PRT("Failed with [0x%04x]", ret);
+
+               break;
+       }
+
+       case 73:
+       {
+               const char rd_data[] = "123456789 12345";
+               ret = bluetooth_rfcomm_write(g_ret_client_fd1, rd_data, sizeof(rd_data));
+               if (ret < 0)
+                       TC_PRT("Failed with [0x%04x]", ret);
+
+               break;
+       }
+
+       case 74:
+       {
+               gboolean is_connected;
+               is_connected = bluetooth_rfcomm_is_client_connected();
+               TC_PRT("Connected: %d", is_connected);
+
+               break;
+       }
+
+       case 80:
+       {
+               ret = bluetooth_rfcomm_create_socket(rfcomm_test_uuid_spp);
+               if (ret < 0) {
+                       TC_PRT("Failed with [0x%04x]", ret);
                        TC_PRT("Returned FD = %d", ret);
-                       server_fd = ret;
-                       break;
                }
-               case 81:
-               {
-                       ret = bluetooth_rfcomm_create_socket(rfcomm_test_uuid_custom);
-                       if (ret < 0)
-                               TC_PRT("Failed with [0x%04x]", ret);
+               server_fd = ret;
+
+               break;
+       }
 
+       case 81:
+       {
+               ret = bluetooth_rfcomm_create_socket(rfcomm_test_uuid_custom);
+               if (ret < 0) {
+                       TC_PRT("Failed with [0x%04x]", ret);
                        TC_PRT("Returned FD = %d", ret);
-                       server_fd = ret;
-                       break;
-               }
-               case 82:
-               {
-                       ret = bluetooth_rfcomm_remove_socket(server_fd);
-                       if (ret < 0)
-                               TC_PRT("Failed with [0x%04x]", ret);
-                       break;
                }
-               case 83: /*Listen and accept */
-               {
+               server_fd = ret;
 
-                       ret = bluetooth_rfcomm_listen_and_accept(server_fd, 1);
-                       if (ret < 0)
-                               TC_PRT("Failed with [0x%04x]", ret);
+               break;
+       }
 
+       case 82:
+       {
+               ret = bluetooth_rfcomm_remove_socket(server_fd);
+               if (ret < 0)
+                       TC_PRT("Failed with [0x%04x]", ret);
+
+               break;
+       }
+
+       case 83: /*Listen and accept */
+       {
+               ret = bluetooth_rfcomm_listen_and_accept(server_fd, 1);
+               if (ret < 0) {
+                       TC_PRT("Failed with [0x%04x]", ret);
                        TC_PRT("result = %d", ret);
-                       break;
                }
-               case 84: /*Listen */
-               {
 
-                       ret = bluetooth_rfcomm_listen(server_fd, 1);
-                       if (ret < 0)
-                               TC_PRT("Failed with [0x%04x]", ret);
+               break;
+       }
 
+       case 84: /*Listen */
+       {
+               ret = bluetooth_rfcomm_listen(server_fd, 1);
+               if (ret < 0) {
+                       TC_PRT("Failed with [0x%04x]", ret);
                        TC_PRT("result = %d", ret);
-                       break;
-               }
-               case 85:
-               {
-                       ret = bluetooth_rfcomm_server_disconnect(client_fd);
-                       if (ret < 0)
-                               TC_PRT("Failed with [0x%04x]", ret);
-                       break;
                }
-               case 86:
-               {
-                       gboolean available;
 
-                       available = bluetooth_rfcomm_is_server_uuid_available(rfcomm_test_uuid_spp);
+               break;
+       }
 
-                       TC_PRT("available: %d", available);
-                       break;
-               }
-               case 87:
-               {
-                       ret = bluetooth_rfcomm_accept_connection(server_fd);
-                       if (ret < 0)
-                               TC_PRT("Failed with [0x%04x]", ret);
+       case 85:
+       {
+               ret = bluetooth_rfcomm_server_disconnect(client_fd);
+               if (ret < 0)
+                       TC_PRT("Failed with [0x%04x]", ret);
+
+               break;
+       }
+
+       case 86:
+       {
+               gboolean available;
+               available = bluetooth_rfcomm_is_server_uuid_available(rfcomm_test_uuid_spp);
+               TC_PRT("available: %d", available);
+
+               break;
+       }
+
+       case 87:
+       {
+               ret = bluetooth_rfcomm_accept_connection(server_fd);
+               if (ret < 0) {
+                       TC_PRT("Failed with [0x%04x]", ret);
                        TC_PRT("client fd: %d", client_fd);
-                       break;
-               }
-               case 88:
-               {
-                       ret = bluetooth_rfcomm_reject_connection(server_fd);
-                       if (ret < 0)
-                               TC_PRT("Failed with [0x%04x]", ret);
-                       break;
-               }
-               case 89:
-                       ret = bluetooth_start_custom_discovery(DISCOVERY_ROLE_LE,
-                                                                       0, 0, 0);
-                       if (ret < 0)
-                               TC_PRT("failed with [0x%04x]", ret);
-                       break;
-               case 92: {
-                       ret = bluetooth_gatt_init();
-                       if (ret < 0)
-                               TC_PRT("gatt init failed with [0x%04x]", ret);
-                       break;
                }
-               case 93: {
-                       ret = bluetooth_gatt_deinit();
-                       if (ret < 0)
-                               TC_PRT("gatt deinit failed with [0x%04x]", ret);
-                       break;
-               }
-               case 94: {
-                       char *service_uuid = g_strdup("00001802-0000-1000-8000-00805f9b34fb");
 
-                       ret = bluetooth_gatt_add_service(service_uuid,
-                               &svc_obj_path);
+               break;
+       }
 
-                       TC_PRT("service obj_path is %s", svc_obj_path);
-                       }
-                       break;
+       case 88:
+       {
+               ret = bluetooth_rfcomm_reject_connection(server_fd);
+               if (ret < 0)
+                       TC_PRT("Failed with [0x%04x]", ret);
+               break;
+       }
 
-               case 95: {
-                       /* testing with dummy values*/
-                       char *char_uuid = g_strdup("00002a06-0000-1000-8000-00805f9b34fb");
-                       bt_gatt_permission_t perms = 0;
-                       bt_gatt_characteristic_property_t props = BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_READ |
-                                       BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_WRITE |
-                                       BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_NOTIFY |
-                                       BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_INDICATE;
+       case 89:
+               ret = bluetooth_start_custom_discovery(DISCOVERY_ROLE_LE,
+                                                               0, 0, 0);
+               if (ret < 0)
+                       TC_PRT("failed with [0x%04x]", ret);
 
-                       ret = bluetooth_gatt_add_new_characteristic(
-                               svc_obj_path, char_uuid,
-                               perms, props, &char_obj_path);
+               break;
 
-                       TC_PRT("characteristic obj_path is %s", char_obj_path);
+       case 92:
+       {
+               ret = bluetooth_gatt_init();
+               if (ret < 0)
+                       TC_PRT("gatt init failed with [0x%04x]", ret);
+               break;
+       }
 
-                       break;
-               }
+       case 93:
+       {
+               ret = bluetooth_gatt_deinit();
+               if (ret < 0)
+                       TC_PRT("gatt deinit failed with [0x%04x]", ret);
 
-               case 96: {
-                       char *desc_uuid = g_strdup("000026ff-0000-1000-8000-00805f9b34fb");
-                       bt_gatt_permission_t perms = BLUETOOTH_GATT_PERMISSION_READ |
-                                       BLUETOOTH_GATT_PERMISSION_WRITE;
+               break;
+       }
 
-                       ret = bluetooth_gatt_add_descriptor(char_obj_path,
-                               desc_uuid, perms, &desc_obj_path);
+       case 94:
+       {
+               char *service_uuid = g_strdup("00001802-0000-1000-8000-00805f9b34fb");
 
-                       TC_PRT("add descriptor error is %d", ret);
+               ret = bluetooth_gatt_add_service(service_uuid,
+                       &svc_obj_path);
 
-                       break;
-               }
-               case 97: {
-                       ret = bluetooth_gatt_register_service(svc_obj_path);
+               TC_PRT("service obj_path is %s", svc_obj_path);
 
-                       TC_PRT("register service error is %d", ret);
+               break;
+       }
 
-                       break;
-               }
-               case 98: {
-                       ret = bluetooth_gatt_register_application();
+       case 95:
+       {
+               /* testing with dummy values*/
+               char *char_uuid = g_strdup("00002a06-0000-1000-8000-00805f9b34fb");
+               bt_gatt_permission_t perms = 0;
+               bt_gatt_characteristic_property_t props = BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_READ |
+                               BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_WRITE |
+                               BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_NOTIFY |
+                               BLUETOOTH_GATT_CHARACTERISTIC_PROPERTY_INDICATE;
 
-                       TC_PRT("register service error is %d", ret);
+               ret = bluetooth_gatt_add_new_characteristic(
+                       svc_obj_path, char_uuid,
+                       perms, props, &char_obj_path);
 
-                       break;
-               }
-               case 99: {
-                       char char_data[4] = {10, 20, 30, 40};
-                       int char_length = 4;
-                       ret = bluetooth_gatt_update_characteristic(char_obj_path,
-                                               char_data, char_length);
+               TC_PRT("characteristic obj_path is %s", char_obj_path);
 
-                       TC_PRT("update_characteristic error is %d", ret);
+               break;
+       }
 
-                       break;
-               }
-               case 100: {
-                       ret = bluetooth_gatt_unregister_service(svc_obj_path);
+       case 96: {
+               char *desc_uuid = g_strdup("000026ff-0000-1000-8000-00805f9b34fb");
+               bt_gatt_permission_t perms = BLUETOOTH_GATT_PERMISSION_READ |
+                               BLUETOOTH_GATT_PERMISSION_WRITE;
 
-                       TC_PRT("service removed with error is %d", ret);
+               ret = bluetooth_gatt_add_descriptor(char_obj_path,
+                       desc_uuid, perms, &desc_obj_path);
+               TC_PRT("add descriptor error is %d", ret);
 
-                       break;
-               }
-               case 101: {
-                       ret = bluetooth_gatt_delete_services();
+               break;
+       }
 
-                       TC_PRT("services deleted with error is %d", ret);
+       case 97: {
+               ret = bluetooth_gatt_register_service(svc_obj_path);
+               TC_PRT("register service error is %d", ret);
 
-                       break;
-               }
-               default:
-                       break;
+               break;
+       }
+
+       case 98: {
+               ret = bluetooth_gatt_register_application();
+
+               TC_PRT("register service error is %d", ret);
+
+               break;
+       }
+
+       case 99: {
+               char char_data[4] = {10, 20, 30, 40};
+               int char_length = 4;
+               ret = bluetooth_gatt_update_characteristic(char_obj_path,
+                                       char_data, char_length);
+
+               TC_PRT("update_characteristic error is %d", ret);
+
+               break;
+       }
+
+       case 100: {
+               ret = bluetooth_gatt_unregister_service(svc_obj_path);
+               TC_PRT("service removed with error is %d", ret);
+
+               break;
        }
 
+       case 101:
+               ret = bluetooth_gatt_delete_services();
+               TC_PRT("services deleted with error is %d", ret);
+
+               break;
+
+       default:
+               break;
+       }
        return 0;
 }
 
@@ -1200,482 +1271,474 @@ void bt_event_callback(int event, bluetooth_event_param_t* param, void *user_dat
        TC_PRT(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
        TC_PRT("bt event callback 0x%04x", event);
        switch (event) {
-               case BLUETOOTH_EVENT_ENABLED:
-                       TC_PRT("BLUETOOTH_EVENT_ENABLED, result [0x%04x]", param->result);
-                       break;
+       case BLUETOOTH_EVENT_ENABLED:
+               TC_PRT("BLUETOOTH_EVENT_ENABLED, result [0x%04x]", param->result);
+               break;
+
+       case BLUETOOTH_EVENT_DISABLED:
+               TC_PRT("BLUETOOTH_EVENT_DISABLED, result [0x%04x]", param->result);
+               break;
+
+       case BLUETOOTH_EVENT_LOCAL_NAME_CHANGED:
+               TC_PRT("BLUETOOTH_EVENT_LOCAL_NAME_CHANGED, result [0x%04x]", param->result);
+               if (param->result == BLUETOOTH_ERROR_NONE) {
+                       bluetooth_device_name_t *local_name = (bluetooth_device_name_t *)param->param_data;
+                       tc_result(TC_PASS, 6);
+                       TC_PRT("Changed Name : [%s]", local_name->name);
+               } else {
+                       tc_result(TC_FAIL, 6);
+               }
+               break;
+
+       case BLUETOOTH_EVENT_DISCOVERY_STARTED:
+               TC_PRT("BLUETOOTH_EVENT_DISCOVERY_STARTED, result [0x%04x]", param->result);
+               break;
+
+       case BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND:
+       {
+               bluetooth_device_info_t *device_info = NULL;
+               TC_PRT("BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND, result [0x%04x]", param->result);
+               device_info  = (bluetooth_device_info_t *)param->param_data;
+               memcpy(&searched_device, &device_info->device_address, sizeof(bluetooth_device_address_t));
+               TC_PRT("dev [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]", \
+                       device_info->device_address.addr[0], device_info->device_address.addr[1], device_info->device_address.addr[2], \
+                       device_info->device_address.addr[3], device_info->device_address.addr[4], device_info->device_address.addr[5]);
+               break;
+       }
 
-               case BLUETOOTH_EVENT_DISABLED:
-                       TC_PRT("BLUETOOTH_EVENT_DISABLED, result [0x%04x]", param->result);
-                       break;
+       case BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND:
+       {
+               int i;
+               bluetooth_le_device_info_t *le_device_info = NULL;
+               TC_PRT("BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND, result [0x%04x]", param->result);
+               le_device_info  = (bluetooth_le_device_info_t *)param->param_data;
+               TC_PRT("dev[%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]", \
+                       le_device_info->device_address.addr[0], le_device_info->device_address.addr[1], le_device_info->device_address.addr[2], \
+                       le_device_info->device_address.addr[3], le_device_info->device_address.addr[4], le_device_info->device_address.addr[5]);
+               TC_PRT("addr_type : %d", le_device_info->addr_type);
+               TC_PRT("rssi : %d", le_device_info->rssi);
+               TC_PRT("adv_ind_data_len :%d" , le_device_info->adv_ind_data.data_len);
+               TC_PRT("scan_resp_data_len :%d" , le_device_info->scan_resp_data.data_len);
+               for (i = 0; i < le_device_info->adv_ind_data.data_len; i++)
+                       TC_PRT("adv_ind_data[%d] : [0x%x]", i, le_device_info->adv_ind_data.data.data[i]);
+               for (i = 0; i < le_device_info->scan_resp_data.data_len; i++)
+                       TC_PRT("scan_resp_data[%d] : [0x%x]", i, le_device_info->scan_resp_data.data.data[i]);
+               break;
+       }
 
-               case BLUETOOTH_EVENT_LOCAL_NAME_CHANGED:
-                       TC_PRT("BLUETOOTH_EVENT_LOCAL_NAME_CHANGED, result [0x%04x]", param->result);
-                       if (param->result == BLUETOOTH_ERROR_NONE) {
-                               bluetooth_device_name_t *local_name = (bluetooth_device_name_t *)param->param_data;
-                               tc_result(TC_PASS, 6);
-                               TC_PRT("Changed Name : [%s]", local_name->name);
-                       } else {
-                               tc_result(TC_FAIL, 6);
-                       }
-                       break;
+       case BLUETOOTH_EVENT_REMOTE_DEVICE_NAME_UPDATED:
+       {
+               bluetooth_device_info_t *device_info = NULL;
+               TC_PRT("BLUETOOTH_EVENT_REMOTE_DEVICE_NAME_UPDATED, result [0x%04x]", param->result);
+               device_info  = (bluetooth_device_info_t *)param->param_data;
+               memcpy(&searched_device, &device_info->device_address, sizeof(bluetooth_device_address_t));
+               TC_PRT("dev [%s] [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]", device_info->device_name.name, \
+                       device_info->device_address.addr[0], device_info->device_address.addr[1], device_info->device_address.addr[2], \
+                       device_info->device_address.addr[3], device_info->device_address.addr[4], device_info->device_address.addr[5]);
+               break;
+       }
 
+       case BLUETOOTH_EVENT_DISCOVERY_FINISHED:
+               TC_PRT("BLUETOOTH_EVENT_DISCOVERY_FINISHED, result [0x%04x]", param->result);
+               break;
 
-               case BLUETOOTH_EVENT_DISCOVERY_STARTED:
-                       TC_PRT("BLUETOOTH_EVENT_DISCOVERY_STARTED, result [0x%04x]", param->result);
-                       break;
+       case BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED:
+       {
+               int *mode = (int *)param->param_data;
+               TC_PRT("BT_DISCOVERABLE_MODE_CHANGED, result [0x%04x]", param->result);
+               TC_PRT("mode [%d]", *mode);
+               break;
+       }
 
-               case BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND:
-               {
+       case BLUETOOTH_EVENT_DISCOVERABLE_TIMEOUT_CHANGED:
+       {
+               int *timeout = (int *)param->param_data;
+               TC_PRT("BLUETOOTH_EVENT_DISCOVERABLE_TIMEOUT_CHANGED, result [0x%04x]", param->result);
+               TC_PRT("timeout [%d]", *timeout);
+               break;
+       }
+
+       case BLUETOOTH_EVENT_BONDING_FINISHED:
+       {
+               TC_PRT("BLUETOOTH_EVENT_BONDING_FINISHED, result [0x%04x]", param->result);
+               if (param->result >= BLUETOOTH_ERROR_NONE) {
                        bluetooth_device_info_t *device_info = NULL;
-                       TC_PRT("BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND, result [0x%04x]", param->result);
-                       device_info  = (bluetooth_device_info_t *)param->param_data;
-                       memcpy(&searched_device, &device_info->device_address, sizeof(bluetooth_device_address_t));
-                       TC_PRT("dev [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]", \
-                               device_info->device_address.addr[0], device_info->device_address.addr[1], device_info->device_address.addr[2], \
-                               device_info->device_address.addr[3], device_info->device_address.addr[4], device_info->device_address.addr[5]);
+                       tc_result(TC_PASS, 12);
+                       device_info = (bluetooth_device_info_t *)param->param_data;
+               if (device_info == NULL)
                        break;
+                       TC_PRT("dev [%s] [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X] mjr[%#x] min[%#x] srv[%#x]", device_info->device_name.name, \
+                               device_info->device_address.addr[0], device_info->device_address.addr[1], device_info->device_address.addr[2], \
+                               device_info->device_address.addr[3], device_info->device_address.addr[4], device_info->device_address.addr[5], \
+                               device_info->device_class.major_class, device_info->device_class.minor_class, device_info->device_class.service_class);
+               } else {
+                       tc_result(TC_FAIL, 12);
                }
+                       break;
+       }
 
-               case BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND:
-               {
-                       int i;
-                       bluetooth_le_device_info_t *le_device_info = NULL;
-                       TC_PRT("BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND, result [0x%04x]", param->result);
-                       le_device_info  = (bluetooth_le_device_info_t *)param->param_data;
-                       TC_PRT("dev[%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]", \
-                               le_device_info->device_address.addr[0], le_device_info->device_address.addr[1], le_device_info->device_address.addr[2], \
-                               le_device_info->device_address.addr[3], le_device_info->device_address.addr[4], le_device_info->device_address.addr[5]);
-                       TC_PRT("addr_type : %d", le_device_info->addr_type);
-                       TC_PRT("rssi : %d", le_device_info->rssi);
-                       TC_PRT("adv_ind_data_len :%d" , le_device_info->adv_ind_data.data_len);
-                       TC_PRT("scan_resp_data_len :%d" , le_device_info->scan_resp_data.data_len);
-
-                       for (i = 0; i < le_device_info->adv_ind_data.data_len; i++)
-                               TC_PRT("adv_ind_data[%d] : [0x%x]", i, le_device_info->adv_ind_data.data.data[i]);
-
-                       for (i = 0; i < le_device_info->scan_resp_data.data_len; i++)
-                               TC_PRT("scan_resp_data[%d] : [0x%x]", i, le_device_info->scan_resp_data.data.data[i]);
+       case BLUETOOTH_EVENT_BONDED_DEVICE_FOUND:
+       {
+               // bluetooth_get_bonded_device_list is changed as synchronous API. This event is not used any more.
+               // 2011.01.06
+#if 0
+//             int i = 0;
+               TC_PRT("BLUETOOTH_EVENT_BONDED_DEVICE_FOUND, result [0x%04x]", param->result);
+               if (param->result >= BLUETOOTH_ERROR_NONE) {
+                       ///tc_result(TC_PASS, 15);
+                       bluetooth_device_info_t * bt_dev_info = (bluetooth_device_info_t*)param->param_data;
+                               TC_PRT("Dev Name = %s, Dev add = %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X, COD (major,minor,service)= 0x%x:%x:%x\n", bt_dev_info->device_name.name,
+                               bt_dev_info->device_address.addr[0], bt_dev_info->device_address.addr[1], bt_dev_info->device_address.addr[2], \
+                               bt_dev_info->device_address.addr[3], bt_dev_info->device_address.addr[4], bt_dev_info->device_address.addr[5], \
+                               bt_dev_info->device_class.major_class, bt_dev_info->device_class.minor_class, bt_dev_info->device_class.service_class);
 
-                       break;
+               } else if (param->result == BLUETOOTH_ERROR_END_OF_DEVICE_LIST) /*End of the Device found indication*/ {
+                       tc_result(TC_PASS, 15);
+                       TC_PRT("*****<<No more BLUETOOTH_EVENT_BONDED_DEVICE_FOUND indication>>***** ");
+               } else {
+                       tc_result(TC_FAIL, 15);
+                       TC_PRT("*****API failed ***** ");
                }
+#endif
+               break;
+       }
 
-               case BLUETOOTH_EVENT_REMOTE_DEVICE_NAME_UPDATED:
-               {
-                       bluetooth_device_info_t *device_info = NULL;
-                       TC_PRT("BLUETOOTH_EVENT_REMOTE_DEVICE_NAME_UPDATED, result [0x%04x]", param->result);
-                       device_info  = (bluetooth_device_info_t *)param->param_data;
-                       memcpy(&searched_device, &device_info->device_address, sizeof(bluetooth_device_address_t));
-                       TC_PRT("dev [%s] [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]", device_info->device_name.name, \
-                               device_info->device_address.addr[0], device_info->device_address.addr[1], device_info->device_address.addr[2], \
-                               device_info->device_address.addr[3], device_info->device_address.addr[4], device_info->device_address.addr[5]);
-                       break;
-               }
+       case BLUETOOTH_EVENT_SERVICE_SEARCHED:
+       {
+               int i = 0;
+               TC_PRT("BLUETOOTH_EVENT_SERVICE_SEARCHED, result [0x%04x]", param->result);
+               if (param->result >= BLUETOOTH_ERROR_NONE) {
+                       tc_result(TC_PASS, 18);
+                       bt_sdp_info_t *bt_sdp_info = param->param_data;
 
-               case BLUETOOTH_EVENT_DISCOVERY_FINISHED:
-                       TC_PRT("BLUETOOTH_EVENT_DISCOVERY_FINISHED, result [0x%04x]", param->result);
-                       break;
+                       TC_PRT("Dev add = %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X\n",
+                               bt_sdp_info->device_addr.addr[0], bt_sdp_info->device_addr.addr[1], bt_sdp_info->device_addr.addr[2], \
+                               bt_sdp_info->device_addr.addr[3], bt_sdp_info->device_addr.addr[4], bt_sdp_info->device_addr.addr[5]);
 
-               case BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED:
-               {
-                       int *mode = (int *)param->param_data;
-                       TC_PRT("BT_DISCOVERABLE_MODE_CHANGED, result [0x%04x]", param->result);
-                       TC_PRT("mode [%d]", *mode);
-                       break;
-               }
-               case BLUETOOTH_EVENT_DISCOVERABLE_TIMEOUT_CHANGED:
-               {
-                       int *timeout = (int *)param->param_data;
-                       TC_PRT("BLUETOOTH_EVENT_DISCOVERABLE_TIMEOUT_CHANGED, result [0x%04x]", param->result);
-                       TC_PRT("timeout [%d]", *timeout);
-                       break;
-               }
-               case BLUETOOTH_EVENT_BONDING_FINISHED:
-               {
-                       TC_PRT("BLUETOOTH_EVENT_BONDING_FINISHED, result [0x%04x]", param->result);
-                       if (param->result >= BLUETOOTH_ERROR_NONE) {
-                               bluetooth_device_info_t *device_info = NULL;
-                               tc_result(TC_PASS, 12);
-                               device_info = (bluetooth_device_info_t *)param->param_data;
-                               if (device_info == NULL)
-                                       break;
-
-                               TC_PRT("dev [%s] [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X] mjr[%#x] min[%#x] srv[%#x]", device_info->device_name.name, \
-                                       device_info->device_address.addr[0], device_info->device_address.addr[1], device_info->device_address.addr[2], \
-                                       device_info->device_address.addr[3], device_info->device_address.addr[4], device_info->device_address.addr[5], \
-                                       device_info->device_class.major_class, device_info->device_class.minor_class, device_info->device_class.service_class);
-                       } else {
-                               tc_result(TC_FAIL, 12);
-                       }
-                       break;
+                               TC_PRT("Supported service list:\n");
+                               for (i = 0; i < bt_sdp_info->service_index; i++)
+                                       TC_PRT("[%#x]\n", bt_sdp_info->service_list_array[i]);
+
+               } else {
+                       tc_result(TC_FAIL, 18);
                }
+               break;
+       }
 
-               case BLUETOOTH_EVENT_BONDED_DEVICE_FOUND:
-               {
-                       // bluetooth_get_bonded_device_list is changed as synchronous API. This event is not used any more.
-                       // 2011.01.06
-#if 0
-//                     int i = 0;
-                       TC_PRT("BLUETOOTH_EVENT_BONDED_DEVICE_FOUND, result [0x%04x]", param->result);
-                       if (param->result >= BLUETOOTH_ERROR_NONE) {
-                               ///tc_result(TC_PASS, 15);
-                               bluetooth_device_info_t * bt_dev_info = (bluetooth_device_info_t*)param->param_data;
+       case BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED:
+       {
+               TC_PRT("BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED, result [0x%04x]", param->result);
+               bluetooth_rfcomm_received_data_t *rx_data = param->param_data;
+               printf("\n FD = %d \nBuffer len = %d ", rx_data->socket_fd, rx_data->buffer_size);
+               if (rx_data->buffer_size < sizeof(oob_data_t))
+                       TC_PRT("Complete oob data is not recivedn");
+               else
+                       memcpy(&g_remote_oob_data, rx_data->buffer, sizeof(oob_data_t));
+               //tc_result(TC_PASS, 21);
+               break;
+       }
 
-                               TC_PRT("Dev Name = %s, Dev add = %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X, COD (major,minor,service)= 0x%x:%x:%x\n", bt_dev_info->device_name.name,
-                                       bt_dev_info->device_address.addr[0], bt_dev_info->device_address.addr[1], bt_dev_info->device_address.addr[2], \
-                                       bt_dev_info->device_address.addr[3], bt_dev_info->device_address.addr[4], bt_dev_info->device_address.addr[5], \
-                                       bt_dev_info->device_class.major_class, bt_dev_info->device_class.minor_class, bt_dev_info->device_class.service_class);
-
-                       } else if (param->result == BLUETOOTH_ERROR_END_OF_DEVICE_LIST) /*End of the Device found indication*/ {
-                               tc_result(TC_PASS, 15);
-                               TC_PRT("*****<<No more BLUETOOTH_EVENT_BONDED_DEVICE_FOUND indication>>***** ");
-                       } else {
-                               tc_result(TC_FAIL, 15);
-                               TC_PRT("*****API failed ***** ");
-                       }
-                       break;
-#endif
-               }
-               case BLUETOOTH_EVENT_SERVICE_SEARCHED:
-               {
-                       int i = 0;
-                       TC_PRT("BLUETOOTH_EVENT_SERVICE_SEARCHED, result [0x%04x]", param->result);
-                       if (param->result >= BLUETOOTH_ERROR_NONE) {
-                               tc_result(TC_PASS, 18);
-                               bt_sdp_info_t *bt_sdp_info = param->param_data;
-
-                               TC_PRT("Dev add = %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X\n",
-                                       bt_sdp_info->device_addr.addr[0], bt_sdp_info->device_addr.addr[1], bt_sdp_info->device_addr.addr[2], \
-                                       bt_sdp_info->device_addr.addr[3], bt_sdp_info->device_addr.addr[4], bt_sdp_info->device_addr.addr[5]);
-
-                                       TC_PRT("Supported service list:\n");
-                                       for (i = 0; i < bt_sdp_info->service_index; i++)
-                                               TC_PRT("[%#x]\n", bt_sdp_info->service_list_array[i]);
-
-                       } else {
-                               tc_result(TC_FAIL, 18);
-                       }
-                       break;
-               }
-               case BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED:
-               {
-                       TC_PRT("BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED, result [0x%04x]", param->result);
-                       bluetooth_rfcomm_received_data_t *rx_data = param->param_data;
-                       printf("\n FD = %d \nBuffer len = %d ", rx_data->socket_fd, rx_data->buffer_size);
-                       if (rx_data->buffer_size < sizeof(oob_data_t))
-                               TC_PRT("Complete oob data is not recivedn");
-                       else
-                               memcpy(&g_remote_oob_data, rx_data->buffer, sizeof(oob_data_t));
-                       //tc_result(TC_PASS, 21);
-                       break;
-               }
-               case BLUETOOTH_EVENT_RFCOMM_CONNECTED:
-               {
-                       bluetooth_rfcomm_connection_t *con_ind = (bluetooth_rfcomm_connection_t *)param->param_data;
-                       TC_PRT("BLUETOOTH_EVENT_RFCOMM_CONNECTED, result [0x%04x], fd = %d, device add = 0x%X:%X:%X:%X:%X:%X, Role = %s", param->result,
-                                                               con_ind->socket_fd,
-                                                               con_ind->device_addr.addr[0], con_ind->device_addr.addr[1], con_ind->device_addr.addr[2],
-                                                               con_ind->device_addr.addr[3], con_ind->device_addr.addr[4], con_ind->device_addr.addr[5],
-                                                               (con_ind->device_role == RFCOMM_ROLE_SERVER) ? "SERVER" : "CLIENT");
-                       //tc_result(TC_PASS, 22);
-                       if ((con_ind->device_role == RFCOMM_ROLE_CLIENT) && (con_ind->socket_fd > 0))
-                               g_ret_client_fd1 = con_ind->socket_fd;
-
-                       if ((con_ind->device_role == RFCOMM_ROLE_SERVER) && (con_ind->socket_fd > 0))
-                               client_fd = con_ind->socket_fd;
+       case BLUETOOTH_EVENT_RFCOMM_CONNECTED:
+       {
+               bluetooth_rfcomm_connection_t *con_ind = (bluetooth_rfcomm_connection_t *)param->param_data;
+               TC_PRT("BLUETOOTH_EVENT_RFCOMM_CONNECTED, result [0x%04x], fd = %d, device add = 0x%X:%X:%X:%X:%X:%X, Role = %s", param->result,
+                                                       con_ind->socket_fd,
+                                                       con_ind->device_addr.addr[0], con_ind->device_addr.addr[1], con_ind->device_addr.addr[2],
+                                                       con_ind->device_addr.addr[3], con_ind->device_addr.addr[4], con_ind->device_addr.addr[5],
+                                                       (con_ind->device_role == RFCOMM_ROLE_SERVER) ? "SERVER" : "CLIENT");
+               //tc_result(TC_PASS, 22);
+               if ((con_ind->device_role == RFCOMM_ROLE_CLIENT) && (con_ind->socket_fd > 0))
+                       g_ret_client_fd1 = con_ind->socket_fd;
+
+               if ((con_ind->device_role == RFCOMM_ROLE_SERVER) && (con_ind->socket_fd > 0))
+                       client_fd = con_ind->socket_fd;
+
+               break;
+       }
 
-                       break;
-               }
-               case BLUETOOTH_EVENT_RFCOMM_DISCONNECTED:
-               {
-                       bluetooth_rfcomm_disconnection_t *disconnection_ind = (bluetooth_rfcomm_disconnection_t *)param->param_data;;
-                       TC_PRT("BLUETOOTH_EVENT_RFCOMM_DISCONNECTED, result [0x%04x] Fd = %d, device add = 0x%X:%X:%X:%X:%X:%X\n", param->result, disconnection_ind->socket_fd,
-                                                                                                               disconnection_ind->device_addr.addr[0], disconnection_ind->device_addr.addr[1], disconnection_ind->device_addr.addr[2],
-                                                                                                               disconnection_ind->device_addr.addr[3], disconnection_ind->device_addr.addr[4], disconnection_ind->device_addr.addr[5]);
-                       //tc_result(TC_PASS, 22);
-                       break;
-               }
-               case BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED:
-               {
-                       bluetooth_network_device_info_t *dev_info = (bluetooth_network_device_info_t *)param->param_data;
+       case BLUETOOTH_EVENT_RFCOMM_DISCONNECTED:
+       {
+               bluetooth_rfcomm_disconnection_t *disconnection_ind = (bluetooth_rfcomm_disconnection_t *)param->param_data;;
+               TC_PRT("BLUETOOTH_EVENT_RFCOMM_DISCONNECTED, result [0x%04x] Fd = %d, device add = 0x%X:%X:%X:%X:%X:%X\n", param->result, disconnection_ind->socket_fd,
+                                                                                                       disconnection_ind->device_addr.addr[0], disconnection_ind->device_addr.addr[1], disconnection_ind->device_addr.addr[2],
+                                                                                                       disconnection_ind->device_addr.addr[3], disconnection_ind->device_addr.addr[4], disconnection_ind->device_addr.addr[5]);
+               //tc_result(TC_PASS, 22);
+               break;
+       }
 
-                       TC_PRT("BLUETOOTH_EVENT_RFCOMM_DISCONNECTED, result [0x%04x]", param->result);
-                       TC_PRT("interface name: %s", dev_info->interface_name);
+       case BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED:
+       {
+               bluetooth_network_device_info_t *dev_info = (bluetooth_network_device_info_t *)param->param_data;
 
-                       TC_PRT("device add = %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X\n",
-                                                               dev_info->device_address.addr[0], dev_info->device_address.addr[1], dev_info->device_address.addr[2],
-                                                               dev_info->device_address.addr[3], dev_info->device_address.addr[4], dev_info->device_address.addr[5]);
-                       break;
-               }
-               case BLUETOOTH_EVENT_NETWORK_SERVER_DISCONNECTED:
-               {
-                       bluetooth_network_device_info_t *dev_info = (bluetooth_network_device_info_t *)param->param_data;
+               TC_PRT("BLUETOOTH_EVENT_RFCOMM_DISCONNECTED, result [0x%04x]", param->result);
+               TC_PRT("interface name: %s", dev_info->interface_name);
 
-                       TC_PRT("BLUETOOTH_EVENT_RFCOMM_DISCONNECTED, result [0x%04x]", param->result);
-                       TC_PRT("interface name: %s", dev_info->interface_name);
+               TC_PRT("device add = %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X\n",
+                                                       dev_info->device_address.addr[0], dev_info->device_address.addr[1], dev_info->device_address.addr[2],
+                                                       dev_info->device_address.addr[3], dev_info->device_address.addr[4], dev_info->device_address.addr[5]);
+               break;
+       }
 
-                       TC_PRT("device add = %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X\n",
-                                                               dev_info->device_address.addr[0], dev_info->device_address.addr[1], dev_info->device_address.addr[2],
-                                                               dev_info->device_address.addr[3], dev_info->device_address.addr[4], dev_info->device_address.addr[5]);
-                       break;
-               }
+       case BLUETOOTH_EVENT_NETWORK_SERVER_DISCONNECTED:
+       {
+               bluetooth_network_device_info_t *dev_info = (bluetooth_network_device_info_t *)param->param_data;
 
-               case BLUETOOTH_EVENT_HDP_CONNECTED:
-               {
-                       bt_hdp_connected_t *conn_ind = (bt_hdp_connected_t *)param->param_data;
+               TC_PRT("BLUETOOTH_EVENT_RFCOMM_DISCONNECTED, result [0x%04x]", param->result);
+               TC_PRT("interface name: %s", dev_info->interface_name);
 
-                       TC_PRT("BLUETOOTH_EVENT_HDP_CONNECTED, Result = %s\n", (param->result == 0) ? "BLUETOOTH_ERROR_NONE" : "BLUETOOTH_ERROR_XXXX");
-                       TC_PRT("App handler = %s, channel id = %d, type = %s", conn_ind->app_handle, conn_ind->channel_id, (conn_ind->type == HDP_QOS_RELIABLE) ? "Reliable" : "Streaming");
-                       TC_PRT("device add = %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X\n",
-                                                               conn_ind->device_address.addr[0], conn_ind->device_address.addr[1], conn_ind->device_address.addr[2],
-                                                               conn_ind->device_address.addr[3], conn_ind->device_address.addr[4], conn_ind->device_address.addr[5]);
+               TC_PRT("device add = %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X\n",
+                                                       dev_info->device_address.addr[0], dev_info->device_address.addr[1], dev_info->device_address.addr[2],
+                                                       dev_info->device_address.addr[3], dev_info->device_address.addr[4], dev_info->device_address.addr[5]);
+               break;
+       }
 
-                       g_ret_client_fd1 = conn_ind->channel_id;
-                       break;
-               }
+       case BLUETOOTH_EVENT_HDP_CONNECTED:
+       {
+               bt_hdp_connected_t *conn_ind = (bt_hdp_connected_t *)param->param_data;
 
-               case BLUETOOTH_EVENT_HDP_DISCONNECTED:
-               {
-                       bt_hdp_disconnected_t *dis_ind = (bt_hdp_disconnected_t *)param->param_data;
+               TC_PRT("BLUETOOTH_EVENT_HDP_CONNECTED, Result = %s\n", (param->result == 0) ? "BLUETOOTH_ERROR_NONE" : "BLUETOOTH_ERROR_XXXX");
+               TC_PRT("App handler = %s, channel id = %d, type = %s", conn_ind->app_handle, conn_ind->channel_id, (conn_ind->type == HDP_QOS_RELIABLE) ? "Reliable" : "Streaming");
+               TC_PRT("device add = %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X\n",
+                                                       conn_ind->device_address.addr[0], conn_ind->device_address.addr[1], conn_ind->device_address.addr[2],
+                                                       conn_ind->device_address.addr[3], conn_ind->device_address.addr[4], conn_ind->device_address.addr[5]);
 
-                       TC_PRT("BLUETOOTH_EVENT_HDP_DISCONNECTED, Result = %s\n", (param->result == 0) ? "BLUETOOTH_ERROR_NONE" : "BLUETOOTH_ERROR_XXXX");
-                       TC_PRT("Channel = %d, Add = device add = %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X\n", dis_ind->channel_id,
-                                                               dis_ind->device_address.addr[0], dis_ind->device_address.addr[1], dis_ind->device_address.addr[2],
-                                                               dis_ind->device_address.addr[3], dis_ind->device_address.addr[4], dis_ind->device_address.addr[5]);
-                       break;
-               }
+               g_ret_client_fd1 = conn_ind->channel_id;
+               break;
+       }
 
-               case BLUETOOTH_EVENT_HDP_DATA_RECEIVED:
-               {
-                       bt_hdp_data_ind_t *data_ind = (bt_hdp_data_ind_t *)param->param_data;
+       case BLUETOOTH_EVENT_HDP_DISCONNECTED:
+       {
+               bt_hdp_disconnected_t *dis_ind = (bt_hdp_disconnected_t *)param->param_data;
 
-                       TC_PRT("BLUETOOTH_EVENT_HDP_DATA_RECEIVED, Result = %s\n", (param->result == 0) ? "BLUETOOTH_ERROR_NONE" : "BLUETOOTH_ERROR_XXXX");
-                       TC_PRT("Data received from channel id = %d and  size =%d, buff =[%s]\n",  data_ind->channel_id, data_ind->size, data_ind->buffer);
+               TC_PRT("BLUETOOTH_EVENT_HDP_DISCONNECTED, Result = %s\n", (param->result == 0) ? "BLUETOOTH_ERROR_NONE" : "BLUETOOTH_ERROR_XXXX");
+               TC_PRT("Channel = %d, Add = device add = %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X\n", dis_ind->channel_id,
+                                                       dis_ind->device_address.addr[0], dis_ind->device_address.addr[1], dis_ind->device_address.addr[2],
+                                                       dis_ind->device_address.addr[3], dis_ind->device_address.addr[4], dis_ind->device_address.addr[5]);
+               break;
+       }
 
-                       break;
-               }
+       case BLUETOOTH_EVENT_HDP_DATA_RECEIVED:
+       {
+               bt_hdp_data_ind_t *data_ind = (bt_hdp_data_ind_t *)param->param_data;
 
-               case BLUETOOTH_EVENT_OPC_CONNECTED:
-                       TC_PRT("BLUETOOTH_EVENT_OPC_CONNECTED");
-                       break;
+               TC_PRT("BLUETOOTH_EVENT_HDP_DATA_RECEIVED, Result = %s\n", (param->result == 0) ? "BLUETOOTH_ERROR_NONE" : "BLUETOOTH_ERROR_XXXX");
+               TC_PRT("Data received from channel id = %d and  size =%d, buff =[%s]\n",  data_ind->channel_id, data_ind->size, data_ind->buffer);
 
-               case BLUETOOTH_EVENT_OPC_DISCONNECTED:
-                       TC_PRT("BLUETOOTH_EVENT_OPC_DISCONNECTED");
-                       break;
-               case BLUETOOTH_EVENT_OPC_TRANSFER_STARTED:
-               {
-                       TC_PRT("BLUETOOTH_EVENT_OPC_TRANSFER_STARTED");
-                       if (param->param_data) {
-                               bt_opc_transfer_info_t *info = param->param_data;
-                               TC_PRT("file %s", info->filename);
-                               TC_PRT("size %ld", info->size);
-                       }
-                       break;
-               }
-               case BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS:
-               {
-                       TC_PRT("BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS");
-                       break;
-               }
-               case BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE:
-               {
-                       TC_PRT("BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE");
+               break;
+       }
+
+       case BLUETOOTH_EVENT_OPC_CONNECTED:
+               TC_PRT("BLUETOOTH_EVENT_OPC_CONNECTED");
+               break;
+
+       case BLUETOOTH_EVENT_OPC_DISCONNECTED:
+               TC_PRT("BLUETOOTH_EVENT_OPC_DISCONNECTED");
+               break;
+       case BLUETOOTH_EVENT_OPC_TRANSFER_STARTED:
+       {
+               TC_PRT("BLUETOOTH_EVENT_OPC_TRANSFER_STARTED");
+               if (param->param_data) {
                        bt_opc_transfer_info_t *info = param->param_data;
                        TC_PRT("file %s", info->filename);
                        TC_PRT("size %ld", info->size);
-                       break;
                }
+               break;
+       }
+       case BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS:
+       {
+               TC_PRT("BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS");
+               break;
+       }
+       case BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE:
+       {
+               TC_PRT("BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE");
+               bt_opc_transfer_info_t *info = param->param_data;
+               TC_PRT("file %s", info->filename);
+               TC_PRT("size %ld", info->size);
+               break;
+       }
 
-               case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE:
-                       TC_PRT("BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE");
-                       break;
-
-               case BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE:
-                       TC_PRT("BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE");
-                       break;
-
-               case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED:
-                       TC_PRT("BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED");
-                       bt_obex_server_transfer_info_t *info = param->param_data;
-                       current_transfer_id = info->transfer_id;
-                       break;
-
-               case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_PROGRESS:
-                       TC_PRT("BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_PROGRESS");
-                       break;
+       case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE:
+               TC_PRT("BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE");
+               break;
+
+       case BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE:
+               TC_PRT("BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE");
+               break;
+
+       case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED:
+               TC_PRT("BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED");
+               bt_obex_server_transfer_info_t *info = param->param_data;
+               current_transfer_id = info->transfer_id;
+               break;
+
+       case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_PROGRESS:
+               TC_PRT("BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_PROGRESS");
+               break;
+
+       case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_COMPLETED:
+               TC_PRT("BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_COMPLETED");
+               break;
+       case BLUETOOTH_EVENT_MANUFACTURER_DATA_CHANGED:
+       {       TC_PRT("BLUETOOTH_EVENT_MANUFACTURER_DATA_CHANGED");
+               break;
+       }
+#if 0
+       case BLUETOOTH_EVENT_GATT_PRIM_SVC_DISCOVERED:
+       {
+               TC_PRT("BLUETOOTH_EVENT_GATT_PRIM_SVC_DISCOVERED");
+               bt_gatt_handle_info_t *prim_svc = param->param_data;
+               int i;
 
-               case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_COMPLETED:
-                       TC_PRT("BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_COMPLETED");
-                       break;
-               case BLUETOOTH_EVENT_MANUFACTURER_DATA_CHANGED:
-               {       TC_PRT("BLUETOOTH_EVENT_MANUFACTURER_DATA_CHANGED");
+               if (prim_svc == NULL) {
+                       TC_PRT("prim_svc is NULL");
                        break;
                }
-#if 0
-               case BLUETOOTH_EVENT_GATT_PRIM_SVC_DISCOVERED:
-               {
-                       TC_PRT("BLUETOOTH_EVENT_GATT_PRIM_SVC_DISCOVERED");
-                       bt_gatt_handle_info_t *prim_svc = param->param_data;
-                       int i;
 
-                       if (prim_svc == NULL) {
-                               TC_PRT("prim_svc is NULL");
-                               break;
-                       }
+               for (i = 0; i < prim_svc->count; i++)
+                       TC_PRT("prim_svc[%d] = %s\n", i, prim_svc->handle[i]);
 
-                       for (i = 0; i < prim_svc->count; i++) {
-                               TC_PRT("prim_svc[%d] = %s\n", i, prim_svc->handle[i]);
-                       }
+               break;
+       }
 
+       case BLUETOOTH_EVENT_GATT_SVC_CHAR_DISCOVERED:
+       {
+               TC_PRT("BLUETOOTH_EVENT_GATT_SVC_CHAR_DISCOVERED");
+               bt_gatt_discovered_char_t *svc_char = param->param_data;
+               int i = 0;
+
+               if (svc_char == NULL) {
+                       TC_PRT("svc_char is NULL");
                        break;
                }
 
-               case BLUETOOTH_EVENT_GATT_SVC_CHAR_DISCOVERED:
-               {
-                       TC_PRT("BLUETOOTH_EVENT_GATT_SVC_CHAR_DISCOVERED");
-                       bt_gatt_discovered_char_t *svc_char = param->param_data;
-                       int i = 0;
+               if (svc_char->service_handle != NULL)
+                       TC_PRT("svc_char->service_handle %s \n", svc_char->service_handle);
 
-                       if (svc_char == NULL) {
-                               TC_PRT("svc_char is NULL");
-                               break;
-                       }
+               for (i = 0; i < svc_char->handle_info.count; i++)
+                       TC_PRT("svc_char.handle_info.handle[%d] = %s\n", i, svc_char->handle_info.handle[i]);
 
-                       if (svc_char->service_handle != NULL) {
-                               TC_PRT("svc_char->service_handle %s \n", svc_char->service_handle);
-                       }
+               break;
+       }
 
-                       for (i = 0; i < svc_char->handle_info.count; i++) {
-                               TC_PRT("svc_char.handle_info.handle[%d] = %s\n", i, svc_char->handle_info.handle[i]);
-                       }
+       case BLUETOOTH_EVENT_GATT_SVC_PROP_RECEIVED:
+       {
+               TC_PRT("BLUETOOTH_EVENT_GATT_SVC_PROP_RECEIVED");
+               bt_gatt_service_property_t *svc_pty = param->param_data;
+               int i;
 
+               if (svc_pty == NULL) {
+                       TC_PRT("char_pty is NULL \n");
                        break;
                }
 
-               case BLUETOOTH_EVENT_GATT_SVC_PROP_RECEIVED:
-               {
-                       TC_PRT("BLUETOOTH_EVENT_GATT_SVC_PROP_RECEIVED");
-                       bt_gatt_service_property_t *svc_pty = param->param_data;
-                       int i;
-
-                       if (svc_pty == NULL) {
-                               TC_PRT("char_pty is NULL \n");
-                               break;
-                       }
-
-                       if (svc_pty->service_handle != NULL) {
-                               TC_PRT("svc_pty->service_handle %s \n", svc_pty->service_handle);
-                       }
-
-                       if (svc_pty->uuid != NULL) {
-                               TC_PRT("svc_pty->uuid %s \n", svc_pty->uuid);
-                       }
+               if (svc_pty->service_handle != NULL)
+                       TC_PRT("svc_pty->service_handle %s \n", svc_pty->service_handle);
 
-                       for (i = 0; i < svc_pty->handle_info.count; i++) {
-                               TC_PRT("svc_char[%d] = %s\n", i, svc_pty->handle_info.handle[i]);
-                       }
+               if (svc_pty->uuid != NULL)
+                       TC_PRT("svc_pty->uuid %s \n", svc_pty->uuid);
 
-                       break;
-               }
+               for (i = 0; i < svc_pty->handle_info.count; i++)
+                       TC_PRT("svc_char[%d] = %s\n", i, svc_pty->handle_info.handle[i]);
 
-               case BLUETOOTH_EVENT_GATT_CHAR_PROP_RECEIVED:
-               {
-                       TC_PRT("BLUETOOTH_EVENT_GATT_CHAR_PROP_RECEIVED");
-                       bt_gatt_char_property_t *char_pty = param->param_data;
-                       int i = 0;
+               break;
+       }
 
-                       if (char_pty->char_handle != NULL) {
-                               TC_PRT("char_pty->char_handle %s \n", char_pty->char_handle);
-                       }
+       case BLUETOOTH_EVENT_GATT_CHAR_PROP_RECEIVED:
+       {
+               TC_PRT("BLUETOOTH_EVENT_GATT_CHAR_PROP_RECEIVED");
+               bt_gatt_char_property_t *char_pty = param->param_data;
+               int i = 0;
 
-                       if (char_pty->uuid != NULL) {
-                               TC_PRT("char_pty->uuid %s \n", char_pty->uuid);
-                       }
+               if (char_pty->char_handle != NULL)
+                       TC_PRT("char_pty->char_handle %s \n", char_pty->char_handle);
 
-                       if (char_pty == NULL) {
-                               TC_PRT("char_pty is NULL \n");
-                               break;
-                       }
+               if (char_pty->uuid != NULL)
+                       TC_PRT("char_pty->uuid %s \n", char_pty->uuid);
 
-                       if (char_pty->name != NULL) {
-                               TC_PRT("char_pty->name %s \n", char_pty->name);
-                       }
+               if (char_pty == NULL) {
+                       TC_PRT("char_pty is NULL \n");
+                       break;
+               }
 
-                       if (char_pty->description != NULL) {
-                               TC_PRT("char_pty->description %s \n", char_pty->description);
-                       }
+               if (char_pty->name != NULL)
+                       TC_PRT("char_pty->name %s \n", char_pty->name);
 
-                       if (char_pty->val != NULL) {
-                               TC_PRT("char_pty->val_len %d \n", char_pty->val_len);
+               if (char_pty->description != NULL)
+                       TC_PRT("char_pty->description %s \n", char_pty->description);
 
-                               for (i = 0; i < char_pty->val_len; i++)
-                                       TC_PRT("char_pty->val %02x \n", char_pty->val[i]);
-                       }
+               if (char_pty->val != NULL) {
+                       TC_PRT("char_pty->val_len %d \n", char_pty->val_len);
 
-                       break;
+                       for (i = 0; i < char_pty->val_len; i++)
+                               TC_PRT("char_pty->val %02x \n", char_pty->val[i]);
                }
+
+               break;
+       }
 #endif
-               case BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY:
-               {
-                       bluetooth_authentication_request_info_t *auth_info = param->param_data;
-
-                       TC_PRT("BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY");
-                       TC_PRT("Device Address: [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]",
-                               auth_info->device_address.addr[0], auth_info->device_address.addr[1],
-                               auth_info->device_address.addr[2], auth_info->device_address.addr[3],
-                               auth_info->device_address.addr[4], auth_info->device_address.addr[5]);
-                       TC_PRT("Device Name : [%s]", auth_info->device_name.name);
-                       TC_PRT("Passkey: [%s]", auth_info->str_passkey);
-                       break;
-               }
-               case BLUETOOTH_EVENT_PIN_REQUEST:
-               {
-                       bluetooth_authentication_request_info_t *auth_info = param->param_data;
-
-                       TC_PRT("BLUETOOTH_EVENT_PIN_REQUEST");
-                       TC_PRT("Device Address: [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]",
-                               auth_info->device_address.addr[0], auth_info->device_address.addr[1],
-                               auth_info->device_address.addr[2], auth_info->device_address.addr[3],
-                               auth_info->device_address.addr[4], auth_info->device_address.addr[5]);
-                       TC_PRT("Device Name : [%s]", auth_info->device_name.name);
-
-                       TC_PRT("bluetooth_passkey_reply(\"0000\", TRUE)");
-                       bluetooth_passkey_reply("0000", TRUE);
-                       break;
-               }
-               case BLUETOOTH_EVENT_PASSKEY_REQUEST:
-               {
-                       bluetooth_authentication_request_info_t *auth_info = param->param_data;
-
-                       TC_PRT("BLUETOOTH_EVENT_PASSKEY_REQUEST");
-                       TC_PRT("Device Address: [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]",
-                               auth_info->device_address.addr[0], auth_info->device_address.addr[1],
-                               auth_info->device_address.addr[2], auth_info->device_address.addr[3],
-                               auth_info->device_address.addr[4], auth_info->device_address.addr[5]);
-                       TC_PRT("Device Name : [%s]", auth_info->device_name.name);
-
-                       TC_PRT("bluetooth_passkey_reply(\"0000\", TRUE)");
-                       bluetooth_passkey_reply("0000", TRUE);
-                       break;
-               }
-               case BLUETOOTH_EVENT_PASSKEY_CONFIRM_REQUEST:
-               {
-                       bluetooth_authentication_request_info_t *auth_info = param->param_data;
-
-                       TC_PRT("BLUETOOTH_EVENT_PASSKEY_CONFIRM_REQUEST");
-                       TC_PRT("Device Address: [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]",
-                               auth_info->device_address.addr[0], auth_info->device_address.addr[1],
-                               auth_info->device_address.addr[2], auth_info->device_address.addr[3],
-                               auth_info->device_address.addr[4], auth_info->device_address.addr[5]);
-                       TC_PRT("Device Name : [%s]", auth_info->device_name.name);
-                       TC_PRT("Passkey: [%s]", auth_info->str_passkey);
-
-                       TC_PRT("bluetooth_passkey_confirmation_reply: TRUE");
-                       bluetooth_passkey_confirmation_reply(TRUE);
-                       break;
-               }
-               default:
-                       TC_PRT("received event [0x%04x]", event);
-                       break;
+       case BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY:
+       {
+               bluetooth_authentication_request_info_t *auth_info = param->param_data;
+
+               TC_PRT("BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY");
+               TC_PRT("Device Address: [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]",
+                       auth_info->device_address.addr[0], auth_info->device_address.addr[1],
+                       auth_info->device_address.addr[2], auth_info->device_address.addr[3],
+                       auth_info->device_address.addr[4], auth_info->device_address.addr[5]);
+               TC_PRT("Device Name : [%s]", auth_info->device_name.name);
+               TC_PRT("Passkey: [%s]", auth_info->str_passkey);
+               break;
+       }
+       case BLUETOOTH_EVENT_PIN_REQUEST:
+       {
+               bluetooth_authentication_request_info_t *auth_info = param->param_data;
+
+               TC_PRT("BLUETOOTH_EVENT_PIN_REQUEST");
+               TC_PRT("Device Address: [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]",
+                       auth_info->device_address.addr[0], auth_info->device_address.addr[1],
+                       auth_info->device_address.addr[2], auth_info->device_address.addr[3],
+                       auth_info->device_address.addr[4], auth_info->device_address.addr[5]);
+               TC_PRT("Device Name : [%s]", auth_info->device_name.name);
+
+               TC_PRT("bluetooth_passkey_reply(\"0000\", TRUE)");
+               bluetooth_passkey_reply("0000", TRUE);
+               break;
+       }
+       case BLUETOOTH_EVENT_PASSKEY_REQUEST:
+       {
+               bluetooth_authentication_request_info_t *auth_info = param->param_data;
+
+               TC_PRT("BLUETOOTH_EVENT_PASSKEY_REQUEST");
+               TC_PRT("Device Address: [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]",
+                       auth_info->device_address.addr[0], auth_info->device_address.addr[1],
+                       auth_info->device_address.addr[2], auth_info->device_address.addr[3],
+                       auth_info->device_address.addr[4], auth_info->device_address.addr[5]);
+               TC_PRT("Device Name : [%s]", auth_info->device_name.name);
+
+               TC_PRT("bluetooth_passkey_reply(\"0000\", TRUE)");
+               bluetooth_passkey_reply("0000", TRUE);
+               break;
+       }
+       case BLUETOOTH_EVENT_PASSKEY_CONFIRM_REQUEST:
+       {
+               bluetooth_authentication_request_info_t *auth_info = param->param_data;
+
+               TC_PRT("BLUETOOTH_EVENT_PASSKEY_CONFIRM_REQUEST");
+               TC_PRT("Device Address: [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]",
+                       auth_info->device_address.addr[0], auth_info->device_address.addr[1],
+                       auth_info->device_address.addr[2], auth_info->device_address.addr[3],
+                       auth_info->device_address.addr[4], auth_info->device_address.addr[5]);
+               TC_PRT("Device Name : [%s]", auth_info->device_name.name);
+               TC_PRT("Passkey: [%s]", auth_info->str_passkey);
+
+               TC_PRT("bluetooth_passkey_confirmation_reply: TRUE");
+               bluetooth_passkey_confirmation_reply(TRUE);
+               break;
+       }
+       default:
+               TC_PRT("received event [0x%04x]", event);
+               break;
        }
        TC_PRT("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
 }
index fdf0928..10faa97 100755 (executable)
@@ -297,7 +297,7 @@ static gboolean key_event_cb(GIOChannel *chan, GIOCondition cond, gpointer data)
        unsigned int len = 0;
        int test_id;
 
-       if (g_io_channel_read_chars(chan, buf, sizeof(buf), 
+       if (g_io_channel_read_chars(chan, buf, sizeof(buf),
                        &len, NULL) ==  G_IO_STATUS_ERROR) {
                printf("IO Channel read error");
                return FALSE;
diff --git a/test/handsfree/CMakeLists.txt b/test/handsfree/CMakeLists.txt
deleted file mode 100644 (file)
index dcb80d6..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
-PROJECT(bluetooth-hf-test C)
-
-SET(SRCS bluetooth-hf-test.c)
-
-SET(PREFIX ${CMAKE_INSTALL_PREFIX})
-
-INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/bt-api/)
-
-INCLUDE(FindPkgConfig)
-pkg_check_modules(package REQUIRED dlog dbus-1 glib-2.0 gthread-2.0 gobject-2.0)
-
-FOREACH(flag ${package_CFLAGS})
-       SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
-ENDFOREACH(flag)
-
-SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
-
-FIND_PROGRAM(UNAME NAMES uname)
-EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH")
-IF("${ARCH}" STREQUAL "arm")
-       ADD_DEFINITIONS("-DTARGET")
-       MESSAGE("add -DTARGET")
-ENDIF("${ARCH}" STREQUAL "arm")
-
-ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
-ADD_DEFINITIONS("-DFACTORYFS=\"$ENV{FACTORYFS}\"")
-
-ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS})
-TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${package_LDFLAGS} -L${CMAKE_SOURCE_DIR}/bt-api/ -lbluetooth-api)
-
-INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin)
diff --git a/test/handsfree/bluetooth-hf-test.c b/test/handsfree/bluetooth-hf-test.c
deleted file mode 100755 (executable)
index 759a76d..0000000
+++ /dev/null
@@ -1,522 +0,0 @@
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *             http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-/**
- * @file       bluetooth-telephony-test.c
- * @brief      This is the source file for bluetooth telephony test suite.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <glib.h>
-#include <dbus/dbus-glib.h>
-#include <pthread.h>
-
-#include "bluetooth-audio-api.h"
-#include "bluetooth-api.h"
-
-#define PRT(format, args...) printf("%s:%d() "format, \
-                       __FUNCTION__, __LINE__, ##args)
-#define TC_PRT(format, args...) PRT(format"\n", ##args)
-
-GMainLoop *main_loop = NULL;
-static int timeout_status = 0;
-#define DEFAULT_CALL_ID 1
-/*Change this number with Testing SIM*/
-#define TEST_NUMBER "9980785507"
-#define BLUETOOTH_HF_SPEAKER_GAIN 2
-
-typedef struct {
-       const char *tc_name;
-       int tc_code;
-} tc_table_t;
-
-tc_table_t tc_table[] = {
-       /*HF Application*/
-       {"bluetooth_hf_init", 1},
-       {"bluetooth_hf_deinit", 2},
-       {"Answer Call", 3},
-       {"Terminate Call", 4},
-       {"Initiate Call", 5},
-       {"Last number Redial ", 6},
-       {"(PTS) Connect last bonded device", 7},
-       {"Disconnect", 8},
-       {"(PTS) Voice Recognition Enable", 9},
-       {"Voice RecognitionDisable", 10},
-       {"SCO disconnect", 11},
-       {"Speaker gain", 12},
-       {"Dual Tone mulitple frequency", 13},
-       {"Send AT+XSAT=appid command", 14},
-       {"Release All Call(CHLD=0)", 15},
-       {"Release and Accept(CHLD=1)", 16},
-       {"Swap call (CHLD=2)", 17},
-       {"Join Call (CHLD=3)", 18},
-       {"(PTS) Initiate Codec based SCO", 19},
-       {"(PTS) Unbond all devices", 20},
-       {"Get Current Codec", 21},
-       {"Get Call List", 22},
-       {"Get Audio Connected Status", 23},
-       {"Is Handsfree Connected?", 24},
-
-       /* -----------------------------------------*/
-       {"Finish", 0x00ff},
-       {NULL, 0x0000},
-
-};
-
-#define tc_result(success, tc_index) \
-       TC_PRT("Test case [%d - %s] %s", tc_table[tc_index].tc_code, \
-                       tc_table[tc_index].tc_name, \
-                       ((success == TC_PASS) ? "Success" : "Failed"));
-
-void tc_usage_print(void)
-{
-       int i = 0;
-
-       while (tc_table[i].tc_name) {
-               if (tc_table[i].tc_code != 0x00ff) {
-                       TC_PRT("Key %d : usage %s", tc_table[i].tc_code,
-                                                       tc_table[i].tc_name);
-               } else {
-                       TC_PRT("Key %d : usage %s\n\n", 0x00ff,
-                                                       tc_table[i].tc_name);
-               }
-
-               i++;
-       }
-}
-void bt_event_callback(int event, bluetooth_event_param_t *param, void *user_data)
-{
-
-}
-
-void hf_event_handler(int event, void *data, void *user_data)
-{
-       bt_hf_event_param_t *hf_event;
-
-       if (data == NULL)
-               return;
-       hf_event = data;
-
-       TC_PRT("HF event : [0x%04x]", event);
-
-       switch (event) {
-       case BLUETOOTH_EVENT_HF_CONNECTED:
-               TC_PRT("BLUETOOTH_EVENT_HF_CONNECTED");
-               break;
-
-       case BLUETOOTH_EVENT_HF_DISCONNECTED:
-               TC_PRT("BLUETOOTH_EVENT_HF_DISCONNECTED");
-               break;
-
-       case BLUETOOTH_EVENT_HF_AUDIO_CONNECTED:
-               TC_PRT("BLUETOOTH_EVENT_HF_AUDIO_CONNECTED");
-               break;
-
-       case BLUETOOTH_EVENT_HF_AUDIO_DISCONNECTED:
-               TC_PRT("BLUETOOTH_EVENT_HF_AUDIO_DISCONNECTED");
-               break;
-
-       case BLUETOOTH_EVENT_HF_RING_INDICATOR:
-               TC_PRT("BLUETOOTH_EVENT_HF_RING_INDICATOR");
-               if (hf_event->param_data)
-                       TC_PRT("Phone number %s", hf_event->param_data);
-               break;
-
-       case BLUETOOTH_EVENT_HF_CALL_WAITING:
-               TC_PRT("BLUETOOTH_EVENT_HF_CALL_WAITING");
-               if (hf_event->param_data)
-                       TC_PRT("Waiting Phone number %s", hf_event->param_data);
-               break;
-
-       case BLUETOOTH_EVENT_HF_CALL_TERMINATED:
-               TC_PRT("BLUETOOTH_EVENT_HF_CALL_TERMINATED");
-               break;
-
-       case BLUETOOTH_EVENT_HF_CALL_STARTED:
-               TC_PRT("BLUETOOTH_EVENT_HF_CALL_STARTED");
-               break;
-
-       case BLUETOOTH_EVENT_HF_CALL_ENDED:
-               TC_PRT("BLUETOOTH_EVENT_HF_CALL_ENDED");
-               break;
-
-       case BLUETOOTH_EVENT_HF_CALL_UNHOLD:
-               TC_PRT("BLUETOOTH_EVENT_HF_CALL_UNHOLD");
-               break;
-
-       case BLUETOOTH_EVENT_HF_CALL_SWAPPED:
-               TC_PRT("BLUETOOTH_EVENT_HF_CALL_SWAPPED");
-               break;
-
-       case BLUETOOTH_EVENT_HF_CALL_ON_HOLD:
-               TC_PRT("BLUETOOTH_EVENT_HF_CALL_ON_HOLD");
-               break;
-
-       case BLUETOOTH_EVENT_HF_CALL_STATUS:
-       {
-               TC_PRT("BLUETOOTH_EVENT_HF_CALL_STATUS");
-               int i;
-               bt_hf_call_list_s * call_list = hf_event->param_data;
-               bt_hf_call_status_info_t **call_info;
-               TC_PRT("call_list length : %d ", call_list->count);
-               call_info = g_malloc0(sizeof(bt_hf_call_status_info_t *) *
-                                               call_list->count);
-               bluetooth_hf_get_call_list(call_list->list, call_info);
-
-               for (i = 0; i < call_list->count; i++) {
-                       TC_PRT("Phone Number : %s ", call_info[i]->number);
-                       TC_PRT("Direction (in -1, out 0 : %d ", call_info[i]->direction);
-                       TC_PRT("Call status : %d ", call_info[i]->status);
-                       TC_PRT("MultyParty : %d ", call_info[i]->mpart);
-                       TC_PRT("Call ID : %d ", call_info[i]->idx);
-               }
-               g_free(call_info);
-               break;
-       }
-       case BLUETOOTH_EVENT_HF_VOICE_RECOGNITION_ENABLED:
-               TC_PRT("BLUETOOTH_EVENT_HF_VOICE_RECOGNITION_ENABLED");
-               break;
-
-       case BLUETOOTH_EVENT_HF_VOICE_RECOGNITION_DISABLED:
-               TC_PRT("BLUETOOTH_EVENT_HF_VOICE_RECOGNITION_DISABLED");
-               break;
-
-       case BLUETOOTH_EVENT_HF_VOLUME_SPEAKER:
-       {
-               unsigned int *value;
-               value = hf_event->param_data;
-               TC_PRT("BLUETOOTH_EVENT_HF_VOLUME_SPEAKER - value = %d", *value);
-               break;
-       }
-       case BLUETOOTH_EVENT_HF_VENDOR_DEP_CMD:
-       {
-               bluetooth_vendor_dep_at_cmd_t *cmd = hf_event->param_data;
-               TC_PRT("BLUETOOTH_EVENT_HF_VENDOR_DEP_CMD - appid = %d, msg = %s",
-                       cmd->app_id, cmd->message);
-               break;
-       }
-
-       default:
-               break;
-       }
-}
-
-static int  __bt_unbond_all_bonded_devices(void)
-{
-       int ret;
-       int i;
-       bluetooth_device_info_t *ptr;
-
-       GPtrArray *dev_list = NULL;
-       dev_list = g_ptr_array_new();
-       TC_PRT("g pointer arrary count : [%d]", dev_list->len);
-
-       ret = bluetooth_get_bonded_device_list(&dev_list);
-       if (ret < 0) {
-               TC_PRT("failed bluetooth_get_bonded_device_list");
-               g_ptr_array_free(dev_list, TRUE);
-               return 1;
-       }
-       TC_PRT("g pointer arrary count : [%d]", dev_list->len);
-
-       if (dev_list->len == 0) {
-               TC_PRT("No paired device found");
-               g_ptr_array_free(dev_list, TRUE);
-               return 1;
-       }
-
-       for (i = 0; i < dev_list->len; i++) {
-               ptr = g_ptr_array_index(dev_list, i);
-               if (ptr == NULL)
-                       continue;
-               TC_PRT("[%d] Unbond %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X", i + 1,
-                       ptr->device_address.addr[0], ptr->device_address.addr[1],
-                       ptr->device_address.addr[2], ptr->device_address.addr[3],
-                       ptr->device_address.addr[4], ptr->device_address.addr[5]);
-                       bluetooth_unbond_device(&ptr->device_address);
-
-       }
-       g_ptr_array_foreach(dev_list, (GFunc)g_free, NULL);
-       g_ptr_array_free(dev_list, TRUE);
-       return 0;
-
-}
-static int  __bt_get_last_bonded_device(bluetooth_device_address_t *device_address)
-{
-       int ret;
-       int i;
-       bluetooth_device_info_t *ptr;
-
-       GPtrArray *dev_list = NULL;
-       dev_list = g_ptr_array_new();
-       TC_PRT("g pointer arrary count : [%d]", dev_list->len);
-
-       ret = bluetooth_get_bonded_device_list(&dev_list);
-       if (ret < 0) {
-               TC_PRT("failed bluetooth_get_bonded_device_list");
-               g_ptr_array_free(dev_list, TRUE);
-               return 1;
-       }
-       TC_PRT("g pointer arrary count : [%d]", dev_list->len);
-
-       if (dev_list->len == 0) {
-               TC_PRT("No paired device found");
-               g_ptr_array_free(dev_list, TRUE);
-               return 1;
-       }
-
-       for (i = 0; i < dev_list->len; i++) {
-               ptr = g_ptr_array_index(dev_list, i);
-               if (ptr == NULL)
-                       continue;
-               TC_PRT("[%d] %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X", i + 1,
-                       ptr->device_address.addr[0], ptr->device_address.addr[1],
-                       ptr->device_address.addr[2], ptr->device_address.addr[3],
-                       ptr->device_address.addr[4], ptr->device_address.addr[5]);
-               memcpy(device_address->addr, ptr->device_address.addr,
-                               sizeof(bluetooth_device_address_t));
-       }
-       g_ptr_array_foreach(dev_list, (GFunc)g_free, NULL);
-       g_ptr_array_free(dev_list, TRUE);
-       return 0;
-
-}
-
-int test_input_callback(void *data)
-{
-       int ret;
-       int test_id = (int)data;
-
-       switch (test_id) {
-               case 0x00ff:
-                       TC_PRT("Finished");
-                       g_main_loop_quit(main_loop);
-                       break;
-
-               case 1:
-                       bluetooth_hf_init(hf_event_handler, NULL);
-                       break;
-               case 2:
-                       bluetooth_hf_deinit();
-                       break;
-               case 3:
-                       bluetooth_hf_answer_call();
-                       break;
-               case 4:
-                       bluetooth_hf_terminate_call();
-                       break;
-               case 5:
-                       ret = bluetooth_hf_initiate_call(TEST_NUMBER);
-                       TC_PRT("ret = %d", ret);
-                       break;
-               case 6:
-                       bluetooth_hf_initiate_call(NULL);
-                       break;
-               case 7:
-               {       bluetooth_device_address_t device_address = { {0} };
-                       ret = __bt_get_last_bonded_device(&device_address);
-                       if (ret != 0) {
-                               TC_PRT("Error in getting last bonded device.....");
-                               return FALSE;
-                       }
-
-                       bluetooth_hf_connect(&device_address);
-                       break;
-               }
-               case 8:
-               {
-                       bluetooth_device_address_t device_address = { {0} };
-                       ret = __bt_get_last_bonded_device(&device_address);
-                       if (ret != 0) {
-                               TC_PRT("Error in getting last bonded device.....");
-                               return FALSE;
-                       }
-
-                       bluetooth_hf_disconnect(&device_address);
-                       break;
-               }
-               case 9:
-                       bluetooth_hf_voice_recognition(1);
-                       break;
-
-               case 10:
-                       bluetooth_hf_voice_recognition(0);
-                       break;
-               case 11:
-                       bluetooth_hf_audio_disconnect();
-                       break;
-               case 12:
-                       bluetooth_hf_set_speaker_gain(BLUETOOTH_HF_SPEAKER_GAIN);
-                       break;
-               case 13:
-                       bluetooth_hf_send_dtmf("1");
-                       break;
-               case 14:
-                       /* get the Call Time from AG for DC lauch */
-                       bluetooth_hf_send_xsat_cmd(11, "Q_CT,1,01025561613");
-                       break;
-               case 15:
-                       bluetooth_hf_release_all_call();
-                       break;
-               case 16:
-                       bluetooth_hf_release_and_accept();
-                       break;
-               case 17:
-                       bluetooth_hf_swap_call();
-                       break;
-               case 18:
-                       bluetooth_hf_join_call();
-                       break;
-               case 19:
-                       system("dbus-send --system --print-reply --dest=org.bluez.hf_agent  /org/bluez/handsfree_agent org.tizen.HfApp.SendAtCmd string:AT+BCC");
-                       break;
-               case 20:
-               {
-                       ret = bluetooth_register_callback(bt_event_callback, NULL);
-                       ret = __bt_unbond_all_bonded_devices();
-                       if (ret != 0) {
-                               TC_PRT("Error in getting last bonded device.....");
-                               return FALSE;
-                       }
-
-                       break;
-               }
-               case 21:
-               {
-                       unsigned int current_codec;
-                       bluetooth_hf_get_codec(&current_codec);
-                       if (current_codec == BLUETOOTH_CODEC_ID_CVSD)
-                               TC_PRT("current_codec is CVSD");
-                       else
-                               TC_PRT("current_codec is. MSBC");
-                       break;
-               }
-               case 22:
-               {
-                       int i;
-                       bt_hf_call_list_s * call_list = NULL;
-                       bt_hf_call_status_info_t **call_info = NULL;
-                       bluetooth_hf_request_call_list(&call_list);
-                       if (call_list == NULL) {
-                               TC_PRT("call_list is NULL");
-                               break;
-                       }
-                       TC_PRT("call_list length : %d ", call_list->count);
-                       call_info = g_malloc0(sizeof(bt_hf_call_status_info_t *) *
-                                               call_list->count);
-                       bluetooth_hf_get_call_list(call_list->list, call_info);
-
-                       for (i = 0; i < call_list->count; i++) {
-                               TC_PRT("Phone Number : %s ", call_info[i]->number);
-                               TC_PRT("Direction (in -1, out 0 : %d ", call_info[i]->direction);
-                               TC_PRT("Call status : %d ", call_info[i]->status);
-                               TC_PRT("MultyParty : %d ", call_info[i]->mpart);
-                               TC_PRT("Call ID : %d ", call_info[i]->idx);
-                       }
-                       g_free(call_info);
-                       bluetooth_hf_free_call_list(call_list);
-                       break;
-               }
-               case 23:
-               {
-                       unsigned int sco_audio_connected;
-                       bluetooth_hf_get_audio_connected(&sco_audio_connected);
-                       if (sco_audio_connected == BLUETOOTH_HF_AUDIO_CONNECTED)
-                               TC_PRT("SCO Audio is connected");
-                       else
-                               TC_PRT("SCO Audio is disconnected");
-                       break;
-               }
-               case 24:
-               {
-                       gboolean hf_connected;
-                       bluetooth_hf_is_connected(&hf_connected);
-                       if (hf_connected == BLUETOOTH_HF_AUDIO_CONNECTED)
-                               TC_PRT("HF is connected");
-                       else
-                               TC_PRT("HF is disconnected");
-                       break;
-               }
-               default:
-                       break;
-       }
-
-       return 0;
-}
-
-void startup()
-{
-       TC_PRT("bluetooth framework TC startup");
-
-       dbus_threads_init_default();
-
-       main_loop = g_main_loop_new(NULL, FALSE);
-}
-
-void cleanup()
-{
-       TC_PRT("bluetooth framework TC cleanup");
-       if (main_loop != NULL) {
-               g_main_loop_unref(main_loop);
-       }
-}
-
-static gboolean key_event_cb(GIOChannel *chan, GIOCondition cond ,
-                                                       gpointer data)
-{
-       char buf[10] = {0};
-
-       unsigned int len = 0;
-       int test_id;
-       memset(buf, 0, sizeof(buf));
-
-       if (g_io_channel_read(chan, buf, sizeof(buf), &len) !=
-                                       G_IO_ERROR_NONE) {
-
-               printf("IO Channel read error");
-               return FALSE;
-
-       }
-       printf("%s\n", buf);
-       tc_usage_print();
-
-       test_id = atoi(buf);
-
-       if (test_id)
-               g_idle_add(test_input_callback, (void *)test_id);
-
-       return TRUE;
-}
-
-int main()
-{
-       startup();
-
-       GIOChannel *key_io;
-       key_io = g_io_channel_unix_new(fileno(stdin));
-
-       g_io_add_watch(key_io, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
-                       key_event_cb, NULL);
-       g_io_channel_unref(key_io);
-
-
-       g_main_loop_run(main_loop);
-
-       cleanup();
-       return 0;
-}
index 3b62622..9e005de 100755 (executable)
@@ -325,7 +325,7 @@ static gboolean key_event_cb(GIOChannel *chan, GIOCondition cond, gpointer data)
        unsigned int len = 0;
        int test_id;
 
-       if (g_io_channel_read_chars(chan, buf, sizeof(buf), 
+       if (g_io_channel_read_chars(chan, buf, sizeof(buf),
                        &len, NULL) ==  G_IO_STATUS_ERROR) {
                printf("IO Channel read error");
                return FALSE;
diff --git a/test/media-control/CMakeLists.txt b/test/media-control/CMakeLists.txt
deleted file mode 100644 (file)
index 08b9a1b..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
-PROJECT(bluetooth-media-control-test C)
-
-SET(SRCS bluetooth-media-control-test.c)
-
-SET(PREFIX ${CMAKE_INSTALL_PREFIX})
-
-INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/bt-api)
-
-INCLUDE(FindPkgConfig)
-pkg_check_modules(package REQUIRED dlog dbus-1 glib-2.0 gthread-2.0 gobject-2.0)
-
-FOREACH(flag ${package_CFLAGS})
-       SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
-ENDFOREACH(flag)
-
-SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
-
-FIND_PROGRAM(UNAME NAMES uname)
-EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH")
-IF("${ARCH}" STREQUAL "arm")
-       ADD_DEFINITIONS("-DTARGET")
-       MESSAGE("add -DTARGET")
-ENDIF("${ARCH}" STREQUAL "arm")
-
-ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
-ADD_DEFINITIONS("-DFACTORYFS=\"$ENV{FACTORYFS}\"")
-
-ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS})
-TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${package_LDFLAGS} -L${CMAKE_SOURCE_DIR}/bt-api -lbluetooth-api)
-
-INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin)
diff --git a/test/media-control/bluetooth-media-control-test.c b/test/media-control/bluetooth-media-control-test.c
deleted file mode 100755 (executable)
index fb73270..0000000
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include "bluetooth-media-control.h"
-
-#include <glib.h>
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
-
-#define MEDIA_ATRRIBUTE_LENGTH 256
-
-media_player_settings_t player_settings = {0x00, 0x00, 0x00, 0x00, 0x01, 1111};
-media_metadata_attributes_t metadata = {"Test Track", "Chethan", "TNC", "Tumkur", 1, 1, 14400};
-
-void static __choose_metadata_settings(void)
-{
-       int cmd;
-       media_metadata_attributes_t metadata = {0,};
-
-       while (1) {
-               printf("\nPlease enter\n");
-               printf("\t0: return to main menu\n");
-               printf("\t1: Meta data settings\n");
-               printf("\tEnter your choice [ ]\b\b");
-
-               scanf("%d", &cmd);
-
-               switch (cmd) {
-               case 0:
-                       return;
-               case 1: /* Title */
-
-                       metadata.title = calloc(1, MEDIA_ATRRIBUTE_LENGTH);
-                       metadata.artist = calloc(1, MEDIA_ATRRIBUTE_LENGTH);
-                       metadata.album = calloc(1, MEDIA_ATRRIBUTE_LENGTH);
-                       metadata.genre = calloc(1, MEDIA_ATRRIBUTE_LENGTH);
-
-                       printf("Enter the \"Track\" name\n");
-                       scanf("%s", (char *)metadata.title);
-
-                       printf(" Enter the \"Artist\" name\n");
-                       scanf("%s", (char *)metadata.artist);
-
-                       printf(" Enter the \"Album\" name\n");
-                       scanf("%s", (char *)metadata.album);
-
-                       printf(" Enter the \"Genre\" \n");
-                       scanf("%s", (char *)metadata.genre);
-
-                       printf(" Enter the \" Totol NumberOfTracks\" \n");
-                       scanf("%d", &metadata.total_tracks);
-
-                       printf(" Enter the \" Track Number\" \n");
-                       scanf("%d", &metadata.number);
-
-                       printf(" Enter the \"Duration\" \n");
-                       scanf("%d", &metadata.duration);
-                       break;
-               default:
-                       break;
-               }
-               bluetooth_media_player_change_track(&metadata);
-
-               if (NULL !=  metadata.title) {
-                       free((void *)metadata.title);
-                       metadata.title = NULL;
-               }
-               if (NULL !=  metadata.artist) {
-                       free((void *)metadata.artist);
-                       metadata.artist = NULL;
-               }
-               if (NULL !=  metadata.album) {
-                       free((void *)metadata.album);
-                       metadata.album = NULL;
-               }
-               if (NULL !=  metadata.genre) {
-                       free((void *)metadata.genre);
-                       metadata.genre = NULL;
-               }
-       }
-}
-
-void static __choose_player_settings(void)
-{
-       int cmd;
-       media_player_property_type type;
-
-       while (1) {
-               printf("\nPlease choose player settings\n");
-               printf("\t0: return to main menu\n");
-               printf("\t1. Equalizer\n");
-               printf("\t2. Repeat\n");
-               printf("\t3. Shuffle\n");
-               printf("\t4. Scan \n");
-               printf("\t5. Status \n");
-               printf("\t6. Position \n");
-               printf("\tEnter your choice [ ]\b\b");
-
-               scanf("%d", &cmd);
-
-               switch (cmd) {
-               case 0:
-                       return;
-               case 1: /* Equalizer */
-               {
-                       printf("Possible Values - EQUALIZER_OFF = 0x00 and EQUALIZER_ON = 0x01,\n");
-                       scanf("%d", &player_settings.equalizer);
-                       type = EQUALIZER;
-
-                       bluetooth_media_player_change_property(type,
-                               (unsigned int)player_settings.equalizer);
-
-                       break;
-               }
-               case 2: /*Repeat */
-               {
-                       printf(" Possible Values - REPEAT_MODE_OFF = 0x00, REPEAT_SINGLE_TRACK = 0x01 , \
-                                       REPEAT_ALL_TRACK = 0x02,        REPEAT_GROUP = 0x03\n");
-                       scanf("%d", &player_settings.repeat);
-                       type = REPEAT;
-
-                       bluetooth_media_player_change_property(type,
-                               (unsigned int)player_settings.repeat);
-                       break;
-               }
-               case 3: /* Shuffle */
-               {
-                       printf(" Possible Values - SHUFFLE_MODE_OFF = 0x00, SHUFFLE_ALL_TRACK = 0x01 , \
-                                       SHUFFLE_GROUP = 0x02\n");
-                       scanf("%d", &player_settings.shuffle);
-                       type = SHUFFLE;
-
-                       bluetooth_media_player_change_property(type,
-                               (unsigned int)player_settings.shuffle);
-                       break;
-               }
-               case 4: /* Scan */
-               {
-                       printf(" Possible Values - SCAN_MODE_OFF = 0x00, SCAN_ALL_TRACK = 0x01 , \
-                                       SCAN_GROUP = 0x02\n");
-                       scanf("%d", &player_settings.scan);
-                       type = SCAN;
-
-                       bluetooth_media_player_change_property(type,
-                               (unsigned int)player_settings.scan);
-                       break;
-               }
-               case 5: /* Status */
-               {
-                       printf(" Possible Values - STATUS_PLAYING = 0x00, STATUS_STOPPED = 0x01 , \
-                                       STATUS_PAUSED = 0x02,STATUS_FORWARD_SEEK = 0x03 \
-                                       STATUS_REVERSE_SEEK = 0x04 STATUS_ERROR = 0x05\n");
-                       scanf("%d", &player_settings.status);
-                       type = STATUS;
-
-                       bluetooth_media_player_change_property(type,
-                               (unsigned int)player_settings.status);
-                       break;
-               }
-               case 6: /* Position */
-               {
-                       printf("Enter the possible value: ");
-                       scanf("%d", &player_settings.position);
-                       type = POSITION;
-
-                       bluetooth_media_player_change_property(type,
-                               player_settings.position);
-                       break;
-               }
-               default:
-                       break;
-               }
-       }
-}
-
-int main()
-{
-       GMainLoop *agent_loop;
-       int cmd;
-
-       agent_loop = g_main_loop_new(NULL, FALSE);
-
-       printf("MP-AV test application started\n");
-       while (1) {
-               printf("\n\n\t0. Exit\n");
-               printf("\t1. bluetooth_media_player_property_changed\n");
-               printf("\t2. bluetooth_media_player_track_changed\n");
-               printf("\tEnter your choice [  ]\b\b");
-
-               scanf("%d", &cmd);
-
-               switch (cmd) {
-               case 0: /* exit the application */
-                       {
-                               exit(0);
-                               break;
-                       }
-               case 1:
-                       {
-                               __choose_player_settings();
-                               break;
-                       }
-               case 2:
-                       {
-                               __choose_metadata_settings();
-                               break;
-                       }
-               }
-       }
-       printf("gmain loop enter\n");
-       g_main_loop_run(agent_loop);
-       printf("gmain loop leave\n");
-       return 0;
-}
diff --git a/test/telephony/CMakeLists.txt b/test/telephony/CMakeLists.txt
deleted file mode 100644 (file)
index 9b2b225..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
-PROJECT(bluetooth-telephony-test C)
-
-SET(SRCS bluetooth-telephony-test.c)
-
-SET(PREFIX ${CMAKE_INSTALL_PREFIX})
-
-INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/bt-api/)
-
-INCLUDE(FindPkgConfig)
-pkg_check_modules(package REQUIRED dlog dbus-glib-1 glib-2.0 gthread-2.0)
-
-FOREACH(flag ${package_CFLAGS})
-       SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
-ENDFOREACH(flag)
-
-SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
-
-FIND_PROGRAM(UNAME NAMES uname)
-EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH")
-IF("${ARCH}" STREQUAL "arm")
-       ADD_DEFINITIONS("-DTARGET")
-       MESSAGE("add -DTARGET")
-ENDIF("${ARCH}" STREQUAL "arm")
-
-ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
-ADD_DEFINITIONS("-DFACTORYFS=\"$ENV{FACTORYFS}\"")
-
-ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS})
-TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${package_LDFLAGS} -L${CMAKE_SOURCE_DIR}/bt-api/ -lbluetooth-api)
-
-INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin)
diff --git a/test/telephony/bluetooth-telephony-test.c b/test/telephony/bluetooth-telephony-test.c
deleted file mode 100755 (executable)
index 98d4ca3..0000000
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *             http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-/**
- * @file       bluetooth-telephony-test.c
- * @brief      This is the source file for bluetooth telephony test suite.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <glib.h>
-#include <dbus/dbus-glib.h>
-#include <pthread.h>
-
-#include "bluetooth-telephony-api.h"
-
-
-#define PRT(format, args...) printf("%s:%d() "format, \
-                       __FUNCTION__, __LINE__, ##args)
-#define TC_PRT(format, args...) PRT(format"\n", ##args)
-
-GMainLoop *main_loop = NULL;
-static int timeout_status = 0;
-#define DEFAULT_CALL_ID 1
-/*Change this number with Testing SIM*/
-#define TEST_NUMBER "9986008917"
-
-typedef struct {
-       const char *tc_name;
-       int tc_code;
-} tc_table_t;
-
-tc_table_t tc_table[] = {
-       /*Telephony Application*/
-       {"bluetooth_telephony_init", 70},
-       {"bluetooth_telephony_deinit", 71},
-       {"Indicate Outgoing call", 72},
-       {"Indicate Incoming call", 73},
-       {"Speaker to Headphone", 74},
-       {"Headphone to Speaker ", 75},
-       {"Call End/Release", 76},
-       {"Call Hold", 77},
-       {"bluetooth_telephony_call_remote_ringing", 78},
-       {"Call Swap", 79},
-       {"Call Reject", 80},
-       {"Call Answer", 81},
-       {"Is SCO channel connected", 82},
-       {"Voice Recognition Start", 83},
-       {"Voice Recognition Stop", 84},
-       {"NREC Status", 85},
-       {"WBS Status", 86},
-       {"Vendor dep AT CMD [+XSAT: 11,DUAL,DUAL]", 87},
-
-       /* -----------------------------------------*/
-       {"Finish", 0x00ff},
-       {NULL, 0x0000},
-
-};
-
-#define tc_result(success, tc_index) \
-       TC_PRT("Test case [%d - %s] %s", tc_table[tc_index].tc_code, \
-                       tc_table[tc_index].tc_name, \
-                       ((success == TC_PASS) ? "Success" : "Failed"));
-
-void tc_usage_print(void)
-{
-       int i = 0;
-
-       while (tc_table[i].tc_name) {
-               if (tc_table[i].tc_code != 0x00ff) {
-                       TC_PRT("Key %d : usage %s", tc_table[i].tc_code,
-                                                       tc_table[i].tc_name);
-               } else {
-                       TC_PRT("Key %d : usage %s\n\n", 0x00ff,
-                                                       tc_table[i].tc_name);
-               }
-
-               i++;
-       }
-}
-
-void telephony_event_handler(int event, void *data, void *user_data)
-{
-       telephony_event_param_t *bt_event;
-
-       if (data == NULL)
-               return;
-       bt_event = data;
-
-       TC_PRT("AG event : [0x%04x]", event);
-
-       switch (event) {
-       case BLUETOOTH_EVENT_TELEPHONY_ANSWER_CALL:
-               TC_PRT("BLUETOOTH_EVENT_TELEPHONY_ANSWER_CALL");
-               bluetooth_telephony_call_answered(DEFAULT_CALL_ID, TRUE);
-               break;
-
-       case BLUETOOTH_EVENT_TELEPHONY_RELEASE_CALL:
-               TC_PRT("BLUETOOTH_EVENT_TELEPHONY_RELEASE_CALL");
-               bluetooth_telephony_call_end(DEFAULT_CALL_ID);
-               break;
-
-       case BLUETOOTH_EVENT_TELEPHONY_REJECT_CALL:
-               bluetooth_telephony_call_end(DEFAULT_CALL_ID);
-               break;
-
-       case BLUETOOTH_EVENT_TELEPHONY_CHLD_0_RELEASE_ALL_HELD_CALL:
-               TC_PRT("BLUETOOTH_EVENT_TELEPHONY_CHLD_0_RELEASE_ALL_HELD_CALL");
-               break;
-
-       case BLUETOOTH_EVENT_TELEPHONY_CHLD_1_RELEASE_ALL_ACTIVE_CALL:
-               TC_PRT("BLUETOOTH_EVENT_TELEPHONY_CHLD_1_RELEASE_ALL_ACTIVE_CALL");
-               break;
-
-       case BLUETOOTH_EVENT_TELEPHONY_CHLD_3_MERGE_CALL:
-               TC_PRT("BLUETOOTH_EVENT_TELEPHONY_CHLD_3_MERGE_CALL");
-               break;
-
-       case BLUETOOTH_EVENT_TELEPHONY_CHLD_2_ACTIVE_HELD_CALL:
-               TC_PRT("BLUETOOTH_EVENT_TELEPHONY_CHLD_2_ACTIVE_HELD_CALL");
-               break;
-
-       case BLUETOOTH_EVENT_TELEPHONY_SEND_DTMF:
-               TC_PRT("BLUETOOTH_EVENT_TELEPHONY_SEND_DTMF");
-               break;
-
-       case BLUETOOTH_EVENT_TELEPHONY_CHLD_4_EXPLICIT_CALL_TRANSFER:
-               TC_PRT("BLUETOOTH_EVENT_TELEPHONY_CHLD_4_EXPLICIT_CALL_TRANSFER");
-               break;
-
-       case BLUETOOTH_EVENT_TELEPHONY_NREC_CHANGED: {
-               gboolean *nrec;
-               TC_PRT("BLUETOOTH_EVENT_TELEPHONY_NREC_CHANGED");
-               nrec = bt_event->param_data;
-               TC_PRT("NREC status = [%d]", *nrec);
-               break;
-       case BLUETOOTH_EVENT_TELEPHONY_VENDOR_AT_CMD:
-               TC_PRT("BLUETOOTH_EVENT_TELEPHONY_VENDOR_AT_CMD %s", bt_event->param_data);
-               break;
-       }
-
-       default:
-               break;
-       }
-}
-
-int test_input_callback(void *data)
-{
-       int test_id = (int)data;
-
-       switch (test_id) {
-               case 0x00ff:
-                       TC_PRT("Finished");
-                       g_main_loop_quit(main_loop);
-                       break;
-
-               case 70:
-                       bluetooth_telephony_init(telephony_event_handler, NULL);
-                       break;
-               case 71:
-                       bluetooth_telephony_deinit();
-                       break;
-
-               case 72:
-                       bluetooth_telephony_indicate_outgoing_call(
-                                       TEST_NUMBER, DEFAULT_CALL_ID, TRUE);
-                       break;
-               case 73:
-                       bluetooth_telephony_indicate_incoming_call(
-                                       TEST_NUMBER, TRUE);
-                       break;
-               case 74:
-                       bluetooth_telephony_audio_open();
-                       break;
-               case 75:
-                       bluetooth_telephony_audio_close();
-                       break;
-               case 76:
-                       bluetooth_telephony_call_end(DEFAULT_CALL_ID);
-                       break;
-               case 77:
-                       bluetooth_telephony_call_held(DEFAULT_CALL_ID);
-                       break;
-               case 78:
-                       bluetooth_telephony_call_remote_ringing(
-                                                       DEFAULT_CALL_ID);
-                       break;
-               case 79:
-                       TC_PRT("bluetooth_telephony_call_swapped  \n");
-                       break;
-               case 80:
-                       bluetooth_telephony_call_answered(
-                                                       DEFAULT_CALL_ID, FALSE);
-                       break;
-               case 81:
-                       bluetooth_telephony_call_answered(
-                                                       DEFAULT_CALL_ID, TRUE);
-                       break;
-
-               case 82: {
-                       int state;
-
-                       state = bluetooth_telephony_is_sco_connected();
-
-                       TC_PRT("State = %d \n", state);
-                       break;
-               }
-
-               case 83: {
-                       int ret = 0;
-
-                       TC_PRT("**********************\n");
-                       TC_PRT("           PLEASE SPEAK          \n");
-                       TC_PRT("**********************\n");
-
-                       ret = bluetooth_telephony_start_voice_recognition();
-
-                       if (ret == BLUETOOTH_TELEPHONY_ERROR_NONE) {
-                               TC_PRT("No error\n");
-                               bluetooth_telephony_audio_open();
-                       }
-                       break;
-               }
-
-               case 84: {
-                       TC_PRT("Rcognition finished \n");
-                       bluetooth_telephony_audio_close();
-                       bluetooth_telephony_stop_voice_recognition();
-                       break;
-               }
-
-               case 85: {
-                       int ret;
-                       gboolean status = FALSE;
-
-                       ret = bluetooth_telephony_is_nrec_enabled(&status);
-
-                       if (ret != BLUETOOTH_TELEPHONY_ERROR_NONE)
-                               TC_PRT("Error getting NREC Status\n");
-
-                       TC_PRT("NREC status = %d\n", status);
-                       break;
-               }
-
-               case 86: {
-                       int ret;
-                       gboolean status = FALSE;
-
-                       ret = bluetooth_telephony_is_wbs_mode(&status);
-
-                       if (ret != BLUETOOTH_TELEPHONY_ERROR_NONE)
-                               TC_PRT("Error getting WBS Status\n");
-
-                       TC_PRT("WBS status = %d\n", status);
-                       break;
-               }
-               case 87: {
-                       int ret = 0;
-
-                       TC_PRT("Vendor dependent AT Command\n");
-
-                       ret = bluetooth_telephony_send_vendor_cmd("+XSAT: 11,DUAL,DUAL");
-
-                       if (ret == BLUETOOTH_TELEPHONY_ERROR_NONE) {
-                               TC_PRT("No error\n");
-                       }
-                       break;
-               }
-               default:
-                       break;
-       }
-
-       return 0;
-}
-
-void startup()
-{
-       TC_PRT("bluetooth framework TC startup");
-
-       dbus_threads_init_default();
-
-       main_loop = g_main_loop_new(NULL, FALSE);
-}
-
-void cleanup()
-{
-       TC_PRT("bluetooth framework TC cleanup");
-       if (main_loop != NULL) {
-               g_main_loop_unref(main_loop);
-       }
-}
-
-static gboolean key_event_cb(GIOChannel *chan, GIOCondition cond ,
-                                                       gpointer data)
-{
-       char buf[10] = {0};
-
-       unsigned int len = 0;
-       int test_id;
-       memset(buf, 0, sizeof(buf));
-
-       if (g_io_channel_read(chan, buf, sizeof(buf), &len) !=
-                                       G_IO_ERROR_NONE) {
-
-               printf("IO Channel read error");
-               return FALSE;
-
-       }
-       printf("%s\n", buf);
-       tc_usage_print();
-
-       test_id = atoi(buf);
-
-       if (test_id)
-               g_idle_add(test_input_callback, (void *)test_id);
-
-       return TRUE;
-}
-
-int main()
-{
-       startup();
-
-       GIOChannel *key_io;
-       key_io = g_io_channel_unix_new(fileno(stdin));
-
-       g_io_add_watch(key_io, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
-                       key_event_cb, NULL);
-       g_io_channel_unref(key_io);
-
-
-       g_main_loop_run(main_loop);
-
-       cleanup();
-       return 0;
-}