#!/bin/sh -e
#
# OpenOffice.org wrapper
# by Alexander Kotelnikov <sacha@altlinux.ru>

OOONETHOME="/usr/lib/OpenOffice.org"
SETUP="$OOONETHOME/setup -nogui"
INSTDB="$OOONETHOME/program/instdb.ins"

selectLanguage () {
  [ -z $OOOLANG ] || return 0

  case $LC_MESSAGES in
    ru_* | uk_* | be_* ) 
      OOOLANG=07
      ;;
    * ) 
      OOOLANG=01
     ;;
  esac
}

installOrUpgrade () {
  TMPFILE=`mktemp -t responsefile.XXXXXXX` || exit 1

  cat > $TMPFILE <<EOF
[ENVIRONMENT]
INSTALLATIONMODE=INSTALL_WORKSTATION
INSTALLATIONTYPE=WORKSTATION
UPDATEMODE=IF_AVAILABLE
DESTINATIONPATH=$HOME/.openoffice
OUTERPATH=
LOGFILE=
#LANGUAGELIST=<LANGUAGE>

[JAVA]
JavaSupport=preinstalled_or_none
EOF
  
  SETUP="$SETUP -R:$TMPFILE"

  if ! eval $SETUP
  then
    echo "Setup failed" >&2
    rm -f $TMPFILE
    exit 1
  fi

  rm -f $TMPFILE
}

installOOo () {
  echo -n "Running OpenOffice.org for the first time. Installing... "

  if [ -d ~/.openoffice ] 
  then
    TMPFILE=`mktemp -d ~/.openoffice.bak.XXXXXX` || exit 1
    echo -e "\nInstallation needed, but ~/.openoffice exits, moving it to $TMPFILE" 
    mv ~/.openoffice/* $TMPFILE
    rm -rf ~/.openoffice
  fi

  selectLanguage
  [ -r $OOONETHOME/program/instdb-${OOOLANG}.ins ] && \
    SETUP="$SETUP -instdb $OOONETHOME/program/instdb-${OOOLANG}.ins"
  
  installOrUpgrade
  echo ok
  
  return 0
}

updateOOo () {
  DEFLANG=`sed -ne 's/^[ 	]*DefaultLanguage[ 	]*= "\(.*\)";.*/\1/p' < $DIR/instdb.ins`
  #echo "DEFLANG=[$DEFLANG]"
  if [ ! -r $OOONETHOME/program/instdb-${DEFLANG}.ins ] 
  then
    echo \
"User installation for language with ISO code $DEFLANG exists, even 
support for this language is not installed
($OOONETHOME/program/instdb-${DEFLANG}.ins is missing).
Current installation will be backuped and new one will be done."
    TMPFILE=`mktemp ~/.sversionrc.bak.XXXXXX` || exit 1
    mv .sversionrc $TMPFILE
    installOOo
    return 0
  fi
  SETUP="$SETUP -instdb $OOONETHOME/program/instdb-${DEFLANG}.ins"
  installOrUpgrade
  return 0
}

# for fast startup and operation
checkInstallation () {
  [ -r ~/.sversionrc ] || return 1
  NETVER=`sed -ne 's/^[ 	]*ProductVersion[ 	]*= "\(.*\)";.*/\1/p' < $INSTDB`
  DIR=`cat ~/.sversionrc |grep "OpenOffice.org $NETVER=" |sed -e 's|.*=file://||'`
  [ -n $DIR ] && [ -d $DIR ] && [ -r $DIR/instdb.ins ] || return 2
  cat $DIR/instdb.ins |grep ProductVersion |grep "\"$NETVER\"" >/dev/null || return 3
  return 0
}

# Main logics
main () {
  # if OOo seems to be installed to user's home properly
  checkInstallation && return 0

  # or it is not installed at all?
  #echo Check for .sversionrc existence
  if [ ! -r ~/.sversionrc ]
  then
    installOOo
    return 0
  fi

  # ok, we need to upgrade or reinstall
  #echo .sversionrc verification
  
  NETVER=`sed -ne 's/^[ 	]*ProductVersion[ 	]*= "\(.*\)";.*/\1/p' < $INSTDB`
  
  TMPFILE=`mktemp ~/.sversionrc.bak.XXXXXX` || exit 1
  echo "[Versions]" > $TMPFILE

  IFS='
'
  for l in `cat ~/.sversionrc|grep ^OpenOffice.org`
  do
    DIR=`echo $l|sed -e 's|.*=file://||'`
    [ -r $DIR/instdb.ins ] && echo $l >> $TMPFILE && BFOUND=1
  done
  
  if [ -z $BFOUND ] 
  then
    echo .sversionrc found, but no installation exists >&2
    rm -f .sversionrc $TMPFILE
    installOOo
    return 0
  fi
  
  mv $TMPFILE ~/.sversionrc

  for l in `cat ~/.sversionrc|grep ^OpenOffice.org`
  do
    DIR=`echo $l|sed -e 's|.*=file://||'`
    VER=`echo $l|sed -e 's|OpenOffice.org \(.*\)=file://.*|\1|'`
    INSTDBVER=`sed -ne 's/^[ 	]*ProductVersion[ 	]*= "\(.*\)";.*/\1/p' < $DIR/instdb.ins `
    if cat $INSTDB | grep UpdateFor | grep "OpenOffice.org $VER" > /dev/null
    then
      [ $VER != $INSTDBVER ] && \
        echo Oops! .sversionrc version does not match instdv.ins. Disregarding. >&2
#      echo system OOo can update us
      updateOOo
      return 0
    fi
  done

  echo \
"Oops: OOo version installed in user \$HOME differs from system's. System's
is not an update for user's. We'll try to make a new installation." >&2
  installOOo
}

main

# run office
$OOONETHOME/program/soffice "$@"

