/* 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; }
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]; }
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; }