private SIPRequest GetInviteRequest(string callURI, SIPCallDescriptor sipCallDescriptor) { SIPFromHeader fromHeader = sipCallDescriptor.GetFromHeader(); SIPRequest inviteRequest = new SIPRequest(SIPMethodsEnum.INVITE, SIPURI.ParseSIPURI(callURI)) { LocalSIPEndPoint = m_blackhole }; SIPHeader inviteHeader = new SIPHeader(fromHeader, new SIPToHeader(null, inviteRequest.URI, null), 1, CallProperties.CreateNewCallId()); inviteHeader.From.FromTag = CallProperties.CreateNewTag(); // For incoming calls forwarded via the dial plan the username needs to go into the Contact header. inviteHeader.Contact = new List <SIPContactHeader>() { new SIPContactHeader(null, new SIPURI(inviteRequest.URI.Scheme, m_blackhole)) }; inviteHeader.CSeqMethod = SIPMethodsEnum.INVITE; inviteRequest.Header = inviteHeader; SIPViaHeader viaHeader = new SIPViaHeader(m_blackhole, CallProperties.CreateBranchId()); inviteRequest.Header.Vias.PushViaHeader(viaHeader); try { if (sipCallDescriptor.CustomHeaders != null && sipCallDescriptor.CustomHeaders.Count > 0) { foreach (string customHeader in sipCallDescriptor.CustomHeaders) { if (customHeader.IsNullOrBlank()) { continue; } else if (customHeader.Trim().StartsWith(SIPHeaders.SIP_HEADER_USERAGENT)) { inviteRequest.Header.UserAgent = customHeader.Substring(customHeader.IndexOf(":") + 1).Trim(); } else { inviteRequest.Header.UnknownHeaders.Add(customHeader); } } } } catch (Exception excp) { logger.Error("Exception Parsing CustomHeader for GetInviteRequest. " + excp.Message + sipCallDescriptor.CustomHeaders); } return(inviteRequest); }
public void Call(SIPCallDescriptor sipCallDescriptor) { try { m_uacCallDescriptor = sipCallDescriptor; SIPRequest uacInviteRequest = GetInviteRequest(m_uacCallDescriptor.Uri, sipCallDescriptor); if (sipCallDescriptor.MangleResponseSDP && sipCallDescriptor.MangleIPAddress != null) { uacInviteRequest.Header.ProxyReceivedFrom = sipCallDescriptor.MangleIPAddress.ToString(); } uacInviteRequest.Body = sipCallDescriptor.Content; uacInviteRequest.Header.ContentType = sipCallDescriptor.ContentType; uacInviteRequest.LocalSIPEndPoint = m_blackhole; uacInviteRequest.RemoteSIPEndPoint = m_blackhole; // Now that we have a destination socket create a new UAC transaction for forwarded leg of the call. m_uacTransaction = m_sipTransport.CreateUACTransaction(uacInviteRequest, m_blackhole, m_blackhole, null); if (m_uacTransaction.CDR != null) { m_uacTransaction.CDR.Owner = m_uacOwner; m_uacTransaction.CDR.AdminMemberId = m_uacAdminMemberId; m_uacTransaction.CDR.DialPlanContextID = (m_uacCallDescriptor != null) ? m_uacCallDescriptor.DialPlanContextID : Guid.Empty; } //uacTransaction.UACInviteTransactionInformationResponseReceived += ServerInformationResponseReceived; //uacTransaction.UACInviteTransactionFinalResponseReceived += ServerFinalResponseReceived; //uacTransaction.UACInviteTransactionTimedOut += ServerTimedOut; //uacTransaction.TransactionTraceMessage += TransactionTraceMessage; m_uacTransaction.SendInviteRequest(m_blackhole, m_uacTransaction.TransactionRequest); SIPRequest uasInviteRequest = uacInviteRequest.Copy(); uasInviteRequest.LocalSIPEndPoint = m_blackhole; uasInviteRequest.RemoteSIPEndPoint = m_blackhole; uasInviteRequest.Header.Vias.TopViaHeader.Branch = CallProperties.CreateBranchId(); m_uasTransaction = m_sipTransport.CreateUASTransaction(uasInviteRequest, m_blackhole, m_blackhole, null); SetOwner(sipCallDescriptor.ToSIPAccount.Owner, sipCallDescriptor.ToSIPAccount.AdminMemberId); //m_uasTransaction.TransactionTraceMessage += TransactionTraceMessage; //m_uasTransaction.UASInviteTransactionTimedOut += ClientTimedOut; //m_uasTransaction.UASInviteTransactionCancelled += (t) => { }; QueueNewCall_External(this); CallTrying.Invoke(this, null); } catch (Exception excp) { logger.Error("Exception SIPB2BUserAgent Call. " + excp.Message); } }
public SIPNonInviteClientUserAgent( SIPTransport sipTransport, SIPEndPoint outboundProxy, SIPCallDescriptor callDescriptor, string owner, string adminMemberID, SIPMonitorLogDelegate logDelegate) { m_sipTransport = sipTransport; m_outboundProxy = outboundProxy; m_callDescriptor = callDescriptor; m_owner = owner; m_adminMemberID = adminMemberID; Log_External = logDelegate; }
public SIPCallDescriptor CopyOf() { List <string> copiedCustomHeaders = null; if (CustomHeaders != null) { copiedCustomHeaders = new List <string>(); copiedCustomHeaders.InsertRange(0, CustomHeaders); } SIPCallDescriptor copy = new SIPCallDescriptor( Username, Password, Uri, From, To, RouteSet, copiedCustomHeaders, AuthUsername, CallDirection, ContentType, Content, (MangleIPAddress != null) ? new IPAddress(MangleIPAddress.GetAddressBytes()) : null); // Options. copy.DelaySeconds = DelaySeconds; copy.RedirectMode = RedirectMode; copy.CallDurationLimit = CallDurationLimit; copy.MangleResponseSDP = MangleResponseSDP; copy.FromDisplayName = FromDisplayName; copy.FromURIUsername = FromURIUsername; copy.FromURIHost = FromURIHost; copy.TransferMode = TransferMode; copy.ToSIPAccount = ToSIPAccount; return(copy); }