#!/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): 
#

## 
## Usage:
##
## $ mozilla
##
## This script is meant to run a mozilla program from the mozilla
## rpm installation.
##
## The script will setup all the environment voodoo needed to make
## mozilla work.

VERSION=1.2

# Bug#122990
TERM=xterm
export TERM

cmdname=`basename $0`

## don't leave any core files around
ulimit -c 0

##
## Variables
##
MOZ_DIST_BIN="/usr/lib/mozilla-firefox"
MOZ_PROGRAM="/usr/lib/mozilla-firefox/firefox-bin"
MOZ_CLIENT_PROGRAM="/usr/lib/mozilla-firefox/mozilla-firefox-xremote-client"
LOCALES_DIR="/var/lib/mozilla-firefox/locales.d/"

unset AUDIODEV # This variable can cause firefox to crash. See #236231

##
## find /dev/dsp handler
##
if [ -f $HOME/.mozilla-firefoxrc ]; then
    . $HOME/.mozilla-firefoxrc
elif [ -f /etc/mozilla-firefox/mozilla-firefoxrc ]; then
    . /etc/mozilla-firefox/mozilla-firefoxrc
fi

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

if [ "$FIREFOX_DSP" = "auto" ]; then
	FIREFOX_DSP=""
	P=`fuser -m /dev/dsp /dev/sound/dsp 2>/dev/null | sed -e 's#[^0-9 ]##g' `
	if [ -n "$P" ]; then
		if echo $P | xargs ps -p | grep esd >/dev/null 2>&1; then FIREFOX_DSP=esddsp; 
		elif echo $P | xargs ps -p | grep arts >/dev/null 2>&1; then FIREFOX_DSP=artsdsp; fi
	fi
elif [ "$FIREFOX_DSP" = "none" ];then
	FIREFOX_DSP=""
fi

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

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

export MOZILLA_FIVE_HOME

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

export LD_LIBRARY_PATH

##
## Set FONTCONFIG_PATH for Xft/fontconfig
## 
FONTCONFIG_PATH="/etc/fonts:${MOZILLA_FIVE_HOME}/res/Xft"
export FONTCONFIG_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"
  fi  
fi

# Die if $DISPLAY not set
if [ -z "$DISPLAY" ]; then
    echo "DISPLAY not set" >&2
    exit 1
fi

# 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=`perl -e 'print 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=`echo $JVM_LINK | sed -e s/$JVM_BASE//g`
    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
}

check_running () {
    $MOZ_CLIENT_PROGRAM 'ping()' 2>/dev/null >/dev/null
    RETURN_VAL=$?
    if [ "$RETURN_VAL" -eq "2" ]; then
      echo 0
    else
      echo 1
    fi
}

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

# set our JVM vars
set_jvm_vars

# check to see if there's an already running instance or not
ALREADY_RUNNING=`check_running`

# get the locale that best suits to the $LANG variable
get_locale()
{
     CONTENTLOCALE=""
     UILOCALE=""
     LOCALES=$(cat $LOCALES_DIR/* | sed -e "s/#.*$//" | grep -v ^$)
     DEFAULT_LOCALE=$(cat $LOCALES_DIR/* | sed -e "s/#.*$//" | grep -v ^$| head -n 1)

     # try all locales to match exactly
     for locale in $LOCALES; do
        # break if already set
     
        lang=$(expr "$locale" : "\(.*\):.*")
        COUNTRY=$(expr "$locale" : ".*\:\(.*\)")
        SYSLOCALE="$lang""_$COUNTRY"
     
        MATCHED=$(expr "$LANG" : ".*\($SYSLOCALE\).*")
     
        #echo matched: $MATCHED
        if test "x$MATCHED" != "x"; then
             UILOCALE="$lang-$COUNTRY"
             CONTENTLOCALE="$COUNTRY"
        fi
     
        if test "x$UILOCALE" != "x"; then
             break;
        fi
     done
     
     # match locales only with LANGUAGE
     for locale in $LOCALES; do
        if test "x$UILOCALE" != "x"; then
             break
        fi
     
        lang=$(expr "$locale" : "\(.*\):.*")
        COUNTRY=$(expr "$locale" : ".*\:\(.*\)")
        SYSLOCALE="$lang""_$COUNTRY"
     
        MATCHED=$(expr "$LANG" : "\($lang.*\)")
     
        #echo matched2: $MATCHED
       if test "x$MATCHED" != "x"; then
             UILOCALE="$lang-$COUNTRY"
             CONTENTLOCALE="$COUNTRY"
        fi
     done
     
     # set absolut default locale
     if test "x$MATCHED" = "x"; then
        lang=$(expr "$DEFAULT_LOCALE" : "\(.*\):.*")
        COUNTRY=$(expr "$DEFAULT_LOCALE" : ".*\:\(.*\)")
        UILOCALE="$lang-$COUNTRY"
        CONTENTLOCALE="$COUNTRY"
     fi
     
     echo auto selected locale: $UILOCALE

     for arg in "$@" ; do
         if test "$1" = "-contentLocale"; then
             CONTENTLOCALE="$2"
             shift 2
         elif test "$1" = "-UILocale"; then
             UILOCALE="$2"
             shift 2
         else
             shift
         fi
     done 
     
     LOCALE_ARGS="-contentLocale $CONTENTLOCALE -UILocale $UILOCALE"
}

clean_xul()
{
# 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.
    if [ -f $HOME/.mozilla/firefox/profiles.ini ]; then
        PATHLIST=`sed -e '/Path=/! d' -e 's,Path=/,/,' -e "s,Path=,$HOME/.mozilla/firefox/," $HOME/.mozilla/firefox/profiles.ini`
        if [ "$PATHLIST" ]; then
            find $PATHLIST -name XUL.mfasl -print \
                | xargs --no-run-if-empty rm -f
        fi
    fi
}

# If there is no command line argument at all then try to open a new
# window in an already running instance.
if [ "${ALREADY_RUNNING}" -eq "1" ] && [ -z "$1" ]; then
  exec $MOZ_CLIENT_PROGRAM "xfeDoCommand(openBrowser)" 2>/dev/null >/dev/null
fi

# if there's no command line argument and there's not a running
# instance then just fire up a new copy of the browser
if [ -z "$1" ]; then
    clean_xul
    get_locale
    exec $MOZ_PROGRAM -a firefox $LOCALE_ARGS
fi

unset RETURN_VAL

# If there's a command line argument but it doesn't begin with a -
# it's probably a url.  Try to send it to a running instance.

USE_EXIST=0
opt="$1"
case "$opt" in
  -*) ;;
  *) USE_EXIST=1 ;;
esac

open_in=window

if [ "${FIREFOX_OPEN_IN}" = "tab" ] ; then
    open_in=tab
fi

if [ "${USE_EXIST}" -eq "1" ] && [ "${ALREADY_RUNNING}" -eq "1" ]; then
  # check to make sure that the command 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 [ "${RETURN_VAL}" -ne "0" ] && [ -e "`pwd`/$opt" ]; then
      opt="`pwd`/$opt"
    fi
    exec $MOZ_CLIENT_PROGRAM "openurl($opt,new-$open_in)" 2>/dev/null \
        >/dev/null
  fi
  # just pass it off if it looks like a url
  exec $MOZ_CLIENT_PROGRAM "openurl($opt,new-$open_in)" 2>/dev/null >/dev/null
fi

clean_xul
get_locale $@
exec $MOZ_PROGRAM -a firefox $LOCALE_ARGS "${opt+$@}"
