diff options
author | Sylvain Fonteneau <sylvain.fonteneau@trusted-logic.com> | 2010-11-26 10:38:22 +0100 |
---|---|---|
committer | Nick Pelly <npelly@google.com> | 2010-12-05 13:15:05 -0800 |
commit | 1c75e8952d88d81c5f04826f69ca22d14bb5683b (patch) | |
tree | 5bbd1ffc62f248e24c9a5410eb4ffda710547325 | |
parent | e57ef4170474a0929b25bbdc8eb75f316ebffd56 (diff) | |
download | external_libnfc-nxp-1c75e8952d88d81c5f04826f69ca22d14bb5683b.zip external_libnfc-nxp-1c75e8952d88d81c5f04826f69ca22d14bb5683b.tar.gz external_libnfc-nxp-1c75e8952d88d81c5f04826f69ca22d14bb5683b.tar.bz2 |
Call the callback of any pending action in case of LLCP socket closure.
This ensure the lib client not to be stuck waiting for a callback when
the socket has been closed meanwhile.
Change-Id: I9cdfa3c2cc75ee9451c3ad5b92eb338b5e68f53a
-rw-r--r-- | src/phFriNfc_LlcpTransport_Connection.c | 64 | ||||
-rw-r--r-- | src/phFriNfc_LlcpTransport_Connectionless.c | 32 |
2 files changed, 79 insertions, 17 deletions
diff --git a/src/phFriNfc_LlcpTransport_Connection.c b/src/phFriNfc_LlcpTransport_Connection.c index 50c3b3d..3f3c37a 100644 --- a/src/phFriNfc_LlcpTransport_Connection.c +++ b/src/phFriNfc_LlcpTransport_Connection.c @@ -106,6 +106,8 @@ static void phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB(void* p psTransport->pSocketTable[psTransport->socketIndex].eSocket_State = phFriNfc_LlcpTransportSocket_eSocketConnected; /* Call the Accept Callback */ psTransport->pSocketTable[psTransport->socketIndex].pfSocketAccept_Cb(psTransport->pSocketTable[psTransport->socketIndex].pAcceptContext,status); + psTransport->pSocketTable[psTransport->socketIndex].pfSocketAccept_Cb = NULL; + psTransport->pSocketTable[psTransport->socketIndex].pAcceptContext = NULL; }break; case phFriNfc_LlcpTransportSocket_eSocketRejected: @@ -328,6 +330,48 @@ static void phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB(void* p } } +static void phFriNfc_LlcpTransport_ConnectionOriented_Abort(phFriNfc_LlcpTransport_Socket_t * pLlcpSocket) +{ + if (pLlcpSocket->pfSocketSend_Cb != NULL) + { + pLlcpSocket->pfSocketSend_Cb(pLlcpSocket->pSendContext, NFCSTATUS_ABORTED); + pLlcpSocket->pfSocketSend_Cb = NULL; + } + pLlcpSocket->pSendContext = NULL; + if (pLlcpSocket->pfSocketRecv_Cb != NULL) + { + pLlcpSocket->pfSocketRecv_Cb(pLlcpSocket->pRecvContext, NFCSTATUS_ABORTED); + pLlcpSocket->pfSocketRecv_Cb = NULL; + } + pLlcpSocket->pRecvContext = NULL; + if (pLlcpSocket->pfSocketListen_Cb != NULL) + { + pLlcpSocket->pfSocketListen_Cb(pLlcpSocket->pListenContext, NULL); + pLlcpSocket->pfSocketListen_Cb = NULL; + } + pLlcpSocket->pListenContext = NULL; + if (pLlcpSocket->pfSocketAccept_Cb != NULL) + { + pLlcpSocket->pfSocketAccept_Cb(pLlcpSocket->pAcceptContext, NFCSTATUS_ABORTED); + pLlcpSocket->pfSocketAccept_Cb = NULL; + } + pLlcpSocket->pAcceptContext = NULL; + if (pLlcpSocket->pfSocketConnect_Cb != NULL) + { + pLlcpSocket->pfSocketConnect_Cb(pLlcpSocket->pConnectContext, 0, NFCSTATUS_ABORTED); + pLlcpSocket->pfSocketConnect_Cb = NULL; + } + pLlcpSocket->pConnectContext = NULL; + if (pLlcpSocket->pfSocketDisconnect_Cb != NULL) + { + pLlcpSocket->pfSocketDisconnect_Cb(pLlcpSocket->pDisonnectContext, NFCSTATUS_ABORTED); + pLlcpSocket->pfSocketDisconnect_Cb = NULL; + } + pLlcpSocket->pDisonnectContext = NULL; + + pLlcpSocket->pfSocketRecvFrom_Cb = NULL; +} + static NFCSTATUS phFriNfc_Llcp_Send_DisconnectMode_Frame(phFriNfc_LlcpTransport_t* psTransport, uint8_t dsap, uint8_t ssap, @@ -870,8 +914,10 @@ static void Handle_ConnectionCompleteFrame(phFriNfc_LlcpTransport_t *psTran psLocalLlcpSocket->remoteMIU = remoteMIU; psLocalLlcpSocket->remoteRW = remoteRW; - /* Call the Connect CB */ + /* Call the Connect CB and reset callback info */ psLocalLlcpSocket->pfSocketConnect_Cb(psLocalLlcpSocket->pConnectContext,0x00,NFCSTATUS_SUCCESS); + psLocalLlcpSocket->pfSocketConnect_Cb = NULL; + psLocalLlcpSocket->pConnectContext = NULL; } else { @@ -2406,16 +2452,13 @@ static void phFriNfc_LlcpTransport_ConnectionOriented_DisconnectClose_CB(void* pLlcpSocket->bSocketSendPending = FALSE; pLlcpSocket->bSocketListenPending = FALSE; pLlcpSocket->bSocketDiscPending = FALSE; - pLlcpSocket->pfSocketSend_Cb = NULL; - pLlcpSocket->pfSocketRecv_Cb = NULL; - pLlcpSocket->pfSocketListen_Cb = NULL; - pLlcpSocket->pfSocketConnect_Cb = NULL; - pLlcpSocket->pfSocketDisconnect_Cb = NULL; pLlcpSocket->socket_VS = 0; pLlcpSocket->socket_VSA = 0; pLlcpSocket->socket_VR = 0; pLlcpSocket->socket_VRA = 0; + phFriNfc_LlcpTransport_ConnectionOriented_Abort(pLlcpSocket); + memset(&pLlcpSocket->sSocketOption, 0x00, sizeof(phFriNfc_LlcpTransport_sSocketOptions_t)); if (pLlcpSocket->sServiceName.buffer != NULL) { @@ -2456,7 +2499,7 @@ NFCSTATUS phFriNfc_LlcpTransport_ConnectionOriented_Close(phFriNfc_LlcpTransport } else { - LLCP_PRINT("Socket Closed"); + LLCP_PRINT("Socket not connected, no need to disconnect"); /* Reset the pointer to the socket closed */ pLlcpSocket->eSocket_State = phFriNfc_LlcpTransportSocket_eSocketDefault; pLlcpSocket->eSocket_Type = phFriNfc_LlcpTransport_eDefaultType; @@ -2470,16 +2513,13 @@ NFCSTATUS phFriNfc_LlcpTransport_ConnectionOriented_Close(phFriNfc_LlcpTransport pLlcpSocket->bSocketDiscPending = FALSE; pLlcpSocket->RemoteBusyConditionInfo = FALSE; pLlcpSocket->ReceiverBusyCondition = FALSE; - pLlcpSocket->pfSocketSend_Cb = NULL; - pLlcpSocket->pfSocketRecv_Cb = NULL; - pLlcpSocket->pfSocketListen_Cb = NULL; - pLlcpSocket->pfSocketConnect_Cb = NULL; - pLlcpSocket->pfSocketDisconnect_Cb = NULL; pLlcpSocket->socket_VS = 0; pLlcpSocket->socket_VSA = 0; pLlcpSocket->socket_VR = 0; pLlcpSocket->socket_VRA = 0; + phFriNfc_LlcpTransport_ConnectionOriented_Abort(pLlcpSocket); + memset(&pLlcpSocket->sSocketOption, 0x00, sizeof(phFriNfc_LlcpTransport_sSocketOptions_t)); if (pLlcpSocket->sServiceName.buffer != NULL) { diff --git a/src/phFriNfc_LlcpTransport_Connectionless.c b/src/phFriNfc_LlcpTransport_Connectionless.c index 72397ad..5648c11 100644 --- a/src/phFriNfc_LlcpTransport_Connectionless.c +++ b/src/phFriNfc_LlcpTransport_Connectionless.c @@ -72,6 +72,31 @@ static void phFriNfc_LlcpTransport_Connectionless_SendTo_CB(void* pContex } +static void phFriNfc_LlcpTransport_Connectionless_Abort(phFriNfc_LlcpTransport_Socket_t* pLlcpSocket) +{ + if (pLlcpSocket->pfSocketSend_Cb != NULL) + { + pLlcpSocket->pfSocketSend_Cb(pLlcpSocket->pSendContext, NFCSTATUS_ABORTED); + pLlcpSocket->pSendContext = NULL; + pLlcpSocket->pfSocketSend_Cb = NULL; + } + if (pLlcpSocket->pfSocketRecvFrom_Cb != NULL) + { + pLlcpSocket->pfSocketRecvFrom_Cb(pLlcpSocket->pRecvContext, 0, NFCSTATUS_ABORTED); + pLlcpSocket->pRecvContext = NULL; + pLlcpSocket->pfSocketRecvFrom_Cb = NULL; + pLlcpSocket->pfSocketRecv_Cb = NULL; + } + pLlcpSocket->pAcceptContext = NULL; + pLlcpSocket->pfSocketAccept_Cb = NULL; + pLlcpSocket->pListenContext = NULL; + pLlcpSocket->pfSocketListen_Cb = NULL; + pLlcpSocket->pConnectContext = NULL; + pLlcpSocket->pfSocketConnect_Cb = NULL; + pLlcpSocket->pDisonnectContext = NULL; + pLlcpSocket->pfSocketDisconnect_Cb = NULL; +} + /** * \ingroup grp_fri_nfc * \brief <b>Close a socket on a LLCP-connectionless device</b>. @@ -100,16 +125,13 @@ NFCSTATUS phFriNfc_LlcpTransport_Connectionless_Close(phFriNfc_LlcpTransport_Soc pLlcpSocket->bSocketDiscPending = FALSE; pLlcpSocket->RemoteBusyConditionInfo = FALSE; pLlcpSocket->ReceiverBusyCondition = FALSE; - pLlcpSocket->pfSocketSend_Cb = NULL; - pLlcpSocket->pfSocketRecv_Cb = NULL; - pLlcpSocket->pfSocketListen_Cb = NULL; - pLlcpSocket->pfSocketConnect_Cb = NULL; - pLlcpSocket->pfSocketDisconnect_Cb = NULL; pLlcpSocket->socket_VS = 0; pLlcpSocket->socket_VSA = 0; pLlcpSocket->socket_VR = 0; pLlcpSocket->socket_VRA = 0; + phFriNfc_LlcpTransport_Connectionless_Abort(pLlcpSocket); + memset(&pLlcpSocket->sSocketOption, 0x00, sizeof(phFriNfc_LlcpTransport_sSocketOptions_t)); if (pLlcpSocket->sServiceName.buffer != NULL) { |