#!/bin/sh
# $Id: pj-gs.sh,v 1.1 2000/03/09 08:40:40 lpd Exp $

# PaintJet driver script for Ghostscript,
# created by Philippe-Andre Prindeville <philipp@res.enst.fr>

# PCL level 1 interface
#
#=======================================================================#
# OPTIONS RECOGNIZED: ( all may be preceded with a "-" )		#
#	NOTE: Options marked with a "*" before their descriptions	#
#	      are provided for backward compatibility with the		#
#	      former hp2225a, hp2227a and hp3630a printer models -	#
# 	      these models have become links to this model. Consult	#
#	      your printer reference manual to determine which		#
#	      options are valid for your particular printer.		#
#									#
# Horizontal Pitch Selection:						#
#	c  		compressed print mode				#
#	e  	      * expanded print pitch				#
#	10 	      * 10 cpi (Pica print pitch)			#
#			  (expanded compressed on thinkjet and quietjet)#
#	12 	      * 12 cpi (Elite print pitch)			#
#									#
# Print Quality Selection						#
#	q | lq 	      * near letter quality				#
#									#
# Font Selection							#
#	b | bold      * set font stroke weight to bold			#
#									#
# Output filtering: (Default Cooked)					#
#	r | raw		raw mode for plotting mode etc.			#
#									#
# Other:								#
#       nb		do not output banner page (to save paper)	#
#									#
#		NOTE: * = NOT OFFICIAL PCL LEVEL 1 OPTIONS, USE OF	#
#			  THESE OPTIONS MAY OR MAY NOT PRODUCE		#
#			  DESIRED RESULTS.				#
#=======================================================================# 

PATH="/bin:/usr/bin:/usr/lib:/usr/local/bin"
export PATH

# set up redirection of stderr
log=/usr/spool/lp/log
exec 2>>$log

# sec_class=`getconf SECURITY_CLASS`
sec_class=
if [ $? -ne 0 ]
then
        echo "getconf SECURITY_CLASS failed"
fi

# Save the arguments to the model
printer=`basename $0`

if [ "$sec_class" = "2" ]       # B1 Trusted System
then
	reqid=$1
	user=$2
	dev=$3
	title=$4
	copies=$5
	options=$6
else
	reqid=$1
	user=$2
	title=$3
	copies=$4
	options=$5
fi


# Definitions of functions used within this script
do_banner()
{
	# Print the standard header
	x="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
	echo "$x\n$x\n$x\n$x\n"
	banner `echo $user`
	echo "\n"
	user=`pwget -n $user | line | cut -d: -f5`
	if [ -n "$user" ]
	then
		echo "User: $user\n"
	else
		echo "\n"
	fi
	echo "Request id: $reqid    Printer: `basename $0`\n"
	date
	echo "\n"
	if [ -n "$title" ]
	then
		banner "$title" 
	fi
	echo "\014\r\c"
}

# Set up interface
if [ -t 1 ]
then
	stty 9600 opost onlcr -parenb cs8 ixon -istrip clocal tab3 <&1 2>/dev/null
else
	slp -n -k 2>/dev/null
fi

# Handle disable and cancel traps.
trap "echo 'Terminated: $reqid'  >> $log; trap 15; kill -15 0; exit 0 " 15

# Set up printer default modes
echo "\033&k0S\c"		# reset pitches
echo "\033(s0B\033)s0B\c"	# reset stroke weights
echo "\033&d@\c"		# disable auto-underline
echo "\033&l6D\c"		# reset to 6 lpi
echo "\033(s0Q\c"		# reset print quality
echo "\033&v0S\c"		# reset color
echo "\033&k2G\c"		# Set line termination mode


# Determine which options have been invoked
pitch="def"
weight="def"
quality="def"
# outputmode="cooked"
outputmode="raw"
# banner="yes"
banner=

for i in $options
do
	case "$i" in
	-c | c)   # compressed print
		pitch="c";;

	-e | e)   # expanded print
		pitch="e";;

	-10 | 10) # pitch set to 10 cpi
		pitch="10";;

	-12 | 12) # pitch set to 12 cpi
		pitch="12";;

	-q | q | -lq | lq) # near letter quality
		quality=1;;

	-b | b | -bold | bold) # set font weight to bold
		weight=1;;

	r | raw) # raw mode for binary output to printer
		outputmode="raw";;

	-nb | nb) # do not output banner page
		banner="";;

	esac
done

shift; shift; shift; shift; shift

if [ "$sec_class" = "2" ]       # B1 Trusted System
then
	shift
	files="$*"
	Nofilter= Nolabel=
	set -- `getopt fl $options`
	if [ $? != 0 ]
	then
		exit 2
	fi

	for opt in $*
	do
	    shift
	    case $opt in
	      -f) Nofilter=$opt ;;
	      -l) Nolabel=$opt ;;
	      --) break ;;
	    esac
	done

	# Print the sensitivity label of the process
	echo "$x\n$x\n"
	/usr/lib/lpbanner -j $reqid -t "$title" -u $user -p PCL1 -n $printer -d $dev $files
	echo "\n$x\n$x"

else
	# Assume that the rest of the arguments are files
	files="$*"
	# print the banner if nb option not specified
	if [ -n "$banner" ]
	then
		do_banner
	fi
fi

# Print the spooled files
i=1
while [ $i -le $copies ]
do
		for file in $files
		do

			# If raw mode, turn off output processing,
			# set for no tab expansion
			# If cooked mode, uncomment the cooked case if it is 
			# desired not to print on the page perforations
			case "$outputmode" in
				raw)	if [ -t 1 ]
					then
						stty raw 9600 -opost -parenb cs8 ixon -istrip clocal tab0 <&1 2>/dev/null
					else
						slp -r 2>/dev/null
					fi
					echo "\033&k0G";;		# Reset line termination mode
			#	cooked)	echo "\033&l1L\r\c";;
			esac

			case "$pitch" in
				def);;
				c)	echo "\033&k2S\r\c";;
				e)	echo "\033&k1S\r\c";;
				10)	echo "\033&k3S\r\c";;
				12)	echo "\033&k0S\r\c"
					echo "\033&k4S\r\c";;
			esac

			case "$quality" in
				def);;
				*)	echo "\033(s${quality}Q\r\c";;
			esac

			case "$weight" in
				def)	echo "\033(s0B\033)s0B\r\c";;
				*)	echo "\033(s${weight}B\r\c";;
			esac

			if [ "$sec_class" = "2" ]	# B1 Trusted System
			then
				/usr/lib/lprcat $Nofilter $Nolabel $file PCL1 $user $dev
			else
				TEMPFILE=`mktemp -t pjXXXXXX` || exit 1
				type=`file $file | sed 's/^[^:]*..//'`
				case "$type" in
				postscript*)
#
# We could do the following, but this would leave gs with a rather large
# image in memory for (possibly) several minutes.  Better to use and
# intermediate file, since cat is "lightweight"...
#
#					gs -q -sDEVICE=paintjet -r180 -sOutputFile=- -dDISKFONTS -dNOPAUSE - < $file 2>/tmp/sh$$

					gs -q -sDEVICE=paintjet -r180 -sOutputFile=$TEMPFILE -dDISKFONTS -dNOPAUSE - < $file 1>2
					cat $TEMPFILE
					rm $TEMPFILE
					needff=
					;;
				*)	cat "$file" 2>$TEMPFILE
					needff=1
					;;
				esac

				if [ -s $TEMPFILE ]
				then
#				    cat /tmp/sh$$	# output any errors
				    cat $TEMPFILE 1>2	# output any errors
				fi
				rm -f $TEMPFILE
				if [ $needff ]; then echo "\014\r\c"; fi
			fi

			echo "\033&k0S\r\c"		# reset pitches
			echo "\033(s0B\033)s0B\r\c"	# reset stroke weights
			echo "\033&d@\r\c"		# disable auto-underline
			echo "\033&l6D\r\c"		# reset to 6 lpi
			echo "\033(s0Q\c"		# reset print quality
			echo "\033&v0S\c"		# reset color
		done
		i=`expr $i + 1`
	done

# Insure all buffers are flushed to printer
if [ -t 1 ]
then
	stty 9600 opost onlcr -parenb cs8 ixon -istrip clocal tab3 <&1 2>/dev/null
fi

exit 0
