in modules/hl7802/cellular_hl7802_api.c [1235:1349]
CellularError_t Cellular_SocketRecv( CellularHandle_t cellularHandle,
CellularSocketHandle_t socketHandle,
/* coverity[misra_c_2012_rule_8_13_violation] */
uint8_t * pBuffer,
uint32_t bufferLength,
/* coverity[misra_c_2012_rule_8_13_violation] */
uint32_t * pReceivedDataLength )
{
CellularContext_t * pContext = ( CellularContext_t * ) cellularHandle;
CellularError_t cellularStatus = CELLULAR_SUCCESS;
CellularPktStatus_t pktStatus = CELLULAR_PKT_STATUS_OK;
char cmdBuf[ CELLULAR_AT_CMD_TYPICAL_MAX_SIZE ] = { '\0' };
uint32_t recvTimeout = CELLULAR_HL7802_AT_TIMEOUT_60_SECONDS_MS;
uint32_t recvLen = bufferLength;
_socketDataRecv_t dataRecv =
{
pReceivedDataLength,
pBuffer
};
CellularAtReq_t atReqSocketRecv =
{
cmdBuf,
CELLULAR_AT_MULTI_DATA_WO_PREFIX,
"CONNECT",
_Cellular_RecvFuncData,
( void * ) &dataRecv,
bufferLength,
};
socketStat_t socketStat = { 0 };
uint32_t socktCmdDataLength = 0;
uint32_t sessionId = 0;
cellularStatus = _Cellular_CheckLibraryStatus( pContext );
if( cellularStatus != CELLULAR_SUCCESS )
{
LogDebug( ( "_Cellular_CheckLibraryStatus failed" ) );
}
else if( socketHandle == NULL )
{
cellularStatus = CELLULAR_INVALID_HANDLE;
}
else if( ( pBuffer == NULL ) || ( pReceivedDataLength == NULL ) || ( bufferLength == 0U ) )
{
LogDebug( ( "_Cellular_RecvData: Bad input Param" ) );
cellularStatus = CELLULAR_BAD_PARAMETER;
}
else
{
sessionId = _Cellular_GetSessionId( pContext, socketHandle->socketId );
if( sessionId == INVALID_SESSION_ID )
{
LogError( ( "Cellular_SocketSend : invalid session ID for socket index %u",
socketHandle->socketId ) );
cellularStatus = CELLULAR_INVALID_HANDLE;
}
}
if( cellularStatus == CELLULAR_SUCCESS )
{
/* Calculate the read length. */
cellularStatus = _Cellular_GetSocketStat( cellularHandle, socketHandle, &socketStat );
if( ( cellularStatus == CELLULAR_SUCCESS ) && ( socketStat.status == TCP_SOCKET_STATE_CONNECTION_UP ) )
{
socktCmdDataLength = socketStat.rcvData;
}
else
{
socktCmdDataLength = 0;
}
/* Update recvLen to maximum module length. */
if( CELLULAR_MAX_RECV_DATA_LEN <= bufferLength )
{
recvLen = ( uint32_t ) CELLULAR_MAX_RECV_DATA_LEN;
}
/* Update the recvLen to available data length in cellular module. */
if( recvLen > socktCmdDataLength )
{
recvLen = socktCmdDataLength;
}
*pReceivedDataLength = recvLen;
socktCmdDataLength = recvLen;
/* Update receive timeout to default timeout if not set with setsocketopt. */
if( recvLen > 0 )
{
if( socketHandle->recvTimeoutMs != 0U )
{
recvTimeout = socketHandle->recvTimeoutMs;
}
/* The return value of snprintf is not used.
* The max length of the string is fixed and checked offline. */
/* coverity[misra_c_2012_rule_21_6_violation]. */
( void ) snprintf( cmdBuf, CELLULAR_AT_CMD_TYPICAL_MAX_SIZE,
"%s%u,%u", "AT+KTCPRCV=", sessionId, recvLen );
pktStatus = _Cellular_TimeoutAtcmdDataRecvRequestWithCallback( pContext,
atReqSocketRecv, recvTimeout, socketRecvDataPrefix, &socktCmdDataLength );
if( pktStatus != CELLULAR_PKT_STATUS_OK )
{
/* Reset data handling parameters. */
LogError( ( "Cellular_SocketRecv: Data Receive fail, pktStatus: %d", pktStatus ) );
cellularStatus = _Cellular_TranslatePktStatus( pktStatus );
}
}
}
return cellularStatus;
}