/* Removes all Client Sessions from Client Context */
phStatus_t phnpSnep_Fri_ContextMgmt_RemoveAllClientSessions( phnpSnep_Fri_DataParams_t    *pDataParams )
{
    phStatus_t   status = PH_ERR_FAILED;
    uint8_t      count=0;
    phnpSnep_Fri_ClientContext_t   *pClientContext = NULL;

    pClientContext = phnpSnep_Fri_ContextMgmt_GetClientContext(pDataParams);
    if (NULL != pClientContext)
    {
        for (count = 0; count < PHNPSNEP_FRI_MAX_SNEP_CLIENT_CNT; count++)
        {
            if (NULL != pClientContext->pClientSession[count])
            {
                if (NULL != pClientContext->pClientSession[count]->sWorkingBuffer->buffer)
                {
                    status = phlnLlcp_Transport_Close( pDataParams->plnLlcpDataParams,
                                                       (phlnLlcp_Fri_Transport_Socket_t *) pClientContext->pClientSession[count]->hSnepClientHandle);

                    pClientContext->pClientSession[count]->sWorkingBuffer->length=0;
                }
                pClientContext->CurrentClientCnt--;

            }
        }
    }

    return status;
}
/* Removes a Incomplete Client from the Client Context */
phStatus_t phnpSnep_Fri_ContextMgmt_RemoveIncompleteClientSession( phnpSnep_Fri_DataParams_t     *pDataParams,
                                                                  phnpSnep_Fri_ClientSession_t   *pClientSession )
{
    phStatus_t   status = PH_ERR_FAILED;
    uint8_t      count=0;
    phnpSnep_Fri_ClientContext_t *pClientContext = NULL;

    pClientContext = phnpSnep_Fri_ContextMgmt_GetClientContext(pDataParams);

    if (NULL != pClientContext && NULL != pClientSession)
    {
        for (count = 0; count < PHNPSNEP_FRI_MAX_SNEP_CLIENT_CNT; count++)
        {
            if (NULL != pClientContext->pClientSession[count])
            {
                if (pClientSession == pClientContext->pClientSession[count])
                {
                    pClientContext->CurrentClientCnt--;
                }
            }
        }
    }

    return status;
}
/* Retrieves a Client Session matching the given Handle */
phnpSnep_Fri_ClientSession_t *phnpSnep_Fri_ContextMgmt_GetClientSession( phnpSnep_Fri_DataParams_t   *pDataParams,
                                                                        ph_NfcHandle                  ClientHandle)
{
    uint8_t count=0;
    phnpSnep_Fri_ClientSession_t   *pSession = NULL;
    phnpSnep_Fri_ClientContext_t   *pClientContext = NULL;

    pClientContext = phnpSnep_Fri_ContextMgmt_GetClientContext(pDataParams);

    if ((NULL != pClientContext) && (0 != pClientContext->CurrentClientCnt))
    {
        for (count = 0; count < PHNPSNEP_FRI_MAX_SNEP_CLIENT_CNT; count++)
        {
            if (NULL != pClientContext->pClientSession[count])
            {
                if (ClientHandle == pClientContext->pClientSession[count]->hSnepClientHandle)
                {
                    pSession = pClientContext->pClientSession[count];

                    break;
                } /* No Else */
            } /* No Else */
        }
    }/* No Else */

    return pSession;
}
示例#4
0
phStatus_t phnpSnep_Fri_Client_DeInit( phnpSnep_Fri_DataParams_t    *pDataParams,
                                      ph_NfcHandle                  ClientHandle)
{
    phStatus_t status;
    phnpSnep_Fri_ClientContext_t    *pClientContext = NULL;

    /* Context should not be allocated if already NULL */
    pClientContext = phnpSnep_Fri_ContextMgmt_GetClientContext(pDataParams);

    if (NULL != pClientContext)
    {
        if (0 != ClientHandle)
        {
            if (PH_ERR_SUCCESS == phnpSnep_Fri_ContextMgmt_RemoveClientSession( pDataParams,
                                                                                ClientHandle))
            {
                status = PH_ERR_SUCCESS;
            }
            else
            {
                status = PH_ERR_FAILED;
            }
        }
        else
        {
            status = phnpSnep_Fri_ContextMgmt_RemoveAllClientSessions( pDataParams );
        }
    }
    else
    {
        status = PH_ERR_NOT_INITIALISED;
    }
    return status;
}
/* Adds a new Client session to the Client Context */
phnpSnep_Fri_ClientSession_t *phnpSnep_Fri_ContextMgmt_AddClientSession( phnpSnep_Fri_DataParams_t     *pDataParams,
                                                                        phnpSnep_Fri_ClientSession_t   *pClientSession )
{
    uint8_t count=0;
    phnpSnep_Fri_ClientContext_t    *pClientContext = NULL;

    pClientContext = phnpSnep_Fri_ContextMgmt_GetClientContext(pDataParams);

    if ((NULL != pClientContext) && ( PHNPSNEP_FRI_MAX_SNEP_CLIENT_CNT > pClientContext->CurrentClientCnt))
    {
        for (count = 0;count < PHNPSNEP_FRI_MAX_SNEP_CLIENT_CNT;count++)
        {
            if (NULL == pClientContext->pClientSession[count])
            {
                pClientContext->pClientSession[count] = pClientSession;
                pClientContext->CurrentClientCnt++;
                break;
            }/* No Else */
        }
    }/* No Else */

    return pClientContext->pClientSession[count];
}
示例#6
0
phStatus_t phnpSnep_Fri_Client_Init( phnpSnep_Fri_DataParams_t     *pDataParams,
                                    phnpSnep_Fri_Config_t          *pConfigInfo,
                                    ph_NfcHandle                    hRemDevHandle,
                                    pphnpSnep_Fri_ConnectCB_t       pConnClientCb,
                                    phnpSnep_Fri_ClientSession_t   *pClient,
                                    void                           *pContext)

{

    phStatus_t status;
    phStatus_t temp = PH_ERR_SUCCESS;
    PH_UNUSED_VARIABLE(temp);

    phNfc_sData_t                  ServerName = { gphnpSnep_Fri_Snep_DefaultServerName, PHNPSNEP_FRI_DEFAULT_SERVER_NAME_LEN};
    phnpSnep_Fri_ClientSession_t  *pClientSession = NULL;
    phnpSnep_Fri_ClientContext_t  *pClientContext = NULL;

    if (NULL == pConfigInfo ||
        NULL == pConnClientCb ||
        PHNPSNEP_FRI_MIN_MIU_VAL > pConfigInfo->sOptions.miu)
    {
        return PH_ERR_INVALID_PARAMETER;
    }

    pClientContext = phnpSnep_Fri_ContextMgmt_GetClientContext( pDataParams );

    if (NULL != pClientContext)
    {
        pClientSession = phnpSnep_Fri_ContextMgmt_AddClientSession( pDataParams,
                                                                    pClient);
        if (NULL != pClientSession)
        {
            if (NULL != pClientSession->sWorkingBuffer->buffer)
            {
               /*Create Socket LLCP Socket*/
               status = phlnLlcp_Transport_Socket( pDataParams->plnLlcpDataParams,
                                                   phlnLlcp_Fri_Transport_eConnectionOriented,
                                                   &pConfigInfo->sOptions,
                                                   pClientSession->sWorkingBuffer,
                                                   (phlnLlcp_Fri_Transport_Socket_t **) &pClientSession->hSnepClientHandle,
                                                   &phnpSnep_Fri_Llcp_SocketErr_Cb,
                                                   (void *) pClientSession
                                                  );
            }
            else
            {
                status = PH_ERR_INSUFFICIENT_RESOURCES;
                status = phnpSnep_Fri_ContextMgmt_RemoveIncompleteClientSession( pDataParams, pClientSession);
            }
        }
        else
        {
            status = PH_ERR_INSUFFICIENT_RESOURCES;
        }
    }
    else
    {
        status = PH_ERR_INSUFFICIENT_RESOURCES;
    }

    if (PH_ERR_SUCCESS == status)
    {
        pClientSession->Client_state = phnpSnep_Fri_Client_Initialized;
        pClientSession->pConnectionCb = pConnClientCb;
        pClientSession->pClientContext = pContext;
        pClientSession->iMiu = pConfigInfo->sOptions.miu;
        pClientSession->SnepClientVersion = PHNPSNEP_FRI_VERSION;
        pClientSession->hRemoteDevHandle = hRemDevHandle;
        pClientSession->pSnepDataParamsContext = pDataParams;

        if (phnpSnep_Fri_Server_Default == pConfigInfo->SnepServerType && NULL == pConfigInfo->SnepServerName)
        {
           status = phlnLlcp_Transport_ConnectByUri( pDataParams->plnLlcpDataParams,
                                                     (phlnLlcp_Fri_Transport_Socket_t *) pClientSession->hSnepClientHandle,
                                                    &ServerName,
                                                    &phnpSnep_Fri_Llcp_ConnectSocket_Cb,
                                                    (void *) pClientSession
                                                  );

        }
        else if (phnpSnep_Fri_Server_NonDefault == pConfigInfo->SnepServerType && NULL != pConfigInfo->SnepServerName)
        {
            status = phlnLlcp_Transport_ConnectByUri( pDataParams->plnLlcpDataParams,
                                                      (phlnLlcp_Fri_Transport_Socket_t *) pClientSession->hSnepClientHandle,
                                                      pConfigInfo->SnepServerName,
                                                     &phnpSnep_Fri_Llcp_ConnectSocket_Cb,
                                                     (void *) pClientSession
                                                    );
        }
        else
        {
            /* No Else */
        }

        if (PH_ERR_PENDING != status && PH_ERR_SUCCESS != status)
        {
            temp = phnpSnep_Fri_ContextMgmt_RemoveIncompleteClientSession( pDataParams,
                                                                           pClientSession);
        }
    }
    else
    {
        /* Deallocate the Server Session and Server Context */
        status = phnpSnep_Fri_ContextMgmt_RemoveIncompleteClientSession( pDataParams, pClientSession);
    }

    return status;
}