#!/bin/sh
#
# Wrapper script to run Wine and Winelib apps from inside the source tree
#
# Copyright (C) 2002 Alexandre Julliard
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library 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
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#

# first determine the directory that contains the app itself

appdir=""
case "$0" in
  */*)
    # $0 contains a path, use it
    appdir=`dirname "$0"`
    ;;
  *)
    # no directory in $0, search in PATH
    saved_ifs=$IFS
    IFS=:
    for d in $PATH
    do
      IFS=$saved_ifs
      if [ -x "$d/$0" ]
      then
        appdir="$d"
        break
      fi
    done
    ;;
esac

# now find the top-level directory of the source tree

if [ -x "$appdir/server/wineserver" ]
then topdir="$appdir"
elif [ -x "$appdir/../server/wineserver" ]
then topdir="$appdir/.."
elif [ -x "$appdir/../../server/wineserver" ]
then topdir="$appdir/../.."
elif [ -x "$appdir/../../../server/wineserver" ]
then topdir="$appdir/../../.."
else
  echo "$0: could not locate Wine source tree"
  exit 1
fi

# setup the environment

topdir=`cd "$topdir" && pwd`

if [ -n "$LD_LIBRARY_PATH" ]
then
  LD_LIBRARY_PATH="$topdir/libs:$LD_LIBRARY_PATH"
else
  LD_LIBRARY_PATH="$topdir/libs"
fi
if [ -n "$WINEDLLPATH" ]
then
  WINEDLLPATH="$topdir/dlls:$topdir/programs:$WINEDLLPATH"
else
  WINEDLLPATH="$topdir/dlls:$topdir/programs"
fi
WINESERVER="$topdir/server/wineserver"
WINELOADER="$topdir/loader/wine"
export LD_LIBRARY_PATH WINEDLLPATH WINESERVER WINELOADER

# any local settings ?
if [ -f "$topdir/.winewrapper" ]
then
    . $topdir/.winewrapper
fi

# create prefix directory if needed

if [ -z "$WINEPREFIX" -a ! -d "$HOME/.wine" ]
then
    "$topdir/tools/wineprefixcreate" --use-wine-tree "$topdir"
fi

# and run the application

case "$0" in
  wine|*/wine)
    exec "$WINELOADER" "$@"
    ;;
  */*)
    [ -f "$0.exe.so" ] && exec "$WINELOADER" "$0.exe.so" "$@"
    echo "$0: cannot find corresponding application"
    exit 1
    ;;
  *)
    [ -f "$appdir/$0.exe.so" ] && exec "$WINELOADER" "$appdir/$0.exe.so" "$@"
    echo "$0: cannot find corresponding application"
    exit 1
    ;;
esac
