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);
59 CAResult_t CAEDRInitializeNetworkMonitor(const ca_thread_pool_t threadPool)
61 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
62 g_threadPoolHandle = threadPool;
63 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
67 void CAEDRTerminateNetworkMonitor(void)
69 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
71 g_edrNetworkChangeCallback = NULL;
73 // Terminate Bluetooth service
76 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
79 CAResult_t CAEDRStartNetworkMonitor()
81 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
83 g_mainloop = g_main_loop_new(NULL, 0);
86 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "g_main_loop_new failed\n");
87 return CA_STATUS_FAILED;
90 if (CA_STATUS_OK != ca_thread_pool_add_task(g_threadPoolHandle, GMainLoopThread, (void *) NULL))
92 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create thread!");
93 return CA_STATUS_FAILED;
96 // Initialize Bluetooth service
97 int err = bt_initialize();
98 if (BT_ERROR_NONE != err)
100 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth initialization failed!, error num [%x]",
102 return CA_STATUS_FAILED;
105 int ret = bt_adapter_set_state_changed_cb(CAEDRAdapterStateChangeCallback, NULL);
106 if(BT_ERROR_NONE != ret)
108 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "bt_adapter_set_state_changed_cb failed");
109 return CA_STATUS_FAILED;
112 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
116 CAResult_t CAEDRStopNetworkMonitor()
118 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
119 // Unset bluetooth adapter callbacks
120 int ret = bt_adapter_unset_state_changed_cb();
121 if(BT_ERROR_NONE != ret)
123 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "bt_adapter_set_state_changed_cb failed");
124 return CA_STATUS_FAILED;
128 g_main_loop_unref(g_mainloop);
130 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
134 void CAEDRSetNetworkChangeCallback(
135 CAEDRNetworkStatusCallback networkChangeCallback)
137 g_edrNetworkChangeCallback = networkChangeCallback;
140 CAResult_t CAEDRGetInterfaceInformation(CAEndpoint_t **info)
142 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
145 VERIFY_NON_NULL(info, EDR_ADAPTER_TAG, "LocalConnectivity info is null");
147 // Get the bluetooth adapter local address
148 char *localAddress = NULL;
149 int err = bt_adapter_get_address(&localAddress);
150 if (BT_ERROR_NONE != err)
152 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG,
153 "Getting local adapter address failed!, error num [%x]",
155 return CA_STATUS_FAILED;
158 // Create network info
159 *info = CACreateEndpointObject(CA_DEFAULT_FLAGS, CA_ADAPTER_RFCOMM_BTEDR, localAddress, 0);
162 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create LocalConnectivity instance!");
164 OICFree(localAddress);
165 return CA_MEMORY_ALLOC_FAILED;
168 OICFree(localAddress);
170 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
174 CAResult_t CAEDRGetAdapterEnableState(bool *state)
176 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
179 VERIFY_NON_NULL(state, EDR_ADAPTER_TAG, "state holder is NULL!");
182 bt_adapter_state_e adapterState;
183 int err = bt_adapter_get_state(&adapterState);
184 // Get Bluetooth adapter state
185 if (BT_ERROR_NONE != err)
187 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth get state failed!, error num [%x]",
190 return CA_STATUS_FAILED;
194 if (BT_ADAPTER_ENABLED == adapterState)
199 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
203 void CAEDRAdapterStateChangeCallback(int result, bt_adapter_state_e adapterState,
206 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
208 if (BT_ADAPTER_ENABLED == adapterState)
210 // Notity to upper layer
211 if (g_edrNetworkChangeCallback)
213 g_edrNetworkChangeCallback(CA_INTERFACE_UP);
216 else if (BT_ADAPTER_DISABLED == adapterState)
218 // Notity to upper layer
219 if (g_edrNetworkChangeCallback)
221 g_edrNetworkChangeCallback(CA_INTERFACE_DOWN);
225 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");