in source/cellular/comm_if_windows.c [816:909]
static CellularCommInterfaceError_t _prvCommIntfReceive( CellularCommInterfaceHandle_t commInterfaceHandle,
uint8_t * pBuffer,
uint32_t bufferLength,
uint32_t timeoutMilliseconds,
uint32_t * pDataReceivedLength )
{
CellularCommInterfaceError_t commIntRet = IOT_COMM_INTERFACE_SUCCESS;
_cellularCommContext_t * pCellularCommContext = ( _cellularCommContext_t * ) commInterfaceHandle;
HANDLE hComm = NULL;
OVERLAPPED osRead = { 0 };
BOOL Status = TRUE;
DWORD dwRes = 0;
DWORD dwRead = 0;
if( pCellularCommContext == NULL )
{
commIntRet = IOT_COMM_INTERFACE_BAD_PARAMETER;
}
else if( ( pCellularCommContext->commStatus & CELLULAR_COMM_OPEN_BIT ) == 0 )
{
CellularLogError( "Cellular read comm interface is not opened before." );
commIntRet = IOT_COMM_INTERFACE_FAILURE;
}
else
{
hComm = pCellularCommContext->commFileHandle;
osRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
if( osRead.hEvent == NULL )
{
CellularLogError( "Cellular CreateEvent fail %d", GetLastError() );
commIntRet = IOT_COMM_INTERFACE_FAILURE;
}
}
if( commIntRet == IOT_COMM_INTERFACE_SUCCESS )
{
Status = ReadFile( hComm, pBuffer, bufferLength, &dwRead, &osRead );
if( ( Status == FALSE ) && ( GetLastError() != ERROR_IO_PENDING ) )
{
CellularLogError( "Cellular ReadFile fail %d", GetLastError() );
commIntRet = IOT_COMM_INTERFACE_FAILURE;
}
if( Status == TRUE )
{
*pDataReceivedLength = ( uint32_t ) dwRead;
}
}
/* Handle pending I/O. */
if( ( commIntRet == IOT_COMM_INTERFACE_SUCCESS ) && ( Status == FALSE ) )
{
dwRes = WaitForSingleObject( osRead.hEvent, timeoutMilliseconds );
switch( dwRes )
{
case WAIT_OBJECT_0:
if( GetOverlappedResult( hComm, &osRead, &dwRead, FALSE ) == FALSE )
{
CellularLogError( "Cellular receive GetOverlappedResult fail %d", GetLastError() );
commIntRet = IOT_COMM_INTERFACE_FAILURE;
}
break;
case STATUS_TIMEOUT:
CellularLogError( "Cellular receive WaitForSingleObject timeout" );
commIntRet = IOT_COMM_INTERFACE_TIMEOUT;
break;
default:
CellularLogError( "Cellular receive WaitForSingleObject fail %d", dwRes );
commIntRet = IOT_COMM_INTERFACE_FAILURE;
break;
}
*pDataReceivedLength = ( uint32_t ) dwRead;
}
if( osRead.hEvent != NULL )
{
Status = CloseHandle( osRead.hEvent );
if( Status == FALSE )
{
CellularLogDebug( "Cellular recv CloseHandle fail" );
}
}
return commIntRet;
}