Imported Upstream version 1.1.0
[platform/upstream/iotivity.git] / resource / csdk / connectivity / src / bt_edr_adapter / tizen / caedrnwmonitor.c
1 /******************************************************************
2  *
3  * Copyright 2014 Samsung Electronics All Rights Reserved.
4  *
5  *
6  *
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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  *
19  ******************************************************************/
20
21 /**
22  * @file
23  *
24  * This file provides the APIs for EDR Network Monitor.
25  */
26
27 #include <glib.h>
28 #include <string.h>
29 #include <bluetooth.h>
30
31 #include "caedrinterface.h"
32 #include "caedrdevicelist.h"
33 #include "caedrutils.h"
34 #include "caadapterutils.h"
35 #include "caqueueingthread.h"
36 #include "caremotehandler.h"
37
38 static GMainLoop *g_mainloop = NULL;
39 static ca_thread_pool_t g_threadPoolHandle = NULL;
40
41 /**
42  * @var g_edrNetworkChangeCallback
43  * @brief Maintains the callback to be notified on local bluetooth adapter status change.
44  */
45 static CAEDRNetworkStatusCallback g_edrNetworkChangeCallback = NULL;
46
47 /**
48  * @fn CAEDRAdapterStateChangeCallback
49  * @brief This callback is registered to receive bluetooth adapter state changes.
50  */
51 static void CAEDRAdapterStateChangeCallback(int result, bt_adapter_state_e adapterState,
52                                             void *userData);
53
54 void CAEDRMainLoopThread(void *param)
55 {
56     g_main_loop_run(g_mainloop);
57 }
58
59 CAResult_t CAEDRInitializeNetworkMonitor(const ca_thread_pool_t threadPool)
60 {
61     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
62     g_threadPoolHandle = threadPool;
63     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
64     return CA_STATUS_OK;
65 }
66
67 void CAEDRTerminateNetworkMonitor(void)
68 {
69     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
70
71     g_edrNetworkChangeCallback = NULL;
72
73     // Terminate Bluetooth service
74     bt_deinitialize();
75
76     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
77 }
78
79 CAResult_t CAEDRStartNetworkMonitor()
80 {
81     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
82
83     g_mainloop = g_main_loop_new(NULL, 0);
84     if(!g_mainloop)
85     {
86         OIC_LOG(ERROR, EDR_ADAPTER_TAG, "g_main_loop_new failed\n");
87         return CA_STATUS_FAILED;
88     }
89
90     if (CA_STATUS_OK != ca_thread_pool_add_task(g_threadPoolHandle, CAEDRMainLoopThread, (void *) NULL))
91     {
92         OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create thread!");
93         return CA_STATUS_FAILED;
94     }
95
96     // Initialize Bluetooth service
97     int err = bt_initialize();
98     if (BT_ERROR_NONE != err)
99     {
100         OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth initialization failed!, error num [%x]",
101                   err);
102         return CA_STATUS_FAILED;
103     }
104
105     int ret = bt_adapter_set_state_changed_cb(CAEDRAdapterStateChangeCallback, NULL);
106     if(BT_ERROR_NONE != ret)
107     {
108        OIC_LOG(ERROR, EDR_ADAPTER_TAG, "bt_adapter_set_state_changed_cb failed");
109        return CA_STATUS_FAILED;
110     }
111
112     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
113     return CA_STATUS_OK;
114 }
115
116 CAResult_t CAEDRStopNetworkMonitor()
117 {
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)
122     {
123         OIC_LOG(ERROR, EDR_ADAPTER_TAG, "bt_adapter_set_state_changed_cb failed");
124         return CA_STATUS_FAILED;
125     }
126
127     if (g_mainloop)
128     {
129         g_main_loop_quit(g_mainloop);
130     }
131     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
132     return CA_STATUS_OK;
133 }
134
135 void CAEDRSetNetworkChangeCallback(
136     CAEDRNetworkStatusCallback networkChangeCallback)
137 {
138     g_edrNetworkChangeCallback = networkChangeCallback;
139 }
140
141 CAResult_t CAEDRGetInterfaceInformation(CAEndpoint_t **info)
142 {
143     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
144
145     // Input validation
146     VERIFY_NON_NULL(info, EDR_ADAPTER_TAG, "LocalConnectivity info is null");
147
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)
152     {
153         OIC_LOG_V(ERROR, EDR_ADAPTER_TAG,
154                   "Getting local adapter address failed!, error num [%x]",
155                   err);
156         return CA_STATUS_FAILED;
157     }
158
159     // Create network info
160     *info = CACreateEndpointObject(CA_DEFAULT_FLAGS, CA_ADAPTER_RFCOMM_BTEDR, localAddress, 0);
161     if (NULL == *info)
162     {
163         OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create LocalConnectivity instance!");
164
165         OICFree(localAddress);
166         return CA_MEMORY_ALLOC_FAILED;
167     }
168
169     OICFree(localAddress);
170
171     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
172     return CA_STATUS_OK;
173 }
174
175 CAResult_t CAEDRGetAdapterEnableState(bool *state)
176 {
177     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
178
179     // Input validation
180     VERIFY_NON_NULL(state, EDR_ADAPTER_TAG, "state holder is NULL!");
181
182
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)
187     {
188         OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth get state failed!, error num [%x]",
189                   err);
190
191         return CA_STATUS_FAILED;
192     }
193
194     *state = false;
195     if (BT_ADAPTER_ENABLED == adapterState)
196     {
197         *state = true;
198     }
199
200     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
201     return CA_STATUS_OK;
202 }
203
204 void CAEDRAdapterStateChangeCallback(int result, bt_adapter_state_e adapterState,
205                                      void *userData)
206 {
207     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
208
209     if (BT_ADAPTER_ENABLED == adapterState)
210     {
211         // Notity to upper layer
212         if (g_edrNetworkChangeCallback)
213         {
214             g_edrNetworkChangeCallback(CA_INTERFACE_UP);
215         }
216     }
217     else if (BT_ADAPTER_DISABLED == adapterState)
218     {
219         // Notity to upper layer
220         if (g_edrNetworkChangeCallback)
221         {
222             g_edrNetworkChangeCallback(CA_INTERFACE_DOWN);
223         }
224     }
225
226     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
227 }