/* * JBoss, Home of Professional Open Source * Copyright 2011, Red Hat, Inc. and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ /* * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.mobicents.tools.sip.balancer; import gov.nist.javax.sip.address.SipUri; import gov.nist.javax.sip.header.HeaderFactoryExt; import gov.nist.javax.sip.header.SIPETag; import gov.nist.javax.sip.header.extensions.JoinHeader; import gov.nist.javax.sip.header.extensions.ReplacesHeader; import java.text.ParseException; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.atomic.AtomicInteger; import javax.sip.ClientTransaction; import javax.sip.Dialog; import javax.sip.DialogTerminatedEvent; import javax.sip.IOExceptionEvent; import javax.sip.InvalidArgumentException; import javax.sip.ListeningPoint; import javax.sip.RequestEvent; import javax.sip.ResponseEvent; import javax.sip.ServerTransaction; import javax.sip.SipException; import javax.sip.SipListener; import javax.sip.SipProvider; import javax.sip.TransactionDoesNotExistException; import javax.sip.TransactionTerminatedEvent; import javax.sip.TransactionUnavailableException; import javax.sip.address.Address; import javax.sip.address.SipURI; import javax.sip.address.TelURL; import javax.sip.address.URI; import javax.sip.header.AuthorizationHeader; import javax.sip.header.CSeqHeader; import javax.sip.header.CallIdHeader; import javax.sip.header.ContactHeader; import javax.sip.header.ContentLengthHeader; import javax.sip.header.ContentTypeHeader; import javax.sip.header.EventHeader; import javax.sip.header.ExpiresHeader; import javax.sip.header.ExtensionHeader; import javax.sip.header.FromHeader; import javax.sip.header.Header; import javax.sip.header.HeaderFactory; import javax.sip.header.MaxForwardsHeader; import javax.sip.header.ProxyAuthenticateHeader; import javax.sip.header.ProxyAuthorizationHeader; import javax.sip.header.ReasonHeader; import javax.sip.header.RecordRouteHeader; import javax.sip.header.ReferToHeader; import javax.sip.header.RequireHeader; import javax.sip.header.RouteHeader; import javax.sip.header.SIPETagHeader; import javax.sip.header.SIPIfMatchHeader; import javax.sip.header.SubscriptionStateHeader; import javax.sip.header.ToHeader; import javax.sip.header.ViaHeader; import javax.sip.message.Request; import javax.sip.message.Response; import org.apache.log4j.Logger; /** * 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 TestSipListener implements SipListener { public EventListener eventListener = new EventListener() { @Override public void uasAfterResponse(int statusCode, AppServer source) { // TODO Auto-generated method stub } @Override public void uasAfterRequestReceived(String method, AppServer source) { // TODO Auto-generated method stub } @Override public void uacAfterRequestSent(String method, AppServer source) { // TODO Auto-generated method stub } @Override public void uacAfterResponse(int statusCode, AppServer source) { // TODO Auto-generated method stub } }; public AppServer appServer; private static final String TO_TAG = "5432"; private static final String PLAIN_UTF8_CONTENT_SUBTYPE = "plain;charset=UTF-8"; private static final String TEXT_CONTENT_TYPE = "text"; private static final String PIDF_XML_SUBTYPE = "pidf+xml"; private static final String APPLICATION_CONTENT_TYPE = "application"; private boolean sendBye; private boolean sendJoinMessage; private boolean sendReplacesMessage; private boolean sendByeBeforeTerminatingNotify; private boolean sendByeAfterTerminatingNotify; private SipProvider sipProvider; private ProtocolObjects protocolObjects; private ContactHeader contactHeader; private ListeningPoint listeningPoint; private ClientTransaction inviteClientTid; private ServerTransaction inviteServerTid; private Dialog dialog; private Dialog joinDialog; private Dialog replacesDialog; public int myPort; private int peerPort; private String peerHostPort; private int dialogCount; public int getDialogCount() { return dialogCount; } private boolean cancelReceived; private boolean cancelOkReceived; private boolean ackSent; private boolean ackReceived; private boolean requestTerminatedReceived; private boolean byeReceived; private boolean joinRequestReceived; private boolean replacesRequestReceived; private boolean okToByeReceived; private boolean authenticationErrorReceived; private URI requestURI; private Request inviteRequest; private Request messageRequest; private Response finalResponse; private Response informationalResponse; private boolean waitForCancel; private String lastMessageContent; private List<String> allMessagesContent; private List<String> allSubscriptionStates; private boolean finalResponseReceived; private int finalResponseToSend = -1; public int ackCount = 0; public int notifyCount = 0; public int numberOf491s = 0; private List<Integer> provisionalResponsesToSend; private boolean useToURIasRequestUri; private boolean sendUpdateOn180; private String publishEvent = "reg"; private String sipETag; private String publishContentMessage; private boolean referReceived; private static Logger logger = Logger.getLogger(TestSipListener.class); private long timeToWaitBetweenProvisionnalResponse = 1000; private long timeToWaitBetweenSubsNotify = 1000; private boolean byeSent; private boolean serverErrorReceived; private long lastInfoResponseTime = -1; private Integer respondWithError = null; private long lastRegisterCSeqNumber = -1; private int finalResponseStatus; private boolean inviteReceived; private boolean sendReinvite; private boolean reinviteSent; private boolean abortProcessing; private boolean recordRoutingProxyTesting; public boolean b2buamessagereceived; public boolean txTimeoutReceived; private boolean sendSubsequentRequestsThroughSipProvider; private boolean testAckViaParam; private Request byeRequestReceived; private Request registerReceived; private long timeToWaitBeforeBye = 1000; private long timeToWaitBeforeAck = 0; private boolean sendAck = true; private boolean prackSent; private boolean prackReceived; private Request prackRequestReceived; private boolean okToPrackReceived; private AtomicInteger rseqNumber = new AtomicInteger(1); public boolean sendByeInNewThread = false; private boolean useDefaultRoute = true; private boolean setTransport=true; private boolean serviceUnavailableReceived = false; private int referResponseToSend = 202; private boolean sendNotifyForRefer = true; private Response inviteOkResponse; private boolean sendNotify = true; private boolean countRetrans = false; private int nbRetrans = 0; public Request firstRequest; public Request lastInvite; private boolean isIpv6 = false; class MyEventSource implements Runnable { private TestSipListener notifier; private EventHeader eventHeader; public MyEventSource(TestSipListener notifier, EventHeader eventHeader ) { this.notifier = notifier; this.eventHeader = eventHeader; } public void run() { try { for (int i = 0; i < 1; i++) { Thread.sleep(timeToWaitBetweenSubsNotify); Request request = this.notifier.dialog.createRequest(Request.NOTIFY); SubscriptionStateHeader subscriptionState = protocolObjects.headerFactory .createSubscriptionStateHeader(SubscriptionStateHeader.ACTIVE); request.addHeader(subscriptionState); request.addHeader(eventHeader); allSubscriptionStates.add(subscriptionState.getState().toLowerCase()); // Lets mark our Contact // ((SipURI)dialog.getLocalParty().getURI()).setParameter("id","not2"); ClientTransaction ct = sipProvider.getNewClientTransaction(request); logger.info("NOTIFY Branch ID " + ((ViaHeader)request.getHeader(ViaHeader.NAME)).getParameter("branch")); this.notifier.dialog.sendRequest(ct); logger.info("Dialog " + dialog); logger.info("Dialog state after active NOTIFY: " + dialog.getState()); if(sendByeBeforeTerminatingNotify && !byeSent) { sendBye(); } } } catch (Throwable ex) { logger.info(ex.getMessage(), ex); } } } public void processRequest(RequestEvent requestReceivedEvent) { if(abortProcessing) { logger.error("Processing aborted"); return ; } Request request = requestReceivedEvent.getRequest(); eventListener.uasAfterRequestReceived(request.getMethod(), appServer); if(firstRequest == null) firstRequest = request; ServerTransaction serverTransactionId = requestReceivedEvent .getServerTransaction(); logger.info("\n\nRequest " + request.getMethod() + " received at " + protocolObjects.sipStack.getStackName() + " with server transaction id " + serverTransactionId + " dialog " + requestReceivedEvent.getDialog()); if (request.getMethod().equals(Request.INVITE)) { processInvite(requestReceivedEvent, serverTransactionId); } if (request.getMethod().equals(Request.BYE)) { processBye(request, serverTransactionId); } if (request.getMethod().equals(Request.ACK)) { processAck(request, serverTransactionId); } if (request.getMethod().equals(Request.PRACK)) { processPrack(request, serverTransactionId); } if (request.getMethod().equals(Request.CANCEL)) { processCancel(requestReceivedEvent, serverTransactionId); } if (request.getMethod().equals(Request.MESSAGE)) { processMessage(request, serverTransactionId); } if (request.getMethod().equals(Request.REGISTER)) { processRegister(request, serverTransactionId); } if (request.getMethod().equals(Request.NOTIFY)) { processNotify(requestReceivedEvent, serverTransactionId); } if (request.getMethod().equals(Request.SUBSCRIBE)) { processSubscribe(requestReceivedEvent, serverTransactionId); } if (request.getMethod().equals(Request.UPDATE)) { processUpdate(request, serverTransactionId); } if (request.getMethod().equals(Request.PUBLISH)) { processPublish(requestReceivedEvent, serverTransactionId); } if (request.getMethod().equals(Request.REFER)) { processRefer(requestReceivedEvent, serverTransactionId); } } private void processPrack(Request request, ServerTransaction serverTransactionId) { try { prackReceived = true; prackRequestReceived = request; ServerTransaction st = serverTransactionId; if (st == null) { st = sipProvider.getNewServerTransaction(request); } Response response = protocolObjects.messageFactory.createResponse( 200, request); st.sendResponse(response); Thread.sleep(200); inviteServerTid.sendResponse(getFinalResponse()); } catch(Exception e) { logger.error("Unexpected exception while trying to send the 200 to PRACK " + request, e); } } public void processRefer(RequestEvent requestEvent, ServerTransaction serverTransactionId) { try { SipProvider sipProvider = (SipProvider) requestEvent.getSource(); Request request = requestEvent.getRequest(); logger.info("shootist: got a refer . ServerTxId = " + serverTransactionId); ServerTransaction st = requestEvent.getServerTransaction(); if (st == null) { st = sipProvider.getNewServerTransaction(request); } inviteServerTid = st; Dialog dialog = st.getDialog(); this.dialogCount ++; this.dialog = dialog; logger.info("Shootme: dialog = " + dialog); Response response = protocolObjects.messageFactory.createResponse( referResponseToSend, request); sipETag = Integer.toString(new Random().nextInt(10000000)); st.sendResponse(response); logger.info("shootist: Sending " + referResponseToSend); List<Header> headers = new ArrayList<Header>(); EventHeader eventHeader = (EventHeader) protocolObjects.headerFactory.createHeader(EventHeader.NAME, "Refer"); headers.add(eventHeader); if(sendNotifyForRefer) { if(!referReceived) { referReceived = true; SubscriptionStateHeader subscriptionStateHeader = (SubscriptionStateHeader) protocolObjects.headerFactory.createHeader(SubscriptionStateHeader.NAME, "active;expires=3600"); headers.add(subscriptionStateHeader); allMessagesContent.add("SIP/2.0 100 Trying"); sendInDialogSipRequest(Request.NOTIFY, "SIP/2.0 100 Trying", "message", "sipfrag;version=2.0", headers, null); Thread.sleep(1000); headers.remove(subscriptionStateHeader); subscriptionStateHeader = (SubscriptionStateHeader) protocolObjects.headerFactory.createHeader(SubscriptionStateHeader.NAME, "terminated;reason=noresource"); headers.add(subscriptionStateHeader); if(inviteRequest == null) { ExtensionHeader extensionHeader = (ExtensionHeader) protocolObjects.headerFactory.createHeader("Out-Of-Dialog", "true"); headers.add(extensionHeader); } allMessagesContent.add("SIP/2.0 200 OK"); sendInDialogSipRequest(Request.NOTIFY, "SIP/2.0 200 OK", "message", "sipfrag;version=2.0", headers, null); } else { SubscriptionStateHeader subscriptionStateHeader = (SubscriptionStateHeader) protocolObjects.headerFactory.createHeader(SubscriptionStateHeader.NAME, "active;expires=3600"); headers.add(subscriptionStateHeader); sendInDialogSipRequest(Request.NOTIFY, "SIP/2.0 100 Subsequent", "message", "sipfrag;version=2.0", headers, null); } } } catch (Exception ex) { ex.printStackTrace(); } } private void processPublish(RequestEvent requestEvent, ServerTransaction serverTransactionId) { try { SipProvider sipProvider = (SipProvider) requestEvent.getSource(); Request request = requestEvent.getRequest(); logger.info("shootist: got a publish . ServerTxId = " + serverTransactionId); ServerTransaction st = requestEvent.getServerTransaction(); if (st == null) { st = sipProvider.getNewServerTransaction(request); } inviteServerTid = st; Dialog dialog = st.getDialog(); this.dialogCount ++; this.dialog = dialog; logger.info("Shootme: dialog = " + dialog); if(request.getRawContent() != null) { this.lastMessageContent = new String(request.getRawContent()); allMessagesContent.add(new String(lastMessageContent)); } SIPIfMatchHeader sipIfMatchHeader = (SIPIfMatchHeader) request.getHeader(SIPIfMatchHeader.NAME); boolean sipIfMatchFound = true; if(sipIfMatchHeader!= null && sipIfMatchHeader.getETag() != null && !sipIfMatchHeader.getETag().equals(sipETag)) { sipIfMatchFound = false; } if(sipIfMatchFound) { Response response = protocolObjects.messageFactory.createResponse( 200, request); sipETag = Integer.toString(new Random().nextInt(10000000)); SIPETagHeader sipTagHeader = protocolObjects.headerFactory.createSIPETagHeader(sipETag); response.addHeader(sipTagHeader); response.addHeader(request.getHeader(ExpiresHeader.NAME)); st.sendResponse(response); logger.info("shootist: Sending OK."); } else { Response response = protocolObjects.messageFactory.createResponse( 500, request); serverTransactionId.sendResponse(response); } } catch (Exception ex) { ex.printStackTrace(); } } public void processUpdate(Request request, ServerTransaction serverTransactionId) { try { logger.info("shootist: got a update. ServerTxId = " + serverTransactionId); this.byeReceived = true; if (serverTransactionId == null) { logger.info("shootist: null TID."); return; } Dialog dialog = serverTransactionId.getDialog(); logger.info("Dialog State = " + dialog.getState()); Response response = protocolObjects.messageFactory.createResponse( 200, request); serverTransactionId.sendResponse(response); logger.info("shootist: Sending OK."); logger.info("Dialog State = " + dialog.getState()); } catch (Exception ex) { ex.printStackTrace(); } } /** * Process the invite request. */ public void processSubscribe(RequestEvent requestEvent, ServerTransaction serverTransaction) { SipProvider sipProvider = (SipProvider) requestEvent.getSource(); Request request = requestEvent.getRequest(); try { logger.info("notifier: got an Subscribe sending OK"); logger.info("notifier: " + request); logger.info("notifier : dialog = " + requestEvent.getDialog()); EventHeader eventHeader = (EventHeader) request.getHeader(EventHeader.NAME); // this.gotSubscribeRequest = true; // Always create a ServerTransaction, best as early as possible in the code Response response = null; ServerTransaction st = requestEvent.getServerTransaction(); if (st == null) { st = sipProvider.getNewServerTransaction(request); } // Check if it is an initial SUBSCRIBE or a refresh / unsubscribe boolean isInitial = requestEvent.getDialog() == null; if ( isInitial ) { // JvB: need random tags to test forking String toTag = Integer.toHexString( (int) (Math.random() * Integer.MAX_VALUE) ); response = protocolObjects.messageFactory.createResponse(202, request); ToHeader toHeader = (ToHeader) response.getHeader(ToHeader.NAME); // Sanity check: to header should not ahve a tag. Else the dialog // should have matched toHeader.setTag(toTag); // Application is supposed to set. this.dialog = st.getDialog(); // subscribe dialogs do not terminate on bye. this.dialog.terminateOnBye(false); } else { response = protocolObjects.messageFactory.createResponse(202, request); this.dialog = st.getDialog(); // subscribe dialogs do not terminate on bye. this.dialog.terminateOnBye(false); } // Both 2xx response to SUBSCRIBE and NOTIFY need a Contact Address address = null; if(!isIpv6) address = protocolObjects.addressFactory.createAddress("Notifier <sip:127.0.0.1>"); else address = protocolObjects.addressFactory.createAddress("Notifier <sip:[::1]>"); ((SipURI)address.getURI()).setPort( sipProvider.getListeningPoint(ListeningPoint.UDP).getPort() ); ContactHeader contactHeader = protocolObjects.headerFactory.createContactHeader(address); response.addHeader(contactHeader); // Expires header is mandatory in 2xx responses to SUBSCRIBE ExpiresHeader expires = (ExpiresHeader) request.getHeader( ExpiresHeader.NAME ); if (expires==null) { expires = protocolObjects.headerFactory.createExpiresHeader(30); // rather short } response.addHeader( expires ); /* * JvB: The SUBSCRIBE MUST be answered first. See RFC3265 3.1.6.2: * "[...] a NOTIFY message is always sent immediately after any 200- * class response to a SUBSCRIBE request" * * Do this before creating the NOTIFY request below */ st.sendResponse(response); //Thread.sleep(1000); // Be kind to implementations /* * NOTIFY requests MUST contain a "Subscription-State" header with a * value of "active", "pending", or "terminated". The "active" value * indicates that the subscription has been accepted and has been * authorized (in most cases; see section 5.2.). The "pending" value * indicates that the subscription has been received, but that * policy information is insufficient to accept or deny the * subscription at this time. The "terminated" value indicates that * the subscription is not active. */ if(sendNotify ) { Request notifyRequest = dialog.createRequest( "NOTIFY" ); // Mark the contact header, to check that the remote contact is updated // ((SipURI)contactHeader.getAddress().getURI()).setParameter("id","not"); // Initial state is pending, second time we assume terminated (Expires==0) SubscriptionStateHeader sstate = protocolObjects.headerFactory.createSubscriptionStateHeader( expires.getExpires() != 0 ? SubscriptionStateHeader.PENDING : SubscriptionStateHeader.TERMINATED ); allSubscriptionStates.add(sstate.getState().toLowerCase()); // Need a reason for terminated if ( sstate.getState().equalsIgnoreCase("terminated") ) { sstate.setReasonCode( "deactivated" ); } notifyRequest.addHeader(sstate); notifyRequest.setHeader(eventHeader); notifyRequest.setHeader(contactHeader); // notifyRequest.setHeader(routeHeader); ClientTransaction ct = sipProvider.getNewClientTransaction(notifyRequest); if(sstate.getState().equals(SubscriptionStateHeader.TERMINATED)) { Thread.sleep(timeToWaitBetweenSubsNotify); } // Let the other side know that the tx is pending acceptance // dialog.sendRequest(ct); logger.info("NOTIFY Branch ID " + ((ViaHeader)request.getHeader(ViaHeader.NAME)).getParameter("branch")); logger.info("Dialog " + dialog); logger.info("Dialog state after pending NOTIFY: " + dialog.getState()); if (expires.getExpires() != 0) { Thread myEventSource = new Thread(new MyEventSource(this,eventHeader)); myEventSource.start(); } } } catch (Throwable ex) { logger.info(ex.getMessage(), ex); } } public void processNotify(RequestEvent requestEvent, ServerTransaction serverTransactionId) { SipProvider provider = (SipProvider) requestEvent.getSource(); Request notify = requestEvent.getRequest(); try { logger.info("subscriber: got a notify count " + this.notifyCount++ ); if (serverTransactionId == null) { logger.info("subscriber: null TID."); serverTransactionId = provider.getNewServerTransaction(notify); } Dialog dialog = serverTransactionId.getDialog(); // if ( dialog != subscriberDialog ) { // if (forkedDialog == null) { // forkedDialog = dialog; // } else { // AbstractSubsnotifyTestCase.assertTrue("Dialog should be either the subscriber dialog ", // forkedDialog == dialog); // } // } // // this.dialogs.add(dialog); logger.info("Dialog State = " + dialog.getState()); Response response = protocolObjects.messageFactory.createResponse(200, notify); // SHOULD add a Contact ContactHeader contact = (ContactHeader) contactHeader.clone(); ((SipURI)contact.getAddress().getURI()).setParameter( "id", "sub" ); response.addHeader( contact ); logger.info("Transaction State = " + serverTransactionId.getState()); serverTransactionId.sendResponse(response); logger.info("Dialog State = " + dialog.getState()); SubscriptionStateHeader subscriptionState = (SubscriptionStateHeader) notify .getHeader(SubscriptionStateHeader.NAME); // Subscription is terminated? String state = subscriptionState.getState(); allSubscriptionStates.add(state.toLowerCase()); if(notify.getRawContent() != null) { this.lastMessageContent = new String(notify.getRawContent()); allMessagesContent.add(new String(lastMessageContent)); } if (state.equalsIgnoreCase(SubscriptionStateHeader.TERMINATED)) { if(subscriptionState.getReasonCode() == null) { dialog.delete(); } } else if (state.equalsIgnoreCase(SubscriptionStateHeader.ACTIVE)) { if("reg".equalsIgnoreCase(((EventHeader)notify.getHeader(EventHeader.NAME)).getEventType())) { if(sendByeBeforeTerminatingNotify) { dialog.terminateOnBye(false); sendBye(); Thread.sleep(1000); } logger.info("Subscriber: sending unSUBSCRIBE"); // Else we end it ourselves Request unsubscribe = dialog.createRequest(Request.SUBSCRIBE); logger.info( "dialog created:" + unsubscribe ); // SHOULD add a Contact (done by dialog), lets mark it to test updates // ((SipURI) dialog.getLocalParty().getURI()).setParameter( "id", "unsub" ); ExpiresHeader expires = protocolObjects.headerFactory.createExpiresHeader(0); unsubscribe.addHeader(expires); // JvB note : stack should do this! unsubscribe.addHeader(notify.getHeader(EventHeader.NAME)); // copy // event // header logger.info("Sending Unsubscribe : " + unsubscribe); logger.info("unsubscribe dialog " + dialog); ClientTransaction ct = sipProvider.getNewClientTransaction(unsubscribe); dialog.sendRequest(ct); if(sendByeAfterTerminatingNotify) { Thread.sleep(1000); sendBye(); } } else if(sendByeBeforeTerminatingNotify) { sendBye(); } } else { logger.info("Subscriber: state now " + state);// pending } } catch (Exception ex) { logger.error("Unexpected exception",ex); } } private void processMessage(Request request, ServerTransaction serverTransactionId) { if(request.toString().contains("408 received")) { txTimeoutReceived = true; } ServerTransaction serverTransaction = null; messageRequest = request; try { serverTransaction = (serverTransactionId == null? sipProvider.getNewServerTransaction(request): serverTransactionId); } catch (javax.sip.TransactionAlreadyExistsException ex) { ex.printStackTrace(); return; } catch (javax.sip.TransactionUnavailableException ex1) { ex1.printStackTrace(); return; } ContentTypeHeader contentTypeHeader = (ContentTypeHeader) request.getHeader(ContentTypeHeader.NAME); boolean sendInvitewithJoin = false; boolean sendInvitewithReplaces = false; if(contentTypeHeader != null) { if(TEXT_CONTENT_TYPE.equals(contentTypeHeader.getContentType())) { this.lastMessageContent = new String(request.getRawContent()); allMessagesContent.add(new String(lastMessageContent)); if(lastMessageContent.indexOf("Join : ") != -1) { this.lastMessageContent = lastMessageContent.substring("Join : ".length()); sendInvitewithJoin = true; } if(lastMessageContent.indexOf("Replaces : ") != -1) { this.lastMessageContent = lastMessageContent.substring("Replaces : ".length()); sendInvitewithReplaces = true; } } } else { if(request.getHeader("From").toString().contains("b2bua@sip-servlets")) b2buamessagereceived = true; } try { Response okResponse = protocolObjects.messageFactory.createResponse( Response.OK, request); ToHeader toHeader = (ToHeader) okResponse.getHeader(ToHeader.NAME); if (toHeader.getTag() == null) { toHeader.setTag(Integer.toString(new Random().nextInt(10000000))); } // okResponse.addHeader(contactHeader); serverTransaction.sendResponse(okResponse); } catch (Exception ex) { ex.printStackTrace(); logger.error("error sending OK response to message", ex); } if(sendInvitewithJoin) { try { String fromUser = "receiver"; String fromHost = "sip-servlets.com"; SipURI fromAddress = protocolObjects.addressFactory.createSipURI( fromUser, fromHost); String toUser = "join-receiver"; String toHost = "sip-servlets.com"; SipURI toAddress = protocolObjects.addressFactory.createSipURI( toUser, toHost); String[] headerNames = new String[] {"Join"}; String[] headerContents = new String[] {lastMessageContent}; sendSipRequest("INVITE", fromAddress, toAddress, null, null, false, headerNames, headerContents, true); } catch (Exception ex) { ex.printStackTrace(); logger.error("error sending INVITE with Join", ex); } } if(sendInvitewithReplaces) { try { String fromUser = "receiver"; String fromHost = "sip-servlets.com"; SipURI fromAddress = protocolObjects.addressFactory.createSipURI( fromUser, fromHost); String toUser = "replaces-receiver"; String toHost = "sip-servlets.com"; SipURI toAddress = protocolObjects.addressFactory.createSipURI( toUser, toHost); String[] headerNames = new String[] {"Replaces"}; String[] headerContents = new String[] {lastMessageContent}; sendSipRequest("INVITE", fromAddress, toAddress, null, null, false, headerNames, headerContents, true); } catch (Exception ex) { ex.printStackTrace(); logger.error("error sending INVITE with Join", ex); } } } private void processRegister(Request request, ServerTransaction serverTransactionId) { try { registerReceived = request; ServerTransaction serverTransaction = serverTransactionId == null? sipProvider.getNewServerTransaction(request) : serverTransactionId; lastRegisterCSeqNumber = ((CSeqHeader)request.getHeader("CSeq")).getSeqNumber(); Response okResponse = protocolObjects.messageFactory.createResponse( Response.OK, request); ToHeader toHeader = (ToHeader) okResponse.getHeader(ToHeader.NAME); if (toHeader.getTag() == null) { toHeader.setTag(Integer.toString(new Random().nextInt(10000000))); } // okResponse.addHeader(contactHeader); serverTransaction.sendResponse(okResponse); } catch (Exception ex) { ex.printStackTrace(); logger.error("error sending OK response to message", ex); } } private void processCancel(RequestEvent requestEvent, ServerTransaction serverTransactionId) { try { cancelReceived = true; SipProvider sipProvider = (SipProvider) requestEvent.getSource(); Request request = requestEvent.getRequest(); Response response = protocolObjects.messageFactory.createResponse( Response.OK, request); ServerTransaction st = requestEvent.getServerTransaction(); if (st == null) { st = sipProvider.getNewServerTransaction(request); } Dialog dialog = st.getDialog(); logger.info("Shootme: dialog = " + dialog); st.sendResponse(response); response = protocolObjects.messageFactory.createResponse( Response.REQUEST_TERMINATED, inviteRequest); inviteServerTid.sendResponse(response); } catch (Exception ex) { ex.printStackTrace(); logger.error("error sending CANCEL responses", ex); } } /** * Process the invite request. */ public void processInvite(RequestEvent requestEvent, ServerTransaction serverTransaction) { inviteReceived = true; SipProvider sipProvider = (SipProvider) requestEvent.getSource(); Request request = requestEvent.getRequest(); inviteRequest = request; logger.info("shootme: got an Invite " + request); try { ServerTransaction st = requestEvent.getServerTransaction(); if (st == null) { st = sipProvider.getNewServerTransaction(request); } inviteServerTid = st; Dialog dialog = st.getDialog(); if(request.getHeader(JoinHeader.NAME) != null) { setJoinRequestReceived(true); this.joinDialog = dialog; } else if (request.getHeader(ReplacesHeader.NAME) != null) { setReplacesRequestReceived(true); this.replacesDialog = dialog; } else { this.dialogCount ++; this.dialog = dialog; } logger.info("Shootme: dialog = " + dialog); this.inviteRequest = request; boolean sendReliably = false; RequireHeader requireHeader = (RequireHeader) request.getHeader(RequireHeader.NAME); if(requireHeader != null && "100rel".equalsIgnoreCase(requireHeader.getOptionTag().trim())) { sendReliably = true; } if(respondWithError == null) for (int provisionalResponseToSend : provisionalResponsesToSend) { Thread.sleep(getTimeToWaitBetweenProvisionnalResponse()); Response response = protocolObjects.messageFactory.createResponse(provisionalResponseToSend, request); if(provisionalResponseToSend >= Response.TRYING && provisionalResponseToSend < Response.OK) { ToHeader toHeader = (ToHeader) response.getHeader(ToHeader.NAME); if(provisionalResponseToSend != Response.TRYING && toHeader.getTag() == null) { toHeader.setTag(TO_TAG); // Application is supposed to set. } if(sendReliably && provisionalResponseToSend != Response.TRYING) { requireHeader = protocolObjects.headerFactory.createRequireHeader("100rel"); response.addHeader(requireHeader); Header rseqHeader = protocolObjects.headerFactory.createRSeqHeader(rseqNumber.getAndIncrement()); response.addHeader(rseqHeader); dialog.sendReliableProvisionalResponse(response); } else { st.sendResponse(response); eventListener.uasAfterResponse(response.getStatusCode(), appServer); } } } if(respondWithError != null && !sendReliably) { Response response = protocolObjects.messageFactory.createResponse(respondWithError, request); response.setReasonPhrase("Unable to setup media services"); st.sendResponse(response); eventListener.uasAfterResponse(response.getStatusCode(), appServer); return; } ContactHeader contactHeader = (ContactHeader)request.getHeader(ContactHeader.NAME); if(contactHeader != null && "0.0.0.0".equals(((SipURI)contactHeader.getAddress().getURI()).getHost())) { abortProcessing = true; throw new IllegalArgumentException("we received a contact header with 0.0.0.0 in an INVITE !"); } if(!waitForCancel) { Address address = null; if(!isIpv6) address = protocolObjects.addressFactory.createAddress("Shootme <sip:127.0.0.1:" + myPort +";transport="+protocolObjects.transport + ">"); else address = protocolObjects.addressFactory.createAddress("Shootme <sip:[::1]:" + myPort +";transport="+protocolObjects.transport + ">"); contactHeader = protocolObjects.headerFactory.createContactHeader(address); setFinalResponse(protocolObjects.messageFactory .createResponse(finalResponseToSend, request)); if(testAckViaParam) { ViaHeader viaHeader = (ViaHeader)getFinalResponse().getHeader(ViaHeader.NAME); viaHeader.setParameter("testAckViaParam", "true"); } ToHeader toHeader = (ToHeader) getFinalResponse().getHeader(ToHeader.NAME); if(toHeader.getTag() == null) { toHeader.setTag(TO_TAG); // Application is supposed to set. } getFinalResponse().addHeader(contactHeader); if(!sendReliably) { Thread.sleep(2000); st.sendResponse(getFinalResponse()); eventListener.uasAfterResponse(getFinalResponse().getStatusCode(), appServer); } } else { logger.info("Waiting for CANCEL, stopping the INVITE processing "); return ; } if(("join").equalsIgnoreCase(((SipUri)request.getRequestURI()).getUser())) { sendJoinMessage = true; } if(("replaces").equalsIgnoreCase(((SipUri)request.getRequestURI()).getUser())) { sendReplacesMessage = true; } } catch (Exception ex) { logger.error("unexpected exception", ex); throw new RuntimeException(ex); } } public void processBye(Request request, ServerTransaction serverTransactionId) { try { logger.info("shootist: got a bye . ServerTxId = " + serverTransactionId); if(abortProcessing) { logger.error("Processing Aborted!"); return ; } this.byeReceived = true; byeRequestReceived = request; if (serverTransactionId == null) { serverTransactionId = sipProvider.getNewServerTransaction(request); } Dialog dialog = serverTransactionId.getDialog(); Response response = protocolObjects.messageFactory.createResponse( 200, request); serverTransactionId.sendResponse(response); logger.info("shootist: Sending OK."); } catch (Exception ex) { ex.printStackTrace(); } } public void processAck(Request request, ServerTransaction serverTransactionId) { try { logger.info("shootist: got a " + request); logger.info("shootist: got an ACK. ServerTxId = " + serverTransactionId); ackReceived = true; //we don't count retransmissions if(serverTransactionId != null) { ackCount ++; } if(testAckViaParam) { ViaHeader viaHeader = (ViaHeader)request.getHeader(ViaHeader.NAME); String param = viaHeader.getParameter("testAckViaParam"); if(param != null) { abortProcessing = true; logger.error("the Via Param set in the response shouldn't be present in the ACK"); return; } } if(sendBye) { Thread.sleep(timeToWaitBeforeBye ); if(serverTransactionId != null && serverTransactionId.getDialog() != null) { Request byeRequest = serverTransactionId.getDialog().createRequest(Request.BYE); logger.info("BYE created : " + byeRequest); ClientTransaction ct = sipProvider.getNewClientTransaction(byeRequest); logger.info("Sending BYE : " + byeRequest); serverTransactionId.getDialog().sendRequest(ct); logger.info("Dialog State = " + serverTransactionId.getDialog().getState()); } } if(!joinRequestReceived && sendJoinMessage) { String fromUser = "join"; String fromHost = "sip-servlets.com"; SipURI fromAddress = protocolObjects.addressFactory.createSipURI( fromUser, fromHost); String toUser = "join-receiver"; String toHost = "sip-servlets.com"; SipURI toAddress = protocolObjects.addressFactory.createSipURI( toUser, toHost); CallIdHeader callIdHeader = (CallIdHeader) request.getHeader(CallIdHeader.NAME); FromHeader fromHeader = (FromHeader) request.getHeader(FromHeader.NAME); ToHeader toHeader = (ToHeader) request.getHeader(ToHeader.NAME); JoinHeader joinHeader = (JoinHeader) ((HeaderFactoryExt)protocolObjects.headerFactory).createJoinHeader(callIdHeader.getCallId(), toHeader.getTag(), fromHeader.getTag()); sendSipRequest("MESSAGE", fromAddress, toAddress, joinHeader.toString(), null, false); } if(!isReplacesRequestReceived() && sendReplacesMessage) { String fromUser = "replaces"; String fromHost = "sip-servlets.com"; SipURI fromAddress = protocolObjects.addressFactory.createSipURI( fromUser, fromHost); String toUser = "replaces-receiver"; String toHost = "sip-servlets.com"; SipURI toAddress = protocolObjects.addressFactory.createSipURI( toUser, toHost); CallIdHeader callIdHeader = (CallIdHeader) request.getHeader(CallIdHeader.NAME); FromHeader fromHeader = (FromHeader) request.getHeader(FromHeader.NAME); ToHeader toHeader = (ToHeader) request.getHeader(ToHeader.NAME); ReplacesHeader replacesHeader = (ReplacesHeader) ((HeaderFactoryExt)protocolObjects.headerFactory).createReplacesHeader(callIdHeader.getCallId(), toHeader.getTag(), fromHeader.getTag()); sendSipRequest("MESSAGE", fromAddress, toAddress, replacesHeader.toString(), null, false); } if(joinRequestReceived) { sendBye(); sendBye(joinDialog); } if(isReplacesRequestReceived()) { sendBye(); sendBye(replacesDialog); } if(sendReinvite && !reinviteSent) { List<Header> headers = new ArrayList<Header>(); Header reinviteHeader = protocolObjects.headerFactory.createHeader("ReInvite", "true"); headers.add(reinviteHeader); sendInDialogSipRequest("INVITE", null, null, null, headers, null); reinviteSent = true; return; } } catch (Exception ex) { ex.printStackTrace(); } } public void processResponse(ResponseEvent responseReceivedEvent) { if(abortProcessing) { logger.error("Processing aborted"); return ; } Response response = (Response) responseReceivedEvent.getResponse(); System.out.println("Process response : " + response); eventListener.uacAfterResponse(response.getStatusCode(), appServer); if(response.getStatusCode() == 491) numberOf491s++; RecordRouteHeader recordRouteHeader = (RecordRouteHeader)response.getHeader(RecordRouteHeader.NAME); ContactHeader contactHeader = (ContactHeader)response.getHeader(ContactHeader.NAME); if(contactHeader != null && "0.0.0.0".equals(((SipURI)contactHeader.getAddress().getURI()).getHost())) { abortProcessing = true; throw new IllegalArgumentException("we received a contact header with 0.0.0.0 in a response !"); } if(response.getStatusCode() >= 400 && response.getStatusCode() < 999) { this.serverErrorReceived = true; } if(response.getStatusCode() == 503) { this.serviceUnavailableReceived = true; } if(response.toString().toLowerCase().contains("info")) { lastInfoResponseTime = System.currentTimeMillis(); } ClientTransaction tid = responseReceivedEvent.getClientTransaction(); CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME); logger.info("Response received : Status Code = " + response.getStatusCode() + " " + cseq); // not dropping in PRACK case on REINVITE the ClientTx can be null it seems if (tid == null && !prackSent) { if(countRetrans) { nbRetrans++; } logger.info("Stray response -- dropping "); return; } if(tid !=null) { logger.info("transaction state is " + tid.getState()); logger.info("Dialog = " + tid.getDialog()); if(tid.getDialog() != null) { logger.info("Dialog State is " + tid.getDialog().getState()); } } try { if(response.getStatusCode() > 100 && response.getStatusCode() < 200) { informationalResponse = response; } if(response.getStatusCode() >= 200 && response.getStatusCode() < 700) { logger.info("final response received : status code " + response.getStatusCode()); finalResponseReceived = true; setFinalResponseStatus(response.getStatusCode()); setFinalResponse(response); } if (response.getStatusCode() == Response.OK) { if (cseq.getMethod().equals(Request.INVITE) && sendAck) { inviteOkResponse = response; @SuppressWarnings("deprecation") Request ackRequest=responseReceivedEvent.getClientTransaction().createAck(); if (useToURIasRequestUri) { ackRequest.setRequestURI(requestURI); } if(timeToWaitBeforeAck > 0) { Thread.sleep(timeToWaitBeforeAck); } if(!sendSubsequentRequestsThroughSipProvider && tid.getDialog()!=null) { tid.getDialog().sendAck(ackRequest); } else { sipProvider.sendRequest(ackRequest); } ackSent = true; //Thread.sleep(1000); // If the caller is supposed to send the bye if(sendReinvite && !reinviteSent) { List<Header> headers = new ArrayList<Header>(); Header reinviteHeader = protocolObjects.headerFactory.createHeader("ReInvite", "true"); headers.add(reinviteHeader); if(prackSent) { headers.add(protocolObjects.headerFactory.createHeader(RequireHeader.NAME, "100rel")); } sendInDialogSipRequest("INVITE", null, null, null, headers, null); reinviteSent = true; return; } if(sendBye) { // Thread.sleep(30000); sendBye(); } if(sendByeAfterTerminatingNotify) { tid.getDialog().terminateOnBye(false); } } else if(cseq.getMethod().equals(Request.BYE)) { okToByeReceived = true; } else if (cseq.getMethod().equals(Request.CANCEL)) { this.cancelOkReceived = true; // if (tid.getDialog().getState() == DialogState.CONFIRMED) { // // oops cancel went in too late. Need to hang up the // // dialog. // logger.info("Sending BYE -- cancel went in too late !!"); // Request byeRequest = dialog.createRequest(Request.BYE); // ClientTransaction ct = sipProvider // .getNewClientTransaction(byeRequest); // tid.getDialog().sendRequest(ct); // } } else if (cseq.getMethod().equals(Request.PUBLISH)) { SIPETagHeader sipTagHeader = (SIPETagHeader)response.getHeader(SIPETag.NAME); sipETag = sipTagHeader.getETag(); } else if (cseq.getMethod().equals(Request.PRACK)) { okToPrackReceived = true; } } else if (response.getStatusCode() == Response.MOVED_TEMPORARILY) { // Dialog dies as soon as you get an error response. if (cseq.getMethod().equals(Request.INVITE)) { // lookup the contact header ContactHeader contHdr = (ContactHeader) response .getHeader(ContactHeader.NAME); // we can re-use the from header FromHeader from = ((FromHeader) response .getHeader(FromHeader.NAME)); // we use the to-address, but without the tag ToHeader to = (ToHeader) (response.getHeader(ToHeader.NAME)).clone(); to.removeParameter("tag"); // the call-id can be re-used CallIdHeader callID = ((CallIdHeader) response .getHeader(CallIdHeader.NAME)); // we take the next cseq long seqNo = (((CSeqHeader) response .getHeader(CSeqHeader.NAME)).getSeqNumber()); logger.info("seqNo = " + seqNo); CSeqHeader cseqNew = protocolObjects.headerFactory .createCSeqHeader(++seqNo, "INVITE"); // Create ViaHeaders (either use tcp or udp) ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); ViaHeader viaHeader = null; if(!isIpv6) viaHeader = protocolObjects.headerFactory.createViaHeader("127.0.0.1", sipProvider .getListeningPoint(protocolObjects.transport).getPort(), protocolObjects.transport, null); else viaHeader = protocolObjects.headerFactory.createViaHeader("::1", sipProvider .getListeningPoint(protocolObjects.transport).getPort(), protocolObjects.transport, null); // add via headers viaHeaders.add(viaHeader); // create max forwards MaxForwardsHeader maxForwardsHeader = protocolObjects.headerFactory .createMaxForwardsHeader(10); // create invite Request SipURI newUri = (SipURI)this.requestURI.clone(); newUri.setParameter("redirection", "true"); requestURI = newUri; Request invRequest = protocolObjects.messageFactory .createRequest(newUri, "INVITE", callID, cseqNew, from, to, viaHeaders, maxForwardsHeader); // we set the Request URI to the address given SipURI contactURI = protocolObjects.addressFactory.createSipURI(null, this.listeningPoint.getIPAddress()); contactURI.setPort(this.listeningPoint.getPort()); contactURI.setTransportParam(protocolObjects.transport); Address address = protocolObjects.addressFactory.createAddress(contactURI); ContactHeader contact = protocolObjects.headerFactory.createContactHeader(address); invRequest.addHeader(contact); // the contacat header in the response contains where to redirect // the request to -- which in this case happens to be back to the // same location. ContactHeader chdr = (ContactHeader)response.getHeader(ContactHeader.NAME); SipURI sipUri = (SipURI)chdr.getAddress().getURI(); // sipUri.setLrParam(); RouteHeader routeHeader = protocolObjects.headerFactory.createRouteHeader(chdr.getAddress()); invRequest.addHeader(routeHeader); invRequest.setRequestURI(sipUri); logger.info("Sending INVITE to " + contHdr.getAddress().getURI().toString()); inviteClientTid = sipProvider.getNewClientTransaction(invRequest); logger.info("New TID = " + inviteClientTid); inviteClientTid.sendRequest(); logger.info("sendReqeust succeeded " + inviteClientTid); Dialog dialog = inviteClientTid.getDialog(); this.dialogCount ++; this.dialog = dialog; } } else if (response.getStatusCode() == Response.REQUEST_TERMINATED) { if(cseq.getMethod().equals(Request.INVITE)){ this.requestTerminatedReceived = true; } } else if(response.getStatusCode() == Response.RINGING && sendUpdateOn180) { Request updateRequest = dialog.createRequest(Request.UPDATE); ClientTransaction ct = sipProvider .getNewClientTransaction(updateRequest); dialog.sendRequest(ct); } else if (response.getStatusCode() > Response.TRYING && response.getStatusCode() < Response.OK) { RequireHeader requireHeader = (RequireHeader) response.getHeader(RequireHeader.NAME); if(requireHeader != null && "100rel".equalsIgnoreCase(requireHeader.getOptionTag().trim())) { Request prack = dialog.createPrack(response); ClientTransaction ct = sipProvider .getNewClientTransaction(prack); dialog.sendRequest(ct); prackSent = true; } } /** * end of modified code */ } catch (Exception ex) { logger.error("An unexpected exception occured while processing the response" , ex); } } public long getLastInfoResponseTime() { return lastInfoResponseTime; } public Request createInvite(String callId, long cseq) throws ParseException, InvalidArgumentException { String fromName = "BigGuy"; String fromSipAddress = "here.com"; String fromDisplayName = "The Master Blaster"; String toSipAddress = "there.com"; String toUser = "LittleGuy"; String toDisplayName = "The Little Blister"; // create >From Header SipURI fromAddress = protocolObjects.addressFactory.createSipURI(fromName, fromSipAddress); Address fromNameAddress = protocolObjects.addressFactory.createAddress(fromAddress); fromNameAddress.setDisplayName(fromDisplayName); FromHeader fromHeader = protocolObjects.headerFactory.createFromHeader(fromNameAddress, "12345"); // create To Header SipURI toAddress = protocolObjects.addressFactory.createSipURI(toUser, toSipAddress); Address toNameAddress = protocolObjects.addressFactory.createAddress(toAddress); toNameAddress.setDisplayName(toDisplayName); ToHeader toHeader = protocolObjects.headerFactory.createToHeader(toNameAddress, null); // create Request URI SipURI requestURI = protocolObjects.addressFactory.createSipURI(toUser, peerHostPort); // Create ViaHeaders ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); ViaHeader viaHeader = null; if(!isIpv6) viaHeader = protocolObjects.headerFactory.createViaHeader("127.0.0.1", listeningPoint.getPort(), listeningPoint.getTransport(),null); else viaHeader = protocolObjects.headerFactory.createViaHeader("::1", listeningPoint.getPort(), listeningPoint.getTransport(),null); // add via headers viaHeaders.add(viaHeader); // Create ContentTypeHeader ContentTypeHeader contentTypeHeader = protocolObjects.headerFactory .createContentTypeHeader("application", "sdp"); // Create a new CallId header CallIdHeader callIdHeader; callIdHeader = sipProvider.getNewCallId(); if (callId.trim().length() > 0) callIdHeader.setCallId(callId); // Create a new Cseq header CSeqHeader cSeqHeader = protocolObjects.headerFactory.createCSeqHeader(cseq, Request.INVITE); // Create a new MaxForwardsHeader MaxForwardsHeader maxForwards = protocolObjects.headerFactory .createMaxForwardsHeader(70); // Create the request. Request request = protocolObjects.messageFactory.createRequest(requestURI, Request.INVITE, callIdHeader, cSeqHeader, fromHeader, toHeader, viaHeaders, maxForwards); // Create contact headers String host = null; if(!isIpv6) host = "127.0.0.1"; else host = "::1"; SipURI contactUrl = protocolObjects.addressFactory.createSipURI(fromName, host); contactUrl.setPort(listeningPoint.getPort()); // Create the contact name address. SipURI contactURI = protocolObjects.addressFactory.createSipURI(fromName, host); contactURI.setPort(listeningPoint.getPort()); Address contactAddress = protocolObjects.addressFactory.createAddress(contactURI); // Add the contact address. contactAddress.setDisplayName(fromName); contactHeader = protocolObjects.headerFactory.createContactHeader(contactAddress); request.addHeader(contactHeader); String sdpData = "v=0\r\n" + "o=4855 13760799956958020 13760799956958020" + " IN IP4 129.6.55.78\r\n" + "s=mysession session\r\n" + "p=+46 8 52018010\r\n" + "c=IN IP4 129.6.55.78\r\n" + "t=0 0\r\n" + "m=audio 6022 RTP/AVP 0 4 18\r\n" + "a=rtpmap:0 PCMU/8000\r\n" + "a=rtpmap:4 G723/8000\r\n" + "a=rtpmap:18 G729A/8000\r\n" + "a=ptime:20\r\n"; byte[] contents = sdpData.getBytes(); request.setContent(contents, contentTypeHeader); Header callInfoHeader = protocolObjects.headerFactory.createHeader("Call-Info", "<http://www.antd.nist.gov>"); request.addHeader(callInfoHeader); return request; } /** * @throws SipException * @throws TransactionUnavailableException * @throws TransactionDoesNotExistException * @throws InterruptedException */ public void sendBye() throws SipException, TransactionUnavailableException, TransactionDoesNotExistException, InterruptedException { if(timeToWaitBeforeBye > 0) { Thread.sleep(timeToWaitBeforeBye); } sendBye(this.dialog); } /** * @throws SipException * @throws TransactionUnavailableException * @throws TransactionDoesNotExistException */ public void sendBye(final Dialog dialog) throws SipException, TransactionUnavailableException, TransactionDoesNotExistException { Thread th = new Thread(){ public void run() { try { if(sendByeInNewThread) Thread.sleep(600); Request byeRequest = dialog.createRequest(Request.BYE); URI uri = ((FromHeader)byeRequest.getHeader(FromHeader.NAME)).getAddress().getURI(); if(uri.isSipURI()) { ((SipURI)uri).removeParameter("fromParam"); } ClientTransaction ct = sipProvider.getNewClientTransaction(byeRequest); logger.info("Sending BYE " + byeRequest); if(!sendSubsequentRequestsThroughSipProvider) { dialog.sendRequest(ct); } else { sipProvider.sendRequest(byeRequest); } byeSent = true; } catch(Exception e) {e.printStackTrace();} } }; if(sendByeInNewThread) { th.start(); } else { th.run(); } } public void processTimeout(javax.sip.TimeoutEvent timeoutEvent) { logger.info("Transaction Time out"); } public SipProvider createProvider() throws Exception { logger.info("Shootist: createProvider()"); if(!isIpv6) listeningPoint = protocolObjects.sipStack.createListeningPoint("127.0.0.1", myPort, protocolObjects.transport); else listeningPoint = protocolObjects.sipStack.createListeningPoint("::1", myPort, protocolObjects.transport); this.sipProvider = protocolObjects.sipStack .createSipProvider(listeningPoint); return sipProvider; } public void addListeningPoint(String ipAddress, int port, String transport) throws Exception { logger.info("Shootist: addListeningPoint()"); ListeningPoint listeningPoint = protocolObjects.sipStack.createListeningPoint( ipAddress, port, transport); sipProvider.addListeningPoint(listeningPoint); } public Request sendSipRequest(String method, URI fromURI, URI toURI, String messageContent, SipURI route, boolean useToURIasRequestUri) throws SipException, ParseException, InvalidArgumentException { return sendSipRequest(method, fromURI, toURI, messageContent, route, useToURIasRequestUri, null, null, true); } public Request sendSipRequest(String method, URI fromURI, URI toURI, String messageContent, SipURI route, boolean useToURIasRequestUri, String[] headerNames, String[] headerContents, boolean setHeader) throws SipException, ParseException, InvalidArgumentException { this.useToURIasRequestUri = useToURIasRequestUri; // create >From Header Address fromNameAddress = protocolObjects.addressFactory .createAddress(fromURI); FromHeader fromHeader = protocolObjects.headerFactory .createFromHeader(fromNameAddress, Integer.toString(new Random().nextInt(10000000))); // create To Header Address toNameAddress = protocolObjects.addressFactory .createAddress(toURI); ToHeader toHeader = protocolObjects.headerFactory.createToHeader( toNameAddress, null); if(toURI instanceof SipURI) { SipURI toSipUri = (SipURI) toURI; // create Request URI this.requestURI = protocolObjects.addressFactory.createSipURI( toSipUri.getUser(), peerHostPort); ((SipURI)this.requestURI).setPort(peerPort); if(setTransport) { ((SipURI)this.requestURI).setTransportParam(listeningPoint.getTransport()); } } if(useToURIasRequestUri || toURI instanceof TelURL) { this.requestURI = toURI; } // Create ViaHeaders List<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); ViaHeader viaHeader = null; if(!isIpv6) viaHeader = protocolObjects.headerFactory.createViaHeader("127.0.0.1", sipProvider .getListeningPoint(protocolObjects.transport).getPort(), listeningPoint.getTransport(), null); else viaHeader = protocolObjects.headerFactory.createViaHeader("::1", sipProvider .getListeningPoint(protocolObjects.transport).getPort(), listeningPoint.getTransport(), null); // add via headers viaHeaders.add(viaHeader); // Create ContentTypeHeader // ContentTypeHeader contentTypeHeader = protocolObjects.headerFactory // .createContentTypeHeader("application", "sdp"); // Create a new CallId header CallIdHeader callIdHeader = sipProvider.getNewCallId(); // Create a new Cseq header CSeqHeader cSeqHeader = protocolObjects.headerFactory .createCSeqHeader(1L, method); // Create a new MaxForwardsHeader MaxForwardsHeader maxForwards = protocolObjects.headerFactory .createMaxForwardsHeader(70); // Create the request. Request request = protocolObjects.messageFactory.createRequest( requestURI, method, callIdHeader, cSeqHeader, fromHeader, toHeader, viaHeaders, maxForwards); // Create contact headers String host = null; if(!isIpv6) host = "127.0.0.1"; else host = "::1"; URI contactUrl = null; if(fromURI instanceof SipURI) { contactUrl = protocolObjects.addressFactory.createSipURI( ((SipURI)fromURI).getUser(), host); /** * either use tcp or udp */ ((SipURI)contactUrl).setPort(listeningPoint.getPort()); if(setTransport) { ((SipURI)contactUrl).setTransportParam(listeningPoint.getTransport()); ((SipURI)contactUrl).setLrParam(); } } else { contactUrl = fromURI; } // Create the contact name address. Address contactAddress = protocolObjects.addressFactory .createAddress(contactUrl); // Add the contact address. // contactAddress.setDisplayName(fromName); contactHeader = protocolObjects.headerFactory .createContactHeader(contactAddress); request.addHeader(contactHeader); SipURI uri = null; if(!isIpv6) uri = protocolObjects.addressFactory.createSipURI(null, "127.0.0.1"); else uri = protocolObjects.addressFactory.createSipURI(null, "::1"); uri.setLrParam(); uri.setTransportParam(protocolObjects.transport); uri.setPort(this.peerPort); if(route != null) { Address address = protocolObjects.addressFactory.createAddress(route); RouteHeader routeHeader = protocolObjects.headerFactory.createRouteHeader(address); request.addHeader(routeHeader); } else if(useDefaultRoute ) { Address address = protocolObjects.addressFactory.createAddress(uri); RouteHeader routeHeader = protocolObjects.headerFactory.createRouteHeader(address); request.addHeader(routeHeader); } // set the message content if(messageContent != null) { ContentLengthHeader contentLengthHeader = protocolObjects.headerFactory.createContentLengthHeader(messageContent.length()); ContentTypeHeader contentTypeHeader = protocolObjects.headerFactory.createContentTypeHeader(TEXT_CONTENT_TYPE,PLAIN_UTF8_CONTENT_SUBTYPE); byte[] contents = messageContent.getBytes(); request.setContent(contents, contentTypeHeader); request.setContentLength(contentLengthHeader); } if(headerNames != null) { for(int q=0; q<headerNames.length; q++) { Header h = protocolObjects.headerFactory.createHeader(headerNames[q], headerContents[q]); if(setHeader) { request.setHeader(h); } else { request.addHeader(h); } } } addSpecificHeaders(method, request); // Create the client transaction. inviteClientTid = sipProvider.getNewClientTransaction(request); // send the request out. inviteClientTid.sendRequest(); logger.info("client tx = " + inviteClientTid); if(!Request.MESSAGE.equalsIgnoreCase(method)) { dialog = inviteClientTid.getDialog(); } if(Request.INVITE.equalsIgnoreCase(method)) { inviteRequest = request; } this.dialogCount++; return inviteRequest; } public Request sendSipRequest(String method, URI fromURI, URI toURI, String messageContent, SipURI route, boolean useToURIasRequestUri, String[] headerNames, String[] headerContents, SipURI requestUri) throws SipException, ParseException, InvalidArgumentException { this.useToURIasRequestUri = useToURIasRequestUri; // create >From Header Address fromNameAddress = protocolObjects.addressFactory .createAddress(fromURI); FromHeader fromHeader = protocolObjects.headerFactory .createFromHeader(fromNameAddress, Integer.toString(new Random().nextInt(10000000))); // create To Header Address toNameAddress = protocolObjects.addressFactory .createAddress(toURI); ToHeader toHeader = protocolObjects.headerFactory.createToHeader( toNameAddress, null); this.requestURI = requestUri; // Create ViaHeaders List<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); ViaHeader viaHeader = null; if(!isIpv6) viaHeader = protocolObjects.headerFactory.createViaHeader("127.0.0.1", sipProvider .getListeningPoint(protocolObjects.transport).getPort(), listeningPoint.getTransport(),null); else viaHeader = protocolObjects.headerFactory.createViaHeader("::1", sipProvider .getListeningPoint(protocolObjects.transport).getPort(), listeningPoint.getTransport(),null); // add via headers viaHeaders.add(viaHeader); // Create ContentTypeHeader // ContentTypeHeader contentTypeHeader = protocolObjects.headerFactory // .createContentTypeHeader("application", "sdp"); // Create a new CallId header CallIdHeader callIdHeader = sipProvider.getNewCallId(); // Create a new Cseq header CSeqHeader cSeqHeader = protocolObjects.headerFactory .createCSeqHeader(1L, method); // Create a new MaxForwardsHeader MaxForwardsHeader maxForwards = protocolObjects.headerFactory .createMaxForwardsHeader(70); // Create the request. Request request = protocolObjects.messageFactory.createRequest( requestURI, method, callIdHeader, cSeqHeader, fromHeader, toHeader, viaHeaders, maxForwards); // Create contact headers String host = null; if(!isIpv6) host = "127.0.0.1"; else host = "::1"; URI contactUrl = null; if(fromURI instanceof SipURI) { contactUrl = protocolObjects.addressFactory.createSipURI( ((SipURI)fromURI).getUser(), host); /** * either use tcp or udp */ ((SipURI)contactUrl).setPort(listeningPoint.getPort()); ((SipURI)contactUrl).setTransportParam(listeningPoint.getTransport()); ((SipURI)contactUrl).setLrParam(); } else { contactUrl = fromURI; } // Create the contact name address. Address contactAddress = protocolObjects.addressFactory .createAddress(contactUrl); // Add the contact address. // contactAddress.setDisplayName(fromName); contactHeader = protocolObjects.headerFactory .createContactHeader(contactAddress); request.addHeader(contactHeader); SipURI uri = null; if(!isIpv6) uri = protocolObjects.addressFactory.createSipURI(null, "127.0.0.1"); else uri = protocolObjects.addressFactory.createSipURI(null, "::1"); uri.setLrParam(); uri.setTransportParam(protocolObjects.transport); uri.setPort(this.peerPort); if(route != null) { Address address = protocolObjects.addressFactory.createAddress(route); RouteHeader routeHeader = protocolObjects.headerFactory.createRouteHeader(address); request.addHeader(routeHeader); } else { Address address = protocolObjects.addressFactory.createAddress(uri); RouteHeader routeHeader = protocolObjects.headerFactory.createRouteHeader(address); request.addHeader(routeHeader); } // set the message content if(messageContent != null) { ContentLengthHeader contentLengthHeader = protocolObjects.headerFactory.createContentLengthHeader(messageContent.length()); ContentTypeHeader contentTypeHeader = protocolObjects.headerFactory.createContentTypeHeader(TEXT_CONTENT_TYPE,PLAIN_UTF8_CONTENT_SUBTYPE); byte[] contents = messageContent.getBytes(); request.setContent(contents, contentTypeHeader); request.setContentLength(contentLengthHeader); } if(headerNames != null) { for(int q=0; q<headerNames.length; q++) { Header h = protocolObjects.headerFactory.createHeader(headerNames[q], headerContents[q]); request.addLast(h); } } addSpecificHeaders(method, request); // Create the client transaction. inviteClientTid = sipProvider.getNewClientTransaction(request); // send the request out. inviteClientTid.sendRequest(); logger.info("client tx = " + inviteClientTid); if(!Request.MESSAGE.equalsIgnoreCase(method)) { dialog = inviteClientTid.getDialog(); } this.dialogCount++; return request; } private void addSpecificHeaders(String method, Request request) throws ParseException, InvalidArgumentException { if(Request.SUBSCRIBE.equals(method) || Request.PUBLISH.equals(method)) { // Create an event header for the subscription. EventHeader eventHeader = protocolObjects.headerFactory.createEventHeader(publishEvent); request.addHeader(eventHeader); ExpiresHeader expires = protocolObjects.headerFactory.createExpiresHeader(200); request.addHeader(expires); } if(Request.PUBLISH.equals(method)) { if(sipETag != null) { SIPIfMatchHeader sipIfMatchHeader = protocolObjects.headerFactory.createSIPIfMatchHeader(sipETag); request.addHeader(sipIfMatchHeader); } if(publishContentMessage != null) { ContentLengthHeader contentLengthHeader = protocolObjects.headerFactory.createContentLengthHeader(publishContentMessage.length()); ContentTypeHeader contentTypeHeader = protocolObjects.headerFactory.createContentTypeHeader(APPLICATION_CONTENT_TYPE,PIDF_XML_SUBTYPE); request.setContentLength(contentLengthHeader); request.setContent(publishContentMessage, contentTypeHeader); } } if(Request.REFER.equals(method)) { ReferToHeader referToHeader = (ReferToHeader) protocolObjects.headerFactory.createHeader(ReferToHeader.NAME, "sip:refer-to@nist.gov"); request.addHeader(referToHeader); } } public TestSipListener (boolean isIpv6, int myPort, int peerPort, ProtocolObjects protocolObjects, boolean callerSendBye) { this.protocolObjects = protocolObjects; this.myPort = myPort; this.isIpv6 = isIpv6; if(peerPort > 0) { this.peerPort = peerPort; if(!this.isIpv6) this.peerHostPort = "127.0.0.1:"+ peerPort; else this.peerHostPort = "[::1]:"+ peerPort; } this.sendBye = callerSendBye; allMessagesContent = new ArrayList<String>(); allSubscriptionStates = new ArrayList<String>(); finalResponseToSend = Response.OK; provisionalResponsesToSend = new ArrayList<Integer>(); provisionalResponsesToSend.add(Response.TRYING); provisionalResponsesToSend.add(Response.RINGING); } public void processIOException(IOExceptionEvent exceptionEvent) { logger.info("IOException happened for " + exceptionEvent.getHost() + " port = " + exceptionEvent.getPort()); } public void processTransactionTerminated( TransactionTerminatedEvent transactionTerminatedEvent) { logger.info("Transaction terminated event recieved for " + transactionTerminatedEvent.getClientTransaction()); } public void processDialogTerminated( DialogTerminatedEvent dialogTerminatedEvent) { } public boolean getOkToByeReceived() { return okToByeReceived; } public boolean getByeReceived() { return byeReceived; } public void sendCancel() { try { logger.info("Sending cancel"); Request cancelRequest = inviteClientTid.createCancel(); ClientTransaction cancelTid = sipProvider .getNewClientTransaction(cancelRequest); cancelTid.sendRequest(); } catch (Exception ex) { ex.printStackTrace(); } } /** * @return the cancelReceived */ public boolean isCancelReceived() { return cancelReceived; } /** */ public void setCancelReceived(boolean cancelReceived) { this.cancelReceived = cancelReceived; } /** * @return the cancelOkReceived */ public boolean isCancelOkReceived() { return cancelOkReceived; } /** */ public void setCancelOkReceived(boolean cancelOkReceived) { this.cancelOkReceived = cancelOkReceived; } /** * @return the requestTerminatedReceived */ public boolean isRequestTerminatedReceived() { return requestTerminatedReceived; } /** * @return the requestTerminatedReceived */ public void setRequestTerminatedReceived(boolean requestTerminatedReceived) { this.requestTerminatedReceived = requestTerminatedReceived; } /** * @return the waitForCancel */ public boolean isWaitForCancel() { return waitForCancel; } public long getLastRegisterCSeqNumber() { return lastRegisterCSeqNumber; } /** * @param waitForCancel the waitForCancel to set */ public void setWaitForCancel(boolean waitForCancel) { this.waitForCancel = waitForCancel; } /** * @return the ackSent */ public boolean isAckSent() { return ackSent; } public void setAckSent(boolean ackSent) { this.ackSent = ackSent; } /** * @return the ackReceived */ public boolean isAckReceived() { return ackReceived; } public void setAckReceived(boolean ackReceived) { this.ackReceived = ackReceived; } /** * * @param transport TODO * @param messageToSend * @throws SipException * @throws InvalidArgumentException * @throws ParseException */ public void sendInDialogSipRequest(String method, String content, String contentType, String subContentType, List<Header> headers, String transport) throws SipException, InvalidArgumentException, ParseException { Request message = dialog.createRequest(method); if(transport !=null) { ((SipURI)message.getRequestURI()).setTransportParam(transport); } if(content != null) { ContentLengthHeader contentLengthHeader = protocolObjects.headerFactory.createContentLengthHeader(content.length()); ContentTypeHeader contentTypeHeader = protocolObjects.headerFactory.createContentTypeHeader(contentType,subContentType); message.setContentLength(contentLengthHeader); message.setContent(content, contentTypeHeader); } if(headers != null) { for (Header header : headers) { message.addHeader(header); } } addSpecificHeaders(method, message); message.removeHeader(ViaHeader.NAME); ClientTransaction clientTransaction = sipProvider.getNewClientTransaction(message); if(method.equals("INVITE")) { inviteClientTid = clientTransaction; } dialog.sendRequest(clientTransaction); } /** * * @param messageToSend * @throws SipException * @throws InvalidArgumentException * @throws ParseException */ public void sendMessageInDialog(String messageToSend) throws SipException, InvalidArgumentException, ParseException { Request message = dialog.createRequest(Request.MESSAGE); ContentLengthHeader contentLengthHeader = protocolObjects.headerFactory.createContentLengthHeader(messageToSend.length()); ContentTypeHeader contentTypeHeader = protocolObjects.headerFactory.createContentTypeHeader(TEXT_CONTENT_TYPE,PLAIN_UTF8_CONTENT_SUBTYPE); message.setContentLength(contentLengthHeader); message.setContent(messageToSend, contentTypeHeader); ClientTransaction clientTransaction = sipProvider.getNewClientTransaction(message); dialog.sendRequest(clientTransaction); } /** * * @param messageToSend * @throws SipException * @throws InvalidArgumentException * @throws ParseException */ public void sendMessageNoDialog(String messageToSend) throws SipException, InvalidArgumentException, ParseException { Request message = dialog.createRequest(Request.MESSAGE); ContentLengthHeader contentLengthHeader = protocolObjects.headerFactory.createContentLengthHeader(messageToSend.length()); ContentTypeHeader contentTypeHeader = protocolObjects.headerFactory.createContentTypeHeader(TEXT_CONTENT_TYPE,PLAIN_UTF8_CONTENT_SUBTYPE); message.setContentLength(contentLengthHeader); message.setContent(messageToSend, contentTypeHeader); ClientTransaction clientTransaction = sipProvider.getNewClientTransaction(message); dialog.sendRequest(clientTransaction); } /** * @return the lastMessageContent */ public String getLastMessageContent() { return lastMessageContent; } /** * @return the allMessagesContent */ public List<String> getAllMessagesContent() { return allMessagesContent; } /** * @return the finalResponseReceived */ public boolean isFinalResponseReceived() { return finalResponseReceived; } public boolean isServerErrorReceived() { return serverErrorReceived; } public void setServerErrorReceived(boolean serverErrorReceived) { this.serverErrorReceived = serverErrorReceived; } /** * @return the finalResponseToSend */ public int getFinalResponseToSend() { return finalResponseToSend; } /** * @param finalResponseToSend the finalResponseToSend to set */ public void setFinalResponseToSend(int finalResponseToSend) { this.finalResponseToSend = finalResponseToSend; } /** * @return the provisionalResponsesToSend */ public List<Integer> getProvisionalResponsesToSend() { return provisionalResponsesToSend; } /** * @param provisionalResponsesToSend the provisionalResponsesToSend to set */ public void setProvisionalResponsesToSend( List<Integer> provisionalResponsesToSend) { this.provisionalResponsesToSend = provisionalResponsesToSend; } /** * @return the allSubscriptionState */ public List<String> getAllSubscriptionState() { return allSubscriptionStates; } /** * @param byeReceived the byeReceived to set */ public void setByeReceived(boolean byeReceived) { this.byeReceived = byeReceived; } /** * @param okToByeReceived the okToByeReceived to set */ public void setOkToByeReceived(boolean okToByeReceived) { this.okToByeReceived = okToByeReceived; } public void setSendUpdateOn180(boolean sendUpdateOn180) { this.sendUpdateOn180 = sendUpdateOn180; } public void setPublishEvent(String publishEvent) { this.publishEvent = publishEvent; } public void setPublishContentMessage(String publishContentMessage) { this.publishContentMessage = publishContentMessage; } /** * @param timeToWaitBetweenProvisionnalResponse the timeToWaitBetweenProvisionnalResponse to set */ public void setTimeToWaitBetweenProvisionnalResponse( long timeToWaitBetweenProvisionnalResponse) { this.timeToWaitBetweenProvisionnalResponse = timeToWaitBetweenProvisionnalResponse; } public Response getInviteOkResponse() { return inviteOkResponse; } /** * @return the timeToWaitBetweenProvisionnalResponse */ public long getTimeToWaitBetweenProvisionnalResponse() { return timeToWaitBetweenProvisionnalResponse; } public long getTimeToWaitBetweenSubsNotify() { return timeToWaitBetweenSubsNotify; } public void setTimeToWaitBetweenSubsNotify(long timeToWaitBetweenSubsNotify) { this.timeToWaitBetweenSubsNotify = timeToWaitBetweenSubsNotify; } /** * @return the sendBye */ public boolean isSendBye() { return sendBye; } /** * @param sendBye the sendBye to set */ public void setSendBye(boolean sendBye) { this.sendBye = sendBye; } /** * @param sendByeBeforeTerminatingNotify the sendByeBeforeTerminatingNotify to set */ public void setSendByeBeforeTerminatingNotify( boolean sendByeBeforeTerminatingNotify) { this.sendByeBeforeTerminatingNotify = sendByeBeforeTerminatingNotify; } /** * @return the sendByeBeforeTerminatingNotify */ public boolean isSendByeBeforeTerminatingNotify() { return sendByeBeforeTerminatingNotify; } /** * @param sendByeAfterTerminatingNotify the sendByeAfterTerminatingNotify to set */ public void setSendByeAfterTerminatingNotify( boolean sendByeAfterTerminatingNotify) { this.sendByeAfterTerminatingNotify = sendByeAfterTerminatingNotify; } /** * @return the sendByeAfterTerminatingNotify */ public boolean isSendByeAfterTerminatingNotify() { return sendByeAfterTerminatingNotify; } public boolean isAuthenticationErrorReceived() { return authenticationErrorReceived; } public void setRespondWithError(int errorCode) { this.respondWithError = errorCode; } /** * @param finalResponseStatus the finalResponseStatus to set */ public void setFinalResponseStatus(int finalResponseStatus) { this.finalResponseStatus = finalResponseStatus; } /** * @return the finalResponseStatus */ public int getFinalResponseStatus() { return finalResponseStatus; } /** * @param joinRequestReceived the joinRequestReceived to set */ public void setJoinRequestReceived(boolean joinRequestReceived) { this.joinRequestReceived = joinRequestReceived; } /** * @return the joinRequestReceived */ public boolean isJoinRequestReceived() { return joinRequestReceived; } /** * @param replacesRequestReceived the replacesRequestReceived to set */ public void setReplacesRequestReceived(boolean replacesRequestReceived) { this.replacesRequestReceived = replacesRequestReceived; } /** * @return the replacesRequestReceived */ public boolean isReplacesRequestReceived() { return replacesRequestReceived; } /** * @return the inviteReceived */ public boolean isInviteReceived() { return inviteReceived; } public void setSendReinvite(boolean b) { sendReinvite = b; } public Request getInviteRequest() { return inviteRequest; } /** * @param recordRoutingProxyTesting the recordRoutingProxyTesting to set */ public void setRecordRoutingProxyTesting(boolean recordRoutingProxyTesting) { this.recordRoutingProxyTesting = recordRoutingProxyTesting; } /** * @return the recordRoutingProxyTesting */ public boolean isRecordRoutingProxyTesting() { return recordRoutingProxyTesting; } /** * @param sendSubsequentRequestsThroughSipProvider the sendSubsequentRequestsThroughSipProvider to set */ public void setSendSubsequentRequestsThroughSipProvider( boolean sendSubsequentRequestsThroughSipProvider) { this.sendSubsequentRequestsThroughSipProvider = sendSubsequentRequestsThroughSipProvider; } /** * @return the sendSubsequentRequestsThroughSipProvider */ public boolean isSendSubsequentRequestsThroughSipProvider() { return sendSubsequentRequestsThroughSipProvider; } /** * @param testAckViaParam the testAckViaParam to set */ public void setTestAckViaParam(boolean testAckViaParam) { this.testAckViaParam = testAckViaParam; } /** * @return the testAckViaParam */ public boolean isTestAckViaParam() { return testAckViaParam; } /** * @return the byeRequestReceived */ public Request getByeRequestReceived() { return byeRequestReceived; } /** * @return the registerReceived */ public Request getRegisterReceived() { return registerReceived; } /** * @param timeToWaitBeforeBye the timeToWaitBeforeBye to set */ public void setTimeToWaitBeforeBye(long timeToWaitBeforeBye) { this.timeToWaitBeforeBye = timeToWaitBeforeBye; } /** * @return the timeToWaitBeforeBye */ public long getTimeToWaitBeforeBye() { return timeToWaitBeforeBye; } /** * @param sendAck the sendAck to set */ public void setSendAck(boolean sendAck) { this.sendAck = sendAck; } /** * @return the sendAck */ public boolean isSendAck() { return sendAck; } /** * @param prackSent the prackSent to set */ public void setPrackSent(boolean prackSent) { this.prackSent = prackSent; } /** * @return the prackSent */ public boolean isPrackSent() { return prackSent; } /** * @param okToPrackReceived the okToPrackReceived to set */ public void setOkToPrackReceived(boolean okToPrackReceived) { this.okToPrackReceived = okToPrackReceived; } /** * @return the okToPrackReceived */ public boolean isOkToPrackReceived() { return okToPrackReceived; } /** * @param prackReceived the prackReceived to set */ public void setPrackReceived(boolean prackReceived) { this.prackReceived = prackReceived; } /** * @return the prackReceived */ public boolean isPrackReceived() { return prackReceived; } /** * @param useDefaultRoute the useDefaultRoute to set */ public void setUseDefaultRoute(boolean useDefaultRoute) { this.useDefaultRoute = useDefaultRoute; } /** * @return the useDefaultRoute */ public boolean isUseDefaultRoute() { return useDefaultRoute; } /** * @param messageRequest the messageRequest to set */ public void setMessageRequest(Request messageRequest) { this.messageRequest = messageRequest; } /** * @return the messageRequest */ public Request getMessageRequest() { return messageRequest; } public void setTransport(boolean b) { setTransport = b; } /** * @param finalResponse the finalResponse to set */ public void setFinalResponse(Response finalResponse) { this.finalResponse = finalResponse; } /** * @return the finalResponse */ public Response getFinalResponse() { return finalResponse; } /** * @param timeToWaitBeforeAck the timeToWaitBeforeAck to set */ public void setTimeToWaitBeforeAck(long timeToWaitBeforeAck) { this.timeToWaitBeforeAck = timeToWaitBeforeAck; } /** * @return the timeToWaitBeforeAck */ public long getTimeToWaitBeforeAck() { return timeToWaitBeforeAck; } /** * @return the serviceUnavailableReceived */ public boolean isServiceUnavailableReceived() { return serviceUnavailableReceived; } public void setReferResponseToSend(int referResponseToSend) { this.referResponseToSend = referResponseToSend; } /** * @param sendNotifyForRefer the sendNotifyForRefer to set */ public void setSendNotifyForRefer(boolean sendNotifyForRefer) { this.sendNotifyForRefer = sendNotifyForRefer; } /** * @return the sendNotifyForRefer */ public boolean isSendNotifyForRefer() { return sendNotifyForRefer; } /** * @param sendNotify the sendNotify to set */ public void setSendNotify(boolean sendNotify) { this.sendNotify = sendNotify; } /** * @return the sendNotify */ public boolean isSendNotify() { return sendNotify; } /** * @param informationalResponse the informationalResponse to set */ public void setInformationalResponse(Response informationalResponse) { this.informationalResponse = informationalResponse; } /** * @return the informationalResponse */ public Response getInformationalResponse() { return informationalResponse; } /** * @param countRetrans the countRetrans to set */ public void setCountRetrans(boolean countRetrans) { this.countRetrans = countRetrans; } /** * @return the countRetrans */ public boolean isCountRetrans() { return countRetrans; } /** * @param nbRetrans the nbRetrans to set */ public void setNbRetrans(int nbRetrans) { this.nbRetrans = nbRetrans; } /** * @return the nbRetrans */ public int getNbRetrans() { return nbRetrans; } /** * @param prackRequestReceived the prackRequestReceived to set */ public void setPrackRequestReceived(Request prackRequestReceived) { this.prackRequestReceived = prackRequestReceived; } /** * @return the prackRequestReceived */ public Request getPrackRequestReceived() { return prackRequestReceived; } }