private static void SIPTransportRequestReceived(SIPEndPoint localSIPEndPoint, SIPEndPoint remoteEndPoint, SIPRequest sipRequest) { if (sipRequest.Method == SIPMethodsEnum.INVITE) { Console.WriteLine("INVITE received from " + localSIPEndPoint.ToString()); IPEndPoint sipPhoneEndPoint = SDP.GetSDPRTPEndPoint(sipRequest.Body); UASInviteTransaction uasTransaction = m_sipTransport.CreateUASTransaction(sipRequest, remoteEndPoint, localSIPEndPoint, null); SIPServerUserAgent uas = new SIPServerUserAgent(m_sipTransport, null, null, null, SIPCallDirection.In, null, null, null, uasTransaction); SIPResponse tryingResponse = SIPTransport.GetResponse(sipRequest, SIPResponseStatusCodesEnum.Trying, null); uasTransaction.SendInformationalResponse(tryingResponse); if (m_xmppClient == null) { m_xmppClient = new XMPPClient(XMPP_SERVER, XMPP_SERVER_PORT, XMPP_REALM, m_xmppUsername, m_xmppPassword); m_xmppClient.Disconnected += XMPPDisconnected; m_xmppClient.IsBound += () => { XMPPPlaceCall(uas); }; ThreadPool.QueueUserWorkItem(delegate { m_xmppClient.Connect(); }); } else { XMPPPlaceCall(uas); } } else if (sipRequest.Method == SIPMethodsEnum.CANCEL) { UASInviteTransaction inviteTransaction = (UASInviteTransaction)m_sipTransport.GetTransaction(SIPTransaction.GetRequestTransactionId(sipRequest.Header.Vias.TopViaHeader.Branch, SIPMethodsEnum.INVITE)); if (inviteTransaction != null) { Console.WriteLine("Matching CANCEL request received " + sipRequest.URI.ToString() + "."); SIPCancelTransaction cancelTransaction = m_sipTransport.CreateCancelTransaction(sipRequest, remoteEndPoint, localSIPEndPoint, inviteTransaction); cancelTransaction.GotRequest(localSIPEndPoint, remoteEndPoint, sipRequest); } else { Console.WriteLine("No matching transaction was found for CANCEL to " + sipRequest.URI.ToString() + "."); SIPResponse noCallLegResponse = SIPTransport.GetResponse(sipRequest, SIPResponseStatusCodesEnum.CallLegTransactionDoesNotExist, null); m_sipTransport.SendResponse(noCallLegResponse); } } else if (sipRequest.Method == SIPMethodsEnum.BYE) { Console.WriteLine("BYE request received."); if (m_activeCalls.ContainsKey(sipRequest.Header.CallId)) { SIPResponse okResponse = SIPTransport.GetResponse(sipRequest, SIPResponseStatusCodesEnum.Ok, null); m_sipTransport.SendResponse(okResponse); m_activeCalls[sipRequest.Header.CallId].TerminateXMPPCall(); m_activeCalls.Remove(sipRequest.Header.CallId); } else { SIPResponse doesntExistResponse = SIPTransport.GetResponse(sipRequest, SIPResponseStatusCodesEnum.CallLegTransactionDoesNotExist, null); m_sipTransport.SendResponse(doesntExistResponse); } } }
public void Progress(SIPResponseStatusCodesEnum progressStatus, string reasonPhrase, string[] customHeaders, string progressContentType, string progressBody) { try { if (!IsUASAnswered) { if ((int)progressStatus >= 200) { } else { UASStateChanged?.Invoke(this, progressStatus, reasonPhrase); if (m_uasTransaction.TransactionState == SIPTransactionStatesEnum.Proceeding) { } else { SIPResponse uasProgressResponse = SIPTransport.GetResponse(m_uasTransaction.TransactionRequest, progressStatus, reasonPhrase); m_uasTransaction.SendInformationalResponse(uasProgressResponse); SIPResponse uacProgressResponse = SIPTransport.GetResponse(m_uacTransaction.TransactionRequest, progressStatus, reasonPhrase); if (!progressBody.IsNullOrBlank()) { uacProgressResponse.Body = progressBody; uacProgressResponse.Header.ContentType = progressContentType; } if (customHeaders != null && customHeaders.Length > 0) { foreach (string header in customHeaders) { uacProgressResponse.Header.UnknownHeaders.Add(header); } } m_uacTransaction.GotResponse(m_blackhole, m_blackhole, uacProgressResponse); CallRinging(this, uacProgressResponse); } } } else { logger.Warn("B2BUserAgent Progress fired on already answered call."); } } catch (Exception excp) { logger.Error("Exception B2BUserAgent Progress. " + excp.Message); } }
public void Progress(SIPResponseStatusCodesEnum progressStatus, string reasonPhrase, string[] customHeaders, string progressContentType, string progressBody) { try { if (!IsUASAnswered) { if ((int)progressStatus >= 200) { Log_External(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.AppServer, SIPMonitorEventTypesEnum.DialPlan, "B2BUA call was passed an invalid response status of " + (int)progressStatus + ", ignoring.", m_uacOwner)); } else { if (UASStateChanged != null) { UASStateChanged(this, progressStatus, reasonPhrase); } if (m_uasTransaction.TransactionState == SIPTransactionStatesEnum.Proceeding) { Log_External(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.AppServer, SIPMonitorEventTypesEnum.DialPlan, "B2BUA call ignoring progress response with status of " + (int)progressStatus + " as already in " + m_uasTransaction.TransactionState + ".", m_uacOwner)); } else { Log_External(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.AppServer, SIPMonitorEventTypesEnum.DialPlan, "B2BUA call progressing with " + progressStatus + ".", m_uacOwner)); SIPResponse uasProgressResponse = SIPTransport.GetResponse(m_uasTransaction.TransactionRequest, progressStatus, reasonPhrase); m_uasTransaction.SendInformationalResponse(uasProgressResponse); SIPResponse uacProgressResponse = SIPTransport.GetResponse(m_uacTransaction.TransactionRequest, progressStatus, reasonPhrase); if (!progressBody.IsNullOrBlank()) { uacProgressResponse.Body = progressBody; uacProgressResponse.Header.ContentType = progressContentType; } if (customHeaders != null && customHeaders.Length > 0) { foreach (string header in customHeaders) { uacProgressResponse.Header.UnknownHeaders.Add(header); } } m_uacTransaction.GotResponse(m_blackhole, m_blackhole, uacProgressResponse); CallRinging((ISIPClientUserAgent)this, uacProgressResponse); } } } else { logger.Warn("B2BUserAgent Progress fired on already answered call."); } } catch (Exception excp) { logger.Error("Exception B2BUserAgent Progress. " + excp.Message); } }
public void Progress(SIPResponseStatusCodesEnum progressStatus, string reasonPhrase, string[] customHeaders, string progressContentType, string progressBody) { try { if (!IsUASAnswered) { if ((int)progressStatus >= 200) { Log_External(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.AppServer, SIPMonitorEventTypesEnum.DialPlan, "UAS call was passed an invalid response status of " + (int)progressStatus + ", ignoring.", m_owner)); } else { if (UASStateChanged != null) { UASStateChanged(this, progressStatus, reasonPhrase); } // Allow all Trying responses through as some may contain additional useful information on the call state for the caller. // Also if the response is a 183 Session Progress with audio forward it. if (m_uasTransaction.TransactionState == SIPTransactionStatesEnum.Proceeding && progressStatus != SIPResponseStatusCodesEnum.Trying && !(progressStatus == SIPResponseStatusCodesEnum.SessionProgress && progressBody != null)) { Log_External(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.AppServer, SIPMonitorEventTypesEnum.DialPlan, "UAS call ignoring progress response with status of " + (int)progressStatus + " as already in " + m_uasTransaction.TransactionState + ".", m_owner)); } else { Log_External(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.AppServer, SIPMonitorEventTypesEnum.DialPlan, "UAS call progressing with " + progressStatus + ".", m_owner)); SIPResponse progressResponse = SIPTransport.GetResponse(m_uasTransaction.TransactionRequest, progressStatus, reasonPhrase); if (progressResponse.Status != SIPResponseStatusCodesEnum.Trying) { progressResponse.Header.To.ToTag = m_uasTransaction.LocalTag; } if (!progressBody.IsNullOrBlank()) { progressResponse.Body = progressBody; progressResponse.Header.ContentType = progressContentType; progressResponse.Header.ContentLength = progressBody.Length; } if (customHeaders != null && customHeaders.Length > 0) { foreach (string header in customHeaders) { progressResponse.Header.UnknownHeaders.Add(header); } } m_uasTransaction.SendInformationalResponse(progressResponse); } } } else { logger.Warn("SIPServerUserAgent Progress fired on already answered call."); } } catch (Exception excp) { logger.Error("Exception SIPServerUserAgent Progress. " + excp.Message); } }
public void Progress(SIPResponseStatusCodesEnum progressStatus, string reasonPhrase, string[] customHeaders, string progressContentType, string progressBody) { try { if (!IsUASAnswered) { if ((int)progressStatus >= 200) { } else { if (UASStateChanged != null) { UASStateChanged(this, progressStatus, reasonPhrase); } // Allow all Trying responses through as some may contain additional useful information on the call state for the caller. // Also if the response is a 183 Session Progress with audio forward it. if (m_uasTransaction.TransactionState == SIPTransactionStatesEnum.Proceeding && progressStatus != SIPResponseStatusCodesEnum.Trying && !(progressStatus == SIPResponseStatusCodesEnum.SessionProgress && progressBody != null)) { } else { SIPResponse progressResponse = SIPTransport.GetResponse(m_uasTransaction.TransactionRequest, progressStatus, reasonPhrase); if (progressResponse.Status != SIPResponseStatusCodesEnum.Trying) { progressResponse.Header.To.ToTag = m_uasTransaction.LocalTag; } if (!progressBody.IsNullOrBlank()) { progressResponse.Body = progressBody; progressResponse.Header.ContentType = progressContentType; progressResponse.Header.ContentLength = progressBody.Length; } if (customHeaders != null && customHeaders.Length > 0) { foreach (string header in customHeaders) { progressResponse.Header.UnknownHeaders.Add(header); } } m_uasTransaction.SendInformationalResponse(progressResponse); } } } else { Logger.Logger.Warn("SIPServerUserAgent Progress fired on already answered call."); } } catch (Exception excp) { Logger.Logger.Error("Exception SIPServerUserAgent Progress. ->" + excp.Message); } }