package org.mobicents.servlet.sip.monitoring.util; import java.io.IOException; import javax.servlet.sip.SipServletRequest; 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.MsLinkMode; import org.mobicents.mscontrol.MsSession; /** * 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 Jean Deruelle * */ public class MediaConnectionListener implements MsConnectionListener { private static final long serialVersionUID = 1L; 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); } 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 event) { logger.info("connection mode recv only " + event); } public void connectionModeSendOnly(MsConnectionEvent event) { logger.info("connection mode send only " + event); } public void connectionModeSendRecv(MsConnectionEvent event) { logger.info("connection mod send/recv " + event); } 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 MediaLinkListener(link, connection, inviteRequest)); logger.info("Linking " + endpoint.getLocalName() + " to IVR"); link.join(IVR_JNDI_NAME, endpoint.getLocalName()); } }