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 "cagattservice.h"
34 #include "oic_string.h"
35 #include "oic_malloc.h"
38 * @def TZ_BLE_CLIENT_UTIL_TAG
39 * @brief Logging tag for module name
41 #define TZ_BLE_CLIENT_UTIL_TAG "TZ_BLE_GATT_CLIENT_UTIL"
44 * @var g_numberOfServiceConnected
45 * @brief Number of services connected.
47 static int32_t g_numberOfServiceConnected = 0;
49 void CAIncrementRegisteredServiceCount()
51 g_numberOfServiceConnected++;
54 void CADecrementRegisteredServiceCount()
56 g_numberOfServiceConnected--;
59 void CAResetRegisteredServiceCount()
61 g_numberOfServiceConnected = 0;
64 int32_t CAGetRegisteredServiceCount()
66 return g_numberOfServiceConnected ;
69 CAResult_t CACreateBLEServiceInfo(const char *bdAddress, bt_gatt_attribute_h service,
70 BLEServiceInfo **bleServiceInfo)
72 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
74 VERIFY_NON_NULL(bdAddress, TZ_BLE_CLIENT_UTIL_TAG, "Param bdAddress is NULL");
75 VERIFY_NON_NULL(service, TZ_BLE_CLIENT_UTIL_TAG, "Param service is NULL");
76 VERIFY_NON_NULL(bleServiceInfo, TZ_BLE_CLIENT_UTIL_TAG, "Param bleServiceInfo is NULL");
78 *bleServiceInfo = (BLEServiceInfo *) OICCalloc(1, sizeof(BLEServiceInfo));
79 if (NULL == *bleServiceInfo)
81 OIC_LOG(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "Malloc failed!");
82 return CA_STATUS_FAILED;
85 (*bleServiceInfo)->bdAddress = OICStrdup(bdAddress);
87 if (NULL == (*bleServiceInfo)->bdAddress)
89 OIC_LOG(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "Malloc failed!");
90 OICFree(*bleServiceInfo);
91 return CA_STATUS_FAILED;
96 int32_t ret = bt_gatt_clone_attribute_handle(&((*bleServiceInfo)->service_clone), service);
98 if (BT_ERROR_NONE != ret)
100 OIC_LOG_V(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "service handle clone failed with ret [%d]",
102 OICFree((*bleServiceInfo)->bdAddress);
103 OICFree(*bleServiceInfo);
104 return CA_STATUS_FAILED;
108 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
113 CAResult_t CAAppendBLECharInfo( bt_gatt_attribute_h characteristic, CHAR_TYPE type,
114 BLEServiceInfo *bleServiceInfo)
116 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
118 VERIFY_NON_NULL(characteristic, TZ_BLE_CLIENT_UTIL_TAG, "Param characteristic is NULL");
119 VERIFY_NON_NULL(bleServiceInfo, TZ_BLE_CLIENT_UTIL_TAG, "Param bleServiceInfo is NULL");
121 if (BLE_GATT_READ_CHAR == type )
123 int ret = bt_gatt_clone_attribute_handle(&((bleServiceInfo)->read_char),
125 if (BT_ERROR_NONE != ret)
127 OIC_LOG_V(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "read_char clone failed with ret [%d]",
129 return CA_STATUS_FAILED;
132 else if (BLE_GATT_WRITE_CHAR == type)
134 int ret = bt_gatt_clone_attribute_handle(&((bleServiceInfo)->write_char),
136 if (BT_ERROR_NONE != ret)
138 OIC_LOG_V(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "write_char clone failed with ret [%d]",
140 return CA_STATUS_FAILED;
144 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
149 CAResult_t CAAddBLEServiceInfoToList(BLEServiceList **serviceList,
150 BLEServiceInfo *bleServiceInfo)
153 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
155 VERIFY_NON_NULL(serviceList, TZ_BLE_CLIENT_UTIL_TAG, "Param serviceList is NULL");
156 VERIFY_NON_NULL(bleServiceInfo, TZ_BLE_CLIENT_UTIL_TAG, "Param bleServiceInfo is NULL");
158 BLEServiceList *node = (BLEServiceList *) OICCalloc(1, sizeof(BLEServiceList));
161 OIC_LOG(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "Malloc failed!");
162 return CA_STATUS_FAILED;
165 node->serviceInfo = bleServiceInfo;
168 if (*serviceList == NULL) // Empty list
172 else // Add at front end
174 node->next = *serviceList;
178 CAIncrementRegisteredServiceCount();
180 OIC_LOG_V(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "Device [%s] added to list",
181 bleServiceInfo->bdAddress);
183 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
188 CAResult_t CARemoveBLEServiceInfoToList(BLEServiceList **serviceList,
189 BLEServiceInfo *bleServiceInfo,
190 const char *bdAddress)
193 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
195 VERIFY_NON_NULL(serviceList, TZ_BLE_CLIENT_UTIL_TAG, "Param serviceList is NULL");
196 VERIFY_NON_NULL(*serviceList, TZ_BLE_CLIENT_UTIL_TAG, "Param *serviceList is NULL");
197 VERIFY_NON_NULL(bdAddress, TZ_BLE_CLIENT_UTIL_TAG, "Param bdAddress is NULL");
199 BLEServiceList *prev = NULL;
200 BLEServiceList *cur = *serviceList;
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;
236 CAResult_t CAGetBLEServiceInfo(BLEServiceList *serviceList, const char *bdAddress,
237 BLEServiceInfo **bleServiceInfo)
240 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
242 VERIFY_NON_NULL(serviceList, TZ_BLE_CLIENT_UTIL_TAG, "Param serviceList is NULL");
243 VERIFY_NON_NULL(bleServiceInfo, TZ_BLE_CLIENT_UTIL_TAG, "Param bleServiceInfo is NULL");
244 VERIFY_NON_NULL(bdAddress, TZ_BLE_CLIENT_UTIL_TAG, "Param bdAddress is NULL");
247 BLEServiceList *cur = serviceList;
248 *bleServiceInfo = NULL;
251 if (!strcasecmp(cur->serviceInfo->bdAddress, bdAddress))
253 *bleServiceInfo = cur->serviceInfo;
254 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
261 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, " OUT");
262 return CA_STATUS_FAILED;
265 CAResult_t CAGetBLEServiceInfoByPosition(BLEServiceList *serviceList, int32_t position,
266 BLEServiceInfo **bleServiceInfo)
268 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
270 VERIFY_NON_NULL(serviceList, TZ_BLE_CLIENT_UTIL_TAG, "Param serviceList is NULL");
271 VERIFY_NON_NULL(bleServiceInfo, TZ_BLE_CLIENT_UTIL_TAG, "Param bleServiceInfo is NULL");
275 OIC_LOG(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "Position Invalid input !");
276 return CA_STATUS_INVALID_PARAM;
279 *bleServiceInfo = NULL;
281 BLEServiceList *cur = serviceList;
284 if (position == count)
286 *bleServiceInfo = cur->serviceInfo;
287 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
293 return CA_STATUS_FAILED;
296 void CAFreeBLEServiceList(BLEServiceList *serviceList)
298 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
301 BLEServiceList *temp = serviceList;
302 serviceList = serviceList->next;
303 CAFreeBLEServiceInfo(temp->serviceInfo);
306 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
309 void CAFreeBLEServiceInfo(BLEServiceInfo *bleServiceInfo)
311 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
314 if (bleServiceInfo->bdAddress)
316 bt_gatt_disconnect(bleServiceInfo->bdAddress);
317 OICFree(bleServiceInfo->bdAddress);
318 bt_gatt_destroy_attribute_handle(bleServiceInfo->service_clone);
319 bt_gatt_destroy_attribute_handle(bleServiceInfo->read_char);
320 bt_gatt_destroy_attribute_handle(bleServiceInfo->write_char);
322 OICFree(bleServiceInfo);
324 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
327 CAResult_t CAVerifyOICServiceByUUID(const char* serviceUUID)
329 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
331 VERIFY_NON_NULL(serviceUUID, TZ_BLE_CLIENT_UTIL_TAG, "Param serviceHandle is NULL");
333 if (strcasecmp(serviceUUID, CA_GATT_SERVICE_UUID) != 0)
335 OIC_LOG(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "It is not OIC service!");
336 return CA_STATUS_FAILED;
338 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
342 CAResult_t CAVerifyOICServiceByServiceHandle(bt_gatt_attribute_h serviceHandle)
344 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN");
346 VERIFY_NON_NULL(serviceHandle, TZ_BLE_CLIENT_UTIL_TAG, "Param serviceHandle is NULL");
349 int ret = bt_gatt_get_service_uuid(serviceHandle, &uuid);
351 if (0 != ret || NULL == uuid)
353 OIC_LOG(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "bt_gatt_get_service_uuid failed !");
354 return CA_STATUS_FAILED;
357 if (strcasecmp(uuid, CA_GATT_SERVICE_UUID) != 0)
359 OIC_LOG(ERROR, TZ_BLE_CLIENT_UTIL_TAG, "It is not OIC service!");
361 return CA_STATUS_FAILED;
365 OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT");
369 const char *CABTGetErrorMsg(bt_error_e err)
371 const char *errStr = NULL;
376 errStr = "BT_ERROR_NONE";
378 case BT_ERROR_CANCELLED:
379 errStr = "BT_ERROR_CANCELLED";
381 case BT_ERROR_INVALID_PARAMETER:
382 errStr = "BT_ERROR_INVALID_PARAMETER";
384 case BT_ERROR_OUT_OF_MEMORY:
385 errStr = "BT_ERROR_OUT_OF_MEMORY";
387 case BT_ERROR_RESOURCE_BUSY:
388 errStr = "BT_ERROR_RESOURCE_BUSY";
390 case BT_ERROR_TIMED_OUT:
391 errStr = "BT_ERROR_TIMED_OUT";
393 case BT_ERROR_NOW_IN_PROGRESS:
394 errStr = "BT_ERROR_NOW_IN_PROGRESS";
396 case BT_ERROR_NOT_INITIALIZED:
397 errStr = "BT_ERROR_NOT_INITIALIZED";
399 case BT_ERROR_NOT_ENABLED:
400 errStr = "BT_ERROR_NOT_ENABLED";
402 case BT_ERROR_ALREADY_DONE:
403 errStr = "BT_ERROR_ALREADY_DONE";
405 case BT_ERROR_OPERATION_FAILED:
406 errStr = "BT_ERROR_OPERATION_FAILED";
408 case BT_ERROR_NOT_IN_PROGRESS:
409 errStr = "BT_ERROR_NOT_IN_PROGRESS";
411 case BT_ERROR_REMOTE_DEVICE_NOT_BONDED:
412 errStr = "BT_ERROR_REMOTE_DEVICE_NOT_BONDED";
414 case BT_ERROR_AUTH_REJECTED:
415 errStr = "BT_ERROR_AUTH_REJECTED";
417 case BT_ERROR_AUTH_FAILED:
418 errStr = "BT_ERROR_AUTH_FAILED";
420 case BT_ERROR_REMOTE_DEVICE_NOT_FOUND:
421 errStr = "BT_ERROR_REMOTE_DEVICE_NOT_FOUND";
423 case BT_ERROR_SERVICE_SEARCH_FAILED:
424 errStr = "BT_ERROR_SERVICE_SEARCH_FAILED";
426 case BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED:
427 errStr = "BT_ERROR_REMOTE_DEVICE_NOT_CONNECTED";
429 case BT_ERROR_PERMISSION_DENIED:
430 errStr = "BT_ERROR_PERMISSION_DENIED";
432 case BT_ERROR_SERVICE_NOT_FOUND:
433 errStr = "BT_ERROR_SERVICE_NOT_FOUND";
435 case BT_ERROR_NOT_SUPPORTED:
436 errStr = "BT_ERROR_NOT_SUPPORTED";
439 errStr = "NOT Defined";