void CAFreeBLEServiceList(BLEServiceList *serviceList) { OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "IN"); while (serviceList) { BLEServiceList *temp = serviceList; serviceList = serviceList->next; CAFreeBLEServiceInfo(temp->serviceInfo); OICFree(temp); } OIC_LOG(DEBUG, TZ_BLE_CLIENT_UTIL_TAG, "OUT"); }
bool CABleGattPrimaryServiceCb(bt_gatt_attribute_h service, int index, int count, void *userData) { OIC_LOG(DEBUG, TZ_BLE_CLIENT_TAG, "IN"); VERIFY_NON_NULL_RET(service, TZ_BLE_CLIENT_TAG, "Param service is NULL", false); VERIFY_NON_NULL_RET(userData, TZ_BLE_CLIENT_TAG, "Param userData is NULL", false); OIC_LOG_V(DEBUG, TZ_BLE_CLIENT_TAG, "Service info [%s] index [%d] count [%d]", (char *)service, index, count); CAResult_t result = CAVerifyOICServiceByServiceHandle(service); if (CA_STATUS_OK == result) { OIC_LOG(DEBUG, TZ_BLE_CLIENT_TAG, "Its OIC service"); OIC_LOG(DEBUG, TZ_BLE_CLIENT_TAG , "Registering to watch characteristics changes"); result = CABleGattWatchCharacteristicChanges(service); if (CA_STATUS_OK != result) { OIC_LOG(ERROR, TZ_BLE_CLIENT_TAG, "CABleGattWatchCharacteristicChanges failed!"); return false; } stGattServiceInfo_t *stTemp = (stGattServiceInfo_t *)OICCalloc(1, sizeof(stGattServiceInfo_t)); VERIFY_NON_NULL_RET(stTemp, TZ_BLE_CLIENT_TAG, "Calloc Failed", false); char *bdAddress = (char *)userData; stTemp->address = OICStrdup(bdAddress); if (NULL == stTemp->address) { OIC_LOG(ERROR, TZ_BLE_CLIENT_TAG , "Malloc failed!"); OICFree(stTemp); return false; } BLEServiceInfo *bleServiceInfo = NULL; result = CACreateBLEServiceInfo(bdAddress, service, &bleServiceInfo); if (CA_STATUS_OK != result) { OIC_LOG(ERROR, TZ_BLE_CLIENT_TAG , "CACreateBLEServiceInfo failed! "); OICFree(stTemp->address); OICFree(stTemp); OICFree(bleServiceInfo); return false; } if (NULL == bleServiceInfo ) { OIC_LOG(ERROR, TZ_BLE_CLIENT_TAG , " bleServiceInfo is NULL"); OICFree(stTemp->address); OICFree(stTemp); OICFree(bleServiceInfo); return false; } OIC_LOG_V(DEBUG, TZ_BLE_CLIENT_TAG , " serviceInfo remote address [%s]", bleServiceInfo->bdAddress); ca_mutex_lock(g_bleServiceListMutex); result = CAAddBLEServiceInfoToList(&g_bLEServiceList, bleServiceInfo); ca_mutex_unlock(g_bleServiceListMutex); if (CA_STATUS_OK != result) { OIC_LOG(ERROR, TZ_BLE_CLIENT_TAG , "CAAddBLEServiceInfoToList failed!"); OICFree(stTemp->address); OICFree(stTemp); CAFreeBLEServiceInfo(bleServiceInfo); return false; } ca_mutex_lock(g_bleClientThreadPoolMutex); if (NULL == g_bleClientThreadPool) { OIC_LOG(ERROR, TZ_BLE_CLIENT_TAG, "g_bleClientThreadPool is NULL"); OICFree(stTemp->address); OICFree(stTemp); ca_mutex_lock(g_bleServiceListMutex); CARemoveBLEServiceInfoToList(&g_bLEServiceList, bleServiceInfo, bleServiceInfo->bdAddress); ca_mutex_unlock(g_bleServiceListMutex); ca_mutex_unlock(g_bleClientThreadPoolMutex); return false; } bt_gatt_clone_attribute_handle(&(stTemp->serviceInfo), service); result = ca_thread_pool_add_task(g_bleClientThreadPool, CADiscoverCharThread, stTemp); if (CA_STATUS_OK != result) { OIC_LOG_V(ERROR, TZ_BLE_CLIENT_TAG, "ca_thread_pool_add_task failed with ret [%d]", result); OICFree(stTemp->address); OICFree(stTemp); ca_mutex_lock(g_bleServiceListMutex); CARemoveBLEServiceInfoToList(&g_bLEServiceList, bleServiceInfo, bleServiceInfo->bdAddress); ca_mutex_unlock(g_bleServiceListMutex); ca_mutex_unlock(g_bleClientThreadPoolMutex); return false; } ca_mutex_unlock(g_bleClientThreadPoolMutex); } OIC_LOG(DEBUG, TZ_BLE_CLIENT_TAG, "OUT "); return true;; }