summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorKibum Kim <kb0929.kim@samsung.com>2012-01-07 00:42:16 +0900
committerKibum Kim <kb0929.kim@samsung.com>2012-01-07 00:42:16 +0900
commit7c3c71cee13f1a58e5242fe9d6d2d4be65559646 (patch)
tree69e13ea8193295ec3cecb6b5a22f98c25ba654f2 /test
parentf7d3bd8b3884553bbe42d6ece32974d3e26281ee (diff)
downloadbluetooth-7c3c71cee13f1a58e5242fe9d6d2d4be65559646.tar.gz
bluetooth-7c3c71cee13f1a58e5242fe9d6d2d4be65559646.tar.bz2
bluetooth-7c3c71cee13f1a58e5242fe9d6d2d4be65559646.zip
Git init
Diffstat (limited to 'test')
-rw-r--r--test/CMakeLists.txt17
-rw-r--r--test/bt_chat_client.c453
-rw-r--r--test/bt_chat_server.c280
3 files changed, 750 insertions, 0 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
new file mode 100644
index 0000000..7715cac
--- /dev/null
+++ b/test/CMakeLists.txt
@@ -0,0 +1,17 @@
+SET(fw_test "${fw_name}-test")
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(${fw_test} REQUIRED glib-2.0)
+FOREACH(flag ${${fw_test}_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -Wall")
+
+aux_source_directory(. sources)
+FOREACH(src ${sources})
+ GET_FILENAME_COMPONENT(src_name ${src} NAME_WE)
+ MESSAGE("${src_name}")
+ ADD_EXECUTABLE(${src_name} ${src})
+ TARGET_LINK_LIBRARIES(${src_name} ${fw_name} ${${fw_test}_LDFLAGS})
+ENDFOREACH()
diff --git a/test/bt_chat_client.c b/test/bt_chat_client.c
new file mode 100644
index 0000000..62e1212
--- /dev/null
+++ b/test/bt_chat_client.c
@@ -0,0 +1,453 @@
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include <bluetooth.h>
+#include <dlog.h>
+#include <glib.h>
+#include <string.h>
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+#define LOG_TAG "BT_CHAT_CLIENT"
+
+/**
+ * Variables
+ **/
+static GMainLoop* g_mainloop = NULL;
+static bt_adapter_state_e bt_state = BT_ADAPTER_DISABLED;
+static int socket_fd = -1;
+static char* bt_address = NULL;
+static char* server_name = "chat_server";
+static char quit_command[5] = "Quit";
+static int bonding_state = BT_ERROR_OPERATION_FAILED;
+
+
+/**
+ * Callback functions
+ **/
+gboolean timeout_func(gpointer data)
+{
+ LOGE("[%s] Callback: Timeout.", __FUNCTION__);
+ g_main_loop_quit((GMainLoop*)data);
+ return FALSE;
+}
+
+void bt_state_changed_impl(int result, bt_adapter_state_e adapter_state, void* user_data)
+{
+ if(adapter_state == BT_ADAPTER_ENABLED)
+ {
+ if(result == BT_ERROR_NONE)
+ {
+ LOGI("[%s] Callback: BT was enabled successfully.", __FUNCTION__);
+ bt_state = BT_ADAPTER_ENABLED;
+ }
+ else
+ {
+ LOGE("[%s] Callback: Failed to enable BT.", __FUNCTION__);
+ }
+ }
+
+ if(g_mainloop)
+ {
+ g_main_loop_quit(g_mainloop);
+ }
+}
+
+void bt_socket_connection_state_changed_impl(int result, bt_socket_connection_state_e connection_state,
+ bt_socket_connection_s *connection, void *user_data)
+{
+ if(result == BT_ERROR_NONE)
+ {
+ LOGI("[%s] Callback: Result is BT_ERROR_NONE.", __FUNCTION__);
+ }
+ else
+ {
+ LOGI("[%s] Callback: Result is not BT_ERROR_NONE.", __FUNCTION__);
+ }
+
+ if(connection_state == BT_SOCKET_CONNECTED)
+ {
+ LOGI("[%s] Callback: Connected.", __FUNCTION__);
+ if(result == BT_ERROR_NONE && connection != NULL)
+ {
+ socket_fd = connection->socket_fd;
+ LOGI("[%s] Callback: Socket of connection - %d.", __FUNCTION__, socket_fd);
+ LOGI("[%s] Callback: Role of connection - %d.", __FUNCTION__, connection->local_role);
+ LOGI("[%s] Callback: Address of connection - %s.", __FUNCTION__, connection->remote_address);
+
+ if(bt_socket_send_data(socket_fd, quit_command, strlen(quit_command)) == BT_ERROR_NONE)
+ {
+ LOGI("[%s] Callback: Send quit command.", __FUNCTION__);
+ }
+ else
+ {
+ LOGE("[%s] Callback: bt_socket_send_data() failed.", __FUNCTION__);
+ if(g_mainloop)
+ {
+ g_main_loop_quit(g_mainloop);
+ }
+ }
+ }
+ else
+ {
+ LOGI("[%s] Callback: Failed to connect", __FUNCTION__);
+ if(g_mainloop)
+ {
+ g_main_loop_quit(g_mainloop);
+ }
+ }
+ }
+ else
+ {
+ LOGI("[%s] Callback: Disconnected.", __FUNCTION__);
+ }
+}
+
+void bt_socket_data_received_impl(bt_socket_received_data_s *data, void *user_data)
+{
+ if(socket_fd == data->socket_fd)
+ {
+ if(data->data_size > 0)
+ {
+ if(!strncmp(data->data, quit_command, data->data_size))
+ {
+ LOGI("[%s] Callback: Quit command.", __FUNCTION__);
+ if(g_mainloop)
+ {
+ g_main_loop_quit(g_mainloop);
+ }
+ }
+ }
+ else
+ {
+ LOGE("[%s] Callback: No data.", __FUNCTION__);
+ }
+ }
+ else
+ {
+ LOGI("[%s] Callback: Another socket - %d.", __FUNCTION__, data->socket_fd);
+ }
+}
+
+bool bt_adapter_bonded_device_impl(bt_device_info_s *device_info, void *user_data)
+{
+ int i = 0;
+ if(device_info != NULL)
+ {
+ if(device_info->remote_name != NULL && !strcmp(device_info->remote_name, (char*)user_data))
+ {
+ LOGI("[%s] Callback: chat_server is found in bonded list.", __FUNCTION__);
+ if( device_info->remote_address != NULL )
+ {
+ LOGI("[%s] Callback: Address of chat_server - %s.", __FUNCTION__, device_info->remote_address);
+ bt_address = strdup(device_info->remote_address);
+ LOGI("[%s] Callback: The number of service_count - %d.", __FUNCTION__, device_info->service_count);
+ if(device_info->service_count <= 0)
+ {
+ bonding_state = BT_ERROR_SERVICE_SEARCH_FAILED;
+ }
+ else
+ {
+ bonding_state = BT_ERROR_NONE;
+ for(i=0; i<device_info->service_count; i++)
+ {
+ LOGI("[%s] Callback: service[%d] - %s", __FUNCTION__, i+1, device_info->service_uuid[i]);
+ }
+ LOGI("[%s] Callback: is_bonded - %d.", __FUNCTION__, device_info->is_bonded);
+ LOGI("[%s] Callback: is_connected - %d.", __FUNCTION__, device_info->is_connected);
+ LOGI("[%s] Callback: is_authorized - %d.", __FUNCTION__, device_info->is_authorized);
+ }
+ }
+ else
+ {
+ LOGE("[%s] Callback: Address of chat_server is NULL.", __FUNCTION__);
+ }
+
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void bt_adapter_device_discovery_state_changed_impl(int result, bt_adapter_device_discovery_state_e discovery_state,
+ bt_adapter_device_discovery_info_s *discovery_info, void *user_data)
+{
+ if(discovery_state == BT_ADAPTER_DEVICE_DISCOVERY_FOUND)
+ {
+ if(discovery_info->remote_address != NULL && !strcmp(discovery_info->remote_name, server_name))
+ {
+ LOGI("[%s] Callback: chat_server is found.", __FUNCTION__);
+ LOGI("[%s] Callback: Address of chat_server - %s.", __FUNCTION__, discovery_info->remote_address);
+ LOGI("[%s] Callback: Device major class - %d.", __FUNCTION__, discovery_info->bt_class.major_device_class);
+ LOGI("[%s] Callback: Device minor class - %d.", __FUNCTION__, discovery_info->bt_class.minor_device_class);
+ LOGI("[%s] Callback: Service major class - %d.", __FUNCTION__, discovery_info->bt_class.major_service_class_mask);
+ bt_address = strdup(discovery_info->remote_address);
+ LOGI("[%s] Callback: is_bonded - %d.", __FUNCTION__, discovery_info->is_bonded);
+ bt_adapter_stop_device_discovery();
+ }
+ else
+ {
+ LOGE("[%s] Callback: Another device is found.", __FUNCTION__);
+ }
+ }
+ else if(discovery_state == BT_ADAPTER_DEVICE_DISCOVERY_FINISHED)
+ {
+ LOGI("[%s] Callback: device discovery finished.", __FUNCTION__);
+ if(g_mainloop)
+ {
+ g_main_loop_quit(g_mainloop);
+ }
+ }
+}
+
+void bt_device_bond_created_impl(int result, bt_device_info_s *device_info, void *user_data)
+{
+ if(device_info != NULL && !strcmp(device_info->remote_address, bt_address))
+ {
+ bonding_state = result;
+ if(result == BT_ERROR_NONE)
+ {
+ LOGI("[%s] Callback: A bond with chat_server is created.", __FUNCTION__);
+ LOGI("[%s] Callback: The number of service - %d.", __FUNCTION__, device_info->service_count);
+
+ int i = 0;
+ for(i=0; i<device_info->service_count; i++)
+ {
+ LOGI("[%s] Callback: service[%d] - %s", __FUNCTION__, i+1, device_info->service_uuid[i]);
+ }
+ LOGI("[%s] Callback: is_bonded - %d.", __FUNCTION__, device_info->is_bonded);
+ LOGI("[%s] Callback: is_connected - %d.", __FUNCTION__, device_info->is_connected);
+ }
+ else
+ {
+ LOGE("[%s] Callback: Creating a bond is failed.", __FUNCTION__);
+ }
+ }
+ else
+ {
+ LOGE("[%s] Callback: A bond with another device is created.", __FUNCTION__);
+ }
+
+ if(g_mainloop)
+ {
+ g_main_loop_quit(g_mainloop);
+ }
+}
+
+void bt_device_service_searched_impl(int result, bt_device_sdp_info_s* sdp_info, void* user_data)
+{
+ if(sdp_info != NULL && !strcmp(sdp_info->remote_address, bt_address))
+ {
+ bonding_state = result;
+ if(result == BT_ERROR_NONE)
+ {
+ LOGI("[%s] Callback: Services of chat_service are found.", __FUNCTION__);
+ LOGI("[%s] Callback: The number of service - %d.", __FUNCTION__, sdp_info->service_count);
+
+ int i = 0;
+ for(i = 0; i < sdp_info->service_count; i++)
+ {
+ LOGI("[%s] Callback: service[%d] - %s", __FUNCTION__, i+1, sdp_info->service_uuid[i]);
+ }
+ }
+ }
+ else
+ {
+ LOGE("[%s] Callback: Services of another device are found.", __FUNCTION__);
+ }
+
+ if(g_mainloop)
+ {
+ g_main_loop_quit(g_mainloop);
+ }
+}
+
+
+
+
+int main()
+{
+ g_mainloop = g_main_loop_new(NULL, FALSE);
+ const char* my_uuid="11011101-0000-1000-8000-00805F9B34FB";
+ int timeout_id = -1;
+
+ LOGI("[%s] Client starts.", __FUNCTION__);
+
+ if(bt_initialize() != BT_ERROR_NONE)
+ {
+ LOGE("[%s] bt_initialize() failed.", __FUNCTION__);
+ return -1;
+ }
+
+ if(bt_adapter_get_state(&bt_state) != BT_ERROR_NONE)
+ {
+ LOGE("[%s] bt_adapter_get_state() failed.", __FUNCTION__);
+ return -1;
+ }
+
+ // Enable BT
+ if(bt_state == BT_ADAPTER_DISABLED)
+ {
+ if(bt_adapter_set_state_changed_cb(bt_state_changed_impl, NULL) != BT_ERROR_NONE)
+ {
+ LOGE("[%s] bt_adapter_set_state_changed_cb() failed.", __FUNCTION__);
+ return -1;
+ }
+
+ if(bt_adapter_enable() == BT_ERROR_NONE)
+ {
+ LOGI("[%s] bt_adapter_state_changed_cb will be called.", __FUNCTION__);
+ timeout_id = g_timeout_add (60000, timeout_func, g_mainloop);
+ g_main_loop_run(g_mainloop);
+ g_source_remove(timeout_id);
+ }
+ else
+ {
+ LOGE("[%s] bt_adapter_enable() failed.", __FUNCTION__);
+ return -1;
+ }
+ }
+ else
+ {
+ LOGI("[%s] BT was already enabled.", __FUNCTION__);
+ }
+
+ // Device discovery
+ if(bt_state == BT_ADAPTER_ENABLED)
+ {
+ if(bt_adapter_foreach_bonded_device(bt_adapter_bonded_device_impl, server_name) != BT_ERROR_NONE)
+ {
+ LOGE("[%s] bt_adapter_foreach_bonded_device() failed.", __FUNCTION__);
+ return -1;
+ }
+
+ if(bt_address == NULL)
+ {
+ if(bt_adapter_set_device_discovery_state_changed_cb(bt_adapter_device_discovery_state_changed_impl, NULL)
+ != BT_ERROR_NONE )
+ {
+ LOGE("[%s] bt_adapter_set_device_discovery_state_changed_cb() failed.", __FUNCTION__);
+ return -1;
+ }
+
+ if(bt_adapter_start_device_discovery() == BT_ERROR_NONE)
+ {
+ LOGI("[%s] bt_adapter_device_discovery_state_changed_cb will be called.", __FUNCTION__);
+ g_main_loop_run(g_mainloop);
+ }
+ else
+ {
+ LOGE("[%s] bt_adapter_start_device_discovery() failed.", __FUNCTION__);
+ return -1;
+ }
+ }
+ else
+ {
+ LOGI("[%s] chat_server is found in bonded device list.", __FUNCTION__);
+ }
+ }
+ else
+ {
+ LOGE("[%s] BT is not enabled.", __FUNCTION__);
+ return -1;
+ }
+
+ // Create bond with a server
+ if(bonding_state == BT_ERROR_SERVICE_SEARCH_FAILED)
+ {
+ if(bt_device_set_service_searched_cb(bt_device_service_searched_impl, NULL) != BT_ERROR_NONE)
+ {
+ LOGE("[%s] bt_device_set_service_searched_cb() failed.", __FUNCTION__);
+ return -1;
+ }
+
+ if(bt_device_start_service_search(bt_address) == BT_ERROR_NONE)
+ {
+ LOGI("[%s] bt_device_service_searched_cb will be called.", __FUNCTION__);
+ g_main_loop_run(g_mainloop);
+ }
+ else
+ {
+ LOGE("[%s] bt_device_start_service_search() failed.", __FUNCTION__);
+ return -1;
+ }
+ }
+ else if(bonding_state != BT_ERROR_NONE)
+ {
+ if(bt_device_set_bond_created_cb(bt_device_bond_created_impl, NULL) != BT_ERROR_NONE)
+ {
+ LOGE("[%s] bt_device_set_bond_created_cb() failed.", __FUNCTION__);
+ return -1;
+ }
+
+ if(bt_device_create_bond(bt_address) == BT_ERROR_NONE)
+ {
+ LOGI("[%s] bt_device_bond_created_cb will be called.", __FUNCTION__);
+ g_main_loop_run(g_mainloop);
+ }
+ else
+ {
+ LOGE("[%s] bt_device_create_bond() failed.", __FUNCTION__);
+ return -1;
+ }
+ }
+
+ // Connecting socket as a client
+ if( bonding_state == BT_ERROR_NONE )
+ {
+ if( bt_socket_set_connection_state_changed_cb(bt_socket_connection_state_changed_impl, NULL) != BT_ERROR_NONE )
+ {
+ LOGE("[%s] bt_socket_set_connection_state_changed_cb() failed.", __FUNCTION__);
+ return -1;
+ }
+
+ if( bt_socket_set_data_received_cb(bt_socket_data_received_impl, NULL) != BT_ERROR_NONE )
+ {
+ LOGE("[%s] bt_socket_set_data_received_cb() failed.", __FUNCTION__);
+ return -1;
+ }
+
+ if( bt_socket_connect_rfcomm(bt_address, my_uuid) == BT_ERROR_NONE )
+ {
+ LOGI("[%s] bt_socket_connection_state_changed_cb will be called.", __FUNCTION__);
+ g_main_loop_run(g_mainloop);
+ }
+ else
+ {
+ LOGE("[%s] bt_socket_connect_rfcomm() failed.", __FUNCTION__);
+ return -1;
+ }
+
+ if( bt_socket_disconnect_rfcomm(socket_fd) != BT_ERROR_NONE )
+ {
+ LOGE("[%s] bt_socket_disconnect_rfcomm() failed.", __FUNCTION__);
+ return -1;
+ }
+ }
+ else
+ {
+ LOGE("[%s] Bond is not created.", __FUNCTION__);
+ return -1;
+ }
+
+ bt_deinitialize();
+
+ LOGI("[%s] Client ends.", __FUNCTION__);
+ return 0;
+}
diff --git a/test/bt_chat_server.c b/test/bt_chat_server.c
new file mode 100644
index 0000000..44edd83
--- /dev/null
+++ b/test/bt_chat_server.c
@@ -0,0 +1,280 @@
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include <bluetooth.h>
+#include <dlog.h>
+#include <glib.h>
+#include <string.h>
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+#define LOG_TAG "BT_CHAT_SERVER"
+
+/**
+ * Variables
+ **/
+static GMainLoop* g_mainloop = NULL;
+static bt_adapter_visibility_mode_e visibility_mode = BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE;
+static bt_adapter_state_e bt_state = BT_ADAPTER_DISABLED;
+static int service_socket = -1;
+static int connected_socket = -1;
+static char* quit_command = "Quit";
+
+
+/**
+ * Callback functions
+ **/
+gboolean timeout_func(gpointer data)
+{
+ LOGE("[%s] Timeout.", __FUNCTION__);
+ if(g_mainloop)
+ {
+ g_main_loop_quit((GMainLoop*)data);
+ }
+
+ return FALSE;
+}
+
+void bt_state_changed_impl(int result, bt_adapter_state_e adapter_state, void* user_data)
+{
+ if( adapter_state == BT_ADAPTER_ENABLED )
+ {
+ if( result == BT_ERROR_NONE )
+ {
+ LOGI("[%s] Callback: BT was enabled successfully.", __FUNCTION__);
+ bt_state = BT_ADAPTER_ENABLED;
+ }
+ else
+ {
+ LOGE("[%s] Callback: Failed to enable BT.", __FUNCTION__);
+ }
+ }
+
+ if(g_mainloop)
+ {
+ g_main_loop_quit(g_mainloop);
+ }
+}
+
+void bt_socket_connection_state_changed_impl(int result, bt_socket_connection_state_e connection_state,
+ bt_socket_connection_s *connection, void *user_data)
+{
+ if( result == BT_ERROR_NONE )
+ {
+ LOGI("[%s] Callback: Result is BT_ERROR_NONE.", __FUNCTION__);
+ }
+ else
+ {
+ LOGI("[%s] Callback: Result is not BT_ERROR_NONE.", __FUNCTION__);
+ }
+
+ if( connection_state == BT_SOCKET_CONNECTED )
+ {
+ LOGI("[%s] Callback: Connected.", __FUNCTION__);
+ if( connection != NULL )
+ {
+ connected_socket = connection->socket_fd;
+ LOGI("[%s] Callback: Socket of connection - %d.", __FUNCTION__, connected_socket);
+ LOGI("[%s] Callback: Role of connection - %d.", __FUNCTION__, connection->local_role);
+ LOGI("[%s] Callback: Address of connection - %s.", __FUNCTION__, connection->remote_address);
+
+ }
+ else
+ {
+ LOGI("[%s] Callback: No connection data", __FUNCTION__);
+ }
+ }
+ else
+ {
+ LOGI("[%s] Callback: Disconnected.", __FUNCTION__);
+ LOGI("[%s] Callback: Socket of connection - %d.", __FUNCTION__, connected_socket);
+ LOGI("[%s] Callback: Role of connection - %d.", __FUNCTION__, connection->local_role);
+ LOGI("[%s] Callback: Address of connection - %s.", __FUNCTION__, connection->remote_address);
+ }
+}
+
+void bt_socket_data_received_impl(bt_socket_received_data_s *data, void *user_data)
+{
+ if( data->data_size > 0 )
+ {
+ if( !strncmp(data->data, quit_command, data->data_size) )
+ {
+ LOGI("[%s] Callback: Quit command.", __FUNCTION__);
+ if(g_mainloop)
+ {
+ g_main_loop_quit(g_mainloop);
+ }
+ }
+
+ if( bt_socket_send_data(connected_socket, quit_command, strlen(quit_command)) == BT_ERROR_NONE )
+ {
+ LOGI("[%s] Callback: Send quit command.", __FUNCTION__);
+ }
+ else
+ {
+ LOGE("[%s] Callback: bt_socket_send_data() failed.", __FUNCTION__);
+ }
+ }
+ else
+ {
+ LOGE("[%s] Callback: No data.", __FUNCTION__);
+ }
+}
+
+
+int main()
+{
+ g_mainloop = g_main_loop_new(NULL, FALSE);
+ const char* my_uuid="11011101-0000-1000-8000-00805F9B34FB";
+ int timeout_id = -1;
+
+ LOGI("[%s] Server starts.", __FUNCTION__);
+
+ if(bt_initialize() != BT_ERROR_NONE)
+ {
+ LOGE("[%s] bt_initialize() failed.", __FUNCTION__);
+ return -1;
+ }
+
+ if(bt_adapter_get_state(&bt_state) != BT_ERROR_NONE)
+ {
+ LOGE("[%s] bt_adapter_get_state() failed.", __FUNCTION__);
+ return -1;
+ }
+
+ // Enable BT
+ if(bt_state == BT_ADAPTER_DISABLED)
+ {
+ if(bt_adapter_set_state_changed_cb(bt_state_changed_impl, NULL) != BT_ERROR_NONE)
+ {
+ LOGE("[%s] bt_adapter_set_state_changed_cb() failed.", __FUNCTION__);
+ return -1;
+ }
+
+ if(bt_adapter_enable() == BT_ERROR_NONE)
+ {
+ LOGI("[%s] bt_adapter_state_changed_cb will be called.", __FUNCTION__);
+ timeout_id = g_timeout_add (60000, timeout_func, g_mainloop);
+ g_main_loop_run(g_mainloop);
+ g_source_remove(timeout_id);
+ }
+ else
+ {
+ LOGE("[%s] bt_adapter_enable() failed.", __FUNCTION__);
+ return -1;
+ }
+ }
+ else
+ {
+ LOGI("[%s] BT was already enabled.", __FUNCTION__);
+ }
+
+ // Set name as "chat_server"
+ if(bt_state == BT_ADAPTER_ENABLED)
+ {
+ char* name = NULL;
+ if(bt_adapter_get_name(&name) != BT_ERROR_NONE)
+ {
+ LOGE("[%s] bt_adapter_get_name() failed.", __FUNCTION__);
+ return -1;
+ }
+
+ if(strncmp(name, "chat_server", strlen(name)) != 0)
+ {
+ free(name);
+ if(bt_adapter_set_name("chat_server") != BT_ERROR_NONE)
+ {
+ LOGE("[%s] bt_adapter_set_name() failed.", __FUNCTION__);
+ return -1;
+ }
+ }
+ }
+ else
+ {
+ LOGE("[%s] BT is not enabled.", __FUNCTION__);
+ return -1;
+ }
+
+ // Set visibility as BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE
+ if(bt_adapter_get_visibility(&visibility_mode) != BT_ERROR_NONE)
+ {
+ LOGE("[%s] bt_adapter_get_visibility() failed.", __FUNCTION__);
+ return -1;
+ }
+
+ if(visibility_mode != BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE)
+ {
+ if(bt_adapter_set_visibility(BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE, 0) != BT_ERROR_NONE)
+ {
+ LOGE("[%s] bt_adapter_set_visibility() failed.", __FUNCTION__);
+ return -1;
+ }
+ visibility_mode = BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE;
+ }
+ else
+ {
+ LOGI("[%s] Visibility mode was already set as BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE.", __FUNCTION__);
+ }
+
+ // Connecting socket as a server
+ if(bt_socket_create_rfcomm(my_uuid, &service_socket) != BT_ERROR_NONE)
+ {
+ LOGE("[%s] bt_socket_create_rfcomm() failed.", __FUNCTION__);
+ return -1;
+ }
+ LOGI("[%s] socket is created - %d.", __FUNCTION__, service_socket);
+
+ if(bt_socket_set_connection_state_changed_cb(bt_socket_connection_state_changed_impl, NULL) != BT_ERROR_NONE)
+ {
+ LOGE("[%s] bt_socket_set_connection_state_changed_cb() failed.", __FUNCTION__);
+ return -1;
+ }
+
+ if(bt_socket_set_data_received_cb(bt_socket_data_received_impl, NULL) != BT_ERROR_NONE)
+ {
+ LOGE("[%s] bt_socket_set_data_received_cb() failed.", __FUNCTION__);
+ return -1;
+ }
+
+ if(bt_socket_listen_and_accept_rfcomm(service_socket, 5) == BT_ERROR_NONE)
+ {
+ LOGI("[%s] bt_socket_connection_state_changed_cb will be called.", __FUNCTION__);
+ g_main_loop_run(g_mainloop);
+ }
+ else
+ {
+ LOGE("[%s] bt_socket_listen_and_accept_rfcomm() failed.", __FUNCTION__);
+ return -1;
+ }
+
+ sleep(5); // Wait for completing delivery
+ if(bt_socket_destroy_rfcomm(service_socket) != BT_ERROR_NONE)
+ {
+ LOGE("[%s] bt_socket_destroy_rfcomm() failed.", __FUNCTION__);
+ return -1;
+ }
+ else
+ {
+ LOGE("[%s] bt_socket_destroy_rfcomm() succeeded.", __FUNCTION__);
+ }
+
+ bt_deinitialize();
+
+ LOGI("[%s] Server ends.", __FUNCTION__);
+ return 0;
+}