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 CAEDRMainLoopThread(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, CAEDRMainLoopThread, (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;
129 g_main_loop_quit(g_mainloop);
131 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
135 void CAEDRSetNetworkChangeCallback(
136 CAEDRNetworkStatusCallback networkChangeCallback)
138 g_edrNetworkChangeCallback = networkChangeCallback;
141 CAResult_t CAEDRGetInterfaceInformation(CAEndpoint_t **info)
143 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
146 VERIFY_NON_NULL(info, EDR_ADAPTER_TAG, "LocalConnectivity info is null");
148 // Get the bluetooth adapter local address
149 char *localAddress = NULL;
150 int err = bt_adapter_get_address(&localAddress);
151 if (BT_ERROR_NONE != err)
153 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG,
154 "Getting local adapter address failed!, error num [%x]",
156 return CA_STATUS_FAILED;
159 // Create network info
160 *info = CACreateEndpointObject(CA_DEFAULT_FLAGS, CA_ADAPTER_RFCOMM_BTEDR, localAddress, 0);
163 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create LocalConnectivity instance!");
165 OICFree(localAddress);
166 return CA_MEMORY_ALLOC_FAILED;
169 OICFree(localAddress);
171 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
175 CAResult_t CAEDRGetAdapterEnableState(bool *state)
177 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
180 VERIFY_NON_NULL(state, EDR_ADAPTER_TAG, "state holder is NULL!");
183 bt_adapter_state_e adapterState;
184 int err = bt_adapter_get_state(&adapterState);
185 // Get Bluetooth adapter state
186 if (BT_ERROR_NONE != err)
188 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth get state failed!, error num [%x]",
191 return CA_STATUS_FAILED;
195 if (BT_ADAPTER_ENABLED == adapterState)
200 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
204 void CAEDRAdapterStateChangeCallback(int result, bt_adapter_state_e adapterState,
207 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
209 if (BT_ADAPTER_ENABLED == adapterState)
211 // Notity to upper layer
212 if (g_edrNetworkChangeCallback)
214 g_edrNetworkChangeCallback(CA_INTERFACE_UP);
217 else if (BT_ADAPTER_DISABLED == adapterState)
219 // Notity to upper layer
220 if (g_edrNetworkChangeCallback)
222 g_edrNetworkChangeCallback(CA_INTERFACE_DOWN);
226 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");