#! /bin/bash
#
# anytoturboprint - CUPS spooler filter for turboprint driver system
#
# stdin = pdf/postscript/raw printer data
# pdf/postscript sent to turboprint-composer via socket
# raw printer data sent to stdout
#
# Copyright 2026 ZEDOnet
# Version 2.90-beta1
# 20-JAN-2026

########
# get Turboprint paths
########
eval $(cat "/etc/turboprint/system.cfg")
TPPATH_TEMP=/var/spool/cups/tmp
LOGFILE="$TPPATH_LOG/turboprint/turboprint_cups.log"
TPSTDIN="$TPPATH_FILTERS/pfstdin"
TPFILTER="$TPPATH_BIN/turboprint-cupsfilter"

########
# job cancelling & cleanup procedure
########
cleanup()
{
        echo "job cancelling procedure - PFPID=$PFPID" >> $LOGFILE
        ########
        # terminate tpcupsfilter background process
        # (should eject current page)
	# TODO: this might be better handled within tpcupsfilter?
        ########
        if [ $PFPID ] ; then
                ps $PFPID &> /dev/null
                if [ $? -eq 0 ] ; then
			echo "tpcupsfilter is running, will send TERM" >> $LOGFILE
                	kill -TERM $PFPID >> $LOGFILE
			sleep 1
		fi
                ps $PFPID &> /dev/null
                if [ $? -eq 0 ] ; then
                        # if tpcupsfilter is still running, wait 30sec and term
			echo "tpcupsfilter is still running, will send TERM in 30sec" >> $LOGFILE
			sleep 30
                	kill -TERM $PFPID >> $LOGFILE
                fi
        fi
        ########
        # wait for child processes
        ########
        wait
	echo "tpcupsfilter is has ended" >> $LOGFILE
        ########
        # wrap around log file
        ########
	$TPSTDIN --cutlogfile $LOGFILE 128
        echo "------------ END of anytoturboprint filter ------------" >> $LOGFILE
        ########
        # send remaining data from stdin to null device
        ########
        cat > /dev/null
}

########
# write some info to logfile
########
echo >> $LOGFILE || LOGFILE="/dev/null"
echo "#######################################################" >> $LOGFILE
echo "New print job $(date) (anytoturboprint 2.90-beta1)" >> $LOGFILE
QUOTE="'"
QUOTEESC="'\''"
JOBID="$1"
USER="$2"
TITLE="${3//$QUOTE/$QUOTEESC}"
COPIES="$4"
OPTIONS="$5"
PPDFILE="${PPD//$QUOTE/$QUOTEESC}"
QUEUE=${PPDFILE##*/}
QUEUE=${QUEUE%.ppd}
echo "job-id $JOBID" >> $LOGFILE
echo "user $USER" >> $LOGFILE
echo "title $TITLE" >> $LOGFILE
echo "copies $COPIES" >> $LOGFILE
echo "options $5" >> $LOGFILE
echo "file $6" >> $LOGFILE
echo "ppdfile $PPDFILE" >> $LOGFILE
echo "queue $QUEUE" >> $LOGFILE
lpstat -v $QUEUE >> $LOGFILE

########
# signal handling
########
#trap 'cleanup' 15

########
# build command line for tpcupsfilter
#
# --queue    : cups print queue name (short name)
# --ppdfile  : name of ppd file
# --copies   : number of copies
# --jobid    : cups job id number
# --username : owner of print job
# --title    : print job document title
# -l     : set name of logfile
# - -    : read image from stdin and send printer data to stdout
########
COMMANDLINE="$TPFILTER '--queue=$QUEUE' '--ppdfile=$PPD' --copies=$COPIES --jobid=$JOBID '--username=$USER' '--title=$TITLE' '--options=$OPTIONS' '-l$LOGFILE' -v2"

if [ -z $6 ] ; then
	COMMANDLINE="$COMMANDLINE - -"
else
	COMMANDLINE="$COMMANDLINE $6 -"
fi

echo "command line is" >> $LOGFILE
echo "$COMMANDLINE" >> $LOGFILE

eval "$COMMANDLINE"
# PFPID=$!
# wait until pscupsfilter background process has ended
# wait $PFPID

EXITSTATE=$?

echo "------------ End of print job result=$EXITSTATE ------------" >> $LOGFILE

########
# cleanup
########
cleanup

#exit $EXITSTATE

if [ $EXITSTATE -ne 0 && $EXITSTATE -ne -1 ] ; then
	# error
	exit 1 
else
	# success also on EXITSTATE USERABORT (-1)
	exit 0 
fi
