Esempio n. 1
0
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");
}
Esempio n. 2
0
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;;
}