Imported Upstream version 0.9.2
[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     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
53
54     // Initialize Bluetooth service
55     int err = bt_initialize();
56     if (BT_ERROR_NONE != err)
57     {
58         OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth initialization failed!, error num [%x]",
59                   err);
60         return CA_STATUS_FAILED;
61     }
62
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     int ret = bt_adapter_set_state_changed_cb(CAEDRAdapterStateChangeCallback, NULL);
84     if(BT_ERROR_NONE != ret)
85     {
86        OIC_LOG(ERROR, EDR_ADAPTER_TAG, "bt_adapter_set_state_changed_cb failed");
87        return CA_STATUS_FAILED;
88     }
89
90     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
91     return CA_STATUS_OK;
92 }
93
94 CAResult_t CAEDRStopNetworkMonitor()
95 {
96     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
97     // Unset bluetooth adapter callbacks
98     int ret = bt_adapter_unset_state_changed_cb();
99     if(BT_ERROR_NONE != ret)
100     {
101         OIC_LOG(ERROR, EDR_ADAPTER_TAG, "bt_adapter_set_state_changed_cb failed");
102         return CA_STATUS_FAILED;
103     }
104     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
105     return CA_STATUS_OK;
106 }
107
108 void CAEDRSetNetworkChangeCallback(
109     CAEDRNetworkStatusCallback networkChangeCallback)
110 {
111     g_edrNetworkChangeCallback = networkChangeCallback;
112 }
113
114 CAResult_t CAEDRGetInterfaceInformation(CAEndpoint_t **info)
115 {
116     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
117
118     // Input validation
119     VERIFY_NON_NULL(info, EDR_ADAPTER_TAG, "LocalConnectivity info is null");
120
121     // Get the bluetooth adapter local address
122     char *localAddress = NULL;
123     int err = bt_adapter_get_address(&localAddress);
124     if (BT_ERROR_NONE != err)
125     {
126         OIC_LOG_V(ERROR, EDR_ADAPTER_TAG,
127                   "Getting local adapter address failed!, error num [%x]",
128                   err);
129         return CA_STATUS_FAILED;
130     }
131
132     // Create network info
133     *info = CACreateEndpointObject(CA_DEFAULT_FLAGS, CA_ADAPTER_RFCOMM_BTEDR, localAddress, 0);
134     if (NULL == *info)
135     {
136         OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create LocalConnectivity instance!");
137
138         OICFree(localAddress);
139         return CA_MEMORY_ALLOC_FAILED;
140     }
141
142     OICFree(localAddress);
143
144     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
145     return CA_STATUS_OK;
146 }
147
148 CAResult_t CAEDRGetAdapterEnableState(bool *state)
149 {
150     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
151
152     // Input validation
153     VERIFY_NON_NULL(state, EDR_ADAPTER_TAG, "state holder is NULL!");
154
155
156     bt_adapter_state_e adapterState;
157     int err = bt_adapter_get_state(&adapterState);
158     // Get Bluetooth adapter state
159     if (BT_ERROR_NONE != err)
160     {
161         OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth get state failed!, error num [%x]",
162                   err);
163
164         return CA_STATUS_FAILED;
165     }
166
167     *state = false;
168     if (BT_ADAPTER_ENABLED == adapterState)
169     {
170         *state = true;
171     }
172
173     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
174     return CA_STATUS_OK;
175 }
176
177 void CAEDRAdapterStateChangeCallback(int result, bt_adapter_state_e adapterState,
178                                      void *userData)
179 {
180     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
181
182     if (BT_ADAPTER_ENABLED == adapterState)
183     {
184         // Notity to upper layer
185         if (g_edrNetworkChangeCallback)
186         {
187             g_edrNetworkChangeCallback(CA_INTERFACE_UP);
188         }
189     }
190     else if (BT_ADAPTER_DISABLED == adapterState)
191     {
192         // Notity to upper layer
193         if (g_edrNetworkChangeCallback)
194         {
195             g_edrNetworkChangeCallback(CA_INTERFACE_DOWN);
196         }
197     }
198
199     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
200 }