示例#1
0
        public int ProccessTransport(SipMessageReader reader, out T transaction)
        {
            var key = new BadServerTransactionKey(reader, (reader.IsAck || reader.IsCancel) ? Methods.Invitem : reader.Method);

            lock (sync)
            {
                if (TryGet(key, out transaction) == false)
                {
                    int transactionId = Transaction.InvalidKId;

                    if (reader.Method == Methods.Cancelm)
                    {
                        transactionId = Transaction.ChangeKind(
                            inviteStorage.GetRelaytedTransactionId(key), Transaction.Kind.CancelServer);
                    }

                    if (transactionId == Transaction.InvalidKId)
                    {
                        transactionId = GenerateKId();
                    }

                    transaction = Add(key, GetAcceptedRequestIndex(reader), transactionId);
                }

                int action = transaction.ProccessTransport(reader.Method == Methods.Ackm);

                UpdateOrRemove(transaction);

                return(action);
            }
        }
示例#2
0
        int IRelaytedTransactionId.GetRelaytedTransactionId(BadServerTransactionKey key)
        {
            lock (sync)
            {
                T transaction;
                if (TryGet(key, out transaction))
                {
                    return(transaction.Id);
                }
            }

            return(Transaction.InvalidKId);
        }
示例#3
0
        private T Add(BadServerTransactionKey key, int router, int transactionKId)
        {
            T transaction;

            key.TransactionId = transactionKId;
            transactionIndexes.Add(key, transactionKId);

            transaction = new T();
            transaction.Initialize(transactionKId, router, key.GetHashCode());

            transactions.Add(transactionKId, transaction);

            return(transaction);
        }
示例#4
0
        private void UpdateOrRemove(T transaction)
        {
            if (transaction.State == Transaction.States.Terminated)
            {
                transactions.Remove(transaction.Id);

                var key = new BadServerTransactionKey(transaction.Id, transaction.TransactionKeyHashCode);
                transactionIndexes.Remove(key);

                transaction.Dispose();
            }
            else
            {
                transactions[transaction.Id] = transaction;
            }
        }
示例#5
0
        private bool TryGet(BadServerTransactionKey key, out T transaction)
        {
            bool result;
            int  index;

            if (transactionIndexes.TryGetValue(key, out index))
            {
                if (transactions.TryGetValue(index, out transaction) == false)
                {
                    throw new InvalidProgramException(@"Transaction Index was not removed!");
                }
                result = true;
            }
            else
            {
                transaction = new T();
                result      = false;
            }

            return(result);
        }