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; 27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.io.IOException; 29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.net.InetAddress; 30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.text.ParseException; 31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.*; 33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.address.SipURI; 34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.header.ContactHeader; 35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.header.ViaHeader; 36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.core.Host; 38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.core.HostPort; 39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.core.InternalErrorHandler; 40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.address.AddressImpl; 41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.address.SipUri; 42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.header.Contact; 43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.header.Via; 44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.message.SIPRequest; 45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.stack.*; 46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/** 48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Implementation of the ListeningPoint interface 49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @version 1.2 $Revision: 1.15 $ $Date: 2009/11/19 05:26:58 $ 51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @author M. Ranganathan <br/> 53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic class ListeningPointImpl implements javax.sip.ListeningPoint, gov.nist.javax.sip.ListeningPointExt { 58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected String transport; 61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** My port. (same thing as in the message processor) */ 63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang int port; 65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Pointer to the imbedded mesage processor. 68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected MessageProcessor messageProcessor; 70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Provider back pointer 73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected SipProviderImpl sipProvider; 75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Our stack 78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected SipStackImpl sipStack; 80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Construct a key to refer to this structure from the SIP stack 86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param host host string 87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param port port 88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param transport transport 89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return a string that is used as a key 90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public static String makeKey(String host, int port, String transport) { 92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return new StringBuffer(host) 93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang .append(":") 94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang .append(port) 95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang .append("/") 96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang .append(transport) 97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang .toString() 98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang .toLowerCase(); 99600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 100600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Get the key for this strucut 103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return get the host 104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected String getKey() { 106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return makeKey(this.getIPAddress(), port, transport); 107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Set the sip provider for this structure. 111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param sipProvider provider to set 112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected void setSipProvider(SipProviderImpl sipProviderImpl) { 114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.sipProvider = sipProviderImpl; 115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Remove the sip provider from this listening point. 119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected void removeSipProvider() { 121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.sipProvider = null; 122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 123600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 124600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 125600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Constructor 126600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param sipStack Our sip stack 127600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 128600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected ListeningPointImpl( 129600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang SipStack sipStack, 130600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang int port, 131600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String transport) { 132600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.sipStack = (SipStackImpl) sipStack; 133600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 134600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.port = port; 135600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.transport = transport; 136600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 137600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 138600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 139600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 140600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Clone this listening point. Note that a message Processor is not 141600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * started. The transport is set to null. 142600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return cloned listening point. 143600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 144600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public Object clone() { 145600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ListeningPointImpl lip = 146600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang new ListeningPointImpl(this.sipStack, this.port, null); 147600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang lip.sipStack = this.sipStack; 148600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return lip; 149600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 150600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 151600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 152600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 153600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 154600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Gets the port of the ListeningPoint. The default port of a ListeningPoint 155600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * is dependent on the scheme and transport. For example: 156600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * <ul> 157600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * <li>The default port is 5060 if the transport UDP the scheme is <i>sip:</i>. 158600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * <li>The default port is 5060 if the transport is TCP the scheme is <i>sip:</i>. 159600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * <li>The default port is 5060 if the transport is SCTP the scheme is <i>sip:</i>. 160600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * <li>The default port is 5061 if the transport is TLS over TCP the scheme is <i>sip:</i>. 161600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * <li>The default port is 5061 if the transport is TCP the scheme is <i>sips:</i>. 162600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * </ul> 163600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 164600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return port of ListeningPoint 165600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 166600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public int getPort() { 167600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return messageProcessor.getPort(); 168600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 169600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 170600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 171600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Gets transport of the ListeningPoint. 172600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 173600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return transport of ListeningPoint 174600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 175600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getTransport() { 176600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return messageProcessor.getTransport(); 177600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 178600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 179600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 180600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Get the provider. 181600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 182600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return the provider. 183600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 184600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public SipProviderImpl getProvider() { 185600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.sipProvider; 186600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 187600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 188600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /* (non-Javadoc) 189600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @see javax.sip.ListeningPoint#getIPAddress() 190600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 191600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getIPAddress() { 192600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 193600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.messageProcessor.getIpAddress().getHostAddress(); 194600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 195600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 196600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 197600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 198600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /* (non-Javadoc) 199600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @see javax.sip.ListeningPoint#setSentBy(java.lang.String) 200600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 201600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setSentBy(String sentBy) throws ParseException { 202600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.messageProcessor.setSentBy(sentBy); 203600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 204600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 205600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 206600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /* (non-Javadoc) 207600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @see javax.sip.ListeningPoint#getSentBy() 208600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 209600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getSentBy() { 210600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 211600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.messageProcessor.getSentBy(); 212600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 213600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 214600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean isSentBySet() { 215600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.messageProcessor.isSentBySet(); 216600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 217600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public Via getViaHeader() { 218600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.messageProcessor.getViaHeader(); 219600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 220600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 221600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public MessageProcessor getMessageProcessor() { 222600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.messageProcessor; 223600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 224600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 225600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public ContactHeader createContactHeader() { 226600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang try { 227600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String ipAddress = this.getIPAddress(); 228600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang int port = this.getPort(); 229600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang SipURI sipURI = new SipUri(); 230600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sipURI.setHost(ipAddress); 231600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sipURI.setPort(port); 232600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sipURI.setTransportParam(this.transport); 233600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Contact contact = new Contact(); 234600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang AddressImpl address = new AddressImpl(); 235600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang address.setURI(sipURI); 236600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang contact.setAddress(address); 237600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 238600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return contact; 239600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } catch (Exception ex) { 240600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang InternalErrorHandler.handleException("Unexpected exception",sipStack.getStackLogger()); 241600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return null; 242600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 243600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 244600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 245600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 246600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void sendHeartbeat(String ipAddress, int port) throws IOException { 247600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 248600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang HostPort targetHostPort = new HostPort(); 249600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang targetHostPort.setHost(new Host( ipAddress)); 250600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang targetHostPort.setPort(port); 251600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang MessageChannel messageChannel = this.messageProcessor.createMessageChannel(targetHostPort); 252600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang SIPRequest siprequest = new SIPRequest(); 253600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang siprequest.setNullRequest(); 254600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang messageChannel.sendMessage(siprequest); 255600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 256600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 257600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 258600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 259600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public ViaHeader createViaHeader() { 260600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.getViaHeader(); 261600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 262600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 263600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang} 264