Tizen 2.0 Release
authorHyungKyu Song <hk76.song@samsung.com>
Fri, 15 Feb 2013 15:10:17 +0000 (00:10 +0900)
committerHyungKyu Song <hk76.song@samsung.com>
Fri, 15 Feb 2013 15:10:17 +0000 (00:10 +0900)
34 files changed:
AUTHORS [new file with mode: 0644]
CMakeLists.txt [new file with mode: 0644]
LICENSE.APLv2 [new file with mode: 0644]
NOTICE [new file with mode: 0644]
bluetooth.manifest [new file with mode: 0644]
capi-network-bluetooth.pc.in [new file with mode: 0644]
debian/README [new file with mode: 0644]
debian/capi-network-bluetooth-dev.install [new file with mode: 0644]
debian/capi-network-bluetooth-dev.postinst [new file with mode: 0644]
debian/capi-network-bluetooth.install [new file with mode: 0644]
debian/capi-network-bluetooth.postinst [new file with mode: 0644]
debian/changelog [new file with mode: 0644]
debian/compat [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/rules [new file with mode: 0755]
include/bluetooth.h [new file with mode: 0644]
include/bluetooth_private.h [new file with mode: 0644]
packaging/capi-network-bluetooth.spec [new file with mode: 0644]
src/bluetooth-adapter.c [new file with mode: 0644]
src/bluetooth-audio.c [new file with mode: 0644]
src/bluetooth-avrcp.c [new file with mode: 0644]
src/bluetooth-common.c [new file with mode: 0644]
src/bluetooth-device.c [new file with mode: 0644]
src/bluetooth-gatt.c [new file with mode: 0644]
src/bluetooth-hdp.c [new file with mode: 0644]
src/bluetooth-hid.c [new file with mode: 0644]
src/bluetooth-opp-client.c [new file with mode: 0644]
src/bluetooth-opp-server.c [new file with mode: 0644]
src/bluetooth-pan.c [new file with mode: 0644]
src/bluetooth-socket.c [new file with mode: 0644]
test/CMakeLists.txt [new file with mode: 0644]
test/bt_chat_client.c [new file with mode: 0644]
test/bt_chat_server.c [new file with mode: 0644]
test/bt_unit_test.c [new file with mode: 0644]

diff --git a/AUTHORS b/AUTHORS
new file mode 100644 (file)
index 0000000..46d1687
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,2 @@
+Jinmin Jung <jinmin@samsung.com>
+DoHyun Pyun <dh79.pyun@samsung.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644 (file)
index 0000000..47e3695
--- /dev/null
@@ -0,0 +1,110 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+SET(fw_name "capi-network-bluetooth")
+
+PROJECT(${fw_name})
+
+SET(CMAKE_INSTALL_PREFIX /usr)
+SET(PREFIX ${CMAKE_INSTALL_PREFIX})
+
+SET(INC_DIR include)
+INCLUDE_DIRECTORIES(${INC_DIR})
+
+SET(dependents "dlog glib-2.0 capi-base-common bluetooth-api")
+SET(pc_dependents "capi-base-common")
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(${fw_name} REQUIRED ${dependents})
+FOREACH(flag ${${fw_name}_CFLAGS})
+    SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC -Wall -Werror")
+SET(CMAKE_C_FLAGS_DEBUG "-O0 -g")
+
+IF("${ARCH}" STREQUAL "arm")
+    ADD_DEFINITIONS("-DTARGET")
+ENDIF("${ARCH}" STREQUAL "arm")
+
+ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
+ADD_DEFINITIONS("-DTIZEN_DEBUG")
+
+SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -Wl,--rpath=/usr/lib")
+
+SET(SOURCES
+src/bluetooth-common.c
+src/bluetooth-adapter.c
+src/bluetooth-device.c
+src/bluetooth-socket.c
+src/bluetooth-opp-server.c
+src/bluetooth-opp-client.c
+src/bluetooth-pan.c
+src/bluetooth-hdp.c
+src/bluetooth-hid.c
+src/bluetooth-audio.c
+src/bluetooth-avrcp.c
+src/bluetooth-gatt.c
+)
+
+ADD_LIBRARY(${fw_name} SHARED ${SOURCES})
+
+TARGET_LINK_LIBRARIES(${fw_name} ${${fw_name}_LDFLAGS})
+
+SET_TARGET_PROPERTIES(${fw_name}
+     PROPERTIES
+     VERSION ${FULLVER}
+     SOVERSION ${MAJORVER}
+     CLEAN_DIRECT_OUTPUT 1
+)
+
+INSTALL(TARGETS ${fw_name} DESTINATION lib)
+INSTALL(
+        DIRECTORY ${INC_DIR}/ DESTINATION include/network
+        FILES_MATCHING
+        PATTERN "*_private.h" EXCLUDE
+        PATTERN "${INC_DIR}/*.h"
+        )
+
+SET(PC_NAME ${fw_name})
+SET(PC_REQUIRED ${pc_dependents})
+SET(PC_LDFLAGS -l${fw_name})
+
+CONFIGURE_FILE(
+    capi-network-bluetooth.pc.in
+    ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc
+    @ONLY
+)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc DESTINATION lib/pkgconfig)
+
+ADD_SUBDIRECTORY(test)
+
+IF(UNIX)
+
+ADD_CUSTOM_TARGET (distclean @echo cleaning for source distribution)
+ADD_CUSTOM_COMMAND(
+        DEPENDS clean 
+        COMMENT "distribution clean"
+        COMMAND find
+        ARGS    . 
+        -not -name config.cmake -and \(
+        -name tester.c -or
+        -name Testing -or
+        -name CMakeFiles -or
+        -name cmake.depends -or
+        -name cmake.check_depends -or
+        -name CMakeCache.txt -or
+        -name cmake.check_cache -or
+        -name *.cmake -or
+        -name Makefile -or
+        -name core -or
+        -name core.* -or
+        -name gmon.out -or
+        -name install_manifest.txt -or
+        -name *.pc -or
+        -name *~ \)
+        | grep -v TC | xargs rm -rf
+        TARGET  distclean
+        VERBATIM
+)
+
+ENDIF(UNIX)
+
diff --git a/LICENSE.APLv2 b/LICENSE.APLv2
new file mode 100644 (file)
index 0000000..43e91eb
--- /dev/null
@@ -0,0 +1,203 @@
+\r
+                                 Apache License\r
+                           Version 2.0, January 2004\r
+                        http://www.apache.org/licenses/\r
+\r
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\r
+\r
+   1. Definitions.\r
+\r
+      "License" shall mean the terms and conditions for use, reproduction,\r
+      and distribution as defined by Sections 1 through 9 of this document.\r
+\r
+      "Licensor" shall mean the copyright owner or entity authorized by\r
+      the copyright owner that is granting the License.\r
+\r
+      "Legal Entity" shall mean the union of the acting entity and all\r
+      other entities that control, are controlled by, or are under common\r
+      control with that entity. For the purposes of this definition,\r
+      "control" means (i) the power, direct or indirect, to cause the\r
+      direction or management of such entity, whether by contract or\r
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the\r
+      outstanding shares, or (iii) beneficial ownership of such entity.\r
+\r
+      "You" (or "Your") shall mean an individual or Legal Entity\r
+      exercising permissions granted by this License.\r
+\r
+      "Source" form shall mean the preferred form for making modifications,\r
+      including but not limited to software source code, documentation\r
+      source, and configuration files.\r
+\r
+      "Object" form shall mean any form resulting from mechanical\r
+      transformation or translation of a Source form, including but\r
+      not limited to compiled object code, generated documentation,\r
+      and conversions to other media types.\r
+\r
+      "Work" shall mean the work of authorship, whether in Source or\r
+      Object form, made available under the License, as indicated by a\r
+      copyright notice that is included in or attached to the work\r
+      (an example is provided in the Appendix below).\r
+\r
+      "Derivative Works" shall mean any work, whether in Source or Object\r
+      form, that is based on (or derived from) the Work and for which the\r
+      editorial revisions, annotations, elaborations, or other modifications\r
+      represent, as a whole, an original work of authorship. For the purposes\r
+      of this License, Derivative Works shall not include works that remain\r
+      separable from, or merely link (or bind by name) to the interfaces of,\r
+      the Work and Derivative Works thereof.\r
+\r
+      "Contribution" shall mean any work of authorship, including\r
+      the original version of the Work and any modifications or additions\r
+      to that Work or Derivative Works thereof, that is intentionally\r
+      submitted to Licensor for inclusion in the Work by the copyright owner\r
+      or by an individual or Legal Entity authorized to submit on behalf of\r
+      the copyright owner. For the purposes of this definition, "submitted"\r
+      means any form of electronic, verbal, or written communication sent\r
+      to the Licensor or its representatives, including but not limited to\r
+      communication on electronic mailing lists, source code control systems,\r
+      and issue tracking systems that are managed by, or on behalf of, the\r
+      Licensor for the purpose of discussing and improving the Work, but\r
+      excluding communication that is conspicuously marked or otherwise\r
+      designated in writing by the copyright owner as "Not a Contribution."\r
+\r
+      "Contributor" shall mean Licensor and any individual or Legal Entity\r
+      on behalf of whom a Contribution has been received by Licensor and\r
+      subsequently incorporated within the Work.\r
+\r
+   2. Grant of Copyright License. Subject to the terms and conditions of\r
+      this License, each Contributor hereby grants to You a perpetual,\r
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r
+      copyright license to reproduce, prepare Derivative Works of,\r
+      publicly display, publicly perform, sublicense, and distribute the\r
+      Work and such Derivative Works in Source or Object form.\r
+\r
+   3. Grant of Patent License. Subject to the terms and conditions of\r
+      this License, each Contributor hereby grants to You a perpetual,\r
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r
+      (except as stated in this section) patent license to make, have made,\r
+      use, offer to sell, sell, import, and otherwise transfer the Work,\r
+      where such license applies only to those patent claims licensable\r
+      by such Contributor that are necessarily infringed by their\r
+      Contribution(s) alone or by combination of their Contribution(s)\r
+      with the Work to which such Contribution(s) was submitted. If You\r
+      institute patent litigation against any entity (including a\r
+      cross-claim or counterclaim in a lawsuit) alleging that the Work\r
+      or a Contribution incorporated within the Work constitutes direct\r
+      or contributory patent infringement, then any patent licenses\r
+      granted to You under this License for that Work shall terminate\r
+      as of the date such litigation is filed.\r
+\r
+   4. Redistribution. You may reproduce and distribute copies of the\r
+      Work or Derivative Works thereof in any medium, with or without\r
+      modifications, and in Source or Object form, provided that You\r
+      meet the following conditions:\r
+\r
+      (a) You must give any other recipients of the Work or\r
+          Derivative Works a copy of this License; and\r
+\r
+      (b) You must cause any modified files to carry prominent notices\r
+          stating that You changed the files; and\r
+\r
+      (c) You must retain, in the Source form of any Derivative Works\r
+          that You distribute, all copyright, patent, trademark, and\r
+          attribution notices from the Source form of the Work,\r
+          excluding those notices that do not pertain to any part of\r
+          the Derivative Works; and\r
+\r
+      (d) If the Work includes a "NOTICE" text file as part of its\r
+          distribution, then any Derivative Works that You distribute must\r
+          include a readable copy of the attribution notices contained\r
+          within such NOTICE file, excluding those notices that do not\r
+          pertain to any part of the Derivative Works, in at least one\r
+          of the following places: within a NOTICE text file distributed\r
+          as part of the Derivative Works; within the Source form or\r
+          documentation, if provided along with the Derivative Works; or,\r
+          within a display generated by the Derivative Works, if and\r
+          wherever such third-party notices normally appear. The contents\r
+          of the NOTICE file are for informational purposes only and\r
+          do not modify the License. You may add Your own attribution\r
+          notices within Derivative Works that You distribute, alongside\r
+          or as an addendum to the NOTICE text from the Work, provided\r
+          that such additional attribution notices cannot be construed\r
+          as modifying the License.\r
+\r
+      You may add Your own copyright statement to Your modifications and\r
+      may provide additional or different license terms and conditions\r
+      for use, reproduction, or distribution of Your modifications, or\r
+      for any such Derivative Works as a whole, provided Your use,\r
+      reproduction, and distribution of the Work otherwise complies with\r
+      the conditions stated in this License.\r
+\r
+   5. Submission of Contributions. Unless You explicitly state otherwise,\r
+      any Contribution intentionally submitted for inclusion in the Work\r
+      by You to the Licensor shall be under the terms and conditions of\r
+      this License, without any additional terms or conditions.\r
+      Notwithstanding the above, nothing herein shall supersede or modify\r
+      the terms of any separate license agreement you may have executed\r
+      with Licensor regarding such Contributions.\r
+\r
+   6. Trademarks. This License does not grant permission to use the trade\r
+      names, trademarks, service marks, or product names of the Licensor,\r
+      except as required for reasonable and customary use in describing the\r
+      origin of the Work and reproducing the content of the NOTICE file.\r
+\r
+   7. Disclaimer of Warranty. Unless required by applicable law or\r
+      agreed to in writing, Licensor provides the Work (and each\r
+      Contributor provides its Contributions) on an "AS IS" BASIS,\r
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\r
+      implied, including, without limitation, any warranties or conditions\r
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\r
+      PARTICULAR PURPOSE. You are solely responsible for determining the\r
+      appropriateness of using or redistributing the Work and assume any\r
+      risks associated with Your exercise of permissions under this License.\r
+\r
+   8. Limitation of Liability. In no event and under no legal theory,\r
+      whether in tort (including negligence), contract, or otherwise,\r
+      unless required by applicable law (such as deliberate and grossly\r
+      negligent acts) or agreed to in writing, shall any Contributor be\r
+      liable to You for damages, including any direct, indirect, special,\r
+      incidental, or consequential damages of any character arising as a\r
+      result of this License or out of the use or inability to use the\r
+      Work (including but not limited to damages for loss of goodwill,\r
+      work stoppage, computer failure or malfunction, or any and all\r
+      other commercial damages or losses), even if such Contributor\r
+      has been advised of the possibility of such damages.\r
+\r
+   9. Accepting Warranty or Additional Liability. While redistributing\r
+      the Work or Derivative Works thereof, You may choose to offer,\r
+      and charge a fee for, acceptance of support, warranty, indemnity,\r
+      or other liability obligations and/or rights consistent with this\r
+      License. However, in accepting such obligations, You may act only\r
+      on Your own behalf and on Your sole responsibility, not on behalf\r
+      of any other Contributor, and only if You agree to indemnify,\r
+      defend, and hold each Contributor harmless for any liability\r
+      incurred by, or claims asserted against, such Contributor by reason\r
+      of your accepting any such warranty or additional liability.\r
+\r
+   END OF TERMS AND CONDITIONS\r
+\r
+   APPENDIX: How to apply the Apache License to your work.\r
+\r
+      To apply the Apache License to your work, attach the following\r
+      boilerplate notice, with the fields enclosed by brackets "[]"\r
+      replaced with your own identifying information. (Don't include\r
+      the brackets!)  The text should be enclosed in the appropriate\r
+      comment syntax for the file format. We also recommend that a\r
+      file or class name and description of purpose be included on the\r
+      same "printed page" as the copyright notice for easier\r
+      identification within third-party archives.\r
+\r
+   Copyright [yyyy] [name of copyright owner]\r
+\r
+   Licensed under the Apache License, Version 2.0 (the "License");\r
+   you may not use this file except in compliance with the License.\r
+   You may obtain a copy of the License at\r
+\r
+       http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+   Unless required by applicable law or agreed to in writing, software\r
+   distributed under the License is distributed on an "AS IS" BASIS,\r
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+   See the License for the specific language governing permissions and\r
+   limitations under the License.\r
+\r
diff --git a/NOTICE b/NOTICE
new file mode 100644 (file)
index 0000000..0e0f016
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,3 @@
+Copyright (c) Samsung Electronics Co., Ltd. All rights reserved.
+Except as noted, this software is licensed under Apache License, Version 2.
+Please, see the LICENSE.APLv2 file for Apache License terms and conditions.
diff --git a/bluetooth.manifest b/bluetooth.manifest
new file mode 100644 (file)
index 0000000..75b0fa5
--- /dev/null
@@ -0,0 +1,5 @@
+<manifest>
+    <request>
+        <domain name="_"/>
+    </request>
+</manifest>
diff --git a/capi-network-bluetooth.pc.in b/capi-network-bluetooth.pc.in
new file mode 100644 (file)
index 0000000..097a2d1
--- /dev/null
@@ -0,0 +1,14 @@
+# Package Information for pkg-config
+
+prefix=@PREFIX@
+exec_prefix=/usr
+libdir=/usr/lib
+includedir=/usr/include/network
+
+Name: @PC_NAME@
+Description: @PACKAGE_DESCRIPTION@
+Version: @VERSION@
+Requires: @PC_REQUIRED@ 
+Libs: -L${libdir} @PC_LDFLAGS@
+Cflags: -I${includedir}
+
diff --git a/debian/README b/debian/README
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/debian/capi-network-bluetooth-dev.install b/debian/capi-network-bluetooth-dev.install
new file mode 100644 (file)
index 0000000..761a28b
--- /dev/null
@@ -0,0 +1,4 @@
+/usr/include/*
+/usr/include/*/*
+/usr/lib/pkgconfig/*.pc
+
diff --git a/debian/capi-network-bluetooth-dev.postinst b/debian/capi-network-bluetooth-dev.postinst
new file mode 100644 (file)
index 0000000..1a24852
--- /dev/null
@@ -0,0 +1 @@
+#!/bin/sh
diff --git a/debian/capi-network-bluetooth.install b/debian/capi-network-bluetooth.install
new file mode 100644 (file)
index 0000000..4a755a4
--- /dev/null
@@ -0,0 +1 @@
+/usr/lib/lib*.so*
diff --git a/debian/capi-network-bluetooth.postinst b/debian/capi-network-bluetooth.postinst
new file mode 100644 (file)
index 0000000..1a24852
--- /dev/null
@@ -0,0 +1 @@
+#!/bin/sh
diff --git a/debian/changelog b/debian/changelog
new file mode 100644 (file)
index 0000000..62c177c
--- /dev/null
@@ -0,0 +1,464 @@
+capi-network-bluetooth (0.1.36-1) unstable; urgency=low
+
+  * Implement AVRCP callback functions
+  * Git: magnolia/framework/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.36-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Wed, 28 Nov 2012 10:45:13 +0900
+
+capi-network-bluetooth (0.1.35-1) unstable; urgency=low
+
+  * Add GATT api for BTLE support
+  * Git: magnolia/framework/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.35-1
+
+ -- Chethan T N <chethan.tn@samsung.com>  Fri, 23 Nov 2012 19:15:01 +0900
+
+capi-network-bluetooth (0.1.34-1) unstable; urgency=low
+
+  * Correct the spelling
+  * Git: magnolia/framework/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.34-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Wed, 14 Nov 2012 17:16:04 +0900
+
+capi-network-bluetooth (0.1.33-1) unstable; urgency=low
+
+  * Implement bt_ag_is_nrec_enabled API
+  * Git: magnolia/framework/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.33-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Wed, 14 Nov 2012 11:33:49 +0900
+
+capi-network-bluetooth (0.1.32-1) unstable; urgency=low
+
+  * Add the duration parameter in bt_adapter_get_visibility
+  * Git: magnolia/framework/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.32-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Wed, 07 Nov 2012 17:30:49 +0900
+
+capi-network-bluetooth (0.1.31-1) unstable; urgency=low
+
+  * Update version number
+  * Git: magnolia/framework/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.31-1
+
+ -- Jaekyun Lee <jkyun.lee@samsung.com>  Tue, 06 Nov 2012 17:28:40 +0900
+
+capi-network-bluetooth (0.1.30-1) unstable; urgency=low
+
+  * Implement bt_device_foreach_connected_profiles
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.30-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Tue, 06 Nov 2012 16:22:58 +0900
+
+capi-network-bluetooth (0.1.29-1) unstable; urgency=low
+
+  * Fix the build break
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.29-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Wed, 17 Oct 2012 14:24:53 +0900
+
+capi-network-bluetooth (0.1.28-1) unstable; urgency=low
+
+  * Add the device events
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.28-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Tue, 16 Oct 2012 11:17:10 +0900
+
+capi-network-bluetooth (0.1.27-1) unstable; urgency=low
+
+  * Add license file in each rpm
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.27-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Thu, 11 Oct 2012 16:08:24 +0900
+
+capi-network-bluetooth (0.1.26-1) unstable; urgency=low
+
+  * Assign the error code to result
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.26-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Wed, 26 Sep 2012 15:00:30 +0900
+
+capi-network-bluetooth (0.1.25-1) unstable; urgency=low
+
+  * Add the address parameter in network connected event
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.25-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Wed, 26 Sep 2012 13:09:45 +0900
+
+capi-network-bluetooth (0.1.24-1) unstable; urgency=low
+
+  * Tagging and upload the package
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.24-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Tue, 25 Sep 2012 15:11:44 +0900
+
+capi-network-bluetooth (0.1.23-1) unstable; urgency=low
+
+  * Tagging and upload the package
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.23-1
+
+ -- Sangki Park <sangki79.park@samsung.com>  Tue, 25 Sep 2012 10:48:46 +0900
+
+capi-network-bluetooth (0.1.22-1) unstable; urgency=low
+
+  * Apply smack manifest file
+  * slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.22-1
+
+ -- Sangki Park <sangki79.park@samsung.com>  Fri, 21 Sep 2012 11:09:41 +0900
+
+capi-network-bluetooth (0.1.21-1) unstable; urgency=low
+
+  * Tagging and upload the package
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.21-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Tue, 18 Sep 2012 16:23:52 +0900
+
+capi-network-bluetooth (0.1.20-1) natty; urgency=low
+
+  * Tagging and upload the package
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.20-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Tue, 18 Sep 2012 13:52:44 +0900
+
+capi-network-bluetooth (0.1.19-1) unstable; urgency=low
+
+  * Tagging and upload the package
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.19-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Mon, 17 Sep 2012 15:31:29 +0900
+
+capi-network-bluetooth (0.1.17-1) unstable; urgency=low
+
+  * Tagging and upload the package
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.17-1
+
+ -- Sangki Park <sangki79.park@samsung.com>  Thu, 13 Sep 2012 12:47:12 +0900
+
+capi-network-bluetooth (0.1.16-1) unstable; urgency=low
+
+  * Tagging and upload the package
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.16-1
+
+ -- Sangki Park <sangki79.park@samsung.com>  Thu, 13 Sep 2012 11:03:33 +0900
+
+capi-network-bluetooth (0.1.15-1) unstable; urgency=low
+
+  * Tagging and upload the package
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.15-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Tue, 11 Sep 2012 16:08:53 +0900
+
+capi-network-bluetooth (0.1.14-1) unstable; urgency=low
+
+  * Tagging and upload the package
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.14-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Tue, 11 Sep 2012 09:56:47 +0900
+
+capi-network-bluetooth (0.1.13-1) unstable; urgency=low
+
+  * Tagging and upload the package
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.13-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Mon, 10 Sep 2012 12:56:50 +0900
+
+capi-network-bluetooth (0.1.12-1) unstable; urgency=low
+
+  * Tagging and upload the package
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.12-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Thu, 16 Aug 2012 16:56:23 +0900
+
+capi-network-bluetooth (0.1.11-1) unstable; urgency=low
+
+  * Tagging and upload the package
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.11-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Wed, 08 Aug 2012 19:26:30 +0900
+
+capi-network-bluetooth (0.1.10-1) unstable; urgency=low
+
+  * Tagging and upload the package
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.10-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Wed, 08 Aug 2012 17:08:38 +0900
+
+capi-network-bluetooth (0.1.9-1) unstable; urgency=low
+
+  * Modify the HID APIs
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.9-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Tue, 07 Aug 2012 17:39:52 +0900
+
+capi-network-bluetooth (0.1.8-1) unstable; urgency=low
+
+  * Implement bt_socket_set_connection_requested_cb APIs
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.8-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Mon, 06 Aug 2012 18:08:24 +0900
+
+capi-network-bluetooth (0.1.7-1) unstable; urgency=low
+
+  * Implement bt_get_device_info API
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.7-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Wed, 01 Aug 2012 14:03:45 +0900
+
+capi-network-bluetooth (0.1.6-1) unstable; urgency=low
+
+  * Modify the RFCOMM implement
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.6-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Wed, 25 Jul 2012 11:02:31 +0900
+
+capi-network-bluetooth (0.1.5-1) unstable; urgency=low
+
+  * Add bt_get_device_info API
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.5-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Tue, 17 Jul 2012 13:51:51 +0900
+
+capi-network-bluetooth (0.1.4-1) unstable; urgency=low
+
+  * Add HDP API / Fix inapposite data type (rssi)
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.4-1
+
+ -- Sangki Park <sangki79.park@samsung.com>  Fri, 29 Jun 2012 17:10:28 +0900
+
+capi-network-bluetooth (0.1.3-1) unstable; urgency=low
+
+  * Implement the requirements from OSP
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.3-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Wed, 13 Jun 2012 09:14:03 +0900
+
+capi-network-bluetooth (0.1.2-1) unstable; urgency=low
+
+  * Fix the DTS testcase
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.2-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Thu, 12 Apr 2012 15:48:47 +0900
+
+capi-network-bluetooth (0.1.1-1) unstable; urgency=low
+
+  * Fix the crash in DTS test
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.1-1
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Thu, 29 Mar 2012 14:45:08 +0900
+
+capi-network-bluetooth (0.1.0-14) unstable; urgency=low
+
+  * Initialize the pointer to NULL after free
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.0-14
+
+ -- DoHyun Pyun <dh79.pyun@samsung.com>  Wed, 21 Mar 2012 17:15:59 +0900
+
+capi-network-bluetooth (0.1.0-13) unstable; urgency=low
+
+  * Correct dependent package
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.0-13
+
+ -- ByungWoo Lee <bw1212.lee@samsung.com>  Thu, 15 Mar 2012 13:13:36 +0900
+
+capi-network-bluetooth (0.1.0-12) unstable; urgency=low
+
+  * Modify coding style
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.0-12
+
+ -- ByungWoo Lee <bw1212.lee@samsung.com>  Mon, 20 Feb 2012 15:50:45 +0900
+
+capi-network-bluetooth (0.1.0-11) unstable; urgency=low
+
+  * Add versioning of library
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.0-11
+
+ -- ByungWoo Lee <bw1212.lee@samsung.com>  Tue, 14 Feb 2012 17:09:56 +0900
+
+capi-network-bluetooth (0.1.0-10) unstable; urgency=low
+
+  * Clean codes
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.0-10
+
+ -- ByungWoo Lee <bw1212.lee@samsung.com>  Thu, 02 Feb 2012 14:49:58 +0900
+
+capi-network-bluetooth (0.1.0-9) unstable; urgency=low
+
+  * Add LICENSE, remove COPYING and Convert TIZEN_ERROR_OK to TIZEN_ERROR_NONE
+  * Git: slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.0-9
+
+ -- ByungWoo Lee <bw1212.lee@samsung.com>  Mon, 05 Dec 2011 13:04:56 +0900
+
+capi-network-bluetooth (0.1.0-8) unstable; urgency=low
+
+  * Fix bug in destroying a bond
+  * Git: slp-source.sec.samsung.net:slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.0-8
+
+ -- ByungWoo Lee <bw1212.lee@samsung.com>  Wed, 30 Nov 2011 21:07:06 +0900
+
+capi-network-bluetooth (0.1.0-7) unstable; urgency=low
+
+  * Add service_uuid to bt_device_info_s and bt_device_sdp_info_s instead of service_list and modify log
+  * Git: slp-source.sec.samsung.net:slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.0-7
+
+ -- ByungWoo Lee <bw1212.lee@samsung.com>  Wed, 30 Nov 2011 19:49:10 +0900
+
+capi-network-bluetooth (0.1.0-6) unstable; urgency=low
+
+  * Convert SLP into TIZEN
+  * Git: slp-source.sec.samsung.net:slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.0-6
+
+ -- ByungWoo Lee <bw1212.lee@samsung.com>  Wed, 23 Nov 2011 13:09:26 +0900
+
+capi-network-bluetooth (0.1.0-5) unstable; urgency=low
+
+  * Change bt_device_cancel_bonding() and bt_adapter_set_visibility() into synchronous function, and Add BT_ERROR_SERVICE_SEARCH_ERROR to bt_error_e.
+  * Git: slp-source.sec.samsung.net:slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.0-5
+
+ -- ByungWoo Lee <bw1212.lee@samsung.com>  Wed, 02 Nov 2011 18:58:16 +0900
+
+capi-network-bluetooth (0.1.0-4) unstable; urgency=low
+
+  * Modify bt_error_e and change bt_device_cancel_service_search() and bt_device_cancel_bonding() into synchronous function
+  * Git: slp-source.sec.samsung.net:slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.0-4
+
+ -- ByungWoo Lee <bw1212.lee@samsung.com>  Thu, 27 Oct 2011 16:59:18 +0900
+
+capi-network-bluetooth (0.1.0-3) unstable; urgency=low
+
+  * Change bt_adapter_set_name into synchronous function
+  * Git: slp-source.sec.samsung.net:slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.0-3
+
+ -- ByungWoo Lee <bw1212.lee@samsung.com>  Mon, 17 Oct 2011 18:34:03 +0900
+
+capi-network-bluetooth (0.1.0-2) unstable; urgency=low
+
+  * Correct bug which happens when set local name and modify bt_error_e
+  * Git: slp-source.sec.samsung.net:slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.0-2
+
+ -- ByungWoo Lee <bw1212.lee@samsung.com>  Mon, 10 Oct 2011 18:37:32 +0900
+
+capi-network-bluetooth (0.1.0-1) unstable; urgency=low
+
+  * Modify error code of bt_initialize() and bt_deinitialize()
+  * Git: slp-source.sec.samsung.net:slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.1.0-1
+
+ -- ByungWoo Lee <bw1212.lee@samsung.com>  Tue, 27 Sep 2011 22:17:33 +0900
+
+capi-network-bluetooth (0.0.1-9) unstable; urgency=low
+
+  * Remove undefined enum type
+  * Git: slp-source.sec.samsung.net:slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.0.1-9
+
+ -- Kangho Hur <kangho.hur@samsung.com>  Mon, 26 Sep 2011 21:31:34 +0900
+
+capi-network-bluetooth (0.0.1-8) unstable; urgency=low
+
+  * Change device_address to remote_address
+  * Git: slp-source.sec.samsung.net:slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.0.1-8 
+
+ -- ByungWoo Lee <bw1212.lee@samsung.com>  Fri, 23 Sep 2011 20:02:07 +0900
+
+capi-network-bluetooth (0.0.1-7) unstable; urgency=low
+
+  * Remove BT_MAJOR_SERVICE_CLASS_UNKNOWN
+  * Git: slp-source.sec.samsung.net:slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.0.1-7
+
+ -- ByungWoo Lee <bw1212.lee@samsung.com>  Tue, 20 Sep 2011 17:17:01 +0900
+
+capi-network-bluetooth (0.0.1-6) unstable; urgency=low
+
+  * Rename class to bt_class
+  * Git: slp-source.sec.samsung.net:slp/api/bluetooth
+  * Tag: capi-network-bluetooth_0.0.1-6
+
+ -- ByungWoo Lee <bw1212.lee@samsung.com>  Thu, 08 Sep 2011 10:54:58 +0900
+
+capi-network-bluetooth (0.0.1-5) unstable; urgency=low
+
+   * Remove parameters of bt_adapter_start_device_discovery()
+   * Git: slp-source.sec.samsung.net:slp/api/bluetooth
+   * Tag: capi-network-bluetooth_0.0.1-5
+
+ -- ByungWoo Lee <bw1212.lee@samsung.com>  Mon, 05 Sep 2011 20:22:36 +0900
+
+capi-network-bluetooth (0.0.1-4) unstable; urgency=low
+
+   * Add bt_adapter_device_discovery_info_s
+   * Git: slp-source.sec.samsung.net:slp/api/bluetooth
+   * Tag: capi-network-bluetooth_0.0.1-4
+
+ -- ByungWoo Lee <bw1212.lee@samsung.com>  Mon, 22 Aug 2011 15:41:37 +0900
+
+capi-network-bluetooth (0.0.1-3) unstable; urgency=low
+
+   * Fix build break
+   * Git: slp-source.sec.samsung.net:slp/api/bluetooth
+   * Tag: capi-network-bluetooth_0.0.1-3
+
+ -- Kangho Hur <kangho.hur@samsung.com>  Sat, 13 Aug 2011 01:07:56 +0900
+
+capi-network-bluetooth (0.0.1-2) unstable; urgency=low
+
+   * Modify how to copy service list
+   * Git: slp-source.sec.samsung.net:slp/api/bluetooth
+   * Tag: capi-network-bluetooth_0.0.1-2
+
+ -- ByungWoo Lee <bw1212.lee@samsung.com>  Thu, 11 Aug 2011 19:45:20 +0900
+
+capi-network-bluetooth (0.0.1-1) unstable; urgency=low
+
+   * Initial upload
+   * Git: slp-source.sec.samsung.net:slp/api/bluetooth
+   * Tag: capi-network-bluetooth_0.0.1-1
+
+ -- ByungWoo Lee <bw1212.lee@samsung.com>  Mon, 08 Aug 2011 10:12:25 +0900
+
diff --git a/debian/compat b/debian/compat
new file mode 100644 (file)
index 0000000..7ed6ff8
--- /dev/null
@@ -0,0 +1 @@
+5
diff --git a/debian/control b/debian/control
new file mode 100644 (file)
index 0000000..7299ecb
--- /dev/null
@@ -0,0 +1,21 @@
+Source: capi-network-bluetooth
+Section: libs
+Priority: extra
+Maintainer: Kangho Hur <kangho.hur@samsung.com>, ByungWoo Lee <bw1212.lee@samsung.com>
+Build-Depends: debhelper (>= 5), dlog-dev, capi-base-common-dev, libglib2.0-dev, libbluetooth-frwk-dev
+
+Package: capi-network-bluetooth
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: A Network Bluetooth library in Tizen Native API
+
+Package: capi-network-bluetooth-dev
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, capi-network-bluetooth (= ${Source-Version}), capi-base-common-dev
+Description: A Network Bluetooth library in Tizen Native API (DEV)
+
+Package: capi-network-bluetooth-dbg
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, capi-network-bluetooth (= ${Source-Version})
+Description: A Network Bluetooth library in Tizen Native API (DBG)
+
diff --git a/debian/rules b/debian/rules
new file mode 100755 (executable)
index 0000000..9736f8b
--- /dev/null
@@ -0,0 +1,68 @@
+#!/usr/bin/make -f
+
+FULLVER ?= $(shell dpkg-parsechangelog | grep Version: | cut -d ' ' -f 2 | cut -d '-' -f 1)
+MAJORVER ?= $(shell echo $(FULLVER) | cut -d '.' -f 1)
+
+CFLAGS = -Wall -g
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+       CFLAGS += -O0
+else
+       CFLAGS += -O2
+endif
+CMAKE_ROOT_DIR ?= $(CURDIR)
+CMAKE_BUILD_DIR ?= $(CURDIR)/cmake_build_tmp
+
+configure: configure-stamp
+configure-stamp:
+       dh_testdir
+       mkdir -p $(CMAKE_BUILD_DIR) && cd $(CMAKE_BUILD_DIR) && cmake .. -DFULLVER=${FULLVER} -DMAJORVER=${MAJORVER}
+       touch configure-stamp
+
+
+build: build-stamp
+build-stamp: configure-stamp 
+       dh_testdir
+       cd $(CMAKE_BUILD_DIR) && $(MAKE)
+       touch $@
+
+clean:
+       cd $(CMAKE_ROOT_DIR)
+       dh_testdir
+       dh_testroot
+       rm -f build-stamp configure-stamp
+       rm -f `find . -name *.pc`
+       rm -rf $(CMAKE_BUILD_DIR)
+       dh_clean
+       
+install: build
+       dh_testdir
+       dh_testroot
+       dh_clean -k 
+       dh_installdirs
+
+       cd $(CMAKE_BUILD_DIR) && $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install
+
+binary-indep: build install
+
+binary-arch: build install
+       dh_testdir
+       dh_testroot
+       dh_installchangelogs 
+       dh_installdocs
+       dh_installexamples
+       dh_install --sourcedir=debian/tmp
+       dh_installman
+       dh_link
+       dh_strip --dbg-package=capi-network-bluetooth-dbg
+       dh_fixperms
+       dh_makeshlibs
+       dh_installdeb
+       dh_shlibdeps
+       dh_gencontrol
+       dh_md5sums
+       dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install configure
+
diff --git a/include/bluetooth.h b/include/bluetooth.h
new file mode 100644 (file)
index 0000000..e1fd73e
--- /dev/null
@@ -0,0 +1,3802 @@
+/*
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __TIZEN_NETWORK_BLUETOOTH_H__
+#define __TIZEN_NETWORK_BLUETOOTH_H__
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdbool.h>
+#include <tizen_error.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/**
+ * @file        bluetooth.h
+ * @brief       API to control the Bluetooth adapter and devices and communications.
+ * @ingroup     CAPI_NETWORK_BLUETOOTH_MODULE
+ */
+
+
+/**
+ * @addtogroup CAPI_NETWORK_BLUETOOTH_MODULE
+ * @{
+ */
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ * @brief  Enumerations of connected Bluetooth device event role.
+ */
+typedef enum
+{
+       BT_SOCKET_UNKNOWN = 0x00, /**< Unknown role*/
+       BT_SOCKET_SERVER , /**< Server role*/
+       BT_SOCKET_CLIENT, /**< Client role*/
+} bt_socket_role_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_MODULE
+ * @brief Enumerations of Bluetooth error codes.
+ */
+typedef enum
+{
+       BT_ERROR_NONE = TIZEN_ERROR_NONE, /**< Successful*/
+       BT_ERROR_CANCELLED = TIZEN_ERROR_CANCELED, /**< Operation cancelled */
+       BT_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER, /**< Invalid parameter */
+       BT_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY, /**< Out of memory */
+       BT_ERROR_RESOURCE_BUSY = TIZEN_ERROR_RESOURCE_BUSY, /**< Device or resource busy */
+       BT_ERROR_TIMED_OUT = TIZEN_ERROR_TIMED_OUT, /**< Timeout error */
+       BT_ERROR_NOW_IN_PROGRESS = TIZEN_ERROR_NOW_IN_PROGRESS, /**< Operation now in progress */
+       BT_ERROR_NOT_INITIALIZED = TIZEN_ERROR_NETWORK_CLASS|0x0101, /**< Local adapter not initialized */
+       BT_ERROR_NOT_ENABLED = TIZEN_ERROR_NETWORK_CLASS|0x0102, /**< Local adapter not enabled */
+       BT_ERROR_ALREADY_DONE = TIZEN_ERROR_NETWORK_CLASS|0x0103, /**< Operation already done  */
+       BT_ERROR_OPERATION_FAILED = TIZEN_ERROR_NETWORK_CLASS|0x0104, /**< Operation failed */
+       BT_ERROR_NOT_IN_PROGRESS = TIZEN_ERROR_NETWORK_CLASS|0x0105, /**< Operation not in progress */
+       BT_ERROR_REMOTE_DEVICE_NOT_BONDED = TIZEN_ERROR_NETWORK_CLASS|0x0106, /**< Remote device not bonded */
+       BT_ERROR_AUTH_REJECTED = TIZEN_ERROR_NETWORK_CLASS|0x0107, /**< Authentication rejected */
+       BT_ERROR_AUTH_FAILED = TIZEN_ERROR_NETWORK_CLASS|0x0108, /**< Authentication failed */
+       BT_ERROR_REMOTE_DEVICE_NOT_FOUND = TIZEN_ERROR_NETWORK_CLASS|0x0109, /**< Remote device not found */
+       BT_ERROR_SERVICE_SEARCH_FAILED = TIZEN_ERROR_NETWORK_CLASS|0x010A, /**< Service search failed */
+       BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED = TIZEN_ERROR_NETWORK_CLASS|0x010B, /**< Remote device is not connected */
+} bt_error_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief  Enumerations of the Bluetooth adapter state.
+ */
+typedef enum
+{
+       BT_ADAPTER_DISABLED = 0x00, /**< Bluetooth adapter is disabled */
+       BT_ADAPTER_ENABLED, /**< Bluetooth adapter is enabled */
+} bt_adapter_state_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief Enumerations of the Bluetooth visibility mode.
+ */
+typedef enum
+{
+       BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE = 0x00,  /**< Other devices cannot find your device via discovery */
+       BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE,  /**< Discoverable mode */
+       BT_ADAPTER_VISIBILITY_MODE_LIMITED_DISCOVERABLE,  /**< Discoverable mode with time limit. After specific period,
+                                                           it is changed to #BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE.*/
+} bt_adapter_visibility_mode_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief Enumerations of the discovery state of Bluetooth device.
+ *
+ */
+typedef enum
+{
+       BT_ADAPTER_DEVICE_DISCOVERY_STARTED, /**< Device discovery is started */
+       BT_ADAPTER_DEVICE_DISCOVERY_FINISHED, /**< Device discovery is finished */
+       BT_ADAPTER_DEVICE_DISCOVERY_FOUND, /**< The remote Bluetooth device is found */
+} bt_adapter_device_discovery_state_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief Enumerations of device authorization state.
+ */
+typedef enum
+{
+       BT_DEVICE_AUTHORIZED, /**< The remote Bluetooth device is authorized */
+       BT_DEVICE_UNAUTHORIZED, /**< The remote Bluetooth device is unauthorized */
+} bt_device_authorization_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief Enumerations of Bluetooth profile.
+ */
+typedef enum
+{
+    BT_PROFILE_RFCOMM = 0x01, /**< RFCOMM Profile */
+    BT_PROFILE_A2DP = 0x02, /**< Advanced Audio Distribution Profile */
+    BT_PROFILE_HSP = 0x04, /**< Headset Profile */
+    BT_PROFILE_HID = 0x08, /**< Human Interface Device Profile */
+} bt_profile_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ * @brief  Enumerations of Bluetooth socket connection state.
+ */
+typedef enum
+{
+       BT_SOCKET_CONNECTED, /**< RFCOMM is connected */
+       BT_SOCKET_DISCONNECTED, /**< RFCOMM is disconnected */
+} bt_socket_connection_state_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief  Enumerations of major service class.
+ */
+typedef enum
+{
+       BT_MAJOR_SERVICE_CLASS_LIMITED_DISCOVERABLE_MODE  = 0x002000, /**< Limited discoverable mode */
+       BT_MAJOR_SERVICE_CLASS_POSITIONING                = 0x010000, /**< Positioning class */
+       BT_MAJOR_SERVICE_CLASS_NETWORKING                 = 0x020000, /**< Networking class */
+       BT_MAJOR_SERVICE_CLASS_RENDERING                  = 0x040000, /**< Rendering class */
+       BT_MAJOR_SERVICE_CLASS_CAPTURING                  = 0x080000, /**< Capturing class */
+       BT_MAJOR_SERVICE_CLASS_OBJECT_TRANSFER            = 0x100000, /**< Object transferring class */
+       BT_MAJOR_SERVICE_CLASS_AUDIO                      = 0x200000, /**< Audio class*/
+       BT_MAJOR_SERVICE_CLASS_TELEPHONY                  = 0x400000, /**< Telephony class */
+       BT_MAJOR_SERVICE_CLASS_INFORMATION                = 0x800000, /**< Information class */
+} bt_major_service_class_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief  Enumerations of major device class.
+ */
+typedef enum
+{
+       BT_MAJOR_DEVICE_CLASS_MISC = 0x00, /**< Miscellaneous major device class*/
+       BT_MAJOR_DEVICE_CLASS_COMPUTER = 0x01, /**< Computer major device class */
+       BT_MAJOR_DEVICE_CLASS_PHONE = 0x02, /**< Phone major device class */
+       BT_MAJOR_DEVICE_CLASS_LAN_NETWORK_ACCESS_POINT = 0x03, /**< LAN/Network access point major device class */
+       BT_MAJOR_DEVICE_CLASS_AUDIO_VIDEO = 0x04, /**< Audio/Video major device class */
+       BT_MAJOR_DEVICE_CLASS_PERIPHERAL = 0x05, /**< Peripheral major device class */
+       BT_MAJOR_DEVICE_CLASS_IMAGING = 0x06, /**< Imaging major device class */
+       BT_MAJOR_DEVICE_CLASS_WEARABLE = 0x07, /**< Wearable device class */
+       BT_MAJOR_DEVICE_CLASS_TOY = 0x08, /**< Toy device class */
+       BT_MAJOR_DEVICE_CLASS_HEALTH = 0x09, /**< Health device class */
+       BT_MAJOR_DEVICE_CLASS_UNCATEGORIZED = 0x1F, /**< Uncategorized major device class */
+} bt_major_device_class_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief  Enumerations of minor device class.
+ */
+typedef enum
+{
+       BT_MINOR_DEVICE_CLASS_COMPUTER_UNCATEGORIZED = 0x00, /**< Uncategorized minor device class of computer */
+       BT_MINOR_DEVICE_CLASS_COMPUTER_DESKTOP_WORKSTATION = 0x04, /**< Desktop workstation minor device class of computer */
+       BT_MINOR_DEVICE_CLASS_COMPUTER_SERVER_CLASS = 0x08, /**< Server minor device class of computer */
+       BT_MINOR_DEVICE_CLASS_COMPUTER_LAPTOP = 0x0C, /**< Laptop minor device class of computer */
+       BT_MINOR_DEVICE_CLASS_COMPUTER_HANDHELD_PC_OR_PDA = 0x10, /**< Handheld PC/PDA minor device class of computer */
+       BT_MINOR_DEVICE_CLASS_COMPUTER_PALM_SIZED_PC_OR_PDA = 0x14, /**< Palm sized PC/PDA minor device class of computer */
+       BT_MINOR_DEVICE_CLASS_COMPUTER_WEARABLE_COMPUTER = 0x18, /**< Wearable(watch sized) minor device class of computer */
+
+       BT_MINOR_DEVICE_CLASS_PHONE_UNCATEGORIZED = 0x00, /**< Uncategorized minor device class of phone */
+       BT_MINOR_DEVICE_CLASS_PHONE_CELLULAR = 0x04, /**< Cellular minor device class of phone */
+       BT_MINOR_DEVICE_CLASS_PHONE_CORDLESS = 0x08, /**< Cordless minor device class of phone */
+       BT_MINOR_DEVICE_CLASS_PHONE_SMART_PHONE = 0x0C, /**< Smart phone minor device class of phone */
+       BT_MINOR_DEVICE_CLASS_PHONE_WIRED_MODEM_OR_VOICE_GATEWAY = 0x10, /**< Wired modem or voice gateway minor device class of phone */
+       BT_MINOR_DEVICE_CLASS_PHONE_COMMON_ISDN_ACCESS = 0x14, /**< Common ISDN minor device class of phone */
+
+       BT_MINOR_DEVICE_CLASS_LAN_NETWORK_ACCESS_POINT_FULLY_AVAILABLE = 0x04, /**< Fully available minor device class of LAN/Network access point */
+       BT_MINOR_DEVICE_CLASS_LAN_NETWORK_ACCESS_POINT_1_TO_17_PERCENT_UTILIZED = 0x20, /**< 1-17% utilized minor device class of LAN/Network access point */
+       BT_MINOR_DEVICE_CLASS_LAN_NETWORK_ACCESS_POINT_17_TO_33_PERCENT_UTILIZED = 0x40, /**< 17-33% utilized minor device class of LAN/Network access point */
+       BT_MINOR_DEVICE_CLASS_LAN_NETWORK_ACCESS_POINT_33_TO_50_PERCENT_UTILIZED = 0x60, /**< 33-50% utilized minor device class of LAN/Network access point */
+       BT_MINOR_DEVICE_CLASS_LAN_NETWORK_ACCESS_POINT_50_to_67_PERCENT_UTILIZED = 0x80, /**< 50-67% utilized minor device class of LAN/Network access point */
+       BT_MINOR_DEVICE_CLASS_LAN_NETWORK_ACCESS_POINT_67_TO_83_PERCENT_UTILIZED = 0xA0, /**< 67-83% utilized minor device class of LAN/Network access point */
+       BT_MINOR_DEVICE_CLASS_LAN_NETWORK_ACCESS_POINT_83_TO_99_PERCENT_UTILIZED = 0xC0, /**< 83-99% utilized minor device class of LAN/Network access point */
+       BT_MINOR_DEVICE_CLASS_LAN_NETWORK_ACCESS_POINT_NO_SERVICE_AVAILABLE = 0xE0, /**< No service available minor device class of LAN/Network access point */
+
+       BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_UNCATEGORIZED = 0x00, /**< Uncategorized minor device class of audio/video */
+       BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_WEARABLE_HEADSET = 0x04, /**< Wearable headset minor device class of audio/video */
+       BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_HANDS_FREE = 0x08, /**< Hands-free minor device class of audio/video */
+       BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_MICROPHONE = 0x10, /**< Microphone minor device class of audio/video */
+       BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_LOUDSPEAKER = 0x14, /**< Loudspeaker minor device class of audio/video */
+       BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_HEADPHONES = 0x18, /**< Headphones minor device class of audio/video */
+       BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_PORTABLE_AUDIO = 0x1C, /**< Portable audio minor device class of audio/video */
+       BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_CAR_AUDIO = 0x20, /**< Car audio minor device class of audio/video */
+       BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_SET_TOP_BOX = 0x24, /**< Set-top box minor device class of audio/video */
+       BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_HIFI_AUDIO_DEVICE = 0x28, /**< Hifi audio minor device class of audio/video */
+       BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_VCR = 0x2C, /**< VCR minor device class of audio/video */
+       BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_VIDEO_CAMERA = 0x30, /**< Video camera minor device class of audio/video */
+       BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_CAMCORDER = 0x34, /**< Camcorder minor device class of audio/video */
+       BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_VIDEO_MONITOR = 0x38, /**< Video monitor minor device class of audio/video */
+       BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_VIDEO_DISPLAY_LOUDSPEAKER = 0x3C, /**< Video display and loudspeaker minor device class of audio/video */
+       BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_VIDEO_CONFERENCING = 0x40, /**< Video conferencing minor device class of audio/video */
+       BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_GAMING_TOY = 0x48, /**< Gaming/toy minor device class of audio/video */
+
+       BT_MINOR_DEVICE_CLASS_PERIPHERA_UNCATEGORIZED = 0x00, /**< Uncategorized minor device class of peripheral */
+       BT_MINOR_DEVICE_CLASS_PERIPHERAL_KEY_BOARD = 0x40, /**< Key board minor device class of peripheral */
+       BT_MINOR_DEVICE_CLASS_PERIPHERAL_POINTING_DEVICE = 0x80, /**< Pointing device minor device class of peripheral */
+       BT_MINOR_DEVICE_CLASS_PERIPHERAL_COMBO_KEYBOARD_POINTING_DEVICE = 0xC0, /**< Combo keyboard or pointing device minor device class of peripheral */
+       BT_MINOR_DEVICE_CLASS_PERIPHERAL_JOYSTICK = 0x04, /**< Joystick minor device class of peripheral */
+       BT_MINOR_DEVICE_CLASS_PERIPHERAL_GAME_PAD = 0x08, /**< Game pad minor device class of peripheral */
+       BT_MINOR_DEVICE_CLASS_PERIPHERAL_REMOTE_CONTROL = 0x0C, /**< Remote control minor device class of peripheral */
+       BT_MINOR_DEVICE_CLASS_PERIPHERAL_SENSING_DEVICE = 0x10, /**< Sensing device minor device class of peripheral */
+       BT_MINOR_DEVICE_CLASS_PERIPHERAL_DIGITIZER_TABLET = 0x14, /**< Digitizer minor device class of peripheral */
+       BT_MINOR_DEVICE_CLASS_PERIPHERAL_CARD_READER = 0x18, /**< Card reader minor device class of peripheral */
+       BT_MINOR_DEVICE_CLASS_PERIPHERAL_DIGITAL_PEN = 0x1C, /**< Digital pen minor device class of peripheral */
+       BT_MINOR_DEVICE_CLASS_PERIPHERAL_HANDHELD_SCANNER = 0x20, /**< Handheld scanner minor device class of peripheral */
+       BT_MINOR_DEVICE_CLASS_PERIPHERAL_HANDHELD_GESTURAL_INPUT_DEVICE = 0x24, /**< Handheld gestural input device minor device class of peripheral */
+
+       BT_MINOR_DEVICE_CLASS_IMAGING_DISPLAY = 0x10, /**< Display minor device class of imaging */
+       BT_MINOR_DEVICE_CLASS_IMAGING_CAMERA = 0x20, /**< Camera minor device class of imaging */
+       BT_MINOR_DEVICE_CLASS_IMAGING_SCANNER = 0x40, /**< Scanner minor device class of imaging */
+       BT_MINOR_DEVICE_CLASS_IMAGING_PRINTER = 0x80, /**< Printer minor device class of imaging */
+
+       BT_MINOR_DEVICE_CLASS_WEARABLE_WRIST_WATCH = 0x04, /**< Wrist watch minor device class of wearable */
+       BT_MINOR_DEVICE_CLASS_WEARABLE_PAGER = 0x08, /**< Pager minor device class of wearable */
+       BT_MINOR_DEVICE_CLASS_WEARABLE_JACKET = 0x0C, /**< Jacket minor device class of wearable */
+       BT_MINOR_DEVICE_CLASS_WEARABLE_HELMET = 0x10, /**< Helmet minor device class of wearable */
+       BT_MINOR_DEVICE_CLASS_WEARABLE_GLASSES = 0x14, /**< Glasses minor device class of wearable */
+
+       BT_MINOR_DEVICE_CLASS_TOY_ROBOT = 0x04, /**< Robot minor device class of toy */
+       BT_MINOR_DEVICE_CLASS_TOY_VEHICLE = 0x08, /**< Vehicle minor device class of toy */
+       BT_MINOR_DEVICE_CLASS_TOY_DOLL_ACTION = 0x0C, /**< Doll/Action minor device class of toy */
+       BT_MINOR_DEVICE_CLASS_TOY_CONTROLLER = 0x10, /**< Controller minor device class of toy */
+       BT_MINOR_DEVICE_CLASS_TOY_GAME = 0x14, /**< Game minor device class of toy */
+
+       BT_MINOR_DEVICE_CLASS_HEATH_UNCATEGORIZED = 0x00, /**< Uncategorized minor device class of health */
+       BT_MINOR_DEVICE_CLASS_HEATH_BLOOD_PRESSURE_MONITOR = 0x04, /**< Blood pressure monitor minor device class of health */
+       BT_MINOR_DEVICE_CLASS_HEATH_THERMOMETER = 0x08, /**< Thermometer minor device class of health */
+       BT_MINOR_DEVICE_CLASS_HEATH_WEIGHING_SCALE = 0x0C, /**< Weighing scale minor device class of health */
+       BT_MINOR_DEVICE_CLASS_HEATH_GLUCOSE_METER = 0x10, /**< Glucose minor device class of health */
+       BT_MINOR_DEVICE_CLASS_HEATH_PULSE_OXIMETER = 0x14, /**< Pulse oximeter minor device class of health */
+       BT_MINOR_DEVICE_CLASS_HEATH_HEART_PULSE_RATE_MONITOR = 0x18, /**< Heart/Pulse rate monitor minor device class of health */
+       BT_MINOR_DEVICE_CLASS_HEATH_DATA_DISPLAY = 0x1C, /**< Health data display minor device class of health */
+       BT_MINOR_DEVICE_CLASS_HEATH_STEP_COUNTER = 0x20, /**< Step counter minor device class of health */
+       BT_MINOR_DEVICE_CLASS_HEATH_BODY_COMPOSITION_ANALYZER = 0x24, /**< Body composition analyzer minor device class of health */
+       BT_MINOR_DEVICE_CLASS_HEATH_PEAK_FLOW_MONITOR = 0x28, /**< Peak flow monitor minor device class of health */
+       BT_MINOR_DEVICE_CLASS_HEATH_MEDICATION_MONITOR = 0x2C, /**< Medication monitor minor device class of health */
+       BT_MINOR_DEVICE_CLASS_HEATH_KNEE_PROSTHESIS = 0x30, /**< Knee prosthesis minor device class of health */
+       BT_MINOR_DEVICE_CLASS_HEATH_ANKLE_PROSTHESIS = 0x34, /**< Ankle prosthesis minor device class of health */
+} bt_minor_device_class_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_PAN_PANU_MODULE
+ * @brief  Enumerations for the types of PAN(Personal Area Networking) service
+ */
+typedef enum {
+    BT_PANU_SERVICE_TYPE_NAP = 0,  /**< Network Access Point */
+} bt_panu_service_type_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_MODULE
+ * @brief  Enumerations for the types of profiles related with audio
+ */
+typedef enum {
+    BT_AUDIO_PROFILE_TYPE_ALL = 0,  /**< All supported profiles related with audio */
+    BT_AUDIO_PROFILE_TYPE_HSP_HFP,  /**< HSP(Headset Profile) and HFP(Hands-Free Profile) */
+    BT_AUDIO_PROFILE_TYPE_A2DP,  /**< A2DP(Advanced Audio Distribution Profile) */
+} bt_audio_profile_type_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Enumerations for the equalizer state
+ */
+typedef enum {
+    BT_AVRCP_EQUALIZER_STATE_OFF = 0x01,  /**< Equalizer Off */
+    BT_AVRCP_EQUALIZER_STATE_ON,  /**< Equalizer On */
+} bt_avrcp_equalizer_state_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Enumerations for the repeat mode
+ */
+typedef enum {
+    BT_AVRCP_REPEAT_MODE_OFF = 0x01,  /**< Repeat Off */
+    BT_AVRCP_REPEAT_MODE_SINGLE_TRACK,  /**< Single track repeat */
+    BT_AVRCP_REPEAT_MODE_ALL_TRACK,  /**< All track repeat */
+    BT_AVRCP_REPEAT_MODE_GROUP,  /**< Group repeat */
+} bt_avrcp_repeat_mode_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Enumerations for the shuffle mode
+ */
+typedef enum {
+    BT_AVRCP_SHUFFLE_MODE_OFF = 0x01,  /**< Shuffle Off */
+    BT_AVRCP_SHUFFLE_MODE_ALL_TRACK,  /**< All tracks shuffle */
+    BT_AVRCP_SHUFFLE_MODE_GROUP,  /**< Group shuffle */
+} bt_avrcp_shuffle_mode_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Enumerations for the scan mode
+ */
+typedef enum {
+    BT_AVRCP_SCAN_MODE_OFF = 0x01,  /**< Scan Off */
+    BT_AVRCP_SCAN_MODE_ALL_TRACK,  /**< All tracks scan */
+    BT_AVRCP_SCAN_MODE_GROUP,  /**< Group scan */
+} bt_avrcp_scan_mode_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Enumerations for the player state
+ */
+typedef enum {
+    BT_AVRCP_PLAYER_STATE_STOPPED = 0x00,  /**< Stopped */
+    BT_AVRCP_PLAYER_STATE_PLAYING,  /**< Playing */
+    BT_AVRCP_PLAYER_STATE_PAUSED,  /**< Paused */
+    BT_AVRCP_PLAYER_STATE_FORWARD_SEEK,  /**< Seek Forward */
+    BT_AVRCP_PLAYER_STATE_REWIND_SEEK,  /**< Seek Rewind */
+} bt_avrcp_player_state_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_HDP_MODULE
+ * @brief  Enumerations for the data channel type
+ */
+typedef enum {
+    BT_HDP_CHANNEL_TYPE_RELIABLE  = 0x01,  /**< Reliable Data Channel */
+    BT_HDP_CHANNEL_TYPE_STREAMING,  /**< Streaming Data Channel */
+} bt_hdp_channel_type_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Enumerations for the call state
+ */
+typedef enum {
+    BT_AG_CALL_EVENT_IDLE = 0x00,  /**< Idle */
+    BT_AG_CALL_EVENT_ANSWERED,  /**< Answered */
+    BT_AG_CALL_EVENT_HELD,  /**< Held */
+    BT_AG_CALL_EVENT_RETRIEVED,  /**< Retrieved */
+    BT_AG_CALL_EVENT_DIALING,  /**< Dialing */
+    BT_AG_CALL_EVENT_ALERTING,  /**< Alerting */
+    BT_AG_CALL_EVENT_INCOMING,  /**< Incoming */
+} bt_ag_call_event_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Enumerations for the call state
+ */
+typedef enum {
+    BT_AG_CALL_STATE_IDLE = 0x00,  /**< Idle state */
+    BT_AG_CALL_STATE_ACTIVE,  /**< Active state */
+    BT_AG_CALL_STATE_HELD,  /**< Held state */
+    BT_AG_CALL_STATE_DIALING,  /**< Dialing state */
+    BT_AG_CALL_STATE_ALERTING,  /**< Alerting state */
+    BT_AG_CALL_STATE_INCOMING,  /**< Incoming state */
+    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_AG_MODULE
+ * @brief  Enumerations for the call handling event
+ */
+typedef enum {
+    BT_AG_CALL_HANDLING_EVENT_ANSWER = 0x00,  /**< Request to answer an incoming call */
+    BT_AG_CALL_HANDLING_EVENT_RELEASE,  /**< Request to release a call */
+    BT_AG_CALL_HANDLING_EVENT_REJECT,  /**< Request to reject an incoming call */
+} bt_ag_call_handling_event_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Enumerations for the multi call handling event
+ */
+typedef enum {
+    BT_AG_MULTI_CALL_HANDLING_EVENT_RELEASE_HELD_CALLS = 0x00,  /**< Request to release held calls */
+    BT_AG_MULTI_CALL_HANDLING_EVENT_RELEASE_ACTIVE_CALLS,  /**< Request to release active calls */
+    BT_AG_MULTI_CALL_HANDLING_EVENT_ACTIVATE_HELD_CALL,  /**< Request to put active calls into hold state and activate another (held or waiting) call */
+    BT_AG_MULTI_CALL_HANDLING_EVENT_MERGE_CALLS,  /**< Request to add a held call to the conversation */
+    BT_AG_MULTI_CALL_HANDLING_EVENT_EXPLICIT_CALL_TRANSFER,  /**< Request to let a user who has two calls to connect these two calls together and release its connections to both other parties */
+} bt_ag_multi_call_handling_event_e;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  The handle of calls state
+ */
+typedef void* bt_call_list_h;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_GATT_MODULE
+ * @brief  The attribute handle of GATT(Generic Attribute Profile)
+ */
+typedef void* bt_gatt_attribute_h;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief Class structure of device and service.
+ *
+ * @see #bt_device_info_s
+ * @see #bt_adapter_device_discovery_info_s
+ * @see bt_device_bond_created_cb()
+ * @see bt_adapter_device_discovery_state_changed_cb()
+ */
+typedef struct
+{
+       bt_major_device_class_e major_device_class;     /**< Major device class. */
+       bt_minor_device_class_e minor_device_class;     /**< Minor device class. */
+       int major_service_class_mask;   /**< Major service class mask.
+       This value can be a combination of #bt_major_service_class_e like #BT_MAJOR_SERVICE_CLASS_RENDERING | #BT_MAJOR_SERVICE_CLASS_AUDIO */
+} bt_class_s;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief Structure of device discovery information.
+ *
+ * @see #bt_class_s
+ * @see bt_adapter_device_discovery_state_changed_cb()
+ */
+typedef struct
+{
+       char *remote_address;   /**< The address of remote device */
+       char *remote_name;      /**< The name of remote device */
+       bt_class_s bt_class;    /**< The Bluetooth classes */
+       int rssi;       /**< The strength indicator of received signal  */
+       bool is_bonded; /**< The bonding state */
+       char **service_uuid;  /**< The UUID list of service */
+       int service_count;      /**< The number of services */
+} bt_adapter_device_discovery_info_s;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief Device information structure used for identifying pear device.
+ *
+ * @see #bt_class_s
+ * @see bt_device_bond_created_cb()
+ */
+typedef struct
+{
+       char *remote_address;   /**< The address of remote device */
+       char *remote_name;      /**< The name of remote device */
+       bt_class_s bt_class;    /**< The Bluetooth classes */
+       char **service_uuid;  /**< The UUID list of service */
+       int service_count;      /**< The number of services */
+       bool is_bonded; /**< The bonding state */
+       bool is_connected;      /**< The connection state */
+       bool is_authorized;     /**< The authorization state */
+} bt_device_info_s;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief Service Discovery Protocol (SDP) data structure.
+ *
+ * @details This protocol is used for discovering available services or pear device,
+ * and finding one to connect with.
+ *
+ * @see bt_device_service_searched_cb()
+ */
+typedef struct
+{
+       char *remote_address;   /**< The address of remote device */
+       char **service_uuid;  /**< The UUID list of service */
+       int service_count;    /**< The number of services. */
+} bt_device_sdp_info_s;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ *
+ * @brief Rfcomm connection data used for exchanging data between Bluetooth devices.
+ *
+ * @see bt_socket_connection_state_changed_cb()
+ */
+typedef struct
+{
+       int socket_fd;  /**< The file descriptor of connected socket */
+       bt_socket_role_e local_role;    /**< The local device role in this connection */
+       char *remote_address;   /**< The remote device address */
+       char *service_uuid;     /**< The service UUId */
+} bt_socket_connection_s;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ *
+ * @brief Structure of RFCOMM received data.
+ *
+ * @remarks User can use standard linux functions for reading/writing
+ * data from/to sockets.
+ *
+ * @see bt_socket_data_received_cb()
+ */
+typedef struct
+{
+       int socket_fd;  /**< The socket fd */
+       int data_size;  /**< The length of the received data */
+       char *data;     /**< The received data */
+} bt_socket_received_data_s;
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief  Called when the Bluetooth adapter state changes.
+ * @param[in]   result  The result of the adapter state changing
+ * @param[in]   adapter_state  The adapter state to be changed
+ * @param[in]   user_data  The user data passed from the callback registration function
+ * @pre Either bt_adapter_enable() or bt_adapter_disable() will invoke this callback if you register this callback using bt_adapter_set_state_changed_cb().
+ * @see bt_adapter_enable()
+ * @see bt_adapter_disable()
+ * @see bt_adapter_set_state_changed_cb()
+ * @see bt_adapter_unset_state_changed_cb()
+ */
+typedef void (*bt_adapter_state_changed_cb)(int result, bt_adapter_state_e adapter_state, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief  Called when adapter name changes.
+ * @param[in]   device_name    The name of the Bluetooth device to be changed
+ * @param[in]   user_data      The user data passed from the callback registration function
+ * @pre This function will be invoked when the name of Bluetooth adapter changes
+ * if you register this callback using bt_adapter_set_name_changed_cb().
+ * @see bt_adapter_set_name()
+ * @see bt_adapter_set_name_changed_cb()
+ * @see bt_adapter_unset_name_changed_cb()
+ */
+typedef void (*bt_adapter_name_changed_cb)(char *device_name, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief  Called when the visibility mode changes.
+ * @param[in] result The result of the visibility mode changing
+ * @param[in] visibility_mode The visibility mode to be changed
+ * @param[in] user_data The user data passed from the callback registration function
+ *
+ * @pre This function will be invoked when the visibility of Bluetooth adapter changes
+ * if you register this callback using bt_adapter_set_visibility_mode_changed_cb().
+ *
+ * @see bt_adapter_set_visibility()
+ * @see bt_adapter_set_visibility_mode_changed_cb()
+ * @see bt_adapter_unset_visibility_mode_changed_cb()
+ */
+typedef void (*bt_adapter_visibility_mode_changed_cb)
+       (int result, bt_adapter_visibility_mode_e visibility_mode, void *user_data);
+
+/**
+ * @ingroup  CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief  Called every second until the visibility mode is changed to #BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE.
+ * @remarks  This callback function is called only if visibility mode is #BT_ADAPTER_VISIBILITY_MODE_LIMITED_DISCOVERABLE.
+ * @param[in]  duration  The duration until the visibility mode is changed to #BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE (in seconds)
+ * @param[in]  user_data  The user data passed from the callback registration function
+ * @pre  This function will be invoked if you register this callback using bt_adapter_set_visibility_duration_changed_cb().
+ * @see  bt_adapter_set_visibility_duration_changed_cb()
+ * @see  bt_adapter_unset_visibility_duration_changed_cb()
+ * @see  bt_adapter_set_visibility()
+ */
+typedef void (*bt_adapter_visibility_duration_changed_cb)(int duration, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief  Called when the state of device discovery changes.
+ *
+ * @remarks If \a discovery_state is #BT_ADAPTER_DEVICE_DISCOVERY_FOUND,
+ * then you can get some information, such as remote device address, remote device name, rssi, and bonding state.
+ *
+ * @param[in] result The result of the device discovery
+ * @param[in] discovery_state The discovery state to be changed
+ * @param[in] device_info The information of the discovered device \n
+ *                                     If \a discovery_state is #BT_ADAPTER_DEVICE_DISCOVERY_STARTED or
+ * #BT_ADAPTER_DEVICE_DISCOVERY_FINISHED, then \a device_info is NULL.
+ * @param[in] user_data The user data passed from the callback registration function
+ *
+ * @pre Either bt_adapter_start_device_discovery() or bt_adapter_stop_device_discovery() will invoke this function
+ * if you register this callback using bt_adapter_set_device_discovery_state_changed_cb().
+ *
+ * @see bt_adapter_start_device_discovery()
+ * @see bt_adapter_stop_device_discovery()
+ * @see bt_adapter_set_device_discovery_state_changed_cb()
+ * @see bt_adapter_unset_device_discovery_state_changed_cb()
+ *
+ */
+typedef void (*bt_adapter_device_discovery_state_changed_cb)
+       (int result, bt_adapter_device_discovery_state_e discovery_state, bt_adapter_device_discovery_info_s *discovery_info, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief  Called when you get bonded devices repeatedly.
+ *
+ * @param[in] device_info The bonded device information
+ * @param[in] user_data The user data passed from the foreach function
+ * @return @c true to continue with the next iteration of the loop,
+ * \n @c false to break out of the loop.
+ * @pre bt_adapter_foreach_bonded_device() will invoke this function.
+ *
+ * @see bt_adapter_foreach_bonded_device()
+ *
+ */
+typedef bool (*bt_adapter_bonded_device_cb)(bt_device_info_s *device_info, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief Called when the process of creating bond finishes.
+ * @remarks If the remote user does not respond within 60 seconds, a time out will happen with #BT_ERROR_TIMED_OUT result code.\n
+ * If bt_device_cancel_bonding() is called and it returns #BT_ERROR_NONE, then this callback function will be called
+ * with #BT_ERROR_CANCELLED result. \n
+ * If creating a bond succeeds but service search fails, then this callback will be called with #BT_ERROR_SERVICE_SEARCH_FAILED.
+ * In this case, you should try service search again by bt_device_start_service_search() to get the supported service list.
+ *
+ * @param[in] result The result of the bonding device
+ * @param[in] device_info The device information which you creates bond with
+ * @param[in] user_data The user data passed from the callback registration function
+ *
+ * @pre Either bt_device_create_bond() will invoke this function
+ * if you register this callback using bt_device_set_bond_created_cb().
+ *
+ * @see bt_device_create_bond()
+ * @see bt_device_cancel_bonding()
+ * @see bt_device_set_bond_created_cb()
+ * @see bt_device_unset_bond_created_cb()
+ */
+typedef void (*bt_device_bond_created_cb)(int result, bt_device_info_s *device_info, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief  Called when you get connected profiles repeatedly.
+ * @param[in] profile The connected Bluetooth profile
+ * @param[in] user_data The user data passed from the foreach function
+ * @return @c true to continue with the next iteration of the loop,
+ * \n @c false to break out of the loop.
+ * @pre bt_device_foreach_connected_profiles() will invoke this function.
+ * @see bt_device_foreach_connected_profiles()
+ */
+typedef bool (*bt_device_connected_profile)(bt_profile_e profile, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief  Called when the bond destroys.
+ * @param[in] result The result that a bond is destroyed
+ * @param[in] remote_address The address of the remote Bluetooth device to destroy bond with
+ * @param[in] user_data The user data passed from the callback registration function
+ * @pre bt_device_destroy_bond() will invoke this function
+ * if you register this callback using bt_device_set_bond_destroyed_cb().
+ *
+ * @see bt_device_destroy_bond()
+ * @see bt_device_set_bond_destroyed_cb()
+ * @see bt_device_unset_bond_destroyed_cb()
+ */
+typedef void (*bt_device_bond_destroyed_cb)(int result, char *remote_address, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief  Called when the authorization of device changes.
+ * @param[in] authorization The authorization of device
+ * @param[in] remote_address The address of the remote Bluetooth device which is (un)authorized
+ * @param[in] user_data The user data passed from the callback registration function
+ * @pre bt_device_set_authorization() will invoke this function if you register this callback using bt_device_set_authorization_changed_cb().
+ *
+ * @see bt_device_set_authorization()
+ * @see #bt_device_set_authorization_changed_cb()
+ * @see #bt_device_unset_authorization_changed_cb()
+ */
+typedef void (*bt_device_authorization_changed_cb)
+       (bt_device_authorization_e authorization, char *remote_address, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief  Called when the process of service search finishes.
+ * @remark If bt_device_cancel_service_search() is called and it returns #BT_ERROR_NONE,
+ * then this callback function will be called with #BT_ERROR_CANCELLED result.
+ *
+ * @param[in] result The result of the service searching
+ * @param[in] sdp_info The structure of service lists found on a device
+ * @param[in] user_data The user data passed from the callback registration function
+ * @pre Either bt_device_start_service_search() will invoke this function
+ * if you register this callback using  bt_device_set_service_searched_cb().
+ *
+ * @see bt_device_start_service_search()
+ * @see bt_device_cancel_service_search()
+ * @see bt_device_set_service_searched_cb()
+ * @see bt_device_unset_service_searched_cb()
+ *
+ */
+typedef void (*bt_device_service_searched_cb)(int result, bt_device_sdp_info_s *sdp_info, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief  Called when the connection state is changed.
+ * @param[in] connected The connection status: (@c true = connected, @c false = disconnected)
+ * @param[in] remote_address The address of the remote Bluetooth device
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_device_set_connection_state_changed_cb()
+ * @see bt_device_unset_connection_state_changed_cb()
+ */
+typedef void (*bt_device_connection_state_changed_cb)(bool connected, const char *remote_address, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ * @brief Called when you receive data.
+ *
+ * @param[in] data The received data from the remote device
+ * @param[in] user_data The user data passed from the callback registration function
+ *
+ * @pre When the connected remote Bluetooth device invokes bt_socket_send_data(),
+ *             this function will be invoked if you register this function using bt_socket_set_data_received_cb().
+ *
+ * @see bt_socket_set_data_received_cb()
+ * @see bt_socket_unset_data_received_cb()
+ * @see bt_socket_send_data()
+ */
+typedef void (*bt_socket_data_received_cb)(bt_socket_received_data_s *data, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ * @brief  Called when the socket connection state changes.
+ * @param[in] result The result of connection state changing
+ * @param[in] connection_state The connection state
+ * @param[in] connection The connection information which is established or disconnected
+ * @param[in] user_data The user data passed from the callback registration function
+ * @pre Either bt_socket_connect_rfcomm() will invoke this function.
+ * In addtion, bt_socket_connection_state_changed_cb() will be invoked when the socket connection state is changed.
+ * @see bt_socket_listen_and_accept_rfcomm()
+ * @see bt_socket_connect_rfcomm()
+ * @see bt_socket_set_connection_state_changed_cb()
+ * @see bt_socket_unset_connection_state_changed_cb()
+ */
+typedef void (*bt_socket_connection_state_changed_cb)
+       (int result, bt_socket_connection_state_e connection_state, bt_socket_connection_s *connection, void *user_data);
+
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_MODULE
+ * @brief Initializes the Bluetooth API.
+ *
+ * @remarks This function must be called before Bluetooth API starts. \n
+ * You must free all resources of the Bluetooth service by calling bt_deinitialize() if Bluetooth service is no longer needed.
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ *
+ * @see  bt_deinitialize()
+ */
+int bt_initialize(void);
+
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_MODULE
+ * @brief Releases all resources of the Bluetooth API.
+ *
+ * @remarks This function must be called if Bluetooth API is no longer needed.
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ *
+ * @pre Bluetooth API must be initialized with bt_initialize().
+ *
+ * @see bt_initialize()
+ */
+int bt_deinitialize(void);
+
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief Enables the local Bluetooth adapter, asynchronously.
+ *
+ * @details This function enables Bluetooth protocol stack and hardware.
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_ALREADY_DONE  Already enabled
+ * @retval #BT_ERROR_NOW_IN_PROGRESS  Operation now in progress
+ *
+ * @pre Bluetooth service must be initialized with bt_initialize().
+ * @post This function invokes bt_adapter_state_changed_cb().
+ *
+ * @see bt_initialize()
+ * @see bt_adapter_get_state()
+ * @see bt_adapter_disable()
+ * @see bt_adapter_set_state_changed_cb()
+ * @see bt_adapter_unset_state_changed_cb()
+ * @see bt_adapter_state_changed_cb()
+ *
+ */
+int bt_adapter_enable(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief Disables the local Bluetooth adapter, asynchronously.
+ *
+ * @details This function disables Bluetooth protocol stack and hardware.
+ *
+ * @remarks You should disable Bluetooth adapter to switch off Bluetooth chip, which is helpful for saving power.
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_NOW_IN_PROGRESS  Operation now in progress
+ *
+ * @pre Bluetooth API must be enabled with bt_adapter_enable().
+ * @post This function invokes bt_adapter_state_changed_cb().
+ *
+ * @see bt_adapter_get_state()
+ * @see bt_adapter_enable()
+ * @see bt_adapter_state_changed_cb()
+ * @see bt_adapter_set_state_changed_cb()
+ * @see bt_adapter_unset_state_changed_cb ()
+ *
+ */
+int bt_adapter_disable(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief Gets the current state of local Bluetooth adapter.
+ *
+ * @param[out] adapter_state The current adapter state
+ *
+ * @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
+ *
+ * @pre Bluetooth service must be initialized with bt_initialize().
+ *
+ * @see bt_initialize()
+ * @see bt_adapter_enable()
+ * @see bt_adapter_disable()
+ */
+int bt_adapter_get_state(bt_adapter_state_e *adapter_state);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief Gets the address of local Bluetooth adapter.
+ *
+ * @remarks The @a local_address must be released with free() by you.
+ *
+ * @param[out] local_address The device address of local Bluetooth adapter
+ *
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_OUT_OF_MEMORY  Out of memory
+ * @retval #BT_ERROR_OPERATION_FAILED Operation failed
+ * @pre The state of local Bluetooth must be #BT_ADAPTER_ENABLED with bt_adapter_enable().
+ * @see bt_adapter_enable()
+ * @see bt_adapter_get_name()
+ */
+int bt_adapter_get_address(char **local_address);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief Gets the name of local Bluetooth adapter.
+ *
+ * @details Use this function to get the friendly name associated with Bluetooth
+ * device, retrieved by the remote Bluetooth devices.
+ *
+ * @remarks The @a local_name must be released with free() by you.
+ *
+ * @param[out] local_name  The local device name
+ *
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_OUT_OF_MEMORY  Out of memory
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ *
+ * @pre The state of local Bluetooth must be #BT_ADAPTER_ENABLED with bt_adapter_enable().
+ *
+ * @see bt_adapter_enable()
+ * @see bt_adapter_set_name()
+ */
+int bt_adapter_get_name(char **local_name);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief Sets the name of local Bluetooth adapter.
+ *
+ * @param[in] local_name The name of the Bluetooth device. \n
+ *                             The maximum length is 248 characters.
+ *
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED Operation failed
+ *
+ * @pre The state of local Bluetooth must be #BT_ADAPTER_ENABLED with bt_adapter_enable().
+ * @post bt_adapter_name_changed_cb() will be invoked if this function returns #BT_ERROR_NONE.
+ *
+ * @see bt_adapter_enable()
+ * @see bt_adapter_get_name()
+ * @see bt_adapter_name_changed_cb()
+ * @see bt_adapter_set_name_changed_cb()
+ * @see bt_adapter_unset_name_changed_cb()
+ */
+int bt_adapter_set_name(const char *local_name);
+
+/**
+ * @ingroup  CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief  Gets the visibility mode of local Bluetooth adapter.
+ * @param[out] mode  The visibility mode of the Bluetooth device
+ * @param[out] duration  The duration until the visibility mode is changed to #BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE (in seconds).
+ * @a duration is valid only if @a mode is #BT_ADAPTER_VISIBILITY_MODE_LIMITED_DISCOVERABLE. This value can be NULL.
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The state of local Bluetooth must be #BT_ADAPTER_ENABLED with bt_adapter_enable().
+ * @see bt_adapter_enable()
+ * @see bt_adapter_set_visibility()
+ */
+int bt_adapter_get_visibility(bt_adapter_visibility_mode_e *mode, int *duration);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief Sets the visibility mode.
+ *
+ * @remarks #BT_ADAPTER_VISIBILITY_MODE_LIMITED_DISCOVERABLE will change to #BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE
+ * after the given @a duration goes.
+ *
+ * @param[in] discoverable_mode The Bluetooth visibility mode to set
+ * @param[in] duration The duration until the visibility mode is changed to #BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE (in seconds).
+ * @a duration is used only for #BT_ADAPTER_VISIBILITY_MODE_LIMITED_DISCOVERABLE mode.
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ *
+ * @pre The state of local Bluetooth must be #BT_ADAPTER_ENABLED with bt_adapter_enable().
+ * @post bt_adapter_visibility_mode_changed_cb() will be invoked if this function returns #BT_ERROR_NONE.
+ *
+ * @see bt_adapter_enable()
+ * @see bt_adapter_get_visibility()
+ * @see bt_adapter_visibility_mode_changed_cb()
+ * @see bt_adapter_set_visibility_mode_changed_cb()
+ * @see bt_adapter_unset_visibility_mode_changed_cb()
+ */
+int bt_adapter_set_visibility(bt_adapter_visibility_mode_e discoverable_mode, int duration);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief Starts the device discovery, asynchronously.
+ *
+ * @details If a device is discovered, bt_adapter_device_discovery_state_changed_cb() will be invoked
+ * with #BT_ADAPTER_DEVICE_DISCOVERY_FOUND, and then bt_adapter_device_discovery_state_changed_cb()
+ * will be called with #BT_ADAPTER_DEVICE_DISCOVERY_FINISHED in case of the completion or cancellation of the discovery.
+ *
+ * @remarks To connect to peer Bluetooth device, you need to know its Bluetooth address. \n
+ * The device discovery can be stopped by bt_adapter_stop_device_discovery().
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_NOW_IN_PROGRESS  Operation is now in progress
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ *
+ * @pre The state of local Bluetooth must be #BT_ADAPTER_ENABLED with bt_adapter_enable().
+ * @post This function invokes bt_adapter_device_discovery_state_changed_cb().
+ *
+ * @see bt_adapter_enable()
+ * @see bt_adapter_is_discovering()
+ * @see bt_adapter_stop_device_discovery()
+ * @see bt_adapter_device_discovery_state_changed_cb()
+ * @see bt_adapter_set_device_discovery_state_changed_cb()
+ * @see bt_adapter_unset_device_discovery_state_changed_cb()
+ */
+int bt_adapter_start_device_discovery(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief Stops the device discovery, asynchronously.
+ * @remarks The device discovery process will take 10 ~ 20 seconds to get all the devices in vicinity.
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_NOT_IN_PROGRESS  Operation is not in progress
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ *
+ * @pre The device discovery must be in progress with bt_adapter_start_device_discovery().
+ * @post This function invokes bt_adapter_device_discovery_state_changed_cb().
+ *
+ * @see bt_adapter_is_discovering()
+ * @see bt_adapter_start_device_discovery()
+ * @see bt_adapter_set_device_discovery_state_changed_cb()
+ * @see bt_adapter_unset_device_discovery_state_changed_cb()
+ * @see bt_adapter_device_discovery_state_changed_cb()
+ */
+int bt_adapter_stop_device_discovery(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief Checks for the device discovery is in progress or not.
+ *
+ * @remarks If Bluetooth discovery is in progress, other operations are not allowed and
+ * you have to either stop the discovery operation, or wait for it to be finished,
+ * before performing other operations.
+
+ * @param[out] is_discovering The discovering status: (@c true = in progress , @c  false = not in progress )
+ *
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ *
+ * @pre The state of local Bluetooth must be #BT_ADAPTER_ENABLED with bt_adapter_enable().
+ *
+ * @see bt_adapter_enable()
+ * @see bt_adapter_start_device_discovery()
+ * @see bt_adapter_stop_device_discovery()
+ */
+int bt_adapter_is_discovering(bool *is_discovering);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief Retrieves the device information of all bonded devices.
+ *
+ * @param [in] callback The callback function to invoke
+ * @param [in] user_data The user data passed from the foreach function
+ *
+ * @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_OUT_OF_MEMORY  Out of memory
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ *
+ * @pre The state of local Bluetooth must be #BT_ADAPTER_ENABLED with bt_adapter_enable().
+ * @post This function invokes bt_adapter_bonded_device_cb().
+ *
+ * @see bt_adapter_bonded_device_cb()
+ * @see bt_adapter_enable()
+ */
+int bt_adapter_foreach_bonded_device(bt_adapter_bonded_device_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief Gets the device information of a bonded device.
+ * @remarks The @a device_info must be released with bt_adapter_free_device_info() by you .
+ *
+ * @param [in] remote_address The address of remote device
+ * @param [out] device_info The bonded device information
+ *
+ * @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_OUT_OF_MEMORY  Out of memory
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_BONDED  Remote device not bonded
+ *
+ * @pre The state of local Bluetooth must be #BT_ADAPTER_ENABLED with bt_adapter_enable().
+ * @post This function invokes bt_adapter_bonded_device_cb().
+ *
+ * @see bt_adapter_bonded_device_cb()
+ * @see bt_adapter_enable()
+ */
+int bt_adapter_get_bonded_device_info(const char *remote_address, bt_device_info_s **device_info);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief Frees device info.
+ *
+ * @param [in] device_info The bonded device information
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ *
+ * @see bt_adapter_get_bonded_device_info()
+ */
+int bt_adapter_free_device_info(bt_device_info_s *device_info);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief Checks whether the UUID of service is used or not
+ * @param[in] service_uuid The UUID of service
+ * @param[out] used Indicates whether the service is used or not
+ * @return true on success, otherwise false.
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @see bt_adapter_enable()
+ */
+int bt_adapter_is_service_used(const char *service_uuid, bool *used);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief  Registers a callback function to be invoked when the Bluetooth adapter state changes.
+ *
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ *
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @post bt_adapter_state_changed_cb() will be invoked.
+ *
+ * @see bt_initialize()
+ * @see bt_adapter_state_changed_cb()
+ * @see bt_adapter_set_state_changed_cb()
+ * @see bt_adapter_unset_state_changed_cb()
+ */
+int bt_adapter_set_state_changed_cb(bt_adapter_state_changed_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief      Unregisters the callback function.
+ *
+ * @return     0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ *
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ *
+ * @see bt_initialize()
+ * @see bt_adapter_set_state_changed_cb()
+ */
+int bt_adapter_unset_state_changed_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief  Registers a callback function to be invoked when the name of Bluetooth adapter changes.
+ *
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ *
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @post  bt_adapter_name_changed_cb() will be invoked.
+ *
+ * @see bt_initialize()
+ * @see bt_adapter_name_changed_cb()
+ * @see bt_adapter_unset_name_changed_cb()
+ */
+int bt_adapter_set_name_changed_cb(bt_adapter_name_changed_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief      Unregisters the callback function.
+ *
+ * @return     0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ *
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ *
+ * @see bt_initialize()
+ * @see bt_adapter_set_name_changed_cb()
+ */
+int bt_adapter_unset_name_changed_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief  Registers a callback function to be invoked when the visibility mode changes.
+ *
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ *
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @post bt_adapter_visibility_mode_changed_cb() will be invoked.
+ *
+ * @see bt_initialize()
+ * @see bt_adapter_visibility_mode_changed_cb()
+ * @see bt_adapter_unset_visibility_mode_changed_cb()
+ */
+int bt_adapter_set_visibility_mode_changed_cb(bt_adapter_visibility_mode_changed_cb callback, void *user_data);
+
+/**
+ * @ingroup  CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief  Unregisters the callback function.
+ *
+ * @return  0 on success, otherwise a negative error value.
+ * @retval  #BT_ERROR_NONE  Successful
+ * @retval  #BT_ERROR_NOT_INITIALIZED  Not initialized
+ *
+ * @pre  The Bluetooth service must be initialized with bt_initialize().
+ *
+ * @see  bt_initialize()
+ * @see  bt_adapter_set_visibility_mode_changed_cb()
+ */
+int bt_adapter_unset_visibility_mode_changed_cb(void);
+
+/**
+ * @ingroup  CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief  Registers a callback function to be invoked every second
+ * until the visibility mode is changed from #BT_ADAPTER_VISIBILITY_MODE_LIMITED_DISCOVERABLE
+ * to #BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE.
+ * @details  When you set visibility mode as #BT_ADAPTER_VISIBILITY_MODE_LIMITED_DISCOVERABLE,
+ * @a callback will be called every second until visibility mode is changed to #BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE.
+ * @param[in]  callback  The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval  #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre  The Bluetooth service must be initialized by bt_initialize().
+ * @post  bt_adapter_visibility_duration_changed_cb() will be invoked.
+ * @see  bt_initialize()
+ * @see  bt_adapter_set_visibility()
+ * @see  bt_adapter_visibility_duration_changed_cb()
+ * @see  bt_adapter_unset_visibility_duration_changed_cb()
+ */
+int bt_adapter_set_visibility_duration_changed_cb(bt_adapter_visibility_duration_changed_cb callback, void *user_data);
+
+/**
+ * @ingroup  CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief       Unregisters the callback function.
+ * @return  0 on success, otherwise a negative error value.
+ * @retval  #BT_ERROR_NONE  Successful
+ * @retval  #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre  The Bluetooth service must be initialized with bt_initialize().
+ * @see  bt_initialize()
+ * @see  bt_adapter_set_visibility_duration_changed_cb()
+ */
+int bt_adapter_unset_visibility_duration_changed_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief  Registers a callback function to be invoked when the device discovery state changes.
+ *
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ *
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @post bt_adapter_device_discovery_state_changed_cb() will be invoked.
+ *
+ * @see bt_initialize()
+ * @see bt_adapter_device_discovery_state_changed_cb()
+ * @see bt_adapter_set_device_discovery_state_changed_cb()
+ * @see bt_adapter_unset_device_discovery_state_changed_cb()
+ */
+int bt_adapter_set_device_discovery_state_changed_cb(bt_adapter_device_discovery_state_changed_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE
+ * @brief      Unregisters the callback function.
+ *
+ * @return     0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ *
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ *
+ * @see bt_initialize()
+ * @see bt_adapter_set_device_discovery_state_changed_cb()
+ */
+int bt_adapter_unset_device_discovery_state_changed_cb(void);
+
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief Creates a bond with a remote Bluetooth device, asynchronously.
+ *
+ * @remarks A bond can be destroyed by bt_device_destroy_bond().\n
+ * The bonding request can be cancelled by bt_device_cancel_bonding().
+ *
+ * @param[in] remote_address The address of the remote Bluetooth device with which the bond should be created
+ *
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_RESOURCE_BUSY  Device or resource busy
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ *
+ * @pre The state of local Bluetooth must be #BT_ADAPTER_ENABLED with bt_adapter_enable()
+ * @pre The remote device must be discoverable with bt_adapter_start_device_discovery().
+ * @post This function invokes bt_device_bond_created_cb().
+ *
+ * @see bt_adapter_enable()
+ * @see bt_adapter_start_device_discovery()
+ * @see bt_device_bond_created_cb()
+ * @see bt_device_cancel_bonding()
+ * @see bt_device_destroy_bond()
+ * @see bt_device_set_bond_created_cb()
+ * @see bt_device_unset_bond_created_cb()
+ */
+int bt_device_create_bond(const char *remote_address);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief Cancels the bonding process.
+ *
+ * @remakrs Use this function when the remote Bluetooth device is not responding to the
+ * bond request or you wish to cancel the bonding request.
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_NOT_IN_PROGRESS  Operation not in progress
+ * @pre The creating a bond must be in progress by bt_device_create_bond().
+ *
+ * @see bt_device_create_bond()
+ * @see bt_device_bond_created_cb()
+ * @see bt_device_set_bond_created_cb()
+ * @see bt_device_unset_bond_created_cb()
+ */
+int bt_device_cancel_bonding(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief Destroys the bond, asynchronously.
+ *
+ * @param[in] remote_address The address of the remote Bluetooth device to remove bonding
+ *
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_RESOURCE_BUSY  Device or resource busy
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_BONDED  Remote device not bonded
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ *
+ * @pre The state of local Bluetooth must be #BT_ADAPTER_ENABLED with bt_adapter_enable().
+ * @pre The bond with the remote device must be created with bt_device_create_bond().
+ * @post This function invokes bt_device_bond_destroyed_cb().
+ *
+ * @see bt_adapter_enable()
+ * @see bt_device_create_bond()
+ * @see bt_device_bond_destroyed_cb()
+ * @see bt_device_set_bond_destroyed_cb()
+ * @see bt_device_unset_bond_destroyed_cb()
+ */
+int bt_device_destroy_bond(const char *remote_address);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief Sets an alias for the bonded device.
+ *
+ * @param[in] remote_address The address of the remote Bluetooth device
+ * @param[in] alias The alias of the remote Bluetooth device
+ *
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_BONDED  Remote device not bonded
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ *
+ * @pre The state of local Bluetooth must be #BT_ADAPTER_ENABLED with bt_adapter_enable().
+ * @pre The bond with the remote device must be created with bt_device_create_bond().
+ *
+ * @see bt_adapter_enable()
+ * @see bt_device_create_bond()
+ */
+int bt_device_set_alias(const char *remote_address, const char *alias);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief Sets the authorization of a bonded device, asynchronously.
+ *
+ * @remarks Once a device is authorized, you don't need to receive a confirmation.
+ *
+ * @param[in] remote_address The address of the remote Bluetooth device to authorize
+ * @param[in] authorization The Bluetooth authorization state
+ *
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_BONDED  Remote device not bonded
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ *
+ * @pre The state of local Bluetooth must be #BT_ADAPTER_ENABLED with bt_adapter_enable().
+ * @pre The bond with the remote device must be created with bt_device_create_bond().
+ * @post bt_device_authorization_changed_cb() will be invoked.
+ *
+ * @see bt_adapter_enable()
+ * @see bt_device_create_bond()
+ * @see bt_device_authorization_changed_cb()
+ * @see bt_device_set_authorization_changed_cb()
+ * @see bt_device_unset_authorization_changed_cb()
+ */
+int bt_device_set_authorization(const char *remote_address, bt_device_authorization_e authorization_state);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief Starts the search for services supported by the specified device, asynchronously.
+ *
+ * @remarks If creating a bond succeeds, which means bt_device_bond_created_cb() is called with result #BT_ERROR_NONE,
+ * then you don't need to run this function.\n
+ * The service search takes a couple of seconds to complete normally. \n
+ * The service search can be canceled by bt_device_cancel_service_search().
+ *
+ * @param[in] remote_address The address of the remote Bluetooth device whose services need to be checked
+ *
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_BONDED  Remote device not bonded
+ * @retval #BT_ERROR_SERVICE_SEARCH_FAILED  Service search failed
+ *
+ * @pre The state of local Bluetooth must be #BT_ADAPTER_ENABLED with bt_adapter_enable().
+ * @pre The remote device must be discoverable with bt_adapter_start_device_discovery().
+ * @pre The bond with the remote device must be created with bt_device_create_bond().
+ * @post This function invokes bt_device_service_searched_cb().
+ *
+ * @see bt_adapter_enable()
+ * @see bt_adapter_start_device_discovery()
+ * @see bt_device_create_bond()
+ * @see bt_device_bond_created_cb()
+ * @see bt_device_service_searched_cb()
+ * @see bt_device_cancel_service_search()
+ * @see bt_device_set_service_searched_cb()
+ * @see bt_device_unset_service_searched_cb()
+ */
+int bt_device_start_service_search(const char *remote_address);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief Cancels service search process.
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_BONDED  Remote device not bonded
+ * @retval #BT_ERROR_NOT_IN_PROGRESS  Operation not in progress
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ *
+ * @pre The service search must be in progress by bt_device_start_service_search().
+ *
+ * @see bt_device_start_service_search()
+ * @see bt_device_service_searched_cb()
+ * @see bt_device_set_service_searched_cb()
+ * @see bt_device_unset_service_searched_cb()
+ */
+int bt_device_cancel_service_search(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief Gets the connected profiles.
+ * @param[in] remote_address The address of the remote device
+ * @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_INVALID_PARAMETER  Invalid parameter
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @pre The state of local Bluetooth must be #BT_ADAPTER_ENABLED with bt_adapter_enable().
+ * @post bt_device_connected_profile() will be invoked.
+ * @see bt_adapter_enable()
+ * @see bt_device_connected_profile()
+ */
+int bt_device_foreach_connected_profiles(const char *remote_address, bt_device_connected_profile callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief  Registers a callback function to be invoked when the bond creates.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @post  bt_device_bond_created_cb() will be invoked.
+ * @see bt_initialize()
+ * @see bt_device_bond_created_cb()
+ * @see bt_device_unset_bond_created_cb()
+ */
+int bt_device_set_bond_created_cb(bt_device_bond_created_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief      Unregisters the callback function.
+ * @return     0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @see bt_initialize()
+ * @see bt_device_set_bond_created_cb()
+ */
+int bt_device_unset_bond_created_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief  Registers a callback function to be invoked when the bond destroys.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @post  bt_device_bond_destroyed_cb() will be invoked.
+ * @see bt_initialize()
+ * @see bt_device_bond_destroyed_cb()
+ * @see bt_device_unset_bond_destroyed_cb()
+ */
+int bt_device_set_bond_destroyed_cb(bt_device_bond_destroyed_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief      Unregisters the callback function.
+ * @return     0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @see bt_initialize()
+ * @see bt_device_set_bond_destroyed_cb()
+ */
+int bt_device_unset_bond_destroyed_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief  Registers a callback function to be invoked when the authorization of device changes.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @post  bt_device_authorization_changed_cb() will be invoked.
+ * @see bt_initialize()
+ * @see bt_device_authorization_changed_cb()
+ * @see bt_device_set_authorization_changed_cb()
+ * @see bt_device_unset_authorization_changed_cb()
+ */
+int bt_device_set_authorization_changed_cb(bt_device_authorization_changed_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief      Unregisters the callback function.
+ * @return     0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @see bt_initialize()
+ * @see bt_device_set_authorization_changed_cb()
+ */
+int bt_device_unset_authorization_changed_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief  Registers a callback function to be invoked when the process of service search finishes.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @post  bt_device_service_searched_cb() will be invoked.
+ * @see bt_initialize()
+ * @see bt_device_service_searched_cb()
+ * @see bt_device_unset_service_searched_cb()
+ */
+int bt_device_set_service_searched_cb(bt_device_service_searched_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief      Unregisters the callback function.
+ * @return     0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @see bt_initialize()
+ * @see bt_device_set_service_searched_cb()
+ */
+int bt_device_unset_service_searched_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief  Registers a callback function to be invoked when the connection state is changed.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @post bt_device_connection_state_changed_cb() will be invoked.
+ * @see bt_initialize()
+ * @see bt_device_connection_state_changed_cb()
+ * @see bt_device_unset_connection_state_changed_cb()
+ */
+int bt_device_set_connection_state_changed_cb(bt_device_connection_state_changed_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_DEVICE_MODULE
+ * @brief      Unregisters the callback function to be invoked when the connection state is changed.
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @see bt_initialize()
+ * @see bt_device_set_connection_state_changed_cb()
+ */
+int bt_device_unset_connection_state_changed_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ * @brief Registers a rfcomm socket with a specific UUID.
+ *
+ * @remarks A socket can be destroyed by bt_socket_destroy_rfcomm().
+ *
+ * @param[in] service_uuid The UUID of service to provide
+ * @param[out] socket_fd The file descriptor of socket to listen
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The state of local Bluetooth must be #BT_ADAPTER_ENABLED with bt_adapter_enable().
+ *
+ * @see bt_adapter_enable()
+ * @see bt_socket_listen_and_accept_rfcomm()
+ * @see bt_socket_destroy_rfcomm()
+ */
+int bt_socket_create_rfcomm(const char *service_uuid, int *socket_fd);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ * @brief Removes the rfcomm socket with the given socket.
+ * @remarks If callback function bt_socket_connection_state_changed_cb() is set and the remote Bluetooth device is connected,
+ * then bt_socket_connection_state_changed_cb() will be called when this function is finished successfully.
+ *
+ * @param[in] socket_fd The file descriptor of socket to destroy
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ *
+ * @pre The socket must be created with bt_socket_create_rfcomm().
+ * @post If callback function bt_socket_connection_state_changed_cb() is set and the remote Bluetooth device is connected,
+ * then bt_socket_connection_state_changed_cb() will be called.
+ * @see bt_socket_create_rfcomm()
+ * @see bt_socket_connection_state_changed_cb()
+ * @see bt_socket_set_connection_state_changed_cb()
+ * @see bt_socket_unset_connection_state_changed_cb()
+ */
+int bt_socket_destroy_rfcomm(int socket_fd);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ * @brief Starts listening on passed rfcomm socket and accepts connection requests.
+ * @details Pop-up is shown automatically when a RFCOMM connection is requested.
+ * bt_socket_connection_state_changed_cb() will be called with
+ * #BT_SOCKET_CONNECTED if you click "yes" and connection is finished successfully.
+ * @param[in] socket_fd The file descriptor of socket on which start to listen
+ * @param[in] max_pending_connections The maximum number of pending connections
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The socket must be created with bt_socket_create_rfcomm().
+ * @post If callback function bt_socket_connection_state_changed_cb() is set,
+ * then bt_socket_connection_state_changed_cb() will be called when the remote Bluetooth device is connected.
+ * @see bt_socket_create_rfcomm()
+ * @see bt_socket_connection_state_changed_cb()
+ * @see bt_socket_set_connection_state_changed_cb()
+ * @see bt_socket_unset_connection_state_changed_cb()
+ */
+int bt_socket_listen_and_accept_rfcomm(int socket_fd, int max_pending_connections);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ * @brief  Called when a RFCOMM connection is requested.
+ * @details You must call bt_socket_accept() if you want to accept. Otherwise, you must call bt_socket_reject().
+ * @param[in] socket_fd  The file descriptor of socket on which a connection is requested
+ * @param[in] remote_address  The address of remote device
+ * @param[in] user_data The user data passed from the callback registration function
+ * @pre If you register this callback function by bt_socket_set_connection_requested_cb() and listen a socket by bt_socket_listen(),
+ * bt_socket_connection_requested_cb() will be invoked.
+ * @see bt_socket_listen()
+ * @see bt_socket_accept()
+ * @see bt_socket_reject()
+ */
+typedef void (*bt_socket_connection_requested_cb) (int socket_fd, const char *remote_address, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ * @brief Starts listening on passed rfcomm socket.
+ * @details bt_socket_connection_requested_cb() will be called when a RFCOMM connection is requested.
+ *
+ * @param[in] socket_fd  The file descriptor socket on which start to listen
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ *
+ * @pre The socket must be created with bt_socket_create_rfcomm().
+ * @post This function invokes bt_socket_connection_state_changed_cb().
+ *
+ * @see bt_socket_create_rfcomm()
+ * @see bt_socket_set_connection_requested_cb()
+ * @see bt_socket_unset_connection_requested_cb()
+ * @see bt_socket_connection_requested_cb()
+ */
+int bt_socket_listen(int socket_fd, int max_pending_connections);
+
+/**
+ * @ingroup  CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ * @brief  Accepts a connection request.
+ * @param[in] requested_socket_fd  The file descriptor of socket on which a connection is requested
+ * @param[out] connected_socket_fd  The file descriptor of connected socket
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The connection is requested by bt_socket_connection_requested_cb().
+ * @see bt_socket_create_rfcomm()
+ * @see bt_socket_connection_requested_cb()
+ * @see bt_socket_listen()
+ * @see bt_socket_reject()
+*/
+int bt_socket_accept(int requested_socket_fd, int *connected_socket_fd);
+
+/**
+ * @ingroup  CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ * @brief  Rejects a connection request.
+ * @param[in] socket_fd  The file descriptor of socket on which a connection is requested
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The connection is requested by bt_socket_connection_requested_cb().
+ * @see bt_socket_create_rfcomm()
+ * @see bt_socket_connection_requested_cb()
+ * @see bt_socket_listen()
+ * @see bt_socket_accept()
+ */
+int bt_socket_reject(int socket_fd);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ * @brief Connects to a specific RFCOMM based service on a remote Bluetooth device UUID, asynchronously.
+ *
+ * @remarks A connection can be disconnected by bt_socket_disconnect_rfcomm().
+ *
+ * @param[in] remote_address The address of the remote Bluetooth device
+ * @param[in] service_uuid The UUID of service provided by the remote Bluetooth device
+ *
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_BONDED  Remote device not bonded
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ *
+ * @pre The state of local Bluetooth must be #BT_ADAPTER_ENABLED with bt_adapter_enable().
+ * @pre The remote device must be discoverable with bt_adapter_start_device_discovery().
+ * @pre The bond with the remote device must be created with bt_device_create_bond().
+ * @post This function invokes bt_socket_connection_state_changed_cb().
+ *
+ * @see bt_adapter_enable()
+ * @see bt_device_create_bond()
+ * @see bt_adapter_start_device_discovery()
+ * @see bt_device_start_service_search()
+ * @see bt_socket_disconnect_rfcomm()
+ * @see bt_socket_connection_state_changed_cb()
+ * @see bt_socket_set_connection_state_changed_cb()
+ * @see bt_socket_unset_connection_state_changed_cb()
+ */
+int bt_socket_connect_rfcomm(const char *remote_address, const char *service_uuid);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ * @brief Disconnects the RFCOMM connection with the given file descriptor of conneted socket.
+ * @remarks Because this function is synchronous, bt_socket_connection_state_changed_cb() won't be called.
+ * @param[in] socket_fd  The file descriptor of socket to close
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The connection must be established.
+ */
+int bt_socket_disconnect_rfcomm(int socket_fd);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ * @brief Sends data to the connected device.
+ *
+ * @param[in] socket_fd The file descriptor of connected socket
+ * @param[in] data The data to be sent
+ * @param[in] length The length of data to be sent
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ *
+ * @pre The connection must be established.
+ */
+int bt_socket_send_data(int socket_fd, const char *data, int length);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ * @brief  Register a callback function that will be invoked when you receive data.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @post  bt_socket_data_received_cb() will be invoked.
+ * @see bt_initialize()
+ * @see bt_socket_data_received_cb()
+ * @see bt_socket_set_data_received_cb()
+ * @see bt_socket_unset_data_received_cb()
+ */
+int bt_socket_set_data_received_cb(bt_socket_data_received_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ * @brief      Unregisters the callback function.
+ * @return     0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @see bt_initialize()
+ * @see bt_socket_data_received_cb()
+ * @see bt_socket_set_data_received_cb()
+ */
+int bt_socket_unset_data_received_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ * @brief  Register a callback function that will be invoked when a RFCOMM connection is requested.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @post If you listen a socket by bt_socket_listen(), bt_socket_connection_requested_cb() will be invoked.
+ * @see bt_initialize()
+ * @see bt_socket_unset_connection_requested_cb()
+ */
+int bt_socket_set_connection_requested_cb(bt_socket_connection_requested_cb callback, void *user_data);
+
+/**
+ * @ingroup  CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ * @brief  Unregisters the callback function.
+ * @return  0 on success, otherwise a negative error value.
+ * @retval  #BT_ERROR_NONE  Successful
+ * @retval  #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre  The Bluetooth service must be initialized with bt_initialize().
+ * @see  bt_initialize()
+ * @see  bt_socket_set_connection_requested_cb()
+ * @see  bt_socket_connection_requested_cb()
+ */
+int bt_socket_unset_connection_requested_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ * @brief  Register a callback function that will be invoked when the connection state changes.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @post bt_socket_connection_state_changed_cb() will be invoked.
+ * @see bt_initialize()
+ * @see bt_socket_connection_state_changed_cb()
+ * @see bt_socket_unset_connection_state_changed_cb()
+ */
+int bt_socket_set_connection_state_changed_cb(bt_socket_connection_state_changed_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_SOCKET_MODULE
+ * @brief      Unregisters the callback function.
+ * @return     0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @see bt_initialize()
+ * @see bt_socket_connection_state_changed_cb()
+ * @see bt_socket_set_connection_state_changed_cb()
+ */
+int bt_socket_unset_connection_state_changed_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_OPP_SERVER_MODULE
+ * @brief  Called when the push is requested.
+ * @details You must call bt_opp_server_accept() if you want to accept.
+ * Otherwise, you must call bt_opp_server_reject().
+ * @param[in] file  The path of file to be pushed
+ * @param[in] size The file size (bytes)
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_opp_server_initialize()
+ */
+typedef void (*bt_opp_server_push_requested_cb)(const char *file, int size, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_OPP_SERVER_MODULE
+ * @brief  Called when an OPP connection is requested.
+ * @details You must call bt_opp_server_accept_connection() if you want to accept.
+ * Otherwise, you must call bt_opp_server_reject_connection().
+ * @param[in] remote_address  The address of remote device
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_opp_server_initialize()
+ * @see bt_opp_server_accept_connection()
+ * @see bt_opp_server_reject_connection()
+ */
+typedef void (*bt_opp_server_connection_requested_cb)(const char *remote_address, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_OPP_SERVER_MODULE
+ * @brief Initializes the Bluetooth OPP server requested by bt_opp_server_push_requested_cb().
+ * @details The popup appears when an OPP connection is requested from a remote device.
+ * If you accept the request, then connection will be established and bt_opp_server_push_requested_cb() will be called.
+ * At that time, you can call either bt_opp_server_accept() or bt_opp_server_reject().
+ * @remarks This function must be called to start Bluetooth OPP server. You must free all resources of the Bluetooth service
+ * by calling bt_opp_server_deinitialize() if Bluetooth OPP service is no longer needed.
+ * @param[in] destination  The destination path
+ * @param[in] push_requested_cb  The callback called when a push is requested
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @retval #BT_ERROR_RESOURCE_BUSY  Device or resource busy
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @see  bt_opp_server_push_requested_cb()
+ * @see  bt_opp_server_deinitialize()
+ * @see  bt_opp_server_accept()
+ * @see  bt_opp_server_reject()
+ */
+int bt_opp_server_initialize(const char *destination, bt_opp_server_push_requested_cb push_requested_cb, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_OPP_SERVER_MODULE
+ * @brief Initializes the Bluetooth OPP server requested by bt_opp_server_connection_requested_cb().
+ * @details No popup appears when an OPP connection is requested from a remote device.
+ * Instead, @a connection_requested_cb() will be called.
+ * At that time, you can call either bt_opp_server_accept() or bt_opp_server_reject().
+ * @remarks This function must be called to start Bluetooth OPP server. \n
+ * You must free all resources of the Bluetooth service by calling bt_opp_server_deinitialize() if Bluetooth OPP service is no longer needed.
+ * @param[in] destination  The destination path
+ * @param[in] connection_requested_cb  The callback called when an OPP connection is requested
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @retval #BT_ERROR_RESOURCE_BUSY  Device or resource busy
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @see  bt_opp_server_connection_requested_cb()
+ * @see  bt_opp_server_deinitialize()
+ * @see  bt_opp_server_accept_connection()
+ * @see  bt_opp_server_reject_connection()
+ */
+int bt_opp_server_initialize_by_connection_request(const char *destination, bt_opp_server_connection_requested_cb connection_requested_cb, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_OPP_SERVER_MODULE
+ * @brief Denitializes the Bluetooth OPP server.
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @see  bt_opp_server_initialize()
+ * @see  bt_opp_server_deinitialize()
+ * @see  bt_opp_server_initialize()
+ */
+int bt_opp_server_deinitialize(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_OPP_SERVER_MODULE
+ * @brief  Called when a file is being transfered.
+ * @param[in] file  The path of file to be pushed
+ * @param[in] size The file size (bytes)
+ * @param[in] percent The progress in percentage (1 ~ 100)
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_opp_server_accept()
+ * @see bt_opp_server_accept_connection()
+ */
+typedef void (*bt_opp_server_transfer_progress_cb) (const char *file, long long size, int percent, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_OPP_SERVER_MODULE
+ * @brief  Called when a transfer is finished.
+ * @param[in] error_code  The result of push
+ * @param[in] file  The path of file to be pushed
+ * @param[in] size The file size (bytes)
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_opp_server_accept()
+ * @see bt_opp_server_accept_connection()
+ */
+typedef void (*bt_opp_server_transfer_finished_cb) (int result, const char *file, long long size, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_OPP_SERVER_MODULE
+ * @brief Accepts the push request from the remote device.
+ * @remarks If you initialize OPP server by bt_opp_server_initialize_by_connection_request(), then name is ignored.
+ * You can cancel the pushes by bt_opp_server_cancel_transfer() with transfer_id.
+ * @param[in] progress_cb  The callback called when a file is being transfered
+ * @param[in] finished_cb  The callback called when a transfer is finished
+ * @param[in] name  The name to store. This can be NULL if you initialize OPP server by bt_opp_server_initialize_by_connection_request().
+ * @param[in] user_data The user data to be passed to the callback function
+ * @param[out]  transfer_id  The ID of transfer
+ * @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_NOW_IN_PROGRESS  Operation now in progress
+ * @see  bt_opp_server_reject()
+ */
+int bt_opp_server_accept(bt_opp_server_transfer_progress_cb progress_cb, bt_opp_server_transfer_finished_cb finished_cb, const char *name,
+ void *user_data, int *transfer_id);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_OPP_SERVER_MODULE
+ * @brief Rejects the push request from the remote device.
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @see  bt_opp_server_accept()
+ */
+int bt_opp_server_reject(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_OPP_SERVER_MODULE
+ * @brief Cancels the transfer.
+ * @param[in] transfer_id  The ID of transfer
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @see  bt_opp_server_accept_connection()
+ * @see  bt_opp_server_accept()
+ */
+int bt_opp_server_cancel_transfer(int transfer_id);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_OPP_SERVER_MODULE
+ * @brief Sets the destination path of file to be pushed.
+ * @param[in] destination  The destination path of file to be pushed
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @see  bt_opp_server_initialize()
+ */
+int bt_opp_server_set_destination(const char *destination);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_OPP_CLIENT_MODULE
+ * @brief Initializes the Bluetooth OPP client.
+ * @remarks This function must be called before Bluetooth OPP client starts. \n
+ * You must free all resources of the Bluetooth service by calling bt_opp_client_deinitialize()
+ * if Bluetooth OPP service is no longer needed.
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_RESOURCE_BUSY  Device or resource busy
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @see  bt_opp_client_deinitialize()
+ */
+int bt_opp_client_initialize(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_OPP_CLIENT_MODULE
+ * @brief Denitializes the Bluetooth OPP client.
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @see  bt_opp_client_initialize()
+ */
+int bt_opp_client_deinitialize(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_OPP_CLIENT_MODULE
+ * @brief Adds file to be pushed.
+ * @param[in] file  The path of file to be pushed
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @see  bt_opp_client_clear_files()
+ * @see  bt_opp_client_push_files()
+ */
+int bt_opp_client_add_file(const char *file);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_OPP_CLIENT_MODULE
+ * @brief Adds file to be pushed.
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @see  bt_opp_client_add_file()
+ * @see  bt_opp_client_push_files()
+ */
+int bt_opp_client_clear_files(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_OPP_CLIENT_MODULE
+ * @brief  Called when OPP server responds to the push request.
+ * @param[in] result  The result of OPP server response
+ * @param[in] remote_address  The remote address
+ * @param[in] user_data  The user data passed from the callback registration function
+ * @pre bt_opp_client_push_files() will invoke this function.
+ * @see bt_opp_client_push_files()
+ */
+typedef void (*bt_opp_client_push_responded_cb)(int result, const char *remote_address, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_OPP_CLIENT_MODULE
+ * @brief  Called when each file is being transfered.
+ * @param[in] file  The path of file to be pushed
+ * @param[in] size The file size (bytes)
+ * @param[in] percent The progress in percentage (1 ~ 100). 100 means that a file is transfered completely.
+ * @param[in] user_data The user data passed from the callback registration function
+ * @pre bt_opp_client_push_files() will invoke this function.
+ * @see bt_opp_client_push_files()
+ */
+typedef void (*bt_opp_client_push_progress_cb)(const char *file, long long size, int percent, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_OPP_CLIENT_MODULE
+ * @brief  Called when the push request is finished.
+ * @param[in] result  The result of the push request
+ * @param[in] remote_address  The remote address
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_opp_client_push_files()
+ */
+typedef void (*bt_opp_client_push_finished_cb)(int result, const char *remote_address, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_OPP_CLIENT_MODULE
+ * @brief Pushes the file to the remote device, asynchronously.
+ * @details At first, bt_opp_client_push_responded_cb() will be called when OPP server responds to the push request.
+ * After connection is established, bt_opp_client_push_progress_cb() will be called repeatedly until a file is tranfered completely.
+ * If you send several files, then bt_opp_client_push_progress_cb() with another file will be called repeatedly until the file is tranfered completely.
+ * bt_opp_client_push_finished_cb() will be called when the push request is finished.
+ * @param[in] remote_address The remote address
+ * @param[in] responded_cb  The callback called when OPP server responds to the push request
+ * @param[in] progress_cb  The callback called when each file is being transfered
+ * @param[in] finished_cb  The callback called when the push request is finished
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @retval #BT_ERROR_NOW_IN_PROGRESS  Operation now in progress
+ * @see bt_opp_client_initialize()
+ * @see bt_opp_client_cancel_push
+ */
+int bt_opp_client_push_files(const char *remote_address, bt_opp_client_push_responded_cb responded_cb,
+ bt_opp_client_push_progress_cb progress_cb, bt_opp_client_push_finished_cb finished_cb, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_OPP_CLIENT_MODULE
+ * @brief Cancels the push request in progress, asynchronously.
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre bt_opp_client_push_files() must be called.
+ * @post bt_opp_client_push_finished_cb() will be invoked with result #BT_ERROR_CANCELLED,
+ * which is a parameter of bt_opp_client_push_files().
+ * @see bt_opp_client_initialize()
+ * @see bt_opp_client_push_files()
+ */
+int bt_opp_client_cancel_push(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_PAN_NAP_MODULE
+ * @brief  Called when the connection state is changed.
+ * @param[in] connected  Indicates whether a client is connected or disconnected
+ * @param[in] remote_address  The remote address
+ * @param[in] interface_name  The interface name. For example, bnep0, bnep1.
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_nap_set_connection_state_changed_cb()
+ * @see bt_nap_unset_connection_state_changed_cb()
+ */
+typedef void (*bt_nap_connection_state_changed_cb) (bool connected, const char *remote_address, const char *interface_name, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_PAN_NAP_MODULE
+ * @brief Activates the NAP(Network Access Point).
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @retval #BT_ERROR_ALREADY_DONE  Operation is already done
+ * @pre The Bluetooth must be enabled with bt_adapter_enable().
+ * @see bt_adapter_enable()
+ * @see bt_nap_deactivate()
+ */
+int bt_nap_activate(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_PAN_NAP_MODULE
+ * @brief Deactivates the NAP(Network Access Point).
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @retval #BT_ERROR_ALREADY_DONE  Operation is already done
+ * @pre The Bluetooth NAP service must be activated with bt_nap_activate().
+ * @see bt_nap_activate()
+ */
+int bt_nap_deactivate(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_PAN_NAP_MODULE
+ * @brief Disconnects the all PANUs(Personal Area Networking User) which are connected to you.
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The Bluetooth NAP service must be activated with bt_nap_activate().
+ * @see bt_nap_activate()
+ */
+int bt_nap_disconnect_all(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_PAN_NAP_MODULE
+ * @brief  Registers a callback function that will be invoked when the connection state changes.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @post bt_nap_connection_state_changed_cb() will be invoked.
+ * @see bt_initialize()
+ * @see bt_nap_connection_state_changed_cb()
+ * @see bt_nap_unset_connection_state_changed_cb()
+ */
+int bt_nap_set_connection_state_changed_cb(bt_nap_connection_state_changed_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_PAN_NAP_MODULE
+ * @brief  Unregisters a callback function that will be invoked when the connection state changes.
+ * @return   0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @post bt_nap_connection_state_changed_cb() will be invoked.
+ * @see bt_initialize()
+ * @see bt_nap_connection_state_changed_cb()
+ * @see bt_nap_set_connection_state_changed_cb()
+ */
+int bt_nap_unset_connection_state_changed_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_PAN_PANU_MODULE
+ * @brief  Called when the connection state is changed.
+ * @details  This callback is called when the connection state is changed.
+ * When you call bt_panu_connect() or bt_panu_disconnect(), this callback is also called with error result even though these functions fail.
+ * @param[in] result  The result of changing the connection state
+ * @param[in] connected  The state to be changed. @a true means connected state, Otherwise, @a false.
+ * @param[in] remote_address  The remote address
+ * @param[in] type  The type of PAN service
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_nap_set_connection_state_changed_cb()
+ * @see bt_nap_unset_connection_state_changed_cb()
+ */
+typedef void (*bt_panu_connection_state_changed_cb) (int result, bool connected, const char *remote_address, bt_panu_service_type_e type, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_PAN_PANU_MODULE
+ * @brief  Registers a callback function that will be invoked when the connection state changes.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @post bt_nap_connection_state_changed_cb() will be invoked.
+ * @see bt_initialize()
+ * @see bt_panu_connection_state_changed_cb()
+ * @see bt_panu_unset_connection_state_changed_cb()
+ */
+int bt_panu_set_connection_state_changed_cb(bt_panu_connection_state_changed_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_PAN_PANU_MODULE
+ * @brief  Unregisters a callback function that will be invoked when the connection state changes.
+ * @return   0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @post bt_nap_connection_state_changed_cb() will be invoked.
+ * @see bt_initialize()
+ * @see bt_panu_connection_state_changed_cb()
+ * @see bt_panu_set_connection_state_changed_cb()
+ */
+int bt_panu_unset_connection_state_changed_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_PAN_PANU_MODULE
+ * @brief Connects the remote device with the PAN(Personal Area Networking) service, asynchronously.
+ * @param[in] remote_address  The remote address
+ * @param[in] type  The type of PAN service
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_BONDED  Remote device is not bonded
+ * @retval #BT_ERROR_OUT_OF_MEMORY  Out of memory
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The local device must be bonded with the remote device by bt_device_create_bond().
+ * @post bt_panu_connection_state_changed_cb() will be invoked.
+ * @see bt_panu_disconnect()
+ * @see bt_panu_connection_state_changed_cb()
+ */
+int bt_panu_connect(const char *remote_address, bt_panu_service_type_e type);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_PAN_PANU_MODULE
+ * @brief Disconnects the remote device with the PAN(Personal Area Networking) service, asynchronously.
+ * @param[in] remote_address  The remote address
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED  Remote device is not connected
+ * @retval #BT_ERROR_OUT_OF_MEMORY  Out of memory
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The remote device must be connected by bt_panu_connect().
+ * @post bt_panu_connection_state_changed_cb() will be invoked.
+ * @see bt_panu_connect()
+ * @see bt_panu_connection_state_changed_cb()
+ */
+int bt_panu_disconnect(const char *remote_address);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_HID_MODULE
+ * @brief  Called when the connection state is changed.
+ * @details  This callback is called when the connection state is changed.
+ * When you call bt_hid_host_connect() or bt_hid_host_disconnect(), this callback is also called with error result even though these functions fail.
+ * @param[in] result  The result of changing the connection state
+ * @param[in] connected  The state to be changed. @a true means connected state, Otherwise, @a false.
+ * @param[in] remote_address  The remote address
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_hid_host_connect()
+ * @see bt_hid_host_disconnect()
+ */
+typedef void (*bt_hid_host_connection_state_changed_cb) (int result, bool connected, const char *remote_address, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_HID_MODULE
+ * @brief Initializes the Bluetooth HID(Human Interface Device) Host.
+ * @remarks This function must be called before Bluetooth HID Host starts. \n
+ * You must free all resources of the Bluetooth service by calling bt_hid_host_deinitialize()
+ * if Bluetooth HID Host service is no longer needed.
+ * @param[in] connection_cb  The callback called when the connection state is changed
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @see bt_initialize()
+ * @see  bt_hid_host_deinitialize()
+ */
+int bt_hid_host_initialize(bt_hid_host_connection_state_changed_cb connection_cb, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_HID_MODULE
+ * @brief Deinitializes the Bluetooth HID(Human Interface Device) Host.
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The Bluetooth HID service must be initialized with bt_hid_host_initialize().
+ * @see  bt_hid_host_initialize()
+ */
+int bt_hid_host_deinitialize(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_HID_MODULE
+ * @brief Connects the remote device with the HID(Human Interface Device) service, asynchronously.
+ * @param[in] remote_address  The remote address
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_BONDED  Remote device is not bonded
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The local device must be bonded with the remote device by bt_device_create_bond().
+ * @pre The Bluetooth HID service must be initialized with bt_hid_host_initialize().
+ * @post bt_hid_host_connection_state_changed_cb() will be invoked.
+ * @see bt_hid_host_disconnect()
+ * @see bt_hid_host_connection_state_changed_cb()
+ */
+int bt_hid_host_connect(const char *remote_address);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_HID_MODULE
+ * @brief Disconnects the remote device with the HID(Human Interface Device) service, asynchronously.
+ * @param[in] remote_address  The remote address
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED  Remote device is not connected
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The remote device must be connected by bt_hid_host_connect().
+ * @post bt_hid_host_connection_state_changed_cb() will be invoked.
+ * @see bt_hid_host_connect()
+ * @see bt_hid_host_connection_state_changed_cb()
+ */
+int bt_hid_host_disconnect(const char *remote_address);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_MODULE
+ * @brief Initializes the Bluetooth profiles related with audio.
+ * @remarks This function must be called before Bluetooth profiles related with audio starts. \n
+ * You must free all resources of the this service by calling bt_audio_deinitialize()
+ * if Bluetooth profiles related with audio service is no longer needed.
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @see bt_initialize()
+ * @see bt_audio_deinitialize()
+ */
+int bt_audio_initialize(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_MODULE
+ * @brief Deinitializes the Bluetooth profiles related with audio.
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The Bluetooth audio service must be initialized with bt_audio_initialize().
+ * @see bt_audio_initialize()
+ */
+int bt_audio_deinitialize(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_MODULE
+ * @brief Connects the remote device with the given audio profile, asynchronously.
+ * @details If you input type as #BT_AUDIO_PROFILE_TYPE_ALL and connection request succeeds, then bt_audio_connection_state_changed_cb() will be called twice
+ * when #BT_AUDIO_PROFILE_TYPE_HSP_HFP is connected and #BT_AUDIO_PROFILE_TYPE_A2DP is connected.
+ * @param[in] remote_address  The remote address
+ * @param[in] type  The type of audio profile
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_BONDED  Remote device is not bonded
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The Bluetooth audio service must be initialized with bt_audio_initialize().
+ * @pre The local device must be bonded with the remote device by bt_device_create_bond().
+ * @post bt_audio_connection_state_changed_cb() will be invoked.
+ * @see bt_audio_disconnect()
+ * @see bt_audio_connection_state_changed_cb()
+ */
+int bt_audio_connect(const char *remote_address, bt_audio_profile_type_e type);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_MODULE
+ * @brief Disconnects the remote device with the given audio profile, asynchronously.
+ * @details If you input type as #BT_AUDIO_PROFILE_TYPE_ALL and disconnection request succeeds, then bt_audio_connection_state_changed_cb() will be called twice
+ * when #BT_AUDIO_PROFILE_TYPE_HSP_HFP is disconnected and #BT_AUDIO_PROFILE_TYPE_A2DP is disconnected.
+ * @param[in] remote_address  The remote address
+ * @param[in] type  The type of audio profile
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED  Remote device is not connected
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The remote device must be connected by bt_audio_connect().
+ * @post bt_audio_connection_state_changed_cb() will be invoked.
+ * @see bt_audio_connect()
+ * @see bt_audio_connection_state_changed_cb()
+ */
+int bt_audio_disconnect(const char *remote_address, bt_audio_profile_type_e type);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_MODULE
+ * @brief  Called when the connection state is changed.
+ * @details  This callback is called when the connection state is changed.
+ * When you call bt_audio_connect() or bt_audio_disconnect(), this callback is also called with error result even though these functions fail.
+ * @param[in] result  The result of changing the connection state
+ * @param[in] connected  The state to be changed. @a true means connected state, Otherwise, @a false.
+ * @param[in] remote_address  The remote address
+ * @param[in] type  The type of audio profile except #BT_AUDIO_PROFILE_TYPE_ALL
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_audio_set_connection_state_changed_cb()
+ * @see bt_audio_unset_connection_state_changed_cb()
+ */
+typedef void (*bt_audio_connection_state_changed_cb) (int result, bool connected, const char *remote_address, bt_audio_profile_type_e type, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_MODULE
+ * @brief  Registers a callback function that will be invoked when the connection state is changed.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth audio service must be initialized with bt_audio_initialize().
+ * @see bt_audio_initialize()
+ * @see bt_audio_connection_state_changed_cb()
+ * @see bt_panu_unset_connection_state_changed_cb()
+ */
+int bt_audio_set_connection_state_changed_cb(bt_audio_connection_state_changed_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_MODULE
+ * @brief  Unregisters a callback function that will be invoked when the connection state is changed.
+ * @return   0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth audio service must be initialized with bt_audio_initialize().
+ * @see bt_audio_initialize()
+ * @see bt_audio_connection_state_changed_cb()
+ * @see bt_audio_set_connection_state_changed_cb()
+ */
+int bt_audio_unset_connection_state_changed_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief Opens a SCO(Synchronous Connection Oriented link) to connected remote device, asynchronously.
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_BONDED  Remote device is not bonded
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED  Remote device is not connected
+ * @retval #BT_ERROR_ALREADY_DONE  Operation is already done
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The Bluetooth audio device must be connected with bt_audio_connect().
+ * @post bt_ag_sco_state_changed_cb() will be invoked.
+ * @see bt_ag_close_sco()
+ * @see bt_ag_sco_state_changed_cb()
+ * @see bt_audio_connect()
+ */
+int bt_ag_open_sco(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief Closes an opened SCO(Synchronous Connection Oriented link), asynchronously.
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_BONDED  Remote device is not bonded
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED  Remote device is not connected
+ * @pre The SCO must be opened with bt_ag_open_sco().
+ * @post bt_ag_sco_state_changed_cb() will be invoked.
+ * @see bt_ag_open_sco()
+ * @see bt_ag_sco_state_changed_cb()
+ */
+int bt_ag_close_sco(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief Checks whether an opened SCO(Synchronous Connection Oriented link) exists or not.
+ * @param[out] opened The SCO status: (@c true = opened, @c  false = not opened)
+ * @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_ENABLED  Not enabled
+ * @pre The Bluetooth audio service must be initialized with bt_audio_initialize().
+ * @see bt_adapter_enable()
+ * @see bt_ag_open_sco()
+ * @see bt_ag_close_sco()
+ */
+int bt_ag_is_sco_opened(bool *opened);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Called when the SCO(Synchronous Connection Oriented link) state is changed.
+ * @details  This callback is called when the SCO state is changed.
+ * When you call bt_ag_open_sco() or bt_ag_close_sco(), this callback is also called with error result even though these functions failed.
+ * @param[in] result  The result of changing the connection state
+ * @param[in] opened  The state to be changed: (@c true = opened, @c  false = not opened)
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_ag_set_sco_state_changed_cb()
+ * @see bt_ag_unset_sco_state_changed_cb()
+ * @see bt_ag_open_sco()
+ * @see bt_ag_close_sco()
+ */
+typedef void (*bt_ag_sco_state_changed_cb) (int result, bool opened, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Registers a callback function that will be invoked when the SCO(Synchronous Connection Oriented link) state is changed.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth audio service must be initialized with bt_audio_initialize().
+ * @see bt_audio_initialize()
+ * @see bt_ag_sco_state_changed_cb()
+ * @see bt_ag_unset_sco_state_changed_cb()
+ */
+int bt_ag_set_sco_state_changed_cb(bt_ag_sco_state_changed_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Unregisters a callback function that will be invoked when the SCO(Synchronous Connection Oriented link) state is changed.
+ * @return   0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth audio service must be initialized with bt_audio_initialize().
+ * @see bt_audio_initialize()
+ * @see bt_ag_sco_state_changed_cb()
+ * @see bt_ag_set_sco_state_changed_cb()
+ */
+int bt_ag_unset_sco_state_changed_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief Notifies the call event to the remote bluetooth device.
+ * @remarks Before notifying #BT_AG_CALL_EVENT_ANSWERED or #BT_AG_CALL_EVENT_DIALING, you should open SCO(Synchronous Connection Oriented link)
+ * if Bluetooth Hands-Free need SCO connection.
+ * @param[in] event  The call event
+ * @param[in] call_id  The call ID
+ * @param[in] phone_number  The phone number. You must set this value in case of #BT_AG_CALL_EVENT_DIALING and #BT_AG_CALL_EVENT_INCOMING.
+ * In other cases, this value can be NULL.
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_BONDED  Remote device is not bonded
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED  Remote device is not connected
+ * @pre The Bluetooth audio device must be connected with bt_audio_connect().
+ * @see bt_audio_connect()
+ */
+int bt_ag_notify_call_event(bt_ag_call_event_e event, unsigned int call_id, const char *phone_number);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief Notifies the call list to the remote bluetooth device.
+ * @param[in] list  The call list
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_BONDED  Remote device is not bonded
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED  Remote device is not connected
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The Bluetooth audio device must be connected with bt_audio_connect().
+ * @see bt_audio_connect()
+ */
+int bt_ag_notify_call_list(bt_call_list_h list);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief Notifies the state of voice recognition.
+ * @param[in] state  The state of voice recognition: (@c true = enabled, @c  false = disabled)
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_BONDED  Remote device is not bonded
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED  Remote device is not connected
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The Bluetooth audio device must be connected with bt_audio_connect().
+ * @see bt_audio_connect()
+ */
+int bt_ag_notify_voice_recognition_state(bool state);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Called when a call handling event happened from Hands-Free.
+ * @param[in] event  The call handling event happened from Hands-Free
+ * @param[in] call_id  The call ID
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_ag_set_call_handling_event_cb()
+ * @see bt_ag_unset_call_handling_event_cb()
+ */
+typedef void (*bt_ag_call_handling_event_cb) (bt_ag_call_handling_event_e event, unsigned int call_id, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Registers a callback function that will be invoked when a call handling event happened from Hands-Free.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth audio service must be initialized with bt_audio_initialize().
+ * @see bt_audio_initialize()
+ * @see bt_ag_call_handling_event_cb()
+ * @see bt_ag_unset_call_handling_event_cb()
+ */
+int bt_ag_set_call_handling_event_cb(bt_ag_call_handling_event_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Unregisters a callback function that will be invoked when a call handling event happened from Hands-Free.
+ * @return   0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth audio service must be initialized with bt_audio_initialize().
+ * @see bt_audio_initialize()
+ * @see bt_ag_call_handling_event_cb()
+ * @see bt_ag_set_call_handling_event_cb()
+ */
+int bt_ag_unset_call_handling_event_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Called when a multi call handling event happened from Hands-Free.
+ * @param[in] event  The call handling event happened from Hands-Free
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_ag_set_multi_call_handling_event_cb()
+ * @see bt_ag_unset_multi_call_handling_event_cb()
+ */
+typedef void (*bt_ag_multi_call_handling_event_cb) (bt_ag_multi_call_handling_event_e event, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Registers a callback function that will be invoked when a multi call handling event happened from Hands-Free.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth audio service must be initialized with bt_audio_initialize().
+ * @see bt_audio_initialize()
+ * @see bt_ag_multi_call_handling_event_cb()
+ * @see bt_ag_unset_multi_call_handling_event_cb()
+ */
+int bt_ag_set_multi_call_handling_event_cb(bt_ag_multi_call_handling_event_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Unregisters a callback function that will be invoked when a multi call handling event happened from Hands-Free.
+ * @return   0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth audio service must be initialized with bt_audio_initialize().
+ * @see bt_audio_initialize()
+ * @see bt_ag_multi_call_handling_event_cb()
+ * @see bt_ag_set_multi_call_handling_event_cb()
+ */
+int bt_ag_unset_multi_call_handling_event_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Called when a DTMF(Dual Tone Multi Frequency) is transmitted from Hands-Free.
+ * @param[in] dtmf  The DTMF transmitted from Hands-Free
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_ag_set_dtmf_transmitted_cb()
+ * @see bt_ag_unset_dtmf_transmitted_cb()
+ */
+typedef void (*bt_ag_dtmf_transmitted_cb) (const char *dtmf, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Registers a callback function that will be invoked when a DTMF(Dual Tone Multi Frequency) is transmitted from Hands-Free.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth audio service must be initialized with bt_audio_initialize().
+ * @see bt_audio_initialize()
+ * @see bt_ag_dtmf_transmitted_cb()
+ * @see bt_ag_unset_dtmf_transmitted_cb()
+ */
+int bt_ag_set_dtmf_transmitted_cb(bt_ag_dtmf_transmitted_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Unregisters a callback function that will be invoked when a DTMF(Dual Tone Multi Frequency) is transmitted from Hands-Free.
+ * @return   0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth audio service must be initialized with bt_audio_initialize().
+ * @see bt_audio_initialize()
+ * @see bt_ag_dtmf_transmitted_cb()
+ * @see bt_ag_set_dtmf_transmitted_cb()
+ */
+int bt_ag_unset_dtmf_transmitted_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Notifies the speaker gain to the remote device.
+ * @details This function sends a signal to the remote device. This signal has the gain value.
+ * @a gain is represented on a scale from 0 to 15. This value is absolute value relating to a particular volume level.
+ * When the speaker gain of remote device is changed to the requested gain, bt_audio_speaker_gain_changed_cb() will be called.
+ * @param[in] gain The gain of speaker (0 ~ 15)
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED  Remote device is not connected
+ * @pre The remote device is connected by bt_audio_connect() with #BT_AUDIO_PROFILE_TYPE_HSP_HFP service.
+ * @see bt_ag_get_speaker_gain()
+ * @see bt_ag_set_speaker_gain_changed_cb()
+ * @see bt_ag_unset_speaker_gain_changed_cb()
+ */
+int bt_ag_notify_speaker_gain(int gain);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Gets the current speaker gain of the remote device.
+ * @details This function gets the value of speaker gain of the remote device.
+ * @a gain is represented on a scale from 0 to 15. This value is absolute value relating to a particular volume level.
+ * @param[out] gain The gain of speaker (0 ~ 15)
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED  Remote device is not connected
+ * @pre The remote device is connected by bt_audio_connect() with #BT_AUDIO_PROFILE_TYPE_HSP_HFP service.
+ * @see bt_ag_notify_speaker_gain()
+ * @see bt_ag_set_speaker_gain_changed_cb()
+ * @see bt_ag_unset_speaker_gain_changed_cb()
+ */
+int bt_ag_get_speaker_gain(int *gain);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief Checks whether the remoted device enables NREC(Noise Reduction and Echo Canceling) or not.
+ * @param[out] enabled The NREC status: (@c true = enabled, @c  false = not enabled)
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED  Remote device is not connected
+ * @pre The remote device is connected by bt_audio_connect() with #BT_AUDIO_PROFILE_TYPE_HSP_HFP service.
+ * @see bt_audio_connect()
+ */
+int bt_ag_is_nrec_enabled(bool *enabled);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Called when the speaker gain of the remote device is changed.
+ * @param[in] gain The gain of speaker (0 ~ 15)
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_ag_set_speaker_gain_changed_cb()
+ * @see bt_ag_unset_speaker_gain_changed_cb()
+ */
+typedef void (*bt_ag_speaker_gain_changed_cb) (int gain, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Registers a callback function that will be invoked when the speaker gain of the remote device is changed.
+ * @details This function let you know the change of the speaker gain of the remote device.
+ * @a gain is represented on a scale from 0 to 15. This value is absolute value relating to a particular volume level.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth audio service must be initialized with bt_audio_initialize().
+ * @see bt_audio_initialize()
+ * @see bt_ag_unset_speaker_gain_changed_cb()
+ */
+int bt_ag_set_speaker_gain_changed_cb(bt_ag_speaker_gain_changed_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Unregisters a callback function that will be invoked when the speaker gain of the remote device is changed.
+ * @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
+ * @pre The Bluetooth audio service must be initialized with bt_audio_initialize().
+ * @see bt_audio_initialize()
+ * @see bt_ag_set_speaker_gain_changed_cb()
+ */
+int bt_ag_unset_speaker_gain_changed_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Called when the microphone gain of the remote device is changed.
+ * @param[in] gain The gain of microphone (0 ~ 15)
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_ag_set_microphone_gain_changed_cb()
+ * @see bt_ag_unset_microphone_gain_changed_cb()
+ */
+typedef void (*bt_ag_microphone_gain_changed_cb) (int gain, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Registers a callback function that will be invoked when the microphone gain of the remote device is changed.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth audio service must be initialized with bt_audio_initialize().
+ * @see bt_audio_initialize()
+ * @see bt_ag_unset_microphone_gain_changed_cb()
+ */
+int bt_ag_set_microphone_gain_changed_cb(bt_ag_microphone_gain_changed_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_MODULE
+ * @brief  Unregisters a callback function that will be invoked when the microphone gain of the remote device is changed.
+ * @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
+ * @pre The Bluetooth audio service must be initialized with bt_audio_initialize().
+ * @see bt_audio_initialize()
+ * @see bt_ag_set_microphone_gain_changed_cb()
+ */
+int bt_ag_unset_microphone_gain_changed_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_CALL_MODULE
+ * @brief Creates a handle of call list.
+ * @param[out] list  The handle of call list
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @retval #BT_ERROR_OUT_OF_MEMORY  Out of memory
+ * @see bt_call_list_destroy()
+ */
+int bt_call_list_create(bt_call_list_h *list);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_CALL_MODULE
+ * @brief Destroys the handle of call list.
+ * @param[in] list  The handle of call list
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @see bt_call_list_create()
+ */
+int bt_call_list_destroy(bt_call_list_h list);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_CALL_MODULE
+ * @brief Resets the handle of call list.
+ * @param[in] list  The handle of call list
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @see bt_call_list_create()
+ */
+int bt_call_list_reset(bt_call_list_h list);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AUDIO_AG_CALL_MODULE
+ * @brief Adds a call to the handle of call list.
+ * @param[in] list  The handle of call list
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @retval #BT_ERROR_OUT_OF_MEMORY  Out of memory
+ * @see bt_call_list_create()
+ */
+int bt_call_list_add(bt_call_list_h list, unsigned int call_id, bt_ag_call_state_e state);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Called when the connection state is changed.
+ * @param[in] connected  The state to be changed. @a true means connected state, Otherwise, @a false.
+ * @param[in] remote_address  The remote address
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_avrcp_target_initialize()
+ * @see bt_avrcp_target_deinitialize()
+ */
+typedef void (*bt_avrcp_target_connection_state_changed_cb) (bool connected, const char *remote_address, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief Initializes the Bluetooth AVRCP(Audio/Video Remote Control Profile) service.
+ * @remarks This function must be called before Bluetooth AVRCP service. \n
+ * You must free all resources of the this service by calling bt_avrcp_target_deinitialize()
+ * if Bluetooth AVRCP service is no longer needed.
+ * @param[in] callback The callback function called when the connection state is changed
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @see bt_initialize()
+ * @see bt_avrcp_target_deinitialize()
+ */
+int bt_avrcp_target_initialize(bt_avrcp_target_connection_state_changed_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief Deinitializes the Bluetooth AVRCP(Audio/Video Remote Control Profile) service.
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth audio service must be initialized with bt_avrcp_target_initialize().
+ * @see bt_avrcp_target_initialize()
+ */
+int bt_avrcp_target_deinitialize(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Notifies the equalize state to the remote device.
+ * @param[in] state The state of equalizer
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED  Remote device is not connected
+ * @pre The remote device must be connected.
+ * @see bt_avrcp_target_connection_state_changed_cb()
+ * @see bt_avrcp_target_initialize()
+ */
+int bt_avrcp_target_notify_equalizer_state(bt_avrcp_equalizer_state_e state);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Notifies the repeat mode to the remote device.
+ * @param[in] mode The repeat mode
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED  Remote device is not connected
+ * @pre The remote device must be connected.
+ * @see bt_avrcp_target_connection_state_changed_cb()
+ * @see bt_avrcp_target_initialize()
+ */
+int bt_avrcp_target_notify_repeat_mode(bt_avrcp_repeat_mode_e mode);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Notifies the shuffle mode to the remote device.
+ * @param[in] mode The repeat mode
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED  Remote device is not connected
+ * @pre The remote device must be connected.
+ * @see bt_avrcp_target_connection_state_changed_cb()
+ * @see bt_avrcp_target_initialize()
+ */
+int bt_avrcp_target_notify_shuffle_mode(bt_avrcp_shuffle_mode_e mode);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Notifies the scan mode to the remote device.
+ * @param[in] mode The scan mode
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED  Remote device is not connected
+ * @pre The remote device must be connected.
+ * @see bt_avrcp_target_connection_state_changed_cb()
+ * @see bt_avrcp_target_initialize()
+ */
+int bt_avrcp_target_notify_scan_mode(bt_avrcp_scan_mode_e mode);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Notifies the player state to the remote device.
+ * @param[in] state The player state
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED  Remote device is not connected
+ * @pre The remote device must be connected.
+ * @see bt_avrcp_target_connection_state_changed_cb()
+ * @see bt_avrcp_target_initialize()
+ */
+int bt_avrcp_target_notify_player_state(bt_avrcp_player_state_e state);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Notifies the current position of song to the remote device.
+ * @param[in] position The current position in milliseconds
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED  Remote device is not connected
+ * @pre The remote device must be connected.
+ * @see bt_avrcp_target_connection_state_changed_cb()
+ * @see bt_avrcp_target_initialize()
+ */
+int bt_avrcp_target_notify_position(unsigned int position);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Notifies the track to the remote device.
+ * @param[in] title The title of track
+ * @param[in] artist The artist of track
+ * @param[in] album The album of track
+ * @param[in] genre The genre of track
+ * @param[in] track_num The track number
+ * @param[in] total_tracks The number of all tracks
+ * @param[in] duration The duration of track in milliseconds
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED  Remote device is not connected
+ * @pre The remote device must be connected.
+ * @see bt_avrcp_target_connection_state_changed_cb()
+ * @see bt_avrcp_target_initialize()
+ */
+int bt_avrcp_target_notify_track(const char *title, const char *artist, const char *album, const char *genre, unsigned int track_num, unsigned int total_tracks, unsigned int duration);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Called when the equalizer state is changed by the remote control device.
+ * @param[in] equalizer The equalizer state
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_avrcp_set_equalizer_state_changed_cb()
+ * @see bt_avrcp_unset_equalizer_state_changed_cb()
+ */
+typedef void (*bt_avrcp_equalizer_state_changed_cb) (bt_avrcp_equalizer_state_e equalizer, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Registers a callback function that will be invoked when the equalizer state is changed by the remote control device.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth service must be initialized by bt_initialize().
+ * @see bt_initialize()
+ * @see bt_avrcp_unset_equalizer_state_changed_cb()
+ */
+int bt_avrcp_set_equalizer_state_changed_cb(bt_avrcp_equalizer_state_changed_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Unregisters a callback function that will be invoked when the equalizer state is changed by the remote control device.
+ * @return   0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth service must be initialized by bt_initialize().
+ * @see bt_initialize()
+ * @see bt_avrcp_set_equalizer_state_changed_cb()
+ */
+int bt_avrcp_unset_equalizer_state_changed_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Called when the repeat mode is changed by the remote control device.
+ * @param[in] repeat The repeat mode
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_avrcp_set_repeat_mode_changed_cb()
+ * @see bt_avrcp_unset_repeat_mode_changed_cb()
+ */
+typedef void (*bt_avrcp_repeat_mode_changed_cb) (bt_avrcp_repeat_mode_e repeat, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Registers a callback function that will be invoked when the repeat mode is changed by the remote control device.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth service must be initialized by bt_initialize().
+ * @see bt_initialize()
+ * @see bt_avrcp_unset_repeat_mode_changed_cb()
+ */
+int bt_avrcp_set_repeat_mode_changed_cb(bt_avrcp_repeat_mode_changed_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Unregisters a callback function that will be invoked when the repeat mode is changed by the remote control device.
+ * @return   0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth service must be initialized by bt_initialize().
+ * @see bt_initialize()
+ * @see bt_avrcp_set_repeat_mode_changed_cb()
+ */
+int bt_avrcp_unset_repeat_mode_changed_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Called when the shuffle mode is changed by the remote control device.
+ * @param[in] shuffle The shuffle mode
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_avrcp_set_shuffle_mode_changed_cb()
+ * @see bt_avrcp_unset_shuffle_mode_changed_cb()
+ */
+typedef void (*bt_avrcp_shuffle_mode_changed_cb) (bt_avrcp_shuffle_mode_e shuffle, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Registers a callback function that will be invoked when the shuffle mode is changed by the remote control device.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth service must be initialized by bt_initialize().
+ * @see bt_initialize()
+ * @see bt_avrcp_unset_shuffle_mode_changed_cb()
+ */
+int bt_avrcp_set_shuffle_mode_changed_cb(bt_avrcp_shuffle_mode_changed_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Unregisters a callback function that will be invoked when the shuffle mode is changed by the remote control device.
+ * @return   0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth service must be initialized by bt_initialize().
+ * @see bt_initialize()
+ * @see bt_avrcp_set_shuffle_mode_changed_cb()
+ */
+int bt_avrcp_unset_shuffle_mode_changed_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Called when the scan mode is changed by the remote control device.
+ * @param[in] shuffle The shuffle mode
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_avrcp_set_scan_mode_changed_cb()
+ * @see bt_avrcp_unset_scan_mode_changed_cb()
+ */
+typedef void (*bt_avrcp_scan_mode_changed_cb) (bt_avrcp_scan_mode_e scan, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Registers a callback function that will be invoked when the scan mode is changed by the remote control device.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth service must be initialized by bt_initialize().
+ * @see bt_initialize()
+ * @see bt_avrcp_unset_scan_mode_changed_cb()
+ */
+int bt_avrcp_set_scan_mode_changed_cb(bt_avrcp_scan_mode_changed_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_AVRCP_MODULE
+ * @brief  Unregisters a callback function that will be invoked when the scan mode is changed by the remote control device.
+ * @return   0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth service must be initialized by bt_initialize().
+ * @see bt_initialize()
+ * @see bt_avrcp_set_scan_mode_changed_cb()
+ */
+int bt_avrcp_unset_scan_mode_changed_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_HDP_MODULE
+ * @brief Registers an application that acts as the @a Sink role of HDP(Health Device Profile).
+ * @param[in] data_type  The data type of MDEP. This value is defined in ISO/IEEE 11073-20601 spec.
+ * For example, pulse oximeter is 0x1004 and blood pressure monitor is 0x1007.
+ * @param[out] app_id  The ID of application
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @pre The Bluetooth must be enabled with bt_adapter_enable().
+ * @see bt_adapter_enable()
+ * @see bt_hdp_deactivate_sink()
+ */
+int bt_hdp_register_sink_app(unsigned short data_type, char **app_id);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_HDP_MODULE
+ * @brief Unregisters the given application that acts as the @a Sink role of HDP(Health Device Profile).
+ * @param[in] app_id  The ID of application
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @see bt_hdp_register_sink_app()
+ */
+int bt_hdp_unregister_sink_app(const char *app_id);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_HDP_MODULE
+ * @brief Connects the remote device which acts as @a Source role, asynchronously.
+ * @param[in] remote_address  The remote address
+ * @param[in] app_id  The ID of application
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_BONDED  Remote device is not bonded
+ * @retval #BT_ERROR_OUT_OF_MEMORY  Out of memory
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The Sink role of HDP must be activated with bt_hdp_activate_sink().
+ * @pre The local device must be bonded with the remote device by bt_device_create_bond().
+ * @post bt_hdp_connected_cb() will be invoked.
+ * @see bt_hdp_disconnect()
+ * @see bt_hdp_set_connection_state_changed_cb()
+ * @see bt_hdp_unset_connection_state_changed_cb()
+ */
+int bt_hdp_connect_to_source(const char *remote_address, const char *app_id);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_HDP_MODULE
+ * @brief Disconnects the remote device, asynchronously.
+ * @param[in] remote_address  The remote address
+ * @param[in] channel  The connected data channel
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED  Remote device is not connected
+ * @retval #BT_ERROR_OUT_OF_MEMORY  Out of memory
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The remote device must be connected.
+ * @post bt_hdp_disconnected_cb() will be invoked.
+ * @see bt_hdp_set_connection_state_changed_cb()
+ * @see bt_hdp_unset_connection_state_changed_cb()
+ */
+int bt_hdp_disconnect(const char *remote_address, unsigned int channel);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_HDP_MODULE
+ * @brief Sends the data to the remote device.
+ * @param[in] channel  The connected data channel
+ * @param[in] data  The data to send
+ * @param[in] size  The size of data to send (byte)
+ * @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_ENABLED  Not enabled
+ * @retval #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre The remote device must be connected.
+ * @see bt_hdp_data_received_cb()
+ * @see bt_hdp_set_data_received_cb()
+ * @see bt_hdp_unset_data_received_cb()
+ */
+int bt_hdp_send_data(unsigned int channel, const char *data, unsigned int size);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_HDP_MODULE
+ * @brief  Called when the connection is established.
+ * @param[in] result  The result of connecting to the remote device
+ * @param[in] remote_address  The address of connected remote device
+ * @param[in] app_id  The ID of application
+ * @param[in] type  The type of HDP(Health Device Profile) channel
+ * @param[in] channel  The connected data channel
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see  bt_hdp_disconnected_cb
+ * @see bt_hdp_set_connection_state_changed_cb()
+ * @see bt_hdp_unset_connection_state_changed_cb()
+ */
+typedef void (*bt_hdp_connected_cb) (int result, const char *remote_address, const char *app_id,
+    bt_hdp_channel_type_e type, unsigned int channel, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_HDP_MODULE
+ * @brief  Called when the connection is disconnected.
+ * @param[in] result  The result of disconnecting from the remote device
+ * @param[in] remote_address  The address of disconnected remote device
+ * @param[in] channel  The connected data channel
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see  bt_hdp_connected_cb
+ * @see bt_hdp_set_connection_state_changed_cb()
+ * @see bt_hdp_unset_connection_state_changed_cb()
+ */
+typedef void (*bt_hdp_disconnected_cb) (int result, const char *remote_address, unsigned int channel, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_HDP_MODULE
+ * @brief  Registers a callback function that will be invoked when the connection state is changed.
+ * @param[in] connected_cb The callback function called when a connection is established
+ * @param[in] disconnected_cb The callback function called when a connection is disconnected
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @see bt_hdp_unset_connection_state_changed_cb()
+ */
+int bt_hdp_set_connection_state_changed_cb(bt_hdp_connected_cb connected_cb, bt_hdp_disconnected_cb disconnected_cb, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_HDP_MODULE
+ * @brief  Unregisters a callback function that will be invoked when the connection state is changed.
+ * @return   0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @see bt_hdp_set_connection_state_changed_cb()
+ */
+int bt_hdp_unset_connection_state_changed_cb(void);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_HDP_MODULE
+ * @brief  Called when the you receive the data.
+ * @param[in] channel  The connected data channel
+ * @param[in] data  The received data
+ * @param[in] size  The size of received data (byte)
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see bt_hdp_set_data_received_cb()
+ * @see bt_hdp_unset_data_received_cb()
+ */
+typedef void (*bt_hdp_data_received_cb) (unsigned int channel, const char *data, unsigned int size, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_HDP_MODULE
+ * @brief  Registers a callback function that will be invoked when you receive the data.
+ * @param[in] callback The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @see bt_hdp_unset_data_received_cb()
+ */
+int bt_hdp_set_data_received_cb(bt_hdp_data_received_cb callback, void *user_data);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_HDP_MODULE
+ * @brief  Unregisters a callback function that will be invoked when you receive the data.
+ * @return   0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @see bt_hdp_set_data_received_cb()
+ */
+int bt_hdp_unset_data_received_cb(void);
+
+/**
+ * @ingroup  CAPI_NETWORK_BLUETOOTH_GATT_MODULE
+ * @brief  Called when you get the primary services repeatedly.
+ * @param[in]  service  The attribute handle of service
+ * @param[in]  user_data  The user data passed from the foreach function
+ * @return  @c true to continue with the next iteration of the loop,
+ * \n @c false to break out of the loop.
+ * @pre  bt_gatt_foreach_primary_services() will invoke this function.
+ * @see  bt_gatt_foreach_primary_services()
+ */
+typedef bool (*bt_gatt_primary_service_cb) (bt_gatt_attribute_h service, void *user_data);
+
+/**
+ * @ingroup  CAPI_NETWORK_BLUETOOTH_GATT_MODULE
+ * @brief  Gets the primary services of GATT(Generic Attribute Profile).
+ * @param[in]  remote_address  The address of the remote device
+ * @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_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
+ * @pre  The state of local Bluetooth must be #BT_ADAPTER_ENABLED.
+ * @post  @a callback will be called if there are primary services.
+ * @see  bt_adapter_enable()
+ * @see  bt_gatt_primary_service_cb()
+ */
+int bt_gatt_foreach_primary_services(const char *remote_address, bt_gatt_primary_service_cb callback, void *user_data);
+
+/**
+ * @ingroup  CAPI_NETWORK_BLUETOOTH_GATT_MODULE
+ * @brief  Called after the characteristics are discovered by bt_gatt_discover_characteristics().
+ * @remakrs  If bt_gatt_discover_characteristics() failed, then this callback function is called only once with 0 totla and NULL characteristic_handle.
+ * @param[in]  result  The result of discovering
+ * @param[in]  index  The index of characteristics in a service, starts from 0
+ * @param[in]  total  The total number of characteristics in a service
+ * @param[in]  characteristic  The attribute handle of characteristic
+ * @param[in]  user_data  The user data passed from the request function
+ * @return  @c true to continue with the next iteration of the loop,
+ * \n @c false to break out of the loop.
+ * @pre  bt_gatt_discover_characteristics() will invoke this callback.
+ * @see  bt_gatt_discover_characteristics()
+ */
+typedef bool (*bt_gatt_characteristics_discovered_cb) (int result, int index, int total, bt_gatt_attribute_h characteristic, void *user_data);
+
+/**
+ * @ingroup  CAPI_NETWORK_BLUETOOTH_GATT_MODULE
+ * @brief  Discovers the characteristics in service, asynchronously.
+ * @param[in]  service  The attribute handle of service
+ * @param[in]  callback  The result callback
+ * @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_INITIALIZED  Not initialized
+ * @retval  #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @retval  #BT_ERROR_OPERATION_FAILED  Operation failed
+ * @pre  The state of local Bluetooth must be #BT_ADAPTER_ENABLED.
+ * @post  @a callback will be called.
+ * @see  bt_adapter_enable()
+ * @see  bt_gatt_characteristics_discovered_cb()
+ */
+int bt_gatt_discover_characteristics(bt_gatt_attribute_h service, bt_gatt_characteristics_discovered_cb callback, void *user_data);
+
+/**
+ * @ingroup  CAPI_NETWORK_BLUETOOTH_GATT_MODULE
+ * @brief  Gets the UUID of service.
+ * @remarks  @a uuid must be released with free() by you.
+ * @param[in]  service  The attribute handle of service
+ * @param[out]  uuid  The UUID of service
+ * @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_OPERATION_FAILED  Operation failed
+ * @retval  #BT_ERROR_OUT_OF_MEMORY  Out of memory
+ * @pre  The state of local Bluetooth must be #BT_ADAPTER_ENABLED.
+ * @see  bt_adapter_enable()
+ */
+int bt_gatt_get_service_uuid(bt_gatt_attribute_h service, char **uuid);
+
+/**
+ * @ingroup  CAPI_NETWORK_BLUETOOTH_GATT_MODULE
+ * @brief  Called when you get the included services repeatedly.
+ * @param[in]  service  The attribute handle of service
+ * @param[in]  user_data  The user data passed from the foreach function
+ * @return  @c true to continue with the next iteration of the loop,
+ * \n @c false to break out of the loop.
+ * @pre  bt_gatt_foreach_included_services() will invoke this function.
+ * @see  bt_gatt_foreach_included_services()
+ */
+typedef bool (*bt_gatt_included_service_cb) (bt_gatt_attribute_h service, void *user_data);
+
+/**
+ * @ingroup  CAPI_NETWORK_BLUETOOTH_GATT_MODULE
+ * @brief  Gets the included services in service.
+ * @param[in]  service  The attribute handle of service
+ * @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_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
+ * @pre  The state of local Bluetooth must be #BT_ADAPTER_ENABLED.
+ * @post  @a callback will be called if there are included services.
+ * @see  bt_adapter_enable()
+ * @see  bt_gatt_included_service_cb()
+ */
+int bt_gatt_foreach_included_services(bt_gatt_attribute_h service, bt_gatt_included_service_cb callback, void *user_data);
+
+/*
+ * @ingroup  CAPI_NETWORK_BLUETOOTH_GATT_MODULE
+ * @brief  Called when a characteristic in service is changed.
+ * @param[in]  characteristic  The attribute handle of characteristic
+ * @param[in]  value  The value of characteristic (byte array)
+ * @param[in]  value_length  The length of value
+ * @param[in]  user_data  The user data passed from the callback registration function
+ * @see bt_gatt_set_characteristic_changed_cb()
+ * @see bt_gatt_unset_characteristic_changed_cb()
+ */
+typedef void (*bt_gatt_characteristic_changed_cb) (bt_gatt_attribute_h characteristic, unsigned char *value, int value_length, void *user_data);
+
+/**
+ * @ingroup  CAPI_NETWORK_BLUETOOTH_GATT_MODULE
+ * @brief  Registers a callback function that will be invoked when a characteristic in service is changed.
+ * @param[in]  service  The attribute handle of service
+ * @param[in]  callback  The callback function to register
+ * @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_INITIALIZED  Not initialized
+ * @retval  #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+ * @pre  The Bluetooth service must be initialized with bt_initialize().
+ * @see  bt_gatt_unset_characteristic_changed_cb()
+ */
+int bt_gatt_set_characteristic_changed_cb(bt_gatt_attribute_h service, bt_gatt_characteristic_changed_cb callback, void *user_data);
+
+/**
+ * @ingroup  CAPI_NETWORK_BLUETOOTH_GATT_MODULE
+ * @brief  Unregisters a callback function that will be invoked when a characteristic in service is changed.
+ * @param[in]  service  The attribute handle of service
+ * @return  0 on success, otherwise a negative error value.
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @pre The Bluetooth service must be initialized with bt_initialize().
+ * @see bt_gatt_set_characteristic_changed_cb()
+ */
+int bt_gatt_unset_characteristic_changed_cb(bt_gatt_attribute_h service);
+
+/**
+ * @ingroup  CAPI_NETWORK_BLUETOOTH_GATT_MODULE
+ * @brief  Gets the characteristic declaration.
+ * @remarks  @a uuid and @a value must be released with free() by you.
+ * @param[in]  characteristic  The attribute handle of characteristic
+ * @param[out]  uuid  The UUID of service
+ * @param[out]  value  The value of characteristic (byte array)
+ * @param[out]  value_length  The length of value
+ * @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_OPERATION_FAILED  Operation failed
+ * @retval  #BT_ERROR_OUT_OF_MEMORY  Out of memory
+ * @pre  The state of local Bluetooth must be #BT_ADAPTER_ENABLED.
+ * @see  bt_adapter_enable()
+ * @see  bt_gatt_set_characteristic_value()
+ */
+int bt_gatt_get_characteristic_declaration(bt_gatt_attribute_h characteristic, char **uuid, unsigned char **value, int *value_length);
+
+/**
+ * @ingroup  CAPI_NETWORK_BLUETOOTH_GATT_MODULE
+ * @brief  Sets the value of characteristic.
+ * @param[in]  characteristic  The attribute handle of characteristic
+ * @param[in]  value  The value of characteristic (byte array)
+ * @param[in]  value_length  The length of value
+ * @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_OPERATION_FAILED  Operation failed
+ * @pre  The state of local Bluetooth must be #BT_ADAPTER_ENABLED.
+ * @see  bt_adapter_enable()
+ * @see  bt_gatt_get_characteristic_declaration()
+ */
+int bt_gatt_set_characteristic_value(bt_gatt_attribute_h characteristic, const unsigned char *value, int value_length);
+
+/**
+* @ingroup  CAPI_NETWORK_BLUETOOTH_GATT_MODULE
+* @brief  Clones the attribute handle.
+* @remarks  @a clone must be released with bt_gatt_destroy_attribute_handle().
+* @param[out]  clone  The cloned attribute handle
+* @param[in]  origin  The origin attribute handle
+* @return  0 on success, otherwise negative error value.
+* @retval  #BT_ERROR_NONE  Successful
+* @retval  #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+* @retval  #BT_ERROR_OUT_OF_MEMORY  Out of memory
+* @see  bt_gatt_destroy_attribute_handle()
+*/
+int bt_gatt_clone_attribute_handle(bt_gatt_attribute_h* clone, bt_gatt_attribute_h origin);
+
+/**
+* @ingroup  CAPI_NETWORK_BLUETOOTH_GATT_MODULE
+* @brief  Destroys the attribute handle.
+* @param[in]  handle  The attribute handle
+* @return  0 on success, otherwise negative error value.
+* @retval  #BT_ERROR_NONE  Successful
+* @retval  #BT_ERROR_INVALID_PARAMETER  Invalid parameter
+* @see  bt_gatt_clone_attribute_handle()
+*/
+int bt_gatt_destroy_attribute_handle(bt_gatt_attribute_h handle);
+
+/**
+ * @}
+ */
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif // __TIZEN_NETWORK_BLUETOOTH_H__
diff --git a/include/bluetooth_private.h b/include/bluetooth_private.h
new file mode 100644 (file)
index 0000000..c55a8fe
--- /dev/null
@@ -0,0 +1,215 @@
+/*
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __TIZEN_NETWORK_BLUETOOTH_PRIVATE_H__
+#define __TIZEN_NETWORK_BLUETOOTH_PRIVATE_H__
+
+#include <dlog.h>
+#include <stdbool.h>
+#include <bluetooth-api.h>
+#include <bluetooth-audio-api.h>
+#include <bluetooth-telephony-api.h>
+#include <bluetooth-media-control.h>
+#include <bluetooth-hid-api.h>
+
+#include "bluetooth.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#undef LOG_TAG
+#define LOG_TAG "CAPI_NETWORK_BLUETOOTH"
+
+#define BT_INFO(fmt, args...) SLOGI(fmt, ##args)
+#define BT_DBG(fmt, args...) SLOGD(fmt, ##args)
+#define BT_ERR(fmt, args...) SLOGE(fmt, ##args)
+
+#define OPP_UUID "00001105-0000-1000-8000-00805f9b34fb"
+
+/**
+ * @internal
+ * @brief Bluetooth callback.
+ */
+typedef enum
+{
+       BT_EVENT_STATE_CHANGED = 0x00, /**< Adapter state is changed */
+       BT_EVENT_NAME_CHANGED, /**< Adapter name is changed */
+       BT_EVENT_VISIBILITY_MODE_CHANGED, /**< Adapter visibility mode is changed */
+       BT_EVENT_DEVICE_DISCOVERY_STATE_CHANGED, /**< Device discovery state is changed */
+       BT_EVENT_BOND_CREATED, /**< A bond is created */
+       BT_EVENT_BOND_DESTROYED, /**< A bond is destroyed */
+       BT_EVENT_AUTHORIZATION_CHANGED, /**< Authorization is changed */
+       BT_EVENT_SERVICE_SEARCHED, /**< Service search finish */
+       BT_EVENT_DATA_RECEIVED, /**< Data is received */
+       BT_EVENT_CONNECTION_STATE_CHANGED, /**< Connection state is changed */
+       BT_EVENT_RFCOMM_CONNECTION_REQUESTED, /**< RFCOMM connection is requested */
+       BT_EVENT_OPP_CONNECTION_REQUESTED, /**< OPP connection is requested */
+       BT_EVENT_OPP_PUSH_REQUESTED, /**< OPP push is requested */
+       BT_EVENT_OPP_SERVER_TRANSFER_PROGRESS, /**< OPP transfer progress */
+       BT_EVENT_OPP_SERVER_TRANSFER_FINISHED, /**< OPP transfer is completed */
+       BT_EVENT_OPP_CLIENT_PUSH_RESPONSED, /**< OPP client connection is reponsed */
+       BT_EVENT_OPP_CLIENT_PUSH_PROGRESS, /**< OPP client push progress */
+       BT_EVENT_OPP_CLIENT_PUSH_FINISHED, /**< OPP client push is finished */
+       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 */
+       BT_EVENT_HDP_DISCONNECTED, /**< HDP disconnection change */
+       BT_EVENT_HDP_DATA_RECEIVED, /**< HDP Data receive Callabck */
+       BT_EVENT_AUDIO_CONNECTION_STATUS, /**< Audio Connection change callback */
+       BT_EVENT_AG_SCO_CONNECTION_STATUS, /**< Audio - AG SCO Connection state change callback */
+       BT_EVENT_AG_CALL_HANDLING_EVENT, /**< Audio - AG call event callback */
+       BT_EVENT_AG_MULTI_CALL_HANDLING_EVENT, /**< Audio - AG 3-way call event callback */
+       BT_EVENT_AG_DTMF_TRANSMITTED, /**< Audio - DTMF tone sending request */
+       BT_EVENT_AG_MICROPHONE_GAIN_CHANGE, /**< Audio Microphone change callback */
+       BT_EVENT_AG_SPEAKER_GAIN_CHANGE, /**< Audio Speaker gain change callback */
+       BT_EVENT_AVRCP_CONNECTION_STATUS, /**< AVRCP connection change callback */
+       BT_EVENT_AVRCP_EQUALIZER_STATE_CHANGED, /**< AVRCP equalizer state change callback */
+       BT_EVENT_AVRCP_REPEAT_MODE_CHANGED, /**< AVRCP repeat mode change callback */
+       BT_EVENT_AVRCP_SHUFFLE_MODE_CHANGED, /**< AVRCP equalizer mode change callback */
+       BT_EVENT_AVRCP_SCAN_MODE_CHANGED, /**< AVRCP scan mode change callback */
+       BT_EVENT_HID_CONNECTION_STATUS, /**< HID connection status callback */
+       BT_EVENT_DEVICE_CONNECTION_STATUS, /**< Device connection status callback */
+       BT_EVENT_GATT_CHARACTERISTIC_DISCOVERED, /**< GATT characteristic discovered callback */
+       BT_EVENT_GATT_VALUE_CHANGED, /**< GATT characteristic value changed callback */
+} bt_event_e;
+
+/**
+ * @internal
+ */
+typedef struct bt_event_sig_event_slot_s
+{
+    int event_type;
+    const void *callback;
+    void *user_data;
+} bt_event_sig_event_slot_s;
+
+
+#define BT_CHECK_INPUT_PARAMETER(arg) \
+       if (arg == NULL) \
+       { \
+               LOGE("[%s] INVALID_PARAMETER(0x%08x)", __FUNCTION__, BT_ERROR_INVALID_PARAMETER); \
+               return BT_ERROR_INVALID_PARAMETER; \
+       }
+
+/**
+ * @internal
+ * @brief Check the initialzating status
+ */
+int _bt_check_init_status(void);
+
+#define BT_CHECK_INIT_STATUS() \
+       if (_bt_check_init_status() == BT_ERROR_NOT_INITIALIZED) \
+       { \
+               LOGE("[%s] NOT_INITIALIZED(0x%08x)", __FUNCTION__, BT_ERROR_NOT_INITIALIZED); \
+               return BT_ERROR_NOT_INITIALIZED; \
+       }
+
+/**
+ * @internal
+ * @brief Set the event callback.
+ */
+void _bt_set_cb(int events, void *callback, void *user_data);
+
+/**
+ * @internal
+ * @brief Unset the event callback.
+ */
+void _bt_unset_cb(int events);
+
+/**
+ * @internal
+ * @brief Check if the event callback exist or not.
+ */
+bool _bt_check_cb(int events);
+
+/**
+ * @internal
+ * @brief Convert Bluetooth F/W error codes to capi Bluetooth error codes.
+ */
+int _bt_get_error_code(int origin_error);
+
+
+/**
+ * @internal
+ * @brief Convert Bluetooth F/W bluetooth_device_info_t to capi bt_device_info_s.
+ */
+int _bt_get_bt_device_info_s(bt_device_info_s **dest_dev, bluetooth_device_info_t *source_dev);
+
+
+/**
+ * @internal
+ * @brief Free bt_device_info_s.
+ */
+void _bt_free_bt_device_info_s(bt_device_info_s *device_info);
+
+/**
+ * @internal
+ * @brief Convert Bluetooth F/W bluetooth_device_address_t to string.
+ */
+int _bt_convert_address_to_string(char **addr_str, bluetooth_device_address_t *addr_hex);
+
+
+/**
+ * @internal
+ * @brief Convert string to Bluetooth F/W bluetooth_device_address_t.
+ */
+void _bt_convert_address_to_hex(bluetooth_device_address_t *addr_hex, const char *addr_str);
+
+
+/**
+ * @internal
+ * @brief Convert error code to string.
+ */
+char* _bt_convert_error_to_string(int error);
+
+/**
+ * @internal
+ * @brief Convert the visibility mode
+ */
+bt_adapter_visibility_mode_e _bt_get_bt_visibility_mode_e(bluetooth_discoverable_mode_t mode);
+
+/**
+ * @internal
+ * @brief Since the Audio call back and event proxy call backs have different prototype it is wrapper function.
+ */
+void _bt_audio_event_proxy(int event, bt_audio_event_param_t *param, void *user_data);
+
+/**
+ * @internal
+ * @brief Since the Telephony call back and event proxy call backs have different prototype it is wrapper function.
+ */
+void _bt_telephony_event_proxy(int event, telephony_event_param_t *param, void *user_data);
+
+/**
+ * @internal
+ * @brief Since the AVRCP call back and event proxy call backs have different prototype it is wrapper function.
+ */
+void _bt_avrcp_event_proxy(int event, media_event_param_t *param, void *user_data);
+
+/**
+ * @internal
+ * @brief Since the HID call back and event proxy call backs have different prototype it is wrapper function.
+ */
+void _bt_hid_event_proxy(int event, hid_event_param_t *param, void *user_data);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TIZEN_NETWORK_BLUETOOTH_PRIVATE_H__ */
diff --git a/packaging/capi-network-bluetooth.spec b/packaging/capi-network-bluetooth.spec
new file mode 100644 (file)
index 0000000..fdd266c
--- /dev/null
@@ -0,0 +1,59 @@
+#sbs-git:slp/api/bluetooth capi-network-bluetooth 0.1.0 686c444083e4197845c768e5dd034022b1dfa250
+Name:       capi-network-bluetooth
+Summary:    Network Bluetooth Framework
+Version:    0.1.39
+Release:    1
+Group:      TO_BE/FILLED_IN
+License:    Apache License, Version 2.0
+Source0:    %{name}-%{version}.tar.gz
+Requires(post): eglibc
+Requires(postun): eglibc
+
+BuildRequires:  pkgconfig(dbus-glib-1)
+BuildRequires:  pkgconfig(dlog)
+BuildRequires:  pkgconfig(glib-2.0)
+BuildRequires:  pkgconfig(vconf)
+BuildRequires:  pkgconfig(bluetooth-api)
+BuildRequires:  pkgconfig(capi-base-common)
+
+BuildRequires:  cmake
+
+
+%description
+Network Bluetooth Framework
+
+%package devel
+Summary:    Network Bluetooth Framework (DEV)
+Group:      TO_BE/FILLED
+Requires:   %{name} = %{version}-%{release}
+
+%description devel
+Network Bluetooth Framework (DEV).
+
+%prep
+%setup -q
+
+%build
+MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'`
+cmake . -DCMAKE_INSTALL_PREFIX=/usr -DFULLVER=%{version} -DMAJORVER=${MAJORVER}
+
+make %{?jobs:-j%jobs}
+
+%install
+rm -rf %{buildroot}
+%make_install
+
+
+%post -p /sbin/ldconfig
+
+%postun -p /sbin/ldconfig
+
+%files
+%manifest bluetooth.manifest
+%{_libdir}/libcapi-network-bluetooth.so.*
+
+%files devel
+%{_includedir}/network/bluetooth.h
+%{_libdir}/pkgconfig/capi-network-bluetooth.pc
+%{_libdir}/libcapi-network-bluetooth.so
+
diff --git a/src/bluetooth-adapter.c b/src/bluetooth-adapter.c
new file mode 100644 (file)
index 0000000..f9c96d6
--- /dev/null
@@ -0,0 +1,448 @@
+/*
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * 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 <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <dlog.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <bluetooth-api.h>
+
+#include "bluetooth.h"
+#include "bluetooth_private.h"
+
+int bt_adapter_enable(void)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       error_code = _bt_get_error_code(bluetooth_enable_adapter());
+       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_adapter_disable(void)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       error_code = _bt_get_error_code(bluetooth_disable_adapter());
+       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_adapter_get_state(bt_adapter_state_e *adapter_state)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(adapter_state);
+
+       *adapter_state = bluetooth_check_adapter();
+       return BT_ERROR_NONE;
+}
+
+int bt_adapter_get_address(char **address)
+{
+       bluetooth_device_address_t loc_address = { {0} };
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(address);
+
+       error_code = _bt_get_error_code(bluetooth_get_local_address(&loc_address));
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+               return error_code;
+       }
+
+       error_code = _bt_convert_address_to_string(address, &loc_address);
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+               return error_code;
+       }
+
+       return BT_ERROR_NONE;
+}
+
+int bt_adapter_get_name(char **name)
+{
+       int ret = BT_ERROR_NONE;
+       bluetooth_device_name_t loc_name = { {0} };
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(name);
+
+       ret = _bt_get_error_code(bluetooth_get_local_name(&loc_name));
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+               return ret;
+       }
+
+       *name = strdup(loc_name.name);
+       if (*name == NULL) {
+               BT_ERR("OUT_OF_MEMORY(0x%08x)", BT_ERROR_OUT_OF_MEMORY);
+               return BT_ERROR_OUT_OF_MEMORY;
+       }
+
+       return BT_ERROR_NONE;
+}
+
+int bt_adapter_set_name(const char *name)
+{
+       bluetooth_device_name_t loc_name = { {0} };
+       int ret = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(name);
+
+       strncpy(loc_name.name, name, BLUETOOTH_DEVICE_NAME_LENGTH_MAX);
+       loc_name.name[BLUETOOTH_DEVICE_NAME_LENGTH_MAX] = '\0';
+
+       ret = _bt_get_error_code(bluetooth_set_local_name(&loc_name));
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+       }
+
+       return ret;
+}
+
+int bt_adapter_get_visibility(bt_adapter_visibility_mode_e *mode, int *duration)
+{
+       bluetooth_discoverable_mode_t discoverable_mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
+       int ret = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(mode);
+
+       ret = _bt_get_error_code(bluetooth_get_discoverable_mode(&discoverable_mode));
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+               return ret;
+       }
+
+       *mode = _bt_get_bt_visibility_mode_e(discoverable_mode);
+
+       if (duration)
+               *duration = 0;
+
+       if (discoverable_mode == BLUETOOTH_DISCOVERABLE_MODE_TIME_LIMITED_DISCOVERABLE) {
+               if (duration == NULL)
+                       return BT_ERROR_NONE;
+               ret = bluetooth_get_timeout_value(duration);
+               if (ret != BT_ERROR_NONE) {
+                       BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+               }
+       }
+
+       return BT_ERROR_NONE;
+}
+
+int bt_adapter_set_visibility(bt_adapter_visibility_mode_e visibility_mode, int timeout_sec)
+{
+       bluetooth_discoverable_mode_t discoverable_mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       switch (visibility_mode) {
+       case BT_ADAPTER_VISIBILITY_MODE_LIMITED_DISCOVERABLE:
+               discoverable_mode = BLUETOOTH_DISCOVERABLE_MODE_TIME_LIMITED_DISCOVERABLE;
+               break;
+       case BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE:
+               discoverable_mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
+               timeout_sec = 0;
+               break;
+       case BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE:
+               discoverable_mode = BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE;
+               timeout_sec = 0;
+               break;
+       default:
+               BT_ERR("INVALID_PARAMETER(0x%08x)", BT_ERROR_INVALID_PARAMETER);
+               return BT_ERROR_INVALID_PARAMETER;
+       }
+
+       error_code = _bt_get_error_code(bluetooth_set_discoverable_mode(discoverable_mode, timeout_sec));
+       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_adapter_foreach_bonded_device(bt_adapter_bonded_device_cb foreach_cb, void *user_data)
+{
+       GPtrArray *dev_list = NULL;
+       bt_device_info_s *dev_info = NULL;
+       bluetooth_device_info_t *ptr = NULL;
+       int ret = BT_ERROR_NONE;
+       int i = 0;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(foreach_cb);
+
+       dev_list = g_ptr_array_new();
+       if (dev_list == NULL) {
+               BT_ERR("OUT_OF_MEMORY(0x%08x)", BT_ERROR_OUT_OF_MEMORY);
+               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_convert_error_to_string(ret), ret);
+               return ret;
+       }
+
+       for (i = 0; i < dev_list->len; i++) {
+               ptr = g_ptr_array_index(dev_list, i);
+               if (ptr != NULL) {
+                       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_convert_error_to_string(ret), ret);
+                               break;
+                       }
+
+                       if (!foreach_cb(dev_info, user_data)) {
+                               _bt_free_bt_device_info_s(dev_info);
+                               break;
+                       }
+                       _bt_free_bt_device_info_s(dev_info);
+               } else {
+                       BT_ERR("OPERATION_FAILED(0x%08x)", BT_ERROR_OPERATION_FAILED);
+                       ret = BT_ERROR_OPERATION_FAILED;
+                       break;
+               }
+       }
+
+       if (dev_list != NULL) {
+               g_ptr_array_free(dev_list, TRUE);
+       }
+
+       return ret;
+}
+
+int bt_adapter_get_bonded_device_info(const char *remote_address, bt_device_info_s **device_info)
+{
+       int ret;
+       bluetooth_device_address_t addr_hex = { {0,} };
+       bluetooth_device_info_t *info;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(remote_address);
+
+       info = (bluetooth_device_info_t *)malloc(sizeof(bluetooth_device_info_t));
+       if (info == NULL)
+               return BT_ERROR_OUT_OF_MEMORY;
+
+       _bt_convert_address_to_hex(&addr_hex, remote_address);
+
+       ret = _bt_get_error_code(bluetooth_get_bonded_device(&addr_hex, info));
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x) : Failed to run function",
+                                       _bt_convert_error_to_string(ret), ret);
+       } else {
+               ret = _bt_get_bt_device_info_s(device_info, info);
+               if (ret != BT_ERROR_NONE) {
+                       BT_ERR("%s(0x%08x) : Failed to get device info",
+                                               _bt_convert_error_to_string(ret),
+                                               ret);
+               }
+       }
+
+       free(info);
+
+       return ret;
+}
+
+int bt_adapter_free_device_info(bt_device_info_s *device_info)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(device_info);
+
+       _bt_free_bt_device_info_s(device_info);
+
+       return BT_ERROR_NONE;
+}
+
+int bt_adapter_is_service_used(const char *service_uuid, bool *used)
+{
+       int ret = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(service_uuid);
+       BT_CHECK_INPUT_PARAMETER(used);
+
+       if (strcmp(service_uuid, OPP_UUID) == 0) {
+               *used = bluetooth_obex_server_is_activated();
+       } else {
+               ret = _bt_get_error_code(bluetooth_is_service_used(service_uuid,
+                                                       (gboolean *)used));
+       }
+
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x) : Failed to run function", _bt_convert_error_to_string(ret), ret);
+       }
+
+       return ret;
+}
+
+int bt_adapter_set_state_changed_cb(bt_adapter_state_changed_cb callback, void *user_data)
+{
+       int ret = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_STATE_CHANGED, callback, user_data);
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+       }
+
+       return ret;
+}
+
+int bt_adapter_set_name_changed_cb(bt_adapter_name_changed_cb callback, void *user_data)
+{
+       int ret = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_NAME_CHANGED, callback, user_data);
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+       }
+
+       return ret;
+}
+
+int bt_adapter_set_visibility_mode_changed_cb(bt_adapter_visibility_mode_changed_cb callback, void *user_data)
+{
+       int ret = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_VISIBILITY_MODE_CHANGED, callback, user_data);
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+       }
+
+       return ret;
+}
+
+int bt_adapter_set_device_discovery_state_changed_cb(bt_adapter_device_discovery_state_changed_cb callback, void *user_data)
+{
+       int ret = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_DEVICE_DISCOVERY_STATE_CHANGED, callback, user_data);
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+       }
+
+       return ret;
+}
+
+int bt_adapter_unset_state_changed_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+       _bt_unset_cb(BT_EVENT_STATE_CHANGED);
+       return BT_ERROR_NONE;
+}
+
+int bt_adapter_unset_name_changed_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+       _bt_unset_cb(BT_EVENT_NAME_CHANGED);
+       return BT_ERROR_NONE;
+}
+
+int bt_adapter_unset_visibility_mode_changed_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+       _bt_unset_cb(BT_EVENT_VISIBILITY_MODE_CHANGED);
+       return BT_ERROR_NONE;
+}
+
+int bt_adapter_set_visibility_duration_changed_cb(bt_adapter_visibility_duration_changed_cb callback, void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+
+       /* Will impelement it */
+
+       return BT_ERROR_NONE;
+}
+
+int bt_adapter_unset_visibility_duration_changed_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+
+       /* Will impelement it */
+
+       return BT_ERROR_NONE;
+}
+
+int bt_adapter_unset_device_discovery_state_changed_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+       _bt_unset_cb(BT_EVENT_DEVICE_DISCOVERY_STATE_CHANGED);
+       return BT_ERROR_NONE;
+}
+
+int bt_adapter_start_device_discovery(void)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       error_code = _bt_get_error_code(bluetooth_start_discovery(0, 0, BLUETOOTH_DEVICE_MAJOR_MASK_MISC));
+       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_adapter_stop_device_discovery(void)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       error_code = _bt_get_error_code(bluetooth_cancel_discovery());
+       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_adapter_is_discovering(bool *is_discovering)
+{
+       int ret = 0;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(is_discovering);
+
+       ret = bluetooth_is_discovering();
+       if (ret >= BLUETOOTH_ERROR_BASE) {
+               *is_discovering = (ret == 1) ? true : false;
+               return BT_ERROR_NONE;
+       } else {
+               ret = _bt_get_error_code(ret);
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+               return ret;
+       }
+}
+
diff --git a/src/bluetooth-audio.c b/src/bluetooth-audio.c
new file mode 100644 (file)
index 0000000..59b1c74
--- /dev/null
@@ -0,0 +1,495 @@
+/*
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * 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 <dlog.h>
+#include <stdbool.h>
+#include <bluetooth-api.h>
+#include <string.h>
+#include "bluetooth.h"
+#include "bluetooth_private.h"
+#include "bluetooth-audio-api.h"
+#include "bluetooth-telephony-api.h"
+
+typedef struct _call_list_s {
+       GList *list;
+} call_list_s;
+
+/*The below API is just to convert the error from Telephony API's to CAPI error codes,
+* this is temporary change and changes to proper error code will be done in
+* subsequent check ins.*/
+int _bt_convert_telephony_error_code(int error)
+{
+       switch(error) {
+       case BLUETOOTH_TELEPHONY_ERROR_NONE:
+               return BT_ERROR_NONE;
+       case BLUETOOTH_TELEPHONY_ERROR_INVALID_PARAM:
+               return BT_ERROR_INVALID_PARAMETER;
+       case BLUETOOTH_TELEPHONY_ERROR_NOT_INITIALIZED:
+               return BT_ERROR_NOT_INITIALIZED;
+       case BLUETOOTH_TELEPHONY_ERROR_NOT_ENABLED:
+               return BT_ERROR_NOT_ENABLED;
+       case BLUETOOTH_TELEPHONY_ERROR_AUDIO_NOT_CONNECTED:
+       case BLUETOOTH_TELEPHONY_ERROR_NOT_CONNECTED:
+               return BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED;
+       case BLUETOOTH_TELEPHONY_ERROR_BUSY:
+               return BT_ERROR_RESOURCE_BUSY;
+       case BLUETOOTH_TELEPHONY_ERROR_NO_MEMORY:
+               return BT_ERROR_OUT_OF_MEMORY;
+       case BLUETOOTH_TELEPHONY_ERROR_ALREADY_INITIALIZED:
+       case BLUETOOTH_TELEPHONY_ERROR_ALREADY_EXSIST:
+       case BLUETOOTH_TELEPHONY_ERROR_ALREADY_CONNECTED:
+               return BT_ERROR_ALREADY_DONE;
+       case BLUETOOTH_TELEPHONY_ERROR_INTERNAL:
+       case BLUETOOTH_TELEPHONY_ERROR_NOT_AVAILABLE:
+       case BLUETOOTH_TELEPHONY_ERROR_I_O_ERROR:
+       case BLUETOOTH_TELEPHONY_ERROR_OPERATION_NOT_AVAILABLE:
+               return BT_ERROR_OPERATION_FAILED;
+       default:
+               return BT_ERROR_NONE;
+       }
+}
+
+int bt_audio_initialize(void)
+{
+       int error;
+
+       BT_CHECK_INIT_STATUS();
+       error = bluetooth_audio_init(_bt_audio_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;
+       }
+       error = bluetooth_telephony_init((void *)_bt_telephony_event_proxy, NULL);
+       error = _bt_convert_telephony_error_code(error);
+       error = _bt_get_error_code(error);
+       if (BT_ERROR_NONE != error) {
+               BT_ERR("[%s] %s(0x%08x)",
+                       _bt_convert_error_to_string(error), error);
+       }
+       return error;
+}
+
+int bt_audio_deinitialize(void)
+{
+       int error;
+
+       BT_CHECK_INIT_STATUS();
+       error = bluetooth_audio_deinit();
+       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;
+       }
+       error = bluetooth_telephony_deinit();
+       error = _bt_convert_telephony_error_code(error);
+       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;
+}
+
+int bt_audio_connect(const char *remote_address, bt_audio_profile_type_e type)
+{
+       int error;
+       bluetooth_device_address_t addr_hex = { {0,} };
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(remote_address);
+       _bt_convert_address_to_hex(&addr_hex, remote_address);
+       switch(type) {
+       case BT_AUDIO_PROFILE_TYPE_HSP_HFP:
+               error = bluetooth_ag_connect(&addr_hex);
+               break;
+       case BT_AUDIO_PROFILE_TYPE_A2DP:
+               error = bluetooth_av_connect(&addr_hex);
+               break;
+       case BT_AUDIO_PROFILE_TYPE_ALL:
+       default:
+               error = bluetooth_audio_connect(&addr_hex);
+               break;
+       }
+       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_audio_disconnect(const char *remote_address, bt_audio_profile_type_e type)
+{
+       int error;
+       bluetooth_device_address_t addr_hex = { {0,} };
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(remote_address);
+       _bt_convert_address_to_hex(&addr_hex, remote_address);
+       switch(type) {
+       case BT_AUDIO_PROFILE_TYPE_HSP_HFP:
+               error = bluetooth_ag_disconnect(&addr_hex);
+               break;
+       case BT_AUDIO_PROFILE_TYPE_A2DP:
+               error = bluetooth_av_disconnect(&addr_hex);
+               break;
+       case BT_AUDIO_PROFILE_TYPE_ALL:
+       default:
+               error = bluetooth_audio_disconnect(&addr_hex);
+               break;
+       }
+       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_audio_set_connection_state_changed_cb(bt_audio_connection_state_changed_cb callback, void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_AUDIO_CONNECTION_STATUS, callback, user_data);
+       return BT_ERROR_NONE;
+
+}
+int bt_audio_unset_connection_state_changed_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+       if (_bt_check_cb(BT_EVENT_AUDIO_CONNECTION_STATUS) == true)
+               _bt_unset_cb(BT_EVENT_AUDIO_CONNECTION_STATUS);
+       return BT_ERROR_NONE;
+}
+
+int bt_ag_notify_speaker_gain(int gain)
+{
+       int error;
+
+       BT_CHECK_INIT_STATUS();
+       error = bluetooth_telephony_set_speaker_gain((unsigned short)gain);
+       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;
+}
+
+int bt_ag_get_speaker_gain(int *gain)
+{
+       int error;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(gain);
+       error = bluetooth_telephony_get_headset_volume((unsigned int *)gain);
+       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;
+}
+
+int bt_ag_is_nrec_enabled(bool *enabled)
+{
+       int error;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(enabled);
+
+       error = bluetooth_telephony_is_nrec_enabled((gboolean *)enabled);
+       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;
+}
+
+int bt_ag_set_microphone_gain_changed_cb(bt_ag_microphone_gain_changed_cb callback, void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_AG_MICROPHONE_GAIN_CHANGE, callback, user_data);
+       return BT_ERROR_NONE;
+
+}
+
+int bt_ag_unset_microphone_gain_changed_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+       if (_bt_check_cb(BT_EVENT_AG_MICROPHONE_GAIN_CHANGE) == true)
+               _bt_unset_cb(BT_EVENT_AG_MICROPHONE_GAIN_CHANGE);
+       return BT_ERROR_NONE;
+}
+
+int bt_ag_set_speaker_gain_changed_cb(bt_ag_speaker_gain_changed_cb callback,
+                                       void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_AG_SPEAKER_GAIN_CHANGE, callback, user_data);
+       return BT_ERROR_NONE;
+}
+
+int bt_ag_unset_speaker_gain_changed_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+       if (_bt_check_cb(BT_EVENT_AG_SPEAKER_GAIN_CHANGE) == true)
+               _bt_unset_cb(BT_EVENT_AG_SPEAKER_GAIN_CHANGE);
+       return BT_ERROR_NONE;
+}
+
+int bt_ag_open_sco(void)
+{
+       int error;
+
+       BT_CHECK_INIT_STATUS();
+       error = bluetooth_telephony_audio_open();
+       error = _bt_convert_telephony_error_code(error);
+       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_ag_close_sco(void)
+{
+       int error;
+
+       BT_CHECK_INIT_STATUS();
+       error = bluetooth_telephony_audio_close();
+       error = _bt_convert_telephony_error_code(error);
+       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_ag_is_sco_opened(bool *opened)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(opened);
+       *opened = bluetooth_telephony_is_sco_connected();
+       return BT_ERROR_NONE;
+}
+
+int bt_ag_set_sco_state_changed_cb(bt_ag_sco_state_changed_cb callback,
+                                       void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_AG_SCO_CONNECTION_STATUS, callback, user_data);
+       return BT_ERROR_NONE;
+}
+
+int bt_ag_unset_sco_state_changed_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+       if (_bt_check_cb(BT_EVENT_AG_SCO_CONNECTION_STATUS) == true)
+               _bt_unset_cb(BT_EVENT_AG_SCO_CONNECTION_STATUS);
+       return BT_ERROR_NONE;
+}
+
+int bt_ag_notify_call_event(bt_ag_call_event_e event, unsigned int call_id, const char *phone_number)
+{
+       int error;
+
+       BT_CHECK_INIT_STATUS();
+       switch(event) {
+       case BT_AG_CALL_EVENT_IDLE:
+               error = bluetooth_telephony_call_end(call_id);
+               break;
+       case BT_AG_CALL_EVENT_ANSWERED:
+               error = bluetooth_telephony_call_answered(call_id, FALSE);
+               break;
+       case BT_AG_CALL_EVENT_HELD:
+               error = bluetooth_telephony_call_held(call_id);
+               break;
+       case BT_AG_CALL_EVENT_RETRIEVED:
+               error = bluetooth_telephony_call_retrieved(call_id);
+               break;
+       case BT_AG_CALL_EVENT_DIALING:
+               BT_CHECK_INPUT_PARAMETER(phone_number);
+               error = bluetooth_telephony_indicate_outgoing_call(
+                                       phone_number, call_id, FALSE);
+               break;
+       case BT_AG_CALL_EVENT_ALERTING:
+               error = bluetooth_telephony_call_remote_ringing(call_id);
+               break;
+       case BT_AG_CALL_EVENT_INCOMING:
+               BT_CHECK_INPUT_PARAMETER(phone_number);
+               error = bluetooth_telephony_indicate_incoming_call(phone_number,
+                                       call_id);
+               break;
+       default:
+               error = BT_ERROR_INVALID_PARAMETER;
+       }
+       error = _bt_convert_telephony_error_code(error);
+       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_ag_notify_call_list(bt_call_list_h list)
+{
+       int error;
+       unsigned int call_count;
+       call_list_s *handle;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(list);
+       handle = (call_list_s *)list;
+       call_count = g_list_length(handle->list);
+       error = bluetooth_telephony_set_call_status((void *)handle->list, call_count);
+       error = _bt_convert_telephony_error_code(error);
+       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_ag_notify_voice_recognition_state(bool state)
+{
+       int error;
+
+       BT_CHECK_INIT_STATUS();
+       if (state)
+               error = bluetooth_telephony_start_voice_recognition();
+       else
+               error = bluetooth_telephony_stop_voice_recognition();
+       error = _bt_convert_telephony_error_code(error);
+       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_ag_set_call_handling_event_cb(bt_ag_call_handling_event_cb callback,
+                                       void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_AG_CALL_HANDLING_EVENT, callback, user_data);
+       return BT_ERROR_NONE;
+
+}
+
+int bt_ag_unset_call_handling_event_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+       if (_bt_check_cb(BT_EVENT_AG_CALL_HANDLING_EVENT) == true)
+               _bt_unset_cb(BT_EVENT_AG_CALL_HANDLING_EVENT);
+       return BT_ERROR_NONE;
+}
+
+int bt_ag_set_multi_call_handling_event_cb(
+                                       bt_ag_multi_call_handling_event_cb callback,
+                                       void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_AG_MULTI_CALL_HANDLING_EVENT, callback, user_data);
+       return BT_ERROR_NONE;
+}
+
+int bt_ag_unset_multi_call_handling_event_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+       if (_bt_check_cb(BT_EVENT_AG_MULTI_CALL_HANDLING_EVENT) == true)
+               _bt_unset_cb(BT_EVENT_AG_MULTI_CALL_HANDLING_EVENT);
+       return BT_ERROR_NONE;
+}
+
+int bt_ag_set_dtmf_transmitted_cb(bt_ag_dtmf_transmitted_cb callback,
+                                               void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_AG_DTMF_TRANSMITTED, callback, user_data);
+       return BT_ERROR_NONE;
+}
+
+int bt_ag_unset_dtmf_transmitted_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+       if (_bt_check_cb(BT_EVENT_AG_DTMF_TRANSMITTED) == true)
+               _bt_unset_cb(BT_EVENT_AG_DTMF_TRANSMITTED);
+       return BT_ERROR_NONE;
+}
+
+int bt_call_list_create(bt_call_list_h *list)
+{
+       call_list_s *handle;
+
+       BT_CHECK_INIT_STATUS();
+       if (*list != NULL) {
+               BT_ERR("BT_ERROR_ALREADY_DONE(0x%08x)", BT_ERROR_ALREADY_DONE);
+               return BT_ERROR_ALREADY_DONE;
+       }
+       handle = g_malloc0(sizeof(call_list_s));
+       *list = handle;
+       return BT_ERROR_NONE;
+}
+
+int bt_call_list_destroy(bt_call_list_h list)
+{
+       int result;
+       call_list_s *handle;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(list);
+       handle = (call_list_s *)list;
+       result = bt_call_list_reset(list);
+       g_free(handle);
+       return result;
+}
+
+int bt_call_list_reset(bt_call_list_h list)
+{
+       call_list_s *handle;
+       bt_telephony_call_status_info_t *call_status;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(list);
+       handle = (call_list_s *)list;
+       do  {
+               call_status = (bt_telephony_call_status_info_t *)g_list_nth_data(handle->list, 0);
+               if (call_status == NULL)
+                       break;
+               handle->list = g_list_remove(handle->list, call_status);
+               g_free(call_status);
+       } while (1);
+       return BT_ERROR_NONE;
+}
+
+int bt_call_list_add(bt_call_list_h list, unsigned int call_id, bt_ag_call_state_e state)
+{
+       call_list_s *handle;
+       bt_telephony_call_status_info_t *call_status;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(list);
+       handle = (call_list_s *)list;
+       call_status = g_malloc0(sizeof(bt_telephony_call_status_info_t));
+       call_status->call_id = call_id;
+       call_status->call_status = state;
+       handle->list = g_list_append(handle->list, (gpointer)call_status);
+       return BT_ERROR_NONE;
+}
diff --git a/src/bluetooth-avrcp.c b/src/bluetooth-avrcp.c
new file mode 100644 (file)
index 0000000..9eb4cd6
--- /dev/null
@@ -0,0 +1,229 @@
+/*
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * 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 <dlog.h>
+#include <stdbool.h>
+#include <bluetooth-api.h>
+#include "bluetooth.h"
+#include "bluetooth_private.h"
+#include "bluetooth-audio-api.h"
+#include "bluetooth-media-control.h"
+
+/*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
+* subsequent check ins.*/
+int _bt_convert_avrcp_error_code(int error)
+{
+       switch(error) {
+       case BT_MEDIA_ERROR_NONE:
+               return BT_ERROR_NONE;
+       case BT_MEDIA_ERROR_INTERNAL:
+               return BT_ERROR_INVALID_PARAMETER;
+       case BT_MEDIA_ERROR_ALREADY_INITIALIZED:
+               return BT_ERROR_OPERATION_FAILED;
+       default:
+               return BT_ERROR_NONE;
+       }
+}
+
+int bt_avrcp_target_initialize(bt_avrcp_target_connection_state_changed_cb callback, void *user_data)
+{
+       int error;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_AVRCP_CONNECTION_STATUS, callback, user_data);
+       error = bluetooth_media_player_init(_bt_avrcp_event_proxy, NULL);
+       error = _bt_convert_avrcp_error_code(error);
+       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;
+}
+
+int bt_avrcp_target_deinitialize(void)
+{
+       int error;
+
+       BT_CHECK_INIT_STATUS();
+       if (_bt_check_cb(BT_EVENT_AVRCP_CONNECTION_STATUS) == true)
+               _bt_unset_cb(BT_EVENT_AVRCP_CONNECTION_STATUS);
+
+       error = bluetooth_media_player_deinit();
+       error = _bt_convert_avrcp_error_code(error);
+
+       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;
+}
+
+int bt_avrcp_target_notify_equalizer_state(bt_avrcp_equalizer_state_e state)
+{
+       int error;
+       BT_CHECK_INIT_STATUS();
+       error = bluetooth_media_player_change_property(EQUALIZER, state);
+       error = _bt_convert_avrcp_error_code(error);
+       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;
+}
+int bt_avrcp_target_notify_repeat_mode(bt_avrcp_repeat_mode_e mode)
+{
+       int error;
+       BT_CHECK_INIT_STATUS();
+       error = bluetooth_media_player_change_property(REPEAT, mode);
+       error = _bt_convert_avrcp_error_code(error);
+       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;
+}
+
+int bt_avrcp_target_notify_shuffle_mode(bt_avrcp_shuffle_mode_e mode)
+{
+       int error;
+       BT_CHECK_INIT_STATUS();
+       error = bluetooth_media_player_change_property(SHUFFLE, mode);
+       error = _bt_convert_avrcp_error_code(error);
+       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;
+}
+int bt_avrcp_target_notify_scan_mode(bt_avrcp_scan_mode_e mode)
+{
+       int error;
+       BT_CHECK_INIT_STATUS();
+       error = bluetooth_media_player_change_property(SCAN, mode);
+       error = _bt_convert_avrcp_error_code(error);
+       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;
+}
+
+int bt_avrcp_target_notify_player_state(bt_avrcp_player_state_e state)
+{
+       int error;
+       BT_CHECK_INIT_STATUS();
+       error = bluetooth_media_player_change_property(STATUS, state);
+       error = _bt_convert_avrcp_error_code(error);
+       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;
+}
+
+int bt_avrcp_target_notify_position(unsigned int position)
+{
+       int error;
+       BT_CHECK_INIT_STATUS();
+       error = bluetooth_media_player_change_property(POSITION, position);
+       error = _bt_convert_avrcp_error_code(error);
+       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;
+}
+
+int bt_avrcp_target_notify_track(const char *title, const char *artist, const char *album,
+               const char *genre, unsigned int track_num, unsigned int total_tracks, unsigned int duration)
+{
+       int error;
+       BT_CHECK_INIT_STATUS();
+       media_metadata_attributes_t metadata;
+       metadata.title = title;
+       metadata.artist = artist;
+       metadata.duration = duration;
+       metadata.genre = genre;
+       metadata.number = track_num;
+       metadata.album = album;
+       metadata.total_tracks = total_tracks;
+       error = bluetooth_media_player_change_track(&metadata);
+       error = _bt_convert_avrcp_error_code(error);
+       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;
+}
+
+int bt_avrcp_set_equalizer_state_changed_cb(bt_avrcp_equalizer_state_changed_cb callback, void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_AVRCP_EQUALIZER_STATE_CHANGED, callback, user_data);
+       return BT_ERROR_NONE;
+}
+
+int bt_avrcp_unset_equalizer_state_changed_cb(void)
+{
+       _bt_unset_cb(BT_EVENT_AVRCP_EQUALIZER_STATE_CHANGED);
+       return BT_ERROR_NONE;
+}
+
+int bt_avrcp_set_repeat_mode_changed_cb(bt_avrcp_repeat_mode_changed_cb callback, void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_AVRCP_REPEAT_MODE_CHANGED, callback, user_data);
+       return BT_ERROR_NONE;
+}
+
+int bt_avrcp_unset_repeat_mode_changed_cb(void)
+{
+       _bt_unset_cb(BT_EVENT_AVRCP_REPEAT_MODE_CHANGED);
+       return BT_ERROR_NONE;
+}
+
+int bt_avrcp_set_shuffle_mode_changed_cb(bt_avrcp_shuffle_mode_changed_cb callback, void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_AVRCP_SHUFFLE_MODE_CHANGED, callback, user_data);
+       return BT_ERROR_NONE;
+}
+
+int bt_avrcp_unset_shuffle_mode_changed_cb(void)
+{
+       _bt_unset_cb(BT_EVENT_AVRCP_SHUFFLE_MODE_CHANGED);
+       return BT_ERROR_NONE;
+}
+
+int bt_avrcp_set_scan_mode_changed_cb(bt_avrcp_scan_mode_changed_cb callback, void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_AVRCP_SCAN_MODE_CHANGED, callback, user_data);
+       return BT_ERROR_NONE;
+}
+
+int bt_avrcp_unset_scan_mode_changed_cb(void)
+{
+       _bt_unset_cb(BT_EVENT_AVRCP_SCAN_MODE_CHANGED);
+       return BT_ERROR_NONE;
+}
+
diff --git a/src/bluetooth-common.c b/src/bluetooth-common.c
new file mode 100644 (file)
index 0000000..67a6cc1
--- /dev/null
@@ -0,0 +1,1270 @@
+/*
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * 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 <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <dlog.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <bluetooth-api.h>
+
+#include "bluetooth.h"
+#include "bluetooth_private.h"
+#include "bluetooth-media-control.h"
+#include "bluetooth-telephony-api.h"
+
+static bool is_initialized = false;
+static bt_event_sig_event_slot_s bt_event_slot_container[] = {
+       {BT_EVENT_STATE_CHANGED, NULL, NULL},
+       {BT_EVENT_NAME_CHANGED, NULL, NULL},
+       {BT_EVENT_VISIBILITY_MODE_CHANGED, NULL, NULL},
+       {BT_EVENT_DEVICE_DISCOVERY_STATE_CHANGED, NULL, NULL},
+       {BT_EVENT_BOND_CREATED, NULL, NULL},
+       {BT_EVENT_BOND_DESTROYED, NULL, NULL},
+       {BT_EVENT_AUTHORIZATION_CHANGED, NULL, NULL},
+       {BT_EVENT_SERVICE_SEARCHED, NULL, NULL},
+       {BT_EVENT_DATA_RECEIVED, NULL, NULL},
+       {BT_EVENT_CONNECTION_STATE_CHANGED, NULL, NULL},
+       {BT_EVENT_RFCOMM_CONNECTION_REQUESTED, NULL, NULL},
+       {BT_EVENT_OPP_CONNECTION_REQUESTED, NULL, NULL},
+       {BT_EVENT_OPP_PUSH_REQUESTED, NULL, NULL},
+       {BT_EVENT_OPP_SERVER_TRANSFER_PROGRESS, NULL, NULL},
+       {BT_EVENT_OPP_SERVER_TRANSFER_FINISHED, NULL, NULL},
+       {BT_EVENT_OPP_CLIENT_PUSH_RESPONSED, NULL, NULL},
+       {BT_EVENT_OPP_CLIENT_PUSH_PROGRESS, NULL, NULL},
+       {BT_EVENT_OPP_CLIENT_PUSH_FINISHED, NULL, NULL},
+       {BT_EVENT_PAN_CONNECTION_STATE_CHANGED, NULL, NULL},
+       {BT_EVENT_NAP_CONNECTION_STATE_CHANGED, NULL, NULL},
+       {BT_EVENT_HDP_CONNECTED, NULL, NULL},
+       {BT_EVENT_HDP_DISCONNECTED, NULL, NULL},
+       {BT_EVENT_HDP_DATA_RECEIVED, NULL, NULL},
+       {BT_EVENT_AUDIO_CONNECTION_STATUS, NULL, NULL},
+       {BT_EVENT_AG_SCO_CONNECTION_STATUS, NULL, NULL},
+       {BT_EVENT_AG_CALL_HANDLING_EVENT, NULL, NULL},
+       {BT_EVENT_AG_MULTI_CALL_HANDLING_EVENT, NULL, NULL},
+       {BT_EVENT_AG_DTMF_TRANSMITTED, NULL, NULL},
+       {BT_EVENT_AG_MICROPHONE_GAIN_CHANGE, NULL, NULL},
+       {BT_EVENT_AG_SPEAKER_GAIN_CHANGE, NULL, NULL},
+       {BT_EVENT_AVRCP_CONNECTION_STATUS, NULL, NULL},
+       {BT_EVENT_AVRCP_EQUALIZER_STATE_CHANGED, NULL, NULL},
+       {BT_EVENT_AVRCP_REPEAT_MODE_CHANGED, NULL, NULL},
+       {BT_EVENT_AVRCP_SHUFFLE_MODE_CHANGED, NULL, NULL},
+       {BT_EVENT_AVRCP_SCAN_MODE_CHANGED, NULL, NULL},
+       {BT_EVENT_HID_CONNECTION_STATUS, NULL, NULL},
+       {BT_EVENT_DEVICE_CONNECTION_STATUS, NULL, NULL},
+       {BT_EVENT_GATT_CHARACTERISTIC_DISCOVERED, NULL, NULL},
+       {BT_EVENT_GATT_VALUE_CHANGED, NULL, NULL}
+};
+
+/*
+ *  Internal Functions
+ */
+static void __bt_event_proxy(int event, bluetooth_event_param_t * param, void *user_data);
+static int __bt_get_cb_index(int event);
+static void __bt_convert_lower_to_upper(char *origin);
+static int __bt_get_bt_device_sdp_info_s(bt_device_sdp_info_s **dest, bt_sdp_info_t *source);
+static void __bt_free_bt_device_sdp_info_s(bt_device_sdp_info_s *sdp_info);
+static int __bt_get_bt_adapter_device_discovery_info_s(bt_adapter_device_discovery_info_s **discovery_info, bluetooth_device_info_t *source_info);
+static void __bt_free_bt_adapter_device_discovery_info_s(bt_adapter_device_discovery_info_s *discovery_info);
+
+
+/*
+ *  Public Functions
+ */
+
+int bt_initialize(void)
+{
+       if (is_initialized != true) {
+               if (bluetooth_register_callback(&__bt_event_proxy, NULL) != BLUETOOTH_ERROR_NONE) {
+                       BT_ERR("OPERATION_FAILED(0x%08x)", BT_ERROR_OPERATION_FAILED);
+                       return BT_ERROR_OPERATION_FAILED;
+               }
+               is_initialized = true;
+       }
+
+       return BT_ERROR_NONE;
+}
+
+int bt_deinitialize(void)
+{
+       BT_CHECK_INIT_STATUS();
+       if (bluetooth_unregister_callback() != BLUETOOTH_ERROR_NONE) {
+               BT_ERR("OPERATION_FAILED(0x%08x)", BT_ERROR_OPERATION_FAILED);
+               return BT_ERROR_OPERATION_FAILED;
+       }
+       is_initialized = false;
+
+       return BT_ERROR_NONE;
+}
+
+
+/*
+ *  Common Functions
+ */
+int _bt_check_init_status(void)
+{
+       if (is_initialized != true)
+       {
+               BT_ERR("NOT_INITIALIZED(0x%08x)", BT_ERROR_NOT_INITIALIZED);
+               return BT_ERROR_NOT_INITIALIZED;
+       }
+
+       return BT_ERROR_NONE;
+}
+
+void _bt_set_cb(int events, void *callback, void *user_data)
+{
+       bt_event_slot_container[events].callback = callback;
+       bt_event_slot_container[events].user_data = user_data;
+}
+
+void _bt_unset_cb(int events)
+{
+       if (bt_event_slot_container[events].callback != NULL) {
+               bt_event_slot_container[events].callback = NULL;
+               bt_event_slot_container[events].user_data = NULL;
+       }
+}
+
+bool _bt_check_cb(int events)
+{
+       return (bt_event_slot_container[events].callback != NULL) ? true : false;
+}
+
+int _bt_get_error_code(int origin_error)
+{
+       switch (origin_error) {
+       case BLUETOOTH_ERROR_NONE:
+               return BT_ERROR_NONE;
+       case BLUETOOTH_ERROR_INVALID_DATA:
+       case BLUETOOTH_ERROR_INVALID_PARAM:
+       case BLUETOOTH_ERROR_NOT_CONNECTED:
+       case BLUETOOTH_ERROR_NOT_SUPPORT:
+               return BT_ERROR_INVALID_PARAMETER;
+       case BLUETOOTH_ERROR_MEMORY_ALLOCATION:
+       case BLUETOOTH_ERROR_OUT_OF_MEMORY:
+               return BT_ERROR_OUT_OF_MEMORY;
+       case BLUETOOTH_ERROR_TIMEOUT:
+               return BT_ERROR_TIMED_OUT;
+       case BLUETOOTH_ERROR_DEVICE_NOT_ENABLED:
+               return BT_ERROR_NOT_ENABLED;
+       case BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED:
+       case BLUETOOTH_ERROR_ALREADY_INITIALIZED:
+       case BLUETOOTH_ERROR_AGENT_DOES_NOT_EXIST:
+               return BT_ERROR_ALREADY_DONE;
+       case BLUETOOTH_ERROR_NOT_PAIRED:
+               return BT_ERROR_REMOTE_DEVICE_NOT_BONDED;
+       case BLUETOOTH_ERROR_NOT_IN_OPERATION:
+               return BT_ERROR_NOT_IN_PROGRESS;
+       case BLUETOOTH_ERROR_IN_PROGRESS:
+               return BT_ERROR_NOW_IN_PROGRESS;
+       case BLUETOOTH_ERROR_DEVICE_BUSY:
+               return BT_ERROR_RESOURCE_BUSY;
+       case BLUETOOTH_ERROR_CANCEL:
+       case BLUETOOTH_ERROR_CANCEL_BY_USER:
+               return BT_ERROR_CANCELLED;
+       case BLUETOOTH_ERROR_AUTHENTICATION_FAILED:
+               return BT_ERROR_AUTH_FAILED;
+       case BLUETOOTH_ERROR_HOST_DOWN:
+               return BT_ERROR_REMOTE_DEVICE_NOT_FOUND;
+       case BLUETOOTH_ERROR_SERVICE_SEARCH_ERROR:
+               return BT_ERROR_SERVICE_SEARCH_FAILED;
+       case BLUETOOTH_ERROR_SERVICE_NOT_FOUND:
+       case BLUETOOTH_ERROR_PARING_FAILED:
+       case BLUETOOTH_ERROR_MAX_CONNECTION:
+       case BLUETOOTH_ERROR_ALREADY_CONNECT:
+       case BLUETOOTH_ERROR_NO_RESOURCES:
+       case BLUETOOTH_ERROR_REGISTRATION_FAILED:
+       case BLUETOOTH_ERROR_CONNECTION_BUSY:
+       case BLUETOOTH_ERROR_MAX_CLIENT:
+       case BLUETOOTH_ERROR_INVALID_CALLBACK:
+       case BLUETOOTH_ERROR_NOT_FOUND:
+       case BLUETOOTH_ERROR_INTERNAL:
+       case BLUETOOTH_ERROR_CONNECTION_ERROR:
+       case BLUETOOTH_ERROR_ACCESS_DENIED:
+       default:
+               return BT_ERROR_OPERATION_FAILED;
+       }
+
+}
+
+int _bt_get_bt_device_info_s(bt_device_info_s **dest_dev, bluetooth_device_info_t *source_dev)
+{
+       int i = 0;
+
+       BT_CHECK_INPUT_PARAMETER(source_dev);
+
+       *dest_dev = (bt_device_info_s *)malloc(sizeof(bt_device_info_s));
+       if (*dest_dev == NULL) {
+               return BT_ERROR_OUT_OF_MEMORY;
+       }
+
+       if (strlen(source_dev->device_name.name) > 0) {
+               (*dest_dev)->remote_name = strdup(source_dev->device_name.name);
+       } else {
+               (*dest_dev)->remote_name = NULL;
+       }
+
+       _bt_convert_address_to_string(&((*dest_dev)->remote_address), &(source_dev->device_address));
+
+       (*dest_dev)->bt_class.major_device_class = source_dev->device_class.major_class;
+       (*dest_dev)->bt_class.minor_device_class = source_dev->device_class.minor_class;
+       (*dest_dev)->bt_class.major_service_class_mask = source_dev->device_class.service_class;
+       if (source_dev->service_index > 0) {
+               (*dest_dev)->service_uuid = (char **)malloc(sizeof(char *) * source_dev->service_index);
+               if ((*dest_dev)->service_uuid != NULL) {
+                       for (i = 0; i < source_dev->service_index; i++) {
+                               (*dest_dev)->service_uuid[i] = strdup(source_dev->uuids[i]);
+                               if ((*dest_dev)->service_uuid[i] != NULL) {
+                                       __bt_convert_lower_to_upper((*dest_dev)->service_uuid[i]);
+                               }
+                       }
+               }
+       } else {
+               (*dest_dev)->service_uuid = NULL;
+       }
+       (*dest_dev)->service_count = source_dev->service_index;
+       (*dest_dev)->is_bonded = (bool)source_dev->paired;
+       (*dest_dev)->is_connected = (bool)source_dev->connected;
+       (*dest_dev)->is_authorized = (bool)source_dev->trust;
+
+       return BT_ERROR_NONE;
+}
+
+void _bt_free_bt_device_info_s(bt_device_info_s *device_info)
+{
+       int i = 0;
+
+       if (device_info == NULL)
+               return;
+
+       if (device_info->remote_name != NULL)
+               free(device_info->remote_name);
+
+       if (device_info->remote_address != NULL)
+               free(device_info->remote_address);
+
+       if (device_info->service_uuid != NULL) {
+               for (i = 0; i < device_info->service_count; i++) {
+                       if (device_info->service_uuid[i] != NULL)
+                               free(device_info->service_uuid[i]);
+               }
+               free(device_info->service_uuid);
+       }
+
+       free(device_info);
+       device_info = NULL;
+}
+
+int _bt_convert_address_to_string(char **addr_str, bluetooth_device_address_t *addr_hex)
+{
+       char address[18] = { 0, };
+
+       BT_CHECK_INPUT_PARAMETER(addr_hex);
+
+       snprintf(address, 18, "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X", addr_hex->addr[0], addr_hex->addr[1], addr_hex->addr[2], addr_hex->addr[3], addr_hex->addr[4], addr_hex->addr[5]);
+       *addr_str = strdup(address);
+
+       if (*addr_str != NULL) {
+               return BT_ERROR_NONE;
+       } else {
+               return BT_ERROR_OUT_OF_MEMORY;
+       }
+}
+
+void _bt_convert_address_to_hex(bluetooth_device_address_t *addr_hex, const char *addr_str)
+{
+       int i = 0;
+       unsigned int addr[BLUETOOTH_ADDRESS_LENGTH] = { 0, };
+
+       if (addr_str == NULL)
+               return;
+
+       i = sscanf(addr_str, "%X:%X:%X:%X:%X:%X", &addr[0], &addr[1], &addr[2], &addr[3], &addr[4], &addr[5]);
+       if (i != BLUETOOTH_ADDRESS_LENGTH) {
+               BT_ERR("Invalid format string - %s", addr_str);
+       }
+
+       for (i = 0; i < BLUETOOTH_ADDRESS_LENGTH; i++) {
+               addr_hex->addr[i] = (unsigned char)addr[i];
+       }
+}
+
+char *_bt_convert_error_to_string(int error)
+{
+       switch (error) {
+       case BT_ERROR_CANCELLED:
+               return "CANCELLED";
+       case BT_ERROR_INVALID_PARAMETER:
+               return "INVALID_PARAMETER";
+       case BT_ERROR_OUT_OF_MEMORY:
+               return "OUT_OF_MEMORY";
+       case BT_ERROR_RESOURCE_BUSY:
+               return "RESOURCE_BUSY";
+       case BT_ERROR_TIMED_OUT:
+               return "TIMED_OUT";
+       case BT_ERROR_NOW_IN_PROGRESS:
+               return "NOW_IN_PROGRESS";
+       case BT_ERROR_NOT_INITIALIZED:
+               return "NOT_INITIALIZED";
+       case BT_ERROR_NOT_ENABLED:
+               return "DEVICE_NOT_ENABLED";
+       case BT_ERROR_ALREADY_DONE:
+               return "ALREADY_DONE";
+       case BT_ERROR_OPERATION_FAILED:
+               return "OPERATION_FAILED";
+       case BT_ERROR_NOT_IN_PROGRESS:
+               return "NOT_IN_PROGRESS";
+       case BT_ERROR_REMOTE_DEVICE_NOT_BONDED:
+               return "REMOTE_DEVICE_NOT_BONDED";
+       case BT_ERROR_AUTH_REJECTED:
+               return "AUTH_REJECTED";
+       case BT_ERROR_AUTH_FAILED:
+               return "AUTH_FAILED";
+       case BT_ERROR_REMOTE_DEVICE_NOT_FOUND:
+               return "REMOTE_DEVICE_NOT_FOUND";
+       case BT_ERROR_SERVICE_SEARCH_FAILED:
+               return "SERVICE_SEARCH_FAILED";
+       default:
+               return "UNKNOWN";
+       }
+}
+
+bt_adapter_visibility_mode_e _bt_get_bt_visibility_mode_e(bluetooth_discoverable_mode_t mode)
+{
+       switch (mode) {
+       case BLUETOOTH_DISCOVERABLE_MODE_TIME_LIMITED_DISCOVERABLE:
+               return BT_ADAPTER_VISIBILITY_MODE_LIMITED_DISCOVERABLE;
+       case BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE:
+               return BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE;
+       default:
+               return BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE;
+       }
+}
+
+/*
+ *  Internal Functions
+ */
+
+static int __bt_get_bt_device_sdp_info_s(bt_device_sdp_info_s **dest, bt_sdp_info_t *source)
+{
+       int i = 0;
+
+       *dest = (bt_device_sdp_info_s *)malloc(sizeof(bt_device_sdp_info_s));
+       if (*dest == NULL) {
+               return BT_ERROR_OUT_OF_MEMORY;
+       }
+
+       if (_bt_convert_address_to_string(&((*dest)->remote_address), &(source->device_addr)) != BT_ERROR_NONE) {
+               __bt_free_bt_device_sdp_info_s(*dest);
+               return BT_ERROR_OUT_OF_MEMORY;
+       }
+
+       if (source->service_index > 0) {
+               (*dest)->service_uuid = (char **)malloc(sizeof(char *) * source->service_index);
+               if ((*dest)->service_uuid == NULL) {
+                       __bt_free_bt_device_sdp_info_s(*dest);
+                       return BT_ERROR_OUT_OF_MEMORY;
+               }
+
+               for (i = 0; i < source->service_index; i++) {
+                       (*dest)->service_uuid[i] = strdup(source->uuids[i]);
+                       if ((*dest)->service_uuid[i] == NULL) {
+                               __bt_free_bt_device_sdp_info_s(*dest);
+                               return BT_ERROR_OUT_OF_MEMORY;
+                       }
+                       __bt_convert_lower_to_upper((*dest)->service_uuid[i]);
+               }
+       } else {
+               (*dest)->service_uuid = NULL;
+       }
+       (*dest)->service_count = source->service_index;
+
+       return BT_ERROR_NONE;
+}
+
+static void __bt_free_bt_device_sdp_info_s(bt_device_sdp_info_s *sdp_info)
+{
+       int i = 0;
+
+       if (sdp_info == NULL)
+               return;
+
+       if (sdp_info->remote_address != NULL)
+               free(sdp_info->remote_address);
+
+       if (sdp_info->service_uuid != NULL) {
+               for (i = 0; i < sdp_info->service_count; i++) {
+                       if (sdp_info->service_uuid[i] != NULL)
+                               free(sdp_info->service_uuid[i]);
+               }
+               free(sdp_info->service_uuid);
+       }
+
+       free(sdp_info);
+       sdp_info = NULL;
+}
+
+void _bt_audio_event_proxy(int event, bt_audio_event_param_t *param, void *user_data)
+{
+       bluetooth_event_param_t new_param;
+       new_param.event = param->event;
+       new_param.param_data = param->param_data;
+       new_param.result = param->result;
+       new_param.user_data = NULL;
+       __bt_event_proxy(event, &new_param, user_data);
+}
+
+void _bt_telephony_event_proxy(int event, telephony_event_param_t *param, void *user_data)
+{
+       bluetooth_event_param_t new_param;
+       new_param.event = param->event;
+       new_param.param_data = param->param_data;
+       new_param.result = param->result;
+       new_param.user_data = NULL;
+       __bt_event_proxy(event, &new_param, user_data);
+}
+
+void _bt_avrcp_event_proxy(int event, media_event_param_t *param, void *user_data)
+{
+       bluetooth_event_param_t new_param;
+       new_param.event = param->event;
+       new_param.param_data = param->param_data;
+       new_param.result = param->result;
+       new_param.user_data = param->user_data;
+       __bt_event_proxy(event, &new_param, user_data);
+}
+
+void _bt_hid_event_proxy(int event, hid_event_param_t *param, void *user_data)
+{
+       bluetooth_event_param_t new_param;
+       new_param.event = param->event;
+       new_param.param_data = param->param_data;
+       new_param.result = param->result;
+       new_param.user_data = param->user_data;
+       __bt_event_proxy(event, &new_param, user_data);
+}
+
+static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *user_data)
+{
+       int i;
+       int call_id;
+       int *avrcp_mode;
+       bluetooth_rfcomm_connection_t *connection_ind = NULL;
+       bluetooth_rfcomm_disconnection_t *disconnection_ind = NULL;
+       bt_socket_connection_s rfcomm_connection;
+       bt_device_sdp_info_s *sdp_info = NULL;
+       bt_adapter_device_discovery_info_s *discovery_info = NULL;
+       bt_device_info_s *bonded_device = NULL;
+       bluetooth_rfcomm_connection_request_t *reqeust_ind = NULL;
+       bt_obex_server_authorize_into_t *auth_info = NULL;
+       bt_obex_server_transfer_info_t *transfer_info = NULL;
+       bt_opc_transfer_info_t *client_info = NULL;
+       bluetooth_device_address_t *bd_addr = NULL;
+       telephony_event_callid_t *call_data = NULL;
+       char *device_addr = NULL;
+       int error_code = BT_ERROR_NONE;
+       int event_index = -1;
+       bluetooth_network_device_info_t *dev_info = NULL;
+       bt_hdp_connected_t *hdp_conn_info = NULL;
+       bt_hdp_disconnected_t *hdp_disconn_info = NULL;
+       bt_hdp_data_ind_t *hdp_data_ind = NULL;
+       bt_gatt_discovered_char_t *svc_char = NULL;
+       bt_gatt_char_value_t *char_val = NULL;
+
+       event_index = __bt_get_cb_index(event);
+       if (event_index == -1 || bt_event_slot_container[event_index].callback == NULL) {
+               return;
+       }
+
+       memset(&rfcomm_connection, 0x00, sizeof(bt_socket_connection_s));
+
+       switch (event) {
+       case BLUETOOTH_EVENT_ENABLED:
+               BT_INFO("bt_adapter_state_changed_cb() will be called with BT_ADAPTER_ENABLED");
+               ((bt_adapter_state_changed_cb) bt_event_slot_container[event_index].callback)
+                   (_bt_get_error_code(param->result), BT_ADAPTER_ENABLED, bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_DISABLED:
+               BT_INFO("bt_adapter_state_changed_cb() will be called with BT_ADAPTER_DISABLED");
+               ((bt_adapter_state_changed_cb) bt_event_slot_container[event_index].callback)
+                   (_bt_get_error_code(param->result), BT_ADAPTER_DISABLED, bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_LOCAL_NAME_CHANGED:
+               BT_INFO("bt_adapter_name_changed_cb() will be called");
+               ((bt_adapter_name_changed_cb)bt_event_slot_container[event_index].callback)
+                   ((char *)(param->param_data), bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED:
+               BT_INFO("bt_adapter_visibility_mode_changed_cb() will be called");
+               ((bt_adapter_visibility_mode_changed_cb)bt_event_slot_container[event_index].callback)
+                   (_bt_get_error_code(param->result), _bt_get_bt_visibility_mode_e(*(bt_adapter_visibility_mode_e *)(param->param_data)), bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_DISCOVERY_STARTED:
+               BT_INFO("bt_adapter_device_discovery_state_changed_cb() will be called with BT_ADAPTER_DEVICE_DISCOVERY_STARTED");
+               ((bt_adapter_device_discovery_state_changed_cb) bt_event_slot_container[event_index].callback)
+                   (_bt_get_error_code(param->result), BT_ADAPTER_DEVICE_DISCOVERY_STARTED, NULL, bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_DISCOVERY_FINISHED:
+               BT_INFO("bt_adapter_device_discovery_state_changed_cb() will be called with BT_ADAPTER_DEVICE_DISCOVERY_FINISHED");
+               ((bt_adapter_device_discovery_state_changed_cb)bt_event_slot_container[event_index].callback)
+                   (_bt_get_error_code(param->result), BT_ADAPTER_DEVICE_DISCOVERY_FINISHED, NULL, bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_REMOTE_DEVICE_NAME_UPDATED:
+               BT_INFO("bt_adapter_device_discovery_state_changed_cb() will be called with BT_ADAPTER_DEVICE_DISCOVERY_FOUND");
+               if (__bt_get_bt_adapter_device_discovery_info_s(&discovery_info, (bluetooth_device_info_t *)(param->param_data)) == BT_ERROR_NONE) {
+                       ((bt_adapter_device_discovery_state_changed_cb)bt_event_slot_container[event_index].callback)
+                           (_bt_get_error_code(param->result), BT_ADAPTER_DEVICE_DISCOVERY_FOUND, discovery_info, bt_event_slot_container[event_index].user_data);
+                       __bt_free_bt_adapter_device_discovery_info_s(discovery_info);
+               } else {
+                       ((bt_adapter_device_discovery_state_changed_cb)bt_event_slot_container[event_index].callback)
+                           (_bt_get_error_code(param->result), BT_ADAPTER_DEVICE_DISCOVERY_FOUND, NULL, bt_event_slot_container[event_index].user_data);
+               }
+               break;
+       case BLUETOOTH_EVENT_BONDING_FINISHED:
+               BT_INFO("bt_device_bond_created_cb() will be called");
+               _bt_get_bt_device_info_s(&bonded_device, (bluetooth_device_info_t *)(param->param_data));
+
+               ((bt_device_bond_created_cb)bt_event_slot_container[event_index].callback)
+                   (_bt_get_error_code(param->result), bonded_device, bt_event_slot_container[event_index].user_data);
+               _bt_free_bt_device_info_s(bonded_device);
+               bonded_device = NULL;
+               break;
+       case BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED:
+               BT_INFO("bt_device_bond_destroyed_cb() will be called");
+               _bt_convert_address_to_string(&device_addr, (bluetooth_device_address_t *)(param->param_data));
+               ((bt_device_bond_destroyed_cb)bt_event_slot_container[event_index].callback)
+                   (_bt_get_error_code(param->result), device_addr, bt_event_slot_container[event_index].user_data);
+               if (device_addr != NULL)
+                       free(device_addr);
+               device_addr = NULL;
+               break;
+       case BLUETOOTH_EVENT_DEVICE_AUTHORIZED:
+               BT_INFO("bt_device_authorization_changed_cb() will be called with BT_DEVICE_AUTHORIZED");
+               _bt_convert_address_to_string(&device_addr, (bluetooth_device_address_t *)(param->param_data));
+               ((bt_device_authorization_changed_cb)bt_event_slot_container[event_index].callback)
+                   (BT_DEVICE_AUTHORIZED, device_addr, bt_event_slot_container[event_index].user_data);
+               if (device_addr != NULL)
+                       free(device_addr);
+               break;
+       case BLUETOOTH_EVENT_DEVICE_UNAUTHORIZED:
+               BT_INFO("bt_device_authorization_changed_cb() will be called with BT_DEVICE_UNAUTHORIZED");
+               _bt_convert_address_to_string(&device_addr, (bluetooth_device_address_t *)(param->param_data));
+               ((bt_device_authorization_changed_cb)bt_event_slot_container[event_index].callback)
+                   (BT_DEVICE_UNAUTHORIZED, device_addr, bt_event_slot_container[event_index].user_data);
+               if (device_addr != NULL)
+                       free(device_addr);
+               break;
+       case BLUETOOTH_EVENT_DEVICE_CONNECTED:
+               BT_INFO("bt_device_connection_state_changed_cb() will be called");
+               _bt_convert_address_to_string(&device_addr, (bluetooth_device_address_t *)(param->param_data));
+               ((bt_device_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
+                   (true, device_addr, bt_event_slot_container[event_index].user_data);
+               if (device_addr != NULL)
+                       free(device_addr);
+               break;
+       case BLUETOOTH_EVENT_DEVICE_DISCONNECTED:
+               BT_INFO("bt_device_connection_state_changed_cb() will be called");
+               _bt_convert_address_to_string(&device_addr, (bluetooth_device_address_t *)(param->param_data));
+               ((bt_device_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
+                   (false, device_addr, bt_event_slot_container[event_index].user_data);
+               if (device_addr != NULL)
+                       free(device_addr);
+               break;
+       case BLUETOOTH_EVENT_SERVICE_SEARCHED:
+               BT_INFO("bt_device_service_searched_cb() will be called");
+               __bt_get_bt_device_sdp_info_s(&sdp_info, (bt_sdp_info_t *)(param->param_data));
+               error_code = _bt_get_error_code(param->result);
+               // In service search, BT_ERROR_SERVICE_SEARCH_FAILED is returned instead of BT_ERROR_OPERATION_FAILED.
+               if (error_code == BT_ERROR_OPERATION_FAILED)
+                       error_code = BT_ERROR_SERVICE_SEARCH_FAILED;
+               ((bt_device_service_searched_cb)bt_event_slot_container[event_index].callback)
+                   (error_code, sdp_info, bt_event_slot_container[event_index].user_data);
+               __bt_free_bt_device_sdp_info_s(sdp_info);
+               break;
+       case BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED:
+               BT_INFO("bt_socket_data_received_cb() will be called");
+               ((bt_socket_data_received_cb)bt_event_slot_container[event_index].callback)
+                   ((bt_socket_received_data_s *)(param->param_data), bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_RFCOMM_CONNECTED:
+               BT_INFO("bt_socket_connection_state_changed_cb() will be called with BT_SOCKET_CONNECTED");
+               if (param->result == BLUETOOTH_ERROR_INVALID_PARAM)
+                       error_code = BT_ERROR_OPERATION_FAILED;
+               else
+                       error_code = _bt_get_error_code(param->result);
+
+               connection_ind = (bluetooth_rfcomm_connection_t *)(param->param_data);
+
+               if (connection_ind) {
+                       rfcomm_connection.socket_fd = connection_ind->socket_fd;
+                       rfcomm_connection.local_role = connection_ind->device_role;
+
+                       if (strlen(connection_ind->uuid) > 0) {
+                               rfcomm_connection.service_uuid = strdup(connection_ind->uuid);
+                               BT_DBG("uuid: [%s]", rfcomm_connection.service_uuid);
+                       }
+
+                       _bt_convert_address_to_string(&(rfcomm_connection.remote_address),
+                                               &(connection_ind->device_addr));
+               }
+
+               ((bt_socket_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
+                   (error_code, BT_SOCKET_CONNECTED, &rfcomm_connection, bt_event_slot_container[event_index].user_data);
+
+               if (rfcomm_connection.remote_address != NULL) {
+                       free(rfcomm_connection.remote_address);
+                       rfcomm_connection.remote_address = NULL;
+               }
+
+               if (rfcomm_connection.service_uuid != NULL) {
+                       free(rfcomm_connection.service_uuid);
+                       rfcomm_connection.service_uuid = NULL;
+               }
+
+               break;
+       case BLUETOOTH_EVENT_RFCOMM_DISCONNECTED:
+               BT_INFO("bt_socket_connection_state_changed_cb() will be called with BT_SOCKET_DISCONNECTED");
+
+               disconnection_ind = (bluetooth_rfcomm_disconnection_t *)(param->param_data);
+
+               if (disconnection_ind) {
+                       rfcomm_connection.socket_fd = disconnection_ind->socket_fd;
+                       rfcomm_connection.local_role = disconnection_ind->device_role;
+
+                       if (strlen(disconnection_ind->uuid) > 0) {
+                               rfcomm_connection.service_uuid = strdup(disconnection_ind->uuid);
+                               BT_DBG("uuid: [%s]", rfcomm_connection.service_uuid);
+                       }
+
+                       _bt_convert_address_to_string(&(rfcomm_connection.remote_address),
+                                               &(disconnection_ind->device_addr));
+               }
+
+               ((bt_socket_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
+                   (_bt_get_error_code(param->result), BT_SOCKET_DISCONNECTED, &rfcomm_connection, bt_event_slot_container[event_index].user_data);
+
+               if (rfcomm_connection.remote_address != NULL) {
+                       free(rfcomm_connection.remote_address);
+                       rfcomm_connection.remote_address = NULL;
+               }
+
+               if (rfcomm_connection.service_uuid != NULL) {
+                       free(rfcomm_connection.service_uuid);
+                       rfcomm_connection.service_uuid = NULL;
+               }
+
+               break;
+       case BLUETOOTH_EVENT_RFCOMM_AUTHORIZE:
+               BT_INFO("bt_socket_connection_requested_cb() will be called");
+               reqeust_ind = (bluetooth_rfcomm_connection_request_t *)(param->param_data);
+               _bt_convert_address_to_string(&device_addr, &(reqeust_ind->device_addr));
+               ((bt_socket_connection_requested_cb)bt_event_slot_container[event_index].callback)
+                   (reqeust_ind->socket_fd, device_addr, bt_event_slot_container[event_index].user_data);
+
+               if (device_addr != NULL)
+                       free(device_addr);
+               break;
+       case BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE:
+               BT_INFO("bt_opp_server_connection_requested_cb() will be called");
+               bd_addr = (bluetooth_device_address_t *)(param->param_data);
+               _bt_convert_address_to_string(&device_addr, bd_addr);
+               ((bt_opp_server_connection_requested_cb)bt_event_slot_container[event_index].callback)
+                   (device_addr, bt_event_slot_container[event_index].user_data);
+
+               if (device_addr != NULL)
+                       free(device_addr);
+               break;
+       case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE:
+               BT_INFO("bt_opp_server_push_requested_cb() will be called");
+               auth_info = (bt_obex_server_authorize_into_t *)(param->param_data);
+               ((bt_opp_server_push_requested_cb)bt_event_slot_container[event_index].callback)
+                   (auth_info->filename, auth_info->length, bt_event_slot_container[event_index].user_data);
+               break;
+
+       case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED:
+               BT_INFO("bt_opp_server_transfer_started_cb() will be called");
+               transfer_info = (bt_obex_server_transfer_info_t *)(param->param_data);
+               ((bt_opp_server_transfer_progress_cb)bt_event_slot_container[event_index].callback)
+                   (transfer_info->filename, transfer_info->file_size, 0, bt_event_slot_container[event_index].user_data);
+               break;
+
+       case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_PROGRESS:
+               BT_INFO("bt_opp_server_transfer_in_progress_cb() will be called");
+               transfer_info = (bt_obex_server_transfer_info_t *)(param->param_data);
+               ((bt_opp_server_transfer_progress_cb)bt_event_slot_container[event_index].callback)
+                   (transfer_info->filename, transfer_info->file_size, transfer_info->percentage, bt_event_slot_container[event_index].user_data);
+               break;
+
+       case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_COMPLETED:
+               BT_INFO("bt_opp_server_transfer_completed_cb() will be called");
+               transfer_info = (bt_obex_server_transfer_info_t *)(param->param_data);
+
+               ((bt_opp_server_transfer_finished_cb)bt_event_slot_container[event_index].callback)
+                   (_bt_get_error_code(param->result), transfer_info->filename, transfer_info->file_size, bt_event_slot_container[event_index].user_data);
+
+               break;
+
+       case BLUETOOTH_EVENT_OPC_CONNECTED:
+               BT_INFO("bt_opp_client_push_responded_cb() will be called");
+               bd_addr = (bluetooth_device_address_t *)(param->param_data);
+               _bt_convert_address_to_string(&device_addr, bd_addr);
+
+               ((bt_opp_client_push_responded_cb)bt_event_slot_container[event_index].callback)
+                   (_bt_get_error_code(param->result), device_addr, bt_event_slot_container[event_index].user_data);
+
+               if (device_addr != NULL)
+                       free(device_addr);
+               break;
+
+       case BLUETOOTH_EVENT_OPC_DISCONNECTED:
+               BT_INFO("bt_opp_client_push_finished_cb() will be called");
+               bd_addr = (bluetooth_device_address_t *)(param->param_data);
+               _bt_convert_address_to_string(&device_addr, bd_addr);
+
+               ((bt_opp_client_push_finished_cb)bt_event_slot_container[event_index].callback)
+                   (_bt_get_error_code(param->result), device_addr, bt_event_slot_container[event_index].user_data);
+
+               if (device_addr != NULL)
+                       free(device_addr);
+               break;
+
+       case BLUETOOTH_EVENT_OPC_TRANSFER_STARTED:
+               BT_INFO("BLUETOOTH_EVENT_OPC_TRANSFER_STARTED");
+               /* This event don't be used in CAPI */
+               break;
+
+       case BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS:
+               BT_INFO("bt_opp_client_transfer_in_progress_cb() will be called");
+               client_info = (bt_opc_transfer_info_t *)(param->param_data);
+               ((bt_opp_client_push_progress_cb)bt_event_slot_container[event_index].callback)
+                   (client_info->filename, client_info->size, client_info->percentage, bt_event_slot_container[event_index].user_data);
+               break;
+
+       case BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE:
+               BT_INFO("BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE");
+               /* This event don't be used in CAPI */
+               break;
+
+       case BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED:
+               BT_INFO("BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED");
+               dev_info = (bluetooth_network_device_info_t *)(param->param_data);
+
+               if (param->result != BLUETOOTH_ERROR_NONE) {
+                       BT_ERR("Fail to connect the network server");
+               }
+               _bt_convert_address_to_string(&device_addr, &dev_info->device_address);
+               ((bt_nap_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
+               (TRUE, device_addr, dev_info->interface_name, bt_event_slot_container[event_index].user_data);
+
+               if (device_addr != NULL)
+                       free(device_addr);
+               break;
+
+       case BLUETOOTH_EVENT_NETWORK_SERVER_DISCONNECTED:
+               BT_INFO("BLUETOOTH_EVENT_NETWORK_SERVER_DISCONNECTED");
+               dev_info = (bluetooth_network_device_info_t *)(param->param_data);
+
+               if (param->result != BLUETOOTH_ERROR_NONE) {
+                       BT_ERR("Fail to disconnect the network server");
+               }
+               _bt_convert_address_to_string(&device_addr, &dev_info->device_address);
+               ((bt_nap_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
+               (FALSE, device_addr, dev_info->interface_name, bt_event_slot_container[event_index].user_data);
+
+               if (device_addr != NULL)
+                       free(device_addr);
+               break;
+       case BLUETOOTH_EVENT_NETWORK_DISCONNECTED:
+               BT_INFO("BLUETOOTH_EVENT_NETWORK_DISCONNECTED");
+               bd_addr = (bluetooth_device_address_t *)(param->param_data);
+               _bt_convert_address_to_string(&device_addr, bd_addr);
+
+               ((bt_panu_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
+               (_bt_get_error_code(param->result), FALSE, device_addr, BLUETOOTH_NETWORK_NAP_ROLE,
+               bt_event_slot_container[event_index].user_data);
+               if (device_addr != NULL)
+                       free(device_addr);
+               break;
+
+       case BLUETOOTH_EVENT_NETWORK_CONNECTED:
+               BT_INFO("BLUETOOTH_EVENT_NETWORK_CONNECTED");
+               bd_addr = (bluetooth_device_address_t *)(param->param_data);
+               _bt_convert_address_to_string(&device_addr, bd_addr);
+
+               ((bt_panu_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
+               (_bt_get_error_code(param->result), TRUE, device_addr, BLUETOOTH_NETWORK_NAP_ROLE,
+               bt_event_slot_container[event_index].user_data);
+               if (device_addr != NULL)
+                       free(device_addr);
+               break;
+
+       case BLUETOOTH_EVENT_HDP_CONNECTED:
+               BT_INFO("HDP Connected ");
+               hdp_conn_info = (bt_hdp_connected_t *)(param->param_data);
+               _bt_convert_address_to_string(&device_addr, &hdp_conn_info->device_address);
+               ((bt_hdp_connected_cb)bt_event_slot_container[event_index].callback)
+               (_bt_get_error_code(param->result), device_addr, hdp_conn_info->app_handle,
+               hdp_conn_info->type, hdp_conn_info->channel_id,
+               bt_event_slot_container[event_index].user_data);
+
+               if (device_addr != NULL)
+                       free(device_addr);
+               break;
+
+       case BLUETOOTH_EVENT_HDP_DISCONNECTED:
+               BT_INFO("HDP disconnected callback will be ");
+               hdp_disconn_info = (bt_hdp_disconnected_t *)(param->param_data);
+
+               _bt_convert_address_to_string(&device_addr, &hdp_disconn_info->device_address);
+               ((bt_hdp_disconnected_cb)bt_event_slot_container[event_index].callback)
+               (_bt_get_error_code(param->result), device_addr,
+               hdp_disconn_info->channel_id, bt_event_slot_container[event_index].user_data);
+
+               if (device_addr != NULL)
+                       free(device_addr);
+               break;
+       case BLUETOOTH_EVENT_HDP_DATA_RECEIVED:
+               BT_INFO("HDP data recieved callback will be ");
+               hdp_data_ind = (bt_hdp_data_ind_t *)(param->param_data);
+               if (param->result != BLUETOOTH_ERROR_NONE) {
+                       BT_ERR("Fail to receive HDP data");
+               }
+
+               ((bt_hdp_data_received_cb)bt_event_slot_container[event_index].callback)
+               (hdp_data_ind->channel_id, hdp_data_ind->buffer, hdp_data_ind->size,
+               bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_AG_CONNECTED:
+               BT_INFO("BLUETOOTH_EVENT_AG_CONNECTED ");
+               device_addr = (char *)(param->param_data);
+               ((bt_audio_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
+               (_bt_get_error_code(param->result), TRUE, device_addr, BT_AUDIO_PROFILE_TYPE_HSP_HFP,
+               bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_AG_DISCONNECTED:
+               BT_INFO("BLUETOOTH_EVENT_AG_DISCONNECTED ");
+               device_addr = (char *)(param->param_data);
+               ((bt_audio_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
+               (_bt_get_error_code(param->result), FALSE, device_addr, BT_AUDIO_PROFILE_TYPE_HSP_HFP,
+               bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_TELEPHONY_AUDIO_CONNECTED:
+               BT_INFO("BLUETOOTH_EVENT_TELEPHONY_AUDIO_CONNECTED ");
+               ((bt_ag_sco_state_changed_cb)bt_event_slot_container[event_index].callback)
+               (_bt_get_error_code(param->result), TRUE,
+               bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_TELEPHONY_AUDIO_DISCONNECTED:
+               BT_INFO("BLUETOOTH_EVENT_TELEPHONY_AUDIO_DISCONNECTED ");
+               ((bt_ag_sco_state_changed_cb)bt_event_slot_container[event_index].callback)
+               (_bt_get_error_code(param->result), FALSE,
+               bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_TELEPHONY_ANSWER_CALL:
+               call_data = (telephony_event_callid_t *)param->param_data;
+               call_id = call_data->callid;
+               BT_INFO("BLUETOOTH_EVENT_TELEPHONY_ANSWER_CALL ");
+               ((bt_ag_call_handling_event_cb)bt_event_slot_container[event_index].callback)
+               (BT_AG_CALL_HANDLING_EVENT_ANSWER, call_id,
+               bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_TELEPHONY_RELEASE_CALL:
+               call_data = (telephony_event_callid_t *)param->param_data;
+               call_id = call_data->callid;
+               BT_INFO("BLUETOOTH_EVENT_TELEPHONY_RELEASE_CALL ");
+               ((bt_ag_call_handling_event_cb)bt_event_slot_container[event_index].callback)
+               (BT_AG_CALL_HANDLING_EVENT_RELEASE, call_id,
+               bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_TELEPHONY_REJECT_CALL:
+               call_data = (telephony_event_callid_t *)param->param_data;
+               call_id = call_data->callid;
+               BT_INFO("BLUETOOTH_EVENT_TELEPHONY_REJECT_CALL ");
+               ((bt_ag_call_handling_event_cb)bt_event_slot_container[event_index].callback)
+               (BT_AG_CALL_HANDLING_EVENT_REJECT, call_id,
+               bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_TELEPHONY_CHLD_0_RELEASE_ALL_HELD_CALL:
+               BT_INFO("BLUETOOTH_EVENT_TELEPHONY_CHLD_0_RELEASE_ALL_HELD_CALL ");
+               ((bt_ag_multi_call_handling_event_cb)bt_event_slot_container[event_index].callback)
+               (BT_AG_MULTI_CALL_HANDLING_EVENT_RELEASE_HELD_CALLS,
+               bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_TELEPHONY_CHLD_1_RELEASE_ALL_ACTIVE_CALL:
+               BT_INFO("BLUETOOTH_EVENT_TELEPHONY_CHLD_1_RELEASE_ALL_ACTIVE_CALL ");
+               ((bt_ag_multi_call_handling_event_cb)bt_event_slot_container[event_index].callback)
+               (BT_AG_MULTI_CALL_HANDLING_EVENT_RELEASE_ACTIVE_CALLS,
+               bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_TELEPHONY_CHLD_2_ACTIVE_HELD_CALL:
+               BT_INFO("BLUETOOTH_EVENT_TELEPHONY_CHLD_2_ACTIVE_HELD_CALL ");
+               ((bt_ag_multi_call_handling_event_cb)bt_event_slot_container[event_index].callback)
+               (BT_AG_MULTI_CALL_HANDLING_EVENT_ACTIVATE_HELD_CALL,
+               bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_TELEPHONY_CHLD_3_MERGE_CALL:
+               BT_INFO("BLUETOOTH_EVENT_TELEPHONY_CHLD_3_MERGE_CALL ");
+               ((bt_ag_multi_call_handling_event_cb)bt_event_slot_container[event_index].callback)
+               (BT_AG_MULTI_CALL_HANDLING_EVENT_MERGE_CALLS,
+               bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_TELEPHONY_CHLD_4_EXPLICIT_CALL_TRANSFER:
+               BT_INFO("BLUETOOTH_EVENT_TELEPHONY_CHLD_4_EXPLICIT_CALL_TRANSFER ");
+               ((bt_ag_multi_call_handling_event_cb)bt_event_slot_container[event_index].callback)
+               (BT_AG_MULTI_CALL_HANDLING_EVENT_EXPLICIT_CALL_TRANSFER,
+               bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_TELEPHONY_SEND_DTMF: {
+               telephony_event_dtmf_t *call_data = param->param_data;
+
+               BT_INFO("BLUETOOTH_EVENT_TELEPHONY_SEND_DTMF ");
+               ((bt_ag_dtmf_transmitted_cb)bt_event_slot_container[event_index].callback)
+               (call_data->dtmf, bt_event_slot_container[event_index].user_data);
+               break;
+       }
+       case BLUETOOTH_EVENT_AG_SPEAKER_GAIN:
+               BT_INFO("BLUETOOTH_EVENT_AG_SPEAKER_GAIN");
+               int *spk_gain = (int *)(param->param_data);
+               ((bt_ag_speaker_gain_changed_cb)bt_event_slot_container[event_index].callback)
+               (*spk_gain, bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_AG_MIC_GAIN:
+               BT_INFO("BLUETOOTH_EVENT_AG_MIC_GAIN");
+               int *mik_gain = (int *)(param->param_data);
+               ((bt_ag_microphone_gain_changed_cb)bt_event_slot_container[event_index].callback)
+               (*mik_gain, bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_AG_AUDIO_CONNECTED:
+               BT_INFO("BLUETOOTH_EVENT_AG_AUDIO_CONNECTED");
+               ((bt_audio_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
+               (_bt_get_error_code(param->result), TRUE, NULL, BT_AUDIO_PROFILE_TYPE_HSP_HFP,
+               bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_AG_AUDIO_DISCONNECTED:
+               BT_INFO("BLUETOOTH_EVENT_AG_AUDIO_DISCONNECTED");
+               device_addr = (char *)(param->param_data);
+
+               ((bt_audio_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
+               (_bt_get_error_code(param->result), FALSE, device_addr, BT_AUDIO_PROFILE_TYPE_HSP_HFP,
+               bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_AV_CONNECTED:
+               BT_INFO("BLUETOOTH_EVENT_AV_CONNECTED ");
+               device_addr = (char *)(param->param_data);
+               ((bt_audio_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
+               (_bt_get_error_code(param->result), TRUE, device_addr, BT_AUDIO_PROFILE_TYPE_A2DP,
+               bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_AV_DISCONNECTED:
+               BT_INFO("BLUETOOTH_EVENT_Av_DISCONNECTED ");
+               device_addr = (char *)(param->param_data);
+               ((bt_audio_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
+               (_bt_get_error_code(param->result), FALSE, device_addr, BT_AUDIO_PROFILE_TYPE_A2DP,
+               bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_AVRCP_CONNECTED:
+               BT_INFO("BLUETOOTH_EVENT_AVRCP_CONNECTED ");
+               device_addr = (char *)(param->param_data);
+               ((bt_avrcp_target_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
+               (TRUE, device_addr, bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_AVRCP_DISCONNECTED:
+               BT_INFO("BLUETOOTH_EVENT_AVRCP_DISCONNECTED ");
+               device_addr = (char *)(param->param_data);
+               ((bt_avrcp_target_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
+               (FALSE, device_addr, bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_AVRCP_SETTING_SHUFFLE_STATUS:
+               BT_INFO("BLUETOOTH_EVENT_AVRCP_SETTING_SHUFFLE_STATUS ");
+               avrcp_mode = (int *)(param->param_data);
+               ((bt_avrcp_shuffle_mode_changed_cb)bt_event_slot_container[event_index].callback)
+               ((bt_avrcp_shuffle_mode_e)*avrcp_mode, bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_AVRCP_SETTING_EQUALIZER_STATUS:
+               BT_INFO("BLUETOOTH_EVENT_AVRCP_SETTING_EQUALIZER_STATUS ");
+               avrcp_mode = (int *)(param->param_data);
+               ((bt_avrcp_equalizer_state_changed_cb)bt_event_slot_container[event_index].callback)
+               ((bt_avrcp_equalizer_state_e)*avrcp_mode, bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_AVRCP_SETTING_REPEAT_STATUS:
+               BT_INFO("BLUETOOTH_EVENT_AVRCP_SETTING_REPEAT_STATUS ");
+               avrcp_mode = (int *)(param->param_data);
+               ((bt_avrcp_repeat_mode_changed_cb)bt_event_slot_container[event_index].callback)
+               ((bt_avrcp_repeat_mode_e)*avrcp_mode, bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_EVENT_AVRCP_SETTING_SCAN_STATUS:
+               BT_INFO("BLUETOOTH_EVENT_AVRCP_SETTING_SCAN_STATUS ");
+               avrcp_mode = (int *)(param->param_data);
+               ((bt_avrcp_scan_mode_changed_cb)bt_event_slot_container[event_index].callback)
+               ((bt_avrcp_scan_mode_e)*avrcp_mode, bt_event_slot_container[event_index].user_data);
+               break;
+       case BLUETOOTH_HID_CONNECTED:
+               BT_INFO("BLUETOOTH_HID_CONNECTED");
+               bd_addr = (bluetooth_device_address_t *)(param->param_data);
+               _bt_convert_address_to_string(&device_addr, bd_addr);
+               ((bt_hid_host_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
+               (_bt_get_error_code(param->result), TRUE, device_addr, bt_event_slot_container[event_index].user_data);
+
+               if (device_addr != NULL)
+                       free(device_addr);
+               break;
+       case BLUETOOTH_HID_DISCONNECTED:
+               BT_INFO("BLUETOOTH_HID_DISCONNECTED");
+               bd_addr = (bluetooth_device_address_t *)(param->param_data);
+               _bt_convert_address_to_string(&device_addr, bd_addr);
+               ((bt_hid_host_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
+               (_bt_get_error_code(param->result), FALSE, device_addr, bt_event_slot_container[event_index].user_data);
+
+               if (device_addr != NULL)
+                       free(device_addr);
+               break;
+       case BLUETOOTH_EVENT_GATT_SVC_CHAR_DISCOVERED:
+               BT_INFO("BLUETOOTH_EVENT_GATT_SVC_CHAR_DISCOVERED");
+               svc_char = (bt_gatt_discovered_char_t *)(param->param_data);
+
+               if (svc_char == NULL)
+                       return;
+
+               for (i = 1; i <= svc_char->handle_info.count; i++) {
+                       ((bt_gatt_characteristics_discovered_cb)bt_event_slot_container[event_index].callback)
+                        (_bt_get_error_code(param->result), i, svc_char->handle_info.count, svc_char->handle_info.handle[i-1],
+                         bt_event_slot_container[event_index].user_data);
+               }
+
+               _bt_unset_cb(BT_EVENT_GATT_CHARACTERISTIC_DISCOVERED);
+
+               break;
+       case BLUETOOTH_EVENT_GATT_CHAR_VAL_CHANGED:
+               BT_INFO("BLUETOOTH_EVENT_GATT_CHAR_VAL_CHANGED");
+               char_val = (bt_gatt_char_value_t *)(param->param_data);
+
+               if (char_val == NULL)
+                       return;
+
+               ((bt_gatt_characteristic_changed_cb)bt_event_slot_container[event_index].callback)
+                (char_val->char_handle, char_val->char_value, char_val->val_len,
+                 bt_event_slot_container[event_index].user_data);
+
+               break;
+       default:
+               break;
+       }
+}
+
+static int __bt_get_bt_adapter_device_discovery_info_s(bt_adapter_device_discovery_info_s **discovery_info, bluetooth_device_info_t *source_info) {
+       int i;
+
+       BT_CHECK_INPUT_PARAMETER(source_info);
+
+       *discovery_info = (bt_adapter_device_discovery_info_s *)malloc(sizeof(bt_adapter_device_discovery_info_s));
+       if (*discovery_info == NULL) {
+               return BT_ERROR_OUT_OF_MEMORY;
+       }
+
+       if (strlen(source_info->device_name.name) > 0) {
+               (*discovery_info)->remote_name = strdup(source_info->device_name.name);
+       } else {
+               (*discovery_info)->remote_name = NULL;
+       }
+
+       _bt_convert_address_to_string(&((*discovery_info)->remote_address), &(source_info->device_address));
+
+       (*discovery_info)->bt_class.major_device_class = source_info->device_class.major_class;
+       (*discovery_info)->bt_class.minor_device_class = source_info->device_class.minor_class;
+       (*discovery_info)->bt_class.major_service_class_mask = source_info->device_class.service_class;
+
+       if (source_info->service_index > 0) {
+               (*discovery_info)->service_uuid = (char **)malloc(sizeof(char *) * source_info->service_index);
+               if ((*discovery_info)->service_uuid != NULL) {
+                       for (i = 0; i < source_info->service_index; i++) {
+                               (*discovery_info)->service_uuid[i] = strdup(source_info->uuids[i]);
+                               if ((*discovery_info)->service_uuid[i] != NULL) {
+                                       __bt_convert_lower_to_upper((*discovery_info)->service_uuid[i]);
+                               }
+
+                               BT_DBG("UUID: %s", (*discovery_info)->service_uuid[i]);
+                       }
+               }
+       } else {
+               (*discovery_info)->service_uuid = NULL;
+       }
+       (*discovery_info)->service_count = source_info->service_index;
+
+       (*discovery_info)->rssi = (int)source_info->rssi;
+       (*discovery_info)->is_bonded = (bool)source_info->paired;
+
+       return BT_ERROR_NONE;
+}
+
+static void __bt_free_bt_adapter_device_discovery_info_s(bt_adapter_device_discovery_info_s *discovery_info)
+{
+       int i;
+
+       if (discovery_info == NULL)
+               return;
+
+       if (discovery_info->remote_name != NULL)
+               free(discovery_info->remote_name);
+
+       if (discovery_info->remote_address != NULL)
+               free(discovery_info->remote_address);
+
+       if (discovery_info->service_uuid != NULL) {
+               for (i = 0; i < discovery_info->service_count; i++) {
+                       if (discovery_info->service_uuid[i] != NULL)
+                               free(discovery_info->service_uuid[i]);
+               }
+               free(discovery_info->service_uuid);
+       }
+
+       free(discovery_info);
+       discovery_info = NULL;
+}
+
+static int __bt_get_cb_index(int event)
+{
+       switch (event) {
+       case BLUETOOTH_EVENT_ENABLED:
+       case BLUETOOTH_EVENT_DISABLED:
+               return BT_EVENT_STATE_CHANGED;
+       case BLUETOOTH_EVENT_LOCAL_NAME_CHANGED:
+               return BT_EVENT_NAME_CHANGED;
+       case BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED:
+               return BT_EVENT_VISIBILITY_MODE_CHANGED;
+       case BLUETOOTH_EVENT_DISCOVERY_STARTED:
+       case BLUETOOTH_EVENT_DISCOVERY_FINISHED:
+       case BLUETOOTH_EVENT_REMOTE_DEVICE_NAME_UPDATED:
+               return BT_EVENT_DEVICE_DISCOVERY_STATE_CHANGED;
+       case BLUETOOTH_EVENT_BONDING_FINISHED:
+               return BT_EVENT_BOND_CREATED;
+       case BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED:
+               return BT_EVENT_BOND_DESTROYED;
+       case BLUETOOTH_EVENT_DEVICE_AUTHORIZED:
+       case BLUETOOTH_EVENT_DEVICE_UNAUTHORIZED:
+               return BT_EVENT_AUTHORIZATION_CHANGED;
+       case BLUETOOTH_EVENT_DEVICE_CONNECTED:
+       case BLUETOOTH_EVENT_DEVICE_DISCONNECTED:
+               return BT_EVENT_DEVICE_CONNECTION_STATUS;
+       case BLUETOOTH_EVENT_SERVICE_SEARCHED:
+               return BT_EVENT_SERVICE_SEARCHED;
+       case BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED:
+               return BT_EVENT_DATA_RECEIVED;
+       case BLUETOOTH_EVENT_RFCOMM_CONNECTED:
+       case BLUETOOTH_EVENT_RFCOMM_DISCONNECTED:
+               return BT_EVENT_CONNECTION_STATE_CHANGED;
+       case BLUETOOTH_EVENT_RFCOMM_AUTHORIZE:
+               return BT_EVENT_RFCOMM_CONNECTION_REQUESTED;
+       case BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE:
+               return BT_EVENT_OPP_CONNECTION_REQUESTED;
+       case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE:
+               return BT_EVENT_OPP_PUSH_REQUESTED;
+       case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED:
+               return BT_EVENT_OPP_SERVER_TRANSFER_PROGRESS;
+       case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_PROGRESS:
+               return BT_EVENT_OPP_SERVER_TRANSFER_PROGRESS;
+       case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_COMPLETED:
+               return BT_EVENT_OPP_SERVER_TRANSFER_FINISHED;
+       case BLUETOOTH_EVENT_OPC_CONNECTED:
+               return BT_EVENT_OPP_CLIENT_PUSH_RESPONSED;
+       case BLUETOOTH_EVENT_OPC_TRANSFER_STARTED:
+               return BT_EVENT_OPP_CLIENT_PUSH_PROGRESS;
+       case BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS:
+       case BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE:
+               return BT_EVENT_OPP_CLIENT_PUSH_PROGRESS;
+       case BLUETOOTH_EVENT_OPC_DISCONNECTED:
+               return BT_EVENT_OPP_CLIENT_PUSH_FINISHED;
+       case BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED:
+       case BLUETOOTH_EVENT_NETWORK_SERVER_DISCONNECTED:
+               return BT_EVENT_NAP_CONNECTION_STATE_CHANGED;
+       case BLUETOOTH_EVENT_NETWORK_CONNECTED:
+       case BLUETOOTH_EVENT_NETWORK_DISCONNECTED:
+               return BT_EVENT_PAN_CONNECTION_STATE_CHANGED;
+       case BLUETOOTH_EVENT_HDP_DATA_RECEIVED:
+               return BT_EVENT_HDP_DATA_RECEIVED;
+       case BLUETOOTH_EVENT_HDP_CONNECTED:
+               return BT_EVENT_HDP_CONNECTED;
+       case BLUETOOTH_EVENT_HDP_DISCONNECTED:
+               return BT_EVENT_HDP_DISCONNECTED;
+       case BLUETOOTH_EVENT_AG_CONNECTED:
+               return BT_EVENT_AUDIO_CONNECTION_STATUS;
+       case BLUETOOTH_EVENT_AG_DISCONNECTED:
+               return BT_EVENT_AUDIO_CONNECTION_STATUS;
+       case BLUETOOTH_EVENT_AG_SPEAKER_GAIN:
+               return BT_EVENT_AG_SPEAKER_GAIN_CHANGE;
+       case BLUETOOTH_EVENT_AG_MIC_GAIN:
+               return BT_EVENT_AG_MICROPHONE_GAIN_CHANGE;
+       case BLUETOOTH_EVENT_AG_AUDIO_CONNECTED:
+               return BT_EVENT_AUDIO_CONNECTION_STATUS;
+       case BLUETOOTH_EVENT_AG_AUDIO_DISCONNECTED:
+               return BT_EVENT_AUDIO_CONNECTION_STATUS;
+       case BLUETOOTH_EVENT_TELEPHONY_AUDIO_CONNECTED:
+               return BT_EVENT_AG_SCO_CONNECTION_STATUS;
+       case BLUETOOTH_EVENT_TELEPHONY_AUDIO_DISCONNECTED:
+               return BT_EVENT_AG_SCO_CONNECTION_STATUS;
+       case BLUETOOTH_EVENT_TELEPHONY_ANSWER_CALL:
+       case BLUETOOTH_EVENT_TELEPHONY_RELEASE_CALL:
+       case BLUETOOTH_EVENT_TELEPHONY_REJECT_CALL:
+               return BT_EVENT_AG_CALL_HANDLING_EVENT;
+       case BLUETOOTH_EVENT_TELEPHONY_CHLD_0_RELEASE_ALL_HELD_CALL:
+       case BLUETOOTH_EVENT_TELEPHONY_CHLD_1_RELEASE_ALL_ACTIVE_CALL:
+       case BLUETOOTH_EVENT_TELEPHONY_CHLD_2_ACTIVE_HELD_CALL:
+       case BLUETOOTH_EVENT_TELEPHONY_CHLD_3_MERGE_CALL:
+       case BLUETOOTH_EVENT_TELEPHONY_CHLD_4_EXPLICIT_CALL_TRANSFER:
+               return BT_EVENT_AG_MULTI_CALL_HANDLING_EVENT;
+       case BLUETOOTH_EVENT_TELEPHONY_SEND_DTMF:
+               return BT_EVENT_AG_DTMF_TRANSMITTED;
+       case BLUETOOTH_EVENT_AV_CONNECTED:
+               return BT_EVENT_AUDIO_CONNECTION_STATUS;
+       case BLUETOOTH_EVENT_AV_DISCONNECTED:
+               return BT_EVENT_AUDIO_CONNECTION_STATUS;
+       case  BLUETOOTH_EVENT_AVRCP_CONNECTED:
+       case  BLUETOOTH_EVENT_AVRCP_DISCONNECTED:
+               return BT_EVENT_AVRCP_CONNECTION_STATUS;
+       case  BLUETOOTH_EVENT_AVRCP_SETTING_SHUFFLE_STATUS:
+               return BT_EVENT_AVRCP_SHUFFLE_MODE_CHANGED;
+       case  BLUETOOTH_EVENT_AVRCP_SETTING_EQUALIZER_STATUS:
+               return BT_EVENT_AVRCP_EQUALIZER_STATE_CHANGED;
+       case  BLUETOOTH_EVENT_AVRCP_SETTING_REPEAT_STATUS:
+               return BT_EVENT_AVRCP_REPEAT_MODE_CHANGED;
+       case  BLUETOOTH_EVENT_AVRCP_SETTING_SCAN_STATUS:
+               return BT_EVENT_AVRCP_SCAN_MODE_CHANGED;
+       case BLUETOOTH_HID_CONNECTED:
+               return  BT_EVENT_HID_CONNECTION_STATUS;
+       case BLUETOOTH_HID_DISCONNECTED:
+               return  BT_EVENT_HID_CONNECTION_STATUS;
+       case BLUETOOTH_EVENT_GATT_SVC_CHAR_DISCOVERED:
+               return  BT_EVENT_GATT_CHARACTERISTIC_DISCOVERED;
+       case BLUETOOTH_EVENT_GATT_CHAR_VAL_CHANGED:
+               return  BT_EVENT_GATT_VALUE_CHANGED;
+       default:
+               return -1;
+       }
+}
+
+static void __bt_convert_lower_to_upper(char *origin)
+{
+       int length = strlen(origin);
+       int i = 0;
+
+       for (i = 0; i < length; i++) {
+               if (islower(origin[i])) {
+                       origin[i] = toupper(origin[i]);
+               }
+       }
+}
diff --git a/src/bluetooth-device.c b/src/bluetooth-device.c
new file mode 100644 (file)
index 0000000..442f0b9
--- /dev/null
@@ -0,0 +1,257 @@
+/*
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * 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 <bluetooth-api.h>
+
+#include "bluetooth.h"
+#include "bluetooth_private.h"
+
+int bt_device_create_bond(const char *device_address)
+{
+       bluetooth_device_address_t addr_hex = { {0,} };
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(device_address);
+
+       _bt_convert_address_to_hex(&addr_hex, device_address);
+       error_code = _bt_get_error_code(bluetooth_bond_device(&addr_hex));
+       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_device_cancel_bonding(void)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       error_code = _bt_get_error_code(bluetooth_cancel_bonding());
+       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_device_destroy_bond(const char *device_address)
+{
+       bluetooth_device_address_t addr_hex = { {0,} };
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(device_address);
+
+       _bt_convert_address_to_hex(&addr_hex, device_address);
+       error_code = _bt_get_error_code(bluetooth_unbond_device(&addr_hex));
+       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_device_set_alias(const char *device_address, const char *alias)
+{
+       bluetooth_device_address_t addr_hex = { {0,} };
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(device_address);
+       BT_CHECK_INPUT_PARAMETER(alias);
+
+       _bt_convert_address_to_hex(&addr_hex, device_address);
+       error_code = _bt_get_error_code(bluetooth_set_alias(&addr_hex, alias));
+       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_device_set_authorization(const char *device_address, bt_device_authorization_e authorization)
+{
+       bluetooth_device_address_t addr_hex = { {0,} };
+       gboolean trusted = FALSE;
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(device_address);
+
+       _bt_convert_address_to_hex(&addr_hex, device_address);
+       if (authorization == BT_DEVICE_AUTHORIZED)
+               trusted = TRUE;
+
+       error_code = _bt_get_error_code(bluetooth_authorize_device(&addr_hex, trusted));
+       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_device_start_service_search(const char *device_address)
+{
+       bluetooth_device_address_t addr_hex = { {0,} };
+       int ret = 0;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(device_address);
+
+       _bt_convert_address_to_hex(&addr_hex, device_address);
+       ret = _bt_get_error_code(bluetooth_search_service(&addr_hex));
+
+       /* In service search, BT_ERROR_SERVICE_SEARCH_FAILED is returned instead of BT_ERROR_OPERATION_FAILED. */
+       if (ret == BT_ERROR_OPERATION_FAILED)
+               ret = BT_ERROR_SERVICE_SEARCH_FAILED;
+
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+       }
+       return ret;
+}
+
+int bt_device_cancel_service_search(void)
+{
+       int ret = 0;
+
+       BT_CHECK_INIT_STATUS();
+       ret = _bt_get_error_code(bluetooth_cancel_service_search());
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+       }
+
+       return ret;
+}
+
+int bt_device_foreach_connected_profiles(const char *remote_address, bt_device_connected_profile callback, void *user_data)
+{
+       bluetooth_device_address_t addr_hex = { {0,} };
+       gboolean is_connected = FALSE;
+       int ret;
+       int i = 0;
+       int profiles[] = {BT_PROFILE_RFCOMM, BT_PROFILE_A2DP,
+                       BT_PROFILE_HSP, BT_PROFILE_HID, 0};
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(remote_address);
+       BT_CHECK_INPUT_PARAMETER(callback);
+
+       _bt_convert_address_to_hex(&addr_hex, remote_address);
+
+       while (profiles[i] != 0) {
+               ret = _bt_get_error_code(bluetooth_is_device_connected(&addr_hex,
+                                                               profiles[i],
+                                                               &is_connected));
+               if (ret != BT_ERROR_NONE) {
+                       BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+                       return ret;
+               }
+
+               if (is_connected == TRUE) {
+                       if (!callback(profiles[i], user_data))
+                               break;
+               }
+
+               i++;
+       }
+
+       return BT_ERROR_NONE;
+}
+
+int bt_device_set_bond_created_cb(bt_device_bond_created_cb callback, void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_BOND_CREATED, callback, user_data);
+
+       return BT_ERROR_NONE;
+}
+
+int bt_device_set_bond_destroyed_cb(bt_device_bond_destroyed_cb callback, void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_BOND_DESTROYED, callback, user_data);
+
+       return BT_ERROR_NONE;
+}
+
+int bt_device_set_authorization_changed_cb(bt_device_authorization_changed_cb callback, void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_AUTHORIZATION_CHANGED, callback, user_data);
+
+       return BT_ERROR_NONE;
+}
+
+int bt_device_set_service_searched_cb(bt_device_service_searched_cb callback, void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_SERVICE_SEARCHED, callback, user_data);
+
+       return BT_ERROR_NONE;
+}
+
+int bt_device_set_connection_state_changed_cb(bt_device_connection_state_changed_cb callback, void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_DEVICE_CONNECTION_STATUS, callback, user_data);
+
+       return BT_ERROR_NONE;
+}
+
+int bt_device_unset_bond_created_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+       _bt_unset_cb(BT_EVENT_BOND_CREATED);
+       return BT_ERROR_NONE;
+}
+
+int bt_device_unset_bond_destroyed_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+       _bt_unset_cb(BT_EVENT_BOND_DESTROYED);
+       return BT_ERROR_NONE;
+}
+
+int bt_device_unset_authorization_changed_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+       _bt_unset_cb(BT_EVENT_AUTHORIZATION_CHANGED);
+       return BT_ERROR_NONE;
+}
+
+int bt_device_unset_service_searched_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+       _bt_unset_cb(BT_EVENT_SERVICE_SEARCHED);
+       return BT_ERROR_NONE;
+}
+
+int bt_device_unset_connection_state_changed_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+       _bt_unset_cb(BT_EVENT_DEVICE_CONNECTION_STATUS);
+       return BT_ERROR_NONE;
+}
+
diff --git a/src/bluetooth-gatt.c b/src/bluetooth-gatt.c
new file mode 100644 (file)
index 0000000..b159fb0
--- /dev/null
@@ -0,0 +1,285 @@
+/*
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * 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 <stdbool.h>
+#include <dlog.h>
+#include <bluetooth-api.h>
+
+#include "bluetooth.h"
+#include "bluetooth_private.h"
+
+int bt_gatt_foreach_primary_services(const char *remote_address,
+                               bt_gatt_primary_service_cb callback,
+                               void *user_data)
+{
+       int i;
+       int ret;
+       bool foreach_call = true;
+       bluetooth_device_address_t addr_hex = { {0,} };
+       bt_gatt_handle_info_t *prim_svc;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(remote_address);
+       BT_CHECK_INPUT_PARAMETER(callback);
+
+       prim_svc = g_new0(bt_gatt_handle_info_t, 1);
+
+       _bt_convert_address_to_hex(&addr_hex, remote_address);
+
+       ret = _bt_get_error_code(bluetooth_gatt_get_primary_services(&addr_hex,
+                                                               prim_svc));
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x) : Failed to run function",
+                                       _bt_convert_error_to_string(ret), ret);
+               g_free(prim_svc);
+               return ret;
+       }
+
+       for (i = 0; i < prim_svc->count; i++) {
+               if (prim_svc->handle[i] == NULL)
+                       continue;
+
+               BT_DBG("handle: %s", prim_svc->handle[i]);
+
+               if (foreach_call == true &&
+                   !callback((bt_gatt_attribute_h)prim_svc->handle[i], user_data)) {
+                       foreach_call = false;
+               }
+
+               /* Application should clone the handle using API in callback */
+               /* bt_gatt_clone_attribute_handle */
+               g_free(prim_svc->handle[i]);
+       }
+
+       g_free(prim_svc->handle);
+       g_free(prim_svc);
+
+       return ret;
+}
+
+int bt_gatt_discover_characteristics(bt_gatt_attribute_h service,
+                               bt_gatt_characteristics_discovered_cb callback,
+                               void *user_data)
+{
+       int ret;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(service);
+       BT_CHECK_INPUT_PARAMETER(callback);
+
+       ret = _bt_get_error_code(bluetooth_gatt_discover_service_characteristics((const char *)service));
+
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+       } else {
+               _bt_set_cb(BT_EVENT_GATT_CHARACTERISTIC_DISCOVERED, callback, user_data);
+       }
+
+       return ret;
+}
+
+int bt_gatt_get_service_uuid(bt_gatt_attribute_h service, char **uuid)
+{
+       int i;
+       int ret;
+       bt_gatt_service_property_t property;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(service);
+
+       memset(&property, 0x00, sizeof(bt_gatt_service_property_t));
+
+       ret = _bt_get_error_code(bluetooth_gatt_get_service_property((const char *)service, &property));
+
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+       } else {
+               *uuid = g_strdup(property.uuid);
+
+               if (property.handle_info.count != 0 && property.handle_info.handle) {
+                       for (i = 0; i < property.handle_info.count; i++) {
+                               g_free(property.handle_info.handle[i]);
+                       }
+                       g_free(property.handle_info.handle);
+               }
+       }
+
+       return ret;
+}
+
+int bt_gatt_foreach_included_services(bt_gatt_attribute_h service,
+                               bt_gatt_included_service_cb callback,
+                               void *user_data)
+{
+       int i;
+       int ret;
+       bool foreach_call = true;
+       bt_gatt_service_property_t property;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(service);
+       BT_CHECK_INPUT_PARAMETER(callback);
+
+       memset(&property, 0x00, sizeof(bt_gatt_service_property_t));
+
+       ret = _bt_get_error_code(bluetooth_gatt_get_service_property((const char *)service, &property));
+
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+       } else {
+               if (property.handle_info.count == 0 ||
+                    property.handle_info.handle == NULL) {
+                       return ret;
+               }
+
+               for (i = 0; i < property.handle_info.count; i++) {
+                       if (property.handle_info.handle[i] == NULL)
+                               continue;
+
+                       if (foreach_call == true &&
+                           !callback((bt_gatt_attribute_h)property.handle_info.handle[i],
+                                       user_data)) {
+                               foreach_call = false;
+                       }
+
+                       g_free(property.handle_info.handle[i]);
+               }
+               g_free(property.handle_info.handle);
+       }
+       return ret;
+}
+
+int bt_gatt_set_characteristic_changed_cb(bt_gatt_attribute_h service,
+                               bt_gatt_characteristic_changed_cb callback,
+                               void *user_data)
+{
+       int ret;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(service);
+       BT_CHECK_INPUT_PARAMETER(callback);
+
+       ret = _bt_get_error_code(bluetooth_gatt_watch_characteristics((const char *)service));
+
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+       } else {
+               _bt_set_cb(BT_EVENT_GATT_VALUE_CHANGED, callback, user_data);
+       }
+
+       return ret;
+}
+
+int bt_gatt_unset_characteristic_changed_cb(bt_gatt_attribute_h service)
+{
+       int ret;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(service);
+
+       ret = _bt_get_error_code(bluetooth_gatt_unwatch_characteristics((const char *)service));
+
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+       } else {
+               _bt_unset_cb(BT_EVENT_GATT_VALUE_CHANGED);
+       }
+
+       return ret;
+}
+
+int bt_gatt_get_characteristic_declaration(bt_gatt_attribute_h characteristic,
+                               char **uuid, unsigned char **value,
+                               int *value_length)
+{
+       int ret;
+       bt_gatt_char_property_t property;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(characteristic);
+
+       memset(&property, 0x00, sizeof(bt_gatt_service_property_t));
+
+       ret = _bt_get_error_code(bluetooth_gatt_get_characteristics_property((const char *)characteristic, &property));
+
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+       } else {
+               if (property.uuid) {
+                       *uuid = g_strdup(property.uuid);
+                       g_free(property.uuid);
+               }
+
+               if (property.val && property.val_len != 0) {
+                       *value = g_memdup(property.val, property.val_len);
+                       *value_length = property.val_len;
+                       g_free(property.val);
+               }
+
+               g_free(property.name);
+
+       }
+
+       return ret;
+}
+
+int bt_gatt_set_characteristic_value(bt_gatt_attribute_h characteristic,
+                               const unsigned char *value,
+                               int value_length)
+{
+       int ret;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(characteristic);
+       BT_CHECK_INPUT_PARAMETER(value);
+
+       if (value_length <= 0)
+               return BT_ERROR_INVALID_PARAMETER;
+
+       ret = _bt_get_error_code(bluetooth_gatt_set_characteristics_value((const char *)characteristic,
+                                                       (const guint8 *)value, value_length));
+
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+       }
+
+       return ret;
+}
+
+int bt_gatt_clone_attribute_handle(bt_gatt_attribute_h *clone,
+                               bt_gatt_attribute_h origin)
+{
+       int error = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(origin);
+
+       *clone = g_strdup((char *)origin);
+
+       return error;
+}
+
+int bt_gatt_destroy_attribute_handle(bt_gatt_attribute_h handle)
+{
+       int error = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(handle);
+
+       g_free(handle);
+
+       return error;
+}
diff --git a/src/bluetooth-hdp.c b/src/bluetooth-hdp.c
new file mode 100644 (file)
index 0000000..7abfc81
--- /dev/null
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * 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"
+
+int bt_hdp_register_sink_app(unsigned short data_type, char **app_id)
+{
+       int error = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(app_id);
+       error = bluetooth_hdp_activate(data_type, HDP_ROLE_SINK, HDP_QOS_ANY, app_id);
+       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;
+}
+
+int bt_hdp_unregister_sink_app(const char *app_id)
+{
+       int error = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(app_id);
+       error = bluetooth_hdp_deactivate(app_id);
+       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;
+}
+
+int bt_hdp_send_data(unsigned int channel, const char *data, unsigned int size)
+{
+       int error = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       if (NULL == data || 0 >= size) {
+               BT_ERR("%s", _bt_convert_error_to_string(BT_ERROR_INVALID_PARAMETER));
+       }
+       error = bluetooth_hdp_send_data(channel, data, size);
+       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;
+}
+
+int bt_hdp_connect_to_source(const char *remote_address, const char *app_id)
+{
+       int error = BT_ERROR_NONE;
+       bluetooth_device_address_t addr_hex = { {0,} };
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(app_id);
+       BT_CHECK_INPUT_PARAMETER(remote_address);
+       _bt_convert_address_to_hex(&addr_hex, remote_address);
+       error = bluetooth_hdp_connect(app_id, HDP_QOS_ANY, &addr_hex);
+       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_hdp_disconnect(const char *remote_address, unsigned int channel)
+{
+       int error = BT_ERROR_NONE;
+       bluetooth_device_address_t addr_hex = { {0,} };
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(remote_address);
+       _bt_convert_address_to_hex(&addr_hex, remote_address);
+
+       error = bluetooth_hdp_disconnect(channel, &addr_hex);
+       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_hdp_set_connection_state_changed_cb(bt_hdp_connected_cb connected_cb,
+               bt_hdp_disconnected_cb disconnected_cb, void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(connected_cb);
+       BT_CHECK_INPUT_PARAMETER(disconnected_cb);
+       _bt_set_cb(BT_EVENT_HDP_CONNECTED, connected_cb, user_data);
+       _bt_set_cb(BT_EVENT_HDP_DISCONNECTED, disconnected_cb, user_data);
+       return BT_ERROR_NONE;
+
+}
+
+int bt_hdp_unset_connection_state_changed_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+       if ( _bt_check_cb(BT_EVENT_HDP_CONNECTED) == true)
+               _bt_unset_cb(BT_EVENT_HDP_CONNECTED);
+       if ( _bt_check_cb(BT_EVENT_HDP_DISCONNECTED) == true)
+               _bt_unset_cb(BT_EVENT_HDP_DISCONNECTED);
+
+       return BT_ERROR_NONE;
+}
+
+int bt_hdp_set_data_received_cb(bt_hdp_data_received_cb callback,
+                               void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_HDP_DATA_RECEIVED, callback, user_data);
+       return BT_ERROR_NONE;
+}
+
+int bt_hdp_unset_data_received_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+       if ( _bt_check_cb(BT_EVENT_HDP_DATA_RECEIVED) == true)
+               _bt_unset_cb(BT_EVENT_HDP_DATA_RECEIVED);
+       return BT_ERROR_NONE;
+}
diff --git a/src/bluetooth-hid.c b/src/bluetooth-hid.c
new file mode 100644 (file)
index 0000000..6d4503a
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * 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-hid-api.h>
+
+#include "bluetooth.h"
+#include "bluetooth_private.h"
+
+int bt_hid_host_initialize(bt_hid_host_connection_state_changed_cb connection_cb,
+                                                               void *user_data)
+{
+       int error;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(connection_cb);
+
+       error = bluetooth_hid_init(_bt_hid_event_proxy, user_data);
+       error = _bt_get_error_code(error);
+       if (BT_ERROR_NONE != error) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error), error);
+       } else {
+               _bt_set_cb(BT_EVENT_HID_CONNECTION_STATUS, connection_cb, user_data);
+       }
+       return error;
+}
+
+int bt_hid_host_deinitialize()
+{
+       int error;
+
+       BT_CHECK_INIT_STATUS();
+
+       error = bluetooth_hid_deinit();
+       error = _bt_get_error_code(error);
+       if (BT_ERROR_NONE != error) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error), error);
+       } else {
+               _bt_unset_cb(BT_EVENT_HID_CONNECTION_STATUS);
+       }
+
+       return error;
+}
+
+int bt_hid_host_connect(const char *remote_address)
+{
+       int error;
+       bluetooth_device_address_t addr_hex = { {0,} };
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(remote_address);
+
+       _bt_convert_address_to_hex(&addr_hex, remote_address);
+
+       error = bluetooth_hid_connect((hid_device_address_t *)&addr_hex);
+       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_hid_host_disconnect(const char *remote_address)
+{
+       int error;
+       bluetooth_device_address_t addr_hex = { {0,} };
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(remote_address);
+
+       _bt_convert_address_to_hex(&addr_hex, remote_address);
+
+       error = bluetooth_hid_disconnect((hid_device_address_t *)&addr_hex);
+       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;
+}
diff --git a/src/bluetooth-opp-client.c b/src/bluetooth-opp-client.c
new file mode 100644 (file)
index 0000000..5e91927
--- /dev/null
@@ -0,0 +1,193 @@
+/*
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * 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"
+
+GList *sending_files;
+
+char** __bt_opp_get_file_array(GList *file_list)
+{
+       char **files = NULL;
+       char *c_file = NULL;
+       int file_num = 0;
+       int i = 0;
+
+       if (file_list == NULL)
+               return NULL;
+
+       file_num = g_list_length(file_list);
+
+       if (file_num == 0)
+               return NULL;
+
+       files = (char **)calloc(file_num + 1, sizeof(char *));
+       if (!files)
+               return NULL;
+
+       for (i = 0; i < file_num; i++) {
+               c_file = (char *)g_list_nth_data(file_list, i);
+
+               if (c_file == NULL)
+                       continue;
+
+               files[i] = c_file;
+       }
+
+       for (i = 0; i < file_num; i++)
+               BT_DBG("file: %s", files[i]);
+
+       return files;
+}
+
+int bt_opp_client_initialize(void)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+
+       error_code = _bt_get_error_code(bluetooth_opc_init());
+
+       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_opp_client_deinitialize(void)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+
+       error_code = _bt_get_error_code(bluetooth_opc_deinit());
+
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
+                               error_code);
+       }
+
+       bt_opp_client_clear_files();
+
+       return error_code;
+}
+
+int bt_opp_client_add_file(const char *file)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(file);
+
+       if (access(file, F_OK) == 0) {
+               sending_files = g_list_append(sending_files, strdup(file));
+       } else {
+               error_code = BT_ERROR_INVALID_PARAMETER;
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
+                               error_code);
+       }
+
+       return error_code;
+}
+
+int bt_opp_client_clear_files(void)
+{
+       int i = 0;
+       int file_num = 0;
+       char *c_file = NULL;
+
+       BT_CHECK_INIT_STATUS();
+
+       if (sending_files) {
+               file_num = g_list_length(sending_files);
+
+               for (i = 0; i < file_num; i++) {
+                       c_file = (char *)g_list_nth_data(sending_files, i);
+
+                       if (c_file == NULL)
+                               continue;
+
+                       free(c_file);
+               }
+
+               g_list_free(sending_files);
+               sending_files = NULL;
+       }
+
+       return BT_ERROR_NONE;
+}
+
+int bt_opp_client_push_files(const char *remote_address,
+                       bt_opp_client_push_responded_cb responded_cb,
+                       bt_opp_client_push_progress_cb progress_cb,
+                       bt_opp_client_push_finished_cb finished_cb,
+                       void *user_data)
+{
+       int error_code = BT_ERROR_NONE;
+       bluetooth_device_address_t addr_hex = { {0,} };
+       char **files = NULL;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(remote_address);
+
+       _bt_convert_address_to_hex(&addr_hex, remote_address);
+
+       files = __bt_opp_get_file_array(sending_files);
+
+       error_code = _bt_get_error_code(bluetooth_opc_push_files(&addr_hex, files));
+
+       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_OPP_CLIENT_PUSH_RESPONSED, responded_cb, user_data);
+               _bt_set_cb(BT_EVENT_OPP_CLIENT_PUSH_PROGRESS, progress_cb, user_data);
+               _bt_set_cb(BT_EVENT_OPP_CLIENT_PUSH_FINISHED, finished_cb, user_data);
+       }
+
+       bt_opp_client_clear_files();
+
+       if (files)
+               free(files);
+
+       return error_code;
+}
+
+int bt_opp_client_cancel_push(void)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+
+       error_code = _bt_get_error_code(bluetooth_opc_cancel_push());
+
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
+                               error_code);
+       }
+
+       return error_code;
+}
+
diff --git a/src/bluetooth-opp-server.c b/src/bluetooth-opp-server.c
new file mode 100644 (file)
index 0000000..f6858da
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * 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 <dlog.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <bluetooth-api.h>
+
+#include "bluetooth.h"
+#include "bluetooth_private.h"
+
+int bt_opp_server_initialize(const char *destination,
+                       bt_opp_server_push_requested_cb push_requested_cb,
+                       void *user_data)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(destination);
+
+       error_code = _bt_get_error_code(bluetooth_obex_server_init(destination));
+
+       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_OPP_PUSH_REQUESTED, push_requested_cb, user_data);
+       }
+
+       return error_code;
+}
+
+int bt_opp_server_initialize_by_connection_request(const char *destination,
+                       bt_opp_server_connection_requested_cb connection_requested_cb,
+                       void *user_data)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(destination);
+
+       error_code = _bt_get_error_code(bluetooth_obex_server_init_without_agent(destination));
+
+       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_OPP_CONNECTION_REQUESTED, connection_requested_cb, user_data);
+       }
+
+       return error_code;
+}
+
+int bt_opp_server_deinitialize(void)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+
+       if (_bt_check_cb(BT_EVENT_OPP_CONNECTION_REQUESTED) == false) {
+               error_code = _bt_get_error_code(bluetooth_obex_server_deinit());
+       } else {
+               /* BADA API */
+               error_code = _bt_get_error_code(bluetooth_obex_server_deinit_without_agent());
+       }
+
+       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_OPP_CONNECTION_REQUESTED);
+       _bt_unset_cb(BT_EVENT_OPP_PUSH_REQUESTED);
+
+       return error_code;
+}
+
+int bt_opp_server_accept(bt_opp_server_transfer_progress_cb progress_cb,
+                       bt_opp_server_transfer_finished_cb finished_cb,
+                       const char *name,
+                       void *user_data,
+                       int *transfer_id)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+
+       /* Unset the transfer callbacks */
+       _bt_unset_cb(BT_EVENT_OPP_SERVER_TRANSFER_PROGRESS);
+       _bt_unset_cb(BT_EVENT_OPP_SERVER_TRANSFER_FINISHED);
+
+       if (_bt_check_cb(BT_EVENT_OPP_CONNECTION_REQUESTED) == false) {
+               error_code = _bt_get_error_code(bluetooth_obex_server_accept_authorize(name));
+       } else {
+               /* BADA API */
+               error_code = _bt_get_error_code(bluetooth_obex_server_accept_connection());
+       }
+
+       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_OPP_SERVER_TRANSFER_PROGRESS, progress_cb, user_data);
+               _bt_set_cb(BT_EVENT_OPP_SERVER_TRANSFER_FINISHED, finished_cb, user_data);
+       }
+
+       return error_code;
+}
+
+int bt_opp_server_reject(void)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+
+       if (_bt_check_cb(BT_EVENT_OPP_CONNECTION_REQUESTED) == false) {
+               error_code = _bt_get_error_code(bluetooth_obex_server_reject_authorize());
+       } else {
+               /* BADA API */
+               error_code = _bt_get_error_code(bluetooth_obex_server_reject_connection());
+       }
+
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
+                               error_code);
+       }
+
+       /* Unset the transfer callbacks */
+       _bt_unset_cb(BT_EVENT_OPP_SERVER_TRANSFER_PROGRESS);
+       _bt_unset_cb(BT_EVENT_OPP_SERVER_TRANSFER_FINISHED);
+
+       return error_code;
+}
+
+int bt_opp_server_set_destination(const char *destination)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(destination);
+
+       error_code = _bt_get_error_code(bluetooth_obex_server_set_destination_path(destination));
+       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_opp_server_cancel_transfer(int transfer_id)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+
+       error_code = _bt_get_error_code(bluetooth_obex_server_cancel_transfer(transfer_id));
+       if (error_code != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
+                               error_code);
+       }
+
+       return error_code;
+}
+
diff --git a/src/bluetooth-pan.c b/src/bluetooth-pan.c
new file mode 100644 (file)
index 0000000..eb27268
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * 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"
+
+GList *sending_files;
+
+int bt_nap_activate(void)
+{
+       int error = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       error = bluetooth_network_activate_server();
+       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_nap_deactivate(void)
+{
+       int error = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       error = bluetooth_network_deactivate_server();
+       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;
+}
+
+/* bluez don't support the disconnect API about NAP server */
+/* So we implement this, deactivate the server and re-activate the server */
+int bt_nap_disconnect_all(void)
+{
+       int error = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       error = bluetooth_network_deactivate_server();
+       error = _bt_get_error_code(error);
+       if (error != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error), error);
+       } else {
+               return bt_nap_activate();
+       }
+
+       return error;
+}
+
+int bt_nap_set_connection_state_changed_cb(
+                               bt_nap_connection_state_changed_cb callback,
+                               void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_NAP_CONNECTION_STATE_CHANGED, callback, user_data);
+       return BT_ERROR_NONE;
+
+}
+
+int bt_nap_unset_connection_state_changed_cb(void)
+{
+       _bt_unset_cb(BT_EVENT_NAP_CONNECTION_STATE_CHANGED);
+       return BT_ERROR_NONE;
+}
+
+int bt_panu_set_connection_state_changed_cb(
+                               bt_panu_connection_state_changed_cb callback,
+                               void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_PAN_CONNECTION_STATE_CHANGED, callback, user_data);
+       return BT_ERROR_NONE;
+}
+
+int bt_panu_unset_connection_state_changed_cb(void)
+{
+       _bt_unset_cb(BT_EVENT_PAN_CONNECTION_STATE_CHANGED);
+       return BT_ERROR_NONE;
+}
+
+int bt_panu_connect(const char *remote_address, bt_panu_service_type_e type)
+{
+       int error = BT_ERROR_INVALID_PARAMETER;
+       bluetooth_device_address_t addr_hex = { {0,} };
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(remote_address);
+       _bt_convert_address_to_hex(&addr_hex, remote_address);
+       if (BT_PANU_SERVICE_TYPE_NAP == type) {
+               error = bluetooth_network_connect(&addr_hex,
+                                       BLUETOOTH_NETWORK_NAP_ROLE, NULL);
+               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_panu_disconnect(const char *remote_address)
+{
+       int error = BT_ERROR_INVALID_PARAMETER;
+       bluetooth_device_address_t addr_hex = { {0,} };
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(remote_address);
+       _bt_convert_address_to_hex(&addr_hex, remote_address);
+       error = bluetooth_network_disconnect(&addr_hex);
+       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;
+}
+
diff --git a/src/bluetooth-socket.c b/src/bluetooth-socket.c
new file mode 100644 (file)
index 0000000..f3e4ec7
--- /dev/null
@@ -0,0 +1,225 @@
+/*
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * 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 <dlog.h>
+#include <stdio.h>
+#include <bluetooth-api.h>
+
+#include "bluetooth.h"
+#include "bluetooth_private.h"
+
+int bt_socket_create_rfcomm(const char *uuid, int *socket_fd)
+{
+       int ret = 0;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(uuid);
+       BT_CHECK_INPUT_PARAMETER(socket_fd);
+
+       ret = bluetooth_rfcomm_create_socket(uuid);
+       if (ret < 0) {
+               ret = _bt_get_error_code(ret);
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+               return ret;
+       } else {
+               *socket_fd = ret;
+               return BT_ERROR_NONE;
+       }
+}
+
+int bt_socket_destroy_rfcomm(int socket_fd)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       error_code = _bt_get_error_code(bluetooth_rfcomm_remove_socket(socket_fd));
+       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_socket_is_service_used(const char* service_uuid, bool *used)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(service_uuid);
+       BT_CHECK_INPUT_PARAMETER(used);
+
+       *used = bluetooth_rfcomm_is_server_uuid_available(service_uuid);
+
+       return BT_ERROR_NONE;
+}
+
+int bt_socket_listen_and_accept_rfcomm(int socket_fd, int max_pending_connections)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       error_code = _bt_get_error_code(bluetooth_rfcomm_listen_and_accept(socket_fd, max_pending_connections));
+       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_socket_listen(int socket_fd, int max_pending_connections)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+
+       error_code = _bt_get_error_code(bluetooth_rfcomm_listen(socket_fd, max_pending_connections));
+       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_socket_accept(int socket_fd, int *connected_socket_fd)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+
+       error_code = _bt_get_error_code(bluetooth_rfcomm_accept_connection(socket_fd, connected_socket_fd));
+       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_socket_reject(int socket_fd)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+
+       error_code = _bt_get_error_code(bluetooth_rfcomm_reject_connection(socket_fd));
+       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_socket_connect_rfcomm(const char *remote_address, const char *remote_port_uuid)
+{
+       bluetooth_device_address_t addr_hex = { {0,} };
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(remote_address);
+       BT_CHECK_INPUT_PARAMETER(remote_port_uuid);
+
+       _bt_convert_address_to_hex(&addr_hex, remote_address);
+
+       error_code = _bt_get_error_code(bluetooth_rfcomm_connect(&addr_hex, remote_port_uuid));
+       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_socket_disconnect_rfcomm(int socket_fd)
+{
+       int error_code = BT_ERROR_NONE;
+
+       BT_CHECK_INIT_STATUS();
+
+       error_code = _bt_get_error_code(bluetooth_rfcomm_disconnect(socket_fd));
+       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_socket_send_data(int socket_fd, const char *data, int length)
+{
+       int ret = 0;
+
+       BT_CHECK_INIT_STATUS();
+       ret = bluetooth_rfcomm_write(socket_fd, data, length);
+       if (ret == BLUETOOTH_ERROR_NOT_IN_OPERATION) {
+               BT_ERR("OPERATION_FAILED(0x%08x)", BT_ERROR_OPERATION_FAILED);
+               return BT_ERROR_OPERATION_FAILED;
+       }
+
+       ret = _bt_get_error_code(ret);
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+       }
+
+       return ret;
+}
+
+int bt_socket_set_data_received_cb(bt_socket_data_received_cb callback, void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_DATA_RECEIVED, callback, user_data);
+       return BT_ERROR_NONE;
+}
+
+int bt_socket_unset_data_received_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+       _bt_unset_cb(BT_EVENT_DATA_RECEIVED);
+       return BT_ERROR_NONE;
+}
+
+int bt_socket_set_connection_requested_cb(bt_socket_connection_requested_cb callback, void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_RFCOMM_CONNECTION_REQUESTED, callback, user_data);
+       return BT_ERROR_NONE;
+}
+
+int bt_socket_unset_connection_requested_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+       _bt_unset_cb(BT_EVENT_RFCOMM_CONNECTION_REQUESTED);
+       return BT_ERROR_NONE;
+}
+
+int bt_socket_set_connection_state_changed_cb(bt_socket_connection_state_changed_cb callback, void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_CONNECTION_STATE_CHANGED, callback, user_data);
+       return BT_ERROR_NONE;
+}
+
+int bt_socket_unset_connection_state_changed_cb(void)
+{
+       BT_CHECK_INIT_STATUS();
+       _bt_unset_cb(BT_EVENT_CONNECTION_STATE_CHANGED);
+       return BT_ERROR_NONE;
+}
+
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
new file mode 100644 (file)
index 0000000..7715cac
--- /dev/null
@@ -0,0 +1,17 @@
+SET(fw_test "${fw_name}-test")
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(${fw_test} REQUIRED glib-2.0)
+FOREACH(flag ${${fw_test}_CFLAGS})
+    SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -Wall")
+
+aux_source_directory(. sources)
+FOREACH(src ${sources})
+    GET_FILENAME_COMPONENT(src_name ${src} NAME_WE)
+    MESSAGE("${src_name}")
+    ADD_EXECUTABLE(${src_name} ${src})
+    TARGET_LINK_LIBRARIES(${src_name} ${fw_name} ${${fw_test}_LDFLAGS})
+ENDFOREACH()
diff --git a/test/bt_chat_client.c b/test/bt_chat_client.c
new file mode 100644 (file)
index 0000000..9413372
--- /dev/null
@@ -0,0 +1,453 @@
+/*
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include <bluetooth.h>
+#include <dlog.h>
+#include <glib.h>
+#include <string.h>
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+#define LOG_TAG "BT_CHAT_CLIENT"
+
+/**
+ *   Variables
+ **/
+static GMainLoop* g_mainloop = NULL;
+static bt_adapter_state_e bt_state = BT_ADAPTER_DISABLED;
+static int socket_fd = -1;
+static char* bt_address = NULL;
+static char* server_name = "chat_server";
+static char quit_command[5] = "Quit";
+static int bonding_state = BT_ERROR_OPERATION_FAILED;
+
+
+/**
+ *   Callback functions
+ **/
+gboolean timeout_func(gpointer data)
+{
+       LOGE("[%s] Callback: Timeout.", __FUNCTION__);
+       g_main_loop_quit((GMainLoop*)data);
+       return FALSE;
+}
+
+void bt_state_changed_impl(int result, bt_adapter_state_e adapter_state, void* user_data)
+{
+       if(adapter_state == BT_ADAPTER_ENABLED)
+       {
+               if(result == BT_ERROR_NONE)
+               {
+                       LOGI("[%s] Callback: BT was enabled successfully.", __FUNCTION__);
+                       bt_state = BT_ADAPTER_ENABLED;
+               }
+               else
+               {
+                       LOGE("[%s] Callback: Failed to enable BT.", __FUNCTION__);
+               }
+       }
+
+       if(g_mainloop)
+       {
+               g_main_loop_quit(g_mainloop);
+       }
+}
+
+void bt_socket_connection_state_changed_impl(int result, bt_socket_connection_state_e connection_state,
+       bt_socket_connection_s *connection, void *user_data)
+{
+       if(result == BT_ERROR_NONE)
+       {
+               LOGI("[%s] Callback: Result is BT_ERROR_NONE.", __FUNCTION__);
+       }
+       else
+       {
+               LOGI("[%s] Callback: Result is not BT_ERROR_NONE.", __FUNCTION__);
+       }
+
+       if(connection_state == BT_SOCKET_CONNECTED)
+       {
+               LOGI("[%s] Callback: Connected.", __FUNCTION__);
+               if(result == BT_ERROR_NONE && connection != NULL)
+               {
+                       socket_fd = connection->socket_fd;
+                       LOGI("[%s] Callback: Socket of connection - %d.", __FUNCTION__, socket_fd);
+                       LOGI("[%s] Callback: Role of connection - %d.", __FUNCTION__, connection->local_role);
+                       LOGI("[%s] Callback: Address of connection - %s.", __FUNCTION__, connection->remote_address);
+
+                       if(bt_socket_send_data(socket_fd, quit_command, strlen(quit_command)) == BT_ERROR_NONE)
+                       {
+                               LOGI("[%s] Callback: Send quit command.", __FUNCTION__);
+                       }
+                       else
+                       {
+                               LOGE("[%s] Callback: bt_socket_send_data() failed.", __FUNCTION__);
+                               if(g_mainloop)
+                               {
+                                       g_main_loop_quit(g_mainloop);
+                               }
+                       }
+               }
+               else
+               {
+                       LOGI("[%s] Callback: Failed to connect", __FUNCTION__);
+                       if(g_mainloop)
+                       {
+                               g_main_loop_quit(g_mainloop);
+                       }
+               }
+       }
+       else
+       {
+               LOGI("[%s] Callback: Disconnected.", __FUNCTION__);
+       }
+}
+
+void bt_socket_data_received_impl(bt_socket_received_data_s *data, void *user_data)
+{
+       if(socket_fd == data->socket_fd)
+       {
+               if(data->data_size > 0)
+               {
+                       if(!strncmp(data->data, quit_command, data->data_size))
+                       {
+                               LOGI("[%s] Callback: Quit command.", __FUNCTION__);
+                               if(g_mainloop)
+                               {
+                                       g_main_loop_quit(g_mainloop);
+                               }
+                       }
+               }
+               else
+               {
+                       LOGE("[%s] Callback: No data.", __FUNCTION__);
+               }
+       }
+       else
+       {
+               LOGI("[%s] Callback: Another socket - %d.", __FUNCTION__, data->socket_fd);
+       }
+}
+
+bool bt_adapter_bonded_device_impl(bt_device_info_s *device_info, void *user_data)
+{
+       int i = 0;
+       if(device_info != NULL)
+       {
+               if(device_info->remote_name != NULL && !strcmp(device_info->remote_name, (char*)user_data))
+               {
+                       LOGI("[%s] Callback: chat_server is found in bonded list.", __FUNCTION__);
+                       if( device_info->remote_address != NULL )
+                       {
+                               LOGI("[%s] Callback: Address of chat_server - %s.", __FUNCTION__, device_info->remote_address);
+                               bt_address = strdup(device_info->remote_address);
+                               LOGI("[%s] Callback: The number of service_count - %d.", __FUNCTION__, device_info->service_count);
+                               if(device_info->service_count <= 0)
+                               {
+                                       bonding_state = BT_ERROR_SERVICE_SEARCH_FAILED;
+                               }
+                               else
+                               {
+                                       bonding_state = BT_ERROR_NONE;
+                                       for(i=0; i<device_info->service_count; i++)
+                                       {
+                                               LOGI("[%s] Callback: service[%d] - %s", __FUNCTION__, i+1, device_info->service_uuid[i]);
+                                       }
+                                       LOGI("[%s] Callback: is_bonded - %d.", __FUNCTION__, device_info->is_bonded);
+                                       LOGI("[%s] Callback: is_connected - %d.", __FUNCTION__, device_info->is_connected);
+                                       LOGI("[%s] Callback: is_authorized - %d.", __FUNCTION__, device_info->is_authorized);
+                               }
+                       }
+                       else
+                       {
+                               LOGE("[%s] Callback: Address of chat_server is NULL.", __FUNCTION__);
+                       }
+
+                       return false;
+               }
+       }
+
+       return true;
+}
+
+void bt_adapter_device_discovery_state_changed_impl(int result, bt_adapter_device_discovery_state_e discovery_state,
+       bt_adapter_device_discovery_info_s *discovery_info, void *user_data)
+{
+       if(discovery_state == BT_ADAPTER_DEVICE_DISCOVERY_FOUND)
+       {
+               if(discovery_info->remote_address != NULL && !strcmp(discovery_info->remote_name, server_name))
+               {
+                       LOGI("[%s] Callback: chat_server is found.", __FUNCTION__);
+                       LOGI("[%s] Callback: Address of chat_server - %s.", __FUNCTION__, discovery_info->remote_address);
+                       LOGI("[%s] Callback: Device major class - %d.", __FUNCTION__, discovery_info->bt_class.major_device_class);
+                       LOGI("[%s] Callback: Device minor class - %d.", __FUNCTION__, discovery_info->bt_class.minor_device_class);
+                       LOGI("[%s] Callback: Service major class - %d.", __FUNCTION__, discovery_info->bt_class.major_service_class_mask);
+                       bt_address = strdup(discovery_info->remote_address);
+                       LOGI("[%s] Callback: is_bonded - %d.", __FUNCTION__, discovery_info->is_bonded);
+                       bt_adapter_stop_device_discovery();
+               }
+               else
+               {
+                       LOGE("[%s] Callback: Another device is found.", __FUNCTION__);
+               }
+       }
+       else if(discovery_state == BT_ADAPTER_DEVICE_DISCOVERY_FINISHED)
+       {
+               LOGI("[%s] Callback: device discovery finished.", __FUNCTION__);
+               if(g_mainloop)
+               {
+                       g_main_loop_quit(g_mainloop);
+               }
+       }
+}
+
+void bt_device_bond_created_impl(int result, bt_device_info_s *device_info, void *user_data)
+{
+       if(device_info != NULL && !strcmp(device_info->remote_address, bt_address))
+       {
+               bonding_state = result;
+               if(result == BT_ERROR_NONE)
+               {
+                       LOGI("[%s] Callback: A bond with chat_server is created.", __FUNCTION__);
+                       LOGI("[%s] Callback: The number of service - %d.", __FUNCTION__, device_info->service_count);
+
+                       int i = 0;
+                       for(i=0; i<device_info->service_count; i++)
+                       {
+                               LOGI("[%s] Callback: service[%d] - %s", __FUNCTION__, i+1, device_info->service_uuid[i]);
+                       }
+                       LOGI("[%s] Callback: is_bonded - %d.", __FUNCTION__, device_info->is_bonded);
+                       LOGI("[%s] Callback: is_connected - %d.", __FUNCTION__, device_info->is_connected);
+               }
+               else
+               {
+                       LOGE("[%s] Callback: Creating a bond is failed.", __FUNCTION__);
+               }
+       }
+       else
+       {
+               LOGE("[%s] Callback: A bond with another device is created.", __FUNCTION__);
+       }
+
+       if(g_mainloop)
+       {
+               g_main_loop_quit(g_mainloop);
+       }
+}
+
+void bt_device_service_searched_impl(int result, bt_device_sdp_info_s* sdp_info, void* user_data)
+{
+       if(sdp_info != NULL && !strcmp(sdp_info->remote_address, bt_address))
+       {
+               bonding_state = result;
+               if(result == BT_ERROR_NONE)
+               {
+                       LOGI("[%s] Callback: Services of chat_service are found.", __FUNCTION__);
+                       LOGI("[%s] Callback: The number of service - %d.", __FUNCTION__, sdp_info->service_count);
+
+                       int i = 0;
+                       for(i = 0; i < sdp_info->service_count; i++)
+                       {
+                               LOGI("[%s] Callback: service[%d] - %s", __FUNCTION__, i+1, sdp_info->service_uuid[i]);
+                       }
+               }
+       }
+       else
+       {
+               LOGE("[%s] Callback: Services of another device are found.", __FUNCTION__);
+       }
+
+       if(g_mainloop)
+       {
+               g_main_loop_quit(g_mainloop);
+       }
+}
+
+
+
+
+int main()
+{
+       g_mainloop = g_main_loop_new(NULL, FALSE);
+       const char* my_uuid="11011101-0000-1000-8000-00805F9B34FB";
+       int timeout_id = -1;
+
+       LOGI("[%s] Client starts.", __FUNCTION__);
+
+       if(bt_initialize() != BT_ERROR_NONE)
+       {
+               LOGE("[%s] bt_initialize() failed.", __FUNCTION__);
+               return -1;
+       }
+
+       if(bt_adapter_get_state(&bt_state) != BT_ERROR_NONE)
+       {
+               LOGE("[%s] bt_adapter_get_state() failed.", __FUNCTION__);
+               return -1;
+       }
+
+       //      Enable BT
+       if(bt_state == BT_ADAPTER_DISABLED)
+       {
+               if(bt_adapter_set_state_changed_cb(bt_state_changed_impl, NULL) != BT_ERROR_NONE)
+               {
+                       LOGE("[%s] bt_adapter_set_state_changed_cb() failed.", __FUNCTION__);
+                       return -1;
+               }
+
+               if(bt_adapter_enable() == BT_ERROR_NONE)
+               {
+                       LOGI("[%s] bt_adapter_state_changed_cb will be called.", __FUNCTION__);
+                       timeout_id = g_timeout_add (60000, timeout_func, g_mainloop);
+                       g_main_loop_run(g_mainloop);
+                       g_source_remove(timeout_id);
+               }
+               else
+               {
+                       LOGE("[%s] bt_adapter_enable() failed.", __FUNCTION__);
+                       return -1;
+               }
+       }
+       else
+       {
+               LOGI("[%s] BT was already enabled.", __FUNCTION__);
+       }
+
+       //      Device discovery
+       if(bt_state == BT_ADAPTER_ENABLED)
+       {
+               if(bt_adapter_foreach_bonded_device(bt_adapter_bonded_device_impl, server_name) != BT_ERROR_NONE)
+               {
+                       LOGE("[%s] bt_adapter_foreach_bonded_device() failed.", __FUNCTION__);
+                       return -1;
+               }
+
+               if(bt_address == NULL)
+               {
+                       if(bt_adapter_set_device_discovery_state_changed_cb(bt_adapter_device_discovery_state_changed_impl, NULL)
+                               != BT_ERROR_NONE )
+                       {
+                               LOGE("[%s] bt_adapter_set_device_discovery_state_changed_cb() failed.", __FUNCTION__);
+                               return -1;
+                       }
+
+                       if(bt_adapter_start_device_discovery() == BT_ERROR_NONE)
+                       {
+                               LOGI("[%s] bt_adapter_device_discovery_state_changed_cb will be called.", __FUNCTION__);
+                               g_main_loop_run(g_mainloop);
+                       }
+                       else
+                       {
+                               LOGE("[%s] bt_adapter_start_device_discovery() failed.", __FUNCTION__);
+                               return -1;
+                       }
+               }
+               else
+               {
+                       LOGI("[%s] chat_server is found in bonded device list.", __FUNCTION__);
+               }
+       }
+       else
+       {
+               LOGE("[%s] BT is not enabled.", __FUNCTION__);
+               return -1;
+       }
+
+       // Create bond with a server
+       if(bonding_state == BT_ERROR_SERVICE_SEARCH_FAILED)
+       {
+               if(bt_device_set_service_searched_cb(bt_device_service_searched_impl, NULL) != BT_ERROR_NONE)
+               {
+                       LOGE("[%s] bt_device_set_service_searched_cb() failed.", __FUNCTION__);
+                       return -1;
+               }
+
+               if(bt_device_start_service_search(bt_address) == BT_ERROR_NONE)
+               {
+                       LOGI("[%s] bt_device_service_searched_cb will be called.", __FUNCTION__);
+                       g_main_loop_run(g_mainloop);
+               }
+               else
+               {
+                       LOGE("[%s] bt_device_start_service_search() failed.", __FUNCTION__);
+                       return -1;
+               }
+       }
+       else if(bonding_state != BT_ERROR_NONE)
+       {
+               if(bt_device_set_bond_created_cb(bt_device_bond_created_impl, NULL) != BT_ERROR_NONE)
+               {
+                       LOGE("[%s] bt_device_set_bond_created_cb() failed.", __FUNCTION__);
+                       return -1;
+               }
+
+               if(bt_device_create_bond(bt_address) == BT_ERROR_NONE)
+               {
+                       LOGI("[%s] bt_device_bond_created_cb will be called.", __FUNCTION__);
+                       g_main_loop_run(g_mainloop);
+               }
+               else
+               {
+                       LOGE("[%s] bt_device_create_bond() failed.", __FUNCTION__);
+                       return -1;
+               }
+       }
+
+       //      Connecting socket as a client
+       if( bonding_state == BT_ERROR_NONE )
+       {
+               if( bt_socket_set_connection_state_changed_cb(bt_socket_connection_state_changed_impl, NULL) != BT_ERROR_NONE )
+               {
+                       LOGE("[%s] bt_socket_set_connection_state_changed_cb() failed.", __FUNCTION__);
+                       return -1;
+               }
+
+               if( bt_socket_set_data_received_cb(bt_socket_data_received_impl, NULL) != BT_ERROR_NONE )
+               {
+                       LOGE("[%s] bt_socket_set_data_received_cb() failed.", __FUNCTION__);
+                       return -1;
+               }
+
+               if( bt_socket_connect_rfcomm(bt_address, my_uuid) == BT_ERROR_NONE )
+               {
+                       LOGI("[%s] bt_socket_connection_state_changed_cb will be called.", __FUNCTION__);
+                       g_main_loop_run(g_mainloop);
+               }
+               else
+               {
+                       LOGE("[%s] bt_socket_connect_rfcomm() failed.", __FUNCTION__);
+                       return -1;
+               }
+
+               if( bt_socket_disconnect_rfcomm(socket_fd) != BT_ERROR_NONE )
+               {
+                       LOGE("[%s] bt_socket_disconnect_rfcomm() failed.", __FUNCTION__);
+                       return -1;
+               }
+       }
+       else
+       {
+               LOGE("[%s] Bond is not created.", __FUNCTION__);
+               return -1;
+       }
+
+       bt_deinitialize();
+
+       LOGI("[%s] Client ends.", __FUNCTION__);
+       return 0;
+}
diff --git a/test/bt_chat_server.c b/test/bt_chat_server.c
new file mode 100644 (file)
index 0000000..8d7dd4e
--- /dev/null
@@ -0,0 +1,282 @@
+/*
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include <bluetooth.h>
+#include <dlog.h>
+#include <glib.h>
+#include <string.h>
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+#define LOG_TAG "BT_CHAT_SERVER"
+
+/**
+ *   Variables
+ **/
+static GMainLoop* g_mainloop = NULL;
+static bt_adapter_visibility_mode_e visibility_mode = BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE;
+static bt_adapter_state_e bt_state = BT_ADAPTER_DISABLED;
+static int service_socket = -1;
+static int connected_socket = -1;
+static char* quit_command = "Quit";
+
+
+/**
+ *   Callback functions
+ **/
+gboolean timeout_func(gpointer data)
+{
+       LOGE("[%s] Timeout.", __FUNCTION__);
+       if(g_mainloop)
+       {
+               g_main_loop_quit((GMainLoop*)data);
+       }
+
+       return FALSE;
+}
+
+void bt_state_changed_impl(int result, bt_adapter_state_e adapter_state, void* user_data)
+{
+       if( adapter_state == BT_ADAPTER_ENABLED )
+       {
+               if( result == BT_ERROR_NONE )
+               {
+                       LOGI("[%s] Callback: BT was enabled successfully.", __FUNCTION__);
+                       bt_state = BT_ADAPTER_ENABLED;
+               }
+               else
+               {
+                       LOGE("[%s] Callback: Failed to enable BT.", __FUNCTION__);
+               }
+       }
+
+       if(g_mainloop)
+       {
+               g_main_loop_quit(g_mainloop);
+       }
+}
+
+void bt_socket_connection_state_changed_impl(int result, bt_socket_connection_state_e connection_state,
+       bt_socket_connection_s *connection, void *user_data)
+{
+       if( result == BT_ERROR_NONE )
+       {
+               LOGI("[%s] Callback: Result is BT_ERROR_NONE.", __FUNCTION__);
+       }
+       else
+       {
+               LOGI("[%s] Callback: Result is not BT_ERROR_NONE.", __FUNCTION__);
+       }
+
+       if( connection_state == BT_SOCKET_CONNECTED )
+       {
+               LOGI("[%s] Callback: Connected.", __FUNCTION__);
+               if( connection != NULL )
+               {
+                       connected_socket = connection->socket_fd;
+                       LOGI("[%s] Callback: Socket of connection - %d.", __FUNCTION__, connected_socket);
+                       LOGI("[%s] Callback: Role of connection - %d.", __FUNCTION__, connection->local_role);
+                       LOGI("[%s] Callback: Address of connection - %s.", __FUNCTION__, connection->remote_address);
+               }
+               else
+               {
+                       LOGI("[%s] Callback: No connection data", __FUNCTION__);
+               }
+       }
+       else
+       {
+               LOGI("[%s] Callback: Disconnected.", __FUNCTION__);
+               LOGI("[%s] Callback: Socket of connection - %d.", __FUNCTION__, connected_socket);
+               LOGI("[%s] Callback: Role of connection - %d.", __FUNCTION__, connection->local_role);
+               LOGI("[%s] Callback: Address of connection - %s.", __FUNCTION__, connection->remote_address);
+       }
+}
+
+void bt_socket_data_received_impl(bt_socket_received_data_s *data, void *user_data)
+{
+       if( data->data_size > 0 )
+       {
+               if( !strncmp(data->data, quit_command, data->data_size) )
+               {
+                       LOGI("[%s] Callback: Quit command.", __FUNCTION__);
+                       if(g_mainloop)
+                       {
+                               g_main_loop_quit(g_mainloop);
+                       }
+               }
+
+               if( bt_socket_send_data(connected_socket, quit_command, strlen(quit_command)) == BT_ERROR_NONE )
+               {
+                       LOGI("[%s] Callback: Send quit command.", __FUNCTION__);
+               }
+               else
+               {
+                       LOGE("[%s] Callback: bt_socket_send_data() failed.", __FUNCTION__);
+               }
+       }
+       else
+       {
+               LOGE("[%s] Callback: No data.", __FUNCTION__);
+       }
+}
+
+
+int main()
+{
+       g_mainloop = g_main_loop_new(NULL, FALSE);
+       const char* my_uuid="11011101-0000-1000-8000-00805F9B34FB";
+       int timeout_id = -1;
+
+       LOGI("[%s] Server starts.", __FUNCTION__);
+
+       if(bt_initialize() != BT_ERROR_NONE)
+       {
+               LOGE("[%s] bt_initialize() failed.", __FUNCTION__);
+               return -1;
+       }
+
+       if(bt_adapter_get_state(&bt_state) != BT_ERROR_NONE)
+       {
+               LOGE("[%s] bt_adapter_get_state() failed.", __FUNCTION__);
+               return -1;
+       }
+
+       //      Enable BT
+       if(bt_state == BT_ADAPTER_DISABLED)
+       {
+               if(bt_adapter_set_state_changed_cb(bt_state_changed_impl, NULL) != BT_ERROR_NONE)
+               {
+                       LOGE("[%s] bt_adapter_set_state_changed_cb() failed.", __FUNCTION__);
+                       return -1;
+               }
+
+               if(bt_adapter_enable() == BT_ERROR_NONE)
+               {
+                       LOGI("[%s] bt_adapter_state_changed_cb will be called.", __FUNCTION__);
+                       timeout_id = g_timeout_add (60000, timeout_func, g_mainloop);
+                       g_main_loop_run(g_mainloop);
+                       g_source_remove(timeout_id);
+               }
+               else
+               {
+                       LOGE("[%s] bt_adapter_enable() failed.", __FUNCTION__);
+                       return -1;
+               }
+       }
+       else
+       {
+               LOGI("[%s] BT was already enabled.", __FUNCTION__);
+       }
+
+       //  Set name as "chat_server"
+       if(bt_state == BT_ADAPTER_ENABLED)
+       {
+               char* name = NULL;
+               if(bt_adapter_get_name(&name) != BT_ERROR_NONE)
+               {
+                       LOGE("[%s] bt_adapter_get_name() failed.", __FUNCTION__);
+                       return -1;
+               }
+
+               if (NULL == name)
+                       return -1;
+
+               if(strncmp(name, "chat_server", strlen(name)) != 0)
+               {
+                       if(bt_adapter_set_name("chat_server") != BT_ERROR_NONE)
+                       {
+                               free(name);
+                               LOGE("[%s] bt_adapter_set_name() failed.", __FUNCTION__);
+                               return -1;
+                       }
+               }
+               free(name);
+       }
+       else
+       {
+               LOGE("[%s] BT is not enabled.", __FUNCTION__);
+               return -1;
+       }
+       //  Set visibility as BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE
+       if(bt_adapter_get_visibility(&visibility_mode, NULL) != BT_ERROR_NONE)
+       {
+               LOGE("[%s] bt_adapter_get_visibility() failed.", __FUNCTION__);
+               return -1;
+       }
+
+       if(visibility_mode != BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE)
+       {
+               if(bt_adapter_set_visibility(BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE, 0) != BT_ERROR_NONE)
+               {
+                       LOGE("[%s] bt_adapter_set_visibility() failed.", __FUNCTION__);
+                       return -1;
+               }
+               visibility_mode = BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE;
+       }
+       else
+       {
+               LOGI("[%s] Visibility mode was already set as BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE.", __FUNCTION__);
+       }
+
+       //      Connecting socket as a server
+       if(bt_socket_create_rfcomm(my_uuid, &service_socket) != BT_ERROR_NONE)
+       {
+               LOGE("[%s] bt_socket_create_rfcomm() failed.", __FUNCTION__);
+               return -1;
+       }
+       LOGI("[%s] socket is created - %d.", __FUNCTION__, service_socket);
+
+       if(bt_socket_set_connection_state_changed_cb(bt_socket_connection_state_changed_impl, NULL) != BT_ERROR_NONE)
+       {
+               LOGE("[%s] bt_socket_set_connection_state_changed_cb() failed.", __FUNCTION__);
+               return -1;
+       }
+
+       if(bt_socket_set_data_received_cb(bt_socket_data_received_impl, NULL) != BT_ERROR_NONE)
+       {
+               LOGE("[%s] bt_socket_set_data_received_cb() failed.", __FUNCTION__);
+               return -1;
+       }
+
+       if(bt_socket_listen_and_accept_rfcomm(service_socket, 5) == BT_ERROR_NONE)
+       {
+               LOGI("[%s] bt_socket_connection_state_changed_cb will be called.", __FUNCTION__);
+               g_main_loop_run(g_mainloop);
+       }
+       else
+       {
+               LOGE("[%s] bt_socket_listen_and_accept_rfcomm() failed.", __FUNCTION__);
+               return -1;
+       }
+
+       sleep(5);       // Wait for completing delivery
+       if(bt_socket_destroy_rfcomm(service_socket) != BT_ERROR_NONE)
+       {
+               LOGE("[%s] bt_socket_destroy_rfcomm() failed.", __FUNCTION__);
+               return -1;
+       }
+       else
+       {
+               LOGE("[%s] bt_socket_destroy_rfcomm() succeeded.", __FUNCTION__);
+       }
+
+       bt_deinitialize();
+
+       LOGI("[%s] Server ends.", __FUNCTION__);
+       return 0;
+}
diff --git a/test/bt_unit_test.c b/test/bt_unit_test.c
new file mode 100644 (file)
index 0000000..e451752
--- /dev/null
@@ -0,0 +1,1201 @@
+/*
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @file       bt_unit_test.c
+ * @brief      This is the source file for capi unit test.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <glib.h>
+#include <dbus/dbus-glib.h>
+
+#include "bluetooth.h"
+#include "bluetooth-telephony-api.h"
+
+#define BUFFER_LEN 10
+#define MAX_SERVICES 10
+#define PRT(format, args...) printf("%s:%d() "format, __FUNCTION__, __LINE__, ##args)
+#define TC_PRT(format, args...) PRT(format"\n", ##args)
+
+const char *spp_uuid = "00001101-0000-1000-8000-00805F9B34FB";
+const char *opp_uuid = "00001105-0000-1000-8000-00805f9b34fb";
+
+static int server_fd;
+static int client_fd;
+
+int service_index;
+int char_service_index;
+
+bt_gatt_attribute_h service_clone[MAX_SERVICES];
+bt_gatt_attribute_h characteristics[MAX_SERVICES];
+bt_gatt_attribute_h characteristics_services[MAX_SERVICES];
+
+
+bt_call_list_h call_list;
+GMainLoop *main_loop = NULL;
+
+typedef struct {
+       const char *tc_name;
+       int tc_code;
+} tc_table_t;
+
+tc_table_t tc_table[] = {
+       /* Adapter functions */
+       {"bt_initialize"                        , 1},
+       {"bt_deinitialize"                      , 2},
+       {"bt_adapter_get_state"                 , 3},
+       {"bt_adapter_enable"                    , 4},
+       {"bt_adapter_disable"                   , 5},
+       {"bt_adapter_start_device_discovery"    , 6},
+       {"bt_adapter_stop_device_discovery"     , 7},
+       {"bt_adapter_is_discovering"            , 8},
+       {"bt_adapter_get_bonded_device_info"    , 9},
+       {"bt_adapter_is_service_used"           , 10},
+       {"bt_adapter_get_visibility"            , 11},
+       {"bt_adapter_set_device_discovery_state_changed_cb"     , 12},
+       {"bt_adapter_unset_device_discovery_state_changed_cb"   , 13},
+
+       /* Socket functions */
+       {"bt_socket_create_rfcomm"              , 50},
+       {"bt_socket_destroy_rfcomm"             , 51},
+       {"bt_socket_listen_and_accept_rfcomm"   , 52},
+       {"bt_socket_listen"                     , 53},
+       {"bt_socket_accept"                     , 54},
+       {"bt_socket_reject"                     , 55},
+       {"bt_socket_connect_rfcomm"             , 56},
+       {"bt_socket_disconnect_rfcomm"          , 57},
+       {"bt_socket_send_data"                  , 58},
+       {"bt_socket_set_data_received_cb"       , 59},
+       {"bt_socket_unset_data_received_cb"     , 60},
+       {"bt_socket_set_connection_requested_cb"        , 61},
+       {"bt_socket_unset_connection_requested_cb"      , 62},
+       {"bt_socket_set_connection_state_changed_cb"    , 63},
+       {"bt_socket_unset_connection_state_changed_cb"  , 64},
+
+       /* OPP functions */
+       {"bt_opp_client_initialize"             , 70},
+       {"bt_opp_client_deinitialize"           , 71},
+       {"bt_opp_client_add_file"               , 72},
+       {"bt_opp_client_clear_files"            , 73},
+       {"bt_opp_client_push_files"             , 74},
+       {"bt_opp_client_cancel_push"            , 75},
+
+       /* AG functions */
+       {"bt_audio_initialize"          , 80},
+       {"bt_audio_deinitialize"                , 81},
+       {"bt_audio_connect"             , 82},
+       {"bt_audio_disconnect"          , 83},
+       {"bt_audio_set_connection_state_changed_cb",            84},
+       {"bt_audio_unset_connection_state_changed_cb",  85},
+       {"bt_ag_open_sco"               , 86},
+       {"bt_ag_close_sco"              , 87},
+       {"bt_ag_is_sco_opened"  , 88},
+       {"bt_ag_set_sco_state_changed_cb"       , 89},
+       {"bt_ag_unset_sco_state_changed_cb"     , 90},
+       {"BT_AG_CALL_EVENT_IDLE"                , 91},
+       {"BT_AG_CALL_EVENT_ANSWERED"    , 92},
+       {"BT_AG_CALL_EVENT_DIALING"             , 93},
+       {"BT_AG_CALL_EVENT_ALERTING"    , 94},
+       {"BT_AG_CALL_EVENT_INCOMING"    , 95},
+       {"bt_call_list_create"                  , 96},
+       {"bt_call_list_destroy"                 , 97},
+       {"bt_call_list_reset"                   , 98},
+       {"bt_call_list_add"                             , 99},
+       {"bt_ag_notify_call_list"                       , 100},
+       {"bt_ag_set_call_handling_event_cb"     , 101},
+       {"bt_ag_is_nrec_enabled"        , 102},
+
+       /* Network functions */
+       {"bt_nap_activate"              , 110},
+       {"bt_nap_deactivate"            , 111},
+       {"bt_nap_disconnect_all"        , 112},
+
+       /* Device functions */
+       {"bt_device_set_authorization (true)"   , 120},
+       {"bt_device_set_authorization (false)"  , 121},
+       {"bt_device_set_authorization_changed_cb"       , 122},
+       {"bt_device_unset_authorization_changed_cb"     , 123},
+       {"bt_device_set_connection_state_changed_cb"    , 124},
+       {"bt_device_unset_connection_state_changed_cb"  , 125},
+       {"bt_device_foreach_connected_profiles" , 126},
+
+       /* Gatt functions */
+       {"bt_gatt_foreach_primary_services"     , 140},
+       {"bt_gatt_discover_characteristics"     , 141},
+       {"bt_gatt_get_service_uuid"             , 142},
+       {"bt_gatt_foreach_included_services"            , 143},
+       {"bt_gatt_set_characteristic_changed_cb"        , 144},
+       {"bt_gatt_unset_characteristic_changed_cb"      , 145},
+       {"bt_gatt_get_characteristic_declaration"       , 146},
+       {"bt_gatt_set_characteristic_value"     , 147},
+
+       /* AVRCP functions */
+       {"bt_avrcp_target_initialize"   , 160},
+       {"bt_avrcp_target_deinitialize" , 161},
+       {"bt_avrcp_set_equalizer_state_changed_cb"      , 162},
+       {"bt_avrcp_set_repeat_mode_changed_cb"  , 163},
+       {"bt_avrcp_set_shuffle_mode_changed_cb" , 164},
+       {"bt_avrcp_set_scan_mode_changed_cb"    , 165},
+       {"bt_avrcp_unset_equalizer_state_changed_cb"    , 166},
+       {"bt_avrcp_unset_repeat_mode_changed_cb"        , 167},
+       {"bt_avrcp_unset_shuffle_mode_changed_cb"       , 168},
+       {"bt_avrcp_unset_scan_mode_changed_cb"  , 169},
+
+       /* -----------------------------------------*/
+       {"Finish"                               , 0x00ff},
+       {NULL                                   , 0x0000},
+};
+
+void tc_usage_print(void)
+{
+       int i = 0;
+
+       while (tc_table[i].tc_name) {
+               if (tc_table[i].tc_code != 0x00ff) {
+                       TC_PRT("Key %d : usage %s", tc_table[i].tc_code,
+                                               tc_table[i].tc_name);
+               } else {
+                       TC_PRT("Key %d : usage %s\n\n", 0x00ff,
+                                               tc_table[i].tc_name);
+               }
+
+               i++;
+       }
+}
+
+static void __bt_free_gatt_services(void)
+{
+       int i;
+
+       for (i = 0; i < service_index; i++) {
+               bt_gatt_destroy_attribute_handle(service_clone[i]);
+               service_clone[i] = NULL;
+       }
+
+       service_index = 0;
+}
+
+static void __bt_free_gatt_characteristics(void)
+{
+       int i;
+
+       for (i = 0; i < MAX_SERVICES; i++) {
+               if (characteristics[i] == NULL)
+                       return;
+
+               bt_gatt_destroy_attribute_handle(characteristics[i]);
+               characteristics[i] = NULL;
+       }
+}
+
+static void __bt_free_gatt_characteristics_services(void)
+{
+       int i;
+
+       for (i = 0; i < char_service_index; i++) {
+               bt_gatt_destroy_attribute_handle(characteristics_services[i]);
+               characteristics_services[i] = NULL;
+       }
+       char_service_index = 0;
+}
+
+
+static void __bt_adapter_device_discovery_state_changed_cb(int result,
+                               bt_adapter_device_discovery_state_e discovery_state,
+                               bt_adapter_device_discovery_info_s *discovery_info,
+                               void *user_data)
+{
+       int i;
+
+       TC_PRT("discovery_state: %d", discovery_state);
+
+       if (discovery_info == NULL) {
+               TC_PRT("No discovery_info!");
+               return;
+       }
+
+       TC_PRT("remote_address: %s", discovery_info->remote_address);
+       TC_PRT("remote_name: %s", discovery_info->remote_name);
+       TC_PRT("rssi: %d", discovery_info->rssi);
+       TC_PRT("is_bonded: %d", discovery_info->is_bonded);
+       TC_PRT("service_count: %d", discovery_info->service_count);
+
+       if (discovery_info->service_uuid == NULL) {
+               TC_PRT("No uuids");
+               return;
+       }
+
+       for (i = 0; i < discovery_info->service_count; i++) {
+               TC_PRT("uuid: %s", discovery_info->service_uuid[i]);
+       }
+}
+
+static void __bt_socket_data_received_cb(bt_socket_received_data_s *data, void *user_data)
+{
+       TC_PRT("+");
+
+       if (data == NULL) {
+               TC_PRT("No recieved data!");
+               return;
+       }
+
+       TC_PRT("Socket fd: %d", data->socket_fd);
+       TC_PRT("Data: %s", data->data);
+       TC_PRT("Size: %d", data->data_size);
+}
+
+static void __bt_socket_connection_requested_cb(int socket_fd, const char *remote_address, void *user_data)
+{
+       TC_PRT("Socket fd: %d", socket_fd);
+       TC_PRT("remote_address: %s", remote_address);
+}
+
+static void __bt_socket_connection_state_changed_cb(int result,
+                               bt_socket_connection_state_e connection_state,
+                               bt_socket_connection_s *connection,
+                               void *user_data)
+{
+       TC_PRT("result: %d", result);
+       TC_PRT("connection_state: %d", connection_state);
+
+       if (connection == NULL) {
+               TC_PRT("No connection data!");
+               return;
+       }
+
+       TC_PRT("socket fd: %d", connection->socket_fd);
+       TC_PRT("role: %d", connection->local_role);
+       TC_PRT("remote address: %s", connection->remote_address);
+       TC_PRT("service_uuid: %s", connection->service_uuid);
+}
+
+void __bt_opp_client_push_responded_cb(int result,
+                                       const char *remote_address,
+                                       void *user_data)
+{
+       TC_PRT("result: %d", result);
+       TC_PRT("remote_address: %s", remote_address);
+}
+
+void __bt_opp_client_push_progress_cb(const char *file,
+                                       long long size,
+                                       int percent,
+                                       void *user_data)
+{
+       TC_PRT("size: %ld", (long)size);
+       TC_PRT("percent: %d", percent);
+       TC_PRT("file: %s", file);
+}
+
+void __bt_opp_client_push_finished_cb(int result,
+                               const char *remote_address,
+                               void *user_data)
+{
+       TC_PRT("result: %d", result);
+       TC_PRT("remote_address: %s", remote_address);
+}
+
+void __bt_audio_connection_state_changed_cb(int result,
+                                       bool connected, const char *remote_address,
+                                       bt_audio_profile_type_e type, void *user_data)
+{
+       TC_PRT("connected [%d]", connected);
+       TC_PRT("address [%s]", remote_address);
+       TC_PRT("type [%d]", type);
+}
+
+void __bt_ag_sco_state_changed_cb(int result, bool opened, void *user_data)
+{
+       TC_PRT("opened [%s]", opened ? "YES" : "NO");
+}
+
+void __bt_ag_set_call_handling_event_cb(bt_ag_call_handling_event_e event,
+                                       unsigned int call_id, void *user_data)
+{
+       TC_PRT("event[%d] call_id[%d]", event, call_id);
+}
+
+void __bt_device_authorization_changed_cb(bt_device_authorization_e authorization,
+                                               char *remote_address, void *user_data)
+{
+       TC_PRT("__bt_device_authorization_changed_cb [%d]", authorization);
+       TC_PRT("address: %s", remote_address);
+}
+
+void __bt_device_connection_state_changed_cb(bool connected,
+                                               const char *remote_address,
+                                               void *user_data)
+{
+       TC_PRT("__bt_device_authorization_changed_cb [%d]", connected);
+       TC_PRT("address: %s", remote_address);
+}
+
+bool __bt_device_connected_profile(bt_profile_e profile, void *user_data)
+{
+       TC_PRT("__bt_device_connected_profile [%d]", profile);
+       return true;
+}
+
+bool __bt_gatt_primary_service_cb(bt_gatt_attribute_h service, void *user_data)
+{
+       TC_PRT("__bt_gatt_primary_service_cb");
+       TC_PRT("service %s", (char *)service);
+       if (service_index >= MAX_SERVICES)
+               return true;
+
+       bt_gatt_clone_attribute_handle(&service_clone[service_index], service);
+       service_index++;
+       return true;
+}
+
+bool __bt_gatt_characteristics_discovered_cb(int result, int index, int total, bt_gatt_attribute_h characteristic, void *user_data)
+{
+       TC_PRT("__bt_gatt_characteristics_discovered_cb: %d", result);
+       TC_PRT("index %d", index);
+       TC_PRT("total %d", total);
+       TC_PRT("characteristic %s", (char *)characteristic);
+
+       if (index >= MAX_SERVICES)
+               return true;
+
+       bt_gatt_clone_attribute_handle(&characteristics[index], characteristic);
+       return true;
+}
+
+bool __bt_gatt_included_service_cb(bt_gatt_attribute_h service, void *user_data)
+{
+       char *uuid = NULL;
+       unsigned char *value = NULL;
+       int value_length = 0;
+
+       TC_PRT("__bt_gatt_included_service_cb");
+       TC_PRT("service %s", (char *)service);
+
+       if (char_service_index >= MAX_SERVICES)
+               return true;
+
+       bt_gatt_clone_attribute_handle(&characteristics_services[char_service_index], service);
+       char_service_index++;
+
+       bt_gatt_get_characteristic_declaration(service, &uuid, &value, &value_length);
+       TC_PRT("uuid %s", uuid);
+       return true;
+}
+
+void __bt_gatt_characteristic_changed_cb(bt_gatt_attribute_h characteristic, unsigned char *value, int value_length, void *user_data)
+{
+       int i;
+
+       TC_PRT("__bt_gatt_characteristic_changed_cb");
+       TC_PRT("service %s", (char *)characteristic);
+       TC_PRT("value_length %d", value_length);
+
+       for (i = 0; i < value_length; i++) {
+               TC_PRT("value %c", value[i]);
+       }
+
+       return;
+}
+
+void __bt_avrcp_target_connection_state_changed_cb(bool connected, const char *remote_address, void *user_data)
+{
+       TC_PRT("__bt_avrcp_target_connection_state_changed_cb");
+       TC_PRT("connected %d", connected);
+       TC_PRT("remote_address %s", remote_address);
+}
+
+void __bt_avrcp_equalizer_state_changed_cb(bt_avrcp_equalizer_state_e equalizer, void *user_data)
+{
+       TC_PRT("__bt_avrcp_equalizer_state_changed_cb");
+       TC_PRT("equalizer %d", equalizer);
+}
+
+void __bt_avrcp_repeat_mode_changed_cb(bt_avrcp_repeat_mode_e repeat, void *user_data)
+{
+       TC_PRT("__bt_avrcp_repeat_mode_changed_cb");
+       TC_PRT("repeat %d", repeat);
+}
+
+void __bt_avrcp_shuffle_mode_changed_cb(bt_avrcp_shuffle_mode_e shuffle, void *user_data)
+{
+       TC_PRT("__bt_avrcp_shuffle_mode_changed_cb");
+       TC_PRT("shuffle %d", shuffle);
+}
+
+void __bt_avrcp_scan_mode_changed_cb(bt_avrcp_scan_mode_e scan, void *user_data)
+{
+       TC_PRT("__bt_avrcp_scan_mode_changed_cb");
+       TC_PRT("equalizer %d", scan);
+}
+
+int test_input_callback(void *data)
+{
+       int ret = 0;
+       int test_id = (int)data;
+
+       switch (test_id) {
+       case 0x00ff:
+               TC_PRT("Finished");
+               g_main_loop_quit(main_loop);
+               break;
+
+       case 1:
+               ret = bt_initialize();
+               if (ret < BT_ERROR_NONE)
+                       TC_PRT("failed with [0x%04x]", ret);
+               break;
+       case 2:
+               ret = bt_deinitialize();
+               if (ret < BT_ERROR_NONE)
+                       TC_PRT("failed with [0x%04x]", ret);
+               break;
+       case 3: {
+               bt_adapter_state_e state = BT_ADAPTER_DISABLED;
+
+               ret = bt_adapter_get_state(&state);
+               if (ret < BT_ERROR_NONE)
+                       TC_PRT("failed with [0x%04x]", ret);
+
+               TC_PRT("state: %d", state);
+               break;
+       }
+       case 4:
+               ret = bt_adapter_enable();
+               if (ret < BT_ERROR_NONE)
+                       TC_PRT("failed with [0x%04x]", ret);
+               break;
+       case 5:
+               ret = bt_adapter_disable();
+               if (ret < BT_ERROR_NONE)
+                       TC_PRT("failed with [0x%04x]", ret);
+               break;
+       case 6:
+               ret = bt_adapter_start_device_discovery();
+               if (ret < BT_ERROR_NONE)
+                       TC_PRT("failed with [0x%04x]", ret);
+               break;
+       case 7:
+               ret = bt_adapter_stop_device_discovery();
+               if (ret < BT_ERROR_NONE)
+                       TC_PRT("failed with [0x%04x]", ret);
+               break;
+       case 8: {
+               bool is_discovering = FALSE;
+               ret = bt_adapter_is_discovering(&is_discovering);
+               if (ret < BT_ERROR_NONE)
+                       TC_PRT("failed with [0x%04x]", ret);
+               else
+                       TC_PRT("is_discovering: %d", is_discovering);
+
+               break;
+       }
+       case 9: {
+               char *address;
+               bt_device_info_s *device_info = NULL;
+
+               address = g_strdup("00:19:0E:01:61:17");
+
+               ret = bt_adapter_get_bonded_device_info((const char *)address,
+                                                       &device_info);
+               if (ret < BT_ERROR_NONE)
+                       TC_PRT("failed with [0x%04x]", ret);
+
+               g_free(address);
+
+               if (device_info) {
+                       TC_PRT("address: %s", device_info->remote_address);
+                       TC_PRT("name: %s", device_info->remote_name);
+               }
+
+               bt_adapter_free_device_info(device_info);
+               break;
+       }
+       case 10: {
+               bool used = FALSE;
+
+               ret = bt_adapter_is_service_used(opp_uuid, &used);
+               if (ret < BT_ERROR_NONE)
+                       TC_PRT("failed with [0x%04x]", ret);
+
+               TC_PRT("used: %d", used);
+               break;
+       }
+       case 11: {
+               bt_adapter_visibility_mode_e visibility_mode = BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE;
+               int time = 0;
+
+               ret = bt_adapter_get_visibility(&visibility_mode, &time);
+               if (ret < BT_ERROR_NONE)
+                       TC_PRT("failed with [0x%04x]", ret);
+
+               TC_PRT("mode: %d", visibility_mode);
+               TC_PRT("time: %d", time);
+               break;
+       }
+       case 12:
+               ret = bt_adapter_set_device_discovery_state_changed_cb(__bt_adapter_device_discovery_state_changed_cb, NULL);
+               if (ret < BT_ERROR_NONE)
+                       TC_PRT("failed with [0x%04x]", ret);
+               break;
+       case 13:
+               ret = bt_adapter_unset_device_discovery_state_changed_cb();
+               if (ret < BT_ERROR_NONE)
+                       TC_PRT("failed with [0x%04x]", ret);
+               break;
+
+       /* Socket functions */
+       case 50: {
+               int socket_fd = 0;
+
+               ret = bt_socket_create_rfcomm(spp_uuid, &socket_fd);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               } else {
+                       TC_PRT("socket_fd: %d", socket_fd);
+                       server_fd = socket_fd;
+               }
+               break;
+       }
+       case 51:
+               ret = bt_socket_destroy_rfcomm(server_fd);
+               if (ret < BT_ERROR_NONE)
+                       TC_PRT("failed with [0x%04x]", ret);
+               break;
+       case 52:
+               ret = bt_socket_listen_and_accept_rfcomm(server_fd, 1);
+               if (ret < BT_ERROR_NONE)
+                       TC_PRT("failed with [0x%04x]", ret);
+               break;
+       case 53:
+               ret = bt_socket_listen(server_fd, 1);
+               if (ret < BT_ERROR_NONE)
+                       TC_PRT("failed with [0x%04x]", ret);
+               break;
+       case 54: {
+               int socket_fd = 0;
+
+               ret = bt_socket_accept(server_fd, &socket_fd);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               } else {
+                       TC_PRT("socket_fd: %d", socket_fd);
+                       client_fd = socket_fd;
+               }
+               break;
+       }
+       case 55:
+               ret = bt_socket_reject(server_fd);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 56: {
+               char *address;
+
+               address = g_strdup("00:02:48:F4:3E:D2");
+
+               ret = bt_socket_connect_rfcomm(address, spp_uuid);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+
+               g_free(address);
+               break;
+       }
+       case 57:
+               ret = bt_socket_disconnect_rfcomm(client_fd);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 58:
+               ret = bt_socket_send_data(client_fd, "Sending test\0", 20);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 59:
+               ret = bt_socket_set_data_received_cb(__bt_socket_data_received_cb, NULL);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 60:
+               ret = bt_socket_unset_data_received_cb();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 61:
+               ret = bt_socket_set_connection_requested_cb(__bt_socket_connection_requested_cb, NULL);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 62:
+               ret = bt_socket_unset_connection_requested_cb();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 63:
+               ret = bt_socket_set_connection_state_changed_cb(__bt_socket_connection_state_changed_cb, NULL);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 64:
+               ret = bt_socket_unset_connection_state_changed_cb();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 70:
+               ret = bt_opp_client_initialize();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 71:
+               ret = bt_opp_client_deinitialize();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 72:
+               ret = bt_opp_client_add_file("/opt/media/Images/image1.jpg");
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 73:
+               ret = bt_opp_client_clear_files();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 74: {
+               char *address;
+
+               address = g_strdup("00:02:37:A9:17:9E");
+
+               ret = bt_opp_client_push_files(address,__bt_opp_client_push_responded_cb,
+                                       __bt_opp_client_push_progress_cb,
+                                       __bt_opp_client_push_finished_cb,
+                                       NULL);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       }
+       case 75:
+               ret = bt_opp_client_cancel_push();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+
+       case 80:
+               ret = bt_audio_initialize();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 81:
+               ret = bt_audio_deinitialize();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 82: {
+               char *address;
+               address = g_strdup("11:11:22:33:33:33");
+
+               ret = bt_audio_connect(address,  BT_AUDIO_PROFILE_TYPE_HSP_HFP);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       }
+       case 83: {
+               char *address;
+               address = g_strdup("11:11:22:33:33:33");
+
+               ret = bt_audio_disconnect(address,  BT_AUDIO_PROFILE_TYPE_HSP_HFP);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       }
+       case 84:
+               ret = bt_audio_set_connection_state_changed_cb(
+                                       __bt_audio_connection_state_changed_cb, NULL);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 85:
+               ret = bt_audio_unset_connection_state_changed_cb();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 86:
+               ret = bt_ag_open_sco();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 87:
+               ret = bt_ag_close_sco();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 88: {
+               bool opened = false;
+               ret = bt_ag_is_sco_opened(&opened);
+               TC_PRT("opend[%s]", opened ? "YES" : "NO");
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       }
+       case 89:
+               ret = bt_ag_set_sco_state_changed_cb(__bt_ag_sco_state_changed_cb, NULL);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 90:
+               ret = bt_ag_unset_sco_state_changed_cb();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 91: {
+               unsigned int call_id = 1;
+
+               ret = bt_ag_notify_call_event(BT_AG_CALL_EVENT_IDLE, call_id, NULL);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       }
+       case 92: {
+               unsigned int call_id = 1;
+               bool sco_required = true;
+
+               ret = bt_ag_notify_call_event(BT_AG_CALL_EVENT_ANSWERED, call_id, NULL);
+               if (sco_required)
+                       bt_ag_open_sco();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       }
+       case 93: {
+               unsigned int call_id = 1;
+               bool sco_required = TRUE;
+               const char *phone_number;
+
+               phone_number = g_strdup("01046500173");
+               ret = bt_ag_notify_call_event(BT_AG_CALL_EVENT_DIALING,
+                                       call_id, phone_number);
+               if (sco_required)
+                       bt_ag_open_sco();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       }
+       case 94: {
+               unsigned int call_id = 1;
+
+               ret = bt_ag_notify_call_event(BT_AG_CALL_EVENT_ALERTING,
+                                       call_id, NULL);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       }
+       case 95: {
+               unsigned int call_id = 1;
+               const char *phone_number;
+
+               phone_number = g_strdup("01046500173");
+               ret = bt_ag_notify_call_event(BT_AG_CALL_EVENT_INCOMING,
+                                       call_id, phone_number);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       }
+       case 96:
+               ret = bt_call_list_create(&call_list);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 97:
+               ret = bt_call_list_destroy(call_list);
+               call_list = NULL;
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 98:
+               ret = bt_call_list_reset(call_list);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 99:
+               ret = bt_call_list_add(call_list, 1, BT_AG_CALL_STATE_ACTIVE);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 100:
+               ret = bt_ag_notify_call_list(call_list);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 101:
+               ret = bt_ag_set_call_handling_event_cb(
+                                       __bt_ag_set_call_handling_event_cb, NULL);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 102: {
+               bool enabled = false;
+               ret = bt_ag_is_nrec_enabled(&enabled);
+               TC_PRT("opend[%s]", enabled ? "YES" : "NO");
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       }
+       case 110:
+               ret = bt_nap_activate();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+
+       case 111:
+               ret = bt_nap_deactivate();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+
+       case 112:
+               ret = bt_nap_disconnect_all();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+
+       case 120: {
+               char *address;
+
+               address = g_strdup("00:1B:66:01:23:1C");
+
+               ret = bt_device_set_authorization(address, BT_DEVICE_AUTHORIZED);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       }
+       case 121: {
+               char *address;
+
+               address = g_strdup("00:1B:66:01:23:1C");
+
+               ret = bt_device_set_authorization(address, BT_DEVICE_UNAUTHORIZED);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       }
+       case 122:
+               ret = bt_device_set_authorization_changed_cb(__bt_device_authorization_changed_cb, NULL);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+
+       case 123:
+               ret = bt_device_unset_authorization_changed_cb();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+
+       case 124:
+               ret = bt_device_set_connection_state_changed_cb(__bt_device_connection_state_changed_cb, NULL);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+
+       case 125:
+               ret = bt_device_unset_connection_state_changed_cb();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+
+       case 126: {
+               char *address;
+
+               address = g_strdup("00:1B:66:01:23:1C");
+
+               ret = bt_device_foreach_connected_profiles(address, __bt_device_connected_profile, NULL);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       }
+
+       case 140: {
+               char *address;
+
+               address = g_strdup("D5:FE:81:38:39:B9");
+
+               __bt_free_gatt_services();
+
+               ret = bt_gatt_foreach_primary_services(address, __bt_gatt_primary_service_cb, NULL);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       }
+
+       case 141: {
+               __bt_free_gatt_characteristics();
+
+               ret = bt_gatt_discover_characteristics(service_clone[1], __bt_gatt_characteristics_discovered_cb, NULL);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       }
+
+       case 142: {
+               char *uuid = NULL;
+
+               ret = bt_gatt_get_service_uuid(service_clone[1], &uuid);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               } else {
+                       TC_PRT("uuid: %s", uuid);
+                       g_free(uuid);
+               }
+               break;
+       }
+
+       case 143: {
+               __bt_free_gatt_characteristics_services();
+
+               ret = bt_gatt_foreach_included_services(service_clone[1], __bt_gatt_included_service_cb, NULL);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       }
+
+       case 144: {
+               ret = bt_gatt_set_characteristic_changed_cb(service_clone[1], __bt_gatt_characteristic_changed_cb, NULL);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       }
+
+       case 145: {
+               ret = bt_gatt_unset_characteristic_changed_cb(service_clone[1]);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       }
+
+       case 146: {
+               int i;
+               char *uuid = NULL;
+               unsigned char *value = NULL;
+               int value_length = 0;
+
+               ret = bt_gatt_get_characteristic_declaration(characteristics_services[0], &uuid, &value, &value_length);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               } else {
+                       TC_PRT("uuid: %s", uuid);
+
+                       for (i = 0; i < value_length; i++) {
+                               TC_PRT("value %c", value[i]);
+                       }
+
+                       g_free(uuid);
+                       g_free(value);
+               }
+               break;
+       }
+
+       case 147: {
+               unsigned char value[5] = { 0, 1, 2, 3, 4 };
+
+               ret = bt_gatt_set_characteristic_value(characteristics_services[0], value, 5);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       }
+
+       case 160:
+               ret = bt_avrcp_target_initialize(__bt_avrcp_target_connection_state_changed_cb, NULL);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+
+       case 161:
+               ret = bt_avrcp_target_deinitialize();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+
+       case 162:
+               ret = bt_avrcp_set_equalizer_state_changed_cb(__bt_avrcp_equalizer_state_changed_cb, NULL);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+
+       case 163:
+               ret = bt_avrcp_set_repeat_mode_changed_cb(__bt_avrcp_repeat_mode_changed_cb, NULL);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+
+       case 164:
+               ret = bt_avrcp_set_shuffle_mode_changed_cb(__bt_avrcp_shuffle_mode_changed_cb, NULL);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+
+       case 165:
+               ret = bt_avrcp_set_scan_mode_changed_cb(__bt_avrcp_scan_mode_changed_cb, NULL);
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+
+       case 166:
+               ret = bt_avrcp_unset_equalizer_state_changed_cb();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+
+       case 167:
+               ret = bt_avrcp_unset_repeat_mode_changed_cb();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+
+       case 168:
+               ret = bt_avrcp_unset_shuffle_mode_changed_cb();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+       case 169:
+               ret = bt_avrcp_unset_scan_mode_changed_cb();
+               if (ret < BT_ERROR_NONE) {
+                       TC_PRT("failed with [0x%04x]", ret);
+               }
+               break;
+
+       default:
+               break;
+       }
+
+       return 0;
+}
+
+static gboolean key_event_cb(GIOChannel *chan,
+                               GIOCondition cond,
+                               gpointer data)
+{
+       char buf[BUFFER_LEN] = { 0 };
+
+       unsigned int len = 0;
+       int test_id;
+
+       memset(buf, 0, sizeof(buf));
+
+       if (g_io_channel_read_chars(chan, buf, sizeof(buf),
+                               &len, NULL) == G_IO_STATUS_ERROR) {
+               TC_PRT("IO Channel read error");
+               return FALSE;
+       }
+
+       TC_PRT("%s", buf);
+       tc_usage_print();
+
+       test_id = atoi(buf);
+
+       if (test_id)
+               g_idle_add(test_input_callback, (void *)test_id);
+
+       return TRUE;
+}
+
+int main()
+{
+       GIOChannel *key_io;
+
+       g_type_init();
+
+       key_io = g_io_channel_unix_new(fileno(stdin));
+
+       g_io_channel_set_encoding(key_io, NULL, NULL);
+       g_io_channel_set_flags(key_io, G_IO_FLAG_NONBLOCK, NULL);
+
+       g_io_add_watch(key_io, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
+                       key_event_cb, NULL);
+
+       g_io_channel_unref(key_io);
+
+       main_loop = g_main_loop_new(NULL, FALSE);
+
+       g_main_loop_run(main_loop);
+
+       bt_deinitialize();
+
+       return 0;
+}