#!/bin/bash

CONFIG="/etc/sysconfig/fax"
FROM=""
NAME=""
PAGE=a4
FAXPRG=/usr/bin/fax
LOGDIR=/var/log/fax

#
# This is fax4CUPS 1.29, a fax back end for CUPS
#
# Copyright (C) 2001-2010 Sebastiano Vigna <vigna@acm.org>
#
#   This program is free software; you can redistribute it and/or modify it
#   under the terms of the GNU General Public License as published by the Free
#   Software Foundation; either version 2 of the License, or (at your option)
#   any later version.
#
#   This program is distributed in the hope that it will be useful, but
#   WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
#   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
#   for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# Modified by Michael Goffioul <goffioul at imec dot be>
#
#   - phone number as option instead of job name: "-o phone=<number>"
#
# Additional fixes by Kevin Ivory <Ivory at SerNet dot de>
#
# Fixes and better cleanup by Diab Jerius <jerius at comcast dot net>
#

trap "cleanup" EXIT

function cleanup {
	if [ -n "$FAXNAME" ]; then
		rm -f $FAXNAME.[0-9][0-9][0-9] 
		if [ $# -lt 6 ]; then rm -f $FAXNAME; fi
	fi
}

# We check for $CONFIG and possibly source it.
for configfile in $CONFIG; do
	if [ -f "$configfile" ]; then
		. $configfile
	fi
done

# Called with no arguments, we list the serial devices as possible fax devices.
# If /dev/modem has been set up, we list it too.

if [ $# -eq 0 ]; then
	if [ ! -x "$FAXPRG" ]; then exit 0; fi
	if [ -e /dev/modem ]; then echo "serial efax:/dev/modem \"Unknown\" \"Faxmodem (efax on /dev/modem)\""; fi
	if [ -e /dev/tty.modem ]; then echo "serial efax:/dev/tty.modem \"Unknown\" \"Faxmodem (efax on /tty.modem)\""; fi
	if [ -e /dev/cu.modem ]; then echo "serial efax:/dev/cu.modem \"Unknown\" \"Faxmodem (efax on /cu.modem)\""; fi
	for ser in $(\ls -1 /dev/ttyS[0-9]* | sort -g +0.9 | head -32); do
		echo "serial efax:$ser \"Unknown\" \"Faxmodem on Serial Port #$((${ser#/dev/ttyS}+1)) (efax)\""
	done
	exit 0
fi

DEV=${DEVICE_URI#efax:/dev/}
RES=""		# Default resolution is high; set this to -l for low resolution
NUMBER=""	# Use option "phone" as number by default

# If we find six arguments, the last one is the fax name; otherwise,
# we have to create a temporary file.

if [ $# -eq 6 ]; then
	FAXNAME=$6
else
	FAXNAME=$(mktemp </dev/null /tmp/fax.XXXXXX) || ( echo "ERROR: Failed to create temporary file" 1>&2; exit 2 )
	cat >$FAXNAME
fi

# Parse user-specified options from the PostScript file and set -l/-m
function getSelectedOption() {
	for i in $@; do
		case $i in
			\**) SELOPT=${i#[*]}; return ;;
		esac
	done
}

function parseOptions() {
	
	while read LINE; do 
		MAIN=${LINE%%:*}
		OPTIONS=${LINE##*:}
		getSelectedOption $OPTIONS

		case $MAIN in
			PageSize/*) echo "PAGE=$( echo -n "$SELOPT" | tr '[:upper:]' '[:lower:]' )" ;;
			Resolution/*) if [ "$SELOPT" == "204x98dpi" ]; then echo "RES=-l"; fi ;;
			Dial/*) if [ "$SELOPT" == "Manually" ]; then echo "NUMBER=-m"; elif [ $SELOPT == "JobName" ]; then echo "NUMBER=-j"; fi ;;
		esac
	done
}

eval $(lpoptions -p $PRINTER -l | parseOptions)
if [ "$NUMBER" == "-j" ]; then 
	 NUMBER="$3"; 
fi

# Scan user options and set -l/-m (override previous choices if necessary)

for opt in $5; do
	case "$opt" in
		lowres*) RES="-l" ;;
		hires*) RES="" ;;
		manual*) NUMBER="-m" ;;
		jobname*) NUMBER="$3" ;;
		phone=*) NUMBER="${opt#phone=}" ;;
		media=*) PAGE=$( echo ${opt#media=} | tr '[:upper:]' '[:lower:]' ) ;;
	esac
done

echo 1>&2 # Apparently the first character emitted is somehow "eaten" by the reader

# Knock off smbprn.* job info
NUMBER=$(echo "$NUMBER" | sed 's/smbprn\.[0-9]\+//')
# Pick out destination fax number
NUMBER=$(echo "$NUMBER" | grep -E -o '\+?[0-9][-0-9]{5,}')

# do some cheking before continuing
if [ -z "$NUMBER" ]; then
	echo "ERROR: Empty phone number" 1>&2
	exit 2
elif [ "$NUMBER" == "(stdin)" ]; then
	echo "ERROR: (stdin) is not a valid phone number" 1>&2
	exit 2
elif [ "$NUMBER" == "stdin" ]; then
	echo "ERROR: stdin is not a valid phone number" 1>&2
	exit 2
elif [ ! -x "$FAXPRG" ]; then
	echo "ERROR: $FAXPRG: executable not found" 1>&2
	exit 2
fi

pushd $LOGDIR # If there are problem, efax will generate a log file in the current directory

# Normalise PAGE values (fax is very picky)

case "$PAGE" in
	*letter*) PAGE=letter ;;
	*legal*) PAGE=legal ;;
	*) PAGE=a4 ;;
esac

sudo $FAXPRG LOGDIR=$LOGDIR DEV=$DEV PAGE=$PAGE "FROM=\"$FROM\"" "NAME=\"$NAME\"" send $RES $NUMBER $FAXNAME 2>>$LOGDIR/$DEV.log 1>&2

RC=$?

case $RC in
	0) echo "INFO: Fax sent" 1>&2 ;;
	1) echo "ERROR: Busy" 1>&2 ;;
	2) echo "ERROR: Could not send fax" 1>&2 ;;
	3) echo "ERROR: Modem protocol error" 1>&2 ;;
	4) echo "ERROR: Modem not responding" 1>&2 ;;
	5) echo "ERROR: Fax program terminated" 1>&2 ;;
esac

popd

exit $RC
