:
# -------------------------------------------------------------------------
# Copyright (c) 1992           		The Santa Cruz Operation, Inc.
# -------------------------------------------------------------------------
# All rights reserved.  No part of this  program or publication may be
# reproduced, transmitted, transcribed, stored  in a retrieval system,
# or translated into any language or computer language, in any form or
# by any  means,  electronic, mechanical, magnetic, optical, chemical,
# biological, or otherwise, without the  prior written  permission of:
#
#          The Santa Cruz Operation, Inc.  (408) 425-7222
#          400 Encinal St, Santa Cruz, CA  95060 USA
# -------------------------------------------------------------------------
#
# SCCS  : @(#) deskconfobj 8.2 92/10/12 
# Author:
# Date  : 30-Mar-92
# File  : deskconfobj
#
# Description:
#
# This file contains funtions to add/delete objects and rules
# which an application will call when installing itself onto
# the desktop.
#
# The following actions are supported:
#
# To add desk object:
# deskconfobj -aobj -name <object name> -src <source directory>
#
# To delete desk object:
# deskconfobj -dobj -name <object name>
#
# To add a single rules file:
# deskconfobj -arule -name <rule name> -src <file> [ -lang language ]
#
# To delete a single rules file:
# deskconfobj -drule -name <rule name> [ -lang language ]
#
# To add large/small pixmap:
# deskconfobj -asml | -alrg  -name <pixmap name> -src <file>
#
# To delete a large/small pixmap:
# deskconfobj -dsml | -dlrg  -name <pixmap name>
#
#
# deskconfobj returns:
# 0	Successful
# 1	Unrecoverable error
# 2	name already exists
#
# -------------------------------------------------------------------------

#
# fatal_error()
#
# An unexpected error occurred.
# Print out error message and proceed on keystroke.
#
# $1 = error message
#
fatal_error()
{
	echo "**** deskconfobj error: $1"
	echo "Press <RETURN> to continue"
	read cmd
	exit 1
}

#
# duplicate_name_error()
#
# A recoverable error has occurred.
# -name argument already exists.
# Return with special exit status
#
duplicate_name_error()
{
	exit 2
}


#
# add_desk_object()
#
# install specified Desktop object files
# copies $SOURCE files to $OBJECT_DIR
#
add_desk_object()
{
	if [ "$1" = "" ]
	then
		fatal_error "-name argument not specified"
	fi

	if [ "$2" = "" ]
	then
		fatal_error "-src argument not specified"
	fi

	#
	# exit if $OBJECT_DIR already exists
	# else create $OBJECT_DIR
	#
	if [ -d "$OBJECT_DIR" ]
	then
	{
		duplicate_name_error
	}
	# make $OBJECT_DIR
	else
	{
		mkdir $OBJECT_DIR || {
			fatal_error "cannot create $OBJECT_DIR"
		}
	}
	fi

	copy $SOURCE $OBJECT_DIR || {
		fatal_error "cannot copy $SOURCE files to $OBJECT_DIR"
	}
	chown bin $OBJECT_DIR
	chgrp bin $OBJECT_DIR
	chmod 755 $OBJECT_DIR
	chown bin $OBJECT_DIR/* $OBJECT_DIR/.??* > /dev/null 2>&1
	chgrp bin $OBJECT_DIR/* $OBJECT_DIR/.??* > /dev/null 2>&1
	chmod 644 $OBJECT_DIR/* $OBJECT_DIR/.??* > /dev/null 2>&1
}

#
# del_desk_object
#
# remove specified Desktop object files
# removes $OBJECT_DIR
#
del_desk_object()
{
	if [ "$1" = "" ]
	then
		fatal_error "-name argument not specified"
	fi

	if [ -d $OBJECT_DIR ]
	then
	{
		rm -f $OBJECT_DIR/* $OBJECT_DIR/.??* || {
			fatal_error "Cannot remove files in $OBJECT_DIR"
		}
		rmdir $OBJECT_DIR || {
			fatal_error "Cannot remove directory $OBJECT_DIR"
		}
	}
	else
	{
		fatal_error "$OBJECT_DIR doesn't exist or not a directory"
	}
	fi
}

#
# add_desk_rule()
#
# install rules file into rules directory
# copies $SOURCE to $RULES_FILE
#
add_desk_rule()
{
	if [ "$1" = "" ]
	then
		fatal_error "-name argument not specified"
	fi

	if [ "$2" = "" ]
	then
		fatal_error "-src argument not specified"
	fi

	#
	# create apprules directory if it doesn't exist
	#
	if [ ! -d "$RULES_DIR" ]
	then
		mkdir $RULES_DIR || {
			fatal_error "can't make dir - $RULES_DIR"
		}
		chown bin $RULES_DIR
		chgrp bin $RULES_DIR
		chmod 755 $RULES_DIR
	fi

	#
	# if rules file already exists in rules directory
	# exit
	#
	if [ -f "$RULES_FILE" ]
	then
	{
		duplicate_name_error
	}
	fi

	cp $SOURCE $RULES_FILE || {
		fatal_error "unable to copy $SOURCE to $RULES_FILE"
	}
	chown bin $RULES_FILE
	chgrp bin $RULES_FILE
	chmod 644 $RULES_FILE
}

#
# del_desk_rule()
#
# remove rules file
# remove $RULES_FILE
#
del_desk_rule()
{
	if [ "$1" = "" ]
	then
		fatal_error "-name argument not specified"
	fi

	rm $RULES_FILE || {
		fatal_error "unable to remove rules file $RULES_FILE"
	}
}

#
# add_pixmap()
#
# install large/small pixmap
# copies $SOURCE to $PIXMAP_FILE
#
add_pixmap()
{
	if [ "$1" = "" ]
	then
		fatal_error "-name argument not specified"
	fi

	if [ "$2" = "" ]
	then
		fatal_error "-src argument not specified"
	fi

	case "$ACTION" in
	-asml)	PIXMAP_FILE="$SMALL_PIXMAP_DIR/$NAME" ;;
	-alrg)	PIXMAP_FILE="$LARGE_PIXMAP_DIR/$NAME" ;;
	esac

	#
	# if pixmap already exists in directory
	# exit
	#
	if [ -f "$PIXMAP_FILE" ]
	then
	{
		duplicate_name_error
	}
	fi

	cp $SOURCE $PIXMAP_FILE || {
		fatal_error "unable to copy $SOURCE to $PIXMAP_FILE"
	}
	chown bin $PIXMAP_FILE
	chgrp bin $PIXMAP_FILE
	chmod 644 $PIXMAP_FILE
}

#
# del_pixmap()
#
# remove large/small pixmap
# remove $PIXMAP_FILE
#
del_pixmap()
{
	if [ "$1" = "" ]
	then
		fatal_error "-name argument not specified"
	fi

	case "$ACTION" in
	-dsml)	PIXMAP_FILE="$SMALL_PIXMAP_DIR/$NAME" ;;
	-dlrg)	PIXMAP_FILE="$LARGE_PIXMAP_DIR/$NAME" ;;
	esac

	rm $PIXMAP_FILE || {
		fatal_error "unable to remove rules file $PIXMAP_FILE"
	}
}


#
# BEGIN
#
#
#
ACTION=""
NAME=""
SOURCE=""
LANG_DIR="C_C.C"
while [ "$#" != "0" ]
do
	case $1 in
	-aobj)	ACTION="$1" ;;
	-dobj)	ACTION="$1" ;;
	-arule)	ACTION="$1" ;;
	-drule)	ACTION="$1" ;;
	-asml)	ACTION="$1" ;;
	-dsml)	ACTION="$1" ;;
	-alrg)	ACTION="$1" ;;
	-dlrg)	ACTION="$1" ;;
	-name)	NAME="$2";  shift ;;
	-src)	SOURCE="$2"; shift ;;
	-lang)  LANG_DIR="$2"; shift ;;
	*)	fatal_error "unknown argument - $1" ;;
	esac
	shift
done

# get language only, not territory or codeset
eval `echo $LANG_DIR | awk -F_ '{ printf "LANG_DIR=%s", $1 }'`

# where Desktop default pixmap and scripts are located for object
OBJECT_DIR="/usr/lib/X11/XDesktop3/applications/$NAME.obj"

# where Desktop rules files are stored
RULES_DIR="/usr/lib/X11/XDesktop3/$LANG_DIR.xdt/apprules"
RULES_FILE=$RULES_DIR/$NAME

# where Desktop looks for large and small icons
LARGE_PIXMAP_DIR="/usr/include/X11/bitmaps/xdt_p_large"
SMALL_PIXMAP_DIR="/usr/include/X11/bitmaps/xdt_p_small"

case "$ACTION" in
-aobj)	add_desk_object $NAME $SOURCE	;;
-dobj)	del_desk_object $NAME		;;
-arule)	add_desk_rule	$NAME $SOURCE	;;
-drule)	del_desk_rule	$NAME		;;
-asml|-alrg)	add_pixmap	$NAME $SOURCE	;;
-dsml|-dlrg)	del_pixmap	$NAME		;;
*)	fatal_error "no action argument specified"
	;;
esac
