#!/bin/sh
#
# The contents of this file are subject to the Netscape Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/NPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is Netscape
# Communications Corporation.  Portions created by Netscape are
# Copyright (C) 1998 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s): 
#

##
## For silly people running firefox through sudo
##
if [ "${SUDO_USER}" ] && [ "${SUDO_USER}" != "${USER}" ]; then
    SUDO_HOME=`getent passwd ${SUDO_USER} | cut -f6 -d:`
    if [ "${SUDO_HOME}" = "${HOME}" ]; then
        echo "You should really not run firefox through sudo WITHOUT the -H option." >&2
        echo "Anyway, I'll do as if you did use the -H option." >&2
        HOME=`getent passwd ${USER} | cut -f6 -d:`
        if [ -z "${HOME}" ]; then
            echo "Could not find the correct home directory. Please use the -H option of sudo." >&2.
        fi
    fi
fi

##
## Variables
##
MOZ_DIST_BIN="/usr/lib/mozilla-firefox"
MOZ_PROGRAM="/usr/lib/mozilla-firefox/firefox-bin"

##
## Load system and user properties
##

RUNTIME_FIREFOX_DSP="${FIREFOX_DSP}"

if [ -f /etc/mozilla-firefox/mozilla-firefoxrc ]; then
    . /etc/mozilla-firefox/mozilla-firefoxrc
fi

if [ -f "${HOME}/.mozilla/firefox/rc" ]; then
    . "${HOME}/.mozilla/firefox/rc"
elif [ -f "${HOME}/.mozilla-firefoxrc" ]; then
    . "${HOME}/.mozilla-firefoxrc"
    echo "Warning: a .mozilla-firefoxrc file has been found in your home directory" >&2
    echo "While it is still supported, it is recommended to move it to" >&2
    echo "\${HOME}/.mozilla/firefox/rc" >&2
fi

if [ "${RUNTIME_FIREFOX_DSP}" ]; then
    FIREFOX_DSP="${RUNTIME_FIREFOX_DSP}"
fi

if [ -z "${FIREFOX_DSP}" ]; then
    FIREFOX_DSP="auto"
fi

##
## find /dev/dsp handler
##

if [ "${FIREFOX_DSP}" = "auto" ]; then
    FIREFOX_DSP=
    if pgrep -u `id -u` esd >/dev/null 2>&1; then 
        FIREFOX_DSP=esddsp 
    elif pgrep -u `id -u` arts >/dev/null 2>&1; then 
        FIREFOX_DSP=artsdsp 
    fi
elif [ "${FIREFOX_DSP}" = "none" ]; then
    FIREFOX_DSP=
fi

##
## Set MOZILLA_FIVE_HOME
##
MOZILLA_FIVE_HOME="/usr/lib/mozilla-firefox"

export MOZILLA_FIVE_HOME

##
## Set LD_LIBRARY_PATH
##
EXTENT_LD_LIB_PATH=/usr/lib/mozilla-firefox:/usr/lib/mozilla-firefox/plugins:/usr/lib/mozilla/plugins:/usr/lib
if [ "${LD_LIBRARY_PATH}" ]; then
    LD_LIBRARY_PATH=${EXTENT_LD_LIB_PATH}:${LD_LIBRARY_PATH}
else
    LD_LIBRARY_PATH=${EXTENT_LD_LIB_PATH}
fi

export LD_LIBRARY_PATH

# Set XPSERVERLIST if not set yet for XPrint support, or complain.

#if [ -z "${XPSERVERLIST}" ]; then
#    if [ -x /etc/init.d/xprint ]; then
#        XPSERVERLIST=`/etc/init.d/xprint get_xpserverlist`
#        export XPSERVERLIST
#    else
#        echo -e "Warning: \${XPSERVERLIST} not set and /etc/init.d/xprint not found;\nprinting will not work.\nPlease install the xprt-xprintorg package" >&2
#    fi  
#fi

verbose () {
    if [ "${VERBOSE}" ]; then
        echo $@
    fi
}

echo_vars () {
    if [ "${VERBOSE}" ]; then
      for var in "$@"; do
          echo "$var=`eval echo \\${$var}`"
      done
    fi
}
    
# exec wrapper for verbosity
exec_verbose () {
    verbose Running: $@
    exec "$@"
}

# exec wrapper for verbosity
run_verbose () {
    verbose Running: $@
    "$@"
}

# Figure out if we need to ser LD_ASSUME_KERNEL for older versions of the JVM.
set_jvm_vars () {

    if [ ! -L /usr/lib/mozilla/plugins/libjavaplugin_oji.so ]; then
        return;
    fi

    JVM_LINK=`readlink /usr/lib/mozilla/plugins/libjavaplugin_oji.so`

    # is it relative?  if so append the full path

    echo "${JVM_LINK}" | grep -e "^/" 2>&1 > /dev/null

    if [ "$?" -ne 0 ]; then
        JVM_LINK="/usr/lib/mozilla/plugins/${JVM_LINK}"
    fi

    JVM_BASE=`basename "${JVM_LINK}"`
    JVM_DIR=`dirname "${JVM_LINK}"`
    JVM_COMMAND="${JVM_DIR}/java"
    if [ ! -r "${JVM_COMMAND}" ]; then
        JVM_DIR="${JVM_DIR}/../../../bin/"
        JVM_COMMAND="${JVM_DIR}/java"
        # does the command exist?
        if [ ! -r "${JVM_COMMAND}" ]; then
            return
        fi
    fi

    # export this temporarily - it seems to work with old and new
    # versions of the JVM.
    export LD_ASSUME_KERNEL=2.2.5

    # get the version
    JVM_VERSION=`${JVM_COMMAND} -version 2>&1 | grep version | cut -f 3 -d " " | sed -e 's/\"//g'`

    unset LD_ASSUME_KERNEL

    case "${JVM_VERSION}" in
        (1.3.0*)
        # bad JVM
        export LD_ASSUME_KERNEL=2.2.5
        ;;
    esac

    echo_vars JVM_DIR JVM_VERSION
}

clean_profile()
{
# Clean up the XUL.mfasl unconditionally on launch, since we have the
# corner case of when firefox is running when upgraded. Need a
# better solution or upstream fix.
# Clean up the compatibility.ini as well, since we have a corner case of when
# some components register protocols. Need a better solution or upstream fix.
    if [ -f "${HOME}/.mozilla/firefox/profiles.ini" ]; then
        sed -e '/Path=/! d' -e 's,Path=/,/,' -e "s,Path=,${HOME}/.mozilla/firefox/," "${HOME}/.mozilla/firefox/profiles.ini" \
        | while read dir
            do
            rm -f "${dir}/XUL.mfasl"
	    if [ "${dir}/compreg.dat" -ot "/usr/lib/mozilla-firefox/components.ini" ]; then
	        rm -f "${dir}/compatibility.ini"
	    fi
        done
    fi
}

# OK, here's where all the real work gets done

# parse command line
APPLICATION_ID=firefox
REMOTE=0
TRY_USE_EXIST=0
VERBOSE=
DEBUG=0
DEBUGGER=
first=1
opt=
for arg in "$@"; do
    if [ ${first} -eq 1 ]; then
        set dummy
        first=0
    fi

    case "${arg}" in
        -a | --display | -contentLocale | -UILocale | -remote | --debugger | -height | -width | -chrome | -P)
            prev=${arg}
            continue
        ;;
    esac
    
    if [ "${prev}" ]; then
        case "${prev}" in
            -a)
                APPLICATION_ID="${arg}"
                ;;
            --display)
                CMDLINE_DISPLAY="${arg}"
                set "$@" --display "${arg}"
                ;;
            -remote)
                REMOTE=1
                set "$@" -remote "${arg}"
                ;;
            --debugger)
                DEBUGGER="${arg}"
                DEBUG=1
                ;;
            *)
                set "$@" "${prev}" "${arg}"
                ;;
        esac
        prev=
    elif [ "${arg}" ]; then
        case "$arg" in
            --verbose | -V)
                VERBOSE=1
                ;;
            --display=*)
                CMDLINE_DISPLAY=`echo ${arg} | sed 's/^--display=//'`
                set "$@" "${arg}"
                ;;
            -g | -debug)
                DEBUG=1
                ;;
            -*)
                set "$@" "${arg}"
                ;;
            *)
                if [ -z "${opt}" ]; then
                    opt="${arg}"
                    # check to make sure that the url contains at least a :/ in it.
                    echo ${opt} | grep -e ':/' 2>/dev/null > /dev/null
                    RETURN_VAL=$?
                    if [ "${RETURN_VAL}" -eq 1 ]; then
                    # if it doesn't begin with a '/' and it exists when the pwd is
                    # prepended to it then append the full path
                        echo ${opt} | grep -e '^/' 2>/dev/null > /dev/null
                        if [ "$?" -ne "0" ] && [ -e "`pwd`/${opt}" ]; then
                            opt="`pwd`/${opt}"
                        fi
		        # Replace all spaces by %20 and prepend file:// if it is a valid file
			if [ -e "${opt}" ]; then
		          opt="file://`echo ${opt} | sed 's/ /%20/g'`"
			fi
                    fi
                    set "$@" "${opt}"
                else
                    set "$@" "${arg}"
                fi
                ;;
        esac
    fi
done

if [ $# -ne 0 ]; then
    shift
fi
OPTIONS="$@"

if [ ${DEBUG} -eq 1 ]; then
    if [ "${DEBUGGER}" = "" ]; then
        DEBUGGER=gdb
    fi
    TMPFILE=`mktemp -t firefox_argsXXXXXX`
    echo set args -a ${APPLICATION_ID} "$@" > ${TMPFILE}
    case "${DEBUGGER}" in
        gdb)
            run_verbose gdb "${MOZ_PROGRAM}" -x ${TMPFILE}
            ;;
        ddd)
            run_verbose ddd --debugger "gdb -x ${TMPFILE}" "${MOZ_PROGRAM}"
            ;;
        *)
            run_verbose ${DEBUGGER} "${MOZ_PROGRAM}" "$@"
            ;;
    esac
    rm ${TMPFILE}
    exit
fi

if [ $# -eq 1 ] && [ "$1" = "${opt}" ]; then
    TRY_USE_EXIST=1
fi

MOZ_PROGRAM="${MOZ_PROGRAM} -a ${APPLICATION_ID}"

echo_vars FIREFOX_DSP APPLICATION_ID CMDLINE_DISPLAY DISPLAY REMOTE \
          TRY_USE_EXIST OPTIONS DEBUG DEBUGGER

# set our JVM vars
set_jvm_vars

PING_STATUS=1

# No need to check if DISPLAY is not set, it will fail. But let's continue,
# so that firefox gives the display error message itself.
if [ "${DISPLAY}" ] || [ "${CMDLINE_DISPLAY}" ]; then
    if [ -z "${CMDLINE_DISPLAY}" ]; then
        CMDLINE_DISPLAY="${DISPLAY}"
    fi
    
    # check to see if there's an already running instance or not
    verbose "Running: ${MOZ_PROGRAM} -remote 'ping()'"
    DISPLAY="${CMDLINE_DISPLAY}" ${MOZ_PROGRAM} -remote 'ping()' \
        > /dev/null 2>&1
    PING_STATUS=$?
fi

echo_vars PING_STATUS

# Clean user profile if we are not trying to use the running instance and only
# if the check was successful (status 2)
if [ "${REMOTE}" -eq 0 ] && [ "${TRY_USE_EXIST}" -eq 0 ] && [ "${PING_STATUS}" -eq 2 ]; then
    verbose "Cleaning user profile"
    clean_profile
fi

# If there is no command line argument at all then try to open a new
# window in an already running instance.
if [ "${PING_STATUS}" -eq 0 ] && [ $# -eq 0 ]; then
    exec_verbose ${MOZ_PROGRAM} -remote "xfeDoCommand(openBrowser)"
fi

# If we are trying to use existing instance, and it exists, and we're not having
# a -remote command line argument, then open in window or tab accordingly.
if [ "${REMOTE}" -eq 0 ] && [ "${TRY_USE_EXIST}" -eq 1 ] && [ "${PING_STATUS}" -eq 0 ]; then
    # just pass it off if it looks like a url
    exec_verbose ${MOZ_PROGRAM} -remote "openURL(${opt})"
fi

if type "${FIREFOX_DSP}" > /dev/null 2>&1; then
    # echo "Using $FIREFOX_DSP."
    MOZ_PROGRAM="${FIREFOX_DSP} ${MOZ_PROGRAM}"
fi

exec_verbose ${MOZ_PROGRAM} "$@"
