package org.mobicents.servers.media.examples.jsr309; import gov.nist.javax.sip.SipStackImpl; import gov.nist.javax.sip.header.CallID; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Properties; import java.util.TooManyListenersException; import javax.media.mscontrol.MsControlFactory; import javax.sip.DialogTerminatedEvent; import javax.sip.IOExceptionEvent; import javax.sip.InvalidArgumentException; import javax.sip.ListeningPoint; import javax.sip.ProviderDoesNotExistException; import javax.sip.RequestEvent; import javax.sip.ResponseEvent; import javax.sip.SipException; import javax.sip.SipFactory; import javax.sip.SipListener; import javax.sip.SipProvider; import javax.sip.TimeoutEvent; import javax.sip.Transaction; import javax.sip.TransactionTerminatedEvent; import javax.sip.address.AddressFactory; import javax.sip.address.SipURI; import javax.sip.header.CallIdHeader; import javax.sip.header.HeaderFactory; import javax.sip.header.ToHeader; import javax.sip.message.Message; import javax.sip.message.MessageFactory; import javax.sip.message.Request; import org.apache.log4j.Logger; import org.mobicents.servers.media.examples.jsr309.proxies.ann.AnnProxy; import org.mobicents.servers.media.examples.jsr309.proxies.echo.EchoProxy; /** * * @author amit bhayani * */ public class Jsr309Example implements SipListener { private static Logger logger = Logger.getLogger(Jsr309Example.class); private static final String SIP_BIND_ADDRESS = "javax.sip.IP_ADDRESS"; private static final String JSR309_DRIVER = "org.mobicents.Driver_1.0"; private Map<String, CallProxy> callIdToProxy = null; private int port = 9060; private String stackAddress = "0.0.0.0"; private int mgcpServerPort = 2727; private SipStackImpl sipStack = null; private SipFactory sipFactory; private SipProvider sipProvider; private MessageFactory messageFactory = null; private HeaderFactory headerFactory = null; private AddressFactory addressFactory = null; protected MsControlFactory msControlFactory = null; public Jsr309Example() { this.callIdToProxy = new HashMap<String, CallProxy>(); } private void init() throws ProviderDoesNotExistException, SipException, InvalidArgumentException, TooManyListenersException { Properties sipProperties = readSipProperties(); this.sipFactory = SipFactory.getInstance(); this.sipFactory.setPathName("gov.nist"); // hmmm this.sipStack = (SipStackImpl) this.sipFactory.createSipStack(sipProperties); ListeningPoint lp = this.sipStack.createListeningPoint(stackAddress, this.port, "udp"); this.sipProvider = this.sipStack.createSipProvider(lp); this.sipProvider.addSipListener(this); this.messageFactory = this.sipFactory.createMessageFactory(); this.addressFactory = this.sipFactory.createAddressFactory(); this.headerFactory = this.sipFactory.createHeaderFactory(); this.sipStack.start(); logger.info("Sipt stack started: " + lp.getIPAddress() + ":" + lp.getPort()); Properties mgcpProperties = readMGCPProperties(); msControlFactory = javax.media.mscontrol.spi.DriverManager.getFactory(JSR309_DRIVER, mgcpProperties); logger.info("JSR-309 Example started successfully "); } public SipFactory getSipFactory() { return sipFactory; } public SipProvider getSipProvider() { return sipProvider; } public MessageFactory getMessageFactory() { return messageFactory; } public HeaderFactory getHeaderFactory() { return headerFactory; } public AddressFactory getAddressFactory() { return addressFactory; } public MsControlFactory getMsControlFactory() { return this.msControlFactory; } public String getStackAddress() { return this.stackAddress; } public int getPort() { return this.port; } // SIP Listener Impl public void processDialogTerminated(DialogTerminatedEvent dte) { CallProxy cp = getCallProxy(dte.getDialog().getCallId()); if (cp != null) { cp.processDialogTerminated(dte); } else { logger.error("No call proxy for callID: " + dte.getDialog().getCallId().getCallId() + " for timed out dialog"); } } public void processIOException(IOExceptionEvent arg0) { // TODO Auto-generated method stub } public void processRequest(RequestEvent request) { try { CallProxy cp = getCallProxy(request.getRequest()); if (cp == null) { Request r = request.getRequest(); if (r.getMethod().compareTo(Request.INVITE) == 0) { cp = createCallProxy(r); this.addCallProxy(r, cp); } else { logger.warn("No call proxy for callID: " + request.getRequest().getHeader(CallID.NAME) + " for process request."); return; } } if (cp != null) { cp.processRequest(request); } else { logger.error("No call proxy for callID: " + request.getRequest().getHeader(CallID.NAME) + " for process request."); } } catch (Exception e) { e.printStackTrace(); } } public void addCallProxy(Message msg, CallProxy cp) { CallID callIDHeader = (CallID) msg.getHeader(CallID.NAME); this.callIdToProxy.put(callIDHeader.getCallId(), cp); } protected CallProxy getCallProxy(Message msg) { CallID callIDHeader = (CallID) msg.getHeader(CallID.NAME); return this.getCallProxy(callIDHeader); } public CallProxy getCallProxy(CallIdHeader callId) { return this.callIdToProxy.get(callId.getCallId()); } public void removeCallProxy(CallIdHeader msg) { this.callIdToProxy.remove(msg.getCallId()); } private CallProxy createCallProxy(Request r) { String toUser = ((SipURI) ((ToHeader) r.getHeader(ToHeader.NAME)).getAddress().getURI()).getUser(); if (toUser == null) { throw new RuntimeException("User can not be null."); } if (toUser.compareTo("1010") == 0) { return new EchoProxy(this); } else if (toUser.compareTo("1011") == 0) { return new AnnProxy(this); } else if (toUser.compareTo("1012") == 0) { return null; } else if (toUser.compareTo("1013") == 0) { return null; } else { throw new RuntimeException("Unknown user: " + toUser + " ."); } } public void processResponse(ResponseEvent response) { CallProxy cp = getCallProxy(response.getResponse()); if (cp != null) { cp.processResponse(response); } else { logger.error("No call proxy for callID: " + response.getResponse().getHeader(CallID.NAME) + " for process response."); } } public void processTimeout(TimeoutEvent arg0) { // TODO Auto-generated method stub } public void processTransactionTerminated(TransactionTerminatedEvent tte) { Transaction t = null; Message msg = null; if (tte.getClientTransaction() != null) { t = tte.getClientTransaction(); msg = t.getRequest(); } else if (tte.getServerTransaction() != null) { t = tte.getServerTransaction(); msg = t.getRequest(); } else { logger.error("No call proxy for callID: " + msg.getHeader(CallID.NAME) + " for tx timeout."); } } private Properties readSipProperties() { Properties props = new Properties(); try { props.load(this.getClass().getResourceAsStream("sip.properties")); String bindAddress = props.getProperty(SIP_BIND_ADDRESS); if (bindAddress == null) { bindAddress = this.stackAddress; if (bindAddress != null) props.setProperty(SIP_BIND_ADDRESS, bindAddress); } else { this.stackAddress = bindAddress; } } catch (IOException e) { e.printStackTrace(); } return props; } private Properties readMGCPProperties() { Properties props = new Properties(); try { props.load(this.getClass().getResourceAsStream("mgcp.properties")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return props; } public void stop() { this.sipStack.stop(); } /** * @param args */ public static void main(String[] args) { System.out.println("Hurray it started"); Jsr309Example example = new Jsr309Example(); try { example.init(); // SipURI uri = se.getAddressFactory().createSipURI("1010", // "127.0.0.1"); // CSeqHeader cseq = se.getHeaderFactory().createCSeqHeader(1l, // Request.INVITE); // Request r= se.getMessageFactory().createRequest(uri, // Request.INVITE, se.getSipProvider().getNewCallId(),cseq , arg4, // arg5, arg6, arg7, arg8, arg9); Thread.currentThread().sleep(1000 * 10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ProviderDoesNotExistException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SipException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvalidArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (TooManyListenersException e) { // TODO Auto-generated catch block e.printStackTrace(); } example.stop(); } }