package org.mobicents.media.server.ctrl.mgcp; import jain.protocol.ip.mgcp.JainMgcpResponseEvent; import jain.protocol.ip.mgcp.message.ModifyConnection; import jain.protocol.ip.mgcp.message.ModifyConnectionResponse; 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.EndpointIdentifier; import jain.protocol.ip.mgcp.message.parms.ReturnCode; import java.util.concurrent.Callable; import org.apache.log4j.Logger; import org.mobicents.media.server.spi.Connection; import org.mobicents.media.server.spi.ConnectionMode; import org.mobicents.media.server.spi.Endpoint; /** * * @author amit bhayani * */ public class ModifyConnectionAction implements Callable { private static Logger logger = Logger.getLogger(ModifyConnectionAction.class); private ModifyConnection mdcx; private MgcpController controller; private MgcpUtils utils = new MgcpUtils(); protected ModifyConnectionAction(MgcpController controller, ModifyConnection req) { this.controller = controller; this.mdcx = req; } public JainMgcpResponseEvent call() throws Exception { if (logger.isDebugEnabled()) { logger.debug("Request TX= " + mdcx.getTransactionHandle() + ", CallID = " + mdcx.getCallIdentifier() + ", Mode=" + mdcx.getMode() + ", Endpoint = " + mdcx.getEndpointIdentifier() + ", SDP present = " + (mdcx.getRemoteConnectionDescriptor() != null)); } ModifyConnectionResponse response = null; EndpointIdentifier endpointID = mdcx.getEndpointIdentifier(); String localEndpoint = endpointID.getLocalEndpointName(); if (localEndpoint.contains("*") || localEndpoint.contains("$")) { return reject(ReturnCode.Protocol_Error); } CallIdentifier callID = mdcx.getCallIdentifier(); ConnectionIdentifier connectionID = mdcx.getConnectionIdentifier(); ConnectionMode mode = null; if (mdcx.getMode() != null) { mode = utils.getMode(mdcx.getMode()); } Endpoint endpoint = null; try { endpoint = controller.getNamingService().lookup(localEndpoint, true); } catch (Exception e) { return reject(ReturnCode.Endpoint_Unknown); } ConnectionActivity connectionActivity = controller.getActivity(localEndpoint, connectionID.toString()); Connection connection = connectionActivity.getMediaConnection(); if (connection.getMode() != mode) { connection.setMode(mode); } ConnectionDescriptor remoteConnectionDescriptor = mdcx.getRemoteConnectionDescriptor(); if (remoteConnectionDescriptor != null) { connection.setRemoteDescriptor(remoteConnectionDescriptor.toString()); } response = new ModifyConnectionResponse(this, ReturnCode.Transaction_Executed_Normally); response.setTransactionHandle(mdcx.getTransactionHandle()); return response; } private ModifyConnectionResponse reject(ReturnCode code) { ModifyConnectionResponse response = new ModifyConnectionResponse(this, code); response.setTransactionHandle(mdcx.getTransactionHandle()); return response; } }