android.javax.sip.Timeout Maven / Gradle / Ivy
/**
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Unpublished - rights reserved under the Copyright Laws of the United States.
* Copyright � 2003 Sun Microsystems, Inc. All rights reserved.
* Copyright � 2005 BEA Systems, Inc. All rights reserved.
*
* Use is subject to license terms.
*
* This distribution may include materials developed by third parties.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* Module Name : JSIP Specification
* File Name : Timeout.java
* Author : Phelim O'Doherty
*
* HISTORY
* Version Date Author Comments
* 1.1 08/10/2002 Phelim O'Doherty Initial version
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
package android.javax.sip;
import java.io.*;
/**
* This class contains the enumerations that define whether a timeout has
* occured in the underlying implementation. The application gets
* informed on whether a retransmission or transaction timer has expired.
*
* There are two types of Timeout, namely:
*
* - {@link Timeout#RETRANSMIT} - This type is used to alert an application that
* the underlying retransmit timer has expired so an application can
* resend the message specific to a transaction. This timer is defaulted to
* 500ms and is doubled each time it is fired until the transaction expires
* {@link Timeout#TRANSACTION}. The default retransmission value can be changed
* per transaction using {@link Transaction#setRetransmitTimer(int)}. The
* RETRANSMIT type is exposed to the following applications as follows:
*
* - User Agent - Retransmissions on Invite transactions are the
* responsibility of the application. This is due to the three way handshake
* for an INVITE Request. All other retransmissions are handled by the underlying
* implementation. Therefore the application will only receive this Timeout type
* specific to Invite transactions.
*
- User Agent with No Retransmission - an application can configure an
* implementation to handle all retransmissions using property characteristics
* of the {@link SipStack}. Therefore a Timeout
* of this type will not be passed to the application. The application
* will only get notified when the {@link Timeout#TRANSACTION} occurs.
*
- Stateful Proxy - a stateful proxy remembers transaction state about
* each incoming request and any requests it sends as a result of
* processing the incoming request. The underlying implementation
* will handle the retransmissions of all messages it sends and the application
* will not receive {@link Timeout#RETRANSMIT} events, however the application
* will get notified of {@link Timeout#TRANSACTION} events. As an Invite
* transaction is end to end a stateful proxy will not handle the
* retransmissions of messages on an Invite transaction, unless it decides to
* respond to the Invite transaction, in essence becoming an User Agent Server
* and as such should behave as described by the User Agent semantics above
* bearing in mind the retranmission property of the underlying implementation.
*
- Stateless Proxy - as a stateless proxy acts as a simple forwarding
* agent, i.e. it simply forwards every message it receives upstream, it
* keeps no transaction state for messages. The implementation does not retransmit
* messages, therefore an application will not receive {@link Timeout#RETRANSMIT}
* events on a message handled statelessly. If retransmission semantics are
* required by an application using a stateless method, it is the responsibility
* of the application to provide this feature, not the underlying implementation.
*
* - {@link Timeout#TRANSACTION} - This type is used to alert an application
* that the underlying transaction has expired. A transaction timeout typically
* occurs at a time 64*T1 were T1 is the initial value of the
* {@link Timeout#RETRANSMIT}, usually defaulted to 500ms. The
* TRANSACTION type is exposed to the following applications as follows:
*
* - User Agent - All retransmissions except retransmissions on Invite
* transactions are the responsibility of the underlying implementation, i.e.
* Invite transactions are the responsibility of the application. Therefore the
* application will only recieve TRANSACTION Timeout events on transactions that
* are not Invite transactions.
*
- User Agent with No Retransmission - an application can configure an
* implementation to handle all retransmissions using property characteristics
* of the {@link SipStack}. Therefore a TRANSACTION Timeout will be fired to
* the application on any transaction that expires including an Invite
* transaction.
*
- Stateful Proxy - a stateful proxy remembers transaction state about
* each incoming request and any requests it sends as a result of
* processing the incoming request. The underlying implementation handles
* the retransmissions of all messages it sends and will notify the application
* of {@link Timeout#TRANSACTION} events on any of its transactions. As an Invite
* transaction is end to end a stateful proxy will not handle transaction
* timeouts on an Invite transaction, unless it decides to respond to the Invite
* transaction, in essence becoming an User Agent Server and as such should
* behave as described by the User Agent semantics above bearing in mind
* the retransmission property of the underlying implementation.
*
- Stateless Proxy - as a stateless proxy acts as a simple forwarding
* agent, i.e. it simply forwards every message it receives upstream, it
* keeps no transaction state of the messages. The implementation does not
* maintain transaction state, therefore an application will not receive
* {@link Timeout#TRANSACTION} events on a message handled statelessly.
* If transaction timeout semantics are required by an application using a
* stateless method, it the responsibility of the application to provide this
* feature, not the underlying implementation.
*
*
*
* @author BEA Systems, NIST
* @version 1.2
*/
public final class Timeout implements Serializable{
/**
* Constructor for the Timeout
*
* @param timeout the integer value for the Timeout
*/
private Timeout(int timeout) {
m_timeout = timeout;
m_timeoutArray[m_timeout] = this;
}
/**
* This method returns the object value of the Timeout
*
* @return The Timeout Object
* @param timeout The integer value of the Timeout
*/
public Timeout getObject(int timeout){
if (timeout >= 0 && timeout < m_size) {
return m_timeoutArray[timeout];
} else {
throw new IllegalArgumentException("Invalid timeout value");
}
}
/**
* This method returns the integer value of the Timeout
*
* @return The integer value of the Timeout
*/
public int getValue() {
return m_timeout;
}
/**
* Returns the designated type as an alternative object to be used when
* writing an object to a stream.
*
* This method would be used when for example serializing Timeout.RETRANSMIT
* and deserializing it afterwards results again in Timeout.RETRANSMIT.
* If you do not implement readResolve(), you would not get
* Timeout.RETRANSMIT but an instance with similar content.
*
* @return the Timeout
* @exception ObjectStreamException
*/
private Object readResolve() throws ObjectStreamException {
return m_timeoutArray[m_timeout];
}
/**
* This method returns a string version of this class.
*
* @return The string version of the Timeout
*/
public String toString() {
String text = "";
switch (m_timeout) {
case _RETRANSMIT:
text = "Retransmission Timeout";
break;
case _TRANSACTION:
text = "Transaction Timeout";
break;
default:
text = "Error while printing Timeout";
break;
}
return text;
}
// internal variables
private int m_timeout;
private static int m_size = 2;
private static Timeout[] m_timeoutArray = new Timeout[m_size];
/**
* This constant value indicates the internal value of the Retransmit
* timeout.
*
This constant has an integer value of 0.
*/
public final static int _RETRANSMIT = 0;
/**
* This constant value indicates the "Retransmit" timeout.
*/
public final static Timeout RETRANSMIT = new Timeout(_RETRANSMIT);
/**
* This constant value indicates the internal value of the Transaction
* timeout.
*
This constant has an integer value of 1.
*/
public final static int _TRANSACTION = 1;
/**
* This constant value indicates the "Transaction" timeout.
*/
public final static Timeout TRANSACTION = new Timeout(_TRANSACTION);
}