static CellularPktStatus_t socketRecvDataPrefix()

in modules/sara_r4/cellular_r4_api.c [83:214]


static CellularPktStatus_t socketRecvDataPrefix( void * pCallbackContext,
                                                 char * pLine,
                                                 uint32_t lineLength,
                                                 char ** ppDataStart,
                                                 uint32_t * pDataLength );
static CellularATError_t getDataFromResp( const CellularATCommandResponse_t * pAtResp,
                                          const _socketDataRecv_t * pDataRecv,
                                          uint32_t outBufSize );
static CellularPktStatus_t _Cellular_RecvFuncData( CellularContext_t * pContext,
                                                   const CellularATCommandResponse_t * pAtResp,
                                                   void * pData,
                                                   uint16_t dataLen );
static CellularError_t storeAccessModeAndAddress( CellularContext_t * pContext,
                                                  CellularSocketHandle_t socketHandle,
                                                  CellularSocketAccessMode_t dataAccessMode,
                                                  const CellularSocketAddress_t * pRemoteSocketAddress );
static CellularPktStatus_t _Cellular_RecvFuncGetSocketId( CellularContext_t * pContext,
                                                          const CellularATCommandResponse_t * pAtResp,
                                                          void * pData,
                                                          uint16_t dataLen );
static CellularError_t _Cellular_GetSocketNumber( CellularHandle_t cellularHandle,
                                                  CellularSocketHandle_t socketHandle,
                                                  uint8_t * pSessionId );

CellularError_t Cellular_SetPdnConfig( CellularHandle_t cellularHandle,
                                       uint8_t contextId,
                                       const CellularPdnConfig_t * pPdnConfig );

static CellularError_t _Cellular_GetPacketSwitchStatus( CellularHandle_t cellularHandle,
                                                        bool * pPacketSwitchStatus );

static CellularError_t _Cellular_GetContextActivationStatus( CellularHandle_t cellularHandle,
                                                             CellularPdnContextActInfo_t * pPdpContextsActInfo );

static bool _parseExtendedSignalQuality( char * pQcsqPayload,
                                         CellularSignalInfo_t * pSignalInfo );
static bool _parseSignalQuality( char * pQcsqPayload,
                                 CellularSignalInfo_t * pSignalInfo );
static CellularPktStatus_t _Cellular_RecvFuncGetSignalInfo( CellularContext_t * pContext,
                                                            const CellularATCommandResponse_t * pAtResp,
                                                            void * pData,
                                                            uint16_t dataLen );
static CellularError_t controlSignalStrengthIndication( CellularContext_t * pContext,
                                                        bool enable );

CellularError_t Cellular_SetPsmSettings( CellularHandle_t cellularHandle,
                                         const CellularPsmSettings_t * pPsmSettings );

/*-----------------------------------------------------------*/

static CellularPktStatus_t socketRecvDataPrefix( void * pCallbackContext,
                                                 char * pLine,
                                                 uint32_t lineLength,
                                                 char ** ppDataStart,
                                                 uint32_t * pDataLength )
{
    char * pToken = NULL;
    int32_t tempValue = 0;
    CellularATError_t atResult = CELLULAR_AT_SUCCESS;
    CellularPktStatus_t pktStatus = CELLULAR_PKT_STATUS_OK;
    char pLocalLine[ SOCKET_DATA_PREFIX_STRING_LENGTH + 1 ] = { '\0' };
    char * pDataStart = pLocalLine;

    ( void ) lineLength;

    /* pCallbackContext is not used in this function. It should be NULL. */
    if( ( pLine == NULL ) || ( ppDataStart == NULL ) || ( pDataLength == NULL ) || ( pCallbackContext != NULL ) )
    {
        LogError( ( "socketRecvData: Bad parameters" ) );
        pktStatus = CELLULAR_PKT_STATUS_BAD_PARAM;
    }
    else if( strncmp( pLine, SOCKET_DATA_PREFIX_TOKEN, SOCKET_DATA_PREFIX_TOKEN_LEN ) != 0 )
    {
        /* Prefix string which is not SOCKET_DATA_PREFIX_TOKEN does't indicate data start.
         * Set data length to 0.*/
        *ppDataStart = NULL;
        *pDataLength = 0;
    }
    else
    {
        /* The string length of "+USORD: <socket>[,<length>],"<data in text mode>". */
        strncpy( pLocalLine, pLine, SOCKET_DATA_PREFIX_STRING_LENGTH );
        pDataStart = &pLocalLine[ SOCKET_DATA_PREFIX_TOKEN_LEN ];

        /* Skip the socket number. */
        atResult = Cellular_ATGetNextTok( &pDataStart, &pToken );

        /* Parse the receive data length. */
        if( ( atResult == CELLULAR_AT_SUCCESS ) && ( pDataStart[ 0 ] == '"' ) )
        {
            /* Peek the next symbol. If it is \", then length is ommited. Received byte is 0. */
            LogDebug( ( "socketRecvData: 0 received bytes." ) );
            *pDataLength = 0U;
            *ppDataStart = NULL;
        }
        else if( atResult == CELLULAR_AT_SUCCESS )
        {
            /* Parse the length. */
            atResult = Cellular_ATGetNextTok( &pDataStart, &pToken );

            if( atResult == CELLULAR_AT_SUCCESS )
            {
                atResult = Cellular_ATStrtoi( pToken, 10, &tempValue );

                if( ( tempValue < 0 ) && ( ( uint32_t ) tempValue > CELLULAR_MAX_RECV_DATA_LEN ) )
                {
                    LogError( ( "socketRecvData: Bad parameters" ) );
                    atResult = CELLULAR_AT_ERROR;
                }
            }

            if( atResult == CELLULAR_AT_SUCCESS )
            {
                /* Change +USROD: <socket>,<length>," to +USROD: <socket>,<length>,\r. */
                pDataStart = &pLine[ pDataStart - pLocalLine ];

                if( pDataStart[ 0 ] == '\"' )
                {
                    *pDataStart = '\r';
                    *ppDataStart = ( char * ) &pDataStart[ 1 ];
                    *pDataLength = ( uint32_t ) tempValue;
                }
            }
        }
        else
        {
            LogDebug( ( "socketRecvDataPrefix : pLine [%s] with lineLength [%d] is not data prefix", pLine, lineLength ) );
        }
    }

    return pktStatus;
}