messengerrouter.java

来自「是一个用java实现的」· Java 代码 · 共 120 行

JAVA
120
字号
/*******************************************************************************
 * Product of NIST/ITL Advanced Networking Technologies Division (ANTD).       *
 ******************************************************************************/
package gov.nist.applet.phone.ua.router;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.ListIterator;

import javax.sip.ListeningPoint;
import javax.sip.SipStack;
import javax.sip.address.Hop;
import javax.sip.address.Router;
import javax.sip.message.Request;


/** 
 * This is the router of the application. When the implementation wants to forward
 * a request and  had run out of othe options, then it calls this method
 * to figure out where to send the request. The default router implements
 * a simple "default routing algorithm" which just forwards to the configured
 * proxy address. Use this for UAC/UAS implementations and use the GatewayRouter
 * for proxies.
 *
 * @version  JAIN-SIP-1.1 $Revision: 1.5 $ $Date: 2004/04/19 18:10:38 $
 *
 * @author M. Ranganathan <mranga@nist.gov>  <br/>
 *
 * <a href="{@docRoot}/uncopyright.html">This code is in the public domain.</a>
 *
 */
public class MessengerRouter implements Router {

	protected SipStack sipStack;
	protected MessengerHop defaultRoute;
	private   boolean checked;
	private   boolean localLoopDetected;

	/**
	 * Constructor.
	 */
	public MessengerRouter(SipStack sipStack, String defaultRoute) {
		this.sipStack =  sipStack;
		if (defaultRoute != null) {
			this.defaultRoute = new MessengerHop(defaultRoute);
		}
	}

	/**
	 *  Return true if I have a listener listening here.
	 */
	private boolean hopsBackToMe(String host, int port) {
		Iterator it =sipStack.getListeningPoints();
		while (it.hasNext()) {
			ListeningPoint lp = (ListeningPoint) it.next();
			if ( sipStack.getIPAddress().equalsIgnoreCase(host)
				&& lp.getPort() == port)
				return true;
		}
		return false;

	}

	/**
	 * Return  addresses for default proxy to forward the request to.
	 * The list is organized in the following priority.
	 * If the requestURI refers directly to a host, the host and port
	 * information are extracted from it and made the next hop on the
	 * list.
	 * If the default route has been specified, then it is used
	 * to construct the next element of the list.
	 * Bug reported by Will Scullin -- maddr was being ignored when
	 * routing requests. Bug reported by Antonis Karydas - the RequestURI can
	 * be a non-sip URI.
	 *
	 * @param request is the sip request to route.
	 *
	 */
	public ListIterator getNextHops(Request request) {		

		LinkedList ll = null;

		if (! checked) {
			checked = true;
			if ( defaultRoute != null) {
				localLoopDetected = hopsBackToMe(defaultRoute.getHost(), defaultRoute.getPort());
			}
		}

		if (defaultRoute != null   && !localLoopDetected ) {
			ll = new LinkedList();
			ll.add(defaultRoute);			
		}

		return ll == null ? null : ll.listIterator();

	}

	/** 
	 * Get the default hop.
	 * 
	 * @return defaultRoute is the default route.
	 * public java.util.Iterator getDefaultRoute(Request request)
	 * { return this.getNextHops((SIPRequest)request); }
	 */

	public javax.sip.address.Hop getOutboundProxy() {
		return this.defaultRoute;
	}

	/** 
	 * Get the default route (does the same thing as getOutboundProxy).
	 *
	 * @return the default route.
	 */
	public Hop getDefaultRoute() {
		return this.defaultRoute;
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?