static CellularPktStatus_t socketRecvDataPrefix()

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;
}