All Downloads are FREE. Search and download functionalities are using the official Maven repository.

test.load.multidialog.Shootme Maven / Gradle / Ivy

package test.load.multidialog;

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.
 * 
 * @author M. Ranganathan
 */

public class Shootme implements SipListener {

	private static AddressFactory addressFactory;

	private static MessageFactory messageFactory;

	private static HeaderFactory headerFactory;

	private static SipStack sipStack;

	private static String myAddress = "127.0.0.1";

	private static int myPort = 5070;

	int numInvite = 0;

	private int terminatedCount;

	private int createdCount;
	
	private HashSet dialogIds;
	
	private HashMap transactionIDs;

	class TTask extends TimerTask {

		RequestEvent requestEvent;

		ServerTransaction st;

		public TTask(RequestEvent requestEvent, ServerTransaction st) {
			this.requestEvent = requestEvent;
			this.st = st;
		}

		public void run() {
			Request request = requestEvent.getRequest();
			try {
				//System.out.println("shootme: got an Invite sending OK");
				Response response = messageFactory.createResponse(180, request);
				ToHeader toHeader = (ToHeader) response
						.getHeader(ToHeader.NAME);
				Address address = addressFactory.createAddress("Shootme ");
				ContactHeader contactHeader = headerFactory
						.createContactHeader(address);
				response.addHeader(contactHeader);

				//System.out.println("got a server tranasaction " + st);
				Dialog dialog = st.getDialog();
				/*
				 * if (dialog != null) { System.out.println("Dialog " + dialog);
				 * System.out.println("Dialog state " + dialog.getState()); }
				 */
				st.sendResponse(response); // send 180(RING)
				response = messageFactory.createResponse(200, request);
				toHeader = (ToHeader) response.getHeader(ToHeader.NAME);
				String toTag = new Integer( (int) (Math.random() * 1000) ).toString();
				toHeader.setTag(toTag); // Application is supposed to set.
				response.addHeader(contactHeader);

				st.sendResponse(response);// send 200(OK)

			} catch (Exception ex) {
				ex.printStackTrace();
				System.exit(0);
			}

		}

	}

	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. Send the bye and complete the call flow.
	 */
	public void processAck(RequestEvent requestEvent,
			ServerTransaction serverTransaction) {
		SipProvider sipProvider = (SipProvider) requestEvent.getSource();
		try {
			// System.out.println("*** shootme: got an ACK "
			// + requestEvent.getRequest());
			if (serverTransaction == null) {
				System.out
						.println("null server transaction -- ignoring the ACK!");
				return;
			}
			Dialog dialog = serverTransaction.getDialog();
			this.createdCount ++;
			System.out.println("Dialog Created = " + dialog.getDialogId() + " createdCount " + this.createdCount + 
					" Dialog State = " + dialog.getState() );
			
			if ( this.dialogIds.contains(dialog.getDialogId())) {
				System.out.println("OOPS ! I already saw " + dialog.getDialogId());
			} else {
				this.dialogIds.add(dialog.getDialogId());
			}
			
			Request byeRequest = dialog.createRequest(Request.BYE);
			ClientTransaction tr = sipProvider
					.getNewClientTransaction(byeRequest);
			// System.out.println("shootme: got an ACK -- sending bye! ");
			dialog.sendRequest(tr);
			
		} catch (Exception ex) {
			ex.printStackTrace();
			System.exit(0);
		}
	}

	/**
	 * Process the invite request.
	 */
	public void processInvite(RequestEvent requestEvent,
			ServerTransaction serverTransaction) {
		try {
			//System.out.println("ProcessInvite");
			Request request = requestEvent.getRequest();
			SipProvider sipProvider = (SipProvider) requestEvent.getSource();
			// Note you need to create the Server Transaction
			// before the listener returns but you can delay sending the response
			
			ServerTransaction st = sipProvider.getNewServerTransaction(request);
			if ( transactionIDs.containsKey(st.getBranchId())) {
				System.out.println("OOOPS -- seen this guy before!! This must be a late guy " + st.getBranchId()
						+ " st = " + transactionIDs.get(st.getBranchId()));
				return;
			} else {
				transactionIDs.put( st.getBranchId(),st);
			}
			
			TTask ttask = new TTask(requestEvent, st);
			int ttime;
			if ((numInvite % 4) == 0)
				ttime = 5000;
			else if ((numInvite % 4) == 1)
				ttime = 1000;
			else
				ttime = 300;
			numInvite++;
			new Timer().schedule(ttask, ttime);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	/**
	 * Process the bye request.
	 */
	public void processBye(RequestEvent requestEvent,
			ServerTransaction serverTransactionId) {
		Request request = requestEvent.getRequest();
		try {
			// System.out.println("shootme: got a bye sending OK.");
			Response response = messageFactory.createResponse(200, request,
					null, null);
			serverTransactionId.sendResponse(response);
			// System.out.println("Dialog State is "
			// + serverTransactionId.getDialog().getState());

		} 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();

		// 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 request = tid.getRequest();
				dialog.sendAck(request);
			}

		} 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" + transaction.getBranchId());
		 */
		
	}

	public void init() {
		this.dialogIds = new HashSet();
		this.transactionIDs = new HashMap();
		SipFactory sipFactory = null;
		sipStack = null;
		sipFactory = SipFactory.getInstance();
		sipFactory.setPathName("gov.nist");
		Properties properties = new Properties();

		properties.setProperty("javax.sip.STACK_NAME", "shootme");
		// 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",
				"shootmedebuglog.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[]) {
		/* pass dynamic parameters in *.bat file(command line) */
		if (args.length >= 1)
			myAddress = args[0];
		if (args.length >= 2)
			myPort = Integer.parseInt(args[1]);

		System.out.println("\n***Address=<" + myAddress + ">, Port=<" + myPort
				+ ">.");
		new Shootme().init();
	}

	public void processIOException(IOExceptionEvent exceptionEvent) {
		System.out.println("IOException event");
	}

	public void processTransactionTerminated(
			TransactionTerminatedEvent transactionTerminatedEvent) {
		//System.out.println("TransactionTerminatedEvent");
	}

	public void processDialogTerminated(
			DialogTerminatedEvent dialogTerminatedEvent) {
		Dialog dialog = dialogTerminatedEvent.getDialog();
		this.terminatedCount++;
		System.out.println("Dialog Terminated Event "  + dialog.getDialogId() + " terminatedCount = " + terminatedCount);
		if ( ! this.dialogIds.contains(dialog.getDialogId())) {
			System.out.println("Saw a terminated event for an unknown dialog id");
		} else {
			this.dialogIds.remove(dialog.getDialogId());
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy