#
# $Id$
#
# simple proxy script for forwarding to voicemail server
# for unavailable users
#

loadmodule "modules/sl/sl.so"
loadmodule "modules/tm/tm.so"
loadmodule "modules/rr/rr.so"
loadmodule "modules/maxfwd/maxfwd.so"
loadmodule "modules/mysql/mysql.so"
loadmodule "modules/group/group.so"
loadmodule "modules/usrloc/usrloc.so"
loadmodule "modules/registrar/registrar.so"

# time to give up on ringing -- global timer, applies to 
#    all transactions
modparam("tm", "fr_inv_timer", 90)

# database with user group membership
modparam("group", "db_url", "mysql://ser:heslo@localhost/ser")


# ---------------------  request routing logic -------------------
route {

	if (!mf_process_maxfwd_header("10")) {
		log("LOG: Too many hops\n");
		sl_send_reply("483", "Alas Too Many Hops");
		break;
	};

	if (!(method=="REGISTER")) record_route();
	if (loose_route()) {
		t_relay();
		break;
	};

	if (!uri==myself) {
		t_relay();
		break;
	};

	if (method == "REGISTER") {
		if (!save("location")) {
			sl_reply_error();
		};
		break;
	};

	# does the user wish redirection on no availability? (i.e., is he
	# in the voicemail group?) -- determine it now and store it in
	# flag 4, before we rewrite the flag using UsrLoc
	if (is_user_in("Request-URI", "voicemail")) {
		setflag(4);
	};

	# native SIP destinations are handled using our USRLOC DB
	if (!lookup("location")) {
		# handle user which was not found
		route(4);
		break;
	};

	# if user is on-line and is in voicemail group, enable redirection
	if (method == "INVITE" && isflagset(4)) {
		t_on_failure("1");
	};
	t_relay();
}

# ------------- handling of unavailable user ------------------
route[4] {

	# non-Voip -- just send "off-line"
	if (!(method == "INVITE" || method == "ACK" || method == "CANCEL")) {
		sl_send_reply("404", "Not Found");
		break;
	};

	# not voicemail subscriber
	if (!isflagset(4)) { 
		sl_send_reply("404", "Not Found and no voicemail turned on");
		break;
	};

	# forward to voicemail now
	rewritehostport("bat.iptel.org:5090");
	t_relay_to_udp("bat.iptel.org", "5090");	
}

# if forwarding downstream did not succeed, try voicemail running
# at bat.iptel.org:5090

failure_route[1] {
	revert_uri();
	rewritehostport("bat.iptel.org:5090");
	append_branch();
	t_relay_to_udp("bat.iptel.org", "5090");
}