cdesktopenv/cde/programs/dtprintegrate/dtlp.src

1712 lines
45 KiB
Plaintext
Executable File

XCOMM! DTKORNSHELL
XCOMM $TOG: dtlp.src /main/17 1998/07/31 17:03:31 mgreess $
XCOMM
XCOMM (c) Copyright 1996 Digital Equipment Corporation.
XCOMM (c) Copyright 1993-1996 Hewlett-Packard Company.
XCOMM (c) Copyright 1993-1996 International Business Machines Corp.
XCOMM (c) Copyright 1993-1996 Sun Microsystems, Inc.
XCOMM (c) Copyright 1993-1996 Novell, Inc.
XCOMM (c) Copyright 1996 FUJITSU LIMITED.
XCOMM (c) Copyright 1996 Hitachi.
#define HASH #
XCOMM ###################################################################
XCOMM
XCOMM File: dtlp
XCOMM
XCOMM Default Location: /usr/dt/bin/dtlp
XCOMM
XCOMM Purpose: Set up print spooler options and print.
XCOMM
XCOMM Description: This shell script provides a graphical interface
XCOMM for a print spooler dialog by default. If
XCOMM DTPRINTSILENT is "true", however, then it processes
XCOMM the file and directly invokes "lp".
XCOMM
XCOMM Invoked by: The default Print action or custom print actions.
XCOMM
XCOMM Product: @(#)Common Desktop Environment 1.0
XCOMM
XCOMM Note: Please do not modify this file.
XCOMM Later product updates will overwrite this file.
XCOMM
XCOMM ###################################################################
set -u
XCOMM #################################################################
XCOMM
XCOMM Following are the environmental options we support
XCOMM
XCOMM #################################################################
XCOMM LPDEST
XCOMM DTPRINTCWD
XCOMM DTPRINTFILEREMOVE
XCOMM DTPRINTSILENT
XCOMM DTPRINTTESTOUTPUT
XCOMM DTPRINTUSERFILENAME
XCOMM #################################################################
XCOMM ## Internal Globals
XCOMM ##
XCOMM ## Actually, most variables in this script are global.
XCOMM ##
XCOMM ## Most are defined in the Initialize() routine.
XCOMM ##
XCOMM #################################################################
COMMAND_NAME=dtlp
PATH=/bin:/usr/bin:/usr/ucb
export PATH
XCOMM
XCOMM Exit/Return codes
XCOMM
CANCEL_EXIT=-1
SUCCESS=0
USAGE_EXIT=2
NO_FILE_ERR=3
NO_INIT_FILE_ERR=4
NO_REGULAR_FILE_ERR=5
NO_READABLE_FILE_ERR=6
NO_DEFAULT_PRINTER=7
PRINTER_DOES_NOT_EXIST=8
PRINTER_NOT_ENABLED=9
NO_PRINTER_AVAILABLE=10
PRINTER_NOT_ACCEPT_REQ=11
NOT_POS_INTEGER=12
XCOMM
XCOMM For string processing
XCOMM
MINUS_T="-t"
XCOMM #################################################################
XCOMM ## Initialize()
XCOMM ##
XCOMM ## Set a number of key variables to their defaults.
XCOMM ##
XCOMM ## Examples
XCOMM ## ----------------------
XCOMM ## File to print: Stdin
XCOMM ## Number of copies: 1
XCOMM ## Print Command: lp
XCOMM ##
XCOMM #################################################################
Initialize()
{
typeset -u Uppercase_string
Uppercase_string=""
banner_title_flag=0
banner_title=""
copy_count_flag=0
copy_count=1
failure_flag=$SUCCESS
format_flag=0
other_options_flag=0
other_options=""
print_command=lp
print_cwd_flag=0
print_cwd=""
HASH
HASH Assume print file is stdin, unless told otherwise...
HASH
print_file="-"
print_page_allowed=1
print_man_flag=0
printer_name_flag=0
printer_name=""
print_raw_flag=0
remove_flag=0
send_mail_flag=false
silent_flag=0
test_flag=0
verbose_flag=0
user_filename_flag=0
user_filename=""
CAT_MESG_STRING=""
HASH
HASH directory for temporary files used by dtlp
HASH
DTLPDIR="$HOME/.dt/tmp"
if [ ! -d "$DTLPDIR" ]
then
mkdir -p "$DTLPDIR"
fi
LPOPTIONS=""
catopen CAT_ID $COMMAND_NAME
SetPreEnvironment
}
XCOMM #################################################################
XCOMM ## SetPreEnvironment()
XCOMM ##
XCOMM ## Check the ENVIRONMENT values we care about, and
XCOMM ## set the corresponding internal variable values.
XCOMM ##
XCOMM #################################################################
SetPreEnvironment()
{
if (( ${#LPDEST} ))
then
printer_name=$LPDEST
printer_name_flag=1
fi
if (( ${#DTPRINTCWD} ))
then
print_cwd=$DTPRINTCWD
print_cwd_flag=1
fi
if (( ${#DTPRINTFILEREMOVE} ))
then
HASH check for True
Uppercase_string=$DTPRINTFILEREMOVE
if [[ "$Uppercase_string" = "TRUE" ]]
then
remove_flag=1
fi
Uppercase_string=""
fi
if (( ${#DTPRINTSILENT} ))
then
HASH check for True
Uppercase_string=$DTPRINTSILENT
if [[ "$Uppercase_string" = "TRUE" ]]
then
silent_flag=1
fi
Uppercase_string=""
fi
if (( ${#DTPRINTUSERFILENAME} ))
then
user_filename=$DTPRINTUSERFILENAME
user_filename_flag=1
fi
if (( ${#DTPRINTTESTOUTPUT} ))
then
test_flag=1
fi
}
XCOMM #################################################################
XCOMM ## ReconcileOptions()
XCOMM ##
XCOMM ## Arbitrate when there are two or more conflicting
XCOMM ## print options.
XCOMM ##
XCOMM ## The order of precedence is: -w > -a > -r.
XCOMM ##
XCOMM #################################################################
ReconcileOptions()
{
HASH
HASH The RAW option takes precedence over all others.
HASH
if (( print_raw_flag ))
then
format_flag=0
print_man_flag=0
print_page_allowed=0
HASH
HASH Next, this MAN option comes into play
HASH
elif (( print_man_flag ))
then
format_flag=0
print_page_allowed=0
fi
}
XCOMM #################################################################
XCOMM ## DoParameterCollectionSilent()
XCOMM ##
XCOMM ## Collect the silent lp options, mimicking the GUI
XCOMM ## collection process.
XCOMM ##
XCOMM #################################################################
DoParameterCollectionSilent()
{
HASH printer_name has to be set at this point so no need to check
LPOPTIONS=-d${printer_name}
if (( banner_title_flag ))
then
LPOPTIONS=${LPOPTIONS}" "${MINUS_T}${SINGLE_QUOTE}${banner_title}${SINGLE_QUOTE}
fi
if (( copy_count_flag ))
then
LPOPTIONS=${LPOPTIONS}" -n${copy_count}"
fi
if (( other_options_flag ))
then
LPOPTIONS=${LPOPTIONS}" ${other_options}"
fi
if [[ "$send_mail_flag" == "true" ]]
then
LPOPTIONS=${LPOPTIONS}" -m"
fi
if (( verbose_flag ))
then
echo "Print Command is $print_command and Options are $LPOPTIONS"
fi
}
XCOMM #################################################################
XCOMM ## EchoDtlpSetupOptions()
XCOMM ##
XCOMM ## Echo all the command settings.
XCOMM ## If dtlp is run stand-alone, the invoker may redirect
XCOMM ## the test output to a log file. Under the test harness
XCOMM ## this is done automatically by the "record" function.
XCOMM ##
XCOMM #################################################################
EchoDtlpSetupOptions()
{
if (( remove_flag ))
then
echo Remove file flag is SET.
fi
if (( print_man_flag ))
then
echo Manpage flag is SET.
fi
if (( print_raw_flag ))
then
echo Raw print flag is SET.
fi
if (( print_cwd_flag ))
then
echo "Print working directory is $print_cwd."
fi
if (( print_page_allowed ))
then
echo Page printing is allowed.
else
echo Page printing is NOT allowed.
fi
if (( format_flag ))
then
echo Format flag is SET.
fi
if (( silent_flag ))
then
echo Silent flag is SET.
fi
if (( user_filename_flag ))
then
echo User-visible filename is \"$user_filename\".
fi
if (( verbose_flag ))
then
echo Verbose flag is SET.
fi
if (( other_options_flag ))
then
echo Other options include \"$other_options\".
fi
if [[ "$send_mail_flag" == "true" ]]
then
echo Send Mail flag is SET.
fi
echo Copies is set to $copy_count.
}
XCOMM #################################################################
XCOMM ## PrintIt()
XCOMM ##
XCOMM ## Do the actual spooling, based on the value of LPOPTIONS.
XCOMM ##
XCOMM ## If possible, log the results.
XCOMM #################################################################
PrintIt()
{
if (( print_cwd_flag )) && [[ (-d "$print_cwd") && (-x "$print_cwd") ]]
then
cd "$print_cwd" || exit
fi
if (( test_flag ))
then
HASH then don't do any printing--instead log the results
EchoDtlpSetupOptions
echo ""
echo "Command that will be invoked is..."
INVOKER='echo'
else
INVOKER='eval'
fi
if (( print_raw_flag ))
then
HASH Nothing special is required for raw mode on this platform.
LPOPTIONS="${LPOPTIONS}"
fi
if (( format_flag ))
then
HASH set page header
if (( banner_title_flag ))
then
PAGEHEADER="$banner_title"
elif (( user_filename_flag ))
then
PAGEHEADER="$user_filename"
else
PAGEHEADER="$print_file"
fi
$INVOKER "cat $print_file | pr -f -h '${PAGEHEADER}' | ${print_command} ${LPOPTIONS}"
elif (( print_man_flag ))
then
$INVOKER "cat $print_file | tbl | nroff -man | col | ${print_command} ${LPOPTIONS}"
else
if [ "$print_file" = "-" ]
then
$INVOKER "cat $print_file | ${print_command} ${LPOPTIONS}"
else
$INVOKER "${print_command} -c ${LPOPTIONS} $print_file"
fi
fi
}
XCOMM #################################################################
XCOMM ## CleanUp()
XCOMM ##
XCOMM ## End the show
XCOMM #################################################################
CleanUp()
{
if (( remove_flag )) && [[ "$print_file" != "-" ]]
then
rm -f $print_file >/dev/null 2>&1
fi
if (( verbose_flag ))
then
PrintEndLog
fi
}
XCOMM #################################################################
XCOMM ##
XCOMM ## Ensure that the supplied file name references a
XCOMM ## valid file.
XCOMM ##
XCOMM ## Returns true or false.
XCOMM #################################################################
CheckValidFile()
{
if [[ "$1" == "-" ]]
then
return $SUCCESS
fi
HASH check whether file exists and is a regular file
if [[ ! -f "$1" ]]
then
return $NO_REGULAR_FILE_ERR
fi
HASH check whether file is readable by the user
if [[ ! -r "$1" ]]
then
return $NO_READABLE_FILE_ERR
fi
return $SUCCESS
}
XCOMM #################################################################
XCOMM ## CheckValidPrinter()
XCOMM ##
XCOMM ## Ensure that the supplied printer name references a printer
XCOMM ## that exists and is enabled or a default printer exists,
XCOMM ## if no printer is specified.
XCOMM ##
XCOMM ## Returns true or false.
XCOMM #################################################################
CheckValidPrinter()
{
catgets CAT_MESG_STRING "$CAT_ID" 1 10 "Default"
if [[ "$printer_name" = "" ]]
then
printer_name=$CAT_MESG_STRING
fi
if [[ "$printer_name" = "$CAT_MESG_STRING" ]]
then
GetDefaultPrinter
if (( failure_flag == SUCCESS ))
then
printer_name=$default_printer
else
return $failure_flag
fi
fi
tmpfile=$DTLPDIR/$printer_name$$
LANG=C lpstat -p"$printer_name" > "$tmpfile" 2>&1
if [[ $? != "$SUCCESS" ]]
then
HASH printer does not exist
failure_flag=$PRINTER_DOES_NOT_EXIST
rm -f "$tmpfile"
return $failure_flag
else
if grep disabled "$tmpfile" > /dev/null 2>&1
then
failure_flag=$PRINTER_NOT_ENABLED
rm -f "$tmpfile"
return $failure_flag
else
status=$DTLPDIR/status$$
LANG=C lpstat -a > "$tmpfile" 2>&1
grep "$printer_name" "$tmpfile" > "$status" 2>&1
if grep "not accepting" "$status" > /dev/null 2>&1
then
failure_flag=$PRINTER_NOT_ACCEPT_REQ
rm -f "$status"
return $failure_flag
fi
rm -f "$status"
fi
fi
rm -f "$tmpfile"
failure_flag=$SUCCESS
return $failure_flag
}
XCOMM #################################################################
XCOMM ## GetDefaultPrinter()
XCOMM ##
XCOMM ## Looks up the default printer destination. Returns value of
XCOMM ## LPDEST if set; otherwise, checks if there is a system default
XCOMM ## printer destination.
XCOMM ##
XCOMM #################################################################
GetDefaultPrinter()
{
#if defined(_AIX)
prfld=1
flddelim=' '
#else
prfld=2
flddelim=':'
#endif
default_printer=""
if (( ${#LPDEST} ))
then
default_printer=$LPDEST
else
#if defined(_AIX)
t1="`LANG=C lpstat -d | head -3 | tail -1`"
#else
t1="$(LANG=C lpstat -d)"
#endif
t2="$(echo "$t1" | cut -d' ' -f1)"
HASH
HASH "no system default destination" is expected if no default is defined;
HASH otherwise, "system default destination: <printer_name>" is expected.
HASH
if [[ "$t2" != "no" ]]
then
default_printer="$(echo "$t1" | cut -f"$prfld" -d"$flddelim")"
HASH remove leading space
default_printer=${default_printer##+( )}
fi
if [[ "$default_printer" = "" ]]
then
failure_flag=$NO_DEFAULT_PRINTER
return $failure_flag
fi
fi
failure_flag=$SUCCESS
return $failure_flag
}
XCOMM #################################################################
XCOMM ## PrintStartLog()
XCOMM ##
XCOMM ## Print the start of the log
XCOMM ##
XCOMM #################################################################
PrintStartLog() {
print "$COMMAND_NAME..."
print ""
}
XCOMM #################################################################
XCOMM ## CheckIsPosInteger()
XCOMM ##
XCOMM ## Checks whether a given value is a positive integer.
XCOMM ##
XCOMM #################################################################
CheckIsPosInteger()
{
val=$1
HASH Strip any leading or trailing spaces
val=${val##+( )}
val=${val%%+( )}
if [[ ${#val} && "$val" = +([0-9]) ]]
then
failure_flag=$SUCCESS
else
failure_flag=$NOT_POS_INTEGER
fi
return $failure_flag
}
XCOMM #################################################################
XCOMM ## GetErrorMessageString()
XCOMM ##
XCOMM ## Looks up the appropriate error message based on the value of
XCOMM ## failure_flag.
XCOMM ##
XCOMM #################################################################
GetErrorMessageString()
{
catgets CAT_MESG_STRING "$CAT_ID" 1 130 "Sorry--Unable to print:"
if (( user_filename_flag ))
then
CAT_MESG_STRING=${CAT_MESG_STRING}" \"$user_filename\"."
else
CAT_MESG_STRING=${CAT_MESG_STRING}" \"$print_file\"."
fi
case $failure_flag in
$NO_REGULAR_FILE_ERR)
catgets TEMP_MESG_STRING "$CAT_ID" 1 210 "That file is either not printable or it does not exist."
;;
$NO_READABLE_FILE_ERR)
catgets TEMP_MESG_STRING "$CAT_ID" 1 134 "You don't have permission to read that file."
;;
$NO_PRINTER_AVAILABLE)
catgets TEMP_MESG_STRING "$CAT_ID" 1 220 "There is either no printer defined for this system or no printer is enabled."
;;
$PRINTER_DOES_NOT_EXIST)
catgets TEMP_MESG_STRING "$CAT_ID" 1 230 "The printer does not exist."
;;
$PRINTER_NOT_ENABLED)
catgets TEMP_MESG_STRING "$CAT_ID" 1 240 "The printer is not enabled."
;;
$NO_DEFAULT_PRINTER)
catgets TEMP_MESG_STRING "$CAT_ID" 1 250 "There is no default printer destination."
;;
$PRINTER_NOT_ACCEPT_REQ)
catgets TEMP_MESG_STRING "$CAT_ID" 1 260 "The printer is currently not accepting requests."
;;
$NOT_POS_INTEGER)
catgets TEMP_MESG_STRING "$CAT_ID" 1 270 "Number of copies must be a positive number."
;;
*)
echo ""
;;
esac
if (( failure_flag == NO_PRINTER_AVAILABLE ))
then
CAT_MESG_STRING="${TEMP_MESG_STRING}"
else
CAT_MESG_STRING="${CAT_MESG_STRING}""
${TEMP_MESG_STRING}"
fi
}
XCOMM #################################################################
XCOMM ## DisplayErrorMessage()
XCOMM ##
XCOMM ## We have detected an error. Write out a message to
XCOMM ## that effect.
XCOMM ##
XCOMM #################################################################
DisplayErrorMessage()
{
catgets CAT_MESG_STRING "$CAT_ID" 1 130 "Sorry--Unable to print:"
GetErrorMessageString
print ""
print "$(date)"
print "${CAT_MESG_STRING}"
print ""
}
XCOMM #################################################################
XCOMM ## PrintEndLog()
XCOMM ##
XCOMM ## Print the end of the log.
XCOMM ##
XCOMM #################################################################
PrintEndLog() {
print ""
if (( failure_flag == SUCCESS ))
then
print "...successfully completed."
else
print "...completed unsuccessfully."
fi
print ""
}
XCOMM #################################################################
XCOMM ## PrintUsage()
XCOMM ##
XCOMM ## Print a usage message.
XCOMM ##
XCOMM #################################################################
PrintUsage() {
print ""
print "Usage: $COMMAND_NAME [-b <banner_title>] [-d <printer_name>]"
print " [-m <print_command>] [-n <copy_count>]"
print " [-o <other_options>] [-u <user_filename>]"
print " [-a] [-e] [-h] [-i] [-r] [-s] [-v] [-w]"
print " <print_file>"
print " where:"
print ""
print " <banner_title>"
print " Specifies the title to put on the banner page."
print ""
print " <printer_name>"
print " Specifies the printer name as known to the lp spooler."
print ""
print " <print_command>"
print " Specifies the command with which to invoke the printer."
print ""
print " <copy_count>"
print " Specifies the number of copies to print."
print ""
print " <other_options>"
print " Specifies the other print options."
print ""
print " <user_filename>"
print " Specifies the title of the file to display to the user."
print ""
print " -a"
print " Formats the file with \"man\" before printing."
print ""
print " -e"
print " Removes the file after printing."
print ""
print " -h"
print " Displays this help message."
print ""
print " -i"
print " Requests the spooler to sent mail to the user when the print job is completed."
print ""
print " -r"
print " Formats the file with "pr -f" before printing."
print ""
print " -s"
print " Prints silently (no dialog box)."
print ""
print " -v"
print " Directs verbose messages to standard output."
print ""
print " -w"
print " Prints the data raw (uninterpreted)."
print ""
print " <print_file>"
print " Specifies the name of file(s) to print."
}
XCOMM #################################################################
XCOMM ## Exit()
XCOMM ##
XCOMM ## All exits should go through this routine.
XCOMM ##
XCOMM #################################################################
Exit()
{
exit "$1"
}
XCOMM ################# GUI Callbacks ####################
XCOMM #################################################################
XCOMM ## PrintHelpCB()
XCOMM ##
XCOMM ## This is the callback for the Help button in the Print dialog;
XCOMM ## it will post a help dialog.
XCOMM ##
XCOMM #################################################################
PrintHelpCB()
{
DtkshDisplayQuickHelpDialog "dtlp_help" HELP_TYPE_TOPIC \
"Printmgr" "dtlpPrintDialog"
}
XCOMM #################################################################
XCOMM ## DoParameterCollection()
XCOMM ##
XCOMM ## Gathers and validates print options set using the command line
XCOMM ## and the Print dialog.
XCOMM ##
XCOMM #################################################################
DoParameterCollection()
{
catgets CAT_MESG_STRING "$CAT_ID" 1 10 "Default"
GetCurrentPrinterName
CheckValidPrinter
if (( failure_flag != SUCCESS ))
then
DisplayErrorMessageDialog
return $failure_flag
fi
if [[ ("$printer_name" != "") && "$printer_name" != "$CAT_MESG_STRING" ]]
then
LPOPTIONS="-d"$printer_name
fi
HASH
HASH Get current value from textfield resource rather than from position
HASH resource because the user may have changed the value using the former
HASH instead of the up/down arrow.
HASH
HASH We must make sure the value is a positive integer in this case.
HASH
XtGetValues "$COPIES_SB" textField:COPIES_TF
XmTextFieldGetString copy_val "$COPIES_TF"
CheckIsPosInteger "$copy_val"
if (( failure_flag == NOT_POS_INTEGER ))
then
DisplayErrorMessageDialog
return $failure_flag
else
copy_count=$copy_val
fi
HASH Strip any leading or trailing spaces
HASH This should be validated, to make sure it is a valid integer.
copy_count=${copy_count##+( )}
copy_count=${copy_count%%+( )}
if [ "$copy_count" != "" ] ; then
copy_count_flag=1
LPOPTIONS=${LPOPTIONS}" -n$copy_count"
fi
XmTextGetString banner_title "$BANNER_TF"
HASH Strip any leading or trailing spaces
banner_title=${banner_title##+( )}
banner_title=${banner_title%%+( )}
if [ "$banner_title" != "" ] ; then
banner_title_flag=1
LPOPTIONS=${LPOPTIONS}" "${MINUS_T}${SINGLE_QUOTE}${banner_title}${SINGLE_QUOTE}
fi
XmTextGetString other_options "$OPTIONS_TF"
HASH Strip any leading or trailing spaces
other_options=${other_options##+( )}
other_options=${other_options%%+( )}
if [ "$other_options" != "" ]
then
LPOPTIONS=${LPOPTIONS}" $other_options"
fi
XtGetValues "$SEND_MAIL_BTN" set:send_mail_flag
if [[ "$send_mail_flag" == "true" ]]
then
LPOPTIONS=${LPOPTIONS}" -m"
fi
if (( verbose_flag ))
then
echo The LP options are \"${LPOPTIONS}\".
fi
return $SUCCESS
}
XCOMM #################################################################
XCOMM ## DestroyDialogs()
XCOMM ##
XCOMM ## Destroys the Select Printer dialog, if it exists, and the
XCOMM ## Print dialog.
XCOMM ##
XCOMM #################################################################
DestroyDialogs()
{
if [[ "$SELECT_PRINTER_FORM" != "" ]]
then
XtDestroyWidget "$(XtParent "-" "$SELECT_PRINTER_FORM")"
fi
XtDestroyWidget "$(XtParent "-" "$PDIALOG")"
}
XCOMM #################################################################
XCOMM ## PrintCB()
XCOMM ##
XCOMM ## Callback for the Print button in the Print dialog. Submits
XCOMM ## print request to lp if all is well; otherwise, simply returns.
XCOMM ##
XCOMM #################################################################
PrintCB()
{
XSync "$DISPLAY" True
DoParameterCollection
if [ $? != $SUCCESS ]
then
return
fi
PrintIt
CleanUp
DestroyDialogs
Exit $failure_flag
}
XCOMM #################################################################
XCOMM ## PrintCancelCB()
XCOMM ##
XCOMM ## This is the callback for the Cancel button in the Print dialog.
XCOMM ## It will send an empty string to stdout, and will then exit with
XCOMM ## a value of -1.
XCOMM ##
XCOMM #################################################################
PrintCancelCB()
{
echo ""
DestroyDialogs
Exit $CANCEL_EXIT
}
XCOMM #################################################################
XCOMM ## UpdatePrinterDescription()
XCOMM ##
XCOMM ## Updates Printer Description in the Print dialog.
XCOMM ##
XCOMM #################################################################
UpdatePrinterDescription()
{
CheckValidPrinter
if (( failure_flag != SUCCESS ))
then
XtSetValues "$PRINTER_DESC_LABEL" labelString:""
return
fi
GetPrinterInfo "$printer_name"
XtSetValues "$PRINTER_DESC_LABEL" labelString:"$printer_info"
}
XCOMM #################################################################
XCOMM ## SelectPrinterCB()
XCOMM ##
XCOMM ## Callback for the Select Printer button in the Select Printer
XCOMM ## dialog. Updates Printer Name and Description in the Print
XCOMM ## dialog and unmanages the Select Printer dialog.
XCOMM ##
XCOMM #################################################################
SelectPrinterCB()
{
XtSetValues "$PRINTER_TF" value:"$selected_printer"
printer_name=$selected_printer
UpdatePrinterDescription
XtUnmanageChild "$SELECT_PRINTER_FORM"
}
XCOMM #################################################################
XCOMM ## SelectPrinterHelpCB()
XCOMM ##
XCOMM ## This is the callback for the Help button in the Select Printer
XCOMM ## dialog; it will post a help dialog.
XCOMM ##
XCOMM #################################################################
SelectPrinterHelpCB()
{
DtkshDisplayQuickHelpDialog "dtlp_help" HELP_TYPE_TOPIC \
"Printmgr" "dtlpSelectPrinterDialog"
}
XCOMM #################################################################
XCOMM ## ListSelectCB()
XCOMM ##
XCOMM ## Callback for the items in the printer list in the Select Printer
XCOMM ## dialog. Updates Printer Information when a printer is selected.
XCOMM ##
XCOMM #################################################################
ListSelectCB()
{
GetPrinterInfo "${CB_CALL_DATA.ITEM}"
XtSetValues "$INFO_TEXT" value:"$printer_info"
selected_printer=${CB_CALL_DATA.ITEM}
}
XCOMM #################################################################
XCOMM ## ListDblSelectCB()
XCOMM ##
XCOMM ## Callback for the double-clicks on the printer list items in the
XCOMM ## Select Printer dialog. Simulates selection of the Select Printer
XCOMM ## button when a printer item is double-clicked on.
XCOMM ##
XCOMM #################################################################
ListDblSelectCB()
{
if [ "${CB_CALL_DATA.EVENT.TYPE}" != KeyPress ]
then
XtCallCallbacks "$SELECT_PRINTER_BTN" activateCallback
fi
}
XCOMM #################################################################
XCOMM ## GetCurrentPrinterName()
XCOMM ##
XCOMM ## Reads value of Printer Name textfield and strips off any
XCOMM ## leading and trailing spaces.
XCOMM ##
XCOMM #################################################################
GetCurrentPrinterName()
{
XmTextFieldGetString printer_name "$PRINTER_TF"
HASH Strip any leading or trailing spaces
printer_name=${printer_name##+( )}
printer_name=${printer_name%%+( )}
}
XCOMM #################################################################
XCOMM ## GetAvailPrinters()
XCOMM ##
XCOMM ## Gets the list of enabled printers.
XCOMM ##
XCOMM #################################################################
GetAvailPrinters()
{
typeset -i num_printers=0
printer_items=''
comma=''
HASH
HASH get a sorted list of all enabled printers
HASH
tmpfile=$DTLPDIR/printers$$
#if defined(_AIX)
LANG=C lpstat -p | \
grep READY | cut -f1 -d" " | \
sort | uniq > $tmpfile 2>&1
#else
LANG=C lpstat -p | \
grep enabled | cut -f2 -d" " | \
sort | uniq > "$tmpfile" 2>&1
#endif
if [ -s "$tmpfile" ]
then
while read -r "$tmpfile"
do
printer_items=$printer_items$comma$i
comma=','
((num_printers=num_printers+1))
done
fi
rm -f "$tmpfile"
}
XCOMM #################################################################
XCOMM ## GetPrinterInfo()
XCOMM ##
XCOMM ## Gets the printer description.
XCOMM ##
XCOMM #################################################################
GetPrinterInfo()
{
#if defined(sun)
t1="$DTLPDIR/d1$$"
t2="$DTLPDIR/d2$$"
lpstat -p$1 > $t1 2>/dev/null
lpstat -p$1 -D > $t2 2>/dev/null
printer_info="`diff $t1 $t2 | sed -e '1d' -e 's/\(.*\)://'`"
rm -f $t1 $t2
#else
printer_info=$1
#endif
}
XCOMM #################################################################
XCOMM ## SelectPrinterProc()
XCOMM ##
XCOMM ## This is called when the Select Printer... button in the Print
XCOMM ## dialog is selected. It posts the Select Printer dialog.
XCOMM ##
XCOMM #################################################################
SelectPrinterProc()
{
if [[ "$SELECT_PRINTER_FORM" != "" ]]
then
HASH
HASH dialog already exists, update printer info. if necessary
HASH
GetCurrentPrinterName
HASH get index of printer in the list
XmListItemPos index "$PRINTER_LIST" "$printer_name"
HASH
HASH If printer is in the list, select it and display info. on it;
HASH otherwise, just re-manage the dialog.
HASH
if [[ $index -gt 0 ]]
then
GetPrinterInfo "$printer_name"
HASH
HASH display printer information and select the printer specified in
HASH the Printer Name textfield
HASH
XmTextSetString "$INFO_TEXT" "$printer_info"
XmListSelectItem "$PRINTER_LIST" "$printer_name" true
XmListSetPos "$PRINTER_LIST" "$index"
fi
XtManageChild "$SELECT_PRINTER_FORM"
return
fi
GetAvailPrinters
XmCreateFormDialog SELECT_PRINTER_FORM "$TOPLEVEL" form
catgets CAT_MESG_STRING "$CAT_ID" 1 180 "Select Printer"
XmInternAtom DEL_ATOM "$DISPLAY" WM_DELETE_WINDOW false
XmAddWMProtocolCallback "$(XtParent "-" "$SELECT_PRINTER_FORM")" \
"$DEL_ATOM" SelectPrinterCancelCB
XtSetValues "$(XtParent "-" "$SELECT_PRINTER_FORM")" \
title:"$CAT_MESG_STRING" \
allowShellResize:False \
deleteResponse:DO_NOTHING
XtSetValues "$SELECT_PRINTER_FORM" \
noResize:True \
autoUnmanage:False \
helpCallback:SelectPrinterHelpCB
XmCreateWorkArea WORK_AREA "$SELECT_PRINTER_FORM" work_area \
orientation:XmVERTICAL
XmCreateWorkArea LIST_RC "$WORK_AREA" list_rc orientation:XmHORIZONTAL
catgets CAT_MESG_STRING "$CAT_ID" 1 190 "Available Printers:"
XmCreateLabelGadget LIST_LABEL "$LIST_RC" list_label \
labelString:"$CAT_MESG_STRING"
XtManageChild "$LIST_LABEL"
XmCreateScrolledList PRINTER_LIST "$LIST_RC" printer_list \
selectionPolicy:XmSINGLE_SELECT \
singleSelectionCallback:ListSelectCB \
defaultActionCallback:ListDblSelectCB \
itemCount:$num_printers \
items:"$printer_items" \
visibleItemCount:5
XtManageChild "$PRINTER_LIST"
XmCreateWorkArea INFO_RC "$WORK_AREA" info_rc orientation:XmVERTICAL
catgets CAT_MESG_STRING "$CAT_ID" 1 200 "Printer Information:"
XmCreateLabelGadget INFO_LABEL "$INFO_RC" info_label \
labelString:"$CAT_MESG_STRING"
XtManageChild "$INFO_LABEL"
printer_info=""
XmCreateScrolledText INFO_TEXT "$INFO_RC" info_text \
editMode:XmMULTI_LINE_EDIT \
value:"$printer_info" \
rows:5 \
columns:80 \
wordWrap:True \
editable:False
XmCreateSeparator BTN_SEP "$SELECT_PRINTER_FORM" sep \
separatorType:XmSHADOW_ETCHED_IN \
"$(DtkshUnder "$WORK_AREA" 4)" \
"$(DtkshSpanWidth)"
catgets CAT_MESG_STRING "$CAT_ID" 1 180 "Select Printer"
XmCreatePushButtonGadget SELECT_PRINTER_BTN "$SELECT_PRINTER_FORM" \
ok_button \
labelString:"$CAT_MESG_STRING" \
"$(DtkshUnder "$BTN_SEP" 5)" \
"$(DtkshFloatLeft 10)" \
"$(DtkshFloatRight 30)" \
"$(DtkshAnchorBottom 5)"
XtAddCallback "$SELECT_PRINTER_BTN" activateCallback "SelectPrinterCB"
catgets CAT_MESG_STRING "$CAT_ID" 1 110 "Cancel"
XmCreatePushButtonGadget CANCEL_BTN "$SELECT_PRINTER_FORM" cancel_button \
labelString:"$CAT_MESG_STRING" \
"$(DtkshUnder "$BTN_SEP" 5)" \
"$(DtkshFloatLeft 40)" \
"$(DtkshFloatRight 60)" \
"$(DtkshAnchorBottom 5)"
XtAddCallback "$CANCEL_BTN" activateCallback "SelectPrinterCancelCB"
catgets CAT_MESG_STRING "$CAT_ID" 1 120 "Help"
XmCreatePushButtonGadget HELP_BTN "$SELECT_PRINTER_FORM" help_button \
labelString:"$CAT_MESG_STRING" \
"$(DtkshUnder "$BTN_SEP" 5)" \
"$(DtkshFloatLeft 70)" \
"$(DtkshFloatRight 90)" \
"$(DtkshAnchorBottom 5)"
XtAddCallback "$HELP_BTN" activateCallback "SelectPrinterHelpCB"
XtSetValues "$SELECT_PRINTER_FORM" \
initialFocus:"$SELECT_PRINTER_BTN" \
defaultButton:"$SELECT_PRINTER_BTN" \
cancelButton:"$CANCEL_BTN" \
navigationType:EXCLUSIVE_TAB_GROUP
XtManageChild "$BTN_SEP"
XtManageChild "$SELECT_PRINTER_BTN"
XtManageChild "$CANCEL_BTN"
XtManageChild "$HELP_BTN"
XtManageChild "$INFO_TEXT"
XtManageChild "$LIST_RC"
XtManageChild "$INFO_RC"
XtManageChild "$WORK_AREA"
XtManageChild "$SELECT_PRINTER_FORM"
if (( num_printers ))
then
GetCurrentPrinterName
CheckValidPrinter
if (( failure_flag == SUCCESS ))
then
GetPrinterInfo "$printer_name"
HASH
HASH display printer information and select the printer specified in
HASH the Printer Name textfield
HASH
XmTextSetString "$INFO_TEXT" "$printer_info"
XmListSelectItem "$PRINTER_LIST" "$printer_name" true
XmListSetItem "$PRINTER_LIST" "$printer_name"
fi
else
HASH
HASH no available printer, desensitize Select Printer button in
HASH the Select Printer dialog
HASH
XtSetSensitive "$SELECT_PRINTER_BTN" false
failure_flag=$NO_PRINTER_AVAILABLE
DisplayErrorMessageDialog
fi
}
XCOMM #################################################################
XCOMM ## SelectPrinterCancelCB()
XCOMM ##
XCOMM ## Callback for the Cancel button in Select Printer dialog.
XCOMM ## It simply unmanages the dialog.
XCOMM ##
XCOMM #################################################################
SelectPrinterCancelCB()
{
XtUnmanageChild "$SELECT_PRINTER_FORM"
}
XCOMM #################################################################
XCOMM ## PrinterNameFocusCB()
XCOMM ##
XCOMM ## Focus callback for the Printer Name textfield to determine when
XCOMM ## a printer name is changed so that printer description is updated
XCOMM ## when the user changes the printer name in the Print dialog.
XCOMM ##
XCOMM #################################################################
PrinterNameFocusCB()
{
HASH If Printer Name textfield gained focus, save the current printer name.
HASH When it loses focus, compare the saved printer name with the new one
HASH to determine if the user has changed it. If so, update the printer
HASH description.
if [ "${CB_CALL_DATA.REASON}" = CR_FOCUS ]
then
GetCurrentPrinterName
old_printer=$printer_name
else
if [ "${CB_CALL_DATA.REASON}" = CR_LOSING_FOCUS ]
then
GetCurrentPrinterName
if [ "$old_printer" != "$printer_name" ]
then
UpdatePrinterDescription
fi
fi
fi
}
XCOMM #################################################################
XCOMM ## UseGui()
XCOMM ##
XCOMM ## Creates the Print dialog and sets up the callbacks.
XCOMM ##
XCOMM #################################################################
UseGui()
{
catgets CAT_MESG_STRING "$CAT_ID" 1 10 "Default"
if (( printer_name_flag ))
then
printer=$printer_name
else
GetDefaultPrinter
if (( failure_flag == SUCCESS ))
then
printer=$default_printer
printer_name=$default_printer
else
printer=$CAT_MESG_STRING
fi
fi
if [[ "$printer_name" != "" ]]
then
GetPrinterInfo "$printer_name"
else
printer_info=""
fi
DtCreatePrintSetupDialog PDIALOG "$TOPLEVEL" pdialog \
printCallback:PrintCB \
cancelCallback:PrintCancelCB \
helpCallback:PrintHelpCB \
selectPrinterProc:SelectPrinterProc \
workAreaLocation:DtWORK_AREA_TOP_AND_BOTTOM \
printSetupMode:DtPRINT_SETUP_PLAIN \
printDestination:DtPRINT_TO_PRINTER \
printerName:"$printer" \
description:"$printer_info"
catgets CAT_MESG_STRING "$CAT_ID" 1 20 "Print"
XmInternAtom DEL_ATOM "$DISPLAY" WM_DELETE_WINDOW false
XmAddWMProtocolCallback "$(XtParent "-" "$PDIALOG")" "$DEL_ATOM" PrintCancelCB
XtSetValues "$(XtParent "-" "$PDIALOG")" \
title:"$CAT_MESG_STRING" \
allowShellResize:False \
deleteResponse:DO_NOTHING
XtSetValues "$PDIALOG" autoUnmanage:False
XmCreateWorkArea FILE_NAME_RC "$PDIALOG" file_name_rc \
marginWidth:0 \
marginHeight:0 \
orientation:XmHORIZONTAL
catgets CAT_MESG_STRING "$CAT_ID" 1 170 "File Name(s): "
XmCreateLabel FILE_NAME_LABEL "$FILE_NAME_RC" file_name_label \
labelString:"$CAT_MESG_STRING"
if (( user_filename_flag ))
then
LABEL_STRING="${user_filename}"
else
LABEL_STRING="${print_file}"
fi
XmCreateLabel FILE_NAME "$FILE_NAME_RC" file_name \
labelString:"$LABEL_STRING"
XtManageChild "$FILE_NAME_RC"
XtManageChild "$FILE_NAME_LABEL"
XtManageChild "$FILE_NAME"
HASH
HASH Unmanage unneeded widgets
HASH
XtNameToWidget TOP_SEP "$PDIALOG" "TopWorkAreaSeparator"
XtUnmanageChild "$TOP_SEP"
XtNameToWidget INFO_BTN "$PDIALOG" "Info"
XtUnmanageChild "$INFO_BTN"
XtNameToWidget SELECT_FILE_BTN "$PDIALOG" "SelectFile"
XtUnmanageChild "$SELECT_FILE_BTN"
XtNameToWidget SETUP_BTN "$PDIALOG" "Setup"
XtUnmanageChild "$SETUP_BTN"
DtCreatePDMJobSetup JOB "$PDIALOG"
HASH
HASH Get widget handles
HASH
XtNameToWidget PRINTER_COMBO "$PDIALOG" "Name"
XtNameToWidget PRINTER_TF "$PRINTER_COMBO" "Text"
XtNameToWidget PRINTER_DESC_LABEL "$PDIALOG" "Description"
XtNameToWidget COPIES_SB "$PDIALOG" "*Copies"
XtNameToWidget SEND_MAIL_CB "$JOB" "*SendMail"
XtNameToWidget BANNER_TF "$JOB" "*Banner"
XtNameToWidget OPTIONS_TF "$JOB" "*Options"
XtNameToWidget SEND_MAIL_BTN "$SEND_MAIL_CB" "button_0"
XtNameToWidget PRINT_BTN "$PDIALOG" "Print"
XtNameToWidget PRINT_CANCEL_BTN "$PDIALOG" "Cancel"
HASH
HASH move cursor to end of printer name
HASH
XtSetValues "$PRINTER_TF" cursorPosition:${#PRINTER}
HASH
HASH set focus callbacks to track printer name changes
HASH
XtAddCallback "$PRINTER_TF" focusCallback "PrinterNameFocusCB"
XtAddCallback "$PRINTER_TF" losingFocusCallback "PrinterNameFocusCB"
HASH
HASH initialize SELECT_PRINTER_FORM to be used in SelectPrinterProc
HASH to determine if the Select Printer dialog already exists.
HASH
SELECT_PRINTER_FORM=""
if (( banner_title_flag ))
then
XtSetValues "$BANNER_TF" value:"$banner_title"
fi
if (( other_options_flag ))
then
XtSetValues "$OPTIONS_TF" value:"$other_options"
fi
XtManageChild "$PDIALOG"
if (( copy_count_flag ))
then
XtSetValues "$COPIES_SB" position:"$copy_count"
fi
if [[ "$send_mail_flag" == "true" ]]
then
XtSetValues "$SEND_MAIL_BTN" set:true
fi
XtGetValues "$COPIES_SB" textField:COPIES_TF
DtkshSetReturnKeyControls "$PRINTER_TF" "$COPIES_TF" "$PDIALOG" "$PRINT_BTN"
DtkshSetReturnKeyControls "$COPIES_TF" "$BANNER_TF" "$PDIALOG" "$PRINT_BTN"
DtkshSetReturnKeyControls "$BANNER_TF" "$OPTIONS_TF" "$PDIALOG" "$PRINT_BTN"
XtMainLoop
}
XCOMM #################################################################
XCOMM ## BadFileCB()
XCOMM ##
XCOMM ## This is the callback for the OK button in the error message
XCOMM ## dialog and is used when the file to print is invalid. It will
XCOMM ## exit the program.
XCOMM ##
XCOMM #################################################################
BadFileCB()
{
Exit "$bad_file_flag"
}
XCOMM #################################################################
XCOMM ## ErrorDialogCB()
XCOMM ##
XCOMM ## This is the callback for the OK button in the error message
XCOMM ## dialog and is used for non-fatal error messages. It simply
XCOMM ## destroys the message dialog.
XCOMM ##
XCOMM #################################################################
ErrorDialogCB()
{
XtDestroyWidget "$INFORMATION"
}
XCOMM #################################################################
XCOMM ## DisplayErrorMessageDialog()
XCOMM ##
XCOMM ## We have detected an error. Post a dialog to that effect.
XCOMM ##
XCOMM ## Upon entry, check the failure_flag value for the proper
XCOMM ## message to print.
XCOMM ##
XCOMM #################################################################
DisplayErrorMessageDialog()
{
XmCreateErrorDialog INFORMATION "$TOPLEVEL" information
catgets CAT_MESG_STRING "$CAT_ID" 1 160 "Print Information"
XtSetValues "$(XtParent "-" "$INFORMATION")" title:"$CAT_MESG_STRING"
GetErrorMessageString
if ((failure_flag == NO_FILE_ERR )) ||
(( failure_flag == NO_REGULAR_FILE_ERR )) ||
(( failure_flag == NO_READABLE_FILE_ERR ))
then
bad_file_flag=$failure_flag
cb="BadFileCB"
else
cb="ErrorDialogCB"
fi
XtSetValues "$INFORMATION" \
okCallback:$cb \
messageString:"${CAT_MESG_STRING}" \
noResize:True \
defaultButtonType:DIALOG_OK_BUTTON \
dialogStyle:DIALOG_FULL_APPLICATION_MODAL \
messageAlignment:ALIGNMENT_CENTER
XtUnmanageChild "$(XmMessageBoxGetChild "-" "$INFORMATION" \
DIALOG_CANCEL_BUTTON)"
XtUnmanageChild "$(XmMessageBoxGetChild "-" "$INFORMATION" \
DIALOG_HELP_BUTTON)"
XtManageChild "$INFORMATION"
XtMainLoop
}
XCOMM #################################################################
XCOMM ## Main()
XCOMM ##
XCOMM ## Set up and call either the silent or the GUI routines.
XCOMM ##
XCOMM ##
XCOMM #################################################################
Initialize
while getopts b:d:m:n:o:u:aehirsvw argument
do
case $argument in
a) print_man_flag=1
;;
b) banner_title=$OPTARG
banner_title_flag=1
;;
d) printer_name=$OPTARG
printer_name_flag=1
;;
e) remove_flag=1
;;
h) PrintUsage
Exit $SUCCESS
;;
i) send_mail_flag=true
;;
m) print_command=$OPTARG
;;
n) copy_count=$OPTARG
copy_count_flag=1
;;
o) other_options=$OPTARG
other_options_flag=1
;;
r) format_flag=1
;;
s) silent_flag=1
;;
u) user_filename=$OPTARG
user_filename_flag=1
;;
v) verbose_flag=1
;;
w) print_raw_flag=1
;;
\?) PrintUsage
Exit $USAGE_EXIT
;;
esac
done
((shift_positions = OPTIND - 1))
let npf=0
if (( shift_positions < $# ))
then
XCOMM
XCOMM We have at least one remaining non-switch command line argument
XCOMM
shift $shift_positions
HASH
HASH We assume that any remaining arguments constitute the filename.
HASH At some later point, may want to parse a list of filenames.
HASH
print_file=""
while (($# > 0))
do
nw=$(echo "$1" | wc -w)
if ((nw > 1))
then
file="\"$1\""
else
file="$1"
fi
if [ "" = "$print_file" ]
then
print_file="$file"
else
print_file="$print_file $file"
fi
files[$npf]=$1
let npf=$npf+1
shift
done
fi
XCOMM
XCOMM make sure copy_count is a positive integer
XCOMM
if (( copy_count_flag ))
then
CheckIsPosInteger "$copy_count"
if (( failure_flag != SUCCESS ))
then
DisplayErrorMessage
Exit $USAGE_EXIT
fi
fi
XCOMM
XCOMM Make sure all these settings line up consistently.
XCOMM
ReconcileOptions
if (( verbose_flag ))
then
PrintStartLog
fi
XCOMM
XCOMM Do we have enough information to do our job?
XCOMM This step may cause us to exit.
XCOMM
XCOMM
XCOMM Have we been given a valid file(s)?
XCOMM
let i=0
while ((i < npf))
do
CheckValidFile "${files[$i]}"
failure_flag=$?
if (( failure_flag != SUCCESS ))
then
print_file="\"${files[$i]}\""
break
fi
let i=i+1
done
if (( silent_flag ))
then
if (( failure_flag == SUCCESS ))
then
CheckValidPrinter
failure_flag=$?
if (( failure_flag != SUCCESS ))
then
DisplayErrorMessage
Exit $failure_flag
fi
DoParameterCollectionSilent
PrintIt
CleanUp
Exit $failure_flag
else
DisplayErrorMessage
Exit $failure_flag
fi
else
if [[ -r CDE_INSTALLATION_TOP/lib/dtksh/DtFuncs.dtsh ]]
then
. CDE_INSTALLATION_TOP/lib/dtksh/DtFuncs.dtsh
else
failure_flag=1
echo Sorry--cannot find initialization file.
Exit $NO_INIT_FILE_ERR
fi
XtInitialize TOPLEVEL printerConfig Dtlp "${@:-}"
XtDisplay DISPLAY "$TOPLEVEL"
if (( failure_flag == SUCCESS ))
then
UseGui
else
DisplayErrorMessageDialog
fi
fi
XCOMM
XCOMM Never reached.
XCOMM
XCOMM #################### eof ##############################