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 "cableutil.h"
28 #include<sys/socket.h>
29 #include<netinet/in.h>
32 #include "caadapterutils.h"
33 #include "oic_string.h"
34 #include "oic_malloc.h"
37 * @def TZ_BLE_CLIENT_UTIL_TAG
38 * @brief Logging tag for module name
40 #define TZ_BLE_CLIENT_UTIL_TAG "TZ_BLE_GATT_CLIENT_UTIL"
43 * @var g_numberOfServiceConnected
44 * @brief Number of services connected.
46 static int32_t g_numberOfServiceConnected = 0;
48 void CAIncrementRegisteredServiceCount()
50 g_numberOfServiceConnected++;
53 void CADecrementRegisteredServiceCount()
55 g_numberOfServiceConnected--;
58 void CAResetRegisteredServiceCount()
60 g_numberOfServiceConnected = 0;
63 int32_t CAGetRegisteredServiceCount()
65 return g_numberOfServiceConnected ;
68 CAResult_t CACreateBLEServiceInfo(const char *bdAddress, bt_gatt_attribute_h service,
69 BLEServiceInfo **bleServiceInfo)
71 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
73 VERIFY_NON_NULL(bdAddress, TZ_BLE_CLIENT_UTIL_TAG, "Param bdAddress is NULL");
74 VERIFY_NON_NULL(service, TZ_BLE_CLIENT_UTIL_TAG, "Param service is NULL");
75 VERIFY_NON_NULL(bleServiceInfo, TZ_BLE_CLIENT_UTIL_TAG, "Param bleServiceInfo is NULL");
77 *bleServiceInfo = (BLEServiceInfo *) OICCalloc(1, sizeof(BLEServiceInfo));
78 if (NULL == *bleServiceInfo)
80 OIC_LOG(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "Malloc failed!");
81 return CA_STATUS_FAILED;
84 (*bleServiceInfo)->bdAddress = OICStrdup(bdAddress);
86 if (NULL == (*bleServiceInfo)->bdAddress)
88 OIC_LOG(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "Malloc failed!");
89 OICFree(*bleServiceInfo);
90 return CA_STATUS_FAILED;
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, TZ_BLE_CLIENT_UTIL_TAG, "Param characteristic is NULL");
118 VERIFY_NON_NULL(bleServiceInfo, TZ_BLE_CLIENT_UTIL_TAG, "Param bleServiceInfo is NULL");
120 if (BLE_GATT_READ_CHAR == type )
122 int ret = bt_gatt_clone_attribute_handle(&((bleServiceInfo)->read_char),
124 if (BT_ERROR_NONE != ret)
126 OIC_LOG_V(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "read_char clone failed with ret [%d]",
128 return CA_STATUS_FAILED;
131 else if (BLE_GATT_WRITE_CHAR == type)
133 int ret = bt_gatt_clone_attribute_handle(&((bleServiceInfo)->write_char),
135 if (BT_ERROR_NONE != ret)
137 OIC_LOG_V(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "write_char clone failed with ret [%d]",
139 return CA_STATUS_FAILED;
143 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
148 CAResult_t CAAddBLEServiceInfoToList(BLEServiceList **serviceList,
149 BLEServiceInfo *bleServiceInfo)
152 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
154 VERIFY_NON_NULL(serviceList, TZ_BLE_CLIENT_UTIL_TAG, "Param serviceList is NULL");
155 VERIFY_NON_NULL(bleServiceInfo, TZ_BLE_CLIENT_UTIL_TAG, "Param bleServiceInfo is NULL");
157 BLEServiceList *node = (BLEServiceList *) OICCalloc(1, sizeof(BLEServiceList));
160 OIC_LOG(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "Malloc failed!");
161 return CA_STATUS_FAILED;
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",
180 bleServiceInfo->bdAddress);
182 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
187 CAResult_t CARemoveBLEServiceInfoToList(BLEServiceList **serviceList,
188 BLEServiceInfo *bleServiceInfo,
189 const char *bdAddress)
192 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
194 VERIFY_NON_NULL(serviceList, TZ_BLE_CLIENT_UTIL_TAG, "Param serviceList is NULL");
195 VERIFY_NON_NULL(*serviceList, TZ_BLE_CLIENT_UTIL_TAG, "Param *serviceList is NULL");
196 VERIFY_NON_NULL(bdAddress, TZ_BLE_CLIENT_UTIL_TAG, "Param bdAddress is NULL");
198 BLEServiceList *prev = NULL;
199 BLEServiceList *cur = *serviceList;
202 if (!strcasecmp(cur->serviceInfo->bdAddress, bdAddress))
204 if (cur == *serviceList)
206 *serviceList = cur->next;
209 CAFreeBLEServiceList(cur);
210 CADecrementRegisteredServiceCount();
211 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
216 prev->next = cur->next;
219 CAFreeBLEServiceList(cur);
220 CADecrementRegisteredServiceCount();
221 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
231 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, " OUT");
232 return CA_STATUS_FAILED;
235 CAResult_t CAGetBLEServiceInfo(BLEServiceList *serviceList, const char *bdAddress,
236 BLEServiceInfo **bleServiceInfo)
239 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
241 VERIFY_NON_NULL(serviceList, TZ_BLE_CLIENT_UTIL_TAG, "Param serviceList is NULL");
242 VERIFY_NON_NULL(bleServiceInfo, TZ_BLE_CLIENT_UTIL_TAG, "Param bleServiceInfo is NULL");
243 VERIFY_NON_NULL(bdAddress, TZ_BLE_CLIENT_UTIL_TAG, "Param bdAddress is NULL");
246 BLEServiceList *cur = serviceList;
247 *bleServiceInfo = NULL;
250 if (!strcasecmp(cur->serviceInfo->bdAddress, bdAddress))
252 *bleServiceInfo = cur->serviceInfo;
253 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
260 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, " OUT");
261 return CA_STATUS_FAILED;
264 CAResult_t CAGetBLEServiceInfoByPosition(BLEServiceList *serviceList, int32_t position,
265 BLEServiceInfo **bleServiceInfo)
267 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
269 VERIFY_NON_NULL(serviceList, TZ_BLE_CLIENT_UTIL_TAG, "Param serviceList is NULL");
270 VERIFY_NON_NULL(bleServiceInfo, TZ_BLE_CLIENT_UTIL_TAG, "Param bleServiceInfo is NULL");
274 OIC_LOG(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "Position Invalid input !");
275 return CA_STATUS_INVALID_PARAM;
278 *bleServiceInfo = NULL;
280 BLEServiceList *cur = serviceList;
283 if (position == count)
285 *bleServiceInfo = cur->serviceInfo;
286 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
292 return CA_STATUS_FAILED;
295 void CAFreeBLEServiceList(BLEServiceList *serviceList)
297 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
300 BLEServiceList *temp = serviceList;
301 serviceList = serviceList->next;
302 CAFreeBLEServiceInfo(temp->serviceInfo);
305 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
308 void CAFreeBLEServiceInfo(BLEServiceInfo *bleServiceInfo)
310 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
313 if (bleServiceInfo->bdAddress)
315 bt_gatt_disconnect(bleServiceInfo->bdAddress);
316 OICFree(bleServiceInfo->bdAddress);
317 bt_gatt_destroy_attribute_handle(bleServiceInfo->service_clone);
318 bt_gatt_destroy_attribute_handle(bleServiceInfo->read_char);
319 bt_gatt_destroy_attribute_handle(bleServiceInfo->write_char);
321 OICFree(bleServiceInfo);
323 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
326 CAResult_t CAVerifyOICServiceByUUID(const char* serviceUUID)
328 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
330 VERIFY_NON_NULL(serviceUUID, TZ_BLE_CLIENT_UTIL_TAG, "Param serviceHandle is NULL");
332 if (strcasecmp(serviceUUID, OIC_BLE_SERVICE_ID) != 0)
334 OIC_LOG(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "It is not OIC service!");
335 return CA_STATUS_FAILED;
337 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
341 CAResult_t CAVerifyOICServiceByServiceHandle(bt_gatt_attribute_h serviceHandle)
343 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
345 VERIFY_NON_NULL(serviceHandle, TZ_BLE_CLIENT_UTIL_TAG, "Param serviceHandle is NULL");
348 int ret = bt_gatt_get_service_uuid(serviceHandle, &uuid);
350 if (0 != ret || NULL == uuid)
352 OIC_LOG(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "bt_gatt_get_service_uuid failed !");
353 return CA_STATUS_FAILED;
356 if (strcasecmp(uuid, OIC_BLE_SERVICE_ID) != 0)
358 OIC_LOG(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "It is not OIC service!");
360 return CA_STATUS_FAILED;
364 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
368 const char *CABTGetErrorMsg(bt_error_e err)
370 const char *errStr = NULL;
375 errStr = "BT_ERROR_NONE";
377 case BT_ERROR_CANCELLED:
378 errStr = "BT_ERROR_CANCELLED";
380 case BT_ERROR_INVALID_PARAMETER:
381 errStr = "BT_ERROR_INVALID_PARAMETER";
383 case BT_ERROR_OUT_OF_MEMORY:
384 errStr = "BT_ERROR_OUT_OF_MEMORY";
386 case BT_ERROR_RESOURCE_BUSY:
387 errStr = "BT_ERROR_RESOURCE_BUSY";
389 case BT_ERROR_TIMED_OUT:
390 errStr = "BT_ERROR_TIMED_OUT";
392 case BT_ERROR_NOW_IN_PROGRESS:
393 errStr = "BT_ERROR_NOW_IN_PROGRESS";
395 case BT_ERROR_NOT_INITIALIZED:
396 errStr = "BT_ERROR_NOT_INITIALIZED";
398 case BT_ERROR_NOT_ENABLED:
399 errStr = "BT_ERROR_NOT_ENABLED";
401 case BT_ERROR_ALREADY_DONE:
402 errStr = "BT_ERROR_ALREADY_DONE";
404 case BT_ERROR_OPERATION_FAILED:
405 errStr = "BT_ERROR_OPERATION_FAILED";
407 case BT_ERROR_NOT_IN_PROGRESS:
408 errStr = "BT_ERROR_NOT_IN_PROGRESS";
410 case BT_ERROR_REMOTE_DEVICE_NOT_BONDED:
411 errStr = "BT_ERROR_REMOTE_DEVICE_NOT_BONDED";
413 case BT_ERROR_AUTH_REJECTED:
414 errStr = "BT_ERROR_AUTH_REJECTED";
416 case BT_ERROR_AUTH_FAILED:
417 errStr = "BT_ERROR_AUTH_FAILED";
419 case BT_ERROR_REMOTE_DEVICE_NOT_FOUND:
420 errStr = "BT_ERROR_REMOTE_DEVICE_NOT_FOUND";
422 case BT_ERROR_SERVICE_SEARCH_FAILED:
423 errStr = "BT_ERROR_SERVICE_SEARCH_FAILED";
425 case BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED:
426 errStr = "BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED";
428 case BT_ERROR_PERMISSION_DENIED:
429 errStr = "BT_ERROR_PERMISSION_DENIED";
431 case BT_ERROR_SERVICE_NOT_FOUND:
432 errStr = "BT_ERROR_SERVICE_NOT_FOUND";
434 case BT_ERROR_NOT_SUPPORTED:
435 errStr = "BT_ERROR_NOT_SUPPORTED";
438 errStr = "NOT Defined";