public void SendSIPReliable(SIPTransaction sipTransaction)
{
if (sipTransaction.RemoteEndPoint != null && sipTransaction.RemoteEndPoint.Address.Equals(BlackholeAddress))
{
sipTransaction.Retransmits = 1;
sipTransaction.InitialTransmit = DateTime.Now;
sipTransaction.LastTransmit = DateTime.Now;
sipTransaction.DeliveryPending = false;
return;
}
if (m_sipChannels.Count == 0)
{
throw new ApplicationException("No channels are configured in the SIP transport layer. The request could not be sent.");
}
else if (m_reliableTransmissions.Count >= MAX_RELIABLETRANSMISSIONS_COUNT)
{
throw new ApplicationException("Cannot send reliable SIP message as the reliable transmissions queue is full.");
}
//logger.Debug("SendSIPReliable transaction URI " + sipTransaction.TransactionRequest.URI.ToString() + ".");
if (sipTransaction.TransactionType == SIPTransactionTypesEnum.Invite &&
sipTransaction.TransactionState == SIPTransactionStatesEnum.Completed)
{
// This is an INVITE transaction that wants to send a reliable response.
if (sipTransaction.LocalSIPEndPoint == null)
{
throw new ApplicationException("The SIPTransport layer cannot send a reliable SIP response because the send from socket has not been set for the transaction.");
}
else
{
SIPViaHeader topViaHeader = sipTransaction.TransactionFinalResponse.Header.Vias.TopViaHeader;
SendResponse(sipTransaction.TransactionFinalResponse);
}
}
else
{
if (sipTransaction.OutboundProxy != null)
{
SendRequest(sipTransaction.OutboundProxy, sipTransaction.TransactionRequest);
}
else if (sipTransaction.RemoteEndPoint != null)
{
SendRequest(sipTransaction.RemoteEndPoint, sipTransaction.TransactionRequest);
}
else
{
SendRequest(sipTransaction.TransactionRequest);
}
}
sipTransaction.Retransmits = 1;
sipTransaction.InitialTransmit = DateTime.Now;
sipTransaction.LastTransmit = DateTime.Now;
sipTransaction.DeliveryPending = true;
if (!m_reliableTransmissions.ContainsKey(sipTransaction.TransactionId))
{
lock (m_reliableTransmissions)
{
m_reliableTransmissions.Add(sipTransaction.TransactionId, sipTransaction);
}
}
if (!m_reliablesThreadRunning)
{
StartReliableTransmissionsThread();
}
}