#!/bin/sh
#######################################################################
#
#  AM_Fax_Modem - fax printer "if" handler for NeXT Computer
#
#  Note:
#    If DEBUG is YES, the fax will be sent to yourself (in /tmp directory)
#
#
#  (C) Olaf Mueller <olaf@orest.escape.de>  08OCT96
#
########################################################################

#DEBUG=YES
DEBUG=NO

NIS_DOMAIN=/
DEFERMINUTES=5

# -------------------------- do not edit below ---------------------------------------

PStoG3TIFF=/usr/local/lib/AM/ps2gtif
G3TIFFtoRAW=/usr/local/lib/AM/tifstrp
SENDFAX=/usr/local/lib/AM/sendfax
MODRETRY=/usr/local/lib/AM/retries

MAILER=/usr/ucb/mail
OUT=/dev/console
MYNAME=`basename $0`

# echo $MYNAME $* > $OUT

#
# Arguments From Printer System NeXT print server will call this program
#
for PARAM_N do
	if [ "$PARAM_N" = "-n" ]; then PARAM_N="-n"; fi
	if [ "$FLAG_f" = "yes" ]; then FaxName=$PARAM_N; FLAG_f="no"; fi  
	if [ "$FLAG_n" = "yes" ]; then UserName=$PARAM_N; FLAG_n="no"; fi  
	if [ "$FLAG_h" = "yes" ]; then HostName=$PARAM_N; FLAG_h="no"; fi  
	if [ "$FLAG_p" = "yes" ]; then PrinterName=$PARAM_N; FLAG_p="no"; fi  
	case ${PARAM_N} in 
	-w*) PARAM_w="`echo \"$PARAM_N\" | sed -n 's/^-w*\(.*\)/\1/p'`";;
	-l*) PARAM_l="`echo \"$PARAM_N\" | sed -n 's/^-l*\(.*\)/\1/p'`";; 
	-i*) PARAM_i="`echo \"$PARAM_N\" | sed -n 's/^-i*\(.*\)/\1/p'`";;
	-f*) FLAG_f="yes";;
	-n*) FLAG_n="yes";;
	-h*) FLAG_h="yes";;
	-p*) FLAG_p="yes";;
	*) PARAM_LOG_PATH=$PARAM_N;;
	esac
done

# echo $FaxName $UserName $HostName $PrinterName $PARAM_w $PARAM_l $PARAM_i > $OUT

#
# read netinfo
#

# get printer spool directory
SPOOLDIR="`niutil -read \"$NIS_DOMAIN\" /printers/\"$PrinterName\" | sed -n 's/^\(sd: \)\(.*\)[ ]*$/\2/p'`"

status=$?
if [ "$status" != "0" ]; then
	echo \#\> $PrinterName\: finding printer description failed. Probably bad NIS_DOMAIN value > $OUT
	exit 0
fi

# get fax modem values
ARGUMENTS="`niutil -read \"$NIS_DOMAIN\" /fax_modems/\"$PrinterName\"`"

CSI="`echo \"$ARGUMENTS\" | sed -n 's/^csi:[ ]*\(.*\)/\1/p'`"
DEVICE="`echo \"$ARGUMENTS\" | sed -n 's/^device:[ ]*\(.*\)/\1/p'`"
RETRIES="`echo \"$ARGUMENTS\" | sed -n 's/^retries:[ ]*\(.*\)/\1/p'`"
SP_VOLUME="`echo \"$ARGUMENTS\" | sed -n 's/^speaker_volume:[ ]*\(.*\)/\1/p'`"
SP_CONTROL="`echo \"$ARGUMENTS\" | sed -n 's/^speaker_dial_only:[ ]*\(.*\)/\1/p'`"
DIALPREFIX="`echo \"$ARGUMENTS\" | sed -n 's/^dial_prefix:[ ]*\(.*\)/\1/p'`"
TONEDIAL="`echo \"$ARGUMENTS\" | sed -n 's/^tone_dial:[ ]*\(.*\)/\1/p'`"

# echo spooldir = $SPOOLDIR > $OUT
# echo csi = $CSI > $OUT
# echo device = $DEVICE > $OUT
# echo retries = $RETRIES > $OUT


#
# read fax header and footer
#
ARGUMENTS="`fgrep \"%%NXFax
%%Title:
%%Page: Coversheet
%%NXRetryCount\" $FaxName`"

FaxTo="`echo \"$ARGUMENTS\" | sed -n 's/^%%NXFaxTo:[ ]*\(.*\)/\1/p'`"
FaxNumber="`echo \"$ARGUMENTS\" | sed -n 's/^%%NXFaxNumber:[ ]*\(.*\)/\1/p'`"
FaxNotify="`echo \"$ARGUMENTS\" | sed -n 's/^%%NXFaxNotify:[ ]*\(.*\)/\1/p'`"
Hires="`echo \"$ARGUMENTS\" | sed -n 's/^%%NXFaxHires:[ ]*\(.*\)/\1/p'`"
Title="`echo \"$ARGUMENTS\" | sed -n 's/^%%Title:[ ]*\(.*\)/\1/p'`"
Cover="`echo \"$ARGUMENTS\" | sed -n 's/^%%Page: Coversheet[ ]*\(.*\)/\1/p'`"
RetryCount="`echo \"$ARGUMENTS\" | sed -n 's/^%%NXRetryCount:[ ]*\(.*\)/\1/p'`"
if [ "$RetryCount" = "" ]; then
	RetryCount=0
fi

# in case of a coversheet we have 2 titles, but want only the first
if [ "$Cover" != "" ]; then
	FIRST=YES
	for tit in $Title
	do
		draw=`echo $tit | fgrep -c ".draw"`
		if [ "$draw" = "1" ]; then
			if [ "$FIRST" = "NO" ]; then
				break
			fi
		fi
		titl=$titl" "$tit
		FIRST=NO
	done
	Title=$titl
fi

# echo fax to = $FaxTo > $OUT
# echo fax number = $FaxNumber > $OUT
# echo SendReceipt:$FaxNotify HighRes:$Hires > $OUT
# echo Title:$Title > $OUT
# echo RetryCount:$RetryCount > $OUT
# echo cover = $Cover > $OUT


#
# convert PS to G3 tiff pages
#
if [ "$Hires" = "YES" ]; then
	lpi=1
else
	lpi=0
fi

cd $SPOOLDIR


echo \#\> $PrinterName\: Converting PostScript file to tiff \(G3 Fax compression\) ... > $OUT

# echo $PStoG3TIFF -r $lpi -g 0 $FaxName $FaxName > $OUT
$PStoG3TIFF -r $lpi -g 0 $FaxName $FaxName > $OUT &
wait

status=$?

if [ "$status" = "0" ]; then
	Pages=`ls $FaxName.*.tiff | fgrep -c $FaxName`
	PageNames=`ls $FaxName.*.tiff`
	echo \#\> $PrinterName\: ... successful \($Pages pages\) > $OUT
else
	echo \#\> $PrinterName\: ... failed > $OUT
	exit 0
fi


#
# convert G3 tiff pages to fax page raw data
#
echo \#\> $PrinterName\: Converting G3 fax pages to raw data ... > $OUT
for file in $PageNames
do
	APP=`echo $file | awk -F'.' '{print $2}'`
#	echo $G3TIFFtoRAW -b 1 -X $FaxName.$APP > $OUT
	$G3TIFFtoRAW -b 1 -X $FaxName.$APP > $OUT
done
echo \#\> $PrinterName\: ... done > $OUT


# in case of a coversheet we want the coversheet first, not last
if [ "$Cover" != "" ]; then
	PageNames=`ls $FaxName.*`
	for name in $PageNames
	do
		nam=$name
	done
	cp $nam $FaxName.000
	PageNames=`ls $FaxName.* | sort -r`
	FIRST=YES
	for name in $PageNames
	do
		if [ "$FIRST" = "YES" ]; then
			FIRST=NO
			rm -f $name
		else
			mv $name $target
		fi
		target=$name
	done
fi


if [ "$DEBUG" = "YES" ]; then
#
# test: generate current fax in /tmp directory.
#
	echo \#\> $PrinterName\: DEBUG mode: generate testfax in /tmp directory ... > $OUT
	for file in $FaxName.*
	do
		APP=`echo $file | awk -F'.' '{print $2}'`
		if [ "$Hires" = "YES" ]; then
			res=-s
			echo -n '100' > /tmp/$FaxName.$APP
		else
			res=-d
			echo -n '000' > /tmp/$FaxName.$APP
		fi
		cat $file >> /tmp/$FaxName.$APP
	done
	touch /tmp/$FaxName.fax
	/usr/lib/NextPrinter/faxcleanup -Q -X $res $Pages /tmp/$FaxName
	status=0
	echo \#\> $PrinterName\: DEBUG mode: ... done > $OUT
else
#
# Call sendfax program.
#
	if [ "$SP_CONTROL" = "Y" ]; then
		SP_CONTROL=1
	else
		SP_CONTROL=2
	fi
	if [ "$TONEDIAL" = "Y" ]; then
		TONEDIAL=1
	else
		TONEDIAL=0
	fi
	FaxNo=$DIALPREFIX$FaxNumber
	echo \#\> $PrinterName\: dialing $FaxNo for $UserName... > $OUT
#	echo $SENDFAX -b 1 -r $lpi -c "$CSI" -l $SP_VOLUME -m $SP_CONTROL -d $TONEDIAL -s 70 -C 1 $DEVICE "$FaxNo" $Pages $FaxName > $OUT
	SendfaxError=`$SENDFAX -b 1 -r $lpi -c "$CSI" -l $SP_VOLUME -m $SP_CONTROL -d $TONEDIAL -s 70 -C 1 $DEVICE "$FaxNo" $Pages $FaxName`
	status=$?
	echo \#\> $PrinterName\: Result: $SendfaxError \($status\) > $OUT
fi


#
# clean up
#
rm -f $FaxName.*


#
# set exit and mail value
#
if [ "$status" = "0" ]; then
	exitValue=0
	mailValue=2
else
	if [ "$RETRIES" = "0" ]; then
		exitValue=0
		mailValue=1
	else
		if [ "$RETRIES" = "$RetryCount" ]; then
			exitValue=0
			mailValue=1
		else
			$MODRETRY $FaxName $RetryCount $DEFERMINUTES
			exitValue=1
			mailValue=0
		fi
	fi
fi


#
# Send receipt, if requested and necessary
#
if [ "$FaxNotify" = "YES" ]; then
	if [ "$mailValue" != "0" ]; then
		cd /
		Language=`su $UserName -c 'dread System Language' | awk '{print $3}' | awk -F';' '{print $1}'`
		if [ "$Language" = "German" ]; then
			subject="Ihr Fax an $FaxTo ($FaxNumber)"
			text="Bezug: Ihr Fax mit dem Titel \"$Title\"."
			if [ "$mailValue" = "2" ]; then
				report="Ihr Fax wurde erfolgreich zugestellt."
				reason=""
			else
				report="Ihr Fax konnte nicht zugestellt werden."
				reason="Grund: $SendfaxError"
			fi
		else
			subject=`echo "Your Fax to $FaxTo ($FaxNumber)"`
			text=`echo "Subject: Your fax titled \"$Title\"."`
			if [ "$mailValue" = "2" ]; then
				report="Your Fax is sent successfully."
				reason=""
			else
				report="Your Fax could not be sent."
				reason="Reason: $SendfaxError"
			fi
		fi
		echo "
$text

$report
$reason" | $MAILER -s "$subject" $UserName > /dev/null
	fi
fi


exit $exitValue
