/** * */ package org.mobicents.servlet.sip.example; import java.io.IOException; import java.util.Map; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.sip.Address; import javax.servlet.sip.SipServlet; import javax.servlet.sip.SipServletRequest; import javax.servlet.sip.SipServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jboss.mobicents.seam.CallManager; import org.mobicents.servlet.sip.example.util.DTMFUtils; /** * Sip Servlet handling responses to call initiated due to actions made on the web shopping demo * * @author <A HREF="mailto:jean.deruelle@gmail.com">Jean Deruelle</A> * */ public class JSleeSipsInteropServlet extends SipServlet { private static final long serialVersionUID = 1L; private static Log logger = LogFactory.getLog(JSleeSipsInteropServlet.class); private static final String CONTACT_HEADER = "Contact"; /** Creates a new instance of ShoppingSipServlet */ public JSleeSipsInteropServlet() { } @Override public void init(ServletConfig servletConfig) throws ServletException { logger.info("the jslee sips interop sip servlet has been started"); super.init(servletConfig); } @Override protected void doInvite(SipServletRequest req) throws ServletException, IOException { logger.info("Got Invite = " + req); try { InitialContext ctx = new InitialContext(); CallManager callManagerRef = (CallManager) ctx.lookup("jslee-sips/CallManagerBean/local"); //saving the reference to the EJB ref for latter use to avoid doing jndi lookup calls req.getSession().setAttribute("callManagerRef", callManagerRef); logger.info("Calling out call manager"); callManagerRef.initMediaConnection(req); } catch (NamingException e) { logger.error("An exception occured while retrieving the EJB OrderApproval",e); } } @Override protected void doAck(SipServletRequest req) throws ServletException, IOException { CallManager callManagerRef = (CallManager) req.getSession().getAttribute("callManagerRef"); callManagerRef.playAnnouncement(req, CallManager.ANNOUNCEMENT_TYPE_OPENING); } @Override protected void doInfo(SipServletRequest request) throws ServletException, IOException { //sending OK SipServletResponse ok = request.createResponse(SipServletResponse.SC_OK); ok.send(); //Getting the message content String messageContent = new String( (byte[]) request.getContent()); logger.info("got INFO request with following content " + messageContent); int signalIndex = messageContent.indexOf("Signal="); logger.info("DTMF session in started state, parsing message content"); if(messageContent != null && messageContent.length() > 0 && signalIndex != -1) { String signal = messageContent.substring("Signal=".length(),"Signal=".length()+1).trim(); logger.info("Signal received " + signal ); if(DTMFUtils.updateBoothNumber(request.getSession(), signal)) { CallManager callManagerRef = (CallManager) request.getSession().getAttribute("callManagerRef"); callManagerRef.playAnnouncement(request, CallManager.ANNOUNCEMENT_TYPE_CONFIRMATION); } } } @Override protected void doBye(SipServletRequest req) throws ServletException, IOException { CallManager callManagerRef = (CallManager) req.getSession().getAttribute("callManagerRef"); callManagerRef.endCall(req, true); req.createResponse(SipServletResponse.SC_OK).send(); } @Override protected void doRegister(SipServletRequest req) throws ServletException, IOException { logger.info("Received register request: " + req.getTo()); Map<String, String> users = (Map<String, String>) getServletContext().getAttribute("registeredUsersMap"); int response = SipServletResponse.SC_OK; SipServletResponse resp = req.createResponse(response); Address address = req.getAddressHeader(CONTACT_HEADER); String fromURI = req.getFrom().getURI().toString(); int expires = address.getExpires(); if(expires < 0) { expires = req.getExpires(); } if(expires == 0) { users.remove(fromURI); logger.info("User " + fromURI + " unregistered"); } else { resp.setAddressHeader(CONTACT_HEADER, address); users.put(fromURI, address.getURI().toString()); logger.info("User " + fromURI + " registered this contact address " + address + " with an Expire time of " + expires); } resp.send(); } }