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 ******************************************************************/
21 #include "cableclientutil.h"
28 #include<sys/socket.h>
29 #include<netinet/in.h>
32 #include "caadapterutils.h"
34 #define TZ_BLE_CLIENT_UTIL_TAG "TZ_BLE_GATT_CLIENT_UTIL"
36 #define OIC_BLE_SERVICE_ID "000018f3-0000-1000-8000-00805f9b34fb"
37 ///TODO: OIC_BLE_SERVICE_ID will be generated by invoking API in future.
40 static int32_t gNumberOfServiceConnected = 0;
42 void CAIncrementRegisteredServiceCount()
44 gNumberOfServiceConnected++;
47 void CADecrementRegisteredServiceCount()
49 gNumberOfServiceConnected--;
52 void CAResetRegisteredServiceCount()
54 gNumberOfServiceConnected = 0;
57 int32_t CAGetRegisteredServiceCount()
59 return gNumberOfServiceConnected ;
62 CAResult_t CACreateBLEServiceInfo(const char *bdAddress, bt_gatt_attribute_h service,
63 BLEServiceInfo **bleServiceInfo)
65 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
67 VERIFY_NON_NULL(bdAddress, NULL, " Param bdAddress is NULL");
68 VERIFY_NON_NULL(service, NULL, " Param service is NULL");
70 *bleServiceInfo = (BLEServiceInfo *) OICMalloc(sizeof(BLEServiceInfo));
71 if (NULL == *bleServiceInfo)
73 OIC_LOG(ERROR, TZ_BLE_CLIENT_UTIL_TAG, " Malloc failed!");
74 return CA_STATUS_FAILED;
76 memset(*bleServiceInfo, 0x0, sizeof(BLEServiceInfo));
78 int32_t len = strlen(bdAddress);
79 (*bleServiceInfo)->bdAddress = (char *) OICMalloc(sizeof(char) * len + 1);
81 if (NULL == (*bleServiceInfo)->bdAddress)
83 OIC_LOG(ERROR, TZ_BLE_CLIENT_UTIL_TAG, " Malloc failed!");
85 OICFree(*bleServiceInfo);
86 return CA_STATUS_FAILED;
88 memset((*bleServiceInfo)->bdAddress, 0x0, len + 1);
90 strncpy((*bleServiceInfo)->bdAddress, bdAddress, len);
95 int32_t ret = bt_gatt_clone_attribute_handle(&((*bleServiceInfo)->service_clone), service);
97 if (BT_ERROR_NONE != ret)
99 OIC_LOG_V(ERROR, TZ_BLE_CLIENT_UTIL_TAG, " service handle clone failed with ret [%d]",
101 OICFree((*bleServiceInfo)->bdAddress);
102 OICFree(*bleServiceInfo);
103 return CA_STATUS_FAILED;
107 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
112 CAResult_t CAAppendBLECharInfo( bt_gatt_attribute_h characteristic, CHAR_TYPE type,
113 BLEServiceInfo *bleServiceInfo)
115 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
117 VERIFY_NON_NULL(characteristic, NULL, " Param characteristic is NULL");
118 VERIFY_NON_NULL(bleServiceInfo, NULL, " Param bleServiceInfo is NULL");
120 if (READ_CHAR == type )
122 int32_t ret = bt_gatt_clone_attribute_handle(&((bleServiceInfo)->read_char), characteristic);
123 if (BT_ERROR_NONE != ret)
125 OIC_LOG_V(ERROR, TZ_BLE_CLIENT_UTIL_TAG, " read_char clone failed with ret [%d]",
127 return CA_STATUS_FAILED;
130 else if (WRITE_CHAR == type)
132 int32_t ret = bt_gatt_clone_attribute_handle(&((bleServiceInfo)->write_char), characteristic);
133 if (BT_ERROR_NONE != ret)
135 OIC_LOG_V(ERROR, TZ_BLE_CLIENT_UTIL_TAG, " write_char clone failed with ret [%d]",
137 return CA_STATUS_FAILED;
141 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
146 CAResult_t CAAddBLEServiceInfoToList(BLEServiceList **serviceList, BLEServiceInfo *bleServiceInfo)
149 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
151 VERIFY_NON_NULL(serviceList, NULL, " Param serviceList is NULL");
152 VERIFY_NON_NULL(bleServiceInfo, NULL, " Param bleServiceInfo is NULL");
154 BLEServiceList *node = (BLEServiceList *) OICMalloc(sizeof(BLEServiceList));
157 OIC_LOG(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "[ERROR]Malloc failed!");
158 OICFree(bleServiceInfo->bdAddress);
159 OICFree(bleServiceInfo);
160 return CA_STATUS_FAILED;
162 memset(node, 0x0, sizeof(BLEServiceList));
164 node->serviceInfo = bleServiceInfo;
167 if (*serviceList == NULL) //Empty list
171 else //Add at front end
173 node->next = *serviceList;
177 CAIncrementRegisteredServiceCount();
179 OIC_LOG_V(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "Device [%s] added to list", bleServiceInfo->bdAddress);
181 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
186 CAResult_t CARemoveBLEServiceInfoToList(BLEServiceList **serviceList,
187 BLEServiceInfo *bleServiceInfo,
188 const char *bdAddress)
191 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
193 VERIFY_NON_NULL(serviceList, NULL, "Param serviceList is NULL");
194 VERIFY_NON_NULL(*serviceList, NULL, "Param *serviceList is NULL");
195 VERIFY_NON_NULL(bdAddress, NULL, "Param bdAddress is NULL");
197 BLEServiceList *cur = NULL;
198 BLEServiceList *prev = NULL;
203 if (!strcasecmp(cur->serviceInfo->bdAddress, bdAddress))
205 if (cur == *serviceList)
207 *serviceList = cur->next;
210 CAFreeBLEServiceList(cur);
211 CADecrementRegisteredServiceCount();
212 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
217 prev->next = cur->next;
220 CAFreeBLEServiceList(cur);
221 CADecrementRegisteredServiceCount();
222 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
232 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, " OUT");
233 return CA_STATUS_FAILED;
237 CAResult_t CAGetBLEServiceInfo(BLEServiceList *serviceList, const char *bdAddress,
238 BLEServiceInfo **bleServiceInfo)
241 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
243 VERIFY_NON_NULL(serviceList, NULL, "Param serviceList is NULL");
244 VERIFY_NON_NULL(bleServiceInfo, NULL, "Param bleServiceInfo is NULL");
245 VERIFY_NON_NULL(bdAddress, NULL, "Param bdAddress is NULL");
248 BLEServiceList *cur = serviceList;
249 *bleServiceInfo = NULL;
252 if (!strcasecmp(cur->serviceInfo->bdAddress, bdAddress))
254 *bleServiceInfo = cur->serviceInfo;
255 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
262 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, " OUT");
263 return CA_STATUS_FAILED;
266 CAResult_t CAGetBLEServiceInfoByPosition(BLEServiceList *serviceList, int32_t position,
267 BLEServiceInfo **bleServiceInfo)
269 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
271 VERIFY_NON_NULL(serviceList, NULL, "Param serviceList is NULL");
272 VERIFY_NON_NULL(bleServiceInfo, NULL, "Param bleServiceInfo is NULL");
276 OIC_LOG(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "Position Invalid input !");
277 return CA_STATUS_INVALID_PARAM;
279 BLEServiceList *cur = serviceList;
280 *bleServiceInfo = NULL;
285 if (position == count)
287 *bleServiceInfo = cur->serviceInfo;
288 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
294 return CA_STATUS_FAILED;
297 void CAFreeBLEServiceList(BLEServiceList *serviceList)
299 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
302 BLEServiceList *temp = serviceList;
303 serviceList = serviceList->next;
304 CAFreeBLEServiceInfo(temp->serviceInfo);
307 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
311 void CAFreeBLEServiceInfo(BLEServiceInfo *bleServiceInfo)
313 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
316 if (bleServiceInfo->bdAddress)
318 bt_device_destroy_bond(bleServiceInfo->bdAddress);
319 bt_gatt_disconnect(bleServiceInfo->bdAddress);
320 OICFree(bleServiceInfo->bdAddress);
321 bt_gatt_destroy_attribute_handle(bleServiceInfo->service_clone);
322 bt_gatt_destroy_attribute_handle(bleServiceInfo->read_char);
323 bt_gatt_destroy_attribute_handle(bleServiceInfo->write_char);
325 OICFree(bleServiceInfo);
327 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
332 CAResult_t CAVerifyOICService(bt_gatt_attribute_h serviceHandle)
334 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
336 VERIFY_NON_NULL(serviceHandle, NULL, "Param serviceHandle is NULL");
341 ret = bt_gatt_get_service_uuid(serviceHandle, &uuid);
345 OIC_LOG(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "bt_gatt_get_service_uuid failed !");
346 return CA_STATUS_FAILED;
349 if (strcasecmp(uuid, OIC_BLE_SERVICE_ID) != 0)
351 OIC_LOG(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "It is not OIC service!");
352 return CA_STATUS_FAILED;
354 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
358 const char *CABTGetErrorMsg(bt_error_e err)
360 const char *errStr = NULL;
365 errStr = "BT_ERROR_NONE";
367 case BT_ERROR_CANCELLED:
368 errStr = "BT_ERROR_CANCELLED";
370 case BT_ERROR_INVALID_PARAMETER:
371 errStr = "BT_ERROR_INVALID_PARAMETER";
373 case BT_ERROR_OUT_OF_MEMORY:
374 errStr = "BT_ERROR_OUT_OF_MEMORY";
376 case BT_ERROR_RESOURCE_BUSY:
377 errStr = "BT_ERROR_RESOURCE_BUSY";
379 case BT_ERROR_TIMED_OUT:
380 errStr = "BT_ERROR_TIMED_OUT";
382 case BT_ERROR_NOW_IN_PROGRESS:
383 errStr = "BT_ERROR_NOW_IN_PROGRESS";
385 case BT_ERROR_NOT_INITIALIZED:
386 errStr = "BT_ERROR_NOT_INITIALIZED";
388 case BT_ERROR_NOT_ENABLED:
389 errStr = "BT_ERROR_NOT_ENABLED";
391 case BT_ERROR_ALREADY_DONE:
392 errStr = "BT_ERROR_ALREADY_DONE";
394 case BT_ERROR_OPERATION_FAILED:
395 errStr = "BT_ERROR_OPERATION_FAILED";
397 case BT_ERROR_NOT_IN_PROGRESS:
398 errStr = "BT_ERROR_NOT_IN_PROGRESS";
400 case BT_ERROR_REMOTE_DEVICE_NOT_BONDED:
401 errStr = "BT_ERROR_REMOTE_DEVICE_NOT_BONDED";
403 case BT_ERROR_AUTH_REJECTED:
404 errStr = "BT_ERROR_AUTH_REJECTED";
406 case BT_ERROR_AUTH_FAILED:
407 errStr = "BT_ERROR_AUTH_FAILED";
409 case BT_ERROR_REMOTE_DEVICE_NOT_FOUND:
410 errStr = "BT_ERROR_REMOTE_DEVICE_NOT_FOUND";
412 case BT_ERROR_SERVICE_SEARCH_FAILED:
413 errStr = "BT_ERROR_SERVICE_SEARCH_FAILED";
415 case BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED:
416 errStr = "BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED";
418 case BT_ERROR_PERMISSION_DENIED:
419 errStr = "BT_ERROR_PERMISSION_DENIED";
421 case BT_ERROR_SERVICE_NOT_FOUND:
422 errStr = "BT_ERROR_SERVICE_NOT_FOUND";
424 case BT_ERROR_NOT_SUPPORTED:
425 errStr = "BT_ERROR_NOT_SUPPORTED";
428 errStr = "NOT Defined";