blob: 8d203c6f12dedb5ec6fde13d33f08d05b7438f1b [file] [log] [blame]
/*
* Conditions Of Use
*
* This software was developed by employees of the National Institute of
* Standards and Technology (NIST), an agency of the Federal Government.
* Pursuant to title 15 Untied States Code Section 105, works of NIST
* employees are not subject to copyright protection in the United States
* and are considered to be in the public domain. As a result, a formal
* license is not needed to use the software.
*
* This software is provided by NIST as a service and is expressly
* provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
* AND DATA ACCURACY. NIST does not warrant or make any representations
* regarding the use of the software or the results thereof, including but
* not limited to the correctness, accuracy, reliability or usefulness of
* the software.
*
* Permission to use this software is contingent upon your acceptance
* of the terms of this agreement
*
* .
*
*/
package gov.nist.javax.sip;
import java.io.IOException;
import java.net.InetAddress;
import java.text.ParseException;
import javax.sip.*;
import javax.sip.address.SipURI;
import javax.sip.header.ContactHeader;
import javax.sip.header.ViaHeader;
import gov.nist.core.Host;
import gov.nist.core.HostPort;
import gov.nist.core.InternalErrorHandler;
import gov.nist.javax.sip.address.AddressImpl;
import gov.nist.javax.sip.address.SipUri;
import gov.nist.javax.sip.header.Contact;
import gov.nist.javax.sip.header.Via;
import gov.nist.javax.sip.message.SIPRequest;
import gov.nist.javax.sip.stack.*;
/**
* Implementation of the ListeningPoint interface
*
* @version 1.2 $Revision: 1.15 $ $Date: 2009/11/19 05:26:58 $
*
* @author M. Ranganathan <br/>
*
*
*
*/
public class ListeningPointImpl implements javax.sip.ListeningPoint, gov.nist.javax.sip.ListeningPointExt {
protected String transport;
/** My port. (same thing as in the message processor) */
int port;
/**
* Pointer to the imbedded mesage processor.
*/
protected MessageProcessor messageProcessor;
/**
* Provider back pointer
*/
protected SipProviderImpl sipProvider;
/**
* Our stack
*/
protected SipStackImpl sipStack;
/**
* Construct a key to refer to this structure from the SIP stack
* @param host host string
* @param port port
* @param transport transport
* @return a string that is used as a key
*/
public static String makeKey(String host, int port, String transport) {
return new StringBuffer(host)
.append(":")
.append(port)
.append("/")
.append(transport)
.toString()
.toLowerCase();
}
/**
* Get the key for this strucut
* @return get the host
*/
protected String getKey() {
return makeKey(this.getIPAddress(), port, transport);
}
/**
* Set the sip provider for this structure.
* @param sipProvider provider to set
*/
protected void setSipProvider(SipProviderImpl sipProviderImpl) {
this.sipProvider = sipProviderImpl;
}
/**
* Remove the sip provider from this listening point.
*/
protected void removeSipProvider() {
this.sipProvider = null;
}
/**
* Constructor
* @param sipStack Our sip stack
*/
protected ListeningPointImpl(
SipStack sipStack,
int port,
String transport) {
this.sipStack = (SipStackImpl) sipStack;
this.port = port;
this.transport = transport;
}
/**
* Clone this listening point. Note that a message Processor is not
* started. The transport is set to null.
* @return cloned listening point.
*/
public Object clone() {
ListeningPointImpl lip =
new ListeningPointImpl(this.sipStack, this.port, null);
lip.sipStack = this.sipStack;
return lip;
}
/**
* Gets the port of the ListeningPoint. The default port of a ListeningPoint
* is dependent on the scheme and transport. For example:
* <ul>
* <li>The default port is 5060 if the transport UDP the scheme is <i>sip:</i>.
* <li>The default port is 5060 if the transport is TCP the scheme is <i>sip:</i>.
* <li>The default port is 5060 if the transport is SCTP the scheme is <i>sip:</i>.
* <li>The default port is 5061 if the transport is TLS over TCP the scheme is <i>sip:</i>.
* <li>The default port is 5061 if the transport is TCP the scheme is <i>sips:</i>.
* </ul>
*
* @return port of ListeningPoint
*/
public int getPort() {
return messageProcessor.getPort();
}
/**
* Gets transport of the ListeningPoint.
*
* @return transport of ListeningPoint
*/
public String getTransport() {
return messageProcessor.getTransport();
}
/**
* Get the provider.
*
* @return the provider.
*/
public SipProviderImpl getProvider() {
return this.sipProvider;
}
/* (non-Javadoc)
* @see javax.sip.ListeningPoint#getIPAddress()
*/
public String getIPAddress() {
return this.messageProcessor.getIpAddress().getHostAddress();
}
/* (non-Javadoc)
* @see javax.sip.ListeningPoint#setSentBy(java.lang.String)
*/
public void setSentBy(String sentBy) throws ParseException {
this.messageProcessor.setSentBy(sentBy);
}
/* (non-Javadoc)
* @see javax.sip.ListeningPoint#getSentBy()
*/
public String getSentBy() {
return this.messageProcessor.getSentBy();
}
public boolean isSentBySet() {
return this.messageProcessor.isSentBySet();
}
public Via getViaHeader() {
return this.messageProcessor.getViaHeader();
}
public MessageProcessor getMessageProcessor() {
return this.messageProcessor;
}
public ContactHeader createContactHeader() {
try {
String ipAddress = this.getIPAddress();
int port = this.getPort();
SipURI sipURI = new SipUri();
sipURI.setHost(ipAddress);
sipURI.setPort(port);
sipURI.setTransportParam(this.transport);
Contact contact = new Contact();
AddressImpl address = new AddressImpl();
address.setURI(sipURI);
contact.setAddress(address);
return contact;
} catch (Exception ex) {
InternalErrorHandler.handleException("Unexpected exception",sipStack.getStackLogger());
return null;
}
}
public void sendHeartbeat(String ipAddress, int port) throws IOException {
HostPort targetHostPort = new HostPort();
targetHostPort.setHost(new Host( ipAddress));
targetHostPort.setPort(port);
MessageChannel messageChannel = this.messageProcessor.createMessageChannel(targetHostPort);
SIPRequest siprequest = new SIPRequest();
siprequest.setNullRequest();
messageChannel.sendMessage(siprequest);
}
public ViaHeader createViaHeader() {
return this.getViaHeader();
}
}