summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHyungKyu Song <hk76.song@samsung.com>2013-02-16 00:54:36 +0900
committerHyungKyu Song <hk76.song@samsung.com>2013-02-16 00:54:36 +0900
commit005198d696da404107874d3bcaed9204666ed790 (patch)
treea782fe818f8d5883ab2a25b35605abfd5ed881d7
parent212ceac58e2c8455482eed7e46ae688904059216 (diff)
downloadbluetooth-tizen_2.0.tar.gz
bluetooth-tizen_2.0.tar.bz2
bluetooth-tizen_2.0.zip
-rwxr-xr-xCMakeLists.txt117
-rwxr-xr-xLICENSE.APLv2.0202
-rwxr-xr-xNOTICE5
-rwxr-xr-xinc/FNetBluetooth.h67
-rwxr-xr-xinc/FNetBtBluetoothDevice.h269
-rwxr-xr-xinc/FNetBtBluetoothHealth.h226
-rwxr-xr-xinc/FNetBtBluetoothManager.h594
-rwxr-xr-xinc/FNetBtBluetoothOppClient.h179
-rwxr-xr-xinc/FNetBtBluetoothOppServer.h257
-rwxr-xr-xinc/FNetBtBluetoothSppAcceptor.h257
-rwxr-xr-xinc/FNetBtBluetoothSppInitiator.h214
-rwxr-xr-xinc/FNetBtBluetoothTypes.h630
-rwxr-xr-xinc/FNetBtIBluetoothDeviceEventListener.h206
-rwxr-xr-xinc/FNetBtIBluetoothHealthEventListener.h139
-rwxr-xr-xinc/FNetBtIBluetoothManagerEventListener.h119
-rwxr-xr-xinc/FNetBtIBluetoothOppClientEventListener.h115
-rwxr-xr-xinc/FNetBtIBluetoothOppServerEventListener.h108
-rwxr-xr-xinc/FNetBtIBluetoothSppAcceptorEventListener.h105
-rwxr-xr-xinc/FNetBtIBluetoothSppInitiatorEventListener.h96
-rw-r--r--osp-bluetooth.manifest5
-rwxr-xr-xosp-bluetooth.pc.in14
-rwxr-xr-xpackaging/osp-bluetooth.spec91
-rwxr-xr-xsrc/FNetBtBluetoothDevice.cpp469
-rw-r--r--src/FNetBtBluetoothHealth.cpp151
-rw-r--r--src/FNetBtBluetoothManager.cpp371
-rw-r--r--src/FNetBtBluetoothOppClient.cpp111
-rw-r--r--src/FNetBtBluetoothOppServer.cpp168
-rw-r--r--src/FNetBtBluetoothSppAcceptor.cpp168
-rw-r--r--src/FNetBtBluetoothSppInitiator.cpp125
-rwxr-xr-xsrc/FNetBt_BluetoothAdapterUtility.cpp911
-rw-r--r--src/FNetBt_BluetoothConnectionEvent.cpp78
-rw-r--r--src/FNetBt_BluetoothConnectionEvent.h84
-rw-r--r--src/FNetBt_BluetoothConnectionEventArg.cpp59
-rw-r--r--src/FNetBt_BluetoothConnectionEventArg.h101
-rw-r--r--src/FNetBt_BluetoothDeviceEvent.cpp124
-rw-r--r--src/FNetBt_BluetoothDeviceEvent.h84
-rwxr-xr-xsrc/FNetBt_BluetoothDeviceEventArg.cpp136
-rw-r--r--src/FNetBt_BluetoothDeviceEventArg.h170
-rwxr-xr-xsrc/FNetBt_BluetoothDeviceImpl.cpp345
-rwxr-xr-xsrc/FNetBt_BluetoothGapSystemAdapter.cpp973
-rw-r--r--src/FNetBt_BluetoothGapSystemAdapter.h323
-rwxr-xr-xsrc/FNetBt_BluetoothHdpSystemAdapter.cpp439
-rw-r--r--src/FNetBt_BluetoothHdpSystemAdapter.h164
-rw-r--r--src/FNetBt_BluetoothHealthEvent.cpp97
-rw-r--r--src/FNetBt_BluetoothHealthEvent.h85
-rwxr-xr-xsrc/FNetBt_BluetoothHealthEventArg.cpp133
-rw-r--r--src/FNetBt_BluetoothHealthEventArg.h175
-rwxr-xr-xsrc/FNetBt_BluetoothHealthImpl.cpp697
-rw-r--r--src/FNetBt_BluetoothIpcMessages.cpp44
-rwxr-xr-xsrc/FNetBt_BluetoothIpcProxy.cpp158
-rw-r--r--src/FNetBt_BluetoothIpcProxy.h77
-rw-r--r--src/FNetBt_BluetoothManagerEvent.cpp78
-rw-r--r--src/FNetBt_BluetoothManagerEvent.h83
-rw-r--r--src/FNetBt_BluetoothManagerEventArg.cpp64
-rw-r--r--src/FNetBt_BluetoothManagerEventArg.h114
-rwxr-xr-xsrc/FNetBt_BluetoothManagerImpl.cpp1841
-rw-r--r--src/FNetBt_BluetoothOppClientEvent.cpp81
-rw-r--r--src/FNetBt_BluetoothOppClientEvent.h81
-rw-r--r--src/FNetBt_BluetoothOppClientEventArg.cpp110
-rw-r--r--src/FNetBt_BluetoothOppClientEventArg.h153
-rwxr-xr-xsrc/FNetBt_BluetoothOppClientImpl.cpp583
-rw-r--r--src/FNetBt_BluetoothOppServerEvent.cpp87
-rw-r--r--src/FNetBt_BluetoothOppServerEvent.h78
-rwxr-xr-xsrc/FNetBt_BluetoothOppServerEventArg.cpp113
-rw-r--r--src/FNetBt_BluetoothOppServerEventArg.h151
-rwxr-xr-xsrc/FNetBt_BluetoothOppServerImpl.cpp663
-rwxr-xr-xsrc/FNetBt_BluetoothOppSystemAdapter.cpp380
-rw-r--r--src/FNetBt_BluetoothOppSystemAdapter.h209
-rw-r--r--src/FNetBt_BluetoothSppAcceptorEvent.cpp93
-rw-r--r--src/FNetBt_BluetoothSppAcceptorEvent.h78
-rwxr-xr-xsrc/FNetBt_BluetoothSppAcceptorEventArg.cpp102
-rw-r--r--src/FNetBt_BluetoothSppAcceptorEventArg.h137
-rwxr-xr-xsrc/FNetBt_BluetoothSppAcceptorImpl.cpp642
-rw-r--r--src/FNetBt_BluetoothSppInitiatorEvent.cpp89
-rw-r--r--src/FNetBt_BluetoothSppInitiatorEvent.h78
-rwxr-xr-xsrc/FNetBt_BluetoothSppInitiatorEventArg.cpp84
-rw-r--r--src/FNetBt_BluetoothSppInitiatorEventArg.h124
-rwxr-xr-xsrc/FNetBt_BluetoothSppInitiatorImpl.cpp608
-rwxr-xr-xsrc/FNetBt_BluetoothSppSystemAdapter.cpp528
-rw-r--r--src/FNetBt_BluetoothSppSystemAdapter.h203
-rw-r--r--src/inc/FNetBt_BluetoothAdapterUtility.h73
-rwxr-xr-xsrc/inc/FNetBt_BluetoothDeviceImpl.h318
-rw-r--r--src/inc/FNetBt_BluetoothHealthImpl.h218
-rwxr-xr-xsrc/inc/FNetBt_BluetoothManagerImpl.h529
-rw-r--r--src/inc/FNetBt_BluetoothOppClientImpl.h177
-rw-r--r--src/inc/FNetBt_BluetoothOppServerImpl.h224
-rw-r--r--src/inc/FNetBt_BluetoothSppAcceptorImpl.h212
-rw-r--r--src/inc/FNetBt_BluetoothSppInitiatorImpl.h184
-rw-r--r--src/inc/FNetBt_ConnectivityIpcMessages.h37
-rw-r--r--src/inc/FNetBt_IBluetoothConnectionEventListener.h76
-rw-r--r--src/inc/FNetBt_IBluetoothDeviceEventListener.h130
-rw-r--r--src/inc/FNetBt_IBluetoothManagerEventListener.h74
-rw-r--r--src/inc/FNetBt_IBluetoothSocketListener.h90
93 files changed, 21012 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100755
index 0000000..6818a4d
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,117 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+
+SET (this_target osp-bluetooth)
+
+SET(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/cmake_build_tmp/output)
+
+INCLUDE_DIRECTORIES(
+ inc
+ src
+ src/inc
+ /usr/include/chromium
+ /usr/include/glib-2.0
+ /usr/lib/glib-2.0/include
+ /usr/include/system
+ /usr/include/network
+ /usr/include/osp
+ /usr/include/osp/app
+ /usr/include/osp/base
+ /usr/include/osp/io
+ /usr/include/osp/net
+ /usr/include/osp/security
+ /usr/include/osp/system
+)
+
+SET (${this_target}_SOURCE_FILES
+ src/FNetBtBluetoothDevice.cpp
+ src/FNetBtBluetoothManager.cpp
+ src/FNetBtBluetoothOppClient.cpp
+ src/FNetBtBluetoothOppServer.cpp
+ src/FNetBtBluetoothSppInitiator.cpp
+ src/FNetBtBluetoothSppAcceptor.cpp
+ src/FNetBtBluetoothSppInitiator.cpp
+ src/FNetBtBluetoothHealth.cpp
+ src/FNetBt_BluetoothAdapterUtility.cpp
+ src/FNetBt_BluetoothConnectionEvent.cpp
+ src/FNetBt_BluetoothConnectionEventArg.cpp
+ src/FNetBt_BluetoothDeviceEvent.cpp
+ src/FNetBt_BluetoothDeviceEventArg.cpp
+ src/FNetBt_BluetoothDeviceImpl.cpp
+ src/FNetBt_BluetoothGapSystemAdapter.cpp
+ src/FNetBt_BluetoothHealthEvent.cpp
+ src/FNetBt_BluetoothHealthEventArg.cpp
+ src/FNetBt_BluetoothHealthImpl.cpp
+ src/FNetBt_BluetoothHdpSystemAdapter.cpp
+ src/FNetBt_BluetoothIpcMessages.cpp
+ src/FNetBt_BluetoothIpcProxy.cpp
+ src/FNetBt_BluetoothManagerEvent.cpp
+ src/FNetBt_BluetoothManagerEventArg.cpp
+ src/FNetBt_BluetoothManagerImpl.cpp
+ src/FNetBt_BluetoothOppClientEvent.cpp
+ src/FNetBt_BluetoothOppClientEventArg.cpp
+ src/FNetBt_BluetoothOppClientImpl.cpp
+ src/FNetBt_BluetoothOppServerEvent.cpp
+ src/FNetBt_BluetoothOppServerEventArg.cpp
+ src/FNetBt_BluetoothOppServerImpl.cpp
+ src/FNetBt_BluetoothOppSystemAdapter.cpp
+ src/FNetBt_BluetoothSppAcceptorEvent.cpp
+ src/FNetBt_BluetoothSppAcceptorEventArg.cpp
+ src/FNetBt_BluetoothSppAcceptorImpl.cpp
+ src/FNetBt_BluetoothSppInitiatorEvent.cpp
+ src/FNetBt_BluetoothSppInitiatorEventArg.cpp
+ src/FNetBt_BluetoothSppInitiatorImpl.cpp
+ src/FNetBt_BluetoothSppSystemAdapter.cpp
+ )
+
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Wall" )
+
+## SET C COMPILER FLAGS
+SET(CMAKE_C_FLAGS "${OSP_DEBUG_FLAGS} ${OSP_OPT_FLAGS} ${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} ${OSP_COMPILER_FLAGS}")
+
+## SET CPP COMPILER FLAGS
+SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
+SET(CMAKE_CXX_FLAGS "${OSP_DEBUG_FLAGS} ${OSP_OPT_FLAGS} ${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} ${OSP_COMPILER_FLAGS}")
+
+## Create Library
+ADD_LIBRARY (${this_target} SHARED ${${this_target}_SOURCE_FILES})
+
+## SET LINKER FLAGS
+SET(CMAKE_SHARED_LINKER_FLAGS -Wl,--no-undefined)
+
+TARGET_LINK_LIBRARIES(${this_target} "-lchromium" )
+TARGET_LINK_LIBRARIES(${this_target} "-lpthread" )
+TARGET_LINK_LIBRARIES(${this_target} "-L/usr/lib/osp -losp-appfw -losp-net" )
+TARGET_LINK_LIBRARIES(${this_target} "-lcapi-network-bluetooth" )
+
+SET_TARGET_PROPERTIES(${this_target}
+ PROPERTIES
+ VERSION ${FULLVER}
+ SOVERSION ${MAJORVER}
+ CLEAN_DIRECT_OUTPUT 1
+ )
+
+ADD_CUSTOM_COMMAND(TARGET ${this_target}
+ POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy ${LIBRARY_OUTPUT_PATH}/${CMAKE_SHARED_LIBRARY_PREFIX}${this_target}${CMAKE_SHARED_LIBRARY_SUFFIX} ${LIBRARY_OUTPUT_PATH}/debug/${CMAKE_SHARED_LIBRARY_PREFIX}${this_target}${CMAKE_SHARED_LIBRARY_SUFFIX}.${FULLVER}
+ COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_SHARED_LIBRARY_PREFIX}${this_target}${CMAKE_SHARED_LIBRARY_SUFFIX}.${FULLVER} ${LIBRARY_OUTPUT_PATH}/debug/${CMAKE_SHARED_LIBRARY_PREFIX}${this_target}${CMAKE_SHARED_LIBRARY_SUFFIX}.${MAJORVER}
+ COMMAND ${CMAKE_STRIP} --strip-unneeded ${LIBRARY_OUTPUT_PATH}/${CMAKE_SHARED_LIBRARY_PREFIX}${this_target}${CMAKE_SHARED_LIBRARY_SUFFIX}
+ COMMENT "strip ${this_target}"
+ )
+
+INSTALL(DIRECTORY ${LIBRARY_OUTPUT_PATH}/ DESTINATION lib/osp
+ FILES_MATCHING PATTERN "*.so*"
+ PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
+ GROUP_EXECUTE GROUP_READ
+ WORLD_EXECUTE WORLD_READ)
+INSTALL(DIRECTORY ${LIBRARY_OUTPUT_PATH}/debug/ DESTINATION lib/osp/debug
+ FILES_MATCHING PATTERN "*.so*"
+ PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
+ GROUP_EXECUTE GROUP_READ
+ WORLD_EXECUTE WORLD_READ)
+
+INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/inc/ DESTINATION include/osp FILES_MATCHING PATTERN "*.h")
+INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/src/inc/ DESTINATION include/osp/net FILES_MATCHING PATTERN "*.h")
+
+# pkgconfig file
+CONFIGURE_FILE(${this_target}.pc.in ${CMAKE_SOURCE_DIR}/${this_target}.pc @ONLY)
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/${this_target}.pc DESTINATION lib/pkgconfig) \ No newline at end of file
diff --git a/LICENSE.APLv2.0 b/LICENSE.APLv2.0
new file mode 100755
index 0000000..d645695
--- /dev/null
+++ b/LICENSE.APLv2.0
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
diff --git a/NOTICE b/NOTICE
new file mode 100755
index 0000000..4443889
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,5 @@
+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 file for Apache License terms and conditions.
+
+
diff --git a/inc/FNetBluetooth.h b/inc/FNetBluetooth.h
new file mode 100755
index 0000000..afaf686
--- /dev/null
+++ b/inc/FNetBluetooth.h
@@ -0,0 +1,67 @@
+//
+// Open Service Platform
+// 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 FNetBluetooth.h
+ * @brief This is the header file for the %Bluetooth namespace.
+ *
+ * This header file contains the declarations and descriptions of the %Tizen::Net::Bluetooth namespace.
+ */
+#ifndef _FNET_BLUETOOTH_H_
+#define _FNET_BLUETOOTH_H_
+
+#include <FNetBtBluetoothTypes.h>
+#include <FNetBtBluetoothDevice.h>
+#include <FNetBtBluetoothManager.h>
+#include <FNetBtIBluetoothDeviceEventListener.h>
+#include <FNetBtIBluetoothManagerEventListener.h>
+#include <FNetBtBluetoothOppServer.h>
+#include <FNetBtIBluetoothOppServerEventListener.h>
+#include <FNetBtBluetoothOppClient.h>
+#include <FNetBtIBluetoothOppClientEventListener.h>
+#include <FNetBtBluetoothSppAcceptor.h>
+#include <FNetBtIBluetoothSppAcceptorEventListener.h>
+#include <FNetBtBluetoothSppInitiator.h>
+#include <FNetBtIBluetoothSppInitiatorEventListener.h>
+#include <FNetBtBluetoothHealth.h>
+#include <FNetBtIBluetoothHealthEventListener.h>
+
+namespace Tizen { namespace Net
+{
+/**
+ * @namespace Tizen::Net::Bluetooth
+ * @brief This namespace contains the classes and interfaces for %Bluetooth services.
+ * @since 2.0
+ *
+ * @remarks @b Header @b %file: @b \#include @b <FNet.h> @n
+ * @b Library : @b osp-bluetooth @n
+ *
+ * The %Bluetooth namespace contains the classes and interfaces for %Bluetooth services that provide the mechanisms for
+ * peer-to-peer communication involving connecting, sending, and receiving data over a %Bluetooth connection. It
+ * consists of the submodules that support different profiles such as GAP, OPP, and SPP.
+ * @n
+ * For more information on the %Bluetooth namespace features, see
+ * <a href="../org.tizen.native.appprogramming/html/guide/net/bluetooth_namespace.htm">Bluetooth Guide</a>.
+ *
+ * The following diagram illustrates the relationships between the classes within the %Bluetooth namespace.
+ * @image html net_bluetooth_using_the_apis_classdiagram.png
+ *
+ */
+namespace Bluetooth
+{
+} } } // Tizen::Net::Bluetooth
+#endif // _FNET_BLUETOOTH_H_
diff --git a/inc/FNetBtBluetoothDevice.h b/inc/FNetBtBluetoothDevice.h
new file mode 100755
index 0000000..5448190
--- /dev/null
+++ b/inc/FNetBtBluetoothDevice.h
@@ -0,0 +1,269 @@
+//
+// Open Service Platform
+// 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 FNetBtBluetoothDevice.h
+ * @brief This is the header file for the %BluetoothDevice class.
+ *
+ * This header file contains the declarations of the %BluetoothDevice class.
+ */
+#ifndef _FNET_BT_BLUETOOTH_DEVICE_H_
+#define _FNET_BT_BLUETOOTH_DEVICE_H_
+
+#include <FNetBtBluetoothTypes.h>
+#include <FBaseResult.h>
+#include <FBaseObject.h>
+
+// forward declarations
+namespace Tizen { namespace Base
+{
+class ByteBuffer;
+class String;
+namespace Collection
+{
+class IList;
+}
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// forward declarations
+class _BluetoothDeviceImpl;
+
+/**
+ * @class BluetoothDevice
+ * @brief This class provides information about a remote %Bluetooth device.
+ * @since 2.0
+ *
+ * The %BluetoothDevice class provides information about a remote %Bluetooth device.
+ *
+ * For more information on the class features, see
+ * <a href="../org.tizen.native.appprogramming/html/guide/net/bluetooth_namespace.htm">Bluetooth Guide</a>.
+ */
+class _OSP_EXPORT_ BluetoothDevice
+ : public Tizen::Base::Object
+{
+public:
+ /**
+ * This is the default constructor for this class.
+ *
+ * @since 2.0
+ */
+ BluetoothDevice(void);
+
+ /**
+ * @if OSPDEPREC
+ * Initializes an instance of %BluetoothDevice with the specified parameters.
+ *
+ * @brief <i> [Deprecated] </i>
+ * @deprecated This constructor is deprecated because most of the information is generated internally.
+ * Therefore, creating a %BluetoothDevice instance directly by the application is not recommended.
+ * Instead of using this method for copying an instance, the copy constructor is recommended.
+ * @since 2.0
+ *
+ * @param[in] address The %Bluetooth device address
+ * @param[in] deviceName The name of the device
+ * @param[in] majorClassType The major class type of a %Bluetooth device
+ * @param[in] minorClassType The minor class type of a %Bluetooth device
+ * @param[in] serviceClassList The service class type list
+ * @param[in] serviceList The service type list
+ * @remarks The @c serviceClassList parameter consists of Bluetooth::BluetoothServiceClassType values, which are
+ * joined by the logical OR operator. @n
+ * The @c serviceList parameter consists of Bluetooth::BluetoothServiceType values which are joined by the
+ * logical OR operator.
+ * @endif
+ */
+ BluetoothDevice(const Tizen::Base::ByteBuffer& address, const Tizen::Base::String& deviceName, BluetoothMajorDeviceClassType majorClassType, BluetoothMinorDeviceClassType minorClassType, unsigned long serviceClassList, unsigned long serviceList);
+
+ /**
+ * Copying of objects using this copy constructor is allowed.
+ *
+ * @since 2.0
+ *
+ * @param[in] value An instance of %BluetoothDevice
+ */
+ BluetoothDevice(const BluetoothDevice& value);
+
+ /**
+ * This destructor overrides Tizen::Base::Object::~Object().
+ *
+ * @since 2.0
+ */
+ virtual ~BluetoothDevice(void);
+
+ /**
+ * Gets the address of a %Bluetooth device which consists of 6 bytes.
+ *
+ * @since 2.0
+ *
+ * @return The address of a %Bluetooth device
+ */
+ const Tizen::Base::ByteBuffer* GetAddress(void) const;
+
+ /**
+ * Sets the address of a %Bluetooth device.
+ *
+ * @since 2.0
+ *
+ * @return An error code
+ * @param[in] address An address of the %Bluetooth device
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_ARG The specified address is invalid @n
+ * The size of the address should be 6 bytes.
+ * @remarks @c address must have 6 byte data (remaining elements). @n
+ * Setting the address of the %BluetoothDevice instance which is obtained from the paired list does not
+ * affect the information of the paired list in the system.
+ */
+ result SetAddress(const Tizen::Base::ByteBuffer& address);
+
+ /**
+ * Gets the %Bluetooth device name.
+ *
+ * @since 2.0
+ *
+ * @return The %Bluetooth device name
+ */
+ Tizen::Base::String GetName(void) const;
+
+ /**
+ * Checks whether this device is paired with the local device.
+ *
+ * @since 2.0
+ *
+ * @return @c true if this device is paired with the local device, @n
+ * else @c false
+ */
+ bool IsPaired(void) const;
+
+ /**
+ * Gets the Received Signal Strength Indication (RSSI) value of a device at the time of device discovery (scan).
+ *
+ * @since 2.0
+ *
+ * @return The RSSI value in dBm
+ */
+ int GetRssi(void) const;
+
+ /**
+ * Gets the major device class.
+ *
+ * @since 2.0
+ *
+ * @return The major device class
+ */
+ BluetoothMajorDeviceClassType GetMajorDeviceClassType(void) const;
+
+ /**
+ * Gets the minor device class.
+ *
+ * @since 2.0
+ *
+ * @return The minor device class
+ */
+ BluetoothMinorDeviceClassType GetMinorDeviceClassType(void) const;
+
+ /**
+ * Gets the service class of the %Bluetooth device. @n
+ * This service class list consists of Bluetooth::BluetoothServiceClassType values, which are joined by the logical OR
+ * operator.
+ *
+ * @since 2.0
+ *
+ * @return The service class of the device
+ * @remarks This operation is not supported in the local device acquired by BluetoothManager::GetLocalDevice().
+ */
+ unsigned long GetServiceClassList(void) const;
+
+ /**
+ * Gets the %Bluetooth device service list. @n
+ * This service list consists of Bluetooth::BluetoothServiceType values, which are joined by the logical OR operator.
+ *
+ * @since 2.0
+ *
+ * @return The %Bluetooth device service list
+ * @remarks This operation is not supported in the local device acquired by BluetoothManager::GetLocalDevice().
+ */
+ unsigned long GetServiceList(void) const;
+
+ /**
+ * Gets the %Bluetooth device service UUID list. @n
+ * This service list consists of Tizen::Base::UuId instances that represent service UUIDs that the device supports.
+ *
+ * @since 2.0
+ *
+ * @return The %Bluetooth device service UUID list
+ * @remarks This operation returns @c null, if it is called in the local device acquired by
+ * BluetoothManager::GetLocalDevice().
+ */
+ const Tizen::Base::Collection::IList* GetServiceUuidList(void) const;
+
+ /**
+ * Compares the calling instance with the specified instance.
+ *
+ * @since 2.0
+ * @return @c true if both the instances are equal, @n
+ * else @c false
+ * @param[in] obj The object to compare
+ */
+ virtual bool Equals(const Tizen::Base::Object& obj) const;
+
+ /**
+ * Gets the hash value of the current instance.
+ *
+ * @since 2.0
+ *
+ * @return The hash value of the current instance
+ */
+ virtual int GetHashCode(void) const;
+
+ /**
+ * Gets a new instance of %BluetoothDevice generated using the result of the %Bluetooth AppControl.
+ *
+ * @since 2.0
+ * @return The %Bluetooth device containing the specified information extracted from the input data if successful,
+ * @n
+ * else @c null
+ * @param[in] appControlResult The data list, which is the result of the %Bluetooth AppControl
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_ARG The specified @c appControlResult contains an invalid value. @n
+ * The result of %Bluetooth AppControl is only permitted to be used as an input
+ * argument.
+ * @exception E_OUT_OF_MEMORY The memory is insufficient.
+ * @remarks The specific error code can be accessed using the GetLastResult() method.
+ */
+ static BluetoothDevice* GetInstanceFromAppControlResultN(const Tizen::Base::Collection::IList& appControlResult);
+
+ /**
+ * Copying of objects using this copy assignment operator is allowed.
+ *
+ * @since 2.0
+ *
+ * @return A reference to the %BluetoothDevice instance
+ * @param[in] rhs A reference to the %BluetoothDevice instance to copy
+ */
+ BluetoothDevice& operator =(const BluetoothDevice& rhs);
+
+private:
+ _BluetoothDeviceImpl* __pImpl;
+
+ friend class _BluetoothDeviceImpl;
+
+}; // BluetoothDevice
+
+} } }
+#endif // _FNET_BT_BLUETOOTH_DEVICE_H_
diff --git a/inc/FNetBtBluetoothHealth.h b/inc/FNetBtBluetoothHealth.h
new file mode 100755
index 0000000..838d4bc
--- /dev/null
+++ b/inc/FNetBtBluetoothHealth.h
@@ -0,0 +1,226 @@
+//
+// Open Service Platform
+// 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 FNetBtBluetoothHealth.h
+ * @brief This is the header file for the %BluetoothHealth class.
+ *
+ * This header file contains the declarations of the %BluetoothHealth class.
+ */
+#ifndef _FNET_BT_BLUETOOTH_HEALTH_H_
+#define _FNET_BT_BLUETOOTH_HEALTH_H_
+
+#include <FBaseObject.h>
+#include <FBaseResult.h>
+#include <FNetBtBluetoothTypes.h>
+
+namespace Tizen { namespace Base
+{
+class ByteBuffer;
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+class BluetoothDevice;
+class IBluetoothHealthEventListener;
+class _BluetoothHealthImpl;
+
+/**
+ * @class BluetoothHealth
+ * @brief This class provides the methods to handle the %Bluetooth Health Device Profile (HDP), such as the
+ * establishing a connection and exchanging data through the data channel.
+ * @since 2.0
+ *
+ * @final This class is not intended for extension.
+ *
+ * This %BluetoothHealth class provides the methods to handle the %Bluetooth Health Device Profile (HDP), which is a
+ * profile that defines the requirements for qualified %Bluetooth healthcare and fitness (referred to as 'health')
+ * device implementations. @n
+ * This class allows Sink device such as mobile phone to establish a connection and exchange data to Source devices
+ * such as blood pressure monitors, weight scales, glucose meters, thermometers, and pulse oximeters.
+ *
+ * For more information on the class features, see
+ * <a href="../org.tizen.native.appprogramming/html/guide/net/bluetooth_namespace.htm">Bluetooth Guide</a>.
+ */
+class _OSP_EXPORT_ BluetoothHealth
+ : public Tizen::Base::Object
+{
+public:
+ /**
+ * The object is not fully constructed after this constructor is called. For full construction, the Construct()
+ * method must be called right after calling this constructor.
+ *
+ * @since 2.0
+ */
+ BluetoothHealth(void);
+
+ /**
+ * This destructor overrides Tizen::Base::Object::~Object().
+ *
+ * @since 2.0
+ */
+ virtual ~BluetoothHealth(void);
+
+ /**
+ * Constructs an instance of %BluetoothHealth with the specified listener.
+ *
+ * @since 2.0
+ *
+ * @return An error code
+ * @param[in] listener The event listener for the %BluetoothHealth. @n
+ * Listener must be allocated at heap, not stack.
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_MEMORY The memory is insufficient.
+ * @exception E_UNSUPPORTED_OPERATION The device does not support the %Bluetooth feature.
+ * @exception E_OPERATION_FAILED The method has failed.
+ */
+ result Construct(IBluetoothHealthEventListener& listener);
+
+ /**
+ * Starts %Bluetooth health as a role of sink with the specified data type.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.health
+ *
+ * @return An error code
+ * @param[in] dataType The type of data used in communication which is defined in ISO/IEEE
+ * 11073-20601 and represents type of health device such as thermometer,
+ * heart rate monitor, weight scale, and so on
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE %Bluetooth is not activated.
+ * @exception E_IN_PROGRESS The sink role with the specified data type has already started.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the sink role already started with another data type.
+ * @exception E_SERVICE_UNAVAILABLE The sink role with the specified data type is currently busy with another
+ * instance or application.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_OPERATION_FAILED The method has failed.
+ * @remarks One %BluetoothHealth instance supports only a sink role with the specific data type at one time and
+ * only one sink role for the specific data type can be enabled system-widely. For providing sink
+ * roles with various data types, make multiple %BluetoothHealth instances with different data types.
+ */
+ result StartAsSink(int dataType);
+
+ /**
+ * Stops %Bluetooth health as a role of sink. @n
+ * This method disconnects all established channels before stop.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.health
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE %Bluetooth is not activated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the sink role is not started yet.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_OPERATION_FAILED The method has failed.
+ */
+ result Stop(void);
+
+ /**
+ * Connects to a new channel with a remote health device which has source role. @n
+ * This method establishes a channel after the source device accepts the request.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.health
+ *
+ * @return An error code
+ * @param[in] remoteDevice The remote device to connect
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE %Bluetooth is not activated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the sink role is not started yet.
+ * @exception E_DEVICE_BUSY The pairing and connection process is in progress.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_OPERATION_FAILED The method has failed.
+ * @see IBluetoothHealthEventListener::OnHealthConnected()
+ * @remarks If the local device is not paired with the specified target device, the pairing process starts
+ * internally before the connect request is sent.
+ */
+ result ConnectToSource(const BluetoothDevice& remoteDevice);
+
+ /**
+ * Disconnects the connection which has the specified channel ID. @n
+ * After calling this method, the IBluetoothHealthEventListener::OnHealthDisconnected() is called regardless of
+ * whether this method is called during connection or before connection is established.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.health
+ *
+ * @return An error code
+ * @param[in] channelId The ID of the specified channel to disconnect
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE %Bluetooth is not activated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, there is no connection with the specified channel ID.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_OPERATION_FAILED The method has failed.
+ * @see IBluetoothHealthEventListener::OnHealthDisconnected()
+ * @remarks @c channelId value can be obtained by IBluetoothHealthEventListener::OnHealthConnected() after the
+ * specific channel is established.
+ */
+ result Disconnect(int channelId);
+
+ /**
+ * Sends the specified data on the specified channel.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.health
+ *
+ * @return An error code
+ * @param[in] channelId The ID of the specified channel on which the data is sent
+ * @param[in] buffer The data to send
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE %Bluetooth is not activated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, there is no connection with the specified channel ID.
+ * @exception E_INVALID_ARG The input buffer has no data.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_OPERATION_FAILED The operation has failed.
+ * @see IBluetoothHealthEventListener::OnHealthDataReceived()
+ * @remarks @c channelId value can be obtained by IBluetoothHealthEventListener::OnHealthConnected() after the
+ * specific channel is established.
+ */
+ result SendData(int channelId, const Tizen::Base::ByteBuffer& buffer);
+
+private:
+ //
+ // The implementation of this copy constructor is intentionally blank and declared as private to prohibit copying
+ // of objects.
+ //
+ BluetoothHealth(const BluetoothHealth& value);
+
+ //
+ // The implementation of this copy assignment operator is intentionally blank and declared as private to prohibit
+ // copying of objects.
+ //
+ BluetoothHealth& operator =(const BluetoothHealth& rhs);
+
+private:
+ _BluetoothHealthImpl* __pImpl;
+
+}; // BluetoothHealth
+
+} } }
+#endif // _FNET_BT_BLUETOOTH_HEALTH_H_
diff --git a/inc/FNetBtBluetoothManager.h b/inc/FNetBtBluetoothManager.h
new file mode 100755
index 0000000..0e78d3c
--- /dev/null
+++ b/inc/FNetBtBluetoothManager.h
@@ -0,0 +1,594 @@
+//
+// Open Service Platform
+// 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 FNetBtBluetoothManager.h
+ * @brief This is the header file for the %BluetoothManager class.
+ *
+ * This header file contains the declarations of the %BluetoothManager class.
+ */
+#ifndef _FNET_BT_BLUETOOTH_MANAGER_H_
+#define _FNET_BT_BLUETOOTH_MANAGER_H_
+
+#include <FBaseObject.h>
+#include <FBaseResult.h>
+#include <FNetBtBluetoothTypes.h>
+
+namespace Tizen { namespace Base
+{
+class String;
+class ByteBuffer;
+namespace Collection
+{
+class IList;
+}
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// forward declarations
+class BluetoothDevice;
+class IBluetoothManagerEventListener;
+class IBluetoothDeviceEventListener;
+class _BluetoothManagerImpl;
+
+/**
+ * @class BluetoothManager
+ * @brief This class is used to obtain information about the local device or the paired devices, and to configure
+ * the %Bluetooth stack.
+ * @since 2.0
+ *
+ * The %BluetoothManager class is used to obtain information about the local device or the paired devices and to configure the
+ * %Bluetooth stack.
+ *
+ * For more information on the class features, see
+ * <a href="../org.tizen.native.appprogramming/html/guide/net/bluetooth_namespace.htm">Bluetooth Guide</a>.
+ */
+class _OSP_EXPORT_ BluetoothManager
+ : public Tizen::Base::Object
+{
+public:
+ /**
+ * The object is not fully constructed after this constructor is called. For full construction, the Construct()
+ * method must be called right after calling this constructor.
+ *
+ * @since 2.0
+ */
+ BluetoothManager(void);
+
+ /**
+ * This destructor overrides Tizen::Base::Object::~Object().
+ *
+ * @since 2.0
+ */
+ virtual ~BluetoothManager(void);
+
+ /**
+ * Constructs and initializes an instance of the %BluetoothManager class with the specified listener.
+ *
+ * @since 2.0
+ *
+ * @return An error code
+ * @param[in] listener The listener to handle the %BluetoothManager event
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_MEMORY The memory is insufficient.
+ * @exception E_UNSUPPORTED_OPERATION This operation is not supported.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ result Construct(IBluetoothManagerEventListener& listener);
+
+ /**
+ * Activates %Bluetooth on a device.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.admin
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_IN_PROGRESS The %Bluetooth activation process is in progress.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the
+ * specified operation. @n
+ * For example, %Bluetooth is already activated.
+ * @exception E_OUT_OF_MEMORY The memory is insufficient.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_SYSTEM A system error has occurred.
+ * @see IBluetoothManagerEventListener::OnBluetoothActivated()
+ */
+ result Activate(void);
+
+ /**
+ * Deactivates %Bluetooth on a device.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.admin
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_IN_PROGRESS The %Bluetooth deactivation process is in progress.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the
+ * specified operation. @n
+ * For example, the %Bluetooth is already deactivated.
+ * @exception E_OUT_OF_MEMORY The memory is insufficient.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_SYSTEM A system error has occurred.
+ * @see IBluetoothManagerEventListener::OnBluetoothDeactivated()
+ */
+ result Deactivate(void);
+
+ /**
+ * @if OSPDEPREC
+ * Checks whether a %Bluetooth-specific profile is available.
+ *
+ * @brief <i> [Deprecated] </i>
+ * @deprecated This method is deprecated because multiple clients as well as multiple SPP servers with unique
+ * service UUIDs are supported. In case of OPP server, invoke
+ * BluetoothOppServer::StartService() directly without checking OPP server's availability.
+ * If a new OPP server is not available, the method returns the E_SERVICE_UNAVAILABLE exception.
+ * @since 2.0
+ *
+ * @return @c true if the specified type of connection is available, @n
+ * else @c false
+ * @param[in] type The connection type
+ *
+ * @endif
+ */
+ bool IsAvailable(BluetoothConnectionType type) const;
+
+ /**
+ * @if OSPDEPREC
+ * Gets the local device information.
+ *
+ * @brief <i> [Deprecated] </i>
+ * @deprecated This method is deprecated because the return value of this method is a dangling pointer if this
+ * instance of %BluetoothManager is deleted. In addition to this, the %BluetoothDevice class
+ * represents only remote devices since 2.0. Instead of using this method, the GetLocalDeviceAddress()
+ * and GetLocalDeviceName() methods are recommended.
+ * @since 2.0
+ *
+ * @return The local device information
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_MEMORY The memory is insufficient.
+ * @exception E_SYSTEM A system error has occurred.
+ * @remarks The specific error code can be accessed using the GetLastResult() method.
+ * @endif
+ */
+ const BluetoothDevice* GetLocalDevice(void) const;
+
+ /**
+ * Gets the local %Bluetooth device address.
+ *
+ * @since 2.0
+ *
+ * @return The local %Bluetooth device address
+ * @remarks The address is expressed as a @c 6 byte hexadecimal value delimited by colons. @n
+ * For example, "00:3D:47:EF:8A:03".
+ */
+ Tizen::Base::String GetLocalDeviceAddress(void) const;
+
+ /**
+ * Gets the local %Bluetooth device name.
+ *
+ * @since 2.0
+ *
+ * @return The local %Bluetooth device name
+ */
+ Tizen::Base::String GetLocalDeviceName(void) const;
+
+ /**
+ * @if OSPDEPREC
+ * Gets the operational mode of the %Bluetooth unit.
+ *
+ * @brief <i> [Deprecated] </i>
+ * @deprecated %BluetoothDeviceStateType is deprecated. Therefore, this method is also deprecated, because the
+ * return value of this method is of type %BluetoothDeviceStateType. Instead of using this method, the
+ * IsActivated() and GetDiscoverableMode() methods are recommended.
+ *
+ * @since 2.0
+ *
+ * @return The operational mode
+ * @endif
+ */
+ BluetoothDeviceStateType GetLocalDeviceState(void) const;
+
+ /**
+ * Checks whether the local %Bluetooth is activated.
+ *
+ * @since 2.0
+ *
+ * @return @c true if the local %Bluetooth is activated, @n
+ * else @c false
+ */
+ bool IsActivated(void) const;
+
+ /**
+ * Gets the discoverable mode of the local device.
+ *
+ * @if OSPCOMPAT
+ * @brief <i> [Compatibility] </i>
+ * @endif
+ * @since 2.0
+ * @if OSPCOMPAT
+ * @compatibility This method has compatibility issues@n
+ * For more information, see @ref BluetoothManagerGetDiscoverableModePage "here".
+ *
+ * @endif
+ * @return The discoverable mode of the local device
+ */
+ BluetoothDiscoverableMode GetDiscoverableMode(void) const;
+
+ /**
+ * @if OSPCOMPAT
+ * @page BluetoothManagerGetDiscoverableModePage Compatibility for GetDiscoverableMode()
+ *
+ * @section BluetoothManagerGetDiscoverableModePageIssueSection Issues
+ * Implementation of this method in API versions prior to 2.0 has the following issue: @n
+ *
+ * -# The always discoverable mode and the discoverable mode with a certain amount of time cannot be
+ * differentiated. BT_DISC_MODE_DISCOVERABLE of BluetoothDiscoverableMode means both.
+ *
+ * @section BluetoothManagerGetDiscoverableModePageSolutionSection Resolutions
+ * The issue mentioned above is resolved in API version 2.0, and it is recommended to use API version
+ * 3.0 or above. @n
+ *
+ * -# The new element, BT_DISC_MODE_TIME_LIMITED_DISCOVERABLE, is added into BluetoothDiscoverableMode
+ * in API version 2.0, Therefore, BT_DISC_MODE_DISCOVERABLE means the always discoverable mode and
+ * BT_DISC_MODE_TIME_LIMITED_DISCOVERABLE means the discoverable mode with a certain amount of time.
+ * @endif
+ */
+
+ /**
+ * Gets the remaining time, in seconds, until the discoverable mode is changed from
+ * @c BT_DISC_MODE_TIME_LIMITED_DISCOVERABLE to be @c BT_DISC_MODE_NOT_DISCOVERABLE. @n
+ * This method is valid only if the current discoverable mode is @c BT_DISC_MODE_TIME_LIMITED_DISCOVERABLE.
+ *
+ * @since 2.0
+ *
+ * @return The remaining time, in seconds, until the local device to be not discoverable.
+ * @remarks 0 will be returned if the current discoverable mode is not @c BT_DISC_MODE_TIME_LIMITED_DISCOVERABLE.
+ */
+ int GetRemainingTimeAsDiscoverable(void) const;
+
+ /**
+ * Checks whether the device discovery is in progress.
+ *
+ * @since 2.0
+ *
+ * @return @c true if the device discovery is in progress, @n
+ * else @c false
+ */
+ bool IsDiscoveryInProgress(void) const;
+
+ /**
+ * Sets the name of the local device.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.admin
+ *
+ * @return An error code
+ * @param[in] deviceName The new device name
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_ARG The specified device name is an empty string.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_SYSTEM A system error has occurred.
+ * @remarks This method does not affect the system settings. The device name is only valid while an application
+ * is active. The searching device detects the local devices in close proximity based on the specified
+ * device name. The specified device name is automatically truncated if its size is greater than @c 64
+ * bytes.
+ */
+ result SetLocalDeviceName(const Tizen::Base::String& deviceName);
+
+ /**
+ * @if VISPARTNER-MANUFACTURER
+ * Sets the discoverable mode of the local device.
+ *
+ * @since 2.0
+ * @visibility partner-manufacturer
+ * @privilege %http://tizen.org/privilege/bluetoothmanager
+ *
+ * @return An error code
+ * @param[in] mode The new discoverable mode
+ * @param[in] seconds The duration in seconds for which the local device is discoverable
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_ARG The specified @c seconds should be greater than 0 if the specified
+ * @c mode is @c BT_DISC_MODE_TIME_LIMITED_DISCOVERABLE.
+ * @exception E_INVALID_OPERATION %Bluetooth is not activated.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_SYSTEM A system error has occurred.
+ * @see IBluetoothManagerEventListener::OnBluetoothDiscoverableModeChanged()
+ * @remarks @c seconds is adopted only if the specified @c mode is @c BT_DISC_MODE_TIME_LIMITED_DISCOVERABLE.
+ * @endif
+ */
+ result SetDiscoverableMode(BluetoothDiscoverableMode mode, int seconds = 0);
+
+ /**
+ * @if OSPDEPREC
+ * Refreshes the paired device list.
+ *
+ * @brief <i> [Deprecated] </i>
+ * @deprecated This method is deprecated because the paired device list of this instance of %BluetoothManager is
+ * refreshed automatically. An application should not call this method to refresh the list.
+ * @since 2.0
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_MEMORY The memory is insufficient.
+ * @exception E_SYSTEM A system error has occurred.
+ * @endif
+ */
+ result RefreshPairedDeviceList(void);
+
+ /**
+ * @if OSPDEPREC
+ * Searches for an element that matches a %Bluetooth address.
+ *
+ * @brief <i> [Deprecated] </i>
+ * @deprecated This method is deprecated because the return value of this method is a dangling pointer, if this
+ * instance of %BluetoothManager is deleted. In addition to this, it is also an invalid pointer if the
+ * paired device list is updated internally. Instead of using this method, GetPairedDeviceByAddressN()
+ * is recommended.
+ * @since 2.0
+ *
+ * @return The instance of %BluetoothDevice containing the specified address, @n
+ * else @c null if the search is not successful
+ * @param[in] deviceAddress The address to locate
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OBJ_NOT_FOUND The specified device is not found in the paired device list.
+ * @remarks The specific error code can be accessed using the GetLastResult() method.
+ * @endif
+ */
+ const BluetoothDevice* GetPairedDeviceByAddress(const Tizen::Base::ByteBuffer& deviceAddress) const;
+
+ /**
+ * Gets an element that matches a %Bluetooth address.
+ *
+ * @since 2.0
+ *
+ * @return The instance of %BluetoothDevice containing the specified address, @n
+ * else @c null if the search is not successful
+ * @param[in] deviceAddress The address to locate
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OBJ_NOT_FOUND The specified device is not found in the paired device list.
+ * @exception E_OUT_OF_MEMORY The memory is insufficient.
+ * @remarks The specific error code can be accessed using the GetLastResult() method.
+ */
+ BluetoothDevice* GetPairedDeviceByAddressN(const Tizen::Base::ByteBuffer& deviceAddress) const;
+
+ /**
+ * Gets the elements matching a device name in the paired device list.
+ *
+ * @since 2.0
+ *
+ * @return A list containing the matching devices, @n
+ * else @c null if the search is not successful
+ * @param[in] deviceName The name of the device to locate
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OBJ_NOT_FOUND The specified device is not found in the paired device list.
+ * @exception E_OUT_OF_MEMORY The memory is insufficient.
+ * @remarks The specific error code can be accessed using the GetLastResult() method.
+ */
+ Tizen::Base::Collection::IList* GetPairedDeviceByNameN(const Tizen::Base::String& deviceName) const;
+
+ /**
+ * @if OSPDEPREC
+ * Gets the element at the specified index.
+ *
+ * @brief <i> [Deprecated] </i>
+ * @deprecated This method is deprecated because the return value of this method is a dangling pointer, if this
+ * instance of %BluetoothManager is deleted. In addition to this, it is also an invalid pointer if the
+ * paired device list is updated internally. Instead of using this method, GetPairedDeviceListN() and
+ * Tizen::Base::Collection::IList::GetAt() are recommended.
+ * @since 2.0
+ *
+ * @return The instance of %BluetoothDevice at the specified index, @n
+ * else @c null if there is no element
+ * @param[in] index The index in the list
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OBJ_NOT_FOUND The specified index is not found in the paired device list.
+ * @remarks The specific error code can be accessed using the GetLastResult() method.
+ * @endif
+ */
+ const BluetoothDevice* GetPairedDeviceAt(int index) const;
+
+ /**
+ * @if OSPDEPREC
+ * Gets the paired device list.
+ *
+ * @brief <i> [Deprecated] </i>
+ * @deprecated This method is deprecated because the return value of this method is a dangling pointer, if this
+ * instance of %BluetoothManager is deleted. In addition to this, some elements of the list may also
+ * be invalid pointers if the paired device list is updated internally. Instead of using this method,
+ * GetPairedDeviceListN() is recommended.
+ * @since 2.0
+ *
+ * @return A pointer to the paired device list on success, @n
+ * else @c null
+ * @exception E_SUCCESS The method is successful.
+ * @remarks The specific error code can be accessed using the GetLastResult() method.
+ * @endif
+ */
+ const Tizen::Base::Collection::IList* GetPairedDeviceList(void) const;
+
+ /**
+ * Gets the paired device list.
+ *
+ * @since 2.0
+ *
+ * @return A pointer to the paired device list on success, @n
+ * else @c null
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_MEMORY The memory is insufficient.
+ * @remarks The specific error code can be accessed using the GetLastResult() method.
+ */
+ Tizen::Base::Collection::IList* GetPairedDeviceListN(void) const;
+
+ /**
+ * Sets a remote device event listener for searching devices and services.
+ *
+ * @since 2.0
+ *
+ * @return An error code
+ * @param[in] pListener The device event listener to add
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error has occurred.
+ * @remarks Only one event listener can be set. If the input parameter is @c null, the listener currently set
+ * is unregistered.
+ */
+ result SetBluetoothDeviceListener(IBluetoothDeviceEventListener* pListener);
+
+ /**
+ * Starts the device discovery process.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.gap
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_IN_PROGRESS The device discovery process is in progress.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of this
+ * operation.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_SYSTEM A system error has occurred.
+ * @see IBluetoothDeviceEventListener::OnBluetoothDiscoveryStarted()
+ * @see IBluetoothDeviceEventListener::OnBluetoothRemoteDeviceFoundN()
+ * @see IBluetoothDeviceEventListener::OnBluetoothDiscoveryDone()
+ */
+ result StartDiscovery(void);
+
+ /**
+ * Cancels the device discovery process.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.gap
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_IN_PROGRESS The termination of the device discovery process is in progress.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of this
+ * operation. @n
+ * For example, the discovery has not started as yet.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_SYSTEM A system error has occurred.
+ * @see IBluetoothDeviceEventListener::OnBluetoothDiscoveryDone()
+ */
+ result CancelDiscovery(void);
+
+ /**
+ * Retrieves the service list from a remote device.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.gap
+ *
+ * @return An error code
+ * @param[in] pairedDevice A remote device that is already paired with the local device
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_IN_PROGRESS The retrieving is in progress.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of this
+ * operation. @n
+ * For example, the discovery is in progress.
+ * @exception E_NOT_PAIRED The input device is not found in the paired device list.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_SYSTEM A system error has occurred.
+ * @remarks The target remote device should be a paired device.
+ * @see IBluetoothDeviceEventListener::OnBluetoothServiceListReceived()
+ */
+ result RetrieveServiceList(const BluetoothDevice& pairedDevice);
+
+ /**
+ * Pairs with the specified remote device.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.gap
+ *
+ * @return An error code
+ * @param[in] remoteDevice The remote %Bluetooth device to pair with
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of this
+ * operation. @n
+ * For example, the %Bluetooth is not activated.
+ * @exception E_DEVICE_BUSY The device cannot be approached because other operation is in progress.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_SYSTEM A system error has occurred.
+ * @remarks IBluetoothDeviceEventListener::OnBluetoothPaired() is called if the pairing is successful, @n
+ * IBluetoothDeviceEventListener::OnBluetoothPairingFailed() if the pairing has failed.
+ */
+ result Pair(const BluetoothDevice& remoteDevice);
+
+ /**
+ * Stops the pairing process.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.gap
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of this
+ * operation. @n
+ * For example, the pairing process is not in progress.
+ * @exception E_IN_PROGRESS The termination of the pairing process is in progress.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_SYSTEM A system error has occurred.
+ * @remarks If the canceling of the pairing process is successful,
+ * IBluetoothDeviceEventListener::OnBluetoothPairingFailed() is called with E_OPERATION_CANCELED.
+ */
+ result CancelPair(void);
+
+ /**
+ * Unpairs with the paired device.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.gap
+ *
+ * @return An error code
+ * @param[in] pairedDevice The paired device to unpair
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of this
+ * operation. @n
+ * For example, the %Bluetooth is not activated, or retrieving the service
+ * list is in progress.
+ * @exception E_NOT_PAIRED The input device is not found in the paired device list.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_SYSTEM A system error has occurred.
+ * @remarks The process of unpairing is to remove the specified device from the paired device list. No
+ * notification is transmitted to the remote device. @n
+ * This method is synchronous. Only when the result of this method is E_SUCCESS, the unpaired event is
+ * fired.
+ * @see IBluetoothDeviceEventListener::OnBluetoothUnpaired()
+ */
+ result Unpair(const BluetoothDevice& pairedDevice);
+
+private:
+ //
+ // The implementation of this copy constructor is intentionally blank and declared as private to prohibit copying
+ // of objects.
+ //
+ BluetoothManager(const BluetoothManager& value);
+ //
+ // The implementation of this copy assignment operator is intentionally blank and declared as private to prohibit
+ // copying of objects.
+ //
+ BluetoothManager& operator =(const BluetoothManager& value);
+
+private:
+ _BluetoothManagerImpl* __pImpl;
+
+ friend class _BluetoothManagerImpl;
+
+}; // BluetoothManager
+
+} } }
+#endif // _FNET_BT_BLUETOOTH_MANAGER_H_
diff --git a/inc/FNetBtBluetoothOppClient.h b/inc/FNetBtBluetoothOppClient.h
new file mode 100755
index 0000000..1d73037
--- /dev/null
+++ b/inc/FNetBtBluetoothOppClient.h
@@ -0,0 +1,179 @@
+//
+// Open Service Platform
+// 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 FNetBtBluetoothOppClient.h
+ * @brief This is the header file for the %BluetoothOppClient class.
+ *
+ * This header file contains the declarations of the %BluetoothOppClient class.
+ */
+#ifndef _FNET_BT_BLUETOOTH_OPP_CLIENT_H_
+#define _FNET_BT_BLUETOOTH_OPP_CLIENT_H_
+
+#include <FBaseObject.h>
+#include <FBaseResult.h>
+
+namespace Tizen { namespace Base
+{
+class String;
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// forward declarations
+class BluetoothDevice;
+class IBluetoothOppClientEventListener;
+class _BluetoothOppClientImpl;
+
+/**
+ * @class BluetoothOppClient
+ * @brief This class provides methods to handle the %Bluetooth Object Push Profile (OPP) client, such as the
+ * outgoing connection requests.
+ *
+ * @since 2.0
+ *
+ * The %BluetoothOppClient class provides methods to handle the %Bluetooth Object Push Profile (OPP) client, such as the outgoing
+ * connection requests.
+ * @n
+ * For more information on the class features, see
+ * <a href="../org.tizen.native.appprogramming/html/guide/net/bluetooth_namespace.htm">Bluetooth Guide</a>.
+ */
+class _OSP_EXPORT_ BluetoothOppClient
+ : public Tizen::Base::Object
+{
+public:
+ /**
+ * The object is not fully constructed after this constructor is called. For full construction, the Construct() method
+ * must be called right after calling this constructor.
+ *
+ * @since 2.0
+ */
+ BluetoothOppClient(void);
+
+ /**
+ * This destructor overrides Tizen::Base::Object::~Object().
+ *
+ * @since 2.0
+ */
+ virtual ~BluetoothOppClient(void);
+
+ /**
+ * Constructs and initializes this instance of %BluetoothOppClient with the specified listener.
+ *
+ * @since 2.0
+ *
+ * @return An error code
+ * @param[in] listener The event listener for the OPP client
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_MEMORY The memory is insufficient.
+ * @exception E_UNSUPPORTED_OPERATION This operation is not supported.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ result Construct(IBluetoothOppClientEventListener& listener);
+
+ /**
+ * Pushes a file to a remote OPP server. @n
+ * The file transfer starts when the OPP server accepts the request.
+ *
+ * @if OSPCOMPAT
+ * @brief <i> [Compatibility] </i>
+ * @endif
+ * @since 2.0
+ * @if OSPCOMPAT
+ * @compatibility This method has compatibility issues@n
+ * For more information, see @ref CompIoPathPage "here".
+ * @endif
+ * @privilege %http://tizen.org/privilege/bluetooth.opp
+ *
+ * @return An error code
+ * @param[in] remoteDevice The remote OPP server
+ * @param[in] filePath The path of the source file
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE This instance is in an invalid state. @n
+ * For example, %Bluetooth is not activated.
+ * @exception E_IN_PROGRESS The push process is in progress.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_SERVICE_UNAVAILABLE The OPP service is unavailable.
+ * @exception E_INACCESSIBLE_PATH The specified @c filePath is inaccessible.
+ * @exception E_REMOTE_DEVICE_NOT_FOUND The input device is not found. @n
+ * This exception is currently not in use.
+ * @exception E_FAILURE The method has failed.
+ * @see IBluetoothOppServerEventListener::OnOppPushRequested()
+ * @remarks If the local device is not paired with the specified target device, the pairing process starts
+ * internally before the push request is sent.
+ */
+ result PushFile(const BluetoothDevice& remoteDevice, const Tizen::Base::String& filePath);
+
+ /**
+ * Cancels the file push request in progress. @n
+ * If this method is called before the OPP server accepts the push request, the
+ * IBluetoothOppClientEventListener::OnOppPushResponded() method is called and the exception E_SYSTEM is thrown. @n
+ * If this method is called during the file transfer, the IBluetoothOppClientEventListener::OnOppTransferDone()
+ * method is called with @c isCompleted as @c false.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.opp
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE This instance is in an invalid state. @n
+ * For example, %Bluetooth is not activated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the push request is not sent or accepted by a remote device.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_FAILURE The method has failed.
+ * @see IBluetoothOppClientEventListener::OnOppPushResponded()
+ * @see IBluetoothOppClientEventListener::OnOppTransferDone()
+ */
+ result CancelPush(void);
+
+ /**
+ * Sets the minimum interval of invocation of IBluetoothOppClientEventListener::OnOppTransferInProgress() in
+ * percentage. @n
+ * The default value is @c 5.
+ *
+ * @since 2.0
+ *
+ * @return An error code
+ * @param[in] percent The minimum period of progress interval as a percentage value
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_RANGE The value of an argument is outside the valid range defined by the method.
+ * @see IBluetoothOppClientEventListener::OnOppTransferInProgress()
+ */
+ result SetMinProgressInterval(int percent);
+
+private:
+ //
+ // The implementation of this copy constructor is intentionally blank and declared as private to prohibit copying
+ // of objects.
+ //
+ BluetoothOppClient(const BluetoothOppClient& value);
+ //
+ // The implementation of this copy assignment operator is intentionally blank and declared as private to prohibit
+ // copying of objects.
+ //
+ BluetoothOppClient& operator =(const BluetoothOppClient& value);
+
+private:
+ _BluetoothOppClientImpl* __pImpl;
+
+}; // BluetoothOppClient
+
+} } }
+#endif // _FNET_BT_BLUETOOTH_OPP_CLIENT_H_
diff --git a/inc/FNetBtBluetoothOppServer.h b/inc/FNetBtBluetoothOppServer.h
new file mode 100755
index 0000000..896a2c3
--- /dev/null
+++ b/inc/FNetBtBluetoothOppServer.h
@@ -0,0 +1,257 @@
+//
+// Open Service Platform
+// 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 FNetBtBluetoothOppServer.h
+ * @brief This is the header file for the %BluetoothOppServer class.
+ *
+ * This header file contains the declarations of the %BluetoothOppServer class.
+ */
+#ifndef _FNET_BT_BLUETOOTH_OPP_SERVER_H_
+#define _FNET_BT_BLUETOOTH_OPP_SERVER_H_
+
+#include <FBaseObject.h>
+#include <FBaseResult.h>
+
+namespace Tizen { namespace Base
+{
+class String;
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// forward declarations
+class IBluetoothOppServerEventListener;
+class _BluetoothOppServerImpl;
+
+/**
+ * @class BluetoothOppServer
+ * @brief This class provides methods to handle the %Bluetooth Object Push Profile (OPP) server, such as the
+ * incoming connection requests.
+ *
+ * @since 2.0
+ *
+ * The %BluetoothOppServer class provides methods to handle the %Bluetooth Object Push Profile (OPP) server, such as the incoming
+ * connection requests.
+ *
+ * For more information on the class features, see
+ * <a href="../org.tizen.native.appprogramming/html/guide/net/bluetooth_namespace.htm">Bluetooth Guide</a>.
+ */
+class _OSP_EXPORT_ BluetoothOppServer
+ : public Tizen::Base::Object
+{
+public:
+ /**
+ * The object is not fully constructed after this constructor is called. For full construction, the Construct()
+ * method must be called right after calling this constructor.
+ *
+ * @since 2.0
+ */
+ BluetoothOppServer(void);
+
+ /**
+ * This destructor overrides Tizen::Base::Object::~Object().
+ *
+ * @since 2.0
+ */
+ virtual ~BluetoothOppServer(void);
+
+ /**
+ * Constructs and initializes this instance of %BluetoothOppServer with the specified listener.
+ *
+ * @since 2.0
+ *
+ * @return An error code
+ * @param[in] listener The event listener for the OPP server
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_MEMORY The memory is insufficient.
+ * @exception E_UNSUPPORTED_OPERATION This operation is not supported.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ result Construct(IBluetoothOppServerEventListener& listener);
+
+ /**
+ * Accepts a push request from a remote OPP client. @n
+ * This method starts the file transfer.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.opp
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE This instance is in an invalid state. @n
+ * For example, this instance has not been constructed as yet or %Bluetooth is
+ * not activated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the service is not started yet or a push request is not
+ * received from a remote device.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_FAILURE The method has failed.
+ * @see IBluetoothOppClientEventListener::OnOppPushResponded()
+ */
+ result AcceptPush(void);
+
+ /**
+ * Rejects a push request from a remote OPP client.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.opp
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE This instance is in an invalid state. @n
+ * For example, this instance has not been constructed as yet or %Bluetooth is
+ * not activated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the service is not started yet or a push request is not
+ * received from a remote device.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_FAILURE The method has failed.
+ * @see IBluetoothOppClientEventListener::OnOppPushResponded()
+ */
+ result RejectPush(void);
+
+ /**
+ * Sets the destination path of the file to be received.
+ *
+ * @if OSPCOMPAT
+ * @brief <i> [Compatibility] </i>
+ * @endif
+ * @since 2.0
+ * @if OSPCOMPAT
+ * @compatibility This method has compatibility issues. @n
+ * For more information, see @ref CompIoPathPage "here".
+ *
+ * @endif
+ * @return An error code
+ * @param[in] dstPath The new destination file path
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, trying to change the path on Push transition is prohibited.
+ * @exception E_INACCESSIBLE_PATH The specified @c dstPath is inaccessible.
+ * @exception E_FAILURE The method has failed.
+ */
+ result SetDestinationPath(const Tizen::Base::String& dstPath);
+
+ /**
+ * Starts the OPP service and associates a listener with it.
+ *
+ * @if OSPCOMPAT
+ * @brief <i> [Compatibility] </i>
+ * @endif
+ * @since 2.0
+ * @if OSPCOMPAT
+ * @compatibility This method has compatibility issues. @n
+ * For more information, see @ref CompIoPathPage "here".
+ * @endif
+ * @privilege %http://tizen.org/privilege/bluetooth.opp
+ *
+ * @return An error code
+ * @param[in] dstPath The new destination file path
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE This instance is in an invalid state. @n
+ * For example, %Bluetooth is not activated.
+ * @exception E_IN_PROGRESS The service has already started.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_SERVICE_UNAVAILABLE The OPP service is unavailable.
+ * @exception E_INACCESSIBLE_PATH The specified @c dstPath is inaccessible.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, The stop process is in progress.
+ * @exception E_FAILURE The method has failed.
+ */
+ result StartService(const Tizen::Base::String& dstPath);
+
+ /**
+ * Stops the OPP service. @n
+ * This method cancels the file transfer before stopping the service.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.opp
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE This instance is in an invalid state. @n
+ * For example, %Bluetooth is not activated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the service is not started as yet.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_IN_PROGRESS The stop process is in progress.
+ * @exception E_FAILURE The method has failed.
+ */
+ result StopService(void);
+
+ /**
+ * Stops the file transfer in progress which was started by the client. @n
+ * If this method is called during the file transfer, the IBluetoothOppServerEventListener::OnOppTransferDone()
+ * method is called with @c isCompleted as @c false.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.opp
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE This instance is in an invalid state. @n
+ * For example, %Bluetooth is not activated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the file transfer is not in progress.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_OPERATION_FAILED The operation has failed.
+ * @see IBluetoothOppServerEventListener::OnOppTransferDone()
+ */
+ result StopTransfer(void);
+
+ /**
+ * Sets the minimum interval of invocation of IBluetoothOppServerEventListener::OnOppTransferInProgress() in
+ * percentage. @n
+ * The default value is @c 5.
+ *
+ * @since 2.0
+ *
+ * @return An error code
+ * @param[in] percent The minimum period of progress interval as a percentage value
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_RANGE The value of the argument is outside the valid range defined by the method.
+ * @see IBluetoothOppServerEventListener::OnOppTransferInProgress()
+ */
+ result SetMinProgressInterval(int percent);
+
+private:
+ //
+ // The implementation of this copy constructor is intentionally blank and declared as private to prohibit copying
+ // of objects.
+ //
+ BluetoothOppServer(const BluetoothOppServer& value);
+ //
+ // The implementation of this copy assignment operator is intentionally blank and declared as private to prohibit
+ // copying of objects.
+ //
+ BluetoothOppServer& operator =(const BluetoothOppServer& value);
+
+private:
+ _BluetoothOppServerImpl* __pImpl;
+
+}; // BluetoothOppServer
+
+} } }
+#endif // _FNET_BT_BLUETOOTH_OPP_SERVER_H_
diff --git a/inc/FNetBtBluetoothSppAcceptor.h b/inc/FNetBtBluetoothSppAcceptor.h
new file mode 100755
index 0000000..11f90b4
--- /dev/null
+++ b/inc/FNetBtBluetoothSppAcceptor.h
@@ -0,0 +1,257 @@
+//
+// Open Service Platform
+// 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 FNetBtBluetoothSppAcceptor.h
+ * @brief This is the header file for the %BluetoothSppAcceptor class.
+ *
+ * This header file contains the declarations of the %BluetoothSppAcceptor class.
+ */
+#ifndef _FNET_BT_BLUETOOTH_SPP_ACCEPTOR_H_
+#define _FNET_BT_BLUETOOTH_SPP_ACCEPTOR_H_
+
+#include <FBaseObject.h>
+#include <FBaseResult.h>
+#include <FBaseUuId.h>
+#include <FNetBtBluetoothTypes.h>
+
+namespace Tizen { namespace Base
+{
+class ByteBuffer;
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// forward declarations
+class IBluetoothSppAcceptorEventListener;
+class _BluetoothSppAcceptorImpl;
+
+/**
+ * @class BluetoothSppAcceptor
+ * @brief This class provides the methods to handle the %Bluetooth Serial Port Profile (SPP) acceptor, such as an
+ * incoming connection request.
+ * @since 2.0
+ *
+ * The %BluetoothSppAcceptor class provides the methods to handle the %Bluetooth Serial Port Profile (SPP) acceptor, such as an
+ * incoming connection request.
+ *
+ * For more information on the class features, see
+ * <a href="../org.tizen.native.appprogramming/html/guide/net/bluetooth_namespace.htm">Bluetooth Guide</a>.
+ */
+class _OSP_EXPORT_ BluetoothSppAcceptor
+ : public Tizen::Base::Object
+{
+public:
+ /**
+ * The object is not fully constructed after this constructor is called. For full construction, the Construct()
+ * method must be called right after calling this constructor.
+ *
+ * @since 2.0
+ */
+ BluetoothSppAcceptor(void);
+
+ /**
+ * This destructor overrides Tizen::Base::Object::~Object().
+ *
+ * @since 2.0
+ */
+ virtual ~BluetoothSppAcceptor(void);
+
+ /**
+ * Initializes this instance of %BluetoothSppAcceptor with the specified listener.
+ *
+ * @since 2.0
+ *
+ * @return An error code
+ * @param[in] listener The event listener for SPP acceptor
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_MEMORY The memory is insufficient.
+ * @exception E_UNSUPPORTED_OPERATION This operation is not supported.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ result Construct(IBluetoothSppAcceptorEventListener& listener);
+
+ /**
+ * Accepts a connection request from a remote SPP initiator. @n
+ * This method establishes a connection.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.spp
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE This instance is in an invalid state. @n
+ * For example, this instance has not been constructed as yet or %Bluetooth is
+ * not activated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the service is not started yet or the connection request is
+ * not yet received from a remote device.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_FAILURE The method has failed.
+ * @see IBluetoothSppInitiatorEventListener::OnSppConnectionResponded()
+ */
+ result AcceptConnection(void);
+
+ /**
+ * Rejects a connection request from a remote SPP initiator.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.spp
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE This instance is in an invalid state. @n
+ * For example, this instance has not been constructed as yet or %Bluetooth is
+ * not activated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the service is not started yet or the connection request is
+ * not yet received from a remote device.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_FAILURE The method has failed.
+ * @see IBluetoothSppInitiatorEventListener::OnSppConnectionResponded()
+ */
+ result RejectConnection(void);
+
+ /**
+ * Starts the SPP service with the default service UUID - BT_SVC_UUID_SPP.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.spp
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE This instance is in an invalid state. @n
+ * For example, this instance has not been constructed as yet or %Bluetooth is
+ * not activated.
+ * @exception E_IN_PROGRESS The service has already started.
+ * @exception E_ALREADY_CONNECTED The connection with an SPP initiator has already been established.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_SERVICE_UNAVAILABLE The SPP service with the specified UUId is unavailable.
+ * @exception E_FAILURE The method has failed.
+ */
+ result StartService(void);
+
+ /**
+ * Starts the SPP service with the specified service UUID.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.spp
+ *
+ * @return An error code
+ * @param[in] serviceUuid The UUID of SPP service
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE This instance is in an invalid state. @n
+ * For example, this instance has not been constructed as yet or %Bluetooth is
+ * not activated.
+ * @exception E_INVALID_ARG The specified input parameter is invalid.
+ * @exception E_IN_PROGRESS The service has already started.
+ * @exception E_ALREADY_CONNECTED The connection with an SPP initiator has already been established.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_SERVICE_UNAVAILABLE The SPP service with the specified UUId is unavailable.
+ * @exception E_FAILURE The method has failed.
+ */
+ result StartService(const Tizen::Base::UuId& serviceUuid);
+
+ /**
+ * Stops the SPP service. @n
+ * This method disconnects the current connection before stopping the service.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.spp
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE This instance is in an invalid state. @n
+ * For example, this instance has not been constructed as yet or %Bluetooth is
+ * not activated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the service is not started yet.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_FAILURE The method has failed.
+ */
+ result StopService(void);
+
+ /**
+ * Disconnects the current connection.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.spp
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE This instance is in an invalid state. @n
+ * For example, this instance has not been constructed as yet or %Bluetooth is
+ * not activated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the service is not started yet or a connection with a remote
+ * device is not established.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_FAILURE The method has failed.
+ * @see IBluetoothSppAcceptorEventListener::OnSppDisconnected()
+ * @see IBluetoothSppInitiatorEventListener::OnSppDisconnected()
+ */
+ result Disconnect(void);
+
+ /**
+ * Sends the data.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.spp
+ *
+ * @return An error code
+ * @param[in] buffer The data to send
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE This instance is in an invalid state. @n
+ * For example, this instance has not been constructed as yet or %Bluetooth is
+ * not activated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the service is not started yet or a connection with a remote
+ * device is not established.
+ * @exception E_INVALID_ARG The specified @c buffer is empty.
+ * @exception E_SYSTEM A system error has occurred.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_FAILURE The method has failed.
+ * @remarks The size of the buffer should not exceed @c 1000 bytes.
+ * @see IBluetoothSppInitiatorEventListener::OnSppDataReceived()
+ */
+ result SendData(const Tizen::Base::ByteBuffer& buffer);
+
+private:
+ //
+ // The implementation of this copy constructor is intentionally blank and declared as private to prohibit copying
+ // of objects.
+ //
+ BluetoothSppAcceptor(const BluetoothSppAcceptor& value);
+ //
+ // The implementation of this copy assignment operator is intentionally blank and declared as private to prohibit
+ // copying of objects.
+ //
+ BluetoothSppAcceptor& operator =(const BluetoothSppAcceptor& value);
+
+private:
+ _BluetoothSppAcceptorImpl* __pImpl;
+
+}; // BluetoothSppAcceptor
+
+} } }
+#endif // _FNET_BT_BLUETOOTH_SPP_ACCEPTOR_H_
diff --git a/inc/FNetBtBluetoothSppInitiator.h b/inc/FNetBtBluetoothSppInitiator.h
new file mode 100755
index 0000000..89b3311
--- /dev/null
+++ b/inc/FNetBtBluetoothSppInitiator.h
@@ -0,0 +1,214 @@
+//
+// Open Service Platform
+// 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 FNetBtBluetoothSppInitiator.h
+ * @brief This is the header file for the %BluetoothSppInitiator class.
+ *
+ * This header file contains the declarations of the %BluetoothSppInitiator class.
+ */
+#ifndef _FNET_BT_BLUETOOTH_SPP_INITIATOR_H_
+#define _FNET_BT_BLUETOOTH_SPP_INITIATOR_H_
+
+#include <FBaseObject.h>
+#include <FBaseResult.h>
+#include <FBaseUuId.h>
+#include <FNetBtBluetoothTypes.h>
+
+namespace Tizen { namespace Base
+{
+class ByteBuffer;
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// forward declarations
+class BluetoothDevice;
+class IBluetoothSppInitiatorEventListener;
+class _BluetoothSppInitiatorImpl;
+
+/**
+ * @class BluetoothSppInitiator
+ * @brief This class provides the methods to handle the %Bluetooth Serial Port Profile (SPP) initiator, such as the
+ * outgoing connection requests.
+ * @since 2.0
+ *
+ * The %BluetoothSppInitiator class provides the methods to handle the %Bluetooth Serial Port Profile (SPP) initiator, such as
+ * the outgoing connection requests.
+ *
+ * For more information on the class features, see
+ * <a href="../org.tizen.native.appprogramming/html/guide/net/bluetooth_namespace.htm">Bluetooth Guide</a>.
+ */
+class _OSP_EXPORT_ BluetoothSppInitiator
+ : public Tizen::Base::Object
+{
+public:
+ /**
+ * The object is not fully constructed after this constructor is called. For full construction, the Construct()
+ * method must be called right after calling this constructor.
+ *
+ * @since 2.0
+ */
+ BluetoothSppInitiator(void);
+
+ /**
+ * This destructor overrides Tizen::Base::Object::~Object().
+ *
+ * @since 2.0
+ */
+ virtual ~BluetoothSppInitiator(void);
+
+ /**
+ * Constructs and initializes this instance of %BluetoothSppInitiator with the specified listener.
+ *
+ * @since 2.0
+ *
+ * @return An error code
+ * @param[in] listener The event listener for the SPP initiator
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_MEMORY The memory is insufficient.
+ * @exception E_UNSUPPORTED_OPERATION This operation is not supported.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ result Construct(IBluetoothSppInitiatorEventListener& listener);
+
+ /**
+ * Connects to a remote SPP acceptor with the default service UUID - BT_SVC_UUID_SPP. @n
+ * This method establishes a connection after the SPP acceptor accepts the request.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.spp
+ *
+ * @return An error code
+ * @param[in] remoteDevice The remote device to connect
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE This instance is in an invalid state. @n
+ * For example, this instance has not been constructed as yet or
+ * %Bluetooth is not activated.
+ * @exception E_IN_PROGRESS The connection process is in progress.
+ * @exception E_ALREADY_CONNECTED The connection with an SPP acceptor has already been established.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_SERVICE_UNAVAILABLE The SPP connection is unavailable.
+ * @exception E_REMOTE_DEVICE_NOT_FOUND The input device is not found. @n
+ * This exception is currently not in use.
+ * @exception E_FAILURE The method has failed.
+ * @see IBluetoothSppAcceptorEventListener::OnSppConnectionRequested()
+ * @remarks If the local device is not paired with the specified target device, the pairing process starts
+ * internally before the connect request is sent.
+ */
+ result Connect(const BluetoothDevice& remoteDevice);
+
+ /**
+ * Connects to a remote SPP acceptor with the specified service UUID. @n
+ * This method establishes a connection after the SPP acceptor accepts the request.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.spp
+ *
+ * @return An error code
+ * @param[in] remoteDevice The remote device to connect
+ * @param[in] serviceUuid The UUID of SPP service to connect
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE This instance is in an invalid state. @n
+ * For example, this instance has not been constructed as yet or
+ * %Bluetooth is not activated.
+ * @exception E_INVALID_ARG A specified input parameter is invalid.
+ * @exception E_IN_PROGRESS The connection process is in progress.
+ * @exception E_ALREADY_CONNECTED The connection with an SPP acceptor has already been established.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_SERVICE_UNAVAILABLE The SPP connection is unavailable.
+ * @exception E_REMOTE_DEVICE_NOT_FOUND The input device is not found. @n
+ * This exception is currently not in use.
+ * @exception E_FAILURE The method has failed.
+ * @see IBluetoothSppAcceptorEventListener::OnSppConnectionRequested()
+ * @remarks If the local device is not paired with the specified target device, the pairing process starts
+ * internally before the connect request is sent.
+ */
+ result Connect(const BluetoothDevice& remoteDevice, const Tizen::Base::UuId& serviceUuid);
+
+ /**
+ * Disconnects the current connection. @n
+ * If this method is called before the SPP acceptor accepts the connection request, the
+ * IBluetoothSppInitiatorEventListener::OnSppConnectionResponded() and E_SYSTEM is thrown. @n
+ * If this method is called on connection, the IBluetoothSppInitiatorEventListener::OnSppDisconnected() and
+ * E_SUCCESS is thrown.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.spp
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE This instance is in an invalid state. @n
+ * For example, this instance has not been constructed as yet or %Bluetooth is
+ * not activated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the connection request is not sent or a connection with a
+ * remote device is not established yet.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_FAILURE The method has failed.
+ * @see IBluetoothSppInitiatorEventListener::OnSppConnectionResponded()
+ * @see IBluetoothSppInitiatorEventListener::OnSppDisconnected()
+ * @see IBluetoothSppAcceptorEventListener::OnSppDisconnected()
+ */
+ result Disconnect(void);
+
+ /**
+ * Sends the specified data.
+ *
+ * @since 2.0
+ * @privilege %http://tizen.org/privilege/bluetooth.spp
+ *
+ * @return An error code
+ * @param[in] buffer The data to send
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE This instance is in an invalid state. @n
+ * For example, this instance has not been constructed as yet or %Bluetooth is
+ * not activated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the connection request is not sent or a connection with a
+ * remote device is not established yet.
+ * @exception E_INVALID_ARG The argument has no data.
+ * @exception E_SYSTEM A system error has occurred.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_FAILURE The method has failed.
+ * @remarks The size of the buffer should not exceed @c 1000 bytes.
+ * @see IBluetoothSppAcceptorEventListener::OnSppDataReceived()
+ */
+ result SendData(const Tizen::Base::ByteBuffer& buffer);
+
+private:
+ //
+ // The implementation of this copy constructor is intentionally blank and declared as private to prohibit copying
+ // of objects.
+ //
+ BluetoothSppInitiator(const BluetoothSppInitiator& value);
+ //
+ // The implementation of this copy assignment operator is intentionally blank and declared as private to prohibit
+ // copying of objects.
+ //
+ BluetoothSppInitiator& operator =(const BluetoothSppInitiator& value);
+
+private:
+ _BluetoothSppInitiatorImpl* __pImpl;
+
+}; // BluetoothSppInitiator
+
+} } }
+#endif // _FNET_BT_BLUETOOTH_SPP_INITIATOR_H_
diff --git a/inc/FNetBtBluetoothTypes.h b/inc/FNetBtBluetoothTypes.h
new file mode 100755
index 0000000..3aa555f
--- /dev/null
+++ b/inc/FNetBtBluetoothTypes.h
@@ -0,0 +1,630 @@
+//
+// Open Service Platform
+// 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 FNetBtBluetoothTypes.h
+ * @brief This is the header file for the enumerations in the Bluetooth namespace.
+ *
+ * This header file contains the declarations and descriptions of the enumerations in the Bluetooth namespace.
+ */
+#ifndef _FNET_BT_BLUETOOTH_TYPES_H_
+#define _FNET_BT_BLUETOOTH_TYPES_H_
+
+#include <FBaseTypes.h>
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+/**
+ * @if OSPDEPREC
+ * @enum BluetoothDeviceStateType
+ * Defines the states of the local %Bluetooth device.
+ *
+ * @brief <i> [Deprecated] </i>
+ * @deprecated This enum type is deprecated because the on/off states and the discoverable mode are not orthogonal.
+ * All the methods that use this enum type are also deprecated. Instead of using this enum type, it is
+ * recommended to use BluetoothManager::IsActivated() and the enum
+ * Bluetooth::BluetoothDiscoverableMode.
+ * @since 2.0
+ * @endif
+ */
+enum BluetoothDeviceStateType
+{
+ BT_DEVICE_STATE_OFF, /**< @if OSPDEPREC The OFF state @endif */
+ BT_DEVICE_STATE_DISCOVERABLE, /**< @if OSPDEPREC The DISCOVERABLE state @endif */
+ BT_DEVICE_STATE_NOT_DISCOVERABLE /**< @if OSPDEPREC The NOT DISCOVERABLE state @endif */
+};
+
+/**
+ * @enum BluetoothDiscoverableMode
+ * Defines the discoverable mode of the local %Bluetooth device.
+ *
+ * @since 2.0
+ */
+enum BluetoothDiscoverableMode
+{
+ BT_DISC_MODE_NOT_DISCOVERABLE, /**< The mode NOT DISCOVERABLE by other devices */
+ BT_DISC_MODE_DISCOVERABLE, /**< The mode DISCOVERABLE by other devices */
+ BT_DISC_MODE_TIME_LIMITED_DISCOVERABLE /**< The mode DISCOVERABLE by other devices during a certain amount of time
+ * @if OSPCOMPAT @b Since: @b 2.0 @endif
+ */
+};
+
+/**
+ * @enum BluetoothConnectionType
+ * Defines the %Bluetooth connection types.
+ *
+ * @since 2.0
+ */
+enum BluetoothConnectionType
+{
+ BT_CONNECTION_GENERIC, /**< The GENERIC CONNECTION
+ * @if OSPDEPREC
+ * @deprecated This enumeration field is deprecated. @n
+ * @endif
+ */
+ BT_CONNECTION_SPP_ACCEPTOR, /**< The SPP ACCEPTOR CONNECTION */
+ BT_CONNECTION_SPP_INITIATOR, /**< The SPP INITIATOR CONNECTION */
+ BT_CONNECTION_OPP_SERVER, /**< The OPP SERVER CONNECTION */
+ BT_CONNECTION_OPP_CLIENT, /**< The OPP CLIENT CONNECTION */
+ BT_CONNECTION_MAX
+};
+
+/**
+ * @enum BluetoothHealthDataChannelType
+ * Defines the transmission type of %BluetoothHealth data channel.
+ *
+ * @since 2.0
+ */
+enum BluetoothHealthDataChannelType
+{
+ BT_HEALTH_DATA_CHANNEL_NONE, /**< The any type of data channel */
+ BT_HEALTH_DATA_CHANNEL_RELIABLE, /**< The data channel type for transmitting data with the reliable manner of
+ * which the confidence in the exchange is at its highest (e.g. measurement
+ * and alert information)
+ */
+ BT_HEALTH_DATA_CHANNEL_STREAMING /**< The data channel type for transmitting data when the timeliness of the
+ * delivery of each frame is more important than the reliable delivery of
+ * every frame (e.g. an ECG waveform, where low latency is critical)
+ */
+};
+
+/**
+ * @enum BluetoothServiceClassType
+ * Defines the service class type (part of the class of the device), returned from the device discovery.
+ *
+ * @since 2.0
+ */
+enum BluetoothServiceClassType
+{
+ BT_COD_SVC_LIMITED_DISCOVERABLE_MODE = 0x0020, /**< The LIMITED DISCOVERABLE MODE */
+ BT_COD_SVC_POSITIONING = 0x0100, /**< The POSITIONING service class type */
+ BT_COD_SVC_NETWORKING = 0x0200, /**< The NETWORKING service class type */
+ BT_COD_SVC_RENDERING = 0x0400, /**< The RENDERING service class type */
+ BT_COD_SVC_CAPTURING = 0x0800, /**< The CAPTURING service class type */
+ BT_COD_SVC_OBJECT_TRANSFER = 0x1000, /**< The OBJECT TRANSFER service class type */
+ BT_COD_SVC_AUDIO = 0x2000, /**< The AUDIO service class type */
+ BT_COD_SVC_TELEPHONY = 0x4000, /**< The TELEPHONY service class type */
+ BT_COD_SVC_INFORMATION = 0x8000, /**< The INFORMATION service class type */
+ BT_COD_SVC_ALL = 0x01FF, /**< The ALL services class type */
+ BT_COD_SVC_UNKNOWN = 0x0000 /**< The UNKNOWN service class type */
+};
+
+/**
+ * @enum BluetoothMajorDeviceClassType
+ * Defines the major device class (part of the class of the device).
+ *
+ * @since 2.0
+ */
+enum BluetoothMajorDeviceClassType
+{
+ BT_COD_MAJ_DEV_CLS_MISC = 0x00, /**< The MISC major device class type */
+ BT_COD_MAJ_DEV_CLS_COMPUTER = 0x01, /**< The COMPUTER major device class type */
+ BT_COD_MAJ_DEV_CLS_PHONE = 0x02, /**< The PHONE major device class type */
+ BT_COD_MAJ_DEV_CLS_LAN_ACCESS_POINT = 0x03, /**< The LAN ACCESS POINT major device class type */
+ BT_COD_MAJ_DEV_CLS_AUDIO = 0x04, /**< The AUDIO major device class type */
+ BT_COD_MAJ_DEV_CLS_PERIPHERAL = 0x05, /**< The PERIPHERAL major device class type */
+ BT_COD_MAJ_DEV_CLS_IMAGING = 0x06, /**< The IMAGING major device class type */
+ BT_COD_MAJ_DEV_CLS_UNCLASSIFIED = 0x1F /**< The UNCLASSIFIED major device class type */
+};
+
+/**
+ * @enum BluetoothMinorDeviceClassType
+ * Defines the minor device class (part of the class of the device).
+ *
+ * @since 2.0
+ */
+enum BluetoothMinorDeviceClassType
+{
+ BT_COD_MIN_DEV_CLS_UNCLASSIFIED = 0x00, /**< The UNCLASSIFIED minor device class type */
+
+ BT_COD_MIN_DEV_CLS_DESKTOP_WORKSTATION = 0x04, /**< The DESKTOP WORKSTATION minor device class type */
+ BT_COD_MIN_DEV_CLS_SERVER_CLASS_COMPUTER = 0x08, /**< The SERVER CLASS COMPUTER minor device class type */
+ BT_COD_MIN_DEV_CLS_LAPTOP = 0x0C, /**< The LAPTOP minor device class type */
+ BT_COD_MIN_DEV_CLS_HANDHELD_PC_OR_PDA = 0x10, /**< The HANDHELD PC OR PDA minor device class type */
+ BT_COD_MIN_DEV_CLS_PALM_SIZED_PC_OR_PDA = 0x14, /**< The PALM SIZED PC OR PDA minor device class type */
+ BT_COD_MIN_DEV_CLS_WEARABLE_COMPUTER = 0x18, /**< The WEARABLE COMPUTER minor device class type */
+
+ BT_COD_MIN_DEV_CLS_CELLULAR = 0x04, /**< The CELLULAR minor device class type */
+ BT_COD_MIN_DEV_CLS_CORDLESS = 0x08, /**< The CORDLESS minor device class type */
+ BT_COD_MIN_DEV_CLS_SMART_PHONE = 0x0C, /**< The SMART PHONE minor device class type */
+ BT_COD_MIN_DEV_CLS_WIRED_MODEM_OR_VOICE_GATEWAY = 0x10, /**< The WIRED MODEM OR VOICE GATEWAY minor device class type */
+ BT_COD_MIN_DEV_CLS_COMMON_ISDN_ACCESS = 0x14, /**< The COMMON ISDN ACCESS minor device class type */
+
+ BT_COD_MIN_DEV_CLS_FULLY_AVAILABLE = 0x04, /**< The FULLY AVAILABLE minor device class type */
+ BT_COD_MIN_DEV_CLS_1_TO_17_PERCENT_UTILIZED = 0x20, /**< The 1_TO_17_PERCENT_UTILIZED minor device class type */
+ BT_COD_MIN_DEV_CLS_17_TO_33_PERCENT_UTILIZED = 0x40, /**< The 17_TO_33_PERCENT_UTILIZED minor device class type */
+ BT_COD_MIN_DEV_CLS_33_TO_50_PERCENT_UTILIZED = 0x60, /**< The 33_TO_50_PERCENT_UTILIZED minor device class type */
+ BT_COD_MIN_DEV_CLS_50_to_67_PERCENT_UTILIZED = 0x80, /**< The 50_to_67_PERCENT_UTILIZED minor device class type */
+ BT_COD_MIN_DEV_CLS_67_TO_83_PERCENT_UTILIZED = 0xA0, /**< The 67_TO_83_PERCENT_UTILIZED minor device class type */
+ BT_COD_MIN_DEV_CLS_83_TO_99_PERCENT_UTILIZED = 0xC0, /**< The 83_TO_99_PERCENT_UTILIZED minor device class type */
+ BT_COD_MIN_DEV_CLS_NO_SERVICE_AVAILABLE = 0xE0, /**< The NO SERVICE AVAILABLE minor device class type */
+
+ BT_COD_MIN_DEV_CLS_HEADSET_PROFILE = 0x04, /**< The HEADSET PROFILE minor device class type */
+ BT_COD_MIN_DEV_CLS_HANDSFREE = 0x08, /**< The HANDSFREE minor device class type */
+ BT_COD_MIN_DEV_CLS_SIM_CARD_READER = 0x18, /**< The SIM CARD READER minor device class type */
+
+};
+
+/**
+ * @enum BluetoothServiceType
+ * Defines the %Bluetooth service type.
+ *
+ * @since 2.0
+ */
+enum BluetoothServiceType
+{
+ BT_SVC_RES_SERVICE = 0x00000001, /**< The Reserved service type */
+ BT_SVC_SPP_SERVICE = 0x00000002, /**< The Serial port profile service type */
+ BT_SVC_DUN_SERVICE = 0x00000004, /**< The Dial-up networking profile service type */
+ BT_SVC_FAX_SERVICE = 0x00000008, /**< The Fax profile service type */
+ BT_SVC_LAP_SERVICE = 0x00000010, /**< The LAN access profile service type */
+ BT_SVC_HSP_SERVICE = 0x00000020, /**< The Headset profile service type */
+ BT_SVC_HFP_SERVICE = 0x00000040, /**< The Hands-free profile service type */
+ BT_SVC_OPP_SERVICE = 0x00000080, /**< The Object push service type */
+ BT_SVC_FTP_SERVICE = 0x00000100, /**< The File transfer service type */
+ BT_SVC_CTP_SERVICE = 0x00000200, /**< The Cordless Terminal service type */
+ BT_SVC_ICP_SERVICE = 0x00000400, /**< The Intercom Terminal service type */
+ BT_SVC_SYNC_SERVICE = 0x00000800, /**< The Synchronization service type */
+ BT_SVC_BPP_SERVICE = 0x00001000, /**< The Print server service type */
+ BT_SVC_BIP_SERVICE = 0x00002000, /**< The Basic Imaging service type */
+ BT_SVC_PANU_SERVICE = 0x00004000, /**< The PAN User service type */
+ BT_SVC_NAP_SERVICE = 0x00008000, /**< The PAN Network access point service type */
+ BT_SVC_GN_SERVICE = 0x00010000, /**< The PAN Group Ad-hoc networks service type */
+ BT_SVC_SAP_SERVICE = 0x00020000, /**< The SIM Access Profile service type */
+ BT_SVC_A2DP_SERVICE = 0x00040000, /**< An advanced audio distribution service type */
+ BT_SVC_AVRCP_SERVICE = 0x00080000, /**< An A/V remote control service type */
+ BT_SVC_HID_SERVICE = 0x00100000, /**< The HID profile service type */
+ BT_SVC_VDP_SERVICE = 0x00200000, /**< The VDP profile service type */
+ BT_SVC_PBAP_SERVICE = 0x00400000, /**< The PhoneBook Access service type */
+ BT_SVC_HSP_HS_SERVICE = 0x00800000, /**< The Headset service type */
+ BT_SVC_HFP_HS_SERVICE = 0x01000000, /**< The Hands-free Headset service type */
+ BT_SVC_HCRP_SERVICE = 0x02000000, /**< The Hardcopy cable replacement profile service type
+ * @if OSPCOMPAT @b Since: @b 2.0 @endif
+ */
+ BT_SVC_DID_SERVICE = 0x04000000, /**< The device identification profile service type
+ * @if OSPCOMPAT @b Since: @b 2.0 @endif
+ */
+ BT_SVC_HDP_SERVICE = 0x08000000, /**< The health device profile service type
+ * @if OSPCOMPAT @b Since: @b 2.0 @endif
+ */
+ BT_SVC_MAP_SERVICE = 0x10000000, /**< The message access profile service type
+ * @if OSPCOMPAT @b Since: @b 2.0 @endif
+ */
+ BT_SVC_ALL_SERVICE = 0x01FFFFFF, /**< The All-services-supported-by-BTA service type
+ * @if OSPDEPREC
+ * @deprecated This enumeration field is deprecated.
+ * @endif
+
+ */
+ BT_SVC_NONE = 0 /**< The No service or unknown service type */
+};
+
+/**
+ * The serial port profile UUID (00001101-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_SPP[];
+
+/**
+ * The LAN access profile UUID (00001102-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_LAP[];
+
+/**
+ * The dial-up networking profile UUID (00001103-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_DUN[];
+
+/**
+ * The synchronization profile UUID (00001104-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_SYNC[];
+
+/**
+ * The object push profile UUID (00001105-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_OPP[];
+
+/**
+ * The file transfer profile UUID (00001106-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_FTP[];
+
+/**
+ * The synchronization profile UUID (00001107-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_SYNC_COMMAND[];
+
+/**
+ * The headset profile UUID (00001108-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_HSP[];
+
+/**
+ * The cordless telephony profile UUID (00001109-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_CTP[];
+
+/**
+ * The advanced audio distribution profile source UUID (0000110A-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_A2DP_SOURCE[];
+
+/**
+ * The advanced audio distribution profile - sink UUID (0000110B-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_A2DP_SINK[];
+
+/**
+ * The audio/video remote control profile - target UUID (0000110C-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_AVRCP_TARGET[];
+
+/**
+ * The advanced audio distribution profile UUID (0000110D-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_A2DP[];
+
+/**
+ * The audio/video remote control profile UUID (0000110E-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_AVRCP[];
+
+/**
+ * The audio/video remote control profile - controller UUID (0000110F-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_AVRCP_CONTROLLER[];
+
+/**
+ * The intercom profile UUID (00001110-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_ICP[];
+
+/**
+ * The fax profile UUID (00001111-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_FAX[];
+
+/**
+ * The headset profile audio gateway UUID (00001112-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_HSP_AG[];
+
+/**
+ * The personal area networking profile - user UUID (00001115-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_PAN_PANU[];
+
+/**
+ * The personal area networking profile - network access point UUID (00001116-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_PAN_NAP[];
+
+/**
+ * The personal area networking profile - group ad-hoc networks UUID (00001117-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_PAN_GN[];
+
+/**
+ * The basic printing profile - direct printing UUID (00001118-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_BPP_DIRECT_PRINTING[];
+
+/**
+ * The basic printing profile - reference printing UUID (00001119-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_BPP_REFERENCE_PRINTING[];
+
+/**
+ * The basic imaging profile UUID (0000111A-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_BIP[];
+
+/**
+ * The basic imaging profile - imaging responder UUID (0000111B-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_BIP_RESPONDER[];
+
+/**
+ * The basic imaging profile - imaging automatic archive UUID (0000111C-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_BIP_AUTOMATIC_ARCHIVE[];
+
+/**
+ * The basic imaging profile - imaging referenced objects UUID (0000111D-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_BIP_REFERENCED_OBJECTS[];
+
+/**
+ * The hands-free profile UUID (0000111E-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_HFP[];
+
+/**
+ * The hands-free profile - audio gateway UUID (0000111F-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_HFP_AG[];
+
+/**
+ * The basic printing profile - direct printing referenced objects UUID (00001120-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_BPP_DIRECT_PRINTING_RO[];
+
+/**
+ * The basic printing profile - reflected UI UUID (00001121-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_BPP_REFLECTED_UI[];
+
+/**
+ * The basic printing profile - basic printing UUID (00001122-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_BPP_BASIC_PRINTING[];
+
+/**
+ * The basic printing profile - printing status UUID (00001123-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_BPP_PRINTING_STATUS[];
+
+/**
+ * The human interface device profile UUID (00001124-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_HID[];
+
+/**
+ * The hardcopy cable replacement profile UUID (00001125-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_HCRP[];
+
+/**
+ * The hardcopy cable replacement profile - print UUID (00001126-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_HCRP_PRINT[];
+
+/**
+ * The hardcopy cable replacement profile - scan UUID (00001127-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_HCRP_SCAN[];
+
+/**
+ * The SIM access profile UUID (0000112D-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_SAP[];
+
+/**
+ * The phone book access - client equipment UUID (0000112E-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_PBAP_PCE[];
+
+/**
+ * The phone book access - server equipment UUID (0000112F-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_PBAP_PSE[];
+
+/**
+ * The phone book access UUID (00001130-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_PBAP[];
+
+/**
+ * The headset profile - headset UUID (00001131-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_HSP_HS[];
+
+/**
+ * The message access profile - message access server UUID (00001132-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_MAP_ACCESS_SERVER[];
+
+/**
+ * The message access profile - message notification server UUID (00001133-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_MAP_NOTIFICATION_SERVER[];
+
+/**
+ * The message access profile - message access profile UUID (00001134-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_MAP_ACCESS_PROFILE[];
+
+/**
+ * The device identification profile - PNP information UUID (00001200-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_DID_PNP_INFORMATION[];
+
+/**
+ * The generic networking UUID (00001201-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_GENERIC_NETWORKING[];
+
+/**
+ * The generic file transfer UUID (00001202-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_GENERIC_FILE_TRANSFER[];
+
+/**
+ * The generic audio UUID (00001203-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_GENERIC_AUDIO[];
+
+/**
+ * The generic telephony UUID. (00001204-0000-1000-8000-00805F9B34FB)
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_GENERIC_TELEPHONY[];
+
+/**
+ * The video distribution profile - source UUID (00001303-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_VDP_SOURCE[];
+
+/**
+ * The video distribution profile - sink UUID (00001304-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_VDP_SINK[];
+
+/**
+ * The video distribution profile - distribution UUID (00001305-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_VDP_DISTRIBUTION[];
+
+/**
+ * The health device profile UUID (00001400-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_HDP[];
+
+/**
+ * The health device profile - source UUID (00001401-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_HDP_SOURCE[];
+
+/**
+ * The health device profile - sink UUID (00001402-0000-1000-8000-00805F9B34FB).
+ *
+ * @since 2.0
+ */
+_OSP_EXPORT_ extern const byte BT_SVC_UUID_HDP_SINK[];
+
+} } }
+#endif // _FNET_BT_BLUETOOTH_TYPES_H_
diff --git a/inc/FNetBtIBluetoothDeviceEventListener.h b/inc/FNetBtIBluetoothDeviceEventListener.h
new file mode 100755
index 0000000..23f0eb8
--- /dev/null
+++ b/inc/FNetBtIBluetoothDeviceEventListener.h
@@ -0,0 +1,206 @@
+//
+// Open Service Platform
+// 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 FNetBtIBluetoothDeviceEventListener.h
+ * @brief This is the header file for the %IBluetoothDeviceEventListener interface.
+ *
+ * This header file contains the declarations of the %IBluetoothDeviceEventListener interface.
+ */
+#ifndef _FNET_BT_IBLUETOOTH_DEVICE_EVENT_LISTENER_H_
+#define _FNET_BT_IBLUETOOTH_DEVICE_EVENT_LISTENER_H_
+
+#include <FBaseResult.h>
+#include <FBaseRtIEventListener.h>
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// forward declaration
+class BluetoothDevice;
+
+/**
+ * @interface IBluetoothDeviceEventListener
+ * @brief This interface implements the listener for %Bluetooth remote device events.
+ *
+ * @since 2.0
+ *
+ * The %IBluetoothDeviceEventListener interface specifies the methods used to create notifications for the different
+ * kinds of %Bluetooth remote device events, including device discovery, service discovery, and pairing of the devices.
+ * When a %Bluetooth device event is generated, one of these methods is called.
+ *
+ * For more information on the class features, see
+ * <a href="../org.tizen.native.appprogramming/html/guide/net/bluetooth_namespace.htm">Bluetooth Guide</a>.
+ */
+class _OSP_EXPORT_ IBluetoothDeviceEventListener
+ : public Base::Runtime::IEventListener
+{
+public:
+ /**
+ * This polymorphic destructor should be overridden if required. This way, the destructors of the derived classes
+ * are called when the destructor of this interface is called.
+ *
+ * @since 2.0
+ */
+ virtual ~IBluetoothDeviceEventListener(void) {}
+
+ /**
+ * Called when the device discovery process for finding the nearby %Bluetooth devices has started.
+ *
+ * @since 2.0
+ *
+ * @param[in] r The start status
+ * @exception E_SUCCESS The device discovery process is launched successfully.
+ * @exception E_SYSTEM A system error has occurred.
+ * @see BluetoothManager::StartDiscovery()
+ */
+ virtual void OnBluetoothDiscoveryStarted(result r) = 0;
+
+ /**
+ * Called when a remote device is found during the device discovery process.
+ *
+ * @since 2.0
+ *
+ * @param[in] pFoundDevice The remote device that is found
+ * @remarks This event may be issued only if the device discovery process has started successfully.
+ * @see BluetoothManager::StartDiscovery()
+ */
+ virtual void OnBluetoothRemoteDeviceFoundN(BluetoothDevice* pFoundDevice) = 0;
+
+ /**
+ * Called when the device discovery process for finding the nearby %Bluetooth devices has completed.
+ *
+ * @since 2.0
+ *
+ * @param[in] isCompleted Set to @c true if the device discovery process is successfully completed, @n
+ * else @c false @n
+ * For example, the discovery is canceled.
+ * @remarks This event must be issued only if the discovery starts successfully.
+ * @see BluetoothManager::CancelDiscovery()
+ */
+ virtual void OnBluetoothDiscoveryDone(bool isCompleted) = 0;
+
+ /**
+ * Called when a service list is received from a remote device using the service discovery process.
+ *
+ * @since 2.0
+ *
+ * @param[in] targetDevice The remote device that sends its service list
+ * @param[in] serviceList The service list that is received
+ * @param[in] r The result of receiving the service list
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_REMOTE_SERVICE_NOT_FOUND The service list of the remote device is not found.
+ * @exception E_SYSTEM A system error has occurred.
+ * @remarks @c serviceList consists of Bluetooth::BluetoothServiceType values which are joined by OR
+ * operator.
+ */
+ virtual void OnBluetoothServiceListReceived(const BluetoothDevice& targetDevice, unsigned long serviceList, result r) = 0;
+
+ /**
+ * Called when a new remote device is paired with this local device.
+ *
+ * @since 2.0
+ *
+ * @param[in] pairedDevice The device to pair with the local device
+ * @remarks This method is able to be called even though the specified device already exists in the paired
+ * device list. Because the authorized key with the remote device is no more valid. @n
+ * @c pairedDevice may have no service list value and elements in the service UUID list because the
+ * retrieving the service list from the remote device fails. In that case, call
+ * BluetoothManager::RetrieveServiceList() to get the service list from the paired device. @n
+ * If the pairing is explicitly requested by BluetoothManager::Pair() and the request fails,
+ * IBluetoothDeviceEventListener::OnBluetoothPairingFailed() is called instead of this method.
+ * @see BluetoothManager::Pair()
+ * @see OnBluetoothPairingFailed()
+ */
+ virtual void OnBluetoothPaired(const BluetoothDevice& pairedDevice) = 0;
+
+ /**
+ * Called when the already paired device is unpaired with this local device.
+ *
+ * @since 2.0
+ *
+ * @param[in] unpairedDevice The device to unpair with the local device
+ */
+ virtual void OnBluetoothUnpaired(const BluetoothDevice& unpairedDevice) = 0;
+
+ /**
+ * Called when the pairing request with the specific remote device fails.
+ *
+ * @since 2.0
+ *
+ * @param[in] r The error result of the pairing request. @n
+ * One of the following exception is thrown.
+ * @exception E_OPERATION_CANCELED The pairing operation is canceled explicitly.
+ * @exception E_TIMEOUT The pairing request has timed out because the remote device does not
+ * respond within 60 seconds.
+ * @exception E_OPERATION_FAILED The operation has failed.
+ * @see BluetoothManager::Pair()
+ * @see BluetoothManager::CancelPair()
+ * @see OnBluetoothPaired()
+ */
+ virtual void OnBluetoothPairingFailed(result r) {}
+
+protected:
+ //
+ // This method is for internal use only. Using this method can cause behavioral, security-related, and consistency-related issues in the application.
+ //
+ // This method is reserved and may change its name at any time without prior notice.
+ //
+ // @since 2.0
+ //
+ virtual void IBluetoothDeviceEventListener_Reserved1(void) {}
+
+ //
+ // This method is for internal use only. Using this method can cause behavioral, security-related, and consistency-related issues in the application.
+ //
+ // This method is reserved and may change its name at any time without prior notice.
+ //
+ // @since 2.0
+ //
+ virtual void IBluetoothDeviceEventListener_Reserved2(void) {}
+
+ //
+ //
+ // This method is for internal use only. Using this method can cause behavioral, security-related, and consistency-related issues in the application.
+ //
+ // This method is reserved and may change its name at any time without prior notice.
+ //
+ // @since 2.0
+ //
+ virtual void IBluetoothDeviceEventListener_Reserved3(void) {}
+
+ //
+ // This method is for internal use only. Using this method can cause behavioral, security-related, and consistency-related issues in the application.
+ //
+ // This method is reserved and may change its name at any time without prior notice.
+ //
+ // @since 2.0
+ //
+ virtual void IBluetoothDeviceEventListener_Reserved4(void) {}
+
+ //
+ // This method is for internal use only. Using this method can cause behavioral, security-related, and consistency-related issues in the application.
+ //
+ // This method is reserved and may change its name at any time without prior notice.
+ //
+ // @since 2.0
+ //
+ virtual void IBluetoothDeviceEventListener_Reserved5(void) {}
+}; // IBluetoothDeviceEventListener
+
+} } }
+#endif // _FNET_BT_IBLUETOOTH_DEVICE_EVENT_LISTENER_H_
diff --git a/inc/FNetBtIBluetoothHealthEventListener.h b/inc/FNetBtIBluetoothHealthEventListener.h
new file mode 100755
index 0000000..90ab3ec
--- /dev/null
+++ b/inc/FNetBtIBluetoothHealthEventListener.h
@@ -0,0 +1,139 @@
+//
+// Open Service Platform
+// 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 FNetBtIBluetoothHealthEventListener.h
+ * @brief This is the header file for the %IBluetoothHealthEventListener interface.
+ *
+ * This header file contains the declarations of the %IBluetoothHealthEventListener interface.
+ */
+#ifndef _FNET_BT_IBLUETOOTH_HEALTH_EVENT_LISTENER_H_
+#define _FNET_BT_IBLUETOOTH_HEALTH_EVENT_LISTENER_H_
+
+#include <FBaseResult.h>
+#include <FBaseRtIEventListener.h>
+#include <FNetBtBluetoothTypes.h>
+
+namespace Tizen { namespace Base
+{
+class ByteBuffer;
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+class BluetoothDevice;
+
+/**
+ * @interface IBluetoothHealthEventListener
+ * @brief This interface provides a listener for the %BluetoothHealth events.
+ * @since 2.0
+ *
+ * The %IBluetoothHealthEventListener interface specifies the methods used for creating notifications about the
+ * different kinds of BluetoothHealth events. When a %BluetoothHealth event is generated, one of these methods is called.
+ *
+ * For more information on the class features, see
+ * <a href="../org.tizen.native.appprogramming/html/guide/net/bluetooth_namespace.htm">Bluetooth Guide</a>.
+ */
+class _OSP_EXPORT_ IBluetoothHealthEventListener
+ : virtual public Base::Runtime::IEventListener
+{
+public:
+ /**
+ * This polymorphic destructor should be overridden if required. This way, the destructors of the derived classes
+ * are called when the destructor of this interface is called.
+ *
+ * @since 2.0
+ */
+ virtual ~IBluetoothHealthEventListener(void) {}
+
+ /**
+ * Called to notify when a connection with a health device is established.
+ *
+ * @since 2.0
+ * @param[in] channelId The channel ID of the established connection, @n
+ * else an invalid ID (-1) if the method is not successful
+ * @param[in] dataType The type of data used in the established connection which is defined in
+ * ISO/IEEE 11073-20601 and represents type of health device such as thermometer,
+ * heart rate monitor, weight scale, and so on
+ * @param[in] channelType The data channel type of the established connection
+ * @param[in] pRemoteDevice The remote health device to connect with the local device, @n
+ * else @c null if the method is not successful
+ * @param[in] r The result of the connection request. @n
+ * One of the following exception is thrown.
+ * @exception E_SUCCESS The connection is established successfully.
+ * @exception E_OPERATION_FAILED The connection request has failed.
+ */
+ virtual void OnHealthConnected(int channelId, int dataType, BluetoothHealthDataChannelType channelType,
+ const BluetoothDevice* pRemoteDevice, result r) = 0;
+
+ /**
+ * Called to notify that the connection with the specified channel ID is disconnected.
+ *
+ * @since 2.0
+ *
+ * @param[in] channelId The channel ID of the terminated connection
+ * @param[in] r The disconnection status. @n
+ * One of the following exception is thrown.
+ * @exception E_SUCCESS The specified connection (channel) is terminated successfully.
+ * @exception E_OPERATION_FAILED The method has failed to disconnect.
+ */
+ virtual void OnHealthDisconnected(int channelId, result r) = 0;
+
+ /**
+ * Called to notify when the data has been received on the specified channel.
+ *
+ * @since 2.0
+ *
+ * @param[in] channelId The channel ID of the connection to receive data
+ * @param[in] buffer The data to receive
+ */
+ virtual void OnHealthDataReceived(int channelId, Tizen::Base::ByteBuffer& buffer) = 0;
+
+protected:
+ //
+ // This method is for internal use only. Using this method can cause behavioral, security-related, and
+ // consistency-related issues in the application.
+ // This method is reserved and may change its name at any time without prior notice.
+ //
+ // @since 2.0
+ //
+ virtual void IBluetoothHealthEventListener_Reserved1(void) {};
+
+ //
+ // This method is for internal use only. Using this method can cause behavioral, security-related, and
+ // consistency-related issues in the application.
+ // This method is reserved and may change its name at any time without prior notice.
+ //
+ // @since 2.0
+ //
+ virtual void IBluetoothHealthEventListener_Reserved2(void) {};
+
+ //
+ //
+ // This method is for internal use only. Using this method can cause behavioral, security-related, and
+ // consistency-relatedissues in the application.
+ // This method is reserved and may change its name at any time without prior notice.
+ //
+ // @since 2.0
+ //
+ virtual void IBluetoothHealthEventListener_Reserved3(void) {};
+
+}; // IBluetoothHealthEventListener
+
+} } }
+#endif // _FNET_BT_IBLUETOOTH_HEALTH_EVENT_LISTENER_H_
diff --git a/inc/FNetBtIBluetoothManagerEventListener.h b/inc/FNetBtIBluetoothManagerEventListener.h
new file mode 100755
index 0000000..0b56853
--- /dev/null
+++ b/inc/FNetBtIBluetoothManagerEventListener.h
@@ -0,0 +1,119 @@
+//
+// Open Service Platform
+// 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 FNetBtIBluetoothManagerEventListener.h
+ * @brief This is the header file for the %IBluetoothManagerEventListener interface.
+ *
+ * This header file contains the declarations of the %IBluetoothManagerEventListener interface.
+ */
+#ifndef _FNET_BT_IBLUETOOTH_MANAGER_EVENT_LISTENER_H_
+#define _FNET_BT_IBLUETOOTH_MANAGER_EVENT_LISTENER_H_
+
+#include <FBaseRtIEventListener.h>
+#include <FNetBtBluetoothTypes.h>
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+/**
+ * @interface IBluetoothManagerEventListener
+ * @brief This interface implements the listener for the %BluetoothManager events.
+ *
+ * @since 2.0
+ *
+ * The %IBluetoothManagerEventListener interface specifies the methods used for creating notifications about the
+ * different kinds of BluetoothManager events. When a BluetoothManager event is generated, one of these methods is
+ * called.
+ *
+ * For more information on the class features, see
+ * <a href="../org.tizen.native.appprogramming/html/guide/net/bluetooth_namespace.htm">Bluetooth Guide</a>.
+ */
+class _OSP_EXPORT_ IBluetoothManagerEventListener
+ : public Base::Runtime::IEventListener
+{
+public:
+ /**
+ * This polymorphic destructor should be overridden if required. This way, the destructors of the derived classes
+ * are called when the destructor of this interface is called.
+ *
+ * @since 2.0
+ */
+ virtual ~IBluetoothManagerEventListener(void) {}
+
+ /**
+ * Called when %Bluetooth is activated on the device.
+ *
+ * @since 2.0
+ *
+ * @param[in] r The activation status
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ virtual void OnBluetoothActivated(result r) = 0;
+
+ /**
+ * Called when %Bluetooth is deactivated on the device.
+ *
+ * @since 2.0
+ *
+ * @param[in] r The deactivation status
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ virtual void OnBluetoothDeactivated(result r) = 0;
+
+ /**
+ * Called when the discoverable mode is changed on the device.
+ *
+ * @since 2.0
+ *
+ * @param[in] mode The new discoverable mode to change
+ */
+ virtual void OnBluetoothDiscoverableModeChanged(BluetoothDiscoverableMode mode) {}
+
+protected:
+ //
+ // This method is for internal use only. Using this method can cause behavioral, security-related, and consistency-related issues in the application.
+ //
+ // This method is reserved and may change its name at any time without prior notice.
+ //
+ // @since 2.0
+ //
+ virtual void IBluetoothManagerEventListener_Reserved1(void) {};
+
+ //
+ // This method is for internal use only. Using this method can cause behavioral, security-related, and consistency-related issues in the application.
+ //
+ // This method is reserved and may change its name at any time without prior notice.
+ //
+ // @since 2.0
+ //
+ virtual void IBluetoothManagerEventListener_Reserved2(void) {};
+
+ //
+ // This method is for internal use only. Using this method can cause behavioral, security-related, and consistency-related issues in the application.
+ //
+ // This method is reserved and may change its name at any time without prior notice.
+ //
+ // @since 2.0
+ //
+ virtual void IBluetoothManagerEventListener_Reserved3(void) {};
+}; // IBluetoothManagerEventListener
+
+} } }
+#endif // _FNET_BT_IBLUETOOTH_MANAGER_EVENT_LISTENER_H_
diff --git a/inc/FNetBtIBluetoothOppClientEventListener.h b/inc/FNetBtIBluetoothOppClientEventListener.h
new file mode 100755
index 0000000..0835e26
--- /dev/null
+++ b/inc/FNetBtIBluetoothOppClientEventListener.h
@@ -0,0 +1,115 @@
+//
+// Open Service Platform
+// 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 FNetBtIBluetoothOppClientEventListener.h
+ * @brief This is the header file for the %IBluetoothOppClientEventListener interface.
+ *
+ * This header file contains the declarations of the %IBluetoothOppClientEventListener interface.
+ */
+#ifndef _FNET_BT_IBLUETOOTH_OPP_CLIENT_EVENT_LISTENER_H_
+#define _FNET_BT_IBLUETOOTH_OPP_CLIENT_EVENT_LISTENER_H_
+
+#include <FBaseString.h>
+#include <FBaseRtIEventListener.h>
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+/**
+ * @interface IBluetoothOppClientEventListener
+ * @brief This interface provides a listener for the %BluetoothOppClient events.
+ *
+ * @since 2.0
+ *
+ * The %IBluetoothOppClientEventListener interface specifies the methods used for creating notifications about the
+ * different kinds of BluetoothOppClient events. When a BluetoothOppClient event is generated, one of these methods
+ * is called.
+ *
+ * For more information on the class features, see
+ * <a href="../org.tizen.native.appprogramming/html/guide/net/bluetooth_namespace.htm">Bluetooth Guide</a>.
+ */
+class _OSP_EXPORT_ IBluetoothOppClientEventListener
+ : public Base::Runtime::IEventListener
+{
+public:
+ /**
+ * This polymorphic destructor should be overridden if required. This way, the destructors of the derived classes
+ * are called when the destructor of this interface is called.
+ *
+ * @since 2.0
+ */
+ virtual ~IBluetoothOppClientEventListener(void) {}
+
+ /**
+ * Called when the OPP server responded to the push request.
+ *
+ * @since 2.0
+ *
+ * @param[in] r The response status
+ * @exception E_SUCCESS The push request is accepted by the OPP server and the file transfer has begun.
+ * @exception E_REJECTED The push request is rejected by the OPP server. @n
+ * This exception is currently not in use.
+ * @exception E_TIMEOUT The push request is out of time.
+ * @exception E_SYSTEM A failure has occurred from the underlying system. @n
+ * This failure includes the rejection by the OPP server.
+ */
+ virtual void OnOppPushResponded(result r) = 0;
+
+ /**
+ * Called when the file is being transferred. @n
+ * Gets the progress information of the file transfer.
+ *
+ * @since 2.0
+ *
+ * @param[in] percent The progress in percentage ranging from @c 1 to @c 100 percent
+ * @see BluetoothOppClient::SetMinProgressInterval()
+ */
+ virtual void OnOppTransferInProgress(int percent) = 0;
+
+ /**
+ * Called when the file transfer has finished.
+ *
+ * @if OSPCOMPAT
+ * @brief <i> [Compatibility] </i>
+ * @endif
+ * @since 2.0
+ * @if OSPCOMPAT
+ * @compatibility This method has compatibility issues. @n
+ * For more information, see @ref CompIoPathPage "here".
+ *
+ * @endif
+ * @param[in] filePath The path of the file (including the file name) to transfer
+ * @param[in] fileSize The size of the file to transfer
+ * @param[in] isCompleted Set to @c true if the transfer is successfully completed, @n
+ * else @c false
+ */
+ virtual void OnOppTransferDone(const Tizen::Base::String& filePath, int fileSize, bool isCompleted) = 0;
+
+protected:
+ //
+ // This method is for internal use only. Using this method can cause behavioral, security-related, and consistency-related issues in the application.
+ //
+ // This method is reserved and may change its name at any time without prior notice.
+ //
+ // @since 2.0
+ //
+ virtual void IBluetoothOppClientEventListener_Reserved1(void) {};
+}; // IBluetoothOppClientEventListener
+
+} } }
+#endif // _FNET_BT_IBLUETOOTH_OPP_CLIENT_EVENT_LISTENER_H_
diff --git a/inc/FNetBtIBluetoothOppServerEventListener.h b/inc/FNetBtIBluetoothOppServerEventListener.h
new file mode 100755
index 0000000..2f5bf70
--- /dev/null
+++ b/inc/FNetBtIBluetoothOppServerEventListener.h
@@ -0,0 +1,108 @@
+//
+// Open Service Platform
+// 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 FNetBtIBluetoothOppServerEventListener.h
+ * @brief This is the header file for the %IBluetoothOppServerEventListener interface.
+ *
+ * This header file contains the declarations of the %IBluetoothOppServerEventListener interface.
+ */
+#ifndef _FNET_BT_IBLUETOOTH_OPP_SERVER_EVENT_LISTENER_H_
+#define _FNET_BT_IBLUETOOTH_OPP_SERVER_EVENT_LISTENER_H_
+
+#include <FBaseRtIEventListener.h>
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// forward declaration
+class BluetoothOppServer;
+class BluetoothDevice;
+/**
+ * @interface IBluetoothOppServerEventListener
+ * @brief This interface provides a listener for the %BluetoothOppServer events.
+ *
+ * @since 2.0
+ *
+ * The %IBluetoothOppServerEventListener interface specifies the methods used for creating notifications about the
+ * different kinds of BluetoothOppServer events. When a BluetoothOppServer event is generated, one of these methods
+ * is called.
+ * @n
+ * For more information on the class features, see
+ * <a href="../org.tizen.native.appprogramming/html/guide/net/bluetooth_namespace.htm">Bluetooth Guide</a>.
+ */
+class _OSP_EXPORT_ IBluetoothOppServerEventListener
+ : public Tizen::Base::Runtime::IEventListener
+{
+public:
+ /**
+ * This polymorphic destructor should be overridden if required. This way, the destructors of the derived classes
+ * are called when the destructor of this interface is called.
+ *
+ * @since 2.0
+ */
+ virtual ~IBluetoothOppServerEventListener(void) {}
+
+ /**
+ * Called when an incoming push request is received from a remote OPP client.
+ *
+ * @since 2.0
+ *
+ * @param[in] device The remote device to request the connection
+ */
+ virtual void OnOppPushRequested(const BluetoothDevice& device) = 0;
+
+ /**
+ * Called when the file is being transferred. @n
+ * Gets the progress information of the file transfer.
+ *
+ * @since 2.0
+ *
+ * @param[in] percent The progress in percentage ranging from @c 1 to @c 100 percent
+ * @see BluetoothOppServer::SetMinProgressInterval()
+ */
+ virtual void OnOppTransferInProgress(int percent) = 0;
+
+ /**
+ * Called when the file transfer has finished.
+ *
+ * @since 2.0
+ *
+ * @param[in] fileName The name of the file to transfer
+ * @param[in] fileSize The size of the file to transfer
+ * @param[in] isCompleted Set to @c true if the transfer is successfully completed, @n
+ * else @c false
+ * @remarks If the name of the received file already exists in the destination path, the received file is renamed
+ * automatically and @c isCompleted is set to @c true. For renaming, the specified postfix is appended to
+ * the original file name. The postfix consists of an underscore and three digit sequence numbers starting
+ * from 001. For example, "MySong.mp3" may be changed to "MySong_001.mp3".
+ */
+ virtual void OnOppTransferDone(const Tizen::Base::String& fileName, int fileSize, bool isCompleted) = 0;
+
+protected:
+ //
+ // This method is for internal use only. Using this method can cause behavioral, security-related, and consistency-related issues in the application.
+ //
+ // This method is reserved and may change its name at any time without prior notice.
+ //
+ // @since 2.0
+ //
+ virtual void IBluetoothOppServerEventListener_Reserved1(void) {};
+}; // IBluetoothOppServerEventListener
+
+} } }
+#endif // _FNET_BT_IBLUETOOTH_OPP_SERVER_EVENT_LISTENER_H_
diff --git a/inc/FNetBtIBluetoothSppAcceptorEventListener.h b/inc/FNetBtIBluetoothSppAcceptorEventListener.h
new file mode 100755
index 0000000..7298a41
--- /dev/null
+++ b/inc/FNetBtIBluetoothSppAcceptorEventListener.h
@@ -0,0 +1,105 @@
+//
+// Open Service Platform
+// 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 FNetBtIBluetoothSppAcceptorEventListener.h
+ * @brief This is the header file for the %IBluetoothSppAcceptorEventListener interface.
+ *
+ * This header file contains the declarations of the %IBluetoothSppAcceptorEventListener interface.
+ */
+#ifndef _FNET_BT_IBLUETOOTH_SPP_ACCEPTOR_EVENT_LISTENER_H_
+#define _FNET_BT_IBLUETOOTH_SPP_ACCEPTOR_EVENT_LISTENER_H_
+
+#include <FBaseByteBuffer.h>
+#include <FBaseRtIEventListener.h>
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// forward declaration
+class BluetoothSppAcceptor;
+class BluetoothDevice;
+
+/**
+ * @interface IBluetoothSppAcceptorEventListener
+ * @brief This interface provides a listener for the %BluetoothSppAcceptor events.
+ *
+ * @since 2.0
+ *
+ * The %IBluetoothSppAcceptorEventListener interface specifies the methods used for creating notifications about the
+ * different kinds of BluetoothSppAcceptor events. When a BluetoothSppAcceptor event is generated, one of these methods
+ * is called.
+ *
+ * For more information on the class features, see
+ * <a href="../org.tizen.native.appprogramming/html/guide/net/bluetooth_namespace.htm">Bluetooth Guide</a>.
+ */
+class _OSP_EXPORT_ IBluetoothSppAcceptorEventListener
+ : public Base::Runtime::IEventListener
+{
+public:
+ /**
+ * This polymorphic destructor should be overridden if required. This way, the destructors of the derived classes
+ * are called when the destructor of this interface is called.
+ *
+ * @since 2.0
+ */
+ virtual ~IBluetoothSppAcceptorEventListener(void) {}
+
+ /**
+ * Called to notify an incoming connection request from a remote SPP initiator.
+ *
+ * @since 2.0
+ *
+ * @param[in] device The remote device to request the connection
+ * @remarks If BluetoothSppAcceptor::SendData() is invoked in this callback, it does not work as expected.
+ * Therefore, it must be invoked outside this callback thread.
+ */
+ virtual void OnSppConnectionRequested(const BluetoothDevice& device) = 0;
+
+ /**
+ * Called to notify that the connection is disconnected.
+ *
+ * @since 2.0
+ *
+ * @param[in] r The disconnection status
+ * @exception E_SUCCESS The connection is terminated successfully.
+ * @exception E_SYSTEM The method has failed to disconnect.
+ */
+ virtual void OnSppDisconnected(result r) = 0;
+
+ /**
+ * Called to notify when the data is received.
+ *
+ * @since 2.0
+ *
+ * @param[in] buffer The data to receive as a Tizen::Base::ByteBuffer
+ */
+ virtual void OnSppDataReceived(Tizen::Base::ByteBuffer& buffer) = 0;
+
+protected:
+ //
+ // This method is for internal use only. Using this method can cause behavioral, security-related, and consistency-related issues in the application.
+ //
+ // This method is reserved and may change its name at any time without prior notice.
+ //
+ // @since 2.0
+ //
+ virtual void IBluetoothSppAcceptorEventListener_Reserved1(void) {};
+}; // IBluetoothSppAcceptorEventListener
+
+} } }
+#endif // _FNET_BT_IBLUETOOTH_SPP_ACCEPTOR_EVENT_LISTENER_H_
diff --git a/inc/FNetBtIBluetoothSppInitiatorEventListener.h b/inc/FNetBtIBluetoothSppInitiatorEventListener.h
new file mode 100755
index 0000000..f78ce6e
--- /dev/null
+++ b/inc/FNetBtIBluetoothSppInitiatorEventListener.h
@@ -0,0 +1,96 @@
+//
+// Open Service Platform
+// 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 FNetBtIBluetoothSppInitiatorEventListener.h
+ * @brief This is the header file for the %IBluetoothSppInitiatorEventListener interface.
+ *
+ * This header file contains the declarations of the %IBluetoothSppInitiatorEventListener interface.
+ */
+#ifndef _FNET_BT_IBLUETOOTH_SPP_INITIATOR_EVENT_LISTENER_H_
+#define _FNET_BT_IBLUETOOTH_SPP_INITIATOR_EVENT_LISTENER_H_
+
+#include <FBaseByteBuffer.h>
+#include <FBaseRtIEventListener.h>
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+/**
+ * @interface IBluetoothSppInitiatorEventListener
+ * @brief This interface provides a listener for the %BluetoothSppInitiator events.
+ *
+ * @since 2.0
+ *
+ * The %IBluetoothSppInitiatorEventListener interface specifies the methods used for creating notifications about the
+ * different kinds of BluetoothSppInitiator events. When a BluetoothSppInitiator event is generated, one of these
+ * methods is called.
+ *
+ * For more information on the class features, see
+ * <a href="../org.tizen.native.appprogramming/html/guide/net/bluetooth_namespace.htm">Bluetooth Guide</a>.
+ */
+class _OSP_EXPORT_ IBluetoothSppInitiatorEventListener
+ : public Base::Runtime::IEventListener
+{
+public:
+ /**
+ * This polymorphic destructor should be overridden if required. This way, the destructors of the derived classes
+ * are called when the destructor of this interface is called.
+ *
+ * @since 2.0
+ */
+ virtual ~IBluetoothSppInitiatorEventListener(void) {}
+
+ /**
+ * Called to notify when an SPP acceptor responds to the connection request.
+ *
+ * @since 2.0
+ *
+ * @param[in] r The status of the connection response
+ * @exception E_SUCCESS The connection request is accepted by the SPP acceptor and the file transfer has
+ * begun.
+ * @exception E_REJECTED The connection request is rejected by the SPP acceptor. @n
+ * This exception is currently not in use.
+ * @exception E_TIMEOUT The connection request has timed out.
+ * @exception E_SYSTEM A failure has occurred from the underlying system. @n
+ * This failure includes the rejection by the SPP acceptor.
+ */
+ virtual void OnSppConnectionResponded(result r) = 0;
+
+ /**
+ * Called to notify that the connection is disconnected.
+ *
+ * @since 2.0
+ *
+ * @param[in] r The disconnection status
+ * @exception E_SUCCESS The connection is terminated successfully.
+ * @exception E_SYSTEM The method has failed to disconnect.
+ */
+ virtual void OnSppDisconnected(result r) = 0;
+
+ /**
+ * Called to notify when the data has been received.
+ *
+ * @since 2.0
+ *
+ * @param[in] buffer The data to receive
+ */
+ virtual void OnSppDataReceived(Tizen::Base::ByteBuffer& buffer) = 0;
+}; // IBluetoothSppInitiatorEventListener
+
+} } }
+#endif // _FNET_BT_IBLUETOOTH_SPP_INITIATOR_EVENT_LISTENER_H_
diff --git a/osp-bluetooth.manifest b/osp-bluetooth.manifest
new file mode 100644
index 0000000..ae3e6f7
--- /dev/null
+++ b/osp-bluetooth.manifest
@@ -0,0 +1,5 @@
+<manifest>
+ <request>
+ <domain name="_"/>
+ </request>
+</manifest> \ No newline at end of file
diff --git a/osp-bluetooth.pc.in b/osp-bluetooth.pc.in
new file mode 100755
index 0000000..eb6c3b7
--- /dev/null
+++ b/osp-bluetooth.pc.in
@@ -0,0 +1,14 @@
+# Package Information for pkg-config
+
+prefix=@PREFIX@
+exec_prefix=/usr
+libdir=/usr/lib/osp
+includedir=/usr/include/osp
+
+Name: @PC_NAME@
+Description: @PACKAGE_DESCRIPTION@
+Version: @VERSION@
+Requires: @PC_REQUIRED@
+Libs: -L${libdir} @PC_LDFLAGS@
+Cflags: -I${includedir}
+
diff --git a/packaging/osp-bluetooth.spec b/packaging/osp-bluetooth.spec
new file mode 100755
index 0000000..ba9a2f6
--- /dev/null
+++ b/packaging/osp-bluetooth.spec
@@ -0,0 +1,91 @@
+%define debug_package %{nil}
+%define __strip /bin/true
+
+Name: osp-bluetooth
+Summary: osp bluetooth library
+Version: 1.2.0.0
+Release: 2
+Group: System/Libraries
+License: TO_BE/FILLED_IN
+Source0: %{name}-%{version}.tar.gz
+BuildRequires: cmake
+BuildRequires: pkgconfig(chromium)
+BuildRequires: pkgconfig(glib-2.0)
+BuildRequires: pkgconfig(capi-system-info)
+BuildRequires: pkgconfig(capi-system-device)
+BuildRequires: pkgconfig(capi-network-bluetooth)
+BuildRequires: pkgconfig(osp-appfw)
+BuildRequires: osp-appfw-internal-devel
+BuildRequires: pkgconfig(osp-net)
+BuildRequires: osp-net-internal-devel
+
+# runtime requires
+Requires: osp-appfw
+Requires: osp-net
+
+%description
+osp bluetooth library
+
+%package devel
+Summary: osp bluetooth library (Development)
+Group: TO_BE/FILLED_IN
+Requires: %{name} = %{version}-%{release}
+
+%description devel
+osp bluetooth library (DEV)
+
+%package internal-devel
+Summary: osp bluetooth library (Internal)
+Group: TO_BE/FILLED_IN
+Requires: %{name} = %{version}-%{release}
+
+%description internal-devel
+osp bluetooth library (Internal-DEV)
+
+%package debug
+Summary: osp bluetooth library (Development)
+Group: TO_BE/FILLED_IN
+Requires: %{name} = %{version}-%{release}
+
+%description debug
+osp bluetooth library (DEV)
+
+%prep
+%setup -q
+
+%build
+MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'`
+%ifarch %{ix86}
+CXXFLAGS="$CXXFLAGS -D_OSP_DEBUG_ -D_OSP_X86_ -D_OSP_EMUL_" cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DFULLVER=%{version} -DMAJORVER=${MAJORVER}
+%else
+CXXFLAGS="-O2 -g -pipe -Wall -fno-exceptions -Wformat -Wformat-security -Wl,--as-needed -fmessage-length=0 -march=armv7-a -mtune=cortex-a8 -mlittle-endian -mfpu=neon -mfloat-abi=softfp -D__SOFTFP__ -mthumb -Wa,-mimplicit-it=thumb -funwind-tables -D_OSP_DEBUG_ -D_OSP_ARMEL_" cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DFULLVER=%{version} -DMAJORVER=${MAJORVER}
+%endif
+
+# Call make instruction with smp support
+make %{?jobs:-j%jobs}
+
+%install
+rm -rf %{buildroot}
+mkdir -p %{buildroot}/usr/share/license
+cp %{_builddir}/%{name}-%{version}/LICENSE.APLv2.0 %{buildroot}/usr/share/license/%{name}
+
+%make_install
+
+%post -p /sbin/ldconfig
+
+%postun -p /sbin/ldconfig
+
+%files
+%manifest osp-bluetooth.manifest
+/usr/share/license/%{name}
+%{_libdir}/osp/*.so*
+
+%files devel
+%{_includedir}/osp/*.h
+%{_libdir}/pkgconfig/osp-bluetooth.pc
+
+%files internal-devel
+%{_includedir}/osp/net/*.h
+
+%files debug
+%{_libdir}/osp/debug/*.so*
diff --git a/src/FNetBtBluetoothDevice.cpp b/src/FNetBtBluetoothDevice.cpp
new file mode 100755
index 0000000..3221c7b
--- /dev/null
+++ b/src/FNetBtBluetoothDevice.cpp
@@ -0,0 +1,469 @@
+//
+// Open Service Platform
+// 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 FNetBtBluetoothDevice.cpp
+// @brief This is the implementation file for the BluetoothDevice class.
+//
+
+#include <FNetBtBluetoothTypes.h>
+#include <FNetBtBluetoothDevice.h>
+#include <FAppAppControl.h>
+#include <FBaseColIList.h>
+#include <FBaseLong.h>
+#include <FBaseShort.h>
+#include <FBaseSysLog.h>
+#include "FNetBt_BluetoothDeviceImpl.h"
+
+using namespace Tizen::Base;
+using namespace Tizen::Base::Runtime;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// The serial port profile UUID. (00001101-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_SPP[] = {0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The LAN access profile UUID. (00001102-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_LAP[] = {0x00, 0x00, 0x11, 0x02, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The dial-up networking profile UUID. (00001103-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_DUN[] = {0x00, 0x00, 0x11, 0x03, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The synchronization profile UUID. (00001104-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_SYNC[] = {0x00, 0x00, 0x11, 0x04, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The object push profile UUID. (00001105-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_OPP[] = {0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The file transfer profile UUID. (00001106-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_FTP[] = {0x00, 0x00, 0x11, 0x06, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The synchronization profile UUID. (00001107-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_SYNC_COMMAND[] = {0x00, 0x00, 0x11, 0x07, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The headset profile UUID. (00001108-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_HSP[] = {0x00, 0x00, 0x11, 0x08, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The cordless telephony profile UUID. (00001109-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_CTP[] = {0x00, 0x00, 0x11, 0x09, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The advanced audio distribution profile - source UUID. (0000110A-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_A2DP_SOURCE[] = {0x00, 0x00, 0x11, 0x0A, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The advanced audio distribution profile - sink UUID. (0000110B-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_A2DP_SINK[] = {0x00, 0x00, 0x11, 0x0B, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The audio/video remote control profile - target UUID. (0000110C-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_AVRCP_TARGET[] = {0x00, 0x00, 0x11, 0x0C, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The advanced audio distribution profile UUID. (0000110D-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_A2DP[] = {0x00, 0x00, 0x11, 0x0D, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The audio/video remote control profile UUID. (0000110E-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_AVRCP[] = {0x00, 0x00, 0x11, 0x0E, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The audio/video remote control profile - controller UUID. (0000110F-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_AVRCP_CONTROLLER[] = {0x00, 0x00, 0x11, 0x0F, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The intercom profile UUID. (00001110-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_ICP[] = {0x00, 0x00, 0x11, 0x10, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The fax profile UUID. (00001111-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_FAX[] = {0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The headset profile - audio gateway UUID. (00001112-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_HSP_AG[] = {0x00, 0x00, 0x11, 0x12, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The personal area networking profile - user UUID. (00001115-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_PAN_PANU[] = {0x00, 0x00, 0x11, 0x15, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The personal area networking profile - network access point UUID. (00001116-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_PAN_NAP[] = {0x00, 0x00, 0x11, 0x16, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The personal area networking profile - group ad-hoc networks UUID. (00001117-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_PAN_GN[] = {0x00, 0x00, 0x11, 0x17, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The basic printing profile - direct printing UUID. (00001118-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_BPP_DIRECT_PRINTING[] = {0x00, 0x00, 0x11, 0x18, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The basic printing profile - reference printing UUID. (00001119-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_BPP_REFERENCE_PRINTING[] = {0x00, 0x00, 0x11, 0x19, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The basic imaging profile UUID. (0000111A-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_BIP[] = {0x00, 0x00, 0x11, 0x1A, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The basic imaging profile - imaging responder UUID. (0000111B-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_BIP_RESPONDER[] = {0x00, 0x00, 0x11, 0x1B, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The basic imaging profile - imaging automatic archive UUID. (0000111C-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_BIP_AUTOMATIC_ARCHIVE[] = {0x00, 0x00, 0x11, 0x1C, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The basic imaging profile - imaging referenced objects UUID. (0000111D-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_BIP_REFERENCED_OBJECTS[] = {0x00, 0x00, 0x11, 0x1D, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The hands-free profile UUID. (0000111E-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_HFP[] = {0x00, 0x00, 0x11, 0x1E, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The hands-free profile - audio gateway UUID. (0000111F-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_HFP_AG[] = {0x00, 0x00, 0x11, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The basic printing profile - direct printing referenced objects UUID. (00001120-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_BPP_DIRECT_PRINTING_RO[] = {0x00, 0x00, 0x11, 0x20, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The basic printing profile - reflected UI UUID. (00001121-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_BPP_REFLECTED_UI[] = {0x00, 0x00, 0x11, 0x21, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The basic printing profile - basic printing UUID. (00001122-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_BPP_BASIC_PRINTING[] = {0x00, 0x00, 0x11, 0x22, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The basic printing profile - printing status UUID. (00001123-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_BPP_PRINTING_STATUS[] = {0x00, 0x00, 0x11, 0x23, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The human interface device profile UUID. (00001124-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_HID[] = {0x00, 0x00, 0x11, 0x24, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The hardcopy cable replacement profile UUID. (00001125-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_HCRP[] = {0x00, 0x00, 0x11, 0x25, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The hardcopy cable replacement profile - print UUID. (00001126-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_HCRP_PRINT[] = {0x00, 0x00, 0x11, 0x26, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The hardcopy cable replacement profile - scan UUID. (00001127-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_HCRP_SCAN[] = {0x00, 0x00, 0x11, 0x27, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The SIM access profile UUID. (0000112D-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_SAP[] = {0x00, 0x00, 0x11, 0x2D, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The phone book access - client equipment UUID. (0000112E-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_PBAP_PCE[] = {0x00, 0x00, 0x11, 0x2E, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The phone book access - server equipment UUID. (0000112F-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_PBAP_PSE[] = {0x00, 0x00, 0x11, 0x2F, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The phone book access UUID. (00001130-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_PBAP[] = {0x00, 0x00, 0x11, 0x30, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The headset profile - headset UUID. (00001131-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_HSP_HS[] = {0x00, 0x00, 0x11, 0x31, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The message access profile - message access server UUID. (00001132-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_MAP_ACCESS_SERVER[] = {0x00, 0x00, 0x11, 0x32, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The message access profile - message notification server UUID. (00001133-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_MAP_NOTIFICATION_SERVER[] = {0x00, 0x00, 0x11, 0x33, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The message access profile - message access profile UUID. (00001134-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_MAP_ACCESS_PROFILE[] = {0x00, 0x00, 0x11, 0x34, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The device identification profile - PNP information UUID. (00001200-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_DID_PNP_INFORMATION[] = {0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The generic networking UUID. (00001201-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_GENERIC_NETWORKING[] = {0x00, 0x00, 0x12, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The generic file transfer UUID. (00001202-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_GENERIC_FILE_TRANSFER[] = {0x00, 0x00, 0x12, 0x02, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The generic audio UUID. (00001203-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_GENERIC_AUDIO[] = {0x00, 0x00, 0x12, 0x03, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The generic telephony UUID. (00001204-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_GENERIC_TELEPHONY[] = {0x00, 0x00, 0x12, 0x04, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The video distribution profile - source UUID. (00001303-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_VDP_SOURCE[] = {0x00, 0x00, 0x13, 0x03, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The video distribution profile - sink UUID. (00001304-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_VDP_SINK[] = {0x00, 0x00, 0x13, 0x04, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The video distribution profile - distribution UUID. (00001305-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_VDP_DISTRIBUTION[] = {0x00, 0x00, 0x13, 0x05, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The health device profile UUID. (00001400-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_HDP[] = {0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The health device profile - source UUID. (00001401-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_HDP_SOURCE[] = {0x00, 0x00, 0x14, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+// The health device profile - sink UUID. (00001402-0000-1000-8000-00805F9B34FB)
+const byte BT_SVC_UUID_HDP_SINK[] = {0x00, 0x00, 0x14, 0x02, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+
+
+BluetoothDevice::BluetoothDevice(void)
+ : __pImpl(null)
+{
+ __pImpl = new (std::nothrow) _BluetoothDeviceImpl();
+ SysTryReturnVoidResult(NID_NET_BT, __pImpl, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+}
+
+BluetoothDevice::BluetoothDevice(const Tizen::Base::ByteBuffer& address, const Base::String& deviceName, BluetoothMajorDeviceClassType majorClassType, BluetoothMinorDeviceClassType minorClassType, unsigned long serviceClassList, unsigned long serviceList)
+ : __pImpl(null)
+{
+ __pImpl = new (std::nothrow) _BluetoothDeviceImpl(address, deviceName, majorClassType, minorClassType, serviceClassList, serviceList);
+ SysTryReturnVoidResult(NID_NET_BT, __pImpl, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+}
+
+BluetoothDevice::BluetoothDevice(const BluetoothDevice& value)
+ : __pImpl(null)
+{
+ __pImpl = new (std::nothrow) _BluetoothDeviceImpl(*value.__pImpl);
+ SysTryReturnVoidResult(NID_NET_BT, __pImpl, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+}
+
+BluetoothDevice::~BluetoothDevice(void)
+{
+ delete __pImpl;
+}
+
+BluetoothDevice&
+BluetoothDevice::operator =(const BluetoothDevice& rhs)
+{
+ if (this != &rhs)
+ {
+ *__pImpl = *rhs.__pImpl;
+ }
+
+ return *this;
+}
+
+const Tizen::Base::ByteBuffer*
+BluetoothDevice::GetAddress(void) const
+{
+ return __pImpl->GetAddress();
+}
+
+result
+BluetoothDevice::SetAddress(const Tizen::Base::ByteBuffer& address)
+{
+ return __pImpl->SetAddress(address);
+}
+
+String
+BluetoothDevice::GetName(void) const
+{
+ return __pImpl->GetName();
+}
+
+bool
+BluetoothDevice::IsPaired(void) const
+{
+ return __pImpl->IsPaired();
+}
+
+int
+BluetoothDevice::GetRssi(void) const
+{
+ return __pImpl->GetRssi();
+}
+
+BluetoothMajorDeviceClassType
+BluetoothDevice::GetMajorDeviceClassType(void) const
+{
+ return __pImpl->GetMajorDeviceClassType();
+}
+
+BluetoothMinorDeviceClassType
+BluetoothDevice::GetMinorDeviceClassType(void) const
+{
+ return __pImpl->GetMinorDeviceClassType();
+}
+
+unsigned long
+BluetoothDevice::GetServiceClassList(void) const
+{
+ return __pImpl->GetServiceClassList();
+}
+
+unsigned long
+BluetoothDevice::GetServiceList(void) const
+{
+ return __pImpl->GetServiceList();
+}
+
+const Tizen::Base::Collection::IList*
+BluetoothDevice::GetServiceUuidList(void) const
+{
+ return __pImpl->GetServiceUuidList();
+}
+
+bool
+BluetoothDevice::Equals(const Tizen::Base::Object& obj) const
+{
+ const BluetoothDevice* pOther = dynamic_cast <const BluetoothDevice*>(&obj);
+
+ if (pOther == null)
+ {
+ return false;
+ }
+
+ if (pOther == this)
+ {
+ return true;
+ }
+
+ return(__pImpl->Equals(*(pOther->__pImpl)));
+}
+
+int
+BluetoothDevice::GetHashCode(void) const
+{
+ return __pImpl->GetHashCode();
+}
+
+BluetoothDevice*
+BluetoothDevice::GetInstanceFromAppControlResultN(const Tizen::Base::Collection::IList& appControlResult)
+{
+ BluetoothDevice* pNewBtDevice = null;
+ String* pResultStrPtr = null;
+ String keywordStr;
+ String dataStr;
+ ByteBuffer btAddrBytes;
+ String deviceName;
+ long majClassType = 0;
+ long minClassType = 0;
+ long svcClassType = 0;
+ long svcType = 0;
+
+ ClearLastResult();
+
+ if (appControlResult.GetCount() != 7)
+ {
+ goto CATCH;
+ }
+
+ pResultStrPtr = (String*) appControlResult.GetAt(0);
+ if (pResultStrPtr->Equals(String(Tizen::App::APPCONTROL_RESULT_SUCCEEDED)) == false)
+ {
+ goto CATCH;
+ }
+
+ // Gets the address from index 1 as a String. E.g. 00-1E-2B-72-08-DB
+ pResultStrPtr = (String*) appControlResult.GetAt(1);
+ if ((pResultStrPtr->SubString(0, 9, keywordStr) != E_SUCCESS) ||
+ (keywordStr.Equals(String("addr_val:")) == false) ||
+ (pResultStrPtr->SubString(9, dataStr) != E_SUCCESS))
+ {
+ goto CATCH;
+ }
+
+ // Convert the type of the address to ByteBuffer
+ btAddrBytes.Construct(6);
+ if (_BluetoothDeviceImpl::GetAddressByteBuffer(dataStr, L"-", btAddrBytes) != E_SUCCESS)
+ {
+ goto CATCH;
+ }
+
+ keywordStr.Clear();
+ dataStr.Clear();
+
+ // Gets the name from index 2
+ pResultStrPtr = (String*) appControlResult.GetAt(2);
+ if ((pResultStrPtr->SubString(0, 9, keywordStr) != E_SUCCESS) ||
+ (keywordStr.Equals(String("dev_name:")) == false) ||
+ (pResultStrPtr->SubString(9, deviceName) != E_SUCCESS))
+ {
+ goto CATCH;
+ }
+
+ keywordStr.Clear();
+
+ // Gets the major device class from index 3
+ pResultStrPtr = (String*) appControlResult.GetAt(3);
+ if ((pResultStrPtr->SubString(0, 13, keywordStr) != E_SUCCESS) ||
+ (keywordStr.Equals(String("maj_cls_type:")) == false) ||
+ (pResultStrPtr->SubString(13, dataStr) != E_SUCCESS))
+ {
+ goto CATCH;
+ }
+
+ if (Long::Decode(dataStr, majClassType) != E_SUCCESS)
+ {
+ goto CATCH;
+ }
+
+ keywordStr.Clear();
+ dataStr.Clear();
+
+ // Gets the minor device class from index 4
+ pResultStrPtr = (String*) appControlResult.GetAt(4);
+ if ((pResultStrPtr->SubString(0, 13, keywordStr) != E_SUCCESS) ||
+ (keywordStr.Equals(String("min_cls_type:")) == false) ||
+ (pResultStrPtr->SubString(13, dataStr) != E_SUCCESS))
+ {
+ goto CATCH;
+ }
+
+ if (Long::Decode(dataStr, minClassType) != E_SUCCESS)
+ {
+ goto CATCH;
+ }
+
+ keywordStr.Clear();
+ dataStr.Clear();
+
+ // Gets the service classes as a bit-mask from index 5
+ pResultStrPtr = (String*) appControlResult.GetAt(5);
+ if ((pResultStrPtr->SubString(0, 13, keywordStr) != E_SUCCESS) ||
+ (keywordStr.Equals(String("svc_cls_type:")) == false) ||
+ (pResultStrPtr->SubString(13, dataStr) != E_SUCCESS))
+ {
+ goto CATCH;
+ }
+
+ if (Long::Decode(dataStr, svcClassType) != E_SUCCESS)
+ {
+ goto CATCH;
+ }
+
+ keywordStr.Clear();
+ dataStr.Clear();
+
+ // Gets the service types as a bit-mask from index 6
+ pResultStrPtr = (String*) appControlResult.GetAt(6);
+ if ((pResultStrPtr->SubString(0, 9, keywordStr) != E_SUCCESS) ||
+ (keywordStr.Equals(String("svc_type:")) == false) ||
+ (pResultStrPtr->SubString(9, dataStr) != E_SUCCESS))
+ {
+ goto CATCH;
+ }
+
+ if (Long::Decode(dataStr, svcType) != E_SUCCESS)
+ {
+ goto CATCH;
+ }
+
+ // Create an instance of BluetoothDevice.
+ pNewBtDevice =
+ new (std::nothrow) BluetoothDevice(btAddrBytes, deviceName, (BluetoothMajorDeviceClassType) majClassType,
+ (BluetoothMinorDeviceClassType) minClassType, svcClassType,
+ svcType);
+ if (pNewBtDevice == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] exception occurred on creating BluetoothDevice.");
+ SetLastResult(E_OUT_OF_MEMORY);
+ }
+
+ return pNewBtDevice;
+
+CATCH:
+
+ SysLogException(NID_NET_BT, E_INVALID_ARG, "[E_INVALID_ARG] exception occurred on parsing input data.");
+ SetLastResult(E_INVALID_ARG);
+
+ return null;
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBtBluetoothHealth.cpp b/src/FNetBtBluetoothHealth.cpp
new file mode 100644
index 0000000..24fa8e8
--- /dev/null
+++ b/src/FNetBtBluetoothHealth.cpp
@@ -0,0 +1,151 @@
+//
+// Open Service Platform
+// 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 FNetBtBluetoothHealth.cpp
+// @brief This is the implementation file for the BluetoothHealth class.
+//
+
+#include <FNetBtBluetoothHealth.h>
+#include <FNetBtBluetoothDevice.h>
+#include <FNetBtIBluetoothHealthEventListener.h>
+#include <FBaseByteBuffer.h>
+#include <FBaseSysLog.h>
+#include <FSec_AccessController.h>
+#include <FSys_SystemInfoImpl.h>
+#include "FNetBt_BluetoothHealthImpl.h"
+
+using namespace Tizen::Security;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+BluetoothHealth::BluetoothHealth(void)
+ : __pImpl(null)
+{
+}
+
+BluetoothHealth::~BluetoothHealth(void)
+{
+ delete __pImpl;
+}
+
+result
+BluetoothHealth::Construct(IBluetoothHealthEventListener& listener)
+{
+ result r = E_SUCCESS;
+ bool isBtSupported = false;
+
+ Tizen::System::_SystemInfoImpl::GetSysInfo(L"http://tizen.org/feature/network.bluetooth", isBtSupported);
+ SysTryReturnResult(NID_NET_BT, isBtSupported == true, E_UNSUPPORTED_OPERATION, "Bluetooth is not supported.");
+
+ SysAssertf(__pImpl == null,
+ "Already constructed. Calling Construct() twice or more on a same instance is not allowed for this class.");
+
+ __pImpl = new (std::nothrow) _BluetoothHealthImpl;
+ SysTryReturnResult(NID_NET_BT, __pImpl != null, E_OUT_OF_MEMORY, "Creation of a _BluetoothHealthImpl instance failed.");
+
+ r = __pImpl->Construct(listener);
+
+ if (r != E_SUCCESS)
+ {
+ delete __pImpl;
+ __pImpl = null;
+ }
+
+ return r;
+}
+
+result
+BluetoothHealth::StartAsSink(int dataType)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_HEALTH);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED,
+ "The application does not have the privilege to call this method.");
+
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->StartAsSink(dataType);
+}
+
+result
+BluetoothHealth::Stop(void)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_HEALTH);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED,
+ "The application does not have the privilege to call this method.");
+
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->Stop();
+}
+
+result
+BluetoothHealth::ConnectToSource(const BluetoothDevice& remoteDevice)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_HEALTH);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED,
+ "The application does not have the privilege to call this method.");
+
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->ConnectToSource(remoteDevice);
+}
+
+result
+BluetoothHealth::Disconnect(int channelId)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_HEALTH);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED,
+ "The application does not have the privilege to call this method.");
+
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->Disconnect(channelId);
+}
+
+result
+BluetoothHealth::SendData(int channelId, const Tizen::Base::ByteBuffer& buffer)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_HEALTH);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED,
+ "The application does not have the privilege to call this method.");
+
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->SendData(channelId, buffer);
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBtBluetoothManager.cpp b/src/FNetBtBluetoothManager.cpp
new file mode 100644
index 0000000..e0bffbd
--- /dev/null
+++ b/src/FNetBtBluetoothManager.cpp
@@ -0,0 +1,371 @@
+//
+// Open Service Platform
+// 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 FNetBtBluetoothManager.cpp
+// @brief This is the implementation file for the BluetoothManager class.
+//
+
+#include <FNetBtBluetoothManager.h>
+#include <FNetBtBluetoothDevice.h>
+#include <FNetBtIBluetoothManagerEventListener.h>
+#include <FNetBtIBluetoothDeviceEventListener.h>
+#include <FBaseByteBuffer.h>
+#include <FBaseColIList.h>
+#include <FBaseSysLog.h>
+#include <FSec_AccessController.h>
+#include <FSys_SystemInfoImpl.h>
+#include "FNetBt_BluetoothManagerImpl.h"
+
+using namespace Tizen::Base;
+using namespace Tizen::Base::Runtime;
+using namespace Tizen::Base::Collection;
+using namespace Tizen::Security;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+BluetoothManager::BluetoothManager(void)
+ : __pImpl(null)
+{
+}
+
+BluetoothManager::~BluetoothManager(void)
+{
+ delete __pImpl;
+}
+
+result
+BluetoothManager::Construct(IBluetoothManagerEventListener& listener)
+{
+ result r = E_SUCCESS;
+ bool isBtSupported = false;
+
+ r = Tizen::System::_SystemInfoImpl::GetSysInfo(L"http://tizen.org/feature/network.bluetooth", isBtSupported);
+ SysTryReturnResult(NID_NET_BT, (r == E_SUCCESS) && (isBtSupported == true), E_UNSUPPORTED_OPERATION,
+ "Bluetooth is not supported.");
+
+ SysAssertf(__pImpl == null,
+ "Already constructed. Calling Construct() twice or more on a same instance is not allowed for this class.");
+
+ __pImpl = new (std::nothrow) _BluetoothManagerImpl;
+
+ SysTryReturnResult(NID_NET_BT, __pImpl != null, E_OUT_OF_MEMORY, "Creation of a __pImpl instance failed.");
+
+ r = __pImpl->Construct(listener);
+
+ if (r != E_SUCCESS)
+ {
+ delete __pImpl;
+ __pImpl = null;
+ }
+
+ return r;
+}
+
+result
+BluetoothManager::Activate(void)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_ADMIN);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED,
+ "The application does not have the privilege to call this method.");
+
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->Activate();
+}
+
+result
+BluetoothManager::Deactivate(void)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_ADMIN);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED,
+ "The application does not have the privilege to call this method.");
+
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->Deactivate();
+}
+
+bool
+BluetoothManager::IsAvailable(BluetoothConnectionType type) const
+{
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->IsAvailable(type);
+}
+
+const BluetoothDevice*
+BluetoothManager::GetLocalDevice(void) const
+{
+ ClearLastResult();
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->GetLocalDevice();
+}
+
+Tizen::Base::String
+BluetoothManager::GetLocalDeviceAddress(void) const
+{
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->GetLocalDeviceAddress();
+}
+
+Tizen::Base::String
+BluetoothManager::GetLocalDeviceName(void) const
+{
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->GetLocalDeviceName();
+}
+
+BluetoothDeviceStateType
+BluetoothManager::GetLocalDeviceState() const
+{
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->GetLocalDeviceState();
+}
+
+bool
+BluetoothManager::IsActivated(void) const
+{
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->IsActivated();
+}
+
+BluetoothDiscoverableMode
+BluetoothManager::GetDiscoverableMode(void) const
+{
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->GetDiscoverableMode();
+}
+
+int
+BluetoothManager::GetRemainingTimeAsDiscoverable(void) const
+{
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->GetRemainingTimeAsDiscoverable();
+}
+
+bool
+BluetoothManager::IsDiscoveryInProgress(void) const
+{
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->IsDiscoveryInProgress();
+}
+
+result
+BluetoothManager::SetLocalDeviceName(const Tizen::Base::String& deviceName)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_ADMIN);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED,
+ "The application does not have the privilege to call this method.");
+
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->SetLocalDeviceName(deviceName);
+}
+
+result
+BluetoothManager::SetDiscoverableMode(BluetoothDiscoverableMode mode, int seconds)
+{
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ // Privilege check will be done by Impl class
+ return __pImpl->SetDiscoverableMode(mode, seconds);
+}
+
+result
+BluetoothManager::RefreshPairedDeviceList(void)
+{
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->RefreshPairedDeviceList();
+}
+
+const BluetoothDevice*
+BluetoothManager::GetPairedDeviceByAddress(const Tizen::Base::ByteBuffer& deviceAddress) const
+{
+ ClearLastResult();
+
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->GetPairedDeviceByAddress(deviceAddress);
+}
+
+BluetoothDevice*
+BluetoothManager::GetPairedDeviceByAddressN(const Tizen::Base::ByteBuffer& deviceAddress) const
+{
+ ClearLastResult();
+
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->GetPairedDeviceByAddressN(deviceAddress);
+}
+
+Tizen::Base::Collection::IList*
+BluetoothManager::GetPairedDeviceByNameN(const Base::String& deviceName) const
+{
+ ClearLastResult();
+
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->GetPairedDeviceByNameN(deviceName);
+}
+
+const BluetoothDevice*
+BluetoothManager::GetPairedDeviceAt(int index) const
+{
+ ClearLastResult();
+
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->GetPairedDeviceAt(index);
+}
+
+const Tizen::Base::Collection::IList*
+BluetoothManager::GetPairedDeviceList(void) const
+{
+ ClearLastResult();
+
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->GetPairedDeviceList();
+}
+
+Tizen::Base::Collection::IList*
+BluetoothManager::GetPairedDeviceListN(void) const
+{
+ ClearLastResult();
+
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->GetPairedDeviceListN();
+}
+
+result
+BluetoothManager::SetBluetoothDeviceListener(IBluetoothDeviceEventListener* pListener)
+{
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->SetBluetoothDeviceListener(pListener);
+}
+
+result
+BluetoothManager::StartDiscovery(void)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_GAP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED,
+ "The application does not have the privilege to call this method.");
+
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->StartDiscovery();
+}
+
+result
+BluetoothManager::CancelDiscovery(void)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_GAP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED,
+ "The application does not have the privilege to call this method.");
+
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->CancelDiscovery();
+}
+
+result
+BluetoothManager::RetrieveServiceList(const BluetoothDevice& pairedDevice)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_GAP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED,
+ "The application does not have the privilege to call this method.");
+
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->RetrieveServiceList(pairedDevice);
+}
+
+result
+BluetoothManager::Pair(const BluetoothDevice& remoteDevice)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_GAP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED,
+ "The application does not have the privilege to call this method.");
+
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->Pair(remoteDevice);
+}
+
+result
+BluetoothManager::CancelPair(void)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_GAP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED,
+ "The application does not have the privilege to call this method.");
+
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->CancelPair();
+}
+
+result
+BluetoothManager::Unpair(const BluetoothDevice& pairedDevice)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_GAP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED,
+ "The application does not have the privilege to call this method.");
+
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->Unpair(pairedDevice);
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBtBluetoothOppClient.cpp b/src/FNetBtBluetoothOppClient.cpp
new file mode 100644
index 0000000..bd33dc0
--- /dev/null
+++ b/src/FNetBtBluetoothOppClient.cpp
@@ -0,0 +1,111 @@
+//
+// Open Service Platform
+// 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 FNetBtBluetoothOppClient.cpp
+// @brief This is the implementation file for the BluetoothOppClient class.
+//
+
+#include <FNetBtBluetoothOppClient.h>
+#include <FNetBtBluetoothDevice.h>
+#include <FNetBtIBluetoothOppClientEventListener.h>
+#include <FBaseString.h>
+#include <FBaseSysLog.h>
+#include <FSec_AccessController.h>
+#include <FSys_SystemInfoImpl.h>
+#include "FNetBt_BluetoothOppClientImpl.h"
+
+using namespace Tizen::Security;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+BluetoothOppClient::BluetoothOppClient(void)
+ : __pImpl(null)
+{
+}
+
+BluetoothOppClient::~BluetoothOppClient(void)
+{
+ delete __pImpl;
+}
+
+result
+BluetoothOppClient::Construct(IBluetoothOppClientEventListener& listener)
+{
+ result r = E_SUCCESS;
+ bool isBtSupported = false;
+
+ Tizen::System::_SystemInfoImpl::GetSysInfo(L"http://tizen.org/feature/network.bluetooth", isBtSupported);
+ SysTryReturnResult(NID_NET_BT, isBtSupported == true, E_UNSUPPORTED_OPERATION, "Bluetooth is not supported.");
+
+ SysAssertf(__pImpl == null, "Already constructed. Calling Construct() twice or more on a same instance is not allowed for this class.");
+
+ __pImpl = new (std::nothrow) _BluetoothOppClientImpl;
+
+ SysTryReturnResult(NID_NET_BT, __pImpl != null, E_OUT_OF_MEMORY, "Creation of a _BluetoothOppClientImpl instance failed.");
+
+ r = __pImpl->Construct(listener);
+
+ if (r != E_SUCCESS)
+ {
+ delete __pImpl;
+ __pImpl = null;
+ }
+
+ return r;
+}
+
+
+result
+BluetoothOppClient::PushFile(const BluetoothDevice& remoteDevice, const Base::String& filePath)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_OPP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
+
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->PushFile(remoteDevice, filePath);
+}
+
+result
+BluetoothOppClient::CancelPush(void)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_OPP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
+
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->CancelPush();
+}
+
+result
+BluetoothOppClient::SetMinProgressInterval(int percent)
+{
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->SetMinProgressInterval(percent);
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBtBluetoothOppServer.cpp b/src/FNetBtBluetoothOppServer.cpp
new file mode 100644
index 0000000..6408760
--- /dev/null
+++ b/src/FNetBtBluetoothOppServer.cpp
@@ -0,0 +1,168 @@
+//
+// Open Service Platform
+// 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 FNetBtBluetoothOppServer.cpp
+// @brief This is the implementation file for the BluetoothOppServer class.
+//
+
+#include <FBaseString.h>
+#include <FNetBtBluetoothOppServer.h>
+#include <FNetBtIBluetoothOppServerEventListener.h>
+#include <FBaseSysLog.h>
+#include <FSec_AccessController.h>
+#include <FSys_SystemInfoImpl.h>
+#include "FNetBt_BluetoothOppServerImpl.h"
+
+using namespace Tizen::Security;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+BluetoothOppServer::BluetoothOppServer(void)
+ : __pImpl(null)
+{
+}
+
+BluetoothOppServer::~BluetoothOppServer(void)
+{
+ delete __pImpl;
+}
+
+result
+BluetoothOppServer::Construct(IBluetoothOppServerEventListener& listener)
+{
+ result r = E_SUCCESS;
+ bool isBtSupported = false;
+
+ Tizen::System::_SystemInfoImpl::GetSysInfo(L"http://tizen.org/feature/network.bluetooth", isBtSupported);
+ SysTryReturnResult(NID_NET_BT, isBtSupported == true, E_UNSUPPORTED_OPERATION, "Bluetooth is not supported.");
+
+ SysAssertf(__pImpl == null,
+ "Already constructed. Calling Construct() twice or more on a same instance is not allowed for this class.");
+
+ __pImpl = new (std::nothrow) _BluetoothOppServerImpl;
+ SysTryReturnResult(NID_NET_BT, __pImpl != null, E_OUT_OF_MEMORY, "Creation of a _BluetoothOppServerImpl instance failed.");
+
+ r = __pImpl->Construct(listener);
+
+ if (r != E_SUCCESS)
+ {
+ delete __pImpl;
+ __pImpl = null;
+ }
+
+ return r;
+}
+
+result
+BluetoothOppServer::AcceptPush(void)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_OPP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED,
+ "The application does not have the privilege to call this method.");
+
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->AcceptPush();
+}
+
+result
+BluetoothOppServer::RejectPush(void)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_OPP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED,
+ "The application does not have the privilege to call this method.");
+
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->RejectPush();
+}
+
+result
+BluetoothOppServer::SetDestinationPath(const Tizen::Base::String& dstPath)
+{
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->SetDestinationPath(dstPath);
+}
+
+result
+BluetoothOppServer::SetMinProgressInterval(int percent)
+{
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->SetMinProgressInterval(percent);
+}
+
+result
+BluetoothOppServer::StartService(const Tizen::Base::String& dstPath)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_OPP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED,
+ "The application does not have the privilege to call this method.");
+
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->StartService(dstPath);
+}
+
+result
+BluetoothOppServer::StopService(void)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_OPP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED,
+ "The application does not have the privilege to call this method.");
+
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->StopService();
+}
+
+result
+BluetoothOppServer::StopTransfer(void)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_OPP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED,
+ "The application does not have the privilege to call this method.");
+
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->StopTransfer();
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBtBluetoothSppAcceptor.cpp b/src/FNetBtBluetoothSppAcceptor.cpp
new file mode 100644
index 0000000..658c6ca
--- /dev/null
+++ b/src/FNetBtBluetoothSppAcceptor.cpp
@@ -0,0 +1,168 @@
+//
+// Open Service Platform
+// 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 FNetBtBluetoothSppAcceptor.cpp
+// @brief This is the implementation file for the BluetoothSppAcceptor class.
+//
+
+#include <FNetBtBluetoothSppAcceptor.h>
+#include <FNetBtIBluetoothSppAcceptorEventListener.h>
+#include <FBaseByteBuffer.h>
+#include <FBaseUuId.h>
+#include <FBaseSysLog.h>
+#include <FSec_AccessController.h>
+#include <FSys_SystemInfoImpl.h>
+#include "FNetBt_BluetoothSppAcceptorImpl.h"
+
+using namespace Tizen::Security;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+BluetoothSppAcceptor::BluetoothSppAcceptor(void)
+ : __pImpl(null)
+{
+}
+
+BluetoothSppAcceptor::~BluetoothSppAcceptor(void)
+{
+ delete __pImpl;
+}
+
+result
+BluetoothSppAcceptor::Construct(IBluetoothSppAcceptorEventListener& listener)
+{
+ result r = E_SUCCESS;
+ bool isBtSupported = false;
+
+ Tizen::System::_SystemInfoImpl::GetSysInfo(L"http://tizen.org/feature/network.bluetooth", isBtSupported);
+ SysTryReturnResult(NID_NET_BT, isBtSupported == true, E_UNSUPPORTED_OPERATION, "Bluetooth is not supported.");
+
+ SysAssertf(__pImpl == null,
+ "Already constructed. Calling Construct() twice or more on a same instance is not allowed for this class.");
+
+ __pImpl = new (std::nothrow) _BluetoothSppAcceptorImpl;
+ SysTryReturnResult(NID_NET_BT, __pImpl != null, E_OUT_OF_MEMORY, "Creation of a _BluetoothSppAcceptorImpl instance failed.");
+
+ r = __pImpl->Construct(listener);
+
+ if (r != E_SUCCESS)
+ {
+ delete __pImpl;
+ __pImpl = null;
+ }
+
+ return r;
+}
+
+result
+BluetoothSppAcceptor::AcceptConnection(void)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_SPP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
+
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->AcceptConnection();
+}
+
+result
+BluetoothSppAcceptor::RejectConnection()
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_SPP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
+
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->RejectConnection();
+}
+
+result
+BluetoothSppAcceptor::StartService(void)
+{
+ // Actually, E_INVALID_ARG never occur because the fixed SPP UUID is used.
+ return StartService(Tizen::Base::UuId(BT_SVC_UUID_SPP));
+}
+
+result
+BluetoothSppAcceptor::StartService(const Tizen::Base::UuId& serviceUuid)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_SPP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
+
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->StartService(serviceUuid);
+}
+
+result
+BluetoothSppAcceptor::StopService(void)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_SPP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
+
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->StopService();
+}
+
+result
+BluetoothSppAcceptor::SendData(const Tizen::Base::ByteBuffer& buffer)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_SPP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
+
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->SendData(buffer);
+}
+
+result
+BluetoothSppAcceptor::Disconnect(void)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_SPP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
+
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->Disconnect();
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBtBluetoothSppInitiator.cpp b/src/FNetBtBluetoothSppInitiator.cpp
new file mode 100644
index 0000000..ecdf810
--- /dev/null
+++ b/src/FNetBtBluetoothSppInitiator.cpp
@@ -0,0 +1,125 @@
+//
+// Open Service Platform
+// 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 FNetBtBluetoothSppInitiator.cpp
+// @brief This is the implementation file for the BluetoothSppInitiator class.
+//
+
+#include <FNetBtBluetoothSppInitiator.h>
+#include <FNetBtBluetoothDevice.h>
+#include <FNetBtIBluetoothSppInitiatorEventListener.h>
+#include <FBaseByteBuffer.h>
+#include <FBaseUuId.h>
+#include <FBaseSysLog.h>
+#include <FSec_AccessController.h>
+#include <FSys_SystemInfoImpl.h>
+#include "FNetBt_BluetoothSppInitiatorImpl.h"
+
+using namespace Tizen::Security;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+BluetoothSppInitiator::BluetoothSppInitiator(void)
+ : __pImpl(null)
+{
+}
+
+BluetoothSppInitiator::~BluetoothSppInitiator(void)
+{
+ delete __pImpl;
+}
+
+result
+BluetoothSppInitiator::Construct(IBluetoothSppInitiatorEventListener& listener)
+{
+ result r = E_SUCCESS;
+ bool isBtSupported = false;
+
+ Tizen::System::_SystemInfoImpl::GetSysInfo(L"http://tizen.org/feature/network.bluetooth", isBtSupported);
+ SysTryReturnResult(NID_NET_BT, isBtSupported == true, E_UNSUPPORTED_OPERATION, "Bluetooth is not supported.");
+
+ SysAssertf(__pImpl == null,
+ "Already constructed. Calling Construct() twice or more on a same instance is not allowed for this class.");
+
+ __pImpl = new (std::nothrow) _BluetoothSppInitiatorImpl;
+ SysTryReturnResult(NID_NET_BT, __pImpl != null, E_OUT_OF_MEMORY,
+ "Creation of a _BluetoothSppInitiatorImpl instance failed.");
+
+ r = __pImpl->Construct(listener);
+
+ if (r != E_SUCCESS)
+ {
+ delete __pImpl;
+ __pImpl = null;
+ }
+
+ return r;
+}
+
+result
+BluetoothSppInitiator::SendData(const Tizen::Base::ByteBuffer& buffer)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_SPP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
+
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->SendData(buffer);
+}
+
+result
+BluetoothSppInitiator::Connect(const BluetoothDevice& remoteDevice)
+{
+ // Actually, E_INVALID_ARG never occur because the fixed SPP UUID is used.
+ return Connect(remoteDevice, Tizen::Base::UuId(BT_SVC_UUID_SPP));
+}
+
+result
+BluetoothSppInitiator::Connect(const BluetoothDevice& remoteDevice, const Tizen::Base::UuId& serviceUuid)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_SPP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
+
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->Connect(remoteDevice, serviceUuid);
+}
+
+result
+BluetoothSppInitiator::Disconnect(void)
+{
+ result r = E_SUCCESS;
+
+ // Privilege check
+ r = _AccessController::CheckUserPrivilege(_PRV_BLUETOOTH_SPP);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
+
+ // Check Construct
+ SysAssertf(__pImpl != null, "Not yet constructed. Construct() should be called before use.");
+
+ return __pImpl->Disconnect();
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothAdapterUtility.cpp b/src/FNetBt_BluetoothAdapterUtility.cpp
new file mode 100755
index 0000000..6a0f958
--- /dev/null
+++ b/src/FNetBt_BluetoothAdapterUtility.cpp
@@ -0,0 +1,911 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothAdapterUtility.cpp
+// @brief This is the implementation file for the _BluetoothAdapterUtility class.
+//
+
+#include <unique_ptr.h>
+#include <FBaseColAllElementsDeleter.h>
+#include <FBaseByteBuffer.h>
+#include <FBaseUuId.h>
+#include <FBaseInteger.h>
+#include <FBaseSysLog.h>
+#include <FBaseLong.h>
+#include <FBaseColHashMap.h>
+#include <FBaseUtilStringUtil.h>
+#include <FNetBtBluetoothDevice.h>
+#include <FNetBtBluetoothTypes.h>
+#include <FNetBtBluetoothDevice.h>
+#include <FBase_StringConverter.h>
+#include <FNetBt_BluetoothDeviceImpl.h>
+#include "FNetBt_BluetoothAdapterUtility.h"
+
+using namespace std;
+using namespace Tizen::Base;
+using namespace Tizen::Base::Collection;
+using namespace Tizen::Base::Utility;
+
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+class _BluetoothUuidMap;
+
+static _BluetoothUuidMap* pMapSingleton = null;
+
+/*
+ * @class _BluetoothUuidMap
+ * @brief The _BluetoothUuidMap class provides the method which converts UUID string to the long type value of
+ * BluetoothServiceType defined "FNetBtBluetoothTypes.h".
+ */
+class _BluetoothUuidMap
+ : public Tizen::Base::Object
+{
+public:
+ _BluetoothUuidMap(void) {}
+
+ virtual ~_BluetoothUuidMap(void)
+ {
+ //Clear all entries in the map
+ (void) __uuidMap.RemoveAll(true);
+ }
+
+ static _BluetoothUuidMap* GetInstance(void)
+ {
+ static _BluetoothUuidMap uuidMap;
+
+ // TODO: this singleton pattern to use a local static instance is not thread-safe.
+ if (!pMapSingleton)
+ {
+ if (uuidMap.Initialise() == E_SUCCESS)
+ {
+ pMapSingleton = &uuidMap;
+ }
+ }
+
+ return pMapSingleton;
+ }
+
+ long GetUuidLong(const Tizen::Base::String& uuidString) const
+ {
+ UuId uuid;
+ UuId::Parse(uuidString, uuid);
+ const Long* pUuidLongValue = null;
+
+ pUuidLongValue = dynamic_cast<const Long*> (__uuidMap.GetValue(uuid));
+ SysTryReturn(NID_NET_BT, pUuidLongValue != null, 0, E_SYSTEM,
+ "Getting UUID(%ls) value from <UUID string, UUID enum type> map has failed.", uuidString.GetPointer());
+
+ return pUuidLongValue->ToLong();
+ }
+
+private:
+ _BluetoothUuidMap(const _BluetoothUuidMap& value);
+ _BluetoothUuidMap& operator =(const _BluetoothUuidMap& value);
+
+ result Initialise(void)
+ {
+ result r = E_SUCCESS;
+
+ r = __uuidMap.Construct();
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "Construction of <UUID string, UUID enum type> map has failed.");
+
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_SPP)), *(new Long((long)(BT_SVC_SPP_SERVICE))));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_LAP)), *(new Long((long) BT_SVC_LAP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_DUN)), *(new Long((long) BT_SVC_DUN_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_SYNC)), *(new Long((long) BT_SVC_SYNC_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_OPP)), *(new Long((long) BT_SVC_OPP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_FTP)), *(new Long((long) BT_SVC_FTP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_SYNC_COMMAND)), *(new Long((long) BT_SVC_SYNC_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_HSP)), *(new Long((long) BT_SVC_HSP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_CTP)), *(new Long((long) BT_SVC_CTP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_A2DP_SOURCE)), *(new Long((long) BT_SVC_A2DP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_A2DP_SINK)), *(new Long((long) BT_SVC_A2DP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_AVRCP_TARGET)), *(new Long((long) BT_SVC_AVRCP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_A2DP)), *(new Long((long) BT_SVC_A2DP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_AVRCP)), *(new Long((long) BT_SVC_AVRCP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_AVRCP_CONTROLLER)), *(new Long((long) BT_SVC_AVRCP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_ICP)), *(new Long((long) BT_SVC_ICP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_FAX)), *(new Long((long) BT_SVC_FAX_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_HSP_AG)), *(new Long((long) BT_SVC_HSP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_PAN_PANU)), *(new Long((long) BT_SVC_PANU_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_PAN_NAP)), *(new Long((long) BT_SVC_NAP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_PAN_GN)), *(new Long((long) BT_SVC_GN_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_BPP_DIRECT_PRINTING)), *(new Long((long) BT_SVC_BPP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_BPP_REFERENCE_PRINTING)), *(new Long((long) BT_SVC_BPP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_BIP)), *(new Long((long) BT_SVC_BIP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_BIP_RESPONDER)), *(new Long((long) BT_SVC_BIP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_BIP_AUTOMATIC_ARCHIVE)), *(new Long((long) BT_SVC_BIP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_BIP_REFERENCED_OBJECTS)), *(new Long((long) BT_SVC_BIP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_HFP)), *(new Long((long) BT_SVC_HFP_HS_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_HFP_AG)), *(new Long((long) BT_SVC_HFP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_BPP_DIRECT_PRINTING_RO)), *(new Long((long) BT_SVC_BPP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_BPP_REFLECTED_UI)), *(new Long((long) BT_SVC_BPP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_BPP_BASIC_PRINTING)), *(new Long((long) BT_SVC_BPP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_BPP_PRINTING_STATUS)), *(new Long((long) BT_SVC_BPP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_HID)), *(new Long((long) BT_SVC_HID_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_HCRP)), *(new Long((long) BT_SVC_HCRP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_HCRP_PRINT)), *(new Long((long) BT_SVC_HCRP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_HCRP_SCAN)), *(new Long((long) BT_SVC_HCRP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_SAP)), *(new Long((long) BT_SVC_SAP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_PBAP_PCE)), *(new Long((long) BT_SVC_PBAP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_PBAP_PSE)), *(new Long((long) BT_SVC_PBAP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_PBAP)), *(new Long((long) BT_SVC_PBAP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_HSP_HS)), *(new Long((long) BT_SVC_HSP_HS_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_MAP_ACCESS_SERVER)), *(new Long((long) BT_SVC_MAP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_MAP_NOTIFICATION_SERVER)), *(new Long((long) BT_SVC_MAP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_MAP_ACCESS_PROFILE)), *(new Long((long) BT_SVC_MAP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_DID_PNP_INFORMATION)), *(new Long((long) BT_SVC_DID_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_GENERIC_NETWORKING)), *(new Long((long) BT_SVC_NONE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_GENERIC_FILE_TRANSFER)), *(new Long((long) BT_SVC_NONE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_GENERIC_AUDIO)), *(new Long((long) BT_SVC_NONE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_GENERIC_TELEPHONY)), *(new Long((long) BT_SVC_NONE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_VDP_SOURCE)), *(new Long((long) BT_SVC_VDP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_VDP_SINK)), *(new Long((long) BT_SVC_VDP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_VDP_DISTRIBUTION)), *(new Long((long) BT_SVC_VDP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_HDP)), *(new Long((long) BT_SVC_HDP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_HDP_SOURCE)), *(new Long((long) BT_SVC_HDP_SERVICE)));
+ __uuidMap.Add(*(new Tizen::Base::UuId(BT_SVC_UUID_HDP_SINK)), *(new Long((long) BT_SVC_HDP_SERVICE)));
+
+ return E_SUCCESS;
+ }
+
+private:
+ Tizen::Base::Collection::HashMap __uuidMap;
+
+}; //_BluetoothUuidMap
+
+// defines local methods
+void PrintMajorDeviceClass(BluetoothMajorDeviceClassType type);
+void PrintMinorDeviceClass(BluetoothMajorDeviceClassType majType, BluetoothMinorDeviceClassType minType);
+void PrintServiceClassList(unsigned long type);
+
+
+_BluetoothAdapterUtility::_BluetoothAdapterUtility(void)
+{
+}
+
+_BluetoothAdapterUtility::~_BluetoothAdapterUtility(void)
+{
+}
+
+
+BluetoothMajorDeviceClassType
+_BluetoothAdapterUtility::ConvertToMajorDeviceClassType(bt_major_device_class_e majorClass)
+{
+ BluetoothMajorDeviceClassType convertedType = BT_COD_MAJ_DEV_CLS_UNCLASSIFIED;
+
+ switch (majorClass)
+ {
+ case BT_MAJOR_DEVICE_CLASS_MISC:
+ convertedType = BT_COD_MAJ_DEV_CLS_MISC;
+ break;
+
+ case BT_MAJOR_DEVICE_CLASS_COMPUTER:
+ convertedType = BT_COD_MAJ_DEV_CLS_COMPUTER;
+ break;
+
+ case BT_MAJOR_DEVICE_CLASS_PHONE:
+ convertedType = BT_COD_MAJ_DEV_CLS_PHONE;
+ break;
+
+ case BT_MAJOR_DEVICE_CLASS_LAN_NETWORK_ACCESS_POINT:
+ convertedType = BT_COD_MAJ_DEV_CLS_LAN_ACCESS_POINT;
+ break;
+
+ case BT_MAJOR_DEVICE_CLASS_AUDIO_VIDEO:
+ convertedType = BT_COD_MAJ_DEV_CLS_AUDIO;
+ break;
+
+ case BT_MAJOR_DEVICE_CLASS_PERIPHERAL:
+ convertedType = BT_COD_MAJ_DEV_CLS_PERIPHERAL;
+ break;
+
+ case BT_MAJOR_DEVICE_CLASS_IMAGING:
+ convertedType = BT_COD_MAJ_DEV_CLS_IMAGING;
+ break;
+
+ case BT_MAJOR_DEVICE_CLASS_WEARABLE:
+ case BT_MAJOR_DEVICE_CLASS_TOY:
+ case BT_MAJOR_DEVICE_CLASS_HEALTH:
+ case BT_MAJOR_DEVICE_CLASS_UNCATEGORIZED:
+ default:
+ convertedType = BT_COD_MAJ_DEV_CLS_UNCLASSIFIED;
+ break;
+ }
+
+ return convertedType;
+}
+
+BluetoothMinorDeviceClassType
+_BluetoothAdapterUtility::ConvertToMinorDeviceClassType(bt_major_device_class_e majorClass, bt_minor_device_class_e minorClass)
+{
+ BluetoothMinorDeviceClassType convertedType = BT_COD_MIN_DEV_CLS_UNCLASSIFIED;
+
+ if (majorClass == BT_MAJOR_DEVICE_CLASS_COMPUTER)
+ {
+ switch (minorClass)
+ {
+ case BT_MINOR_DEVICE_CLASS_COMPUTER_DESKTOP_WORKSTATION:
+ convertedType = BT_COD_MIN_DEV_CLS_DESKTOP_WORKSTATION;
+ break;
+
+ case BT_MINOR_DEVICE_CLASS_COMPUTER_SERVER_CLASS:
+ convertedType = BT_COD_MIN_DEV_CLS_SERVER_CLASS_COMPUTER;
+ break;
+
+ case BT_MINOR_DEVICE_CLASS_COMPUTER_LAPTOP:
+ convertedType = BT_COD_MIN_DEV_CLS_LAPTOP;
+ break;
+
+ case BT_MINOR_DEVICE_CLASS_COMPUTER_HANDHELD_PC_OR_PDA:
+ convertedType = BT_COD_MIN_DEV_CLS_HANDHELD_PC_OR_PDA;
+ break;
+
+ case BT_MINOR_DEVICE_CLASS_COMPUTER_PALM_SIZED_PC_OR_PDA:
+ convertedType = BT_COD_MIN_DEV_CLS_PALM_SIZED_PC_OR_PDA;
+ break;
+
+ case BT_MINOR_DEVICE_CLASS_COMPUTER_WEARABLE_COMPUTER:
+ convertedType = BT_COD_MIN_DEV_CLS_WEARABLE_COMPUTER;
+ break;
+
+ default:
+ convertedType = BT_COD_MIN_DEV_CLS_UNCLASSIFIED;
+ break;
+ }
+ }
+ else if (majorClass == BT_MAJOR_DEVICE_CLASS_PHONE)
+ {
+ switch (minorClass)
+ {
+ case BT_MINOR_DEVICE_CLASS_PHONE_CELLULAR:
+ convertedType = BT_COD_MIN_DEV_CLS_CELLULAR;
+ break;
+
+ case BT_MINOR_DEVICE_CLASS_PHONE_CORDLESS:
+ convertedType = BT_COD_MIN_DEV_CLS_CORDLESS;
+ break;
+
+ case BT_MINOR_DEVICE_CLASS_PHONE_SMART_PHONE:
+ convertedType = BT_COD_MIN_DEV_CLS_SMART_PHONE;
+ break;
+
+ case BT_MINOR_DEVICE_CLASS_PHONE_WIRED_MODEM_OR_VOICE_GATEWAY:
+ convertedType = BT_COD_MIN_DEV_CLS_WIRED_MODEM_OR_VOICE_GATEWAY;
+ break;
+
+ case BT_MINOR_DEVICE_CLASS_PHONE_COMMON_ISDN_ACCESS:
+ convertedType = BT_COD_MIN_DEV_CLS_COMMON_ISDN_ACCESS;
+ break;
+
+ default:
+ convertedType = BT_COD_MIN_DEV_CLS_UNCLASSIFIED;
+ break;
+ }
+ }
+ else if (majorClass == BT_MAJOR_DEVICE_CLASS_LAN_NETWORK_ACCESS_POINT)
+ {
+ switch (minorClass)
+ {
+ case BT_MINOR_DEVICE_CLASS_LAN_NETWORK_ACCESS_POINT_FULLY_AVAILABLE:
+ convertedType = BT_COD_MIN_DEV_CLS_FULLY_AVAILABLE;
+ break;
+
+ case BT_MINOR_DEVICE_CLASS_LAN_NETWORK_ACCESS_POINT_1_TO_17_PERCENT_UTILIZED:
+ convertedType = BT_COD_MIN_DEV_CLS_1_TO_17_PERCENT_UTILIZED;
+ break;
+
+ case BT_MINOR_DEVICE_CLASS_LAN_NETWORK_ACCESS_POINT_17_TO_33_PERCENT_UTILIZED:
+ convertedType = BT_COD_MIN_DEV_CLS_17_TO_33_PERCENT_UTILIZED;
+ break;
+
+ case BT_MINOR_DEVICE_CLASS_LAN_NETWORK_ACCESS_POINT_33_TO_50_PERCENT_UTILIZED :
+ convertedType = BT_COD_MIN_DEV_CLS_33_TO_50_PERCENT_UTILIZED;
+ break;
+
+ case BT_MINOR_DEVICE_CLASS_LAN_NETWORK_ACCESS_POINT_50_to_67_PERCENT_UTILIZED:
+ convertedType = BT_COD_MIN_DEV_CLS_50_to_67_PERCENT_UTILIZED;
+ break;
+
+ case BT_MINOR_DEVICE_CLASS_LAN_NETWORK_ACCESS_POINT_67_TO_83_PERCENT_UTILIZED:
+ convertedType = BT_COD_MIN_DEV_CLS_67_TO_83_PERCENT_UTILIZED;
+ break;
+
+ case BT_MINOR_DEVICE_CLASS_LAN_NETWORK_ACCESS_POINT_83_TO_99_PERCENT_UTILIZED:
+ convertedType = BT_COD_MIN_DEV_CLS_83_TO_99_PERCENT_UTILIZED;
+ break;
+
+ case BT_MINOR_DEVICE_CLASS_LAN_NETWORK_ACCESS_POINT_NO_SERVICE_AVAILABLE :
+ convertedType = BT_COD_MIN_DEV_CLS_NO_SERVICE_AVAILABLE;
+ break;
+
+ default:
+ convertedType = BT_COD_MIN_DEV_CLS_UNCLASSIFIED;
+ break;
+ }
+ }
+ else if (majorClass == BT_MAJOR_DEVICE_CLASS_AUDIO_VIDEO)
+ {
+ switch (minorClass)
+ {
+ case BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_WEARABLE_HEADSET:
+ convertedType = BT_COD_MIN_DEV_CLS_HEADSET_PROFILE;
+ break;
+
+ case BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_HANDS_FREE :
+ convertedType = BT_COD_MIN_DEV_CLS_HANDSFREE;
+ break;
+
+ case BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_MICROPHONE:
+ case BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_LOUDSPEAKER:
+ case BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_HEADPHONES:
+ case BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_PORTABLE_AUDIO:
+ case BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_CAR_AUDIO:
+ case BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_SET_TOP_BOX:
+ case BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_HIFI_AUDIO_DEVICE:
+ case BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_VCR:
+ case BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_VIDEO_CAMERA:
+ case BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_CAMCORDER :
+ case BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_VIDEO_MONITOR:
+ case BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_VIDEO_DISPLAY_LOUDSPEAKER:
+ case BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_VIDEO_CONFERENCING:
+ case BT_MINOR_DEVICE_CLASS_AUDIO_VIDEO_GAMING_TOY:
+ default:
+ convertedType = BT_COD_MIN_DEV_CLS_UNCLASSIFIED;
+ break;
+ }
+ }
+ else if (majorClass == BT_MAJOR_DEVICE_CLASS_PERIPHERAL)
+ {
+ switch (minorClass)
+ {
+ case BT_MINOR_DEVICE_CLASS_PERIPHERAL_KEY_BOARD:
+ case BT_MINOR_DEVICE_CLASS_PERIPHERAL_POINTING_DEVICE:
+ case BT_MINOR_DEVICE_CLASS_PERIPHERAL_COMBO_KEYBOARD_POINTING_DEVICE :
+ case BT_MINOR_DEVICE_CLASS_PERIPHERAL_JOYSTICK:
+ case BT_MINOR_DEVICE_CLASS_PERIPHERAL_GAME_PAD:
+ case BT_MINOR_DEVICE_CLASS_PERIPHERAL_REMOTE_CONTROL:
+ case BT_MINOR_DEVICE_CLASS_PERIPHERAL_SENSING_DEVICE:
+ case BT_MINOR_DEVICE_CLASS_PERIPHERAL_DIGITIZER_TABLET:
+ case BT_MINOR_DEVICE_CLASS_PERIPHERAL_CARD_READER:
+ convertedType = BT_COD_MIN_DEV_CLS_SIM_CARD_READER;
+ break;
+
+ case BT_MINOR_DEVICE_CLASS_PERIPHERAL_DIGITAL_PEN:
+ case BT_MINOR_DEVICE_CLASS_PERIPHERAL_HANDHELD_SCANNER:
+ case BT_MINOR_DEVICE_CLASS_PERIPHERAL_HANDHELD_GESTURAL_INPUT_DEVICE :
+ default:
+ convertedType = BT_COD_MIN_DEV_CLS_UNCLASSIFIED;
+ break;
+ }
+ }
+ else if (majorClass == BT_MAJOR_DEVICE_CLASS_IMAGING)
+ {
+ switch (minorClass)
+ {
+ case BT_MINOR_DEVICE_CLASS_IMAGING_DISPLAY:
+ case BT_MINOR_DEVICE_CLASS_IMAGING_CAMERA:
+ case BT_MINOR_DEVICE_CLASS_IMAGING_SCANNER:
+ case BT_MINOR_DEVICE_CLASS_IMAGING_PRINTER:
+ default:
+ convertedType = BT_COD_MIN_DEV_CLS_UNCLASSIFIED;
+ break;
+ }
+ }
+ else if (majorClass == BT_MAJOR_DEVICE_CLASS_WEARABLE)
+ {
+ switch (minorClass)
+ {
+ case BT_MINOR_DEVICE_CLASS_WEARABLE_WRIST_WATCH:
+ case BT_MINOR_DEVICE_CLASS_WEARABLE_PAGER:
+ case BT_MINOR_DEVICE_CLASS_WEARABLE_JACKET:
+ case BT_MINOR_DEVICE_CLASS_WEARABLE_HELMET:
+ case BT_MINOR_DEVICE_CLASS_WEARABLE_GLASSES:
+ default:
+ convertedType = BT_COD_MIN_DEV_CLS_UNCLASSIFIED;
+ break;
+ }
+ }
+ else if (majorClass == BT_MAJOR_DEVICE_CLASS_TOY)
+ {
+ switch (minorClass)
+ {
+ case BT_MINOR_DEVICE_CLASS_TOY_ROBOT:
+ case BT_MINOR_DEVICE_CLASS_TOY_VEHICLE:
+ case BT_MINOR_DEVICE_CLASS_TOY_DOLL_ACTION:
+ case BT_MINOR_DEVICE_CLASS_TOY_CONTROLLER:
+ case BT_MINOR_DEVICE_CLASS_TOY_GAME:
+ default:
+ convertedType = BT_COD_MIN_DEV_CLS_UNCLASSIFIED;
+ break;
+ }
+ }
+ else if (majorClass == BT_MAJOR_DEVICE_CLASS_HEALTH)
+ {
+ switch (minorClass)
+ {
+ case BT_MINOR_DEVICE_CLASS_HEATH_BLOOD_PRESSURE_MONITOR:
+ case BT_MINOR_DEVICE_CLASS_HEATH_THERMOMETER :
+ case BT_MINOR_DEVICE_CLASS_HEATH_WEIGHING_SCALE:
+ case BT_MINOR_DEVICE_CLASS_HEATH_GLUCOSE_METER:
+ case BT_MINOR_DEVICE_CLASS_HEATH_PULSE_OXIMETER:
+ case BT_MINOR_DEVICE_CLASS_HEATH_HEART_PULSE_RATE_MONITOR:
+ case BT_MINOR_DEVICE_CLASS_HEATH_DATA_DISPLAY:
+ case BT_MINOR_DEVICE_CLASS_HEATH_STEP_COUNTER:
+ case BT_MINOR_DEVICE_CLASS_HEATH_BODY_COMPOSITION_ANALYZER:
+ case BT_MINOR_DEVICE_CLASS_HEATH_PEAK_FLOW_MONITOR:
+ case BT_MINOR_DEVICE_CLASS_HEATH_MEDICATION_MONITOR :
+ case BT_MINOR_DEVICE_CLASS_HEATH_KNEE_PROSTHESIS:
+ case BT_MINOR_DEVICE_CLASS_HEATH_ANKLE_PROSTHESIS:
+ default:
+ convertedType = BT_COD_MIN_DEV_CLS_UNCLASSIFIED;
+ break;
+ }
+ }
+ else
+ {
+ convertedType = BT_COD_MIN_DEV_CLS_UNCLASSIFIED;
+ }
+
+ return convertedType;
+}
+
+unsigned long
+_BluetoothAdapterUtility::ConvertToServiceClassList(int serviceClass)
+{
+ unsigned long serviceClassMask = 0;
+
+ bt_major_service_class_e origianlClassList[] =
+ {
+ BT_MAJOR_SERVICE_CLASS_INFORMATION,
+ BT_MAJOR_SERVICE_CLASS_TELEPHONY,
+ BT_MAJOR_SERVICE_CLASS_AUDIO,
+ BT_MAJOR_SERVICE_CLASS_OBJECT_TRANSFER,
+ BT_MAJOR_SERVICE_CLASS_CAPTURING,
+ BT_MAJOR_SERVICE_CLASS_RENDERING,
+ BT_MAJOR_SERVICE_CLASS_NETWORKING,
+ BT_MAJOR_SERVICE_CLASS_POSITIONING,
+ BT_MAJOR_SERVICE_CLASS_LIMITED_DISCOVERABLE_MODE
+ };
+
+ BluetoothServiceClassType convertedClassList[] =
+ {
+ BT_COD_SVC_INFORMATION,
+ BT_COD_SVC_TELEPHONY,
+ BT_COD_SVC_AUDIO,
+ BT_COD_SVC_OBJECT_TRANSFER,
+ BT_COD_SVC_CAPTURING,
+ BT_COD_SVC_RENDERING,
+ BT_COD_SVC_NETWORKING,
+ BT_COD_SVC_POSITIONING,
+ BT_COD_SVC_LIMITED_DISCOVERABLE_MODE
+ };
+
+ for (int i = 0; i < 9; i++)
+ {
+ // checks the input value, 'serviceClass', has each value of the class list using bit masking
+ if (origianlClassList[i] == (serviceClass & origianlClassList[i]))
+ {
+ serviceClassMask += convertedClassList[i];
+ }
+ }
+
+ return serviceClassMask;
+}
+
+unsigned long
+_BluetoothAdapterUtility::ConvertToServiceList(char** pServiceUuid, int& serviceUuidCount)
+{
+ unsigned long serviceListMask = 0;
+ _BluetoothUuidMap* pMap = null;
+
+ pMap = _BluetoothUuidMap::GetInstance();
+ SysTryReturn(NID_NET_BT, pMap != null, 0, E_SYSTEM, "Converting UUID strings to a masked BluetoothServiceType value faild.");
+
+ for (int i = 0; i < serviceUuidCount; i++)
+ {
+ String uuidString(pServiceUuid[i]);
+ long uuidLongValue = pMap->GetUuidLong(uuidString);
+
+ serviceListMask |= uuidLongValue;
+ }
+
+ return serviceListMask;
+}
+
+Tizen::Base::Collection::IList*
+_BluetoothAdapterUtility::ConvertServiceUuidListN(char** pServiceUuid, int& serviceUuidCount)
+{
+ unique_ptr<ArrayList, AllElementsDeleter> pList;
+ UuId* pUuid = null;
+
+ pList.reset(new (std::nothrow) ArrayList());
+ SysTryReturn(NID_NET_BT, pList != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+
+ for (int i = 0; i < serviceUuidCount; i++)
+ {
+ String uuidString(pServiceUuid[i]);
+ pUuid = new (std::nothrow) UuId();
+ SysTryReturn(NID_NET_BT, pUuid != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ uuidString.ToUpperCase();
+ UuId::Parse(uuidString, *pUuid);
+
+ pList->Add(*pUuid);
+ }
+
+ return pList.release();
+}
+
+void
+_BluetoothAdapterUtility::PrintDeviceInfo(const BluetoothDevice& device)
+{
+ SysLog(NID_NET_BT, "Bluetooth Device Information =============");
+ SysLog(NID_NET_BT, "+ Address: [%ls]", _BluetoothDeviceImpl::GetAddressString(*(device.GetAddress())).GetPointer());
+ SysLog(NID_NET_BT, "+ Name: %ls", device.GetName().GetPointer());
+ SysLog(NID_NET_BT, "+ %s", device.IsPaired() ? "Paired" : "Not Paired");
+ SysLog(NID_NET_BT, "+ RSSI: %d", device.GetRssi());
+ PrintMajorDeviceClass(device.GetMajorDeviceClassType());
+ PrintMinorDeviceClass(device.GetMajorDeviceClassType(), device.GetMinorDeviceClassType());
+ PrintServiceClassList(device.GetServiceClassList());
+ PrintServiceList(device.GetServiceList());
+ PrintServiceUuidList(device.GetServiceUuidList());
+}
+
+void
+_BluetoothAdapterUtility::PrintServiceList(unsigned long type)
+{
+ int index = 0;
+ unsigned long typeList[] =
+ {
+ BT_SVC_MAP_SERVICE,
+ BT_SVC_HDP_SERVICE,
+ BT_SVC_DID_SERVICE,
+ BT_SVC_HCRP_SERVICE,
+ BT_SVC_HFP_HS_SERVICE,
+ BT_SVC_HSP_HS_SERVICE,
+ BT_SVC_PBAP_SERVICE,
+ BT_SVC_VDP_SERVICE,
+ BT_SVC_HID_SERVICE,
+ BT_SVC_AVRCP_SERVICE,
+ BT_SVC_A2DP_SERVICE,
+ BT_SVC_SAP_SERVICE,
+ BT_SVC_GN_SERVICE,
+ BT_SVC_NAP_SERVICE,
+ BT_SVC_PANU_SERVICE,
+ BT_SVC_BIP_SERVICE,
+ BT_SVC_BPP_SERVICE,
+ BT_SVC_SYNC_SERVICE,
+ BT_SVC_ICP_SERVICE,
+ BT_SVC_CTP_SERVICE,
+ BT_SVC_FTP_SERVICE,
+ BT_SVC_OPP_SERVICE,
+ BT_SVC_HFP_SERVICE,
+ BT_SVC_HSP_SERVICE,
+ BT_SVC_LAP_SERVICE,
+ BT_SVC_FAX_SERVICE,
+ BT_SVC_DUN_SERVICE,
+ BT_SVC_SPP_SERVICE,
+ BT_SVC_RES_SERVICE
+ };
+ const char* typeStrList[] =
+ {
+ "BT_SVC_MAP_SERVICE",
+ "BT_SVC_HDP_SERVICE",
+ "BT_SVC_DID_SERVICE",
+ "BT_SVC_HCRP_SERVICE",
+ "BT_SVC_HFP_HS_SERVICE",
+ "BT_SVC_HSP_HS_SERVICE",
+ "BT_SVC_PBAP_SERVICE",
+ "BT_SVC_VDP_SERVICE",
+ "BT_SVC_HID_SERVICE",
+ "BT_SVC_AVRCP_SERVICE",
+ "BT_SVC_A2DP_SERVICE",
+ "BT_SVC_SAP_SERVICE",
+ "BT_SVC_GN_SERVICE",
+ "BT_SVC_NAP_SERVICE",
+ "BT_SVC_PANU_SERVICE",
+ "BT_SVC_BIP_SERVICE",
+ "BT_SVC_BPP_SERVICE",
+ "BT_SVC_SYNC_SERVICE",
+ "BT_SVC_ICP_SERVICE",
+ "BT_SVC_CTP_SERVICE",
+ "BT_SVC_FTP_SERVICE",
+ "BT_SVC_OPP_SERVICE",
+ "BT_SVC_HFP_SERVICE",
+ "BT_SVC_HSP_SERVICE",
+ "BT_SVC_LAP_SERVICE",
+ "BT_SVC_FAX_SERVICE",
+ "BT_SVC_DUN_SERVICE",
+ "BT_SVC_SPP_SERVICE",
+ "BT_SVC_RES_SERVICE"
+ };
+
+ for (int i = 0; i < 29; i++)
+ {
+ // checks the input value, 'type', has each value of the service list using bit masking
+ if (typeList[i] == (type & typeList[i]))
+ {
+ SysLog(NID_NET_BT, "+ Service List[%d]: %s", index++, typeStrList[i]);
+ }
+ }
+}
+
+void
+_BluetoothAdapterUtility::PrintServiceUuidList(const Tizen::Base::Collection::IList* pList)
+{
+ int count = 0;
+ const UuId* pUuid = null;
+
+ if (pList == null)
+ {
+ SysLog(NID_NET_BT, "+ No Service UUID (with error)");
+ }
+ else
+ {
+ count = pList->GetCount();
+
+ if (count == 0)
+ {
+ SysLog(NID_NET_BT, "+ No Service UUID");
+ }
+
+ for (int i = 0; i < count; i++)
+ {
+ pUuid = dynamic_cast<const UuId*>(pList->GetAt(i));
+ if (pUuid != null)
+ {
+ SysLog(NID_NET_BT, "+ Service UUID[%d]: %ls", i, pUuid->ToString().GetPointer());
+ }
+ }
+ }
+}
+
+void PrintMajorDeviceClass(BluetoothMajorDeviceClassType type)
+{
+ const char* pTypeString = null;
+
+ switch (type)
+ {
+ case BT_COD_MAJ_DEV_CLS_MISC:
+ pTypeString = "BT_COD_MAJ_DEV_CLS_MISC";
+ break;
+
+ case BT_COD_MAJ_DEV_CLS_COMPUTER:
+ pTypeString = "BT_COD_MAJ_DEV_CLS_COMPUTER";
+ break;
+
+ case BT_COD_MAJ_DEV_CLS_PHONE:
+ pTypeString = "BT_COD_MAJ_DEV_CLS_PHONE";
+ break;
+
+ case BT_COD_MAJ_DEV_CLS_LAN_ACCESS_POINT:
+ pTypeString = "BT_COD_MAJ_DEV_CLS_LAN_ACCESS_POINT";
+ break;
+
+ case BT_COD_MAJ_DEV_CLS_AUDIO:
+ pTypeString = "BT_COD_MAJ_DEV_CLS_AUDIO";
+ break;
+
+ case BT_COD_MAJ_DEV_CLS_PERIPHERAL:
+ pTypeString = "BT_COD_MAJ_DEV_CLS_PERIPHERAL";
+ break;
+
+ case BT_COD_MAJ_DEV_CLS_IMAGING:
+ pTypeString = "BT_COD_MAJ_DEV_CLS_IMAGING";
+ break;
+
+ case BT_COD_MAJ_DEV_CLS_UNCLASSIFIED:
+ pTypeString = "BT_COD_MAJ_DEV_CLS_UNCLASSIFIED";
+ break;
+
+ default:
+ pTypeString = "Unknown";
+ break;
+ }
+
+ SysLog(NID_NET_BT, "+ Major Device Type: %s", pTypeString);
+}
+
+void PrintMinorDeviceClass(BluetoothMajorDeviceClassType majType, BluetoothMinorDeviceClassType minType)
+{
+ const char* pTypeString = null;
+
+ switch (majType)
+ {
+ case BT_COD_MAJ_DEV_CLS_COMPUTER:
+ switch (minType)
+ {
+ case BT_COD_MIN_DEV_CLS_DESKTOP_WORKSTATION:
+ pTypeString = "BT_COD_MIN_DEV_CLS_DESKTOP_WORKSTATION";
+ break;
+
+ case BT_COD_MIN_DEV_CLS_SERVER_CLASS_COMPUTER:
+ pTypeString = "BT_COD_MIN_DEV_CLS_SERVER_CLASS_COMPUTER";
+ break;
+
+ case BT_COD_MIN_DEV_CLS_LAPTOP:
+ pTypeString = "BT_COD_MIN_DEV_CLS_LAPTOP";
+ break;
+
+ case BT_COD_MIN_DEV_CLS_HANDHELD_PC_OR_PDA:
+ pTypeString = "BT_COD_MIN_DEV_CLS_HANDHELD_PC_OR_PDA";
+ break;
+
+ case BT_COD_MIN_DEV_CLS_PALM_SIZED_PC_OR_PDA:
+ pTypeString = "BT_COD_MIN_DEV_CLS_PALM_SIZED_PC_OR_PDA";
+ break;
+
+ case BT_COD_MIN_DEV_CLS_WEARABLE_COMPUTER:
+ pTypeString = "BT_COD_MIN_DEV_CLS_WEARABLE_COMPUTER";
+ break;
+
+ default:
+ pTypeString = "Unclassified";
+ break;
+ }
+ break;
+
+ case BT_COD_MAJ_DEV_CLS_PHONE:
+ switch (minType)
+ {
+ case BT_COD_MIN_DEV_CLS_CELLULAR:
+ pTypeString = "BT_COD_MIN_DEV_CLS_CELLULAR";
+ break;
+
+ case BT_COD_MIN_DEV_CLS_CORDLESS:
+ pTypeString = "BT_COD_MIN_DEV_CLS_CORDLESS";
+ break;
+
+ case BT_COD_MIN_DEV_CLS_SMART_PHONE:
+ pTypeString = "BT_COD_MIN_DEV_CLS_SMART_PHONE";
+ break;
+
+ case BT_COD_MIN_DEV_CLS_WIRED_MODEM_OR_VOICE_GATEWAY:
+ pTypeString = "BT_COD_MIN_DEV_CLS_WIRED_MODEM_OR_VOICE_GATEWAY";
+ break;
+
+ case BT_COD_MIN_DEV_CLS_COMMON_ISDN_ACCESS:
+ pTypeString = "BT_COD_MIN_DEV_CLS_COMMON_ISDN_ACCESS";
+ break;
+
+ default:
+ pTypeString = "Unclassified";
+ break;
+ }
+ break;
+
+ case BT_COD_MAJ_DEV_CLS_LAN_ACCESS_POINT:
+ switch (minType)
+ {
+ case BT_COD_MIN_DEV_CLS_FULLY_AVAILABLE:
+ pTypeString = "BT_COD_MAJ_DEV_CLS_LAN_ACCESS_POINT";
+ break;
+
+ case BT_COD_MIN_DEV_CLS_1_TO_17_PERCENT_UTILIZED:
+ pTypeString = "BT_COD_MIN_DEV_CLS_1_TO_17_PERCENT_UTILIZED";
+ break;
+
+ case BT_COD_MIN_DEV_CLS_17_TO_33_PERCENT_UTILIZED:
+ pTypeString = "BT_COD_MIN_DEV_CLS_17_TO_33_PERCENT_UTILIZED";
+ break;
+
+ case BT_COD_MIN_DEV_CLS_33_TO_50_PERCENT_UTILIZED:
+ pTypeString = "BT_COD_MIN_DEV_CLS_33_TO_50_PERCENT_UTILIZED";
+ break;
+
+ case BT_COD_MIN_DEV_CLS_50_to_67_PERCENT_UTILIZED:
+ pTypeString = "BT_COD_MIN_DEV_CLS_50_to_67_PERCENT_UTILIZED";
+ break;
+
+ case BT_COD_MIN_DEV_CLS_67_TO_83_PERCENT_UTILIZED:
+ pTypeString = "BT_COD_MIN_DEV_CLS_67_TO_83_PERCENT_UTILIZED";
+ break;
+
+ case BT_COD_MIN_DEV_CLS_83_TO_99_PERCENT_UTILIZED:
+ pTypeString = "BT_COD_MIN_DEV_CLS_83_TO_99_PERCENT_UTILIZED";
+ break;
+
+ case BT_COD_MIN_DEV_CLS_NO_SERVICE_AVAILABLE:
+ pTypeString = "BT_COD_MIN_DEV_CLS_NO_SERVICE_AVAILABLE";
+ break;
+
+ default:
+ pTypeString = "Unclassified";
+ break;
+ }
+ break;
+
+ case BT_COD_MAJ_DEV_CLS_AUDIO:
+ switch (minType)
+ {
+ case BT_COD_MIN_DEV_CLS_HEADSET_PROFILE:
+ pTypeString = "BT_COD_MIN_DEV_CLS_HEADSET_PROFILE";
+ break;
+
+ case BT_COD_MIN_DEV_CLS_HANDSFREE:
+ pTypeString = "BT_COD_MIN_DEV_CLS_HANDSFREE";
+ break;
+
+ default:
+ pTypeString = "Unclassified";
+ break;
+ }
+ break;
+
+ case BT_COD_MAJ_DEV_CLS_PERIPHERAL:
+ switch (minType)
+ {
+ case BT_COD_MIN_DEV_CLS_SIM_CARD_READER:
+ pTypeString = "BT_COD_MIN_DEV_CLS_SIM_CARD_READER";
+ break;
+
+ default:
+ pTypeString = "Unclassified";
+ break;
+ }
+ break;
+
+ case BT_COD_MAJ_DEV_CLS_IMAGING:
+ case BT_COD_MAJ_DEV_CLS_MISC:
+ case BT_COD_MAJ_DEV_CLS_UNCLASSIFIED:
+ default:
+ pTypeString = "Unclassified";
+ break;
+ }
+
+ SysLog(NID_NET_BT, "+ Minor Device Type: %s", pTypeString);
+}
+
+void PrintServiceClassList(unsigned long type)
+{
+ int index = 0;
+ unsigned long typeList[] =
+ {
+ BT_COD_SVC_INFORMATION,
+ BT_COD_SVC_TELEPHONY,
+ BT_COD_SVC_AUDIO,
+ BT_COD_SVC_OBJECT_TRANSFER,
+ BT_COD_SVC_CAPTURING,
+ BT_COD_SVC_RENDERING,
+ BT_COD_SVC_NETWORKING,
+ BT_COD_SVC_POSITIONING,
+ BT_COD_SVC_LIMITED_DISCOVERABLE_MODE
+ };
+ const char* typeStrList[] =
+ {
+ "BT_COD_SVC_INFORMATION",
+ "BT_COD_SVC_TELEPHONY",
+ "BT_COD_SVC_AUDIO",
+ "BT_COD_SVC_OBJECT_TRANSFER",
+ "BT_COD_SVC_CAPTURING",
+ "BT_COD_SVC_RENDERING",
+ "BT_COD_SVC_NETWORKING",
+ "BT_COD_SVC_POSITIONING",
+ "BT_COD_SVC_LIMITED_DISCOVERABLE_MODE"
+ };
+
+ for (int i = 0; i < 9; i++)
+ {
+ if (typeList[i] == (type & typeList[i]))
+ {
+ // checks the input value, 'type', has each value of the service class list using bit masking
+ SysLog(NID_NET_BT, "+ Service Class List[%d]: %s", index++, typeStrList[i]);
+ }
+ }
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothConnectionEvent.cpp b/src/FNetBt_BluetoothConnectionEvent.cpp
new file mode 100644
index 0000000..1bf160c
--- /dev/null
+++ b/src/FNetBt_BluetoothConnectionEvent.cpp
@@ -0,0 +1,78 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothConnectionEvent.cpp
+// @brief This is the implementation file for the _BluetoothDeviceEvent class.
+//
+
+#include <FBaseRtIEventListener.h>
+#include <FBaseSysLog.h>
+#include <FBaseRtIEventArg.h>
+#include "FNetBt_BluetoothConnectionEvent.h"
+#include "FNetBt_BluetoothConnectionEventArg.h"
+#include "FNetBt_IBluetoothConnectionEventListener.h"
+
+
+using namespace Tizen::Base;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+_BluetoothConnectionEvent::_BluetoothConnectionEvent(void)
+ : __listenerCount(0)
+{
+}
+
+_BluetoothConnectionEvent::~_BluetoothConnectionEvent(void)
+{
+}
+
+result
+_BluetoothConnectionEvent::Construct(void)
+{
+ return _Event::Initialize();
+}
+
+void
+_BluetoothConnectionEvent::FireImpl(Tizen::Base::Runtime::IEventListener& listener, const Tizen::Base::Runtime::IEventArg& arg)
+{
+ _IBluetoothConnectionEventListener* pEventListener = dynamic_cast <_IBluetoothConnectionEventListener*>(&listener);
+ SysTryReturnVoidResult(NID_NET_BT, pEventListener != null, E_INVALID_ARG,
+ "[E_INVALID_ARG] The listener argument is invalid.");
+
+ const _BluetoothConnectionEventArg* pEventArg = dynamic_cast <const _BluetoothConnectionEventArg*>(&arg);
+ SysTryReturnVoidResult(NID_NET_BT, pEventArg != null, E_INVALID_ARG, "[E_INVALID_ARG] The event argument is invalid type.");
+
+ _BluetoothConnectionEventType eventType = pEventArg->GetEventType();
+
+ switch (eventType)
+ {
+ case _BT_CONNECTION_EVENT_CONNECTED:
+ SysLog(NID_NET_BT, "Firing Bluetooth Connection state changed Event (Type: _BT_CONNECTION_EVENT_CONNECTED)");
+ pEventListener->OnBluetoothDeviceConnected(*pEventArg->GetRemoteAddress());
+ break;
+
+ case _BT_CONNECTION_EVENT_DISCONNECTED:
+ SysLog(NID_NET_BT, "Firing Bluetooth Connection state changed Event (Type: _BT_CONNECTION_EVENT_DISCONNECTED)");
+ pEventListener->OnBluetoothDeviceDisconnected(*pEventArg->GetRemoteAddress());
+ break;
+
+ default:
+ break;
+ }
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothConnectionEvent.h b/src/FNetBt_BluetoothConnectionEvent.h
new file mode 100644
index 0000000..bbeb028
--- /dev/null
+++ b/src/FNetBt_BluetoothConnectionEvent.h
@@ -0,0 +1,84 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothConnectionEvent.h
+ * @brief This is the header file for the _BluetoothConnectionEvent class.
+ *
+ * This header file contains the declarations of the _BluetoothConnectionEvent class.
+ * The _BluetoothConnectionEvent class can call a method of a listener (IBluetoothConnectionEventListener object).
+ * So, when a device event is occurred, listener instances can handle it appropriately.
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_CONNECTION_EVENT_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_CONNECTION_EVENT_H_
+
+#include <FOspConfig.h>
+#include <FBaseResult.h>
+#include <FBaseRt_Event.h>
+
+// Forward declaration
+namespace Tizen { namespace Base { namespace Runtime
+{
+class IEventListener;
+class IEventArg;
+} } }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+//
+// @class _BluetoothConnectionEvent
+// @brief This class handles Bluetooth connection events.
+//
+class _BluetoothConnectionEvent
+ : public Tizen::Base::Runtime::_Event
+{
+public:
+ /**
+ * This is the default constructor.
+ */
+ _BluetoothConnectionEvent(void);
+
+ /**
+ * This is the class destructor.
+ */
+ virtual ~_BluetoothConnectionEvent(void);
+ result Construct(void);
+
+protected:
+ /**
+ * Checks the argument and finds out the type of event. After that, this method calls appropriate pListener's method.
+ *
+ * @return A result code.
+ * @param[in] pListener An event listener related to this Bluetooth device event.
+ * @param[in] arg An event argument including information to be passed to the event listeners
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_ARG The argument passed to a method contains invalid values.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ virtual void FireImpl(Tizen::Base::Runtime::IEventListener& listener, const Tizen::Base::Runtime::IEventArg& arg);
+
+private:
+ _BluetoothConnectionEvent(const _BluetoothConnectionEvent& value);
+ _BluetoothConnectionEvent& operator =(const _BluetoothConnectionEvent& rhs);
+
+private:
+ int __listenerCount;
+
+}; // _BluetoothConnectionEvent
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_CONNECTION_EVENT_H_
diff --git a/src/FNetBt_BluetoothConnectionEventArg.cpp b/src/FNetBt_BluetoothConnectionEventArg.cpp
new file mode 100644
index 0000000..5390071
--- /dev/null
+++ b/src/FNetBt_BluetoothConnectionEventArg.cpp
@@ -0,0 +1,59 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothConnectionEventArg.cpp
+// @brief This is the implementation file for the _BluetoothConnectionEventArg class.
+//
+
+#include <FBaseSysLog.h>
+#include "FNetBt_BluetoothConnectionEventArg.h"
+
+
+using namespace Tizen::Base;
+using namespace Tizen::Base::Collection;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+//
+// This is a class constructor for _BT_CONNECTION_EVENT_CONNECTED and _BT_CONNECTION_EVENT_DISCONNECTED event.
+//
+_BluetoothConnectionEventArg::_BluetoothConnectionEventArg(_BluetoothConnectionEventType type, const Tizen::Base::ByteBuffer& address)
+ : __evtType(type)
+ , __pRemoteAddress(null)
+{
+ __pRemoteAddress = new (std::nothrow) ByteBuffer();
+ __pRemoteAddress->Construct(address);
+}
+
+_BluetoothConnectionEventArg::~_BluetoothConnectionEventArg(void)
+{
+ delete __pRemoteAddress;
+}
+
+_BluetoothConnectionEventType
+_BluetoothConnectionEventArg::GetEventType(void) const
+{
+ return __evtType;
+}
+
+const ByteBuffer*
+_BluetoothConnectionEventArg::GetRemoteAddress(void) const
+{
+ return __pRemoteAddress;
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothConnectionEventArg.h b/src/FNetBt_BluetoothConnectionEventArg.h
new file mode 100644
index 0000000..154d88d
--- /dev/null
+++ b/src/FNetBt_BluetoothConnectionEventArg.h
@@ -0,0 +1,101 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothConnectionEventArg.h
+ * @brief This is the header file for the _BluetoothConnectionEventArg class.
+ *
+ * This header file contains the declarations of the _BluetoothConnectionEventArg class which includes information to be
+ * passed to the event listeners
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_CONNECTION_EVENT_ARG_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_CONNECTION_EVENT_ARG_H_
+
+#include <FBaseObject.h>
+#include <FOspConfig.h>
+#include <FBaseRtIEventArg.h>
+
+namespace Tizen { namespace Base
+{
+class ByteBuffer;
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+/**
+ * @enum _BluetoothConnectionEventType
+ * Type for specifying the type of _BluetoothConnectionEvent
+ */
+enum _BluetoothConnectionEventType
+{
+ _BT_CONNECTION_EVENT_CONNECTED, /**< For notifying that the device is connected */
+ _BT_CONNECTION_EVENT_DISCONNECTED, /**< For notifying that the device is disconnected */
+};
+
+/**
+ * @class _BluetoothConnectionEventArg
+ * @brief This class is used as an argument for callback methods of the _IBluetoothConnectionEventListener class.
+ *
+ * When a _BluetoothConnectionEvent occurs, the _BluetoothConnectionEvent finds a _IBluetoothConnectionEventListener instance
+ * which is registered for the _BluetoothConnectionEvent and calls an appropriate method of the listener.
+ * @see _IBluetoothConnectionEventListener
+ */
+class _BluetoothConnectionEventArg
+ : public Tizen::Base::Object
+ , public Tizen::Base::Runtime::IEventArg
+{
+public:
+
+ /**
+ * This is a class constructor for _BT_CONNECTION_EVENT_CONNECTED and _BT_CONNECTION_EVENT_DISCONNECTED event.
+ *
+ * @param[in] address the remote device address to be observed regarding connection
+ */
+ _BluetoothConnectionEventArg(_BluetoothConnectionEventType type, const Tizen::Base::ByteBuffer& address);
+
+ /**
+ * This is the class destructor.
+ */
+ ~_BluetoothConnectionEventArg(void);
+
+ /**
+ * Gets the type of this event.
+ *
+ * @return The type of the event
+ */
+ _BluetoothConnectionEventType GetEventType(void) const;
+
+ /**
+ * Gets the remote device address.
+ *
+ * @return the pointer of the remote device address which is a connected or disconnected device
+ */
+ const Tizen::Base::ByteBuffer* GetRemoteAddress(void) const;
+
+private:
+ _BluetoothConnectionEventArg(void);
+ _BluetoothConnectionEventArg(const _BluetoothConnectionEventArg& eventArg);
+ _BluetoothConnectionEventArg& operator =(const _BluetoothConnectionEventArg& rValue);
+
+private:
+ _BluetoothConnectionEventType __evtType;
+ Tizen::Base::ByteBuffer* __pRemoteAddress;
+
+}; // _BluetoothConnectionEventArg
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_CONNECTION_EVENT_ARG_H_
diff --git a/src/FNetBt_BluetoothDeviceEvent.cpp b/src/FNetBt_BluetoothDeviceEvent.cpp
new file mode 100644
index 0000000..8fcd982
--- /dev/null
+++ b/src/FNetBt_BluetoothDeviceEvent.cpp
@@ -0,0 +1,124 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothDeviceEvent.cpp
+// @brief This is the implementation file for the _BluetoothDeviceEvent class.
+//
+
+#include <FBaseRtIEventListener.h>
+#include <FBaseSysLog.h>
+#include <FBaseRtIEventArg.h>
+#include <FNetBtBluetoothDevice.h>
+#include "FNetBt_BluetoothDeviceEvent.h"
+#include "FNetBt_BluetoothDeviceEventArg.h"
+#include "FNetBtIBluetoothDeviceEventListener.h"
+
+
+using namespace Tizen::Base;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+_BluetoothDeviceEvent::_BluetoothDeviceEvent(void)
+{
+}
+
+_BluetoothDeviceEvent::~_BluetoothDeviceEvent(void)
+{
+}
+
+result
+_BluetoothDeviceEvent::Construct(void)
+{
+ return _Event::Initialize();
+}
+
+void
+_BluetoothDeviceEvent::FireImpl(Tizen::Base::Runtime::IEventListener& listener, const Tizen::Base::Runtime::IEventArg& arg)
+{
+ const BluetoothDevice* pDevice = null;
+
+ IBluetoothDeviceEventListener* pEventListener = dynamic_cast <IBluetoothDeviceEventListener*>(&listener);
+ SysTryReturnVoidResult(NID_NET_BT, pEventListener != null, E_INVALID_ARG,
+ "[E_INVALID_ARG] The listener argument is invalid.");
+
+ const _BluetoothDeviceEventArg* pEventArg = dynamic_cast <const _BluetoothDeviceEventArg*>(&arg);
+ SysTryReturnVoidResult(NID_NET_BT, pEventArg != null, E_INVALID_ARG, "[E_INVALID_ARG] The event argument is invalid type.");
+
+ _BluetoothDeviceEventType eventType = pEventArg->GetEventType();
+
+ switch (eventType)
+ {
+ case _BT_DEVICE_EVENT_DISCOVERY_STARTED:
+ SysLog(NID_NET_BT, "Firing Bluetooth Device Event (Type: _BT_DEVICE_EVENT_DEVDISCOVERY_STARTED)");
+ pEventListener->OnBluetoothDiscoveryStarted(pEventArg->GetErrorResult());
+ break;
+
+ case _BT_DEVICE_EVENT_DEVICE_FOUND:
+ pDevice = pEventArg->GetRemoteDevice();
+ if (pDevice != null)
+ {
+ BluetoothDevice* pFoundDevice = new (std::nothrow) BluetoothDevice(*pDevice);
+ SysTryReturnVoidResult(NID_NET_BT, pFoundDevice != null, E_SYSTEM,
+ "[E_SYSTEM] Failed to copy the BluetoothDevice instance.");
+
+ SysLog(NID_NET_BT, "Firing Bluetooth Device Event (Type: _BT_DEVICE_EVENT_DEVICE_FOUND)");
+ pEventListener->OnBluetoothRemoteDeviceFoundN(pFoundDevice);
+ }
+ break;
+
+ case _BT_DEVICE_EVENT_DISCOVERY_DONE:
+ SysLog(NID_NET_BT, "Firing Bluetooth Device Event (Type: _BT_DEVICE_EVENT_DEVDISCOVERY_DONE)");
+ pEventListener->OnBluetoothDiscoveryDone(pEventArg->IsDiscoveryCompleted());
+ break;
+
+ case _BT_DEVICE_EVENT_SVCLIST_RECEIVED:
+ pDevice = pEventArg->GetRemoteDevice();
+ if (pDevice != null)
+ {
+ SysLog(NID_NET_BT, "Firing Bluetooth Device Event (Type: _BT_DEVICE_EVENT_SVCLIST_RECEIVED)");
+ pEventListener->OnBluetoothServiceListReceived(*pDevice, pEventArg->GetServiceList(), pEventArg->GetErrorResult());
+ }
+ break;
+
+ case _BT_DEVICE_EVENT_PAIRED:
+ SysLog(NID_NET_BT, "Firing Bluetooth Device Event (Type: _BT_DEVICE_EVENT_PAIRED)");
+ pDevice = pEventArg->GetRemoteDevice();
+ if (pDevice != null)
+ {
+ pEventListener->OnBluetoothPaired(*pDevice);
+ }
+ else
+ {
+ pEventListener->OnBluetoothPairingFailed(pEventArg->GetErrorResult());
+ }
+ break;
+
+ case _BT_DEVICE_EVENT_UNPAIRED:
+ pDevice = pEventArg->GetRemoteDevice();
+ if (pDevice != null)
+ {
+ SysLog(NID_NET_BT, "Firing Bluetooth Device Event (Type: _BT_DEVICE_EVENT_UNPAIRED)");
+ pEventListener->OnBluetoothUnpaired(*pDevice);
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothDeviceEvent.h b/src/FNetBt_BluetoothDeviceEvent.h
new file mode 100644
index 0000000..d6d151c
--- /dev/null
+++ b/src/FNetBt_BluetoothDeviceEvent.h
@@ -0,0 +1,84 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothDeviceEvent.h
+ * @brief This is the header file for the _BluetoothDeviceEvent class.
+ *
+ * This header file contains the declarations of the _BluetoothDeviceEvent class.
+ * The _BluetoothDeviceEvent class can call a method of a listener (IBluetoothDeviceEventListener object).
+ * So, when a device event is occurred, listener instances can handle it appropriately.
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_DEVICE_EVENT_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_DEVICE_EVENT_H_
+
+#include <FOspConfig.h>
+#include <FBaseResult.h>
+#include <FBaseRt_Event.h>
+
+// Forward declaration
+namespace Tizen { namespace Base { namespace Runtime
+{
+class IEventListener;
+class IEventArg;
+} } }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+//
+// @class _BluetoothDeviceEvent
+// @brief This class handles Bluetooth device events.
+//
+// When a Bluetooth device event occurs, the _BluetoothDeviceEvent object finds a IBluetoothDeviceEventListener object
+// and calls an appropriate method of the listener.
+//
+class _BluetoothDeviceEvent
+ : public Tizen::Base::Runtime::_Event
+{
+public:
+ /**
+ * This is the default constructor.
+ */
+ _BluetoothDeviceEvent(void);
+
+ /**
+ * This is the class destructor.
+ */
+ virtual ~_BluetoothDeviceEvent(void);
+ result Construct(void);
+
+protected:
+ /**
+ * Checks the argument and finds out the type of event. After that, this method calls appropriate pListener's method.
+ *
+ * @return A result code.
+ * @param[in] pListener An event listener related to this Bluetooth device event.
+ * @param[in] arg An event argument including information to be passed to the event listeners
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_ARG The argument passed to a method contains invalid values.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ virtual void FireImpl(Tizen::Base::Runtime::IEventListener& listener, const Tizen::Base::Runtime::IEventArg& arg);
+
+private:
+ _BluetoothDeviceEvent(const _BluetoothDeviceEvent& value);
+ _BluetoothDeviceEvent& operator =(const _BluetoothDeviceEvent& rhs);
+
+}; // _BluetoothDeviceEvent
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_DEVICE_EVENT_H_
diff --git a/src/FNetBt_BluetoothDeviceEventArg.cpp b/src/FNetBt_BluetoothDeviceEventArg.cpp
new file mode 100755
index 0000000..57c996c
--- /dev/null
+++ b/src/FNetBt_BluetoothDeviceEventArg.cpp
@@ -0,0 +1,136 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothDeviceEventArg.cpp
+// @brief This is the implementation file for the _BluetoothDeviceEventArg class.
+//
+
+#include <FNetBtBluetoothDevice.h>
+#include <FBaseSysLog.h>
+#include "FNetBt_BluetoothDeviceEventArg.h"
+
+
+using namespace Tizen::Base;
+using namespace Tizen::Base::Collection;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+//
+// This is a class constructor for _BT_DEVICE_EVENT_DISCOVERY_STARTED event.
+//
+_BluetoothDeviceEventArg::_BluetoothDeviceEventArg(result r)
+ : __evtType(_BT_DEVICE_EVENT_DISCOVERY_STARTED)
+ , __pRemoteDevice(null)
+ , __isCompleted(false)
+ , __serviceList(0)
+ , __result(r)
+{
+}
+
+//
+// This is a class constructor for _BT_DEVICE_EVENT_DISCOVERY_DONE event.
+//
+_BluetoothDeviceEventArg::_BluetoothDeviceEventArg(bool isCompleted)
+ : __evtType(_BT_DEVICE_EVENT_DISCOVERY_DONE)
+ , __pRemoteDevice(null)
+ , __isCompleted(isCompleted)
+ , __serviceList(0)
+ , __result(E_SUCCESS)
+{
+}
+
+//
+// This is a class constructor for _BT_DEVICE_EVENT_SVCLIST_RECEIVED event.
+//
+_BluetoothDeviceEventArg::_BluetoothDeviceEventArg(const BluetoothDevice& device, unsigned long serviceList, result r)
+ : __evtType(_BT_DEVICE_EVENT_SVCLIST_RECEIVED)
+ , __pRemoteDevice(null)
+ , __isCompleted(false)
+ , __serviceList(serviceList)
+ , __result(r)
+{
+ __pRemoteDevice = new (std::nothrow) BluetoothDevice(device);
+ SysTryReturnVoidResult(NID_NET_BT, __pRemoteDevice != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+}
+
+//
+// This is a class constructor for _BT_DEVICE_EVENT_DEVICE_FOUND and _BT_DEVICE_EVENT_UNPAIRED event.
+//
+_BluetoothDeviceEventArg::_BluetoothDeviceEventArg(_BluetoothDeviceEventType type, const BluetoothDevice& device)
+ : __evtType(type)
+ , __pRemoteDevice(null)
+ , __isCompleted(false)
+ , __serviceList(0)
+ , __result(E_SUCCESS)
+{
+ __pRemoteDevice = new (std::nothrow) BluetoothDevice(device);
+ SysTryReturnVoidResult(NID_NET_BT, __pRemoteDevice != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+}
+
+//
+// This is a class constructor for _BT_DEVICE_EVENT_PAIRED event.
+//
+_BluetoothDeviceEventArg::_BluetoothDeviceEventArg(const BluetoothDevice* pDevice, result r)
+ : __evtType(_BT_DEVICE_EVENT_PAIRED)
+ , __pRemoteDevice(null)
+ , __isCompleted(false)
+ , __serviceList(0)
+ , __result(r)
+{
+ if (pDevice != null)
+ {
+ __pRemoteDevice = new (std::nothrow) BluetoothDevice(*pDevice);
+ SysTryReturnVoidResult(NID_NET_BT, __pRemoteDevice != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ }
+}
+
+_BluetoothDeviceEventArg::~_BluetoothDeviceEventArg(void)
+{
+ delete __pRemoteDevice;
+}
+
+_BluetoothDeviceEventType
+_BluetoothDeviceEventArg::GetEventType(void) const
+{
+ return __evtType;
+}
+
+const BluetoothDevice*
+_BluetoothDeviceEventArg::GetRemoteDevice(void) const
+{
+ return __pRemoteDevice;
+}
+
+bool
+_BluetoothDeviceEventArg::IsDiscoveryCompleted(void) const
+{
+ return __isCompleted;
+}
+
+unsigned long
+_BluetoothDeviceEventArg::GetServiceList(void) const
+{
+ return __serviceList;
+}
+
+result
+_BluetoothDeviceEventArg::GetErrorResult(void) const
+{
+ return __result;
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothDeviceEventArg.h b/src/FNetBt_BluetoothDeviceEventArg.h
new file mode 100644
index 0000000..af93a97
--- /dev/null
+++ b/src/FNetBt_BluetoothDeviceEventArg.h
@@ -0,0 +1,170 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothDeviceEventArg.h
+ * @brief This is the header file for the _BluetoothDeviceEventArg class.
+ *
+ * This header file contains the declarations of the _BluetoothDeviceEventArg class which includes information to be
+ * passed to the event listeners
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_DEVICE_EVENT_ARG_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_DEVICE_EVENT_ARG_H_
+
+#include <FBaseObject.h>
+#include <FBaseResult.h>
+#include <FOspConfig.h>
+#include <FBaseRtIEventArg.h>
+
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// Forward declaration
+class BluetoothDevice;
+
+/**
+ * @enum _BluetoothDeviceEventType
+ * Type for specifying the type of _BluetoothDeviceEvent
+ */
+enum _BluetoothDeviceEventType
+{
+ _BT_DEVICE_EVENT_DISCOVERY_STARTED, /**< For notifying that the device discovery process is started */
+ _BT_DEVICE_EVENT_DEVICE_FOUND, /**< For notifying that a new remote device is found */
+ _BT_DEVICE_EVENT_DISCOVERY_DONE, /**< For notifying that the device discovery process is done */
+ _BT_DEVICE_EVENT_SVCLIST_RECEIVED, /**< For notifying that the service list is received from a remote device */
+ _BT_DEVICE_EVENT_PAIRED, /**< For notifying that the local device is newly paired with a remote device */
+ _BT_DEVICE_EVENT_UNPAIRED, /**< For notifying that the local device is unpaired with the paired device */
+};
+
+/**
+ * @class _BluetoothDeviceEventArg
+ * @brief This class is used as an argument for callback methods of the _IBluetoothDeviceEventListener class.
+ *
+ * When a _BluetoothDeviceEvent occurs, the _BluetoothDeviceEvent finds a _IBluetoothDeviceEventListener instance
+ * which is registered for the _BluetoothDeviceEvent and calls an appropriate method of the listener.
+ * @see _IBluetoothDeviceEventListener
+ */
+class _BluetoothDeviceEventArg
+ : public Tizen::Base::Object
+ , public Tizen::Base::Runtime::IEventArg
+{
+public:
+ /**
+ * This is a class constructor for _BT_DEVICE_EVENT_DISCOVERY_STARTED event.
+ *
+ * @param[in] r The result of the event
+ * @exception E_SUCCESS The action was successful.
+ * @exception E_SYSTEM The action failed due to a system error.
+ */
+ _BluetoothDeviceEventArg(result r);
+
+ /**
+ * This is a class constructor for _BT_DEVICE_EVENT_DISCOVERY_DONE event.
+ *
+ * @param[in] isCompleted @c true, if the discovery is completely done @n
+ * @c false, otherwise
+ */
+ _BluetoothDeviceEventArg(bool isCompleted);
+
+ /**
+ * This is a class constructor for _BT_DEVICE_EVENT_SVCLIST_RECEIVED event.
+ *
+ * @param[in] device The target device which sent its service list
+ * @param[in] serviceList The service list received from the remote device
+ * @param[in] r The result of the event
+ * @exception E_SUCCESS The action was successful.
+ * @exception E_REMOTE_SERVICE_NOT_FOUND The action failed because the service list of the remote device is not found.
+ * @exception E_SYSTEM The action failed due to a system error.
+ */
+ _BluetoothDeviceEventArg(const BluetoothDevice& device, unsigned long serviceList, result r);
+
+ /**
+ * This is a class constructor for _BT_DEVICE_EVENT_DEVICE_FOUND and _BT_DEVICE_EVENT_UNPAIRED event.
+ *
+ * @param[in] type The type of the event - only _BT_DEVICE_EVENT_DEVICE_FOUND and
+ * _BT_DEVICE_EVENT_UNPAIRED are allowed
+ * @param[in] device The remote device
+ */
+ _BluetoothDeviceEventArg(_BluetoothDeviceEventType type, const BluetoothDevice& device);
+
+ /**
+ * This is a class constructor for _BT_DEVICE_EVENT_PAIRED.
+ *
+ * @param[in] pDevice The paired device
+ * @param[in] r The result of pairing
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ _BluetoothDeviceEventArg(const BluetoothDevice* pDevice, result r);
+
+ /**
+ * This is the class destructor.
+ */
+ ~_BluetoothDeviceEventArg(void);
+
+ /**
+ * Gets the type of this event.
+ *
+ * @return The type of the event
+ */
+ _BluetoothDeviceEventType GetEventType(void) const;
+
+ /**
+ * Gets the remote device.
+ *
+ * @return The pointer of the remote device which is a found device, a paired, or an unpaired device
+ */
+ const BluetoothDevice* GetRemoteDevice(void) const;
+
+ /**
+ * Checks if the discovery is completely done.
+ *
+ * @return @c true, if the discovery is completely done @n
+ * @c false, otherwise
+ */
+ bool IsDiscoveryCompleted(void) const;
+
+ /**
+ * Gets the service list retrieved from a remote device.
+ *
+ * @return the service list which consists of masked BluetoothServiceType values
+ */
+ unsigned long GetServiceList(void) const;
+
+ /**
+ * Gets the error result of this event.
+ *
+ * @return The result of the event
+ */
+ result GetErrorResult(void) const;
+
+private:
+ _BluetoothDeviceEventArg(void);
+ _BluetoothDeviceEventArg(const _BluetoothDeviceEventArg& eventArg);
+ _BluetoothDeviceEventArg& operator =(const _BluetoothDeviceEventArg& rValue);
+
+private:
+ _BluetoothDeviceEventType __evtType;
+ BluetoothDevice* __pRemoteDevice;
+ bool __isCompleted;
+ unsigned long __serviceList;
+ result __result;
+
+}; // _BluetoothDeviceEventArg
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_DEVICE_EVENT_ARG_H_
diff --git a/src/FNetBt_BluetoothDeviceImpl.cpp b/src/FNetBt_BluetoothDeviceImpl.cpp
new file mode 100755
index 0000000..4b7af09
--- /dev/null
+++ b/src/FNetBt_BluetoothDeviceImpl.cpp
@@ -0,0 +1,345 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothDeviceImpl.cpp
+// @brief This is the implementation file for the _BluetoothDeviceImpl class.
+//
+
+#include <FNetBtBluetoothDevice.h>
+#include <FBaseUtilStringTokenizer.h>
+#include <FBaseColArrayList.h>
+#include <FBaseShort.h>
+#include <FBaseUuId.h>
+#include <FBaseSysLog.h>
+#include "FNetBt_BluetoothDeviceImpl.h"
+
+
+using namespace std;
+using namespace Tizen::Base;
+using namespace Tizen::Base::Utility;
+using namespace Tizen::Base::Collection;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+_BluetoothDeviceImpl::_BluetoothDeviceImpl(void)
+ : __deviceAddress()
+ , __deviceName()
+ , __isPaired(false)
+ , __rssi(0)
+ , __majorClassType(BT_COD_MAJ_DEV_CLS_MISC)
+ , __minorClassType(BT_COD_MIN_DEV_CLS_UNCLASSIFIED)
+ , __serviceClassList(BT_COD_SVC_UNKNOWN)
+ , __serviceList(BT_SVC_NONE)
+ , __pServiceUuidList(null)
+{
+ (void) __deviceAddress.Construct(BT_ADDRESS_LENGTH);
+ (void) __deviceAddress.SetPosition(0);
+}
+
+_BluetoothDeviceImpl::_BluetoothDeviceImpl(const Tizen::Base::ByteBuffer& address, const Tizen::Base::String& deviceName, BluetoothMajorDeviceClassType majorClassType, BluetoothMinorDeviceClassType minorClassType, unsigned long serviceClassList, unsigned long serviceList)
+ : __deviceAddress()
+ , __deviceName(deviceName)
+ , __isPaired(false)
+ , __rssi(0)
+ , __majorClassType(majorClassType)
+ , __minorClassType(minorClassType)
+ , __serviceClassList(serviceClassList)
+ , __serviceList(serviceList)
+ , __pServiceUuidList(null)
+{
+ (void) __deviceAddress.Construct(address);
+ (void) __deviceAddress.SetPosition(0);
+}
+
+_BluetoothDeviceImpl::_BluetoothDeviceImpl(const _BluetoothDeviceImpl& value)
+ : __deviceAddress()
+ , __deviceName(value.__deviceName)
+ , __isPaired(value.__isPaired)
+ , __rssi(value.__rssi)
+ , __majorClassType(value.__majorClassType)
+ , __minorClassType(value.__minorClassType)
+ , __serviceClassList(value.__serviceClassList)
+ , __serviceList(value.__serviceList)
+ , __pServiceUuidList(null)
+{
+ (void) __deviceAddress.Construct(value.__deviceAddress);
+ (void) __deviceAddress.SetPosition(0);
+ (void) SetServiceUuidList(value.__pServiceUuidList.get(), true);
+}
+
+_BluetoothDeviceImpl::~_BluetoothDeviceImpl(void)
+{
+}
+
+const Tizen::Base::ByteBuffer*
+_BluetoothDeviceImpl::GetAddress(void) const
+{
+ return &__deviceAddress;
+}
+
+Tizen::Base::String
+_BluetoothDeviceImpl::GetName(void) const
+{
+ return __deviceName;
+}
+
+bool
+_BluetoothDeviceImpl::IsPaired(void) const
+{
+ return __isPaired;
+}
+
+int
+_BluetoothDeviceImpl::GetRssi(void) const
+{
+ return __rssi;
+}
+
+BluetoothMajorDeviceClassType
+_BluetoothDeviceImpl::GetMajorDeviceClassType(void) const
+{
+ return __majorClassType;
+}
+
+BluetoothMinorDeviceClassType
+_BluetoothDeviceImpl::GetMinorDeviceClassType(void) const
+{
+ return __minorClassType;
+}
+
+unsigned long
+_BluetoothDeviceImpl::GetServiceClassList(void) const
+{
+ return __serviceClassList;
+}
+
+unsigned long
+_BluetoothDeviceImpl::GetServiceList(void) const
+{
+ return __serviceList;
+}
+
+const Tizen::Base::Collection::IList*
+_BluetoothDeviceImpl::GetServiceUuidList(void) const
+{
+ return __pServiceUuidList.get();
+}
+
+bool
+_BluetoothDeviceImpl::Equals(const Tizen::Base::Object& obj) const
+{
+ const _BluetoothDeviceImpl* pOther = dynamic_cast <const _BluetoothDeviceImpl*>(&obj);
+
+ if (pOther == null)
+ {
+ return false;
+ }
+
+ if (pOther == this)
+ {
+ return true;
+ }
+
+ return __deviceAddress.Equals(pOther->__deviceAddress);
+}
+
+int
+_BluetoothDeviceImpl::GetHashCode(void) const
+{
+ return GetAddressString(__deviceAddress).GetHashCode();
+}
+
+_BluetoothDeviceImpl&
+_BluetoothDeviceImpl::operator =(const _BluetoothDeviceImpl& rhs)
+{
+ if (this != &rhs)
+ {
+ (void) __deviceAddress.SetArray(rhs.__deviceAddress.GetPointer(), 0, BT_ADDRESS_LENGTH);
+ (void) __deviceAddress.SetPosition(0);
+
+ __deviceName = rhs.__deviceName;
+ __majorClassType = rhs.__majorClassType;
+ __minorClassType = rhs.__minorClassType;
+ __serviceClassList = rhs.__serviceClassList;
+ __serviceList = rhs.__serviceList;
+ (void) SetServiceUuidList(rhs.__pServiceUuidList.get(), true);
+ }
+
+ return *this;
+}
+
+result
+_BluetoothDeviceImpl::SetAddress(const Tizen::Base::ByteBuffer& address)
+{
+ result r = E_SUCCESS;
+
+ if ((address.GetLimit() < BT_ADDRESS_LENGTH) || (__deviceAddress.GetCapacity() < BT_ADDRESS_LENGTH))
+ {
+ r = E_INVALID_ARG;
+ }
+ else
+ {
+ for (int i = 0; i < BT_ADDRESS_LENGTH; i++)
+ {
+ byte value = 0x00;
+ (void) address.GetByte(i, value);
+ (void) __deviceAddress.SetByte(i, value);
+ }
+ }
+
+ return r;
+}
+
+void
+_BluetoothDeviceImpl::SetName(const Tizen::Base::String& name)
+{
+ __deviceName = name;
+}
+
+void
+_BluetoothDeviceImpl::SetMajorDeviceClassType(BluetoothMajorDeviceClassType type)
+{
+ __majorClassType = type;
+}
+
+void
+_BluetoothDeviceImpl::SetMinorDeviceClassType(BluetoothMinorDeviceClassType type)
+{
+ __minorClassType = type;
+}
+
+void
+_BluetoothDeviceImpl::SetServiceClassList(unsigned long listValue)
+{
+ __serviceClassList = listValue;
+}
+
+void
+_BluetoothDeviceImpl::SetServiceList(unsigned long serviceList)
+{
+ __serviceList = serviceList;
+}
+
+void
+_BluetoothDeviceImpl::SetPaired(bool isPaired)
+{
+ __isPaired = isPaired;
+}
+
+void
+_BluetoothDeviceImpl::SetRssi(int rssi)
+{
+ __rssi = rssi;
+}
+
+result
+_BluetoothDeviceImpl::SetServiceUuidList(const Tizen::Base::Collection::IList* pSrcUuidList, bool isDeepCopy)
+{
+ int count = 0;
+ unique_ptr<ArrayList, AllElementsDeleter> pTempList;
+
+ if (isDeepCopy == true)
+ {
+ if (pSrcUuidList != null)
+ {
+ pTempList.reset(new (std::nothrow) ArrayList());
+ SysTryReturnResult(NID_NET_BT, pTempList != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
+
+ count = pSrcUuidList->GetCount();
+ (void) pTempList->Construct(count);
+
+ for (int i = 0; i < count; i++)
+ {
+ const UuId* pSrcUuid = dynamic_cast<const UuId*>(pSrcUuidList->GetAt(i));
+ SysTryReturnResult(NID_NET_BT, pSrcUuid != null, E_SYSTEM, "A failure occurred when copying an internal variable.");
+
+ unique_ptr<UuId> pNewUuid(new (std::nothrow) UuId(*pSrcUuid));
+ SysTryReturnResult(NID_NET_BT, pNewUuid != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
+
+ pTempList->Add(*pNewUuid.release());
+ }
+ }
+
+ __pServiceUuidList.reset(pTempList.release());
+ }
+ else
+ {
+ __pServiceUuidList.reset(const_cast<IList*>(pSrcUuidList));
+ }
+
+ return E_SUCCESS;
+}
+
+result
+_BluetoothDeviceImpl::GetAddressByteBuffer(const Tizen::Base::String& srcAddr, const Tizen::Base::String& delimiters, Tizen::Base::ByteBuffer& dstAddr)
+{
+ result r = E_SUCCESS;
+ StringTokenizer strTok(srcAddr, delimiters);
+ int tokCount = strTok.GetTokenCount();
+ String token;
+ short digit = 0;
+
+ SysTryReturnResult(NID_NET_BT, tokCount == BT_ADDRESS_LENGTH, E_SYSTEM, "The address format is invalid.");
+
+ for (int i = 0; i < BT_ADDRESS_LENGTH; i++)
+ {
+ (void) strTok.GetNextToken(token);
+ token.Insert(L"0X", 0);
+ r = Short::Decode(token, digit);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "Parsing address has failed.");
+ r = dstAddr.SetByte(i, Short(digit).ToChar());
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "The ByteBuffer argument is invalid.");
+ }
+
+ SysLog(NID_NET_BT, "Translated address is [%ls]", GetAddressString(dstAddr).GetPointer());
+
+ return E_SUCCESS;
+}
+
+Tizen::Base::String
+_BluetoothDeviceImpl::GetAddressString(const Tizen::Base::ByteBuffer& address)
+{
+ String addressString(BT_ADDRESS_LENGTH * 3);
+ String hex;
+ byte value = 0x00;
+
+ for (int i = 0; i < BT_ADDRESS_LENGTH; i++)
+ {
+ (void) address.GetByte(i, value);
+ (void) hex.Format(4, L"%02X:", value);
+ (void) addressString.Append(hex);
+ }
+
+ // Removes the last delimiter
+ (void) addressString.Remove(addressString.GetLength() - 1, 1);
+
+ return addressString;
+}
+
+_BluetoothDeviceImpl*
+_BluetoothDeviceImpl::GetInstance(BluetoothDevice& bluetoothDevice)
+{
+ return bluetoothDevice.__pImpl;
+}
+
+const _BluetoothDeviceImpl*
+_BluetoothDeviceImpl::GetInstance(const BluetoothDevice& bluetoothDevice)
+{
+ return bluetoothDevice.__pImpl;
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothGapSystemAdapter.cpp b/src/FNetBt_BluetoothGapSystemAdapter.cpp
new file mode 100755
index 0000000..fa49bc1
--- /dev/null
+++ b/src/FNetBt_BluetoothGapSystemAdapter.cpp
@@ -0,0 +1,973 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothGapSystemAdapter.cpp
+// @brief This is the implementation file for the _BluetoothGapSystemAdapter class.
+//
+
+#include <unique_ptr.h>
+#include <pthread.h>
+#include <FBaseByteBuffer.h>
+#include <FBaseUtilStringUtil.h>
+#include <FBaseUuId.h>
+#include <FIoFile.h>
+#include <FNetBtBluetoothTypes.h>
+#include <FNetBtBluetoothDevice.h>
+#include <FBaseSysLog.h>
+#include <FApp_AppInfo.h>
+#include <FBase_StringConverter.h>
+#include "FNetBt_BluetoothGapSystemAdapter.h"
+#include "FNetBt_BluetoothDeviceImpl.h"
+#include "FNetBt_IBluetoothDeviceEventListener.h"
+#include "FNetBt_IBluetoothManagerEventListener.h"
+#include "FNetBt_BluetoothAdapterUtility.h"
+
+using namespace std;
+using namespace Tizen::App;
+using namespace Tizen::Base;
+using namespace Tizen::Base::Collection;
+using namespace Tizen::Base::Utility;
+using namespace Tizen::Io;
+
+static const Tizen::Base::String _BT_ADDRESS_FILE_PATH(L"/opt/etc/.bd_addr");
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+struct _DeviceInfoDeleter
+{
+ template<typename bt_device_info_s>
+ void operator()(bt_device_info_s* pDeviceInfo)
+ {
+ bt_adapter_free_device_info(pDeviceInfo);
+ }
+};
+
+_BluetoothGapSystemAdapter* _BluetoothGapSystemAdapter::__pInstance = null;
+
+_BluetoothGapSystemAdapter::_BluetoothGapSystemAdapter(void)
+ : __mgrEvtListenerList()
+ , __devEvtListenerList()
+{
+}
+
+_BluetoothGapSystemAdapter::~_BluetoothGapSystemAdapter(void)
+{
+ // unset all the system callback methods
+ bt_adapter_unset_state_changed_cb();
+ bt_adapter_unset_device_discovery_state_changed_cb();
+ bt_adapter_unset_visibility_mode_changed_cb();
+ bt_device_unset_bond_created_cb();
+ bt_device_unset_bond_destroyed_cb();
+ bt_device_unset_service_searched_cb();
+ bt_device_unset_connection_state_changed_cb();
+}
+
+void
+_BluetoothGapSystemAdapter::InitSingleton(void)
+{
+ bool isConstructed = false;
+ static _BluetoothGapSystemAdapter inst;
+
+ isConstructed = inst.Construct();
+ SysTryReturnVoidResult(NID_NET_BT, isConstructed == true, E_SYSTEM,
+ "[E_SYSTEM] Construction of _BluetoothGapSystemAdpater fails.");
+
+ __pInstance = &inst;
+}
+
+_BluetoothGapSystemAdapter*
+_BluetoothGapSystemAdapter::GetInstance(void)
+{
+ static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
+
+ if (__pInstance == null)
+ {
+ ClearLastResult();
+ pthread_once(&onceBlock, InitSingleton);
+ result r = GetLastResult();
+ if (IsFailed(r))
+ {
+ onceBlock = PTHREAD_ONCE_INIT;
+ }
+ }
+
+ return __pInstance;
+}
+
+bool
+_BluetoothGapSystemAdapter::Construct(void)
+{
+ if (bt_initialize() == BT_ERROR_NONE)
+ {
+ //register all the call backs.
+ if ((bt_adapter_set_state_changed_cb(&OnAdapterStateChanged, NULL) == BT_ERROR_NONE) &&
+ (bt_adapter_set_visibility_mode_changed_cb(&OnVisibilityModeChanged, NULL) == BT_ERROR_NONE) &&
+ (bt_device_set_bond_created_cb(&OnPairingCompleted, NULL) == BT_ERROR_NONE) &&
+ (bt_device_set_bond_destroyed_cb(&OnPairedDeviceRemoved, NULL) == BT_ERROR_NONE) &&
+ (bt_adapter_set_device_discovery_state_changed_cb(&OnDeviceDiscoveryStateChanged, NULL) == BT_ERROR_NONE) &&
+ (bt_device_set_service_searched_cb(&OnServiceDiscoveryCompleted, NULL) == BT_ERROR_NONE) &&
+ (bt_device_set_connection_state_changed_cb(&OnConnectionStateChanged, NULL) == BT_ERROR_NONE))
+ {
+ return true;
+ }
+ }
+ SysLog(NID_NET_BT, "Initialising the Bluetooth subsystem has failed");
+
+ return false;
+}
+
+result
+_BluetoothGapSystemAdapter::RegisterManagerEventListener(const _IBluetoothManagerEventListener& listener, bool isHighPriority)
+{
+ if (isHighPriority == true)
+ {
+ // insert the specified event listener at the begin of the list
+ return __mgrEvtListenerList.InsertAt(const_cast<_IBluetoothManagerEventListener*>(&listener), 0);
+ }
+ else
+ {
+ // insert the specified event listener at the end of the list
+ return __mgrEvtListenerList.Add(const_cast<_IBluetoothManagerEventListener*>(&listener));
+ }
+}
+
+result
+_BluetoothGapSystemAdapter::UnregisterManagerEventListener(const _IBluetoothManagerEventListener& listener)
+{
+
+ return __mgrEvtListenerList.Remove(const_cast<_IBluetoothManagerEventListener*>(&listener));
+}
+
+result
+_BluetoothGapSystemAdapter::RegisterDeviceEventListener(const _IBluetoothDeviceEventListener& listener)
+{
+ return __devEvtListenerList.Add(const_cast<_IBluetoothDeviceEventListener*>(&listener));
+}
+
+result
+_BluetoothGapSystemAdapter::UnregisterDeviceEventListener(const _IBluetoothDeviceEventListener& listener)
+{
+ return __devEvtListenerList.Remove(const_cast<_IBluetoothDeviceEventListener*>(&listener));
+}
+
+result
+_BluetoothGapSystemAdapter::Activate(void)
+{
+ if (bt_adapter_enable() == BT_ERROR_NONE)
+ {
+ return E_SUCCESS;
+ }
+ return E_SYSTEM;
+}
+
+result
+_BluetoothGapSystemAdapter::Deactivate(void)
+{
+ if (bt_adapter_disable() == BT_ERROR_NONE)
+ {
+ return E_SUCCESS;
+ }
+ return E_SYSTEM;
+}
+
+bool
+_BluetoothGapSystemAdapter::IsActivated(void) const
+{
+ bt_adapter_state_e btAdapterState = BT_ADAPTER_DISABLED;
+
+ if (bt_adapter_get_state(&btAdapterState) == BT_ERROR_NONE)
+ {
+ if (btAdapterState == BT_ADAPTER_ENABLED)
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool
+_BluetoothGapSystemAdapter::IsAvailable(BluetoothConnectionType type) const
+{
+ bool isAvailable = false;
+ bool isUsed = true;
+ char* pUuidStr = null;
+
+ if (!IsActivated())
+ {
+ SysLog(NID_NET_BT, "All connection type is not available because Bluetooth is not activated.");
+ return false;
+ }
+
+ switch (type)
+ {
+ case BT_CONNECTION_GENERIC:
+ isAvailable = true;
+ break;
+
+ case BT_CONNECTION_SPP_ACCEPTOR:
+ pUuidStr = _StringConverter::CopyToCharArrayN(UuId(BT_SVC_UUID_SPP).ToString());
+ // TODO: meaning of bt_adapter_is_service_used() method is quite wrong
+ if ((pUuidStr != null) && (bt_adapter_is_service_used(pUuidStr, &isUsed) == BT_ERROR_NONE))
+ {
+ SysLog(NID_NET_BT, "SPP(default UUID) server is %s.", isUsed ? "used" : "available");
+ }
+
+ isAvailable = isUsed ? false : true;
+
+ delete[] pUuidStr;
+ break;
+
+ case BT_CONNECTION_OPP_SERVER:
+ pUuidStr = _StringConverter::CopyToCharArrayN(UuId(BT_SVC_UUID_OPP).ToString());
+ // TODO: meaning of bt_adapter_is_service_used() method is quite wrong
+ if ((pUuidStr != null) && (bt_adapter_is_service_used(pUuidStr, &isUsed) == BT_ERROR_NONE))
+ {
+ SysLog(NID_NET_BT, "OPP server is %s.", isUsed ? "used" : "available");
+ }
+
+ isAvailable = isUsed ? false : true;
+
+ delete[] pUuidStr;
+ break;
+
+ // This is always true, because multiple SPP initiators can be run simultaneously since 3.0
+ case BT_CONNECTION_SPP_INITIATOR:
+ isAvailable = true;
+ break;
+
+ // The only one OPP client can be run per process.
+ case BT_CONNECTION_OPP_CLIENT:
+ isAvailable = true;
+ break;
+
+ default:
+ break;
+ }
+
+ return isAvailable;
+}
+
+Tizen::Base::String
+_BluetoothGapSystemAdapter::GetLocalDeviceAddress(void) const
+{
+ result r = E_SUCCESS;
+ int ret = 0;
+ ByteBuffer addressBuffer;
+ String localAddrString(_BT_ADDRESS_LENGTH*3);
+ char* pLocalAddr = null;
+
+ ret = bt_adapter_get_address(&pLocalAddr);
+
+ if (ret == BT_ERROR_NONE)
+ {
+ localAddrString = String(pLocalAddr);
+ }
+ else
+ {
+ File file;
+ int bufLimit;
+ byte curByte;
+
+ // Opens the local cache file and gets the local address from it.
+ r = file.Construct(_BT_ADDRESS_FILE_PATH, L"r");
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, localAddrString, E_SYSTEM, "Construction of the address info file has failed.");
+
+ (void) file.Seek(FILESEEKPOSITION_BEGIN, 0);
+
+ addressBuffer.Construct(_BT_ADDRESS_LENGTH*3);
+ r = file.Read(addressBuffer);
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, localAddrString, E_SYSTEM, "Read the address from the info file has failed.");
+
+ bufLimit = addressBuffer.GetLimit();
+
+ for (int i = 0, addressIndex = 0 ; i < bufLimit ; i++)
+ {
+ addressBuffer.GetByte(i, curByte);
+ if ((curByte >= '0' && curByte <= '9') ||
+ (curByte >= 'a' && curByte <= 'f') ||
+ (curByte >= 'A' && curByte <= 'F'))
+ {
+ localAddrString.Append((char)curByte);
+ addressIndex++;
+ if ((addressIndex % 3 == 2) && (addressIndex < (_BT_ADDRESS_LENGTH * 3 - 1 )))
+ {
+ // append ":" int the localAddrString to form a correct BT address format[aa:bb:cc:dd:ee:ff]
+ localAddrString.Append(':');
+ addressIndex++;
+ }
+ }
+ }
+
+ localAddrString.ToUpperCase();
+ }
+
+ return localAddrString;
+}
+
+BluetoothDiscoverableMode
+_BluetoothGapSystemAdapter::GetDiscoverableMode(void) const
+{
+ bt_adapter_visibility_mode_e visMode = BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE;
+ BluetoothDiscoverableMode discMode = BT_DISC_MODE_NOT_DISCOVERABLE;
+
+ // CONNECTABLE is actually not exactly the same as NONE mode but dealt with as the same values herein.
+ // TODO: resolve the problem about failure when the BT adapter is disabled
+ if (bt_adapter_get_visibility(&visMode, null)== BT_ERROR_NONE)
+ {
+ if (visMode == BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE)
+ {
+ discMode = BT_DISC_MODE_DISCOVERABLE;
+ }
+ else if (visMode == BT_ADAPTER_VISIBILITY_MODE_LIMITED_DISCOVERABLE)
+ {
+ if (_AppInfo::GetApiVersion() == _API_VERSION_2_0 && _AppInfo::IsOspCompat())
+ {
+ discMode = BT_DISC_MODE_DISCOVERABLE;
+ }
+ else
+ {
+ discMode = BT_DISC_MODE_TIME_LIMITED_DISCOVERABLE;
+ }
+ }
+ // BT_DISC_MODE_NOT_DISCOVERABLE, otherwise.
+ }
+
+ return discMode;
+}
+
+int
+_BluetoothGapSystemAdapter::GetRemainingTimeAsDiscoverable(void) const
+{
+ bt_adapter_visibility_mode_e visMode = BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE;
+ int duration = 0;
+ int ret = 0;
+
+ ret = bt_adapter_get_visibility(&visMode, &duration);
+
+ if ((ret != BT_ERROR_NONE) || (visMode != BT_ADAPTER_VISIBILITY_MODE_LIMITED_DISCOVERABLE))
+ {
+ SysLog(NID_NET_BT, "Not the time-limited discoverable mode! Remaining time is 0.");
+ }
+
+ return duration;
+}
+
+Tizen::Base::Collection::IList*
+_BluetoothGapSystemAdapter::GetAllPairedDeviceListN(void) const
+{
+ ArrayList* pPairedDeviceList = null;
+ SysLog(NID_NET_BT, "Getting all paired device list...");
+
+ pPairedDeviceList = new (std::nothrow) ArrayList();
+
+ bt_adapter_state_e btAdapterState;
+ if (bt_adapter_get_state(&btAdapterState) == BT_ERROR_NONE)
+ {
+ if (btAdapterState == BT_ADAPTER_ENABLED)
+ {
+ if (bt_adapter_foreach_bonded_device(&OnPairedDeviceFound, pPairedDeviceList) != BT_ERROR_NONE)
+ {
+ pPairedDeviceList->RemoveAll(true);
+ delete pPairedDeviceList;
+ return null;
+ }
+ }
+ else //BT_ADAPTER_DISABLED
+ {
+ SysLog(NID_NET_BT, "Cannot get the paired device list because the Bluetooth apdater is disabled!!");
+ }
+ }
+
+ return pPairedDeviceList;
+}
+
+result
+_BluetoothGapSystemAdapter::Pair(const Tizen::Base::ByteBuffer& deviceAddress)
+{
+ result r = E_SYSTEM;
+ char* pPairDevAddr = null;
+
+ SysTryReturnResult(NID_NET_BT, deviceAddress.GetRemaining() == _BT_ADDRESS_LENGTH, E_SYSTEM,
+ "The address of the remote device is incorrect.");
+
+ pPairDevAddr = _StringConverter::CopyToCharArrayN(_BluetoothDeviceImpl::GetAddressString(deviceAddress));
+ SysTryReturnResult(NID_NET_BT, pPairDevAddr != null, E_SYSTEM, "Address converting fails.");
+
+ if (bt_device_create_bond(pPairDevAddr) == BT_ERROR_NONE)
+ {
+ r = E_SUCCESS;
+ }
+
+ SysLog(NID_NET_BT, "Pairing with [%ls] %s.", _BluetoothDeviceImpl::GetAddressString(deviceAddress).GetPointer(),
+ r == E_SUCCESS ? "is successful" : "fails");
+
+ delete[] pPairDevAddr;
+ return r;
+}
+
+result
+_BluetoothGapSystemAdapter::CancelPair(void)
+{
+ result r = E_SYSTEM;
+
+ if (bt_device_cancel_bonding() == BT_ERROR_NONE)
+ {
+ r = E_SUCCESS;
+ }
+
+ SysLog(NID_NET_BT, "Cancel of bonding %s.", r == E_SUCCESS ? "is successful" : "fails");
+
+ return r;
+}
+
+result
+_BluetoothGapSystemAdapter::Unpair(const Tizen::Base::ByteBuffer& deviceAddress)
+{
+ result r = E_SYSTEM;
+ char* pUnpairDevAddr = null;
+
+ SysTryReturnResult(NID_NET_BT, deviceAddress.GetRemaining() == _BT_ADDRESS_LENGTH, E_SYSTEM,
+ "The address of the remote device is incorrect.");
+
+ pUnpairDevAddr = _StringConverter::CopyToCharArrayN(_BluetoothDeviceImpl::GetAddressString(deviceAddress));
+ SysTryReturnResult(NID_NET_BT, pUnpairDevAddr != null, E_SYSTEM, "Address converting fails.");
+
+ if (bt_device_destroy_bond(pUnpairDevAddr) == BT_ERROR_NONE)
+ {
+ r = E_SUCCESS;
+ }
+
+ SysLog(NID_NET_BT, "Unpairing with [%ls] %s.", _BluetoothDeviceImpl::GetAddressString(deviceAddress).GetPointer(),
+ r == E_SUCCESS ? "is successful" : "fails");
+
+ delete[] pUnpairDevAddr;
+ return r;
+}
+
+bool
+_BluetoothGapSystemAdapter::IsPaired(const Tizen::Base::ByteBuffer& deviceAddress) const
+{
+ bool isPaired = false;
+
+ if (deviceAddress.GetRemaining() != _BT_ADDRESS_LENGTH)
+ {
+ SysLog(NID_NET_BT, "The address of the remote device is incorrect.");
+ return false;
+ }
+
+ char* pRemoteDevAddress = _StringConverter::CopyToCharArrayN(_BluetoothDeviceImpl::GetAddressString(deviceAddress));
+ bt_device_info_s* pDeviceInfo = null;
+
+ if (bt_adapter_get_bonded_device_info(pRemoteDevAddress, &pDeviceInfo) == BT_ERROR_NONE)
+ {
+ if (pDeviceInfo)
+ {
+ if (pDeviceInfo->is_bonded)
+ {
+ isPaired = true;
+ }
+ bt_adapter_free_device_info(pDeviceInfo);
+ }
+ }
+
+ delete[] pRemoteDevAddress;
+ return isPaired;
+}
+
+result
+_BluetoothGapSystemAdapter::StartDiscovery(void)
+{
+ result r = E_SYSTEM;
+
+ if (bt_adapter_start_device_discovery() == BT_ERROR_NONE)
+ {
+ r = E_SUCCESS;
+ }
+
+ SysLog(NID_NET_BT, "Start of discovery %s.", r == E_SUCCESS ? "is successful" : "fails");
+
+ return r;
+}
+
+result
+_BluetoothGapSystemAdapter::CancelDiscovery(void)
+{
+ result r = E_SYSTEM;
+
+ if (bt_adapter_stop_device_discovery() == BT_ERROR_NONE)
+ {
+ r = E_SUCCESS;
+ }
+
+ SysLog(NID_NET_BT, "Cancel of discovery %s.", r == E_SUCCESS ? "is successful" : "fails");
+
+ return r;
+}
+
+bool
+_BluetoothGapSystemAdapter::IsDiscoveryInProgress(void) const
+{
+ bool is_discovering = false;
+
+ (void) bt_adapter_is_discovering(&is_discovering);
+
+ return is_discovering;
+}
+
+result
+_BluetoothGapSystemAdapter::RetrieveServiceList(const Tizen::Base::ByteBuffer& deviceAddress)
+{
+ result r = E_SYSTEM;
+ char* pDevAddr = null;
+
+ SysTryReturnResult(NID_NET_BT, deviceAddress.GetRemaining() == _BT_ADDRESS_LENGTH, E_SYSTEM,
+ "The address of the remote device is incorrect.");
+
+ pDevAddr = _StringConverter::CopyToCharArrayN(_BluetoothDeviceImpl::GetAddressString(deviceAddress));
+ SysTryReturnResult(NID_NET_BT, pDevAddr != null, E_SYSTEM, "Address converting fails.");
+
+ if (bt_device_start_service_search(pDevAddr) == BT_ERROR_NONE)
+ {
+ r = E_SUCCESS;
+ }
+
+ SysLog(NID_NET_BT, "Retrieving the service list from [%ls] %s.",
+ _BluetoothDeviceImpl::GetAddressString(deviceAddress).GetPointer(), r == E_SUCCESS ? "is successful" : "fails");
+
+ delete[] pDevAddr;
+ return r;
+}
+
+result
+_BluetoothGapSystemAdapter::GetPairedDevice(const ByteBuffer& address, BluetoothDevice& pairedDevice)
+{
+ int err = BT_ERROR_NONE;
+ unique_ptr<char[]> pDevAddr;
+ bt_device_info_s* pDeviceInfo = null;
+ unique_ptr<bt_device_info_s, _DeviceInfoDeleter> pDeviceInfoPtr;
+ _BluetoothDeviceImpl* pDevImpl = null;
+ String convertedName;
+
+ pDevAddr.reset(_StringConverter::CopyToCharArrayN(_BluetoothDeviceImpl::GetAddressString(address)));
+ SysTryReturnResult(NID_NET_BT, pDevAddr != null, E_SYSTEM, "Address converting fails.");
+
+ err = bt_adapter_get_bonded_device_info(pDevAddr.get(), &pDeviceInfo);
+ SysTryReturnResult(NID_NET_BT, err == BT_ERROR_NONE, E_SYSTEM, "Getting paired device infomation has failed.");
+ pDeviceInfoPtr.reset(pDeviceInfo);
+
+ pDevImpl = _BluetoothDeviceImpl::GetInstance(pairedDevice);
+
+ // converts the UTF8 multibyte string to Unicode String
+ (void) StringUtil::Utf8ToString(pDeviceInfoPtr->remote_name, convertedName);
+
+ pDevImpl->SetAddress(address);
+ pDevImpl->SetName(convertedName);
+ pDevImpl->SetPaired(pDeviceInfoPtr->is_bonded);
+ pDevImpl->SetMajorDeviceClassType(_BluetoothAdapterUtility::ConvertToMajorDeviceClassType(
+ pDeviceInfoPtr->bt_class.major_device_class));
+ pDevImpl->SetMinorDeviceClassType(_BluetoothAdapterUtility::ConvertToMinorDeviceClassType(
+ pDeviceInfoPtr->bt_class.major_device_class, pDeviceInfoPtr->bt_class.minor_device_class));
+ pDevImpl->SetServiceClassList(_BluetoothAdapterUtility::ConvertToServiceClassList(
+ pDeviceInfoPtr->bt_class.major_service_class_mask));
+ pDevImpl->SetServiceList(_BluetoothAdapterUtility::ConvertToServiceList(
+ pDeviceInfoPtr->service_uuid, pDeviceInfoPtr->service_count));
+ pDevImpl->SetServiceUuidList(_BluetoothAdapterUtility::ConvertServiceUuidListN(
+ pDeviceInfoPtr->service_uuid, pDeviceInfoPtr->service_count), false);
+
+ return E_SUCCESS;
+}
+
+void
+_BluetoothGapSystemAdapter::OnAdapterStateChanged(int status, bt_adapter_state_e adapterState, void* pUserdata)
+{
+ result r = E_SUCCESS;
+ _IBluetoothManagerEventListener* pMgrEvtListener = null;
+ IEnumeratorT<_IBluetoothManagerEventListener*>* pEnum = null;
+ _BluetoothGapSystemAdapter* pGapAdapter = _BluetoothGapSystemAdapter::GetInstance();
+
+ if (status != BT_ERROR_NONE)
+ {
+ r = E_SYSTEM;
+ }
+
+ pEnum = pGapAdapter->__mgrEvtListenerList.GetEnumeratorN();
+ while (pEnum->MoveNext() == E_SUCCESS)
+ {
+ pEnum->GetCurrent(pMgrEvtListener);
+ if(adapterState == BT_ADAPTER_ENABLED)
+ {
+ pMgrEvtListener->OnBluetoothActivated(r);
+ }
+ else
+ {
+ pMgrEvtListener->OnBluetoothDeactivated(r);
+ }
+ }
+
+ delete pEnum;
+}
+
+void
+_BluetoothGapSystemAdapter::OnVisibilityModeChanged(int result, bt_adapter_visibility_mode_e mode, void* pUserdata)
+{
+ _IBluetoothManagerEventListener* pMgrEvtListener = null;
+ IEnumeratorT<_IBluetoothManagerEventListener*>* pEnum = null;
+ _BluetoothGapSystemAdapter* pGapAdapter = _BluetoothGapSystemAdapter::GetInstance();
+ BluetoothDiscoverableMode changedMode = BT_DISC_MODE_NOT_DISCOVERABLE;
+
+ if (result == BT_ERROR_NONE)
+ {
+ switch (mode)
+ {
+ case BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE:
+ changedMode = BT_DISC_MODE_NOT_DISCOVERABLE;
+ break;
+
+ case BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE:
+ changedMode = BT_DISC_MODE_DISCOVERABLE;
+ break;
+
+ case BT_ADAPTER_VISIBILITY_MODE_LIMITED_DISCOVERABLE:
+ changedMode = BT_DISC_MODE_TIME_LIMITED_DISCOVERABLE;
+ break;
+
+ default:
+ return;
+ }
+
+ pEnum = pGapAdapter->__mgrEvtListenerList.GetEnumeratorN();
+ while (pEnum->MoveNext() == E_SUCCESS)
+ {
+ pEnum->GetCurrent(pMgrEvtListener);
+ pMgrEvtListener->OnBluetoothDiscoverableModeChanged(changedMode);
+ }
+
+ delete pEnum;
+ }
+}
+
+void
+_BluetoothGapSystemAdapter::OnDeviceDiscoveryStateChanged(int status, bt_adapter_device_discovery_state_e discoveryState,
+ bt_adapter_device_discovery_info_s* pDiscoveryInfo, void* pUserData)
+{
+ result r = E_SUCCESS;
+ _IBluetoothDeviceEventListener* pDevEventListener = null;
+ IEnumeratorT<_IBluetoothDeviceEventListener*>* pEnum = null;
+ _BluetoothGapSystemAdapter* pGapAdapter = _BluetoothGapSystemAdapter::GetInstance();
+
+ pEnum = pGapAdapter->__devEvtListenerList.GetEnumeratorN();
+
+ switch(discoveryState)
+ {
+ case BT_ADAPTER_DEVICE_DISCOVERY_STARTED:
+ {
+ if (status != BT_ERROR_NONE)
+ {
+ r = E_SYSTEM;
+ }
+
+ while (pEnum->MoveNext() == E_SUCCESS)
+ {
+ pEnum->GetCurrent(pDevEventListener);
+ pDevEventListener->OnBluetoothDiscoveryStarted(r);
+ }
+ }
+ break;
+
+ case BT_ADAPTER_DEVICE_DISCOVERY_FOUND:
+ {
+ BluetoothDevice foundDevice;
+ ByteBuffer deviceAddress;
+ deviceAddress.Construct(_BT_ADDRESS_LENGTH);
+ String convertedName;
+
+ String tempDevAddr(pDiscoveryInfo->remote_address);
+ _BluetoothDeviceImpl::GetAddressByteBuffer(tempDevAddr, L":", deviceAddress);
+
+ // converts the UTF8 multibyte string to Unicode String
+ (void) StringUtil::Utf8ToString(pDiscoveryInfo->remote_name, convertedName);
+
+ _BluetoothDeviceImpl* pDevImpl = _BluetoothDeviceImpl::GetInstance(foundDevice);
+
+ pDevImpl->SetAddress(deviceAddress);
+ pDevImpl->SetName(convertedName);
+ pDevImpl->SetPaired(pDiscoveryInfo->is_bonded);
+ pDevImpl->SetRssi(pDiscoveryInfo->rssi);
+ pDevImpl->SetMajorDeviceClassType(_BluetoothAdapterUtility::ConvertToMajorDeviceClassType(
+ pDiscoveryInfo->bt_class.major_device_class));
+ pDevImpl->SetMinorDeviceClassType(_BluetoothAdapterUtility::ConvertToMinorDeviceClassType(
+ pDiscoveryInfo->bt_class.major_device_class, pDiscoveryInfo->bt_class.minor_device_class));
+ pDevImpl->SetServiceClassList(_BluetoothAdapterUtility::ConvertToServiceClassList(
+ pDiscoveryInfo->bt_class.major_service_class_mask));
+ pDevImpl->SetServiceList(_BluetoothAdapterUtility::ConvertToServiceList(
+ pDiscoveryInfo->service_uuid, pDiscoveryInfo->service_count));
+ pDevImpl->SetServiceUuidList(_BluetoothAdapterUtility::ConvertServiceUuidListN(
+ pDiscoveryInfo->service_uuid, pDiscoveryInfo->service_count), false);
+
+ _BluetoothAdapterUtility::PrintDeviceInfo(foundDevice);
+
+ while (pEnum->MoveNext() == E_SUCCESS)
+ {
+ pEnum->GetCurrent(pDevEventListener);
+ pDevEventListener->OnBluetoothRemoteDeviceFound(foundDevice);
+ }
+ }
+ break;
+
+ case BT_ADAPTER_DEVICE_DISCOVERY_FINISHED:
+ {
+ bool isCompleted = false;
+
+ if (status == BT_ERROR_NONE)
+ {
+ isCompleted = true; // isCompleted is false in other cases including BT_ERROR_CANCEL
+ }
+
+ while (pEnum->MoveNext() == E_SUCCESS)
+ {
+ pEnum->GetCurrent(pDevEventListener);
+ pDevEventListener->OnBluetoothDiscoveryDone(isCompleted);
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ delete pEnum;
+}
+
+void
+_BluetoothGapSystemAdapter::OnServiceDiscoveryCompleted(int status, bt_device_sdp_info_s* pSdpInfo, void* pUserData)
+{
+ result r = E_SUCCESS;
+ _IBluetoothDeviceEventListener* pDevEventListener = null;
+ IEnumeratorT<_IBluetoothDeviceEventListener*>* pEnum = null;
+ ByteBuffer deviceAddress;
+ deviceAddress.Construct(_BT_ADDRESS_LENGTH);
+ unsigned long serviceList = 0;
+ Tizen::Base::Collection::IList* pServiceUuidList= null;
+ _BluetoothGapSystemAdapter* pGapAdapter = _BluetoothGapSystemAdapter::GetInstance();
+
+ String tempDevAddr(pSdpInfo->remote_address);
+ r = _BluetoothDeviceImpl::GetAddressByteBuffer(tempDevAddr, L":", deviceAddress);
+
+ if (status != BT_ERROR_NONE)
+ {
+ r = E_SYSTEM;
+ }
+ else
+ {
+ pServiceUuidList = _BluetoothAdapterUtility::ConvertServiceUuidListN(
+ pSdpInfo->service_uuid, pSdpInfo->service_count);
+ if (pServiceUuidList == null)
+ {
+ r = E_SYSTEM;
+ }
+ else
+ {
+ serviceList = _BluetoothAdapterUtility::ConvertToServiceList(pSdpInfo->service_uuid, pSdpInfo->service_count);
+ SysLog(NID_NET_BT, "Searched Service List =================");
+ _BluetoothAdapterUtility::PrintServiceList(serviceList);
+
+ SysLog(NID_NET_BT, "Searched Service UUID List ============");
+ _BluetoothAdapterUtility::PrintServiceUuidList(pServiceUuidList);
+ }
+ }
+
+ pEnum = pGapAdapter->__devEvtListenerList.GetEnumeratorN();
+
+ while (pEnum->MoveNext() == E_SUCCESS)
+ {
+ pEnum->GetCurrent(pDevEventListener);
+ pDevEventListener->OnBluetoothServiceListReceived(deviceAddress, serviceList, pServiceUuidList, r);
+ }
+
+ delete pEnum;
+ // The ownership of UuId instances in the list is transferred to _BluetoothDeviceEventArg.
+ // Therefore, only the list except its elements is deleted here.
+ delete pServiceUuidList;
+}
+
+void
+_BluetoothGapSystemAdapter::OnPairingCompleted(int status, bt_device_info_s* pDeviceInfo, void* pUserdata)
+{
+ result r = E_SUCCESS;
+ _IBluetoothDeviceEventListener* pDevEventListener = null;
+ IEnumeratorT<_IBluetoothDeviceEventListener*>* pEnum = null;
+ BluetoothDevice pairingDevice;
+ _BluetoothGapSystemAdapter* pGapAdapter = _BluetoothGapSystemAdapter::GetInstance();
+ ByteBuffer deviceAddress;
+ deviceAddress.Construct(_BT_ADDRESS_LENGTH);
+ String convertedName;
+
+ SysTryReturnVoidResult(NID_NET_BT, pDeviceInfo != null, E_SYSTEM,
+ "[E_SYSTEM] the input param, DeviceInfo on callback is null.");
+
+ String tempDevAddr(pDeviceInfo->remote_address);
+ (void) _BluetoothDeviceImpl::GetAddressByteBuffer(tempDevAddr, L":", deviceAddress);
+
+ // converts the UTF8 multibyte string to Unicode String
+ (void) StringUtil::Utf8ToString(pDeviceInfo->remote_name, convertedName);
+
+ _BluetoothDeviceImpl* pDevImpl = _BluetoothDeviceImpl::GetInstance(pairingDevice);
+
+ pDevImpl->SetAddress(deviceAddress);
+ pDevImpl->SetName(convertedName);
+ pDevImpl->SetPaired(true);
+ pDevImpl->SetRssi(0);
+ pDevImpl->SetMajorDeviceClassType(_BluetoothAdapterUtility::ConvertToMajorDeviceClassType(
+ pDeviceInfo->bt_class.major_device_class));
+ pDevImpl->SetMinorDeviceClassType(_BluetoothAdapterUtility::ConvertToMinorDeviceClassType(
+ pDeviceInfo->bt_class.major_device_class, pDeviceInfo->bt_class.minor_device_class));
+ pDevImpl->SetServiceClassList(_BluetoothAdapterUtility::ConvertToServiceClassList(
+ pDeviceInfo->bt_class.major_service_class_mask));
+ pDevImpl->SetServiceList(_BluetoothAdapterUtility::ConvertToServiceList(
+ pDeviceInfo->service_uuid, pDeviceInfo->service_count));
+ pDevImpl->SetServiceUuidList(_BluetoothAdapterUtility::ConvertServiceUuidListN(
+ pDeviceInfo->service_uuid, pDeviceInfo->service_count), false);
+
+ switch (status)
+ {
+ case BT_ERROR_NONE:
+ r = E_SUCCESS;
+ break;
+ case BT_ERROR_CANCELLED:
+ r = E_OPERATION_CANCELED;
+ break;
+ case BT_ERROR_TIMED_OUT:
+ r = E_TIMEOUT;
+ break;
+ default:
+ r = E_OPERATION_FAILED;
+ break;
+ }
+
+ pEnum = pGapAdapter->__devEvtListenerList.GetEnumeratorN();
+ while (pEnum->MoveNext() == E_SUCCESS)
+ {
+ pEnum->GetCurrent(pDevEventListener);
+ pDevEventListener->OnBluetoothPaired(&pairingDevice, r);
+ }
+ delete pEnum;
+}
+
+void
+_BluetoothGapSystemAdapter::OnPairedDeviceRemoved(int status, char* pRemoteAddress, void* pUserData)
+{
+ _IBluetoothDeviceEventListener* pDevEventListener = null;
+ IEnumeratorT<_IBluetoothDeviceEventListener*>* pEnum = null;
+ _BluetoothGapSystemAdapter* pGapAdapter = _BluetoothGapSystemAdapter::GetInstance();
+ ByteBuffer deviceAddress;
+ deviceAddress.Construct(_BT_ADDRESS_LENGTH);
+
+ if (status == BT_ERROR_NONE)
+ {
+ String tempDevAddr(pRemoteAddress);
+ _BluetoothDeviceImpl::GetAddressByteBuffer(tempDevAddr, L":", deviceAddress);
+
+ pEnum = pGapAdapter->__devEvtListenerList.GetEnumeratorN();
+
+ while (pEnum->MoveNext() == E_SUCCESS)
+ {
+ pEnum->GetCurrent(pDevEventListener);
+ pDevEventListener->OnBluetoothUnpaired(deviceAddress);
+ }
+
+ delete pEnum;
+ }
+ else
+ {
+ SysLog(NID_NET_BT, "Error in removing the Paired Device is %d", status);
+ }
+}
+
+bool
+_BluetoothGapSystemAdapter::OnPairedDeviceFound(bt_device_info_s* pDeviceInfo, void* pUserdata)
+{
+ ArrayList* pPairedDeviceList = static_cast<ArrayList*>(pUserdata);
+
+ ByteBuffer btAddress;
+ btAddress.Construct(_BT_ADDRESS_LENGTH);
+ BluetoothDevice* pPairedDevice = null;
+ String convertedName;
+
+ pPairedDevice = new (std::nothrow) BluetoothDevice();
+ SysTryReturn(NID_NET_BT, pPairedDevice != null, false, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+
+ String tempDevAddr(pDeviceInfo->remote_address);
+ _BluetoothDeviceImpl::GetAddressByteBuffer(tempDevAddr, L":", btAddress);
+
+ // converts the UTF8 multibyte string to Unicode String
+ (void) StringUtil::Utf8ToString(pDeviceInfo->remote_name, convertedName);
+
+ SysLog(NID_NET_BT, "Paired Device - (name: %ls)", convertedName.GetPointer());
+
+ _BluetoothDeviceImpl* pDevImpl = _BluetoothDeviceImpl::GetInstance(*pPairedDevice);
+
+ pDevImpl->SetAddress(btAddress);
+ pDevImpl->SetName(convertedName);
+ pDevImpl->SetPaired(true);
+ pDevImpl->SetRssi(0);
+ pDevImpl->SetMajorDeviceClassType(_BluetoothAdapterUtility::ConvertToMajorDeviceClassType(
+ pDeviceInfo->bt_class.major_device_class));
+ pDevImpl->SetMinorDeviceClassType(_BluetoothAdapterUtility::ConvertToMinorDeviceClassType(
+ pDeviceInfo->bt_class.major_device_class, pDeviceInfo->bt_class.minor_device_class));
+ pDevImpl->SetServiceClassList(_BluetoothAdapterUtility::ConvertToServiceClassList(
+ pDeviceInfo->bt_class.major_service_class_mask));
+ pDevImpl->SetServiceList(_BluetoothAdapterUtility::ConvertToServiceList(
+ pDeviceInfo->service_uuid, pDeviceInfo->service_count));
+ pDevImpl->SetServiceUuidList(_BluetoothAdapterUtility::ConvertServiceUuidListN(
+ pDeviceInfo->service_uuid, pDeviceInfo->service_count), false);
+
+ pPairedDeviceList->Add(*pPairedDevice);
+
+ return true;
+}
+
+void
+_BluetoothGapSystemAdapter::OnConnectionStateChanged(bool isConnected, const char* pRemoteAddress, void* pUserdata)
+{
+ _IBluetoothDeviceEventListener* pDevEventListener = null;
+ IEnumeratorT<_IBluetoothDeviceEventListener*>* pEnum = null;
+ _BluetoothGapSystemAdapter* pGapAdapter = _BluetoothGapSystemAdapter::GetInstance();
+ ByteBuffer deviceAddress;
+ deviceAddress.Construct(_BT_ADDRESS_LENGTH);
+
+ String tempDevAddr(pRemoteAddress);
+ _BluetoothDeviceImpl::GetAddressByteBuffer(tempDevAddr, L":", deviceAddress);
+
+ pEnum = pGapAdapter->__devEvtListenerList.GetEnumeratorN();
+
+ while (pEnum->MoveNext() == E_SUCCESS)
+ {
+ pEnum->GetCurrent(pDevEventListener);
+ if (isConnected)
+ {
+ pDevEventListener->OnBluetoothDeviceConnected(deviceAddress);
+ }
+ else
+ {
+ pDevEventListener->OnBluetoothDeviceDisconnected(deviceAddress);
+ }
+ }
+
+ delete pEnum;
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothGapSystemAdapter.h b/src/FNetBt_BluetoothGapSystemAdapter.h
new file mode 100644
index 0000000..68d5798
--- /dev/null
+++ b/src/FNetBt_BluetoothGapSystemAdapter.h
@@ -0,0 +1,323 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothGapSystemAdapter.h
+ * @brief This is the header file for the _BluetoothGapSystemAdapter class.
+ *
+ * This header file contains the declaration of the _BluetoothGapSystemAdapter class.
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_GAP_SYSTEM_ADAPTER_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_GAP_SYSTEM_ADAPTER_H_
+
+#include <bluetooth.h>
+#include <FBaseObject.h>
+#include <FBaseResult.h>
+#include <FBaseColLinkedListT.h>
+#include <FNetBtBluetoothTypes.h>
+
+static const int _BT_ADDRESS_LENGTH = 6;
+
+// forward declarations
+namespace Tizen { namespace Base { namespace Collection
+{
+class IList;
+} } }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// forward declarations
+class BluetoothDevice;
+class _IBluetoothDeviceEventListener;
+class _IBluetoothManagerEventListener;
+class _BluetoothIpcProxy;
+
+/**
+ * @class _BluetoothGapSystemAdapter
+ * @brief This class provides functions related to deliver the system events to the listeners such as
+ * _BluetoothManagerImpl. This class is a type of singleton, therefore only one instance should be allowed.
+ */
+class _BluetoothGapSystemAdapter
+ : public Tizen::Base::Object
+{
+public:
+ /**
+ * Creates an instance of this class if there is no instance in this application context.
+ * Gets the exist instance because this class is a singleton, otherwise.
+ *
+ * @return the instance of this class
+ */
+ static _BluetoothGapSystemAdapter* GetInstance(void);
+
+
+ /**
+ * Register an instance of _IBluetoothManagerEventListener interface into the internal list.
+ *
+ * @return An error code
+ * @param[in] listener The instance of _IBluetoothManagerEventListener to be registered
+ * @param[in] isHighPriority Set to @c true to register with the high priority, @n
+ * else @c false
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_MEMORY The memory is insufficient.
+ */
+ result RegisterManagerEventListener(const _IBluetoothManagerEventListener& listener, bool isHighPriority);
+
+ /**
+ * Unregister an instance of _IBluetoothManagerEventListener interface from the internal list.
+ *
+ * @return An error code
+ * @param[in] listener The instance of _IBluetoothManagerEventListener to be unregistered
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OBJ_NOT_FOUND The input instance is not registered.
+ */
+ result UnregisterManagerEventListener(const _IBluetoothManagerEventListener& listener);
+
+ /**
+ * Register an instance of _IBluetoothDeviceEventListener interface into the internal list.
+ *
+ * @return An error code
+ * @param[in] listener The instance of _IBluetoothDeviceEventListener to be registered
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_MEMORY The memory is insufficient.
+ */
+ result RegisterDeviceEventListener(const _IBluetoothDeviceEventListener& listener);
+
+ /**
+ * Unregister an instance of _IBluetoothDeviceEventListener interface from the internal list.
+ *
+ * @return An error code
+ * @param[in] listener The instance of _IBluetoothDeviceEventListener to be unregistered
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OBJ_NOT_FOUND The input instance is not registered.
+ */
+ result UnregisterDeviceEventListener(const _IBluetoothDeviceEventListener& listener);
+
+ /**
+ * Activates %Bluetooth module.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_FAILURE The method failed.
+ */
+ result Activate(void);
+
+ /**
+ * Deactivates %Bluetooth module.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_FAILURE The method failed.
+ */
+ result Deactivate(void);
+
+ /**
+ * Checks whether the %Bluetooth is activated or not.
+ *
+ * @return @c true, if activated @n
+ * @c false, otherwise
+ */
+ bool IsActivated(void) const;
+
+ /**
+ * Checks if the Bluetooth-specific profile is available.
+ *
+ * @return @c true if connection is available @n
+ * @c false, otherwise
+ * @param[in] type The connection type to check availability
+ */
+ bool IsAvailable(BluetoothConnectionType type) const;
+
+ /**
+ * Gets the local %Bluetooth device address.
+ *
+ * @return The local %Bluetooth device address
+ */
+ Tizen::Base::String GetLocalDeviceAddress(void) const;
+
+ /**
+ * Gets the discoverable mode of the local device.
+ *
+ * @return The discoverable mode of the local device
+ */
+ BluetoothDiscoverableMode GetDiscoverableMode(void) const;
+
+ /**
+ * Gets the remaining time, in seconds, until the local device is not discoverable.
+ *
+ * @return The remaining time, in seconds, until the local device to be not discoverable.
+ */
+ int GetRemainingTimeAsDiscoverable(void) const;
+
+ /**
+ * Gets all Paired Device list.
+ *
+ * @return Pointer to the paired device list on success @n
+ * @c null, otherwise.
+ * @remarks It is caller's responsibility that deletes the result list.
+ */
+ Tizen::Base::Collection::IList* GetAllPairedDeviceListN(void) const;
+
+ /**
+ * Pairs(Bonds) with the specified remote device.
+ *
+ * @return An error code
+ * @param[in] deviceAddress The address of a remote device to pair with
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ result Pair(const Tizen::Base::ByteBuffer& deviceAddress);
+
+ /**
+ * Cancels the pairing in progress.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ result CancelPair(void);
+
+ /**
+ * Unpairs(Unbonds) with the specified paired device.
+ *
+ * @return An error code
+ * @param[in] deviceAddress The address of the paired device to unpair with
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ result Unpair(const Tizen::Base::ByteBuffer& deviceAddress);
+
+ /**
+ * Checks if this device is paired with the specified remote device.
+ *
+ * @return @c true if the device is paired @n
+ * @c false, otherwise
+ * @param[in] deviceAddress The address of a remote device to check
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ bool IsPaired(const Tizen::Base::ByteBuffer& deviceAddress) const;
+
+ /**
+ * Starts a device discovery process.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ result StartDiscovery(void);
+
+ /**
+ * Stops the discovery in progress.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ result CancelDiscovery(void);
+
+ /**
+ * Checks whether the device discovery is in progress or not.
+ *
+ * @return @c true, if in progress @n
+ * @c false, otherwise
+ */
+ bool IsDiscoveryInProgress(void) const;
+
+ /**
+ * Retrieves the service list from a remote device.
+ *
+ * @return An error code
+ * @param[in] deviceAddress The address of a remote device which the service list is retrieved from
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ result RetrieveServiceList(const Tizen::Base::ByteBuffer& deviceAddress);
+
+
+ /**
+ * Gets the information of the specified paired device.
+ *
+ * @return An error code
+ * @param[in] address The address of a paired device
+ * @param[out] pairedDevice The remote device instance whose information to be filled in
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ static result GetPairedDevice(const Tizen::Base::ByteBuffer& address, BluetoothDevice& pairedDevice);
+
+ /**
+ * Callback to notify the change in the state of Bluetooth adapter.
+ */
+ static void OnAdapterStateChanged(int status, bt_adapter_state_e adapterState, void* pUserdata);
+
+ /**
+ * Callback to notify the change in the visibility mode of Bluetooth adapter.
+ */
+ static void OnVisibilityModeChanged(int result, bt_adapter_visibility_mode_e mode, void* pUserdata);
+
+ /**
+ * Callback to notify when you get bonded devices repeatedly.
+ */
+ static bool OnPairedDeviceFound(bt_device_info_s* pDeviceInfo, void* pUserdata);
+
+ /**
+ * Callback to notify when the state of the device discovery changes.
+ */
+ static void OnDeviceDiscoveryStateChanged(int status, bt_adapter_device_discovery_state_e discoveryState,
+ bt_adapter_device_discovery_info_s* pDiscoveryInfo, void* pUserdata);
+
+ /**
+ * Callback to notify when the process of service discovery is completed.
+ */
+ static void OnServiceDiscoveryCompleted(int status, bt_device_sdp_info_s* pSdpInfo, void* pUserdata);
+
+ /**
+ * Callback to notify that a new remote device is paired with this local device.
+ */
+ static void OnPairingCompleted(int status, bt_device_info_s* pDeviceInfo, void* pUserdata);
+
+ /**
+ * Callback to notify that the already paired device is unpaired with this local device.
+ */
+ static void OnPairedDeviceRemoved(int status, char* pRemoteAddress, void* pUserdata);
+
+ /**
+ * Callback to notify when the state of the device connection changes.
+ */
+ static void OnConnectionStateChanged(bool isConnected, const char* pRemoteAddress, void* pUserdata);
+
+
+private:
+ _BluetoothGapSystemAdapter(void);
+ ~_BluetoothGapSystemAdapter(void);
+
+ _BluetoothGapSystemAdapter(const _BluetoothGapSystemAdapter& value);
+ _BluetoothGapSystemAdapter& operator =(const _BluetoothGapSystemAdapter& value);
+
+ bool Construct(void);
+
+ static void InitSingleton(void);
+
+private:
+ Tizen::Base::Collection::LinkedListT<_IBluetoothManagerEventListener*> __mgrEvtListenerList;
+ Tizen::Base::Collection::LinkedListT<_IBluetoothDeviceEventListener*> __devEvtListenerList;
+ static _BluetoothGapSystemAdapter* __pInstance;
+
+}; // _BluetoothGapSystemAdapter
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_GAP_SYSTEM_ADAPTER_H_
diff --git a/src/FNetBt_BluetoothHdpSystemAdapter.cpp b/src/FNetBt_BluetoothHdpSystemAdapter.cpp
new file mode 100755
index 0000000..0ea320a
--- /dev/null
+++ b/src/FNetBt_BluetoothHdpSystemAdapter.cpp
@@ -0,0 +1,439 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothHdpSystemAdapter.cpp
+// @brief This is the implementation file for the _BluetoothHdpSystemAdapter class.
+//
+
+#include <pthread.h>
+#include <FBaseByteBuffer.h>
+#include <FBaseString.h>
+#include <FBaseColHashMapT.h>
+#include <FBaseColIComparerT.h>
+#include <FBaseColIHashCodeProviderT.h>
+#include <FBaseUtilStringUtil.h>
+#include <FNetBtBluetoothDevice.h>
+#include <FNetBtBluetoothTypes.h>
+#include <FBaseSysLog.h>
+#include <FBase_StringConverter.h>
+#include "FNetBt_BluetoothHealthImpl.h"
+#include "FNetBt_BluetoothHdpSystemAdapter.h"
+#include "FNetBt_BluetoothGapSystemAdapter.h"
+#include "FNetBt_BluetoothDeviceImpl.h"
+
+using namespace std;
+using namespace Tizen::Base;
+using namespace Tizen::Base::Collection;
+using namespace Tizen::Base::Utility;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+/*
+ * @class _BluetoothAddressComparer
+ * @brief The _BluetoothAddressComparer class provides the comparer about two specified String
+ * which consists of Bluetooth address and service UUID.
+ */
+class _BluetoothAddressComparer
+ : public Tizen::Base::Collection::IComparerT <Tizen::Base::String>
+ , public Tizen::Base::Object
+{
+public:
+ _BluetoothAddressComparer(void) {}
+ virtual ~_BluetoothAddressComparer(void) {}
+
+ virtual result Compare(const Tizen::Base::String& obj1, const Tizen::Base::String& obj2, int& cmp) const
+ {
+ cmp = obj1.CompareTo(obj2);
+ return E_SUCCESS;
+ }
+
+private:
+ _BluetoothAddressComparer(const _BluetoothAddressComparer& value);
+ _BluetoothAddressComparer& operator =(const _BluetoothAddressComparer& value);
+
+}; //_BluetoothAddressComparer
+
+/*
+ * @class _BluetoothAddressHashCodeProviderT
+ * @brief The _BluetoothAddressHashCodeProviderT class provides the hash code of a specified String
+ * which consists of Bluetooth address and service UUID.
+ */
+class _BluetoothAddressHashCodeProvider
+ : public Tizen::Base::Collection::IHashCodeProviderT <Tizen::Base::String>
+{
+public:
+ _BluetoothAddressHashCodeProvider(void) {}
+ virtual ~_BluetoothAddressHashCodeProvider(void) {}
+ virtual int GetHashCode(const Tizen::Base::String& obj) const
+ {
+ return obj.GetHashCode();
+ }
+
+private:
+ _BluetoothAddressHashCodeProvider(const _BluetoothAddressHashCodeProvider& value);
+ _BluetoothAddressHashCodeProvider& operator =(const _BluetoothAddressHashCodeProvider& value);
+
+}; //_BluetoothAddressHashCodeProvider
+
+
+static _BluetoothAddressComparer _btAddressComparer;
+static _BluetoothAddressHashCodeProvider _btAddressHashCodeProvider;
+
+_BluetoothHdpSystemAdapter* _BluetoothHdpSystemAdapter::__pInstance = null;
+
+_BluetoothHdpSystemAdapter::_BluetoothHdpSystemAdapter(void)
+ : __pAppHealthMap(null)
+ , __pChannelHealthMap(null)
+ , __pChannelAddressMap(null)
+{
+}
+
+_BluetoothHdpSystemAdapter::~_BluetoothHdpSystemAdapter(void)
+{
+ // unregister the callback methods from the underlying layer
+ int err = bt_hdp_unset_connection_state_changed_cb();
+ SysLog(NID_NET_BT, "[0x%x] error in unregistering the connection state change callback method", err);
+
+ err = bt_hdp_unset_data_received_cb();
+ SysLog(NID_NET_BT, "[0x%x] error in unregistering the data received state change callback method", err);
+}
+
+void
+_BluetoothHdpSystemAdapter::InitSingleton(void)
+{
+ bool r = false;
+ static _BluetoothHdpSystemAdapter inst;
+
+ r = inst.Construct();
+ SysTryReturnVoidResult(NID_NET_BT, r == true, E_SYSTEM, "[E_SYSTEM] Propagating.");
+
+ __pInstance = &inst;
+}
+
+_BluetoothHdpSystemAdapter*
+_BluetoothHdpSystemAdapter::GetInstance(void)
+{
+ static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
+
+ if (__pInstance == null)
+ {
+ ClearLastResult();
+ pthread_once(&onceBlock, InitSingleton);
+ result r = GetLastResult();
+ if (IsFailed(r))
+ {
+ onceBlock = PTHREAD_ONCE_INIT;
+ }
+ }
+
+ return __pInstance;
+}
+
+bool
+_BluetoothHdpSystemAdapter::Construct(void)
+{
+ int err = BT_ERROR_NONE;
+ result r = E_SUCCESS;
+ unique_ptr<Tizen::Base::Collection::HashMapT< Tizen::Base::String, _BluetoothHealthImpl*> > pAppHealthMap;
+ unique_ptr<Tizen::Base::Collection::HashMapT< int, _BluetoothHealthImpl*> > pChannelHealthMap;
+ unique_ptr<Tizen::Base::Collection::HashMapT< int, Tizen::Base::String> > pChannelAddressMap;
+
+ pAppHealthMap.reset(new (std::nothrow) HashMapT<String, _BluetoothHealthImpl*>);
+ SysTryReturn(NID_NET_BT, pAppHealthMap != null, false, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+
+ //Constructing the hashmap template with the default capacity(16) and loadFactor(0.75f)
+ r = pAppHealthMap->Construct(16, 0.75f, _btAddressHashCodeProvider, _btAddressComparer);
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));
+
+ pChannelHealthMap.reset(new (std::nothrow) HashMapT<int, _BluetoothHealthImpl*>);
+ SysTryReturn(NID_NET_BT, pChannelHealthMap != null, false, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+
+ r = pChannelHealthMap->Construct();
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));
+
+ pChannelAddressMap.reset(new (std::nothrow) HashMapT<int, String>);
+ SysTryReturn(NID_NET_BT, pChannelAddressMap != null, false, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+
+ r = pChannelAddressMap->Construct();
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));
+
+ //register a call back to be invoked when connection state of the Sink device changes
+ err = bt_hdp_set_connection_state_changed_cb(&OnHdpConnected, &OnHdpDisconnected, null);
+ SysTryReturn(NID_NET_BT, err == BT_ERROR_NONE, false, E_SYSTEM, "[E_SYSTEM] Registering the callback method has failed.");
+
+ //register a callback to be invoked when any health data is received by the Sink device
+ err = bt_hdp_set_data_received_cb(&OnHdpDataReceived, null);
+ if (err != BT_ERROR_NONE)
+ {
+ int errUnset = bt_hdp_unset_connection_state_changed_cb();
+ SysLog(NID_NET_BT, "[0x%x] error in unregistering the connection state change callback method", errUnset);
+ }
+ SysTryReturn(NID_NET_BT, err == BT_ERROR_NONE, false, E_SYSTEM, "[E_SYSTEM] Registering the callback method has failed.");
+
+ __pAppHealthMap = move(pAppHealthMap);
+ __pChannelHealthMap = move(pChannelHealthMap);
+ __pChannelAddressMap = move(pChannelAddressMap);
+
+ return true;
+}
+
+result
+_BluetoothHdpSystemAdapter::StartSinkService(int dataType, _BluetoothHealthImpl& implListener, char** pAppId)
+{
+ result r = E_OPERATION_FAILED;
+ int err = BT_ERROR_NONE;
+
+ char* pUuidStr;
+ bool isUsed = false;
+
+ // check HDP service availability
+ pUuidStr = _StringConverter::CopyToCharArrayN(UuId(BT_SVC_UUID_HDP).ToString());
+ err = bt_adapter_is_service_used(pUuidStr, &isUsed);
+ delete[] pUuidStr;
+ SysTryReturnResult(NID_NET_BT, (err == BT_ERROR_NONE) && !isUsed, E_SERVICE_UNAVAILABLE,
+ "[E_SERVICE_UNAVAILABLE] HDP sink service for the specified UUID is not available.");
+
+ err = bt_hdp_register_sink_app(dataType, pAppId);
+ SysTryReturnResult(NID_NET_BT, err == BT_ERROR_NONE, E_OPERATION_FAILED,
+ "[E_OPERATION_FAILED] Registering Sink role application for specified HDP data type is failed");
+ SysLog(NID_NET_BT, "Registering the HDP Sink role is successful [%d].", err);
+
+ String appIdString(*pAppId);
+
+ // Add the _BluetoothHealthImpl pointer to the event map using appIdString as the key.
+ r = __pAppHealthMap->Add(appIdString, &implListener);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_OPERATION_FAILED,
+ "[E_OPERATION_FAILED] Failed to add the _BluetoothHealthImpl instance to the map");
+ return E_SUCCESS;
+}
+
+result
+_BluetoothHdpSystemAdapter::StopService(const char* pAppId)
+{
+ int err = BT_ERROR_NONE;
+ result r = E_OPERATION_FAILED;
+
+ String appIdString(pAppId);
+
+ err = bt_hdp_unregister_sink_app(pAppId);
+ SysTryReturnResult(NID_NET_BT, err == BT_ERROR_NONE, E_OPERATION_FAILED,
+ "[E_OPERATION_FAILED] Failed to unregister the given Sink Role HDP application");
+ SysLog(NID_NET_BT, "The Sink role HDP app is successfully unregistered");
+
+ // remove the specified appIdString from the application event map.
+ r = __pAppHealthMap->Remove(appIdString);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_OPERATION_FAILED,
+ "[E_OPERATION_FAILED] failed to remove the appId from the event map.");
+
+ return E_SUCCESS;
+}
+
+result
+_BluetoothHdpSystemAdapter::ConnectToSource(const Tizen::Base::ByteBuffer& sourceAddress, const char* pAppId)
+{
+ int err = BT_ERROR_NONE;
+ result r = E_OPERATION_FAILED;
+
+ char* pSourceAddress = null;
+
+ SysTryReturnResult(NID_NET_BT, sourceAddress.GetRemaining() == _BT_ADDRESS_LENGTH, E_OPERATION_FAILED,
+ "The address of the remote Source device is incorrect.");
+
+ pSourceAddress = _StringConverter::CopyToCharArrayN(_BluetoothDeviceImpl::GetAddressString(sourceAddress));
+ SysTryReturnResult(NID_NET_BT, pSourceAddress != null, E_OPERATION_FAILED, "Converting address to char* fails.");
+
+ err = bt_hdp_connect_to_source(pSourceAddress, pAppId);
+ SysLog(NID_NET_BT, "Connecting to the remote source device [%s] %s.", pSourceAddress,
+ err == BT_ERROR_NONE ? "is successful" : "fails");
+ if (err == BT_ERROR_NONE)
+ {
+ r = E_SUCCESS;
+ }
+
+ delete[] pSourceAddress;
+ return r;
+}
+
+result
+_BluetoothHdpSystemAdapter::Disconnect(int channelId)
+{
+ int err = BT_ERROR_NONE;
+ result r = E_OPERATION_FAILED;
+
+ String connectedAddress;
+ char* pSourceAddress = null;
+
+ r = __pChannelAddressMap->GetValue(channelId, connectedAddress);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_OPERATION_FAILED, "The channel ID is invalid.");
+
+ pSourceAddress = _StringConverter::CopyToCharArrayN(connectedAddress);
+ SysTryReturnResult(NID_NET_BT, pSourceAddress != null, E_OPERATION_FAILED, "Address converting fails.");
+
+ err = bt_hdp_disconnect(pSourceAddress, channelId);
+ SysLog(NID_NET_BT, "Disconnecting from the remote source device [%s] with channel id [%d] %s.", pSourceAddress, channelId,
+ err == BT_ERROR_NONE ? "is successful" : "fails");
+ if (err == BT_ERROR_NONE)
+ {
+ r = E_SUCCESS;
+ }
+
+ delete[] pSourceAddress;
+ return r;
+}
+
+result
+_BluetoothHdpSystemAdapter::SendData(int channelId, const Tizen::Base::ByteBuffer& data)
+{
+ int err = BT_ERROR_NONE;
+ result r = E_OPERATION_FAILED;
+
+ const byte* pHealthData = null;
+ int healthDataLength = 0;
+
+ pHealthData = data.GetPointer();
+ pHealthData += data.GetPosition();
+ healthDataLength = data.GetRemaining();
+
+ err = bt_hdp_send_data(channelId, (char*)pHealthData, healthDataLength);
+ SysLog(NID_NET_BT, "Sending data to the remote source with channel id [%d] of length [%d] %s.", channelId, healthDataLength,
+ err == BT_ERROR_NONE ? "is successful" : "fails");
+ if (err == BT_ERROR_NONE)
+ {
+ r = E_SUCCESS;
+ }
+
+ return r;
+}
+
+void
+_BluetoothHdpSystemAdapter::OnHdpConnected(int status, const char* pRemoteAddress, const char* pAppId,
+ bt_hdp_channel_type_e channelType, unsigned int channelId, void* pUserData)
+{
+ result r = E_OPERATION_FAILED;
+
+ BluetoothDevice btDevice;
+ ByteBuffer deviceAddress;
+ String remoteDeviceAddrStr(pRemoteAddress);
+ BluetoothHealthDataChannelType hdpchannelType = BT_HEALTH_DATA_CHANNEL_NONE;
+
+ _BluetoothHealthImpl* pHealthImpl = null;
+ String appIdString(pAppId);
+
+ _BluetoothHdpSystemAdapter* pHdpAdapter = _BluetoothHdpSystemAdapter::GetInstance();
+
+ // retrieve the _BluetoothHealthImpl instance from the __pAppHealthMap by using appIdString as key
+ r = pHdpAdapter->__pAppHealthMap->GetValue(appIdString, pHealthImpl);
+ SysTryReturnVoidResult(NID_NET_BT, r == E_SUCCESS, E_OPERATION_FAILED,
+ "[E_OPERATION_FAILED] The application Id is unknown.");
+
+ r = deviceAddress.Construct(_BT_ADDRESS_LENGTH);
+ SysTryReturnVoidResult(NID_NET_BT, r == E_SUCCESS, E_OPERATION_FAILED,
+ "[E_OPERATION_FAILED] Failed to construct the address buffer");
+
+ (void) _BluetoothDeviceImpl::GetAddressByteBuffer(remoteDeviceAddrStr, L":", deviceAddress);
+
+ r = _BluetoothGapSystemAdapter::GetPairedDevice(deviceAddress, btDevice);
+ SysTryReturnVoidResult(NID_NET_BT, r == E_SUCCESS, E_OPERATION_FAILED,
+ "[E_OPERATION_FAILED] Getting information of the source health device has failed.");
+
+ if (status == BT_ERROR_NONE)
+ {
+ // insert the pHealthImpl into __pChannelHealthMap by using the specified channelId as key
+ r = pHdpAdapter->__pChannelHealthMap->Add(channelId, pHealthImpl);
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, E_OPERATION_FAILED, "[%s] Propagating.", GetErrorMessage(r));
+ r = E_OPERATION_FAILED;
+ }
+
+ // insert the pRemoteAddress into __pChannelAddressMap by using the specified channelId as key
+ r = pHdpAdapter->__pChannelAddressMap->Add(channelId, remoteDeviceAddrStr);
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, E_OPERATION_FAILED, "[%s] Propagating.", GetErrorMessage(r));
+ r = E_OPERATION_FAILED;
+ }
+ }
+ else
+ {
+ SysLog(NID_NET_BT, "[E_OPERATION_FAILED] Connection request failure is reported by the underlying system.");
+ r = E_OPERATION_FAILED;
+ }
+
+ hdpchannelType = ((channelType == BT_HDP_CHANNEL_TYPE_RELIABLE)?
+ BT_HEALTH_DATA_CHANNEL_RELIABLE : BT_HEALTH_DATA_CHANNEL_STREAMING);
+
+ // Fire the connect event using the _BluetoothHealthImpl handle
+ pHealthImpl->OnBluetoothHealthConnected(channelId, hdpchannelType, &btDevice, r);
+}
+
+void
+_BluetoothHdpSystemAdapter::OnHdpDisconnected(int status, const char* pRemoteAddress, unsigned int channelId, void* pUserData)
+{
+ result r = E_SYSTEM;
+
+ BluetoothDevice btDevice;
+ ByteBuffer deviceAddress;
+ String remoteDeviceAddrStr(pRemoteAddress);
+
+ _BluetoothHealthImpl* pHealthImpl = null;
+
+ _BluetoothHdpSystemAdapter* pHdpAdapter = _BluetoothHdpSystemAdapter::GetInstance();
+
+ // get the pointer of the _BluetoothHealthImpl from __pChannelHealthMap by using the specified channelId as a key
+ r = pHdpAdapter->__pChannelHealthMap->GetValue(channelId, pHealthImpl);
+ SysTryReturnVoidResult(NID_NET_BT, r == E_SUCCESS, E_OPERATION_FAILED, "[E_OPERATION_FAILED] The channel Id is unknown.");
+
+ if (status == BT_ERROR_NONE)
+ {
+ (void) pHdpAdapter->__pChannelHealthMap->Remove(channelId);
+ pHdpAdapter->__pChannelAddressMap->Remove(channelId);
+ }
+ else
+ {
+ SysLog(NID_NET_BT, "[E_OPERATION_FAILED] Disconnection request failure is reported by the underlying system [%d].", status);
+ r = E_OPERATION_FAILED;
+ }
+
+ // Fire the Disconnect event using the _BluetoothHealthImpl handle
+ pHealthImpl->OnBluetoothHealthDisconnected(channelId, r);
+}
+
+void
+_BluetoothHdpSystemAdapter::OnHdpDataReceived(unsigned int channelId, const char* pData, unsigned int dataSize, void* pUserData)
+{
+ result r = E_SUCCESS;
+ ByteBuffer dataBuffer;
+
+ _BluetoothHealthImpl* pHealthImpl = null;
+
+ _BluetoothHdpSystemAdapter* pHdpAdapter = _BluetoothHdpSystemAdapter::GetInstance();
+
+ // find the appropriate _BluetoothHealthImpl handle with the given channelId
+ r = pHdpAdapter->__pChannelHealthMap->GetValue(channelId, pHealthImpl);
+ SysTryReturnVoidResult(NID_NET_BT, r == E_SUCCESS, E_OPERATION_FAILED, "[E_OPERATION_FAILED] unknown channelId.");
+
+ dataBuffer.Construct(dataSize);
+ dataBuffer.SetArray((byte*) pData, 0, dataSize);
+ dataBuffer.SetPosition(0);
+
+ // Fire the data received event using the _BluetoothHealthImpl handle
+ pHealthImpl->OnBluetoothHealthDataReceived(channelId, dataBuffer);
+ SysLog(NID_NET_BT, " Received Health data of (%d bytes) through the channel (ID: %d) is received.", dataSize, channelId);
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothHdpSystemAdapter.h b/src/FNetBt_BluetoothHdpSystemAdapter.h
new file mode 100644
index 0000000..22a55ad
--- /dev/null
+++ b/src/FNetBt_BluetoothHdpSystemAdapter.h
@@ -0,0 +1,164 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothHdpSystemAdapter.h
+ * @brief This is the header file for the _BluetoothHdpSystemAdapter class.
+ *
+ * This header file contains the declaration of the _BluetoothHdpSystemAdapter class.
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_HDP_SYSTEM_ADAPTER_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_HDP_SYSTEM_ADAPTER_H_
+
+#include <unique_ptr.h>
+#include <bluetooth.h>
+#include <FBaseObject.h>
+#include <FBaseResult.h>
+
+// forward declarations
+namespace Tizen { namespace Base {
+class ByteBuffer;
+
+namespace Collection {
+template<class keyType, class valueType> class HashMapT;
+}
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// Forward declarations
+class BluetoothDevice;
+class _BluetoothHealthImpl;
+
+/**
+ * @class _BluetoothHdpSystemAdapter
+ * @brief This class provides functions related to HDP (Health Device Profile) and have a role of adaptation OSP classes and
+ * the underlying subsystem. This class is a type of singleton, therefore only one instance should be allowed.
+ */
+class _BluetoothHdpSystemAdapter
+ : public Tizen::Base::Object
+{
+public:
+ /**
+ * Creates an instance of this class if there is no instance in this application context.
+ * Gets the exist instance because this class is a singleton, otherwise.
+ *
+ * @return the instance of this class
+ */
+ static _BluetoothHdpSystemAdapter* GetInstance(void);
+
+ /**
+ * Create and initialize a sink service, and start to listen the health events. @n
+ * An instance of _BluetoothHealthImpl class is registered internally.
+ *
+ * @return An error code
+ * @param[in] dataType The type of data used in communication, refer to ISO/IEEE 11073-20601 for data types
+ * @param[in] implListener The instance of _BluetoothHealthImpl to be registered in map
+ * @param[out] pAppId The application ID
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SERVICE_UNAVAILABLE The HDP service with the specified data type is unavailable.
+ * @exception E_OPERATION_FAILED The method has failed.
+ */
+ result StartSinkService(int dataType, _BluetoothHealthImpl& implListener, char** pAppId);
+
+ /**
+ * Close the specified sink service. @n
+ *
+ * @return An error code
+ * @param[in] pAppId The application ID
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OPERATION_FAILED The method has failed.
+ */
+ result StopService(const char* pAppId);
+
+ /**
+ * Sets up a new connection (channel) with a remote health device which has source role. @n
+ *
+ * @return An error code
+ * @param[in] sourceAddress The address of the source device
+ * @param[in] pAppId The application ID
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OPERATION_FAILED The method has failed.
+ */
+ result ConnectToSource(const Tizen::Base::ByteBuffer& sourceAddress, const char* pAppId);
+
+ /**
+ * Close the connection with the remote HDP source device.
+ *
+ * @return An error code
+ * @param[in] channelId The ID of the specified channel to be disconnected
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OPERATION_FAILED The method has failed.
+ */
+ result Disconnect(int channelId);
+
+ /**
+ * Sends the specified data on the specified HDP channel.
+ *
+ * @return An error code
+ * @param[in] channelId The ID of the specified channel to send data on
+ * @param[in] data The health data to be sent over the connected channel
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OPERATION_FAILED The method has failed.
+ */
+ result SendData(int channelId, const Tizen::Base::ByteBuffer& buffer);
+
+
+ //-----------------------------------------------------------------------------------------------------------------
+ // Callback methods for the HDP events
+ //-----------------------------------------------------------------------------------------------------------------
+
+ /**
+ * Callback called by the underlying system to notify that an HDP connection is established.
+ */
+ static void OnHdpConnected(int status, const char* pRemoteAddress, const char* appId, bt_hdp_channel_type_e channelType,
+ unsigned int channelId, void* pUserData);
+
+ /**
+ * Callback called by the underlying system to notify that the specific HDP connection is disconnected.
+ */
+ static void OnHdpDisconnected(int status, const char* pRemoteAddress, unsigned int channelId, void* pUserData);
+
+ /**
+ * Callback used by the underlying system to notify that data is received on the established HDP connection.
+ */
+ static void OnHdpDataReceived(unsigned int channelId, const char* pData, unsigned int dataSize, void* pUserData);
+
+private:
+ _BluetoothHdpSystemAdapter(void);
+ ~_BluetoothHdpSystemAdapter(void);
+
+ _BluetoothHdpSystemAdapter(const _BluetoothHdpSystemAdapter& value);
+ _BluetoothHdpSystemAdapter& operator =(const _BluetoothHdpSystemAdapter& value);
+
+ bool Construct(void);
+
+ static void InitSingleton(void);
+
+private:
+ // hash map of HDP applications and the _BluetoothHealthImpl
+ std::unique_ptr<Tizen::Base::Collection::HashMapT< Tizen::Base::String, _BluetoothHealthImpl*> > __pAppHealthMap;
+ // hash map of HDP channel Ids and the _BluetoothHealthImpl
+ std::unique_ptr<Tizen::Base::Collection::HashMapT< int, _BluetoothHealthImpl*> > __pChannelHealthMap;
+ // hash map of HDP channel Ids and the connected device address
+ std::unique_ptr<Tizen::Base::Collection::HashMapT< int, Tizen::Base::String> > __pChannelAddressMap;
+ static _BluetoothHdpSystemAdapter* __pInstance;
+
+}; // _BluetoothHdpSystemAdapter
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_HDP_SYSTEM_ADAPTER_H_
diff --git a/src/FNetBt_BluetoothHealthEvent.cpp b/src/FNetBt_BluetoothHealthEvent.cpp
new file mode 100644
index 0000000..07f014c
--- /dev/null
+++ b/src/FNetBt_BluetoothHealthEvent.cpp
@@ -0,0 +1,97 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothHealthEvent.cpp
+// @brief This is the implementation file for the _BluetoothHealthEvent class.
+//
+
+#include <FBaseRtIEventListener.h>
+#include <FBaseSysLog.h>
+#include <FBaseRtIEventArg.h>
+#include "FNetBt_BluetoothHealthEvent.h"
+#include "FNetBt_BluetoothHealthEventArg.h"
+#include "FNetBtIBluetoothHealthEventListener.h"
+
+
+using namespace Tizen::Base;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+_BluetoothHealthEvent::_BluetoothHealthEvent(void)
+{
+}
+
+_BluetoothHealthEvent::~_BluetoothHealthEvent(void)
+{
+}
+
+result
+_BluetoothHealthEvent::Construct(void)
+{
+ return _Event::Initialize();
+}
+
+void
+_BluetoothHealthEvent::FireImpl(Tizen::Base::Runtime::IEventListener& listener, const Tizen::Base::Runtime::IEventArg& arg)
+{
+ const BluetoothDevice* pDevice = null;
+ ByteBuffer* pData = null;
+ int channelId = -1;
+ result r = E_SUCCESS;
+
+ IBluetoothHealthEventListener* pListener = dynamic_cast <IBluetoothHealthEventListener*>(&listener);
+ SysTryReturnVoidResult(NID_NET_BT, pListener != null, E_INVALID_ARG,
+ "[E_INVALID_ARG] The listener argument is invalid.");
+
+ const _BluetoothHealthEventArg* pEventArg = dynamic_cast <const _BluetoothHealthEventArg*>(&arg);
+ SysTryReturnVoidResult(NID_NET_BT, pEventArg != null, E_INVALID_ARG, "[E_INVALID_ARG] The event argument is invalid type.");
+
+ _BluetoothHealthEventType eventType = pEventArg->GetEventType();
+ channelId = pEventArg->GetChannelId();
+ r = pEventArg->GetErrorResult();
+
+ switch (eventType)
+ {
+ case _BT_HEALTH_EVENT_CONNECTED:
+ pDevice = pEventArg->GetSourceDevice();
+ if (pDevice)
+ {
+ SysLog(NID_NET_BT, "Firing Bluetooth Health Event (Type: _BT_HEALTH_EVENT_CONNECTED)");
+ pListener->OnHealthConnected(channelId, pEventArg->GetDataType(), pEventArg->GetChannelType(), pDevice, r);
+ }
+ break;
+
+ case _BT_HEALTH_EVENT_DISCONNECTED:
+ SysLog(NID_NET_BT, "Firing Bluetooth Health Event (Type: _BT_HEALTH_EVENT_DISCONNECTED)");
+ pListener->OnHealthDisconnected(channelId, r);
+ break;
+
+ case _BT_HEALTH_EVENT_DATA_RECEIVED:
+ pData = pEventArg->GetReceivedData();
+ if (pData)
+ {
+ SysLog(NID_NET_BT, "Firing Bluetooth socket Event (Type: _BT_HEALTH_EVENT_DATA_RECEIVED)");
+ pListener->OnHealthDataReceived(channelId, *pData);
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothHealthEvent.h b/src/FNetBt_BluetoothHealthEvent.h
new file mode 100644
index 0000000..d2073e5
--- /dev/null
+++ b/src/FNetBt_BluetoothHealthEvent.h
@@ -0,0 +1,85 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothHealthEvent.h
+ * @brief This is the header file for the _BluetoothHealthEvent class.
+ *
+ * This header file contains the declarations of the _BluetoothHealthEvent class.
+ * The _BluetoothHealthEvent class can call a method of a listener (_IBluetoothHealthEventListener object).
+ * So, when a device event is occurred, listener instances can handle it appropriately.
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_HEALTH_EVENT_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_HEALTH_EVENT_H_
+
+#include <FOspConfig.h>
+#include <FBaseResult.h>
+#include <FBaseRt_Event.h>
+
+// Forward declaration
+namespace Tizen { namespace Base { namespace Runtime
+{
+class IEventListener;
+class IEventArg;
+} } }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+//
+// @class _BluetoothHealthEvent
+// @brief This class handles Bluetooth Health events.
+//
+// When a Bluetooth device event occurs, the _BluetoothHealthEvent object finds a _IBluetoothHealthEventListener object
+// and calls an appropriate method of the listener.
+//
+class _BluetoothHealthEvent
+ : public Tizen::Base::Runtime::_Event
+{
+public:
+ /**
+ * This is the default constructor.
+ */
+ _BluetoothHealthEvent(void);
+
+ /**
+ * This is the class destructor.
+ */
+ virtual ~_BluetoothHealthEvent(void);
+
+ result Construct(void);
+
+protected:
+ /**
+ * Checks the argument and finds out the type of event. After that, this method calls appropriate Listener's method.
+ *
+ * @return A result code.
+ * @param[in] pListener An event listener related to this Bluetooth health event.
+ * @param[in] arg An event argument including information to be passed to the event listeners
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_ARG The argument passed to a method contains invalid values.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ virtual void FireImpl(Tizen::Base::Runtime::IEventListener& listener, const Tizen::Base::Runtime::IEventArg& arg);
+
+private:
+ _BluetoothHealthEvent(const _BluetoothHealthEvent& value);
+ _BluetoothHealthEvent& operator =(const _BluetoothHealthEvent& rhs);
+
+}; // _BluetoothHealthEvent
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_HEALTH_EVENT_H_
diff --git a/src/FNetBt_BluetoothHealthEventArg.cpp b/src/FNetBt_BluetoothHealthEventArg.cpp
new file mode 100755
index 0000000..990fcb7
--- /dev/null
+++ b/src/FNetBt_BluetoothHealthEventArg.cpp
@@ -0,0 +1,133 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothHealthEventArg.cpp
+// @brief This is the implementation file for the _BluetoothHealthEventArg class.
+//
+
+#include <FBaseByteBuffer.h>
+#include <FNetBtBluetoothDevice.h>
+#include <FBaseSysLog.h>
+#include "FNetBt_BluetoothHealthEventArg.h"
+
+
+using namespace Tizen::Base;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+//
+// This is a class constructor for _BT_HEALTH_EVENT_CONNECTED event.
+//
+_BluetoothHealthEventArg::_BluetoothHealthEventArg(int channelId, int dataType, BluetoothHealthDataChannelType channelType,
+ const BluetoothDevice* pDevice, result r)
+ : __evtType(_BT_HEALTH_EVENT_CONNECTED)
+ , __pTargetDevice(null)
+ , __channelId(channelId)
+ , __dataType(dataType)
+ , __channelType(channelType)
+ , __result(r)
+ , __pData(null)
+{
+ if (pDevice != null)
+ {
+ __pTargetDevice = new (std::nothrow) BluetoothDevice(*pDevice);
+ SysTryReturnVoidResult(NID_NET_BT, __pTargetDevice != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ }
+}
+
+//
+// This is a class constructor for _BT_HEALTH_EVENT_DISCONNECTED event.
+//
+_BluetoothHealthEventArg::_BluetoothHealthEventArg(int channelId, result r)
+ : __evtType(_BT_HEALTH_EVENT_DISCONNECTED)
+ , __pTargetDevice(null)
+ , __channelId(channelId)
+ , __dataType(0)
+ , __channelType(BT_HEALTH_DATA_CHANNEL_NONE)
+ , __result(r)
+ , __pData(null)
+{
+}
+
+//
+// This is a class constructor for _BT_HEALTH_EVENT_DATA_RECEIVED event.
+//
+_BluetoothHealthEventArg::_BluetoothHealthEventArg(int channelId, const Tizen::Base::ByteBuffer& buffer)
+ : __evtType(_BT_HEALTH_EVENT_DATA_RECEIVED)
+ , __pTargetDevice(null)
+ , __channelId(channelId)
+ , __dataType(0)
+ , __channelType(BT_HEALTH_DATA_CHANNEL_NONE)
+ , __result(E_SUCCESS)
+ , __pData(null)
+{
+ __pData = new (std::nothrow) ByteBuffer();
+ SysTryReturnVoidResult(NID_NET_BT, __pData != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+
+ __pData->Construct(buffer);
+ __pData->SetPosition(0);
+}
+
+_BluetoothHealthEventArg::~_BluetoothHealthEventArg(void)
+{
+ delete __pTargetDevice;
+ delete __pData;
+}
+
+_BluetoothHealthEventType
+_BluetoothHealthEventArg::GetEventType(void) const
+{
+ return __evtType;
+}
+
+const BluetoothDevice*
+_BluetoothHealthEventArg::GetSourceDevice(void) const
+{
+ return __pTargetDevice;
+}
+
+int
+_BluetoothHealthEventArg::GetChannelId(void) const
+{
+ return __channelId;
+}
+
+int
+_BluetoothHealthEventArg::GetDataType(void) const
+{
+ return __dataType;
+}
+
+BluetoothHealthDataChannelType
+_BluetoothHealthEventArg::GetChannelType(void) const
+{
+ return __channelType;
+}
+
+result
+_BluetoothHealthEventArg::GetErrorResult(void) const
+{
+ return __result;
+}
+
+Tizen::Base::ByteBuffer*
+_BluetoothHealthEventArg::GetReceivedData(void) const
+{
+ return __pData;
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothHealthEventArg.h b/src/FNetBt_BluetoothHealthEventArg.h
new file mode 100644
index 0000000..f9621c2
--- /dev/null
+++ b/src/FNetBt_BluetoothHealthEventArg.h
@@ -0,0 +1,175 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothHealthEventArg.h
+ * @brief This is the header file for the _BluetoothHealthEventArg class.
+ *
+ * This header file contains the declarations of the _BluetoothHealthEventArg class which includes information to be
+ * passed to the event listeners
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_HEALTH_EVENT_ARG_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_HEALTH_EVENT_ARG_H_
+
+#include <FBaseObject.h>
+#include <FBaseResult.h>
+#include <FBaseRtIEventArg.h>
+#include <FNetBtBluetoothTypes.h>
+
+// Forward declaration
+namespace Tizen { namespace Base {
+class ByteBuffer;
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// Forward declaration
+class BluetoothDevice;
+
+/**
+ * @enum _BluetoothHealthEventType
+ * Type for specifying the type of _BluetoothHealthEvent
+ */
+enum _BluetoothHealthEventType
+{
+ _BT_HEALTH_EVENT_CONNECTED, /**< For notifying that the connection is established */
+ _BT_HEALTH_EVENT_DISCONNECTED, /**< For notifying that the connection is disconnected */
+ _BT_HEALTH_EVENT_DATA_RECEIVED, /**< For notifying that the data has been received */
+};
+
+/**
+ * @class _BluetoothHealthEventArg
+ * @brief This class is used as an argument for callback methods of the IBluetoothHealthEventListener class.
+ *
+ * When a _BluetoothHealthEvent occurs, the _BluetoothHealthEvent finds a IBluetoothHealthEventListener instance
+ * which is registered for the _BluetoothHealthEvent and calls an appropriate method of the listener.
+ * @see IBluetoothHealthEventListener
+ */
+class _BluetoothHealthEventArg
+ : public Tizen::Base::Object
+ , public Tizen::Base::Runtime::IEventArg
+{
+public:
+ /**
+ * This is a class constructor for _BT_HEALTH_EVENT_CONNECTED event.
+ *
+ * @param[in] channelId The channel ID of the established connection, @n
+ * else an invalid ID (-1) if the method is not successful
+ * @param[in] dataType dataType represents the type of health device (eg thermometer, BP device)
+ * and is defined in ISO/IEEE 11073-20601 standard
+ * @param[in] channelType The data channel type of the established connection
+ * @param[in] pRemoteDevice The remote health device which the local device connects with, @n
+ * else @c null if the method is not successful
+ * @param[in] r The result of the connection request
+ * @exception E_SUCCESS The connection request is accepted by the target health device.
+ * @exception E_REJECTED The connection request is rejected by the target health device.
+ * @exception E_TIMEOUT The connection request has timed out.
+ * @exception E_OPERATION_FAILED The connection request has failed.
+ */
+ _BluetoothHealthEventArg(int channelId, int dataType, BluetoothHealthDataChannelType channelType,
+ const BluetoothDevice* pDevice, result r);
+
+ /**
+ * This is a class constructor for _BT_HEALTH_EVENT_DISCONNECTED event.
+ *
+ * @param[in] channelId The channel ID of the terminated connection
+ * @param[in] r The disconnection status
+ * @exception E_SUCCESS The specified connection (channel) is terminated successfully.
+ * @exception E_OPERATION_FAILED The method has failed to disconnect.
+ */
+ _BluetoothHealthEventArg(int channelId, result r);
+
+ /**
+ * This is a class constructor for _BT_HEALTH_EVENT_DATA_RECEIVED event.
+ *
+ * @param[in] channelId The channel ID of the conneciton which data is received on
+ * @param[in] buffer The received data
+ */
+ _BluetoothHealthEventArg(int channelId, const Tizen::Base::ByteBuffer& buffer);
+
+ /**
+ * This is the class destructor.
+ */
+ ~_BluetoothHealthEventArg(void);
+
+ /**
+ * Gets the type of this event.
+ *
+ * @return The type of the event
+ */
+ _BluetoothHealthEventType GetEventType(void) const;
+
+ /**
+ * Gets the socket client device.
+ *
+ * @return The pointer of the source device which is connect with
+ */
+ const BluetoothDevice* GetSourceDevice(void) const;
+
+ /**
+ * Gets the channel ID.
+ *
+ * @return The channel ID
+ */
+ int GetChannelId(void) const;
+
+ /**
+ * Gets the Data Type.
+ *
+ * @return The Data Type
+ */
+ int GetDataType(void) const;
+
+ /**
+ * Gets the data channel type.
+ *
+ * @return The data channel type
+ */
+ BluetoothHealthDataChannelType GetChannelType(void) const;
+
+ /**
+ * Gets the error result of this event.
+ *
+ * @return The result of the event
+ */
+ result GetErrorResult(void) const;
+
+ /**
+ * Gets The received data.
+ *
+ * @return The received data
+ */
+ Tizen::Base::ByteBuffer* GetReceivedData(void) const;
+
+private:
+ _BluetoothHealthEventArg(void);
+ _BluetoothHealthEventArg(const _BluetoothHealthEventArg& eventArg);
+ _BluetoothHealthEventArg& operator =(const _BluetoothHealthEventArg& rValue);
+
+private:
+ _BluetoothHealthEventType __evtType;
+ BluetoothDevice* __pTargetDevice;
+ int __channelId;
+ int __dataType;
+ BluetoothHealthDataChannelType __channelType;
+ result __result;
+ Tizen::Base::ByteBuffer* __pData;
+
+}; // _BluetoothHealthEventArg
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_HEALTH_EVENT_ARG_H_
diff --git a/src/FNetBt_BluetoothHealthImpl.cpp b/src/FNetBt_BluetoothHealthImpl.cpp
new file mode 100755
index 0000000..b6a17a6
--- /dev/null
+++ b/src/FNetBt_BluetoothHealthImpl.cpp
@@ -0,0 +1,697 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothHealthImpl.cpp
+// @brief This is the implementation file for the _BluetoothHealthImpl class.
+//
+
+#include <FNetBtBluetoothTypes.h>
+#include <FNetBtBluetoothDevice.h>
+#include <FNetBtIBluetoothHealthEventListener.h>
+#include <FBaseSysLog.h>
+#include "FNetBt_BluetoothHealthEvent.h"
+#include "FNetBt_BluetoothHealthEventArg.h"
+#include "FNetBt_BluetoothGapSystemAdapter.h"
+#include "FNetBt_BluetoothHdpSystemAdapter.h"
+#include "FNetBt_BluetoothHealthImpl.h"
+
+using namespace std;
+using namespace Tizen::Base;
+using namespace Tizen::Base::Runtime;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+_BluetoothHealthImpl::_BluetoothHealthImpl(void)
+ : __pGapAdapter(null)
+ , __pHdpAdapter(null)
+ , __pEvent(null)
+ , __stateMutex()
+ , __currentState(_BT_HEALTH_STATE_DISABLED)
+ , __channelIdList()
+ , __pairingTargetAddress()
+ , __pAppId(null)
+ , __dataType(_BT_INVALID_DATA_TYPE)
+{
+}
+
+_BluetoothHealthImpl::~_BluetoothHealthImpl(void)
+{
+ int count = 0;
+ int channelId = 0;
+
+ if (__pHdpAdapter != null)
+ {
+ count = __channelIdList.GetCount();
+ for (int i=0; i<count; i++)
+ {
+ __channelIdList.GetAt(i, channelId);
+ __pHdpAdapter->Disconnect(channelId);
+ }
+ }
+
+ if (__pGapAdapter != null)
+ {
+ __pGapAdapter->UnregisterManagerEventListener(*this);
+ __pGapAdapter->UnregisterDeviceEventListener(*this);
+ }
+}
+
+result
+_BluetoothHealthImpl::Construct(IBluetoothHealthEventListener& listener)
+{
+ result r = E_SUCCESS;
+ unique_ptr<_BluetoothHealthEvent> pEvent;
+
+ r = __stateMutex.Create();
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_OPERATION_FAILED, "Failed to create the state mutex.");
+
+ r = __pairingTargetAddress.Construct(_BT_ADDRESS_LENGTH);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_OPERATION_FAILED, "Failed to construct the address for pairing.");
+
+ __pGapAdapter = _BluetoothGapSystemAdapter::GetInstance();
+ SysTryReturnResult(NID_NET_BT, __pGapAdapter != null, E_OPERATION_FAILED,
+ "Failed to invoke _BluetoothGapSystemAdapter::GetInstance().");
+
+ __pHdpAdapter = _BluetoothHdpSystemAdapter::GetInstance();
+ SysTryReturnResult(NID_NET_BT, __pHdpAdapter != null, E_OPERATION_FAILED,
+ "Failed to invoke _BluetoothHdpSystemAdapter::GetInstance().");
+
+ pEvent.reset(new (std::nothrow) _BluetoothHealthEvent());
+ SysTryReturnResult(NID_NET_BT, pEvent != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
+ r = pEvent->Construct();
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_OPERATION_FAILED, "Failed to construct the event.");
+ // add IBluetoothHealthEventListener instance to the newly created _BluetoothHealthEvent.
+ r = pEvent->AddListener(listener, true);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_OPERATION_FAILED, "Propagating. Failed to add the application listener for health device");
+
+ // registers this callback listener to the system adapter for activation/deactivation event
+ r = __pGapAdapter->RegisterManagerEventListener(*this, true);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_OPERATION_FAILED, "Failed to register the callback listener to _BluetoothGapSystemAdapter.");
+
+ // registers this callback listener to the system adapter for paired event
+ r = __pGapAdapter->RegisterDeviceEventListener(*this);
+ if (r != E_SUCCESS)
+ {
+ __pGapAdapter->UnregisterManagerEventListener(*this);
+ }
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_OPERATION_FAILED, "Failed to register the callback listener to _BluetoothGapSystemAdapter.");
+
+ // checks whether the Bluetooth is available
+ __stateMutex.Acquire();
+
+ if (__pGapAdapter->IsActivated() == true)
+ {
+ __currentState = _BT_HEALTH_STATE_IDLE;
+ }
+
+ __stateMutex.Release();
+
+ __pEvent = move(pEvent);
+
+ return E_SUCCESS;
+}
+
+result
+_BluetoothHealthImpl::StartAsSink(int dataType)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_SUCCESS;
+ char* pAppId = null;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_HEALTH_STATE_DISABLED:
+ r = E_INVALID_STATE;
+ break;
+
+ case _BT_HEALTH_STATE_IDLE:
+ r = __pHdpAdapter->StartSinkService(dataType, *this, &pAppId);
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_HEALTH_STATE_ON_SERVICE;
+ __dataType = dataType;
+ __pAppId.reset(pAppId);
+ }
+ break;
+
+ case _BT_HEALTH_STATE_ON_SERVICE:
+ case _BT_HEALTH_STATE_BONDING:
+ case _BT_HEALTH_STATE_BOND_CANCELING:
+ if (__dataType == dataType)
+ {
+ r = E_IN_PROGRESS;
+ }
+ else
+ {
+ r = E_INVALID_OPERATION;
+ }
+ break;
+
+ default:
+ r = E_OPERATION_FAILED;
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on starting Health sink role.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothHealthImpl::Stop(void)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_SUCCESS;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_HEALTH_STATE_DISABLED:
+ r = E_INVALID_STATE;
+ break;
+
+ case _BT_HEALTH_STATE_IDLE:
+ case _BT_HEALTH_STATE_BOND_CANCELING:
+ r = E_INVALID_OPERATION;
+ break;
+
+ case _BT_HEALTH_STATE_ON_SERVICE:
+ r = __pHdpAdapter->StopService(__pAppId.get());
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_HEALTH_STATE_IDLE;
+ __pAppId.reset(null);
+ __dataType = _BT_INVALID_DATA_TYPE;
+ }
+ break;
+
+ case _BT_HEALTH_STATE_BONDING:
+ if (__pGapAdapter->CancelPair() == E_SUCCESS)
+ {
+ r = E_SUCCESS;
+ __currentState = _BT_HEALTH_STATE_BOND_CANCELING;
+ }
+ // It will be changed to IDLE after receiving the OnBluetoothPaired event.
+ break;
+
+ default:
+ r = E_OPERATION_FAILED;
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on stopping Health sink role.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothHealthImpl::ConnectToSource(const BluetoothDevice& remoteDevice)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_OPERATION_FAILED;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_HEALTH_STATE_DISABLED:
+ r = E_INVALID_STATE;
+ break;
+
+ case _BT_HEALTH_STATE_IDLE:
+ r = E_INVALID_OPERATION;
+ break;
+
+ case _BT_HEALTH_STATE_ON_SERVICE:
+ if (__pGapAdapter->IsPaired(*(remoteDevice.GetAddress())) == true)
+ {
+ r = __pHdpAdapter->ConnectToSource(*(remoteDevice.GetAddress()), __pAppId.get());
+ }
+ else
+ {
+ // start the pairing process
+ if (__pGapAdapter->Pair(*(remoteDevice.GetAddress())) == E_SUCCESS)
+ {
+ // copy the address of the pairing device to the local variable
+ __pairingTargetAddress.SetArray(remoteDevice.GetAddress()->GetPointer(), 0, _BT_ADDRESS_LENGTH);
+ __pairingTargetAddress.SetPosition(0);
+
+ r = E_SUCCESS;
+ __currentState = _BT_HEALTH_STATE_BONDING;
+ }
+ else
+ {
+ r = E_OPERATION_FAILED;
+ }
+ }
+ break;
+
+ case _BT_HEALTH_STATE_BONDING:
+ case _BT_HEALTH_STATE_BOND_CANCELING:
+ r = E_DEVICE_BUSY;
+ break;
+
+ default:
+ r = E_OPERATION_FAILED;
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on requesting a connection to the source device.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothHealthImpl::Disconnect(int channelId)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_OPERATION_FAILED;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_HEALTH_STATE_DISABLED:
+ r = E_INVALID_STATE;
+ break;
+
+ case _BT_HEALTH_STATE_IDLE:
+ r = E_INVALID_OPERATION;
+ break;
+
+ case _BT_HEALTH_STATE_ON_SERVICE:
+ case _BT_HEALTH_STATE_BONDING:
+ case _BT_HEALTH_STATE_BOND_CANCELING:
+ if (__channelIdList.Contains(channelId) == true)
+ {
+ if (__pHdpAdapter->Disconnect(channelId) == E_SUCCESS)
+ {
+ r = E_SUCCESS;
+ }
+ else
+ {
+ r = E_OPERATION_FAILED;
+ }
+ }
+ else
+ {
+ r = E_INVALID_OPERATION;
+ }
+ break;
+
+ default:
+ r = E_OPERATION_FAILED;
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on disconnecting the connection.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothHealthImpl::SendData(int channelId, const Tizen::Base::ByteBuffer& buffer)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_OPERATION_FAILED;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_HEALTH_STATE_DISABLED:
+ r = E_INVALID_STATE;
+ break;
+
+ case _BT_HEALTH_STATE_IDLE:
+ r = E_INVALID_OPERATION;
+ break;
+
+ case _BT_HEALTH_STATE_ON_SERVICE:
+ case _BT_HEALTH_STATE_BONDING:
+ case _BT_HEALTH_STATE_BOND_CANCELING:
+ if (__channelIdList.Contains(channelId) == true)
+ {
+ if (buffer.GetRemaining() > 0)
+ {
+ r = __pHdpAdapter->SendData(channelId, buffer);
+ }
+ else
+ {
+ r = E_INVALID_ARG;
+ }
+ }
+ else
+ {
+ r = E_INVALID_OPERATION;
+ }
+ break;
+
+ default:
+ r = E_OPERATION_FAILED;
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on sending data.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+void
+_BluetoothHealthImpl::OnBluetoothActivated(result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ __stateMutex.Acquire();
+
+ if ((__currentState == _BT_HEALTH_STATE_DISABLED) && (r == E_SUCCESS))
+ {
+ __currentState = _BT_HEALTH_STATE_IDLE;
+ }
+
+ __stateMutex.Release();
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+}
+
+void
+_BluetoothHealthImpl::OnBluetoothDeactivated(result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ __stateMutex.Acquire();
+
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_HEALTH_STATE_DISABLED;
+ }
+
+ __stateMutex.Release();
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s]", GetStringOfCurrentState());
+}
+
+void
+_BluetoothHealthImpl::OnBluetoothPaired(const BluetoothDevice* pPairedDevice, result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ bool isFired = false;
+ result responseResult = E_SYSTEM;
+
+ __stateMutex.Acquire();
+
+ if (pPairedDevice->GetAddress()->Equals(__pairingTargetAddress))
+ {
+ if (__currentState == _BT_HEALTH_STATE_BONDING)
+ {
+ if (r == E_SUCCESS)
+ {
+ if (__pHdpAdapter->ConnectToSource(__pairingTargetAddress, __pAppId.get()) != E_SUCCESS)
+ {
+ // callback responded with E_SYSTEM
+ isFired = true;
+ responseResult = E_SYSTEM;
+ }
+ }
+ else
+ {
+ // callback responded with r
+ isFired = true;
+ responseResult = r;
+ }
+
+ __currentState = _BT_HEALTH_STATE_ON_SERVICE;
+ __pairingTargetAddress.Clear();
+ }
+ else if (__currentState == _BT_HEALTH_STATE_BOND_CANCELING)
+ {
+ // callback responded with E_SYSTEM or E_OPERATION_CANCELED
+ isFired = true;
+ __currentState = _BT_HEALTH_STATE_IDLE;
+ responseResult = E_SYSTEM;
+ }
+ // ignore other cases
+ }
+ // ignored otherwise
+
+ __stateMutex.Release();
+
+ if (isFired)
+ {
+ _BluetoothHealthEventArg* pArg = new (std::nothrow) _BluetoothHealthEventArg(-1,
+ _BT_INVALID_DATA_TYPE, BT_HEALTH_DATA_CHANNEL_NONE, pPairedDevice, E_OPERATION_FAILED);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else // send the connected event in case of failure of pairing
+ {
+ __pEvent->FireAsync(*pArg);
+ }
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [CONNECTED_Event:%s]", GetStringOfCurrentState(),
+ isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothHealthImpl::OnBluetoothHealthConnected(int channelId, BluetoothHealthDataChannelType channelType,
+ const BluetoothDevice* pRemoteDevice, result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [channelId:%d], [ActionResult:%s]", GetStringOfCurrentState(),
+ channelId, GetErrorMessage(r));
+
+ bool isFired = false;
+
+ __stateMutex.Acquire();
+
+ if ((__currentState == _BT_HEALTH_STATE_ON_SERVICE)
+ || (__currentState == _BT_HEALTH_STATE_BONDING)
+ || (__currentState == _BT_HEALTH_STATE_BOND_CANCELING))
+ {
+ if (r == E_SUCCESS)
+ {
+ __channelIdList.Add(channelId);
+ }
+ else
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on the response of the Health connect request.", GetErrorMessage(r));
+ }
+
+ isFired = true;
+ }
+ // ignore other cases
+
+ __stateMutex.Release();
+
+ if (isFired)
+ {
+ _BluetoothHealthEventArg* pArg = new (std::nothrow) _BluetoothHealthEventArg(channelId, __dataType, channelType,
+ pRemoteDevice, r);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ __pEvent->FireAsync(*pArg);
+ }
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [CONNECTED_Event:%s]", GetStringOfCurrentState(),
+ isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothHealthImpl::OnBluetoothHealthDisconnected(int channelId, result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [channelId:%d], [ActionResult:%s]", GetStringOfCurrentState(),
+ channelId, GetErrorMessage(r));
+
+ bool isFired = false;
+
+ __stateMutex.Acquire();
+
+ if ((__currentState == _BT_HEALTH_STATE_ON_SERVICE)
+ || (__currentState == _BT_HEALTH_STATE_BONDING)
+ || (__currentState == _BT_HEALTH_STATE_BOND_CANCELING))
+ {
+ if (r == E_SUCCESS)
+ {
+ if (__channelIdList.Contains(channelId) == true)
+ {
+ __channelIdList.Remove(channelId);
+ isFired = true;
+ }
+ else
+ {
+ SysLog(NID_NET_BT, "channelId(%d) is NOT exist.", channelId);
+ }
+ }
+ else
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on the response of the Health disconnect request.", GetErrorMessage(r));
+ }
+ }
+ // ignore other cases
+
+ __stateMutex.Release();
+
+ if (isFired)
+ {
+ _BluetoothHealthEventArg* pArg = new (std::nothrow) _BluetoothHealthEventArg(channelId, r);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ __pEvent->FireAsync(*pArg);
+ }
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [DISCONNECTED_Event:%s]", GetStringOfCurrentState(),
+ isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothHealthImpl::OnBluetoothHealthDataReceived(int channelId, Tizen::Base::ByteBuffer& buffer)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ bool isFired = false;
+
+ __stateMutex.Acquire();
+
+ if ((__currentState == _BT_HEALTH_STATE_ON_SERVICE)
+ || (__currentState == _BT_HEALTH_STATE_BONDING)
+ || (__currentState == _BT_HEALTH_STATE_BOND_CANCELING))
+ {
+ if (__channelIdList.Contains(channelId) == true)
+ {
+ isFired = true;
+ }
+ else
+ {
+ SysLog(NID_NET_BT, "channelId(%d) is NOT exist.", channelId);
+ }
+ }
+ // ignore other cases
+
+ __stateMutex.Release();
+
+ if (isFired)
+ {
+ _BluetoothHealthEventArg* pArg = new (std::nothrow) _BluetoothHealthEventArg(channelId, buffer);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ // use Fire() instead of FireAsync() to improve the transfer rate.
+ __pEvent->Fire(*pArg);
+ }
+ }
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [DATA_RECIEVED_Event:%s]", GetStringOfCurrentState(),
+ isFired ? "Fired" : "NotFired");
+}
+
+const char*
+_BluetoothHealthImpl::GetStringOfCurrentState(void) const
+{
+ const char* pStateString = null;
+
+ switch (__currentState)
+ {
+ case _BT_HEALTH_STATE_DISABLED:
+ pStateString = "DISABLED";
+ break;
+
+ case _BT_HEALTH_STATE_IDLE:
+ pStateString = "IDLE";
+ break;
+
+ case _BT_HEALTH_STATE_ON_SERVICE:
+ pStateString = "ON_SERVICE";
+ break;
+
+ case _BT_HEALTH_STATE_BONDING:
+ pStateString = "BONDING";
+ break;
+
+ case _BT_HEALTH_STATE_BOND_CANCELING:
+ pStateString = "BOND_CANCELING";
+ break;
+
+ default:
+ pStateString = "Unknown";
+ break;
+ }
+
+ return pStateString;
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothIpcMessages.cpp b/src/FNetBt_BluetoothIpcMessages.cpp
new file mode 100644
index 0000000..5f364d2
--- /dev/null
+++ b/src/FNetBt_BluetoothIpcMessages.cpp
@@ -0,0 +1,44 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothIpcMessages.cpp
+ * @brief This is the generator of IPC messages for the Connectivity daemon service.
+ */
+
+#define IPC_MESSAGE_IMPL
+#include "FNetBt_ConnectivityIpcMessages.h"
+
+// Generate constructors.
+#include <ipc/struct_constructor_macros.h>
+#include "FNetBt_ConnectivityIpcMessages.h"
+
+// Generate destructors.
+#include <ipc/struct_destructor_macros.h>
+#include "FNetBt_ConnectivityIpcMessages.h"
+
+// Generate param traits write methods.
+#include <ipc/param_traits_write_macros.h>
+namespace IPC {
+#include "FNetBt_ConnectivityIpcMessages.h"
+} // namespace IPC
+
+// Generate param traits read methods.
+#include <ipc/param_traits_read_macros.h>
+namespace IPC {
+#include "FNetBt_ConnectivityIpcMessages.h"
+} // namespace IPC
diff --git a/src/FNetBt_BluetoothIpcProxy.cpp b/src/FNetBt_BluetoothIpcProxy.cpp
new file mode 100755
index 0000000..5fa6056
--- /dev/null
+++ b/src/FNetBt_BluetoothIpcProxy.cpp
@@ -0,0 +1,158 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothIpcProxy.cpp
+// @brief This is the implementation file for the %_BluetoothIpcProxy class.
+//
+// This file contains the implementation of the %_BluetoothIpcProxy class.
+//
+
+#include <pthread.h>
+#include <FBaseSysLog.h>
+#include <FIo_IpcClient.h>
+#include "FNetBt_BluetoothIpcProxy.h"
+#include "FNetBt_ConnectivityIpcMessages.h"
+
+using namespace Tizen::Base;
+using namespace Tizen::Io;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+_BluetoothIpcProxy* _BluetoothIpcProxy::__pInstance = null;
+
+_BluetoothIpcProxy::_BluetoothIpcProxy(void) :
+ __pIpcClient(null)
+{
+}
+
+_BluetoothIpcProxy::~_BluetoothIpcProxy(void)
+{
+ delete __pIpcClient;
+}
+
+result
+_BluetoothIpcProxy::Construct(void)
+{
+ result r = E_SUCCESS;
+
+ __pIpcClient = new (std::nothrow) _IpcClient;
+ SysTryReturnResult(NID_NET_BT, __pIpcClient != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
+
+ r = __pIpcClient->Construct(BLUETOOTH_CONNECTIVITY_IPC_SERVER_NAME, null);
+ if (IsFailed(r))
+ {
+ delete __pIpcClient;
+ __pIpcClient = null;
+
+ SysLog(NID_NET_BT, "[%s] Construction of the IPC client for the Bluetooth proxy has failed.", GetErrorMessage(r));
+ }
+
+ return r;
+}
+
+void
+_BluetoothIpcProxy::InitSingleton(void)
+{
+ result r = E_SUCCESS;
+ static _BluetoothIpcProxy inst;
+
+ r = inst.Construct();
+ SysTryReturnVoidResult(NID_NET_BT, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
+
+ __pInstance = &inst;
+}
+
+_BluetoothIpcProxy*
+_BluetoothIpcProxy::GetInstance(void)
+{
+ static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
+
+ if (__pInstance == null)
+ {
+ ClearLastResult();
+ pthread_once(&onceBlock, InitSingleton);
+ result r = GetLastResult();
+ if (IsFailed(r))
+ {
+ onceBlock = PTHREAD_ONCE_INIT;
+ }
+ }
+
+ return __pInstance;
+}
+
+result
+_BluetoothIpcProxy::GetLocalDeviceName(Tizen::Base::String& deviceName) const
+{
+ result r = E_SUCCESS;
+ IPC::Message* pMessage = null;
+ unsigned long ret = 0;
+
+ pMessage = new (std::nothrow) ConnectivityBluetoothServiceMsg_getLocalDeviceName(&deviceName, &ret);
+ SysTryReturnResult(NID_NET_BT, pMessage != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
+
+ r = __pIpcClient->SendRequest(*pMessage);
+ delete pMessage;
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "A system error occurred.");
+ SysTryReturnResult(NID_NET_BT, ret == E_SUCCESS, ret, "Propagating.");
+
+ SysLog(NID_NET_BT, "The Bluetooth name obtained through IPC is [%ls].", deviceName.GetPointer());
+
+ return E_SUCCESS;
+}
+
+result
+_BluetoothIpcProxy::SetLocalDeviceName(const Tizen::Base::String& deviceName) const
+{
+ result r = E_SUCCESS;
+ IPC::Message* pMessage = null;
+ unsigned long ret = 0;
+
+ pMessage = new (std::nothrow) ConnectivityBluetoothServiceMsg_setLocalDeviceName(deviceName, &ret);
+ SysTryReturnResult(NID_NET_BT, pMessage != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
+
+ r = __pIpcClient->SendRequest(*pMessage);
+ delete pMessage;
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "A system error occurred.");
+ SysTryReturnResult(NID_NET_BT, ret == E_SUCCESS, ret, "Propagating.");
+
+ SysLog(NID_NET_BT, "Setting the Bluetooth name through IPC is successful.");
+
+ return E_SUCCESS;
+}
+
+result
+_BluetoothIpcProxy::SetDiscoverableMode(int mode, int seconds) const
+{
+ result r = E_SUCCESS;
+ IPC::Message* pMessage = null;
+ unsigned long ret = 0;
+
+ pMessage = new (std::nothrow) ConnectivityBluetoothServiceMsg_setDiscoverableMode(mode, seconds, &ret);
+ SysTryReturnResult(NID_NET_BT, pMessage != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
+
+ r = __pIpcClient->SendRequest(*pMessage);
+ delete pMessage;
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "A system error occurred.");
+ SysTryReturnResult(NID_NET_BT, ret == E_SUCCESS, ret, "Propagating.");
+
+ SysLog(NID_NET_BT, "Setting the Bluetooth discoverable mode through IPC is successful.");
+
+ return E_SUCCESS;
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothIpcProxy.h b/src/FNetBt_BluetoothIpcProxy.h
new file mode 100644
index 0000000..567399e
--- /dev/null
+++ b/src/FNetBt_BluetoothIpcProxy.h
@@ -0,0 +1,77 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothIpcProxy.h
+ * @brief This is the header file for the %_BluetoothIpcProxy class.
+ *
+ * This header file contains the declarations of the %_BluetoothIpcProxy class.
+ */
+
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_IPC_PROXY_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_IPC_PROXY_H_
+
+#include <FBaseObject.h>
+
+// Forward declaration
+namespace Tizen { namespace Base
+{
+class String;
+} }
+
+namespace Tizen { namespace Io
+{
+class _IpcClient;
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+/**
+ * @class _BluetoothIpcProxy
+ * @brief This class represents an IPC proxy for %Bluetooth service.
+ *
+ * This class represents an IPC proxy for %Bluetooth service to communicate with Connectivity service daemon.
+ */
+class _BluetoothIpcProxy
+ : public Tizen::Base::Object
+{
+public:
+ static _BluetoothIpcProxy* GetInstance(void);
+
+ result GetLocalDeviceName(Tizen::Base::String& deviceName) const;
+ result SetLocalDeviceName(const Tizen::Base::String& deviceName) const;
+ result SetDiscoverableMode(int mode, int seconds) const;
+
+private:
+ _BluetoothIpcProxy(void);
+ virtual ~_BluetoothIpcProxy(void);
+ result Construct(void);
+
+
+ _BluetoothIpcProxy(const _BluetoothIpcProxy& value);
+ _BluetoothIpcProxy& operator =(const _BluetoothIpcProxy& rhs);
+
+ static void InitSingleton(void);
+
+private:
+ Tizen::Io::_IpcClient* __pIpcClient;
+ static _BluetoothIpcProxy* __pInstance;
+
+}; // _BluetoothIpcProxy
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_IPC_PROXY_H_
diff --git a/src/FNetBt_BluetoothManagerEvent.cpp b/src/FNetBt_BluetoothManagerEvent.cpp
new file mode 100644
index 0000000..a5fa2c5
--- /dev/null
+++ b/src/FNetBt_BluetoothManagerEvent.cpp
@@ -0,0 +1,78 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothManagerEvent.cpp
+// @brief This is the implementation file for the _BluetoothManagerEvent class.
+//
+
+#include <FBaseRtIEventListener.h>
+#include <FBaseSysLog.h>
+#include <FBaseRtIEventArg.h>
+#include "FNetBt_BluetoothManagerEvent.h"
+#include "FNetBt_BluetoothManagerEventArg.h"
+#include "FNetBtIBluetoothManagerEventListener.h"
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+_BluetoothManagerEvent::_BluetoothManagerEvent(void)
+{
+}
+
+_BluetoothManagerEvent::~_BluetoothManagerEvent(void)
+{
+}
+
+result
+_BluetoothManagerEvent::Construct(void)
+{
+ return _Event::Initialize();
+}
+
+void
+_BluetoothManagerEvent::FireImpl(Tizen::Base::Runtime::IEventListener& listener, const Tizen::Base::Runtime::IEventArg& arg)
+{
+ IBluetoothManagerEventListener* pEventListener = dynamic_cast <IBluetoothManagerEventListener*>(&listener);
+ SysTryReturnVoidResult(NID_NET_BT, pEventListener != null, E_INVALID_ARG, "[E_INVALID_ARG] The listener argument is invalid.");
+
+ const _BluetoothManagerEventArg* pEventArg = dynamic_cast <const _BluetoothManagerEventArg*>(&arg);
+ SysTryReturnVoidResult(NID_NET_BT, pEventArg != null, E_INVALID_ARG, "[E_INVALID_ARG] The event argument is invalid type.");
+
+ _BluetoothMangerEventType eventType = pEventArg->GetEventType();
+
+ switch (eventType)
+ {
+ case _BT_MANAGER_EVENT_ACTIVATED:
+ SysLog(NID_NET_BT, "Firing Bluetooth Manager Event (Type: _BT_MANAGER_EVENT_ACTIVATED)");
+ pEventListener->OnBluetoothActivated(pEventArg->GetErrorResult());
+ break;
+
+ case _BT_MANAGER_EVENT_DEACTIVATED:
+ SysLog(NID_NET_BT, "Firing Bluetooth Manager Event (Type: _BT_MANAGER_EVENT_DEACTIVATED)");
+ pEventListener->OnBluetoothDeactivated(pEventArg->GetErrorResult());
+ break;
+
+ case _BT_MANAGER_EVENT_DISCOVERABLE:
+ SysLog(NID_NET_BT, "Firing Bluetooth Manager Event (Type: _BT_MANAGER_EVENT_DISCOVERABLE)");
+ pEventListener->OnBluetoothDiscoverableModeChanged(pEventArg->GetDiscoverableMode());
+ break;
+
+ default:
+ break;
+ }
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothManagerEvent.h b/src/FNetBt_BluetoothManagerEvent.h
new file mode 100644
index 0000000..6f54926
--- /dev/null
+++ b/src/FNetBt_BluetoothManagerEvent.h
@@ -0,0 +1,83 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothManagerEvent.h
+ * @brief This is the header file for the _BluetoothManagerEvent class.
+ *
+ * This header file contains the declarations of the _BluetoothManagerEvent class.
+ * The _BluetoothManagerEvent class can call a method of a listener (IBluetoothManagerEventListener object).
+ * So, when a device event is occurred, listener instances can handle it appropriately.
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_MANAGER_EVENT_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_MANAGER_EVENT_H_
+
+#include <FOspConfig.h>
+#include <FBaseResult.h>
+#include <FBaseRt_Event.h>
+
+namespace Tizen { namespace Base { namespace Runtime
+{
+class IEventListener;
+class IEventArg;
+} } }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+/**
+ * @class _BluetoothManagerEvent
+ * @brief This class handles Bluetooth manager events.
+ *
+ * When a Bluetooth manager event occurs, the _BluetoothManagerEvent object finds a IBluetoothManagerEventListener object
+ * and calls an appropriate method of the listener.
+ */
+class _BluetoothManagerEvent
+ : public Base::Runtime::_Event
+{
+public:
+ /**
+ * This is the default constructor.
+ */
+ _BluetoothManagerEvent(void);
+
+ /**
+ * This is the class destructor.
+ */
+ virtual ~_BluetoothManagerEvent(void);
+ result Construct(void);
+
+protected:
+ /**
+ * Checks the argument and finds out the type of event. After that, this method calls appropriate pListener's method.
+ *
+ * @return A result code.
+ * @param[in] pListener An event listener related to this Bluetooth manger event.
+ * @param[in] arg An event argument including information to be passed to the event listeners
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_ARG The argument passed to a method contains invalid values.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ virtual void FireImpl(Tizen::Base::Runtime::IEventListener& listener, const Tizen::Base::Runtime::IEventArg& arg);
+
+private:
+ _BluetoothManagerEvent(const _BluetoothManagerEvent& value);
+ _BluetoothManagerEvent& operator =(const _BluetoothManagerEvent& rhs);
+
+}; // _BluetoothManagerEvent
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_MANAGER_EVENT_H_
diff --git a/src/FNetBt_BluetoothManagerEventArg.cpp b/src/FNetBt_BluetoothManagerEventArg.cpp
new file mode 100644
index 0000000..bb40bca
--- /dev/null
+++ b/src/FNetBt_BluetoothManagerEventArg.cpp
@@ -0,0 +1,64 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothManagerEventArg.cpp
+// @brief This is the implementation file for the _BluetoothManagerEventArg class.
+//
+
+#include "FNetBt_BluetoothManagerEventArg.h"
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// This is a class constructor for _BT_MANAGER_EVENT_ACTIVATED or _BT_MANAGER_EVENT_DEACTIVATED.
+_BluetoothManagerEventArg::_BluetoothManagerEventArg(_BluetoothMangerEventType evt, result r)
+ : __evt(evt)
+ , __result(r)
+ , __mode(BT_DISC_MODE_NOT_DISCOVERABLE)
+{
+}
+
+// This is a class constructor for _BT_MANAGER_EVENT_DISCOVERABLE.
+_BluetoothManagerEventArg::_BluetoothManagerEventArg(BluetoothDiscoverableMode mode)
+ : __evt(_BT_MANAGER_EVENT_DISCOVERABLE)
+ , __result(E_SUCCESS)
+ , __mode(mode)
+{
+}
+
+_BluetoothManagerEventArg::~_BluetoothManagerEventArg(void)
+{
+}
+
+_BluetoothMangerEventType
+_BluetoothManagerEventArg::GetEventType(void) const
+{
+ return __evt;
+}
+
+result
+_BluetoothManagerEventArg::GetErrorResult(void) const
+{
+ return __result;
+}
+
+BluetoothDiscoverableMode
+_BluetoothManagerEventArg::GetDiscoverableMode(void) const
+{
+ return __mode;
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothManagerEventArg.h b/src/FNetBt_BluetoothManagerEventArg.h
new file mode 100644
index 0000000..48a73af
--- /dev/null
+++ b/src/FNetBt_BluetoothManagerEventArg.h
@@ -0,0 +1,114 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothManagerEventArg.h
+ * @brief This is the header file for the _BluetoothManagerEventArg class.
+ *
+ * This header file contains the declarations of the _BluetoothManagerEventArg class which includes information to be
+ * passed to the event listeners
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_MANAGER_EVENT_ARG_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_MANAGER_EVENT_ARG_H_
+
+#include <FBaseObject.h>
+#include <FBaseResult.h>
+#include <FOspConfig.h>
+#include <FBaseRtIEventArg.h>
+#include <FNetBtBluetoothTypes.h>
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+/**
+ * @enum _BluetoothMangerEventType
+ * Type for specifying the type of _BluetoothMangerEvent
+ */
+enum _BluetoothMangerEventType
+{
+ _BT_MANAGER_EVENT_ACTIVATED, /**< For notifying that Bluetooth is activated */
+ _BT_MANAGER_EVENT_DEACTIVATED, /**< For notifying that Bluetooth is deactivated */
+ _BT_MANAGER_EVENT_DISCOVERABLE /**< For notifying that Bluetooth discoverable mode is changed */
+};
+
+/**
+ * @class _BluetoothManagerEventArg
+ * @brief This class is used as an argument for callback methods of the IBluetoothManagerEventListener class.
+ *
+ * When a _BluetoothManagerEvent occurs, the _BluetoothManagerEvent finds a IBluetoothManagerEventListener instance
+ * which is registered for the _BluetoothManagerEvent and calls an appropriate method of the listener.
+ * @see IBluetoothManagerEventListener
+ */
+class _BluetoothManagerEventArg
+ : public Tizen::Base::Object
+ , public Tizen::Base::Runtime::IEventArg
+{
+public:
+ /**
+ * This is a class constructor for _BT_MANAGER_EVENT_ACTIVATED or _BT_MANAGER_EVENT_DEACTIVATED.
+ *
+ * @param[in] evt The type of the event
+ * @param[in] r The result of the event
+ */
+ _BluetoothManagerEventArg(_BluetoothMangerEventType evt, result r);
+
+ /**
+ * This is a class constructor for _BT_MANAGER_EVENT_DISCOVERABLE.
+ *
+ * @param[in] mode The changed discoverable mode
+ */
+ _BluetoothManagerEventArg(BluetoothDiscoverableMode mode);
+
+ /**
+ * This is the class destructor.
+ */
+ ~_BluetoothManagerEventArg(void);
+
+ /**
+ * Gets the type of this event.
+ *
+ * @return The type of the event
+ */
+ _BluetoothMangerEventType GetEventType(void) const;
+
+ /**
+ * Gets the error result of this event.
+ *
+ * @return The result of the event
+ */
+ result GetErrorResult(void) const;
+
+ /**
+ * Gets the discoverable mode of this event.
+ *
+ * @return The discoverable mode
+ */
+ BluetoothDiscoverableMode GetDiscoverableMode(void) const;
+
+private:
+ _BluetoothManagerEventArg(void);
+ _BluetoothManagerEventArg(const _BluetoothManagerEventArg& eventArg);
+ _BluetoothManagerEventArg& operator =(const _BluetoothManagerEventArg& rValue);
+
+private:
+ _BluetoothMangerEventType __evt;
+ result __result;
+ BluetoothDiscoverableMode __mode;
+
+}; // _BluetoothManagerEventArg
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_MANAGER_EVENT_ARG_H_
diff --git a/src/FNetBt_BluetoothManagerImpl.cpp b/src/FNetBt_BluetoothManagerImpl.cpp
new file mode 100755
index 0000000..01c3f24
--- /dev/null
+++ b/src/FNetBt_BluetoothManagerImpl.cpp
@@ -0,0 +1,1841 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothManagerImpl.cpp
+// @brief This is the implementation file for the _BluetoothManagerImpl class.
+//
+
+#include <FBaseByteBuffer.h>
+#include <FNetBtBluetoothTypes.h>
+#include <FNetBtBluetoothDevice.h>
+#include <FNetBtBluetoothManager.h>
+#include <FNetBtIBluetoothManagerEventListener.h>
+#include <FNetBtIBluetoothDeviceEventListener.h>
+#include <FBaseSysLog.h>
+#include "FNetBt_BluetoothGapSystemAdapter.h"
+#include "FNetBt_BluetoothDeviceImpl.h"
+#include "FNetBt_BluetoothManagerImpl.h"
+#include "FNetBt_BluetoothIpcProxy.h"
+#include "FNetBt_BluetoothManagerEvent.h"
+#include "FNetBt_BluetoothManagerEventArg.h"
+#include "FNetBt_BluetoothDeviceEvent.h"
+#include "FNetBt_BluetoothDeviceEventArg.h"
+#include "FNetBt_BluetoothConnectionEvent.h"
+#include "FNetBt_BluetoothConnectionEventArg.h"
+
+using namespace std;
+using namespace Tizen::Base;
+using namespace Tizen::Base::Runtime;
+using namespace Tizen::Base::Collection;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+_BluetoothManagerImpl::_BluetoothManagerImpl(void)
+ : __pIpcProxy(null)
+ , __pGapAdapter(null)
+ , __pMgrEvent(null)
+ , __pDevEvent(null)
+ , __pConEvent(null)
+ , __pDevEvtListener(null)
+ , __pConEvtListener(null)
+ , __pLocalDevice(null)
+ , __pairedDeviceList()
+ , __pairedDeviceMap()
+ , __stateMutex()
+ , __pairedDevMapMutex()
+ , __currentState(_BT_MGR_STATE_DEACTIVATED)
+ , __pairingState(_BT_PAIRING_STATE_NONE)
+ , __pairingTargetAddress()
+ , __discoveredDeviceList()
+{
+}
+
+_BluetoothManagerImpl::~_BluetoothManagerImpl(void)
+{
+ if (__pGapAdapter != null)
+ {
+ if ((__currentState == _BT_MGR_STATE_DISCOVERY_REQUESTED)
+ || (__currentState == _BT_MGR_STATE_ON_DISCOVERY))
+ {
+ SysLog(NID_NET_BT, "Cancel the device discovery for resource clean.");
+ (void) CancelDiscovery();
+ }
+
+ __pGapAdapter->UnregisterManagerEventListener(*this);
+ __pGapAdapter->UnregisterDeviceEventListener(*this);
+ }
+}
+
+result
+_BluetoothManagerImpl::Construct(IBluetoothManagerEventListener& listener)
+{
+ result r = E_SUCCESS;
+ unique_ptr<_BluetoothManagerEvent> pMgrEvent;
+ unique_ptr<_BluetoothDeviceEvent> pDevEvent;
+ unique_ptr<_BluetoothConnectionEvent> pConEvent;
+
+ r = __stateMutex.Create();
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "Failed to create the state mutex.");
+
+ r = __pairedDevMapMutex.Create();
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "Failed to create the map mutex.");
+
+ r = __pairingTargetAddress.Construct(_BT_ADDRESS_LENGTH);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "Failed to construct the address for pairing.");
+
+ __pIpcProxy = _BluetoothIpcProxy::GetInstance();
+ SysTryReturnResult(NID_NET_BT, __pIpcProxy != null, E_SYSTEM, "Failed to get an instance of _BluetoothIpcProxy.");
+
+ __pGapAdapter = _BluetoothGapSystemAdapter::GetInstance();
+ SysTryReturnResult(NID_NET_BT, __pGapAdapter != null, E_SYSTEM, "Failed to get an instance of _BluetoothGapSystemAdapter.");
+
+ pMgrEvent.reset(new (std::nothrow) _BluetoothManagerEvent());
+ SysTryReturnResult(NID_NET_BT, pMgrEvent != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
+ r = pMgrEvent->Construct();
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "Failed to construct the event.");
+
+ pDevEvent.reset(new (std::nothrow) _BluetoothDeviceEvent());
+ SysTryReturnResult(NID_NET_BT, pDevEvent != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
+ r = pDevEvent->Construct();
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "Failed to construct the event.");
+
+ pConEvent.reset(new (std::nothrow) _BluetoothConnectionEvent());
+ SysTryReturnResult(NID_NET_BT, pConEvent != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
+ r = pConEvent->Construct();
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "Failed to construct the event.");
+
+ // add the IBluetoothManagerEventListener instance to a new created _BluetoothManagerEvent.
+ r = pMgrEvent->AddListener(listener, true);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM,
+ "Failed to add the application listener for BluetoothManager event");
+
+ // initialize the paired device list which is used for old version APIs
+ __pairedDeviceList.Construct();
+ r = RefreshPairedDeviceList();
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, r, r, "[%s] Failed to make the paired device list.", GetErrorMessage(r));
+
+ // initialize the paired device map which is used since 2.0
+ __pairedDeviceMap.Construct();
+ r = RefreshPairedDeviceMap();
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, r, r, "[%s] Failed to make the paired device map.", GetErrorMessage(r));
+
+ // registers this listener to the manager event of the system adapter for activation/deactivation
+ r = __pGapAdapter->RegisterManagerEventListener(*this, false);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM,
+ "Failed to register the manager event listener to _BluetoothSystemAdapter.");
+
+ // registers this listener to the device event of the system adapter for device/service discovery
+ r = __pGapAdapter->RegisterDeviceEventListener(*this);
+ if (r != E_SUCCESS)
+ {
+ __pGapAdapter->UnregisterManagerEventListener(*this);
+ SysLogException(NID_NET_BT, E_SYSTEM,
+ "[E_SYSTEM] Failed to register the device event listener to _BluetoothSystemAdapter.");
+ return E_SYSTEM;
+ }
+
+ // checks the initial state of local Bluetooth
+ __stateMutex.Acquire();
+
+ if (__pGapAdapter->IsActivated() == true)
+ {
+ if (__pGapAdapter->IsDiscoveryInProgress() == true)
+ {
+ __currentState = _BT_MGR_STATE_ON_DISCOVERY_BY_SYSTEM;
+ }
+ else
+ {
+ __currentState = _BT_MGR_STATE_ACTIVATED;
+ }
+ }
+
+ __stateMutex.Release();
+
+ __pMgrEvent = move(pMgrEvent);
+ __pDevEvent = move(pDevEvent);
+ __pConEvent = move(pConEvent);
+
+ return E_SUCCESS;
+}
+
+result
+_BluetoothManagerImpl::Activate(void)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_SUCCESS;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_MGR_STATE_DEACTIVATED:
+ r = __pGapAdapter->Activate();
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_MGR_STATE_ACTIVATING;
+ }
+ break;
+
+ case _BT_MGR_STATE_ACTIVATING:
+ r = E_IN_PROGRESS;
+ break;
+
+ default:
+ r = E_INVALID_OPERATION;
+ break;
+ }
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on activating Bluetooth.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [result:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothManagerImpl::Deactivate(void)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_SUCCESS;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_MGR_STATE_DEACTIVATED:
+ case _BT_MGR_STATE_ACTIVATING:
+ r = E_INVALID_OPERATION;
+ break;
+
+ case _BT_MGR_STATE_DEACTIVATING:
+ r = E_IN_PROGRESS;
+ break;
+
+ default:
+ r = __pGapAdapter->Deactivate();
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_MGR_STATE_DEACTIVATING;
+ }
+ break;
+ }
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on deactivating Bluetooth.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [result:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+bool
+_BluetoothManagerImpl::IsAvailable(BluetoothConnectionType type) const
+{
+ return __pGapAdapter->IsAvailable(type);
+}
+
+const BluetoothDevice*
+_BluetoothManagerImpl::GetLocalDevice(void)
+{
+ ByteBuffer localAddr;
+ String localAddrStr;
+ String localName;
+ result r = E_SUCCESS;
+ _BluetoothDeviceImpl* pImpl = null;
+
+ // Gets the Bluetooth address.
+ localAddrStr = __pGapAdapter->GetLocalDeviceAddress();
+ localAddr.Construct(_BT_ADDRESS_LENGTH);
+ r = _BluetoothDeviceImpl::GetAddressByteBuffer(localAddrStr, L":", localAddr);
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] Getting the Bluetooth address has failed.");
+
+ // Gets the Bluetooth local name.
+ localName = GetLocalDeviceName();
+
+ if (__pLocalDevice == null)
+ {
+ __pLocalDevice = new (std::nothrow) BluetoothDevice();
+ if (__pLocalDevice == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient on creation of BluetoothDevice.");
+ SetLastResult(E_OUT_OF_MEMORY);
+ return null;
+ }
+
+ pImpl = _BluetoothDeviceImpl::GetInstance(*__pLocalDevice);
+ pImpl->SetAddress(localAddr);
+ pImpl->SetName(localName);
+ pImpl->SetMajorDeviceClassType(BT_COD_MAJ_DEV_CLS_PHONE);
+ pImpl->SetMinorDeviceClassType(BT_COD_MIN_DEV_CLS_CELLULAR);
+ pImpl->SetServiceClassList(BT_COD_SVC_UNKNOWN);
+ pImpl->SetServiceList(BT_SVC_NONE);
+ }
+ else
+ {
+ r = _BluetoothDeviceImpl::GetInstance(*__pLocalDevice)->SetAddress(localAddr);
+ if (r == E_SUCCESS)
+ {
+ _BluetoothDeviceImpl::GetInstance(*__pLocalDevice)->SetName(localName);
+ }
+ else
+ {
+ SysLogException(NID_NET_BT, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
+ SetLastResult(E_SYSTEM);
+ return null;
+ }
+ }
+
+ SetLastResult(E_SUCCESS);
+
+ return __pLocalDevice;
+}
+
+Tizen::Base::String
+_BluetoothManagerImpl::GetLocalDeviceAddress(void) const
+{
+ return __pGapAdapter->GetLocalDeviceAddress();
+}
+
+Tizen::Base::String
+_BluetoothManagerImpl::GetLocalDeviceName(void) const
+{
+ result r = E_SUCCESS;
+ String localName;
+
+ // Get the local name from osp-connectivity-service.
+ r = __pIpcProxy->GetLocalDeviceName(localName);
+ SysTryLog(NID_NET_BT, r == E_SUCCESS, "Getting the local name through osp-connectivity-service has failed.");
+ // Ignores other cases
+
+ return localName;
+}
+
+BluetoothDeviceStateType
+_BluetoothManagerImpl::GetLocalDeviceState() const
+{
+ if (__pGapAdapter->IsActivated() == true)
+ {
+ if (__pGapAdapter->GetDiscoverableMode() == BT_DISC_MODE_DISCOVERABLE)
+ {
+ return BT_DEVICE_STATE_DISCOVERABLE;
+ }
+
+ return BT_DEVICE_STATE_NOT_DISCOVERABLE;
+ }
+
+ return BT_DEVICE_STATE_OFF;
+}
+
+int
+_BluetoothManagerImpl::GetRemainingTimeAsDiscoverable(void) const
+{
+ return __pGapAdapter->GetRemainingTimeAsDiscoverable();
+}
+
+bool
+_BluetoothManagerImpl::IsActivated(void) const
+{
+ return __pGapAdapter->IsActivated();
+}
+
+BluetoothDiscoverableMode
+_BluetoothManagerImpl::GetDiscoverableMode(void) const
+{
+ return __pGapAdapter->GetDiscoverableMode();
+}
+
+bool
+_BluetoothManagerImpl::IsDiscoveryInProgress(void) const
+{
+ return __pGapAdapter->IsDiscoveryInProgress();
+}
+
+result
+_BluetoothManagerImpl::SetLocalDeviceName(const Tizen::Base::String& deviceName)
+{
+ result r = E_SUCCESS;
+
+ SysTryReturn(NID_NET_BT, deviceName.GetLength() > 0, E_INVALID_ARG, E_INVALID_ARG,
+ "[E_INVALID_ARG] The specified input name is an empty string.");
+
+ // Sets the local name through osp-connectivity-service.
+ r = __pIpcProxy->SetLocalDeviceName(deviceName);
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, r, r,
+ "[%s] Setting the local device name through osp-connectivity-service has failed.", GetErrorMessage(r));
+
+ return E_SUCCESS;
+}
+
+result
+_BluetoothManagerImpl::SetDiscoverableMode(BluetoothDiscoverableMode mode, int seconds)
+{
+ result r = E_SUCCESS;
+
+ // Sets the discoverable mode through osp-connectivity-service.
+ r = __pIpcProxy->SetDiscoverableMode((int)mode, seconds);
+ SysTryReturnResult(NID_NET_BT, r != E_PRIVILEGE_DENIED, E_PRIVILEGE_DENIED,
+ "The application does not have the privilege to call this method.");
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, r, r,
+ "[%s] Setting the the discoverable mode through osp-connectivity-service has failed.", GetErrorMessage(r));
+
+ return E_SUCCESS;
+}
+
+result
+_BluetoothManagerImpl::RefreshPairedDeviceList(void)
+{
+ result r = E_SUCCESS;
+ IList* pList = null;
+ BluetoothDevice* pPairedDevice = null;
+ int numOfElements = 0;
+
+ pList = __pGapAdapter->GetAllPairedDeviceListN();
+
+ if (pList != null)
+ {
+ __pairedDeviceList.RemoveAll(true);
+ numOfElements = pList->GetCount();
+
+ for (int i = 0; i < numOfElements; i++)
+ {
+ pPairedDevice = (BluetoothDevice*) pList->GetAt(i);
+
+ if (pPairedDevice != null)
+ {
+ r = __pairedDeviceList.Add(*pPairedDevice);
+
+ // propagates all kinds of exception as E_SYSTEM
+ // except E_OUT_OF_MEMORY
+ r = TransExceptionsExclusive(r, E_SYSTEM, E_OUT_OF_MEMORY);
+ }
+ else
+ {
+ r = E_SYSTEM;
+ }
+
+ if (r != E_SUCCESS)
+ {
+ pList->RemoveAll(true);
+ __pairedDeviceList.RemoveAll(false);
+ break;
+ }
+ }
+
+ delete pList;
+ }
+ else
+ {
+ r = E_SYSTEM;
+ }
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] Internal error occurred on getting all paired device list from system.", GetErrorMessage(r));
+ }
+
+ return r;
+}
+
+const BluetoothDevice*
+_BluetoothManagerImpl::GetPairedDeviceByAddress(const Tizen::Base::ByteBuffer& deviceAddress) const
+{
+ const ByteBuffer* pAddress = null;
+ int numOfElements = 0;
+
+ numOfElements = __pairedDeviceList.GetCount();
+
+ for (int i = 0; i < numOfElements; i++)
+ {
+ BluetoothDevice* pListDevice = (BluetoothDevice*) __pairedDeviceList.GetAt(i);
+
+ if (pListDevice != null)
+ {
+ pAddress = pListDevice->GetAddress();
+
+ if (pAddress->Equals(deviceAddress))
+ {
+ return pListDevice;
+ }
+ }
+ }
+
+ SysLogException(NID_NET_BT, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] No device is matched by the input address.");
+ SetLastResult(E_OBJ_NOT_FOUND);
+
+ return null;
+}
+
+BluetoothDevice*
+_BluetoothManagerImpl::GetPairedDeviceByAddressN(const Tizen::Base::ByteBuffer& deviceAddress) const
+{
+ BluetoothDevice* pResultDevice = null;
+ const BluetoothDevice* pListedDevice = null;
+ result r = E_SUCCESS;
+
+ (const_cast<_BluetoothManagerImpl*>(this))->__pairedDevMapMutex.Acquire();
+
+ pListedDevice = dynamic_cast<const BluetoothDevice*>(__pairedDeviceMap.GetValue(deviceAddress));
+ if (pListedDevice != null)
+ {
+ pResultDevice = new (std::nothrow) BluetoothDevice(*pListedDevice);
+ if (pResultDevice == null)
+ {
+ r = GetLastResult();
+ }
+ }
+ else
+ {
+ r = E_OBJ_NOT_FOUND;
+ }
+
+ (const_cast<_BluetoothManagerImpl*>(this))->__pairedDevMapMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred.", GetErrorMessage(r));
+ SetLastResult(r);
+ }
+
+ return pResultDevice;
+}
+
+Tizen::Base::Collection::IList*
+_BluetoothManagerImpl::GetPairedDeviceByNameN(const Base::String& deviceName) const
+{
+ unique_ptr<ArrayList, AllElementsDeleter> pSearchedList;
+ BluetoothDevice* pListedDevice = null;
+ BluetoothDevice* pResultDevice = null;
+ result r = E_SUCCESS;
+
+ pSearchedList.reset(new (std::nothrow) ArrayList);
+
+ if (pSearchedList != null)
+ {
+ // initialize the capacity of the result list
+ pSearchedList->Construct(2);
+ (const_cast<_BluetoothManagerImpl*>(this))->__pairedDevMapMutex.Acquire();
+
+ IMapEnumerator* pMapEnum = __pairedDeviceMap.GetMapEnumeratorN();
+
+ if (pMapEnum)
+ {
+ while (pMapEnum->MoveNext() == E_SUCCESS)
+ {
+ pListedDevice = dynamic_cast<BluetoothDevice*>(pMapEnum->GetValue());
+ if (pListedDevice != null)
+ {
+ String listedDeviceName = pListedDevice->GetName();
+ int indexOf = 0;
+
+ if (listedDeviceName.IndexOf(deviceName, 0, indexOf) == E_SUCCESS)
+ {
+ pResultDevice = new (std::nothrow) BluetoothDevice(*pListedDevice);
+ if (pResultDevice == null)
+ {
+ r = GetLastResult();
+ break;
+ }
+
+ // doesn't check the result of Add() method to avoid the versioning issue
+ (void) pSearchedList->Add(*pResultDevice);
+ }
+ }
+ }
+
+ delete pMapEnum;
+ }
+ else
+ {
+ r = E_OUT_OF_MEMORY;
+ }
+
+ (const_cast<_BluetoothManagerImpl*>(this))->__pairedDevMapMutex.Release();
+ }
+ else
+ {
+ r = E_OUT_OF_MEMORY;
+ }
+
+ if ((r == E_SUCCESS) && (pSearchedList->GetCount() <= 0))
+ {
+ r = E_OBJ_NOT_FOUND;
+ }
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred.", GetErrorMessage(r));
+ SetLastResult(r);
+ return null;
+ }
+
+ return pSearchedList.release();
+}
+
+const BluetoothDevice*
+_BluetoothManagerImpl::GetPairedDeviceAt(int index) const
+{
+ BluetoothDevice* pResultDevice = null;
+
+ if ((index >= 0) && (index < __pairedDeviceList.GetCount()))
+ {
+ pResultDevice = (BluetoothDevice*) __pairedDeviceList.GetAt(index);
+ }
+
+ if (pResultDevice == null)
+ {
+ SysLogException(NID_NET_BT, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] Index is not available.");
+ SetLastResult(E_OBJ_NOT_FOUND);
+ }
+
+ return pResultDevice;
+}
+
+const Tizen::Base::Collection::IList*
+_BluetoothManagerImpl::GetPairedDeviceList(void) const
+{
+ return &__pairedDeviceList;
+}
+
+Tizen::Base::Collection::IList*
+_BluetoothManagerImpl::GetPairedDeviceListN(void) const
+{
+ unique_ptr<ArrayList, AllElementsDeleter> pResultList;
+ BluetoothDevice* pListedDevice = null;
+ BluetoothDevice* pResultDevice = null;
+ result r = E_SUCCESS;
+ int resultCount = 0;
+
+ pResultList.reset(new (std::nothrow) ArrayList);
+
+ if (pResultList)
+ {
+ (const_cast<_BluetoothManagerImpl*>(this))->__pairedDevMapMutex.Acquire();
+
+ // initialize the capacity of the result list
+ resultCount = __pairedDeviceMap.GetCount();
+ pResultList->Construct(resultCount);
+
+ IMapEnumerator* pMapEnum = __pairedDeviceMap.GetMapEnumeratorN();
+
+ if (pMapEnum)
+ {
+ while (pMapEnum->MoveNext() == E_SUCCESS)
+ {
+ pListedDevice = dynamic_cast<BluetoothDevice*>(pMapEnum->GetValue());
+ if (pListedDevice != null)
+ {
+ pResultDevice = new (std::nothrow) BluetoothDevice(*pListedDevice);
+ if (pResultDevice == null)
+ {
+ r = GetLastResult();
+ break;
+ }
+
+ // doesn't check the result of Add() method to avoid the versioning issue
+ (void) pResultList->Add(*pResultDevice);
+ }
+ }
+
+ delete pMapEnum;
+ }
+ else
+ {
+ r = E_OUT_OF_MEMORY;
+ }
+
+ (const_cast<_BluetoothManagerImpl*>(this))->__pairedDevMapMutex.Release();
+ }
+ else
+ {
+ r = E_OUT_OF_MEMORY;
+ }
+
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, null, r, "[%s] error occurred.", GetErrorMessage(r));
+
+ return pResultList.release();
+}
+
+result
+_BluetoothManagerImpl::SetBluetoothDeviceListener(IBluetoothDeviceEventListener* pListener)
+{
+ result r = E_SUCCESS;
+
+ SysTryReturnResult(NID_NET_BT, __pDevEvtListener != pListener, E_SUCCESS, "the listener instance is already registered.");
+
+ if (__pDevEvtListener != null)
+ {
+ // remove the previous IBluetoothDeviceEventListener instance from the _BluetoothDeviceEvent.
+ r = __pDevEvent->RemoveListener(*__pDevEvtListener);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "Failed to remove the previous IBluetoothDeviceEventListener.");
+ SysLog(NID_NET_BT, "Removing the previous IBluetoothDeviceEventListener is successful.");
+ __pDevEvtListener = null;
+ }
+
+ if (pListener != null)
+ {
+ // add the specified new IBluetoothDeviceEventListener instance to the _BluetoothDeviceEvent.
+ r = __pDevEvent->AddListener(*pListener, true);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "Failed to add the new IBluetoothDeviceEventListener.");
+ SysLog(NID_NET_BT, "Adding the new IBluetoothDeviceEventListener is successful.");
+ __pDevEvtListener = pListener;
+ }
+
+ return r;
+}
+
+result
+_BluetoothManagerImpl::SetBluetoothConnectionListener(_IBluetoothConnectionEventListener* pListener)
+{
+ result r = E_SUCCESS;
+
+ SysTryReturnResult(NID_NET_BT, __pConEvtListener != pListener, E_SUCCESS, "the listener instance is already registered.");
+
+ if (__pConEvtListener != null)
+ {
+ // remove the previous IBluetoothDeviceEventListener instance from the _BluetoothDeviceEvent.
+ r = __pMgrEvent->RemoveListener(*__pConEvtListener);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "Failed to remove the previous _IBluetoothConnectionEventListener.");
+ SysLog(NID_NET_BT, "Removing the previous _IBluetoothConnectionEventListener is successful.");
+ __pConEvtListener = null;
+ }
+
+ if (pListener != null)
+ {
+ // add the specified new IBluetoothDeviceEventListener instance to the _BluetoothDeviceEvent.
+ r = __pMgrEvent->AddListener(*pListener, true);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "Failed to add the new _IBluetoothConnectionEventListener.");
+ SysLog(NID_NET_BT, "Adding the new _IBluetoothConnectionEventListener is successful.");
+ __pConEvtListener = pListener;
+ }
+
+ return r;
+}
+
+result
+_BluetoothManagerImpl::StartDiscovery(void)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_SUCCESS;
+
+ __discoveredDeviceList.RemoveAll(true);
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_MGR_STATE_ACTIVATED:
+ r = __pGapAdapter->StartDiscovery();
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_MGR_STATE_DISCOVERY_REQUESTED;
+ }
+ break;
+
+ case _BT_MGR_STATE_DISCOVERY_REQUESTED:
+ case _BT_MGR_STATE_ON_DISCOVERY:
+ case _BT_MGR_STATE_ON_DISCOVERY_BY_SYSTEM:
+ r = E_IN_PROGRESS;
+ break;
+
+ default:
+ r = E_INVALID_OPERATION;
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on starting the device discovery.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [result:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothManagerImpl::CancelDiscovery(void)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_SUCCESS;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_MGR_STATE_DISCOVERY_REQUESTED:
+ case _BT_MGR_STATE_ON_DISCOVERY:
+ r = __pGapAdapter->CancelDiscovery();
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_MGR_STATE_DISCOVERY_CANCELING;
+ }
+ break;
+
+ case _BT_MGR_STATE_DISCOVERY_CANCELING:
+ r = E_IN_PROGRESS;
+ break;
+
+ default:
+ r = E_INVALID_OPERATION;
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on canceling the device discovery.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [result:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothManagerImpl::RetrieveServiceList(const BluetoothDevice& pairedDevice)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_SUCCESS;
+ const ByteBuffer* pKeyAddress = null;
+ BluetoothDevice* pListedDevice = null;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_MGR_STATE_ACTIVATED:
+ // check paredDevice really exists in the paired device list
+ pKeyAddress = pairedDevice.GetAddress();
+
+ __pairedDevMapMutex.Acquire();
+
+ // TODO: move to the following logic to _BluetoothSystemAdapter::IsPaired()
+ pListedDevice = (BluetoothDevice*) __pairedDeviceMap.GetValue(*pKeyAddress);
+ if (pListedDevice)
+ {
+ r = __pGapAdapter->RetrieveServiceList(*pKeyAddress);
+ }
+ else
+ {
+ r = E_NOT_PAIRED;
+ }
+
+ __pairedDevMapMutex.Release();
+
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_MGR_STATE_SERVICE_RETRIEVING;
+ }
+ break;
+
+ case _BT_MGR_STATE_SERVICE_RETRIEVING:
+ r = E_IN_PROGRESS;
+ break;
+
+ default:
+ r = E_INVALID_OPERATION;
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on retrieving the service list from the remote device.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [result:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothManagerImpl::Pair(const BluetoothDevice& remoteDevice)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [PairingState:%s]", GetStringOfCurrentState(), GetStringOfPairingState());
+
+ result r = E_SUCCESS;
+ const ByteBuffer* pAddress = null;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_MGR_STATE_ACTIVATED:
+ case _BT_MGR_STATE_DISCOVERY_REQUESTED:
+ case _BT_MGR_STATE_ON_DISCOVERY:
+ case _BT_MGR_STATE_DISCOVERY_CANCELING:
+ case _BT_MGR_STATE_ON_DISCOVERY_BY_SYSTEM:
+ case _BT_MGR_STATE_SERVICE_RETRIEVING:
+ if (__pairingState == _BT_PAIRING_STATE_NONE)
+ {
+ pAddress = remoteDevice.GetAddress();
+ r = __pGapAdapter->Pair(*pAddress);
+ if (r == E_SUCCESS)
+ {
+ // copy the address of the pairing device to the local variable
+ __pairingTargetAddress.SetArray(pAddress->GetPointer(), 0, _BT_ADDRESS_LENGTH);
+ __pairingTargetAddress.SetPosition(0);
+
+ __pairingState = _BT_PAIRING_STATE_PAIRING;
+ }
+ }
+ else
+ {
+ r = E_DEVICE_BUSY;
+ }
+ break;
+
+ default:
+ r = E_INVALID_OPERATION;
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on pairing with the remote device.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [PairingState:%s], [result:%s]", GetStringOfCurrentState(),
+ GetStringOfPairingState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothManagerImpl::CancelPair(void)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [PairingState:%s]", GetStringOfCurrentState(), GetStringOfPairingState());
+
+ result r = E_SUCCESS;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_MGR_STATE_ACTIVATED:
+ case _BT_MGR_STATE_DISCOVERY_REQUESTED:
+ case _BT_MGR_STATE_ON_DISCOVERY:
+ case _BT_MGR_STATE_DISCOVERY_CANCELING:
+ case _BT_MGR_STATE_ON_DISCOVERY_BY_SYSTEM:
+ case _BT_MGR_STATE_SERVICE_RETRIEVING:
+ if (__pairingState == _BT_PAIRING_STATE_PAIRING)
+ {
+ r = __pGapAdapter->CancelPair();
+ if (r == E_SUCCESS)
+ {
+ __pairingState = _BT_PAIRING_STATE_CANCELING;
+ }
+ }
+ else if (__pairingState == _BT_PAIRING_STATE_CANCELING)
+ {
+ r = E_IN_PROGRESS;
+ }
+ else
+ {
+ r = E_INVALID_OPERATION;
+ }
+ break;
+
+ default:
+ r = E_INVALID_OPERATION;
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on canceling the pairing process.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [PairingState:%s], [result:%s]", GetStringOfCurrentState(),
+ GetStringOfPairingState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothManagerImpl::Unpair(const BluetoothDevice& pairedDevice)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [PairingState:%s]", GetStringOfCurrentState(), GetStringOfPairingState());
+
+ result r = E_SUCCESS;
+ const ByteBuffer* pKeyAddress = null;
+ BluetoothDevice* pListedDevice = null;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_MGR_STATE_ACTIVATED:
+ case _BT_MGR_STATE_DISCOVERY_REQUESTED:
+ case _BT_MGR_STATE_ON_DISCOVERY:
+ case _BT_MGR_STATE_DISCOVERY_CANCELING:
+ case _BT_MGR_STATE_ON_DISCOVERY_BY_SYSTEM:
+ case _BT_MGR_STATE_SERVICE_RETRIEVING:
+ // check paredDevice really exists in the paired device list
+ pKeyAddress = pairedDevice.GetAddress();
+
+ __pairedDevMapMutex.Acquire();
+
+ // TODO: move to the following logic to _BluetoothSystemAdapter::IsPaired()
+ pListedDevice = (BluetoothDevice*) __pairedDeviceMap.GetValue(*pKeyAddress);
+ if (pListedDevice)
+ {
+ r = __pGapAdapter->Unpair(*pKeyAddress);
+ }
+ else
+ {
+ r = E_NOT_PAIRED;
+ }
+
+ __pairedDevMapMutex.Release();
+
+ break;
+
+ default:
+ r = E_INVALID_OPERATION;
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on unpairing with the remote device.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [PairingState:%s], [result:%s]", GetStringOfCurrentState(),
+ GetStringOfPairingState(), GetErrorMessage(r));
+
+ return r;
+}
+
+void
+_BluetoothManagerImpl::OnBluetoothActivated(result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [result:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ bool isFired = false;
+ result resRefresh = E_SUCCESS;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_MGR_STATE_DEACTIVATED:
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_MGR_STATE_ACTIVATED;
+ isFired = true;
+ }
+ break;
+
+ case _BT_MGR_STATE_ACTIVATING:
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_MGR_STATE_ACTIVATED;
+ }
+ else
+ {
+ __currentState = _BT_MGR_STATE_DEACTIVATED;
+ }
+ isFired = true;
+ break;
+
+ default:
+ // ignore other cases
+ break;
+ }
+
+ __stateMutex.Release();
+
+ // refresh the paired device list
+ resRefresh = RefreshPairedDeviceList();
+ SysLog(NID_NET_BT, "Refreshing the paired device list %s.", (resRefresh == E_SUCCESS) ? "is successful" : "fails");
+
+ // refresh the paired device map which is used since 2.0
+ resRefresh = RefreshPairedDeviceMap();
+ SysLog(NID_NET_BT, "Refreshing the paired device map %s.", (resRefresh == E_SUCCESS) ? "is successful" : "fails");
+
+ if (isFired)
+ {
+ _BluetoothManagerEventArg* pArg = new (std::nothrow) _BluetoothManagerEventArg(_BT_MANAGER_EVENT_ACTIVATED, r);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ __pMgrEvent->FireAsync(*pArg);
+ }
+ }
+
+ if ((isFired) && (r != E_SUCCESS))
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred in Bluetooth activation callback.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ACTIVATED_Event:%s]",
+ GetStringOfCurrentState(), isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothManagerImpl::OnBluetoothDeactivated(result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [result:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ bool isFired = false;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_MGR_STATE_ACTIVATED:
+ case _BT_MGR_STATE_DISCOVERY_REQUESTED:
+ case _BT_MGR_STATE_ON_DISCOVERY:
+ case _BT_MGR_STATE_DISCOVERY_CANCELING:
+ case _BT_MGR_STATE_ON_DISCOVERY_BY_SYSTEM:
+ case _BT_MGR_STATE_SERVICE_RETRIEVING:
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_MGR_STATE_DEACTIVATED;
+ isFired = true;
+ }
+ break;
+
+ case _BT_MGR_STATE_DEACTIVATING:
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_MGR_STATE_DEACTIVATED;
+ }
+ else
+ {
+ __currentState = _BT_MGR_STATE_ACTIVATED;
+ }
+ isFired = true;
+ break;
+
+ default:
+ // ignore other cases
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (isFired)
+ {
+ _BluetoothManagerEventArg* pArg = new (std::nothrow) _BluetoothManagerEventArg(_BT_MANAGER_EVENT_DEACTIVATED, r);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ __pMgrEvent->FireAsync(*pArg);
+ }
+ }
+
+ if ((isFired) && (r != E_SUCCESS))
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred in Bluetooth deactivation callback.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ACTIVATED_Event:%s]",
+ GetStringOfCurrentState(), isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothManagerImpl::OnBluetoothDiscoverableModeChanged(BluetoothDiscoverableMode mode)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ bool isFired = false;
+
+ _BluetoothManagerEventArg* pArg = new (std::nothrow) _BluetoothManagerEventArg(mode);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ }
+ else
+ {
+ __pMgrEvent->FireAsync(*pArg);
+ isFired = true;
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [VISIBILITY_Event:%s]",
+ GetStringOfCurrentState(), isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothManagerImpl::OnBluetoothDiscoveryStarted(result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [result:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ bool isFired = false;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_MGR_STATE_ACTIVATED:
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_MGR_STATE_ON_DISCOVERY_BY_SYSTEM;
+ }
+ break;
+
+ case _BT_MGR_STATE_DISCOVERY_REQUESTED:
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_MGR_STATE_ON_DISCOVERY;
+ }
+ else
+ {
+ __currentState = _BT_MGR_STATE_ACTIVATED;
+ }
+
+ isFired = true;
+ break;
+
+ case _BT_MGR_STATE_DISCOVERY_CANCELING:
+ if (r == E_SUCCESS)
+ {
+ // the current status is not changed while firing
+ isFired = true;
+ }
+ break;
+
+ default:
+ // ignore other cases
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (isFired)
+ {
+ _BluetoothDeviceEventArg* pArg = new (std::nothrow) _BluetoothDeviceEventArg(r);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ __pDevEvent->FireAsync(*pArg);
+ }
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred in the discovery discovery callback.", GetErrorMessage(r));
+ }
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [DISCOVERY_STARTED_Event:%s]",
+ GetStringOfCurrentState(), isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothManagerImpl::OnBluetoothRemoteDeviceFound(const BluetoothDevice& foundDevice)
+{
+ bool isFired = false;
+ unique_ptr<ByteBuffer> pFoundDeviceAddress;
+ _BluetoothDeviceEventArg* pArg = null;
+
+ switch (__currentState)
+ {
+ case _BT_MGR_STATE_ON_DISCOVERY:
+ case _BT_MGR_STATE_DISCOVERY_CANCELING:
+ pFoundDeviceAddress.reset(new (std::nothrow) ByteBuffer());
+ if(pFoundDeviceAddress == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ break;
+ }
+ pFoundDeviceAddress->Construct(*foundDevice.GetAddress());
+
+ if(__discoveredDeviceList.Contains(*pFoundDeviceAddress.get()) == true)
+ {
+ SysLog(NID_NET_BT, "The found device already exist.");
+ break;
+ }
+
+ (void) __discoveredDeviceList.Add(*pFoundDeviceAddress.release());
+
+ pArg = new (std::nothrow) _BluetoothDeviceEventArg(_BT_DEVICE_EVENT_DEVICE_FOUND,
+ foundDevice);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ }
+ else
+ {
+ __pDevEvent->FireAsync(*pArg);
+ isFired = true;
+ }
+ break;
+
+ default:
+ // ignore other cases
+ break;
+ }
+
+ SysLog(NID_NET_BT, "[CurrentState:%s], [DEVICE_FOUND_Event:%s]", GetStringOfCurrentState(), isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothManagerImpl::OnBluetoothDiscoveryDone(bool isCompleted)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [DiscoveryDone:%s]",
+ GetStringOfCurrentState(), isCompleted ? "Completed" : "NotCompleted");
+
+ bool isFired = false;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_MGR_STATE_ON_DISCOVERY:
+ case _BT_MGR_STATE_DISCOVERY_CANCELING:
+ __currentState = _BT_MGR_STATE_ACTIVATED;
+ isFired = true;
+ break;
+
+ case _BT_MGR_STATE_ON_DISCOVERY_BY_SYSTEM:
+ __currentState = _BT_MGR_STATE_ACTIVATED;
+ break;
+
+ default:
+ // ignore other cases
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (isFired)
+ {
+ _BluetoothDeviceEventArg* pArg = new (std::nothrow) _BluetoothDeviceEventArg(isCompleted);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ __pDevEvent->FireAsync(*pArg);
+ }
+ }
+
+ __discoveredDeviceList.RemoveAll(true);
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [DISCOVERY_DONE_Event:%s]",
+ GetStringOfCurrentState(), isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothManagerImpl::OnBluetoothServiceListReceived(const Tizen::Base::ByteBuffer& address, unsigned long serviceList,
+ const Tizen::Base::Collection::IList* pServiceUuidList, result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [ServiceList:%ld], [result:%s]",
+ GetStringOfCurrentState(), serviceList, GetErrorMessage(r));
+
+ bool isFired = false;
+ BluetoothDevice* pListedDevice = null;
+ BluetoothDevice* pResultDevice = null;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_MGR_STATE_SERVICE_RETRIEVING:
+ __currentState = _BT_MGR_STATE_ACTIVATED;
+ isFired = true;
+ break;
+
+ default:
+ // ignore other cases
+ break;
+ }
+
+ __stateMutex.Release();
+
+ // updates internal information regardless of the current status if r is E_SUCCESS
+ __pairedDevMapMutex.Acquire();
+
+ pListedDevice = (BluetoothDevice*) __pairedDeviceMap.GetValue(address);
+
+ if (pListedDevice != null)
+ {
+ if ((r == E_SUCCESS) && (pServiceUuidList != null))
+ {
+ _BluetoothDeviceImpl* pDevImpl = _BluetoothDeviceImpl::GetInstance(*pListedDevice);
+ pDevImpl->SetServiceList(serviceList);
+ pDevImpl->SetServiceUuidList(pServiceUuidList, true);
+ }
+
+ if (isFired == true)
+ {
+ // target device instance should be copied
+ // because the original instance in the list is able to be removed out of the mutex span.
+ pResultDevice = new (std::nothrow) BluetoothDevice(*pListedDevice);
+ if (pResultDevice == null)
+ {
+ r = E_SYSTEM;
+ }
+ }
+ }
+ else
+ {
+ r = E_SYSTEM;
+ }
+
+ __pairedDevMapMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ serviceList = 0;
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred in the service list reception callback.", GetErrorMessage(r));
+ }
+
+ if (isFired)
+ {
+ _BluetoothDeviceEventArg* pArg = null;
+ if (pResultDevice == null)
+ {
+ // It is almost impossible for this case to occur.
+ // The only case is that the paired device is unpaired and removed from the paired list
+ // during the service discovery.
+ // So, the below code is just to prevent system fault at some undefined exceptional cases.
+ BluetoothDevice dummyDevice(address, String("Dummy"), BT_COD_MAJ_DEV_CLS_UNCLASSIFIED,
+ BT_COD_MIN_DEV_CLS_UNCLASSIFIED, 0, 0);
+ pArg = new (std::nothrow) _BluetoothDeviceEventArg(dummyDevice, serviceList, r);
+ }
+ else
+ {
+ pArg = new (std::nothrow) _BluetoothDeviceEventArg(*pResultDevice, serviceList, r);
+ delete pResultDevice;
+ }
+
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ __pDevEvent->FireAsync(*pArg);
+ }
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [result:%s], [SERVICELIST_RECEIVED_Event:%s]",
+ GetStringOfCurrentState(), GetErrorMessage(r), isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothManagerImpl::OnBluetoothPaired(const BluetoothDevice* pPairedDevice, result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [PairingState:%s], [result:%s]",
+ GetStringOfCurrentState(), GetStringOfPairingState(), GetErrorMessage(r));
+
+ result res = E_SUCCESS;
+ bool isFired = false;
+ const ByteBuffer* pKeyAddress = null;
+ BluetoothDevice* pListedDevice = null;
+ ByteBuffer* pCloneAddress = null;
+ BluetoothDevice* pCloneDevice = null;
+ _BluetoothDeviceEventArg* pArg = null;
+
+ pKeyAddress = pPairedDevice->GetAddress();
+
+ // update the paired list regardless whether the pairing operation is issued by this instance or not
+ // when the pairing process is finished successfully.
+ if (r == E_SUCCESS)
+ {
+ __pairedDevMapMutex.Acquire();
+
+ pListedDevice = dynamic_cast<BluetoothDevice*> (__pairedDeviceMap.GetValue(*pKeyAddress));
+ res = GetLastResult();
+
+ // insert the clone instance of the paired device into the paired device list
+ if ((pListedDevice == null) && (res == E_OBJ_NOT_FOUND))
+ {
+ pCloneAddress = new (std::nothrow) ByteBuffer();
+ if (pCloneAddress)
+ {
+ pCloneAddress->Construct(*pKeyAddress);
+ pCloneDevice = new (std::nothrow) BluetoothDevice(*pPairedDevice);
+ if (pCloneDevice)
+ {
+ r = __pairedDeviceMap.Add(*pCloneAddress, *pCloneDevice);
+ // TODO: the following statement should be replaced by the special MACRO function.
+ r = (r == E_SUCCESS) ? E_SUCCESS : E_OPERATION_FAILED;
+ }
+ else
+ {
+ delete pCloneAddress;
+ r = E_OUT_OF_MEMORY;
+ }
+ }
+ else
+ {
+ r = E_OUT_OF_MEMORY;
+ }
+ }
+ // If the device is already contained in the paired list, the BluetoothDevice instance is updated.
+ else if (pListedDevice != null)
+ {
+ *pListedDevice = *pPairedDevice;
+ }
+
+ __pairedDevMapMutex.Release();
+ }
+
+ // send event if the pairing process is finished successfully.
+ if (r == E_SUCCESS)
+ {
+ __pairingState = _BT_PAIRING_STATE_NONE;
+ pArg = new (std::nothrow) _BluetoothDeviceEventArg(pPairedDevice, E_SUCCESS);
+ SysTryReturnVoidResult(NID_NET_BT, pArg != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient." );
+ isFired = true;
+ }
+ // send event if the pairing operation is issued by this instance although the pairing process fails.
+ else if ((__pairingState != _BT_PAIRING_STATE_NONE) && (pPairedDevice->GetAddress()->Equals(__pairingTargetAddress)))
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred in the paired callback.", GetErrorMessage(r));
+ __pairingState = _BT_PAIRING_STATE_NONE;
+ pArg = new (std::nothrow) _BluetoothDeviceEventArg(null, r);
+ SysTryReturnVoidResult(NID_NET_BT, pArg != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient." );
+ isFired = true;
+ }
+
+ if (isFired == true)
+ {
+ __pDevEvent->FireAsync(*pArg);
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [PairingState:%s], [PAIRED_Event:%s]",
+ GetStringOfCurrentState(), GetStringOfPairingState(), isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothManagerImpl::OnBluetoothUnpaired(const Tizen::Base::ByteBuffer& address)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [PairingState:%s]", GetStringOfCurrentState(), GetStringOfPairingState());
+
+ result r = E_SUCCESS;
+ bool isFired = false;
+ BluetoothDevice* pListedDevice = null;
+ BluetoothDevice* pResultDevice = null;
+
+ __pairedDevMapMutex.Acquire();
+
+ pListedDevice = (BluetoothDevice*) __pairedDeviceMap.GetValue(address);
+ if (pListedDevice != null)
+ {
+ // target device instance should be copied
+ // because the original instance in the list will be removed from the list and deleted below.
+ pResultDevice = new (std::nothrow) BluetoothDevice(*pListedDevice);
+ if (pResultDevice != null)
+ {
+ isFired = true;
+ }
+
+ // Removes the unpaired device from the paired device list regardless whether the listener exists or not.
+ (void) __pairedDeviceMap.Remove(address, true);
+ }
+ else
+ {
+ r = GetLastResult();
+ }
+
+ __pairedDevMapMutex.Release();
+
+ if (isFired)
+ {
+ _BluetoothDeviceEventArg* pArg = new (std::nothrow) _BluetoothDeviceEventArg(_BT_DEVICE_EVENT_UNPAIRED, *pResultDevice);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ __pDevEvent->FireAsync(*pArg);
+ }
+ }
+
+ delete pResultDevice;
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred in the unpaired callback.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [PairingState:%s], [UNPAIRED_Event:%s]",
+ GetStringOfCurrentState(), GetStringOfPairingState(), isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothManagerImpl::OnBluetoothDeviceConnected(const Tizen::Base::ByteBuffer& address)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ bool isFired = false;
+
+ _BluetoothConnectionEventArg* pArg = new (std::nothrow) _BluetoothConnectionEventArg(_BT_CONNECTION_EVENT_CONNECTED, address);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ }
+ else
+ {
+ __pConEvent->FireAsync(*pArg);
+ isFired = true;
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [CONNECTED_Event:%s]",
+ GetStringOfCurrentState(), isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothManagerImpl::OnBluetoothDeviceDisconnected(const Tizen::Base::ByteBuffer& address)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ bool isFired = false;
+
+ _BluetoothConnectionEventArg* pArg = new (std::nothrow) _BluetoothConnectionEventArg(_BT_CONNECTION_EVENT_DISCONNECTED, address);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ }
+ else
+ {
+ __pConEvent->FireAsync(*pArg);
+ isFired = true;
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [DISCONNECTED_Event:%s]",
+ GetStringOfCurrentState(), isFired ? "Fired" : "NotFired");
+}
+
+result
+_BluetoothManagerImpl::RefreshPairedDeviceMap(void)
+{
+ result r = E_SUCCESS;
+ BluetoothDevice* pPairedDevice = null;
+ ByteBuffer* pKeyAddress = null;
+ IList* pList = null;
+
+ pList = __pGapAdapter->GetAllPairedDeviceListN();
+ SysTryReturn(NID_NET_BT, pList != null, E_SYSTEM, E_SYSTEM,
+ "[E_SYSTEM] Internal error occurred on getting all paired device list from system.");
+
+ __pairedDevMapMutex.Acquire();
+
+ // remove all BluetoothDevice instance which the paired device map contains
+ __pairedDeviceMap.RemoveAll(true);
+
+ for (int i = 0; i < pList->GetCount(); i++)
+ {
+ pPairedDevice = (BluetoothDevice*) pList->GetAt(i);
+
+ pKeyAddress = new (std::nothrow) ByteBuffer();
+
+ if (pKeyAddress)
+ {
+ pKeyAddress->Construct(*(pPairedDevice->GetAddress()));
+
+ r = __pairedDeviceMap.Add(*pKeyAddress, *pPairedDevice);
+ if (r != E_SUCCESS)
+ {
+ // determines the exception type to be passed to the application.
+ // propagates only E_OUT_OF_MEMORY exception.
+ if (r != E_OUT_OF_MEMORY)
+ {
+ r = E_SYSTEM;
+ }
+
+ delete pKeyAddress;
+ break;
+ }
+ }
+ else
+ {
+ r = E_OUT_OF_MEMORY;
+ break;
+ }
+ }
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] Internal error occurred on getting all paired device list from system.", GetErrorMessage(r));
+ __pairedDeviceMap.RemoveAll(true);
+ }
+
+ __pairedDevMapMutex.Release();
+
+ delete pList;
+
+ return r;
+}
+
+const char*
+_BluetoothManagerImpl::GetStringOfCurrentState(void) const
+{
+ const char* pStateString = null;
+
+ switch (__currentState)
+ {
+ case _BT_MGR_STATE_DEACTIVATED:
+ pStateString = "DEACTIVATED";
+ break;
+
+ case _BT_MGR_STATE_ACTIVATING:
+ pStateString = "ACTIVATING";
+ break;
+
+ case _BT_MGR_STATE_DEACTIVATING:
+ pStateString = "DEACTIVATING";
+ break;
+
+ case _BT_MGR_STATE_ACTIVATED:
+ pStateString = "ACTIVATED";
+ break;
+
+ case _BT_MGR_STATE_DISCOVERY_REQUESTED:
+ pStateString = "DISCOVERY_REQUESTED";
+ break;
+
+ case _BT_MGR_STATE_ON_DISCOVERY:
+ pStateString = "ON_DISCOVERY";
+ break;
+
+ case _BT_MGR_STATE_DISCOVERY_CANCELING:
+ pStateString = "DISCOVERY_CANCELING";
+ break;
+
+ case _BT_MGR_STATE_ON_DISCOVERY_BY_SYSTEM:
+ pStateString = "ON_DISCOVERY_BY_SYSTEM";
+ break;
+
+ case _BT_MGR_STATE_SERVICE_RETRIEVING:
+ pStateString = "SERVICE_RETRIEVING";
+ break;
+
+ default:
+ pStateString = "Unknown";
+ break;
+ }
+
+ return pStateString;
+}
+
+const char*
+_BluetoothManagerImpl::GetStringOfPairingState(void) const
+{
+ const char* pStateString = null;
+
+ switch (__pairingState)
+ {
+ case _BT_PAIRING_STATE_NONE:
+ pStateString = "NONE";
+ break;
+
+ case _BT_PAIRING_STATE_PAIRING:
+ pStateString = "PAIRING";
+ break;
+
+ case _BT_PAIRING_STATE_CANCELING:
+ pStateString = "CANCELING";
+ break;
+
+ default:
+ pStateString = "Unknown";
+ break;
+ }
+
+ return pStateString;
+}
+
+_BluetoothManagerImpl*
+_BluetoothManagerImpl::GetInstance(BluetoothManager& bluetoothManager)
+{
+ return bluetoothManager.__pImpl;
+}
+
+const _BluetoothManagerImpl*
+_BluetoothManagerImpl::GetInstance(const BluetoothManager& bluetoothManager)
+{
+ return bluetoothManager.__pImpl;
+}
+
+} } } // Tizen::Net::Bluetooth
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+_OSP_EXPORT_ result
+_BluetoothManagerImpl_Activate(void)
+{
+ Tizen::Net::Bluetooth::_BluetoothGapSystemAdapter* pGapAdapter =
+ Tizen::Net::Bluetooth::_BluetoothGapSystemAdapter::GetInstance();
+ SysTryReturnResult(NID_NET_BT, pGapAdapter != null, E_OUT_OF_MEMORY,
+ "Failed to get an instance of _BluetoothGapSystemAdapter.");
+
+ return pGapAdapter->Activate();
+}
+
+_OSP_EXPORT_ result
+_BluetoothManagerImpl_Deactivate(void)
+{
+ Tizen::Net::Bluetooth::_BluetoothGapSystemAdapter* pGapAdapter =
+ Tizen::Net::Bluetooth::_BluetoothGapSystemAdapter::GetInstance();
+ SysTryReturnResult(NID_NET_BT, pGapAdapter != null, E_OUT_OF_MEMORY,
+ "Failed to get an instance of _BluetoothGapSystemAdapter.");
+
+ return pGapAdapter->Deactivate();
+}
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/src/FNetBt_BluetoothOppClientEvent.cpp b/src/FNetBt_BluetoothOppClientEvent.cpp
new file mode 100644
index 0000000..4aa4c83
--- /dev/null
+++ b/src/FNetBt_BluetoothOppClientEvent.cpp
@@ -0,0 +1,81 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothOppClientEvent.cpp
+// @brief This is the implementation file for the _BluetoothOppClientEvent class.
+//
+
+#include <FBaseRtIEventListener.h>
+#include <FBaseSysLog.h>
+#include <FBaseRtIEventArg.h>
+#include "FNetBt_BluetoothOppClientEvent.h"
+#include "FNetBt_BluetoothOppClientEventArg.h"
+#include "FNetBtIBluetoothOppClientEventListener.h"
+
+
+using namespace Tizen::Base;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+_BluetoothOppClientEvent::_BluetoothOppClientEvent(void)
+{
+}
+
+_BluetoothOppClientEvent::~_BluetoothOppClientEvent(void)
+{
+}
+
+result
+_BluetoothOppClientEvent::Construct(void)
+{
+ return _Event::Initialize();
+}
+
+void
+_BluetoothOppClientEvent::FireImpl(Tizen::Base::Runtime::IEventListener& listener, const Tizen::Base::Runtime::IEventArg& arg)
+{
+ IBluetoothOppClientEventListener* pListener = dynamic_cast <IBluetoothOppClientEventListener*>(&listener);
+ SysTryReturnVoidResult(NID_NET_BT, pListener != null, E_INVALID_ARG, "[E_INVALID_ARG] The listener argument is invalid.");
+
+ const _BluetoothOppClientEventArg* pEventArg = dynamic_cast <const _BluetoothOppClientEventArg*>(&arg);
+ SysTryReturnVoidResult(NID_NET_BT, pEventArg != null, E_INVALID_ARG, "[E_INVALID_ARG] The event argument is invalid type.");
+
+ _BluetoothOppClientEventType eventType = pEventArg->GetEventType();
+
+ switch (eventType)
+ {
+ case _BT_OPP_CLIENT_EVENT_PUSH_RESPONDED:
+ SysLog(NID_NET_BT, "Firing Bluetooth OPP Client Event (Type: _BT_OPP_CLIENT_EVENT_PUSH_RESPONDED)");
+ pListener->OnOppPushResponded(pEventArg->GetErrorResult());
+ break;
+
+ case _BT_OPP_CLIENT_EVENT_TRANSFER_DONE:
+ SysLog(NID_NET_BT, "Firing Bluetooth OPP Client Event (Type: _BT_OPP_CLIENT_EVENT_TRANSFER_DONE)");
+ pListener->OnOppTransferDone(pEventArg->GetFilePath(), pEventArg->GetFileSize(), pEventArg->IsTransferCompleted());
+ break;
+
+ case _BT_OPP_CLIENT_EVENT_TRANSFER_PROGRESS:
+ SysLog(NID_NET_BT, "Firing Bluetooth OPP Client Event (Type: _BT_OPP_CLIENT_EVENT_TRANSFER_PROGRESS)");
+ pListener->OnOppTransferInProgress(pEventArg->GetPercent());
+ break;
+
+ default:
+ break;
+ }
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothOppClientEvent.h b/src/FNetBt_BluetoothOppClientEvent.h
new file mode 100644
index 0000000..0285569
--- /dev/null
+++ b/src/FNetBt_BluetoothOppClientEvent.h
@@ -0,0 +1,81 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothOppClientEvent.h
+ * @brief This is the header file for the _BluetoothOppClientEvent class.
+ *
+ * This header file contains the declarations of the _BluetoothOppClientEvent class.
+ * The _BluetoothOppClientEvent class can call a method of a listener (IBluetoothOppClientEventListener object).
+ * So, when a device event is occurred, listener instances can handle it appropriately.
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_OPP_CLIENT_EVENT_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_OPP_CLIENT_EVENT_H_
+
+#include <FOspConfig.h>
+#include <FBaseResult.h>
+#include <FBaseRt_Event.h>
+
+// Forward declaration
+namespace Tizen { namespace Base { namespace Runtime
+{
+class IEventListener;
+class IEventArg;
+} } }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+//
+// @class _BluetoothOppClientEvent
+// @brief This class handles Bluetooth OPP Client events.
+//
+// When a Bluetooth device event occurs, the _BluetoothOppClientEvent object finds a IBluetoothOppClientEventListener
+// object and calls an appropriate method of the listener.
+//
+class _BluetoothOppClientEvent
+ : public Tizen::Base::Runtime::_Event
+{
+public:
+ _BluetoothOppClientEvent(void);
+ virtual ~_BluetoothOppClientEvent(void);
+
+ result Construct(void);
+
+protected:
+ /**
+ * Checks the argument and finds out the type of event. After that, this method calls appropriate pListener's method.
+ *
+ * @return A result code.
+ * @param[in] pListener An event listener related to this Bluetooth OPP Client event.
+ * @param[in] arg An event argument including information to be passed to the event listeners
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_ARG The argument passed to a method contains invalid values.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ virtual void FireImpl(Tizen::Base::Runtime::IEventListener& listener, const Tizen::Base::Runtime::IEventArg& arg);
+
+private:
+ _BluetoothOppClientEvent(const _BluetoothOppClientEvent& value);
+ _BluetoothOppClientEvent& operator =(const _BluetoothOppClientEvent& rhs);
+
+private:
+ bool __isServerEvent;
+
+}; // _BluetoothOppClientEvent
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_OPP_CLIENT_EVENT_H_
diff --git a/src/FNetBt_BluetoothOppClientEventArg.cpp b/src/FNetBt_BluetoothOppClientEventArg.cpp
new file mode 100644
index 0000000..8871e8e
--- /dev/null
+++ b/src/FNetBt_BluetoothOppClientEventArg.cpp
@@ -0,0 +1,110 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothOppClientEventArg.cpp
+// @brief This is the implementation file for the _BluetoothOppClientEventArg class.
+//
+
+#include <FNetBtBluetoothDevice.h>
+#include <FBaseSysLog.h>
+#include "FNetBt_BluetoothOppClientEventArg.h"
+
+
+using namespace Tizen::Base;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+//
+// This is a class constructor for _BT_OPP_CLIENT_EVENT_PUSH_RESPONDED event.
+//
+_BluetoothOppClientEventArg::_BluetoothOppClientEventArg(result r)
+ : __evtType(_BT_OPP_CLIENT_EVENT_PUSH_RESPONDED)
+ , __result(r)
+ , __filePath()
+ , __fileSize(0)
+ , __isCompleted(true)
+ , __percent(0)
+{
+}
+
+//
+// This is a class constructor for _BT_OPP_CLIENT_EVENT_TRANSFER_DONE event.
+//
+_BluetoothOppClientEventArg::_BluetoothOppClientEventArg(const Tizen::Base::String& filePath, int fileSize, bool isCompleted)
+ : __evtType(_BT_OPP_CLIENT_EVENT_TRANSFER_DONE)
+ , __result(E_SUCCESS)
+ , __filePath(filePath)
+ , __fileSize(fileSize)
+ , __isCompleted(isCompleted)
+ , __percent(0)
+{
+}
+
+//
+// This is a class constructor for _BT_OPP_CLIENT_EVENT_TRANSFER_PROGRESS event.
+//
+_BluetoothOppClientEventArg::_BluetoothOppClientEventArg(int percent)
+ : __evtType(_BT_OPP_CLIENT_EVENT_TRANSFER_PROGRESS)
+ , __result(E_SUCCESS)
+ , __filePath()
+ , __fileSize(0)
+ , __isCompleted(true)
+ , __percent(percent)
+{
+}
+
+_BluetoothOppClientEventArg::~_BluetoothOppClientEventArg(void)
+{
+}
+
+_BluetoothOppClientEventType
+_BluetoothOppClientEventArg::GetEventType(void) const
+{
+ return __evtType;
+}
+
+result
+_BluetoothOppClientEventArg::GetErrorResult(void) const
+{
+ return __result;
+}
+
+Tizen::Base::String
+_BluetoothOppClientEventArg::GetFilePath(void) const
+{
+ return __filePath;
+}
+
+int
+_BluetoothOppClientEventArg::GetFileSize(void) const
+{
+ return __fileSize;
+}
+
+bool
+_BluetoothOppClientEventArg::IsTransferCompleted(void) const
+{
+ return __isCompleted;
+}
+
+int
+_BluetoothOppClientEventArg::GetPercent(void) const
+{
+ return __percent;
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothOppClientEventArg.h b/src/FNetBt_BluetoothOppClientEventArg.h
new file mode 100644
index 0000000..22988de
--- /dev/null
+++ b/src/FNetBt_BluetoothOppClientEventArg.h
@@ -0,0 +1,153 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothOppClientEventArg.h
+ * @brief This is the header file for the _BluetoothOppClientEventArg class.
+ *
+ * This header file contains the declarations of the _BluetoothOppClientEventArg class which includes information to be
+ * passed to the event listeners
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_OPP_CLIENT_EVENT_ARG_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_OPP_CLIENT_EVENT_ARG_H_
+
+#include <FBaseObject.h>
+#include <FBaseResult.h>
+#include <FBaseString.h>
+#include <FOspConfig.h>
+#include <FBaseRtIEventArg.h>
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// Forward declaration
+class BluetoothDevice;
+
+/**
+ * @enum _BluetoothOppClientEventType
+ * Type for specifying the type of _BluetoothOppClientEvent
+ */
+enum _BluetoothOppClientEventType
+{
+ _BT_OPP_CLIENT_EVENT_PUSH_RESPONDED, /**< For notifying the OPP server responded to the push request */
+ _BT_OPP_CLIENT_EVENT_TRANSFER_DONE, /**< For notifying the file transfer has finished */
+ _BT_OPP_CLIENT_EVENT_TRANSFER_PROGRESS, /**< For notifying the file is being transferred */
+};
+
+/**
+ * @class _BluetoothOppClientEventArg
+ * @brief This class is used as an argument for callback methods of the _IBluetoothOppClientEventListener class.
+ *
+ * When a _BluetoothOppClientEvent occurs, the _BluetoothOppClientEvent finds a _IBluetoothOppClientEventListener instance
+ * which is registered for the _BluetoothOppClientEvent and calls an appropriate method of the listener.
+ * @see _IBluetoothOppClientEventListener
+ */
+class _BluetoothOppClientEventArg
+ : public Tizen::Base::Object
+ , public Tizen::Base::Runtime::IEventArg
+{
+public:
+ /**
+ * This is a class constructor for _BT_OPP_CLIENT_EVENT_PUSH_RESPONDED event.
+ *
+ * @param[in] r The result of the event
+ * @exception E_SUCCESS The connection is established successfully.
+ * @exception E_SYSTEM The connection fails.
+ */
+ _BluetoothOppClientEventArg(result r);
+
+ /**
+ * This is a class constructor for _BT_OPP_CLIENT_EVENT_TRANSFER_DONE event.
+ *
+ * @param[in] filePath The path of the transferred file
+ * @param[in] fileSize The size of the transferred file
+ * @param[in] isCompleted Set to @c true if the transfer is successfully completed, @n
+ * else @c false
+ */
+ _BluetoothOppClientEventArg(const Tizen::Base::String& filePath, int fileSize, bool isCompleted);
+
+ /**
+ * This is a class constructor for _BT_OPP_CLIENT_EVENT_TRANSFER_PROGRESS event.
+ *
+ * @param[in] percent The progress in percentage ranging from @c 1 to @c 100 percent
+ */
+ _BluetoothOppClientEventArg(int percent);
+
+ /**
+ * This is the class destructor.
+ */
+ ~_BluetoothOppClientEventArg(void);
+
+ /**
+ * Gets the type of this event.
+ *
+ * @return The type of the event
+ */
+ _BluetoothOppClientEventType GetEventType(void) const;
+
+ /**
+ * Gets the error result of this event.
+ *
+ * @return The result of the event
+ */
+ result GetErrorResult(void) const;
+
+ /**
+ * Gets the sent file path.
+ *
+ * @return The sent file path
+ */
+ Tizen::Base::String GetFilePath(void) const;
+
+ /**
+ * Gets the sent file size.
+ *
+ * @return The sent file size
+ */
+ int GetFileSize(void) const;
+
+ /**
+ * Is the file transfer completed.
+ *
+ * @return @c true if the transfer is successfully completed, @n
+ * else @c false
+ */
+ bool IsTransferCompleted(void) const;
+
+ /**
+ * Gets the progress information as a type of percentage.
+ *
+ * @return The percentage that represents the progress of file transfer
+ */
+ int GetPercent(void) const;
+
+private:
+ _BluetoothOppClientEventArg(void);
+ _BluetoothOppClientEventArg(const _BluetoothOppClientEventArg& eventArg);
+ _BluetoothOppClientEventArg& operator =(const _BluetoothOppClientEventArg& rValue);
+
+private:
+ _BluetoothOppClientEventType __evtType;
+ result __result;
+ Tizen::Base::String __filePath;
+ int __fileSize;
+ bool __isCompleted;
+ int __percent;
+
+}; // _BluetoothOppClientEventArg
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_OPP_CLIENT_EVENT_ARG_H_
diff --git a/src/FNetBt_BluetoothOppClientImpl.cpp b/src/FNetBt_BluetoothOppClientImpl.cpp
new file mode 100755
index 0000000..7ca3029
--- /dev/null
+++ b/src/FNetBt_BluetoothOppClientImpl.cpp
@@ -0,0 +1,583 @@
+//
+// Open Service Platform
+// 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 FNetBtBluetoothOppClientImpl.cpp
+// @brief This is the implementation file for the _BluetoothOppClientImpl class.
+//
+
+#include <FNetBtBluetoothTypes.h>
+#include <FNetBtBluetoothDevice.h>
+#include <FNetBtIBluetoothOppClientEventListener.h>
+#include <FBaseSysLog.h>
+#include <FIo_FileImpl.h>
+#include <FApp_AppInfo.h>
+#include "FNetBt_BluetoothOppClientImpl.h"
+#include "FNetBt_BluetoothOppSystemAdapter.h"
+#include "FNetBt_BluetoothGapSystemAdapter.h"
+#include "FNetBt_BluetoothOppClientEvent.h"
+#include "FNetBt_BluetoothOppClientEventArg.h"
+
+using namespace std;
+using namespace Tizen::App;
+using namespace Tizen::Base;
+using namespace Tizen::Base::Runtime;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+_BluetoothOppClientImpl::_BluetoothOppClientImpl(void)
+ : __pGapAdapter(null)
+ , __pOppAdapter(null)
+ , __pEvent(null)
+ , __stateMutex()
+ , __currentState(_BT_OPP_CLI_STATE_DISABLED)
+ , __pairingAddress()
+ , __pushedFilePath()
+ , __minProgressInterval(__defaultProgressInterval)
+ , __previousProgress(0)
+{
+}
+
+_BluetoothOppClientImpl::~_BluetoothOppClientImpl(void)
+{
+ if (__pOppAdapter != null)
+ {
+ if ((__currentState == _BT_OPP_CLI_STATE_PUSH_READY)
+ || (__currentState == _BT_OPP_CLI_STATE_ON_TRANSFER))
+ {
+ (void) CancelPush();
+ }
+ }
+
+ if (__pGapAdapter != null)
+ {
+ __pGapAdapter->UnregisterManagerEventListener(*this);
+ __pGapAdapter->UnregisterDeviceEventListener(*this);
+ }
+}
+
+result
+_BluetoothOppClientImpl::Construct(IBluetoothOppClientEventListener& listener)
+{
+ result r = E_SUCCESS;
+ std::unique_ptr<_BluetoothOppClientEvent> pEvent;
+
+ r = __stateMutex.Create();
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to create the state mutex.");
+
+ r = __pairingAddress.Construct(_BT_ADDRESS_LENGTH);
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to construct the address for pairing.");
+
+ __pGapAdapter = _BluetoothGapSystemAdapter::GetInstance();
+ SysTryReturn(NID_NET_BT, __pGapAdapter != null, E_SYSTEM, E_SYSTEM,
+ "[E_SYSTEM] Failed to invoke _BluetoothGapSystemAdapter::GetInstance().");
+
+ __pOppAdapter = _BluetoothOppSystemAdapter::GetInstance();
+
+ pEvent.reset(new (std::nothrow) _BluetoothOppClientEvent());
+ SysTryReturn(NID_NET_BT, pEvent != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ r = pEvent->Construct();
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to construct the event.");
+ // add the IBluetoothOppClientEventListener instance to a new created _BluetoothOppClientEvent.
+ r = pEvent->AddListener(listener, true);
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
+ "[%s] Propagating. Failed to add the application listener for OPP client", GetErrorMessage(r));
+
+ // registers this callback listener to the system adapter for activation/deactivation event
+ r = __pGapAdapter->RegisterManagerEventListener(*this, true);
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
+ "[E_SYSTEM] Failed to register the callback listener to _BluetoothGapSystemAdapter.");
+
+ // registers this callback listener to the system adapter for paired event
+ r = __pGapAdapter->RegisterDeviceEventListener(*this);
+ if (r != E_SUCCESS)
+ {
+ __pGapAdapter->UnregisterManagerEventListener(*this);
+ }
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
+ "[E_SYSTEM] Failed to register the callback listener to _BluetoothGapSystemAdapter.");
+
+ // checks whether the Bluetooth is available
+ __stateMutex.Acquire();
+
+ if (__pGapAdapter->IsActivated() == true)
+ {
+ __currentState = _BT_OPP_CLI_STATE_IDLE;
+ }
+
+ __stateMutex.Release();
+
+ __pEvent = move(pEvent);
+
+ return E_SUCCESS;
+}
+
+
+result
+_BluetoothOppClientImpl::PushFile(const BluetoothDevice& remoteDevice, const Base::String& filePath)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_FAILURE;
+ String physicalPath;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_OPP_CLI_STATE_DISABLED:
+ r = E_INVALID_STATE;
+ break;
+
+ case _BT_OPP_CLI_STATE_IDLE:
+ if (_AppInfo::GetApiVersion() == _API_VERSION_2_0 && _AppInfo::IsOspCompat())
+ {
+ if (Tizen::Io::_FileImpl::ConvertVirtualToPhysicalPath(filePath, physicalPath) != E_SUCCESS)
+ {
+ r = E_INACCESSIBLE_PATH;
+ break;
+ }
+ }
+ else
+ {
+ physicalPath = filePath;
+ }
+
+ if (__pGapAdapter->IsPaired(*(remoteDevice.GetAddress())) == true)
+ {
+ r = __pOppAdapter->PushOppFile(*this, *(remoteDevice.GetAddress()), physicalPath);
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_OPP_CLI_STATE_PUSH_READY;
+ }
+ }
+ else
+ {
+ // start the pairing process
+ if (__pGapAdapter->Pair(*(remoteDevice.GetAddress())) == E_SUCCESS)
+ {
+ // copy the address of the pairing device to the local variable
+ __pairingAddress.SetArray(remoteDevice.GetAddress()->GetPointer(), 0, _BT_ADDRESS_LENGTH);
+ __pairingAddress.SetPosition(0);
+ // copy the file path to the local variable
+ __pushedFilePath.Clear();
+ __pushedFilePath = physicalPath;
+
+ r = E_SUCCESS;
+ __currentState = _BT_OPP_CLI_STATE_BONDING;
+ }
+ else
+ {
+ r = E_FAILURE;
+ }
+ }
+ break;
+
+ case _BT_OPP_CLI_STATE_BONDING:
+ case _BT_OPP_CLI_STATE_PUSH_READY:
+ case _BT_OPP_CLI_STATE_REQ_CANCELING: //TODO: this state should return E_INVALID_OPERATION. (Versioning)
+ case _BT_OPP_CLI_STATE_ON_TRANSFER:
+ case _BT_OPP_CLI_STATE_TRANS_CANCELING: //TODO: this state should return E_INVALID_OPERATION. (Versioning)
+ r = E_IN_PROGRESS;
+ break;
+
+ default:
+ // ignore other cases
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on pushing a file.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothOppClientImpl::CancelPush()
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_FAILURE;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_OPP_CLI_STATE_DISABLED:
+ r = E_INVALID_STATE;
+ break;
+
+ case _BT_OPP_CLI_STATE_IDLE:
+ r = E_INVALID_OPERATION;
+ break;
+
+ case _BT_OPP_CLI_STATE_REQ_CANCELING:
+ case _BT_OPP_CLI_STATE_TRANS_CANCELING:
+ r = E_IN_PROGRESS;
+ break;
+
+ case _BT_OPP_CLI_STATE_BONDING: //TODO: Versioning check
+ if (__pGapAdapter->CancelPair() == E_SUCCESS)
+ {
+ r = E_SUCCESS;
+ __currentState = _BT_OPP_CLI_STATE_REQ_CANCELING;
+ }
+ // It will be changed to IDLE after receiving the OnBluetoothPaired event.
+ break;
+
+ case _BT_OPP_CLI_STATE_PUSH_READY:
+ r = __pOppAdapter->CancelOppPush();
+
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_OPP_CLI_STATE_REQ_CANCELING;
+ }
+ // It will be changed to IDLE after receiving the OnOppTransferDone event.
+ break;
+
+ case _BT_OPP_CLI_STATE_ON_TRANSFER:
+ r = __pOppAdapter->CancelOppPush();
+
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_OPP_CLI_STATE_TRANS_CANCELING;
+ }
+ // It will be changed to IDLE after receiving the OnOppTransferDone event.
+ break;
+
+ default:
+ // ignore other cases
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on canceling the push.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothOppClientImpl::SetMinProgressInterval(int percent)
+{
+ result r = E_SUCCESS;
+
+ if ((percent < 1) || (percent > 100))
+ {
+ r = E_OUT_OF_RANGE;
+ SysLogException(NID_NET_BT, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The input argument - percent - is outside the valid range.");
+ }
+ else
+ {
+ __minProgressInterval = percent;
+ }
+
+ return r;
+}
+
+void
+_BluetoothOppClientImpl::OnBluetoothActivated(result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ __stateMutex.Acquire();
+
+ if ((__currentState == _BT_OPP_CLI_STATE_DISABLED)
+ && (r == E_SUCCESS))
+ {
+ __currentState = _BT_OPP_CLI_STATE_IDLE;
+ }
+
+ __stateMutex.Release();
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s]", GetStringOfCurrentState());
+}
+
+void
+_BluetoothOppClientImpl::OnBluetoothDeactivated(result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ __stateMutex.Acquire();
+
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_OPP_CLI_STATE_DISABLED;
+ }
+
+ __stateMutex.Release();
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s]", GetStringOfCurrentState());
+}
+
+void
+_BluetoothOppClientImpl::OnOppPushResponded(result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ bool isFired = false;
+
+ __stateMutex.Acquire();
+
+ if ((__currentState == _BT_OPP_CLI_STATE_PUSH_READY) || (__currentState == _BT_OPP_CLI_STATE_REQ_CANCELING))
+ {
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_OPP_CLI_STATE_ON_TRANSFER;
+ }
+ else // including both cases of being canceled by the user and rejected by the remote device
+ {
+ __currentState = _BT_OPP_CLI_STATE_IDLE;
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on the response of the OPP push request.", GetErrorMessage(r));
+ }
+
+ isFired = true;
+ }
+
+ __stateMutex.Release();
+
+ if (isFired)
+ {
+ _BluetoothOppClientEventArg* pArg = new (std::nothrow) _BluetoothOppClientEventArg(r);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ __pEvent->FireAsync(*pArg);
+ }
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [PUSH_RESPONDED_Event:%s]",
+ GetStringOfCurrentState(), isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothOppClientImpl::OnOppTransferInProgress(int percent)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [Progress:%d]", GetStringOfCurrentState(), percent);
+
+ bool isFired = false;
+
+ __stateMutex.Acquire();
+
+ if ((__currentState == _BT_OPP_CLI_STATE_ON_TRANSFER) || (__currentState == _BT_OPP_CLI_STATE_TRANS_CANCELING))
+ {
+ if (((percent - __previousProgress) >= __minProgressInterval) || (percent >= 100))
+ {
+ isFired = true;
+ __previousProgress = percent;
+ }
+ }
+
+ __stateMutex.Release();
+
+ if (isFired)
+ {
+ _BluetoothOppClientEventArg* pArg = new (std::nothrow) _BluetoothOppClientEventArg(percent);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ __pEvent->FireAsync(*pArg);
+ }
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [TRANSFER_IN_PROGRESS_Event:%s]",
+ GetStringOfCurrentState(), isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothOppClientImpl::OnOppTransferDone(const Tizen::Base::String& filePath, int fileSize, bool isCompleted)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [filePath:%ls], [fileSize:%d], [%s]",
+ GetStringOfCurrentState(), filePath.GetPointer(), fileSize, isCompleted ? "Completed" : "Incompleted");
+
+ bool isFired = false;
+ String pushedFilePath;
+ result r = E_SUCCESS;
+
+ __stateMutex.Acquire();
+
+ if ((__currentState == _BT_OPP_CLI_STATE_ON_TRANSFER) || (__currentState == _BT_OPP_CLI_STATE_TRANS_CANCELING))
+ {
+ __currentState = _BT_OPP_CLI_STATE_IDLE;
+ isFired = true;
+ __previousProgress = 0; // initialization for the next push transaction
+ }
+
+ __stateMutex.Release();
+
+ if (_AppInfo::GetApiVersion() == _API_VERSION_2_0 && _AppInfo::IsOspCompat())
+ {
+ r = Tizen::Io::_FileImpl::ConvertPhysicalToVirtualPath(__pushedFilePath, pushedFilePath);
+ if(r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on converting the file path from physical to virtual.", GetErrorMessage(r));
+ pushedFilePath = __pushedFilePath;
+ }
+ }
+ else
+ {
+ pushedFilePath = __pushedFilePath;
+ }
+
+ if (isFired)
+ {
+ _BluetoothOppClientEventArg* pArg = new (std::nothrow) _BluetoothOppClientEventArg(pushedFilePath, fileSize, isCompleted);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ __pEvent->FireAsync(*pArg);
+ }
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [TRANSFER_DONE_Event:%s]",
+ GetStringOfCurrentState(), isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothOppClientImpl::OnBluetoothPaired(const BluetoothDevice* pPairedDevice, result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ bool isFired = false;
+ result responseResult = E_SYSTEM;
+
+ __stateMutex.Acquire();
+
+ if (pPairedDevice->GetAddress()->Equals(__pairingAddress))
+ {
+ if (__currentState == _BT_OPP_CLI_STATE_BONDING)
+ {
+ if (r == E_SUCCESS)
+ {
+ if (__pOppAdapter->PushOppFile(*this, __pairingAddress, __pushedFilePath) == E_SUCCESS)
+ {
+ __currentState = _BT_OPP_CLI_STATE_PUSH_READY;
+ }
+ else
+ {
+ // callback responded with E_SYSTEM
+ isFired = true;
+ __currentState = _BT_OPP_CLI_STATE_IDLE;
+ responseResult = E_SYSTEM;
+ }
+ }
+ else
+ {
+ // callback responded with r
+ isFired = true;
+ __currentState = _BT_OPP_CLI_STATE_IDLE;
+ responseResult = r;
+ }
+
+ __pairingAddress.Clear();
+ }
+ else if (__currentState == _BT_OPP_CLI_STATE_REQ_CANCELING)
+ {
+ // callback responded with E_SYSTEM or E_OPERATION_CANCELED
+ isFired = true;
+ __currentState = _BT_OPP_CLI_STATE_IDLE;
+ responseResult = E_SYSTEM;
+ }
+ }
+ // ignored otherwise
+
+ __stateMutex.Release();
+
+ if (isFired)
+ {
+ _BluetoothOppClientEventArg* pArg = new (std::nothrow) _BluetoothOppClientEventArg(responseResult);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ __pEvent->FireAsync(*pArg);
+ }
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [PUSH_RESPONDED_Event:%s]",
+ GetStringOfCurrentState(), isFired ? "Fired" : "NotFired");
+}
+
+const char*
+_BluetoothOppClientImpl::GetStringOfCurrentState(void) const
+{
+ const char* pStateString = null;
+
+ switch (__currentState)
+ {
+ case _BT_OPP_CLI_STATE_DISABLED:
+ pStateString = "DISABLED";
+ break;
+
+ case _BT_OPP_CLI_STATE_IDLE:
+ pStateString = "IDLE";
+ break;
+
+ case _BT_OPP_CLI_STATE_BONDING:
+ pStateString = "BONDING";
+ break;
+
+ case _BT_OPP_CLI_STATE_PUSH_READY:
+ pStateString = "PUSH_READY";
+ break;
+
+ case _BT_OPP_CLI_STATE_REQ_CANCELING:
+ pStateString = "REQ_CANCELING";
+ break;
+
+ case _BT_OPP_CLI_STATE_ON_TRANSFER:
+ pStateString = "ON_TRANSFER";
+ break;
+
+ case _BT_OPP_CLI_STATE_TRANS_CANCELING:
+ pStateString = "TRANS_CANCELING";
+ break;
+
+ default:
+ pStateString = "Unknown";
+ break;
+ }
+
+ return pStateString;
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothOppServerEvent.cpp b/src/FNetBt_BluetoothOppServerEvent.cpp
new file mode 100644
index 0000000..0d51dac
--- /dev/null
+++ b/src/FNetBt_BluetoothOppServerEvent.cpp
@@ -0,0 +1,87 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothOppServerEvent.cpp
+// @brief This is the implementation file for the _BluetoothOppServerEvent class.
+//
+
+#include <FBaseRtIEventListener.h>
+#include <FBaseSysLog.h>
+#include <FBaseRtIEventArg.h>
+#include "FNetBt_BluetoothOppServerEvent.h"
+#include "FNetBt_BluetoothOppServerEventArg.h"
+#include "FNetBtIBluetoothOppServerEventListener.h"
+
+
+using namespace Tizen::Base;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+_BluetoothOppServerEvent::_BluetoothOppServerEvent(void)
+{
+}
+
+_BluetoothOppServerEvent::~_BluetoothOppServerEvent(void)
+{
+}
+
+result
+_BluetoothOppServerEvent::Construct(void)
+{
+ return _Event::Initialize();
+}
+
+void
+_BluetoothOppServerEvent::FireImpl(Tizen::Base::Runtime::IEventListener& listener, const Tizen::Base::Runtime::IEventArg& arg)
+{
+ const BluetoothDevice* pDevice = null;
+
+ IBluetoothOppServerEventListener* pListener = dynamic_cast <IBluetoothOppServerEventListener*>(&listener);
+ SysTryReturnVoidResult(NID_NET_BT, pListener != null, E_INVALID_ARG, "[E_INVALID_ARG] The listener argument is invalid.");
+
+ const _BluetoothOppServerEventArg* pEventArg = dynamic_cast <const _BluetoothOppServerEventArg*>(&arg);
+ SysTryReturnVoidResult(NID_NET_BT, pEventArg != null, E_INVALID_ARG, "[E_INVALID_ARG] The event argument is invalid type.");
+
+ _BluetoothOppServerEventType eventType = pEventArg->GetEventType();
+
+ switch (eventType)
+ {
+ case _BT_OPP_SERVER_EVENT_PUSH_REQUESTED:
+ pDevice = pEventArg->GetRequester();
+ if (pDevice != null)
+ {
+ SysLog(NID_NET_BT, "Firing Bluetooth OPP Server Event (Type: _BT_OPP_SERVER_EVENT_PUSH_REQUESTED)");
+ pListener->OnOppPushRequested(*pDevice);
+ }
+ break;
+
+ case _BT_OPP_SERVER_EVENT_TRANSFER_DONE:
+ SysLog(NID_NET_BT, "Firing Bluetooth OPP Server Event (Type: _BT_OPP_SERVER_EVENT_TRANSFER_DONE)");
+ pListener->OnOppTransferDone(pEventArg->GetFileName(), pEventArg->GetFileSize(), pEventArg->IsTransferCompleted());
+ break;
+
+ case _BT_OPP_SERVER_EVENT_TRANSFER_PROGRESS:
+ SysLog(NID_NET_BT, "Firing Bluetooth OPP Server Event (Type: _BT_OPP_SERVER_EVENT_TRANSFER_PROGRESS)");
+ pListener->OnOppTransferInProgress(pEventArg->GetPercent());
+ break;
+
+ default:
+ break;
+ }
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothOppServerEvent.h b/src/FNetBt_BluetoothOppServerEvent.h
new file mode 100644
index 0000000..df6cd3b
--- /dev/null
+++ b/src/FNetBt_BluetoothOppServerEvent.h
@@ -0,0 +1,78 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothOppServerEvent.h
+ * @brief This is the header file for the _BluetoothOppServerEvent class.
+ *
+ * This header file contains the declarations of the _BluetoothOppServerEvent class.
+ * The _BluetoothOppServerEvent class can call a method of a listener (_IBluetoothOppServerEventListener object).
+ * So, when a device event is occurred, listener instances can handle it appropriately.
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_OPP_SERVER_EVENT_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_OPP_SERVER_EVENT_H_
+
+#include <FOspConfig.h>
+#include <FBaseResult.h>
+#include <FBaseRt_Event.h>
+
+// Forward declaration
+namespace Tizen { namespace Base { namespace Runtime
+{
+class IEventListener;
+class IEventArg;
+} } }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+//
+// @class _BluetoothOppServerEvent
+// @brief This class handles Bluetooth OPP Server events.
+//
+// When a Bluetooth device event occurs, the _BluetoothOppServerEvent object finds a _IBluetoothOppServerEventListener object
+// and calls an appropriate method of the listener.
+//
+class _BluetoothOppServerEvent
+ : public Tizen::Base::Runtime::_Event
+{
+public:
+ _BluetoothOppServerEvent(void);
+ virtual ~_BluetoothOppServerEvent(void);
+
+ result Construct(void);
+
+protected:
+ /**
+ * Checks the argument and finds out the type of event. After that, this method calls appropriate pListener's method.
+ *
+ * @return A result code.
+ * @param[in] pListener An event listener related to this Bluetooth SPP Acceptor event.
+ * @param[in] arg An event argument including information to be passed to the event listeners
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_ARG The argument passed to a method contains invalid values.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ virtual void FireImpl(Tizen::Base::Runtime::IEventListener& listener, const Tizen::Base::Runtime::IEventArg& arg);
+
+private:
+ _BluetoothOppServerEvent(const _BluetoothOppServerEvent& value);
+ _BluetoothOppServerEvent& operator =(const _BluetoothOppServerEvent& rhs);
+
+}; // _BluetoothOppServerEvent
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_OPP_SERVER_EVENT_H_
diff --git a/src/FNetBt_BluetoothOppServerEventArg.cpp b/src/FNetBt_BluetoothOppServerEventArg.cpp
new file mode 100755
index 0000000..577184c
--- /dev/null
+++ b/src/FNetBt_BluetoothOppServerEventArg.cpp
@@ -0,0 +1,113 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothOppServerEventArg.cpp
+// @brief This is the implementation file for the _BluetoothOppServerEventArg class.
+//
+
+#include <FNetBtBluetoothDevice.h>
+#include <FBaseSysLog.h>
+#include "FNetBt_BluetoothOppServerEventArg.h"
+
+
+using namespace Tizen::Base;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+//
+// This is a class constructor for _BT_OPP_SERVER_EVENT_PUSH_REQUESTED event.
+//
+_BluetoothOppServerEventArg::_BluetoothOppServerEventArg(const BluetoothDevice& device)
+ : __evtType(_BT_OPP_SERVER_EVENT_PUSH_REQUESTED)
+ , __pRequester(null)
+ , __fileName()
+ , __fileSize(0)
+ , __isCompleted(true)
+ , __percent(0)
+{
+ __pRequester = new (std::nothrow) BluetoothDevice(device);
+ SysTryReturnVoidResult(NID_NET_BT, __pRequester != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+}
+
+//
+// This is a class constructor for _BT_OPP_SERVER_EVENT_TRANSFER_DONE event.
+//
+_BluetoothOppServerEventArg::_BluetoothOppServerEventArg(const Tizen::Base::String& fileName, int fileSize, bool isCompleted)
+ : __evtType(_BT_OPP_SERVER_EVENT_TRANSFER_DONE)
+ , __pRequester(null)
+ , __fileName(fileName)
+ , __fileSize(fileSize)
+ , __isCompleted(isCompleted)
+ , __percent(0)
+{
+}
+
+//
+// This is a class constructor for _BT_OPP_SERVER_EVENT_TRANSFER_PROGRESS event.
+//
+_BluetoothOppServerEventArg::_BluetoothOppServerEventArg(int percent)
+ : __evtType(_BT_OPP_SERVER_EVENT_TRANSFER_PROGRESS)
+ , __pRequester(null)
+ , __fileName()
+ , __fileSize(0)
+ , __isCompleted(true)
+ , __percent(percent)
+{
+}
+
+_BluetoothOppServerEventArg::~_BluetoothOppServerEventArg(void)
+{
+ delete __pRequester;
+}
+
+_BluetoothOppServerEventType
+_BluetoothOppServerEventArg::GetEventType(void) const
+{
+ return __evtType;
+}
+
+const BluetoothDevice*
+_BluetoothOppServerEventArg::GetRequester(void) const
+{
+ return __pRequester;
+}
+
+Tizen::Base::String
+_BluetoothOppServerEventArg::GetFileName(void) const
+{
+ return __fileName;
+}
+
+int
+_BluetoothOppServerEventArg::GetFileSize(void) const
+{
+ return __fileSize;
+}
+
+bool
+_BluetoothOppServerEventArg::IsTransferCompleted(void) const
+{
+ return __isCompleted;
+}
+
+int
+_BluetoothOppServerEventArg::GetPercent(void) const
+{
+ return __percent;
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothOppServerEventArg.h b/src/FNetBt_BluetoothOppServerEventArg.h
new file mode 100644
index 0000000..4160b4f
--- /dev/null
+++ b/src/FNetBt_BluetoothOppServerEventArg.h
@@ -0,0 +1,151 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothOppServerEventArg.h
+ * @brief This is the header file for the _BluetoothOppServerEventArg class.
+ *
+ * This header file contains the declarations of the _BluetoothOppServerEventArg class which includes information to be
+ * passed to the event listeners
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_OPP_SERVER_EVENT_ARG_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_OPP_SERVER_EVENT_ARG_H_
+
+#include <FBaseObject.h>
+#include <FBaseResult.h>
+#include <FBaseString.h>
+#include <FOspConfig.h>
+#include <FBaseRtIEventArg.h>
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// Forward declaration
+class BluetoothDevice;
+
+/**
+ * @enum _BluetoothOppServerEventType
+ * Type for specifying the type of _BluetoothOppServerEvent
+ */
+enum _BluetoothOppServerEventType
+{
+ _BT_OPP_SERVER_EVENT_PUSH_REQUESTED, /**< For notifying an incoming push request is received from a remote OPP client */
+ _BT_OPP_SERVER_EVENT_TRANSFER_PROGRESS, /**< For notifying the file transfer has finished */
+ _BT_OPP_SERVER_EVENT_TRANSFER_DONE /**< For notifying the file is being transferred */
+};
+
+/**
+ * @class _BluetoothOppServerEventArg
+ * @brief This class is used as an argument for callback methods of the IBluetoothOppServerEventListener class.
+ *
+ * When a _BluetoothOppServerEvent occurs, the _BluetoothOppServerEvent finds a IBluetoothOppServerEventListener instance
+ * which is registered for the _BluetoothOppServerEvent and calls an appropriate method of the listener.
+ * @see IBluetoothOppServerEventListener
+ */
+class _BluetoothOppServerEventArg
+ : public Tizen::Base::Object
+ , public Tizen::Base::Runtime::IEventArg
+{
+public:
+ /**
+ * This is a class constructor for _BT_OPP_SERVER_EVENT_PUSH_REQUESTED event.
+ *
+ * @param[in] device The OPP client device that requests the connection
+ */
+ _BluetoothOppServerEventArg(const BluetoothDevice& device);
+
+ /**
+ * This is a class constructor for _BT_OPP_SERVER_EVENT_TRANSFER_DONE event.
+ *
+ * @param[in] fileName The name of the transferred file
+ * @param[in] fileSize The size of the transferred file
+ * @param[in] isCompleted Set to @c true if the transfer is successfully completed, @n
+ * else @c false
+ */
+ _BluetoothOppServerEventArg(const Tizen::Base::String& fileName, int fileSize, bool isCompleted);
+
+ /**
+ * This is a class constructor for _BT_OPP_SERVER_EVENT_TRANSFER_PROGRESS event.
+ *
+ * @param[in] percent The progress in percentage ranging from @c 1 to @c 100 percent
+ */
+ _BluetoothOppServerEventArg(int percent);
+
+ /**
+ * This is the class destructor.
+ */
+ ~_BluetoothOppServerEventArg(void);
+
+ /**
+ * Gets the type of this event.
+ *
+ * @return The type of the event
+ */
+ _BluetoothOppServerEventType GetEventType(void) const;
+
+ /**
+ * Gets the OPP client device.
+ *
+ * @return The pointer of the OPP client device which request to connect
+ */
+ const BluetoothDevice* GetRequester(void) const;
+
+ /**
+ * Gets the received file name.
+ *
+ * @return The received file name
+ */
+ Tizen::Base::String GetFileName(void) const;
+
+ /**
+ * Gets the received file size.
+ *
+ * @return The received file size
+ */
+ int GetFileSize(void) const;
+
+ /**
+ * Is the file transfer completed.
+ *
+ * @return @c true if the transfer is successfully completed, @n
+ * else @c false
+ */
+ bool IsTransferCompleted(void) const;
+
+ /**
+ * Gets the progress information as a type of percentage.
+ *
+ * @return The percentage that represents the progress of file transfer
+ */
+ int GetPercent(void) const;
+
+private:
+ _BluetoothOppServerEventArg(void);
+ _BluetoothOppServerEventArg(const _BluetoothOppServerEventArg& eventArg);
+ _BluetoothOppServerEventArg& operator =(const _BluetoothOppServerEventArg& rValue);
+
+private:
+ _BluetoothOppServerEventType __evtType;
+ BluetoothDevice* __pRequester;
+ Tizen::Base::String __fileName;
+ int __fileSize;
+ bool __isCompleted;
+ int __percent;
+
+}; // _BluetoothOppServerEventArg
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_OPP_SERVER_EVENT_ARG_H_
diff --git a/src/FNetBt_BluetoothOppServerImpl.cpp b/src/FNetBt_BluetoothOppServerImpl.cpp
new file mode 100755
index 0000000..814c0ac
--- /dev/null
+++ b/src/FNetBt_BluetoothOppServerImpl.cpp
@@ -0,0 +1,663 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothOppServerImpl.cpp
+// @brief This is the implementation file for the _BluetoothOppServerImpl class.
+//
+
+#include <FNetBtBluetoothTypes.h>
+#include <FNetBtBluetoothDevice.h>
+#include <FNetBtIBluetoothOppServerEventListener.h>
+#include <FBaseSysLog.h>
+#include <FIo_FileImpl.h>
+#include <FApp_AppInfo.h>
+#include "FNetBt_BluetoothOppServerImpl.h"
+#include "FNetBt_BluetoothOppSystemAdapter.h"
+#include "FNetBt_BluetoothGapSystemAdapter.h"
+#include "FNetBt_BluetoothOppServerEvent.h"
+#include "FNetBt_BluetoothOppServerEventArg.h"
+
+using namespace std;
+using namespace Tizen::App;
+using namespace Tizen::Base;
+using namespace Tizen::Base::Runtime;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+_BluetoothOppServerImpl::_BluetoothOppServerImpl(void)
+ : __pGapAdapter(null)
+ , __pOppAdapter(null)
+ , __pEvent(null)
+ , __stateMutex()
+ , __currentState(_BT_OPP_SVR_STATE_DISABLED)
+ , __pushedFileName()
+ , __minProgressInterval(__defaultProgressInterval)
+ , __previousProgress(0)
+{
+}
+
+_BluetoothOppServerImpl::~_BluetoothOppServerImpl(void)
+{
+ if (__pOppAdapter != null)
+ {
+ if ((__currentState == _BT_OPP_SVR_STATE_ON_SERVICE)
+ || (__currentState == _BT_OPP_SVR_STATE_PUSH_REQUESTED)
+ || (__currentState == _BT_OPP_SVR_STATE_ON_TRANSFER))
+ {
+ (void) StopService(); // Ignores the result of this function.
+ }
+ __pOppAdapter = null;
+ }
+
+ if (__pGapAdapter != null)
+ {
+ __pGapAdapter->UnregisterManagerEventListener(*this);
+ __pGapAdapter = null;
+ }
+}
+
+result
+_BluetoothOppServerImpl::Construct(IBluetoothOppServerEventListener& listener)
+{
+ result r = E_SUCCESS;
+ unique_ptr<_BluetoothOppServerEvent> pEvent;
+
+ r = __stateMutex.Create();
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to create the state mutex.");
+
+ __pGapAdapter = _BluetoothGapSystemAdapter::GetInstance();
+ SysTryReturn(NID_NET_BT, __pGapAdapter != null, E_SYSTEM, E_SYSTEM,
+ "[E_SYSTEM] Failed to invoke _BluetoothSysteAdapter::GetInstance().");
+
+ __pOppAdapter = _BluetoothOppSystemAdapter::GetInstance();
+
+ pEvent.reset(new (std::nothrow) _BluetoothOppServerEvent());
+ SysTryReturn(NID_NET_BT, pEvent != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ r = pEvent->Construct();
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to construct the event.");
+ // add the IBluetoothOppServerEventListener instance to a new created _BluetoothOppServerEvent.
+ r = pEvent->AddListener(listener, true);
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
+ "[%s] Propagating. Failed to add the application listener for OPP Server", GetErrorMessage(r));
+
+ // registers this callback listener to the system adapter for activation/deactivation event
+ r = __pGapAdapter->RegisterManagerEventListener(*this, true);
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
+ "[E_SYSTEM] Failed to register the callback listener to _BluetoothSystemAdapter.");
+
+ // check whether the Bluetooth is available
+ __stateMutex.Acquire();
+
+ if (__pGapAdapter->IsActivated() == true)
+ {
+ __currentState = _BT_OPP_SVR_STATE_IDLE;
+ }
+
+ __stateMutex.Release();
+
+ __pEvent = move(pEvent);
+
+ return E_SUCCESS;
+}
+
+result
+_BluetoothOppServerImpl::AcceptPush(void)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_FAILURE;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_OPP_SVR_STATE_DISABLED:
+ r = E_INVALID_STATE;
+ break;
+
+ case _BT_OPP_SVR_STATE_IDLE:
+ case _BT_OPP_SVR_STATE_ON_SERVICE:
+ case _BT_OPP_SVR_STATE_ON_TRANSFER:
+ case _BT_OPP_SVR_STATE_ON_STOPPING:
+ r = E_INVALID_OPERATION;
+ break;
+
+ case _BT_OPP_SVR_STATE_PUSH_REQUESTED:
+ r = __pOppAdapter->AcceptOppPush(__pushedFileName);
+
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_OPP_SVR_STATE_ON_TRANSFER;
+ }
+ else
+ {
+ __currentState = _BT_OPP_SVR_STATE_ON_SERVICE;
+ }
+ break;
+
+ default:
+ // ignore other cases
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on accepting a push request.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothOppServerImpl::RejectPush(void)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_FAILURE;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_OPP_SVR_STATE_DISABLED:
+ r = E_INVALID_STATE;
+ break;
+
+ case _BT_OPP_SVR_STATE_IDLE:
+ case _BT_OPP_SVR_STATE_ON_SERVICE:
+ case _BT_OPP_SVR_STATE_ON_TRANSFER:
+ case _BT_OPP_SVR_STATE_ON_STOPPING:
+ r = E_INVALID_OPERATION;
+ break;
+
+ case _BT_OPP_SVR_STATE_PUSH_REQUESTED:
+ r = __pOppAdapter->RejectOppPush();
+
+ // change the state into ON_SERVICE regardless of the result
+ __currentState = _BT_OPP_SVR_STATE_ON_SERVICE;
+ break;
+
+ default:
+ // ignore other cases
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on rejecting a push request.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothOppServerImpl::SetDestinationPath(const Tizen::Base::String& dstPath)
+{
+ result r = E_INVALID_OPERATION;
+ String physicalPath;
+
+ if ((__currentState != _BT_OPP_SVR_STATE_ON_TRANSFER) &&
+ (__currentState != _BT_OPP_SVR_STATE_ON_STOPPING))
+ {
+ if (_AppInfo::GetApiVersion() == _API_VERSION_2_0 && _AppInfo::IsOspCompat())
+ {
+ if (Tizen::Io::_FileImpl::ConvertVirtualToPhysicalPath(dstPath, physicalPath) != E_SUCCESS)
+ {
+ r = E_INACCESSIBLE_PATH;
+ }
+ else
+ {
+ r = __pOppAdapter->SetOppReceivePath(physicalPath);
+ }
+ }
+ else
+ {
+ r = __pOppAdapter->SetOppReceivePath(dstPath);
+ }
+ }
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on setting the destination path.", GetErrorMessage(r));
+ }
+
+ return r;
+}
+
+result
+_BluetoothOppServerImpl::SetMinProgressInterval(int percent)
+{
+ result r = E_SUCCESS;
+
+ if ((percent < 1) || (percent > 100))
+ {
+ r = E_OUT_OF_RANGE;
+ SysLogException(NID_NET_BT, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The input argument - percent - is outside the valid range.");
+ }
+ else
+ {
+ __minProgressInterval = percent;
+ }
+
+ return r;
+}
+
+result
+_BluetoothOppServerImpl::StartService(const Tizen::Base::String& dstPath)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_FAILURE;
+ String physicalPath;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_OPP_SVR_STATE_DISABLED:
+ r = E_INVALID_STATE;
+ break;
+
+ case _BT_OPP_SVR_STATE_IDLE:
+ if (_AppInfo::GetApiVersion() == _API_VERSION_2_0 && _AppInfo::IsOspCompat())
+ {
+ if (Tizen::Io::_FileImpl::ConvertVirtualToPhysicalPath(dstPath, physicalPath) != E_SUCCESS)
+ {
+ r = E_INACCESSIBLE_PATH;
+ break;
+ }
+ }
+ else
+ {
+ physicalPath = dstPath;
+ }
+
+ r = __pOppAdapter->StartOppServer(*this, physicalPath);
+
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_OPP_SVR_STATE_ON_SERVICE;
+ }
+ break;
+
+ case _BT_OPP_SVR_STATE_ON_SERVICE:
+ case _BT_OPP_SVR_STATE_PUSH_REQUESTED:
+ case _BT_OPP_SVR_STATE_ON_TRANSFER:
+ r = E_IN_PROGRESS;
+ break;
+
+ case _BT_OPP_SVR_STATE_ON_STOPPING:
+ r = E_INVALID_OPERATION;
+ break;
+
+ default:
+ // ignore other cases
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on starting OPP service.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothOppServerImpl::StopService(void)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_FAILURE;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_OPP_SVR_STATE_DISABLED:
+ r = E_INVALID_STATE;
+ break;
+
+ case _BT_OPP_SVR_STATE_IDLE:
+ r = E_INVALID_OPERATION;
+ break;
+
+ case _BT_OPP_SVR_STATE_ON_SERVICE:
+ case _BT_OPP_SVR_STATE_ON_STOPPING:
+ r = __pOppAdapter->StopOppServer();
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_OPP_SVR_STATE_IDLE;
+ }
+ break;
+
+ case _BT_OPP_SVR_STATE_PUSH_REQUESTED:
+ r = __pOppAdapter->RejectOppPush();
+ if (r == E_SUCCESS)
+ {
+ r = __pOppAdapter->StopOppServer();
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_OPP_SVR_STATE_IDLE;
+ }
+ else
+ {
+ __currentState = _BT_OPP_SVR_STATE_ON_SERVICE;
+ }
+ }
+ // Stays in the current status, if the rejection fails
+ break;
+
+ case _BT_OPP_SVR_STATE_ON_TRANSFER:
+ r = __pOppAdapter->StopOppTransfer();
+ r = TransExceptionsInclusive(r ,E_FAILURE, E_OPERATION_FAILED);
+ if (r == E_SUCCESS)
+ {
+ r = __pOppAdapter->StopOppServer();
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_OPP_SVR_STATE_IDLE;
+ }
+ else
+ {
+ __currentState = _BT_OPP_SVR_STATE_ON_SERVICE;
+ }
+ }
+ // Stays in the current status, if the terminating file transfer fails
+ break;
+
+ default:
+ // ignore other cases
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on stopping OPP service.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothOppServerImpl::StopTransfer(void)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_OPERATION_FAILED;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_OPP_SVR_STATE_DISABLED:
+ r = E_INVALID_STATE;
+ break;
+
+ case _BT_OPP_SVR_STATE_IDLE:
+ case _BT_OPP_SVR_STATE_ON_SERVICE:
+ case _BT_OPP_SVR_STATE_PUSH_REQUESTED:
+ case _BT_OPP_SVR_STATE_ON_STOPPING:
+ r = E_INVALID_OPERATION;
+ break;
+
+ case _BT_OPP_SVR_STATE_ON_TRANSFER:
+ r = __pOppAdapter->StopOppTransfer();
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_OPP_SVR_STATE_ON_STOPPING;
+ }
+ // It will be changed to IDLE after receiving the TransferDone event.
+ break;
+
+ default:
+ // ignore other cases
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on stopping OPP service.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+void
+_BluetoothOppServerImpl::OnBluetoothActivated(result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ __stateMutex.Acquire();
+
+ if ((__currentState == _BT_OPP_SVR_STATE_DISABLED) && (r == E_SUCCESS))
+ {
+ __currentState = _BT_OPP_SVR_STATE_IDLE;
+ }
+
+ __stateMutex.Release();
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s]", GetStringOfCurrentState());
+}
+
+void
+_BluetoothOppServerImpl::OnBluetoothDeactivated(result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ __stateMutex.Acquire();
+
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_OPP_SVR_STATE_DISABLED;
+ }
+
+ __stateMutex.Release();
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s]", GetStringOfCurrentState());
+}
+
+void
+_BluetoothOppServerImpl::OnOppPushRequested(const BluetoothDevice& device)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ bool isFired = false;
+
+ __stateMutex.Acquire();
+
+ if (__currentState == _BT_OPP_SVR_STATE_ON_SERVICE)
+ {
+ __currentState = _BT_OPP_SVR_STATE_PUSH_REQUESTED;
+ isFired = true;
+ }
+ else if ((__currentState == _BT_OPP_SVR_STATE_PUSH_REQUESTED)
+ || (__currentState == _BT_OPP_SVR_STATE_ON_TRANSFER)
+ || (__currentState == _BT_OPP_SVR_STATE_ON_STOPPING))
+ {
+ (void) __pOppAdapter->RejectOppPush(); // ignore the result
+ }
+ // ignore other cases
+
+ __stateMutex.Release();
+
+ if (isFired)
+ {
+ _BluetoothOppServerEventArg* pArg = new (std::nothrow) _BluetoothOppServerEventArg(device);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ __pEvent->FireAsync(*pArg);
+ }
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [PUSH_REQUESTED_Event:%s]",
+ GetStringOfCurrentState(), isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothOppServerImpl::OnOppTransferInProgress(int percent)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [Progress:%d]", GetStringOfCurrentState(), percent);
+
+ bool isFired = false;
+
+ __stateMutex.Acquire();
+
+ if ((__currentState == _BT_OPP_SVR_STATE_ON_TRANSFER) || (__currentState == _BT_OPP_SVR_STATE_ON_STOPPING))
+ {
+ if (((percent - __previousProgress) >= __minProgressInterval) || (percent >= 100))
+ {
+ isFired = true;
+ __previousProgress = percent;
+ }
+ }
+ // ignore other scases
+
+ __stateMutex.Release();
+
+ if (isFired)
+ {
+ _BluetoothOppServerEventArg* pArg = new (std::nothrow) _BluetoothOppServerEventArg(percent);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ __pEvent->FireAsync(*pArg);
+ }
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [TRANSFER_IN_PROGRESS_Event:%s]",
+ GetStringOfCurrentState(), isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothOppServerImpl::OnOppTransferDone(const Tizen::Base::String& filePath, int fileSize, bool isCompleted)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [TransferDone:%s]",
+ GetStringOfCurrentState(), isCompleted ? "Completed" : "NotCompleted");
+
+ result r = E_SUCCESS;
+ bool isFired = false;
+
+ __stateMutex.Acquire();
+
+ if (__currentState == _BT_OPP_SVR_STATE_IDLE)
+ {
+ isFired = true;
+ __previousProgress = 0; // initialization for the next push transaction
+ }
+ else if ((__currentState == _BT_OPP_SVR_STATE_ON_TRANSFER) || (__currentState == _BT_OPP_SVR_STATE_ON_STOPPING))
+ {
+ __currentState = _BT_OPP_SVR_STATE_ON_SERVICE;
+ isFired = true;
+ __previousProgress = 0; // initialization for the next push transaction
+ }
+ // ignore other cases
+
+ __stateMutex.Release();
+
+ if (isFired)
+ {
+ _BluetoothOppServerEventArg* pArg = new (std::nothrow) _BluetoothOppServerEventArg(filePath, fileSize, isCompleted);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ __pEvent->FireAsync(*pArg);
+ }
+ }
+
+ if ((isFired) && (r != E_SUCCESS))
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on stopping OPP service in the transfer-done callback.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s], [TRANSFER_DONE_Event:%s]",
+ GetStringOfCurrentState(), GetErrorMessage(r), isFired ? "Fired" : "NotFired");
+}
+
+const char*
+_BluetoothOppServerImpl::GetStringOfCurrentState(void) const
+{
+ const char* pStateString = null;
+
+ switch (__currentState)
+ {
+ case _BT_OPP_SVR_STATE_DISABLED:
+ pStateString = "DISABLED";
+ break;
+
+ case _BT_OPP_SVR_STATE_IDLE:
+ pStateString = "IDLE";
+ break;
+
+ case _BT_OPP_SVR_STATE_ON_SERVICE:
+ pStateString = "ON_SERVICE";
+ break;
+
+ case _BT_OPP_SVR_STATE_PUSH_REQUESTED:
+ pStateString = "PUSH_REQUESTED";
+ break;
+
+ case _BT_OPP_SVR_STATE_ON_TRANSFER:
+ pStateString = "ON_TRANSFER";
+ break;
+
+ case _BT_OPP_SVR_STATE_ON_STOPPING:
+ pStateString = "ON_STOPPING";
+ break;
+
+ default:
+ pStateString = "Unknown";
+ break;
+ }
+
+ return pStateString;
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothOppSystemAdapter.cpp b/src/FNetBt_BluetoothOppSystemAdapter.cpp
new file mode 100755
index 0000000..e3d126d
--- /dev/null
+++ b/src/FNetBt_BluetoothOppSystemAdapter.cpp
@@ -0,0 +1,380 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothOppSystemAdapter.cpp
+// @brief This is the implementation file for the _BluetoothOppSystemAdapter class.
+//
+
+#include <unique_ptr.h>
+#include <pthread.h>
+#include <FBaseByteBuffer.h>
+#include <FBaseUtilStringUtil.h>
+#include <FNetBtBluetoothTypes.h>
+#include <FNetBtBluetoothDevice.h>
+#include <FBaseSysLog.h>
+#include <FBase_StringConverter.h>
+#include "FNetBt_BluetoothOppSystemAdapter.h"
+#include "FNetBt_BluetoothGapSystemAdapter.h"
+#include "FNetBt_BluetoothDeviceImpl.h"
+#include "FNetBt_BluetoothOppClientImpl.h"
+#include "FNetBt_BluetoothOppServerImpl.h"
+
+using namespace std;
+using namespace Tizen::Base;
+using namespace Tizen::Base::Collection;
+using namespace Tizen::Base::Utility;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+_BluetoothOppSystemAdapter* _BluetoothOppSystemAdapter::__pInstance = null;
+
+_BluetoothOppSystemAdapter::_BluetoothOppSystemAdapter(void)
+ : __pOppServerImpl(null)
+ , __pOppClientImpl(null)
+ , __serverTransferId(0)
+ , __serverRecvFileName()
+ , __serverRecvFileSize(0)
+{
+}
+
+_BluetoothOppSystemAdapter::~_BluetoothOppSystemAdapter(void)
+{
+}
+
+void
+_BluetoothOppSystemAdapter::InitSingleton(void)
+{
+ static _BluetoothOppSystemAdapter inst = _BluetoothOppSystemAdapter();
+
+ __pInstance = &inst;
+}
+
+_BluetoothOppSystemAdapter*
+_BluetoothOppSystemAdapter::GetInstance(void)
+{
+ static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
+
+ if (__pInstance == null)
+ {
+ ClearLastResult();
+ pthread_once(&onceBlock, InitSingleton);
+ result r = GetLastResult();
+ if (IsFailed(r))
+ {
+ onceBlock = PTHREAD_ONCE_INIT;
+ }
+ }
+
+ return __pInstance;
+}
+
+result
+_BluetoothOppSystemAdapter::StartOppServer(const _BluetoothOppServerImpl& impl, const Tizen::Base::String& dstPath)
+{
+ unique_ptr<char[]> pUuidStr;
+ bool isUsed = false;
+ unique_ptr<char[]> pConvertedDestPath;
+ result r = E_SUCCESS;
+ int ret = BT_ERROR_NONE;
+
+ // check OPP server's availability
+ pUuidStr.reset(_StringConverter::CopyToCharArrayN(UuId(BT_SVC_UUID_OPP).ToString()));
+ ret = bt_adapter_is_service_used(pUuidStr.get() , &isUsed);
+ SysTryReturnResult(NID_NET_BT, (ret == BT_ERROR_NONE) && !isUsed, E_SERVICE_UNAVAILABLE, "OPP Server is not available. [0x%08X]", ret);
+
+ pConvertedDestPath.reset(_StringConverter::CopyToCharArrayN(dstPath));
+ SysTryReturnResult(NID_NET_BT, pConvertedDestPath != null, E_INACCESSIBLE_PATH, "The file path is invalid.");
+
+ ret = bt_opp_server_initialize_by_connection_request(pConvertedDestPath.get(), &OnOppServerConnectionRequested, null);
+ SysLog(NID_NET_BT, "Starting the OPP Server %s. [0x%-04X]", ret == BT_ERROR_NONE ? "is successful" : "fails", ret);
+
+ if (ret == BT_ERROR_NONE)
+ {
+ __pOppServerImpl = const_cast <_BluetoothOppServerImpl*>(&impl);
+ }
+ else
+ {
+ r = E_FAILURE;
+ }
+
+ return r;
+}
+
+result
+_BluetoothOppSystemAdapter::StopOppServer(void)
+{
+ int ret = BT_ERROR_NONE;
+
+ ret = bt_opp_server_deinitialize();
+ SysLog(NID_NET_BT, "Stop the OPP Server %s. [0x%08X]", ret == BT_ERROR_NONE ? "is successful" : "fails", ret);
+
+ if (ret == BT_ERROR_NONE)
+ {
+ __pOppServerImpl = null;
+ return E_SUCCESS;
+ }
+
+ return E_FAILURE;
+}
+
+result
+_BluetoothOppSystemAdapter::SetOppReceivePath(const Tizen::Base::String& dstPath)
+{
+ char* pConvertedDestPath = NULL;
+ result r = E_FAILURE;
+ int ret = BT_ERROR_NONE;
+
+ pConvertedDestPath = _StringConverter::CopyToCharArrayN(dstPath);
+ SysTryReturnResult(NID_NET_BT, pConvertedDestPath != null, E_INACCESSIBLE_PATH, "The file path is invalid.");
+
+ ret = bt_opp_server_set_destination(pConvertedDestPath);
+ SysLog(NID_NET_BT, "Setting the receive path of the OPP Server %s. [0x%08X]",
+ ret == BT_ERROR_NONE ? "is successful" : "fails", ret);
+
+ if (ret == BT_ERROR_NONE)
+ {
+ r = E_SUCCESS;
+ }
+
+ delete[] pConvertedDestPath;
+ return r;
+}
+
+result
+_BluetoothOppSystemAdapter::AcceptOppPush(const Tizen::Base::String& fileName)
+{
+ result r = E_FAILURE;
+ int ret = BT_ERROR_NONE;
+
+ char* pConvertedfileName = _StringConverter::CopyToCharArrayN(fileName);
+ SysTryReturnResult(NID_NET_BT, pConvertedfileName != null, E_FAILURE, "The file name is invalid.");
+
+ ret = bt_opp_server_accept(&OnOppServerTransferInProgress, &OnOppServerTransferCompleted, pConvertedfileName, null,
+ &__serverTransferId);
+ SysLog(NID_NET_BT, "Accepting the OPP push request %s. [0x%08X]", ret == BT_ERROR_NONE ? "is successful" : "fails", ret);
+
+ if (ret == BT_ERROR_NONE)
+ {
+ r = E_SUCCESS;
+ }
+
+ delete[] pConvertedfileName;
+ return r;
+}
+
+result
+_BluetoothOppSystemAdapter::RejectOppPush(void)
+{
+ int ret = BT_ERROR_NONE;
+
+ ret = bt_opp_server_reject();
+ SysLog(NID_NET_BT, "Rejecting the OPP push request %s. [0x%08X]", ret == BT_ERROR_NONE ? "is successful" : "fails", ret);
+
+ if (ret == BT_ERROR_NONE)
+ {
+ return E_SUCCESS;
+ }
+
+ return E_FAILURE;
+}
+
+result
+_BluetoothOppSystemAdapter::StopOppTransfer(void)
+{
+ int ret = BT_ERROR_NONE;
+
+ // if a file transfer is not started yet, the default transfer ID (0) is used for terminating the OPP server.
+ ret = bt_opp_server_cancel_transfer(__serverTransferId);
+ SysLog(NID_NET_BT, "Stop the OPP file transfer (ID:%d) %s. [0x%08X]", __serverTransferId,
+ ret == BT_ERROR_NONE ? "is successful" : "fails", ret);
+
+ if (ret == BT_ERROR_NONE)
+ {
+ return E_SUCCESS;
+ }
+
+ return E_OPERATION_FAILED;
+}
+
+result
+_BluetoothOppSystemAdapter::PushOppFile(const _BluetoothOppClientImpl& impl, const Tizen::Base::ByteBuffer& serverAddress,
+ const Tizen::Base::String& filePath)
+{
+ result r = E_FAILURE;
+ int ret = BT_ERROR_NONE;
+ unique_ptr<char[]> pServerDevAddr;
+ unique_ptr<char[]> pFileName;
+
+ SysTryReturnResult(NID_NET_BT, __pOppClientImpl == null, E_SERVICE_UNAVAILABLE, "The already OPP client is running.");
+ SysTryReturnResult(NID_NET_BT, serverAddress.GetRemaining() == _BT_ADDRESS_LENGTH, E_FAILURE,
+ "The address of the remote device is incorrect.");
+
+ pFileName.reset(_StringConverter::CopyToCharArrayN(filePath));
+ SysTryReturnResult(NID_NET_BT, pFileName != null, E_INACCESSIBLE_PATH, "The file path is invalid.");
+ pServerDevAddr.reset(_StringConverter::CopyToCharArrayN(_BluetoothDeviceImpl::GetAddressString(serverAddress)));
+ SysTryReturnResult(NID_NET_BT, pServerDevAddr != null, E_FAILURE, "The server address is invalid.");
+
+ if (bt_opp_client_initialize() == BT_ERROR_NONE)
+ {
+ (void) bt_opp_client_add_file(pFileName.get());
+ ret = bt_opp_client_push_files(pServerDevAddr.get(), &OnOppClientConnectionResponded, &OnOppClientTransferInProgress,
+ &OnOppClientTransferCompleted, null);
+ SysLog(NID_NET_BT, "Sending a push request to device [%s] %s. [0x%08X]", pServerDevAddr.get(),
+ ret == BT_ERROR_NONE ? "is successful" : "fails", ret);
+
+ if (ret == BT_ERROR_NONE)
+ {
+ __pOppClientImpl = const_cast<_BluetoothOppClientImpl*>(&impl);
+ r = E_SUCCESS;
+ }
+ else
+ {
+ bt_opp_client_deinitialize();
+ }
+ }
+
+ return r;
+}
+
+result
+_BluetoothOppSystemAdapter::CancelOppPush(void)
+{
+ int ret = BT_ERROR_NONE;
+
+ ret = bt_opp_client_cancel_push();
+ SysLog(NID_NET_BT, "Cancel the OPP file transfer %s. [0x%08X]", ret == BT_ERROR_NONE ? "is successful" : "fails", ret);
+
+ if (ret == BT_ERROR_NONE)
+ {
+ return E_SUCCESS;
+ }
+
+ return E_FAILURE;
+}
+
+void
+_BluetoothOppSystemAdapter::OnOppClientConnectionResponded(int status, const char* pRemoteAddress, void* pUserData)
+{
+ _BluetoothOppSystemAdapter* pOppAdapter = _BluetoothOppSystemAdapter::GetInstance();
+
+ if (pOppAdapter->__pOppClientImpl)
+ {
+ if (status == BT_ERROR_NONE)
+ {
+ pOppAdapter->__pOppClientImpl->OnOppPushResponded(E_SUCCESS);
+ }
+ else
+ {
+ pOppAdapter->__pOppClientImpl->OnOppPushResponded(E_SYSTEM);
+ pOppAdapter->__pOppClientImpl = null;
+ bt_opp_client_deinitialize();
+ }
+ }
+}
+
+void
+_BluetoothOppSystemAdapter::OnOppClientTransferInProgress(const char* pFilePath, long long fileSize, int progress, void* pUserData)
+{
+ _BluetoothOppSystemAdapter* pOppAdapter = _BluetoothOppSystemAdapter::GetInstance();
+
+ pOppAdapter->__serverRecvFileSize = fileSize;
+ // converts the UTF8 multibyte string to Unicode String
+ (void) StringUtil::Utf8ToString(pFilePath, pOppAdapter->__serverRecvFileName);
+
+ if (pOppAdapter->__pOppClientImpl)
+ {
+ pOppAdapter->__pOppClientImpl->OnOppTransferInProgress(progress);
+ }
+}
+
+void
+_BluetoothOppSystemAdapter::OnOppClientTransferCompleted(int status, const char* pRemoteAddress, void* pUserData)
+{
+ bool isCompleted = true;
+ _BluetoothOppSystemAdapter* pOppAdapter = _BluetoothOppSystemAdapter::GetInstance();
+
+ if (pOppAdapter->__pOppClientImpl)
+ {
+ if (status != BT_ERROR_NONE)
+ {
+ isCompleted = false;
+ }
+
+ pOppAdapter->__pOppClientImpl->OnOppTransferDone(pOppAdapter->__serverRecvFileName, pOppAdapter->__serverRecvFileSize,
+ isCompleted);
+ pOppAdapter->__pOppClientImpl = null;
+ // TODO: Is it right that the following statement is located in the next of callback?
+ bt_opp_client_deinitialize();
+ }
+}
+
+void
+_BluetoothOppSystemAdapter::OnOppServerConnectionRequested(const char* pRemoteAddress, void* pUserData)
+{
+ result r = E_SUCCESS;
+ BluetoothDevice requester;
+ ByteBuffer deviceAddress;
+ String deviceAddressStr(pRemoteAddress);
+ _BluetoothOppSystemAdapter* pOppAdapter = _BluetoothOppSystemAdapter::GetInstance();
+
+ if (pOppAdapter->__pOppServerImpl)
+ {
+ deviceAddress.Construct(_BT_ADDRESS_LENGTH);
+ (void) _BluetoothDeviceImpl::GetAddressByteBuffer(deviceAddressStr, L":", deviceAddress);
+
+ r = _BluetoothGapSystemAdapter::GetPairedDevice(deviceAddress, requester);
+ SysTryReturnVoidResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] Getting information of the request has failed.");
+
+ pOppAdapter->__pOppServerImpl->OnOppPushRequested(requester);
+ }
+}
+
+void
+_BluetoothOppSystemAdapter::OnOppServerTransferInProgress(const char* pFilePath, long long fileSize, int progress, void* pUserData)
+{
+ _BluetoothOppSystemAdapter* pOppAdapter = _BluetoothOppSystemAdapter::GetInstance();
+
+ if (pOppAdapter->__pOppServerImpl)
+ {
+ pOppAdapter->__pOppServerImpl->OnOppTransferInProgress(progress);
+ }
+}
+
+void
+_BluetoothOppSystemAdapter::OnOppServerTransferCompleted(int status, const char* pFilePath, long long fileSize, void* pUserData)
+{
+ bool isCompleted = true;
+ String convertedFilePath;
+
+ _BluetoothOppSystemAdapter* pOppAdapter = _BluetoothOppSystemAdapter::GetInstance();
+
+ if (pOppAdapter->__pOppServerImpl)
+ {
+ pOppAdapter->__serverTransferId = 0;
+
+ if (status != BT_ERROR_NONE)
+ {
+ isCompleted = false;
+ }
+ // TODO: not file name but file path
+ // converts the UTF8 multibyte string to Unicode String
+ (void) StringUtil::Utf8ToString(pFilePath, convertedFilePath);
+ pOppAdapter->__pOppServerImpl->OnOppTransferDone(convertedFilePath, fileSize, isCompleted);
+ }
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothOppSystemAdapter.h b/src/FNetBt_BluetoothOppSystemAdapter.h
new file mode 100644
index 0000000..05ca2d3
--- /dev/null
+++ b/src/FNetBt_BluetoothOppSystemAdapter.h
@@ -0,0 +1,209 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothOppSystemAdapter.h
+ * @brief This is the header file for the _BluetoothOppSystemAdapter class.
+ *
+ * This header file contains the declaration of the _BluetoothOppSystemAdapter class.
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_OPP_SYSTEM_ADAPTER_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_OPP_SYSTEM_ADAPTER_H_
+
+#include <bluetooth.h>
+#include <FBaseObject.h>
+#include <FBaseResult.h>
+#include <FBaseString.h>
+#include <FNetBtBluetoothTypes.h>
+
+namespace Tizen { namespace Base {
+class ByteBuffer;
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// forward declarations
+class BluetoothDevice;
+class _BluetoothOppClientImpl;
+class _BluetoothOppServerImpl;
+
+/**
+ * @class _BluetoothOppSystemAdapter
+ * @brief This class provides functions related to deliver the system events to the listeners such as
+ * _BluetoothManagerImpl. This class is a type of singleton, therefore only one instance should be allowed.
+ */
+class _BluetoothOppSystemAdapter
+ : public Tizen::Base::Object
+{
+public:
+ /**
+ * Creates an instance of this class if there is no instance in this application context.
+ * Gets the exist instance because this class is a singleton, otherwise.
+ *
+ * @return the instance of this class
+ */
+ static _BluetoothOppSystemAdapter* GetInstance(void);
+
+ //-----------------------------------------------------------------------------------------------------------------
+ // OPP Server
+ //-----------------------------------------------------------------------------------------------------------------
+
+ /**
+ * Start the OPP server and register an instance of _BluetoothOppServerImpl class into the internal.
+ * Currently, the only one instance can be registered.
+ *
+ * @return An error code
+ * @param[in] impl The instance of _BluetoothOppServerImpl to be registered
+ * @param[in] dstPath The new destination file path
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SERVICE_UNAVAILABLE OPP Server service is not available because the number of registered instances
+ * are exceeded to the max number.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ result StartOppServer(const _BluetoothOppServerImpl& impl, const Tizen::Base::String& dstPath);
+
+ /**
+ * Stop the running OPP server and unset the registered instance of _BluetoothOppServerImpl class.
+ *
+ * @return An error code
+ * @param[in] impl The instance of _BluetoothOppServerImpl to be unregistered
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ result StopOppServer(void);
+
+ /**
+ * Sets the destination path of the file to be received.
+ *
+ * @return An error code
+ * @param[in] dstPath The new destination file path
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INACCESSIBLE_PATH The specified @c path contains an invalid value.
+ * @exception E_FAILURE The method failed.
+ */
+ result SetOppReceivePath(const Tizen::Base::String& dstPath);
+
+ /**
+ * Accepts an OPP Push request from a remote device.
+ *
+ * @return An error code
+ * @param[in] fileName The name of the file to be saved which is received from the request device.
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_FAILURE The method failed.
+ */
+ result AcceptOppPush(const Tizen::Base::String& fileName);
+
+ /**
+ * Rejects an OPP Push request from a remote device.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_FAILURE The method failed.
+ */
+ result RejectOppPush(void);
+
+ /**
+ * Disconnects OPP connection and stops the file transfer in progress at the server side.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_FAILURE The method failed.
+ */
+ result StopOppTransfer(void);
+
+ //-----------------------------------------------------------------------------------------------------------------
+ // OPP Client
+ //-----------------------------------------------------------------------------------------------------------------
+
+ /**
+ * Request a push request after creating an OPP client.
+ *
+ * @return An error code
+ * @param[in] impl The instance of _BluetoothOppClientImpl to be registered
+ * @param[in] serverAddress The address of the target OPP server
+ * @param[in] filePath The path of the source file to be pushed
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ result PushOppFile(const _BluetoothOppClientImpl& impl, const Tizen::Base::ByteBuffer& serverAddress,
+ const Tizen::Base::String& filePath);
+
+ /**
+ * Cancels the Push request sent previously or stops the file transfer in progress.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_FAILURE The method failed.
+ */
+ result CancelOppPush(void);
+
+ //-----------------------------------------------------------------------------------------------------------------
+ // Callback method
+ //-----------------------------------------------------------------------------------------------------------------
+
+ /**
+ * Callback to notify that a push request is responded from the requested OPP server.
+ */
+ static void OnOppClientConnectionResponded(int status, const char* pRemoteAddress, void* pUserData);
+
+ /**
+ * Callback to notify the progress information of the client side during the file transfer.
+ */
+ static void OnOppClientTransferInProgress(const char* pFilePath, long long fileSize, int progress, void* pUserData);
+
+ /**
+ * Callback to notify that the file transfer of the client side is completed.
+ */
+ static void OnOppClientTransferCompleted(int status, const char* pRemoteAddress, void* pUserData);
+
+ /**
+ * Callback to notify that a push request is received from a remote OPP client.
+ */
+ static void OnOppServerConnectionRequested(const char* pRemoteAddress, void* pUserData);
+
+ /**
+ * Callback to notify the progress information of the server side during the file transfer.
+ */
+ static void OnOppServerTransferInProgress(const char* pFilePath, long long fileSize, int progress, void* pUserData);
+
+ /**
+ * Callback to notify that the file transfer of the server side is completed.
+ */
+ static void OnOppServerTransferCompleted(int status, const char* pFilePath, long long fileSize, void* pUserData);
+
+
+private:
+ _BluetoothOppSystemAdapter(void);
+ ~_BluetoothOppSystemAdapter(void);
+
+ _BluetoothOppSystemAdapter(const _BluetoothOppSystemAdapter& value);
+ _BluetoothOppSystemAdapter& operator =(const _BluetoothOppSystemAdapter& value);
+
+ static void InitSingleton(void);
+
+private:
+ _BluetoothOppServerImpl* __pOppServerImpl;
+ _BluetoothOppClientImpl* __pOppClientImpl;
+ int __serverTransferId;
+ Tizen::Base::String __serverRecvFileName;
+ long long __serverRecvFileSize;
+ static _BluetoothOppSystemAdapter* __pInstance;
+
+}; // _BluetoothOppSystemAdapter
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_OPP_SYSTEM_ADAPTER_H_
diff --git a/src/FNetBt_BluetoothSppAcceptorEvent.cpp b/src/FNetBt_BluetoothSppAcceptorEvent.cpp
new file mode 100644
index 0000000..d98c38b
--- /dev/null
+++ b/src/FNetBt_BluetoothSppAcceptorEvent.cpp
@@ -0,0 +1,93 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothSppAcceptorEvent.cpp
+// @brief This is the implementation file for the _BluetoothSppAcceptorEvent class.
+//
+
+#include <FBaseRtIEventListener.h>
+#include <FBaseSysLog.h>
+#include <FBaseByteBuffer.h>
+#include <FBaseRtIEventArg.h>
+#include "FNetBt_BluetoothSppAcceptorEvent.h"
+#include "FNetBt_BluetoothSppAcceptorEventArg.h"
+#include "FNetBtIBluetoothSppAcceptorEventListener.h"
+
+
+using namespace Tizen::Base;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+_BluetoothSppAcceptorEvent::_BluetoothSppAcceptorEvent(void)
+{
+}
+
+_BluetoothSppAcceptorEvent::~_BluetoothSppAcceptorEvent(void)
+{
+}
+
+result
+_BluetoothSppAcceptorEvent::Construct(void)
+{
+ return _Event::Initialize();
+}
+
+void
+_BluetoothSppAcceptorEvent::FireImpl(Tizen::Base::Runtime::IEventListener& listener, const Tizen::Base::Runtime::IEventArg& arg)
+{
+ const BluetoothDevice* pDevice = null;
+ ByteBuffer* pData = null;
+
+ IBluetoothSppAcceptorEventListener* pListener = dynamic_cast <IBluetoothSppAcceptorEventListener*>(&listener);
+ SysTryReturnVoidResult(NID_NET_BT, pListener != null, E_INVALID_ARG, "[E_INVALID_ARG] The listener argument is invalid.");
+
+ const _BluetoothSppAcceptorEventArg* pEventArg = dynamic_cast <const _BluetoothSppAcceptorEventArg*>(&arg);
+ SysTryReturnVoidResult(NID_NET_BT, pEventArg != null, E_INVALID_ARG, "[E_INVALID_ARG] The event argument is invalid type.");
+
+ _BluetoothSppAcceptorEventType eventType = pEventArg->GetEventType();
+
+ switch (eventType)
+ {
+ case _BT_SPP_ACCEPTOR_EVENT_CONN_REQUESTED:
+ pDevice = pEventArg->GetRequester();
+ if (pDevice != null)
+ {
+ SysLog(NID_NET_BT, "Firing Bluetooth SPP Acceptor Event (Type: _BT_SPP_ACCEPTOR_EVENT_CONN_REQUESTED)");
+ pListener->OnSppConnectionRequested(*pDevice);
+ }
+ break;
+
+ case _BT_SPP_ACCEPTOR_EVENT_DISCONNECTED:
+ SysLog(NID_NET_BT, "Firing Bluetooth SPP Acceptor Event (Type: _BT_SPP_ACCEPTOR_EVENT_DISCONNECTED)");
+ pListener->OnSppDisconnected(pEventArg->GetErrorResult());
+ break;
+
+ case _BT_SPP_ACCEPTOR_EVENT_DATA_RECEIVED:
+ pData = pEventArg->GetReceivedData();
+ if (pData != null)
+ {
+ SysLog(NID_NET_BT, "Firing Bluetooth SPP Acceptor Event (Type: _BT_SPP_ACCEPTOR_EVENT_DATA_RECEIVED)");
+ pListener->OnSppDataReceived(*pData);
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothSppAcceptorEvent.h b/src/FNetBt_BluetoothSppAcceptorEvent.h
new file mode 100644
index 0000000..f200c99
--- /dev/null
+++ b/src/FNetBt_BluetoothSppAcceptorEvent.h
@@ -0,0 +1,78 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothSppAcceptorEvent.h
+ * @brief This is the header file for the _BluetoothSppAcceptorEvent class.
+ *
+ * This header file contains the declarations of the _BluetoothSppAcceptorEvent class.
+ * The _BluetoothSppAcceptorEvent class can call a method of a listener (_IBluetoothSppAcceptorEventListener object).
+ * So, when a device event is occurred, listener instances can handle it appropriately.
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_SPP_ACCEPTOR_EVENT_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_SPP_ACCEPTOR_EVENT_H_
+
+#include <FOspConfig.h>
+#include <FBaseResult.h>
+#include <FBaseRt_Event.h>
+
+// Forward declaration
+namespace Tizen { namespace Base { namespace Runtime
+{
+class IEventListener;
+class IEventArg;
+} } }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+//
+// @class _BluetoothSppAcceptorEvent
+// @brief This class handles Bluetooth SPP Acceptor events.
+//
+// When a Bluetooth device event occurs, the _BluetoothSppAcceptorEvent object finds a _IBluetoothSppAcceptorEventListener object
+// and calls an appropriate method of the listener.
+//
+class _BluetoothSppAcceptorEvent
+ : public Tizen::Base::Runtime::_Event
+{
+public:
+ _BluetoothSppAcceptorEvent(void);
+ virtual ~_BluetoothSppAcceptorEvent(void);
+
+ result Construct(void);
+
+protected:
+ /**
+ * Checks the argument and finds out the type of event. After that, this method calls appropriate pListener's method.
+ *
+ * @return A result code.
+ * @param[in] pListener An event listener related to this Bluetooth SPP Acceptor event.
+ * @param[in] arg An event argument including information to be passed to the event listeners
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_ARG The argument passed to a method contains invalid values.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ virtual void FireImpl(Tizen::Base::Runtime::IEventListener& listener, const Tizen::Base::Runtime::IEventArg& arg);
+
+private:
+ _BluetoothSppAcceptorEvent(const _BluetoothSppAcceptorEvent& value);
+ _BluetoothSppAcceptorEvent& operator =(const _BluetoothSppAcceptorEvent& rhs);
+
+}; // _BluetoothSppAcceptorEvent
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_SPP_ACCEPTOR_EVENT_H_
diff --git a/src/FNetBt_BluetoothSppAcceptorEventArg.cpp b/src/FNetBt_BluetoothSppAcceptorEventArg.cpp
new file mode 100755
index 0000000..841ed81
--- /dev/null
+++ b/src/FNetBt_BluetoothSppAcceptorEventArg.cpp
@@ -0,0 +1,102 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothSppAcceptorEventArg.cpp
+// @brief This is the implementation file for the _BluetoothSppAcceptorEventArg class.
+//
+
+#include <FBaseByteBuffer.h>
+#include <FNetBtBluetoothDevice.h>
+#include <FBaseSysLog.h>
+#include "FNetBt_BluetoothSppAcceptorEventArg.h"
+
+
+using namespace Tizen::Base;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+//
+// This is a class constructor for _BT_SPP_ACCEPTOR_EVENT_CONN_REQUESTED event.
+//
+_BluetoothSppAcceptorEventArg::_BluetoothSppAcceptorEventArg(const BluetoothDevice& device)
+ : __evtType(_BT_SPP_ACCEPTOR_EVENT_CONN_REQUESTED)
+ , __pRequester(null)
+ , __result(E_SUCCESS)
+ , __pData(null)
+{
+ __pRequester = new (std::nothrow) BluetoothDevice(device);
+ SysTryReturnVoidResult(NID_NET_BT, __pRequester != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+}
+
+//
+// This is a class constructor for _BT_SPP_ACCEPTOR_EVENT_DISCONNECTED event.
+//
+_BluetoothSppAcceptorEventArg::_BluetoothSppAcceptorEventArg(result r)
+ : __evtType(_BT_SPP_ACCEPTOR_EVENT_DISCONNECTED)
+ , __pRequester(null)
+ , __result(r)
+ , __pData(null)
+{
+}
+
+//
+// This is a class constructor for _BT_SPP_ACCEPTOR_EVENT_DATA_RECEIVED event.
+//
+_BluetoothSppAcceptorEventArg::_BluetoothSppAcceptorEventArg(const Tizen::Base::ByteBuffer& buffer)
+ : __evtType(_BT_SPP_ACCEPTOR_EVENT_DATA_RECEIVED)
+ , __pRequester(null)
+ , __result(E_SUCCESS)
+ , __pData(null)
+{
+ __pData = new (std::nothrow) ByteBuffer();
+ SysTryReturnVoidResult(NID_NET_BT, __pData != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+
+ __pData->Construct(buffer);
+ __pData->SetPosition(0);
+}
+
+_BluetoothSppAcceptorEventArg::~_BluetoothSppAcceptorEventArg(void)
+{
+ delete __pRequester;
+ delete __pData;
+}
+
+_BluetoothSppAcceptorEventType
+_BluetoothSppAcceptorEventArg::GetEventType(void) const
+{
+ return __evtType;
+}
+
+const BluetoothDevice*
+_BluetoothSppAcceptorEventArg::GetRequester(void) const
+{
+ return __pRequester;
+}
+
+result
+_BluetoothSppAcceptorEventArg::GetErrorResult(void) const
+{
+ return __result;
+}
+
+Tizen::Base::ByteBuffer*
+_BluetoothSppAcceptorEventArg::GetReceivedData(void) const
+{
+ return __pData;
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothSppAcceptorEventArg.h b/src/FNetBt_BluetoothSppAcceptorEventArg.h
new file mode 100644
index 0000000..de30e57
--- /dev/null
+++ b/src/FNetBt_BluetoothSppAcceptorEventArg.h
@@ -0,0 +1,137 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothSppAcceptorEventArg.h
+ * @brief This is the header file for the _BluetoothSppAcceptorEventArg class.
+ *
+ * This header file contains the declarations of the _BluetoothSppAcceptorEventArg class which includes information to be
+ * passed to the event listeners
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_SPP_ACCEPTOR_EVENT_ARG_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_SPP_ACCEPTOR_EVENT_ARG_H_
+
+#include <FBaseObject.h>
+#include <FBaseResult.h>
+#include <FOspConfig.h>
+#include <FBaseRtIEventArg.h>
+
+// Forward declaration
+namespace Tizen { namespace Base {
+class ByteBuffer;
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// Forward declaration
+class BluetoothDevice;
+
+/**
+ * @enum _BluetoothSppAcceptorEventType
+ * Type for specifying the type of _BluetoothSppAcceptorEvent
+ */
+enum _BluetoothSppAcceptorEventType
+{
+ _BT_SPP_ACCEPTOR_EVENT_CONN_REQUESTED, /**< For notifying that a new connection request is received */
+ _BT_SPP_ACCEPTOR_EVENT_DISCONNECTED, /**< For notifying that the connection is disconnected */
+ _BT_SPP_ACCEPTOR_EVENT_DATA_RECEIVED, /**< For notifying that the data has been received */
+};
+
+/**
+ * @class _BluetoothSppAcceptorEventArg
+ * @brief This class is used as an argument for callback methods of the IBluetoothSppAcceptorEventListener class.
+ *
+ * When a _BluetoothSppAcceptorEvent occurs, the _BluetoothSppAcceptorEvent finds a IBluetoothSppAcceptorEventListener instance
+ * which is registered for the _BluetoothSppAcceptorEvent and calls an appropriate method of the listener.
+ * @see IBluetoothSppAcceptorEventListener
+ */
+class _BluetoothSppAcceptorEventArg
+ : public Tizen::Base::Object
+ , public Tizen::Base::Runtime::IEventArg
+{
+public:
+ /**
+ * This is a class constructor for _BT_SPP_ACCEPTOR_EVENT_CONN_REQUESTED event.
+ *
+ * @param[in] device The SPP initiator device
+ */
+ _BluetoothSppAcceptorEventArg(const BluetoothDevice& device);
+
+ /**
+ * This is a class constructor for _BT_SPP_ACCEPTOR_EVENT_DISCONNECTED event.
+ *
+ * @param[in] r The result of the event
+ * @exception E_SUCCESS The connection is terminated successfully.
+ * @exception E_SYSTEM The method has failed to disconnect.
+ */
+ _BluetoothSppAcceptorEventArg(result r);
+
+ /**
+ * This is a class constructor for _BT_SPP_ACCEPTOR_EVENT_DATA_RECEIVED event.
+ *
+ * @param[in] buffer The received data
+ */
+ _BluetoothSppAcceptorEventArg(const Tizen::Base::ByteBuffer& buffer);
+
+ /**
+ * This is the class destructor.
+ */
+ ~_BluetoothSppAcceptorEventArg(void);
+
+ /**
+ * Gets the type of this event.
+ *
+ * @return The type of the event
+ */
+ _BluetoothSppAcceptorEventType GetEventType(void) const;
+
+ /**
+ * Gets the SPP initiator device.
+ *
+ * @return The pointer of the SPP initiator device which request to connect
+ */
+ const BluetoothDevice* GetRequester(void) const;
+
+ /**
+ * Gets the error result of this event.
+ *
+ * @return The result of the event
+ */
+ result GetErrorResult(void) const;
+
+ /**
+ * Gets The received data.
+ *
+ * @return The received data
+ */
+ Tizen::Base::ByteBuffer* GetReceivedData(void) const;
+
+private:
+ _BluetoothSppAcceptorEventArg(void);
+ _BluetoothSppAcceptorEventArg(const _BluetoothSppAcceptorEventArg& eventArg);
+ _BluetoothSppAcceptorEventArg& operator =(const _BluetoothSppAcceptorEventArg& rValue);
+
+private:
+ _BluetoothSppAcceptorEventType __evtType;
+ BluetoothDevice* __pRequester;
+ result __result;
+ Tizen::Base::ByteBuffer* __pData;
+
+}; // _BluetoothSppAcceptorEventArg
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_SPP_ACCEPTOR_EVENT_ARG_H_
diff --git a/src/FNetBt_BluetoothSppAcceptorImpl.cpp b/src/FNetBt_BluetoothSppAcceptorImpl.cpp
new file mode 100755
index 0000000..fcbfc48
--- /dev/null
+++ b/src/FNetBt_BluetoothSppAcceptorImpl.cpp
@@ -0,0 +1,642 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothSppAcceptorImpl.cpp
+// @brief This is the implementation file for the _BluetoothSppAcceptorImpl class.
+//
+
+#include <FBaseByteBuffer.h>
+#include <FBaseUuId.h>
+#include <FOspConfig.h>
+#include <FNetBtBluetoothTypes.h>
+#include <FNetBtBluetoothDevice.h>
+#include <FNetBtIBluetoothSppAcceptorEventListener.h>
+#include <FBaseSysLog.h>
+#include "FNetBt_BluetoothSppAcceptorEvent.h"
+#include "FNetBt_BluetoothSppAcceptorEventArg.h"
+#include "FNetBt_BluetoothSppAcceptorImpl.h"
+#include "FNetBt_BluetoothSppSystemAdapter.h"
+#include "FNetBt_BluetoothGapSystemAdapter.h"
+
+using namespace std;
+using namespace Tizen::Base;
+using namespace Tizen::Base::Runtime;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+_BluetoothSppAcceptorImpl::_BluetoothSppAcceptorImpl(void)
+ : __pGapAdapter(null)
+ , __pSppAdapter(null)
+ , __pEvent(null)
+ , __stateMutex()
+ , __currentState(_BT_SPP_ACC_STATE_DISABLED)
+ , __parentSocketFd(_BT_INVALID_SOCKET_FD)
+ , __childSocketFd(_BT_INVALID_SOCKET_FD)
+{
+}
+
+_BluetoothSppAcceptorImpl::~_BluetoothSppAcceptorImpl(void)
+{
+ if (__pSppAdapter != null)
+ {
+ if ((__currentState == _BT_SPP_ACC_STATE_ON_SERVICE) ||
+ (__currentState == _BT_SPP_ACC_STATE_CONNECT_REQUESTED) ||
+ (__currentState == _BT_SPP_ACC_STATE_CONNECTED))
+ {
+ (void) StopService(); // Ignores the result of this function.
+ }
+ }
+
+ if (__pGapAdapter != null)
+ {
+ __pGapAdapter->UnregisterManagerEventListener(*this);
+ }
+}
+
+result
+_BluetoothSppAcceptorImpl::Construct(IBluetoothSppAcceptorEventListener& listener)
+{
+ result r = E_SUCCESS;
+ std::unique_ptr<_BluetoothSppAcceptorEvent> pEvent;
+
+ r = __stateMutex.Create();
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to create the state mutex.");
+
+ __pGapAdapter = _BluetoothGapSystemAdapter::GetInstance();
+ SysTryReturn(NID_NET_BT, __pGapAdapter != null, E_SYSTEM, E_SYSTEM,
+ "[E_SYSTEM] Failed to invoke _BluetoothGapSystemAdapter::GetInstance().");
+
+ __pSppAdapter = _BluetoothSppSystemAdapter::GetInstance();
+ SysTryReturn(NID_NET_BT, __pSppAdapter != null, E_SYSTEM, E_SYSTEM,
+ "[E_SYSTEM] Failed to invoke _BluetoothSppSystemAdapter::GetInstance().");
+
+ pEvent.reset(new (std::nothrow) _BluetoothSppAcceptorEvent());
+ SysTryReturn(NID_NET_BT, pEvent != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ r = pEvent->Construct();
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to construct the event.");
+ // add the IBluetoothSppAcceptorEventListener instance to a new created _BluetoothSppAcceptorEvent.
+ r = pEvent->AddListener(listener, true);
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
+ "[%s] Propagating. Failed to add the application listener for SPP Acceptor", GetErrorMessage(r));
+
+ // registers this callback listener to the system adapter for activation/deactivation event
+ r = __pGapAdapter->RegisterManagerEventListener(*this, true);
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
+ "[E_SYSTEM] Failed to register the callback listener to _BluetoothGapSystemAdapter.");
+
+ // check whether the Bluetooth is available
+ __stateMutex.Acquire();
+
+ if (__pGapAdapter->IsActivated() == true)
+ {
+ __currentState = _BT_SPP_ACC_STATE_IDLE;
+ }
+
+ __stateMutex.Release();
+
+ __pEvent = move(pEvent);
+
+ return E_SUCCESS;
+}
+
+result
+_BluetoothSppAcceptorImpl::AcceptConnection(void)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_SUCCESS;
+ int clientSocketFd = _BT_INVALID_SOCKET_FD;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_SPP_ACC_STATE_DISABLED:
+ r = E_INVALID_STATE;
+ break;
+
+ case _BT_SPP_ACC_STATE_IDLE:
+ case _BT_SPP_ACC_STATE_ON_SERVICE:
+ case _BT_SPP_ACC_STATE_CONNECTED:
+ r = E_INVALID_OPERATION;
+ break;
+
+ case _BT_SPP_ACC_STATE_CONNECT_REQUESTED:
+ r = __pSppAdapter->AcceptSocketRequest(__parentSocketFd, clientSocketFd);
+
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_SPP_ACC_STATE_CONNECTED;
+ __childSocketFd = clientSocketFd;
+ }
+ else
+ {
+ __currentState = _BT_SPP_ACC_STATE_ON_SERVICE;
+ }
+ break;
+
+ default:
+ r = E_FAILURE;
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on accepting a connection request.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothSppAcceptorImpl::RejectConnection()
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_SUCCESS;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_SPP_ACC_STATE_DISABLED:
+ r = E_INVALID_STATE;
+ break;
+
+ case _BT_SPP_ACC_STATE_IDLE:
+ case _BT_SPP_ACC_STATE_ON_SERVICE:
+ case _BT_SPP_ACC_STATE_CONNECTED:
+ r = E_INVALID_OPERATION;
+ break;
+
+ case _BT_SPP_ACC_STATE_CONNECT_REQUESTED:
+ r = __pSppAdapter->RejectSocketRequest(__parentSocketFd);
+ __currentState = _BT_SPP_ACC_STATE_ON_SERVICE;
+ break;
+
+ default:
+ r = E_FAILURE;
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on rejecting a connection request.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothSppAcceptorImpl::StartService(const Tizen::Base::UuId& serviceUuid)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_SUCCESS;
+ int serverSocketFd = _BT_INVALID_SOCKET_FD;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_SPP_ACC_STATE_DISABLED:
+ r = E_INVALID_STATE;
+ break;
+
+ case _BT_SPP_ACC_STATE_IDLE:
+ r = __pSppAdapter->OpenServerSocket(serviceUuid, *this, serverSocketFd);
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_SPP_ACC_STATE_ON_SERVICE;
+ __parentSocketFd = serverSocketFd;
+ }
+ break;
+
+ case _BT_SPP_ACC_STATE_ON_SERVICE:
+ case _BT_SPP_ACC_STATE_CONNECT_REQUESTED:
+ r = E_IN_PROGRESS;
+ break;
+
+ case _BT_SPP_ACC_STATE_CONNECTED:
+ r = E_ALREADY_CONNECTED;
+ break;
+
+ default:
+ r = E_FAILURE;
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on starting SPP service.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothSppAcceptorImpl::StopService(void)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_SUCCESS;
+ result resDisconnect = E_SUCCESS;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_SPP_ACC_STATE_DISABLED:
+ r = E_INVALID_STATE;
+ break;
+
+ case _BT_SPP_ACC_STATE_IDLE:
+ r = E_INVALID_OPERATION;
+ break;
+
+ case _BT_SPP_ACC_STATE_ON_SERVICE:
+ r = __pSppAdapter->CloseServerSocket(__parentSocketFd);
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_SPP_ACC_STATE_IDLE;
+ __parentSocketFd = _BT_INVALID_SOCKET_FD;
+ }
+ break;
+
+ // Stays in the current status, if StopSppServer() fails
+ case _BT_SPP_ACC_STATE_CONNECT_REQUESTED:
+ r = __pSppAdapter->RejectSocketRequest(__parentSocketFd);
+ if (r == E_SUCCESS)
+ {
+ r = __pSppAdapter->CloseServerSocket(__parentSocketFd);
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_SPP_ACC_STATE_IDLE;
+ __parentSocketFd = _BT_INVALID_SOCKET_FD;
+ }
+ else
+ {
+ __currentState = _BT_SPP_ACC_STATE_ON_SERVICE;
+ }
+ }
+ break;
+
+ case _BT_SPP_ACC_STATE_CONNECTED:
+ resDisconnect = ProcessAsyncDisconnect();
+ // stop server socket regardless whether disconnection is successful
+ r = __pSppAdapter->CloseServerSocket(__parentSocketFd);
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_SPP_ACC_STATE_IDLE;
+ __parentSocketFd = _BT_INVALID_SOCKET_FD;
+ }
+ else if (resDisconnect == E_SUCCESS)
+ {
+ __currentState = _BT_SPP_ACC_STATE_ON_SERVICE;
+ }
+ break;
+
+ default:
+ r = E_FAILURE;
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on stopping SPP service.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothSppAcceptorImpl::SendData(const Tizen::Base::ByteBuffer& buffer)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_SUCCESS;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_SPP_ACC_STATE_DISABLED:
+ r = E_INVALID_STATE;
+ break;
+
+ case _BT_SPP_ACC_STATE_IDLE:
+ case _BT_SPP_ACC_STATE_ON_SERVICE:
+ case _BT_SPP_ACC_STATE_CONNECT_REQUESTED:
+ r = E_INVALID_OPERATION;
+ break;
+
+ case _BT_SPP_ACC_STATE_CONNECTED:
+ if (buffer.GetRemaining() > 0)
+ {
+ r = __pSppAdapter->SendSocketData(__childSocketFd, buffer);
+ }
+ else
+ {
+ r = E_INVALID_ARG;
+ }
+ break;
+
+ default:
+ r = E_FAILURE;
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on sending data.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothSppAcceptorImpl::Disconnect()
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_SUCCESS;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_SPP_ACC_STATE_DISABLED:
+ r = E_INVALID_STATE;
+ break;
+
+ case _BT_SPP_ACC_STATE_IDLE:
+ case _BT_SPP_ACC_STATE_ON_SERVICE:
+ case _BT_SPP_ACC_STATE_CONNECT_REQUESTED:
+ r = E_INVALID_OPERATION;
+ break;
+
+ case _BT_SPP_ACC_STATE_CONNECTED:
+ // send a disconnected event here if the disconnect method is successful
+ // because the disconnect method of the underlying system is sync call. (transform sync into async)
+ r = ProcessAsyncDisconnect();
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_SPP_ACC_STATE_ON_SERVICE;
+ }
+ break;
+
+ default:
+ r = E_FAILURE;
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on disconnecting the connection.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+void
+_BluetoothSppAcceptorImpl::OnBluetoothActivated(result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ __stateMutex.Acquire();
+
+ if ((__currentState == _BT_SPP_ACC_STATE_DISABLED) && (r == E_SUCCESS))
+ {
+ __currentState = _BT_SPP_ACC_STATE_IDLE;
+ }
+ __stateMutex.Release();
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s]", GetStringOfCurrentState());
+}
+
+void
+_BluetoothSppAcceptorImpl::OnBluetoothDeactivated(result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ __stateMutex.Acquire();
+
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_SPP_ACC_STATE_DISABLED;
+ }
+
+ __stateMutex.Release();
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s]", GetStringOfCurrentState());
+}
+
+void
+_BluetoothSppAcceptorImpl::OnSocketConnectionRequested(const BluetoothDevice& device)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ bool isFired = false;
+
+ __stateMutex.Acquire();
+
+ if (__currentState == _BT_SPP_ACC_STATE_ON_SERVICE)
+ {
+ __currentState = _BT_SPP_ACC_STATE_CONNECT_REQUESTED;
+ isFired = true;
+ }
+ else if ((__currentState == _BT_SPP_ACC_STATE_CONNECT_REQUESTED) ||
+ (__currentState == _BT_SPP_ACC_STATE_CONNECTED))
+ {
+ (void) __pSppAdapter->RejectSocketRequest(__parentSocketFd);
+ }
+ // ignore othre cases
+
+ __stateMutex.Release();
+
+ if (isFired)
+ {
+ _BluetoothSppAcceptorEventArg* pArg = new (std::nothrow) _BluetoothSppAcceptorEventArg(device);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ __pEvent->FireAsync(*pArg);
+ }
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [CONNECT_REQUESTED_Event:%s]",
+ GetStringOfCurrentState(), isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothSppAcceptorImpl::OnSocketDisconnected(result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ bool isFired = false;
+
+ __stateMutex.Acquire();
+
+ if ((__currentState == _BT_SPP_ACC_STATE_CONNECT_REQUESTED) ||
+ (__currentState == _BT_SPP_ACC_STATE_CONNECTED))
+ {
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_SPP_ACC_STATE_ON_SERVICE;
+ __childSocketFd = _BT_INVALID_SOCKET_FD;
+
+ isFired = true;
+ }
+ }
+ // ignore other cases
+
+ __stateMutex.Release();
+
+ if (isFired)
+ {
+ _BluetoothSppAcceptorEventArg* pArg = new (std::nothrow) _BluetoothSppAcceptorEventArg(r);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ __pEvent->FireAsync(*pArg);
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on SPP-disconnect callback.", GetErrorMessage(r));
+ }
+ }
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [DISCONNECTED_Event:%s]",
+ GetStringOfCurrentState(), isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothSppAcceptorImpl::OnSocketDataReceived(Tizen::Base::ByteBuffer& buffer)
+{
+ bool isFired = false;
+
+ if (__currentState == _BT_SPP_ACC_STATE_CONNECTED)
+ {
+ _BluetoothSppAcceptorEventArg* pArg = new (std::nothrow) _BluetoothSppAcceptorEventArg(buffer);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ }
+ else
+ {
+ // use Fire() instead of FireAsync() to improve the transfer rate.
+ __pEvent->Fire(*pArg);
+ isFired = true;
+ }
+ }
+
+ SysLog(NID_NET_BT, "[CurrentState:%s], [DATA_RECEIVED_Event:%s]",
+ GetStringOfCurrentState(), isFired ? "Fired" : "NotFired");
+}
+
+result
+_BluetoothSppAcceptorImpl::ProcessAsyncDisconnect(void)
+{
+ result r = E_SUCCESS;
+
+ r = __pSppAdapter->DisconnectSocket(__childSocketFd);
+
+ // send a disconnected event here if the disconnect method is successful
+ // because the disconnect method of the underlying system is sync call. (transform sync into async)
+ if (r == E_SUCCESS)
+ {
+ __childSocketFd = _BT_INVALID_SOCKET_FD;
+
+ _BluetoothSppAcceptorEventArg* pArg = new (std::nothrow) _BluetoothSppAcceptorEventArg(r);
+ if (pArg != null)
+ {
+ __pEvent->FireAsync(*pArg);
+ SysLog(NID_NET_BT, "[DISCONNECTED_Event:Fired]");
+ }
+ }
+
+ return r;
+}
+
+const char*
+_BluetoothSppAcceptorImpl::GetStringOfCurrentState(void) const
+{
+ const char* pStateString = null;
+
+ switch (__currentState)
+ {
+ case _BT_SPP_ACC_STATE_DISABLED:
+ pStateString = "DISABLED";
+ break;
+
+ case _BT_SPP_ACC_STATE_IDLE:
+ pStateString = "IDLE";
+ break;
+
+ case _BT_SPP_ACC_STATE_ON_SERVICE:
+ pStateString = "ON_SERVICE";
+ break;
+
+ case _BT_SPP_ACC_STATE_CONNECT_REQUESTED:
+ pStateString = "CONNECT_REQUESTED";
+ break;
+
+ case _BT_SPP_ACC_STATE_CONNECTED:
+ pStateString = "CONNECTED";
+ break;
+
+ default:
+ pStateString = "Unknown";
+ break;
+ }
+
+ return pStateString;
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothSppInitiatorEvent.cpp b/src/FNetBt_BluetoothSppInitiatorEvent.cpp
new file mode 100644
index 0000000..e96c6c2
--- /dev/null
+++ b/src/FNetBt_BluetoothSppInitiatorEvent.cpp
@@ -0,0 +1,89 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothSppInitiatorEvent.cpp
+// @brief This is the implementation file for the _BluetoothSppInitiatorEvent class.
+//
+
+#include <FBaseRtIEventListener.h>
+#include <FBaseSysLog.h>
+#include <FBaseByteBuffer.h>
+#include <FBaseRtIEventArg.h>
+#include "FNetBt_BluetoothSppInitiatorEvent.h"
+#include "FNetBt_BluetoothSppInitiatorEventArg.h"
+#include "FNetBtIBluetoothSppInitiatorEventListener.h"
+
+
+using namespace Tizen::Base;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+_BluetoothSppInitiatorEvent::_BluetoothSppInitiatorEvent(void)
+{
+}
+
+_BluetoothSppInitiatorEvent::~_BluetoothSppInitiatorEvent(void)
+{
+}
+
+result
+_BluetoothSppInitiatorEvent::Construct(void)
+{
+ return _Event::Initialize();
+}
+
+void
+_BluetoothSppInitiatorEvent::FireImpl(Tizen::Base::Runtime::IEventListener& listener, const Tizen::Base::Runtime::IEventArg& arg)
+{
+ ByteBuffer* pData = null;
+
+ IBluetoothSppInitiatorEventListener* pListener = dynamic_cast <IBluetoothSppInitiatorEventListener*>(&listener);
+ SysTryReturnVoidResult(NID_NET_BT, pListener != null, E_INVALID_ARG,
+ "[E_INVALID_ARG] The listener argument is invalid.");
+
+ const _BluetoothSppInitiatorEventArg* pEventArg = dynamic_cast <const _BluetoothSppInitiatorEventArg*>(&arg);
+ SysTryReturnVoidResult(NID_NET_BT, pEventArg != null, E_INVALID_ARG, "[E_INVALID_ARG] The event argument is invalid type.");
+
+ _BluetoothSppInitiatorEventType eventType = pEventArg->GetEventType();
+
+ switch (eventType)
+ {
+ case _BT_SPP_INITIATOR_EVENT_CONN_RESPONDED:
+ SysLog(NID_NET_BT, "Firing Bluetooth SPP Initiator Event (Type: _BT_SPP_INITIATOR_EVENT_CONN_RESPONDED)");
+ pListener->OnSppConnectionResponded(pEventArg->GetErrorResult());
+ break;
+
+ case _BT_SPP_INITIATOR_EVENT_DISCONNECTED:
+ SysLog(NID_NET_BT, "Firing Bluetooth SPP Initiator Event (Type: _BT_SPP_INITIATOR_EVENT_DISCONNECTED)");
+ pListener->OnSppDisconnected(pEventArg->GetErrorResult());
+ break;
+
+ case _BT_SPP_INITIATOR_EVENT_DATA_RECEIVED:
+ pData = pEventArg->GetReceivedData();
+ if (pData != null)
+ {
+ SysLog(NID_NET_BT, "Firing Bluetooth SPP Initiator Event (Type: _BT_SPP_INITIATOR_EVENT_DATA_RECEIVED)");
+ pListener->OnSppDataReceived(*pData);
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothSppInitiatorEvent.h b/src/FNetBt_BluetoothSppInitiatorEvent.h
new file mode 100644
index 0000000..c5dd923
--- /dev/null
+++ b/src/FNetBt_BluetoothSppInitiatorEvent.h
@@ -0,0 +1,78 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothSppInitiatorEvent.h
+ * @brief This is the header file for the _BluetoothSppInitiatorEvent class.
+ *
+ * This header file contains the declarations of the _BluetoothSppInitiatorEvent class.
+ * The _BluetoothSppInitiatorEvent class can call a method of a listener (IBluetoothSppInitiatorEventListener object).
+ * So, when a device event is occurred, listener instances can handle it appropriately.
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_SPP_INITIATOR_EVENT_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_SPP_INITIATOR_EVENT_H_
+
+#include <FOspConfig.h>
+#include <FBaseResult.h>
+#include <FBaseRt_Event.h>
+
+// Forward declaration
+namespace Tizen { namespace Base { namespace Runtime
+{
+class IEventListener;
+class IEventArg;
+} } }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+//
+// @class _BluetoothSppInitiatorEvent
+// @brief This class handles Bluetooth SPP Initiator events.
+//
+// When a Bluetooth device event occurs, the _BluetoothSppInitiatorEvent object finds a IBluetoothSppInitiatorEventListener
+// object and calls an appropriate method of the listener.
+//
+class _BluetoothSppInitiatorEvent
+ : public Tizen::Base::Runtime::_Event
+{
+public:
+ _BluetoothSppInitiatorEvent(void);
+ virtual ~_BluetoothSppInitiatorEvent(void);
+
+ result Construct(void);
+
+protected:
+ /**
+ * Checks the argument and finds out the type of event. After that, this method calls appropriate pListener's method.
+ *
+ * @return A result code.
+ * @param[in] pListener An event listener related to this Bluetooth SPP Initiator event.
+ * @param[in] arg An event argument including information to be passed to the event listeners
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_ARG The argument passed to a method contains invalid values.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ virtual void FireImpl(Tizen::Base::Runtime::IEventListener& listener, const Tizen::Base::Runtime::IEventArg& arg);
+
+private:
+ _BluetoothSppInitiatorEvent(const _BluetoothSppInitiatorEvent& value);
+ _BluetoothSppInitiatorEvent& operator =(const _BluetoothSppInitiatorEvent& rhs);
+
+}; // _BluetoothSppInitiatorEvent
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_SPP_INITIATOR_EVENT_H_
diff --git a/src/FNetBt_BluetoothSppInitiatorEventArg.cpp b/src/FNetBt_BluetoothSppInitiatorEventArg.cpp
new file mode 100755
index 0000000..530bd76
--- /dev/null
+++ b/src/FNetBt_BluetoothSppInitiatorEventArg.cpp
@@ -0,0 +1,84 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothSppInitiatorEventArg.cpp
+// @brief This is the implementation file for the _BluetoothSppInitiatorEventArg class.
+//
+
+#include <FBaseByteBuffer.h>
+#include <FNetBtBluetoothDevice.h>
+#include <FBaseSysLog.h>
+#include "FNetBt_BluetoothSppInitiatorEventArg.h"
+
+
+using namespace Tizen::Base;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+//
+// This is a class constructor for _BT_SPP_INITIATOR_EVENT_CONN_RESPONDED and _BT_SPP_INITIATOR_EVENT_DISCONNECTED event.
+//
+_BluetoothSppInitiatorEventArg::_BluetoothSppInitiatorEventArg(bool isResponse, result r)
+ : __evtType(_BT_SPP_INITIATOR_EVENT_CONN_RESPONDED)
+ , __result(r)
+ , __pData(null)
+{
+ if (!isResponse)
+ {
+ __evtType = _BT_SPP_INITIATOR_EVENT_DISCONNECTED;
+ }
+}
+
+//
+// This is a class constructor for _BT_SPP_INITIATOR_EVENT_DATA_RECEIVED event.
+//
+_BluetoothSppInitiatorEventArg::_BluetoothSppInitiatorEventArg(const Tizen::Base::ByteBuffer& buffer)
+ : __evtType(_BT_SPP_INITIATOR_EVENT_DATA_RECEIVED)
+ , __result(E_SUCCESS)
+ , __pData(null)
+{
+ __pData = new (std::nothrow) ByteBuffer();
+ SysTryReturnVoidResult(NID_NET_BT, __pData != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+
+ __pData->Construct(buffer);
+ __pData->SetPosition(0);
+}
+
+_BluetoothSppInitiatorEventArg::~_BluetoothSppInitiatorEventArg(void)
+{
+ delete __pData;
+}
+
+_BluetoothSppInitiatorEventType
+_BluetoothSppInitiatorEventArg::GetEventType(void) const
+{
+ return __evtType;
+}
+
+result
+_BluetoothSppInitiatorEventArg::GetErrorResult(void) const
+{
+ return __result;
+}
+
+Tizen::Base::ByteBuffer*
+_BluetoothSppInitiatorEventArg::GetReceivedData(void) const
+{
+ return __pData;
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothSppInitiatorEventArg.h b/src/FNetBt_BluetoothSppInitiatorEventArg.h
new file mode 100644
index 0000000..b98a76d
--- /dev/null
+++ b/src/FNetBt_BluetoothSppInitiatorEventArg.h
@@ -0,0 +1,124 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothSppInitiatorEventArg.h
+ * @brief This is the header file for the _BluetoothSppInitiatorEventArg class.
+ *
+ * This header file contains the declarations of the _BluetoothSppInitiatorEventArg class which includes information to be
+ * passed to the event listeners
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_SPP_INITIATOR_EVENT_ARG_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_SPP_INITIATOR_EVENT_ARG_H_
+
+#include <FBaseObject.h>
+#include <FBaseResult.h>
+#include <FOspConfig.h>
+#include <FBaseRtIEventArg.h>
+
+// Forward declaration
+namespace Tizen { namespace Base {
+class ByteBuffer;
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// Forward declaration
+class BluetoothDevice;
+
+/**
+ * @enum _BluetoothSppInitiatorEventType
+ * Type for specifying the type of _BluetoothSppInitiatorEvent
+ */
+enum _BluetoothSppInitiatorEventType
+{
+ _BT_SPP_INITIATOR_EVENT_CONN_RESPONDED, /**< For notifying that the response of the connection request is received */
+ _BT_SPP_INITIATOR_EVENT_DISCONNECTED, /**< For notifying that the connection is disconnected */
+ _BT_SPP_INITIATOR_EVENT_DATA_RECEIVED, /**< For notifying that the data has been received */
+};
+
+/**
+ * @class _BluetoothSppInitiatorEventArg
+ * @brief This class is used as an argument for callback methods of the _IBluetoothSppInitiatorEventListener class.
+ *
+ * When a _BluetoothSppInitiatorEvent occurs, the _BluetoothSppInitiatorEvent finds a _IBluetoothSppInitiatorEventListener instance
+ * which is registered for the _BluetoothSppInitiatorEvent and calls an appropriate method of the listener.
+ * @see _IBluetoothSppInitiatorEventListener
+ */
+class _BluetoothSppInitiatorEventArg
+ : public Tizen::Base::Object
+ , public Tizen::Base::Runtime::IEventArg
+{
+public:
+ /**
+ * This is a class constructor for _BT_SPP_INITIATOR_EVENT_CONN_RESPONDED and _BT_SPP_INITIATOR_EVENT_DISCONNECTED event.
+ *
+ * @param[in] isResponse @c true if the event is a connection response,
+ * else @c false
+ * @param[in] r The result of the event
+ * @exception E_SUCCESS The connection is established successfully.
+ * @exception E_SYSTEM The connection fails.
+ */
+ _BluetoothSppInitiatorEventArg(bool isResponse, result r);
+
+ /**
+ * This is a class constructor for _BT_SPP_INITIATOR_EVENT_DATA_RECEIVED event.
+ *
+ * @param[in] buffer The received data
+ */
+ _BluetoothSppInitiatorEventArg(const Tizen::Base::ByteBuffer& buffer);
+
+ /**
+ * This is the class destructor.
+ */
+ ~_BluetoothSppInitiatorEventArg(void);
+
+ /**
+ * Gets the type of this event.
+ *
+ * @return The type of the event
+ */
+ _BluetoothSppInitiatorEventType GetEventType(void) const;
+
+ /**
+ * Gets the error result of this event.
+ *
+ * @return The result of the event
+ */
+ result GetErrorResult(void) const;
+
+ /**
+ * Gets The received data.
+ *
+ * @return The received data
+ */
+ Tizen::Base::ByteBuffer* GetReceivedData(void) const;
+
+private:
+ _BluetoothSppInitiatorEventArg(void);
+ _BluetoothSppInitiatorEventArg(const _BluetoothSppInitiatorEventArg& eventArg);
+ _BluetoothSppInitiatorEventArg& operator =(const _BluetoothSppInitiatorEventArg& rValue);
+
+private:
+ _BluetoothSppInitiatorEventType __evtType;
+ result __result;
+ Tizen::Base::ByteBuffer* __pData;
+
+}; // _BluetoothSppInitiatorEventArg
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_SPP_INITIATOR_EVENT_ARG_H_
diff --git a/src/FNetBt_BluetoothSppInitiatorImpl.cpp b/src/FNetBt_BluetoothSppInitiatorImpl.cpp
new file mode 100755
index 0000000..5614e57
--- /dev/null
+++ b/src/FNetBt_BluetoothSppInitiatorImpl.cpp
@@ -0,0 +1,608 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothSppInitiatorImpl.cpp
+// @brief This is the implementation file for the _BluetoothSppInitiatorImpl class.
+//
+
+#include <FOspConfig.h>
+#include <FBaseUuId.h>
+#include <FNetBtBluetoothTypes.h>
+#include <FNetBtBluetoothDevice.h>
+#include <FNetBtIBluetoothSppInitiatorEventListener.h>
+#include <FBaseSysLog.h>
+#include "FNetBt_BluetoothSppInitiatorEvent.h"
+#include "FNetBt_BluetoothSppInitiatorEventArg.h"
+#include "FNetBt_BluetoothGapSystemAdapter.h"
+#include "FNetBt_BluetoothSppSystemAdapter.h"
+#include "FNetBt_BluetoothSppInitiatorImpl.h"
+
+using namespace std;
+using namespace Tizen::Base;
+using namespace Tizen::Base::Runtime;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+_BluetoothSppInitiatorImpl::_BluetoothSppInitiatorImpl(void)
+ : __pGapAdapter(null)
+ , __pSppAdapter(null)
+ , __pEvent(null)
+ , __stateMutex()
+ , __currentState(_BT_SPP_INI_STATE_DISABLED)
+ , __pairingAddress()
+ , __pairingUuid()
+ , __socketFd(_BT_INVALID_SOCKET_FD)
+{
+}
+
+_BluetoothSppInitiatorImpl::~_BluetoothSppInitiatorImpl(void)
+{
+ if (__pSppAdapter != null)
+ {
+ if ((__currentState == _BT_SPP_INI_STATE_BONDING)
+ || (__currentState == _BT_SPP_INI_STATE_CONNECT_READY)
+ || (__currentState == _BT_SPP_INI_STATE_CONNECTED))
+ {
+ (void) ProcessAsyncDisconnect(); // Ignores the result of this function.
+ }
+ }
+
+ if (__pGapAdapter != null)
+ {
+ __pGapAdapter->UnregisterManagerEventListener(*this);
+ __pGapAdapter->UnregisterDeviceEventListener(*this);
+ }
+}
+
+result
+_BluetoothSppInitiatorImpl::Construct(IBluetoothSppInitiatorEventListener& listener)
+{
+ result r = E_SUCCESS;
+ std::unique_ptr<_BluetoothSppInitiatorEvent> pEvent;
+
+ r = __stateMutex.Create();
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to create the state mutex.");
+
+ r = __pairingAddress.Construct(_BT_ADDRESS_LENGTH);
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to construct the address for pairing.");
+
+ __pGapAdapter = _BluetoothGapSystemAdapter::GetInstance();
+ SysTryReturn(NID_NET_BT, __pGapAdapter != null, E_SYSTEM, E_SYSTEM,
+ "[E_SYSTEM] Failed to invoke _BluetoothGapSystemAdapter::GetInstance().");
+
+ __pSppAdapter = _BluetoothSppSystemAdapter::GetInstance();
+ SysTryReturn(NID_NET_BT, __pSppAdapter != null, E_SYSTEM, E_SYSTEM,
+ "[E_SYSTEM] Failed to invoke _BluetoothSppSystemAdapter::GetInstance().");
+
+ pEvent.reset(new (std::nothrow) _BluetoothSppInitiatorEvent());
+ SysTryReturn(NID_NET_BT, pEvent != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ pEvent->Construct();
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to construct the event.");
+ // add the IBluetoothSppInitiatorEventListener instance to a new created _BluetoothSppInitiatorEvent.
+ r = pEvent->AddListener(listener, true);
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
+ "[%s] Propagating. Failed to add the application listener for SPP Initiator", GetErrorMessage(r));
+
+ // registers this callback listener to the system adapter for activation/deactivation event
+ r = __pGapAdapter->RegisterManagerEventListener(*this, true);
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
+ "[E_SYSTEM] Failed to register the callback listener to _BluetoothGapSystemAdapter.");
+
+ // registers this callback listener to the system adapter for paired event
+ r = __pGapAdapter->RegisterDeviceEventListener(*this);
+ if (r != E_SUCCESS)
+ {
+ __pGapAdapter->UnregisterManagerEventListener(*this);
+ }
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
+ "[E_SYSTEM] Failed to register the callback listener to _BluetoothGapSystemAdapter.");
+
+ // checks whether the Bluetooth is available
+ __stateMutex.Acquire();
+
+ if (__pGapAdapter->IsActivated() == true)
+ {
+ __currentState = _BT_SPP_INI_STATE_IDLE;
+ }
+
+ __stateMutex.Release();
+
+ __pEvent = move(pEvent);
+
+ return E_SUCCESS;
+}
+
+result
+_BluetoothSppInitiatorImpl::SendData(const Tizen::Base::ByteBuffer& buffer)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_FAILURE;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_SPP_INI_STATE_DISABLED:
+ r = E_INVALID_STATE;
+ break;
+
+ case _BT_SPP_INI_STATE_IDLE:
+ case _BT_SPP_INI_STATE_BONDING: //TODO: this state should return E_INVALID_OPERATION. Versioning
+ case _BT_SPP_INI_STATE_CONNECT_READY:
+ case _BT_SPP_INI_STATE_REQ_CANCELING: //TODO: this state should return E_INVALID_OPERATION. Versioning
+ r = E_INVALID_OPERATION;
+ break;
+
+ case _BT_SPP_INI_STATE_CONNECTED:
+ if (buffer.GetRemaining() > 0)
+ {
+ r = __pSppAdapter->SendSocketData(__socketFd, buffer);
+ }
+ else
+ {
+ r = E_INVALID_ARG;
+ }
+ break;
+
+ default:
+ r = E_FAILURE;
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on sending data.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothSppInitiatorImpl::Connect(const BluetoothDevice& remoteDevice, const Tizen::Base::UuId& serviceUuid)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_FAILURE;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_SPP_INI_STATE_DISABLED:
+ case _BT_SPP_INI_STATE_REQ_CANCELING:
+ r = E_INVALID_STATE;
+ break;
+
+ case _BT_SPP_INI_STATE_IDLE:
+ if (__pGapAdapter->IsPaired(*(remoteDevice.GetAddress())) == true)
+ {
+ r = __pSppAdapter->ConnectSocket(*(remoteDevice.GetAddress()), serviceUuid, *this);
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_SPP_INI_STATE_CONNECT_READY;
+ }
+ }
+ else
+ {
+ // start the pairing process
+ if (__pGapAdapter->Pair(*(remoteDevice.GetAddress())) == E_SUCCESS)
+ {
+ // copy the address of the pairing device to the local variable
+ __pairingAddress.SetArray(remoteDevice.GetAddress()->GetPointer(), 0, _BT_ADDRESS_LENGTH);
+ __pairingAddress.SetPosition(0);
+ __pairingUuid = serviceUuid;
+
+ r = E_SUCCESS;
+ __currentState = _BT_SPP_INI_STATE_BONDING;
+ }
+ else
+ {
+ r = E_FAILURE;
+ }
+ }
+ break;
+
+ case _BT_SPP_INI_STATE_BONDING: //TODO: Versioning check
+ case _BT_SPP_INI_STATE_CONNECT_READY:
+ r = E_IN_PROGRESS;
+ break;
+
+ case _BT_SPP_INI_STATE_CONNECTED:
+ r = E_ALREADY_CONNECTED;
+ break;
+
+ default:
+ r = E_FAILURE;
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on requesting a connection.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+result
+_BluetoothSppInitiatorImpl::Disconnect(void)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ result r = E_FAILURE;
+
+ __stateMutex.Acquire();
+
+ switch (__currentState)
+ {
+ case _BT_SPP_INI_STATE_DISABLED:
+ r = E_INVALID_STATE;
+ break;
+
+ case _BT_SPP_INI_STATE_IDLE:
+ r = E_INVALID_OPERATION;
+ break;
+
+ case _BT_SPP_INI_STATE_BONDING: //TODO: Versioning check
+ if (__pGapAdapter->CancelPair() == E_SUCCESS)
+ {
+ r = E_SUCCESS;
+ __currentState = _BT_SPP_INI_STATE_REQ_CANCELING;
+ }
+ // It will be changed to IDLE after receiving the OnBluetoothPaired event.
+ break;
+
+ case _BT_SPP_INI_STATE_CONNECT_READY:
+ // TODO: how does it cancel to request the connection? __socketFd is not determined at this time.
+ r = ProcessAsyncDisconnect();
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_SPP_INI_STATE_REQ_CANCELING;
+ }
+ // It will be changed to IDLE after receiving the OnSppDisconnected event.
+ break;
+
+ case _BT_SPP_INI_STATE_REQ_CANCELING:
+ r = E_IN_PROGRESS;
+ break;
+
+ case _BT_SPP_INI_STATE_CONNECTED:
+ r = ProcessAsyncDisconnect();
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_SPP_INI_STATE_IDLE;
+ }
+ // It will be changed to IDLE after receiving the OnSppDisconnected event.
+ break;
+
+ default:
+ r = E_FAILURE;
+ break;
+ }
+
+ __stateMutex.Release();
+
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on disconnecting the connection.", GetErrorMessage(r));
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ return r;
+}
+
+void
+_BluetoothSppInitiatorImpl::OnBluetoothActivated(result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ __stateMutex.Acquire();
+
+ if ((__currentState == _BT_SPP_INI_STATE_DISABLED) && (r == E_SUCCESS))
+ {
+ __currentState = _BT_SPP_INI_STATE_IDLE;
+ }
+ __stateMutex.Release();
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s]", GetStringOfCurrentState());
+}
+
+void
+_BluetoothSppInitiatorImpl::OnBluetoothDeactivated(result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ __stateMutex.Acquire();
+
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_SPP_INI_STATE_DISABLED;
+ }
+
+ __stateMutex.Release();
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s]", GetStringOfCurrentState());
+}
+
+void
+_BluetoothSppInitiatorImpl::OnSocketConnectionResponded(int socketFd, result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ bool isFired = false;
+
+ __stateMutex.Acquire();
+
+ if ((__currentState == _BT_SPP_INI_STATE_CONNECT_READY)
+ || (__currentState == _BT_SPP_INI_STATE_REQ_CANCELING))
+ {
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_SPP_INI_STATE_CONNECTED;
+ __socketFd = socketFd;
+ }
+ else
+ {
+ // including the cases as r == E_REJECTED or r == E_MAX_EXCEEDED
+ // E_MAX_EXCEEDED is originated in the previous version.
+ __currentState = _BT_SPP_INI_STATE_IDLE;
+ SysLogException(NID_NET_BT, r, "[%s] exception occurred on the response of the SPP connect request.", GetErrorMessage(r));
+ }
+
+ isFired = true;
+ }
+ // ignore other cases
+
+ __stateMutex.Release();
+
+ if (isFired)
+ {
+ _BluetoothSppInitiatorEventArg* pArg = new (std::nothrow) _BluetoothSppInitiatorEventArg(true, r);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ __pEvent->FireAsync(*pArg);
+ }
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [CONNECT_RESPONDED_Event:%s]",
+ GetStringOfCurrentState(), isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothSppInitiatorImpl::OnSocketDisconnected(result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ bool isFired = false;
+
+ __stateMutex.Acquire();
+
+ if (__currentState == _BT_SPP_INI_STATE_CONNECTED)
+ {
+ if (r == E_SUCCESS)
+ {
+ __currentState = _BT_SPP_INI_STATE_IDLE;
+ __socketFd = _BT_INVALID_SOCKET_FD;
+ isFired = true;
+ }
+ }
+ // ignore other cases
+
+ __stateMutex.Release();
+
+ if (isFired)
+ {
+ _BluetoothSppInitiatorEventArg* pArg = new (std::nothrow) _BluetoothSppInitiatorEventArg(false, r);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ __pEvent->FireAsync(*pArg);
+ }
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [DISCONNECTED_Event:%s]",
+ GetStringOfCurrentState(), isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothSppInitiatorImpl::OnSocketDataReceived(Tizen::Base::ByteBuffer& buffer)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s]", GetStringOfCurrentState());
+
+ bool isFired = false;
+
+ __stateMutex.Acquire();
+
+ if (__currentState == _BT_SPP_INI_STATE_CONNECTED)
+ {
+ isFired = true;
+ }
+ // ignore other cases
+
+ __stateMutex.Release();
+
+ if (isFired)
+ {
+ _BluetoothSppInitiatorEventArg* pArg = new (std::nothrow) _BluetoothSppInitiatorEventArg(buffer);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ // use Fire() instead of FireAsync() to improve the transfer rate.
+ __pEvent->Fire(*pArg);
+ }
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [DATA_RECIEVED_Event:%s]",
+ GetStringOfCurrentState(), isFired ? "Fired" : "NotFired");
+}
+
+void
+_BluetoothSppInitiatorImpl::OnBluetoothPaired(const BluetoothDevice* pPairedDevice, result r)
+{
+ SysLog(NID_NET_BT, "EntryPoint, [CurrentState:%s], [ActionResult:%s]", GetStringOfCurrentState(), GetErrorMessage(r));
+
+ bool isFired = false;
+ result responseResult = E_SYSTEM;
+
+ __stateMutex.Acquire();
+
+ if (pPairedDevice->GetAddress()->Equals(__pairingAddress))
+ {
+ if (__currentState == _BT_SPP_INI_STATE_BONDING)
+ {
+ if (r == E_SUCCESS)
+ {
+ if (__pSppAdapter->ConnectSocket(__pairingAddress, __pairingUuid, *this) == E_SUCCESS)
+ {
+ __currentState = _BT_SPP_INI_STATE_CONNECT_READY;
+ }
+ else
+ {
+ // callback responded with E_SYSTEM
+ isFired = true;
+ __currentState = _BT_SPP_INI_STATE_IDLE;
+ responseResult = E_SYSTEM;
+ }
+ }
+ else
+ {
+ // callback responded with r
+ isFired = true;
+ __currentState = _BT_SPP_INI_STATE_IDLE;
+ responseResult = r;
+ }
+
+ __pairingAddress.Clear();
+ }
+ else if (__currentState == _BT_SPP_INI_STATE_REQ_CANCELING)
+ {
+ // callback responded with E_SYSTEM or E_OPERATION_CANCELED
+ isFired = true;
+ __currentState = _BT_SPP_INI_STATE_IDLE;
+ responseResult = E_SYSTEM;
+ }
+ // ignore other cases
+ }
+ // ignored otherwise
+
+ __stateMutex.Release();
+
+ if (isFired)
+ {
+ _BluetoothSppInitiatorEventArg* pArg = new (std::nothrow) _BluetoothSppInitiatorEventArg(true, responseResult);
+ if (pArg == null)
+ {
+ SysLogException(NID_NET_BT, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ isFired = false;
+ }
+ else
+ {
+ __pEvent->FireAsync(*pArg);
+ }
+ }
+
+ SysLog(NID_NET_BT, "ExitPoint, [CurrentState:%s], [CONNECT_RESPONDED_Event:%s]",
+ GetStringOfCurrentState(), isFired ? "Fired" : "NotFired");
+}
+
+result
+_BluetoothSppInitiatorImpl::ProcessAsyncDisconnect(void)
+{
+ result r = E_SUCCESS;
+
+ r = __pSppAdapter->DisconnectSocket(__socketFd);
+
+ // send a disconnected event here if the disconnect method is successful
+ // because the disconnect method of the underlying system is sync call. (transform sync into async)
+ if (r == E_SUCCESS)
+ {
+ __socketFd = _BT_INVALID_SOCKET_FD;
+
+ _BluetoothSppInitiatorEventArg* pArg = new (std::nothrow) _BluetoothSppInitiatorEventArg(false, r);
+ if (pArg != null)
+ {
+ __pEvent->FireAsync(*pArg);
+ SysLog(NID_NET_BT, "[DISCONNECTED_Event:Fired]");
+ }
+ }
+
+ return r;
+}
+
+const char*
+_BluetoothSppInitiatorImpl::GetStringOfCurrentState(void) const
+{
+ const char* pStateString = null;
+
+ switch (__currentState)
+ {
+ case _BT_SPP_INI_STATE_DISABLED:
+ pStateString = "DISABLED";
+ break;
+
+ case _BT_SPP_INI_STATE_IDLE:
+ pStateString = "IDLE";
+ break;
+
+ case _BT_SPP_INI_STATE_BONDING:
+ pStateString = "BONDING";
+ break;
+
+ case _BT_SPP_INI_STATE_CONNECT_READY:
+ pStateString = "CONNECT_READY";
+ break;
+
+ case _BT_SPP_INI_STATE_REQ_CANCELING:
+ pStateString = "REQ_CANCELING";
+ break;
+
+ case _BT_SPP_INI_STATE_CONNECTED:
+ pStateString = "CONNECTED";
+ break;
+
+ default:
+ pStateString = "Unknown";
+ break;
+ }
+
+ return pStateString;
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothSppSystemAdapter.cpp b/src/FNetBt_BluetoothSppSystemAdapter.cpp
new file mode 100755
index 0000000..11fcc36
--- /dev/null
+++ b/src/FNetBt_BluetoothSppSystemAdapter.cpp
@@ -0,0 +1,528 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothSppSystemAdapter.cpp
+// @brief This is the implementation file for the _BluetoothSppSystemAdapter class.
+//
+
+#include <pthread.h>
+#include <FBaseByteBuffer.h>
+#include <FBaseString.h>
+#include <FBaseUuId.h>
+#include <FBaseColArrayList.h>
+#include <FBaseColHashMapT.h>
+#include <FBaseColIComparerT.h>
+#include <FBaseColIHashCodeProviderT.h>
+#include <FBaseUtilStringUtil.h>
+#include <FNetBtBluetoothTypes.h>
+#include <FNetBtBluetoothDevice.h>
+#include <FBaseSysLog.h>
+#include <FBase_StringConverter.h>
+#include "FNetBt_BluetoothSppSystemAdapter.h"
+#include "FNetBt_BluetoothGapSystemAdapter.h"
+#include "FNetBt_BluetoothDeviceImpl.h"
+#include "FNetBt_IBluetoothSocketListener.h"
+
+using namespace std;
+using namespace Tizen::Base;
+using namespace Tizen::Base::Collection;
+using namespace Tizen::Base::Utility;
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+struct _SocketFdDeleter
+{
+ void operator()(int* serverSocketFd)
+ {
+ (void) bt_socket_destroy_rfcomm(*serverSocketFd);
+ }
+};
+
+/*
+ * @class _BluetoothAddressComparer
+ * @brief The _BluetoothAddressComparer class provides the comparer about two specified String
+ * which consists of Bluetooth address and service UUID.
+ */
+class _BluetoothAddressComparer
+ : public Tizen::Base::Collection::IComparerT <Tizen::Base::String>
+ , public Tizen::Base::Object
+{
+public:
+ _BluetoothAddressComparer(void){}
+ virtual ~_BluetoothAddressComparer(void){}
+
+ virtual result Compare(const Tizen::Base::String& obj1, const Tizen::Base::String& obj2, int& cmp) const
+ {
+ cmp = obj1.CompareTo(obj2);
+ return E_SUCCESS;
+ }
+
+private:
+ _BluetoothAddressComparer(const _BluetoothAddressComparer& value);
+ _BluetoothAddressComparer& operator =(const _BluetoothAddressComparer& value);
+
+}; //_BluetoothAddressComparer
+
+/*
+ * @class _BluetoothAddressHashCodeProviderT
+ * @brief The _BluetoothAddressHashCodeProviderT class provides the hash code of a specified String
+ * which consists of Bluetooth address and service UUID.
+ */
+class _BluetoothAddressHashCodeProvider
+ : public Tizen::Base::Collection::IHashCodeProviderT <Tizen::Base::String>
+{
+public:
+ _BluetoothAddressHashCodeProvider(void) {}
+ virtual ~_BluetoothAddressHashCodeProvider(void) {}
+ virtual int GetHashCode(const Tizen::Base::String& obj) const
+ {
+ return obj.GetHashCode();
+ }
+
+private:
+ _BluetoothAddressHashCodeProvider(const _BluetoothAddressHashCodeProvider& value);
+ _BluetoothAddressHashCodeProvider& operator =(const _BluetoothAddressHashCodeProvider& value);
+
+}; //_BluetoothAddressHashCodeProvider
+
+
+static _BluetoothAddressComparer _btAddressComparer;
+static _BluetoothAddressHashCodeProvider _btAddressHashCodeProvider;
+
+_BluetoothSppSystemAdapter* _BluetoothSppSystemAdapter::__pInstance = null;
+
+_BluetoothSppSystemAdapter::_BluetoothSppSystemAdapter(void)
+ : __pServerSocketMap(null)
+ , __pSocketMap(null)
+ , __pClientSocketMap(null)
+{
+}
+
+_BluetoothSppSystemAdapter::~_BluetoothSppSystemAdapter(void)
+{
+ // unregister the callback methods from the underlying layer
+ (void) bt_socket_unset_connection_state_changed_cb();
+ (void) bt_socket_unset_data_received_cb();
+ (void) bt_socket_unset_connection_requested_cb();
+}
+
+void
+_BluetoothSppSystemAdapter::InitSingleton(void)
+{
+ bool r = false;
+ static _BluetoothSppSystemAdapter inst;
+
+ r = inst.Construct();
+ SysTryReturnVoidResult(NID_NET_BT, r == true, E_SYSTEM, "[E_SYSTEM] Propagating.");
+
+ __pInstance = &inst;
+}
+
+_BluetoothSppSystemAdapter*
+_BluetoothSppSystemAdapter::GetInstance(void)
+{
+ static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
+
+ if (__pInstance == null)
+ {
+ ClearLastResult();
+ pthread_once(&onceBlock, InitSingleton);
+ result r = GetLastResult();
+ if (IsFailed(r))
+ {
+ onceBlock = PTHREAD_ONCE_INIT;
+ }
+ }
+
+ return __pInstance;
+}
+
+bool
+_BluetoothSppSystemAdapter::Construct(void)
+{
+ result r = E_SUCCESS;
+ int err = BT_ERROR_NONE;
+ unique_ptr< Tizen::Base::Collection::HashMapT<int, _IBluetoothSocketListener*> > pServerSocketMap;
+ unique_ptr< Tizen::Base::Collection::HashMapT<int, _IBluetoothSocketListener*> > pSocketMap;
+ unique_ptr< Tizen::Base::Collection::HashMapT<Tizen::Base::String, _IBluetoothSocketListener*> > pClientSocketMap;
+
+ pServerSocketMap.reset(new (std::nothrow) HashMapT<int, _IBluetoothSocketListener*>);
+ SysTryReturn(NID_NET_BT, pServerSocketMap != null, false, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ r = pServerSocketMap->Construct();
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));
+
+ pSocketMap.reset(new (std::nothrow) HashMapT<int, _IBluetoothSocketListener*>);
+ SysTryReturn(NID_NET_BT, pSocketMap != null, false, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ r = pSocketMap->Construct();
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));
+
+ pClientSocketMap.reset(new (std::nothrow) HashMapT<String, _IBluetoothSocketListener*>);
+ SysTryReturn(NID_NET_BT, pClientSocketMap != null, false, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ //construct map with default capacity(16) and loadFactor(0.75f) value.
+ r = pClientSocketMap->Construct(16, 0.75f, _btAddressHashCodeProvider, _btAddressComparer);
+ SysTryReturn(NID_NET_BT, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));
+
+ err = bt_socket_set_connection_state_changed_cb(&OnSocketConnectionStateChanged, null);
+ SysTryReturn(NID_NET_BT, err == BT_ERROR_NONE, false, E_SYSTEM, "[E_SYSTEM] Registering the callback method has failed.");
+
+ err = bt_socket_set_data_received_cb(&OnSocketDataReceived, null);
+ if (err != BT_ERROR_NONE)
+ {
+ (void) bt_socket_unset_connection_state_changed_cb();
+ }
+ SysTryReturn(NID_NET_BT, err == BT_ERROR_NONE, false, E_SYSTEM, "[E_SYSTEM] Registering the callback method has failed.");
+
+ err = bt_socket_set_connection_requested_cb(&OnSocketConnectionRequested, null);
+ if (err != BT_ERROR_NONE)
+ {
+ (void) bt_socket_unset_connection_state_changed_cb();
+ (void) bt_socket_unset_data_received_cb();
+ }
+ SysTryReturn(NID_NET_BT, err == BT_ERROR_NONE, false, E_SYSTEM, "[E_SYSTEM] Registering the callback method has failed.");
+
+ __pServerSocketMap = move(pServerSocketMap);
+ __pSocketMap = move(pSocketMap);
+ __pClientSocketMap = move(pClientSocketMap);
+
+ return true;
+}
+
+result
+_BluetoothSppSystemAdapter::OpenServerSocket(const UuId& serviceUuid, _IBluetoothSocketListener& listener, int& serverSocketFd)
+{
+ int err = BT_ERROR_NONE;
+ result r = E_FAILURE;
+ unique_ptr<char[]> pUuidStr;
+ unique_ptr<int, _SocketFdDeleter> pSocketFd(&serverSocketFd);
+ bool isUsed = false;
+
+ pUuidStr.reset(_StringConverter::CopyToCharArrayN(serviceUuid.ToString()));
+ SysTryReturnResult(NID_NET_BT, pUuidStr != null, E_INVALID_ARG, "The service UUID is invalid.");
+
+ err = bt_adapter_is_service_used(pUuidStr.get(), &isUsed);
+ SysTryReturnResult(NID_NET_BT, (err == BT_ERROR_NONE) && !isUsed, E_SERVICE_UNAVAILABLE,
+ "Server socket with the specified service UUID is not available.");
+
+ err = bt_socket_create_rfcomm(pUuidStr.get(), &serverSocketFd);
+ SysTryReturnResult(NID_NET_BT, err == BT_ERROR_NONE, E_FAILURE, "Creating a server socket has failed.");
+
+ err = bt_socket_listen(serverSocketFd, 1);
+ SysTryReturnResult(NID_NET_BT, err == BT_ERROR_NONE, E_FAILURE, "Listen of the server socket has failed.");
+
+ SysLog(NID_NET_BT, "A rfcomm server socket (FD: %d) is created.", serverSocketFd);
+
+ // add the _IBluetoothSocketListener pointer to the server socket map.
+ r = __pServerSocketMap->Add(serverSocketFd, &listener);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_FAILURE, "Propagating.");
+
+ pSocketFd.release();
+
+ return E_SUCCESS;
+}
+
+result
+_BluetoothSppSystemAdapter::CloseServerSocket(const int serverSocketFd)
+{
+ int err = BT_ERROR_NONE;
+ result r = E_SUCCESS;
+
+ err = bt_socket_destroy_rfcomm(serverSocketFd);
+ SysTryReturnResult(NID_NET_BT, err == BT_ERROR_NONE, E_FAILURE, "Closing the server socket has failed.");
+ SysLog(NID_NET_BT, "The server socket (FD: %d) is closed.", serverSocketFd);
+
+ // remove the _IBluetoothSocketListener pointer related to the specified socket FD from the server socket map.
+ r = __pServerSocketMap->Remove(serverSocketFd);
+ if (r != E_SUCCESS)
+ {
+ SysLog(NID_NET_BT, "But the server socket could not be removed from the server socket map.");
+ // 'r', the error result generated after destroying the socket successfully, is NOT propagated
+ }
+
+ return E_SUCCESS;
+}
+
+result
+_BluetoothSppSystemAdapter::AcceptSocketRequest(int serverSocketFd, int& socketFd)
+{
+ int err = BT_ERROR_NONE;
+ result r = E_SUCCESS;
+ _IBluetoothSocketListener* pListener = null;
+
+ // find the appropriate _IBluetoothSocketListener pointer with the server socket FD.
+ r = __pServerSocketMap->GetValue(serverSocketFd, pListener);
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_FAILURE, "The server socket number is unknown.");
+
+ err = bt_socket_accept(serverSocketFd, &socketFd);
+ SysTryReturnResult(NID_NET_BT, err == BT_ERROR_NONE, E_FAILURE, "Accepting the connection request has failed.");
+
+ SysLog(NID_NET_BT, "The connection request to the server socket (FD: %d) is accepted. (child socket FD: %d)",
+ serverSocketFd, socketFd);
+
+ // add the _IBluetoothSocketListener pointer to the socket map.
+ // In case for server socket event, _IBluetoothSocketListener pointer is copied from __pServerSocketMap to __pSocketMap
+ r = __pSocketMap->Add(socketFd, pListener);
+ if (r != E_SUCCESS)
+ {
+ (void) bt_socket_disconnect_rfcomm(socketFd);
+ }
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_FAILURE, "Propagating.");
+
+ return E_SUCCESS;
+}
+
+result
+_BluetoothSppSystemAdapter::RejectSocketRequest(int serverSocketFd)
+{
+ result r = E_FAILURE;
+
+ if (bt_socket_reject(serverSocketFd) == BT_ERROR_NONE)
+ {
+ r = E_SUCCESS;
+ }
+
+ SysLog(NID_NET_BT, "Rejecting the connection request to the server socket (FD: %d) ", serverSocketFd,
+ r == E_SUCCESS ? "is successful." : "has failed.");
+
+ return r;
+}
+
+result
+_BluetoothSppSystemAdapter::ConnectSocket(const ByteBuffer& serverAddress, const UuId& serviceUuid,
+ _IBluetoothSocketListener& listener)
+{
+ result r = E_SUCCESS;
+ unique_ptr<char[]> pAddressStr;
+ unique_ptr<char[]> pUuidStr;
+ int err = BT_ERROR_NONE;
+ String address;
+ String uuid;
+ String key;
+
+ SysTryReturnResult(NID_NET_BT, serverAddress.GetRemaining() == _BT_ADDRESS_LENGTH, E_INVALID_ARG,
+ "The address of the remote device is incorrect.");
+
+ uuid = serviceUuid.ToString();
+ pUuidStr.reset(_StringConverter::CopyToCharArrayN(uuid));
+ SysTryReturnResult(NID_NET_BT, pUuidStr != null, E_INVALID_ARG, "The service UUID is invalid.");
+
+ address = _BluetoothDeviceImpl::GetAddressString(serverAddress);
+ pAddressStr.reset(_StringConverter::CopyToCharArrayN(address));
+ SysTryReturnResult(NID_NET_BT, pAddressStr != null, E_INVALID_ARG, "The service UUID is invalid.");
+
+ err = bt_socket_connect_rfcomm(pAddressStr.get(), pUuidStr.get());
+ SysTryReturnResult(NID_NET_BT, err == BT_ERROR_NONE, E_FAILURE, "Connecting to the server has failed.");
+
+ SysLog(NID_NET_BT, "Sending a connection request to [%s] is successful.", pAddressStr.get());
+
+ // add the _IBluetoothSocketListener pointer to the client socket map.
+ key = address + String(L"+") + uuid;
+ r = __pClientSocketMap->Add(key, &listener);
+ if (r != E_SUCCESS)
+ {
+ // TODO: check the feature that cancels the connection request.
+ (void) bt_socket_disconnect_rfcomm(_BT_INVALID_SOCKET_FD);
+ }
+ SysTryReturnResult(NID_NET_BT, r == E_SUCCESS, E_FAILURE, "Propagating.");
+
+ return E_SUCCESS;
+}
+
+result
+_BluetoothSppSystemAdapter::DisconnectSocket(int socketFd)
+{
+ result r = E_SUCCESS;
+ int err = BT_ERROR_NONE;
+
+ // TODO: more detailed error resolution is needed
+ err = bt_socket_disconnect_rfcomm(socketFd);
+ SysTryReturnResult(NID_NET_BT, err == BT_ERROR_NONE, E_FAILURE, "Disconnecting the rfcomm socket has failed.");
+
+ SysLog(NID_NET_BT, "Disconnecting the rfcomm socket (FD: %d) is successful.", socketFd);
+
+ r = __pSocketMap->Remove(socketFd);
+ if (r != E_SUCCESS)
+ {
+ SysLog(NID_NET_BT, "But, The socket (FD: %d) could not be removed from the socket map.", socketFd);
+ // 'r', the error result generated after destroying the socket successfully, is NOT propagated
+ }
+
+ return E_SUCCESS;
+}
+
+result
+_BluetoothSppSystemAdapter::SendSocketData(int socketFd, const Tizen::Base::ByteBuffer& data)
+{
+ result r = E_SUCCESS;
+ const byte* pSendData = null;
+ int dataLength = 0;
+
+ pSendData = data.GetPointer();
+ pSendData += data.GetPosition();
+ dataLength = data.GetRemaining();
+
+ if (bt_socket_send_data(socketFd, (char*) pSendData, dataLength) == BT_ERROR_NONE)
+ {
+ r = E_SUCCESS;
+ }
+ else
+ {
+ r = E_SYSTEM;
+ }
+
+ SysLog(NID_NET_BT, "Sending data (%d bytes) through the rfcomm socket (FD: %d) %s", dataLength, socketFd,
+ r == E_SUCCESS ?"is successful." : "has failed.");
+
+ return r;
+}
+
+void
+_BluetoothSppSystemAdapter::OnSocketConnectionRequested(int serverSocketFd, const char* pRemoteAddress, void* pUserData)
+{
+ result r = E_SUCCESS;
+ ByteBuffer deviceAddress;
+ BluetoothDevice requester;
+ String deviceAddressStr(pRemoteAddress);
+ _IBluetoothSocketListener* pListener = null;
+ _BluetoothSppSystemAdapter* pSppAdapter = _BluetoothSppSystemAdapter::GetInstance();
+
+ // find the appropriate _IBluetoothSocketListener pointer with the server socket FD.
+ // the server socket FD is used for distinguishing the recipient from the registered server sockets.
+ r = pSppAdapter->__pServerSocketMap->GetValue(serverSocketFd, pListener);
+ SysTryReturnVoidResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] The socket number is unknown.");
+
+ deviceAddress.Construct(_BT_ADDRESS_LENGTH);
+ (void) _BluetoothDeviceImpl::GetAddressByteBuffer(deviceAddressStr, L":", deviceAddress);
+
+ r = _BluetoothGapSystemAdapter::GetPairedDevice(deviceAddress, requester);
+ SysTryReturnVoidResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] Getting information of the request has failed.");
+
+ pListener->OnSocketConnectionRequested(requester);
+}
+
+void
+_BluetoothSppSystemAdapter::OnSocketConnectionStateChanged(int status, bt_socket_connection_state_e connectionState,
+ bt_socket_connection_s* pConnectionInfo, void* pUserData)
+{
+ result r = E_SUCCESS;
+ _IBluetoothSocketListener* pListener = null;
+ _BluetoothSppSystemAdapter* pSppAdapter = _BluetoothSppSystemAdapter::GetInstance();
+
+ switch (connectionState)
+ {
+ case BT_SOCKET_CONNECTED:
+ if (pConnectionInfo->local_role == BT_SOCKET_CLIENT)
+ {
+ SysLog(NID_NET_BT, "Connected event from [address: %s, uuid: %s] is received.",
+ pConnectionInfo->remote_address, pConnectionInfo->service_uuid);
+
+ String address(pConnectionInfo->remote_address);
+ String uuid(pConnectionInfo->service_uuid);
+ String key = address + String(L"+") + uuid;
+
+ // find the appropriate _IBluetoothSocketListener pointer with the server address and the service UUID.
+ r = pSppAdapter->__pClientSocketMap->GetValue(key, pListener);
+ SysTryReturnVoidResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] The server address or the service UUID is unknown.");
+
+ // TODO: more detailed error resolution is needed
+ if (status == BT_ERROR_NONE)
+ {
+ // add the _IBluetoothSocketListener pointer to the socket map.
+ // In case for client socket event, the _IBluetoothSocketListener ponter is moved
+ // from __pClientSocketMap to __pSocketMap
+ r = pSppAdapter->__pSocketMap->Add(pConnectionInfo->socket_fd, pListener);
+ if (r != E_SUCCESS)
+ {
+ SysLogException(NID_NET_BT, E_SYSTEM, "[%s] Propagating. the socket could not be added to the socket map.",
+ GetErrorMessage(r));
+ r = E_SYSTEM;
+ }
+ }
+ else
+ {
+ SysLog(NID_NET_BT, "[E_SYSTEM] Connection request failure is reported by the subsystem.");
+ r = E_SYSTEM;
+ }
+
+ pListener->OnSocketConnectionResponded(pConnectionInfo->socket_fd, r);
+
+ // remove the _IBluetoothSocketListener pointer related to the specified server address and UUID
+ // from the client socket map.
+ r = pSppAdapter->__pClientSocketMap->Remove(key);
+ if (r != E_SUCCESS)
+ {
+ SysLog(NID_NET_BT, "But the socket could not be removed from the client socket map.");
+ // 'r', the error result is ignored.
+ }
+
+ }
+ // this event is ignored in case of SERVER ROLE.
+
+ break;
+
+ case BT_SOCKET_DISCONNECTED:
+ SysLog(NID_NET_BT, "Disconnected event with [socket fd: %d] is received.", pConnectionInfo->socket_fd);
+
+ // find the appropriate _IBluetoothSocketListener pointer with the socket FD
+ r = pSppAdapter->__pSocketMap->GetValue(pConnectionInfo->socket_fd, pListener);
+ SysTryReturnVoidResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] The socket number is unknown.");
+
+ // TODO: more detailed error resolution is needed
+ r = ((status == BT_ERROR_NONE) ? E_SUCCESS : E_SYSTEM);
+
+ pListener->OnSocketDisconnected(r);
+
+ // remove the _IBluetoothSocketListener pointer related to the specified socket FD from the socket map.
+ r = pSppAdapter->__pSocketMap->Remove(pConnectionInfo->socket_fd);
+ if (r != E_SUCCESS)
+ {
+ SysLog(NID_NET_BT, "But the socket (FD: %d) could not be removed from the socket map.",
+ pConnectionInfo->socket_fd);
+ // 'r', the error result is ignored.
+ }
+
+ break;
+
+ default:
+ // ignore other cases
+ SysLog(NID_NET_BT, "The connection state is invalid.");
+ break;
+ }
+}
+
+void
+_BluetoothSppSystemAdapter::OnSocketDataReceived(bt_socket_received_data_s* pData, void* pUserData)
+{
+ result r = E_SUCCESS;
+ ByteBuffer dataBuffer;
+ _IBluetoothSocketListener* pListener = null;
+ _BluetoothSppSystemAdapter* pSppAdapter = _BluetoothSppSystemAdapter::GetInstance();
+
+ SysLog(NID_NET_BT, "Data (%d bytes) through the socket (FD: %d) is received.", pData->data_size, pData->socket_fd);
+
+ // find the appropriate _IBluetoothSocketListener pointer with the socket FD
+ r = pSppAdapter->__pSocketMap->GetValue(pData->socket_fd, pListener);
+ SysTryReturnVoidResult(NID_NET_BT, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] The socket number is unknown.");
+
+ // TODO: The deep copy should be modified to a shallow copy for better performance
+ dataBuffer.Construct(pData->data_size);
+ dataBuffer.SetArray((byte*) pData->data, 0, pData->data_size);
+ dataBuffer.SetPosition(0);
+
+ pListener->OnSocketDataReceived(dataBuffer);
+}
+
+} } } // Tizen::Net::Bluetooth
diff --git a/src/FNetBt_BluetoothSppSystemAdapter.h b/src/FNetBt_BluetoothSppSystemAdapter.h
new file mode 100644
index 0000000..d741a9c
--- /dev/null
+++ b/src/FNetBt_BluetoothSppSystemAdapter.h
@@ -0,0 +1,203 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothSppSystemAdapter.h
+ * @brief This is the header file for the _BluetoothSppSystemAdapter class.
+ *
+ * This header file contains the declaration of the _BluetoothSppSystemAdapter class.
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_SPP_SYSTEM_ADAPTER_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_SPP_SYSTEM_ADAPTER_H_
+
+#include <unique_ptr.h>
+#include <bluetooth.h>
+#include <FBaseObject.h>
+#include <FBaseResult.h>
+#include <FNetBtBluetoothTypes.h>
+
+static const int _BT_INVALID_SOCKET_FD = -1;
+
+// forward declarations
+namespace Tizen { namespace Base {
+class ByteBuffer;
+class String;
+class UuId;
+
+namespace Collection {
+class ArrayList;
+template<class keyType, class valueType> class HashMapT;
+}
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// forward declarations
+class BluetoothDevice;
+class _IBluetoothSocketListener;
+
+/**
+ * @class _BluetoothSppSystemAdapter
+ * @brief This class provides functions related to RFCOMM socket (SPP) and have a role of adaptation OSP classes and the
+ * underlying subsystem. This class is a type of singleton, therefore only one instance should be allowed.
+ */
+class _BluetoothSppSystemAdapter
+ : public Tizen::Base::Object
+{
+public:
+ /**
+ * Creates an instance of this class if there is no instance in this application context.
+ * Gets the exist instance because this class is a singleton, otherwise.
+ *
+ * @return the instance of this class
+ */
+ static _BluetoothSppSystemAdapter* GetInstance(void);
+
+
+ //-----------------------------------------------------------------------------------------------------------------
+ // Server Socket
+ //-----------------------------------------------------------------------------------------------------------------
+
+ /**
+ * Create and initialize a server socket, and start to listen the socket events. @n
+ * An instance of _IBluetoothSocketListener class is registered internally.
+ *
+ * @return An error code
+ * @param[in] serviceUuid The service UUID
+ * @param[in] listener The instance of _IBluetoothSocketListener to be registered
+ * @param[out] serverSocketFd The server socket FD
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SERVICE_UNAVAILABLE The service is not available.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ result OpenServerSocket(const Tizen::Base::UuId& serviceUuid, _IBluetoothSocketListener& listener, int& serverSocketFd);
+
+ /**
+ * Close the specified server socket. @n
+ * All child sockets involved in this server socket will be automatically disconnected.
+ *
+ * @return An error code
+ * @param[in] serverSocketFd The server socket FD
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ result CloseServerSocket(int serverSocketFd);
+
+ /**
+ * Accept the connection request received to the specified server socket. @n
+ * A new child socket is created if the accept is successful.
+ *
+ * @return An error code
+ * @param[in] serverSocketFd The server socket FD
+ * @param[out] socketFd The child socket FD for the connection
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ result AcceptSocketRequest(int serverSocketFd, int& socketFd);
+
+ /**
+ * Reject the connection request received to the specified server socket.
+ *
+ * @return An error code
+ * @param[in] serverSocketFd The server socket FD
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ result RejectSocketRequest(int serverSocketFd);
+
+
+ //-----------------------------------------------------------------------------------------------------------------
+ // socket
+ //-----------------------------------------------------------------------------------------------------------------
+
+ /**
+ * Connect with the specified server. @n
+ * A new socket FD can be acquired on
+ * OnSocketConnected() callback method invoked when the connection is completely established.
+ *
+ * @return An error code
+ * @param[in] serverAddress The address of the server
+ * @param[in] serviceUuid The service UUID
+ * @param[in] listener The socket event listener
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ result ConnectSocket(const Tizen::Base::ByteBuffer& serverAddress, const Tizen::Base::UuId& serviceUuid,
+ _IBluetoothSocketListener& listener);
+
+ /**
+ * Close the connection related to the specified socket. @n
+ *
+ * @return An error code
+ * @param[in] socketFd The socket FD
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ result DisconnectSocket(int socketFd);
+
+ /**
+ * Send data through the connection related to the specified socket. @n
+ *
+ * @return An error code
+ * @param[in] socketFd The socket FD
+ * @param[in] data The data to be sent
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ result SendSocketData(int socketFd, const Tizen::Base::ByteBuffer& data);
+
+
+ //-----------------------------------------------------------------------------------------------------------------
+ // Callback methods
+ //-----------------------------------------------------------------------------------------------------------------
+
+ /**
+ * Callback called by the underlying system to notify that the RFCOMM server socket is received the connection request.
+ */
+ static void OnSocketConnectionRequested(int serverSocketFd, const char* pRemoteAddress, void* pUserData);
+
+ /**
+ * Callback called by the underlying system to notify that the connection state has changed to connected or disconnected.
+ */
+ static void OnSocketConnectionStateChanged(int status, bt_socket_connection_state_e connectionState,
+ bt_socket_connection_s* pConnectionInfo, void* pUserData);
+
+ /**
+ * Callback used by the underlying system to notify that data is received on the established connection.
+ */
+ static void OnSocketDataReceived(bt_socket_received_data_s* pData, void* pUserData);
+
+private:
+ _BluetoothSppSystemAdapter(void);
+ ~_BluetoothSppSystemAdapter(void);
+
+ _BluetoothSppSystemAdapter(const _BluetoothSppSystemAdapter& value);
+ _BluetoothSppSystemAdapter& operator =(const _BluetoothSppSystemAdapter& value);
+
+ bool Construct(void);
+
+ static void InitSingleton(void);
+
+private:
+ std::unique_ptr< Tizen::Base::Collection::HashMapT<int, _IBluetoothSocketListener*> > __pServerSocketMap;
+ std::unique_ptr< Tizen::Base::Collection::HashMapT<int, _IBluetoothSocketListener*> > __pSocketMap;
+ std::unique_ptr< Tizen::Base::Collection::HashMapT<Tizen::Base::String, _IBluetoothSocketListener*> > __pClientSocketMap;
+ static _BluetoothSppSystemAdapter* __pInstance;
+}; // _BluetoothSppSystemAdapter
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_SPP_SYSTEM_ADAPTER_H_
diff --git a/src/inc/FNetBt_BluetoothAdapterUtility.h b/src/inc/FNetBt_BluetoothAdapterUtility.h
new file mode 100644
index 0000000..6bc47de
--- /dev/null
+++ b/src/inc/FNetBt_BluetoothAdapterUtility.h
@@ -0,0 +1,73 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothAdapterUtility.h
+ * @brief This is the header file for the _BluetoothAdapterUtility class.
+ *
+ * This header file contains the declaration of the _BluetoothAdapterUtility class.
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_ADAPTER_UTILITY_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_ADAPTER_UTILITY_H_
+
+#include <bluetooth.h>
+#include <FBaseResult.h>
+#include <FNetBtBluetoothTypes.h>
+
+// forward declarations
+namespace Tizen { namespace Base
+{
+class ByteBuffer;
+
+namespace Collection
+{
+class IList;
+}
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// forward declarations
+class BluetoothDevice;
+
+/**
+ * @class _BluetoothAdapterUtility
+ * @brief This class provides utilitiy functions such as converting data structure to other data class, and printing data class.
+ */
+class _OSP_EXPORT_ _BluetoothAdapterUtility
+{
+public:
+ static BluetoothMajorDeviceClassType ConvertToMajorDeviceClassType(bt_major_device_class_e majorClass);
+ static BluetoothMinorDeviceClassType ConvertToMinorDeviceClassType(bt_major_device_class_e majorClass, bt_minor_device_class_e minorClass);
+ static unsigned long ConvertToServiceClassList(int serviceClass);
+ static unsigned long ConvertToServiceList(char** pServiceUuid, int& serviceUuidCount);
+ static Tizen::Base::Collection::IList* ConvertServiceUuidListN(char** pServiceUuid, int& serviceUuidCount);
+ static void PrintDeviceInfo(const BluetoothDevice& device);
+ static void PrintServiceList(unsigned long type);
+ static void PrintServiceUuidList(const Tizen::Base::Collection::IList* pList);
+
+private:
+ _BluetoothAdapterUtility(void);
+ ~_BluetoothAdapterUtility(void);
+
+ _BluetoothAdapterUtility(const _BluetoothAdapterUtility& value);
+ _BluetoothAdapterUtility& operator =(const _BluetoothAdapterUtility& value);
+
+}; // _BluetoothAdapterUtility
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_ADAPTER_UTILITY_H_
diff --git a/src/inc/FNetBt_BluetoothDeviceImpl.h b/src/inc/FNetBt_BluetoothDeviceImpl.h
new file mode 100755
index 0000000..bc3c9cd
--- /dev/null
+++ b/src/inc/FNetBt_BluetoothDeviceImpl.h
@@ -0,0 +1,318 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothDeviceImpl.h
+ * @brief This is the header file for the _BluetoothDeviceImpl Class.
+ *
+ * This header file contains the declarations of the _BluetoothDeviceImpl Class.
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_DEVICE_IMPL_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_DEVICE_IMPL_H_
+
+#include <unique_ptr.h>
+#include <FBaseColAllElementsDeleter.h>
+#include <FNetBtBluetoothTypes.h>
+#include <FBaseResult.h>
+#include <FBaseObject.h>
+#include <FBaseByteBuffer.h>
+#include <FBaseString.h>
+
+// forward declarations
+namespace Tizen { namespace Base { namespace Collection
+{
+class IList;
+} } }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// forward declarations
+class BluetoothDevice;
+
+/**
+ * @class _BluetoothDeviceImpl
+ * @brief This class provides extended methods for BluetoothDevice class.
+ *
+ * The detailed description will be located here (TBD)
+ */
+class _OSP_EXPORT_ _BluetoothDeviceImpl
+ : public Tizen::Base::Object
+{
+public:
+ /**
+ * This is the default constructor for this class.
+ */
+ _BluetoothDeviceImpl(void);
+
+ /**
+ * Initializes this instance of BluetoothDevice with the specified parameters.
+ *
+ * @deprecated This constructor is deprecated because most of the information is generated internally.
+ * Therefore, creating a %BluetoothDevice instance directly by the application is not recommended.
+ * Instead of using this method for copying an instance, the copy constructor is recommended.
+ *
+ * @param[in] address The %Bluetooth device address
+ * @param[in] deviceName The name of the device
+ * @param[in] majorClassType The major class type of a %Bluetooth device
+ * @param[in] minorClassType The minor class type of a %Bluetooth device
+ * @param[in] serviceClassList The service class type list
+ * @param[in] serviceList The service type list
+ * @remarks The @c serviceClassList parameter consists of Tizen::Net::Bluetooth::BluetoothServiceClassType values
+ * which are joined by the logical OR operator. @n
+ * The @c serviceList parameter consists of Tizen::Net::Bluetooth::BluetoothServiceType values which are
+ * joined by the logical OR operator.
+ */
+ _BluetoothDeviceImpl(const Tizen::Base::ByteBuffer& address, const Tizen::Base::String& deviceName, BluetoothMajorDeviceClassType majorClassType, BluetoothMinorDeviceClassType minorClassType, unsigned long serviceClassList, unsigned long serviceList);
+
+ /**
+ * This is the copy constructor for the %_BluetoothDeviceImpl class. @n
+ *
+ * @param[in] value An instance of %_BluetoothDeviceImpl
+ */
+ _BluetoothDeviceImpl(const _BluetoothDeviceImpl& value);
+
+ /**
+ * This is the destructor for this class.
+ */
+ ~_BluetoothDeviceImpl(void);
+
+ /**
+ * Gets the %Bluetooth device's address.
+ *
+ * @return The address of the %Bluetooth device
+ */
+ const Tizen::Base::ByteBuffer* GetAddress(void) const;
+
+ /**
+ * Gets the %Bluetooth device name.
+ *
+ * @return The %Bluetooth device name
+ */
+ Tizen::Base::String GetName(void) const;
+
+ /**
+ * Checks whether this device is paired with the local device.
+ *
+ * @return @c true if this device is paired with the local device, @n
+ * else @c false
+ */
+ bool IsPaired(void) const;
+
+ /**
+ * Gets the Received Signal Strength Indication (RSSI) value of the device at the time of device discovery (scan).
+ *
+ * @return The RSSI value in dbm
+ */
+ int GetRssi(void) const;
+
+ /**
+ * Gets the major device class.
+ *
+ * @return The major device class
+ */
+ BluetoothMajorDeviceClassType GetMajorDeviceClassType(void) const;
+
+ /*
+ * Gets the minor device class.
+ *
+ * @return The minor device class
+ */
+ BluetoothMinorDeviceClassType GetMinorDeviceClassType(void) const;
+
+ /**
+ * Gets the service class of the %Bluetooth device. @n
+ * This service class list consists of Tizen::Net::Bluetooth::BluetoothServiceClassType values which are joined by
+ * the logical OR operator.
+ *
+ * @return The service class of the device
+ * @remarks This operation is not supported in the local device acquired by BluetoothManager::GetLocalDevice().
+ */
+ unsigned long GetServiceClassList(void) const;
+
+ /**
+ * Gets the %Bluetooth device service list. @n
+ * This service list consists of Tizen::Net::Bluetooth::BluetoothServiceType values which are joined by the logical
+ * OR operator.
+ *
+ * @return The %Bluetooth device serviceList
+ * @remarks This operation is not supported in the local device acquired by BluetoothManager::GetLocalDevice().
+ */
+ unsigned long GetServiceList(void) const;
+
+ /**
+ * Gets the %Bluetooth device service UUID list. @n
+ * This service list consists of Tizen::Base::UuId instances, which represents service UUIDs the device supports.
+ *
+ * @return The %Bluetooth device service UUID list
+ * @remarks This operation returns @c null, if it is called in the local device acquired by
+ * BluetoothManager::GetLocalDevice().
+ */
+ const Tizen::Base::Collection::IList* GetServiceUuidList(void) const;
+
+ /**
+ * Compares the calling instance with the specified instance.
+ *
+ * @return @c true, if both the instances are equal @n
+ * @c false, otherwise
+ * @param[in] obj The object to compare
+ */
+ virtual bool Equals(const Tizen::Base::Object& obj) const;
+
+ /**
+ * Gets the hash value of the current instance.
+ *
+ * @return The hash value of the current instance
+ * @remarks Two equal instances return the same hash value.
+ */
+ virtual int GetHashCode(void) const;
+
+ /**
+ * Sets the address of the %Bluetooth device.
+ *
+ * @return An error code
+ * @param[in] address The Bluetooth device address
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_ARG The argument is invalid.
+ */
+ result SetAddress(const Tizen::Base::ByteBuffer& address);
+
+ /**
+ * Sets the name of the %Bluetooth device.
+ *
+ * @param[in] name The Bluetooth device address
+ */
+ void SetName(const Tizen::Base::String& name);
+
+ /**
+ * Sets the major device class.
+ *
+ * @param[in] type The major device class
+ */
+ void SetMajorDeviceClassType(BluetoothMajorDeviceClassType type);
+
+ /**
+ * Sets the minor device class.
+ *
+ * @param[in] type The minor device class
+ */
+ void SetMinorDeviceClassType(BluetoothMinorDeviceClassType type);
+
+ /**
+ * Sets the service class of the %Bluetooth device. @n
+ * This service class list should consist of Tizen::Net::Bluetooth::BluetoothServiceClassType values which are joined by
+ * the logical OR operator.
+ *
+ * @param[in] listValue The service class of the device
+ */
+ void SetServiceClassList(unsigned long listValue);
+
+ /**
+ * Sets the service list value of the %Bluetooth device.
+ *
+ * @param[in] serviceList The service type list
+ */
+ void SetServiceList(unsigned long serviceList);
+
+ /**
+ * Sets the service UUID list of the %Bluetooth device.
+ *
+ * @param[in] pSrcUuidList The service UUID list
+ * @param[in] isDeepCopy Set to @c true if the UUID list should be copied deeply @n
+ * else @c false
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_MEMORY Insufficient memory.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ result SetServiceUuidList(const Tizen::Base::Collection::IList* pSrcUuidList, bool isDeepCopy);
+
+ /**
+ * Sets the service list value of the %Bluetooth device.
+ *
+ * @param[in] isPaired The service type list
+ */
+ void SetPaired(bool isPaired);
+
+ /**
+ * Sets the service list value of the %Bluetooth device.
+ *
+ * @param[in] rssi The service type list
+ */
+ void SetRssi(int rssi);
+
+ /**
+ * Transforms the %Bluetooth address from the string type to the byte type.
+ *
+ * @return An error code
+ * @param[in] srcAddr The original %Bluetooth address to be converted
+ * @param[in] delimiters The delimiters
+ * @param[out] dstAddr The converted %Bluetooth address as the byte type
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ static result GetAddressByteBuffer(const Tizen::Base::String& srcAddr, const Tizen::Base::String& delimiters, Tizen::Base::ByteBuffer& dstAddr);
+
+ /**
+ * Transforms the %Bluetooth address from the byte type to the string type.
+ *
+ * @return The converted address string
+ * @param[in] address The original %Bluetooth address to be converted as the byte type
+ */
+ static Tizen::Base::String GetAddressString(const Tizen::Base::ByteBuffer& address);
+
+ /**
+ * This assignment operator copies the information from the specified instance of %_BluetoothDeviceImpl to the
+ * calling instance of %_BluetoothDeviceImpl.
+ *
+ * @return A reference to the %_BluetoothDeviceImpl instance
+ * @param[in] rhs A reference to the %_BluetoothDeviceImpl instance to copy
+ */
+ _BluetoothDeviceImpl& operator =(const _BluetoothDeviceImpl& rhs);
+
+public:
+ /**
+ * Gets the Impl instance.
+ *
+ * @return The pointer to _BluetoothDeviceImpl
+ * @param[in] pBluetoothDevice An instance of BluetoothDevice
+ */
+ static _BluetoothDeviceImpl* GetInstance(BluetoothDevice& bluetoothDevice);
+
+ /**
+ * Gets the Impl instance.
+ *
+ * @return The pointer to _BluetoothDeviceImpl
+ * @param[in] pBluetoothDevice An instance of BluetoothDevice
+ */
+ static const _BluetoothDeviceImpl* GetInstance(const BluetoothDevice& bluetoothDevice);
+
+private:
+ Tizen::Base::ByteBuffer __deviceAddress;
+ Tizen::Base::String __deviceName;
+ bool __isPaired;
+ int __rssi;
+ BluetoothMajorDeviceClassType __majorClassType;
+ BluetoothMinorDeviceClassType __minorClassType;
+ unsigned long __serviceClassList;
+ unsigned long __serviceList;
+ std::unique_ptr<Tizen::Base::Collection::IList, Tizen::Base::Collection::AllElementsDeleter> __pServiceUuidList;
+
+ static const int BT_ADDRESS_LENGTH = 6;
+
+}; // _BluetoothDeviceImpl
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_DEVICE_IMPL_H_
diff --git a/src/inc/FNetBt_BluetoothHealthImpl.h b/src/inc/FNetBt_BluetoothHealthImpl.h
new file mode 100644
index 0000000..7575721
--- /dev/null
+++ b/src/inc/FNetBt_BluetoothHealthImpl.h
@@ -0,0 +1,218 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothHealthImpl.h
+ * @brief This is the header file for the _BluetoothHealthImpl class.
+ *
+ * This header file contains the declaration of the _BluetoothHealthImpl class.
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_HEALTH_IMPL_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_HEALTH_IMPL_H_
+
+#include <unique_ptr.h>
+#include <FBaseObject.h>
+#include <FBaseResult.h>
+#include <FBaseRtMutex.h>
+#include <FBaseByteBuffer.h>
+#include <FBaseColLinkedListT.h>
+#include "FNetBt_IBluetoothManagerEventListener.h"
+#include "FNetBt_IBluetoothDeviceEventListener.h"
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+struct _CharDeleter
+{
+ void operator()(char* pChar)
+ {
+ free(pChar);
+ }
+};
+
+// Forward declarations
+class BluetoothDevice;
+class IBluetoothHealthEventListener;
+class _BluetoothGapSystemAdapter;
+class _BluetoothHdpSystemAdapter;
+class _BluetoothHealthEvent;
+
+/**
+ * @class _BluetoothHealthImpl
+ * @brief TBD
+ */
+class _OSP_EXPORT_ _BluetoothHealthImpl
+ : public Tizen::Base::Object
+ , public _IBluetoothManagerEventListener
+ , public _IBluetoothDeviceEventListener
+{
+/**
+ * @enum _BluetoothHealthStateType
+ * Defines the states of the Bluetooth Health service.
+ */
+ enum _BluetoothHealthStateType
+ {
+ _BT_HEALTH_STATE_DISABLED,
+ _BT_HEALTH_STATE_IDLE,
+ _BT_HEALTH_STATE_ON_SERVICE,
+ _BT_HEALTH_STATE_BONDING,
+ _BT_HEALTH_STATE_BOND_CANCELING
+ } ;
+
+public:
+ /**
+ * This is the default constructor for this class.
+ *
+ * @remarks After creating an instance of this class, you must explicitly call
+ * construction method to initialize the instance.
+ * @see Construct()
+ */
+ _BluetoothHealthImpl(void);
+
+ /**
+ * This is the destructor for this class.
+ */
+ ~_BluetoothHealthImpl(void);
+
+ /**
+ * Constructs a BluetoothHealth and attaches a listener to it.
+ *
+ * @return An error code
+ * @param[in] listener The event listener for the %BluetoothHealth
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_MEMORY The memory is insufficient.
+ * @exception E_OPERATION_FAILED The method has failed.
+ */
+ result Construct(IBluetoothHealthEventListener& listener);
+
+ /**
+ * Starts %Bluetooth health as a role of sink with the specified data type.
+ *
+ * @return An error code
+ * @param[in] dataType The type of data used in communication which is defined in ISO/IEEE
+ * 11073-20601 and represents type of health device such as thermometer,
+ * heart rate monitor, weight scale, and so on
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE %Bluetooth is not activated.
+ * @exception E_IN_PROGRESS The sink role with the specified data type has already started.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the sink role already started with another data type.
+ * @exception E_SERVICE_UNAVAILABLE The sink role with the specified data type is unavailable now because it
+ * has started by other instance or application.
+ * @exception E_OPERATION_FAILED The method has failed.
+ */
+ result StartAsSink(int dataType);
+
+ /**
+ * Stops %Bluetooth health as a role of sink. @n
+ * This method disconnects all established channels before stop.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE %Bluetooth is not activated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the sink role is not started yet.
+ * @exception E_OPERATION_FAILED The method has failed.
+ */
+ result Stop(void);
+
+ /**
+ * Sets up a new connection (channel) with a remote health device which has source role. @n
+ * This method establishes a channel after the source device accepts the request.
+ *
+ * @return An error code
+ * @param[in] remoteDevice The remote device to be connected with
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE %Bluetooth is not activated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the sink role is not started yet.
+ * @exception E_DEVICE_BUSY The pairing and connection process is in progress.
+ * @exception E_OPERATION_FAILED The method has failed.
+ */
+ result ConnectToSource(const BluetoothDevice& remoteDevice);
+
+ /**
+ * Disconnects the connection which has the specified channel ID. @n
+ *
+ * @return An error code
+ * @param[in] channelId The ID of the specified channel to be disconnected
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE %Bluetooth is not activated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, there is no connection with the specified channel ID.
+ * @exception E_OPERATION_FAILED The method has failed.
+ */
+ result Disconnect(int channelId);
+
+ /**
+ * Sends the specified data on the specified channel.
+ *
+ * @return An error code
+ * @param[in] channelId The ID of the specified channel to send data on
+ * @param[in] buffer The data to be sent
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE %Bluetooth is not activated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, there is no connection with the specified channel ID.
+ * @exception E_INVALID_ARG The input buffer has no data.
+ * @exception E_OPERATION_FAILED The operation has failed.
+ */
+ result SendData(int channelId, const Tizen::Base::ByteBuffer& buffer);
+
+ virtual void OnBluetoothActivated(result r);
+ virtual void OnBluetoothDeactivated(result r);
+ virtual void OnBluetoothDiscoverableModeChanged(BluetoothDiscoverableMode mode) {}
+ virtual void OnBluetoothDiscoveryStarted(result r) {}
+ virtual void OnBluetoothRemoteDeviceFound(const BluetoothDevice& foundDevice) {}
+ virtual void OnBluetoothDiscoveryDone(bool isCompleted) {}
+ virtual void OnBluetoothServiceListReceived(const Tizen::Base::ByteBuffer& address, unsigned long serviceList,
+ const Tizen::Base::Collection::IList* pServiceUuidList, result r) {};
+ virtual void OnBluetoothPaired(const BluetoothDevice* pPairedDevice, result r);
+ virtual void OnBluetoothUnpaired(const Tizen::Base::ByteBuffer& address) {}
+ virtual void OnBluetoothDeviceConnected(const Tizen::Base::ByteBuffer& address) {}
+ virtual void OnBluetoothDeviceDisconnected(const Tizen::Base::ByteBuffer& address) {}
+ void OnBluetoothHealthConnected(int channelId, BluetoothHealthDataChannelType channelType,
+ const BluetoothDevice* pRemoteDevice, result r);
+ void OnBluetoothHealthDisconnected(int channelId, result r);
+ void OnBluetoothHealthDataReceived(int channelId, Tizen::Base::ByteBuffer& buffer);
+
+private:
+ _BluetoothHealthImpl(const _BluetoothHealthImpl& value);
+ _BluetoothHealthImpl& operator =(const _BluetoothHealthImpl& value);
+
+ const char* GetStringOfCurrentState(void) const;
+
+private:
+ _BluetoothGapSystemAdapter* __pGapAdapter;
+ _BluetoothHdpSystemAdapter* __pHdpAdapter;
+ std::unique_ptr<_BluetoothHealthEvent> __pEvent;
+ Tizen::Base::Runtime::Mutex __stateMutex;
+ _BluetoothHealthStateType __currentState;
+ Tizen::Base::Collection::LinkedListT<int> __channelIdList;
+ Tizen::Base::ByteBuffer __pairingTargetAddress;
+ std::unique_ptr<char, _CharDeleter> __pAppId;
+ int __dataType;
+
+ static const int _BT_INVALID_DATA_TYPE = 0;
+
+}; // _BluetoothHealthImpl
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_HEALTH_IMPL_H_
diff --git a/src/inc/FNetBt_BluetoothManagerImpl.h b/src/inc/FNetBt_BluetoothManagerImpl.h
new file mode 100755
index 0000000..89d57d1
--- /dev/null
+++ b/src/inc/FNetBt_BluetoothManagerImpl.h
@@ -0,0 +1,529 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothManagerImpl.h
+ * @brief This is the header file for the _BluetoothManagerImpl class.
+ *
+ * This header file contains the declaration of the _BluetoothManagerImpl class.
+ */
+
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_MANAGER_IMPL_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_MANAGER_IMPL_H_
+
+#include <unique_ptr.h>
+#include <FBaseColAllElementsDeleter.h>
+#include <FOspConfig.h>
+#include <FBaseResult.h>
+#include <FBaseColArrayList.h>
+#include <FBaseColHashMap.h>
+#include <FBaseColLinkedList.h>
+#include <FBaseRtMutex.h>
+#include "FNetBt_IBluetoothManagerEventListener.h"
+#include "FNetBt_IBluetoothDeviceEventListener.h"
+#include "FNetBt_IBluetoothConnectionEventListener.h"
+
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// Forward declaration
+class BluetoothDevice;
+class IBluetoothManagerEventListener;
+class IBluetoothDeviceEventListener;
+class _BluetoothManagerEvent;
+class _BluetoothDeviceEvent;
+class _BluetoothConnectionEvent;
+class _BluetoothIpcProxy;
+class _BluetoothGapSystemAdapter;
+
+/**
+ * @class BluetoothManager
+ * @brief This class is used to get information about devices and discover objects, as well as to configure the
+ * Bluetooth stack.
+ */
+class _OSP_EXPORT_ _BluetoothManagerImpl
+ : public Tizen::Base::Object
+ , public _IBluetoothManagerEventListener
+ , public _IBluetoothDeviceEventListener
+ , public _IBluetoothConnectionEventListener
+{
+ /**
+ * @enum _BluetoothManagerStateType
+ * Defines the states of the Bluetooth Manager.
+ */
+ enum _BluetoothManagerStateType
+ {
+ _BT_MGR_STATE_DEACTIVATED,
+ _BT_MGR_STATE_ACTIVATING,
+ _BT_MGR_STATE_DEACTIVATING,
+ _BT_MGR_STATE_ACTIVATED,
+ _BT_MGR_STATE_DISCOVERY_REQUESTED,
+ _BT_MGR_STATE_ON_DISCOVERY,
+ _BT_MGR_STATE_DISCOVERY_CANCELING,
+ _BT_MGR_STATE_ON_DISCOVERY_BY_SYSTEM,
+ _BT_MGR_STATE_SERVICE_RETRIEVING
+ };
+
+ /**
+ * @enum _BluetoothPairingStateType
+ * Defines the states which is related to pairing.
+ */
+ enum _BluetoothPairingStateType
+ {
+ _BT_PAIRING_STATE_NONE,
+ _BT_PAIRING_STATE_PAIRING,
+ _BT_PAIRING_STATE_CANCELING
+ };
+
+public:
+ /**
+ * This is the default constructor for this class.
+ *
+ * @remarks After creating an instance of this class, you must explicitly call
+ * the Construct() method to initialize the instance.
+ * @see Construct()
+ */
+ _BluetoothManagerImpl(void);
+
+ /**
+ * This is the destructor for this class.
+ */
+ ~_BluetoothManagerImpl(void);
+
+ /**
+ * Initializes a BluetoothManager instance.
+ *
+ * @return An error code
+ * @param[in] listener The listener to handle %Bluetooth manager event
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_MEMORY Insufficient memory.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ result Construct(IBluetoothManagerEventListener& listener);
+
+ /**
+ * Activates %Bluetooth on the device.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_IN_PROGRESS The %Bluetooth activation process is in progress.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the
+ * specified operation. @n
+ * For example, the %Bluetooth is already activated.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ result Activate(void);
+
+ /**
+ * Deactivates Bluetooth.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_IN_PROGRESS The %Bluetooth deactivation process is in progress.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the
+ * specified operation. @n
+ * For example, the %Bluetooth is already deactivated.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ result Deactivate(void);
+
+ /**
+ * Checks whether the Bluetooth-specific profile is available.
+ *
+ * @deprecated This method is deprecated because multiple clients as well as multiple SPP servers with unique
+ * service UUIDs are supported. Instead of using this method for OPP server,
+ * BluetoothOppServer::StartService() without checking the OPP server connection's availability is
+ * recommended. If a new OPP server is not available, the method returns the E_SERVICE_UNAVAILABLE
+ * exception.
+ *
+ * @return @c true if connection is available @n
+ * @c false, otherwise
+ * @param[in] type The connection type
+ *
+ */
+ bool IsAvailable(BluetoothConnectionType type) const;
+
+ /**
+ * Gets the local device information.
+ *
+ * @deprecated This method is deprecated because the return value of this method is a dangling pointer if this
+ * instance of BluetoothManagerInpl is deleted. Instead of using this method, GetLocalDeviceAddress() and
+ * GetLocalDeviceName() are recommended.
+ *
+ * @return The local device information as a BluetoothDevice instance
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_MEMORY Insufficient memory.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ const BluetoothDevice* GetLocalDevice(void);
+
+ /**
+ * Gets the local %Bluetooth device address.
+ *
+ * @return The local %Bluetooth device address
+ * @remarks The address is expressed as a 6 byte hexadecimal value delimited by colon. @n
+ * For example, "00:3D:47:EF:8A:03".
+ */
+ Tizen::Base::String GetLocalDeviceAddress(void) const;
+
+ /**
+ * Gets the local %Bluetooth device name.
+ *
+ * @return The local %Bluetooth device name
+ */
+ Tizen::Base::String GetLocalDeviceName(void) const;
+
+ /**
+ * Gets the operational mode of the %Bluetooth unit.
+ *
+ * @deprecated BluetoothDeviceStateType is deprecated. Therefore, this method is also deprecated, because the
+ * return value of this method is of type BluetoothDeviceStateType. Instead of using this method,
+ * IsActivated() and GetDiscoverableMode() are recommended.
+ *
+ * @return The operational mode
+ */
+ BluetoothDeviceStateType GetLocalDeviceState(void) const;
+
+ /**
+ * Checks whether the local %Bluetooth is activated.
+ *
+ * @deprecated This method is deprecated because multiple clients as well as multiple SPP servers with unique
+ * service UUIDs are supported. Instead of using this method,
+ * BluetoothOppServer::StartService() without checking the OPP server connection's availability is
+ * recommended. If a new OPP server is not available, the method returns the E_SERVICE_UNAVAILABLE
+ * exception.
+ *
+ * @return @c true, if the local %Bluetooth is activated @n
+ * @c false, otherwise
+ */
+ bool IsActivated(void) const;
+
+ /**
+ * Gets the discoverable mode of the local device.
+ *
+ * @return The discoverable mode of the local device
+ */
+ BluetoothDiscoverableMode GetDiscoverableMode(void) const;
+
+ /**
+ * Gets the remaining time, in seconds, until the discoverable mode is changed from
+ * BT_DISC_MODE_TIME_LIMITED_DISCOVERABLE to be BT_DISC_MODE_NOT_DISCOVERABLE. @n
+ * This method is valid only if the current discoverable mode is BT_DISC_MODE_TIME_LIMITED_DISCOVERABLE.
+ *
+ * @return The remaining time, in seconds, until the local device to be not discoverable.
+ * @remarks 0 will be returned if the current discoverable mode is not BT_DISC_MODE_TIME_LIMITED_DISCOVERABLE.
+ */
+ int GetRemainingTimeAsDiscoverable(void) const;
+
+ /**
+ * Checks whether the device discovery is in progress.
+ *
+ * @return @c true, if the device discovery is in progress @n
+ * @c false, otherwise
+ */
+ bool IsDiscoveryInProgress(void) const;
+
+ /**
+ * Sets the name of local device.
+ *
+ * @return An error code
+ * @param[in] deviceName The new device name
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_ARG The specified device name is an empty string.
+ * @exception E_SYSTEM A system error occurred.
+ * @remarks This method does not affect system settings. The device name is only valid while an application is
+ * active. The searching device detects the local devices in close proximity based on the specified
+ * device name. @n
+ * The specified device name is automatically truncated if its size is greater than 64 bytes.
+ */
+ result SetLocalDeviceName(const Tizen::Base::String& deviceName);
+
+ /**
+ * Sets the discoverable mode of the local device.
+ *
+ * @visibility partner-manufacturer
+ * @privlevel system
+ * @privilege http://tizen.org/privilege/bluetoothmanager
+ *
+ * @return An error code
+ * @param[in] mode The new discoverable mode
+ * @param[in] seconds The duration in seconds for which the local device is discoverable
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_ARG The specified @c seconds should be greater than 0 if the specified
+ * @c mode is BT_DISC_MODE_TIME_LIMITED_DISCOVERABLE.
+ * @exception E_INVALID_OPERATION %Bluetooth is not activated.
+ * @exception E_PRIVILEGE_DENIED The application does not have the privilege to call this method.
+ * @exception E_SYSTEM A system error has occurred.
+ * @see IBluetoothManagerEventListener::OnBluetoothDiscoverableModeChanged()
+ * @remarks @c seconds is adopted only if the specified @c mode is BT_DISC_MODE_TIME_LIMITED_DISCOVERABLE.
+ */
+ result SetDiscoverableMode(BluetoothDiscoverableMode mode, int seconds = 0);
+
+ /**
+ * Refreshes the paired device list.
+ *
+ * @deprecated This method is deprecated because the paired device list is refreshed automatically.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_MEMORY Insufficient memory.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ result RefreshPairedDeviceList(void);
+
+ /**
+ * Searches for an element that matches a %Bluetooth address.
+ *
+ * @deprecated This API is deprecated because the return value of this API is a dangling pointer.
+ * Instead of using this API, it recommended to use GetPairedDeviceByAddressN().
+ *
+ * @return The BluetoothDevice containing the specified address if successful @n
+ * @c null, otherwise
+ * @param[in] deviceAddress The address to locate
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OBJ_NOT_FOUND The specified device was not found in the paired device list.
+ * @remarks The specific error code can be accessed using the GetLastResult() method.
+ */
+ const BluetoothDevice* GetPairedDeviceByAddress(const Tizen::Base::ByteBuffer& deviceAddress) const;
+
+ /**
+ * Searches for an element that matches a %Bluetooth address.
+ *
+ * @return The BluetoothDevice containing the specified address if successful @n
+ * @c null, otherwise
+ * @param[in] deviceAddress The address to locate
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OBJ_NOT_FOUND The specified device was not found in the paired device list.
+ * @exception E_OUT_OF_MEMORY Insufficient memory.
+ * @remarks The specific error code can be accessed using the GetLastResult() method.
+ */
+ BluetoothDevice* GetPairedDeviceByAddressN(const Tizen::Base::ByteBuffer& deviceAddress) const;
+
+ /**
+ * Searches for elements matching a device name in the paired devices list.
+ *
+ * @return A list containing the matching device if successful @n
+ * @c null, otherwise
+ * @param[in] deviceName The name of the device to locate
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OBJ_NOT_FOUND The specified device was not found in the paired device list.
+ * @exception E_OUT_OF_MEMORY Insufficient memory.
+ * @remarks The specific error code can be accessed using the GetLastResult() method.
+ */
+ Tizen::Base::Collection::IList* GetPairedDeviceByNameN(const Tizen::Base::String& deviceName) const;
+
+ /**
+ * Gets the element at the specified index.
+ *
+ * @deprecated This API is deprecated because the return value of this API is a dangling pointer.
+ * Instead of using this API, it recommended to use GetPairedDeviceListN() and
+ * Tizen::Base::Collection::IList operations.
+ *
+ * @return The BluetoothDevice at the given index, if successful @n
+ * @c null, otherwise
+ * @param[in] index The index in the list
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OBJ_NOT_FOUND The specified index was not found in the PairedDevice list.
+ */
+ const BluetoothDevice* GetPairedDeviceAt(int index) const;
+
+ /**
+ * Gets the paired device list.
+ *
+ * @deprecated This API is deprecated because the return value of this API is a dangling pointer.
+ * Instead of using this API, it recommended to use GetPairedDeviceListN().
+ *
+ * @return Pointer to the paired device list on success @n
+ * @c null, otherwise
+ */
+ const Tizen::Base::Collection::IList* GetPairedDeviceList(void) const;
+
+ /**
+ * Gets the paired device list.
+ *
+ * @return A pointer to the paired device list on success @n
+ * @c null, otherwise
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_MEMORY Insufficient memory.
+ * @remarks The specific error code can be accessed using the GetLastResult() method.
+ */
+ Tizen::Base::Collection::IList* GetPairedDeviceListN(void) const;
+
+ /**
+ * Sets a Device event listener for searching devices and services.
+ *
+ * @return An error code
+ * @param[in] pListener The Device event listener to be added
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ result SetBluetoothDeviceListener(IBluetoothDeviceEventListener* pListener);
+
+ /**
+ * Sets a Connection event listener.
+ *
+ * @return An error code
+ * @param[in] pListener The Connection event listener to be added
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ result SetBluetoothConnectionListener(_IBluetoothConnectionEventListener* pListener);
+
+ /**
+ * Starts a device discovery process.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_IN_PROGRESS The discovery process is in progress.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of this operation.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ result StartDiscovery(void);
+
+ /**
+ * Stops the device discovery process.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_IN_PROGRESS The canceling is in progress.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of this operation. E.g. Discovery is not started.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ result CancelDiscovery(void);
+
+ /**
+ * Retrieves the service list from a remote device.
+ *
+ * @return An error code
+ * @param[in] pairedDevice A remote device which is already paired with this local device
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_IN_PROGRESS The retrieving is in progress.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of this
+ * operation. @n
+ * For example, the discovery is in progress.
+ * @exception E_NOT_PAIRED The input device is not found in the paired device list.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ result RetrieveServiceList(const BluetoothDevice& pairedDevice);
+
+ /**
+ * Pairs with the specified remote device.
+ *
+ * @return An error code
+ * @param[in] remoteDevice The remote %Bluetooth device to be paired with
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of this
+ * operation. @n
+ * For example, the %Bluetooth is not activated.
+ * @exception E_DEVICE_BUSY The device cannot be approached because other operation is in progress.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ result Pair(const BluetoothDevice& remoteDevice);
+
+ /**
+ * Stops the pairing process.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of this
+ * operation. @n
+ * For example, the pairing process is not in progress.
+ * @exception E_IN_PROGRESS The termination of the pairing process is in progress.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ result CancelPair(void);
+
+ /**
+ * Unpairs the paired devices.
+ *
+ * @return An error code
+ * @param[in] pairedDevice The paired device to unpair
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of this
+ * operation. @n
+ * For example, the %Bluetooth is not activated or retrieving the service
+ * list is in progress.
+ * @exception E_NOT_PAIRED The input device is not found in the paired device list.
+ * @exception E_SYSTEM A system error occurred.
+ * @remarks The process of unpairing is to remove the specified device from the paired device list. No
+ * notification is transmitted to the remote device. @n
+ * This method is synchronous. When the result of this method is E_SUCCESS, the unpaired event is
+ * fired. @n
+ */
+ result Unpair(const BluetoothDevice& pairedDevice);
+
+
+ // Callback functions which called by _BluetoothSystemAdapter
+ virtual void OnBluetoothActivated(result r);
+ virtual void OnBluetoothDeactivated(result r);
+ virtual void OnBluetoothDiscoverableModeChanged(BluetoothDiscoverableMode mode);
+ virtual void OnBluetoothDiscoveryStarted(result r);
+ virtual void OnBluetoothRemoteDeviceFound(const BluetoothDevice& foundDevice);
+ virtual void OnBluetoothDiscoveryDone(bool isCompleted);
+ virtual void OnBluetoothServiceListReceived(const Tizen::Base::ByteBuffer& address, unsigned long serviceList,
+ const Tizen::Base::Collection::IList* pServiceUuidList, result r);
+ virtual void OnBluetoothPaired(const BluetoothDevice* pPairedDevice, result r);
+ virtual void OnBluetoothUnpaired(const Tizen::Base::ByteBuffer& address);
+ virtual void OnBluetoothDeviceConnected(const Tizen::Base::ByteBuffer& address);
+ virtual void OnBluetoothDeviceDisconnected(const Tizen::Base::ByteBuffer& address);
+
+private:
+ _BluetoothManagerImpl(const _BluetoothManagerImpl& value);
+ _BluetoothManagerImpl& operator =(const _BluetoothManagerImpl& value);
+
+ result RefreshPairedDeviceMap(void);
+ const char* GetStringOfCurrentState(void) const;
+ const char* GetStringOfPairingState(void) const;
+
+public:
+ /**
+ * Gets the Impl instance.
+ *
+ * @return The pointer to _BluetoothManagerImpl
+ * @param[in] bluetoothManager An instance of BluetoothManager
+ */
+ static _BluetoothManagerImpl* GetInstance(BluetoothManager& bluetoothManager);
+
+ /**
+ * Gets the Impl instance.
+ *
+ * @return The pointer to _BluetoothDeviceImpl
+ * @param[in] bluetoothManager An instance of BluetoothManager
+ */
+ static const _BluetoothManagerImpl* GetInstance(const BluetoothManager& bluetoothManager);
+
+private:
+ _BluetoothIpcProxy* __pIpcProxy;
+ _BluetoothGapSystemAdapter* __pGapAdapter;
+ std::unique_ptr<_BluetoothManagerEvent> __pMgrEvent;
+ std::unique_ptr<_BluetoothDeviceEvent> __pDevEvent;
+ std::unique_ptr<_BluetoothConnectionEvent> __pConEvent;
+ const IBluetoothDeviceEventListener* __pDevEvtListener;
+ const _IBluetoothConnectionEventListener* __pConEvtListener;
+ BluetoothDevice* __pLocalDevice;
+ Tizen::Base::Collection::ArrayList __pairedDeviceList; // for APIs prior to 2.0
+ Tizen::Base::Collection::HashMap __pairedDeviceMap;
+ Tizen::Base::Runtime::Mutex __stateMutex;
+ Tizen::Base::Runtime::Mutex __pairedDevMapMutex;
+ _BluetoothManagerStateType __currentState;
+ _BluetoothPairingStateType __pairingState;
+ Tizen::Base::ByteBuffer __pairingTargetAddress;
+ Tizen::Base::Collection::LinkedList __discoveredDeviceList;
+}; // _BluetoothManagerImpl
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_MANAGER_IMPL_H_
diff --git a/src/inc/FNetBt_BluetoothOppClientImpl.h b/src/inc/FNetBt_BluetoothOppClientImpl.h
new file mode 100644
index 0000000..3f5ed4e
--- /dev/null
+++ b/src/inc/FNetBt_BluetoothOppClientImpl.h
@@ -0,0 +1,177 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothOppClientImpl.h
+ * @brief This is the header file for the _BluetoothOppClientImpl class.
+ *
+ * This header file contains the declaration of the _BluetoothOppClientImpl class.
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_OPP_CLIENT_IMPL_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_OPP_CLIENT_IMPL_H_
+
+#include <unique_ptr.h>
+#include <FOspConfig.h>
+#include <FBaseObject.h>
+#include <FBaseResult.h>
+#include <FBaseByteBuffer.h>
+#include <FBaseString.h>
+#include <FBaseRtMutex.h>
+#include "FNetBt_IBluetoothManagerEventListener.h"
+#include "FNetBt_IBluetoothDeviceEventListener.h"
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// forward declarations
+class BluetoothDevice;
+class IBluetoothOppClientEventListener;
+class _BluetoothGapSystemAdapter;
+class _BluetoothOppSystemAdapter;
+class _BluetoothOppClientEvent;
+
+/**
+ * @class _BluetoothOppClientImpl
+ * @brief TBD.
+ */
+class _OSP_EXPORT_ _BluetoothOppClientImpl
+ : public Tizen::Base::Object
+ , public _IBluetoothManagerEventListener
+ , public _IBluetoothDeviceEventListener
+{
+/**
+ * @enum _BluetoothOppClientStateType
+ * Defines the states of the Bluetooth Opp client.
+ */
+ enum _BluetoothOppClientStateType
+ {
+ _BT_OPP_CLI_STATE_DISABLED,
+ _BT_OPP_CLI_STATE_IDLE,
+ _BT_OPP_CLI_STATE_BONDING,
+ _BT_OPP_CLI_STATE_PUSH_READY,
+ _BT_OPP_CLI_STATE_REQ_CANCELING,
+ _BT_OPP_CLI_STATE_ON_TRANSFER,
+ _BT_OPP_CLI_STATE_TRANS_CANCELING
+ };
+
+public:
+ /**
+ * This is the default constructor for this class.
+ *
+ * @remarks After creating an instance of this class, you must explicitly call
+ * construction method to initialize the instance.
+ * @see Construct()
+ */
+ _BluetoothOppClientImpl(void);
+
+ /**
+ * This is the destructor for this class.
+ */
+ ~_BluetoothOppClientImpl(void);
+
+ /**
+ * Constructs a BluetoothOppClient and attaches a listener to it.
+ *
+ * @return An error code
+ * @param[in] listener The event listener for OPP client.
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_MEMORY Insufficient memory.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ result Construct(IBluetoothOppClientEventListener& listener);
+
+ /**
+ * Pushes a file to a remote OPP server.
+ *
+ * @return An error code
+ * @param[in] remoteDevice The remote OPP server.
+ * @param[in] filePath The path of the source file
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_FAILURE The method has failed.
+ * @exception E_IN_PROGRESS The push process is in progress.
+ * @exception E_INVALID_STATE Bluetooth has been deactivated.
+ * @exception E_INACCESSIBLE_PATH The specified @c filePath is inaccessible.
+ * @exception E_SERVICE_UNAVAILABLE OPP service is not available.
+ */
+ result PushFile(const BluetoothDevice& remoteDevice, const Tizen::Base::String& filePath);
+
+ /**
+ * Cancels the file push request in progress.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_FAILURE The method failed.
+ * @exception E_INVALID_STATE Bluetooth has been deactivated.
+ * @exception E_IN_PROGRESS The canceling process is in progress.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the push request is not sent or accepted by a remote device.
+ */
+ result CancelPush(void);
+
+ /**
+ * Specifies the minimum interval of invocation of OnOppTransferInProgress() in percentage.
+ * The default value is 5.
+ *
+ * @return An error code
+ * @param[in] percent The minimum period of progress interval as a percentage value
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_RANGE The value of the argument is outside the valid range defined by the method.
+ *
+ * @see IBluetoothOppClientEventListener::OnOppTransferInProgress()
+ */
+ result SetMinProgressInterval(int percent);
+
+
+ // Callback functions which called by _BluetoothOppSystemAdapter
+ virtual void OnBluetoothActivated(result r);
+ virtual void OnBluetoothDeactivated(result r);
+ virtual void OnBluetoothDiscoverableModeChanged(BluetoothDiscoverableMode mode) {}
+ virtual void OnBluetoothDiscoveryStarted(result r) {}
+ virtual void OnBluetoothRemoteDeviceFound(const BluetoothDevice& foundDevice) {}
+ virtual void OnBluetoothDiscoveryDone(bool isCompleted) {}
+ virtual void OnBluetoothServiceListReceived(const Tizen::Base::ByteBuffer& address, unsigned long serviceList,
+ const Tizen::Base::Collection::IList* pServiceUuidList, result r) {};
+ virtual void OnBluetoothPaired(const BluetoothDevice* pPairedDevice, result r);
+ virtual void OnBluetoothUnpaired(const Tizen::Base::ByteBuffer& address) {}
+ virtual void OnBluetoothDeviceConnected(const Tizen::Base::ByteBuffer& address) {}
+ virtual void OnBluetoothDeviceDisconnected(const Tizen::Base::ByteBuffer& address) {}
+ void OnOppPushResponded(result r);
+ void OnOppTransferInProgress(int percent);
+ void OnOppTransferDone(const Tizen::Base::String& filePath, int fileSize, bool isCompleted);
+
+private:
+ _BluetoothOppClientImpl(const _BluetoothOppClientImpl& value);
+ _BluetoothOppClientImpl& operator =(const _BluetoothOppClientImpl& value);
+
+ const char* GetStringOfCurrentState(void) const;
+
+private:
+ const static int __defaultProgressInterval = 5;
+
+ _BluetoothGapSystemAdapter* __pGapAdapter;
+ _BluetoothOppSystemAdapter* __pOppAdapter;
+ std::unique_ptr<_BluetoothOppClientEvent> __pEvent;
+ Tizen::Base::Runtime::Mutex __stateMutex;
+ _BluetoothOppClientStateType __currentState;
+ Tizen::Base::ByteBuffer __pairingAddress;
+ Tizen::Base::String __pushedFilePath;
+ int __minProgressInterval;
+ int __previousProgress;
+}; // _BluetoothOppClientImpl
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_OPP_CLIENT_IMPL_H_
diff --git a/src/inc/FNetBt_BluetoothOppServerImpl.h b/src/inc/FNetBt_BluetoothOppServerImpl.h
new file mode 100644
index 0000000..bb26a49
--- /dev/null
+++ b/src/inc/FNetBt_BluetoothOppServerImpl.h
@@ -0,0 +1,224 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothOppServerImpl.h
+ * @brief This is the header file for the _BluetoothOppServerImpl Class.
+ *
+ * This header file contains the declaration of the _BluetoothOppServerImpl Class.
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_OPP_SERVER_IMPL_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_OPP_SERVER_IMPL_H_
+
+#include <unique_ptr.h>
+#include <FOspConfig.h>
+#include <FBaseObject.h>
+#include <FBaseResult.h>
+#include <FBaseString.h>
+#include <FBaseRtMutex.h>
+#include "FNetBt_IBluetoothManagerEventListener.h"
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// forward declarations
+class BluetoothDevice;
+class IBluetoothOppServerEventListener;
+class _BluetoothGapSystemAdapter;
+class _BluetoothOppSystemAdapter;
+class _BluetoothOppServerEvent;
+
+/**
+ * @class _BluetoothOppServerImpl
+ * @brief TBD.
+ */
+class _OSP_EXPORT_ _BluetoothOppServerImpl
+ : public Tizen::Base::Object
+ , public _IBluetoothManagerEventListener
+{
+/**
+ * @enum _BluetoothOppServerStateType
+ * Defines the states of the Bluetooth SPP Acceptor.
+ */
+ enum _BluetoothOppServerStateType
+ {
+ _BT_OPP_SVR_STATE_DISABLED,
+ _BT_OPP_SVR_STATE_IDLE,
+ _BT_OPP_SVR_STATE_ON_SERVICE,
+ _BT_OPP_SVR_STATE_PUSH_REQUESTED,
+ _BT_OPP_SVR_STATE_ON_TRANSFER,
+ _BT_OPP_SVR_STATE_ON_STOPPING
+ };
+
+public:
+ /**
+ * This is the default constructor for this class.
+ *
+ * @remarks After creating an instance of this class, you must explicitly call
+ * construction method to initialize the instance.
+ * @see Construct()
+ */
+ _BluetoothOppServerImpl(void);
+
+ /**
+ * This is the destructor for this class.
+ */
+ ~_BluetoothOppServerImpl(void);
+
+ /**
+ * Constructs a BluetoothOppServer and attaches a listener to it.
+ *
+ * @return An error code
+ * @param[in] listener The event listener for OPP server
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_MEMORY Insufficient memory.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ result Construct(IBluetoothOppServerEventListener& listener);
+
+ /**
+ * Accepts a push request from a remote OPP client.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_FAILURE The method failed.
+ * @exception E_INVALID_STATE Bluetooth has been deactivated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the service is not started yet or a push request is not
+ * received from a remote device.
+ */
+ result AcceptPush(void);
+
+ /**
+ * Rejects a push request from a remote OPP client.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_FAILURE The method failed.
+ * @exception E_INVALID_STATE Bluetooth has been deactivated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the service is not started yet or a push request is not
+ * received from a remote device.
+ */
+ result RejectPush(void);
+
+ /**
+ * Sets the destination path of the file to be received.
+ *
+ * @return An error code
+ * @param[in] dstPath The new destination file path
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, trying to change the path on Push transition is prohibited.
+ * @exception E_INACCESSIBLE_PATH The specified @c dstPath is inaccessible.
+ * @exception E_FAILURE The method has failed.
+ */
+ result SetDestinationPath(const Tizen::Base::String& dstPath);
+
+ /**
+ * Starts the OPP service and associates a listener with it.
+ *
+ * @return An error code
+ * @param[in] dstPath The new destination file path
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_FAILURE The method failed.
+ * @exception E_IN_PROGRESS The service has already started.
+ * @exception E_INVALID_STATE Bluetooth has been deactivated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, The stop process is in progress.
+ * @exception E_INACCESSIBLE_PATH The specified @c dstPath is inaccessible.
+ * @exception E_SERVICE_UNAVAILABLE OPP service is not available.
+ */
+ result StartService(const Tizen::Base::String& dstPath);
+
+ /**
+ * Stops the OPP service.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_FAILURE The method failed.
+ * @exception E_INVALID_STATE Bluetooth has been deactivated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the service is not started as yet.
+ */
+ result StopService(void);
+
+ /**
+ * Stops the file transfer in progress which was started by the client. @n
+ * If this method is called during the file transfer, the IBluetoothOppServerEventListener::OnOppTransferDone()
+ * method is called with @c isCompleted as @c false.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_INVALID_STATE This instance is in an invalid state. @n
+ * For example, %Bluetooth is not activated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the file transfer is not in progress.
+ * @exception E_OPERATION_FAILED The operation has failed.
+ * @see IBluetoothOppServerEventListener::OnOppTransferDone()
+ */
+ result StopTransfer(void);
+
+ /**
+ * Specifies the minimum interval of invocation of OnOppTransferInProgress() in percentage.
+ * The default value is 5.
+ *
+ * @return An error code
+ * @param[in] percent The minimum period of progress interval as a percentage value
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_RANGE The value of the argument is outside the valid range defined by the method.
+ *
+ * @see IBluetoothOppServerEventListener::OnOppTransferInProgress()
+ */
+ result SetMinProgressInterval(int percent);
+
+
+ // Callback functions which called by _BluetoothSystemAdapter
+ virtual void OnBluetoothActivated(result r);
+ virtual void OnBluetoothDeactivated(result r);
+ virtual void OnBluetoothDiscoverableModeChanged(BluetoothDiscoverableMode mode) {}
+ void OnOppPushRequested(const BluetoothDevice& device);
+ void OnOppTransferInProgress(int percent);
+ void OnOppTransferDone(const Tizen::Base::String& filePath, int fileSize, bool isCompleted);
+
+private:
+ _BluetoothOppServerImpl(const _BluetoothOppServerImpl& value);
+ _BluetoothOppServerImpl& operator =(const _BluetoothOppServerImpl& value);
+
+ const char* GetStringOfCurrentState(void) const;
+
+private:
+ const static int __defaultProgressInterval = 5;
+
+ _BluetoothGapSystemAdapter* __pGapAdapter;
+ _BluetoothOppSystemAdapter* __pOppAdapter;
+ std::unique_ptr<_BluetoothOppServerEvent> __pEvent;
+ Tizen::Base::Runtime::Mutex __stateMutex;
+ _BluetoothOppServerStateType __currentState;
+ Tizen::Base::String __pushedFileName;
+ int __minProgressInterval;
+ int __previousProgress;
+
+}; // _BluetoothOppServerImpl
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_OPP_SERVER_IMPL_H_
diff --git a/src/inc/FNetBt_BluetoothSppAcceptorImpl.h b/src/inc/FNetBt_BluetoothSppAcceptorImpl.h
new file mode 100644
index 0000000..9286254
--- /dev/null
+++ b/src/inc/FNetBt_BluetoothSppAcceptorImpl.h
@@ -0,0 +1,212 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothSppAcceptorImpl.h
+ * @brief This is the header file for the _BluetoothSppAcceptorImpl class.
+ *
+ * This header file contains the declaration of the _BluetoothSppAcceptorImpl class.
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_SPP_ACCEPTOR_IMPL_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_SPP_ACCEPTOR_IMPL_H_
+
+#include <unique_ptr.h>
+#include <FBaseResult.h>
+#include <FBaseObject.h>
+#include <FBaseRtMutex.h>
+#include "FNetBt_IBluetoothManagerEventListener.h"
+#include "FNetBt_IBluetoothSocketListener.h"
+
+//Forward declarations
+namespace Tizen { namespace Base
+{
+class ByteBuffer;
+class UuId;
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// forward declarations
+class BluetoothDevice;
+class IBluetoothSppAcceptorEventListener;
+class _BluetoothSppAcceptorEvent;
+class _BluetoothGapSystemAdapter;
+class _BluetoothSppSystemAdapter;
+
+/**
+ * @class _BluetoothSppAcceptorImpl
+ * @brief TBD.
+ */
+class _OSP_EXPORT_ _BluetoothSppAcceptorImpl
+ : public Tizen::Base::Object
+ , public _IBluetoothManagerEventListener
+ , public _IBluetoothSocketListener
+{
+/**
+ * @enum _BluetoothSppAcceptorStateType
+ * Defines the states of the Bluetooth SPP Acceptor.
+ */
+ enum _BluetoothSppAcceptorStateType
+ {
+ _BT_SPP_ACC_STATE_DISABLED,
+ _BT_SPP_ACC_STATE_IDLE,
+ _BT_SPP_ACC_STATE_ON_SERVICE,
+ _BT_SPP_ACC_STATE_CONNECT_REQUESTED,
+ _BT_SPP_ACC_STATE_CONNECTED
+ };
+
+public:
+ /**
+ * This is the default constructor for this class.
+ *
+ * @remarks After creating an instance of this class, you must explicitly call
+ * construction method to initialize the instance.
+ * @see Construct()
+ */
+ _BluetoothSppAcceptorImpl(void);
+
+ /**
+ * This is the destructor for this class.
+ */
+ ~_BluetoothSppAcceptorImpl(void);
+
+ /**
+ * Constructs a BluetoothSppAcceptor and attaches a listener to it.
+ *
+ * @return An error code
+ * @param[in] listener The event listener for SPP accepter.
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_MEMORY Insufficient memory.
+ * @exception E_SYSTEM A system error has occurred.
+ */
+ result Construct(IBluetoothSppAcceptorEventListener& listener);
+
+ /**
+ * Accepts a connection request from a remote SPP initiator.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_FAILURE The method failed.
+ * @exception E_INVALID_STATE Bluetooth has been deactivated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the service is not started yet or the connection request is
+ * not yet received from a remote device.
+ */
+ result AcceptConnection(void);
+
+ /**
+ * Rejects a connection request from a remote SPP initiator.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_FAILURE The method failed.
+ * @exception E_INVALID_STATE Bluetooth has been deactivated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the service is not started yet or the connection request is
+ * not yet received from a remote device.
+ */
+ result RejectConnection(void);
+
+ /**
+ * Starts SPP service with the specified service UUID.
+ *
+ * @return An error code
+ * @param[in] serviceUuid The UUID of SPP service
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_FAILURE The method failed.
+ * @exception E_INVALID_STATE Bluetooth has been deactivated.
+ * @exception E_SERVICE_UNAVAILABLE SPP service with the specified UUID is not available.
+ * @exception E_INVALID_ARG The specified input parameter is invalid.
+ * @exception E_IN_PROGRESS The service has already started.
+ * @exception E_ALREADY_CONNECTED The connection with an SPP initiator has already been established.
+ */
+ result StartService(const Tizen::Base::UuId& serviceUuid);
+
+ /**
+ * Stops the SPP service.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_FAILURE The method failed.
+ * @exception E_INVALID_STATE Bluetooth has been deactivated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the service is not started yet.
+ */
+ result StopService(void);
+
+ /**
+ * Disconnects the current connection.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_FAILURE The method failed.
+ * @exception E_INVALID_STATE Bluetooth has been deactivated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the service is not started yet or a connection with a remote
+ * device is not established.
+ */
+ result Disconnect(void);
+
+ /**
+ * Sends data.
+ *
+ * @return An error code
+ * @param[in] buffer The data to send
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_FAILURE The method has failed.
+ * @exception E_INVALID_STATE Bluetooth has been deactivated.
+ * @exception E_INVALID_ARG The argument is null or contains an invalid value.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the service is not started yet or a connection with a remote
+ * device is not established.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ result SendData(const Tizen::Base::ByteBuffer& buffer);
+
+ virtual void OnBluetoothActivated(result r);
+ virtual void OnBluetoothDeactivated(result r);
+ virtual void OnBluetoothDiscoverableModeChanged(BluetoothDiscoverableMode mode) {}
+ virtual void OnSocketConnectionRequested(const BluetoothDevice& device);
+ virtual void OnSocketConnectionResponded(int socketFd, result r) {}
+ virtual void OnSocketDisconnected(result r);
+ virtual void OnSocketDataReceived(Tizen::Base::ByteBuffer& buffer);
+
+private:
+ _BluetoothSppAcceptorImpl(const _BluetoothSppAcceptorImpl& value);
+ _BluetoothSppAcceptorImpl& operator =(const _BluetoothSppAcceptorImpl& value);
+
+ const char* GetStringOfCurrentState(void) const;
+ result ProcessAsyncDisconnect(void);
+
+private:
+ _BluetoothGapSystemAdapter* __pGapAdapter;
+ _BluetoothSppSystemAdapter* __pSppAdapter;
+ std::unique_ptr<_BluetoothSppAcceptorEvent> __pEvent;
+ Tizen::Base::Runtime::Mutex __stateMutex;
+ _BluetoothSppAcceptorStateType __currentState;
+ int __parentSocketFd;
+ int __childSocketFd;
+
+}; // _BluetoothSppAcceptorImpl
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_SPP_ACCEPTOR_IMPL_H_
diff --git a/src/inc/FNetBt_BluetoothSppInitiatorImpl.h b/src/inc/FNetBt_BluetoothSppInitiatorImpl.h
new file mode 100644
index 0000000..8e3bfe6
--- /dev/null
+++ b/src/inc/FNetBt_BluetoothSppInitiatorImpl.h
@@ -0,0 +1,184 @@
+//
+// Open Service Platform
+// 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 FNetBt_BluetoothSppInitiatorImpl.h
+ * @brief This is the header file for the _BluetoothSppInitiatorImpl class.
+ *
+ * This header file contains the declaration of the _BluetoothSppInitiatorImpl class.
+ */
+#ifndef _FNET_BT_INTERNAL_BLUETOOTH_SPP_INITIATOR_IMPL_H_
+#define _FNET_BT_INTERNAL_BLUETOOTH_SPP_INITIATOR_IMPL_H_
+
+#include <unique_ptr.h>
+#include <FOspConfig.h>
+#include <FBaseObject.h>
+#include <FBaseResult.h>
+#include <FBaseByteBuffer.h>
+#include <FBaseRtMutex.h>
+#include "FNetBt_IBluetoothManagerEventListener.h"
+#include "FNetBt_IBluetoothDeviceEventListener.h"
+#include "FNetBt_IBluetoothSocketListener.h"
+
+//Forward declarations
+namespace Tizen { namespace Base
+{
+class UuId;
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// forward declarations
+class BluetoothDevice;
+class IBluetoothSppInitiatorEventListener;
+class _BluetoothSppInitiatorEvent;
+class _BluetoothGapSystemAdapter;
+class _BluetoothSppSystemAdapter;
+
+/**
+ * @class _BluetoothSppInitiatorImpl
+ * @brief TBD
+ */
+class _OSP_EXPORT_ _BluetoothSppInitiatorImpl
+ : public Tizen::Base::Object
+ , public _IBluetoothManagerEventListener
+ , public _IBluetoothDeviceEventListener
+ , public _IBluetoothSocketListener
+{
+/**
+ * @enum _BluetoothSppInitiatorStateType
+ * Defines the states of the Bluetooth SPP Acceptor.
+ */
+ enum _BluetoothSppInitiatorStateType
+ {
+ _BT_SPP_INI_STATE_DISABLED,
+ _BT_SPP_INI_STATE_IDLE,
+ _BT_SPP_INI_STATE_BONDING,
+ _BT_SPP_INI_STATE_CONNECT_READY,
+ _BT_SPP_INI_STATE_REQ_CANCELING,
+ _BT_SPP_INI_STATE_CONNECTED
+ } ;
+
+public:
+ /**
+ * This is the default constructor for this class.
+ *
+ * @remarks After creating an instance of this class, you must explicitly call
+ * construction method to initialize the instance.
+ * @see Construct()
+ */
+ _BluetoothSppInitiatorImpl(void);
+
+ /**
+ * This is the destructor for this class.
+ */
+ ~_BluetoothSppInitiatorImpl(void);
+
+ /**
+ * Constructs a BluetoothSppInitiator and attaches a listener to it.
+ *
+ * @return An error code
+ * @param[in] listener The event listener for SPP initiator.
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_OUT_OF_MEMORY Insufficient memory.
+ */
+ result Construct(IBluetoothSppInitiatorEventListener& listener);
+
+ /**
+ * Sets up a connection to a remote SPP acceptor.
+ *
+ * @return An error code
+ * @param[in] remoteDevice The remote device to be connected
+ * @param[in] serviceUuid The UUID of SPP service to be connected
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_FAILURE The method failed.
+ * @exception E_INVALID_ARG A specified input parameter is invalid.
+ * @exception E_INVALID_STATE Bluetooth has been deactivated.
+ * @exception E_IN_PROGRESS The connection process is in progress.
+ * @exception E_ALREADY_CONNECTED The connection with an SPP acceptor has already been established.
+ */
+ result Connect(const BluetoothDevice& remoteDevice, const Tizen::Base::UuId& serviceUuid);
+
+ /**
+ * Disconnects the current connection.
+ *
+ * @return An error code
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_FAILURE The method failed.
+ * @exception E_INVALID_STATE Bluetooth has been deactivated.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the connection request is not sent or a connection with a
+ * remote device is not established yet.
+ */
+ result Disconnect(void);
+
+ /**
+ * Sends data.
+ *
+ * @return An error code
+ * @param[in] buffer The data to send
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_FAILURE The method has failed.
+ * @exception E_INVALID_STATE Bluetooth has been deactivated.
+ * @exception E_INVALID_ARG The argument is null or contains an invalid value.
+ * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified
+ * operation. @n
+ * For example, the connection request is not sent or a connection with a
+ * remote device is not established yet.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ result SendData(const Tizen::Base::ByteBuffer& buffer);
+
+ virtual void OnBluetoothActivated(result r);
+ virtual void OnBluetoothDeactivated(result r);
+ virtual void OnBluetoothDiscoverableModeChanged(BluetoothDiscoverableMode mode) {}
+ virtual void OnBluetoothDiscoveryStarted(result r) {}
+ virtual void OnBluetoothRemoteDeviceFound(const BluetoothDevice& foundDevice) {}
+ virtual void OnBluetoothDiscoveryDone(bool isCompleted) {}
+ virtual void OnBluetoothServiceListReceived(const Tizen::Base::ByteBuffer& address, unsigned long serviceList,
+ const Tizen::Base::Collection::IList* pServiceUuidList, result r) {};
+ virtual void OnBluetoothPaired(const BluetoothDevice* pPairedDevice, result r);
+ virtual void OnBluetoothUnpaired(const Tizen::Base::ByteBuffer& address) {}
+ virtual void OnBluetoothDeviceConnected(const Tizen::Base::ByteBuffer& address) {}
+ virtual void OnBluetoothDeviceDisconnected(const Tizen::Base::ByteBuffer& address) {}
+ virtual void OnSocketConnectionRequested(const BluetoothDevice& device) {}
+ virtual void OnSocketConnectionResponded(int socketFd, result r);
+ virtual void OnSocketDisconnected(result r);
+ virtual void OnSocketDataReceived(Tizen::Base::ByteBuffer& buffer);
+
+private:
+ _BluetoothSppInitiatorImpl(const _BluetoothSppInitiatorImpl& value);
+ _BluetoothSppInitiatorImpl& operator =(const _BluetoothSppInitiatorImpl& value);
+
+ const char* GetStringOfCurrentState(void) const;
+ result ProcessAsyncDisconnect(void);
+
+private:
+ _BluetoothGapSystemAdapter* __pGapAdapter;
+ _BluetoothSppSystemAdapter* __pSppAdapter;
+ std::unique_ptr<_BluetoothSppInitiatorEvent> __pEvent;
+ Tizen::Base::Runtime::Mutex __stateMutex;
+ _BluetoothSppInitiatorStateType __currentState;
+ Tizen::Base::ByteBuffer __pairingAddress;
+ Tizen::Base::UuId __pairingUuid;
+ int __socketFd;
+
+}; // _BluetoothSppInitiatorImpl
+
+} } }
+#endif // _FNET_BT_INTERNAL_BLUETOOTH_SPP_INITIATOR_IMPL_H_
diff --git a/src/inc/FNetBt_ConnectivityIpcMessages.h b/src/inc/FNetBt_ConnectivityIpcMessages.h
new file mode 100644
index 0000000..4d52b1a
--- /dev/null
+++ b/src/inc/FNetBt_ConnectivityIpcMessages.h
@@ -0,0 +1,37 @@
+//
+// Open Service Platform
+// 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 FNetBt_ConnectivityIpcMessages.h
+ * @brief This is the header file for the Connectivity service daemon's IPC messages.
+ *
+ * This header file contains the declarations of the IPC messages for the Connectivity service daemon.
+ */
+
+#include <ipc/ipc_message_macros.h>
+#include <FIo_IpcCommonParamTraits.h>
+#include <FIo_IpcMessageStart.h>
+
+#ifndef BLUETOOTH_CONNECTIVITY_IPC_SERVER_NAME
+#define BLUETOOTH_CONNECTIVITY_IPC_SERVER_NAME "osp.net.bluetooth.ipcserver.connectivity"
+#endif
+
+#define IPC_MESSAGE_START ConnectivityBluetoothServiceMsgStart
+
+// Client -> Server (sync)
+IPC_SYNC_MESSAGE_CONTROL0_2(ConnectivityBluetoothServiceMsg_getLocalDeviceName, Tizen::Base::String /* local name */, unsigned long /* result */)
+IPC_SYNC_MESSAGE_CONTROL1_1(ConnectivityBluetoothServiceMsg_setLocalDeviceName, Tizen::Base::String /* local name */, unsigned long /* result */)
+IPC_SYNC_MESSAGE_CONTROL2_1(ConnectivityBluetoothServiceMsg_setDiscoverableMode, int /* mode */, int /* seconds */ , unsigned long /* result */)
diff --git a/src/inc/FNetBt_IBluetoothConnectionEventListener.h b/src/inc/FNetBt_IBluetoothConnectionEventListener.h
new file mode 100644
index 0000000..7956f2e
--- /dev/null
+++ b/src/inc/FNetBt_IBluetoothConnectionEventListener.h
@@ -0,0 +1,76 @@
+//
+// Open Service Platform
+// 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 FNetBt_IBluetoothConnectionEventListener.h
+ * @brief This is the header file for the _IBluetoothConnectionEventListener interface.
+ *
+ * This header file contains the declaration of the _IBluetoothConnectionEventListener interface.
+ *
+ */
+#ifndef _FNET_BT_INTERNAL_IBLUETOOTH_CONNECTION_EVENT_LISTENER_H_
+#define _FNET_BT_INTERNAL_IBLUETOOTH_CONNECTION_EVENT_LISTENER_H_
+
+#include <FBaseRtIEventListener.h>
+
+namespace Tizen { namespace Base
+{
+class ByteBuffer;
+namespace Collection
+{
+class IList;
+}
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// forward declaration
+class BluetoothDevice;
+
+/**
+ * @interface _IBluetoothConnectionEventListener
+ * @brief This interface specifies the methods used for notifying the change of connection with local device
+ */
+class _OSP_EXPORT_ _IBluetoothConnectionEventListener
+ : public Base::Runtime::IEventListener
+{
+public:
+ /**
+ * This is the virtual destructor for this class.
+ */
+ virtual ~_IBluetoothConnectionEventListener(void) {}
+
+ /**
+ * Callback used to notify that the paired device is connected.
+ *
+ * @param[in] isCompleted @c true, if the transfer is successfully completed @n
+ * @c false, otherwise.
+ */
+ virtual void OnBluetoothDeviceConnected(const Tizen::Base::ByteBuffer& address) = 0;
+
+ /**
+ * Callback used to notify that the paired device is disconnected.
+ *
+ * @param[in] isCompleted @c true, if the transfer is successfully completed @n
+ * @c false, otherwise.
+ */
+ virtual void OnBluetoothDeviceDisconnected(const Tizen::Base::ByteBuffer& address) = 0;
+
+}; // _IBluetoothConnectionEventListener
+
+} } }
+#endif // _FNET_BT_INTERNAL_IBLUETOOTH_CONNECTION_EVENT_LISTENER_H_
diff --git a/src/inc/FNetBt_IBluetoothDeviceEventListener.h b/src/inc/FNetBt_IBluetoothDeviceEventListener.h
new file mode 100644
index 0000000..0559233
--- /dev/null
+++ b/src/inc/FNetBt_IBluetoothDeviceEventListener.h
@@ -0,0 +1,130 @@
+//
+// Open Service Platform
+// 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 FNetBt_IBluetoothDeviceEventListener.h
+ * @brief This is the header file for the _IBluetoothDeviceEventListener interface.
+ *
+ * This header file contains the declaration of the _IBluetoothDeviceEventListener interface.
+ *
+ */
+#ifndef _FNET_BT_INTERNAL_IBLUETOOTH_DEVICE_EVENT_LISTENER_H_
+#define _FNET_BT_INTERNAL_IBLUETOOTH_DEVICE_EVENT_LISTENER_H_
+
+#include <FBaseRtIEventListener.h>
+
+namespace Tizen { namespace Base
+{
+class ByteBuffer;
+namespace Collection
+{
+class IList;
+}
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// forward declaration
+class BluetoothDevice;
+
+/**
+ * @interface _IBluetoothDeviceEventListener
+ * @brief This interface specifies the methods used for notifying different kinds of Bluetooth remote device related
+ * events such as search result.
+ */
+class _OSP_EXPORT_ _IBluetoothDeviceEventListener
+ : public Base::Runtime::IEventListener
+{
+public:
+ /**
+ * This is the virtual destructor for this class.
+ */
+ virtual ~_IBluetoothDeviceEventListener(void) {}
+
+ /**
+ * Callback used to notify that the device discovery process is started.
+ *
+ * @param[in] r The result of the event
+ * @exception E_SUCCESS The discovery was started successfully.
+ * @exception E_SYSTEM A failure occurred from the underlying system.
+ */
+ virtual void OnBluetoothDiscoveryStarted(result r) = 0;
+
+ /**
+ * Callback used to notify that a new remote device is found.
+ *
+ * @param[in] foundDevice A remote device which is found.
+ */
+ virtual void OnBluetoothRemoteDeviceFound(const BluetoothDevice& foundDevice) = 0;
+
+ /**
+ * Callback used to notify that the device discovery process is done.
+ *
+ * @param[in] isCompleted @c true, if the transfer is successfully completed @n
+ * @c false, otherwise.
+ */
+ virtual void OnBluetoothDiscoveryDone(bool isCompleted) = 0;
+
+ /**
+ * Callback used to notify that the service list is received from a remote device.
+ *
+ * @param[in] address The address of the remote device which sent its service list
+ * @param[in] serviceList The received service list
+ * @param[in] pServiceUuidList The received service UUID list
+ * @param[in] r The result of receiving service list
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_REMOTE_SERVICE_NOT_FOUND The service list of the remote device is not found.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ virtual void OnBluetoothServiceListReceived(const Tizen::Base::ByteBuffer& address, unsigned long serviceList,
+ const Tizen::Base::Collection::IList* pServiceUuidList, result r) = 0;
+
+ /**
+ * Callback used to notify that a new remote device is paired with this local device.
+ *
+ * @param[in] pPairedDevice The device which the local device is paired with
+ * @param[in] r The result of pairing
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ virtual void OnBluetoothPaired(const BluetoothDevice* pPairedDevice, result r) = 0;
+
+ /**
+ * Callback used to notify that the already paired device is unpaired with this local device.
+ *
+ * @param[in] address The address of the device which the local device is unpaired with
+ */
+ virtual void OnBluetoothUnpaired(const Tizen::Base::ByteBuffer& address) = 0;
+
+ /**
+ * Callback used to notify that the paired device is connected.
+ *
+ * @param[in] address The address of the device which the local device is connected with
+ */
+ virtual void OnBluetoothDeviceConnected(const Tizen::Base::ByteBuffer& address) = 0;
+
+ /**
+ * Callback used to notify that the paired device is disconnected.
+ *
+ * @param[in] address The address of the device which the local device is disconnected with
+ */
+ virtual void OnBluetoothDeviceDisconnected(const Tizen::Base::ByteBuffer& address) = 0;
+
+}; // _IBluetoothDeviceEventListener
+
+} } }
+#endif // _FNET_BT_INTERNAL_IBLUETOOTH_DEVICE_EVENT_LISTENER_H_
diff --git a/src/inc/FNetBt_IBluetoothManagerEventListener.h b/src/inc/FNetBt_IBluetoothManagerEventListener.h
new file mode 100644
index 0000000..2e6b2ce
--- /dev/null
+++ b/src/inc/FNetBt_IBluetoothManagerEventListener.h
@@ -0,0 +1,74 @@
+//
+// Open Service Platform
+// 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 FNetBt_IBluetoothManagerEventListener.h
+ * @brief This is the header file for the _IBluetoothManagerEventListener interface.
+ *
+ * This header file contains the declaration of the _IBluetoothManagerEventListener interface.
+ *
+ */
+#ifndef _FNET_BT_INTERNAL_IBLUETOOTH_MANAGER_EVENT_LISTENER_H_
+#define _FNET_BT_INTERNAL_IBLUETOOTH_MANAGER_EVENT_LISTENER_H_
+
+#include <FBaseRtIEventListener.h>
+#include <FNetBtBluetoothTypes.h>
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+/**
+ * @interface _IBluetoothManagerEventListener
+ * @brief This interface specifies the methods used for notifying different kinds of Bluetooth manager(adapter)
+ * related events such as activation and deactivation.
+ */
+class _OSP_EXPORT_ _IBluetoothManagerEventListener
+ : public Base::Runtime::IEventListener
+{
+public:
+ /**
+ * This is the virtual destructor for this class.
+ */
+ virtual ~_IBluetoothManagerEventListener(void) {}
+
+
+ /**
+ * Callback used to notify that Bluetooth is activated on the device.
+ *
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ virtual void OnBluetoothActivated(result r) = 0;
+
+ /**
+ * Callback used to notify that Bluetooth is deactivated on the device.
+ *
+ * @exception E_SUCCESS The method is successful.
+ * @exception E_SYSTEM A system error occurred.
+ */
+ virtual void OnBluetoothDeactivated(result r) = 0;
+
+ /**
+ * Callback used to notify that Bluetooth is deactivated on the device.
+ *
+ * @param[in] mode The changed discoverable mode
+ */
+ virtual void OnBluetoothDiscoverableModeChanged(BluetoothDiscoverableMode mode) = 0;
+
+}; // _IBluetoothManagerEventListener
+
+} } }
+#endif // _FNET_BT_INTERNAL_IBLUETOOTH_MANAGER_EVENT_LISTENER_H_
diff --git a/src/inc/FNetBt_IBluetoothSocketListener.h b/src/inc/FNetBt_IBluetoothSocketListener.h
new file mode 100644
index 0000000..b35e063
--- /dev/null
+++ b/src/inc/FNetBt_IBluetoothSocketListener.h
@@ -0,0 +1,90 @@
+//
+// Open Service Platform
+// 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 FNetBt_IBluetoothSocketListener.h
+ * @brief This is the header file for the _IBluetoothSocketListener interface.
+ *
+ * This header file contains the declaration of the _IBluetoothSocketListener interface.
+ *
+ */
+#ifndef _FNET_BT_INTERNAL_IBLUETOOTH_SOCKET_LISTENER_H_
+#define _FNET_BT_INTERNAL_IBLUETOOTH_SOCKET_LISTENER_H_
+
+#include <FBaseRtIEventListener.h>
+
+namespace Tizen { namespace Base
+{
+class ByteBuffer;
+} }
+
+namespace Tizen { namespace Net { namespace Bluetooth
+{
+
+// forward declaration
+class BluetoothDevice;
+
+/**
+ * @interface _IBluetoothSocketListener
+ * @brief This interface specifies the methods used for notifying different kinds of Bluetooth socket (SPP) related
+ * events such as connection and disconnection.
+ */
+class _OSP_EXPORT_ _IBluetoothSocketListener
+ : public Base::Runtime::IEventListener
+{
+public:
+ /**
+ * This is the virtual destructor for this class.
+ */
+ virtual ~_IBluetoothSocketListener(void) {}
+
+ /**
+ * Callback used to notify that a new connection request is received from the socket client.
+ *
+ * @param[in] device The socket client device
+ */
+ virtual void OnSocketConnectionRequested(const BluetoothDevice& device) = 0;
+
+ /**
+ * Callback used to notify that the response of the connection request is received from the socket server.
+ *
+ * @param[in] socketFd The new generated client socket FD
+ * @param[in] r The result of the event
+ * @exception E_SUCCESS The connection is established successfully.
+ * @exception E_SYSTEM The connection fails.
+ */
+ virtual void OnSocketConnectionResponded(int socketFd, result r) = 0;
+
+ /**
+ * Callback used to notify that the connection is disconnected.
+ *
+ * @param[in] r The result of the event
+ * @exception E_SUCCESS The connection is terminated successfully.
+ * @exception E_SYSTEM The method has failed to disconnect.
+ */
+ virtual void OnSocketDisconnected(result r) = 0;
+
+ /**
+ * Callback used to notify that the data has been received.
+ *
+ * @param[in] buffer The received data
+ */
+ virtual void OnSocketDataReceived(Tizen::Base::ByteBuffer& buffer) = 0;
+
+}; // _IBluetoothSocketListener
+
+} } }
+#endif // _FNET_BT_INTERNAL_IBLUETOOTH_SOCKET_LISTENER_H_