1600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/* 2600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Conditions Of Use 3600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* 4600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* This software was developed by employees of the National Institute of 5600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Standards and Technology (NIST), an agency of the Federal Government. 6600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Pursuant to title 15 Untied States Code Section 105, works of NIST 7600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* employees are not subject to copyright protection in the United States 8600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* and are considered to be in the public domain. As a result, a formal 9600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* license is not needed to use the software. 10600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* 11600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* This software is provided by NIST as a service and is expressly 12600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED 13600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF 14600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT 15600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* AND DATA ACCURACY. NIST does not warrant or make any representations 16600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* regarding the use of the software or the results thereof, including but 17600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* not limited to the correctness, accuracy, reliability or usefulness of 18600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* the software. 19600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* 20600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Permission to use this software is contingent upon your acceptance 21600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* of the terms of this agreement 22600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* 23600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* . 24600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* 25600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*/ 26600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpackage gov.nist.javax.sip.stack; 27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.core.Host; 29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.core.HostPort; 30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.core.InternalErrorHandler; 31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.ListeningPointImpl; 32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.header.Via; 33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.io.IOException; 35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.net.InetAddress; 36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.text.ParseException; 37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.InvalidArgumentException; 39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/** 41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * This is the Stack abstraction for the active object that waits for messages 42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * to appear on the wire and processes these messages by calling the 43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * MessageFactory interface to create a ServerRequest or ServerResponse object. 44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * The main job of the message processor is to instantiate message channels for 45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * the given transport. 46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @version 1.2 $Revision: 1.18 $ $Date: 2009/10/16 22:58:41 $ 48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @author M. Ranganathan <br/> 50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic abstract class MessageProcessor implements Runnable { 53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * A string containing the 0.0.0.0 IPv4 ANY address. 55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected static final String IN_ADDR_ANY = "0.0.0.0"; 57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * A string containing the ::0 IPv6 ANY address. 60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected static final String IN6_ADDR_ANY = "::0"; 62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * My Sent by string ( which I use to set the outgoing via header) 64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private String sentBy; 66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private HostPort sentByHostPort; 68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /* 70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * The IP Address that was originally assigned ( Can be ANY ) 71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private String savedIpAddress; 74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * The IP address where I am listening. 77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private InetAddress ipAddress; 79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * The port where I am listening 82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private int port; 84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * The transport where I am listening 87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected String transport; 89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * The Listening Point to which I am assigned. 92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private ListeningPointImpl listeningPoint; 94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private boolean sentBySet; 96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Our stack (that created us). 99600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 100600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected SIPTransactionStack sipStack; 101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected MessageProcessor( String transport ) { 103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.transport = transport; 104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Constructor 108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param ipAddress -- ip address where I am listening for incoming requests. 110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param port -- port where i am listening for incoming requests. 111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param transport -- transport to use for the message processor (UDP/TCP/TLS). 112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected MessageProcessor( InetAddress ipAddress, int port, String transport, 114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang SIPTransactionStack transactionStack ) { 115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this( transport ); 116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.initialize(ipAddress, port, transactionStack); 117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Initializes this MessageProcessor. Needed for extensions 121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * that use classloading 122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 123600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param ipAddress2 124600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param transactionStack 125600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param port2 126600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 127600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public final void initialize( InetAddress ipAddress, int port, 128600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang SIPTransactionStack transactionStack ) { 129600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 130600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.sipStack = transactionStack; 131600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.savedIpAddress = ipAddress.getHostAddress(); 132600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.ipAddress = ipAddress; 133600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.port = port; 134600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.sentByHostPort = new HostPort(); 135600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.sentByHostPort.setHost(new Host(ipAddress.getHostAddress())); 136600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.sentByHostPort.setPort(port); 137600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 138600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 139600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 140600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Get the transport string. 141600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 142600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return A string that indicates the transport. (i.e. "tcp" or "udp") 143600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 144600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getTransport() { 145600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.transport; 146600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 147600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 148600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 149600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Get the port identifier. 150600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 151600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return the port for this message processor. This is where you receive 152600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * messages. 153600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 154600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public int getPort() { 155600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.port; 156600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 157600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 158600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 159600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Get the Via header to assign for this message processor. The topmost via 160600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * header of the outoging messages use this. 161600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 162600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return the ViaHeader to be used by the messages sent via this message processor. 163600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 164600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public Via getViaHeader() { 165600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang try { 166600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Via via = new Via(); 167600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (this.sentByHostPort != null) { 168600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang via.setSentBy(sentByHostPort); 169600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang via.setTransport(this.getTransport()); 170600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else { 171600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Host host = new Host(); 172600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang host.setHostname(this.getIpAddress().getHostAddress()); 173600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang via.setHost(host); 174600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang via.setPort(this.getPort()); 175600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang via.setTransport(this.getTransport()); 176600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 177600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return via; 178600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } catch (ParseException ex) { 179600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ex.printStackTrace(); 180600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return null; 181600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } catch (InvalidArgumentException ex) { 182600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ex.printStackTrace(); 183600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return null; 184600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 185600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 186600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public ListeningPointImpl getListeningPoint() { 187600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if ( listeningPoint == null ) { 188600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if ( this.getSIPStack().isLoggingEnabled()) { 189600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.getSIPStack().getStackLogger().logError("getListeningPoint" + this + 190600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang " returning null listeningpoint"); 191600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 192600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 193600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 194600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return listeningPoint; 195600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 196600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 197600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setListeningPoint(ListeningPointImpl lp) { 198600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if ( this.getSIPStack().isLoggingEnabled()) { 199600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.getSIPStack().getStackLogger().logDebug("setListeningPoint" + this + 200600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang " listeningPoint = " + lp); 201600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 202600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 203600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if ( lp.getPort() != this.getPort()) 204600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang InternalErrorHandler.handleException 205600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ("lp mismatch with provider",getSIPStack().getStackLogger()); 206600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.listeningPoint = lp; 207600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 208600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 209600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 210600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 211600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Get the saved IP Address. 212600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 213600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getSavedIpAddress() { 214600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.savedIpAddress; 215600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 216600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 217600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return the ip address for this message processor. 218600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 219600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public InetAddress getIpAddress() { 220600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.ipAddress; 221600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 222600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 223600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param ipAddress the ipAddress to set 224600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 225600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected void setIpAddress(InetAddress ipAddress) { 226600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.sentByHostPort.setHost( new Host(ipAddress.getHostAddress())); 227600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.ipAddress = ipAddress; 228600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 229600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 230600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 231600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Set the sentby string. This is used for stamping outgoing messages sent 232600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * from this listening point. 233600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 234600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param sentBy 235600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 236600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setSentBy(String sentBy) throws ParseException { 237600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 238600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang int ind = sentBy.indexOf(":"); 239600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (ind == -1) { 240600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.sentByHostPort = new HostPort(); 241600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.sentByHostPort.setHost(new Host(sentBy)); 242600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else { 243600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.sentByHostPort = new HostPort(); 244600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.sentByHostPort.setHost(new Host(sentBy.substring(0, ind))); 245600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String portStr = sentBy.substring(ind + 1); 246600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang try { 247600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang int port = Integer.parseInt(portStr); 248600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.sentByHostPort.setPort(port); 249600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } catch (NumberFormatException ex) { 250600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang throw new ParseException("Bad format encountered at ", ind); 251600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 252600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 253600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.sentBySet = true; 254600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.sentBy = sentBy; 255600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 256600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 257600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 258600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 259600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Get the sentby string. 260600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 261600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 262600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getSentBy() { 263600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if ( this.sentBy == null && this.sentByHostPort != null) { 264600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.sentBy = this.sentByHostPort.toString(); 265600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 266600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.sentBy; 267600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 268600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 269600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang //////////////////////////////////////////////////////////////////////////////////////// 270600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // Abstract methods 271600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /////////////////////////////////////////////////////////////////////////////////////// 272600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 273600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Get the SIP Stack. 274600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 275600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return the sip stack. 276600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 277600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public abstract SIPTransactionStack getSIPStack(); 278600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 279600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 280600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Create a message channel for the specified host/port. 281600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 282600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return New MessageChannel for this processor. 283600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 284600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public abstract MessageChannel createMessageChannel(HostPort targetHostPort) 285600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang throws IOException; 286600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 287600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 288600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Create a message channel for the specified host/port. 289600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 290600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return New MessageChannel for this processor. 291600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 292600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public abstract MessageChannel createMessageChannel(InetAddress targetHost, 293600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang int port) throws IOException; 294600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 295600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 296600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 297600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Start our thread. 298600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 299600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public abstract void start() throws IOException; 300600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 301600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 302600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Stop method. 303600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 304600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public abstract void stop(); 305600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 306600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 307600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Default target port used by this processor. This is 5060 for TCP / UDP 308600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 309600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public abstract int getDefaultTargetPort(); 310600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 311600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 312600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Flags whether this processor is secure or not. 313600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 314600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public abstract boolean isSecure(); 315600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 316600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 317600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Maximum number of bytes that this processor can handle. 318600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 319600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public abstract int getMaximumMessageSize(); 320600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 321600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 322600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Return true if there are pending messages to be processed (which prevents 323600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * the message channel from being closed). 324600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 325600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public abstract boolean inUse(); 326600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 327600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 328600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 329600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 330600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Run method. 331600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 332600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public abstract void run(); 333600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 334600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 335600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return Returns the sentBySet. 336600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 337600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean isSentBySet() { 338600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return sentBySet; 339600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 340600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 341600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 342600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 343600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Get the defalt port for the message processor. 344600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 345600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param transport 346600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return -- the default port for the message processor. 347600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 348600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 349600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public static int getDefaultPort(String transport) { 350600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 351600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return transport.equalsIgnoreCase("TLS")?5061:5060; 352600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 353600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 354600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 355600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 356600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang} 357