#!/bin/sh

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

PRINTERS_DATA=/var/cache/printer-drivers/dump

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 to get list of avaliable printer drivers.
all drivers are grouped by vendor

Valid options are:
  -h, --help	display help screen
  -v, --version	display version information
  -l, --list	get list of available vendors/drivers
  -t, --type	check for vendor/driver existance
  -d, --delete	(empty action, required for backend)
  -r, --read	read driver information
  -w, --write	(empty action, required for backend)

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


dump_prn_data()
{
	[ -f $PRINTERS_DATA ] || /usr/bin/update-printers-db
	cat $PRINTERS_DATA
}

#quote filenames,to made it usable in filesystem
encode_prn_name()
{
	#hide / symbols - both for input and output
	sed $sed_options 's,%,%%,g
	s,|,%|,g
	s,/,|,g'
}

decode_prn_name()
{
    local separator=$(printf '\007')
    sed  $sed_options "s,%\(.\),$separator\1,g
	    s,\([^$separator]\|^\)|,\1/,g
	    s,\([^$separator]\|^\)|,\1/,g
	    s,$separator,,g"
}

search_prn()
{
	dump_prn_data|grep "^$1;" >/dev/null
	return $?
}

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
				dump_prn_data|
					cut -f1 -d';'|sort -u|
					encode_prn_name|
					sed 's,.*,& d,'
			else
				dump_prn_data|
					grep "^$dir;"|cut -f2 -d';'|
					encode_prn_name|
					sed 's,.*,& r,'
			fi
			;;
		-d|--delete)
			#ignore
			shift;printer="$1";
			;;
		-t|--type)
			shift;printer="$1";
			if echo "$printer"|grep -qs '/';then
				#test for printer
				decoded_name=$(echo $printer|sed 's,/,;,'|decode_prn_name)
				search_prn "$decoded_name" && (echo "$printer"|sed 's,.*,& r,')
			else
				#test for vendor
				decoded_name=$(echo $printer|decode_prn_name)
				search_prn "$decoded_name" && (echo "$printer"|sed 's,.*,& d,')
			fi
			;;
		-r|--read)
			shift;printer="$1";
			decoded_name=$(echo "$printer"|sed 's,/,;,'|decode_prn_name)
			#tail is a protection from dublicated
			dump_prn_data|grep "$decoded_name"|tail -n1|
				cut -f3 -d';'|sed 's,.*,id:&,'
			;;
		-w|--write)
			#ignore
			shift;username="$1";
			while read l; do
				echo -n
			done
			;;
		--) shift; break
			;;
		*) Fatal "unrecognized option: $1"
			;;
	esac
	shift
done
