package org.mobicents.servlet.sip.conference.server.media;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.servlet.sip.SipServletMessage;
import javax.servlet.sip.SipServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.mobicents.mscontrol.MsConnection;
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;
public class EndpointConferenceParticipant extends ConferenceParticipant {
private static Log logger = LogFactory.getLog(EndpointConferenceParticipant.class);
private MsEndpoint endpoint;
private MsSession session;
private MsConnection uaPrConnection;
private SipServletMessage message;
private ConcurrentHashMap<Conference, MsLink> links = new ConcurrentHashMap<Conference, MsLink>();
public EndpointConferenceParticipant(String name, MsEndpoint endpoint, MsSession session, SipServletMessage message, MsConnection connection) {
this.endpoint = endpoint;
this.session = session;
this.name = name;
this.message = message;
this.uaPrConnection = connection;
}
/* (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(final Conference conference) {
join(conference, MsLinkMode.FULL_DUPLEX);
}
private void join(final Conference conference, MsLinkMode mode) {
MsEndpoint endpoint = getEndpoint();
//provider.addNotificationListener(this);
final MsSession session = getSession();
final MsLink link = session.createLink(mode);
link.addLinkListener(new MsLinkListener() {
public void linkCreated(MsLinkEvent evt) {
logger.info("link created " + evt);
}
public void linkConnected(MsLinkEvent evt) {
logger.info("PR-CONF link connected " +link.getEndpoints()[0].getLocalName() +
" " + link.getEndpoints()[1].getLocalName());
conference.setConferenceEndpoint(link.getEndpoints()[0]);
//AnnouncementConferenceParticipant.playOnLink(session, link, "/home/vralev/control/mobicents/servers/media/examples/mms-demo/web/src/main/webapp/audio/cuckoo.wav", 0);
}
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 CONF" + conference.getKey();
logger.info(log);
String confEndpoint = conference.getConferenceEndpointName();
link.join(confEndpoint, endpoint.getLocalName());
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) {
try {
links.get(conference).release();
uaPrConnection.release();
} catch (Exception e) {
logger.error(e);
}
links.remove(conference);
}
@Override
public void kick(Conference conference) {
leave(conference);
try {
message.getSession().createRequest("BYE").send();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void mute(Conference conference) {
links.get(conference).setMode(MsLinkMode.HALF_DUPLEX);
muted = true;
}
@Override
public void unmute(Conference conference) {
links.get(conference).setMode(MsLinkMode.FULL_DUPLEX);
muted = false;
}
}