package org.red5.app.sip;
import org.slf4j.Logger;
import org.zoolu.sip.provider.SipStack;
import org.red5.logging.Red5LoggerFactory;
import org.red5.server.api.scope.IScope;
import org.red5.server.api.stream.IBroadcastStream;
import java.util.*;
public final class SipUserManager {
private static final Logger log = Red5LoggerFactory.getLogger( SipUserManager.class, "sip" );
private static Map<String, SipUser> sessions;
private int sipStackDebugLevel = 8;
public SipUserManager() {
sessions = Collections.synchronizedMap(new HashMap<String, SipUser>());
}
public void createSipUser(String userid, ConnectionClientMethodInvoker connection, int sipPort, int rtpPort) {
SipUser sipUser = new SipUser(userid, connection, sipPort, rtpPort);
sessions.put(userid, sipUser);
}
public void login(String userid, String obproxy, String phone, String username, String password, String realm, String proxy) {
SipUser sipUser = sessions.get(userid);
if (sipUser != null) {
sipUser.login(obproxy, phone, username, password, realm, proxy);
}
}
public void registerSipUser(String userid) {
SipUser sipUser = sessions.get(userid);
if (sipUser != null) {
sipUser.register();
}
}
public void call(String userid, String destination) {
SipUser sipUser = sessions.get(userid);
if (sipUser != null) {
sipUser.call(destination);
}
}
public void passDtmf(String userid, String digits) {
SipUser sipUser = sessions.get(userid);
if (sipUser != null) {
sipUser.dtmf(digits);
}
}
public void accept(String userid) {
SipUser sipUser = sessions.get(userid);
if (sipUser != null) {
sipUser.accept();
}
}
public void unregister(String userid) {
SipUser sipUser = sessions.get(userid);
if (sipUser != null) {
sipUser.unregister();
}
}
public void hangup(String userid) {
SipUser sipUser = sessions.get(userid);
if (sipUser != null) {
sipUser.hangup();
}
}
public void startTalkStream(String userid, IBroadcastStream broadcastStream, IScope scope) {
SipUser sipUser = sessions.get(userid);
if (sipUser != null) {
sipUser.startTalkStream(broadcastStream, scope);
}
}
public void stopTalkStream(String userid, IBroadcastStream broadcastStream, IScope scope) {
SipUser sipUser = sessions.get(userid);
if (sipUser != null) {
sipUser.stopTalkStream(broadcastStream, scope);
}
}
private void remove(String userid) {
log.debug("Number of SipUsers in Manager before remove {}", sessions.size());
sessions.remove(userid);
}
public Collection< SipUser > getSIPUsers() {
return sessions.values();
}
public int getNumberOfSessions() {
return sessions.size();
}
public void close(String userid) {
SipUser sipUser = sessions.get(userid);
if (sipUser != null) {
sipUser.close();
remove(userid);
}
}
public void destroyAllSessions() {
Collection sipUsers = getSIPUsers();
SipUser sipUser;
for (Iterator iter = sipUsers.iterator(); iter.hasNext();) {
sipUser = (SipUser) iter.next();
sipUser.close();
sipUser = null;
}
sessions = new HashMap<String, SipUser>();
}
public void setSipStackDebugLevel(int sipStackDebugLevel) {
this.sipStackDebugLevel = sipStackDebugLevel;
initializeSipStack();
}
private void initializeSipStack() {
SipStack.init();
SipStack.debug_level = sipStackDebugLevel;
SipStack.log_path = "log";
}
}