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