#!/bin/sh

dump_file="/var/cache/alterator/printers-drivers.dump"
CUPS_USB_BACKEND="/usr/lib/cups/backend/usb"

reload_parport()
{
	modprobe -r lp parport_pc parport
	modprobe lp
}


get_name()
{
	cat /proc/sys/dev/parport/"$2"/autoprobe|
		grep "$1"|
		sed -r "s,^$1:(.*);,\1,;
		s,^hp ,," #HACK for HP LaserJet 1150
}

. alterator-sh-functions

on_message()
{
	case "$in_action" in
		list)
			echo '('
				#reload parport drivers to read autodetect information
				reload_parport
				pushd /proc/sys/dev/parport >/dev/null 2>&1
				for i in parport[0-9]*
				do
					[ -d "$i" ] && printf '("%s")' "$i"
				done
				popd >/dev/null 2>&1
				"$CUPS_USB_BACKEND" |
					 sed -r 's,^([^"]+)",,; s,([^"]+)".*,\1,'|
					 grep -v "Unknown"|
					 sed -r 's,.*,\(\"usb:&\"\),'
			echo ')'
			;;
		read)
			echo '('
			if echo "$in__objects"|grep -qs parport; then
				if grep -qs 'CLASS:PRINTER;' /proc/sys/dev/parport/"$in__objects"/autoprobe;then
					model=$(get_name MODEL "$in__objects")
					make=$(get_name MANUFACTURER "$in__objects"|sed 's,HEWLETT-PACKARD,HP,i')
					drv=$(grep -m1 -i "^$make;$model" "$dump_file"|
					sed -r 's,(.*);(.*);(.*),\1;\2,')
					[ -z "$make" -a -z "$model" ] || printf '%s "%s"' "make_model" "$make $model"
					[ -z "$drv" ] || printf '%s "%s"' "driver" "$drv"
				fi
				number=$(echo "$in__objects"|sed s,parport,,)
				printf '%s "%s"' "uri" "parallel:/dev/lp$number"
			elif echo "$in__objects"|grep -qs "^usb:"; then
				name=$(echo "$in__objects"|sed 's,^usb:,,')
				uri=$($CUPS_USB_BACKEND|grep "\"$name\""|tail -n1|cut -f2 -d' ')
				make_model=$(echo "$uri"|
						sed -r 's,usb://([^/]+)/([^/]+),\1;\2,;
						s,\?serial=.*,,;
						s,%20, ,g;
						s,^HP\;hp ,HP\;,') #HACK for HP LaserJet 1150
				if [ -n "$make_model" ]; then
					drv=$(grep -m1 -i "^$make_model" "$dump_file"|
					sed -r 's,(.*);(.*);(.*),\1;\2,')
					[ -z "$make_model" ] || printf '%s "%s"' "make_model" "`echo $make_model | sed 's/;/ /g'`"
					[ -z "$drv" ] || printf '%s "%s"' "driver" "$drv"
				fi
				printf '%s "%s"' "uri" "$uri"
			fi
			echo ')'
			;;
		*)
			echo '#f'
			;;
	esac
}
message_loop
