package org.mobicents.slee.resource.mgcp.ra;
import jain.protocol.ip.mgcp.JainMgcpCommandEvent;
import jain.protocol.ip.mgcp.JainMgcpEvent;
import jain.protocol.ip.mgcp.JainMgcpListener;
import jain.protocol.ip.mgcp.JainMgcpResponseEvent;
import jain.protocol.ip.mgcp.JainMgcpStack;
import jain.protocol.ip.mgcp.message.CreateConnectionResponse;
import jain.protocol.ip.mgcp.message.parms.CallIdentifier;
import jain.protocol.ip.mgcp.message.parms.ConnectionIdentifier;
import jain.protocol.ip.mgcp.message.parms.EndpointIdentifier;
import jain.protocol.ip.mgcp.message.parms.RequestIdentifier;
import java.util.HashMap;
import java.util.List;
import java.util.TooManyListenersException;
import javax.slee.facilities.Tracer;
import net.java.slee.resource.mgcp.JainMgcpProvider;
import net.java.slee.resource.mgcp.MgcpConnectionActivity;
import net.java.slee.resource.mgcp.MgcpEndpointActivity;
import org.mobicents.mgcp.stack.JainMgcpExtendedListener;
import org.mobicents.mgcp.stack.JainMgcpStackProviderImpl;
/**
*
* @author amit bhayani
*
*/
public class JainMgcpProviderImpl implements JainMgcpProvider {
private Tracer tracer = null;
private final MgcpResourceAdaptor ra;
private final JainMgcpStackProviderImpl provider;
private MgcpStackListener listener = new MgcpStackListener();
private HashMap<Integer, JainMgcpCommandEvent> commandsEventMap = new HashMap<Integer, JainMgcpCommandEvent>();
public JainMgcpProviderImpl(MgcpResourceAdaptor ra, jain.protocol.ip.mgcp.JainMgcpProvider jainMgcpProvider,
Tracer tracer) {
this.ra = ra;
this.provider = (JainMgcpStackProviderImpl) jainMgcpProvider;
this.tracer = tracer;
try {
this.provider.addJainMgcpListener(listener);
} catch (Throwable e) {
String msg = "Couldn't register MgcpStackListener to JainMgcpStackProviderImpl";
tracer.severe(msg, e);
throw new RuntimeException(msg, e);
}
}
public MgcpConnectionActivity getConnectionActivity(ConnectionIdentifier connectionIdentifier,
EndpointIdentifier endpointIdentifier) {
return getConnectionActivity(connectionIdentifier, endpointIdentifier, true);
}
protected MgcpConnectionActivity getConnectionActivity(ConnectionIdentifier connectionIdentifier,
EndpointIdentifier endpointIdentifier, boolean startActivity) {
MgcpConnectionActivityHandle handle = ra.getMgcpActivityManager().getMgcpConnectionActivityHandle(
connectionIdentifier, endpointIdentifier, -1);
if (handle != null) {
return ra.getMgcpActivityManager().getMgcpConnectionActivity(handle);
} else {
MgcpConnectionActivityImpl activity = new MgcpConnectionActivityImpl(connectionIdentifier,
endpointIdentifier, ra);
handle = ra.getMgcpActivityManager().putMgcpConnectionActivity(activity);
if (startActivity) {
try {
ra.getSleeEndpoint().startActivity(handle, activity);
} catch (Exception e) {
String msg = "Failed to start activity";
tracer.severe(msg, e);
if (handle != null) {
ra.getMgcpActivityManager().removeMgcpActivity(handle);
}
activity = null;
}
}
return activity;
}
}
public MgcpConnectionActivity getConnectionActivity(int transactionHandle, EndpointIdentifier endpointIdentifier) {
return getConnectionActivity(transactionHandle, endpointIdentifier, true);
}
protected MgcpConnectionActivity getConnectionActivity(int transactionHandle,
EndpointIdentifier endpointIdentifier, boolean startActivity) {
MgcpConnectionActivityHandle handle = ra.getMgcpActivityManager().getMgcpConnectionActivityHandle(null,
endpointIdentifier, transactionHandle);
if (handle != null) {
return ra.getMgcpActivityManager().getMgcpConnectionActivity(handle);
} else if (startActivity) {
MgcpConnectionActivityImpl activity = new MgcpConnectionActivityImpl(transactionHandle, endpointIdentifier,
ra);
handle = ra.getMgcpActivityManager().putMgcpConnectionActivity(activity);
try {
ra.getSleeEndpoint().startActivity(handle, activity);
} catch (Exception e) {
String msg = "Failed to start activity";
tracer.severe(msg, e);
if (handle != null) {
ra.getMgcpActivityManager().removeMgcpActivity(handle);
}
activity = null;
}
return activity;
}
return null;
}
public List<MgcpConnectionActivity> getConnectionActivities(EndpointIdentifier endpointIdentifier) {
return ra.getMgcpActivityManager().getMgcpConnectionActivities(endpointIdentifier);
}
public MgcpEndpointActivity getEndpointActivity(EndpointIdentifier endpointIdentifier) {
return getEndpointActivity(endpointIdentifier, true);
}
protected MgcpEndpointActivity getEndpointActivity(EndpointIdentifier endpointIdentifier, boolean startActivity) {
MgcpEndpointActivityHandle handle = new MgcpEndpointActivityHandle(endpointIdentifier.toString());
MgcpEndpointActivityImpl activity = ra.getMgcpActivityManager().getMgcpEndpointActivity(handle);
if (activity != null) {
return activity;
} else if (startActivity) {
activity = new MgcpEndpointActivityImpl(ra, endpointIdentifier);
ra.getMgcpActivityManager().putMgcpEndpointActivity(activity);
try {
ra.getSleeEndpoint().startActivity(handle, activity);
} catch (Exception e) {
String msg = "Failed to start activity";
tracer.severe(msg, e);
ra.getMgcpActivityManager().removeMgcpActivity(handle);
activity = null;
}
return activity;
}
return null;
}
public void addJainMgcpListener(JainMgcpListener arg0) throws TooManyListenersException {
throw new TooManyListenersException("this provider does not support listeners");
}
public JainMgcpStack getJainMgcpStack() {
return this.provider.getJainMgcpStack();
}
public void removeJainMgcpListener(JainMgcpListener arg0) {
// do nothing
}
public void sendMgcpEvents(JainMgcpEvent[] events) throws IllegalArgumentException {
// provider.sendMgcpEvents(events);
for (JainMgcpEvent event : events) {
if (event instanceof CreateConnectionResponse) {
ra.sendingCreateConnectionResponse((CreateConnectionResponse) event);
}
if (event instanceof JainMgcpCommandEvent) {
commandsEventMap.put(event.getTransactionHandle(), (JainMgcpCommandEvent) event);
}
}
provider.sendMgcpEvents(events);
}
public int getUniqueTransactionHandler() {
// retreives current counter value and sets next one
return provider.getUniqueTransactionHandler();
}
public CallIdentifier getUniqueCallIdentifier() {
return provider.getUniqueCallIdentifier();
}
public RequestIdentifier getUniqueRequestIdentifier() {
return provider.getUniqueRequestIdentifier();
}
private class MgcpStackListener implements JainMgcpExtendedListener {
public void processMgcpCommandEvent(JainMgcpCommandEvent event) {
ra.processMgcpCommandEvent(event);
}
public void processMgcpResponseEvent(JainMgcpResponseEvent response) {
ra.processMgcpResponseEvent(response, commandsEventMap.remove(response.getTransactionHandle()));
}
public void transactionEnded(int handle) {
// TODO: ????
}
public void transactionRxTimedOut(JainMgcpCommandEvent command) {
ra.processRxTimeout(command);
commandsEventMap.remove(command.getTransactionHandle());
}
public void transactionTxTimedOut(JainMgcpCommandEvent command) {
ra.processTxTimeout(command);
commandsEventMap.remove(command.getTransactionHandle());
}
}
}