#!/bin/sh
#---------------------------------------------
#   xdg-desktop-icon
#
#   Utility script to install desktop items on a Linux desktop.
#
#   Refer to the usage() function below for usage.
#
#   Copyright 2006, Kevin Krammer <kevin.krammer@gmx.at>
#   Copyright 2006, Jeremy White <jwhite@codeweavers.com>
#
#   LICENSE:
#
#---------------------------------------------

usage()
{
cat << _USAGE
_USAGE
}

manualpage()
{
cat << _MANUALPAGE
_MANUALPAGE
}

#@xdg-utils-common@

[ x"$1" != x"" ] || exit_failure_syntax

action=
desktop_file=

case $1 in
  install)
    action=install
    ;;

  uninstall)
    action=uninstall
    ;;

  *)
    exit_failure_syntax "unknown command '$1'"
    ;;
esac

shift

vendor=true
while [ $# -gt 0 ] ; do
    parm=$1
    shift

    case $parm in
      --novendor)
        vendor=false
        ;;

      -*)
        exit_failure_syntax "unexpected option '$parm'"
        ;;

      *)
        if [ -n "$desktop_file" ] ; then
            exit_failure_syntax "unexpected argument '$parm'"
        fi
        if [ "$action" = "install" ] ; then
            check_input_file "$parm"
        fi
        desktop_file=$parm
        ;;
    esac
done

# Shouldn't happen
if [ -z "$action" ] ; then
    exit_failure_syntax "command argument missing"
fi

if [ -z "$desktop_file" ] ; then
    exit_failure_syntax "FILE argument missing"
fi

filetype=
case "$desktop_file" in
  *.desktop)
     filetype=desktop
     if [ "$vendor" = "true" -a "$action" = "install" ] ; then
        check_vendor_prefix "$desktop_file"
     fi
     ;;
  *)
     filetype=other
     ;;
esac

my_umask=077
desktop_dir="$HOME/Desktop"
if xdg-user-dir 2>/dev/null 1>&2; then
  desktop_dir=`xdg-user-dir DESKTOP`
fi
desktop_dir_kde=`kde${KDE_SESSION_VERSION}-config --userpath desktop 2> /dev/null`
if gconftool-2 -g /apps/nautilus/preferences/desktop_is_home_dir 2> /dev/null | grep true > /dev/null; then
    desktop_dir_gnome="$HOME"
    # Don't create $HOME/Desktop if it doesn't exist
    [ -w "$desktop_dir" ] || desktop_dir=
fi
if [ -n "$desktop_dir_kde" ]; then
    if [ ! -d "$desktop_dir_kde" ]; then
        save_umask=`umask`
        umask $my_umask
        mkdir -p "$desktop_dir_kde"
        umask $save_umask
    fi
    # Is the KDE desktop dir != $HOME/Desktop ?
    if [ x`readlink -f "$desktop_dir"` != x`readlink -f "$desktop_dir_kde"` ]; then
        # If so, don't create $HOME/Desktop if it doesn't exist
        [ -w "$desktop_dir" ] || desktop_dir=
    else
        desktop_dir_kde=
    fi
fi

basefile=`basename "$desktop_file"`

DEBUG 1 "$action $desktop_file in $desktop_dir $desktop_dir_kde $desktop_dir_gnome"

case $action in
    install)
        save_umask=`umask`
        umask $my_umask

        for x in "$desktop_dir" "$desktop_dir_kde" "$desktop_dir_gnome" ; do
            if [ -n "$x" ]; then
                mkdir -p "$x"
                eval 'cp "$desktop_file" "$x/$basefile"'$xdg_redirect_output 
            fi
        done

        umask $save_umask
        ;;

    uninstall)
        for x in "$desktop_dir" "$desktop_dir_kde" "$desktop_dir_gnome" ; do
            if [ -n "$x" ]; then
                rm -f "$x/$basefile"
            fi
        done

        ;;
esac

exit_success


