in qgsm/cellular_qgsm_api.c [1365:1465]
static CellularPktStatus_t socketRecvDataPrefix( void * pCallbackContext,
char * pLine,
uint32_t lineLength,
char ** ppDataStart,
uint32_t * pDataLength )
{
char * pDataStart = NULL;
char * pSearchStr = NULL;
int32_t tempValue = 0;
CellularATError_t atResult = CELLULAR_AT_SUCCESS;
CellularPktStatus_t pktStatus = CELLULAR_PKT_STATUS_OK;
uint32_t i = 0;
char * pToken = NULL;
char pLocalLine[ MAX_QIRD_STRING_PREFIX_STRING + 1 ] = "\0";
uint32_t localLineLength = MAX_QIRD_STRING_PREFIX_STRING > lineLength ? lineLength : MAX_QIRD_STRING_PREFIX_STRING;
( void ) pCallbackContext;
if( ( pLine == NULL ) || ( ppDataStart == NULL ) || ( pDataLength == NULL ) )
{
pktStatus = CELLULAR_PKT_STATUS_BAD_PARAM;
}
else
{
/* Check if the message is a data response. */
if( strncmp( pLine, DATA_PREFIX_STRING, DATA_PREFIX_STRING_LENGTH ) == 0 )
{
strncpy( pLocalLine, pLine, MAX_QIRD_STRING_PREFIX_STRING );
pLocalLine[ MAX_QIRD_STRING_PREFIX_STRING ] = '\0';
pDataStart = pLocalLine;
/*[+QIRD: <ipAddress>:<port>,<type>,<length><CR><LF><data>]
* pToken = +QIRD: <ipAddress>:<port>
* pDataStart=<type>,<length><CR><LF><data> */
atResult = Cellular_ATGetNextTok( &pDataStart, &pToken );
/* pToken : <type>
* pDataStart=<length><CR><LF><data>*/
atResult = Cellular_ATGetNextTok( &pDataStart, &pToken );
/* Add a '\0' char at the end +QIRD of the line. */
for( i = 0; i < localLineLength; i++ )
{
if( ( pDataStart[ i ] == '\r' ) || ( pDataStart[ i ] == '\n' ) )
{
pDataStart[ i ] = '\0';
break;
}
}
/* Add "," to distinguish the data length from the IP address and port */
pSearchStr = Platform_Malloc( strlen( "," ) + strlen( pDataStart ) + 2 );
sprintf( pSearchStr, "%s%s", ",", pDataStart );
if( i == localLineLength )
{
LogDebug( ( "Data prefix invalid line : %s", pLocalLine ) );
pDataStart = NULL;
}
}
if( pDataStart != NULL )
{
atResult = Cellular_ATStrtoi( pDataStart, 10, &tempValue );
if( ( atResult == CELLULAR_AT_SUCCESS ) && ( tempValue >= 0 ) &&
( tempValue <= ( int32_t ) CELLULAR_MAX_RECV_DATA_LEN ) )
{
/* Save the start of data point in pTemp. */
if( ( uint32_t ) ( strnlen( pDataStart, MAX_QIRD_STRING_PREFIX_STRING ) + 2 ) > lineLength )
{
/* More data is required. */
*pDataLength = 0;
pDataStart = NULL;
pktStatus = CELLULAR_PKT_STATUS_SIZE_MISMATCH;
}
else
{
pDataStart = strstr( pLine, pSearchStr ) + strlen( pDataStart ) + 1;
pDataStart[ 0 ] = '\0';
pDataStart = &pDataStart[ 2 ];
*pDataLength = ( uint32_t ) tempValue;
}
LogDebug( ( "DataLength %p at pktIo = %d", pDataStart, *pDataLength ) );
}
else
{
*pDataLength = 0;
pDataStart = NULL;
LogError( ( "Data response received with wrong size" ) );
}
}
*ppDataStart = pDataStart;
}
return pktStatus;
}