1 /******************************************************************
3 * Copyright 2014 Samsung Electronics All Rights Reserved.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 ******************************************************************/
24 * This file provides the APIs for EDR Network Monitor.
29 #include <bluetooth.h>
31 #include "caedrinterface.h"
32 #include "caedrdevicelist.h"
33 #include "caedrutils.h"
34 #include "caadapterutils.h"
35 #include "caqueueingthread.h"
36 #include "caremotehandler.h"
38 static GMainLoop *g_mainloop = NULL;
39 static ca_thread_pool_t g_threadPoolHandle = NULL;
42 * @var g_edrNetworkChangeCallback
43 * @brief Maintains the callback to be notified on local bluetooth adapter status change.
45 static CAEDRNetworkStatusCallback g_edrNetworkChangeCallback = NULL;
48 * @fn CAEDRAdapterStateChangeCallback
49 * @brief This callback is registered to receive bluetooth adapter state changes.
51 static void CAEDRAdapterStateChangeCallback(int result, bt_adapter_state_e adapterState,
54 void *GMainLoopThread (void *param)
56 g_main_loop_run(g_mainloop);
60 CAResult_t CAEDRInitializeNetworkMonitor(const ca_thread_pool_t threadPool)
62 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
63 g_threadPoolHandle = threadPool;
64 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
68 void CAEDRTerminateNetworkMonitor(void)
70 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
72 g_edrNetworkChangeCallback = NULL;
74 // Terminate Bluetooth service
77 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
80 CAResult_t CAEDRStartNetworkMonitor()
82 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
84 g_mainloop = g_main_loop_new(NULL, 0);
87 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "g_main_loop_new failed\n");
88 return CA_STATUS_FAILED;
91 if (CA_STATUS_OK != ca_thread_pool_add_task(g_threadPoolHandle, GMainLoopThread, (void *) NULL))
93 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create thread!");
94 return CA_STATUS_FAILED;
97 // Initialize Bluetooth service
98 int err = bt_initialize();
99 if (BT_ERROR_NONE != err)
101 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth initialization failed!, error num [%x]",
103 return CA_STATUS_FAILED;
106 int ret = bt_adapter_set_state_changed_cb(CAEDRAdapterStateChangeCallback, NULL);
107 if(BT_ERROR_NONE != ret)
109 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "bt_adapter_set_state_changed_cb failed");
110 return CA_STATUS_FAILED;
113 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
117 CAResult_t CAEDRStopNetworkMonitor()
119 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
120 // Unset bluetooth adapter callbacks
121 int ret = bt_adapter_unset_state_changed_cb();
122 if(BT_ERROR_NONE != ret)
124 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "bt_adapter_set_state_changed_cb failed");
125 return CA_STATUS_FAILED;
130 g_main_loop_quit(g_mainloop);
132 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
136 void CAEDRSetNetworkChangeCallback(
137 CAEDRNetworkStatusCallback networkChangeCallback)
139 g_edrNetworkChangeCallback = networkChangeCallback;
142 CAResult_t CAEDRGetInterfaceInformation(CAEndpoint_t **info)
144 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
147 VERIFY_NON_NULL(info, EDR_ADAPTER_TAG, "LocalConnectivity info is null");
149 // Get the bluetooth adapter local address
150 char *localAddress = NULL;
151 int err = bt_adapter_get_address(&localAddress);
152 if (BT_ERROR_NONE != err)
154 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG,
155 "Getting local adapter address failed!, error num [%x]",
157 return CA_STATUS_FAILED;
160 // Create network info
161 *info = CACreateEndpointObject(CA_DEFAULT_FLAGS, CA_ADAPTER_RFCOMM_BTEDR, localAddress, 0);
164 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create LocalConnectivity instance!");
166 OICFree(localAddress);
167 return CA_MEMORY_ALLOC_FAILED;
170 OICFree(localAddress);
172 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
176 CAResult_t CAEDRGetAdapterEnableState(bool *state)
178 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
181 VERIFY_NON_NULL(state, EDR_ADAPTER_TAG, "state holder is NULL!");
184 bt_adapter_state_e adapterState;
185 int err = bt_adapter_get_state(&adapterState);
186 // Get Bluetooth adapter state
187 if (BT_ERROR_NONE != err)
189 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth get state failed!, error num [%x]",
192 return CA_STATUS_FAILED;
196 if (BT_ADAPTER_ENABLED == adapterState)
201 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
205 void CAEDRAdapterStateChangeCallback(int result, bt_adapter_state_e adapterState,
208 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
210 if (BT_ADAPTER_ENABLED == adapterState)
212 // Notity to upper layer
213 if (g_edrNetworkChangeCallback)
215 g_edrNetworkChangeCallback(CA_INTERFACE_UP);
218 else if (BT_ADAPTER_DISABLED == adapterState)
220 // Notity to upper layer
221 if (g_edrNetworkChangeCallback)
223 g_edrNetworkChangeCallback(CA_INTERFACE_DOWN);
227 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");