module SDP_Templates {

/* SDP Templates, building on top of SDP_Types from Ericsson.
 *
 * (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 SDP_Types all;

/* SDP Templates */
template SDP_Origin ts_SDP_origin(charstring addr, charstring session_id,
				  charstring session_version := "1",
				  charstring addr_type := "IP4",
				  charstring user_name := "-") := {
	user_name := user_name,
	session_id := session_id,
	session_version := session_version,
	net_type := "IN",
	addr_type := addr_type,
	addr := addr
}

template SDP_connection ts_SDP_connection_IP(charstring addr, charstring addr_type := "IP4",
					     template integer ttl := omit,
					     template integer num_of_addr := omit) :={
	net_type := "IN",
	addr_type := addr_type,
	conn_addr := {
		addr := addr,
		ttl := ttl,
		num_of_addr := num_of_addr
	}
}

template SDP_connection tr_SDP_connection_IP(template charstring addr, template charstring addr_type := ?,
					     template integer ttl := *,
					     template integer num_of_addr := *) := {
	net_type := "IN",
	addr_type := addr_type,
	conn_addr := {
		addr := addr,
		ttl := ttl,
		num_of_addr := num_of_addr
	}
}

template SDP_time ts_SDP_time(charstring beg, charstring end) := {
	time_field := {
		start_time := beg,
		stop_time := end
	},
	time_repeat := omit
}

template SDP_media_desc ts_SDP_media_desc(integer port_number, SDP_fmt_list fmts,
					  SDP_attribute_list attributes) := {
	media_field := {
		media := "audio",
		ports := {
			port_number := port_number,
			num_of_ports := omit
		},
		transport := "RTP/AVP",
		fmts := fmts
	},
	information := omit,
	connections := omit,
	bandwidth := omit,
	key := omit,
	attributes := attributes
}

template SDP_media_desc tr_SDP_media_desc(template integer port_number := ?,
					  template SDP_fmt_list fmts := ?,
					  template SDP_attribute_list attributes := ?) := {
	media_field := {
		media := "audio",
		ports := {
			port_number := port_number,
			num_of_ports := omit
		},
		transport := "RTP/AVP",
		fmts := fmts
	},
	information := *,
	connections := *,
	bandwidth := *,
	key := *,
	attributes := attributes
}

/* master template for generating SDP based in template arguments */
template SDP_Message ts_SDP(charstring local_addr, charstring remote_addr,
			    charstring session_id, charstring session_version,
			    integer rtp_port, SDP_fmt_list fmts,
			    SDP_attribute_list attributes) := {
	protocol_version := 0,
	origin := ts_SDP_origin(local_addr, session_id, session_version, f_sdp_addr2addrtype(local_addr)),
	session_name := "-",
	information := omit,
	uri := omit,
	emails := omit,
	phone_numbers := omit,
	connection := ts_SDP_connection_IP(remote_addr, f_sdp_addr2addrtype(remote_addr)),
	bandwidth := omit,
	times := { ts_SDP_time("0","0") },
	timezone_adjustments := omit,
	key := omit,
	attributes := omit,
	media_list := { ts_SDP_media_desc(rtp_port, fmts, attributes) }
}

template SDP_Message tr_SDP(template charstring remote_addr := ?, template integer rtp_port := ?) := {
	protocol_version := 0,
	origin := ?,
	session_name := ?,
	information := *,
	uri := *,
	emails := *,
	phone_numbers := *,
	connection := tr_SDP_connection_IP(remote_addr, ?),
	bandwidth := *,
	times := ?,
	timezone_adjustments := *,
	key := *,
	attributes := *,
	media_list := { tr_SDP_media_desc(rtp_port) }
}

template SDP_attribute ts_SDP_rtpmap(integer fmt, charstring val) := {
	rtpmap := {
		attr_value := int2str(fmt) & " " & val
	}
}
template SDP_attribute ts_SDP_ptime(integer p) := {
	ptime := {
		attr_value := int2str(p)
	}
}
template SDP_attribute ts_SDP_fmtp(integer fmt, charstring val) := {
	fmtp := {
		attr_value := int2str(fmt) & " " & val
	}
}

function f_sdp_addr2addrtype(charstring addr) return charstring {
	for (var integer i := 0; i < lengthof(addr); i := i + 1) {
		if (addr[i] == ":") {
			return "IP6";
		}
	}
	return "IP4";
}

}
