#! /bin/bash
#
# Johannes Meixner <jsmeix@suse.de>, 2004, 2005, 2006

#set -x

export PATH="/sbin:/usr/sbin:/usr/bin:/bin"
export LC_ALL="POSIX"
export LANG="POSIX"
umask 022

MY_NAME=${0##*/}
OUTPUT_FORMAT="$1"
[ -z "$OUTPUT_FORMAT" ] && OUTPUT_FORMAT="ASCII"
[ "$OUTPUT_FORMAT" != "ASCII" -a "$OUTPUT_FORMAT" != "YCP" ] && { echo -en "\nUsage:\n$MY_NAME {ASCII|YCP}\n" 1>&2 ; exit 1 ; }

# Input:

# Create temporary file names:
TMP_DATA=$(mktemp -u /tmp/$MY_NAME.XXXXXX)
TMP_DATA_RAW=$(mktemp -u /tmp/$MY_NAME.XXXXXX)

# Get the raw data
MAXIMUM_WAIT="10"
if [ -x /usr/bin/sane-find-scanner ]
then sane-find-scanner -q >$TMP_DATA_RAW &
     sanefindscannerPID=$!
     for i in $( seq $MAXIMUM_WAIT )
     do ps hp $sanefindscannerPID | grep -q sane-find-scanner || break
        sleep 1
     done
     if ps hp $sanefindscannerPID | grep -q sane-find-scanner
     then kill -9 $sanefindscannerPID &>/dev/null
     fi
else echo "Cannot execute /usr/bin/sane-find-scanner" 1>&2
     exit 2
fi
# Only USB and SCSI scanners are taken into account:
egrep '^found SCSI |^found USB ' <$TMP_DATA_RAW | sort -u | sed -e 's/^found //' | tr \" \' >$TMP_DATA

# Output:

# Output header:
if [ "$OUTPUT_FORMAT" = "YCP" ]
then echo "[" 
else echo "CONNECTION|DEVICE|MANUFACTURER|USB_VENDOR_ID|MODEL|USB_PRODUCT_ID|DESCRIPTION"
fi

# Output scanner entries:
exec <$TMP_DATA
while read DESCRIPTION
do echo $DESCRIPTION | grep -q '^USB ' && CONNECTION="USB" || CONNECTION="SCSI"
   DEVICE=$( echo $DESCRIPTION | sed -e 's/.* at \(.*\)/\1/' )
   MANUFACTURER=""
   MODEL=""
   USB_VENDOR_ID=""
   USB_PRODUCT_ID=""
   if [ "$CONNECTION" = "USB" ]
   then MODEL=$( echo $DESCRIPTION | tr '[]' '||' | cut -d '|' -s -f 4 )
        [ -n "$MODEL" ] && MANUFACTURER=$( echo $DESCRIPTION | tr '[]' '||' | cut -d '|' -s -f 2 )
        USB_VENDOR_ID=$( echo $DESCRIPTION | sed -n -e 's/^.*vendor=\(0x[0-9A-Fa-f][0-9A-Fa-f]*\).*$/\1/p' | tr '[:upper:]' '[:lower:]' )
        USB_PRODUCT_ID=$( echo $DESCRIPTION | sed -n -e 's/^.*product=\(0x[0-9A-Fa-f][0-9A-Fa-f]*\).*$/\1/p' | tr '[:upper:]' '[:lower:]' )
   else # For SCSI: Simply use the first word as manufacturer name.
        # This is a keep-it-simple attempt because a few SCSI scanners
        # may report a two-word manufacturer name on the SCSI bus
        # (e.g. something like "Across Technologies" or "Linotype Hell").
        # Note that " was changed to ' when TMP_DATA was created above.
        MANUFACTURER=$( echo $DESCRIPTION | cut -d \' -s -f 2 | cut -d ' ' -s -f1 )
        # For HP set the name which is used in the SANE description files:
        if [ "$MANUFACTURER" = "HP" -o "$MANUFACTURER" = "hp" ]
        then MANUFACTURER="Hewlett-Packard"
        fi
   fi
   if [ "$OUTPUT_FORMAT" = "YCP" ]
   then echo -e "  \$[ \"connection\":\"$CONNECTION\",\n     \"device\":\"$DEVICE\",\n     \"manufacturer\":\"$MANUFACTURER\",\n     \"usb_vendor_id\":\"$USB_VENDOR_ID\",\n     \"model\":\"$MODEL\",\n     \"usb_product_id\":\"$USB_PRODUCT_ID\",\n     \"description\":\"$DESCRIPTION\"\n  ],"
   else echo "$CONNECTION|$DEVICE|$MANUFACTURER|$USB_VENDOR_ID|$MODEL|$USB_PRODUCT_ID|$DESCRIPTION"
   fi
done

# Output a footer for YCP
if [ "$OUTPUT_FORMAT" = "YCP" ]
then echo -e "  \$[]\n]"
fi

# Remove the temporary files
rm $TMP_DATA $TMP_DATA_RAW
exit 0

