internal UACInviteTransaction(SIPTransport sipTransport, SIPRequest sipRequest, SIPEndPoint dstEndPoint, SIPEndPoint localSIPEndPoint, SIPEndPoint outboundProxy) : base(sipTransport, sipRequest, dstEndPoint, localSIPEndPoint, outboundProxy) { TransactionType = SIPTransactionTypesEnum.Invite; m_localTag = sipRequest.Header.From.FromTag; CDR = new SIPCDR(SIPCallDirection.Out, sipRequest.URI, sipRequest.Header.From, sipRequest.Header.CallId, localSIPEndPoint, dstEndPoint); TransactionFinalResponseReceived += UACInviteTransaction_TransactionFinalResponseReceived; TransactionInformationResponseReceived += UACInviteTransaction_TransactionInformationResponseReceived; TransactionTimedOut += UACInviteTransaction_TransactionTimedOut; TransactionRequestReceived += UACInviteTransaction_TransactionRequestReceived; TransactionRemoved += UACInviteTransaction_TransactionRemoved; }
/// <summary> /// Default constructor for user agent client INVITE transaction. /// </summary> /// <param name="sendOkAckManually">If set an ACK request for the 2xx response will NOT be sent and it will be up to the application to explicitly call the SendACK request.</param> /// <param name="disablePrackSupport">If set to true then PRACK support will not be set in the initial INVITE reqeust.</param> internal UACInviteTransaction(SIPTransport sipTransport, SIPRequest sipRequest, SIPEndPoint outboundProxy, bool sendOkAckManually = false, bool disablePrackSupport = false) : base(sipTransport, sipRequest, outboundProxy) { TransactionType = SIPTransactionTypesEnum.InviteClient; m_localTag = sipRequest.Header.From.FromTag; CDR = new SIPCDR(SIPCallDirection.Out, sipRequest.URI, sipRequest.Header.From, sipRequest.Header.CallId, sipRequest.LocalSIPEndPoint, sipRequest.RemoteSIPEndPoint); _sendOkAckManually = sendOkAckManually; _disablePrackSupport = disablePrackSupport; TransactionFinalResponseReceived += UACInviteTransaction_TransactionFinalResponseReceived; TransactionInformationResponseReceived += UACInviteTransaction_TransactionInformationResponseReceived; TransactionTimedOut += UACInviteTransaction_TransactionTimedOut; TransactionRequestReceived += UACInviteTransaction_TransactionRequestReceived; TransactionRemoved += UACInviteTransaction_TransactionRemoved; }
public UASInviteTransaction( SIPTransport sipTransport, SIPRequest sipRequest, SIPEndPoint outboundProxy, bool noCDR = false) : base(sipTransport, sipRequest, outboundProxy) { TransactionType = SIPTransactionTypesEnum.InviteServer; m_remoteTag = sipRequest.Header.From.FromTag; if (sipRequest.Header.To.ToTag == null) { // This UAS needs to set the To Tag. m_localTag = CallProperties.CreateNewTag(); } else { // This is a re-INVITE. m_localTag = sipRequest.Header.To.ToTag; } //logger.LogDebug("New UASTransaction (" + TransactionId + ") for " + TransactionRequest.URI.ToString() + " to " + RemoteEndPoint + "."); SIPEndPoint localEP = SIPEndPoint.TryParse(sipRequest.Header.ProxyReceivedOn) ?? sipRequest.LocalSIPEndPoint; SIPEndPoint remoteEP = SIPEndPoint.TryParse(sipRequest.Header.ProxyReceivedFrom) ?? sipRequest.RemoteSIPEndPoint; if (!noCDR) { CDR = new SIPCDR(SIPCallDirection.In, sipRequest.URI, sipRequest.Header.From, sipRequest.Header.CallId, localEP, remoteEP); } TransactionRequestReceived += UASInviteTransaction_TransactionRequestReceived; TransactionInformationResponseReceived += UASInviteTransaction_TransactionResponseReceived; TransactionFinalResponseReceived += UASInviteTransaction_TransactionResponseReceived; TransactionTimedOut += UASInviteTransaction_TransactionTimedOut; TransactionRemoved += UASInviteTransaction_TransactionRemoved; OnAckRequestReceived += UASInviteTransaction_OnAckRequestReceived; sipTransport.AddTransaction(this); }
internal UASInviteTransaction( SIPTransport sipTransport, SIPRequest sipRequest, SIPEndPoint dstEndPoint, SIPEndPoint localSIPEndPoint, SIPEndPoint outboundProxy, IPAddress contactIPAddress, bool noCDR = false) : base(sipTransport, sipRequest, dstEndPoint, localSIPEndPoint, outboundProxy) { TransactionType = SIPTransactionTypesEnum.Invite; m_remoteTag = sipRequest.Header.From.FromTag; m_contactIPAddress = contactIPAddress; if (sipRequest.Header.To.ToTag == null) { // This UAS needs to set the To Tag. m_localTag = CallProperties.CreateNewTag(); } else { // This is a re-INVITE. m_localTag = sipRequest.Header.To.ToTag; } //logger.LogDebug("New UASTransaction (" + TransactionId + ") for " + TransactionRequest.URI.ToString() + " to " + RemoteEndPoint + "."); SIPEndPoint localEP = SIPEndPoint.TryParse(sipRequest.Header.ProxyReceivedOn) ?? localSIPEndPoint; SIPEndPoint remoteEP = SIPEndPoint.TryParse(sipRequest.Header.ProxyReceivedFrom) ?? dstEndPoint; if (!noCDR) { CDR = new SIPCDR(SIPCallDirection.In, sipRequest.URI, sipRequest.Header.From, sipRequest.Header.CallId, localEP, remoteEP); } //UpdateTransactionState(SIPTransactionStatesEnum.Proceeding); TransactionRequestReceived += UASInviteTransaction_TransactionRequestReceived; TransactionInformationResponseReceived += UASInviteTransaction_TransactionResponseReceived; TransactionFinalResponseReceived += UASInviteTransaction_TransactionResponseReceived; TransactionTimedOut += UASInviteTransaction_TransactionTimedOut; TransactionRemoved += UASInviteTransaction_TransactionRemoved; }
public void QueueCDR(SIPCDR cdr) { try { if (m_sipCDRPersistor != null && !StopCDRWrites && !m_pendingCDRs.Contains(cdr)) { m_pendingCDRs.Enqueue(cdr); } } catch (Exception excp) { logger.Error("Exception QueueCDR. " + excp.Message); } }
private IPAddress m_contactIPAddress; // If set this IP address should be used in the Contact header of the Ok response so that ACK requests can be delivered correctly. #endregion Fields #region Constructors internal UASInviteTransaction( SIPTransport sipTransport, SIPRequest sipRequest, SIPEndPoint dstEndPoint, SIPEndPoint localSIPEndPoint, SIPEndPoint outboundProxy, IPAddress contactIPAddress) : base(sipTransport, sipRequest, dstEndPoint, localSIPEndPoint, outboundProxy) { TransactionType = SIPTransactionTypesEnum.Invite; m_remoteTag = sipRequest.Header.From.FromTag; m_contactIPAddress = contactIPAddress; if (sipRequest.Header.To.ToTag == null) { // This UAS needs to set the To Tag. m_localTag = CallProperties.CreateNewTag(); } else { // This is a re-INVITE. m_localTag = sipRequest.Header.To.ToTag; } //logger.Debug("New UASTransaction (" + TransactionId + ") for " + TransactionRequest.URI.ToString() + " to " + RemoteEndPoint + "."); SIPEndPoint localEP = SIPEndPoint.TryParse(sipRequest.Header.ProxyReceivedOn) ?? localSIPEndPoint; SIPEndPoint remoteEP = SIPEndPoint.TryParse(sipRequest.Header.ProxyReceivedFrom) ?? dstEndPoint; CDR = new SIPCDR(SIPCallDirection.In, sipRequest.URI, sipRequest.Header.From, sipRequest.Header.CallId, localEP, remoteEP); //UpdateTransactionState(SIPTransactionStatesEnum.Proceeding); TransactionRequestReceived += UASInviteTransaction_TransactionRequestReceived; TransactionInformationResponseReceived += UASInviteTransaction_TransactionResponseReceived; TransactionFinalResponseReceived += UASInviteTransaction_TransactionResponseReceived; TransactionTimedOut += UASInviteTransaction_TransactionTimedOut; TransactionRemoved += UASInviteTransaction_TransactionRemoved; }
public void WriteCDR(SIPCDR cdr) { try { //if (m_sipCDRPersistor != null && !StopCDRWrites && !m_pendingCDRs.Contains(cdr)) //{ // m_pendingCDRs.Enqueue(cdr); //} SIPCDRAsset cdrAsset = new SIPCDRAsset(cdr); var existingCDR = m_sipCDRPersistor.Get(cdrAsset.Id); if (existingCDR == null) { cdrAsset.Inserted = DateTimeOffset.UtcNow; m_sipCDRPersistor.Add(cdrAsset); } else //if (existingCDR.ReconciliationResult == null) { m_sipCDRPersistor.Update(cdrAsset); } } catch (Exception excp) { logger.Error("Exception QueueCDR. " + excp.Message); } }
public void UpdateRealTimeCallControlCDRID(string oldCDRID, SIPCDR newCDR) { logger.Debug("UpdateRealTimeCallControlCDRID old CDR ID " + oldCDRID + ", new CDR ID " + newCDR.CDRId.ToString() + "."); using (var db = new SIPSorceryEntities()) { using (var trans = new TransactionScope()) { var realTimeCallControl = (from rtcc in db.RTCCs1 where rtcc.CDRID == oldCDRID select rtcc).FirstOrDefault(); if (realTimeCallControl == null) { logger.Error("No RTCC record could be found for CDR ID " + oldCDRID + "."); } else { //db.CDRs.AddObject(newCDR); realTimeCallControl.CDRID = newCDR.CDRId.ToString(); db.SaveChanges(); trans.Complete(); } } } }
/// <summary> /// This method attempts to reserve a the initial amount of credit for a call. /// </summary> /// <param name="accountCode">The accountCode the credit should be reserved against.</param> /// <param name="amount">The amount of credit to reserve.</param> /// <param name="rate">The rate for the call destination and the values that will be used for subsequent credit reservations.</param> /// <param name="initialSeconds">IF the reservation is successful this parameter will hold the number of seconds that were reserved for the initial reservation.</param> /// <returns>True if there was enough credit for the reservation otherwise false.</returns> public decimal ReserveInitialCredit(string accountCode, string rateID, SIPCDR cdr, out int initialSeconds) { try { logger.Debug("ReserveInitialCredit for " + accountCode + " and rate ID " + rateID + "."); initialSeconds = 0; using (var db = new SIPSorceryEntities()) { using (var trans = new TransactionScope()) { var rate = db.Rates.Where(x => x.ID == rateID).SingleOrDefault(); if (accountCode.IsNullOrBlank() || (rate == null || rate.Rate1 <= 0)) { return Decimal.MinusOne; } logger.Debug("ReserveInitialCredit for " + accountCode + ", rate " + rate.Rate1 + ", setup cost " + rate.SetupCost + ", increment seconds " + rate.IncrementSeconds + "."); var customerAccount = db.CustomerAccounts.Where(x => x.AccountCode == accountCode).SingleOrDefault(); if (customerAccount == null) { logger.Debug("The initial reservation for " + accountCode + " failed due to the no matching accountcode."); return Decimal.MinusOne; } // Get the owning customer's RTCC billing increment. //int rtccIncrement = (from cust in db.Customers where cust.Name.ToLower() == customerAccount.Owner.ToLower() select cust.RTCCBillingIncrement).Single(); initialSeconds = (rate.IncrementSeconds > MINIMUM_INITIAL_RESERVATION_SECONDS) ? rate.IncrementSeconds : MINIMUM_INITIAL_RESERVATION_SECONDS; decimal reservationCost = ((decimal)initialSeconds / (decimal)60 * rate.Rate1) + rate.SetupCost; if (customerAccount.Credit < reservationCost) { logger.Debug("The initial reservation for " + accountCode + ", duration " + initialSeconds + "s and " + reservationCost.ToString("0.#####") + " failed due to lack of credit."); return Decimal.MinusOne; } else { var rtccRecord = new RTCC() { ID = Guid.NewGuid().ToString(), CDRID = cdr.CDRId.ToString(), AccountCode = accountCode, SecondsReserved = initialSeconds, Cost = reservationCost, Rate = rate.Rate1, SetupCost = rate.SetupCost, IncrementSeconds = rate.IncrementSeconds, Inserted = DateTime.UtcNow }; db.RTCCs1.AddObject(rtccRecord); //var callCDR = (from cdr in db.CDRs where cdr.ID == cdrID select cdr).SingleOrDefault(); //if (callCDR == null) //{ // logger.Debug("The initial reservation for " + accountCode + " and " + reservationCost.ToString("0.#####") + " failed due to the no matching CDR for " + cdrID + "."); // return false; //} //else if (callCDR.HungupTime != null) //{ // logger.Debug("The initial reservation for " + accountCode + " and " + reservationCost.ToString("0.#####") + " failed due to the CDR already being hungup."); // return false; //} // The credit is available deduct it from the customer account balance and place it on the CDR. customerAccount.Credit = customerAccount.Credit - reservationCost; // Set the fields on the CDR. //callCDR.Rate = rate; //callCDR.SecondsReserved = seconds; //callCDR.AccountCode = accountCode; //callCDR.Cost = reservationCost; //db.CDRs.AddObject(cdr); db.SaveChanges(); trans.Complete(); logger.Debug("The initial reservation for " + accountCode + ", duration " + initialSeconds + "s and " + reservationCost.ToString("0.#####") + " was successful."); return reservationCost; } } } } catch (Exception excp) { logger.Error("Exception ReserveInitialCredit. " + excp); throw; } }