private void ProcessRedirect(ISIPClientUserAgent answeredUAC, SIPResponse answeredResponse)
{
try
{
SIPURI redirectURI = answeredResponse.Header.Contact[0].ContactURI;
if (redirectURI == null)
{
FireProxyLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.AppServer, SIPMonitorEventTypesEnum.DialPlan, "Redirect target could not be determined from redirect response, ignoring.", m_username));
}
else
{
//string canincalDomain = m_dialPlanContext.GetCanonicalDomain_External(redirectURI.Host, false);
if (answeredUAC.CallDescriptor.RedirectMode == SIPCallRedirectModesEnum.NewDialPlan)
{
m_dialPlanContext.ExecuteDialPlanForRedirect(answeredResponse);
}
else if (answeredUAC.CallDescriptor.RedirectMode == SIPCallRedirectModesEnum.Manual)
{
FireProxyLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.AppServer, SIPMonitorEventTypesEnum.DialPlan, "Redirect response with URI " + redirectURI.ToString() + " was not acted on as redirect mode set to manual in dial string.", m_username));
CallLegCompleted();
}
else
{
// The redirect was not explicitly allowed so will be processed as an anonymous call.
FireProxyLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.AppServer, SIPMonitorEventTypesEnum.DialPlan, "Redirect response to " + redirectURI.ToString() + " accepted.", m_username));
var redirectCalls = m_dialStringParser.GetForwardsForRedirect(redirectURI, answeredUAC.CallDescriptor);
//SIPCallDescriptor redirectCallDescriptor = answeredUAC.CallDescriptor.CopyOf();
//redirectCallDescriptor.Uri = redirectURI.ToString();
//StartNewCallAsync(redirectCallDescriptor);
if (redirectCalls != null && redirectCalls.Count > 0)
{
foreach (var redirectCall in redirectCalls)
{
StartNewCallAsync(redirectCall);
}
}
}
//else if (answeredUAC.CallDescriptor.RedirectMode == SIPCallRedirectModesEnum.Replace)
//{
// // In the Replace redirect mode the existing dialplan execution needs to be cancelled and the single redirect call be used to replace it.
// FireProxyLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.AppServer, SIPMonitorEventTypesEnum.DialPlan, "Redirect response rejected as Replace mode not yet implemented.", m_username));
// CallLegCompleted();
//}
//else
//{
// FireProxyLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.AppServer, SIPMonitorEventTypesEnum.DialPlan, "Redirect response with URI " + redirectURI.ToString() + " was not acted on as not enabled in dial string.", m_username));
// CallLegCompleted();
//}
// A redirect response was received. Create a new call leg(s) using the SIP URIs in the contact header of the response.
//if (m_dialStringParser != null)
//{
// // If there is a dial string parser available it will be used to generate a list of call destination from the redirect URI.
// SIPCallDescriptor redirectCallDescriptor = answeredUAC.CallDescriptor.CopyOf();
// Queue<List<SIPCallDescriptor>> redirectQueue = m_dialStringParser.ParseDialString(DialPlanContextsEnum.Script, null, redirectURI.ToString(), redirectCallDescriptor.CustomHeaders,
// redirectCallDescriptor.ContentType, redirectCallDescriptor.Content, null, redirectCallDescriptor.FromDisplayName, redirectCallDescriptor.FromURIUsername, redirectCallDescriptor.FromURIHost, null, CustomerServiceLevels.None);
// if (redirectQueue != null && redirectQueue.Count > 0)
// {
// // Only the first list in the queue is used (and there should only be a single list since it's generated from a redirect SIP URI and not
// // a full dial string).
// List<SIPCallDescriptor> callDescriptors = redirectQueue.Dequeue();
// for (int index = 0; index < callDescriptors.Count; index++)
// {
// callDescriptors[index].MangleIPAddress = redirectCallDescriptor.MangleIPAddress;
// callDescriptors[index].MangleResponseSDP = redirectCallDescriptor.MangleResponseSDP;
// callDescriptors[index].TransferMode = redirectCallDescriptor.TransferMode;
// }
// Start(callDescriptors);
// }
// else
// {
// FireProxyLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.AppServer, SIPMonitorEventTypesEnum.DialPlan, "A redirect response to " + redirectURI.ToString() + " did not generate any new call leg destinations.", m_username));
// }
//}
//else
//{
// FireProxyLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.AppServer, SIPMonitorEventTypesEnum.DialPlan, "Redirect response to " + redirectURI.ToString() + " accepted.", m_username));
// SIPCallDescriptor redirectCallDescriptor = answeredUAC.CallDescriptor.CopyOf();
// redirectCallDescriptor.Uri = redirectURI.ToString();
// StartNewCallAsync(redirectCallDescriptor);
//}
}
}
catch (Exception excp)
{
logger.Error("Exception ForkCall ProcessRedirect. " + excp.Message);
}
}