#!/bin/sh
#############################################################
# Copyright (C) 2005 Parallels Inc. All Rights Reserved.
# Associate/Dissociate mime types in system
#############################################################

pvsicondir="/usr/lib/parallels/icons/"
applications_dir="/usr/share/applications/"

mimeinfo_dir="/usr/share/mime-info/"
mime_dir="/usr/share/mime/"
pixmap_dir="/usr/share/pixmaps/"
icons_dir="/usr/share/icons/gnome/48x48/"

pvsicon="$pvsicondir/parallels-pvs.png"
hddicon="$pvsicondir/parallels-hdd.png"
fddicon="$pvsicondir/parallels-fdd.png"

kde_add() {
    cfg=`which kde-config 2> /dev/null`
    err=$?
    if [ $err -ne 0 ]; then
        return
    fi

    icondir=`$cfg --expandvars --install icon`
    mimedir=`$cfg --expandvars --install mime`

    for dir in `ls -1 $icondir`; do
        if [ -d $icondir/$dir ]; then
            if [ -d $icondir/$dir/48x48/apps/ ]; then
                ln -sf $pvsicon ${icondir}/${dir}/48x48/apps/
                ln -sf $hddicon ${icondir}/${dir}/48x48/apps/
                ln -sf $fddicon ${icondir}/${dir}/48x48/apps/
            fi
        fi
    done

    cat > ${mimedir}/application/x-parallels-virtual-floppy.desktop << EOF
[Desktop Entry]
Comment=Parallels Virtual Floppy
Icon=/usr/share/icons/gnome/48x48/apps/parallels-fdd.png
Type=Application
MimeType=application/x-parallels-floppy
Hidden=false
Patterns=*.fdd
EOF

    cat > ${mimedir}/application/x-parallels-virtual-disk.desktop << EOF
[Desktop Entry]
Comment=Parallels Virtual Disk
Icon=parallels-hdd.png
Type=Application
MimeType=application/x-parallels-disk
Hidden=false
Patterns=*.hdd
EOF

    cat > ${mimedir}/application/x-parallels-vm.desktop << EOF
[Desktop Entry]
Name=Parallels
Comment=Parallels Virtual Machine
Icon=parallels-pvs.png
Type=Application
Hidden=false
Patterns=*.pvs
Exec=/usr/bin/parallels %F
MimeType=application/x-parallels-vm
EOF

    test -d `$cfg --prefix`/share/applications/ && cat > `$cfg --prefix`/share/applications/parallels.desktop << EOF
[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=Parallels
Exec=/usr/bin/parallels
MimeType=application/x-parallels-vm
Icon=parallels-pvs.png
Comments=Parallels Virtual Machine
Categories=Application;System;X-Red-Hat-Base;KDE;Qt
X-Desktop-File-Install-Version=0.9
X-KDE-StartupNotify=true
EOF
}

kde_remove() {
    cfg=`which kde-config 2> /dev/null`
    err=$?
    if [ $err -eq 0 ]; then
        icondir=`$cfg --expandvars --install icon`
        mimedir=`$cfg --expandvars --install mime`

        rm -f ${mimedir}/application/x-parallels-*
        rm -f `$cfg --prefix`/share/applications/parallels.desktop > /dev/null 2>&1

        for dir in `ls -1 $icondir`; do
            if [ -d $icondir/$dir ]; then
                rm -f ${icondir}/${dir}/48x48/apps/parallels-*.png
            fi
        done
    fi
}

## Global desktop database
desktop_add() {
    mkdir -p $applications_dir $mimeinfo_dir $mime_dir $icons_dir/apps/ $icons_dir/mimetypes/

    ln -sf $pvsicon $icons_dir/mimetypes/gnome-mime-application-x-parallels-vm.png
    ln -sf $hddicon $icons_dir/mimetypes/gnome-mime-application-x-parallels-virtual-disk.png
    ln -sf $fddicon $icons_dir/mimetypes/gnome-mime-application-x-parallels-virtual-floppy.png
    ln -sf $pvsicon $icons_dir/mimetypes/
    ln -sf $hddicon $icons_dir/mimetypes/
    ln -sf $fddicon $icons_dir/mimetypes/
    ln -sf $pvsicon $icons_dir/apps/parallels-pvs.png
    ln -sf $fddicon $icons_dir/apps/parallels-fdd.png
    ln -sf $hddicon $icons_dir/apps/parallels-hdd.png
    ln -sf $pvsicon $pixmap_dir/parallels-pvs.png
    ln -sf $fddicon $pixmap_dir/parallels-fdd.png
    ln -sf $hddicon $pixmap_dir/parallels-hdd.png

    sed -e "/application\/x-parallels-/ D" ${applications_dir}/mimeinfo.cache > /tmp/mimeinfo.cache.tmp 2> /dev/null

    cat >> /tmp/mimeinfo.cache.tmp << EOF
application/x-parallels-vm=parallels.desktop
application/x-parallels-virtual-disk=parallels-hdd.desktop
application/x-parallels-floppy-disk=parallels-fdd.desktop
EOF
    mv /tmp/mimeinfo.cache.tmp ${applications_dir}/mimeinfo.cache

    sed -e "/application\/x-parallels-/ D" ${applications_dir}/defaults.list > /tmp/defaults.list.tmp 2>/dev/null

    cat >> /tmp/defaults.list.tmp << EOF
application/x-parallels-vm=parallels.desktop
application/x-parallels-virtual-disk=parallels-hdd.desktop
application/x-parallels-floppy-disk=parallels-fdd.desktop
EOF
    mv /tmp/defaults.list.tmp ${applications_dir}/defaults.list

    cat > $applications_dir/parallels.desktop << EOF
[Desktop Entry]
Encoding=UTF-8
Name=Parallels
Comment=Run Parallels Virtual Machine
Exec=/usr/bin/parallels %F
Icon=parallels-pvs.png
StartupNotify=true
Terminal=false
Type=Application
Categories=Application;System;X-Red-Hat-Base;KDE;Qt;
X-Desktop-File-Install-Version=0.9
X-KDE-StartupNotify=true
MimeType=application/x-parallels-vm
EOF

    cat > $applications_dir/parallels-hdd.desktop << EOF
[Desktop Entry]
Encoding=UTF-8
Name=Parallels virtual disk
Icon=parallels-hdd.png
Type=MimeType
#Categories=Application
X-Desktop-File-Install-Version=0.9
MimeType=application/x-parallels-virtual-disk
EOF

    cat > $applications_dir/parallels-fdd.desktop << EOF
[Desktop Entry]
Encoding=UTF-8
Name=Parallels virtual floppy
Icon=parallels-fdd.png
Type=MimeType
#Categories=Application
X-Desktop-File-Install-Version=0.9
MimeType=application/x-parallels-virtual-floppy
EOF

    uddb=`which update-desktop-database 2> /dev/null`
    err=$?
    if test $err -eq 0; then
        $uddb -q > /dev/null 2>&1
    fi

    guic=`which gtk-update-icon-cache 2> /dev/null`
    err=$?
    if test $err -eq 0; then
        $guic -fq $icons_dir > /dev/null 2>&1
    fi
}

desktop_remove() {
    rm -f $icons_dir/mimetypes/gnome-mime-application-x-parallels-vm.png
    rm -f $icons_dir/mimetypes/gnome-mime-application-x-parallels-virtual-disk.png
    rm -f $icons_dir/mimetypes/gnome-mime-application-x-parallels-virtual-floppy.png
    rm -f $icons_dir/mimetypes/parallels-pvs.png
    rm -f $icons_dir/mimetypes/parallels-fdd.png
    rm -f $icons_dir/mimetypes/parallels-hdd.png
    rm -f $icons_dir/apps/parallels-pvs.png
    rm -f $icons_dir/apps/parallels-fdd.png
    rm -f $icons_dir/apps/parallels-hdd.png
    rm -f $pixmap_dir/parallels-pvs.png
    rm -f $pixmap_dir/parallels-fdd.png
    rm -f $pixmap_dir/parallels-hdd.png

    rm -f $applications_dir/parallels.desktop $applications_dir/parallels-hdd.desktop $applications_dir/parallels-fdd.desktop

    if [ -f ${applications_dir}/mimeinfo.cache ]; then
        tmp=/tmp/mimeinfo.cache.tmp
        sed -e "/application\/x-parallels-/ D" ${applications_dir}/mimeinfo.cache > $tmp 2> /dev/null && mv $tmp ${applications_dir}/mimeinfo.cache
    fi

    if [ -f ${applications_dir}/defaults.list ]; then
        tmp=/tmp/defaults.list.tmp
        sed -e "/application\/x-parallels-/ D" ${applications_dir}/defaults.list > $tmp 2> /dev/null && mv $tmp ${applications_dir}/defaults.list
    fi

    uddb=`which update-desktop-database 2> /dev/null`
    err=$?
    if test $err -eq 0; then
        ${uddb} -q > /dev/null 2>&1
    fi

    guic=`which gtk-update-icon-cache 2> /dev/null`
    err=$?
    if test $err -eq 0; then
        $guic -fq $icons_dir > /dev/null 2>&1
    fi
}

## Global mime database
mime_add() {
    if [ -d $mimeinfo_dir ]; then
        cat > $mimeinfo_dir/pvs.keys << EOF
application/x-parallels-vm
    description=Parallels virtual machine
    icon-filename=parallels-pvs.png
    default_application_id=Parallels
    category=System
    default_component_iid=
    default_action_type=application
    short_list_application_user_removals=
    short_list_application_user_additions=Parallels
    use_category_default=no
    
application/x-parallels-virtual-disk
    description=Parallels hard disk image
    icon-filename=parallels-hdd.png

application/x-parallels-virtual-floppy
    description=Parallels floppy disk image
    icon-filename=parallels-fdd.png
EOF
 
        cat > $mimeinfo_dir/pvs.mime << EOF
application/x-parallels-vm
    ext: pvs PVS

application/x-parallels-virtual-disk
    ext: hdd HDD

application/x-parallels-virtual-floppy
    ext: fdd FDD
EOF
    fi
    
    if [ -d $mime_dir/packages/ ]; then
        cat > $mime_dir/packages/parallels.xml << EOF
<?xml version="1.0" encoding="UTF-8"?>

<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">

 <mime-type type="application/x-parallels-vm">
  <comment xml:lang="en">Parallels virtual machine</comment>
  <magic priority="50">
   <match type="string" value="Parallels VM Name" offset="0:4096"/>
  </magic>
  <glob pattern="*.pvs"/>
 </mime-type>

 <mime-type type="application/x-parallels-virtual-disk">
  <comment xml:lang="en">Parallels disk image</comment>
  <glob pattern="*.hdd"/>
 </mime-type>

 <mime-type type="application/x-parallels-virtual-floppy">
  <comment xml:lang="en">Parallels floppy image</comment>
  <glob pattern="*.fdd"/>
 </mime-type>

</mime-info>
EOF
        
        umdb=`which update-mime-database 2> /dev/null`
        err=$?
        if test $err -eq 0; then
            $umdb $mime_dir > /dev/null 2>&1
            err=$?
            if test $err -ne 0; then
                echo "Error while update mime database"
                return
            fi
        fi
    fi
}


mime_remove() {
    rm -f $mimeinfo_dir/pvs.mime $mimeinfo_dir/pvs.keys
    rm -f $mime_dir/packages/parallels.xml
    
    umdb=`which update-mime-database 2> /dev/null`
    err=$?
    if test $err -ne 0; then
        return
    fi            
    
    $umdb $mime_dir > /dev/null
    err=$?
    if test $err -ne 0; then
        echo "Error while update mime database"
        return
    fi
}

## MC (Midnight Commander)
mcdata=

mc_get_param() {

    wmc=`which mc 2> /dev/null`
    
    if test -z "$wmc"; then
        return # No mc installed
    fi
    
    mcdata=`$wmc -f`
    
    if test -z "$mcdata"; then
        return # problems ?
    fi
}

mc_add() {

    tmpext="/tmp/mc.ext.$RANDOM.$$"
    
    mc_get_param
    if test -z $mcdata; then
        return
    fi    
    
    grep -i Parallels $mcdata/mc.ext > /dev/null 2>&1
    err=$?
    if test $err -eq 0; then
        return # already installed
    fi

    sline=`grep -in '### Default ###' $mcdata/mc.ext | awk -F : '{ print $1 }'`
    tlines=`wc -l $mcdata/mc.ext | awk '{ print $1 }'`
    
    head -n $sline $mcdata/mc.ext > $tmpext
    
cat >> $tmpext << EOF
### Parallels_start
regex/\.pvs$
    Open=parallels \`pwd\`/%p &
### Parallels_end
EOF
    sline=`expr $tlines - $sline `
    tail -n $sline $mcdata/mc.ext >> $tmpext
    
    mv -f $tmpext $mcdata/mc.ext
}

mc_remove() {

    tmpext="/tmp/mc.ext.$RANDOM.$$"
    
    mc_get_param
    if test -z $mcdata; then
        return
    fi    

    grep -i Parallels $mcdata/mc.ext > /dev/null 2>&1
    err=$?
    if test $err -ne 0; then
        return # already removed
    fi

    sline=`grep -in Parallels_start $mcdata/mc.ext | awk -F : '{ print $1 }'`
    eline=`grep -in Parallels_end $mcdata/mc.ext | awk -F : '{ print $1 }'`
    tlines=`wc -l $mcdata/mc.ext | awk '{ print $1 }'`
    
    sline=`expr $sline - 1 `
    head -n $sline $mcdata/mc.ext > $tmpext
    
    eline=`expr $tlines - $eline `
    tail -n $eline $mcdata/mc.ext >> $tmpext
    
    mv -f $tmpext $mcdata/mc.ext
}

## Main switch
case "$1" in
    associate)
        mime_add
        desktop_add
        mc_add
        kde_add
    ;;
    dissociate)
        kde_remove
        mc_remove
        desktop_remove
        mime_remove
    ;;
    *)
        echo "Mime types association/dissociation"
        echo "Usage:"
        echo " $0 [command]"
        echo "Commands:"
        echo " associate   : Associate types"
        echo " dissociate  : Dissociate types"
    ;;
esac
