/** * Create a client transaction from a raw channel. * * @param transaction is the transport channel to encapsulate. */ public MessageChannel createMessageChannel(SIPTransaction transaction) { synchronized (clientTransactions) { // New client transaction to return SIPTransaction returnChannel = createClientTransaction(transaction.getMessageChannel()); clientTransactions.add(0, (SIPClientTransaction) returnChannel); ((SIPClientTransaction) returnChannel).setViaPort(transaction.getViaPort()); ((SIPClientTransaction) returnChannel).setViaHost(transaction.getViaHost()); // Add the transaction timer for the state machine. returnChannel.startTransactionTimer(); return returnChannel; } }
/** * Invoked when an error has ocurred with a transaction. * * @param transactionErrorEvent Error event. */ public synchronized void transactionErrorEvent(SIPTransactionErrorEvent transactionErrorEvent) { SIPTransaction transaction = (SIPTransaction) transactionErrorEvent.getSource(); if (transactionErrorEvent.getErrorID() == SIPTransactionErrorEvent.TRANSPORT_ERROR) { // Kill scanning of this transaction. transaction.setState(SIPTransaction.TERMINATED_STATE); if (transaction instanceof SIPServerTransaction) { // let the reaper get him ((SIPServerTransaction) transaction).collectionTime = 0; } transaction.disableTimeoutTimer(); transaction.disableRetransmissionTimer(); } }
/** Remove the transaction from transaction hash. */ protected void removeTransactionHash(SIPTransaction sipTransaction) { SIPRequest sipRequest = sipTransaction.getOriginalRequest(); if (sipRequest == null) return; if (sipTransaction instanceof SIPClientTransaction) { synchronized (clientTransactionTable) { String key = sipTransaction.getTransactionId(); clientTransactionTable.remove(key); } } else if (sipTransaction instanceof SIPServerTransaction) { synchronized (serverTransactionTable) { String key = sipTransaction.getTransactionId(); serverTransactionTable.remove(key); } } }
/** * Find the transaction corresponding to a given request. * * @param sipMessage request for which to retrieve the transaction. * @param isServer search the server transaction table if true. * @return the transaction object corresponding to the request or null if no such mapping exists. */ public SIPTransaction findTransaction(SIPMessage sipMessage, boolean isServer) { SIPTransaction retval = null; if (isServer) { Via via = sipMessage.getTopmostVia(); if (via.getBranch() != null) { String key = sipMessage.getTransactionId(); synchronized (this.serverTransactionTable) { retval = (SIPTransaction) serverTransactionTable.get(key); if (LogWriter.needsLogging) logMessage("looking for key " + key); if (retval != null && retval.isMessagePartOfTransaction(sipMessage)) return retval; } } // Need to scan the table for old style transactions (RFC 2543 // style) synchronized (this.serverTransactions) { Iterator<SIPServerTransaction> it = serverTransactions.iterator(); while (it.hasNext()) { SIPServerTransaction sipServerTransaction = (SIPServerTransaction) it.next(); if (sipServerTransaction.isMessagePartOfTransaction(sipMessage)) return sipServerTransaction; } } } else { Via via = sipMessage.getTopmostVia(); if (via.getBranch() != null) { String key = sipMessage.getTransactionId(); synchronized (this.clientTransactionTable) { retval = (SIPTransaction) clientTransactionTable.get(key); if (retval != null && retval.isMessagePartOfTransaction(sipMessage)) return retval; } } // Need to scan the table for old style transactions (RFC 2543 // style) synchronized (this.clientTransactions) { Iterator<SIPClientTransaction> it = clientTransactions.iterator(); while (it.hasNext()) { SIPClientTransaction clientTransaction = (SIPClientTransaction) it.next(); if (clientTransaction.isMessagePartOfTransaction(sipMessage)) return clientTransaction; } } } return null; }
/** Remove transaction. */ public void removeTransaction(SIPTransaction sipTransaction) { if (sipTransaction instanceof SIPServerTransaction) { synchronized (serverTransactions) { serverTransactions.remove(sipTransaction); } synchronized (serverTransactionTable) { String key = sipTransaction.getTransactionId(); serverTransactionTable.remove(key); } } else { synchronized (clientTransactions) { clientTransactions.remove(sipTransaction); } synchronized (clientTransactionTable) { String key = sipTransaction.getTransactionId(); clientTransactionTable.remove(key); } } }
/** * Creates a client transaction to handle a new request. Gets the real message channel from the * superclass, and then creates a new client transaction wrapped around this channel. * * @param nextHop Hop to create a channel to contact. */ public MessageChannel createMessageChannel(int sourcePort, Hop nextHop) throws UnknownHostException { synchronized (clientTransactions) { // New client transaction to return SIPTransaction returnChannel; // Create a new client transaction around the // superclass' message channel MessageChannel mc = super.createMessageChannel(sourcePort, nextHop); // Superclass will return null if no message processor // available for the transport. if (mc == null) return null; returnChannel = createClientTransaction(mc); clientTransactions.add(0, (SIPClientTransaction) returnChannel); ((SIPClientTransaction) returnChannel).setViaPort(nextHop.getPort()); ((SIPClientTransaction) returnChannel).setViaHost(nextHop.getHost()); // Add the transaction timer for the state machine. returnChannel.startTransactionTimer(); return returnChannel; } }
/** Hash table for quick lookup of transactions. */ protected void addTransactionHash(SIPTransaction sipTransaction) { SIPRequest sipRequest = sipTransaction.getOriginalRequest(); // Via via = sipRequest.getTopmostVia(); // Cannot cache old style requests. /** * if (via.getBranch() == null || ! via.getBranch().toUpperCase().startsWith * (SIPConstants.BRANCH_MAGIC_COOKIE.toUpperCase())){ return; } */ if (sipTransaction instanceof SIPClientTransaction) { synchronized (clientTransactionTable) { String key = sipRequest.getTransactionId(); clientTransactionTable.put(key, sipTransaction); } } else { synchronized (serverTransactionTable) { String key = sipRequest.getTransactionId(); serverTransactionTable.put(key, sipTransaction); } } }