#!/usr/bin/sh
## @(#) HPDPS $Header: PCL1,v 78.2 96/03/18 20:29:10 ssa Exp $
###############################################################################
##
## Interface Program for PCL1
##
## This interface program file, which is based on PCL1 interface program
## file for LP spooler, is intended for use by HPDPS supervisor.  Generally,
## interface programs which are used in the LP spooler can be used in the
## HPDPS environment.  However, the following changes are required:
##
## o Write the log and error messages to standard error output instead of
##   /var/adm/lp/log, which is the log file used by the LP spooler.  The
##   messages written to standard error output are logged by HPDPS supervisor.
##
## o Don't rely on the LP spooler.  It may not be installed.
##
##   (1) Don't use filter programs provided by the LP spooler.  The following
##       filters are available in the HPDPS environment.  If they are needed
##       add the /opt/pd/bin and /opt/pd/lbin to the $PATH environment
##       variable.
##
##         HPDPS location                         LP location
##      
##       - /opt/pd/lbin/divpage                   /usr/lbin/divapage
##       - /opt/pd/lbin/fontdl                    /usr/lbin/fontdl
##       - /opt/pd/lbin/lprpp                     /usr/lbin/lprpp
##       - /opt/pd/lbin/plotdvr                   /usr/lbin/plotdvr
##       - /opt/pd/lbin/printstat                 /usr/sbin/printstat
##       - /opt/pd/lbin/reverse                   /usr/sbin/reverse
##
##       The following fonts are also available:
##
##         HPDPS location                         LP location
##
##       - /opt/pd/lib/fonts/lp2l                 /usr/lib/lp/fonts/lp2l
##       - /opt/pd/lib/fonts/lp4l                 /usr/lib/lp/fonts/lp4l
##       - /opt/pd/lib/fonts/lp4p                 /usr/lib/lp/fonts/lp4p
##
##   (2) Don't access LP spooler specific files.  Some interface program
##       need to know the the path name of the device file associated with
##       the physical printer.  In HPDPS environment, the path name cannot
##       be obtained by looking for those files.  Use job device-name assigned
##       attribute for this case.  This attribute is internally set by HPDPS
##       when connected via the serail or parallel interface.  Follow the
##       folloinwg steps:
##
##       - Create a new option like "dev"
##       - Add the following entry in the corresponding ipmap file.
##
##         device-name-assigned=$1  > dev$1
##
## o Modify the banner page function if desired.  In HPDPS environment the
##   banner page function is used to when the job attribute job-sheets is
##   specified with the value job-set-start (default).
##
## In HPDPS environment, the following parameters are passed to the interface
## program from the HPDPS supervisor.
##
## o $1: Request ID generated by the HPDPS supervisor.
##
## o $2: User ID.  The value of job-originator job attribute is used.
##
## o $3: Title.  The value of job-name attribute is used if specified.  If
##   not, the name of the first document in the job is used.
##
## o $4: Copies.  See the description about the job interface-program-method
##   attribute below.
##
## o $5: Options.  Job and document attributes are converted to the interface
##   program options according to the corresponding ipmap file.  Then they are
##   passed as the $5 parameter of the interface program.
##
## o $6...: Document File Names.  See the description about the job interface-
##   program-method attribute below.
##
## -- NOTE : interface-program-method -----------------------------------------
##
## In HPDPS environment, the interface program is executed to print one job
## result set by defalt.  However, this can be changed by the job interface-
## program-method attribute.
##
## o If the hpdps (default) is specified for the job-attribute interface-
##   program-method, the interface program is invoked to print one job
##   result set according to the ISO/DPA 10175 print architecture:
##
##   - The value of the job-copies component of the job  results-profile
##     attribute is passed as the 4th argument of the interface program.
##
##   - Each document is duplicated n times before being passed to the
##     interface program, where n is the value of the document copy-count
##     attribute.
##
##   For example,
##
##   pdpr -p logical_printer\
##        -x "interface-program-method=hpdps"\
##        -x "results-profile=:::2:"\
##        -x "copy-count=3"\
##        document1 document2 document3
##
##   In this case, the following are passed to the $4 and $6... parameters:
##
##   $4:  2
##   $6:  document_1
##   $7:  document_1
##   $8:  document_1
##   $9:  document_2
##   $10: document_2
##   $11: document_2
##   $12: document_3
##   $13: document_3
##   $14: document_3
##
## o If the lp is specified for the job-attribute interface-program-
##   method, the interface program is invoked to print each job copy in
##   one job result set:
##
##   - The value of document attribute copy count is passed as the 4th
##     argument of the interface program.
##
##   - The interface program is invoked n times, where n is the value
##     of the job-copies component of the job results-profile attribute.
##
##   In this case, the interface program is executed 2 times with the
##   following paramers:
##
##   $4:  3
##   $6:  document_1
##   $7:  document_2
##   $8:  document_3
##
###############################################################################
# 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)	#
#                                                                       #
#       noeject         do not output formfeed at end of job            #
#									#
#		NOTE: * = NOT OFFICIAL PCL LEVEL 1 OPTIONS, USE OF	#
#			  THESE OPTIONS MAY OR MAY NOT PRODUCE		#
#			  DESIRED RESULTS.				#
#=======================================================================# 

PATH="/usr/bin:/usr/lib:/usr/lbin:/usr/sbin"
export PATH

#sec_class=`getconf SECURITY_CLASS`
#if [ $? -ne 0 ]
#then
#	sec_class=0		# Set sec_class for a non-secure system
#fi
sec_class=0
# 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
	# lpbanner accepts only 1 filename otherwise it fails. 
	# So, the workaround is:

	onefile=$7
	# Enhancement is needed to lpbanner to make the filename optional
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'  >&2; 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"
banner="yes"
formfeed="yes"

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="";;

	-noeject | noeject) # do not output formfeed at EOJ
		formfeed="no";;

	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
	/usr/lbin/lpbanner -j $reqid -t "$title" -u $user -p PCL1 -n $printer -d $dev $onefile

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/lbin/lprcat $Nofilter $Nolabel $file PCL1 $user $dev
			else
				cat "$file" 2>/tmp/sh$$
				if [ -s /tmp/sh$$ ]
				then
					cat /tmp/sh$$	# output any errors
				fi
				rm /tmp/sh$$

				if [ "$formfeed" = "yes" ]
				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
