#! /bin/sh
#
# This is a kludge to fix helper apps in mozilla.  See mozilla bugs #57420
# and also #78919.
#
# It's also useful for tar files with Netscape 4.x
#
# Copyright (c) 2002-2004  Paul Vojta
# 
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to
# deal in the Software without restriction, including without limitation the
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
# sell copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
# 
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
# 
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL PAUL VOJTA OR ANY OTHER AUTHOR OF OR CONTRIBUTOR TO
# THIS SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.

# Some changes suggested by Thomas Esser included by
# <stefanulrich@users.sourceforge.net>.

IN_FILE=
NO_RM=
TMP_DIR=
progname=xdvizilla

do_cleanup()
{
    exitval=$?
    if [ -z "$NO_RM" -a -n "$IN_FILE" ] ; then
	rm -f "$IN_FILE"
    fi
    test -n "$TMP_DIR" && rm -rf "$TMP_DIR"
    exit $exitval
}

do_abort()
{
    xmessage -nearmouse "$progname: $1"
    do_cleanup
    exit 1
}

usage()
{
    xmessage -nearmouse "Usage: $progname [-no-rm] <file>"
    do_cleanup
    exit 1
}

trap 'do_cleanup' 1 2 3 7 13 15

### create a temporary directory only read/writable by user
TMP_DIR=${TMP-/tmp}/$progname.$$
(umask 077; mkdir "$TMP_DIR") || do_abort "Could not create directory \`$TMP_DIR'"

if [ $# -gt 1 -a "x$1" = "x-no-rm" ]; then
  NO_RM=y
  shift
fi

if [ $# -ne 1 ]; then
  usage
fi

DIR=`dirname "$0"`

if [ "$DIR" = . ]; then
  DIR=
elif [ -f "$DIR"/xdvi -a -x "$DIR"/xdvi ]; then
  DIR="$DIR"/
else
  DIR=
fi

# need to preserve IN_FILE for eventual deletion
IN_FILE="$1"
TMP_FILE="$IN_FILE"

while [ 1 ]; do
    [ -f "$TMP_FILE" ] || do_abort "$TMP_FILE: File not found."    
    FILETYPE=`file "$TMP_FILE"`
    case "$FILETYPE" in
    *"gzip compressed data"*)
        out="$TMP_DIR"/tmp-gz
        gunzip -c "$TMP_FILE" > "$out"
        TMP_FILE="$out"
        ;;
    *"compressed data"* | *"compress'd data"*)
        out="$TMP_DIR"/tmp-compress
        uncompress -c "$TMP_FILE" > "$out"
        TMP_FILE="$out"
        ;;
    "$TMP_FILE: empty")
        do_abort "$TMP_FILE is an empty file
(probably a bug in Mozilla?)"
        ;;
    *" tar archive")
	### do sanity checks on the tar archive, to avoid overwriting user files:
	dangerous=`tar tf "$TMP_FILE" | egrep '^(/|.*\.\./)'`
	[ -z "$dangerous" ] || do_abort "Tar file contains files with absolute paths or \`../' components,
which may overwrite user files. Not unpacking it."
        ### also check for gzipped DVI files inside the archive ...
        out="$TMP_DIR"/`tar tf "$TMP_FILE" | egrep '\.(dvi|dvi.gz|dvi.Z)$' | head -1`
        if [ -z "$out" ]; then
	    do_abort "Tar file does not contain a dvi file."
        else
	    cat "$TMP_FILE" | (cd "$TMP_DIR"; tar xf -)
	    TMP_FILE="$out"
        fi
        ;;
    *"DVI file"*)
        "$DIR"xdvi -safer "$TMP_FILE"
        break
        ;;
    *)
        do_abort "$TMP_FILE: Unrecognized file format!"
        ;;
    esac
done

do_cleanup

exit 0
