package org.red5.server.webapp.sip;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.red5.app.sip.SipUserManager;
import org.red5.app.sip.SipUser;
import org.red5.logging.Red5LoggerFactory;
import org.red5.server.adapter.MultiThreadedApplicationAdapter;
import org.red5.server.api.IClient;
import org.red5.server.api.IConnection;
import org.red5.server.api.Red5;
import org.red5.server.api.scope.IScope;
import org.red5.server.api.service.IServiceCapableConnection;
import org.red5.server.api.stream.IBroadcastStream;
import org.red5.server.api.stream.IPlayItem;
import org.red5.server.api.stream.IPlaylistSubscriberStream;
import org.red5.server.api.stream.IStreamAwareScopeHandler;
import org.red5.server.api.stream.ISubscriberStream;
public class SipPhoneApplication extends MultiThreadedApplicationAdapter implements IStreamAwareScopeHandler {
protected static Logger log = Red5LoggerFactory.getLogger( SipPhoneApplication.class, "sip" );
private SipUserManager sipManager;
private boolean available = false;
private int startSIPPort = 5070;
private int stopSIPPort = 5099;
private int sipPort;
private int startRTPPort = 3000;
private int stopRTPPort = 3029;
private int rtpPort;
private Map< String, String > userNames = new HashMap< String, String >();
@Override
public boolean appStart( IScope scope ) {
loginfo( "Red5SIP starting in scope " + scope.getName() + " " + System.getProperty( "user.dir" ) );
loginfo("Red5SIP using RTP port range " + startRTPPort + "-" + stopRTPPort + ", using SIP port range " + startSIPPort + "-" + stopSIPPort);
sipPort = startSIPPort;
rtpPort = startRTPPort;
return true;
}
@Override
public void appStop( IScope scope ) {
loginfo( "Red5SIP stopping in scope " + scope.getName() );
sipManager.destroyAllSessions();
}
@Override
public boolean appConnect( IConnection conn, Object[] params ) {
IServiceCapableConnection service = (IServiceCapableConnection) conn;
loginfo( "Red5SIP Client connected " + conn.getClient().getId() + " service " + service );
return true;
}
@Override
public boolean appJoin( IClient client, IScope scope ) {
loginfo( "Red5SIP Client joined app " + client.getId() );
IConnection conn = Red5.getConnectionLocal();
IServiceCapableConnection service = (IServiceCapableConnection) conn;
return true;
}
@Override
public void appLeave( IClient client, IScope scope ) {
IConnection conn = Red5.getConnectionLocal();
loginfo( "Red5SIP Client leaving app " + client.getId() );
if ( userNames.containsKey( client.getId() ) ) {
loginfo( "Red5SIP Client closing client " + userNames.get( client.getId() ) );
// sipManager.closeSIPUser( userNames.get( client.getId() ) );
userNames.remove( client.getId() );
}
}
public void streamPublishStart( IBroadcastStream stream ) {
loginfo( "Red5SIP Stream publish start: " + stream.getPublishedName() );
IConnection current = Red5.getConnectionLocal();
}
public void streamBroadcastClose( IBroadcastStream stream ) {
loginfo( "Red5SIP Stream broadcast close: " + stream.getPublishedName() );
}
public void streamBroadcastStart( IBroadcastStream stream ) {
loginfo( "Red5SIP Stream broadcast start: " + stream.getPublishedName() );
}
public void streamPlaylistItemPlay( IPlaylistSubscriberStream stream, IPlayItem item, boolean isLive ) {
loginfo( "Red5SIP Stream play: " + item.getName() );
}
public void streamPlaylistItemStop( IPlaylistSubscriberStream stream, IPlayItem item ) {
loginfo( "Red5SIP Stream stop: " + item.getName() );
}
public void streamPlaylistVODItemPause( IPlaylistSubscriberStream stream, IPlayItem item, int position ) { }
public void streamPlaylistVODItemResume( IPlaylistSubscriberStream stream, IPlayItem item, int position ) { }
public void streamPlaylistVODItemSeek( IPlaylistSubscriberStream stream, IPlayItem item, int position ) { }
public void streamSubscriberClose( ISubscriberStream stream ) {
loginfo( "Red5SIP Stream subscribe close: " + stream.getName() );
}
public void streamSubscriberStart( ISubscriberStream stream ) {
loginfo( "Red5SIP Stream subscribe start: " + stream.getName() );
}
public Set< String > getStreams() {
IConnection conn = Red5.getConnectionLocal();
return getBroadcastStreamNames( conn.getScope() );
}
public void onPing() {
loginfo( "Red5SIP Ping" );
}
public void open(String obproxy,String uid, String phone,String username, String password, String realm, String proxy) {
loginfo("Red5SIP open");
login(obproxy, uid, phone, username, password, realm, proxy);
register(uid);
}
public void login(String obproxy, String uid, String phone, String username, String password, String realm, String proxy) {
loginfo("Red5SIP login " + uid);
/*
IConnection conn = Red5.getConnectionLocal();
IServiceCapableConnection service = (IServiceCapableConnection) conn;
SipUser sipUser = sipManager.getSIPUser(uid);
if(sipUser == null) {
loginfo("Red5SIP open creating sipUser for " + username + " on sip port " + sipPort + " audio port " + rtpPort + " uid " + uid );
try {
sipUser = new User(conn.getClient().getId(), service, sipPort, rtpPort);
sipManager.addSIPUser(uid, sipUser);
} catch (Exception e) {
loginfo("open error " + e);
}
}
sipUser.login(obproxy,phone,username, password, realm, proxy);
userNames.put(conn.getClient().getId(), uid);
sipPort++;
if (sipPort > stopSIPPort) sipPort = startSIPPort;
rtpPort++;
if (rtpPort > stopRTPPort) rtpPort = startRTPPort;
*/
}
public void register(String uid) {
loginfo("Red5SIP register");
/*
User sipUser = sipManager.getSIPUser(uid);
if(sipUser != null) {
sipUser.register();
}
*/
}
public void call(String uid, String destination) {
loginfo("Red5SIP Call " + destination);
/*
User sipUser = sipManager.getSIPUser(uid);
if(sipUser != null) {
loginfo("Red5SIP Call found user " + uid + " making call to " + destination);
sipUser.call(destination);
}
*/
}
/** call tarensfer test by Lior */
public void transfer(String uid, String transferTo) {
loginfo("Red5SIP transfer " + transferTo);
/*
User sipUser = sipManager.getSIPUser(uid);
if(sipUser != null) {
loginfo("Red5SIP Call found user " + uid + " transfering call to " + transferTo);
sipUser.transfer(transferTo);
}
*/
}
/** transfer end tetst */
public void addToConf(String uid, String conf) {
loginfo("Red5SIP addToConf " + conf);
/*
User sipUser = sipManager.getSIPUser(uid);
if(sipUser != null) {
loginfo("Red5SIP addToConf found user " + uid + " adding to conf " + conf);
sipUser.transfer("8" + conf);
}
*/
}
public void joinConf(String uid, String conf) {
loginfo("Red5SIP joinConf " + conf);
/*
User sipUser = sipManager.getSIPUser(uid);
if(sipUser != null) {
loginfo("Red5SIP joinConf found user " + uid + " joining conf " + conf);
sipUser.call("8" + conf );
}
*/
}
public void dtmf(String uid, String digits) {
loginfo("Red5SIP DTMF " + digits);
/*
User sipUser = sipManager.getSIPUser(uid);
if(sipUser != null) {
loginfo("Red5SIP DTMF found user " + uid + " sending dtmf digits " + digits);
sipUser.dtmf(digits);
}
*/
}
public void accept(String uid) {
loginfo("Red5SIP Accept");
/*
User sipUser = sipManager.getSIPUser(uid);
if(sipUser != null) {
sipUser.accept();
}
*/
}
//Lior Add
public void unregister(String uid) {
loginfo("Red5SIP unregister");
/*
User sipUser = sipManager.getSIPUser(uid);
if(sipUser != null) {
sipUser.unregister();
}
*/
}
public void hangup(String uid) {
loginfo("Red5SIP Hangup");
/*
User sipUser = sipManager.getSIPUser(uid);
if(sipUser != null) {
sipUser.hangup();
}
*/
}
public void streamStatus(String uid, String status) {
loginfo("Red5SIP streamStatus");
/*
User sipUser = sipManager.getSIPUser(uid);
if(sipUser != null) {
sipUser.streamStatus(status);
}
*/
}
public void close(String uid) {
loginfo("Red5SIP endRegister");
/*
IConnection conn = Red5.getConnectionLocal();
sipManager.closeSIPUser(uid);
userNames.remove(conn.getClient().getId());
*/
}
private void loginfo( String s ) {
log.info( s );
}
public void setSipUserManager(SipUserManager sum) {
sipManager = sum;
}
}