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); } }
int IRelaytedTransactionId.GetRelaytedTransactionId(BadServerTransactionKey key) { lock (sync) { T transaction; if (TryGet(key, out transaction)) { return(transaction.Id); } } return(Transaction.InvalidKId); }
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); }
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; } }
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); }