module MGCP_CodecPort {

/* Simple MGCP Codec Port, translating between raw UDP primitives with
 * octetstring payload towards the IPL4asp provider, and MGCP primitives
 * which carry the decoded MGCP data types as payload.
 *
 * (C) 2017 by Harald Welte <laforge@gnumonks.org>
 * All rights reserved.
 *
 * Released under the terms of GNU General Public License, Version 2 or
 * (at your option) any later version.
 */

	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 := dec_MgcpMessage(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)"
	}
}
