/* * Copyright (C) 2005-2008 Jive Software. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jivesoftware.openfire.sip.tester.stack; import org.jivesoftware.openfire.sip.tester.Log; import javax.sip.SipStack; import javax.sip.address.Hop; import javax.sip.address.Router; import javax.sip.address.SipURI; import javax.sip.address.URI; import javax.sip.header.RouteHeader; import javax.sip.message.Request; import java.util.LinkedList; import java.util.ListIterator; /** * <p/> * Title: SIP COMMUNICATOR * </p> * <p/> * Description:JAIN-SIP Audio/Video phone application * </p> * <p/> * Copyright: Copyright (c) 2003 * </p> * <p/> * Organisation: LSIIT laboratory (http://lsiit.u-strasbg.fr) * </p> * <p/> * Network Research Team (http://www-r2.u-strasbg.fr)) * </p> * <p/> * Louis Pasteur University - Strasbourg - France * </p> * * @author Emil Ivov (http://www.emcho.com) * @version 1.1 */ public class SipCommRouter implements Router { protected SipStack myStack; protected SipCommHop outboundProxy = null; protected Router stackRouter = null; public SipCommRouter(SipStack sipStack, String outboundProxy) { outboundProxy = SIPConfig.getOutboundProxy(); this.myStack = sipStack; if (outboundProxy != null && outboundProxy.length() > 0) { this.outboundProxy = new SipCommHop(outboundProxy); } } /** * Return the default address to forward the request to. The list is * organized in the following priority. * <p/> * If the outboung proxy has been specified, then it is used to construct * the first element of the list. * <p/> * 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. * * @param sipRequest is the sip request to route. */ public ListIterator<Hop> getNextHops(Request sipRequest) { URI requestURI = sipRequest.getRequestURI(); if (requestURI == null) { throw new IllegalArgumentException("Bad message: Null requestURI"); } LinkedList<Hop> hops = new LinkedList<Hop>(); if (outboundProxy != null) { hops.add(outboundProxy); } ListIterator routes = sipRequest.getHeaders(RouteHeader.NAME); if (routes != null && routes.hasNext()) { while (routes.hasNext()) { RouteHeader route = (RouteHeader)routes.next(); SipURI uri = (SipURI)route.getAddress().getURI(); int port = uri.getPort(); port = (port == -1) ? 5060 : port; String host = uri.getHost(); Log.debug("getNextHops", host); String transport = uri.getTransportParam(); if (transport == null) { transport = "udp"; } Hop hop = new SipCommHop(host + ':' + port + '/' + transport); hops.add(hop); } } else if (requestURI instanceof SipURI && ((SipURI)requestURI).getMAddrParam() != null) { SipURI sipURI = ((SipURI)requestURI); String maddr = sipURI.getMAddrParam(); String transport = sipURI.getTransportParam(); if (transport == null) { transport = "udp"; } int port = 5060; Hop hop = new SipCommHop(maddr, port, transport); hops.add(hop); } else if (requestURI instanceof SipURI) { SipURI sipURI = ((SipURI)requestURI); int port = sipURI.getPort(); if (port == -1) { port = 5060; } String host = sipURI.getHost(); String transport = sipURI.getTransportParam(); if (transport == null) { transport = "UDP"; } Hop hop = new SipCommHop(host + ":" + port + "/" + transport); hops.add(hop); } else { throw new IllegalArgumentException("Malformed requestURI"); } return (hops.size() == 0) ? null : hops.listIterator(); } /** * @return Returns the outboundProxy. */ public Hop getOutboundProxy() { return this.outboundProxy; } protected void setOutboundProxy(String proxy) { if (SIPConfig.getOutboundProxy() != null && SIPConfig.getOutboundProxy().length() > 0) { this.outboundProxy = new SipCommHop(proxy); } } }