package org.mobicents.servlet.sip.conference.server.media;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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.pkg.MsAnnouncement;
public class AnnouncementConferenceParticipant extends ConferenceParticipant {
private static Log logger = LogFactory.getLog(AnnouncementConferenceParticipant.class);
public final static String ANNOUNCEMENT_ENDPOINT_QUERY = "media/trunk/Announcement/$";
private MsEndpoint endpoint;
private MsSession session;
private String fileUrl;
private ConcurrentHashMap<Conference, MsLink> links = new ConcurrentHashMap<Conference, MsLink>();
public AnnouncementConferenceParticipant(String name, String fileUrl, MsSession session) {
this.session = session;
this.fileUrl = fileUrl;
this.name = name;
}
/* (non-Javadoc)
* @see org.mobicents.servlet.sip.conference.ConferenceLeg#getEndpoint()
*/
public MsEndpoint getEndpoint() {
return endpoint;
}
/* (non-Javadoc)
* @see org.mobicents.servlet.sip.conference.ConferenceLeg#getSession()
*/
public MsSession getSession() {
return session;
}
/* (non-Javadoc)
* @see org.mobicents.servlet.sip.conference.ConferenceLeg#join(org.mobicents.servlet.sip.conference.Conference)
*/
@SuppressWarnings("serial")
public void join(Conference conference) {
join(conference, MsLinkMode.FULL_DUPLEX);
}
private void join(final Conference conference, MsLinkMode mode) {
final MsSession session = getSession();
MsLink link = session.createLink(mode);
link.addLinkListener(new MsLinkListener() {
public void linkCreated(MsLinkEvent evt) {
logger.info("link created " + evt);
conference.setConferenceEndpoint(evt.getSource().getEndpoints()[0]);
endpoint = evt.getSource().getEndpoints()[1];
}
public void linkConnected(MsLinkEvent evt) {
logger.info("CONF-ANN link connected " + evt.getSource().getEndpoints()[0].getLocalName()
+ " " + evt.getSource().getEndpoints()[1].getLocalName());
playOnLink(session, evt.getSource(), fileUrl, 1);
}
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 confEndpoint = conference.getConferenceEndpointName();
logger.info("Linking " + confEndpoint + " to ANN " + conference.getKey());
link.join(confEndpoint, ANNOUNCEMENT_ENDPOINT_QUERY);
links.put(conference, link);
}
/* (non-Javadoc)
* @see org.mobicents.servlet.sip.conference.ConferenceLeg#leave(org.mobicents.servlet.sip.conference.Conference)
*/
public void leave(Conference conference) {
links.get(conference).release();
links.remove(conference);
}
public static void playOnLink(MsSession session, MsLink link, String url, int endpointSide) {
MsEventFactory eventFactory = session.getProvider().getEventFactory();
MsPlayRequestedSignal play = null;
play = (MsPlayRequestedSignal) eventFactory.createRequestedSignal(MsAnnouncement.PLAY);
if(url.startsWith("http") || url.startsWith("file:") || url.startsWith("jar:")) {
play.setURL(url);
} else {
play.setURL("file://" + url);
}
MsRequestedEvent onCompleted = null;
MsRequestedEvent onFailed = null;
onCompleted = eventFactory.createRequestedEvent(MsAnnouncement.COMPLETED);
onCompleted.setEventAction(MsEventAction.NOTIFY);
onFailed = eventFactory.createRequestedEvent(MsAnnouncement.FAILED);
onFailed.setEventAction(MsEventAction.NOTIFY);
MsRequestedSignal[] requestedSignals = new MsRequestedSignal[]{play};
MsRequestedEvent[] requestedEvents = new MsRequestedEvent[]{onCompleted, onFailed};
link.getEndpoints()[endpointSide].execute(requestedSignals, requestedEvents, link);
}
@Override
public void kick(Conference conference) {
leave(conference);
}
@Override
public void mute(Conference conference) {
links.get(conference).setMode(MsLinkMode.HALF_DUPLEX);
//leave(conference);
//join(conference, MsLinkMode.HALF_DUPLEX);
muted = true;
}
@Override
public void unmute(Conference conference) {
links.get(conference).setMode(MsLinkMode.FULL_DUPLEX);
//leave(conference);
//join(conference, MsLinkMode.HALF_DUPLEX);
muted = false;
}
}