#!/bin/bash
##############################################################################
# CUPS fax printer (capifax)
#
# Requirements:
# capifax, netcat, ghostscript, cups, (zenity [optional])
#
# Installation:
# 1. Add socket-printer:
# sudo lpadmin -p capifax -E -v socket://localhost:10234 -m raw
# 2. Add this script to settings->sessions for autostart.
# 3. Print to capifax printer, type in number and fax :-)
##############################################################################

##############################################################################
# CONFIG:
##############################################################################
MSN="123456"							# The MSN to send fax from
CONTROLLER="1"							# Outgoing CAPI controller
IDENT="+49 0000 00000"						# Fax-Ident No.
HEADER="esync.de"						# Fax-Header
RATE="14400"							# Fax-Rate
CUPS_PORT="10234"						# CUPS socket printer port (sudo lpadmin -p capifax -E -v socket://localhost:10234 -m raw)
FAX_DIR="/tmp"							# Fax directory (for postscript and tiff)
DELETE_AFTER_SEND="1"						# Delete after sending?
#GS_OPTIONS="-q -dNOPAUSE -dBATCH -sDEVICE=tiffg3 -r204x196"	# ghostscript options
GS_OPTIONS="-q -dNOPAUSE -dBATCH -sDEVICE=cfax -r204x196"	# ghostscript options
USE_ZENITY="1"							# 1=zenity dialog, 0=xterm shell
CAPIFAX_CUPS="$0"						# this file (do not edit!)
##############################################################################

askno() {
	if [ "$1" = "SHELL" ];
	then
		echo -n "Zielrufnummer (Ctrl. $CONTROLLER): "
		read TRG_NO		
	else
		TRG_NO=`zenity --entry --text="Zielrufnummer (Ctrl. $CONTROLLER):" --title "capifax ($MSN)"`
	fi
	
	echo "$TRG_NO" > "$FAX_DIR/TRGNO.$MSN"	
	exit 0
}

send_fax() {
	#xterm -title "capifax (from $MSN to $2)" -e "capifax -send \"$1\" \"$CONTROLLER\" \"$MSN\" \"$2\" -header \"$HEADER\" -ident \"$IDENT\" -rate \"$RATE\"; echo \"Press 'Enter' to exit now ...\"; read;"
	
    xterm -title "capifax (from $MSN to $2)" -e "capifax  -h \"$HEADER\" -c \"$MSN\" -i \"$IDENT\" \"$2\" \"$TIFF_FILE\"; echo \"Press 'Enter' to exit now ...\"; read;"
}

cleanup() {
	echo "Exiting..."
	rm "$PS_FILE" 2>/dev/null	
	exit 0	
}

# $1=ASKNO
if [ "$1" = "ASKNO_SHELL" ]; then askno "SHELL"; fi
if [ "$1" = "ASKNO_ZENITY" ]; then askno "ZENITY"; fi

# check for capifax
echo -n "Searching capifax: "
type capifax
if [ ! $? -eq 0 ]; then echo "Error: no capifax found!"; exit 1; fi

# check for netcat
echo -n "Searching netcat: "
type nc
if [ ! $? -eq 0 ]; then echo "Error: no netcat found!"; exit 1; fi

# check for ghostscript
echo -n "Searching ghostscript: "
type gs
if [ ! $? -eq 0 ]; then echo "Error: no ghostscript found!"; exit 1; fi

if [ "$USE_ZENITY" = "1" ]; 
then
	# use zenity or shell?
	echo -n "Searching zenity: "
	type zenity
	if [ $? -eq 0 ]; then ZENITY="1"; else ZENITY="0"; fi
else
	ZENITY="0"
fi

trap 'cleanup' 1 2 9 15

# receive loop
while [ "1" = "1" ]; 
do
	FILE_SUFFIX=`date +"%Y.%m.%d-%H.%M.%S"`
	PS_FILE="$FAX_DIR/capifax_$FILE_SUFFIX.ps"
	TIFF_FILE="$FAX_DIR/capifax_$FILE_SUFFIX.tiff"

	# receive ps file from cups printer socket
	nc -l -p $CUPS_PORT > "$PS_FILE"
	if [ -f "$PS_FILE" ];
	then
		# convert from ps to tiff
		gs $GS_OPTIONS -sOutputFile="$TIFF_FILE" "$PS_FILE"
		
		if [ -f "$TIFF_FILE" ];
		then			
			if [ "$ZENITY" = "1" ]; then
				$CAPIFAX_CUPS ASKNO_ZENITY
			else				
				xterm -title "capifax ($MSN)" -e "$CAPIFAX_CUPS ASKNO_SHELL"
			fi
			
			# get number from dialog and send fax
			TARGET_NO=`cat $FAX_DIR/TRGNO.$MSN`
			if [ ! -z "$TARGET_NO" ]; then
				send_fax "$TIFF_FILE" "$TARGET_NO"				
			else
				echo "Aborted!"
			fi
			rm "$FAX_DIR/TRGNO.$MSN" 2>/dev/null
		else
			echo "Error: $TIFF_FILE not found!"
		fi
	else
		echo "Error: $PS_FILE cannot be written!"
	fi

	# delete after send?
	if [ "$DELETE_AFTER_SEND" = "1" ]; then rm "$PS_FILE" "$TIFF_FILE" 2>/dev/null; fi	
	sleep 1
done
exit 0;
