package examples.noautodialog; import javax.sip.*; import javax.sip.address.*; import javax.sip.header.*; import javax.sip.message.*; import java.util.*; /** * This class is a UAC template. Shootist is the guy that shoots and shootme is * the guy that gets shot. This illustrates how to go about when you want * explicit control over creation of dialogs. * * @author M. Ranganathan */ public class Shootme implements SipListener { private static AddressFactory addressFactory; private static MessageFactory messageFactory; private static HeaderFactory headerFactory; private static SipStack sipStack; // To run on two machines change these to suit. public static final String myAddress = "127.0.0.1"; private static final int myPort = 5070; protected ServerTransaction inviteTid; protected ClientTransaction clientTid; protected static final String usageString = "java " + "examples.shootist.Shootist \n" + ">>>> is your class path set to the root?"; private static void usage() { System.out.println(usageString); System.exit(0); } public void processRequest(RequestEvent requestEvent) { Request request = requestEvent.getRequest(); ServerTransaction serverTransactionId = requestEvent .getServerTransaction(); System.out.println("\n\nRequest " + request.getMethod() + " received at " + sipStack.getStackName() + " with server transaction id " + serverTransactionId); if (request.getMethod().equals(Request.INVITE)) { processInvite(requestEvent, serverTransactionId); } else if (request.getMethod().equals(Request.ACK)) { processAck(requestEvent, serverTransactionId); } else if (request.getMethod().equals(Request.BYE)) { processBye(requestEvent, serverTransactionId); } } /** * Process the ACK request. */ public void processAck(RequestEvent requestEvent, ServerTransaction serverTransaction) { SipProvider sipProvider = (SipProvider) requestEvent.getSource(); try { System.out.println("shootme: got an ACK " + requestEvent.getRequest()); } catch (Exception ex) { ex.printStackTrace(); System.exit(0); } } /** * Process the invite request. */ public void processInvite(RequestEvent requestEvent, ServerTransaction serverTransaction) { SipProvider sipProvider = (SipProvider) requestEvent.getSource(); Request request = requestEvent.getRequest(); System.out.println("Got an INVITE " + request); try { System.out.println("shootme: got an Invite sending 180 and 200"); //System.out.println("shootme: " + request); Response response = messageFactory.createResponse(180, request); ToHeader toHeader = (ToHeader) response.getHeader(ToHeader.NAME); toHeader.setTag("4321"); // Application is supposed to set. Address address = addressFactory.createAddress("Shootme <sip:" + myAddress + ":" + myPort + ">"); ContactHeader contactHeader = headerFactory .createContactHeader(address); response.addHeader(contactHeader); ServerTransaction st = requestEvent.getServerTransaction(); if (st == null) { st = sipProvider.getNewServerTransaction(request); System.out.println("Server transaction created!" + request); System.out.println("Dialog = " + st.getDialog()); } // Thread.sleep(5000); System.out.println("got a server tranasaction " + st); byte[] content = request.getRawContent(); if (content != null) { System.out.println(" content = " + new String(content)); ContentTypeHeader contentTypeHeader = headerFactory .createContentTypeHeader("application", "sdp"); System.out.println("response = " + response); response.setContent(content, contentTypeHeader); } Dialog dialog = st.getDialog(); System.out.println("Dialog " + dialog); dialog = sipProvider.getNewDialog(st); System.out.println("Dialog " + st.getDialog()); if ( dialog != st.getDialog() ) { throw new RuntimeException("Dialog mismatch "); } response = messageFactory.createResponse(200, request); toHeader = (ToHeader) response.getHeader(ToHeader.NAME); toHeader.setTag("4321"); // Application is supposed to set. response.addHeader(contactHeader); st.sendResponse(response); this.inviteTid = st; } catch (Exception ex) { ex.printStackTrace(); System.exit(0); } } /** * Process the bye request. */ public void processBye(RequestEvent requestEvent, ServerTransaction serverTransactionId) { SipProvider sipProvider = (SipProvider) requestEvent.getSource(); Request request = requestEvent.getRequest(); try { System.out.println("shootme: got a bye sending OK."); Response response = messageFactory.createResponse(200, request); if ( serverTransactionId == null ) { System.out.println("Note that we can create a new tx here!"); serverTransactionId = sipProvider.getNewServerTransaction(request); System.out.println("Creating new server transaction for bye " + serverTransactionId); } // Fire and forget. serverTransactionId.sendResponse(response); System.out.println("We are not creating a dialog for this."); System.out.println("Dialog is " + serverTransactionId.getDialog()); } catch (Exception ex) { ex.printStackTrace(); System.exit(0); } } public void processResponse(ResponseEvent responseReceivedEvent) { System.out.println("Got a response"); Response response = (Response) responseReceivedEvent.getResponse(); Transaction tid = responseReceivedEvent.getClientTransaction(); CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME); System.out.println("Response received with client transaction id " + tid + ":\n" + response); try { if (response.getStatusCode() == Response.OK && ((CSeqHeader) response.getHeader(CSeqHeader.NAME)) .getMethod().equals(Request.INVITE)) { Dialog dialog = tid.getDialog(); Request ackRequest = dialog.createAck( cseq.getSeqNumber() ); dialog.sendAck(ackRequest); } Dialog dialog = tid.getDialog(); System.out.println("Dalog State = " + dialog.getState()); } catch (Exception ex) { ex.printStackTrace(); System.exit(0); } } public void processTimeout(javax.sip.TimeoutEvent timeoutEvent) { Transaction transaction; if (timeoutEvent.isServerTransaction()) { transaction = timeoutEvent.getServerTransaction(); } else { transaction = timeoutEvent.getClientTransaction(); } System.out.println("state = " + transaction.getState()); System.out.println("dialog = " + transaction.getDialog()); System.out.println("dialogState = " + transaction.getDialog().getState()); System.out.println("Transaction Time out"); } public void init() { SipFactory sipFactory = null; sipStack = null; sipFactory = SipFactory.getInstance(); sipFactory.setPathName("gov.nist"); Properties properties = new Properties(); properties.setProperty("javax.sip.STACK_NAME", "shootme"); // Note that this turns off automatic dialog creation. This // mode of operaton is good for proxy servers. properties.setProperty("javax.sip.AUTOMATIC_DIALOG_SUPPORT", "off"); // You need 16 for logging traces. 32 for debug + traces. // Your code will limp at 32 but it is best for debugging. properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "32"); properties.setProperty("gov.nist.javax.sip.DEBUG_LOG", "shootmedebug.txt"); properties.setProperty("gov.nist.javax.sip.SERVER_LOG", "shootmelog.txt"); // Guard against starvation. properties.setProperty("gov.nist.javax.sip.READ_TIMEOUT", "1000"); // properties.setProperty("gov.nist.javax.sip.MAX_MESSAGE_SIZE", // "4096"); properties.setProperty("gov.nist.javax.sip.CACHE_SERVER_CONNECTIONS", "false"); try { // Create SipStack object sipStack = sipFactory.createSipStack(properties); System.out.println("sipStack = " + sipStack); } catch (PeerUnavailableException e) { // could not find // gov.nist.jain.protocol.ip.sip.SipStackImpl // in the classpath e.printStackTrace(); System.err.println(e.getMessage()); if (e.getCause() != null) e.getCause().printStackTrace(); System.exit(0); } try { headerFactory = sipFactory.createHeaderFactory(); addressFactory = sipFactory.createAddressFactory(); messageFactory = sipFactory.createMessageFactory(); ListeningPoint lp = sipStack.createListeningPoint(myAddress,5070, "udp"); ListeningPoint lp1 = sipStack.createListeningPoint(myAddress,5070, "tcp"); Shootme listener = this; SipProvider sipProvider = sipStack.createSipProvider(lp); System.out.println("udp provider " + sipProvider); sipProvider.addSipListener(listener); sipProvider = sipStack.createSipProvider(lp1); System.out.println("tcp provider " + sipProvider); sipProvider.addSipListener(listener); } catch (Exception ex) { System.out.println(ex.getMessage()); ex.printStackTrace(); usage(); } } public static void main(String args[]) { new Shootme().init(); } /* * (non-Javadoc) * * @see javax.sip.SipListener#processIOException(javax.sip.IOExceptionEvent) */ public void processIOException(IOExceptionEvent exceptionEvent) { System.out.println("An IO Exception was detected : " + exceptionEvent.getHost()); } /* * (non-Javadoc) * * @see javax.sip.SipListener#processTransactionTerminated(javax.sip.TransactionTerminatedEvent) */ public void processTransactionTerminated( TransactionTerminatedEvent transactionTerminatedEvent) { System.out.println("Tx terminated event "); } /* * (non-Javadoc) * * @see javax.sip.SipListener#processDialogTerminated(javax.sip.DialogTerminatedEvent) */ public void processDialogTerminated( DialogTerminatedEvent dialogTerminatedEvent) { System.out.println("Dialog terminated event detected "); } }