예제 #1
0
        protected void SendRequest(ISipClientTransaction transaction, int sequenceNr)
        {
            Check.Require(transaction, "tx");
            Check.Require(transaction.Request, "tx.Request");

            if (transaction.Request.RequestLine.Method == SipMethods.Bye)
            {
                if (_state != DialogState.Confirmed)
                {
                    throw new SipCoreException("'BYE' request can not be sent. Only dialogs in 'CONFIRMED' state can send 'BYE' requests.");
                }
            }



            transaction.Request.CSeq.Sequence = sequenceNr;

            transaction.SendRequest();

            //leave terminate up to dialog user.
            //if (method == SipMethods.Bye)
            //{
            //    if (_logger.IsDebugEnabled) _logger.Debug("Dialog[Id={0}] has send '{1}' request. Terminating dialog...", GetId(), method);

            //    Terminate();
            //}
        }
예제 #2
0
        public override void SendRequest(ISipClientTransaction transaction)
        {
            Check.Require(transaction, "tx");
            Check.Require(transaction.Request, "tx.Request");

            var method = transaction.Request.RequestLine.Method;
            if (method == SipMethods.Cancel || method == SipMethods.Ack)
            {
                /*throw exception*/
                throw new SipCoreException("The dialog can not send a '{0}' request. '{0}' requests can only be send by ClientDialogs");
            }

            lock (_lock) ++_localSequenceNr;

            SendRequest(transaction, _localSequenceNr);
        }
예제 #3
0
        public override void SendRequest(ISipClientTransaction transaction)
        {
            Check.Require(transaction, "tx");
            Check.Require(transaction.Request, "tx.Request");

            var method = transaction.Request.RequestLine.Method;

            if (method == SipMethods.Cancel || method == SipMethods.Ack)
            {
                /*throw exception*/
                throw new SipCoreException("The dialog can not send a '{0}' request. '{0}' requests can only be send by ClientDialogs");
            }

            lock (_lock) ++_localSequenceNr;

            SendRequest(transaction, _localSequenceNr);
        }
예제 #4
0
        public override void SendRequest(ISipClientTransaction transaction)
        {
            Check.Require(transaction, "tx");
            Check.Require(transaction.Request, "tx.Request");

            var method = transaction.Request.RequestLine.Method;

            if (method == SipMethods.Ack)
            {
                throw new SipCoreException("'ACK' requests can not be send statefull. All 'ACK' requests must be send statelessly. Use the SendAck method instead.");
            }

            if (method == SipMethods.Cancel)
            {
                if (_state != DialogState.Early)
                {
                    throw new SipCoreException("'CANCEL' request can not be sent. Only dialogs in 'EARLY' state can send 'CANCEL' requests.");
                }
            }

            var seqNrToUse = 0;

            /*CSeq are incremented in each direction, excepting ACK and CANCEL, whose numbers equal the requests being acknowledged or cancelled*/

            if (method == SipMethods.Cancel)
            {
                seqNrToUse = _firstRequest.CSeq.Sequence;
            }
            else
            {
                lock (_lock) ++_localSequenceNr;
                seqNrToUse = _localSequenceNr;
            }

            SendRequest(transaction, seqNrToUse);

            if (method == SipMethods.Cancel)
            {
                if (_logger.IsDebugEnabled)
                {
                    _logger.Debug("Dialog[Id={0}] has send '{1}' request. Terminating dialog...", GetId(), method);
                }

                Terminate();
            }
        }
예제 #5
0
        public SipInviteClientDialog CreateClientDialog(ISipClientTransaction transaction)
        {
            var inviteTx = transaction as SipInviteClientTransaction;

            Check.Require(transaction, "transaction");
            Check.IsTrue(inviteTx != null, "The transaction must be of type 'SipInviteClientTransaction'");
            Check.Require(inviteTx.Request, "The request can not be null");
            Check.Require(inviteTx.Request.From, "The From header can not be null");
            Check.NotNullOrEmpty(inviteTx.Request.From.Tag, "From tag");

            var dialog = new SipInviteClientDialog(
                inviteTx,
                _dialogTable,
                _stack.CreateHeaderFactory(),
                _stack.CreateMessageFactory(),
                _stack.CreateAddressFactory(),
                this,
                _sipListener,
                _contextSource.ListeningPoint);

            inviteTx.SetDialog(dialog);

            return(dialog);
        }
예제 #6
0
 public abstract void SendRequest(ISipClientTransaction transaction);
예제 #7
0
        public override void SendRequest(ISipClientTransaction transaction)
        {
            Check.Require(transaction, "tx");
            Check.Require(transaction.Request, "tx.Request");

            var method = transaction.Request.RequestLine.Method;

            if (method == SipMethods.Ack)
            {
                 throw new SipCoreException("'ACK' requests can not be send statefull. All 'ACK' requests must be send statelessly. Use the SendAck method instead.");
            }

            if (method == SipMethods.Cancel)
            {
                if (_state != DialogState.Early)
                    throw new SipCoreException("'CANCEL' request can not be sent. Only dialogs in 'EARLY' state can send 'CANCEL' requests.");
            }

            var seqNrToUse = 0;
            /*CSeq are incremented in each direction, excepting ACK and CANCEL, whose numbers equal the requests being acknowledged or cancelled*/

            if (method == SipMethods.Cancel)
            {
                seqNrToUse = _firstRequest.CSeq.Sequence;
            }
            else
            {

                lock (_lock) ++_localSequenceNr;
                seqNrToUse = _localSequenceNr;
            }

            SendRequest(transaction, seqNrToUse);

            if (method == SipMethods.Cancel)
            {
                if (_logger.IsDebugEnabled) _logger.Debug("Dialog[Id={0}] has send '{1}' request. Terminating dialog...", GetId(), method);

                Terminate();
            }
        }
예제 #8
0
 public SipResponseEventBuilder WithClientTx(ISipClientTransaction tx)
 {
     _tx = tx;
     return(this);
 }
예제 #9
0
        public SipInviteClientDialog CreateClientDialog(ISipClientTransaction transaction)
        {
            var inviteTx = transaction as SipInviteClientTransaction;

            Check.Require(transaction, "transaction");
            Check.IsTrue(inviteTx != null, "The transaction must be of type 'SipInviteClientTransaction'");
            Check.Require(inviteTx.Request, "The request can not be null");
            Check.Require(inviteTx.Request.From, "The From header can not be null");
            Check.NotNullOrEmpty(inviteTx.Request.From.Tag, "From tag");

            var dialog = new SipInviteClientDialog(
                inviteTx,
                _dialogTable,
                _stack.CreateHeaderFactory(),
                _stack.CreateMessageFactory(),
                _stack.CreateAddressFactory(),
                this,
                _sipListener,
                _contextSource.ListeningPoint);

            inviteTx.SetDialog(dialog);

            return dialog;
        }
예제 #10
0
        protected void SendRequest(ISipClientTransaction transaction, int sequenceNr)
        {
            Check.Require(transaction, "tx");
            Check.Require(transaction.Request, "tx.Request");

            if (transaction.Request.RequestLine.Method == SipMethods.Bye)
            {
                if (_state != DialogState.Confirmed)
                    throw new SipCoreException("'BYE' request can not be sent. Only dialogs in 'CONFIRMED' state can send 'BYE' requests.");
            }

            transaction.Request.CSeq.Sequence = sequenceNr;

            transaction.SendRequest();

            //leave terminate up to dialog user.
            //if (method == SipMethods.Bye)
            //{
            //    if (_logger.IsDebugEnabled) _logger.Debug("Dialog[Id={0}] has send '{1}' request. Terminating dialog...", GetId(), method);

            //    Terminate();
            //}
        }
예제 #11
0
 public abstract void SendRequest(ISipClientTransaction transaction);