d9af8e6615aee153e155c3f48bec8e91765625e0
[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 }
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, GMainLoopThread, (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         g_main_loop_unref(g_mainloop);
129
130     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
131     return CA_STATUS_OK;
132 }
133
134 void CAEDRSetNetworkChangeCallback(
135     CAEDRNetworkStatusCallback networkChangeCallback)
136 {
137     g_edrNetworkChangeCallback = networkChangeCallback;
138 }
139
140 CAResult_t CAEDRGetInterfaceInformation(CAEndpoint_t **info)
141 {
142     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
143
144     // Input validation
145     VERIFY_NON_NULL(info, EDR_ADAPTER_TAG, "LocalConnectivity info is null");
146
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)
151     {
152         OIC_LOG_V(ERROR, EDR_ADAPTER_TAG,
153                   "Getting local adapter address failed!, error num [%x]",
154                   err);
155         return CA_STATUS_FAILED;
156     }
157
158     // Create network info
159     *info = CACreateEndpointObject(CA_DEFAULT_FLAGS, CA_ADAPTER_RFCOMM_BTEDR, localAddress, 0);
160     if (NULL == *info)
161     {
162         OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create LocalConnectivity instance!");
163
164         OICFree(localAddress);
165         return CA_MEMORY_ALLOC_FAILED;
166     }
167
168     OICFree(localAddress);
169
170     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
171     return CA_STATUS_OK;
172 }
173
174 CAResult_t CAEDRGetAdapterEnableState(bool *state)
175 {
176     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
177
178     // Input validation
179     VERIFY_NON_NULL(state, EDR_ADAPTER_TAG, "state holder is NULL!");
180
181
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)
186     {
187         OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth get state failed!, error num [%x]",
188                   err);
189
190         return CA_STATUS_FAILED;
191     }
192
193     *state = false;
194     if (BT_ADAPTER_ENABLED == adapterState)
195     {
196         *state = true;
197     }
198
199     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
200     return CA_STATUS_OK;
201 }
202
203 void CAEDRAdapterStateChangeCallback(int result, bt_adapter_state_e adapterState,
204                                      void *userData)
205 {
206     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
207
208     if (BT_ADAPTER_ENABLED == adapterState)
209     {
210         // Notity to upper layer
211         if (g_edrNetworkChangeCallback)
212         {
213             g_edrNetworkChangeCallback(CA_INTERFACE_UP);
214         }
215     }
216     else if (BT_ADAPTER_DISABLED == adapterState)
217     {
218         // Notity to upper layer
219         if (g_edrNetworkChangeCallback)
220         {
221             g_edrNetworkChangeCallback(CA_INTERFACE_DOWN);
222         }
223     }
224
225     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
226 }