module MGCP_Adapter {

import from IPL4asp_Types all;

import from MGCP_Types all;
import from MGCP_CodecPort all;
import from MGCP_CodecPort_CtrlFunct all;

import from IPA_Emulation all;


type component MGCP_Adapter_CT {
	/* MGCP Codec Port for MGCP-over-UDP */ 
	port MGCP_CODEC_PT MGCP_UDP;
	port IPA_MGCP_PT MGCP;
	var integer g_mgcp_conn_id := -1;
}

modulepar {
	charstring mp_callagent_ip := "127.0.0.1";
	PortNumber mp_callagent_udp_port := 2727;
	charstring mp_mgw_ip := "127.0.0.1";
	PortNumber mp_mgw_udp_port := 2427;
}

/* build a receive template for receiving a MGCP message. You
 * pass the MGCP response template in, and it will generate an
 * MGCP_RecvFrom template that can match the primitives arriving on the
 * MGCP_CodecPort */
function tr_MGCP_RecvFrom_R(template MgcpResponse resp)
runs on MGCP_Adapter_CT return template MGCP_RecvFrom {
	var template MGCP_RecvFrom mrf := {
		connId := g_mgcp_conn_id,
		remName := mp_mgw_ip,
		remPort := mp_mgw_udp_port,
		locName := mp_callagent_ip,
		locPort := mp_callagent_udp_port,
		msg := { response := resp }
	}
	return mrf;
}


function main() runs on MGCP_Adapter_CT {
	var Result res;
	map(self:MGCP_UDP, system:MGCP_CODEC_PT);
	res := MGCP_CodecPort_CtrlFunct.f_IPL4_connect(MGCP_UDP, mp_mgw_ip, mp_mgw_udp_port,
						mp_callagent_ip, mp_callagent_udp_port,
						0, { udp:={} });
	g_mgcp_conn_id := res.connId;

	while (true) {
		var MgcpCommand mgcp_cmd;
		var MGCP_RecvFrom mrf;

		alt {
		/* From BSC/MGW via UDP up to MSC / Call Agent */
		[] MGCP_UDP.receive(tr_MGCP_RecvFrom_R(?)) -> value mrf {
			MGCP.send(mrf.msg.response);
			}

		/* From MSC / Call Agent down to BSC/MGW */
		[] MGCP.receive(MgcpCommand:?) -> value mgcp_cmd {
			var MgcpMessage msg := { command := mgcp_cmd };
			MGCP_UDP.send(t_MGCP_Send(g_mgcp_conn_id, msg));
			}

		}
	}
}

}
