#!/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 '('
			case "$in__objects" in
			    printers)
				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
				;;
			    drv-vendors)
				awk -F';' '{print "(\"" $1 "\")" }' "$dump_file" | sort -u
				;;
			    *)
				awk -F';' "/^$in__objects/"'{print "(\"" $2 "\")" }' "$dump_file"
				;;
			esac
			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 \"&\",'
			elif [ "$in__objects" = "get-drv-id" ];then
				make_n_model=`echo $in_makeandmodel | tr "/" ";"`
				awk -F';' "/$make_n_model;/"'{print "id \"" $3 "\""}' "$dump_file"
			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"| grep 'printer-info=' |
				sed -r "s/.*(printer-info=(('[^']+')|([^'[:space:]]+))).*/\2/;
					s/'//g; s,.*,description \"&\","
				#driver
				if [ -f "/etc/cups/ppd/"$in_prnname".ppd" ]; then
					echo "driver" \"`egrep -m2 --with-filename '^\*(Manufacturer|ModelName)' /etc/cups/ppd/"$in_prnname".ppd 2>/dev/null|
					awk -f "$HELPERSDIR"/dump_ppds.awk`\"
				else
					echo "driver \"`awk -F';' '/;raw$/ {print $1";"$1" "$2";"$3}' /var/cache/alterator/printers-drivers.dump`\""
				fi
			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" -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"
				elif [ "$in_ppd" = "raw" ];then
					ppdfile="/dev/null"
				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
