private void StartNewCallSync(SIPCallDescriptor callDescriptor)
{
try
{
callDescriptor.DialPlanContextID = (m_dialPlanContext != null) ? m_dialPlanContext.DialPlanContextID : Guid.Empty;
if (callDescriptor.DelaySeconds != 0)
{
callDescriptor.DelayMRE = new ManualResetEvent(false);
lock (m_delayedCalls)
{
m_delayedCalls.Add(callDescriptor);
}
int delaySeconds = (callDescriptor.DelaySeconds > MAX_DELAY_SECONDS) ? MAX_DELAY_SECONDS : callDescriptor.DelaySeconds;
FireProxyLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.AppServer, SIPMonitorEventTypesEnum.DialPlan, "Delaying call leg to " + callDescriptor.Uri + " by " + delaySeconds + "s.", m_username));
callDescriptor.DelayMRE.WaitOne(delaySeconds * 1000);
}
lock (m_delayedCalls)
{
m_delayedCalls.Remove(callDescriptor);
}
if (!m_callAnswered && !m_commandCancelled)
{
ISIPClientUserAgent uacCall = null;
if (callDescriptor.ToSIPAccount == null)
{
if (callDescriptor.IsGoogleVoiceCall)
{
FireProxyLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.AppServer, SIPMonitorEventTypesEnum.DialPlan, "Creating Google Voice user agent for " + callDescriptor.Uri + ".", m_username));
uacCall = new GoogleVoiceUserAgent(m_sipTransport, m_callManager, m_statefulProxyLogEvent, m_username, m_adminMemberId, m_outboundProxySocket);
}
else
{
uacCall = new SIPClientUserAgent(m_sipTransport, m_outboundProxySocket, m_username, m_adminMemberId, m_statefulProxyLogEvent,
m_customerAccountDataLayer.GetRtccCustomer, m_customerAccountDataLayer.GetRtccRate, m_customerAccountDataLayer.GetBalance,
m_customerAccountDataLayer.ReserveInitialCredit, m_customerAccountDataLayer.UpdateRealTimeCallControlCDRID);
}
}
else
{
if (QueueNewCall_External == null)
{
FireProxyLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.AppServer, SIPMonitorEventTypesEnum.DialPlan, "B2B calls are not supported in this dialplan manifestation.", m_username));
}
else
{
FireProxyLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.AppServer, SIPMonitorEventTypesEnum.DialPlan, "Creating B2B call for " + callDescriptor.Uri + ".", m_username));
uacCall = new SIPB2BUserAgent(m_statefulProxyLogEvent, QueueNewCall_External, m_sipTransport, m_username, m_adminMemberId);
}
}
//ISIPClientUserAgent uacCall = new JingleUserAgent(m_username, m_adminMemberId, m_statefulProxyLogEvent);
if (uacCall != null)
{
lock (m_switchCalls)
{
m_switchCalls.Add(uacCall);
}
uacCall.CallAnswered += UACCallAnswered;
uacCall.CallFailed += UACCallFailed;
uacCall.CallRinging += UACCallProgress;
//uacCall.CallTrying += UACCallTrying;
uacCall.Call(callDescriptor);
}
}
}
catch (Exception excp)
{
logger.Error("Exception ForkCall StartNewCall. " + excp.Message);
}
}