package org.jboss.mobicents.seam.listeners; import java.io.File; import java.io.IOException; import javax.servlet.sip.SipServletRequest; import javax.servlet.sip.SipSession; import org.apache.log4j.Logger; import org.mobicents.mscontrol.MsConnection; import org.mobicents.mscontrol.MsConnectionEvent; import org.mobicents.mscontrol.MsConnectionListener; import org.mobicents.mscontrol.MsEndpoint; import org.mobicents.mscontrol.MsLink; import org.mobicents.mscontrol.MsLinkEvent; import org.mobicents.mscontrol.MsLinkListener; import org.mobicents.mscontrol.MsLinkMode; import org.mobicents.mscontrol.MsSession; import org.mobicents.mscontrol.events.MsEventAction; import org.mobicents.mscontrol.events.MsEventFactory; import org.mobicents.mscontrol.events.MsRequestedEvent; import org.mobicents.mscontrol.events.MsRequestedSignal; import org.mobicents.mscontrol.events.ann.MsPlayRequestedSignal; import org.mobicents.mscontrol.events.dtmf.MsDtmfRequestedEvent; import org.mobicents.mscontrol.events.pkg.DTMF; import org.mobicents.mscontrol.events.pkg.MsAnnouncement; /** * This class is registered in the media server to be notified on media connection * events. It also carries connection-specific application data (the original * INVITE request). * * @author Vladimir Ralev * @author Jean Deruelle * */ public class MediaConnectionListener implements MsConnectionListener { private static Logger logger = Logger.getLogger(MediaConnectionListener.class); public static final String IVR_JNDI_NAME = "media/trunk/IVR/$"; public static final String PR_JNDI_NAME = "media/trunk/PacketRelay/$"; private SipServletRequest inviteRequest; public void txFailed(MsConnectionEvent event) { logger.info("Transaction failed on event "+ event.getEventID() + "with message " + event.getMessage()); } public SipServletRequest getInviteRequest() { return inviteRequest; } public void setInviteRequest(SipServletRequest inviteRequest) { this.inviteRequest = inviteRequest; } public void connectionCreated(MsConnectionEvent event) { logger.info("connection created " + event); // handleMedia(event); // logger.info("connection hal opened " + event); // MsConnection connection = event.getConnection(); // String sdp = connection.getLocalDescriptor(); // try { // inviteRequest.setContentLength(sdp.length()); // inviteRequest.setContent(sdp.getBytes(), "application/sdp"); // inviteRequest.send(); // } catch (IOException e) { // logger.error("An unexpected exception occured while sending the request", e); // } // logger.info("Local Media Connection half created " + event.getEventID()); } public void connectionInitialized(MsConnectionEvent arg0) { logger.info("connection initialized " + arg0); } public void connectionDisconnected(MsConnectionEvent event) { logger.info("connection disconnected " + event); } public void connectionFailed(MsConnectionEvent arg0) { logger.info("connection failed " + arg0); } public void connectionHalfOpen(MsConnectionEvent event) { logger.info("connection half opened " + event); MsConnection connection = event.getConnection(); String sdp = connection.getLocalDescriptor(); try { inviteRequest.setContentLength(sdp.length()); inviteRequest.setContent(sdp.getBytes(), "application/sdp"); inviteRequest.send(); } catch (IOException e) { logger.error("An unexpected exception occured while sending the request", e); } logger.info("Local Media Connection half created " + event.getEventID()); } public void connectionOpen(MsConnectionEvent event) { logger.info("connection opened " + event); handleMedia(event); } public void connectionModeRecvOnly(MsConnectionEvent arg0) { // TODO Auto-generated method stub } public void connectionModeSendOnly(MsConnectionEvent arg0) { // TODO Auto-generated method stub } public void connectionModeSendRecv(MsConnectionEvent arg0) { // TODO Auto-generated method stub } protected void handleMedia(MsConnectionEvent event) { logger.info("Remote Media Connection created. Endpoints connected " + event.getEventID()); final MsConnection connection = event.getConnection(); MsEndpoint endpoint = connection.getEndpoint(); final MsSession session = connection.getSession(); final MsLink link = session.createLink(MsLinkMode.FULL_DUPLEX); link.addLinkListener(new MsLinkListener() { public void linkCreated(MsLinkEvent evt) { logger.info("PR-IVR link created " + evt); } public void linkConnected(MsLinkEvent evt) { logger.info("link connected " + link.getEndpoints()[0].getLocalName() + " " + link.getEndpoints()[1].getLocalName()); // MsProvider provider = session.getProvider(); // MsEventFactory eventFactory = provider.getEventFactory(); inviteRequest.getSession().setAttribute("link", link); if((Boolean.TRUE).equals(inviteRequest.getSession().getAttribute("playAnnouncement"))) { playAnnouncement(connection, link, inviteRequest.getSession(), (String)inviteRequest.getSession().getAttribute("audioFilePath")); } } public void linkDisconnected(MsLinkEvent evt) { logger.info("link disconnected " + evt); } public void linkFailed(MsLinkEvent evt) { logger.info("link failed " + evt); } public void modeFullDuplex(MsLinkEvent evt) { logger.info("link mode full duplex" + evt); } public void modeHalfDuplex(MsLinkEvent evt) { logger.info("link mode half duplex" + evt); } }); String log = "Linking " + endpoint.getLocalName() + " to IVR"; logger.info(log); link.join(IVR_JNDI_NAME, endpoint.getLocalName()); } public static void playAnnouncement(MsConnection connection, MsLink link, SipSession sipSession, String pathToAudioDirectory) { //playing the file MsEventFactory eventFactory = (MsEventFactory) connection.getSession().getProvider().getEventFactory(); MsEndpoint endpoint = link.getEndpoints()[0]; // Let us request for Announcement Complete event or Failure // in case if it happens MsRequestedEvent onCompleted = eventFactory.createRequestedEvent(MsAnnouncement.COMPLETED); onCompleted.setEventAction(MsEventAction.NOTIFY); MsRequestedEvent onFailed = eventFactory.createRequestedEvent(MsAnnouncement.FAILED); onFailed.setEventAction(MsEventAction.NOTIFY); MsPlayRequestedSignal play = (MsPlayRequestedSignal) eventFactory.createRequestedSignal(MsAnnouncement.PLAY); DTMFListener dtmfListener = new DTMFListener(eventFactory, link, sipSession, pathToAudioDirectory); link.addNotificationListener(dtmfListener); MsDtmfRequestedEvent dtmf = (MsDtmfRequestedEvent) eventFactory.createRequestedEvent(DTMF.TONE); MsRequestedSignal[] requestedSignals = new MsRequestedSignal[] { play }; MsRequestedEvent[] requestedEvents = new MsRequestedEvent[] { onCompleted, onFailed, dtmf }; if(sipSession.getAttribute("orderApproval") != null) { java.io.File speech = new File("speech.wav"); if(sipSession.getAttribute("adminApproval") != null) { speech = new File("adminspeech.wav"); } logger.info("Playing confirmation announcement : " + "file:///" + speech.getAbsolutePath()); play.setURL("file:///"+ speech.getAbsolutePath().replace('\\', '/')); endpoint.execute(requestedSignals, requestedEvents, link); logger.info("Waiting for DTMF at the same time.."); } else if (sipSession.getAttribute("deliveryDate") != null) { String announcementFile = pathToAudioDirectory + "OrderDeliveryDate.wav"; logger.info("Playing Delivery Date Announcement : " + announcementFile); play.setURL(announcementFile.replace('\\', '/')); endpoint.execute(requestedSignals, requestedEvents, link); logger.info("Waiting for DTMF at the same time.."); } else if (sipSession.getAttribute("shipping") != null) { java.io.File speech = new File("shipping.wav"); logger.info("Playing shipping announcement : " + "file:///" + speech.getAbsolutePath().replace('\\', '/')); MediaResourceListener mediaResourceListener = new MediaResourceListener(sipSession, link, connection); link.addNotificationListener(mediaResourceListener); play.setURL("file:///"+ speech.getAbsolutePath().replace('\\', '/')); endpoint.execute(requestedSignals, requestedEvents, link); logger.info("shipping announcement played. tearing down the call"); } } }