#!/bin/sh
##########################
##
## Ricoh Aficio 120/1013/FX12/1013F
## Unix Printing Interface Program.
## Last Update 12/09/2004
## Copyright 1999-2004
## All rights reserved
## Ricoh Engineering
##
##########################

##########################
##
## Update History
##
## 9/18/2001 Minor fixes
## 8/15/2001 First Release
##
##########################

##########################
##
## Debug Flag, set to y to leave temp files in /tmp
##
##########################

DEBUG=

##########################
##
## Parse arguments passed as -o option of lp command
##
##########################

parse () {
	echo "`expr \"$1\" : \"^[^=]*=\(.*\)\"`"
}

##########################
#
# This program is invoked as
#
# ${SPOOLDIR}/.../printer request-id user title copies options files...
#
# The first three arguments are simply reprinted on the banner page,
# the fourth (copies) is used to control the number of copies to print,
# the fifth (options) is a blank separated list (in a single argument)
# of user or Spooler supplied options (without the -o prefix),
# and the last arguments are the files to print.
#
##########################

printer=`basename $0`
request_id=$1
user_name=$2
title=$3
copies=$4
option_list=$5

shift 5
files="$*"

nobanner="no"
nofilebreak="no"
stty=
inlist=

device_tmp=
prtout_tmp=
ps_tmp=
pjl_tmp=
pcl_tmp=
TXT=
PS=
PCL=
is_TXT=
is_PS=
is_PCL=
is_DSC=

##########################
#
# Change the following line to match to
# the remote printer's name
#
##########################

REMOTE_PRINTER=

##########################
#
# device_tmp stores device option commands
# prtout_tmp holds actual printout to the printer
# ps_tmp is used to hold pre-processed input PS file
#
##########################

device_tmp="/tmp/afcdev_$$.tmp"
prtout_tmp="/tmp/afcprt_$$.tmp"
ps_tmp="/tmp/afcps_$$"
pjl_tmp="/tmp/afcpjl_$$"
pcl_tmp="/tmp/afcpcl_$$"

##########################
#
# Store some default values
#
##########################

##########################
#
# Set default # of copies
#
##########################

echo "<</NumCopies $copies >>setpagedevice" >> $device_tmp
printf "\033&l%dx" $copies >> $pcl_tmp
##########################
#
# Device options (e.g. -o value=a) are identified
# and processed here.
#
##########################

for i in ${option_list}
do
	case "${inlist}${i}" in

	nobanner )
		nobanner="yes"
		;;

	nofilebreak )
		nofilebreak="yes"
		;;

##########################
#
# Debug option
#
##########################

	debug )
		DEBUG=Y
		;;		

##########################
#
# Text option
#
##########################

	text )
		TXT=1
		;;

##########################
#
# PS option
#
##########################

	ps )
		PS=1
		;;

##########################
#
# PCL/PJL option
#
##########################

	pcl|nofilter )
		PCL=1
		;;

##########################
# LNX_TUB_B
#
# Paper Orientation (Default=Portrait)
#
##########################
        portrait  )
		orientation_port="yes"
		printf "\033&l0O" >> $pcl_tmp
		;;

	landscape )
		orientation_port="no"
		printf "\033&l1O" >> $pcl_tmp
		;;

        rportrait )
		printf "\033&l2O" >> $pcl_tmp
		;;

	rlandscape )
		printf "\033&l3O" >> $pcl_tmp
		;;

##########################
#
# Character compresser (16.5 or 16.7 per line)
#
##########################
        compress )
		printf "\033&k2S" >> $pcl_tmp
		;;

##########################
#
# Line Spacing
#
##########################
        lpi* )
		lpi=`expr $i : 'lpi\([0-9]*\)'`
		printf "\033&l%dD" $lpi >> $pcl_tmp
		;;

##########################
#
# Pitch (character per inch)
#
##########################
	cpi* )
		pitch=`expr $i : 'cpi\([0-9.]*\)'`
		if [ -n "$pitch" ]
		then
			printf "\033(s%.2fH" $pitch >> $pcl_tmp
		fi
		;;

	collate=* )
		collate=`parse ${i}`
		;;

#	trayswitch=* )
#		trayswitch=`parse ${i}`
#		;;

	itray=* )
		itray=`parse ${i}`
		;;

	paper=* )
		paper=`parse ${i}`
		;;

	bypassmedia=* )
		bypassmedia=`parse ${i}`
		;;

	edgesmooth=* )
		edgesmooth=`parse ${i}`
		;;

	tonersav=* )
		tonersav=`parse ${i}`
		;;

	esac

done

##############################################################
#
# The order below is somehow important:
#
#	paper have to be 1st
#
##############################################################

##########################
#
# Paper Size
#
##########################

	case "$paper" in
	A4 )
	    (
	    echo "<< /DeferredMediaSelection true
 		/PageSize [595 842] /ImagingBBox null >> setpagedevice" >> $device_tmp

	    printf "\033&l26A" >> $pcl_tmp
	    )
	    ;;

	A5 )
	    (
	    echo "<< /DeferredMediaSelection true
  		/PageSize [421 595] /ImagingBBox null >> setpagedevice" >> $device_tmp

	    printf "\033&l2000A" >> $pcl_tmp
	    )
	    ;;

	legal )
	    (
	    echo "<< /DeferredMediaSelection true
  		/PageSize [612 1008] /ImagingBBox null >> setpagedevice" >> $device_tmp

	    printf "\033&l3A" >> $pcl_tmp
	    )
	    ;;

	letter )
	    (
	    echo "<< /DeferredMediaSelection true
  		/PageSize [612 792] /ImagingBBox null >> setpagedevice" >> $device_tmp

	    printf "\033&l2A" >> $pcl_tmp
	    )
	    ;;

	halfletter )
	    (
	    echo "<< /DeferredMediaSelection true
  		/PageSize [396 612] /ImagingBBox null >> setpagedevice" >> $device_tmp

	    printf "\033&l2008A" >> $pcl_tmp
	    )
	    ;;

	8x13 )
	    (
	    echo "<< /DeferredMediaSelection true
  		/PageSize [576 936] /ImagingBBox null>> setpagedevice" >> $device_tmp

	    printf "\033&l2011A" >> $pcl_tmp
	    )
	    ;;

	folio )
	    (
	    echo "<< /DeferredMediaSelection true
  		/PageSize [595 935] /ImagingBBox null>> setpagedevice" >> $device_tmp

	    printf "\033&l2012A" >> $pcl_tmp
	    )
	    ;;

	85x13 )
	    (
	    echo "<< /DeferredMediaSelection true
  		/PageSize [612 936] /ImagingBBox null>> setpagedevice" >> $device_tmp

	    printf "\033&l2007A" >> $pcl_tmp
	    )
	    ;;

	* )
	    (
	    echo "<< /DeferredMediaSelection true
		/PageSize [612 792] /ImagingBBox null >> setpagedevice" >> $device_tmp

	    printf "\033&l2A" >> $pcl_tmp
	    )
	    ;;

	esac

##########################
#
# Input Tray Selection (Default=AutoSelect)
#
##########################
	case "$itray" in
	autoselect )
	    (
	    echo "<</DeferredMediaSelection true /MediaPosition 0>> setpagedevice" >> $device_tmp

	    printf "\033&l7H" >> $pcl_tmp
	    )
	    ;;

	bypass )
	    (
	    echo "<</DeferredMediaSelection true /MediaPosition 1>> setpagedevice" >> $device_tmp

	    printf "\033&l2H" >> $pcl_tmp
	    )
	    ;;

	tray1 )
	    (
	    echo "<</DeferredMediaSelection true /MediaPosition 2>> setpagedevice" >> $device_tmp

	    printf "\033&l8H" >> $pcl_tmp
	    )
	    ;;

	tray2 )
	    (
	    echo "<</DeferredMediaSelection true /MediaPosition 3>> setpagedevice" >> $device_tmp

	    printf "\033&l1H" >> $pcl_tmp
	    )
	    ;;

	* )
	    (
	    echo "<</DeferredMediaSelection true /MediaPosition 0>> setpagedevice" >> $device_tmp

	    printf "\033&l7H" >> $pcl_tmp
	    )
	    ;;

	esac

##########################
#
# Auto Tray Switching (Default=On)
#
##########################
#	case "$trayswitch" in
#	on )
#	    (
#	    echo "@PJL SET AUTOTRAYCHANGE=ON" >> $pjl_tmp
#	    )
#	    ;;
#
#	off )
#	    (
#	    echo "@PJL SET AUTOTRAYCHANGE=OFF" >> $pjl_tmp
#	    )
#	    ;;
#
#	* )
#	    (
#	    echo "@PJL SET AUTOTRAYCHANGE=ON" >> $pjl_tmp
#	    )
#	    ;;
#
#	esac


##########################
#
# Bypass Tray Media (Default=plain)
#
##########################
	case "$bypassmedia" in
	plain )
	    (
	    echo "@PJL SET FUSERCONTROL=PLAINPAPER" >> $pjl_tmp
	    )
	    ;;

	thick )
	    (
	    echo "@PJL SET FUSERCONTROL=THICK" >> $pjl_tmp
	    )
	    ;;

	transparency )
	    (
	    echo "@PJL SET FUSERCONTROL=TRANSPARENCY" >> $pjl_tmp
	    )
	    ;;

	* )
	    (
	    echo "@PJL SET FUSERCONTROL=PLAINPAPER" >> $pjl_tmp
	    )
	    ;;
	esac


##########################
#
# Edge Smoothing (Default=ON)
#
##########################
	case "$edgesmooth" in
	on )
	    (
	    echo "@PJL SET SMOOTHING=ON" >> $pjl_tmp
	    )
	    ;;

	off )
	    (
	    echo "@PJL SET SMOOTHING=OFF" >> $pjl_tmp
	    )
	    ;;

	* )
	    (
	    echo "@PJL SET SMOOTHING=ON" >> $pjl_tmp
	    )
	    ;;
	esac


##########################
#
# Toner Saver(Default=OFF)
#
##########################
	case "$tonersav" in
	off )
	    (
	    echo "@PJL SET ECONOMODE=OFF" >> $pjl_tmp
	    )
	    ;;

	on )
	    (
	    echo "@PJL SET ECONOMODE=ON" >> $pjl_tmp
	    )
	    ;;

	* )
	    (
	    echo "@PJL SET ECONOMODE=OFF" >> $pjl_tmp
	    )
	    ;;
	esac

##########################
#
# Collate (Default=Off)
#
##########################
	case "$collate" in
	off )
	    (
	    echo "@PJL SET JOBOFFSET=OFF" >> $pjl_tmp
	    printf "\033&l%dx" $copies >> $pcl_tmp
	    )
	    ;;

	on )
	    (
	    echo "@PJL SET JOBOFFSET=OFF" >> $pjl_tmp
	    echo "@PJL SET QTY=$copies" >> $pjl_tmp
	    printf "\033&l1x" >> $pcl_tmp
	    )
	    ;;

	* )
	    (
	    echo "@PJL SET JOBOFFSET=OFF" >> $pjl_tmp
	    printf "\033&l%dx" $copies >> $pcl_tmp
	    )
	    ;;

	esac


##########################
# LNX_TUB_E
#
# Print the files
#
##########################

for i in $*
do

##########################
#
# Auto-detect input file type here
#
# If is_PS=1, input file is PostScript
# If is_PS=0, input file is text
# else, input file is PCL/PJL
# is_PS is overwritten, if user specified
#	input file type with "-o text" or "-o ps" option
#
##########################

if [ -n "$PS" ]
then
	is_PS=1
	is_TXT=0
elif [ -n "$TXT" ]
then
	is_TXT=1
	is_PS=0
elif [ -n "$PCL" ]
then
	is_PS=0;
	is_TXT=0;
else

	OS_NAME=`uname -s`

	case $OS_NAME in
	SunOS)
		is_PS=`file $i | grep -c PostScript`
		;;
	HP-UX)
		is_PS=`file $i | grep  -c postscript`
		;;
	*)
		is_PS=`file $i | grep -c PostScript`
		;;
	esac
		file $i | egrep -i 'ASCII|text|script' > /dev/null
		is_TXT=`expr "$?" = 0`
fi

if [ "$is_TXT" -eq 1 ]
then

	##########################
	#
	# If text file, apply a filter to remove stair case effect
	#
	##########################

	printf "\033%%-12345X" > $prtout_tmp

	echo "@PJL SET JOB NAME=\"$title\"" >> $prtout_tmp

	cat $pjl_tmp >> $prtout_tmp

	echo "@PJL ENTER LANGUAGE=PCL" >> $prtout_tmp

	printf "\033E" >> $prtout_tmp

	cat $pcl_tmp >> $prtout_tmp; echo >> $prtout_tmp

	cat $i | awk '{print $0, "\r"}' >> $prtout_tmp

	printf "\033%%-12345X" >> $prtout_tmp


elif [ "$is_PS" -eq 1 ]
then
	##########################
	#
	# Check if the input file has %%EndSetup string in it
	#
	##########################

	is_DSC=`cat $i | grep -c "%EndSetup"`

	##########################
	#
	# Check if is_DSC variable is empty
	#
	##########################

	case $is_DSC in

	1)

		if grep '^setup' $i > /dev/null
		then
			csplit -f $ps_tmp $i "/^setup/"
		else
			csplit -f $ps_tmp $i "/%%EndSetup/"
		fi
		cat $device_tmp >> $ps_tmp"00"
		cat $ps_tmp"00" $ps_tmp"01" > $prtout_tmp

		;;
	*)
		echo "%!PS-Adobe-3.0" > $prtout_tmp
		echo "%%BeginSetup" >> $prtout_tmp
		cat $device_tmp >> $prtout_tmp
		echo "%%EndSetup" >> $prtout_tmp
		cat $i >> $prtout_tmp
		;;
	esac
else
cat $i > $prtout_tmp
fi

##########################
#
# Loop for printing
#
##########################

(
cat $prtout_tmp
) | lp -d $REMOTE_PRINTER

done

##########################
#
# Remove temporary files if DEBUG=empty
#
##########################

if test -z "$DEBUG"
then
	if test -f "$device_tmp"
	then
		/usr/bin/rm $device_tmp
	fi

	if test -f "$prtout_tmp"
	then
		/usr/bin/rm $prtout_tmp
	fi

	if test -f $ps_tmp"00"
	then
		/usr/bin/rm $ps_tmp"00"
	fi

	if test -f $ps_tmp"01" 
	then
		/usr/bin/rm $ps_tmp"01"
	fi

	if test -f $pjl_tmp
	then
		/usr/bin/rm $pjl_tmp
	fi

	if test -f $pcl_tmp
	then
		/usr/bin/rm $pcl_tmp
	fi

fi

exit_code=0 exit 0
