Merge branch 'master' into easysetup
[platform/upstream/iotivity.git] / resource / csdk / connectivity / src / canetworkconfigurator.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 #include <stdlib.h>
22
23 #include "canetworkconfigurator.h"
24 #include "cainterfacecontroller.h"
25 #include "uarraylist.h"
26 #include "logger.h"
27
28 #define TAG "OIC_CA_NW_CONFIG"
29
30 static u_arraylist_t *g_selectedNetworkList = NULL;
31 static uint32_t NETWORK_IP = CA_ADAPTER_IP;
32 static uint32_t NETWORK_RFCOMM = CA_ADAPTER_RFCOMM_BTEDR;
33 static uint32_t NETWORK_GATT = CA_ADAPTER_GATT_BTLE;
34 static uint32_t NETWORK_NFC = CA_ADAPTER_NFC;
35
36 #ifdef RA_ADAPTER
37 static uint32_t NETWORK_RA = CA_ADAPTER_REMOTE_ACCESS;
38 #endif
39
40 #ifdef TCP_ADAPTER
41 static uint32_t NETWORK_TCP = CA_ADAPTER_TCP;
42 #endif
43
44 CAResult_t CAAddNetworkType(CATransportAdapter_t transportType)
45 {
46     if (NULL == g_selectedNetworkList)
47     {
48         OIC_LOG(DEBUG, TAG, "Create network list");
49
50         g_selectedNetworkList = u_arraylist_create();
51
52         if (NULL == g_selectedNetworkList)
53         {
54             return CA_MEMORY_ALLOC_FAILED;
55         }
56     }
57     bool res = true;
58     switch (transportType)
59     {
60         case CA_ADAPTER_IP:
61 #ifndef IP_ADAPTER
62             OIC_LOG(DEBUG, TAG, "Add network type(IP) - Not Supported");
63             return CA_NOT_SUPPORTED;
64 #else
65
66             OIC_LOG(DEBUG, TAG, "Add network type(IP)");
67             if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_IP))
68             {
69                 goto exit;
70             }
71             res = u_arraylist_add(g_selectedNetworkList, &NETWORK_IP);
72
73             break;
74 #endif // IP_ADAPTER
75
76         case CA_ADAPTER_RFCOMM_BTEDR:
77 #ifndef EDR_ADAPTER
78             OIC_LOG(DEBUG, TAG, "Add network type(EDR) - Not Supported");
79             return CA_NOT_SUPPORTED;
80 #else
81
82             OIC_LOG(DEBUG, TAG, "Add network type(EDR)");
83             if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_RFCOMM))
84             {
85                 goto exit;
86             }
87             res = u_arraylist_add(g_selectedNetworkList, &NETWORK_RFCOMM);
88
89             break;
90 #endif // EDR_ADAPTER
91
92         case CA_ADAPTER_GATT_BTLE:
93 #ifndef LE_ADAPTER
94             OIC_LOG(DEBUG, TAG, "Add network type(LE) - Not Supported");
95             return CA_NOT_SUPPORTED;
96 #else
97
98             OIC_LOG(DEBUG, TAG, "Add network type(LE)");
99             if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_GATT))
100             {
101                 goto exit;
102             }
103             res = u_arraylist_add(g_selectedNetworkList, &NETWORK_GATT);
104
105             break;
106 #endif // LE_ADAPTER
107
108 #ifdef RA_ADAPTER
109         case CA_ADAPTER_REMOTE_ACCESS:
110
111            OIC_LOG(DEBUG, TAG, "Add network type(RA)");
112            if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_RA))
113            {
114                goto exit;
115            }
116            res = u_arraylist_add(g_selectedNetworkList, &NETWORK_RA);
117            break;
118 #endif // RA_ADAPTER
119
120 #ifdef TCP_ADAPTER
121         case CA_ADAPTER_TCP:
122
123            OIC_LOG(DEBUG, TAG, "Add network type(TCP)");
124            if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_TCP))
125            {
126                goto exit;
127            }
128            res = u_arraylist_add(g_selectedNetworkList, &NETWORK_TCP);
129            break;
130 #endif // TCP_ADAPTER
131
132 #ifndef NFC_ADAPTER
133         case CA_ADAPTER_NFC:
134             OIC_LOG(DEBUG, TAG, "Add network type(NFC) - Not Supported");
135             return CA_NOT_SUPPORTED;
136
137 #else
138            OIC_LOG(DEBUG, TAG, "Add network type(NFC)");
139            if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_NFC))
140            {
141                goto exit;
142            }
143            res = u_arraylist_add(g_selectedNetworkList, &NETWORK_NFC);
144
145            break;
146 #endif // CA_ADAPTER_NFC
147
148         default:
149             break;
150     }
151
152     if (!res)
153     {
154         OIC_LOG_V(ERROR, TAG, "Add arraylist failed[Err code: %d]", res);
155         return CA_STATUS_FAILED;
156     }
157     // start selected interface adapter
158     CAResult_t result = CAStartAdapter(transportType);
159     return result;
160
161 exit:
162     OIC_LOG(DEBUG, TAG, "This adapter is already enabled");
163     return CA_STATUS_OK;
164 }
165
166 CAResult_t CARemoveNetworkType(CATransportAdapter_t transportType)
167 {
168     if (NULL == g_selectedNetworkList)
169     {
170         OIC_LOG(ERROR, TAG, "SelectedNetwork list is NULL");
171
172         return CA_STATUS_FAILED;
173     }
174
175     uint32_t selectedNetworkLength = u_arraylist_length(g_selectedNetworkList);
176     for (uint32_t index = 0; index < selectedNetworkLength; index++)
177     {
178         void* ptrType = u_arraylist_get(g_selectedNetworkList, index);
179         if (NULL == ptrType)
180         {
181             continue;
182         }
183
184         CATransportAdapter_t connType = *(CATransportAdapter_t *)ptrType;
185
186         if (transportType == connType)
187         {
188             switch (transportType)
189             {
190                 case CA_ADAPTER_IP:
191 #ifndef IP_ADAPTER
192                     OIC_LOG(DEBUG, TAG, "Remove network type(IP) - Not Supported");
193                     return CA_NOT_SUPPORTED;
194 #else
195
196                     OIC_LOG(DEBUG, TAG, "Remove network type(IP)");
197                     u_arraylist_remove(g_selectedNetworkList, index);
198
199                     break;
200 #endif //IP_ADAPTER
201
202                 case CA_ADAPTER_RFCOMM_BTEDR:
203 #ifndef EDR_ADAPTER
204                     OIC_LOG(DEBUG, TAG, "Remove network type(EDR) - Not Supported");
205                     return CA_NOT_SUPPORTED;
206 #else
207                     OIC_LOG(DEBUG, TAG, "Remove network type(EDR)");
208                     u_arraylist_remove(g_selectedNetworkList, index);
209
210                     break;
211 #endif // EDR_ADAPTER
212
213                 case CA_ADAPTER_GATT_BTLE:
214 #ifndef LE_ADAPTER
215                     OIC_LOG(DEBUG, TAG, "Remove network type(LE) - Not Supported");
216                     return CA_NOT_SUPPORTED;
217 #else
218                     OIC_LOG(DEBUG, TAG, "Remove network type(LE)");
219                     u_arraylist_remove(g_selectedNetworkList, index);
220
221                     break;
222 #endif // LE_ADAPTER
223
224 #ifdef RA_ADAPTER
225                 case CA_ADAPTER_REMOTE_ACCESS:
226                     OIC_LOG(DEBUG, TAG, "Remove network type(RA)");
227                     u_arraylist_remove(g_selectedNetworkList, index);
228                     break;
229 #endif // RA_ADAPTER
230
231 #ifdef TCP_ADAPTER
232                 case CA_ADAPTER_TCP:
233                     OIC_LOG(DEBUG, TAG, "Remove network type(TCP)");
234                     u_arraylist_remove(g_selectedNetworkList, index);
235                     break;
236 #endif // TCP_ADAPTER
237
238 #ifndef NFC_ADAPTER
239                 case CA_ADAPTER_NFC:
240                     OIC_LOG(DEBUG, TAG, "Add network type(NFC) - Not Supported");
241                     return CA_NOT_SUPPORTED;
242 #else
243                    OIC_LOG(DEBUG, TAG, "Add network type(NFC)");
244                    u_arraylist_remove(g_selectedNetworkList, index);
245
246                    break;
247 #endif // CA_ADAPTER_NFC
248                 default:
249                     break;
250             }
251
252             // stop selected interface adapter
253             CAStopAdapter(connType);
254             return CA_STATUS_OK;
255         }
256     }
257
258     return CA_STATUS_FAILED;
259 }
260
261 u_arraylist_t *CAGetSelectedNetworkList()
262 {
263     return g_selectedNetworkList;
264 }
265
266 CAResult_t CAGetNetworkInformationInternal(CAEndpoint_t **info, uint32_t *size)
267 {
268     OIC_LOG(DEBUG, TAG, "get network information.");
269
270     if (NULL == info || NULL == size)
271     {
272         OIC_LOG(ERROR, TAG, "Input parameter is invalid value");
273
274         return CA_STATUS_INVALID_PARAM;
275     }
276
277     return CAGetNetworkInfo(info, size);
278 }
279
280 CAResult_t CATerminateNetworkType()
281 {
282     OIC_LOG(DEBUG, TAG, "CATerminateNetworkType()");
283     if (NULL != g_selectedNetworkList)
284     {
285         u_arraylist_free(&g_selectedNetworkList);
286     }
287     return CA_STATUS_OK;
288 }