#!/bin/sh

dump_file="/var/cache/alterator/printers-drivers.dump"

exit_handler()
{
	local rc=$?
	trap - 0
	rm -f -- $TEMPORARY_PPD
	exit $rc
}

trap exit_handler 0 1 2 3 9 13

reload_smb()
{
	! service smb status >/dev/null 2>&1 || service smb reload >/dev/null 2>&1
}

LPSTAT="/usr/bin/lpstat"
LPADMIN="/usr/sbin/lpadmin"
LPR="/usr/bin/lpr"
FOOMATIC_PPD_GENERATOR="/usr/bin/foomatic-ppdfile"
HELPERSDIR="/usr/lib/alterator-printers"

. alterator-sh-functions

on_message()
{
	case "$in_action" in
		list)
			echo '('
			for printer in `LANG=C "$LPSTAT" -a|egrep '^([0-9a-zA-Z_-])+'|cut -f1 -d' '|sed 's,.*,&,'`;do
				printf '("%s" label "%s")' "$printer" "$printer"
			done
			echo ')'
			;;
		delete)
			"$LPADMIN" -x "$in_prnname"
			reload_smb
			write_nop
			;;
		read)
			echo '('
			if [ "$in__objects" = "server" ];then
				service cups status >/dev/null 2>&1 || echo "nocups #t"
				[ -s "$dump_file" ] || echo "nodump #t"
				LANG=C "$LPSTAT" -d|
					sed -r 's,system default destination:[[:space:]]*,,;
						s,.*,default \"&\",'
			else
				#state
				if LANG=C "$LPSTAT" -p "$in_prnname"|grep -qs 'enabled';then
					printf '%s "%s"' "status" "started"
				else
					printf '%s "%s"' "status" "stopped"
				fi
				#uri
				URI=`LANG=C "$LPSTAT" -v "$in_prnname"|sed 's,device for[^:]*:[[:space:]]*,,'`
				printf '%s "%s"' "uri" "$URI"
				lpoptions -p "$in_prnname"|
				sed -r "s/.*(printer-info=(('[^']+')|([^'[:space:]]+))).*/\2/;
					s/'//g; s,.*,description \"&\","
				#driver
				echo "driver" \"`egrep -m2 --with-filename '^\*(Manufacturer|ModelName)' /etc/cups/ppd/"$in_prnname".ppd 2>/dev/null|
					awk -f "$HELPERSDIR"/dump_ppds.awk`\"
			fi
			echo ')'
			;;
		write)
			if [ "$in__objects" = "test_page" ];then
				"$LPR" -P "$in_printer" /usr/share/printer-testpages/cupspage.ps
			elif [ "$in__objects" = "server" ];then
				"$LPADMIN" -d "$in_default"
			elif [ "$in__objects" = "dodump" ];then
				"$HELPERSDIR"/update-printers-db
			else
				"$LPADMIN" -p "$in_prnname" -v "$in_uri" ${in_description:+-D "$in_description"}

				if [ "$in_status" = "started" ];then
					/usr/sbin/cupsenable "$in_prnname"
					/usr/sbin/accept "$in_prnname"
				elif [ "$in_status" = "stopped" ];then
					/usr/sbin/cupsdisable "$in_prnname"
				fi

				if echo "$in_ppd"|grep -q '^/';then
					ppdfile="$in_ppd"
				else
					TEMPORARY_PPD=`mktemp -t "$in_prnname".ppd.XXXXXX`
					ppdfile="$TEMPORARY_PPD"
					"$FOOMATIC_PPD_GENERATOR" -p "$in_ppd" >$ppdfile
				fi

				"$LPADMIN" -p "$in_prnname" -P "$ppdfile" -o PageSize=A4
				reload_smb
			fi
			write_nop
			;;
		*)
			echo '#f'
			;;
	esac
}
message_loop
