f123852fdc9913520818a59b0cb59704af0288b1
[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 <string.h>
28 #include <bluetooth.h>
29
30 #include "caedrinterface.h"
31 #include "caedrdevicelist.h"
32 #include "caedrutils.h"
33 #include "caadapterutils.h"
34 #include "caqueueingthread.h"
35
36 /**
37  * @var g_edrNetworkChangeCallback
38  * @brief Maintains the callback to be notified on local bluetooth adapter status change.
39  */
40 static CAEDRNetworkStatusCallback g_edrNetworkChangeCallback = NULL;
41
42 /**
43  * @fn CAEDRAdapterStateChangeCallback
44  * @brief This callback is registered to receive bluetooth adapter state changes.
45  */
46 static void CAEDRAdapterStateChangeCallback(int result, bt_adapter_state_e adapterState,
47                                             void *userData);
48
49 CAResult_t CAEDRInitializeNetworkMonitor(const ca_thread_pool_t threadPool)
50 {
51     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
52
53     // Initialize Bluetooth service
54     int err = bt_initialize();
55     if (BT_ERROR_NONE != err)
56     {
57         OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth initialization failed!, error num [%x]",
58                   err);
59         return CA_STATUS_FAILED;
60     }
61
62     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
63     return CA_STATUS_OK;
64 }
65
66 void CAEDRTerminateNetworkMonitor(void)
67 {
68     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
69
70     g_edrNetworkChangeCallback = NULL;
71
72     // Terminate Bluetooth service
73     bt_deinitialize();
74
75     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
76 }
77
78 CAResult_t CAEDRStartNetworkMonitor()
79 {
80     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
81
82     int ret = bt_adapter_set_state_changed_cb(CAEDRAdapterStateChangeCallback, NULL);
83     if(BT_ERROR_NONE != ret)
84     {
85        OIC_LOG(ERROR, EDR_ADAPTER_TAG, "bt_adapter_set_state_changed_cb failed");
86        return CA_STATUS_FAILED;
87     }
88
89     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
90     return CA_STATUS_OK;
91 }
92
93 CAResult_t CAEDRStopNetworkMonitor()
94 {
95     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
96     // Unset bluetooth adapter callbacks
97     int ret = bt_adapter_unset_state_changed_cb();
98     if(BT_ERROR_NONE != ret)
99     {
100         OIC_LOG(ERROR, EDR_ADAPTER_TAG, "bt_adapter_set_state_changed_cb failed");
101         return CA_STATUS_FAILED;
102     }
103     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
104     return CA_STATUS_OK;
105 }
106
107 void CAEDRSetNetworkChangeCallback(
108     CAEDRNetworkStatusCallback networkChangeCallback)
109 {
110     g_edrNetworkChangeCallback = networkChangeCallback;
111 }
112
113 CAResult_t CAEDRGetInterfaceInformation(CALocalConnectivity_t **info)
114 {
115     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
116
117     // Input validation
118     VERIFY_NON_NULL(info, EDR_ADAPTER_TAG, "LocalConnectivity info is null");
119
120     // Get the bluetooth adapter local address
121     char *localAddress = NULL;
122     int err = bt_adapter_get_address(&localAddress);
123     if (BT_ERROR_NONE != err)
124     {
125         OIC_LOG_V(ERROR, EDR_ADAPTER_TAG,
126                   "Getting local adapter address failed!, error num [%x]",
127                   err);
128         return CA_STATUS_FAILED;
129     }
130
131     // Create network info
132     *info = CAAdapterCreateLocalEndpoint(CA_EDR, localAddress);
133     if (NULL == *info)
134     {
135         OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create LocalConnectivity instance!");
136
137         OICFree(localAddress);
138         return CA_MEMORY_ALLOC_FAILED;
139     }
140
141     OICFree(localAddress);
142
143     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
144     return CA_STATUS_OK;
145 }
146
147 CAResult_t CAEDRGetAdapterEnableState(bool *state)
148 {
149     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
150
151     // Input validation
152     VERIFY_NON_NULL(state, EDR_ADAPTER_TAG, "state holder is NULL!");
153
154
155     bt_adapter_state_e adapterState;
156     int err = bt_adapter_get_state(&adapterState);
157     // Get Bluetooth adapter state
158     if (BT_ERROR_NONE != err)
159     {
160         OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth get state failed!, error num [%x]",
161                   err);
162
163         return CA_STATUS_FAILED;
164     }
165
166     *state = false;
167     if (BT_ADAPTER_ENABLED == adapterState)
168     {
169         *state = true;
170     }
171
172     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
173     return CA_STATUS_OK;
174 }
175
176 void CAEDRAdapterStateChangeCallback(int result, bt_adapter_state_e adapterState,
177                                      void *userData)
178 {
179     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
180
181     if (BT_ADAPTER_ENABLED == adapterState)
182     {
183         // Notity to upper layer
184         if (g_edrNetworkChangeCallback)
185         {
186             g_edrNetworkChangeCallback(CA_INTERFACE_UP);
187         }
188     }
189     else if (BT_ADAPTER_DISABLED == adapterState)
190     {
191         // Notity to upper layer
192         if (g_edrNetworkChangeCallback)
193         {
194             g_edrNetworkChangeCallback(CA_INTERFACE_DOWN);
195         }
196     }
197
198     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
199 }