#!/bin/sh

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

alterator_api_version=1

. alterator-sh-functions

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"
HELPERSDIR="/usr/lib/alterator-printers"

on_message()
{
	case "$in_action" in
		list)
			case "$in__objects" in
			    printers)
				for printer in `LANG=C "$LPSTAT" -a|egrep '^([0-9a-zA-Z_-])+'|cut -f1 -d' '|sed 's,.*,&,'`;do
					write_enum_item "$printer"
				done
				;;
			    drv-vendors)
				awk -F';' '{print $1}' "$dump_file" | sort -u |
					while read vendor; do
						write_enum_item "$vendor"
					done
				;;
			    *)
				awk -F';' "/^$in__objects;/"'{print $2}' "$dump_file" |
					while read model; do
						write_enum_item "$model"
					done
				;;
			esac
			;;
		delete)
			"$LPADMIN" -x "$in_prnname"
			reload_smb
			;;
		read)
			if [ "$in__objects" = "server" ];then
				service cups status >/dev/null 2>&1 || write_bool_param nocups yes
				[ -s "$dump_file" ] || write_bool_param nodump true
				default=`LANG=C "$LPSTAT" -d|sed -r 's,system default destination:[[:space:]]*,,;'`
				write_string_param default "$default"
			else
				#state
				if LANG=C "$LPSTAT" -p "$in_prnname"|grep -qs 'enabled';then
					write_bool_param status true
				fi
				#uri
				URI=`LANG=C "$LPSTAT" -v "$in_prnname"|sed 's,device for[^:]*:[[:space:]]*,,'`
				write_string_param uri "$URI"
				description=`lpoptions -p "$in_prnname"| grep 'printer-info=' |
					sed -r "s/.*(printer-info=(('[^']+')|([^'[:space:]]+))).*/\2/; s/'//g;"`
				write_string_param description "$description"
				#driver
				ppdfile="/etc/cups/ppd/$in_prnname.ppd"
				if [ -f "$ppdfile" ]; then
					model=`awk -F: '/^\*NickName/ {print $2}' "$ppdfile"|sed 's/ (recommended)//'|xargs`
					vendor=`echo $model | awk '{print $1}'`
					write_string_param driver "$vendor;$model;0"
				else
					driver=`awk -F';' '/;raw$/ {print $1";"$2}' "$dump_file"`
					write_string_param driver "$driver;0"
				fi
			fi
			;;
		write)
			case "$in__objects" in
			    test-page)
				"$LPR" -P "$in_prnname" /usr/share/printer-testpages/cupspage.ps
				;;
			    make-default)
				"$LPADMIN" -d "$in_prnname"
				;;
			    do-dump)
				"$HELPERSDIR"/update-printers-db
				;;
			    printer)
				"$LPADMIN" -p "$in_prnname" -v "$in_uri" -D "$in_description"

				if test_bool "$in_status";then
					/usr/sbin/cupsenable "$in_prnname"
					/usr/sbin/cupsaccept "$in_prnname"
				else
					/usr/sbin/cupsdisable "$in_prnname"
				fi
				if [ "$in_model_num" -ne 0 ]; then
					vendor=`echo "$in_vendor" | sed 's,[/()+],\\\\&,g;'`
					drv=`awk -F';' "/^$vendor;/"'{print $3}' "$dump_file" | head -n $in_model_num | tail -1`
					"$LPADMIN" -p "$in_prnname" -m "$drv" -E
				fi
				"$LPADMIN" -p "$in_prnname" -o PageSize=A4
				reload_smb
				;;
			esac
			;;
		*)
			echo '#f'
			;;
	esac
}
message_loop
