Merge latest tizen_3.0 bug fix codes 64/113264/1
authorDoHyun Pyun <dh79.pyun@samsung.com>
Tue, 7 Feb 2017 05:17:16 +0000 (14:17 +0900)
committerDoHyun Pyun <dh79.pyun@samsung.com>
Tue, 7 Feb 2017 05:17:16 +0000 (14:17 +0900)
--------------------------------------------------
commit f426f42dde18b4629190022eb301e53ea215ab72
Author: Lee Hyuk <hyuk0512.lee@samsung.com>
Date:   Mon Feb 6 09:02:04 2017 +0900

    Revert "Fix the build fail for TV profile"
--------------------------------------------------

Change-Id: I0661eb19f7d88167caa7dfaadc207bcd0ef75e3f
Signed-off-by: DoHyun Pyun <dh79.pyun@samsung.com>
16 files changed:
CMakeLists.txt
include/bluetooth_internal.h
include/bluetooth_private.h
include/bluetooth_type.h
include/bluetooth_type_internal.h
src/bluetooth-adapter.c
src/bluetooth-audio.c
src/bluetooth-avrcp.c
src/bluetooth-common.c
src/bluetooth-device.c
src/bluetooth-gatt.c
src/bluetooth-map-client.c [new file with mode: 0644]
src/bluetooth-proximity.c
src/bluetooth-tds.c [new file with mode: 0644]
test/bt_unit_test.c
test/bt_unit_test.h

index 4cac3903dfd0af021dac01d7deba20fdf3e2af13..377965c219755a2e0b7f41bcbe2a48cf454a87ec 100644 (file)
@@ -38,6 +38,7 @@ src/bluetooth-device.c
 src/bluetooth-socket.c
 src/bluetooth-opp-server.c
 src/bluetooth-opp-client.c
+src/bluetooth-map-client.c
 src/bluetooth-pan.c
 src/bluetooth-hdp.c
 src/bluetooth-hid.c
@@ -47,6 +48,7 @@ src/bluetooth-gatt.c
 src/bluetooth-ipsp.c
 src/bluetooth-dpm.c
 src/bluetooth-proximity.c
+src/bluetooth-tds.c
 )
 
 LIST(APPEND SOURCES src/bluetooth-proximity.c)
index ecc73e423f50f2039675099a7272657ae4ba77d8..8091fdaeb9e9cf186e5ed42603eb9c53b836e7b3 100644 (file)
@@ -714,9 +714,9 @@ int bt_adapter_le_enable_privacy(bool enable_privacy);
  *
  * @pre The Bluetooth service must be initialized with bt_initialize().
  *
- * @see bt_adapter_le_destroy_scan_filter()
+ * @see bt_adapter_le_scan_filter_destroy()
  */
-int bt_adapter_le_create_scan_filter(bt_scan_filter_h *scan_filter);
+int bt_adapter_le_scan_filter_create(bt_scan_filter_h *scan_filter);
 
 /**
  * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_LE_MODULE
@@ -733,9 +733,9 @@ int bt_adapter_le_create_scan_filter(bt_scan_filter_h *scan_filter);
  *
  * @pre The Bluetooth service must be initialized with bt_initialize().
  *
- * @see bt_adapter_le_create_scan_filter()
+ * @see bt_adapter_le_scan_filter_create()
  */
-int bt_adapter_le_destroy_scan_filter(bt_scan_filter_h scan_filter);
+int bt_adapter_le_scan_filter_destroy(bt_scan_filter_h scan_filter);
 
 /**
  * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_LE_MODULE
@@ -767,8 +767,8 @@ int bt_adapter_le_scan_filter_set_device_address(bt_scan_filter_h scan_filter, c
  * @return 0 on success, otherwise a negative error value.
  * @retval #BT_ERROR_NONE  Successful
  * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
- * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
- * @retval #BT_ERROR_NOT_SUPPORTED  Not supported
+ * @retval #BT_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #BT_ERROR_NOT_SUPPORTED     Not supported
  *
  * @pre The Bluetooth service must be initialized with bt_initialize().
  *
@@ -786,8 +786,8 @@ int bt_adapter_le_scan_filter_set_device_name(bt_scan_filter_h scan_filter, cons
  * @return 0 on success, otherwise a negative error value.
  * @retval #BT_ERROR_NONE  Successful
  * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
- * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
- * @retval #BT_ERROR_NOT_SUPPORTED  Not supported
+ * @retval #BT_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #BT_ERROR_NOT_SUPPORTED     Not supported
  *
  * @pre The Bluetooth service must be initialized with bt_initialize().
  *
@@ -808,8 +808,8 @@ int bt_adapter_le_scan_filter_set_service_uuid(bt_scan_filter_h scan_filter, con
  * @return 0 on success, otherwise a negative error value.
  * @retval #BT_ERROR_NONE  Successful
  * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
- * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
- * @retval #BT_ERROR_NOT_SUPPORTED  Not supported
+ * @retval #BT_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #BT_ERROR_NOT_SUPPORTED     Not supported
  *
  * @pre The Bluetooth service must be initialized with bt_initialize().
  *
@@ -828,8 +828,8 @@ int bt_adapter_le_scan_filter_set_service_uuid_with_mask(bt_scan_filter_h scan_f
  * @return 0 on success, otherwise a negative error value.
  * @retval #BT_ERROR_NONE  Successful
  * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
- * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
- * @retval #BT_ERROR_NOT_SUPPORTED  Not supported
+ * @retval #BT_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #BT_ERROR_NOT_SUPPORTED     Not supported
  *
  * @pre The Bluetooth service must be initialized with bt_initialize().
  *
@@ -850,8 +850,8 @@ int bt_adapter_le_scan_filter_set_service_solicitation_uuid(bt_scan_filter_h sca
  * @return 0 on success, otherwise a negative error value.
  * @retval #BT_ERROR_NONE  Successful
  * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
- * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
- * @retval #BT_ERROR_NOT_SUPPORTED  Not supported
+ * @retval #BT_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #BT_ERROR_NOT_SUPPORTED     Not supported
  *
  * @pre The Bluetooth service must be initialized with bt_initialize().
  *
@@ -872,8 +872,8 @@ int bt_adapter_le_scan_filter_set_service_solicitation_uuid_with_mask(bt_scan_fi
  * @return 0 on success, otherwise a negative error value.
  * @retval #BT_ERROR_NONE  Successful
  * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
- * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
- * @retval #BT_ERROR_NOT_SUPPORTED  Not supported
+ * @retval #BT_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #BT_ERROR_NOT_SUPPORTED     Not supported
  *
  * @pre The Bluetooth service must be initialized with bt_initialize().
  *
@@ -898,8 +898,8 @@ int bt_adapter_le_scan_filter_set_service_data(bt_scan_filter_h scan_filter,
  * @return 0 on success, otherwise a negative error value.
  * @retval #BT_ERROR_NONE  Successful
  * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
- * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
- * @retval #BT_ERROR_NOT_SUPPORTED  Not supported
+ * @retval #BT_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #BT_ERROR_NOT_SUPPORTED     Not supported
  *
  * @pre The Bluetooth service must be initialized with bt_initialize().
  *
@@ -920,8 +920,8 @@ int bt_adapter_le_scan_filter_set_service_data_with_mask(bt_scan_filter_h scan_f
  * @return 0 on success, otherwise a negative error value.
  * @retval #BT_ERROR_NONE  Successful
  * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
- * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
- * @retval #BT_ERROR_NOT_SUPPORTED  Not supported
+ * @retval #BT_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #BT_ERROR_NOT_SUPPORTED     Not supported
  *
  * @pre The Bluetooth service must be initialized with bt_initialize().
  *
@@ -946,8 +946,8 @@ int bt_adapter_le_scan_filter_set_manufacturer_data(bt_scan_filter_h scan_filter
  * @return 0 on success, otherwise a negative error value.
  * @retval #BT_ERROR_NONE  Successful
  * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
- * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
- * @retval #BT_ERROR_NOT_SUPPORTED  Not supported
+ * @retval #BT_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #BT_ERROR_NOT_SUPPORTED     Not supported
  *
  * @pre The Bluetooth service must be initialized with bt_initialize().
  *
@@ -974,7 +974,7 @@ int bt_adapter_le_scan_filter_set_manufacturer_data_with_mask(bt_scan_filter_h s
  * @pre The Bluetooth service must be initialized with bt_initialize().
  *
  */
-int bt_adapter_le_register_scan_filter(bt_scan_filter_h scan_filter);
+int bt_adapter_le_scan_filter_register(bt_scan_filter_h scan_filter);
 
 /**
  * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_LE_MODULE
@@ -993,7 +993,7 @@ int bt_adapter_le_register_scan_filter(bt_scan_filter_h scan_filter);
  * @pre The Bluetooth service must be initialized with bt_initialize().
  *
  */
-int bt_adapter_le_unregister_scan_filter(bt_scan_filter_h scan_filter);
+int bt_adapter_le_scan_filter_unregister(bt_scan_filter_h scan_filter);
 
 /**
  * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_LE_MODULE
@@ -1009,7 +1009,7 @@ int bt_adapter_le_unregister_scan_filter(bt_scan_filter_h scan_filter);
  * @pre The Bluetooth service must be initialized with bt_initialize().
  *
  */
-int bt_adapter_le_unregister_all_scan_filters(void);
+int bt_adapter_le_scan_filter_unregister_all(void);
 
 /**
  * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_LE_MODULE
@@ -1776,6 +1776,23 @@ int bt_ag_is_wbs_mode(bool *wbs_mode);
  */
 int bt_ag_is_connected(bool *connected);
 
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief Switch between the connected headsets for AG role.
+ * @since_tizen 3.0
+ * @param[out]
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @retval #BT_ERROR_NOT_SUPPORTED  Not supported
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED  Not connected
+ * @pre The state of local Bluetooth must be #BT_ADAPTER_ENABLED.
+ */
+int bt_ag_switch_headset(const char *remote_addr);
+
 /**
  * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_HF_MODULE
  * @brief  Registers a callback function that will be invoked when the SCO(Synchronous Connection Oriented link) state is changed.
@@ -3740,6 +3757,294 @@ int bt_adapter_le_scan_filter_set_proximity_uuid(bt_scan_filter_h scan_filter);
  */
 int bt_adapter_le_scan_filter_unset_proximity_uuid(bt_scan_filter_h scan_filter);
 
+/**
+ * @internal
+ * @brief API to register TDS provider.
+ * @since_tizen @if WEARABLE 3.0 @endif
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/bluetooth.admin
+ *
+ * @param[in] None
+ * @param[out] None
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_SUPPORTED Not supported
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ *
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ *
+ * @see bt_initialize()
+ * @see bt_tds_provider_unregister()
+ */
+int bt_tds_provider_register(void);
+
+/**
+ * @internal
+ * @brief API to unregister TDS provider.
+ * @since_tizen @if WEARABLE 3.0 @endif
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/bluetooth.admin
+ *
+ * @param[in] None
+ * @param[out] None
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_SUPPORTED Not supported
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ *
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @pre TDS provider must be registered with bt_tds_provider_register().
+ *
+ * @see bt_initialize()
+ * @see bt_tds_provider_register()
+ */
+int bt_tds_provider_unregister(void);
+
+/**
+ * @internal
+ * @brief API to create TDS provider.
+ * @since_tizen @if WEARABLE 3.0 @endif
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/bluetooth.admin
+ *
+ * @param[in] transport Transport to be discovered over BLE.
+ * @param[out] provider The handle associated with the newly created provider.
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_SUPPORTED Not supported
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ *
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @pre TDS provider must be registered with bt_tds_provider_register().
+ *
+ * @see bt_initialize()
+ * @see bt_tds_provider_register()
+ * @see bt_tds_provider_unregister()
+ * @see bt_tds_provider_destroy()
+ */
+int bt_tds_provider_create(bt_tds_provider_h *provider, bt_tds_transport_e transport);
+
+/**
+ * @internal
+ * @brief API to destroy TDS provider.
+ * @since_tizen @if WEARABLE 3.0 @endif
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/bluetooth.admin
+ *
+ * @param[in] provider The handle associated with the provider
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_SUPPORTED Not supported
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ *
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @pre TDS provider must be registered with bt_tds_provider_register().
+ * @pre TDS provider must be created with bt_tds_provider_create().
+ *
+ * @see bt_initialize()
+ * @see bt_tds_provider_register()
+ * @see bt_tds_provider_create()
+ */
+int bt_tds_provider_destroy(bt_tds_provider_h provider);
+
+/**
+ * @internal
+ * @brief API to set transport block data for transport provider.
+ * @since_tizen @if WEARABLE 3.0 @endif
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/bluetooth.admin
+ *
+ * @param[in] provider The handle associated with the provider
+ * @param[in] transport_state State of transport
+ * @param[in] buf transport block data
+ * @param[in] length transport block data length
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_SUPPORTED Not supported
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ *
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @pre TDS provider must be registered with bt_tds_provider_register().
+ * @pre TDS provider must be created with bt_tds_provider_create().
+ *
+ * @see bt_initialize()
+ * @see bt_tds_provider_register()
+ * @see bt_tds_provider_create()
+ */
+int bt_tds_provider_set_transport_data(bt_tds_provider_h provider,
+               bt_tds_transport_state_e transport_state, unsigned char *buf, int length);
+
+/**
+ * @internal
+ * @brief API to set TDS provider manufacturer specific data.
+ * @since_tizen @if WEARABLE 3.0 @endif
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/bluetooth.admin
+ *
+ * @param[in] buf manufacturer specific data
+ * @param[in] length manufacturer data length
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_SUPPORTED Not supported
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ *
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @pre TDS provider must be registered with bt_tds_provider_register().
+ *
+ * @see bt_initialize()
+ * @see bt_tds_provider_register()
+ * @see bt_tds_provider_create()
+ */
+int bt_tds_provider_set_manufacturer_data(unsigned char *buf, int length);
+
+/**
+ * @internal
+ * @brief API to send activation response to TDS seeker.
+ * @since_tizen @if WEARABLE 3.0 @endif
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/bluetooth.admin
+ *
+ * @param[in] address Remote device bluetooth address
+ * @param[in] result Result of activation request
+ *             BT_ERROR_NONE: success
+ *             BT_ERROR_INVALID_PARAMETER: Invalid data in activation request
+ *             BT_ERROR_OPERATION_FAILED: Operation failed
+ * @param[in] provider The handle associated with the provider
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_SUPPORTED Not supported
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ *
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @pre TDS provider must be registered with bt_tds_provider_register().
+ *
+ * @see bt_initialize()
+ * @see bt_tds_provider_register()
+ * @see bt_tds_activation_requested_cb()
+ * @see bt_tds_set_transport_activation_requested_cb()
+ * @see bt_tds_unset_transport_activation_requested_cb()
+ */
+int bt_tds_provider_send_activation_resp(char *address, int result, bt_tds_provider_h provider);
+
+/**
+ * @internal
+ * @brief API to set activation requeste callback.
+ * @since_tizen @if WEARABLE 3.0 @endif
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/bluetooth.admin
+ *
+ * @param[in] callback  The callback function to invoke
+ * @param[in] user_data The user data to be passed to the callback function
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_SUPPORTED Not supported
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ *
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @post bt_tds_activation_requested_cb() will be invoked.
+ *
+ * @see bt_initialize()
+ * @see bt_tds_activation_requested_cb()
+ * @see bt_tds_unset_transport_activation_requested_cb()
+ */
+int bt_tds_set_transport_activation_requested_cb(
+               bt_tds_activation_requested_cb callback, void *user_data);
+
+/**
+ * @internal
+ * @brief API to unset activation requeste callback.
+ * @since_tizen @if WEARABLE 3.0 @endif
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/bluetooth.admin
+ *
+ * @param[in] None
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_SUPPORTED Not supported
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ *
+ * @see bt_initialize()
+ * @see bt_tds_set_transport_activation_requested_cb()
+ */
+int bt_tds_unset_transport_activation_requested_cb(void);
+
+/**
+ * @internal
+ * @brief TDS Seeker Profile API to start seeking Remote TDS providers only
+ */
+int bt_tds_start_seeking_providers(bt_tds_provider_scan_result_cb cb, void *user_data);
+
+/**
+ * @internal
+ * @brief TDS Seeker Profile API to stop seeking Remote TDS providers
+ */
+int bt_tds_stop_seeking_providers(void);
+
+/**
+ * @internal
+ * @brief TDS Seeker Profile API to create Seeker Role associated with Remote TDS provider
+ */
+int bt_tds_seeker_create(const char *remote_address, bt_tds_seeker_h *seeker);
+
+/**
+ * @internal
+ * @brief TDS Seeker Profile API to destroy Seeker Role associated with Remote TDS provider
+ */
+int bt_tds_seeker_destroy(bt_tds_seeker_h seeker);
+
+/**
+ * @internal
+ * @brief TDS Seeker Profile API to set connection state changed event associated with Remote TDS provider
+ */
+int bt_tds_seeker_set_connection_state_changed_cb(bt_tds_seeker_h seeker,
+               bt_tds_seeker_connection_state_changed_cb callback, void *user_data);
+
+/**
+ * @internal
+ * @brief TDS Seeker Profile API to unset connection state changed event associated with Remote TDS provider
+ */
+int bt_tds_seeker_unset_connection_state_changed_cb(bt_tds_seeker_h seeker);
+
+/**
+ * @internal
+ * @brief TDS Seeker Profile API to connect to Remote TDS provider
+ */
+int bt_tds_seeker_connect(bt_tds_seeker_h seeker);
+
+/**
+ * @internal
+ * @brief TDS Seeker Profile API to disconnect to Remote TDS provider
+ */
+int bt_tds_seeker_disconnect(bt_tds_seeker_h seeker);
+
+/**
+ * @internal
+ * @brief TDS Seeker Profile API to read complete TDS block data which is stored in Remote TDS provider's GATT database
+ */
+int bt_tds_seeker_get_complete_transport_blocks(bt_tds_seeker_h seeker,
+               bt_tds_seeker_complete_transport_data_cb callback, void *user_data);
+
+/**
+ * @internal
+ * @brief TDS Seeker Profile API to Activate ALternate transport supported by Remote TDS provider
+ */
+int bt_tds_seeker_activate_control_point(bt_tds_seeker_h seeker,
+                               bt_tds_transport_e transport, unsigned char *buffer, int len,
+                               bt_tds_control_point_activation_indication_cb callback, void *user_data);
 /**
  * @}
  */
index 2ce25d9a6e8c4d8e1b70627e40472c9d681d03c5..5e911f8cbfc5ffd202a8e8b66194c88a3a97fa89 100644 (file)
@@ -43,6 +43,7 @@ extern "C" {
 #define BT_ERR(fmt, args...) SLOGE(fmt, ##args)
 
 #define OPP_UUID "00001105-0000-1000-8000-00805f9b34fb"
+#define MAP_UUID "00001134-0000-1000-8000-00805f9b34fb"
 
 /* Manufacture ID for Apple iBeacons */
 #define COMPANY_ID_APPLE 0x004C
@@ -80,6 +81,8 @@ typedef enum {
        BT_EVENT_OPP_CLIENT_PUSH_RESPONSED, /**< OPP client connection is responsed */
        BT_EVENT_OPP_CLIENT_PUSH_PROGRESS, /**< OPP client push progress */
        BT_EVENT_OPP_CLIENT_PUSH_FINISHED, /**< OPP client push is finished */
+       BT_EVENT_MAP_CONNECTION_REQUESTED, /**< MAP connection is requested */
+       BT_EVENT_MAP_CLIENT_OP_COMPLETE, /**< MAP client operation is complete */
        BT_EVENT_PAN_CONNECTION_STATE_CHANGED, /**< PAN connection change */
        BT_EVENT_NAP_CONNECTION_STATE_CHANGED, /**< NAP connection change */
        BT_EVENT_HDP_CONNECTED, /**< HDP connection change */
@@ -148,6 +151,13 @@ typedef enum {
        BT_EVENT_HF_CALL_STATUS_UPDATED_EVENT, /**< Audio - HF call status updated callback */
        BT_EVENT_HF_REMOTE_CALL_EVENT, /**< Audio - HF : call state event callback */
        BT_EVENT_HF_CIEV_DEVICE_STATUS_CHANGED, /**< Audio - HF : device state changed callback */
+       BT_EVENT_MAP_CLIENT_LIST_FOLDERS, /**< MAP client - listFolders event*/
+       BT_EVENT_MAP_CLIENT_LIST_FILTER_FIELDS, /**< MAP - get filter field list callback */
+       BT_EVENT_MAP_CLIENT_LIST_MESSAGES, /**< MAP - listMessages event*/
+       BT_EVENT_MAP_CLIENT_GET_MESSAGE, /**< MAP - getMessage event*/
+       BT_EVENT_MAP_CLIENT_PUSH_MESSAGE, /**< MAP - pushMessage event*/
+       BT_EVENT_TDS_ACTIVATION_REQUESTED, /**< TDS - transport activation requested event */
+       BT_EVENT_TDS_PROVIDER_FOUND_RESULT, /**< TDS - CUSTOM Provider */
        BT_EVENT_MAX
 } bt_event_e;
 
@@ -172,6 +182,7 @@ typedef enum {
        BT_ADAPTER_LE_ADVERTISING_DATA_128_BIT_SERVICE_SOLICITATION_UUIDS = 0x15, /**< List of 128-bit Service Solicitation UUIDs*/
        BT_ADAPTER_LE_ADVERTISING_DATA_SERVICE_DATA = 0x16, /**< Service data */
        BT_ADAPTER_LE_ADVERTISING_DATA_APPEARANCE = 0x19, /**< Appearance*/
+       BT_ADAPTER_LE_ADVERTISING_DATA_TRANSPORT_DISCOVERY = 0x26, /**< Transport Discovery*/
        BT_ADAPTER_LE_ADVERTISING_DATA_MANUFACTURER_SPECIFIC_DATA = 0xff, /**< Manufacturer data */
 } bt_adapter_le_advertising_data_type_e;
 
@@ -448,60 +459,6 @@ typedef void (*bt_rssi_strength_cb)(char *bt_address,
 typedef void (*_bt_gatt_client_value_changed_cb)(char *char_path,
                unsigned char *value, int value_length, void *user_data);
 
-/**
- * @internal
- * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
- * @brief Enumaration for the address type field in manufactrer specific data
- * @since_tizen 3.0
- */
-typedef enum {
-       ADDRESS_NONE_TYPE = 0x00,
-       WI_FI_P2P_ADDRESS = 0x01,
-       BLUETOOTH_ADDRESS = 0x02,
-       INDICATION_ADDRESS = 0x04,
-       IPV4_ADDRESS = 0x08,
-       IPV6_ADDRESS = 0x10,
-       UNKNOWN_ADDRESS = 0xff
-} connectivity_address_t;
-
-/**
- * @internal
- * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
- * @brief Enumaration for the proximity locality type field in manufactrer specific data
- * @since_tizen 3.0
- */
-typedef enum {
-       NONE_TYPE = 0x00,
-       PROXIMITY = 0x01,
-       CO_PRESENCE = 0x02,
-       UNKNOWN_TYPE = 0xff
-} bt_proximity_locality_t;
-
-/**
- * @internal
- * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
- * @brief Structure of samsung specific manufacturer data
- * @since_tizen 3.0
- */
-typedef struct {
-       unsigned char version;
-       unsigned char service_id;
-       unsigned char discovery_version;
-       unsigned char associated_service_id;
-       bt_proximity_locality_t proximity_locality_type;
-       unsigned char proximity_locality_info;
-       unsigned char device_type;
-       unsigned char device_icon;
-       unsigned char auth_info[5];
-       connectivity_address_t addr_type;
-       unsigned char addr1[6];
-       unsigned char addr2[6];
-       unsigned char channel_info;
-       unsigned char associated_service_data_len;
-       unsigned char *associated_service_data_val;
-       char *name;
-} bt_manufacturer_data;
-
 /**
  * @internal
  * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
@@ -521,7 +478,19 @@ typedef void (*bt_adapter_passkey_notification_cb)(const char *remote_address, c
 
 #define BT_CHECK_INPUT_PARAMETER(arg) \
        if (arg == NULL) { \
-               LOGE("[%s] INVALID_PARAMETER(0x%08x)", __FUNCTION__, BT_ERROR_INVALID_PARAMETER); \
+               LOGE("[%s] INVALID_PARAMETER(0%s=NULL)", __FUNCTION__, #arg); \
+               return BT_ERROR_INVALID_PARAMETER; \
+       }
+
+#define BT_CHECK_INPUT_PARAMETER_UINT(arg) \
+       if (arg < -1) { \
+               LOGE("[%s] INVALID_PARAMETER_UINT(%s=%d)", __FUNCTION__, #arg, arg); \
+               return BT_ERROR_INVALID_PARAMETER; \
+       }
+
+#define BT_CHECK_INPUT_PARAMETER_BOOL(arg) \
+       if (arg < -1 || arg > 1) { \
+               LOGE("[%s] INVALID_PARAMETER_BOOL(%s=%d)", __FUNCTION__, #arg, arg); \
                return BT_ERROR_INVALID_PARAMETER; \
        }
 
@@ -534,6 +503,7 @@ typedef void (*bt_adapter_passkey_notification_cb)(const char *remote_address, c
 #define BT_FEATURE_HID_HOST "tizen.org/feature/network.bluetooth.hid"
 #define BT_FEATURE_HID_DEVICE "tizen.org/feature/network.bluetooth.hid_device"
 #define BT_FEATURE_OPP "tizen.org/feature/network.bluetooth.opp"
+#define BT_FEATURE_MAP "tizen.org/feature/network.bluetooth.map"
 #define BT_FEATURE_TETHERING "tizen.org/feature/network.tethering.bluetooth"
 #define BT_FEATURE_PBAP_CLIENT "tizen.org/feature/network.bluetooth.phonebook.client"
 
@@ -636,6 +606,13 @@ int _bt_get_error_code(int origin_error);
 int _bt_get_bt_device_info_s(bt_device_info_s **dest_dev, bluetooth_device_info_t *source_dev);
 
 
+/**
+ * @internal
+ * @brief Filter Advertising data based on AD type.
+ */
+int _bt_get_ad_data_by_type(char *in_data, int in_len,
+               char in_type, char **data, int *data_len);
+
 /**
  * @internal
  * @brief Free bt_device_info_s.
@@ -692,27 +669,6 @@ typedef enum {
        BT_HF_REMOTE_DEVICE_STATE_VOICE_RECOGNITON,  /**< Voice Recognition State (0:disabled , 1:enabled) */
 } bt_hf_remote_device_state_e;
 
-/**
- * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_HF_MODULE
- * @brief  Enumerations for the call event from Audio-Gateway device
- * @since_tizen 3.0
- */
-typedef enum {
-       BT_HF_REMOTE_CALL_EVENT_IDLE = 0x00,  /**< Idle. Neither setup call nor active call exist */
-       BT_HF_REMOTE_CALL_EVENT_INCOMING,  /**< (Call-setup event) Received an incoming call on AG */
-       BT_HF_REMOTE_CALL_EVENT_DIALING,  /**< (Call-setup event) Dialing an outgoing call on AG */
-       BT_HF_REMOTE_CALL_EVENT_ALERTING,  /**< (Call-setup event) Remote party being alerted in an outgoing call of AG */
-       BT_HF_REMOTE_CALL_EVENT_CALL_TERMINATED,  /**< (Call-setup event) Setup call is terminated without activating */
-       BT_HF_REMOTE_CALL_EVENT_CALL_STARTED,  /**< (Active call state event) Call is started on AG */
-       BT_HF_REMOTE_CALL_EVENT_CALL_ENDED,  /**< (Active call state event) Active call is terminated on AG */
-       BT_HF_REMOTE_CALL_EVENT_UNHELD,  /**< (Call held event) No calls on hold */
-       BT_HF_REMOTE_CALL_EVENT_SWAPPED,  /**< (Call held event) Call is placed on hold or active/held calls swapped */
-       BT_HF_REMOTE_CALL_EVENT_HELD,  /**< (Call held event) Calls on hold, no active call */
-       BT_HF_REMOTE_CALL_EVENT_RINGING,  /**< Incoming call is ringing event with number. This event is optional event. */
-       BT_HF_REMOTE_CALL_EVENT_WAITING,  /**< Call Waiting notification in 3-way call scenario */
-       BT_HF_REMOTE_CALL_EVENT_FAILED_TO_DIALING,  /**< Failed to dialing a outgoing call on AG */
-} bt_hf_remote_call_event_e;
-
 /**
  * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_HF_MODULE
  * @brief  Called when a device status changed event happend from Audio-Gateway device
@@ -727,20 +683,6 @@ typedef enum {
  */
 typedef void (*bt_hf_remote_device_state_changed_cb) (bt_hf_remote_device_state_e state, int value, void *user_data);
 
-
-/**
- * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_HF_MODULE
- * @brief  Called  when a call event happend from Audio-Gateway device
- * @since_tizen 3.0
- *
- * @param[in] event The call state chagned event from remote Audio-Gateway device
- * @param[in] user_data The user data passed from the callback registration function
- *
- * @see bt_hf_set_remote_call_event_cb()
- * @see bt_hf_unset_remote_call_event_cb()
- */
-typedef void (*bt_hf_remote_call_event_cb) (bt_hf_remote_call_event_e event, char *phone_number, void *user_data);
-
 /**
  * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_HF_MODULE
  * @brief  Called when a vendor command event happened from Hands-Free.
@@ -877,6 +819,48 @@ int _bt_check_proximity_is_initialized(bool *is_initialized);
  */
 int _bt_proximity_connection_set_state_changed(int result, const char *remote_address, bool connected);
 
+/**
+ * @internal
+ * @brief Send GATT connection state changed status with remote TDS provider.
+ */
+void _bt_tds_update_seeker_connection_state_changed(int result, const char *remote_address, bool connected);
+
+/**
+ * @internal
+ * @brief  Parses TDS AD Type data recived in scan, to extract meaningful transport specific data.
+ */
+int _bt_tds_parse_transport_blocks(bt_tds_transport_block_list_s **info, char *data, int data_len);
+
+/**
+ * @internal
+ * @brief  Handles complete TDS specific data to be sent to application.
+ */
+void _bt_tds_send_complete_transport_data(int result, const char *address, char *data, int data_len);
+
+/**
+ * @internal
+ * @brief Send Result of TDS specific CCCD enabled event of Remote TDS provider.
+ */
+void _bt_tds_control_point_enabled_update(int result, const char *remote_address);
+
+/**
+ * @internal
+ * @brief Send Result of TDS control point activate ACK event.
+ */
+void _bt_tds_control_point_activation_result_update(int result, const char *remote_address);
+
+/**
+ * @internal
+ * @brief Send TDS Indication response from remote TDS provider.
+ */
+void _bt_tds_control_point_indication_response_update(const char *address, bluetooth_tds_indication_res_t *info);
+
+/**
+ * @internal
+ * @brief Sends GATT primary service status changed of Remote Provider.
+ */
+void _bt_tds_check_service_changed(char *address, bt_gatt_service_change_t *service_change);
+
 typedef enum {
        _PROFILE_UNKNOWN = 0,
        _PROFILE_MOBILE = 0x1,
@@ -888,7 +872,7 @@ typedef enum {
 extern tizen_profile_t _get_tizen_profile();
 extern tizen_profile_t profile;
 
-#define TIZEN_PROFILE_(x) (( (__builtin_expect(profile != _PROFILE_UNKNOWN, 1)) ? \
+#define TIZEN_PROFILE_(x) (((__builtin_expect(profile != _PROFILE_UNKNOWN, 1)) ? \
                                        (profile) : _get_tizen_profile()) \
                                & (x))
 
index 8c547fefb844272c4ef51b43b5b75dad9d561b0b..c0f091dab3c15586fda643e294371b035d5c41a1 100644 (file)
@@ -1912,6 +1912,7 @@ typedef void (*bt_gatt_connection_state_changed_cb)(int result, bool connected,
  * @param[in] request_id The identification of this request. It will be used to send a response.
  * @param[in] server The GATT server handle
  * @param[in] gatt_handle The characteristic or descriptor's GATT handle which has an old value
+ * @param[in] response_needed Indicates whether a response is required by the remote device - @c true if required, @c false if not
  * @param[in] offset The requested offset from where the @a gatt_handle value will be updated
  * @param[in] value The new value
  * @param[in] len The length of @a value
@@ -1922,7 +1923,7 @@ typedef void (*bt_gatt_connection_state_changed_cb)(int result, bool connected,
  */
 typedef void (*bt_gatt_server_write_value_requested_cb) (const char *remote_address,
                                int request_id, bt_gatt_server_h server,
-                               bt_gatt_h gatt_handle, int offset,
+                               bt_gatt_h gatt_handle, bool response_needed, int offset,
                                const char *value, int len, void *user_data);
 
 /**
index c3c234366c9e5036bc1d3972db14b9e3321bd9fb..fc9c90398b276747553cfba219156a5420958aab 100644 (file)
@@ -23,6 +23,9 @@ extern "C"
 {
 #endif /* __cplusplus */
 
+/* This variable will be added into bt_service_class_t in tizen 4.0 */
+#define BT_SC_MAP_SERVICE_MASK 0x00800000 /**< MAP service class */
+
 /**
  * @file bluetooth_type_internal.h
  */
@@ -83,6 +86,27 @@ typedef enum {
        BT_AG_CALL_STATE_WAITING,  /**< Waiting for connected indication event after answering an incoming call*/
 } bt_ag_call_state_e;
 
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_HF_MODULE
+ * @brief  Enumerations for the call event from Audio-Gateway device
+ * @since_tizen @if WEARABLE 3.0 @endif
+ */
+typedef enum {
+       BT_HF_REMOTE_CALL_EVENT_IDLE = 0x00,  /**< Idle. Neither setup call nor active call exist */
+       BT_HF_REMOTE_CALL_EVENT_INCOMING,  /**< (Call-setup event) Received an incoming call on AG */
+       BT_HF_REMOTE_CALL_EVENT_DIALING,  /**< (Call-setup event) Dialing an outgoing call on AG */
+       BT_HF_REMOTE_CALL_EVENT_ALERTING,  /**< (Call-setup event) Remote party being alerted in an outgoing call of AG */
+       BT_HF_REMOTE_CALL_EVENT_CALL_TERMINATED,  /**< (Call-setup event) Setup call is terminated without activating */
+       BT_HF_REMOTE_CALL_EVENT_CALL_STARTED,  /**< (Active call state event) Call is started on AG */
+       BT_HF_REMOTE_CALL_EVENT_CALL_ENDED,  /**< (Active call state event) Active call is terminated on AG */
+       BT_HF_REMOTE_CALL_EVENT_UNHELD,  /**< (Call held event) No calls on hold */
+       BT_HF_REMOTE_CALL_EVENT_SWAPPED,  /**< (Call held event) Call is placed on hold or active/held calls swapped */
+       BT_HF_REMOTE_CALL_EVENT_HELD,  /**< (Call held event) Calls on hold, no active call */
+       BT_HF_REMOTE_CALL_EVENT_RINGING,  /**< Incoming call is ringing event with number. This event is optional event. */
+       BT_HF_REMOTE_CALL_EVENT_WAITING,  /**< Call Waiting notification in 3-way call scenario */
+       BT_HF_REMOTE_CALL_EVENT_FAILED_TO_DIALING,  /**< Failed to dialing a outgoing call on AG */
+} bt_hf_remote_call_event_e;
+
 /**
  * @ingroup CAPI_NETWORK_BLUETOOTH_OPP_MODULE
  * @brief  Enumerations for the transfer type
@@ -93,6 +117,102 @@ typedef enum {
        BT_TRANSFER_OUTBOUND,       /**< Outbound Transfer Type */
 } bt_opp_transfer_type_t;
 
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_MAP_CLIENT_MODULE
+ * @brief
+ * @since_tizen 3.0
+ */
+typedef void* bt_map_client_session_info_h;
+
+typedef void* bt_map_client_message_object_h;
+
+typedef struct {
+       int16_t offset;
+       int16_t max_count;
+} bt_map_client_list_folders_filter_s;
+
+typedef struct {
+       int16_t offset;
+       int16_t max_count;
+       int8_t subject_length;
+       char *fields;
+       char *types;
+       char *period_begin;
+       char *period_end;
+       int is_read;
+       char *recipient;
+       char *sender;
+       int is_priority;
+} bt_map_client_list_messages_filter_s;
+
+typedef struct {
+       bt_map_client_message_object_h message_object;
+       char *folder;
+       char *subject;
+       char *timestamp;
+       char *sender;
+       char *sender_address;
+       char *reply_to;
+       char *recipient;
+       char *recipient_address;
+       char *type;
+       int64_t size;
+       int is_text;
+       char *status;
+       int64_t attachment_size;
+       int is_priority;
+       int is_read;
+       int is_sent;
+       int is_protected;
+} bt_map_client_message_item_s;
+
+typedef struct {
+       int is_transparent;
+       int is_retry;
+       char *charset;
+} bt_map_client_push_message_args_s;
+
+typedef struct {
+       char *file_path;
+// TODO: maybe some additional fields could be supported
+//     char *folder;
+//     char *subject;
+//     char *timestamp;
+//     char *sender;
+//     char *sender_address;
+//     char *reply_to;
+//     char *recipient;
+//     char *recipient_address;
+//     char *type;
+//     int64_t size;
+//     char *status;
+//     int is_priority;
+//     int is_read;
+//     int is_deleted;
+//     int is_sent;
+//     int is_protected;
+} bt_map_client_message_s;
+
+typedef bt_map_client_list_folders_filter_s *bt_map_client_list_folders_filter_h;
+
+typedef bt_map_client_list_messages_filter_s *bt_map_client_list_messages_filter_h;
+
+typedef bt_map_client_message_item_s *bt_map_client_message_item_h;
+
+typedef bt_map_client_push_message_args_s *bt_map_client_push_message_args_h;
+
+typedef bt_map_client_message_s *bt_map_client_message_h;
+
+typedef void (*bt_map_client_list_folders_cb)(int result, char **folders, int count, void *user_data);
+
+typedef void (*bt_map_client_list_filter_fields_cb)(int result, char **filter_fields, int count, void *user_data);
+
+typedef void (*bt_map_client_list_messages_cb)(int result, bt_map_client_message_item_s *messages, int count, void *user_data);
+
+typedef void (*bt_map_client_push_message_cb)(int result, void *user_data);
+
+typedef void (*bt_map_client_get_message_cb)(int result, bt_map_client_message_h message, void *user_data);
+
 /**
  * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
  * @brief  Called when the connectable state changes.
@@ -390,6 +510,60 @@ typedef struct {
        char **uuids;
 } bt_dpm_uuids_list_s;
 
+/**
+ * @internal
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief Enumaration for the address type field in manufactrer specific data
+ * @since_tizen 3.0
+ */
+typedef enum {
+       ADDRESS_NONE_TYPE = 0x00,
+       WI_FI_P2P_ADDRESS = 0x01,
+       BLUETOOTH_ADDRESS = 0x02,
+       INDICATION_ADDRESS = 0x04,
+       IPV4_ADDRESS = 0x08,
+       IPV6_ADDRESS = 0x10,
+       UNKNOWN_ADDRESS = 0xff
+} connectivity_address_t;
+
+/**
+ * @internal
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief Enumaration for the proximity locality type field in manufactrer specific data
+ * @since_tizen 3.0
+ */
+typedef enum {
+       NONE_TYPE = 0x00,
+       PROXIMITY = 0x01,
+       CO_PRESENCE = 0x02,
+       UNKNOWN_TYPE = 0xff
+} bt_proximity_locality_t;
+
+/**
+ * @internal
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief Structure of samsung specific manufacturer data
+ * @since_tizen 3.0
+ */
+typedef struct {
+       unsigned char version;
+       unsigned char service_id;
+       unsigned char discovery_version;
+       unsigned char associated_service_id;
+       bt_proximity_locality_t proximity_locality_type;
+       unsigned char proximity_locality_info;
+       unsigned char device_type;
+       unsigned char device_icon;
+       unsigned char auth_info[5];
+       connectivity_address_t addr_type;
+       unsigned char addr1[6];
+       unsigned char addr2[6];
+       unsigned char channel_info;
+       unsigned char associated_service_data_len;
+       unsigned char *associated_service_data_val;
+       char *name;
+} bt_manufacturer_data;
+
 /**
  * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
  * @brief Trusted Profile enumeration.
@@ -549,6 +723,52 @@ typedef void (*bt_proximity_monitor_connection_state_changed_cb)
 typedef void (*bt_proximity_reporter_connection_state_changed_cb)
                (int result, const char *remote_address, bt_proximity_reporter_h reporter, bool connected, int supported_service, void *user_data);
 
+/**
+ * @internal
+ * @brief Various TDS transport states.
+ * @since_tizen 3.0
+ */
+typedef enum {
+       BT_TDS_TRANSPORT_STATE_OFF,     /**< Transport is currently in OFF state */
+       BT_TDS_TRANSPORT_STATE_ON,      /**< Transport is currently in ON state */
+       BT_TDS_TRANSPORT_STATE_UNAVAILABLE,     /**< Transport is temporarily unavailable */
+} bt_tds_transport_state_e;
+
+/**
+ * @internal
+ * @brief Various TDS transports.
+ * @since_tizen 3.0
+ */
+typedef enum {
+       BT_TDS_TRANSPORT_BT = 0x01, /* Transport BR-EDR */
+       BT_TDS_TRANSPORT_CUSTOM,       /* Transport custom */
+       /* ... */
+       BT_TDS_TRANSPORT_INVALID
+} bt_tds_transport_e;
+
+/**
+ * @internal
+ * @brief The structure type of TDS transport data block
+ * @since_tizen 3.0
+ */
+typedef struct {
+       bt_tds_transport_e transport;
+       bt_tds_transport_state_e state;
+       bool is_data_complete;
+       char *data;
+       int length;
+} tds_transport_data_s;
+
+/**
+ * @internal
+ * @brief The structure type of list of TDS transport data block
+ * @since_tizen 3.0
+ */
+typedef struct {
+       int num_transport_block;            /**< Number of Transport Data Blocks */
+       tds_transport_data_s **data;        /**< Array of Transport Data Block */
+} bt_tds_transport_block_list_s;
+
 /**
  * @internal
  * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
@@ -586,10 +806,23 @@ typedef void (*bt_adapter_authentication_req_cb)(int result, bt_authentication_t
  * @since_tizen 2.3.2
  */
 typedef struct {
-        int app_id;  /**< The application ID */
-        char *message;  /**< Command message */
+       int app_id; /**< The application ID */
+       char *message; /**< Command message */
 } bt_hf_vendor_dep_at_cmd_s;
 
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_HF_MODULE
+ * @brief  Called  when a call event happend from Audio-Gateway device
+ * @since_tizen @if WEARABLE 3.0 @endif
+ *
+ * @param[in] event The call state chagned event from remote Audio-Gateway device
+ * @param[in] user_data The user data passed from the callback registration function
+ *
+ * @see bt_hf_set_remote_call_event_cb()
+ * @see bt_hf_unset_remote_call_event_cb()
+ */
+typedef void (*bt_hf_remote_call_event_cb) (bt_hf_remote_call_event_e event, char *phone_number, void *user_data);
+
 /**
  * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
  * @brief  Called when a XSAT vendor command is transmitted from Hands-Free.
@@ -602,6 +835,68 @@ typedef struct {
  */
 typedef void (*bt_ag_vendor_cmd_cb) (char *command, void *user_data);
 
+/**
+ * @internal
+ * @brief The handle of a Transport Discover Service Provider.
+ * @since_tizen 3.0
+ */
+typedef void *bt_tds_provider_h;
+
+/**
+ * @internal
+ * @brief Called when remote device requests transport activation
+ * @since_tizen 3.0
+ * @param[in] remote_bd_addr Remote device address
+ * @param[in] transport transport to be activated
+ * @param[in] buf transport activation request data buffer
+ * @param[in] len transport activation request data buffer length
+ * @param[in] user_data The user data passed from the callback registration function
+ *
+ * @see bt_tds_set_transport_activation_requested_cb()
+ */
+typedef void (*bt_tds_activation_requested_cb)(char *remote_bd_addr,
+       bt_tds_transport_e transport, unsigned char *buf, int len, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_LE_MODULE
+ * @brief The handle of a TDS Seeker client which is associated with a remote TDS provider
+ * @since_tizen 3.0
+ */
+typedef void *bt_tds_seeker_h;
+
+/**
+ * @internal
+ * @since_tizen 3.0
+ * @brief TDS Seeker profile Scan result callback containing filtered TDS service information and
+ * complete LE discovery informations
+ */
+typedef void (*bt_tds_provider_scan_result_cb)(int result, const char *remote_address,
+               bt_tds_transport_block_list_s *info, bt_adapter_le_device_scan_result_info_s *scan_info,
+               void *user_data);
+
+/**
+ * @internal
+ * @since_tizen 3.0
+ * @brief TDS Seeker profile Connection State changed callback which is associated with a remote TDS provider
+ */
+typedef void (*bt_tds_seeker_connection_state_changed_cb)
+               (int result, const char *remote_address, bt_tds_seeker_h seeker, bool connected, void *user_data);
+
+/**
+ * @internal
+ * @since_tizen 3.0
+ * @brief TDS Seeker profile complete TDS data block read callback from remote TDS provider
+ */
+typedef void (*bt_tds_seeker_complete_transport_data_cb)
+               (int result, const char *remote_address, bt_tds_transport_block_list_s *info, void *user_data);
+
+/**
+ * @internal
+ * @since_tizen 3.0
+ * @brief TDS Seeker profile TDS Control Point Activation request callback which is associated with remote TDS provider
+ */
+typedef void (*bt_tds_control_point_activation_indication_cb)
+               (int result, const char *remote_address, unsigned char *data, int data_length, void *user_data);
 /**
  * @}
  */
index 2ed50a445ba0be7e17425a6a38b6b6809caac1ed..b8a71c165efeea256b9b4de06d7bd35d0d48d366 100644 (file)
@@ -160,14 +160,14 @@ int bt_adapter_get_address(char **address)
 
        error_code = _bt_get_error_code(bluetooth_get_local_address(&loc_address));
        if (error_code != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
-               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), /* LCOV_EXCL_LINE */
                                        error_code); /* LCOV_EXCL_LINE */
                return error_code; /* LCOV_EXCL_LINE */
        }
 
        error_code = _bt_convert_address_to_string(address, &loc_address);
        if (error_code != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
-               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), /* LCOV_EXCL_LINE */
                                        error_code); /* LCOV_EXCL_LINE */
                return error_code; /* LCOV_EXCL_LINE */
        }
@@ -441,14 +441,14 @@ int bt_adapter_get_name(char **name)
 
        ret = _bt_get_error_code(bluetooth_get_local_name(&loc_name));
        if (ret != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
-               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), /* LCOV_EXCL_LINE */
                                                ret); /* LCOV_EXCL_LINE */
                return ret; /* LCOV_EXCL_LINE */
        }
 
        *name = strdup(loc_name.name);
        if (*name == NULL) {
-               BT_ERR("OUT_OF_MEMORY(0x%08x)",
+               BT_ERR("OUT_OF_MEMORY(0x%08x)", /* LCOV_EXCL_LINE */
                                BT_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
                return BT_ERROR_OUT_OF_MEMORY;
        }
@@ -470,7 +470,7 @@ int bt_adapter_set_name(const char *name)
 
        ret = _bt_get_error_code(bluetooth_set_local_name(&loc_name));
        if (ret != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
-               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), /* LCOV_EXCL_LINE */
                                                ret); /* LCOV_EXCL_LINE */
        } /* LCOV_EXCL_LINE */
 
@@ -617,14 +617,14 @@ int bt_adapter_foreach_bonded_device(bt_adapter_bonded_device_cb foreach_cb,
 
        dev_list = g_ptr_array_new();
        if (dev_list == NULL) {
-               BT_ERR("OUT_OF_MEMORY(0x%08x)",
+               BT_ERR("OUT_OF_MEMORY(0x%08x)", /* LCOV_EXCL_LINE */
                                BT_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
                return BT_ERROR_OUT_OF_MEMORY;
        }
 
        ret = _bt_get_error_code(bluetooth_get_bonded_device_list(&dev_list));
        if (ret != BT_ERROR_NONE) {
-               BT_ERR("%s(0x%08x) : Failed to get bonded device list",
+               BT_ERR("%s(0x%08x) : Failed to get bonded device list", /* LCOV_EXCL_LINE */
                _bt_convert_error_to_string(ret), ret); /* LCOV_EXCL_LINE */
                return ret;
        }
@@ -635,7 +635,7 @@ int bt_adapter_foreach_bonded_device(bt_adapter_bonded_device_cb foreach_cb,
                        ret = _bt_get_bt_device_info_s(&dev_info,
                                        (bluetooth_device_info_t *)ptr);
                        if (ret != BT_ERROR_NONE) {
-                               BT_ERR("%s(0x%08x) : Failed to get device info",
+                               BT_ERR("%s(0x%08x) : Failed to get device info", /* LCOV_EXCL_LINE */
                                        _bt_convert_error_to_string(ret),
                                        ret); /* LCOV_EXCL_LINE */
                                break;
@@ -647,7 +647,7 @@ int bt_adapter_foreach_bonded_device(bt_adapter_bonded_device_cb foreach_cb,
                        }
                        _bt_free_bt_device_info_s(dev_info); /* LCOV_EXCL_LINE */
                } else {
-                       BT_ERR("OPERATION_FAILED(0x%08x)",
+                       BT_ERR("OPERATION_FAILED(0x%08x)", /* LCOV_EXCL_LINE */
                        BT_ERROR_OPERATION_FAILED); /* LCOV_EXCL_LINE */
                        ret = BT_ERROR_OPERATION_FAILED;
                        break;
@@ -725,6 +725,7 @@ int bt_adapter_is_service_used(const char *service_uuid, bool *used)
                                        &is_used));
                *used = is_used ? true : false; /* LCOV_EXCL_LINE */
        }
+       /* TODO: MAP? see above */
 
        if (ret != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
                BT_ERR("%s(0x%08x) : Failed to run function",
@@ -735,6 +736,7 @@ int bt_adapter_is_service_used(const char *service_uuid, bool *used)
        return ret;
 }
 
+/* LCOV_EXCL_START */
 int bt_adapter_foreach_profile_connected_devices(const char *profile_uuid,
        bt_adapter_profile_connected_devices_cb callback, void *user_data)
 {
@@ -796,7 +798,7 @@ int bt_adapter_foreach_profile_connected_devices(const char *profile_uuid,
        g_ptr_array_free(addr_list, TRUE);
 
        return ret;
-}
+} /* LCOV_EXCL_STOP */
 
 int bt_adapter_set_state_changed_cb(bt_adapter_state_changed_cb callback,
                                                        void *user_data)
@@ -1511,7 +1513,6 @@ int bt_adapter_le_set_scan_mode(bt_adapter_le_scan_mode_e scan_mode)
        } /* LCOV_EXCL_LINE */
        return ret;
 }
-/* LCOV_EXCL_STOP */
 
 int bt_adapter_le_set_customized_scan_mode(float scan_interval, float scan_window)
 {
@@ -1529,7 +1530,7 @@ int bt_adapter_le_set_customized_scan_mode(float scan_interval, float scan_windo
                BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
 
        return ret;
-}
+} /* LCOV_EXCL_STOP */
 
 int bt_adapter_le_create_advertiser(bt_advertiser_h *advertiser)
 {
@@ -3330,7 +3331,7 @@ int bt_adapter_le_get_scan_result_ibeacon_report(const bt_adapter_le_device_scan
 
 
 /* LCOV_EXCL_START */
-int bt_adapter_le_create_scan_filter(bt_scan_filter_h *scan_filter)
+int bt_adapter_le_scan_filter_create(bt_scan_filter_h *scan_filter)
 {
        bt_le_scan_filter_s *__filter = NULL;
 
@@ -3351,7 +3352,7 @@ int bt_adapter_le_create_scan_filter(bt_scan_filter_h *scan_filter)
        return BT_ERROR_NONE;
 }
 
-int bt_adapter_le_destroy_scan_filter(bt_scan_filter_h scan_filter)
+int bt_adapter_le_scan_filter_destroy(bt_scan_filter_h scan_filter)
 {
        bt_le_scan_filter_s *__filter = (bt_le_scan_filter_s *)scan_filter;
 
@@ -3639,7 +3640,7 @@ int bt_adapter_le_scan_filter_set_manufacturer_data_with_mask(bt_scan_filter_h s
        return BT_ERROR_NONE;
 }
 
-int bt_adapter_le_register_scan_filter(bt_scan_filter_h scan_filter)
+int bt_adapter_le_scan_filter_register(bt_scan_filter_h scan_filter)
 {
        int error_code = BT_ERROR_NONE;
        bt_le_scan_filter_s *__filter = (bt_le_scan_filter_s *)scan_filter;
@@ -3666,7 +3667,7 @@ int bt_adapter_le_register_scan_filter(bt_scan_filter_h scan_filter)
        return error_code;
 }
 
-int bt_adapter_le_unregister_scan_filter(bt_scan_filter_h scan_filter)
+int bt_adapter_le_scan_filter_unregister(bt_scan_filter_h scan_filter)
 {
        int error_code = BT_ERROR_NONE;
        bt_le_scan_filter_s *__filter = (bt_le_scan_filter_s *)scan_filter;
@@ -3689,7 +3690,7 @@ int bt_adapter_le_unregister_scan_filter(bt_scan_filter_h scan_filter)
        return error_code;
 }
 
-int bt_adapter_le_unregister_all_scan_filters(void)
+int bt_adapter_le_scan_filter_unregister_all(void)
 {
        int error_code = BT_ERROR_NONE;
 
@@ -3855,14 +3856,14 @@ int bt_adapter_le_scan_filter_set_proximity_uuid(bt_scan_filter_h scan_filter)
        BT_CHECK_INPUT_PARAMETER(scan_filter);
 
        /* register Linkloss alert scan filter */
-       ret = bt_adapter_le_create_scan_filter(&pxp_linkloss_alert_filter);
+       ret = bt_adapter_le_scan_filter_create(&pxp_linkloss_alert_filter);
        if (ret == BT_ERROR_NONE) {
 
                ret = bt_adapter_le_scan_filter_set_service_uuid(pxp_linkloss_alert_filter, PXP_LINK_LOSS_SVC_UUID);
                if (ret == BT_ERROR_NONE)
-                       ret = bt_adapter_le_register_scan_filter(pxp_linkloss_alert_filter);
+                       ret = bt_adapter_le_scan_filter_register(pxp_linkloss_alert_filter);
                if (ret != BT_ERROR_NONE) {
-                       bt_adapter_le_unregister_scan_filter(pxp_linkloss_alert_filter);
+                       bt_adapter_le_scan_filter_unregister(pxp_linkloss_alert_filter);
                        pxp_linkloss_alert_filter = NULL;
                }
        } else {
@@ -3870,14 +3871,14 @@ int bt_adapter_le_scan_filter_set_proximity_uuid(bt_scan_filter_h scan_filter)
        }
 
        /* register Immediate alert scan filter */
-       ret = bt_adapter_le_create_scan_filter(&pxp_immediate_alert_filter);
+       ret = bt_adapter_le_scan_filter_create(&pxp_immediate_alert_filter);
        if (ret == BT_ERROR_NONE) {
 
                ret = bt_adapter_le_scan_filter_set_service_uuid(pxp_immediate_alert_filter, PXP_IMMEDIATE_ALERT_SVC_UUID);
                if (ret == BT_ERROR_NONE)
-                       ret = bt_adapter_le_register_scan_filter(pxp_immediate_alert_filter);
+                       ret = bt_adapter_le_scan_filter_register(pxp_immediate_alert_filter);
                if (ret != BT_ERROR_NONE) {
-                       bt_adapter_le_unregister_scan_filter(pxp_immediate_alert_filter);
+                       bt_adapter_le_scan_filter_unregister(pxp_immediate_alert_filter);
                        pxp_immediate_alert_filter = NULL;
                }
        } else {
@@ -3885,14 +3886,14 @@ int bt_adapter_le_scan_filter_set_proximity_uuid(bt_scan_filter_h scan_filter)
        }
 
        /* register Signal loss scan filter */
-       ret = bt_adapter_le_create_scan_filter(&pxp_signal_loss_filter);
+       ret = bt_adapter_le_scan_filter_create(&pxp_signal_loss_filter);
        if (ret == BT_ERROR_NONE) {
 
                ret = bt_adapter_le_scan_filter_set_service_uuid(pxp_signal_loss_filter, PXP_TX_POWER_SVC_UUID);
                if (ret == BT_ERROR_NONE)
-                       ret = bt_adapter_le_register_scan_filter(pxp_signal_loss_filter);
+                       ret = bt_adapter_le_scan_filter_register(pxp_signal_loss_filter);
                if (ret != BT_ERROR_NONE) {
-                       bt_adapter_le_unregister_scan_filter(pxp_signal_loss_filter);
+                       bt_adapter_le_scan_filter_unregister(pxp_signal_loss_filter);
                        pxp_signal_loss_filter = NULL;
                }
        } else {
@@ -3911,19 +3912,19 @@ int bt_adapter_le_scan_filter_unset_proximity_uuid(bt_scan_filter_h scan_filter)
 
        /* unregister Linkloss alert scan filter */
        if (pxp_linkloss_alert_filter) {
-               ret = bt_adapter_le_unregister_scan_filter(pxp_linkloss_alert_filter);
+               ret = bt_adapter_le_scan_filter_unregister(pxp_linkloss_alert_filter);
                pxp_linkloss_alert_filter = NULL;
        }
 
        /* unregister Immediate alert scan filter */
        if (pxp_immediate_alert_filter) {
-               ret = bt_adapter_le_unregister_scan_filter(pxp_immediate_alert_filter);
+               ret = bt_adapter_le_scan_filter_unregister(pxp_immediate_alert_filter);
                pxp_immediate_alert_filter = NULL;
        }
 
        /* unregister Signal loss scan filter */
        if (pxp_signal_loss_filter) {
-               ret = bt_adapter_le_unregister_scan_filter(pxp_signal_loss_filter);
+               ret = bt_adapter_le_scan_filter_unregister(pxp_signal_loss_filter);
                pxp_signal_loss_filter = NULL;
        }
 
index 222afd79cb3d1529a52ff0aed98d7e4c716d6eff..623cc777ebf9970c38a4d20e464e6643f7c4c097 100644 (file)
@@ -595,7 +595,6 @@ int bt_ag_notify_call_list(bt_call_list_h list)
 
        return error;
 }
-/* LCOV_EXCL_STOP */
 
 int bt_ag_notify_vendor_cmd(const char *command)
 {
@@ -611,7 +610,7 @@ int bt_ag_notify_vendor_cmd(const char *command)
        if (error != BT_ERROR_NONE)
                BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error), error);
        return error;
-}
+} /* LCOV_EXCL_STOP */
 
 int bt_ag_notify_voice_recognition_state(bool state)
 {
@@ -675,6 +674,27 @@ int bt_ag_unset_multi_call_handling_event_cb(void)
        return BT_ERROR_NONE;
 }
 
+int bt_ag_set_vendor_cmd_cb(bt_ag_vendor_cmd_cb callback,
+                                               void *user_data)
+{
+       BT_CHECK_HFP_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_AG_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_AG_VENDOR_CMD, callback, user_data);
+       return BT_ERROR_NONE;
+}
+
+int bt_ag_unset_vendor_cmd_cb(void)
+{
+       BT_CHECK_HFP_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_AG_INIT_STATUS();
+       if (_bt_check_cb(BT_EVENT_AG_VENDOR_CMD) == true)
+               _bt_unset_cb(BT_EVENT_AG_VENDOR_CMD);
+       return BT_ERROR_NONE;
+}
+
 int bt_ag_set_dtmf_transmitted_cb(bt_ag_dtmf_transmitted_cb callback,
                                                void *user_data)
 {
@@ -719,6 +739,27 @@ int bt_ag_is_connected(bool *connected)
        return error;
 }
 
+int bt_ag_switch_headset(const char *remote_addr)
+{
+       int error;
+
+       BT_CHECK_HFP_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_AG_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(remote_addr);
+
+       char *addr = g_strdup(remote_addr);
+       BT_INFO("Remote address = %s", addr);
+
+       error = bluetooth_telephony_set_active_headset(addr);
+       error = _bt_get_error_code(error);
+
+       if (error != BT_ERROR_NONE)
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error), error);
+
+       return error;
+}
+
 int bt_call_list_create(bt_call_list_h *list)
 {
        call_list_s *handle;
@@ -827,42 +868,47 @@ int bt_a2dp_set_content_protection(bool status)
 
 int bt_hf_initialize(void)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
 
        int error;
 
-       BT_CHECK_INIT_STATUS();
        error = bluetooth_hf_init(_bt_hf_event_proxy, NULL);
        error = _bt_get_error_code(error);
        if (BT_ERROR_NONE != error) {
                BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error), error);
                return error;
        }
+
+       is_audio_hf_initialized = true;
+
        return error;
 }
 
 int bt_hf_deinitialize(void)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
 
        int error;
 
-       BT_CHECK_INIT_STATUS();
        error = bluetooth_hf_deinit();
        error = _bt_get_error_code(error);
-       if (BT_ERROR_NONE != error) {
+       if (BT_ERROR_NONE != error)
                BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error), error);
-               return error;
-       }
-       return error;
+
+       is_audio_hf_initialized = false;
+
+       return BT_ERROR_NONE;
 }
 
 int bt_hf_notify_call_event(bt_hf_call_event_e event, char *phone_number)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
 
        int error = BT_ERROR_NONE;
 
@@ -911,8 +957,9 @@ int bt_hf_notify_call_event(bt_hf_call_event_e event, char *phone_number)
 
 int bt_hf_notify_speaker_gain(int gain)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
 
        int error;
 
@@ -926,8 +973,9 @@ int bt_hf_notify_speaker_gain(int gain)
 
 int bt_hf_set_speaker_gain_changed_cb(bt_hf_speaker_gain_changed_cb callback, void *user_data)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(callback);
 
        _bt_set_cb(BT_EVENT_HF_SPEAKER_GAIN_CHANGE, callback, user_data);
@@ -936,8 +984,9 @@ int bt_hf_set_speaker_gain_changed_cb(bt_hf_speaker_gain_changed_cb callback, vo
 
 int bt_hf_unset_speaker_gain_changed_cb(void)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
 
        if (_bt_check_cb(BT_EVENT_HF_SPEAKER_GAIN_CHANGE) == true)
                _bt_unset_cb(BT_EVENT_HF_SPEAKER_GAIN_CHANGE);
@@ -946,8 +995,9 @@ int bt_hf_unset_speaker_gain_changed_cb(void)
 
 int bt_hf_notify_voice_recognition_state(bool state)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
 
        int error;
 
@@ -961,8 +1011,9 @@ int bt_hf_notify_voice_recognition_state(bool state)
 
 int bt_hf_set_call_status_updated_event_cb(bt_hf_call_status_updated_event_cb callback, void *user_data)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
 
        BT_CHECK_INPUT_PARAMETER(callback);
        _bt_set_cb(BT_EVENT_HF_CALL_STATUS_UPDATED_EVENT, callback, user_data);
@@ -971,8 +1022,9 @@ int bt_hf_set_call_status_updated_event_cb(bt_hf_call_status_updated_event_cb ca
 
 int bt_hf_unset_call_status_updated_event_cb(void)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
 
        if (_bt_check_cb(BT_EVENT_HF_CALL_STATUS_UPDATED_EVENT) == true)
                _bt_unset_cb(BT_EVENT_HF_CALL_STATUS_UPDATED_EVENT);
@@ -981,8 +1033,9 @@ int bt_hf_unset_call_status_updated_event_cb(void)
 
 int bt_hf_close_sco(void)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
 
        int error;
 
@@ -996,8 +1049,9 @@ int bt_hf_close_sco(void)
 
 int bt_hf_send_dtmf(char *dtmf)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
 
        int error;
 
@@ -1011,8 +1065,9 @@ int bt_hf_send_dtmf(char *dtmf)
 
 int bt_hf_is_connected(bool *connected)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(connected);
 
        int error;
@@ -1033,8 +1088,9 @@ int bt_hf_is_connected(bool *connected)
 
 int bt_hf_is_sco_opened(bool *opened)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(opened);
 
        int error;
@@ -1055,8 +1111,9 @@ int bt_hf_is_sco_opened(bool *opened)
 
 int bt_hf_get_codec_id(unsigned int *codec_id)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(codec_id);
 
        int error;
@@ -1071,8 +1128,9 @@ int bt_hf_get_codec_id(unsigned int *codec_id)
 
 int bt_hf_get_call_status_info_list(GSList **call_list)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(call_list);
 
        int error;
@@ -1107,14 +1165,14 @@ int bt_hf_get_call_status_info_list(GSList **call_list)
 
 int bt_hf_is_inband_ringtone_supported(bool *supported)
 {
-#ifdef TIZEN_BT_HFP_HF_ENABLE
-       int error;
-       gboolean is_supported = FALSE;
-
        BT_CHECK_HF_SUPPORT();
        BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(supported);
 
+       int error;
+       gboolean is_supported = FALSE;
+
        error = bluetooth_hf_is_ibr_supported(&is_supported);
        error = _bt_get_error_code(error);
        if (error != BT_ERROR_NONE)
@@ -1126,10 +1184,6 @@ int bt_hf_is_inband_ringtone_supported(bool *supported)
                *supported = FALSE;
 
        return error;
-#else
-       BT_ERR("NOT_SUPPORTED(0x%08x)", BT_ERROR_NOT_SUPPORTED);
-       return BT_ERROR_NOT_SUPPORTED;
-#endif
 }
 
 static void __bt_hf_free_call_status_info(void *data)
@@ -1141,8 +1195,9 @@ static void __bt_hf_free_call_status_info(void *data)
 
 int bt_hf_free_call_status_info_list(GSList *call_list)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(call_list);
 
        g_slist_free_full(call_list, __bt_hf_free_call_status_info);
@@ -1153,8 +1208,9 @@ int bt_hf_free_call_status_info_list(GSList *call_list)
 int bt_hf_set_sco_state_changed_cb(bt_hf_sco_state_changed_cb callback,
                                        void *user_data)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(callback);
        _bt_set_cb(BT_EVENT_HF_SCO_CONNECTION_STATUS, callback, user_data);
        return BT_ERROR_NONE;
@@ -1162,8 +1218,9 @@ int bt_hf_set_sco_state_changed_cb(bt_hf_sco_state_changed_cb callback,
 
 int bt_hf_unset_sco_state_changed_cb(void)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
 
        if (_bt_check_cb(BT_EVENT_HF_SCO_CONNECTION_STATUS) == true)
                _bt_unset_cb(BT_EVENT_HF_SCO_CONNECTION_STATUS);
@@ -1173,8 +1230,9 @@ int bt_hf_unset_sco_state_changed_cb(void)
 int bt_hf_set_call_handling_event_cb(bt_hf_call_handling_event_cb callback,
                                        void *user_data)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(callback);
 
        _bt_set_cb(BT_EVENT_HF_CALL_HANDLING_EVENT, callback, user_data);
@@ -1183,8 +1241,9 @@ int bt_hf_set_call_handling_event_cb(bt_hf_call_handling_event_cb callback,
 
 int bt_hf_unset_call_handling_event_cb(void)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
 
        if (_bt_check_cb(BT_EVENT_HF_CALL_HANDLING_EVENT) == true)
                _bt_unset_cb(BT_EVENT_HF_CALL_HANDLING_EVENT);
@@ -1195,8 +1254,9 @@ int bt_hf_set_multi_call_handling_event_cb(
                                        bt_hf_multi_call_handling_event_cb callback,
                                        void *user_data)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(callback);
 
        _bt_set_cb(BT_EVENT_HF_MULTI_CALL_HANDLING_EVENT, callback, user_data);
@@ -1205,8 +1265,9 @@ int bt_hf_set_multi_call_handling_event_cb(
 
 int bt_hf_unset_multi_call_handling_event_cb(void)
 {
-       BT_CHECK_INIT_STATUS();
        BT_CHECK_HF_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
 
        if (_bt_check_cb(BT_EVENT_HF_MULTI_CALL_HANDLING_EVENT) == true)
                _bt_unset_cb(BT_EVENT_HF_MULTI_CALL_HANDLING_EVENT);
@@ -1219,6 +1280,7 @@ int bt_hf_set_remote_call_event_cb(
 {
        BT_CHECK_HF_SUPPORT();
        BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(callback);
        _bt_set_cb(BT_EVENT_HF_REMOTE_CALL_EVENT, callback, user_data);
        return BT_ERROR_NONE;
@@ -1228,6 +1290,7 @@ int bt_hf_unset_remote_call_event_cb(void)
 {
        BT_CHECK_HF_SUPPORT();
        BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
        if (_bt_check_cb(BT_EVENT_HF_REMOTE_CALL_EVENT) == true)
                _bt_unset_cb(BT_EVENT_HF_REMOTE_CALL_EVENT);
        return BT_ERROR_NONE;
@@ -1239,6 +1302,7 @@ int bt_hf_set_remote_device_state_changed_cb(
 {
        BT_CHECK_HF_SUPPORT();
        BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(callback);
        _bt_set_cb(BT_EVENT_HF_CIEV_DEVICE_STATUS_CHANGED, callback, user_data);
        return BT_ERROR_NONE;
@@ -1248,6 +1312,7 @@ int bt_hf_unset_remote_device_state_changed_cb(void)
 {
        BT_CHECK_HF_SUPPORT();
        BT_CHECK_INIT_STATUS();
+       BT_CHECK_HF_INIT_STATUS();
        if (_bt_check_cb(BT_EVENT_HF_CIEV_DEVICE_STATUS_CHANGED) == true)
                _bt_unset_cb(BT_EVENT_HF_CIEV_DEVICE_STATUS_CHANGED);
        return BT_ERROR_NONE;
index 9da615c67a229cff84b26a9b814e3890f3eb45a8..6a73b44593ad5b27fd2fba91938659e67d075742 100644 (file)
@@ -59,15 +59,17 @@ int __bt_check_avrcp_target_init_status(void)
                return BT_ERROR_NOT_INITIALIZED; \
        }
 
+/* LCOV_EXCL_START */
 int __bt_check_avrcp_control_init_status(void)
 {
-       if (is_avrcp_control_initialized != true) {
+       if (is_avrcp_control_initialized != true) { /* LCOV_EXCL_LINE */
                BT_ERR("NOT_INITIALIZED(0x%08x)", BT_ERROR_NOT_INITIALIZED); /* LCOV_EXCL_LINE */
                return BT_ERROR_NOT_INITIALIZED; /* LCOV_EXCL_LINE */
        }
 
        return BT_ERROR_NONE;
 }
+/* LCOV_EXCL_STOP */
 
 /*The below API is just to conver the error from Audio API's to CAPI error codes,
 * this is temporary change and changes to proper error code will be done in
@@ -108,6 +110,7 @@ int bt_avrcp_target_initialize(bt_avrcp_target_connection_state_changed_cb callb
        return BT_ERROR_NONE;
 }
 
+/* LCOV_EXCL_START */
 int bt_avrcp_target_connect(const char *remote_address)
 {
        int error;
@@ -144,7 +147,7 @@ int bt_avrcp_target_disconnect(const char *remote_address)
                BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error), error);
 
        return error;
-}
+} /* LCOV_EXCL_STOP */
 
 int bt_avrcp_target_deinitialize(void)
 {
index c3859ff964a04a36ee75da822c4a22cfb87b1856..ade64d4c756f524135a7c848958f8733addb2c3e 100644 (file)
@@ -52,6 +52,9 @@ static void __bt_free_bt_adapter_device_discovery_info_s(bt_adapter_device_disco
 static int __bt_get_bt_adapter_le_device_scan_info_s(bt_adapter_le_device_scan_result_info_s **scan_info, bluetooth_le_device_info_t *source_info);
 static void __bt_free_bt_adapter_le_device_scan_info_s(bt_adapter_le_device_scan_result_info_s *scan_info);
 
+/* TDS Forward declarations */
+static void __bt_free_tds_scan_result_info_s(bt_tds_transport_block_list_s *discovery_info);
+
 static int __bt_get_bt_adapter_le_device_discovery_info_s(bt_adapter_le_device_discovery_info_s **le_discovery_info, bluetooth_le_device_info_t *source_info);
 static void __bt_free_bt_adapter_le_device_discovery_info_s(bt_adapter_le_device_discovery_info_s *discovery_info);
 static int __bt_gatt_client_update_characteristics(bt_gatt_handle_info_t char_handles, bt_gatt_service_s *service);
@@ -107,7 +110,7 @@ int bt_get_uuid_name(const char *uuid, char **name)
                /* BT Classic Services */
                {"1101", "Serial Port Service"},
                {"1102", "LAN Access Using PPP Service"},
-               {"1103", "Dialup Netwworking Service"},
+               {"1103", "Dialup Networking Service"},
                {"1104", "IrMCSync Service"},
                {"1105", "OBEX Object Push Service"},
                {"1106", "OBEX File Transfer Service"},
@@ -147,7 +150,7 @@ int bt_get_uuid_name(const char *uuid, char **name)
                {"112D", "SIM Access Service"},
                {"112E", "Phonebook Access PCE Service"},
                {"112F", "Phonebook Access PSE Service"},
-               {"1130", "Phonebook Access  Profile"},
+               {"1130", "Phonebook Access Profile"},
                {"1132", "Message Access Server Service"},
                {"1133", "Message Notification Server Service"},
                {"1134", "Message Access Profile"},
@@ -158,7 +161,12 @@ int bt_get_uuid_name(const char *uuid, char **name)
                {"1204", "Generic Telephony Service"},
                {"1205", "UPnP Service"},
                {"1206", "UPnP Ip Service"},
+               {"1303", "Video Source Service"},
+               {"1304", "Video Sink Service"},
+               {"1305", "Video Distribution Profile"},
                {"1400", "Health Device Profile"},
+               {"1401", "HDP Source Service"},
+               {"1402", "HDP Sink Service"},
 
                /* GATT Services */
                {"1800", "Generic Access"},
@@ -238,6 +246,9 @@ int bt_get_uuid_name(const char *uuid, char **name)
                {"9A3F68E0-86CE-11E5-A309-0002A5D5C51B", "Samsung Gear Manager Service"},
                {"c2f2cc0f-c085-4dd4-be5a-aca3074bbc72", "Control Point"},
                {"cece518b-28d7-4171-92d5-76a1e249a3b9", "Notifications Source"},
+               {"32D1955A-E5AA-4A96-9A49-08538DA8B8F6", "Samsung Gear Fit Manager Service"},
+               {"FE53FF98-B259-4337-B56A-0EC9F82C6BAD", "Control Point"},
+               {"C2051EE0-804D-4D50-A12C-15E243852100", "Notifications Source"},
                {NULL, NULL}
        };
 
@@ -478,6 +489,55 @@ void _bt_free_bt_device_info_s(bt_device_info_s *device_info)
 }
 /* LCOV_EXCL_STOP */
 
+int _bt_get_ad_data_by_type(char *in_data, int in_len,
+               char in_type, char **data, int *data_len)
+{
+       if (in_data == NULL || data == NULL || data_len == NULL)
+               return BLUETOOTH_ERROR_INTERNAL;
+
+       if (in_len < 0)
+               return BLUETOOTH_ERROR_INTERNAL;
+
+       int i;
+       int len = 0;
+       int type = 0;
+
+       for (i = 0; i < in_len; i++) {
+               len = in_data[i];
+               if (len <= 0 || i + 1 >= in_len) {
+                       BT_ERR("Invalid advertising data");
+                       return BLUETOOTH_ERROR_INTERNAL;
+               }
+
+               type = in_data[i + 1];
+               if (type == in_type) {
+                       i = i + 2;
+                       len--;
+                       break;
+               }
+
+               i += len;
+               len = 0;
+       }
+
+       if (i + len > in_len) {
+               BT_ERR("Invalid advertising data");
+               return BLUETOOTH_ERROR_INTERNAL;
+       } else if (len == 0) {
+               BT_DBG("AD Type 0x%02x data is not set", in_type);
+               *data = NULL;
+               *data_len = 0;
+               return BLUETOOTH_ERROR_NONE;
+       }
+
+       *data = g_memdup(&in_data[i], len);
+       if (*data == NULL)
+               return BLUETOOTH_ERROR_OUT_OF_MEMORY;
+       *data_len = len;
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
 int _bt_convert_address_to_string(char **addr_str, bluetooth_device_address_t *addr_hex)
 {
        char address[18] = { 0, };
@@ -988,6 +1048,10 @@ static bool __bt_need_to_handle(int event)
        case BLUETOOTH_EVENT_GATT_SERVER_READ_REQUESTED:
        case BLUETOOTH_EVENT_GATT_SERVER_NOTIFICATION_COMPLETED:
        case BLUETOOTH_EVENT_GATT_CLIENT_SERVICE_CHANGED:
+       case BLUETOOTH_EVENT_TDS_TRANSPORT_DATA_RECEIVED:
+       case BLUETOOTH_EVENT_TDS_ACTIVATION_RESULT:
+       case BLUETOOTH_EVENT_TDS_CONTROL_POINT_ENABLED:
+       case BLUETOOTH_EVENT_TDS_ACTIVATION_INDICATION:
                return true;
        default:
                break;
@@ -996,12 +1060,16 @@ static bool __bt_need_to_handle(int event)
        event_index = __bt_get_cb_index(event);
        if (event_index != -1 && bt_event_slot_container[event_index].callback)
                return true;
+       else
+               BT_DBG("Event [%d] would not handled, not found in bt_event_slot_container", event);
 
        return false;
 }
 
 static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *user_data)
 {
+       BT_DBG("Entered for event: %d", event);
+
        int call_id;
        int *avrcp_mode;
        int *discoverable_timeout;
@@ -1034,6 +1102,7 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us
        bt_le_data_length_params_t  *data_length_info = NULL;
        bt_ipsp_connection_info_t *bt_ipsp_iface_info = NULL;
        bt_pxp_property_changed_params_t *bt_pxp_property_info = NULL;
+       bluetooth_tds_activation_req_t *tds_act_req_info = NULL;
 
        if (!__bt_need_to_handle(event))
                return;
@@ -1429,6 +1498,88 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us
                /* This event don't be used in CAPI */
                break;
 
+       case BLUETOOTH_EVENT_MAP_CONNECTED:
+               BT_INFO("bt_map_client_??????????_cb() will be called");
+               bd_addr = (bluetooth_device_address_t *)(param->param_data);
+               _bt_convert_address_to_string(&device_addr, bd_addr);
+
+               /* TODO: MAP, see above */
+
+               if (device_addr != NULL)
+                       free(device_addr);
+               break;
+
+       case BLUETOOTH_EVENT_MAP_DISCONNECTED:
+               BT_INFO("bt_map_client_??????????_cb() will be called");
+               bd_addr = (bluetooth_device_address_t *)(param->param_data);
+               _bt_convert_address_to_string(&device_addr, bd_addr);
+
+               /* TODO: MAP, see above */
+
+               if (device_addr != NULL)
+                       free(device_addr);
+               break;
+       case BLUETOOTH_EVENT_MAP_LIST_FOLDERS_COMPLETE:
+               BT_INFO("BLUETOOTH_EVENT_MAP_LIST_FOLDERS_COMPLETE event");
+               //do not need to release memory, it is managed by bluetooth-frwk
+               bt_map_client_folders_s* folders_struct = (bt_map_client_folders_s*) param->param_data;
+               ((bt_map_client_list_folders_cb)bt_event_slot_container[event_index].callback)
+                                                       (param->result, folders_struct->names, folders_struct->size,
+                                                                       bt_event_slot_container[event_index].user_data);
+
+               if (device_addr != NULL)
+                       free(device_addr);
+               break;
+
+       case BLUETOOTH_EVENT_MAP_LIST_FILTER_FIELD_COMPLETE:
+               {
+                       BT_INFO(" BLUETOOTH_EVENT_MAP_LIST_FILTER_FIELD_COMPLETE event");
+                       bt_map_list_filter_fields_info_t* fields_info = (bt_map_list_filter_fields_info_t*)(param->param_data);
+
+                       ((bt_map_client_list_filter_fields_cb)bt_event_slot_container[event_index].callback)
+                                                       (param->result, fields_info->fields, fields_info->size,
+                                                       bt_event_slot_container[event_index].user_data);
+
+                       if (device_addr != NULL)
+                               free(device_addr);
+               }
+               break;
+
+       case BLUETOOTH_EVENT_MAP_LIST_MESSAGES_COMPLETE:
+               BT_INFO("BLUETOOTH_EVENT_MAP_LIST_MESSAGES_COMPLETE event");
+               bt_map_client_message_items_s* messages_struct = (bt_map_client_message_items_s*) param->param_data;
+               ((bt_map_client_list_messages_cb)bt_event_slot_container[event_index].callback)(
+                       param->result,
+                       (bt_map_client_message_item_s*)(messages_struct->message_items),
+                       messages_struct->size,
+                       bt_event_slot_container[event_index].user_data);
+               if (device_addr != NULL)
+                       free(device_addr);
+               break;
+
+       case BLUETOOTH_EVENT_MAP_GET_MESSAGE_COMPLETE:
+               BT_INFO("BLUETOOTH_EVENT_MAP_GET_MESSAGE_COMPLETE event");
+
+               bt_get_message_callback_data *data = bt_event_slot_container[event_index].user_data;
+               char *target_file = (char*) data->target_file;
+               void *user_data = data->user_data;
+               free(data);
+
+               bt_map_client_message_s* res = malloc(sizeof(*res));
+               res->file_path = target_file;
+
+               ((bt_map_client_get_message_cb)bt_event_slot_container[event_index].callback)(
+                       param->result, res, user_data);
+               break;
+
+       case BLUETOOTH_EVENT_MAP_PUSH_MESSAGE_COMPLETE:
+               BT_INFO("BLUETOOTH_EVENT_MAP_PUSH_MESSAGE_COMPLETE event");
+
+               ((bt_map_client_push_message_cb)bt_event_slot_container[event_index].callback)(
+                       param->result,
+                       bt_event_slot_container[event_index].user_data);
+               break;
+
        case BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED:
                BT_INFO("BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED");
                dev_info = (bluetooth_network_device_info_t *)(param->param_data);
@@ -1837,6 +1988,9 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us
                if (is_pxp_initialized)
                        _bt_proximity_connection_set_state_changed(param->result, device_addr, TRUE);
 
+               /* TDS Seeker */
+               _bt_tds_update_seeker_connection_state_changed(param->result, device_addr, TRUE);
+
                g_free(device_addr);
                device_addr = NULL;
                break;
@@ -1861,6 +2015,9 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us
                if (is_pxp_initialized)
                        _bt_proximity_connection_set_state_changed(param->result, device_addr, FALSE);
 
+               /* TDS Seeker */
+               _bt_tds_update_seeker_connection_state_changed(param->result, device_addr, FALSE);
+
                g_free(device_addr);
                device_addr = NULL;
                break;
@@ -2032,6 +2189,9 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us
 
                BT_INFO("BLUETOOTH_EVENT_GATT_SERVER_VALUE_CHANGE");
                if (cb == NULL) {
+                       if (value_change->response_needed == FALSE)
+                               return;
+
                        bluetooth_gatt_send_response(value_change->req_id,
                                                                BLUETOOTH_GATT_ATT_REQUEST_TYPE_WRITE,
                                                                BLUETOOTH_ERROR_INTERNAL, 0, NULL, 0);
@@ -2039,7 +2199,7 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us
                }
 
                cb(value_change->address, value_change->req_id, value_change->service_handle,
-                                       gatt_handle, value_change->offset,
+                                       gatt_handle, value_change->offset, value_change->response_needed,
                                        (char *)value_change->att_value, value_change->val_len, user_data);
                break;
        }
@@ -2113,7 +2273,8 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us
 
                                for (char_list = svc->characteristics; char_list; char_list = g_slist_next(char_list)) {
                                        bt_gatt_characteristic_s *chr = (bt_gatt_characteristic_s *)char_list->data;
-                                       if (chr->path && strcmp(char_val->char_handle, chr->path) == 0) {
+
+                                       if (chr && g_strcmp0(char_val->char_handle, chr->path) == 0) {
                                                g_free(chr->value);
                                                chr->value = NULL;
                                                if (char_val->val_len > 0)
@@ -2122,7 +2283,7 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us
                                                /* TODO : Fix build error temporary */
                                                if (chr->write_value_requested_cb)
                                                        chr->write_value_requested_cb(NULL, 0, (bt_gatt_server_h)serv, (bt_gatt_h)chr,
-                                                                                       0, (char*)char_val->char_value, char_val->val_len,
+                                                                                       0, TRUE, (char*)char_val->char_value, char_val->val_len,
                                                                                        chr->write_value_requested_user_data);
                                        }
                                }
@@ -2130,7 +2291,6 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us
                }
                break;
        }
-/* LCOV_EXCL_STOP */
        case BLUETOOTH_EVENT_GATT_CLIENT_SERVICE_CHANGED: {
                bt_gatt_service_change_t *service_change =
                        (bt_gatt_service_change_t *)(param->param_data);
@@ -2148,6 +2308,9 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us
                _bt_convert_address_to_string(&device_addr,
                                &service_change->device_addr);
 
+               /* Check if TDS Service removed */
+               _bt_tds_check_service_changed(device_addr, service_change);
+
                client = _bt_gatt_get_client(device_addr);
                g_free(device_addr);
                device_addr = NULL;
@@ -2206,6 +2369,7 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us
                }
                break;
        }
+/* LCOV_EXCL_STOP */
        case BLUETOOTH_EVENT_ADVERTISING_STARTED:
                BT_INFO("BLUETOOTH_EVENT_ADVERTISING_STARTED");
                adv_handle = (int *)(param->param_data);
@@ -2672,7 +2836,78 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us
                        free(device_addr); /* LCOV_EXCL_STOP */
                break;
        }
+       case BLUETOOTH_EVENT_TDS_ACTIVATION_REQUESTED: {
+               BT_DBG("BLUETOOTH_EVENT_TDS_ACTIVATION_REQUESTED"); /* LCOV_EXCL_LINE */
+               tds_act_req_info = (bluetooth_tds_activation_req_t *)(param->param_data);
+               _bt_convert_address_to_string(&device_addr, &tds_act_req_info->rem_addr);
+
+               ((bt_tds_activation_requested_cb)bt_event_slot_container[event_index].callback) /* LCOV_EXCL_LINE */
+                       (device_addr, tds_act_req_info->transport, tds_act_req_info->tds_data.data,
+                        tds_act_req_info->tds_data.length, bt_event_slot_container[event_index].user_data);
+
+               if (device_addr != NULL)
+                       free(device_addr); /* LCOV_EXCL_STOP */
+               break;
+       }
+       case BLUETOOTH_EVENT_TDS_TRANSPORT_DATA_RECEIVED: {
+               BT_DBG("BLUETOOTH_EVENT_TDS_TRANSPORT_DATA_RECEIVED"); /* LCOV_EXCL_LINE */
+               bluetooth_tds_transport_data_info_t *info = NULL;
+               bluetooth_device_address_t *addr = NULL;
+
+               if (_bt_get_error_code(param->result) == BT_ERROR_NONE) {
+                       info = (bluetooth_tds_transport_data_info_t *)(param->param_data);
+                       _bt_convert_address_to_string(&device_addr, &info->device_address);
+                       _bt_tds_send_complete_transport_data(_bt_get_error_code(param->result), device_addr,
+                                       info->data, info->data_length);
+               } else {
+                       BT_ERR("TDS Complete data Read request failed!!!");
+                       addr = (bluetooth_device_address_t *)(param->param_data);
+                       _bt_convert_address_to_string(&device_addr, addr);
+                       _bt_tds_send_complete_transport_data(_bt_get_error_code(param->result), device_addr,
+                                       NULL, 0);
+               }
+               BT_DBG("TDS Complete data blocks received: Remote provider address [%s]", device_addr);
+               if (device_addr != NULL)
+                       free(device_addr); /* LCOV_EXCL_STOP */
+               break;
+       }
+       case BLUETOOTH_EVENT_TDS_ACTIVATION_RESULT: {
+               BT_DBG("BLUETOOTH_EVENT_TDS_ACTIVATION_RESULT"); /* LCOV_EXCL_LINE */
+               _bt_convert_address_to_string(&device_addr,
+                       (bluetooth_device_address_t *)(param->param_data));
+
+               _bt_tds_control_point_activation_result_update(_bt_get_error_code(param->result), device_addr);
+
+               if (device_addr != NULL)
+                       free(device_addr); /* LCOV_EXCL_STOP */
+               break;
+       }
+       case BLUETOOTH_EVENT_TDS_CONTROL_POINT_ENABLED: {
+               BT_DBG("BLUETOOTH_EVENT_TDS_CONTROL_POINT_ENABLED"); /* LCOV_EXCL_LINE */
+               _bt_convert_address_to_string(&device_addr,
+                       (bluetooth_device_address_t *)(param->param_data));
+
+               _bt_tds_control_point_enabled_update(_bt_get_error_code(param->result), device_addr);
+
+               if (device_addr != NULL)
+                       free(device_addr); /* LCOV_EXCL_STOP */
+               break;
+       } case BLUETOOTH_EVENT_TDS_ACTIVATION_INDICATION: {
+               BT_DBG("BLUETOOTH_EVENT_TDS_ACTIVATION_INDICATION"); /* LCOV_EXCL_LINE */
+               bluetooth_tds_indication_res_t *tds_act_ind_res = NULL;
+               tds_act_ind_res = (bluetooth_tds_indication_res_t *)(param->param_data);
+
+               _bt_convert_address_to_string(&device_addr, &tds_act_ind_res->rem_addr);
+
+               BT_ERR("Address [%s]", device_addr);
+               _bt_tds_control_point_indication_response_update(device_addr, tds_act_ind_res);
+
+               if (device_addr != NULL)
+                       free(device_addr); /* LCOV_EXCL_STOP */
+               break;
+       }
        default:
+               BT_INFO("Unknown function");
                break;
        }
 }
@@ -2745,8 +2980,43 @@ static void __bt_le_event_proxy(int event, bluetooth_event_param_t *param, void
                                }
                        }
                }
-               break;
+               /* TDS Provider Search: Uses Scan Info */
+               if (bt_event_slot_container[BT_EVENT_TDS_PROVIDER_FOUND_RESULT].callback != NULL) {
+                       char *data = NULL;
+                       int data_len = 0;
+                       if (!scan_info) {
+                               /* Get Scan Info */
+                               if (__bt_get_bt_adapter_le_device_scan_info_s(&scan_info,
+                                                       (bluetooth_le_device_info_t *)(param->param_data)) != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
+                                       break;
+                               }
+                       }
+                       _bt_get_ad_data_by_type((char*)scan_info->adv_data, scan_info->adv_data_len,
+                                       BT_ADAPTER_LE_ADVERTISING_DATA_TRANSPORT_DISCOVERY,
+                                       &data, &data_len);
+                       if (data != NULL) {
+                               BT_DBG("TDS Service available Data length[%d]", data_len);
+                               bt_tds_transport_block_list_s *info = g_malloc0(sizeof(bt_tds_transport_block_list_s));
+
+                               if (_bt_tds_parse_transport_blocks(&info, data, data_len) == BT_ERROR_NONE) {
+                                       ((bt_tds_provider_scan_result_cb)bt_event_slot_container[BT_EVENT_TDS_PROVIDER_FOUND_RESULT].callback) /* LCOV_EXCL_LINE */
+                                               (_bt_get_error_code(param->result),
+                                                scan_info->remote_address, info,
+                                                scan_info,
+                                                bt_event_slot_container[BT_EVENT_TDS_PROVIDER_FOUND_RESULT].user_data);
+                               }
+                               __bt_free_tds_scan_result_info_s(info);
+
+                               if (data) {
+                                       g_free(data);
+                                       data = NULL;
+                               }
+                       }
+               }
 
+               if (scan_info)
+                       __bt_free_bt_adapter_le_device_scan_info_s(scan_info);
+               break;
        default:
                break;
        }
@@ -2832,7 +3102,7 @@ static void __bt_free_bt_adapter_device_discovery_info_s(bt_adapter_device_disco
        free(discovery_info);
        discovery_info = NULL;
 }
-/* LCOV_EXCL_STOP */
+
 static int __bt_get_bt_adapter_le_device_scan_info_s(
                        bt_adapter_le_device_scan_result_info_s **scan_info,
                        bluetooth_le_device_info_t *source_info)
@@ -2886,6 +3156,23 @@ static void __bt_free_bt_adapter_le_device_scan_info_s(bt_adapter_le_device_scan
 
        free(scan_info);
        scan_info = NULL;
+} /* LCOV_EXCL_STOP */
+
+static void __bt_free_tds_scan_result_info_s(bt_tds_transport_block_list_s *discovery_info)
+{
+       int k;
+
+       if (discovery_info == NULL)
+               return;
+
+       for (k = 0; k < discovery_info->num_transport_block; k++) {
+               g_free(discovery_info->data[k]->data);
+               g_free(discovery_info->data[k]);
+       }
+
+       g_free(discovery_info);
+       discovery_info = NULL;
+
 }
 
 /* LCOV_EXCL_START */
@@ -3033,6 +3320,16 @@ static int __bt_get_cb_index(int event)
                return BT_EVENT_OPP_CLIENT_PUSH_PROGRESS;
        case BLUETOOTH_EVENT_OPC_DISCONNECTED:
                return BT_EVENT_OPP_CLIENT_PUSH_FINISHED;
+       case BLUETOOTH_EVENT_MAP_LIST_FOLDERS_COMPLETE:
+               return BT_EVENT_MAP_CLIENT_LIST_FOLDERS;
+       case BLUETOOTH_EVENT_MAP_LIST_FILTER_FIELD_COMPLETE:
+               return BT_EVENT_MAP_CLIENT_LIST_FILTER_FIELDS;
+       case BLUETOOTH_EVENT_MAP_LIST_MESSAGES_COMPLETE:
+               return BT_EVENT_MAP_CLIENT_LIST_MESSAGES;
+       case BLUETOOTH_EVENT_MAP_GET_MESSAGE_COMPLETE:
+                       return BT_EVENT_MAP_CLIENT_GET_MESSAGE;
+       case BLUETOOTH_EVENT_MAP_PUSH_MESSAGE_COMPLETE:
+                       return BT_EVENT_MAP_CLIENT_PUSH_MESSAGE;
        case BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED:
        case BLUETOOTH_EVENT_NETWORK_SERVER_DISCONNECTED:
                return BT_EVENT_NAP_CONNECTION_STATE_CHANGED;
@@ -3244,6 +3541,8 @@ static int __bt_get_cb_index(int event)
                return  BT_EVENT_IPSP_INIT_STATE_CHANGED;
        case BLUETOOTH_EVENT_PXP_PROPERTY_CHANGED:
                return BT_EVENT_PROXIMITY_REPORTER_PROPERTY_CHANGED;
+       case BLUETOOTH_EVENT_TDS_ACTIVATION_REQUESTED:
+               return BT_EVENT_TDS_ACTIVATION_REQUESTED;
        default:
                return -1;
        }
index 315f8369793da6ce85964daf138f8b5e18163798..94fc70023f22fba9edcb53a105ba083e39eb4271 100644 (file)
@@ -388,13 +388,14 @@ int bt_device_unset_connection_state_changed_cb(void)
        return BT_ERROR_NONE;
 }
 
+/* LCOV_EXCL_START */
 int bt_device_unset_rssi_alert_cb(void)
 {
        BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
        BT_CHECK_INIT_STATUS();
        _bt_unset_cb(BT_EVENT_RSSI_ALERT_EVENT);
        return BT_ERROR_NONE;
-}
+} /* LCOV_EXCL_STOP */
 
 int bt_device_unset_att_mtu_changed_cb(void)
 {
@@ -404,6 +405,7 @@ int bt_device_unset_att_mtu_changed_cb(void)
        return BT_ERROR_NONE;
 }
 
+/* LCOV_EXCL_START */
 int bt_device_enable_rssi_monitor(const char *remote_address,
                                bt_device_connection_link_type_e link_type,
                                int low_threshold, int in_range_threshold,
@@ -481,7 +483,6 @@ int bt_device_get_rssi_strength(const char *remote_address,
 }
 
 
-/* LCOV_EXCL_START */
 int bt_device_le_conn_update(const char *device_address,
        const bt_le_conn_update_s *parameters)
 {
@@ -557,6 +558,10 @@ int bt_device_get_service_mask_from_uuid_list(char **uuids,
                        service_mask |= BT_SC_OPP_SERVICE_MASK;
                        break;
 
+               case BLUETOOTH_OBEX_MESSAGE_ACCESS_SERVICE_UUID:
+                       service_mask |= BT_SC_MAP_SERVICE_MASK;
+                       break;
+
                case BLUETOOTH_OBEX_FILE_TRANSFER_UUID:
                        service_mask |= BT_SC_FTP_SERVICE_MASK;
                        break;
index 2a50411b3f599e560a9ab23e0a349d34dffc74ec..18631921e1630dcb1d411e6c3d16ccfc4813853f 100644 (file)
@@ -967,6 +967,7 @@ static void __bt_gatt_destroy_service(bt_gatt_h gatt_handle)
        __bt_gatt_free_service(gatt_handle);
 }
 
+/* LCOV_EXCL_START */
 static int __convert_int_to_signed_bits(int i, int size)
 {
        if (i < 0)
@@ -1065,6 +1066,7 @@ static int __get_data_type_int_size(bt_data_type_int_e format)
                return 0;
        }
 }
+/* LCOV_EXCL_STOP */
 
 int bt_gatt_destroy(bt_gatt_h gatt_handle)
 {
diff --git a/src/bluetooth-map-client.c b/src/bluetooth-map-client.c
new file mode 100644 (file)
index 0000000..536f91e
--- /dev/null
@@ -0,0 +1,399 @@
+/*
+ * Copyright (c) 2016 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 <dlog.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <string.h>
+#include <bluetooth-api.h>
+
+#include "bluetooth.h"
+#include "bluetooth_private.h"
+
+static bool is_map_client_initialized = false;
+
+#define BT_CHECK_MAP_CLIENT_SUPPORT() \
+{ \
+       BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON); \
+       BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_MAP); \
+}
+
+#define BT_CHECK_MAP_CLIENT_INIT_STATUS() \
+       if (__bt_check_map_client_init_status() == BT_ERROR_NOT_INITIALIZED) { \
+               BT_ERR("[%s] NOT_INITIALIZED(0x%08x)", __FUNCTION__, BT_ERROR_NOT_INITIALIZED); \
+               return BT_ERROR_NOT_INITIALIZED; \
+       }
+
+int __bt_check_map_client_init_status(void)
+{
+       if (is_map_client_initialized != true) {
+               BT_ERR("NOT_INITIALIZED(0x%08x)", BT_ERROR_NOT_INITIALIZED);
+               return BT_ERROR_NOT_INITIALIZED;
+       }
+
+       return BT_ERROR_NONE;
+}
+
+int bt_map_client_initialize(void)
+{
+       BT_DBG("bt_map_client_initialize");
+
+       int error_code = BT_ERROR_NONE;
+
+       // TODO: MAP: it is not supported on TM1
+       //BT_CHECK_MAP_CLIENT_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+
+       error_code = _bt_get_error_code(bluetooth_map_client_init());
+
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), /* LCOV_EXCL_LINE */
+                               error_code); /* LCOV_EXCL_LINE */
+               return error_code; /* LCOV_EXCL_LINE */
+       }
+
+       is_map_client_initialized = true;
+       return error_code;
+}
+
+int bt_map_client_deinitialize(void)
+{
+       BT_DBG("bt_map_client_deinitialize");
+
+       int error_code = BT_ERROR_NONE;
+
+       // TODO: MAP: it is not supported on TM1
+       //BT_CHECK_MAP_CLIENT_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_MAP_CLIENT_INIT_STATUS();
+
+       error_code = _bt_get_error_code(bluetooth_map_client_deinit());
+
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), /* LCOV_EXCL_LINE */
+                               error_code); /* LCOV_EXCL_LINE */
+               return error_code; /* LCOV_EXCL_LINE */
+       }
+
+       is_map_client_initialized = false;
+       return error_code;
+}
+
+int bt_map_client_create_session(const char* remote_address,
+                       bt_map_client_session_info_h* handle)
+{
+       BT_DBG("bt_map_client_create_session");
+       int error_code = BT_ERROR_NONE;
+
+       //BT_CHECK_MAP_CLIENT_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_MAP_CLIENT_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(remote_address);
+
+       bt_map_client_session_info_s* session =
+               malloc(sizeof(bt_map_client_session_info_s));
+       session->remote_address = strdup(remote_address);
+
+       error_code = _bt_get_error_code(bluetooth_map_client_create_session(session));
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
+                               error_code);
+               free(session->remote_address);
+               free(session);
+       } else {
+               BT_DBG("Successfully created session");
+               *handle = session;
+       }
+       return error_code;
+
+}
+
+int bt_map_client_destroy_session(bt_map_client_session_info_h handle)
+{
+       BT_DBG("bt_map_client_destroy_session");
+       int error_code = BT_ERROR_NONE;
+
+       //BT_CHECK_MAP_CLIENT_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_MAP_CLIENT_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(handle);
+
+       bt_map_client_session_info_s* session = (bt_map_client_session_info_s*)handle;
+
+       error_code = _bt_get_error_code(bluetooth_map_client_destroy_session(session));
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
+                               error_code);
+       } else {
+               BT_DBG("Successfully destroyed session");
+       }
+       return error_code;
+}
+
+int bt_map_client_set_folder(bt_map_client_session_info_h handle, const char *name)
+{
+       int error_code = BT_ERROR_NONE;
+
+       //BT_CHECK_MAP_CLIENT_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_MAP_CLIENT_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(handle);
+       BT_CHECK_INPUT_PARAMETER(name);
+
+       bt_map_client_session_info_s* session = (bt_map_client_session_info_s*)handle;
+
+       error_code = _bt_get_error_code(bluetooth_map_client_set_folder(session, name));
+
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
+                               error_code);
+       }
+       return error_code;
+}
+
+int bt_map_client_list_folders(bt_map_client_session_info_h handle,
+                       bt_map_client_list_folders_filter_h filter,
+                       bt_map_client_list_folders_cb callback,
+                       void* user_data)
+{
+       BT_DBG("bt_map_client_list_folders");
+       //BT_CHECK_MAP_CLIENT_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_MAP_CLIENT_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(handle);
+       BT_CHECK_INPUT_PARAMETER(filter);
+       BT_CHECK_INPUT_PARAMETER_UINT(filter->offset);
+       BT_CHECK_INPUT_PARAMETER_UINT(filter->max_count);
+
+       bt_map_client_session_info_s* session = (bt_map_client_session_info_s*) handle;
+
+       int error_code = _bt_get_error_code(
+               bluetooth_map_client_list_folders(
+                       session,
+                       (bt_map_client_list_folders_filter_t*) filter
+               )
+       );
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("bt_map_client_list_folders %s(0x%08x)", _bt_convert_error_to_string(error_code),
+                               error_code);
+       } else {
+               _bt_set_cb(BT_EVENT_MAP_CLIENT_LIST_FOLDERS, callback, user_data);
+       }
+
+       return error_code; /* LCOV_EXCL_STOP */
+}
+
+int bt_map_client_list_filter_fields(bt_map_client_session_info_h handle,
+                       bt_map_client_list_filter_fields_cb callback,
+                       void *user_data)
+{
+       int error_code = BT_ERROR_NONE;
+
+       //BT_CHECK_MAP_CLIENT_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_MAP_CLIENT_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(handle);
+
+       bt_map_client_session_info_s* session = (bt_map_client_session_info_s*) handle;
+
+       error_code = _bt_get_error_code(bluetooth_map_client_list_filter_fields(session));
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
+                               error_code);
+       } else {
+               _bt_set_cb(BT_EVENT_MAP_CLIENT_LIST_FILTER_FIELDS, callback, user_data);
+       }
+
+       return error_code;
+}
+
+int bt_map_client_list_messages(bt_map_client_session_info_h handle,
+                       const char* folder,
+                       bt_map_client_list_messages_filter_h filter,
+                       bt_map_client_list_messages_cb callback,
+                       void *user_data)
+{
+       BT_DBG("bt_map_client_list_messages");
+
+       //BT_CHECK_MAP_CLIENT_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_MAP_CLIENT_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(handle);
+       BT_CHECK_INPUT_PARAMETER(filter);
+       BT_CHECK_INPUT_PARAMETER_UINT(filter->offset);
+       BT_CHECK_INPUT_PARAMETER_UINT(filter->max_count);
+       BT_CHECK_INPUT_PARAMETER_UINT(filter->subject_length);
+       BT_CHECK_INPUT_PARAMETER_BOOL(filter->is_read);
+       BT_CHECK_INPUT_PARAMETER_BOOL(filter->is_priority);
+
+       bt_map_client_session_info_s* session = (bt_map_client_session_info_s*) handle;
+
+       int error_code = _bt_get_error_code(
+               bluetooth_map_client_list_messages(
+                       session,
+                       folder,
+                       (bt_map_client_list_messages_filter_t*) filter
+               )
+       );
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("bluetooth_map_client_list_messages %s(0x%08x)",
+                       _bt_convert_error_to_string(error_code), error_code);
+       } else {
+               _bt_set_cb(BT_EVENT_MAP_CLIENT_LIST_MESSAGES, callback, user_data);
+       }
+
+       return error_code;
+}
+
+int bt_map_client_update_inbox(bt_map_client_session_info_h handle)
+{
+       int error_code = BT_ERROR_NONE;
+
+       //BT_CHECK_MAP_CLIENT_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_MAP_CLIENT_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(handle);
+
+       bt_map_client_session_info_s* session = (bt_map_client_session_info_s*)handle;
+
+       error_code = _bt_get_error_code(bluetooth_map_client_update_inbox(session));
+
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
+                               error_code);
+       }
+       return error_code;
+}
+
+int bt_map_client_push_message(bt_map_client_session_info_h handle,
+                       const char* source_file,
+                       const char* folder,
+                       bt_map_client_push_message_args_h args,
+                       bt_map_client_push_message_cb callback,
+                       void *user_data)
+{
+       BT_DBG("Entered bt_map_client_get_message");
+
+       //BT_CHECK_MAP_CLIENT_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_MAP_CLIENT_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(handle);
+       BT_CHECK_INPUT_PARAMETER(source_file);
+       BT_CHECK_INPUT_PARAMETER(folder);
+       BT_CHECK_INPUT_PARAMETER(args);
+
+       bt_map_client_session_info_s* session = (bt_map_client_session_info_s*)handle;
+
+       int error_code = _bt_get_error_code(
+               bluetooth_map_client_push_message(
+                       session,
+                       source_file,
+                       folder,
+                       (bt_map_client_push_message_args_t*) args
+               )
+       );
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("bluetooth_map_client_push_message %s(0x%08x)",
+                       _bt_convert_error_to_string(error_code), error_code);
+       } else {
+               _bt_set_cb(BT_EVENT_MAP_CLIENT_PUSH_MESSAGE, callback, user_data);
+       }
+
+       return error_code;
+}
+
+int bt_map_client_get_message(bt_map_client_session_info_h handle,
+                       const bt_map_client_message_object_h message_object,
+                       const char* target_file,
+                       bool attachment,
+                       bt_map_client_get_message_cb callback,
+                       void* user_data)
+{
+       BT_DBG("Entered bt_map_client_get_message");
+       //BT_CHECK_MAP_CLIENT_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_MAP_CLIENT_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(handle);
+       BT_CHECK_INPUT_PARAMETER(message_object);
+       BT_CHECK_INPUT_PARAMETER(target_file);
+
+       bt_map_client_session_info_s* session = (bt_map_client_session_info_s*) handle;
+
+       bt_get_message_callback_data *data = malloc(sizeof(*data));
+       data->target_file = target_file;
+       data->user_data = user_data;
+
+       int error_code = _bt_get_error_code(bluetooth_map_client_get_message(session,
+                       message_object, target_file, attachment));
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("bt_map_client_get_message %s(0x%08x)", _bt_convert_error_to_string(error_code),
+                               error_code);
+       } else {
+               _bt_set_cb(BT_EVENT_MAP_CLIENT_GET_MESSAGE, callback, data);
+       }
+
+       return error_code; /* LCOV_EXCL_STOP */
+}
+
+void bt_map_client_list_folders_filter_create(bt_map_client_list_folders_filter_h *filter)
+{
+       (*filter) = malloc(sizeof(bt_map_client_list_folders_filter_s));
+       (*filter)->offset = -1;
+       (*filter)->max_count = -1;
+}
+
+void bt_map_client_list_folders_filter_destroy(bt_map_client_list_folders_filter_h *filter)
+{
+       free(*filter);
+       *filter = NULL;
+}
+
+void bt_map_client_list_messages_filter_create(bt_map_client_list_messages_filter_h *filter)
+{
+       (*filter) = malloc(sizeof(bt_map_client_list_messages_filter_s));
+       (*filter)->offset = -1;
+       (*filter)->max_count = -1;
+       (*filter)->subject_length = -1;
+       (*filter)->fields = NULL;
+       (*filter)->types = NULL;
+       (*filter)->period_begin = NULL;
+       (*filter)->period_end = NULL;
+       (*filter)->is_read = -1;
+       (*filter)->recipient = NULL;
+       (*filter)->sender = NULL;
+       (*filter)->is_priority = -1;
+}
+
+void bt_map_client_list_messages_filter_destroy(bt_map_client_list_messages_filter_h *filter)
+{
+       free(*filter);
+       *filter = NULL;
+}
+
+void bt_map_client_push_message_args_create(bt_map_client_push_message_args_h *args)
+{
+       (*args) = malloc(sizeof(bt_map_client_push_message_args_s));
+       (*args)->is_transparent = -1;
+       (*args)->is_retry = -1;
+       (*args)->charset =  NULL;
+}
+
+void bt_map_client_push_message_args_destroy(bt_map_client_push_message_args_h *args)
+{
+       free(*args);
+       *args = NULL;
+}
index b1bb44c332c9e8e6eacc46a07e055605bf839dde..8e88796744733682df3851d3195c49a003934313 100644 (file)
@@ -138,7 +138,7 @@ int bt_proximity_reporter_destroy(bt_proximity_reporter_h reporter)
 
        return error_code;
 }
-
+/* LCOV_EXCL_START */
 int _bt_check_proximity_is_initialized(bool *is_initialized)
 {
        BT_CHECK_GATT_PXP_SUPPORT();
@@ -152,7 +152,7 @@ int _bt_check_proximity_is_initialized(bool *is_initialized)
 
        return BT_ERROR_NONE;
 }
-
+/* LCOV_EXCL_STOP */
 static bt_proximity_monitor_s *_bt_proximity_minotr_find(const char *remote_address)
 {
        GSList *l;
@@ -165,16 +165,7 @@ static bt_proximity_monitor_s *_bt_proximity_minotr_find(const char *remote_addr
        }
        return NULL;
 }
-
-static int _bt_proximity_monitor_addr_info_cmp(gconstpointer a1, gconstpointer a2)
-{
-       const bt_proximity_monitor_s *c = a1;
-       const bt_proximity_monitor_s *b = a2;
-
-       return g_ascii_strcasecmp(c->remote_address, b->remote_address);
-}
-
-
+/* LCOV_EXCL_START */
 int _bt_proximity_connection_set_state_changed(int result, const char *remote_address, bool connected)
 {
        int service_type = 0;
@@ -195,8 +186,6 @@ int _bt_proximity_connection_set_state_changed(int result, const char *remote_ad
                        monitor_s->connected = connected;
                        monitor_s->services_discovered = service_type;
                        pxp_monitor_supported_services = service_type;
-                       proximity_monitor_list = g_slist_insert_sorted(proximity_monitor_list,
-                                                                       monitor_s, _bt_proximity_monitor_addr_info_cmp);
                        if (monitor_s->connection_callback)
                                ((bt_proximity_monitor_connection_state_changed_cb)monitor_s->connection_callback)
                                (result, remote_address, monitor_s, connected, service_type, monitor_s->user_data);
@@ -213,7 +202,7 @@ int _bt_proximity_connection_set_state_changed(int result, const char *remote_ad
        }
        return error_code;
 }
-
+/* LCOV_EXCL_STOP */
 int bt_proximity_monitor_create(const char *remote_address, bt_proximity_monitor_h *monitor)
 {
        int error_code = BT_ERROR_NONE;
@@ -283,7 +272,7 @@ int bt_proximity_monitor_destroy(bt_proximity_monitor_h monitor)
        BT_CHECK_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(monitor); /* LCOV_EXCL_START */
 
-       if(_bt_proximity_minotr_find(monitor_s->remote_address) == NULL)
+       if (_bt_proximity_minotr_find(monitor_s->remote_address) == NULL)
                return BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED;
 
        if (monitor_s->connection_callback) {
@@ -307,8 +296,8 @@ int bt_proximity_monitor_connect(bt_proximity_monitor_h monitor)
        BT_CHECK_GATT_PXP_SUPPORT();
        BT_CHECK_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(monitor_s);
-
-       if(_bt_proximity_minotr_find(monitor_s->remote_address) == NULL)
+/* LCOV_EXCL_START */
+       if (_bt_proximity_minotr_find(monitor_s->remote_address) == NULL)
                return BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED;
 
        error_code = bt_gatt_connect(monitor_s->remote_address, FALSE);
@@ -318,7 +307,7 @@ int bt_proximity_monitor_connect(bt_proximity_monitor_h monitor)
 
        return error_code;
 }
-
+/* LCOV_EXCL_STOP */
 int bt_proximity_monitor_disconnect(bt_proximity_monitor_h monitor)
 {
        int error_code;
@@ -327,8 +316,8 @@ int bt_proximity_monitor_disconnect(bt_proximity_monitor_h monitor)
        BT_CHECK_GATT_PXP_SUPPORT();
        BT_CHECK_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(monitor_s);
-
-       if(_bt_proximity_minotr_find(monitor_s->remote_address) == NULL)
+/* LCOV_EXCL_START */
+       if (_bt_proximity_minotr_find(monitor_s->remote_address) == NULL)
                return BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED;
 
        error_code = bt_gatt_disconnect(monitor_s->remote_address);
@@ -338,7 +327,7 @@ int bt_proximity_monitor_disconnect(bt_proximity_monitor_h monitor)
 
        return error_code;
 }
-
+/* LCOV_EXCL_STOP */
 int bt_proximity_monitor_set_connection_state_changed_cb(bt_proximity_monitor_h monitor,
                                bt_proximity_monitor_connection_state_changed_cb callback, void *user_data)
 {
@@ -349,16 +338,13 @@ int bt_proximity_monitor_set_connection_state_changed_cb(bt_proximity_monitor_h
        BT_CHECK_INPUT_PARAMETER(monitor_s);
        BT_CHECK_INPUT_PARAMETER(callback);
 
-       if(_bt_proximity_minotr_find(monitor_s->remote_address) == NULL)
+       if (_bt_proximity_minotr_find(monitor_s->remote_address) == NULL)
                return BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED;
 
        /* register the callback */
        monitor_s->connection_callback = callback;
        monitor_s->user_data = user_data;
 
-       proximity_monitor_list = g_slist_insert_sorted(proximity_monitor_list,
-                                                       monitor_s, _bt_proximity_monitor_addr_info_cmp);
-
        return BT_ERROR_NONE;
 }
 
@@ -370,16 +356,13 @@ int bt_proximity_monitor_unset_connection_state_changed_cb(bt_proximity_monitor_
        BT_CHECK_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(monitor_s);
 
-       if(_bt_proximity_minotr_find(monitor_s->remote_address) == NULL)
+       if (_bt_proximity_minotr_find(monitor_s->remote_address) == NULL)
                return BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED;
 
        /* unregister the callback */
        monitor_s->connection_callback = NULL;
        monitor_s->user_data = NULL;
 
-       proximity_monitor_list = g_slist_insert_sorted(proximity_monitor_list,
-                                       monitor_s, _bt_proximity_monitor_addr_info_cmp);
-
        return BT_ERROR_NONE;
 }
 
@@ -454,14 +437,14 @@ int bt_proximity_monitor_set_linkloss_alert(bt_proximity_monitor_h monitor, int
        BT_CHECK_GATT_PXP_SUPPORT();
        BT_CHECK_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(monitor); /* LCOV_EXCL_LINE */
-
-       if(_bt_proximity_minotr_find(monitor_s->remote_address) == NULL)
+/* LCOV_EXCL_START */
+       if (_bt_proximity_minotr_find(monitor_s->remote_address) == NULL)
                return BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED;
 
        if (!(pxp_monitor_supported_services & BT_PROXIMITY_LINKLOSS_ALERT))
                return BT_ERROR_NOT_SUPPORTED;
 
-       _bt_convert_address_to_hex(&addr_hex, monitor_s->remote_address); /* LCOV_EXCL_LINE */
+       _bt_convert_address_to_hex(&addr_hex, monitor_s->remote_address);
 
        error_code = _bt_get_error_code(bluetooth_proximity_monitor_set_property(&addr_hex,
                                                BT_PROXIMITY_LINKLOSS_ALERT, value));
@@ -470,7 +453,7 @@ int bt_proximity_monitor_set_linkloss_alert(bt_proximity_monitor_h monitor, int
 
        return error_code;
 }
-
+/* LCOV_EXCL_STOP */
 int bt_proximity_monitor_set_immediate_alert(bt_proximity_monitor_h monitor, int value)
 {
        int error_code = BT_ERROR_NONE;
@@ -480,14 +463,14 @@ int bt_proximity_monitor_set_immediate_alert(bt_proximity_monitor_h monitor, int
        BT_CHECK_GATT_PXP_SUPPORT();
        BT_CHECK_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(monitor); /* LCOV_EXCL_LINE */
-
-       if(_bt_proximity_minotr_find(monitor_s->remote_address) == NULL)
+/* LCOV_EXCL_START */
+       if (_bt_proximity_minotr_find(monitor_s->remote_address) == NULL)
                return BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED;
 
        if (!(pxp_monitor_supported_services & BT_PROXIMITY_IMMEDIATE_ALERT))
                return BT_ERROR_NOT_SUPPORTED;
 
-       _bt_convert_address_to_hex(&addr_hex, monitor_s->remote_address); /* LCOV_EXCL_LINE */
+       _bt_convert_address_to_hex(&addr_hex, monitor_s->remote_address);
 
        error_code = _bt_get_error_code(bluetooth_proximity_monitor_set_property(&addr_hex,
                                                BT_PROXIMITY_IMMEDIATE_ALERT, value));
@@ -496,7 +479,7 @@ int bt_proximity_monitor_set_immediate_alert(bt_proximity_monitor_h monitor, int
 
        return error_code;
 }
-
+/* LCOV_EXCL_STOP */
 int bt_proximity_monitor_get_linkloss_alert(bt_proximity_monitor_h monitor, int *value)
 {
        int error_code = BT_ERROR_NONE;
@@ -507,7 +490,7 @@ int bt_proximity_monitor_get_linkloss_alert(bt_proximity_monitor_h monitor, int
        BT_CHECK_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(monitor); /* LCOV_EXCL_LINE */
 
-       if(_bt_proximity_minotr_find(monitor_s->remote_address) == NULL)
+       if (_bt_proximity_minotr_find(monitor_s->remote_address) == NULL)
                return BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED;
 
        if (!(pxp_monitor_supported_services & BT_PROXIMITY_LINKLOSS_ALERT))
@@ -534,7 +517,7 @@ int bt_proximity_monitor_get_immediate_alert(bt_proximity_monitor_h monitor, int
        BT_CHECK_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(monitor); /* LCOV_EXCL_LINE */
 
-       if(_bt_proximity_minotr_find(monitor_s->remote_address) == NULL)
+       if (_bt_proximity_minotr_find(monitor_s->remote_address) == NULL)
                return BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED;
 
        if (!(pxp_monitor_supported_services & BT_PROXIMITY_IMMEDIATE_ALERT))
@@ -561,7 +544,7 @@ int bt_proximity_monitor_get_signal_level(bt_proximity_monitor_h monitor, int *v
        BT_CHECK_INIT_STATUS();
        BT_CHECK_INPUT_PARAMETER(monitor); /* LCOV_EXCL_LINE */
 
-       if(_bt_proximity_minotr_find(monitor_s->remote_address) == NULL)
+       if (_bt_proximity_minotr_find(monitor_s->remote_address) == NULL)
                return BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED;
 
        if (!(pxp_monitor_supported_services & BT_PROXIMITY_TX_POWER))
diff --git a/src/bluetooth-tds.c b/src/bluetooth-tds.c
new file mode 100644 (file)
index 0000000..5445053
--- /dev/null
@@ -0,0 +1,1179 @@
+/*
+ * 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 <dlog.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <string.h>
+#include <bluetooth-api.h>
+
+#include "bluetooth.h"
+#include "bluetooth_internal.h"
+#include "bluetooth_private.h"
+
+#define BT_CHECK_TDS_SUPPORT() \
+{ \
+       BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON); \
+       BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_LE); \
+}
+
+#define BT_TDS_SERVICE_UUID "00001824-0000-1000-8000-00805f9b34fb"
+#define BT_TDS_CONTROL_POINT_UUID "00002abc-0000-1000-8000-00805f9b34fb"
+#define BT_TDS_USER_DATA_DESCRIPTOR "00002a56-0000-1000-8000-00805f9b34fb"
+
+typedef struct {
+       unsigned int tds_handle;
+       bluetooth_tds_transport_t transport;
+       bluetooth_tds_transport_state_t state;
+} bt_tds_provider_s;
+
+typedef struct bt_tds_transport_slot_s {
+       bool is_seek_ongoing;
+} bt_tds_transport_slot_s;
+
+typedef struct {
+       char *remote_address;
+       bool connected;
+
+       const void *connection_callback;
+       void *conn_cb_user_data;
+
+       const void *complete_data_callback;  /* Callback for receiving complete TDS data block */
+       void *complete_data_cb_user_data;    /* User data for complete TDS data block callback */
+
+       char *tds_service_handle;            /* TDS Primary Service Handle */
+       char *tds_control_point;             /* TDS Control Point characteristic handle */
+       char *tds_control_point_cccd;        /* TDS Control Point CCCD handle */
+       char *tds_user_data_desciptor;       /* TDS User descriptor handle: This will store the Entire TDS block data in GATT Server */
+
+       bool cccd_enabled;                   /* TDS Control Point CCCD is enabled or not */
+
+       bool tds_activation_ongoing;         /* TDS Actvation is ongoing or not */
+       void *control_point_act_cb;          /* TDS Control Point Activation Response callback */
+       void *control_point_act_user_data;   /* User data for TDS Control Point Activation Response callback*/
+
+       unsigned char *activation_data;      /* TDS Activation data */
+       int data_len;
+} bt_tds_seeker_s;
+
+gboolean tds_provider_registered = FALSE;
+GSList *providers_list;
+GSList *tds_seeker_list;
+
+static int __bt_update_tds_transport_data(bluetooth_device_address_t *address, bt_tds_seeker_s *seeker_s);
+static void __bt_tds_reset_seeker_data(bt_tds_seeker_s *seeker);
+
+int bt_tds_set_transport_activation_requested_cb(
+               bt_tds_activation_requested_cb callback, void *user_data)
+{
+       BT_CHECK_TDS_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_TDS_ACTIVATION_REQUESTED, callback, user_data);
+       return BT_ERROR_NONE;
+}
+
+int bt_tds_unset_transport_activation_requested_cb(void)
+{
+       BT_CHECK_TDS_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       _bt_unset_cb(BT_EVENT_TDS_ACTIVATION_REQUESTED);
+       return BT_ERROR_NONE;
+}
+
+int bt_tds_provider_register(void)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_TDS_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+
+       if (tds_provider_registered)
+               return BT_ERROR_ALREADY_DONE;
+
+       /* register TDS provider role here */
+       error_code = _bt_get_error_code(bluetooth_tds_provider_register());
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+               return error_code;
+       }
+
+       tds_provider_registered = TRUE;
+       return error_code;
+}
+
+int bt_tds_provider_unregister(void)
+{
+       int error_code = BT_ERROR_NONE;
+       GSList *l;
+
+       BT_CHECK_TDS_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+
+       if (!tds_provider_registered)
+               return BT_ERROR_NOT_INITIALIZED;
+
+       /* register TDS provider role here */
+       error_code = _bt_get_error_code(bluetooth_tds_provider_unregister());
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+               return error_code;
+       }
+
+       for (l = providers_list; l != NULL; l = g_slist_next(l)) {
+               bt_tds_provider_s *tds_provider = l->data;
+               g_free(tds_provider);
+       }
+       providers_list = NULL;
+
+       tds_provider_registered = FALSE;
+       return error_code;
+}
+
+int bt_tds_provider_create(bt_tds_provider_h *provider, bt_tds_transport_e transport)
+{
+       bluetooth_tds_transport_t tds_transport;
+       int error_code = BT_ERROR_NONE;
+       bt_tds_provider_s *tds_provider;
+
+       BT_CHECK_TDS_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+
+       if (!tds_provider_registered)
+               return BT_ERROR_NOT_INITIALIZED;
+
+       switch (transport) {
+       case BT_TDS_TRANSPORT_BT:
+               error_code = BT_ERROR_NOT_SUPPORTED;
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+               return error_code;
+       case BT_TDS_TRANSPORT_CUSTOM:
+               tds_transport = BLUETOOTH_TDS_TRANSPORT_CUSTOM;
+               break;
+       default:
+               error_code = BT_ERROR_INVALID_PARAMETER;
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+               return error_code;
+       }
+
+       tds_provider = g_malloc0(sizeof(bt_tds_provider_s));
+       if (!tds_provider) {
+               error_code = BT_ERROR_OUT_OF_MEMORY;
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+               return error_code;
+       }
+
+       tds_provider->tds_handle = GPOINTER_TO_INT(tds_provider);
+
+       /* register TDS provider role here */
+       error_code = _bt_get_error_code(bluetooth_tds_provider_create(tds_transport, tds_provider->tds_handle));
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+               g_free(tds_provider);
+               return error_code;
+       }
+
+       tds_provider->transport = tds_transport;
+       tds_provider->state = BLUETOOTH_TDS_TRANSPORT_STATE_OFF;
+       *provider = (bt_tds_provider_h *)tds_provider;
+       providers_list = g_slist_append(providers_list, tds_provider);
+       return error_code;
+}
+
+int bt_tds_provider_destroy(bt_tds_provider_h provider)
+{
+       bt_tds_provider_s *tds_provider;
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_TDS_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(provider);
+
+       if (!tds_provider_registered)
+               return BT_ERROR_NOT_INITIALIZED;
+
+       if (NULL == g_slist_find(providers_list, provider)) {
+               BT_ERR("g_slist_find returned NULL");
+               return BT_ERROR_NOT_INITIALIZED;
+       }
+
+       tds_provider = (bt_tds_provider_s *)provider;
+       /* Unregister TDS provider role Here */
+       error_code = _bt_get_error_code(bluetooth_tds_provider_destroy(tds_provider->tds_handle));
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+               return error_code;
+       }
+
+       providers_list = g_slist_remove(providers_list, tds_provider);
+       g_free(tds_provider);
+       return error_code;
+}
+
+int bt_tds_provider_set_transport_data(bt_tds_provider_h provider,
+               bt_tds_transport_state_e transport_state, unsigned char *buf, int length)
+{
+       bluetooth_tds_transport_state_t state;
+       bt_tds_provider_s *tds_provider;
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_TDS_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(buf);
+
+       if (!tds_provider_registered)
+               return BT_ERROR_NOT_INITIALIZED;
+
+       if (255 < length) {
+               error_code = BT_ERROR_INVALID_PARAMETER;
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+               return error_code;
+       }
+
+       switch (transport_state) {
+       case BT_TDS_TRANSPORT_STATE_OFF:
+               state = BLUETOOTH_TDS_TRANSPORT_STATE_OFF;
+               break;
+       case BT_TDS_TRANSPORT_STATE_ON:
+               state = BLUETOOTH_TDS_TRANSPORT_STATE_ON;
+               break;
+       case BT_TDS_TRANSPORT_STATE_UNAVAILABLE:
+               state = BLUETOOTH_TDS_TRANSPORT_STATE_UNAVAILABLE;
+               break;
+       default:
+               error_code = BT_ERROR_INVALID_PARAMETER;
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+               return error_code;
+       }
+
+       if (NULL == g_slist_find(providers_list, provider)) {
+               BT_ERR("g_slist_find returned NULL");
+               return BT_ERROR_NOT_INITIALIZED;
+       }
+
+       tds_provider = (bt_tds_provider_s *)provider;
+       tds_provider->state = state;
+
+       /* TDS provider: set transport data here */
+       error_code = _bt_get_error_code(
+                       bluetooth_set_tds_provider_transport_data(tds_provider->tds_handle, state, buf, length));
+       if (error_code != BT_ERROR_NONE)
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+
+       return error_code;
+}
+
+/* TODO: Add more parameters if needed */
+int bt_tds_provider_send_activation_resp(char *address, int result, bt_tds_provider_h provider)
+{
+       bluetooth_device_address_t dev_address;
+       bt_tds_provider_s *tds_provider;
+       int error_code = BT_ERROR_NONE;
+       unsigned char *buf = NULL;
+       int length = 0;
+
+       BT_CHECK_TDS_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(provider);
+       BT_CHECK_INPUT_PARAMETER(address);
+
+       if (!tds_provider_registered)
+               return BT_ERROR_NOT_INITIALIZED;
+
+       if (NULL == g_slist_find(providers_list, provider)) {
+               BT_ERR("g_slist_find returned NULL");
+               return BT_ERROR_NOT_INITIALIZED;
+       }
+
+       _bt_convert_address_to_hex(&dev_address, address);
+       tds_provider = (bt_tds_provider_s *)provider;
+
+       /* TODO: If needed, fill buf with additional params */
+
+       /* TDS provider: send tds activation response */
+       error_code = _bt_get_error_code(bluetooth_send_tds_activation_response(
+                               &dev_address, tds_provider->tds_handle, result, buf, length));
+       if (error_code != BT_ERROR_NONE)
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+               return error_code;
+
+       return error_code;
+}
+
+int bt_tds_provider_set_manufacturer_data(unsigned char *buf, int length)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_TDS_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(buf);
+
+       if (!tds_provider_registered)
+               return BT_ERROR_NOT_INITIALIZED;
+
+       if (29 < length) {
+               error_code = BT_ERROR_INVALID_PARAMETER;
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+               return error_code;
+       }
+
+       /* TDS provider: set manufacturer data here */
+       error_code = _bt_get_error_code(
+                       bluetooth_set_tds_provider_manuf_data(buf, length));
+       if (error_code != BT_ERROR_NONE)
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+
+       return error_code;
+}
+
+static bt_tds_seeker_s *_bt_tds_seeker_find(const char *remote_address)
+{
+       GSList *l;
+
+       for (l = tds_seeker_list; l; l = g_slist_next(l)) {
+
+               if (!g_ascii_strcasecmp(((bt_tds_seeker_s *)l->data)->remote_address, remote_address))
+                       return ((bt_tds_seeker_s *)l->data);
+       }
+       return NULL;
+}
+
+static void __bt_tds_free_transport_data(bt_tds_transport_block_list_s *info)
+{
+       int k;
+
+       if (info == NULL)
+               return;
+
+       for (k = 0; k < info->num_transport_block; k++) {
+               g_free(info->data[k]->data);
+               g_free(info->data[k]);
+       }
+
+       g_free(info);
+}
+
+void _bt_tds_check_service_changed(char *address, bt_gatt_service_change_t *service_change)
+{
+       bt_tds_seeker_s *seeker_s = NULL;
+       int error_code = BLUETOOTH_ERROR_NONE;
+       bluetooth_device_address_t addr_hex = { {0,} };
+       if (!address) {
+               BT_ERR("Abnormal Result!!");
+               return;
+       }
+       seeker_s = _bt_tds_seeker_find(address);
+       BT_DBG("GATT Service state changed [%d]", service_change->change_type);
+       BT_DBG("GATT Service [%s]", service_change->svc_path);
+       if (seeker_s) {
+               if (service_change->change_type ==  BLUETOOTH_GATT_SERVICE_CHANGE_TYPE_REMOVE) {
+                       if (seeker_s->tds_service_handle &&
+                                       g_strcmp0(seeker_s->tds_service_handle, service_change->svc_path) == 0) {
+                               BT_ERR("TDS Primary Service removed abnormally from Remote Provider [%s]", address);
+                               __bt_tds_reset_seeker_data(seeker_s);
+                       }
+               } else {
+                       _bt_convert_address_to_hex(&addr_hex, address);
+
+                       /* Attempt to update TDS Service data if service added is TDS service */
+                       if (__bt_update_tds_transport_data(&addr_hex, seeker_s) == BLUETOOTH_ERROR_NONE) {
+                               BT_INFO("TDS Primary Service added in Remote Provider [%s]", address);
+                               /* Set Service changed Watcher */
+                               error_code = bluetooth_gatt_set_service_change_watcher(&addr_hex, true);
+                               if (error_code != BLUETOOTH_ERROR_NONE)
+                                       BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+                       }
+               }
+       }
+       BT_DBG("-");
+}
+
+void _bt_tds_send_complete_transport_data(int result, const char *address, char *data, int data_len)
+{
+       bt_tds_seeker_s *seeker_s = NULL;
+
+       if (!address) {
+               BT_ERR("Abnormal Result!!");
+               return;
+       }
+
+       seeker_s = _bt_tds_seeker_find(address);
+
+       if (seeker_s && (seeker_s)->complete_data_callback) {
+               BT_DBG("Complete TDS Data recv callback is set by app");
+
+               if (result == BT_ERROR_NONE) {
+                       bt_tds_transport_block_list_s *info = g_malloc0(sizeof(bt_tds_transport_block_list_s));
+
+                       if (_bt_tds_parse_transport_blocks(&info, data, data_len) == BT_ERROR_NONE) {
+                               ((bt_tds_seeker_complete_transport_data_cb)((seeker_s)->complete_data_callback))(result,
+                               address, info,
+                               (seeker_s)->complete_data_cb_user_data);
+                       } else {
+                               BT_ERR("Error parsing data blocks");
+                               ((bt_tds_seeker_complete_transport_data_cb)((seeker_s)->complete_data_callback))(result,
+                               address, NULL,
+                               (seeker_s)->complete_data_cb_user_data);
+                       }
+                       __bt_tds_free_transport_data(info);
+               } else {
+                       BT_ERR("TDS Data read failed!!");
+                       ((bt_tds_seeker_complete_transport_data_cb)((seeker_s)->complete_data_callback))(result,
+                       address, NULL,
+                       (seeker_s)->complete_data_cb_user_data);
+               }
+       }
+}
+
+void _bt_tds_control_point_indication_response_update(const char *address, bluetooth_tds_indication_res_t *info)
+{
+       bt_tds_seeker_s *seeker_s = NULL;
+
+       if (!address) {
+               BT_ERR("Abnormal Result!!");
+               return;
+       }
+
+       seeker_s = _bt_tds_seeker_find(address);
+       int result = BT_ERROR_NONE;
+       int k;
+
+       if (seeker_s) {
+               BT_DBG("TDS Control point Activation Indication Response");
+               BT_DBG("Data length [%d]", info->tds_data.length);
+               BT_DBG("Address[%s]", address);
+
+               /* DEBUG */
+               for (k = 0; k < info->tds_data.length; k++)
+                       BT_DBG("Data[%d] [0x%x]", info->tds_data.data[k]);
+
+               if (seeker_s->tds_activation_ongoing == true) {
+                       (seeker_s)->tds_activation_ongoing = false;
+
+                       if (info->tds_data.length < 2)
+                               result = BT_ERROR_OPERATION_FAILED;
+                       else {
+                               if (info->tds_data.data[1] == 0x00) {
+                                       BT_DBG("Provider has enabled transport");
+                                       result = BT_ERROR_NONE;
+                               } else
+                                       result = BT_ERROR_OPERATION_FAILED;
+                       }
+
+                       if ((seeker_s)->control_point_act_cb)
+                               ((bt_tds_control_point_activation_indication_cb)((seeker_s)->control_point_act_cb))(result,
+                               address, info->tds_data.data, info->tds_data.length, (seeker_s)->control_point_act_user_data);
+                       if (seeker_s->activation_data) {
+                               g_free(seeker_s->activation_data);
+                               seeker_s->activation_data = NULL;
+                       }
+               }
+       }
+}
+
+void _bt_tds_control_point_activation_result_update(int result, const char *remote_address)
+{
+       bt_tds_seeker_s *seeker_s = NULL;
+       if (!remote_address) {
+               BT_ERR("Abnormal Result!!");
+               return;
+       }
+       seeker_s = _bt_tds_seeker_find(remote_address);
+
+       if (seeker_s) {
+               BT_DBG("TDS Control point Activation response [%d] address [%s]", result, remote_address);
+
+               if ((seeker_s)->tds_activation_ongoing == true) {
+                       /* Send Pending Activation Request callback with error */
+                       if (result != BT_ERROR_NONE) {
+                               (seeker_s)->tds_activation_ongoing = false;
+                               if ((seeker_s)->control_point_act_cb)
+                                       ((bt_tds_control_point_activation_indication_cb)((seeker_s)->control_point_act_cb))(BT_ERROR_OPERATION_FAILED,
+                                       remote_address, NULL, 0, (seeker_s)->control_point_act_user_data);
+                               if (seeker_s->activation_data) {
+                                       g_free(seeker_s->activation_data);
+                                       seeker_s->activation_data = NULL;
+                               }
+                               return;
+                       } else
+                               BT_DBG("TDS Activation request successfully accepted by Provider, wait for Indication");
+               } else
+                       BT_DBG("TDS Control point activation request is not ongoing");
+       }
+}
+
+void _bt_tds_control_point_enabled_update(int result, const char *remote_address)
+{
+       bt_tds_seeker_s *seeker_s = NULL;
+       if (!remote_address) {
+               BT_ERR("Abnormal Result!!");
+               return;
+       }
+       seeker_s = _bt_tds_seeker_find(remote_address);
+       int ret = BT_ERROR_NONE;
+       bluetooth_device_address_t addr_hex = { {0,} };
+       _bt_convert_address_to_hex(&addr_hex, remote_address);
+
+       if (seeker_s) {
+               BT_DBG("TDS Control point Enable result [%d] address [%s]", result, remote_address);
+
+               /* Send Pending Activation Request callback with error */
+               if (result != BT_ERROR_NONE) {
+                       (seeker_s)->tds_activation_ongoing = false;
+
+                       if ((seeker_s)->control_point_act_cb)
+                               ((bt_tds_control_point_activation_indication_cb)((seeker_s)->control_point_act_cb))(BT_ERROR_OPERATION_FAILED,
+                               remote_address, NULL, 0, (seeker_s)->control_point_act_user_data);
+
+                       if (seeker_s->activation_data) {
+                               g_free(seeker_s->activation_data);
+                               seeker_s->activation_data = NULL;
+                       }
+                       return;
+               } else {
+                       BT_DBG("TDS Control Point enabled successfully!!");
+                       seeker_s->cccd_enabled = true;
+                       ret = _bt_get_error_code(bluetooth_tds_activate_control_point(&addr_hex,
+                                               seeker_s->tds_control_point, seeker_s->activation_data,
+                                               seeker_s->data_len));
+                       if (ret != BT_ERROR_NONE) {
+                               (seeker_s)->tds_activation_ongoing = false;
+
+                               if ((seeker_s)->control_point_act_cb)
+                                       ((bt_tds_control_point_activation_indication_cb)((seeker_s)->control_point_act_cb))(BT_ERROR_OPERATION_FAILED,
+                                       remote_address, NULL, 0, (seeker_s)->control_point_act_user_data);
+
+                               if (seeker_s->activation_data) {
+                                       g_free(seeker_s->activation_data);
+                                       seeker_s->activation_data = NULL;
+                               }
+                       }
+                       BT_DBG("Activation request sent, wait for response and Indication");
+               }
+       }
+}
+
+int _bt_tds_parse_transport_blocks(bt_tds_transport_block_list_s **info,
+               char *data, int data_len)
+{
+       int numblocks = 0;
+       int index = 2;
+       uint8_t flags;
+       int k;
+       GSList *info_list = NULL;
+       GSList *l = NULL;
+
+       if (data_len < 3) {
+               BT_ERR("Invalid TDS data, can not process!!");
+               return BT_ERROR_INVALID_PARAMETER;
+       }
+
+       tds_transport_data_s *td;
+
+       while (index < data_len) {
+
+               /* Check if Provider Role is supported by Remote */
+               flags = data[index-1];
+
+               if (!(flags & 0x02)) {
+                       /* Move to Next Block */
+                       index = index + data[index] + 3;
+                       BT_ERR("TDS Block is not Provider Role");
+                       continue;
+               }
+
+               td = g_malloc(sizeof(tds_transport_data_s));
+               td->length = data[index];
+
+               td->data = g_malloc0(td->length);
+
+               /* Fill Transport Block Data excluding Flag and Org ID */
+               for (k = 0; k < td->length; k++)
+                       td->data[k] = data[k+index+1];
+
+               /* Get Transport Name  */
+               td->transport = data[index -2];
+
+               /* Get Transport Data Block Incomplete status */
+               if (flags & 0x04)
+                       td->is_data_complete = false;
+               else
+                       td->is_data_complete = true;
+
+               /* Get Transport's current state */
+               if (flags & 0x08)
+                       td->state = BT_TDS_TRANSPORT_STATE_ON;
+               else if (flags & 0x10)
+                       td->state = BT_TDS_TRANSPORT_STATE_UNAVAILABLE;
+               else
+                       td->state = BT_TDS_TRANSPORT_STATE_OFF;
+
+               /* Move to Next Block */
+               index = index + data[index] + 3;
+               info_list = g_slist_append(info_list, td);
+
+               (*info)->num_transport_block = ++numblocks;
+               BT_DBG("Transport Block data length [%d] Flags [0x%x] Transport Name [0x%x] Block Num [%d]",
+                               td->length, flags, td->transport, numblocks);
+
+       }
+
+       if (info_list != NULL) {
+               (*info)->data = (tds_transport_data_s**)g_malloc0(g_slist_length(info_list) * sizeof(tds_transport_data_s));
+               for (l = info_list, k = 0; l; l = g_slist_next(l), k++)
+                       (*info)->data[k] = (tds_transport_data_s*)l->data;
+               return BT_ERROR_NONE;
+       }
+       return BT_ERROR_NO_DATA;
+}
+
+static void __bt_tds_reset_seeker_data(bt_tds_seeker_s *seeker)
+{
+       if ((seeker)->tds_control_point) {
+               g_free((seeker)->tds_control_point);
+               (seeker)->tds_control_point = NULL;
+       }
+
+       if ((seeker)->tds_control_point_cccd) {
+               g_free((seeker)->tds_control_point_cccd);
+               (seeker)->tds_control_point_cccd = NULL;
+       }
+
+       if ((seeker)->tds_user_data_desciptor) {
+               g_free((seeker)->tds_user_data_desciptor);
+               (seeker)->tds_user_data_desciptor = NULL;
+       }
+
+       if ((seeker)->tds_service_handle) {
+               g_free((seeker)->tds_service_handle);
+               (seeker)->tds_service_handle = NULL;
+       }
+
+       if ((seeker)->activation_data) {
+               g_free((seeker)->activation_data);
+               (seeker)->activation_data = NULL;
+       }
+
+       /* Reset CCCD */
+       (seeker)->cccd_enabled = false;
+}
+
+void _bt_tds_update_seeker_connection_state_changed(int result,
+               const char *remote_address, bool connected)
+{
+       int error_code = BLUETOOTH_ERROR_NONE;
+       bt_tds_seeker_s *seeker_s = NULL;
+       BT_DBG("TDS Seeker Connection state changed result [%d] connected [%d]", result, connected ? TRUE : FALSE);
+
+       /* GATT Connect Request failed */
+       seeker_s = _bt_tds_seeker_find(remote_address);
+       if (seeker_s) {
+               BT_DBG("Seeker found against address [%s]", remote_address);
+
+               bluetooth_device_address_t addr_hex = { {0,} };
+               _bt_convert_address_to_hex(&addr_hex, remote_address);
+
+               if (result != BT_ERROR_NONE) {
+                       BT_ERR("GATT Connect Request failed Address [%s]", remote_address);
+                       __bt_tds_reset_seeker_data(seeker_s);
+                       bluetooth_gatt_set_service_change_watcher(&addr_hex, false);
+
+                       if ((seeker_s)->connection_callback)
+                               ((bt_tds_seeker_connection_state_changed_cb)(seeker_s)->connection_callback)
+                                       (result, remote_address, seeker_s, connected, (seeker_s)->conn_cb_user_data);
+                       return;
+               }
+               /* Update TDS Control point values */
+               if (connected) {
+                       BT_DBG("Remote Provider connected successfully");
+                       /* Attempt to update TDS Service data */
+                       error_code = __bt_update_tds_transport_data(&addr_hex, seeker_s);
+                       if (error_code != BLUETOOTH_ERROR_NONE)
+                               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+
+                       /* Set Service changed Watcher */
+                       error_code = bluetooth_gatt_set_service_change_watcher(&addr_hex, true);
+                       if (error_code != BLUETOOTH_ERROR_NONE)
+                               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+               } else {
+                       BT_DBG("Remote Provider disconnected successfully");
+                       /* Disconnected */
+                       __bt_tds_reset_seeker_data(seeker_s);
+                       bluetooth_gatt_set_service_change_watcher(&addr_hex, false);
+               }
+               (seeker_s)->connected = connected;
+
+               if ((seeker_s)->connection_callback)
+                       ((bt_tds_seeker_connection_state_changed_cb)(seeker_s)->connection_callback)
+                               (result, remote_address, seeker_s, connected, (seeker_s)->conn_cb_user_data);
+       } else {
+               BT_DBG("TDS Seeker not found!");
+       }
+}
+
+int bt_tds_start_seeking_providers(bt_tds_provider_scan_result_cb cb, void *user_data)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_TDS_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(cb);
+       BT_DBG("+");
+
+       /* LE Event handler registered */
+       if (_bt_le_adapter_init() != BLUETOOTH_ERROR_NONE)
+               return BT_ERROR_OPERATION_FAILED;
+
+       /* Start LE discovery with default scan params if already not started */
+       if (bluetooth_is_le_scanning() == false)
+               error_code = _bt_get_error_code(bluetooth_start_le_discovery());
+
+       if (error_code != BT_ERROR_NONE &&
+                       error_code != BT_ERROR_NOW_IN_PROGRESS) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
+                               error_code);
+       } else {
+               BT_DBG("LE Discovery ON..Wait for TDS Configuration Service from Remote Providers");
+               _bt_set_cb(BT_EVENT_TDS_PROVIDER_FOUND_RESULT, cb, user_data);
+       }
+
+       return error_code;
+}
+
+int bt_tds_stop_seeking_providers(void)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_TDS_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_DBG("+");
+
+       if (bluetooth_is_le_scanning() == true)
+               error_code = _bt_get_error_code(bluetooth_stop_le_discovery());
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
+                               error_code);
+       }
+
+       _bt_unset_cb(BT_EVENT_TDS_PROVIDER_FOUND_RESULT);
+       return BT_ERROR_NONE;
+}
+
+static int __bt_update_tds_transport_data(bluetooth_device_address_t *address, bt_tds_seeker_s *seeker_s)
+{
+       int ret = BLUETOOTH_ERROR_INTERNAL;
+       bt_gatt_service_property_t service;
+       int count;
+
+       ret = bluetooth_gatt_get_service_from_uuid(address, BT_TDS_SERVICE_UUID, &service);
+       if (ret != BLUETOOTH_ERROR_NONE) {
+               BT_ERR("Failed to find TDS configuration service");
+               return ret;
+       }
+
+       /* Find all characteristics of TDS service and their properties  */
+       for (count = 0; count < service.char_handle.count; count++) {
+               bt_gatt_char_property_t characteristic;
+               memset(&characteristic, 0x00, sizeof(characteristic));
+
+               BT_DBG("Get properties for Char [%s]", service.char_handle.handle[count]);
+
+               ret = bluetooth_gatt_get_characteristics_property(service.char_handle.handle[count],
+                               &characteristic);
+
+               if (ret != BLUETOOTH_ERROR_NONE) {
+                       BT_ERR("Get characteristic property failed(0x%08x)", ret);
+                       bluetooth_gatt_free_service_property(&service);
+                       bluetooth_gatt_free_char_property(&characteristic);
+                       goto fail;
+               } else {
+                       if (g_strstr_len(characteristic.uuid, -1, BT_TDS_CONTROL_POINT_UUID)) {
+                               BT_DBG("TDS Control point discovered ");
+                               bt_gatt_char_descriptor_property_t desc_property;
+                               memset(&desc_property, 0x00, sizeof(desc_property));
+
+
+                               /* Get CCCD for Control Point */
+                               ret = bluetooth_gatt_get_char_descriptor_property(
+                                               characteristic.char_desc_handle.handle[0], &desc_property);
+
+                               if (ret != BLUETOOTH_ERROR_NONE) {
+                                       BT_ERR("Failed to discover CCCD for TDS Control point");
+                                       bluetooth_gatt_free_service_property(&service);
+                                       bluetooth_gatt_free_char_property(&characteristic);
+                                       bluetooth_gatt_free_desc_property(&desc_property);
+                                       goto fail;
+                               }
+                               if ((seeker_s)->tds_control_point)
+                                       g_free((seeker_s)->tds_control_point);
+                               (seeker_s)->tds_control_point = g_strdup(characteristic.handle);
+
+                               if ((seeker_s)->tds_control_point_cccd)
+                                       g_free((seeker_s)->tds_control_point_cccd);
+                               (seeker_s)->tds_control_point_cccd = g_strdup(desc_property.handle);
+
+                               BT_DBG("TDS Control point handle [%s]", (seeker_s)->tds_control_point);
+                               BT_DBG("TDS Control point CCCD handle [%s]", (seeker_s)->tds_control_point_cccd);
+                       } else {
+                               /* Fetch Descriptors for the discovered characteristic */
+                               int c;
+                               int p;
+
+                               for (c = 0; c < characteristic.char_desc_handle.count; c++) {
+
+                                       bt_gatt_char_descriptor_property_t desc_property;
+                                       memset(&desc_property, 0x00, sizeof(desc_property));
+
+                                       ret = bluetooth_gatt_get_char_descriptor_property(
+                                                       characteristic.char_desc_handle.handle[c], &desc_property);
+
+                                       if (ret != BLUETOOTH_ERROR_NONE) {
+                                               BT_ERR("Failed to discover Descriptor Property for characteristic [%s]",
+                                                               characteristic.handle);
+                                               bluetooth_gatt_free_service_property(&service);
+                                               bluetooth_gatt_free_char_property(&characteristic);
+                                               bluetooth_gatt_free_desc_property(&desc_property);
+                                               goto fail;
+                                       } else {
+                                               /* Descriptor property discovered */
+                                               BT_DBG("Descriptor handle  [%s]", desc_property.handle);
+                                               BT_DBG("Descriptor UUID    [%s]", desc_property.uuid);
+                                               BT_DBG("Descriptor val len [%d]", desc_property.val_len);
+
+                                               if (g_strstr_len(desc_property.uuid, -1, BT_TDS_USER_DATA_DESCRIPTOR)) {
+                                                       BT_DBG("User data descriptor handle discovered");
+                                                       if ((seeker_s)->tds_user_data_desciptor)
+                                                               g_free((seeker_s)->tds_user_data_desciptor);
+                                                       (seeker_s)->tds_user_data_desciptor = g_strdup(desc_property.handle);
+                                               }
+
+                                               for (p = 0; p < desc_property.val_len; p++)
+                                                       BT_DBG("Descriptor data[%d] = [0x%x]", p, desc_property.val[p]);
+                                       } /* Descriptor property get successful */
+                                       bluetooth_gatt_free_desc_property(&desc_property);
+                               } /* Next Descriptor */
+                       } /* Control Point characteristic */
+               } /* Characteristic property get successful */
+               bluetooth_gatt_free_char_property(&characteristic);
+       } /* Next Charatceristic */
+
+       if ((seeker_s)->tds_service_handle)
+               g_free((seeker_s)->tds_service_handle);
+
+       (seeker_s)->tds_service_handle = g_strdup(service.handle);
+       bluetooth_gatt_free_service_property(&service);
+       return ret;
+fail:
+       __bt_tds_reset_seeker_data(seeker_s);
+       return ret;
+}
+
+int bt_tds_seeker_set_connection_state_changed_cb(bt_tds_seeker_h seeker,
+                       bt_tds_seeker_connection_state_changed_cb callback, void *user_data)
+{
+       bt_tds_seeker_s *seeker_s = (bt_tds_seeker_s *)seeker;
+
+       BT_CHECK_TDS_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(seeker_s);
+       BT_CHECK_INPUT_PARAMETER(callback);
+
+       if (_bt_tds_seeker_find(seeker_s->remote_address) == NULL)
+               return BT_ERROR_NOT_INITIALIZED;
+
+       BT_DBG("Set TDS Seeker Connection State changed callback");
+       /* register the callback */
+       seeker_s->connection_callback = callback;
+       seeker_s->conn_cb_user_data = user_data;
+
+       return BT_ERROR_NONE;
+}
+
+int bt_tds_seeker_unset_connection_state_changed_cb(bt_tds_seeker_h seeker)
+{
+       bt_tds_seeker_s *seeker_s = (bt_tds_seeker_s *)seeker;
+
+       BT_CHECK_TDS_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(seeker_s);
+
+       if (_bt_tds_seeker_find(seeker_s->remote_address) == NULL)
+               return BT_ERROR_NOT_INITIALIZED;
+
+       BT_DBG("UnSet TDS Seeker Connection State changed callback");
+       /* unregister the callback */
+       seeker_s->connection_callback = NULL;
+       seeker_s->conn_cb_user_data = NULL;
+
+       return BT_ERROR_NONE;
+}
+
+int bt_tds_seeker_activate_control_point(bt_tds_seeker_h seeker,
+                               bt_tds_transport_e transport, unsigned char *buffer, int len,
+                               bt_tds_control_point_activation_indication_cb callback, void *user_data)
+{
+       bt_tds_seeker_s *seeker_s = (bt_tds_seeker_s *)seeker;
+       bluetooth_device_address_t addr_hex = { {0,} };
+       int ret = BT_ERROR_NONE;
+       unsigned char *buf;
+
+       BT_CHECK_TDS_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(seeker_s);
+       BT_CHECK_INPUT_PARAMETER(buffer);
+       BT_CHECK_INPUT_PARAMETER(callback);
+
+       if (len > 255)
+               return BT_ERROR_INVALID_PARAMETER;
+
+       if (_bt_tds_seeker_find(seeker_s->remote_address) == NULL)
+               return BT_ERROR_NOT_INITIALIZED;
+
+       if (seeker_s->connected == false)
+               return BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED;
+
+       if (seeker_s->tds_activation_ongoing == true)
+               return BT_ERROR_NOW_IN_PROGRESS;
+
+       /* Check if both TDS Control Point char & Control Point CCCD are valid or discovered */
+       if (!(seeker_s->tds_control_point) ||
+                       !(seeker_s->tds_control_point_cccd))
+               return BT_ERROR_OPERATION_FAILED;
+
+       BT_DBG("Activate Control Point [%s] transport [%d] current CCCD state [%d]",
+                               seeker_s->remote_address, transport, seeker_s->cccd_enabled);
+
+       _bt_convert_address_to_hex(&addr_hex, seeker_s->remote_address);
+
+       /* Activate Control Point */
+       buf = g_malloc0(len+2);
+
+       buf[0] = 0x01; /* Activate control point Opcode */
+       buf[1] = transport; /* Activate control point Opcode */
+       memcpy(buf+2, buffer, len);
+
+       /* Check if TDS control Point is already enabled or not */
+       if (seeker_s->cccd_enabled == FALSE) {
+               /* Enable TDS Control point CCCD to enable */
+               BT_DBG("TDS Control point is disabled, enable it");
+               ret = _bt_get_error_code(bluetooth_tds_enable_control_point(&addr_hex, seeker_s->tds_control_point));
+               if (ret != BT_ERROR_NONE) {
+                       BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+                       g_free(buf);
+                       return ret;
+               }
+       } else {
+               BT_DBG("TDS Control point is already enabled");
+               ret = _bt_get_error_code(bluetooth_tds_activate_control_point(&addr_hex, seeker_s->tds_control_point, buf, len));
+               if (ret != BT_ERROR_NONE) {
+                       BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+                       g_free(buf);
+                       return ret;
+               }
+       }
+
+       /* Register the callback */
+       seeker_s->tds_activation_ongoing = true;
+       seeker_s->control_point_act_cb = callback;
+       seeker_s->control_point_act_user_data = user_data;
+
+       /* Save actvation data and trigger when CCCD is actually enabled */
+       seeker_s->activation_data = buf;
+       seeker_s->data_len = len;
+
+       BT_DBG("-");
+       return ret;
+}
+
+int bt_tds_seeker_get_complete_transport_blocks(bt_tds_seeker_h seeker,
+                               bt_tds_seeker_complete_transport_data_cb callback, void *user_data)
+{
+       bt_tds_seeker_s *seeker_s = (bt_tds_seeker_s *)seeker;
+       bluetooth_device_address_t addr_hex = { {0,} };
+       int ret = BT_ERROR_NONE;
+
+       BT_CHECK_TDS_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(seeker_s);
+       BT_CHECK_INPUT_PARAMETER(callback);
+
+       if (_bt_tds_seeker_find(seeker_s->remote_address) == NULL)
+               return BT_ERROR_NOT_INITIALIZED;
+
+       if (seeker_s->connected == false)
+               return BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED;
+
+       if (!seeker_s->tds_user_data_desciptor)
+               return BT_ERROR_OPERATION_FAILED;
+
+       BT_DBG("Set TDS Seeker Get complete callback");
+       _bt_convert_address_to_hex(&addr_hex, seeker_s->remote_address);
+
+       /* Read Data from Transport Data block desciptor */
+       ret = _bt_get_error_code(bluetooth_tds_read_transport_data(&addr_hex, seeker_s->tds_user_data_desciptor));
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+               return ret;
+       }
+       /* register the callback */
+       seeker_s->complete_data_callback = callback;
+       seeker_s->complete_data_cb_user_data = user_data;
+
+       return ret;
+}
+
+int bt_tds_seeker_create(const char *remote_address, bt_tds_seeker_h *seeker)
+{
+       int error_code = BT_ERROR_NONE;
+       bt_tds_seeker_s *seeker_s = NULL;
+       bool connected = false;
+       bluetooth_device_address_t addr_hex = { {0,} };
+       GSList *l;
+       BT_INFO("+");
+
+       BT_CHECK_TDS_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(remote_address);
+       BT_CHECK_INPUT_PARAMETER(seeker);
+
+       for (l = tds_seeker_list; l; l = g_slist_next(l)) {
+               bt_tds_seeker_s *c = (bt_tds_seeker_s *)l->data;
+
+               if (!g_ascii_strcasecmp(c->remote_address, remote_address)) {
+                       BT_ERR("TDS Seeker for Remote Provider [%s] is already created",
+                                       remote_address);
+                       *seeker = (bt_tds_seeker_h)c;
+                       return BT_ERROR_ALREADY_DONE;
+               }
+       }
+
+       seeker_s = g_malloc0(sizeof(*seeker_s));
+       if (seeker_s == NULL) {
+               error_code = BT_ERROR_OUT_OF_MEMORY;
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+               return error_code;
+       }
+
+       if (bt_device_is_profile_connected(remote_address, BT_PROFILE_GATT,
+                               &connected) != BT_ERROR_NONE)
+               BT_ERR("bt_device_is_profile_connected is failed");
+       seeker_s->connected = connected;
+
+       _bt_convert_address_to_hex(&addr_hex, remote_address);
+
+       if (seeker_s->connected == true) {
+               error_code = __bt_update_tds_transport_data(&addr_hex, seeker_s);
+               if (error_code != BLUETOOTH_ERROR_NONE) {
+                       g_free(seeker_s);
+                       return BT_ERROR_OPERATION_FAILED;
+               }
+               error_code = bluetooth_gatt_set_service_change_watcher(&addr_hex, true);
+               if (error_code != BLUETOOTH_ERROR_NONE) {
+                       g_free(seeker_s);
+                       return BT_ERROR_OPERATION_FAILED;
+               }
+       }
+
+       seeker_s->remote_address = g_strdup(remote_address);
+       if (seeker_s->remote_address == NULL) {
+               free(seeker_s);
+               error_code = BT_ERROR_OUT_OF_MEMORY;
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+               return error_code;
+       }
+
+       seeker_s->cccd_enabled = FALSE;
+       seeker_s->activation_data = NULL;
+
+       tds_seeker_list = g_slist_append(tds_seeker_list, seeker_s);
+       *seeker = (bt_tds_seeker_h)seeker_s;
+
+       BT_DBG("TDS Seeker Created");
+       return BT_ERROR_NONE;
+}
+
+int bt_tds_seeker_destroy(bt_tds_seeker_h seeker)
+{
+       bt_tds_seeker_s *seeker_s = (bt_tds_seeker_s *)seeker;
+
+       BT_CHECK_TDS_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(seeker_s);
+
+       if (_bt_tds_seeker_find(seeker_s->remote_address) == NULL)
+               return BT_ERROR_NOT_INITIALIZED;
+
+       BT_DBG("TDS Seeker destroy Remote Provider [%s]", seeker_s->remote_address);
+       __bt_tds_reset_seeker_data(seeker_s);
+
+       tds_seeker_list = g_slist_remove(tds_seeker_list, seeker_s);
+       g_free(seeker_s);
+       seeker_s = NULL;
+
+       return BT_ERROR_NONE;
+}
+
+int bt_tds_seeker_connect(bt_tds_seeker_h seeker)
+{
+       int error_code;
+       bt_tds_seeker_s *seeker_s = (bt_tds_seeker_s *)seeker;
+
+       BT_CHECK_TDS_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(seeker_s);
+
+       if (_bt_tds_seeker_find(seeker_s->remote_address) == NULL)
+               return BT_ERROR_NOT_INITIALIZED;
+
+       if (seeker_s->connected)
+               return BT_ERROR_NONE;
+
+       BT_DBG("TDS Seeker connect Remote Provider [%s]", seeker_s->remote_address);
+       error_code = bt_gatt_connect(seeker_s->remote_address, FALSE);
+
+       if (error_code != BT_ERROR_NONE)
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+
+       return error_code;
+}
+
+int bt_tds_seeker_disconnect(bt_tds_seeker_h seeker)
+{
+       int error_code;
+       bt_tds_seeker_s *seeker_s = (bt_tds_seeker_s *)seeker;
+
+       BT_CHECK_TDS_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(seeker_s);
+
+       if (_bt_tds_seeker_find(seeker_s->remote_address) == NULL)
+               return BT_ERROR_NOT_INITIALIZED;
+
+       if (seeker_s->connected == false) {
+               BT_ERR("Remote Provider [%s] is not conencted", seeker_s->remote_address);
+               return BT_ERROR_OPERATION_FAILED;
+       }
+
+       BT_DBG("TDS Seeker Disconnect Remote Provider [%s]", seeker_s->remote_address);
+       error_code = bt_gatt_disconnect(seeker_s->remote_address);
+
+       if (error_code != BT_ERROR_NONE)
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+
+       return error_code;
+}
index d65a13c1f3fa355f38ba561c57bd0b94c7baafa9..5a69058c332470b5a36ecf1e7e51069e7b729498 100644 (file)
@@ -121,6 +121,10 @@ bt_proximity_reporter_h reporter;
 bt_proximity_monitor_h monitor;
 bt_scan_filter_h pxp_scan_filter;
 
+bt_tds_provider_h provider;
+char *tds_act_address;
+bt_tds_seeker_h seeker;
+
 bt_gatt_attribute_h service_clone[MAX_SERVICES];
 bt_gatt_attribute_h characteristics[MAX_SERVICES];
 bt_gatt_attribute_h characteristics_services[MAX_SERVICES];
@@ -177,6 +181,10 @@ tc_table_t tc_main[] = {
                , BT_UNIT_TEST_TABLE_PBAP_CLIENT},
        {"etc.(Automated test, AppControl)"
                , BT_UNIT_TEST_TABLE_ETC},
+       {"TDS Provider"
+               , BT_UNIT_TEST_TABLE_TDS_PROVIDER},
+       {"TDS Seeker"
+               , BT_UNIT_TEST_TABLE_TDS_SEEKER},
        {"Initialize All"
                , BT_UNIT_TEST_FUNCTION_INITIALIZE_ALL},
        {"FINISH"
@@ -509,6 +517,8 @@ tc_table_t tc_audio[] = {
                , BT_UNIT_TEST_FUNCTION_AG_SET_CALL_HANDLING_EVENT_CB},
        {"bt_ag_is_nrec_enabled"
                , BT_UNIT_TEST_FUNCTION_AG_IS_NREC_ENABLED},
+       {"bt_ag_switch_headset"
+               , BT_UNIT_TEST_FUNCTION_AG_SWITCH_HEADSET},
 
        /* A2DP SCMS-T functions */
        {"Select this menu to set parameters and then select the function again."
@@ -1073,6 +1083,59 @@ tc_table_t tc_pbap_client[] = {
        {NULL                                   , 0x0000},
 };
 
+tc_table_t tc_tds_provider[] = {
+       /* TDS provider functions */
+       {"BACK"
+               , BT_UNIT_TEST_FUNCTION_BACK},
+       {"TDS Provider(Register)"
+               , BT_UNIT_TEST_FUNCTION_TDS_PROVIDER_REGISTER},
+       {"TDS Provider(Unregister)"
+               , BT_UNIT_TEST_FUNCTION_TDS_PROVIDER_UNREGISTER},
+       {"TDS Provider set activation req callback"
+               , BT_UNIT_TEST_FUNCTION_TDS_PROVIDER_SET_ACT_REQ_CB},
+       {"TDS Provider unset activation req callback"
+               , BT_UNIT_TEST_FUNCTION_TDS_PROVIDER_UNSET_ACT_REQ_CB},
+       {"TDS CUSTOM Provider(Create)"
+               , BT_UNIT_TEST_FUNCTION_TDS_CUSTOM_PROVIDER_CREATE},
+       {"TDS CUSTOM Provider(Destroy)"
+               , BT_UNIT_TEST_FUNCTION_TDS_CUSTOM_PROVIDER_DESTROY},
+       {"TDS CUSTOM Provider(Set transport Data)"
+               , BT_UNIT_TEST_FUNCTION_TDS_CUSTOM_PROVIDER_SET_TRANSPORT_DATA},
+       {"TDS CUSTOM Provider(Set manuf Data)"
+               , BT_UNIT_TEST_FUNCTION_TDS_CUSTOM_PROVIDER_SET_MANUF_DATA},
+       {"TDS CUSTOM Provider(Send Activation Response)"
+               , BT_UNIT_TEST_FUNCTION_TDS_CUSTOM_PROVIDER_SEND_ACTIVATION_RESP},
+       {NULL                                   , 0x0000},
+};
+
+tc_table_t tc_tds_seeker[] = {
+       /* TDS Seeker functions */
+       {"BACK"
+               , BT_UNIT_TEST_FUNCTION_BACK},
+       {"TDS Seeker Start Discovering Provider"
+               , BT_UNIT_TEST_FUNCTION_TDS_START_DISCOVERING_PROVIDER},
+       {"TDS Seeker Stop Discovering Provider"
+               , BT_UNIT_TEST_FUNCTION_TDS_STOP_DISCOVERING_PROVIDER},
+       {"TDS Seeker(Create)"
+               , BT_UNIT_TEST_FUNCTION_TDS_SEEKER_CREATE},
+       {"TDS Seeker(Destroy)"
+               , BT_UNIT_TEST_FUNCTION_TDS_SEEKER_DESTROY},
+       {"TDS Set Seeker Connection cb"
+               , BT_UNIT_TEST_FUNCTION_TDS_SEEKER_SET_CONNECTION_CALLBACK},
+       {"TDS Seeker Connect(remote)"
+               , BT_UNIT_TEST_FUNCTION_TDS_SEEKER_CONNECT},
+       {"TDS Seeker DisConnect(remote)"
+               , BT_UNIT_TEST_FUNCTION_TDS_SEEKER_DISCONNECT},
+       {"TDS UnSet Seeker Connection cb"
+               , BT_UNIT_TEST_FUNCTION_TDS_SEEKER_UNSET_CONNECTION_CALLBACK},
+       {"TDS Read Complete Transport Data (remote)"
+               , BT_UNIT_TEST_FUNCTION_TDS_SEEKER_GET_COMPLETE_DATA},
+       {"TDS Activate Control Point (remote)"
+               , BT_UNIT_TEST_FUNCTION_TDS_SEEKER_ACTIVATE_CONTROL_POINT},
+       {NULL                                   , 0x0000},
+};
+
+
 tc_table_t tc_automated_test[] = {
        /* Automated test Functions*/
        {"BACK"                                                         , BT_UNIT_TEST_FUNCTION_BACK},
@@ -2528,6 +2591,21 @@ void __bt_proximity_reporter_connection_state_changed_cb(int result, const char
        }
 }
 
+void __tds_activation_req_cb(char *rem_bd_addr,
+       bt_tds_transport_e transport, unsigned char *buf, int len, void *user_data)
+{
+       int i;
+
+       TC_PRT("remote_address : %s", rem_bd_addr);
+       TC_PRT("transport : %d", transport);
+       for (i = 0; i < len; i++)
+               TC_PRT("Act req data[%d] : %.2x", i, buf[i]);
+
+       if (tds_act_address)
+               g_free(tds_act_address);
+       tds_act_address = g_strdup(rem_bd_addr);
+}
+
 void __bt_gatt_server_notification_sent_cb(int result,
        const char *remote_address, bt_gatt_server_h server,
        bt_gatt_h characteristic, bool completed, void *user_data)
@@ -2540,11 +2618,12 @@ void __bt_gatt_server_notification_sent_cb(int result,
 
 void __bt_gatt_server_write_value_requested_cb(const char *remote_address,
                                int request_id, bt_gatt_server_h server,
-                               bt_gatt_h gatt_handle, int offset,
+                               bt_gatt_h gatt_handle, bool response_needed, int offset,
                                const char *value, int len, void *user_data)
 {
        int i, resp_status =  BT_ERROR_NONE;
        TC_PRT("remote_address : %s", remote_address);
+       TC_PRT("Response needed : %d", response_needed);
        TC_PRT("offset : %d", offset);
        TC_PRT("len [%d] : ", len);
        for (i = 0; i < len; i++)
@@ -3001,6 +3080,85 @@ void __bt_repeat_test_adapter_state_changed_cb(int result,
        bt_onoff_cnt++;
 }
 
+/* TDS Seeker Callbacks */
+static  void __bt_tds_provider_scan_result_cb(int result, const char *remote_address,
+                       bt_tds_transport_block_list_s *info, bt_adapter_le_device_scan_result_info_s *scan_info,
+                       void *user_data)
+{
+       int k;
+       int l;
+       TC_PRT("__bt_tds_provider_scan_result_cb");
+       TC_PRT("result: %s", __bt_get_error_message(result));
+
+       TC_PRT("Result: %s", __bt_get_error_message(result));
+       TC_PRT("Remote addr [%s]", remote_address);
+       TC_PRT("Number of Transport Block [%d]", info->num_transport_block);
+
+       if (result == BT_ERROR_NONE) {
+               for (k = 0; k < info->num_transport_block; k++) {
+                       TC_PRT("Block Num[%d] Transport Name [%d]", k+1, info->data[k]->transport);
+                       TC_PRT("Block Num[%d] Transport state [%d]", k+1, info->data[k]->state);
+                       TC_PRT("Block Num[%d] Is Data complete [%d]", k+1, info->data[k]->is_data_complete);
+                       TC_PRT("Block Num[%d] Length of TDS Block data [%d]", k+1, info->data[k]->length);
+
+                       for (l = 0; l < info->data[k]->length; l++)
+                               TC_PRT("Transport Specific data [%d] = [0x%x]", l, info->data[k]->data[l]);
+               }
+       }
+}
+
+static void __bt_tds_seeker_connection_state_changed_cb(int result, const char *remote_address,
+                       bt_tds_seeker_h seeker, bool connected, void *user_data)
+{
+       TC_PRT("Result: %s", __bt_get_error_message(result));
+       if (result == BT_ERROR_NONE) {
+               if (connected)
+                       TC_PRT("TDS Seeker connected(address = %s)", remote_address);
+               else
+                       TC_PRT("TDS Seeker Disconnected (address = %s)", remote_address);
+       } else
+               BT_ERR("TDS Connection failed!");
+}
+
+static void __bt_tds_seeker_complete_transport_data_cb(int result, const char *remote_address,
+                       bt_tds_transport_block_list_s *info, void *user_data)
+{
+       int k;
+       int l;
+       TC_PRT("__bt_tds_seeker_complete_transport_data_cb");
+       TC_PRT("Result: %s", __bt_get_error_message(result));
+       TC_PRT("Remote addr [%s]", remote_address);
+
+       if (result == BT_ERROR_NONE) {
+               TC_PRT("Number of Transport Block [%d]", info->num_transport_block);
+               for (k = 0; k < info->num_transport_block; k++) {
+                       TC_PRT("Block Num[%d] Transport Name [%d]", k+1, info->data[k]->transport);
+                       TC_PRT("Block Num[%d] Transport state [%d]", k+1, info->data[k]->state);
+                       TC_PRT("Block Num[%d] Is Data complete [%d]", k+1, info->data[k]->is_data_complete);
+                       TC_PRT("Block Num[%d] Length of TDS Block data [%d]", k+1, info->data[k]->length);
+
+                       for (l = 0; l < info->data[k]->length; l++)
+                               TC_PRT("Transport Specific data [%d] = [0x%x]", l, info->data[k]->data[l]);
+               }
+       } else
+               BT_ERR("TDS Data receive request failed!");
+}
+
+static void __bt_tds_control_point_activation_result_cb(int result, const char *remote_address,
+                               unsigned char *data, int length, void *user_data)
+{
+       int k;
+       TC_PRT("__bt_tds_control_point_activation_result_cb");
+       TC_PRT("Result [%d]", result);
+       TC_PRT("Address[%s]", remote_address);
+
+       if (result == BT_ERROR_NONE) {
+               TC_PRT("Data length [%d]", length);
+               for (k = 0; k < length; k++)
+                       TC_PRT("Data[%d] [0x%x]", k, data[k]);
+       }
+}
+
 static void __bt_initialize_all(void)
 {
        int ret;
@@ -3371,7 +3529,7 @@ int test_set_params(int test_id, char *param)
                                g_test_param.params[param_index - 1] = g_malloc0(len + 1);
                                /* Remove new line character */
                                param[len - 1] = '\0';
-                               strcpy(g_test_param.params[param_index - 1], param);
+                               strncpy(g_test_param.params[param_index - 1], param, strlen(param));
                        }
 
                        if (param_index == g_test_param.param_count) {
@@ -3401,7 +3559,7 @@ int test_set_params(int test_id, char *param)
                                g_test_param.params[param_index - 1] = g_malloc0(len + 1);
                                /* Remove new line character */
                                param[len - 1] = '\0';
-                               strcpy(g_test_param.params[param_index - 1], param);
+                               strncpy(g_test_param.params[param_index - 1], param, strlen(param));
                        }
 
                        if (param_index == g_test_param.param_count) {
@@ -3614,6 +3772,35 @@ int test_set_params(int test_id, char *param)
 
                        break;
                }
+               case BT_UNIT_TEST_FUNCTION_AG_SWITCH_HEADSET: {
+                       if (param_index == 0) {
+                               g_test_param.param_count = 1;
+                               g_test_param.params = g_malloc0(sizeof(char *) *g_test_param.param_count);
+                               param_type = BT_UNIT_TEST_PARAM_TYPE_STRING;
+                       }
+
+                       if (param_index > 0) {
+                               g_test_param.params[param_index - 1] = g_malloc0(strlen(param) + 1);
+                               strncpy(g_test_param.params[param_index - 1], param, strlen(param));
+                       }
+
+                       if (param_index == g_test_param.param_count) {
+                               need_to_set_params = false;
+#ifdef ARCH64
+                               test_input_callback((void *)(uintptr_t)test_id);
+#else
+                               test_input_callback((void *)test_id);
+#endif
+                               param_index = 0;
+                               return 0;
+                       }
+
+                       TC_PRT("Input param(%d) type:%s",
+                               param_index + 1, param_type);
+                       param_index++;
+
+                       break;
+               }
 
                default:
                        TC_PRT("There is no param to set\n");
@@ -4473,7 +4660,7 @@ int test_set_params(int test_id, char *param)
                                g_test_param.params[param_index - 1] = g_malloc0(len + 1);
                                /* Remove new line character */
                                param[len - 1] = '\0';
-                               strcpy(g_test_param.params[param_index - 1], param);
+                               strncpy(g_test_param.params[param_index - 1], param, strlen(param));
                        }
 
                        if (param_index == g_test_param.param_count) {
@@ -5348,7 +5535,7 @@ int test_input_callback(void *data)
                case BT_UNIT_TEST_FUNCTION_ADAPTER_LE_REGISTER_SCAN_FILTER_DEVICE_ADDRESS: {
                        bt_scan_filter_h scan_filter;
 
-                       ret = bt_adapter_le_create_scan_filter(&scan_filter);
+                       ret = bt_adapter_le_scan_filter_create(&scan_filter);
                        if (ret != BT_ERROR_NONE)
                                TC_PRT("failed with [0x%04x]", ret);
 
@@ -5356,11 +5543,11 @@ int test_input_callback(void *data)
                        if (ret != BT_ERROR_NONE)
                                TC_PRT("failed with [0x%04x]", ret);
 
-                       ret = bt_adapter_le_register_scan_filter(scan_filter);
+                       ret = bt_adapter_le_scan_filter_register(scan_filter);
                        if (ret != BT_ERROR_NONE)
                                TC_PRT("failed with [0x%04x]", ret);
 
-                       ret = bt_adapter_le_destroy_scan_filter(scan_filter);
+                       ret = bt_adapter_le_scan_filter_destroy(scan_filter);
                        if (ret != BT_ERROR_NONE)
                                TC_PRT("failed with [0x%04x]", ret);
 
@@ -5370,7 +5557,7 @@ int test_input_callback(void *data)
                case BT_UNIT_TEST_FUNCTION_ADAPTER_LE_REGISTER_SCAN_FILTER_SERVICE_UUID: {
                        bt_scan_filter_h scan_filter;
 
-                       ret = bt_adapter_le_create_scan_filter(&scan_filter);
+                       ret = bt_adapter_le_scan_filter_create(&scan_filter);
                        if (ret != BT_ERROR_NONE)
                                TC_PRT("failed with [0x%04x]", ret);
 
@@ -5378,11 +5565,11 @@ int test_input_callback(void *data)
                        if (ret != BT_ERROR_NONE)
                                TC_PRT("failed with [0x%04x]", ret);
 
-                       ret = bt_adapter_le_register_scan_filter(scan_filter);
+                       ret = bt_adapter_le_scan_filter_register(scan_filter);
                        if (ret != BT_ERROR_NONE)
                                TC_PRT("failed with [0x%04x]", ret);
 
-                       ret = bt_adapter_le_destroy_scan_filter(scan_filter);
+                       ret = bt_adapter_le_scan_filter_destroy(scan_filter);
                        if (ret != BT_ERROR_NONE)
                                TC_PRT("failed with [0x%04x]", ret);
 
@@ -5392,7 +5579,7 @@ int test_input_callback(void *data)
                case BT_UNIT_TEST_FUNCTION_ADAPTER_LE_REGISTER_SCAN_FILTER_SERVICE_SOLICITATION_UUID: {
                        bt_scan_filter_h scan_filter;
 
-                       ret = bt_adapter_le_create_scan_filter(&scan_filter);
+                       ret = bt_adapter_le_scan_filter_create(&scan_filter);
                        if (ret != BT_ERROR_NONE)
                                TC_PRT("failed with [0x%04x]", ret);
 
@@ -5400,11 +5587,11 @@ int test_input_callback(void *data)
                        if (ret != BT_ERROR_NONE)
                                TC_PRT("failed with [0x%04x]", ret);
 
-                       ret = bt_adapter_le_register_scan_filter(scan_filter);
+                       ret = bt_adapter_le_scan_filter_register(scan_filter);
                        if (ret != BT_ERROR_NONE)
                                TC_PRT("failed with [0x%04x]", ret);
 
-                       ret = bt_adapter_le_destroy_scan_filter(scan_filter);
+                       ret = bt_adapter_le_scan_filter_destroy(scan_filter);
                        if (ret != BT_ERROR_NONE)
                                TC_PRT("failed with [0x%04x]", ret);
 
@@ -5414,7 +5601,7 @@ int test_input_callback(void *data)
                case BT_UNIT_TEST_FUNCTION_ADAPTER_LE_REGISTER_SCAN_FILTER_IBEACON_DATA: {
                        bt_scan_filter_h scan_filter;
 
-                       ret = bt_adapter_le_create_scan_filter(&scan_filter);
+                       ret = bt_adapter_le_scan_filter_create(&scan_filter);
                        if (ret != BT_ERROR_NONE)
                           TC_PRT("failed with [0x%04x]", ret);
 
@@ -5422,7 +5609,7 @@ int test_input_callback(void *data)
                        if (ret != BT_ERROR_NONE)
                                TC_PRT("failed with [0x%04x]", ret);
 
-                       ret = bt_adapter_le_register_scan_filter(scan_filter);
+                       ret = bt_adapter_le_scan_filter_register(scan_filter);
                        if (ret != BT_ERROR_NONE)
                                TC_PRT("failed with [0x%04x]", ret);
 
@@ -5430,7 +5617,7 @@ int test_input_callback(void *data)
                }
 
                case BT_UNIT_TEST_FUNCTION_ADAPTER_LE_UNREGISTER_ALL_SCAN_FILTERS: {
-                       ret = bt_adapter_le_unregister_all_scan_filters();
+                       ret = bt_adapter_le_scan_filter_unregister_all();
                        if (ret != BT_ERROR_NONE)
                                TC_PRT("failed with [0x%04x]", ret);
 
@@ -6134,6 +6321,19 @@ int test_input_callback(void *data)
                                TC_PRT("returns %s\n", __bt_get_error_message(ret));
                        break;
                }
+               case BT_UNIT_TEST_FUNCTION_AG_SWITCH_HEADSET: {
+                       if (g_test_param.param_count < 0) {
+                               TC_PRT("Input parameters first");
+                               break;
+                       }
+
+                       ret = bt_ag_switch_headset(g_test_param.params[0]);
+                       __bt_free_test_param(&g_test_param);
+
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+               }
+
                case BT_UNIT_TEST_FUNCTION_ACTIVATE_FLAG_TO_SET_PARAMETERS:
                        need_to_set_params = true;
                        TC_PRT("Select the function again");
@@ -7117,7 +7317,7 @@ int test_input_callback(void *data)
                        break;
                } else {
                        break; /* goto default */
-               } 
+               }
                case BT_UNIT_TEST_FUNCTION_GATT_DISCOVER_CHARACTERISTIC_DESCRIPTORS:
                if (TIZEN_FEATURE_ENABLE_LEGACY_GATT_CLIENT) {
                        ret = bt_gatt_discover_characteristic_descriptor(
@@ -9128,17 +9328,17 @@ int test_input_callback(void *data)
                                ret = bt_adapter_le_scan_filter_unset_proximity_uuid(pxp_scan_filter);
                                TC_PRT("returns %s\n", __bt_get_error_message(ret));
 
-                               ret = bt_adapter_le_destroy_scan_filter(pxp_scan_filter);
+                               ret = bt_adapter_le_scan_filter_destroy(pxp_scan_filter);
                                TC_PRT("returns %s\n", __bt_get_error_message(ret));
                                pxp_scan_filter = NULL;
                        }
-                       ret = bt_adapter_le_create_scan_filter(&pxp_scan_filter);
+                       ret = bt_adapter_le_scan_filter_create(&pxp_scan_filter);
                        TC_PRT("returns %s\n", __bt_get_error_message(ret));
 
                        ret = bt_adapter_le_scan_filter_set_proximity_uuid(pxp_scan_filter);
                        TC_PRT("returns %s\n", __bt_get_error_message(ret));
 
-                       ret = bt_adapter_le_register_scan_filter(pxp_scan_filter);
+                       ret = bt_adapter_le_scan_filter_register(pxp_scan_filter);
                        if (ret != BT_ERROR_NONE)
                                TC_PRT("failed with [0x%04x]", ret);
 
@@ -9148,7 +9348,7 @@ int test_input_callback(void *data)
                        ret = bt_adapter_le_scan_filter_unset_proximity_uuid(pxp_scan_filter);
                        TC_PRT("returns %s\n", __bt_get_error_message(ret));
 
-                       ret = bt_adapter_le_destroy_scan_filter(pxp_scan_filter);
+                       ret = bt_adapter_le_scan_filter_destroy(pxp_scan_filter);
                        TC_PRT("returns %s\n", __bt_get_error_message(ret));
                        pxp_scan_filter = NULL;
 
@@ -9556,6 +9756,153 @@ int test_input_callback(void *data)
 
                break;
        }
+       case BT_UNIT_TEST_TABLE_TDS_PROVIDER: {
+               switch (test_id) {
+               case BT_UNIT_TEST_FUNCTION_TDS_PROVIDER_REGISTER: {
+                       ret = bt_tds_provider_register();
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_TDS_PROVIDER_UNREGISTER: {
+                       ret = bt_tds_provider_unregister();
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       provider = NULL;
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_TDS_PROVIDER_SET_ACT_REQ_CB: {
+                       ret = bt_tds_set_transport_activation_requested_cb(__tds_activation_req_cb, NULL);
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_TDS_PROVIDER_UNSET_ACT_REQ_CB: {
+                       ret = bt_tds_unset_transport_activation_requested_cb();
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_TDS_CUSTOM_PROVIDER_CREATE: {
+                       if (provider) {
+                               ret = bt_tds_provider_destroy(provider);
+                               TC_PRT("returns %s\n", __bt_get_error_message(ret));
+
+                               provider = NULL;
+                       }
+                       ret = bt_tds_provider_create(&provider, BT_TDS_TRANSPORT_CUSTOM);
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_TDS_CUSTOM_PROVIDER_DESTROY: {
+                       ret = bt_tds_provider_destroy(provider);
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       provider = NULL;
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_TDS_CUSTOM_PROVIDER_SET_TRANSPORT_DATA: {
+                       unsigned char buf[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, /* Mac */
+                                               0x20, 0xFA, /* Operating Channel */
+                                               0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF}; /* Hash */
+
+                       ret = bt_tds_provider_set_transport_data(provider,
+                                       BT_TDS_TRANSPORT_STATE_OFF, buf, sizeof(buf));
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_TDS_CUSTOM_PROVIDER_SET_MANUF_DATA: {
+                       unsigned char buf[] = {0x00, 0x75, 0x4E, 0x24, 0x36, 0x28, 0x01, 0x13};
+
+                       ret = bt_tds_provider_set_manufacturer_data(buf, sizeof(buf));
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_TDS_CUSTOM_PROVIDER_SEND_ACTIVATION_RESP: {
+                       ret = bt_tds_provider_send_activation_resp(
+                                       tds_act_address, BLUETOOTH_ERROR_NONE, provider);
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+               }
+               default:
+                       break;
+               }
+               break;
+       }
+       case BT_UNIT_TEST_TABLE_TDS_SEEKER: {
+               switch (test_id) {
+               case BT_UNIT_TEST_FUNCTION_TDS_START_DISCOVERING_PROVIDER: {
+                       ret = bt_tds_start_seeking_providers(__bt_tds_provider_scan_result_cb, NULL);
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_TDS_STOP_DISCOVERING_PROVIDER: {
+                       ret = bt_tds_stop_seeking_providers();
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_TDS_SEEKER_CREATE: {
+                       if (seeker)
+                               seeker = NULL;
+                       ret = bt_tds_seeker_create(remote_addr, &seeker);
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_TDS_SEEKER_DESTROY: {
+                       if (seeker) {
+                               ret = bt_tds_seeker_destroy(seeker);
+                               TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       }
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_TDS_SEEKER_SET_CONNECTION_CALLBACK: {
+                       if (seeker) {
+                               ret = bt_tds_seeker_set_connection_state_changed_cb(seeker,
+                                               __bt_tds_seeker_connection_state_changed_cb, NULL);
+                               TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       }
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_TDS_SEEKER_CONNECT: {
+                       if (seeker) {
+                               ret = bt_tds_seeker_connect(seeker);
+                               TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       }
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_TDS_SEEKER_DISCONNECT: {
+                       if (seeker) {
+                               ret = bt_tds_seeker_disconnect(seeker);
+                               TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       }
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_TDS_SEEKER_UNSET_CONNECTION_CALLBACK: {
+                       if (seeker) {
+                               ret = bt_tds_seeker_unset_connection_state_changed_cb(seeker);
+                               TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       }
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_TDS_SEEKER_GET_COMPLETE_DATA: {
+                       if (seeker) {
+                               ret = bt_tds_seeker_get_complete_transport_blocks(seeker,
+                                               __bt_tds_seeker_complete_transport_data_cb, NULL);
+                               TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       }
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_TDS_SEEKER_ACTIVATE_CONTROL_POINT: {
+                       if (seeker) {
+                               unsigned char buf[] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, /* Mac */
+                                       0x0A, 0x0B};    /* Channel Info */
+                               bt_tds_transport_e transport = BT_TDS_TRANSPORT_CUSTOM;
+                               ret = bt_tds_seeker_activate_control_point(seeker, transport, buf, sizeof(buf),
+                                               __bt_tds_control_point_activation_result_cb, NULL);
+                               TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       }
+                       break;
+               }
+               default:
+                       break;
+               }
+               break;
+       }
        case BT_UNIT_TEST_TABLE_ETC: {
                static unsigned int delay = 0;
                bt_onoff_cnt = 0;
index fe10cf00a0d050bce38483d6594721c9c5e96921..573749146ddb2e49d428c6205fd24c77820bc1b9 100644 (file)
@@ -51,6 +51,8 @@ typedef enum {
        BT_UNIT_TEST_TABLE_PBAP_CLIENT,
        BT_UNIT_TEST_TABLE_ETC,
        BT_UNIT_TEST_FUNCTION_INITIALIZE_ALL,
+       BT_UNIT_TEST_TABLE_TDS_PROVIDER,
+       BT_UNIT_TEST_TABLE_TDS_SEEKER,
        BT_UNIT_TEST_TABLE_FINISH = 0xFF,
 } bt_unit_test_table_e;
 
@@ -201,6 +203,7 @@ typedef enum {
        BT_UNIT_TEST_FUNCTION_AG_NOTIFY_CALL_LIST,
        BT_UNIT_TEST_FUNCTION_AG_SET_CALL_HANDLING_EVENT_CB,
        BT_UNIT_TEST_FUNCTION_AG_IS_NREC_ENABLED,
+       BT_UNIT_TEST_FUNCTION_AG_SWITCH_HEADSET,
        BT_UNIT_TEST_FUNCTION_AG_IS_WBS_MODE,
        BT_UNIT_TEST_FUNCTION_AG_SET_VENDOR_CMD_CB,
        BT_UNIT_TEST_FUNCTION_AG_UNSET_VENDOR_CMD_CB,
@@ -448,6 +451,29 @@ typedef enum {
        BT_UNIT_TEST_FUNCTION_PXP_MONITOR_READ_IMMEDIATE_ALERT,
        BT_UNIT_TEST_FUNCTION_PXP_MONITOR_READ_SIGNAL_LEVEL,
 
+       /* TDS Provider */
+       BT_UNIT_TEST_FUNCTION_TDS_PROVIDER_REGISTER = 1,
+       BT_UNIT_TEST_FUNCTION_TDS_PROVIDER_UNREGISTER,
+       BT_UNIT_TEST_FUNCTION_TDS_PROVIDER_SET_ACT_REQ_CB,
+       BT_UNIT_TEST_FUNCTION_TDS_PROVIDER_UNSET_ACT_REQ_CB,
+       BT_UNIT_TEST_FUNCTION_TDS_CUSTOM_PROVIDER_CREATE,
+       BT_UNIT_TEST_FUNCTION_TDS_CUSTOM_PROVIDER_DESTROY,
+       BT_UNIT_TEST_FUNCTION_TDS_CUSTOM_PROVIDER_SET_TRANSPORT_DATA,
+       BT_UNIT_TEST_FUNCTION_TDS_CUSTOM_PROVIDER_SET_MANUF_DATA,
+       BT_UNIT_TEST_FUNCTION_TDS_CUSTOM_PROVIDER_SEND_ACTIVATION_RESP,
+
+       /* TDS Seeker */
+       BT_UNIT_TEST_FUNCTION_TDS_START_DISCOVERING_PROVIDER = 1,
+       BT_UNIT_TEST_FUNCTION_TDS_STOP_DISCOVERING_PROVIDER,
+       BT_UNIT_TEST_FUNCTION_TDS_SEEKER_CREATE,
+       BT_UNIT_TEST_FUNCTION_TDS_SEEKER_DESTROY,
+       BT_UNIT_TEST_FUNCTION_TDS_SEEKER_SET_CONNECTION_CALLBACK,
+       BT_UNIT_TEST_FUNCTION_TDS_SEEKER_CONNECT,
+       BT_UNIT_TEST_FUNCTION_TDS_SEEKER_DISCONNECT,
+       BT_UNIT_TEST_FUNCTION_TDS_SEEKER_UNSET_CONNECTION_CALLBACK,
+       BT_UNIT_TEST_FUNCTION_TDS_SEEKER_GET_COMPLETE_DATA,
+       BT_UNIT_TEST_FUNCTION_TDS_SEEKER_ACTIVATE_CONTROL_POINT,
+
        BT_UNIT_TEST_FUNCTION_ACTIVATE_FLAG_TO_SET_PARAMETERS = 0XFF,
 } bt_unit_test_function_e;