Merge remote-tracking branch 'origin/routing-manager'
[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 *GMainLoopThread (void *param)
55 {
56     g_main_loop_run(g_mainloop);
57     return NULL;
58 }
59
60 CAResult_t CAEDRInitializeNetworkMonitor(const ca_thread_pool_t threadPool)
61 {
62     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
63     g_threadPoolHandle = threadPool;
64     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
65     return CA_STATUS_OK;
66 }
67
68 void CAEDRTerminateNetworkMonitor(void)
69 {
70     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
71
72     g_edrNetworkChangeCallback = NULL;
73
74     // Terminate Bluetooth service
75     bt_deinitialize();
76
77     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
78 }
79
80 CAResult_t CAEDRStartNetworkMonitor()
81 {
82     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
83
84     g_mainloop = g_main_loop_new(NULL, 0);
85     if(!g_mainloop)
86     {
87         OIC_LOG(ERROR, EDR_ADAPTER_TAG, "g_main_loop_new failed\n");
88         return CA_STATUS_FAILED;
89     }
90
91     if (CA_STATUS_OK != ca_thread_pool_add_task(g_threadPoolHandle, GMainLoopThread, (void *) NULL))
92     {
93         OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create thread!");
94         return CA_STATUS_FAILED;
95     }
96
97     // Initialize Bluetooth service
98     int err = bt_initialize();
99     if (BT_ERROR_NONE != err)
100     {
101         OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth initialization failed!, error num [%x]",
102                   err);
103         return CA_STATUS_FAILED;
104     }
105
106     int ret = bt_adapter_set_state_changed_cb(CAEDRAdapterStateChangeCallback, NULL);
107     if(BT_ERROR_NONE != ret)
108     {
109        OIC_LOG(ERROR, EDR_ADAPTER_TAG, "bt_adapter_set_state_changed_cb failed");
110        return CA_STATUS_FAILED;
111     }
112
113     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
114     return CA_STATUS_OK;
115 }
116
117 CAResult_t CAEDRStopNetworkMonitor()
118 {
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)
123     {
124         OIC_LOG(ERROR, EDR_ADAPTER_TAG, "bt_adapter_set_state_changed_cb failed");
125         return CA_STATUS_FAILED;
126     }
127
128     if (g_mainloop)
129     {
130         g_main_loop_quit(g_mainloop);
131     }
132     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
133     return CA_STATUS_OK;
134 }
135
136 void CAEDRSetNetworkChangeCallback(
137     CAEDRNetworkStatusCallback networkChangeCallback)
138 {
139     g_edrNetworkChangeCallback = networkChangeCallback;
140 }
141
142 CAResult_t CAEDRGetInterfaceInformation(CAEndpoint_t **info)
143 {
144     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
145
146     // Input validation
147     VERIFY_NON_NULL(info, EDR_ADAPTER_TAG, "LocalConnectivity info is null");
148
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)
153     {
154         OIC_LOG_V(ERROR, EDR_ADAPTER_TAG,
155                   "Getting local adapter address failed!, error num [%x]",
156                   err);
157         return CA_STATUS_FAILED;
158     }
159
160     // Create network info
161     *info = CACreateEndpointObject(CA_DEFAULT_FLAGS, CA_ADAPTER_RFCOMM_BTEDR, localAddress, 0);
162     if (NULL == *info)
163     {
164         OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create LocalConnectivity instance!");
165
166         OICFree(localAddress);
167         return CA_MEMORY_ALLOC_FAILED;
168     }
169
170     OICFree(localAddress);
171
172     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
173     return CA_STATUS_OK;
174 }
175
176 CAResult_t CAEDRGetAdapterEnableState(bool *state)
177 {
178     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
179
180     // Input validation
181     VERIFY_NON_NULL(state, EDR_ADAPTER_TAG, "state holder is NULL!");
182
183
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)
188     {
189         OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth get state failed!, error num [%x]",
190                   err);
191
192         return CA_STATUS_FAILED;
193     }
194
195     *state = false;
196     if (BT_ADAPTER_ENABLED == adapterState)
197     {
198         *state = true;
199     }
200
201     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
202     return CA_STATUS_OK;
203 }
204
205 void CAEDRAdapterStateChangeCallback(int result, bt_adapter_state_e adapterState,
206                                      void *userData)
207 {
208     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
209
210     if (BT_ADAPTER_ENABLED == adapterState)
211     {
212         // Notity to upper layer
213         if (g_edrNetworkChangeCallback)
214         {
215             g_edrNetworkChangeCallback(CA_INTERFACE_UP);
216         }
217     }
218     else if (BT_ADAPTER_DISABLED == adapterState)
219     {
220         // Notity to upper layer
221         if (g_edrNetworkChangeCallback)
222         {
223             g_edrNetworkChangeCallback(CA_INTERFACE_DOWN);
224         }
225     }
226
227     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
228 }