*!/bin/sh
*
*  FWI printer interface program
*
*  (C) CEG, Faculty of Mathematics and Computer Science
*      Gert Poletiek
*
*
*  $Log: model,v $
*Revision 1.12  1996/08/08  08:05:19  gert
*added ROTATEDPLAINTEXT for jetdirect printers
*
*Revision 1.11  1996/04/12  11:49:41  frans
*added tr -d \004 to eliminate ^D in input
*
*Revision 1.10  1996/02/28  15:05:43  gert
*added support for _nt as extension for nt printing service
*
*Revision 1.9  1995/08/01  08:14:24  gert
*added support for hpcl/postscript autoswitching printer
*
*Revision 1.8  1995/01/13  09:20:48  gert
*fixed bug in singlesided printing for papif printers
*
*Revision 1.7  1995/01/12  16:08:30  gert
*fixed simplex printing for papif
*
*Revision 1.6  1994/12/16  12:39:05  gert
*cleanup + addition of a number of print options
*
*Revision 1.5  1994/12/09  16:26:46  gert
*fixed expr syntax error on cleanup after postscript error (${pages:=0})
*
*Revision 1.4  1994/12/08  21:22:35  gert
*changed date 19%y to date %Y
*
*Revision 1.3  1994/12/06  11:22:07  gert
*fixed rcs control strings
*
*
*
*
*   Usage:
*
*	$0 request-id user title copies options files...
*
*
*  $Id: model,v 1.12 1996/08/08 08:05:19 gert Exp $
*
#ifdef BANNER
nobanner=no
#else
nobanner=yes
#endif

totalpages=0
sendpsopt=

trap 'cleanup' 15

if [ $# -lt 5 ]
then
	echo "$0: wrong number of arguments to interface program" \
		 "consult your system administrator"
	exit 1
fi

#ifdef HPNPF
LD_LIBRARY_PATH="/usr/local/lib/hpnp/lib:/usr/local/SUNWmotif/lib:/usr/openwin/lib"
export LD_LIBRARY_PATH
#endif

#ifndef NT
printer=`basename $0`
#else /* NT */
printer=`basename $0 _nt`
#endif
acct=/var/adm/${printer}.acct
log=/var/adm/${printer}.log
jobid=$1
username=`echo $2 | sed 's/.*!//'`
case $username in
	[0-9]*)
		if [ -r /etc/passwd.pr ]; then
			newname=`awk -F: "/\*:${username}:/ {print \\$1}" /etc/passwd.pr`
			if [ "$newname" ]; then
				username=$newname
			fi
		fi
		;;
esac
hostname=`echo $2 | sed 's/[!.].*//'`
title=$3
copies=$4
options=$5

shift 5
files="$*"


*
*	sendps options
*	stdin - postscript to print
*
sendps ()
{
#ifdef PAPIF
	touch /tmp/lpsched$$.pages
#endif
	(
#ifdef PJL
		echo "\033%-12345X\c"       
		echo "@PJL USTATUS PAGE = ON"
		echo "@PJL JOB NAME = \"User: $username; Job: $jobid\""
		echo "@PJL SET COPIES = 1"
		echo "@PJL RDYMSG DISPLAY = \"${username}@${hostname}\""
		for i in $* ; do
			case $i in
				300dpi) 	echo "@PJL SET RESOLUTION = 300" ;;
				600dpi) 	echo "@PJL SET RESOLUTION = 600" ;;
				simplex)	echo "@PJL SET DUPLEX = OFF" ;;
				duplex)		echo "@PJL SET DUPLEX = ON" ;;
				portrait)	echo "@PJL SET ORIENTATION = PORTRAIT" ;;
				landscape)	echo "@PJL SET ORIENTATION = LANDSCAPE" ;;
				reverse)	echo "@PJL SET OUTBIN = LOWER" ;;
				manualfeed)	echo "@PJL SET MANUALFEED = ON" ;;
				bindlong)	echo "@PJL SET BINDING = LONGEDGE" ;;
				bindshort)	echo "@PJL SET BINDING = SHORTEDGE" ;;
			esac
		done
#ifdef FORCE_SIMPLEX
		echo "@PJL SET DUPLEX = OFF"
#endif
#ifdef FORCE_DUPLEX
		echo "@PJL SET DUPLEX = ON"
#endif
#ifdef PS
		echo "@PJL ENTER LANGUAGE=POSTSCRIPT"
#endif
#endif 

#ifdef PS
#ifndef PJL
#ifdef DUPLEX
		echo "statusdict begin duplexmode true setduplexmode end"
#else
#ifdef SIMPLEX
		echo "statusdict begin duplexmode false setduplexmode end"
#endif /* SIMPLEX */
#endif /* DUPLEX */
#endif /* !PJL */
#endif /* PS */
#ifdef ROTATEDPLAINTEXT
		cat - | \
		/usr/lib/lp/postscript/postprint -p landscape | \
		tr -d '\004'
#else
		cat - | \
		tr -d '\004'
#endif /* ROTATEDPLAINTEXT */

#ifdef PJL
		echo "\004\033%-12345X\c"
		echo "@PJL RESET"
		echo "@PJL EOJ NAME = \"User: $username; Job: $jobid\""
		echo "@PJL RDYMSG DISPLAY = \"Idle\""
#endif 
#ifdef HPNPF
	) | /usr/local/lib/hpnp/bin/hpnpf \
	-j "$jobid+$username" -w -x $printer -s /tmp/lpsched$$ |\
	fgrep "PAGES=" | sed -e 's/PAGES=//' | tr '\015' '\012' \
	> /tmp/lpsched$$.pages

	pages=`cat /tmp/lpsched$$.pages`
#endif
#ifdef PAPIF
	) | /usr/local/etc/papif -P $printer -n $username \
	    -h $hostname /tmp/lpsched$$.pages 2>/tmp/lpsched$$ 
 
	pages=`sed -e 's/\..*//' < /tmp/lpsched$$.pages`
#endif

	if fgrep -s '%%[ Error: ' /tmp/lpsched$$ ;then
		cat /tmp/lpsched$$ >&2
	fi
	cat /tmp/lpsched$$ >>$log

	totalpages=`expr $totalpages + ${pages:=0}`

	/bin/rm -f /tmp/lpsched$$.pages
	/bin/rm -f /tmp/lpsched$$
#ifdef HPNPF
	/bin/rm -f /tmp/pg.$jobid
#endif
}


cleanup ()
{
	if [ "$1" ]; then
		case $1 in 
			/tmp/lw*|/tmp/ES*)
				/bin/rm -f $1
				;;
		esac
	fi
	/bin/rm -f /tmp/lpsched$$.pages
	/bin/rm -f /tmp/lpsched$$
#ifdef HPNPF
	/bin/rm -f /tmp/pg.$jobid
#endif
	echo "${totalpages} ${hostname}:${username}" >> $acct
	exit_code=0 exit 0
}


*
*	printbanner username hostname title job-id 
*
printbanner ()
{

sendps simplex <<EOF

/GertDict 100 dict def
GertDict begin

/kruis {
	2 copy translate
	2 setlinecap 0 setlinejoin
	12   0 moveto 32  20 lineto 52   0 lineto 64  12 lineto
	44  32 lineto 64  52 lineto 52  64 lineto 32  44 lineto
	12  64 lineto 0  52 lineto 20  32 lineto 0  12 lineto
	12   0 lineto
	closepath
	neg exch neg exch translate
} def


/u {
	2 copy translate
	1 setlinecap 0 setlinejoin
	0		103.074									moveto
	7.892	101.29	15.528	101.834	23.222	102.378	curveto
	22.132	73.7	22.678	92.25	23.128	40.044	curveto
	23.442	20.874	38.718	17.602	55.796	18.148	curveto
	72.71	18.862	104.118	14.74	103.58	56.008	curveto
	103.712	80.66	103.724	69.82	101.786	102.846	curveto
	111.278	101.328	118.914	101.872	125.734	102.416	curveto
	124.252	70.606	123.404	38.382	125.672	2.936	curveto
	118.634	3.008	110.716	1.946	100.378	0		curveto
	101.034	9.258	101.158	17.294	101.146	28.432	curveto
	87.24	-11.312	.42		-2.038	2.752	21.482	curveto
	3.814	39.604	2.47	79.61	0		103.074	curveto
	closepath neg exch neg exch translate
} def

/drawbox {
	2 copy moveto 4 -1 roll dup 5 1 roll exch lineto 3 1 roll		
	dup	4 1 roll lineto	exch	lineto	closepath
} def

/logo {
	gsave translate newpath
	126 div dup dup scale 4 mul setlinewidth
	0 setgray
	0      66      u
	30.867 95.537  kruis
	30.867 169.537 kruis
	30.867 0       kruis
	1 setgray eofill
	grestore
} def

/blogo {
	gsave translate newpath
	132 div dup dup scale setlinewidth
	0 setgray
	0 0 240 240    drawbox
	57     70      u
	87.867 99.537  kruis
	87.867 170.537 kruis
	87.867 4       kruis
	0.8 setgray eofill
	grestore
} def

/font { findfont exch scalefont setfont } def
end

statusdict begin
GertDict begin
66 23 700 blogo
23 690 moveto
16 /Times-Roman font
-90 rotate
(Faculteit der Wiskunde en Informatica) show
90 rotate

% user
80 /Times-Roman font
120 40 moveto 90 rotate ($1@$2) show -90 rotate

% Date
20 /Times-Roman font
200 800 moveto (`date '+%A %h %d %Y, %H:%M'`) show

% jobid
200 780 moveto (job id: $4) show

%	Username and system
30 /Times-Roman font
200 740 moveto ($1@$2) show

%	Jobname
40 /Times-Roman font
240 40 moveto 90 rotate
($3) show -90 rotate

showpage
end
end
EOF
}



checkquota () {
	if [ -r /usr/local/lp/quota.$printer ]; then
		q_numpages=`/usr/local/etc/pac -m -t $1 -P$printer`

		IFS=' 	
:'
		egrep -h -v '^#|^[	 ]*$' /usr/local/lp/quota.$printer |\
		while read q_uname q_quota; do
			if [ "$q_uname" = "$1" -o "$q_uname" = "DEFAULT" ]; then
				if [ $q_quota -ne 0 -a \
				     $q_numpages -ge $q_quota ]; then
					echo "0 $q_quota $q_numpages $q_uname"
					return 0
				else
					echo "1 $q_quota $q_numpages $q_uname"
					return 0
				fi
			fi
		done
	else
		echo "1 0 0 0"
	fi
}

set `checkquota $username`
q_allow=$1
q_quota=$2
q_numpages=$3
q_uname=$4
if [ $q_allow -eq 0 ]; then
	cat - >&2 <<EOF

Your printjob $jobid to printer $printer failed because you've 
exceeded this months printquota.

Current quota limit:  $q_quota
Printed this month:   $q_numpages
Matching quota tag:   $q_uname

EOF
		
	exit_code=0 exit 0
fi



*
*	main
*
for i in ${options}
do
	case "${i}" in

		nobanner)	nobanner="yes" ;;
		banner)		nobanner="no" ;;
#ifdef PJL
		300*)		sendpsopt="$sendpsopt 300dpi" ;;
		600*)		sendpsopt="$sendpsopt 600dpi";;
		simplex)	sendpsopt="$sendpsopt simplex" ;;
		duplex)		sendpsopt="$sendpsopt duplex" ;;
		portrait)	sendpsopt="$sendpsopt portrait" ;;
		landscape)	sendpsopt="$sendpsopt landscape" ;;
		reverse)	sendpsopt="$sendpsopt reverse" ;;
		manualfeed)	sendpsopt="$sendpsopt manualfeed" ;;
		bindlong)	sendpsopt="$sendpsopt bindlong" ;;
		bindshort)	sendpsopt="$sendpsopt bindshort" ;;
#endif
		*) ;;
	esac
done


if [ $nobanner = "no" ]; then
	printbanner $username $hostname $title $jobid 
fi

i=1
while [ $i -le $copies ]; do
	for file in ${files}; do
		if [ -r "${file}" ]; then
			sendps $sendpsopt < "$file"
		fi
	done
	i=`expr $i + 1`
done


cleanup
