module TRXC_CodecPort {

import from IPL4asp_PortType all;
import from IPL4asp_Types all;
import from TRXC_Types all;

type record TRXC_RecvFrom {
	ConnectionId	connId,
	HostName	remName,
	PortNumber	remPort,
	HostName	locName,
	PortNumber	locPort,
	TrxcMessage	msg
}

template TRXC_RecvFrom tr_TRXC_RecvFrom(template ConnectionId cid, template TrxcMessage msg) := {
	connId := cid,
	remName := ?,
	remPort := ?,
	locName := ?,
	locPort := ?,
	msg := msg
}

type record TRXC_Send {
	ConnectionId	connId,
	TrxcMessage	msg
}

private function IPL4_to_TRXC_RecvFrom(in ASP_RecvFrom pin, out TRXC_RecvFrom pout) {
	pout.connId := pin.connId;
	pout.remName := pin.remName;
	pout.remPort := pin.remPort;
	pout.locName := pin.locName;
	pout.locPort := pin.locPort;
	pout.msg := dec_TrxcMessage(oct2char(pin.msg));
} with { extension "prototype(fast)" };

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

type port TRXC_CODEC_PT message {
	out	TRXC_Send;
	in	TRXC_RecvFrom,
		ASP_ConnId_ReadyToRelease,
		ASP_Event;
} with { extension "user IPL4asp_PT
	out(TRXC_Send -> ASP_Send: function(TRXC_to_IPL4_Send))
	in(ASP_RecvFrom -> TRXC_RecvFrom: function(IPL4_to_TRXC_RecvFrom);
	   ASP_ConnId_ReadyToRelease -> ASP_ConnId_ReadyToRelease: simple;
	   ASP_Event -> ASP_Event: simple)"
}

template (value) TRXC_Send ts_TRXC_Send(ConnectionId cid, template (value) TrxcMessage msg) := {
	connId := cid,
	msg := msg
}

function f_TRXC_transceive(TRXC_CODEC_PT pt, ConnectionId conn_id,
			   template (value) TrxcMessage tx,
			   template TrxcMessage tr := ?) return TrxcMessage {
	var TRXC_RecvFrom rf;
	timer T := 3.0;
	/* build better default template */
	if (istemplatekind(tr, "?")) {
		tr := {
			rsp := {
				verb := tx.cmd.verb,
				status := ?,
				params := *
			}
		};
	}
	pt.send(ts_TRXC_Send(conn_id, tx));
	T.start;
	alt {
	[] pt.receive(tr_TRXC_RecvFrom(conn_id, tr)) -> value rf {
		return rf.msg;
		}
	[] T.timeout {
		setverdict(fail, "Timeout waiting for ", tr, " on ", pt);
		mtc.stop;
		}
	}
	return rf.msg;
}

}
