public Task <SocketError> GotResponse(SIPEndPoint localSIPEndPoint, SIPEndPoint remoteEndPoint,
SIPResponse sipResponse)
{
if (TransactionState == SIPTransactionStatesEnum.Completed ||
TransactionState == SIPTransactionStatesEnum.Confirmed)
{
FireTransactionTraceMessage(
$"Transaction received duplicate response {localSIPEndPoint.ToString()}<-{remoteEndPoint}: {sipResponse.ShortDescription}");
TransactionDuplicateResponse?.Invoke(localSIPEndPoint, remoteEndPoint, this, sipResponse);
if (sipResponse.Header.CSeqMethod == SIPMethodsEnum.INVITE)
{
if (sipResponse.StatusCode > 100 && sipResponse.StatusCode <= 199)
{
return(ResendPrackRequest());
}
else
{
return(ResendAckRequest());
}
}
else
{
return(Task.FromResult(SocketError.Success));
}
}
else
{
FireTransactionTraceMessage(
$"Transaction received Response {localSIPEndPoint.ToString()}<-{remoteEndPoint}: {sipResponse.ShortDescription}");
if (sipResponse.StatusCode >= 100 && sipResponse.StatusCode <= 199)
{
UpdateTransactionState(SIPTransactionStatesEnum.Proceeding);
return(TransactionInformationResponseReceived(localSIPEndPoint, remoteEndPoint, this, sipResponse));
}
else
{
m_transactionFinalResponse = sipResponse;
if (TransactionType == SIPTransactionTypesEnum.NonInvite)
{
// No ACK's for non-INVITE's so go straight to confirmed.
UpdateTransactionState(SIPTransactionStatesEnum.Confirmed);
}
else
{
UpdateTransactionState(SIPTransactionStatesEnum.Completed);
}
return(TransactionFinalResponseReceived(localSIPEndPoint, remoteEndPoint, this, sipResponse));
}
}
}