#!/bin/sh

PROG="${0##*/}" #program name

if [ "$0" = ./printer_detect ]; then
	lib_dir="$(/bin/pwd)"
else
	lib_dir=/usr/share/printer-drivers/
fi

CUPS_USB_BACKEND=/usr/lib/cups/backend/usb

print_version()
{
	cat <<EOF
$PROG version @VERSION@

Written by Stanislav Ievlev

Copyright (C) 2003-2004 ALT Linux Team
EOF
	exit
}


print_usage()
{
	[ "$1" = 0 ] || exec >&2
	cat <<EOF
Usage: $PROG [options] 

alterator backend for simple printer detection

Valid options are:
  -h, --help	display help screen
  -v, --version	display version information
  -l, --list	get list of detected ports with printers
  -t, --type	check for existance
  -d, --delete	(empty action, required for backend)
  -r, --read	read printer driver information
  -w, --write	(empty action, required for backend)

Report bugs to <inger@altlinux.org>
EOF
	[ -n "$1" ] && exit "$1" || exit
}

reload_parport()
{
	/sbin/rmmod parport_pc
	/sbin/rmmod parport
	/sbin/modprobe parport_pc
}


get_name()
{
	cat /proc/sys/dev/parport/parport0/autoprobe|
		/bin/grep "$1"|
		/bin/sed -r "s,^$1:(.*);,\1,"
}


#reload parport drivers to read autodetect information
#reload_parport

TEMP=`getopt -n $PROG -o h,v,l:,d:,r:,w:,t: -l help,version,list:,delete:,read:,write:,type: -- "$@"` || print_usage
eval set -- "$TEMP"

while :; do
	case "$1" in
		-h|--help) print_usage 0
			;;
		-v|--version) print_version
			;;
		-l|--list)
			shift;dir="$1";
			if [ "$dir" == "/" ] ;then
				pushd /proc/sys/dev/parport &>/dev/null
				for i in parport*
				do
					echo "$i r"
				done
				popd &>/dev/null
				$CUPS_USB_BACKEND |
					 /bin/sed -r 's,^([^"]+)",,'|/bin/sed -r 's,([^"]+)".*,\1,'|
					 /bin/grep -v "Unknown"|
					 /bin/sed -r 's,.*,usb:& r,'
			fi
			;;
		-d|--delete)
			#ignore
			shift;dir="$1";
			;;
		-t|--type)
			shift;dir="$1";
			if echo "$dir"|/bin/grep -qs parport; then
				[ -d /proc/sys/dev/parport/$dir ] && echo "$dir r"
			elif echo "$dir"|/bin/grep -qs usb; then
				name=$(echo "$dir"|/bin/sed 's,^usb:,,')
				$CUPS_USB_BACKEND|/bin/grep -qs "\"$name\"" && echo "$name"|
				/bin/sed 's,.*,& r,'
			fi
			;;
		-r|--read)
			shift;dir="$1";
			if echo "$dir"|/bin/grep -qs parport; then
				if /bin/grep -qs 'CLASS:PRINTER;' /proc/sys/dev/parport/$dir/autoprobe;then
					model=$(get_name MODEL)
					make=$(get_name MANUFACTURER|sed 's,HEWLETT-PACKARD,HP,i')
					drv=$(grep -m1 -i "^$make;$model" /var/cache/printer-drivers/dump|
					sed -r 's,(.*);(.*);(.*),\1;\2,')
					echo "driver:$drv"
				fi
				number=$(echo "$dir"|sed s,parport,,)
				echo "uri:parallel:/dev/lp$number"
			elif echo "$dir"|/bin/grep -qs "^usb:"; then
				name=$(echo "$dir"|sed 's,^usb:,,')
				uri=$($CUPS_USB_BACKEND|/bin/grep "\"$name\""|tail -n1|cut -f2 -d' ')
				make_model=$(echo "$uri"|
						sed -r 's,usb://([^/]+)/([^/]+),\1;\2,'|
						sed 's,\?serial=.*,,'|
						sed 's,%20, ,g')
				if [ -n "$make_model" ]; then
					drv=$(grep -m1 -i "^$make_model" /var/cache/printer-drivers/dump|
					sed -r 's,(.*);(.*);(.*),\1;\2,')
					echo "driver:$drv"
				fi
				echo "uri:$uri"
			fi
			;;
		-w|--write)
			#ignore
			shift;dir="$1";
			while read l; do
				echo -n
			done
			;;
		--) shift; break
			;;
		*) Fatal "unrecognized option: $1"
			;;
	esac
	shift
done
