private void ForwardCallAnswered(ISIPClientUserAgent uac, SIPB2BUserAgent b2bua) { if (uac.SIPDialogue != null) { _sipCallManager.BridgeDialogues(uac.SIPDialogue, b2bua.SIPDialogue); } }
private void Forward(UASInviteTransaction uasTx) { SIPB2BUserAgent b2bua = new SIPB2BUserAgent(_sipTransport, null, uasTx, null); b2bua.CallAnswered += (uac, resp) => ForwardCallAnswered(uac, b2bua); var dst = _getDestination(uasTx); if (dst == null) { Logger.LogInformation($"B2BUA lookup did not return a destination. Rejecting UAS call."); var notFoundResp = SIPResponse.GetResponse(uasTx.TransactionRequest, SIPResponseStatusCodesEnum.NotFound, null); uasTx.SendFinalResponse(notFoundResp); } else { Logger.LogInformation($"B2BUA forwarding call to {dst.Uri}."); b2bua.Call(dst); } }
private async Task Forward(UASInviteTransaction uasTx, ISIPAccount callerSIPAccount) { var invReq = uasTx.TransactionRequest; //uasTx.TransactionStateChanged += (tx) => Logger.LogDebug($"B2B uas tx state changed to {tx.TransactionState}."); //uasTx.TransactionTraceMessage += (tx, msg) => Logger.LogDebug($"B2B uas tx trace message. {msg}"); Logger.LogDebug($"B2B commencing forward for caller {invReq.Header.From.FromURI} to {invReq.URI}."); SIPB2BUserAgent b2bua = new SIPB2BUserAgent(_sipTransport, null, uasTx, callerSIPAccount); bool isAuthenticated = false; if (callerSIPAccount != null) { isAuthenticated = b2bua.AuthenticateCall(); } if (callerSIPAccount == null || isAuthenticated == true) { b2bua.CallAnswered += (uac, resp) => ForwardCallAnswered(uac, b2bua); var dst = await _sipdialPlan.Lookup(uasTx, null); if (dst == null) { Logger.LogInformation($"B2BUA lookup did not return a destination. Rejecting UAS call."); var notFoundResp = SIPResponse.GetResponse(uasTx.TransactionRequest, SIPResponseStatusCodesEnum.NotFound, null); uasTx.SendFinalResponse(notFoundResp); OnAcceptCallFailure?.Invoke(uasTx.TransactionRequest.RemoteSIPEndPoint, CallFailureEnum.NotFound, invReq); } else { Logger.LogInformation($"B2BUA forwarding call to {dst.Uri}."); b2bua.Call(dst); } } }
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); } }