/**
* Start time:12:54:42 2008-11-24<br>
* Project: mobicents-media-server-controllers<br>
*
* @author <a href="mailto:baranowb@gmail.com">baranowb - Bartosz Baranowski
* </a>
* @author <a href="mailto:brainslog@gmail.com"> Alexandre Mendonca </a>
*/
package org.mobicents.mgcp.stack.test.endpointhandler;
import java.net.InetAddress;
import jain.protocol.ip.mgcp.JainMgcpCommandEvent;
import jain.protocol.ip.mgcp.JainMgcpEvent;
import jain.protocol.ip.mgcp.JainMgcpResponseEvent;
import jain.protocol.ip.mgcp.message.CreateConnection;
import jain.protocol.ip.mgcp.message.CreateConnectionResponse;
import jain.protocol.ip.mgcp.message.DeleteConnection;
import jain.protocol.ip.mgcp.message.DeleteConnectionResponse;
import jain.protocol.ip.mgcp.message.NotificationRequest;
import jain.protocol.ip.mgcp.message.NotificationRequestResponse;
import jain.protocol.ip.mgcp.message.Notify;
import jain.protocol.ip.mgcp.message.NotifyResponse;
import jain.protocol.ip.mgcp.message.parms.CallIdentifier;
import jain.protocol.ip.mgcp.message.parms.ConnectionDescriptor;
import jain.protocol.ip.mgcp.message.parms.ConnectionIdentifier;
import jain.protocol.ip.mgcp.message.parms.ConnectionMode;
import jain.protocol.ip.mgcp.message.parms.EndpointIdentifier;
import jain.protocol.ip.mgcp.message.parms.EventName;
import jain.protocol.ip.mgcp.message.parms.NotificationRequestParms;
import jain.protocol.ip.mgcp.message.parms.NotifiedEntity;
import jain.protocol.ip.mgcp.message.parms.RequestIdentifier;
import jain.protocol.ip.mgcp.message.parms.RequestedAction;
import jain.protocol.ip.mgcp.message.parms.RequestedEvent;
import jain.protocol.ip.mgcp.message.parms.ReturnCode;
import jain.protocol.ip.mgcp.pkg.MgcpEvent;
import jain.protocol.ip.mgcp.pkg.PackageName;
import org.apache.log4j.Logger;
import org.mobicents.mgcp.stack.JainMgcpExtendedListener;
import org.mobicents.mgcp.stack.JainMgcpStackProviderImpl;
import org.mobicents.mgcp.stack.MgcpResponseType;
/**
* Start time:12:54:42 2008-11-24<br>
* Project: mobicents-media-server-controllers<br>
*
* @author <a href="mailto:baranowb@gmail.com">baranowb - Bartosz Baranowski
* </a>
*/
public class CA implements JainMgcpExtendedListener {
private static Logger logger = Logger.getLogger(CA.class);
private JainMgcpStackProviderImpl caProvider;
private int mgStack = 0;
private InetAddress localAddress = null;
private int localPort = -1;
protected boolean sentCCR, receivedCCResponse, sentNotificationRequest,
receiveNotificationRequestResponse, receivedNotification,
sentNotificatioAnswer, sentDLCX, receivedDLCXA;
protected EndpointIdentifier specificEndpointId = null;
protected ConnectionIdentifier specificConnectionId = null;
public CA(JainMgcpStackProviderImpl caProvider,
JainMgcpStackProviderImpl mgwProvider, InetAddress localAddress,
int localPort) {
this.caProvider = caProvider;
mgStack = mgwProvider.getJainMgcpStack().getPort();
this.localAddress = localAddress;
this.localPort = localPort;
}
public void sendCRCX() {
try {
caProvider.addJainMgcpListener(this);
CallIdentifier callID = caProvider.getUniqueCallIdentifier();
EndpointIdentifier endpointID = new EndpointIdentifier(
"media/trunk/Announcement/$", "127.0.0.1:" + mgStack);
CreateConnection createConnection = new CreateConnection(this,
callID, endpointID, ConnectionMode.SendRecv);
String sdpData = "v=0\r\n"
+ "o=4855 13760799956958020 13760799956958020"
+ " IN IP4 127.0.0.1\r\n" + "s=mysession session\r\n"
+ "p=+46 8 52018010\r\n" + "c=IN IP4 127.0.0.1\r\n"
+ "t=0 0\r\n" + "m=audio 6022 RTP/AVP 0 4 18\r\n"
+ "a=rtpmap:0 PCMU/8000\r\n" + "a=rtpmap:4 G723/8000\r\n"
+ "a=rtpmap:18 G729A/8000\r\n" + "a=ptime:20\r\n";
createConnection
.setRemoteConnectionDescriptor(new ConnectionDescriptor(
sdpData));
createConnection.setTransactionHandle(caProvider
.getUniqueTransactionHandler());
System.err.println(" - "+localAddress+":"+localPort+" SENDING CRCX");
caProvider.sendMgcpEvents(new JainMgcpEvent[] { createConnection });
logger.debug(" CreateConnection command sent for TxId "
+ createConnection.getTransactionHandle() + " and CallId "
+ callID);
sentCCR = true;
} catch (Exception e) {
e.printStackTrace();
SimpleFlowTest.fail("Unexpected error: " + e);
}
}
/*
* (non-Javadoc)
*
* @see
* org.mobicents.mgcp.stack.JainMgcpExtendedListener#transactionEnded(int)
*/
public void transactionEnded(int handle) {
System.err.println("Transaction ended out on = " + localAddress + ":"
+ localPort);
}
/*
* (non-Javadoc)
*
* @see
* org.mobicents.mgcp.stack.JainMgcpExtendedListener#transactionRxTimedOut
* (jain.protocol.ip.mgcp.JainMgcpCommandEvent)
*/
public void transactionRxTimedOut(JainMgcpCommandEvent command) {
System.err.println("Transaction Rx timed out on = " + localAddress + ":"
+ localPort);
}
/*
* (non-Javadoc)
*
* @see
* org.mobicents.mgcp.stack.JainMgcpExtendedListener#transactionTxTimedOut
* (jain.protocol.ip.mgcp.JainMgcpCommandEvent)
*/
public void transactionTxTimedOut(JainMgcpCommandEvent command) {
System.err.println("Transaction Tx timed out on = " + localAddress + ":"
+ localPort);
}
/*
* (non-Javadoc)
*
* @see
* jain.protocol.ip.mgcp.JainMgcpListener#processMgcpCommandEvent(jain.protocol
* .ip.mgcp.JainMgcpCommandEvent)
*/
public void processMgcpCommandEvent(JainMgcpCommandEvent command) {
if (command instanceof Notify) {
receivedNotification = true;
System.err.println(" - "+localAddress+":"+localPort+" RECEIVE NOTIFY");
NotifyResponse response = new NotifyResponse(command.getSource(),
ReturnCode.Transaction_Executed_Normally);
response.setTransactionHandle(command.getTransactionHandle());
caProvider.sendMgcpEvents(new JainMgcpEvent[] { response });
sentNotificatioAnswer = true;
DeleteConnection deleteConnection = new DeleteConnection(this,
this.specificEndpointId);
deleteConnection.setConnectionIdentifier(this.specificConnectionId);
deleteConnection.setTransactionHandle(caProvider
.getUniqueTransactionHandler());
//Lets add NotificationParms
NotificationRequestParms parms=new NotificationRequestParms(new RequestIdentifier("1"));
deleteConnection.setNotificationRequestParms(parms);
System.err.println(" - "+localAddress+":"+localPort+" SEND DLCX");
caProvider.sendMgcpEvents(new JainMgcpEvent[] { deleteConnection });
sentDLCX = true;
}
}
/*
* (non-Javadoc)
*
* @see
* jain.protocol.ip.mgcp.JainMgcpListener#processMgcpResponseEvent(jain.
* protocol.ip.mgcp.JainMgcpResponseEvent)
*/
public void processMgcpResponseEvent(JainMgcpResponseEvent response) {
MgcpResponseType type = MgcpResponseType
.getResponseTypeFromCode(response.getReturnCode().getValue());
if (response instanceof CreateConnectionResponse) {
receivedCCResponse = true;
System.err.println(" - "+localAddress+":"+localPort+" RECEIVE CRCXResponse");
switch (type) {
case SuccessResponse:
// Tx executed properly
CreateConnectionResponse event = (CreateConnectionResponse) response;
ConnectionIdentifier connectionIdentifier = event
.getConnectionIdentifier();
this.specificEndpointId = event.getSpecificEndpointIdentifier();
NotificationRequest notificationRequest = new NotificationRequest(
this, specificEndpointId, this.caProvider
.getUniqueRequestIdentifier());
this.specificConnectionId=connectionIdentifier;
this.specificEndpointId=event.getSpecificEndpointIdentifier();
EventName[] signalRequests = { new EventName(
PackageName.Announcement, MgcpEvent.ann
.withParm("http://tests.ip:8080/test.wav"),
connectionIdentifier) };
notificationRequest.setSignalRequests(signalRequests);
RequestedAction[] actions = new RequestedAction[] { RequestedAction.NotifyImmediately };
RequestedEvent[] requestedEvents = {
new RequestedEvent(new EventName(PackageName.Dtmf,
MgcpEvent.dtmf0, connectionIdentifier), actions),
new RequestedEvent(new EventName(
PackageName.Announcement, MgcpEvent.of,
connectionIdentifier), actions) };
notificationRequest.setRequestedEvents(requestedEvents);
notificationRequest.setTransactionHandle(caProvider
.getUniqueTransactionHandler());
NotifiedEntity notifiedEntity = new NotifiedEntity(
this.localAddress.toString(), localAddress.toString(),
this.localPort);
notificationRequest.setNotifiedEntity(notifiedEntity);
System.err.println(" - "+localAddress+":"+localPort+" SEND NR");
caProvider
.sendMgcpEvents(new JainMgcpEvent[] { notificationRequest });
sentNotificationRequest = true;
break;
case ProvisionalResponse:
break;
default:
SimpleFlowTest.fail("Bad message: " + response);
}
} else if (response instanceof NotificationRequestResponse) {
receiveNotificationRequestResponse = true;
System.err.println(" - "+localAddress+":"+localPort+" Receive NRResponse");
switch (type) {
case SuccessResponse:
break;
case ProvisionalResponse:
break;
default:
SimpleFlowTest.fail("Bad message: " + response);
}
} else if (response instanceof DeleteConnectionResponse) {
receivedDLCXA = true;
switch (type) {
case SuccessResponse:
break;
case ProvisionalResponse:
break;
default:
SimpleFlowTest.fail("Bad message: " + response);
}
}
}
public void checkState() {
if (sentCCR && receivedCCResponse && sentNotificationRequest
&& receiveNotificationRequestResponse && receivedNotification
&& sentNotificatioAnswer && sentDLCX && receivedDLCXA) {
} else {
System.err.println("Receival sentCCR[" + sentCCR + "] receivedCCResponse["
+ receivedCCResponse + "] sentNotificationRequest["
+ sentNotificationRequest
+ "] receiveNotificationRequestResponse["
+ receiveNotificationRequestResponse
+ "] receivedNotification[" + receivedNotification
+ "] sentNotificatioAnswer[" + sentNotificatioAnswer
+ "] sentDLCX[" + sentDLCX + "] receivedDLCXA["
+ receivedDLCXA + "]");
SimpleFlowTest.fail("Receival sentCCR[" + sentCCR + "] receivedCCResponse["
+ receivedCCResponse + "] sentNotificationRequest["
+ sentNotificationRequest
+ "] receiveNotificationRequestResponse["
+ receiveNotificationRequestResponse
+ "] receivedNotification[" + receivedNotification
+ "] sentNotificatioAnswer[" + sentNotificatioAnswer
+ "] sentDLCX[" + sentDLCX + "] receivedDLCXA["
+ receivedDLCXA + "]");
}
}
}