1 /* ****************************************************************
3 * Copyright 2014 Samsung Electronics All Rights Reserved.
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 ******************************************************************/
24 * This file provides APIs to access the discovered bluetooth device list.
27 #include "caedrdevicelist.h"
28 #include "caadapterutils.h"
29 #include "caedrutils.h"
34 * @fn CACreateEDRDevice
35 * @brief Creates #EDRDevice for specified remote address and uuid.
38 static CAResult_t CACreateEDRDevice(const char *deviceAddress,
39 const char *uuid,EDRDevice **device);
43 * @fn CADestroyEDRDevice
44 * @brief Free all the memory associated with specified device.
47 static void CADestroyEDRDevice(EDRDevice *device);
51 * @fn CADestroyEDRData
52 * @brief Free all the memory associated with specified data.
55 static void CADestroyEDRData(EDRData *data);
58 CAResult_t CACreateAndAddToDeviceList(EDRDeviceList **deviceList, const char *deviceAddress,
59 const char *uuid, EDRDevice **device)
61 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
63 VERIFY_NON_NULL(deviceList, EDR_ADAPTER_TAG, "Device list is null");
64 VERIFY_NON_NULL(deviceAddress, EDR_ADAPTER_TAG, "Remote address is null");
65 VERIFY_NON_NULL(device, EDR_ADAPTER_TAG, "Device is null");
66 CAResult_t result = CACreateEDRDevice(deviceAddress, uuid, device);
67 if (CA_STATUS_OK != result || NULL == *device)
69 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Invalid or Not bonded device ret[%d]", result);
70 return CA_STATUS_FAILED;
72 result = CAAddEDRDeviceToList(deviceList, *device);
73 if (CA_STATUS_OK != result)
75 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Failed to add in list ret[%d]", result);
77 //Remove created EDRDevice
78 CADestroyEDRDevice(*device);
81 return CA_STATUS_FAILED;
84 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
88 CAResult_t CACreateEDRDevice(const char *deviceAddress, const char *uuid, EDRDevice **device)
90 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
92 VERIFY_NON_NULL(deviceAddress, EDR_ADAPTER_TAG, "Remote address is null");
93 VERIFY_NON_NULL(uuid, EDR_ADAPTER_TAG, "uuid is null");
94 VERIFY_NON_NULL(device, EDR_ADAPTER_TAG, "Device is null");
96 *device = (EDRDevice *) OICMalloc(sizeof(EDRDevice));
99 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Out of memory (device)!");
100 return CA_MEMORY_ALLOC_FAILED;
103 //Copy bluetooth address
104 if (deviceAddress[0])
106 (*device)->remoteAddress = strndup(deviceAddress, strlen(deviceAddress));
107 if (NULL == (*device)->remoteAddress)
109 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Out of memory (remote address)!");
113 return CA_MEMORY_ALLOC_FAILED;
117 //Copy OIC service uuid
120 (*device)->serviceUUID = strndup(uuid, strlen(uuid));
121 if (NULL == (*device)->serviceUUID)
123 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG,
124 "[createEDRDevice] Out of memory (service uuid)!");
126 OICFree((*device)->remoteAddress);
129 return CA_MEMORY_ALLOC_FAILED;
133 (*device)->socketFD = -1;
134 (*device)->pendingDataList = NULL;
135 (*device)->serviceSearched = false;
137 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
141 CAResult_t CAAddEDRDeviceToList(EDRDeviceList **deviceList, EDRDevice *device)
143 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
145 VERIFY_NON_NULL(deviceList, EDR_ADAPTER_TAG, "Device list is null");
146 VERIFY_NON_NULL(device, EDR_ADAPTER_TAG, "Device is null");
148 EDRDeviceList *node = (EDRDeviceList *) OICMalloc(sizeof(EDRDeviceList));
151 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Out of memory (device list)!");
152 return CA_MEMORY_ALLOC_FAILED;
155 node->device = device;
158 if (NULL == *deviceList) //Empty list
162 else //Add at front end
164 node->next = *deviceList;
168 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
172 CAResult_t CAGetEDRDevice(EDRDeviceList *deviceList,
173 const char *deviceAddress, EDRDevice **device)
175 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
177 VERIFY_NON_NULL(deviceList, EDR_ADAPTER_TAG, "Device list is null");
178 VERIFY_NON_NULL(deviceAddress, EDR_ADAPTER_TAG, "Remote address is null");
179 VERIFY_NON_NULL(device, EDR_ADAPTER_TAG, "Device is null");
181 EDRDeviceList *curNode = deviceList;
183 while (curNode != NULL)
185 if (!strcasecmp(curNode->device->remoteAddress, deviceAddress))
187 *device = curNode->device;
191 curNode = curNode->next;
194 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT [Device not found!]");
195 return CA_STATUS_FAILED;
198 CAResult_t CAGetEDRDeviceBySocketId(EDRDeviceList *deviceList,
199 int32_t socketID, EDRDevice **device)
201 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
203 VERIFY_NON_NULL(deviceList, EDR_ADAPTER_TAG, "Device list is null");
204 VERIFY_NON_NULL(device, EDR_ADAPTER_TAG, "Device is null");
205 EDRDeviceList *curNode = deviceList;
207 while (curNode != NULL)
209 if (curNode->device->socketFD == socketID)
211 *device = curNode->device;
215 curNode = curNode->next;
218 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
219 return CA_STATUS_FAILED;
222 CAResult_t CARemoveEDRDeviceFromList(EDRDeviceList **deviceList,
223 const char *deviceAddress)
225 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
227 VERIFY_NON_NULL(deviceList, EDR_ADAPTER_TAG, "Device list is null");
228 VERIFY_NON_NULL(deviceAddress, EDR_ADAPTER_TAG, "Remote address is null");
230 EDRDeviceList *curNode = NULL;
231 EDRDeviceList *prevNode = NULL;
233 curNode = *deviceList;
234 while (curNode != NULL)
236 if (!strcasecmp(curNode->device->remoteAddress, deviceAddress))
238 if (curNode == *deviceList)
240 *deviceList = curNode->next;
242 curNode->next = NULL;
243 CADestroyEDRDeviceList(&curNode);
248 prevNode->next = curNode->next;
250 curNode->next = NULL;
251 CADestroyEDRDeviceList(&curNode);
258 curNode = curNode->next;
262 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "OUT Device not in the list !");
263 return CA_STATUS_FAILED;
266 void CADestroyEDRDeviceList(EDRDeviceList **deviceList)
268 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
270 VERIFY_NON_NULL_VOID(deviceList, EDR_ADAPTER_TAG, "deviceList is null");
274 EDRDeviceList *curNode = *deviceList;
275 *deviceList = (*deviceList)->next;
277 CADestroyEDRDevice(curNode->device);
281 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
284 void CADestroyEDRDevice(EDRDevice *device)
286 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
289 OICFree(device->remoteAddress);
290 OICFree(device->serviceUUID);
291 CADestroyEDRDataList(&device->pendingDataList);
294 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
297 CAResult_t CAAddEDRDataToList(EDRDataList **dataList, const void *data, uint32_t dataLength)
299 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
301 VERIFY_NON_NULL(dataList, EDR_ADAPTER_TAG, "Data list is null");
302 VERIFY_NON_NULL(data, EDR_ADAPTER_TAG, "Data is null");
306 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Invalid input: data length is zero!");
307 return CA_STATUS_INVALID_PARAM;
310 EDRDataList *pending_data = (EDRDataList *) OICMalloc(sizeof(EDRDataList));
311 if (NULL == pending_data)
313 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "OICMalloc failed (data list)!");
314 return CA_MEMORY_ALLOC_FAILED;
317 pending_data->data = (EDRData *) OICMalloc(sizeof(EDRData));
318 if (NULL == pending_data->data)
320 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "OICMalloc failed (data node)!");
322 OICFree(pending_data);
323 return CA_MEMORY_ALLOC_FAILED;
325 pending_data->next = NULL;
327 pending_data->data->data = (void *) OICMalloc(dataLength); //data
328 if (NULL == pending_data->data->data)
330 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "OICMalloc failed (data)!");
332 OICFree(pending_data->data);
333 OICFree(pending_data);
334 return CA_MEMORY_ALLOC_FAILED;
337 memcpy(pending_data->data->data, data, dataLength);
338 pending_data->data->dataLength = dataLength;
340 if (NULL == *dataList) //Empty list
342 *dataList = pending_data;
344 else //Add at rear end
346 EDRDataList *curNode = *dataList;
347 while (curNode->next != NULL)
349 curNode = curNode->next;
352 curNode->next = pending_data;
355 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
359 CAResult_t CARemoveEDRDataFromList(EDRDataList **dataList)
361 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
363 VERIFY_NON_NULL(dataList, EDR_ADAPTER_TAG, "Data list is null");
367 EDRDataList *curNode = *dataList;
368 *dataList = (*dataList)->next;
370 //Delete the first node
371 CADestroyEDRData(curNode->data);
375 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
379 void CADestroyEDRDataList(EDRDataList **dataList)
381 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
383 VERIFY_NON_NULL_VOID(dataList, EDR_ADAPTER_TAG, "Data list is null");
387 EDRDataList *curNode = *dataList;
388 *dataList = (*dataList)->next;
390 CADestroyEDRData(curNode->data);
396 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
399 void CADestroyEDRData(EDRData *data)