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