module MGCP_CodecPort {

	import from IPL4asp_PortType all;
	import from IPL4asp_Types all;
	import from MGCP_Types all;

	type record MGCP_RecvFrom {
		ConnectionId	connId,
		HostName	remName,
		PortNumber	remPort,
		HostName	locName,
		PortNumber	locPort,
		MgcpMessage	msg
	};

	template MGCP_RecvFrom t_MGCP_RecvFrom(template MgcpMessage msg) := {
		connId := ?,
		remName := ?,
		remPort := ?,
		locName := ?,
		locPort := ?,
		msg := msg
	}

	type record MGCP_Send {
		ConnectionId	connId,
		MgcpMessage	msg
	}

	template MGCP_Send t_MGCP_Send(template ConnectionId connId, template MgcpMessage msg) := {
		connId := connId,
		msg := msg
	}

	private function IPL4_to_MGCP_RecvFrom(in ASP_RecvFrom pin, out MGCP_RecvFrom pout) {
		pout.connId := pin.connId;
		pout.remName := pin.remName;
		pout.remPort := pin.remPort;
		pout.locName := pin.locName;
		pout.locPort := pin.locPort;
		/* FIXME: This should actually be the below:
		   pout.msg := dec_MgcpMessage(oct2char(pin.msg)); - see
		   https://www.eclipse.org/forums/index.php/t/1088893/
		 */
		pout.msg := { response := dec_MgcpResponse(oct2char(pin.msg)) };
	} with { extension "prototype(fast)" };

	private function MGCP_to_IPL4_Send(in MGCP_Send pin, out ASP_Send pout) {
		pout.connId := pin.connId;
		pout.proto := { udp := {} };
		pout.msg := char2oct(enc_MgcpMessage(pin.msg));
	} with { extension "prototype(fast)" };

	type port MGCP_CODEC_PT message {
		out	MGCP_Send;
		in	MGCP_RecvFrom,
			ASP_ConnId_ReadyToRelease,
			ASP_Event;
	} with { extension "user IPL4asp_PT
		out(MGCP_Send -> ASP_Send:function(MGCP_to_IPL4_Send))
		in(ASP_RecvFrom -> MGCP_RecvFrom: function(IPL4_to_MGCP_RecvFrom);
		   ASP_ConnId_ReadyToRelease -> ASP_ConnId_ReadyToRelease: simple;
		   ASP_Event -> ASP_Event: simple)"
	}
}
