[comp.sys.sun] New phonetool

young@uunet.uu.net (indi) (06/05/91)

	Well, I discovered a bug in phonetool that could leave a security 
	hole... the line that actually mailed the phone message used piping,
	so sh could get ahold of the text of the message you typed in, and
	if there were any $PATH's (or worse) the shell interpreted it for you.
	Anyway, I made the fix and also added a patch to have a PHONERC
	environment variable so you can put your .phonerc file anywhere
	you want.  Included below is the new shar file.  Please replace the
	old phonetool with this new one in the archive.  

	______________________________________________________________
	 ^   ^
	/_\ /_\	   indi			Supercomputer       ^      ^
	   ^	   uunet!ssi!young	Systems, Inc.      / \^  ^/ \
	  /_\	   (415)373-8044	Livermore, CA     /____\/____\
	______________________________________________________________


#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	phonetool/
# This archive created: Wed May  8 09:28:53 1991
export PATH; PATH=/bin:$PATH
if test ! -d ''
then
	echo shar: creating directory "''"
	mkdir ''
fi
echo shar: entering directory "''"
cd ''
echo shar: extracting "'phone.icon'" '(1997 characters)'
if test -f 'phone.icon'
then
	echo shar: will not over-write existing file "'phone.icon'"
else
sed 's/^	X//' << \SHAR_EOF > 'phone.icon'
	X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
	X */
	X	0x0000,0x0000,0x0000,0x0000,
	X	0x0000,0x0000,0x0000,0x0000,
	X	0x0000,0x0000,0x0000,0x0000,
	X	0x0000,0x0000,0x0000,0x0000,
	X	0x0000,0x3FFF,0xC000,0x0000,
	X	0x0007,0xC000,0x3E00,0x0000,
	X	0x0038,0x0000,0x01C0,0x0000,
	X	0x03C0,0x0000,0x003C,0x0000,
	X	0x0C00,0x7000,0xE003,0x0000,
	X	0x1003,0xDFFF,0xBC00,0x8000,
	X	0x2004,0x5000,0xA200,0x4000,
	X	0x2007,0xDFFF,0xBE00,0x4000,
	X	0x4004,0x0000,0x0200,0x2000,
	X	0x4004,0x3FFF,0xC200,0x2000,
	X	0x401C,0x4000,0x2380,0x2000,
	X	0x4064,0x4666,0x2260,0x2000,
	X	0x2788,0x8666,0x111E,0x4000,
	X	0x3808,0x8000,0x1101,0xC000,
	X	0x0010,0x8666,0x1080,0x0000,
	X	0x0011,0x0666,0x0880,0x0000,
	X	0x0021,0x0000,0x0840,0x0000,
	X	0x0021,0x0666,0x0840,0x0000,
	X	0x0042,0x0666,0x0420,0x0000,
	X	0x0042,0x0000,0x0420,0x0000,
	X	0x0081,0xFFFF,0xF810,0x0000,
	X	0x0080,0x0000,0x0010,0x0000,
	X	0x0100,0x0000,0x0008,0x0000,
	X	0x0100,0x0000,0x0008,0x0000,
	X	0x0100,0x0000,0x000F,0x8000,
	X	0x0100,0x0000,0x000C,0x7800,
	X	0x0100,0x0000,0x0008,0x0780,
	X	0x0100,0x0000,0x0009,0xC078,
	X	0x00FF,0xFFFF,0xFFF0,0x3804,
	X	0x0038,0x0000,0x05C7,0x0004,
	X	0x0000,0x0000,0x1800,0xE008,
	X	0x0000,0x0000,0x2060,0x1C10,
	X	0x0000,0x0000,0xC41C,0x0220,
	X	0x0000,0x0003,0x0303,0xC040,
	X	0x0000,0x0004,0x00C0,0x3080,
	X	0x0000,0x0018,0x6038,0x0100,
	X	0x0000,0x0020,0x1C07,0x0200,
	X	0x0000,0x0038,0x0300,0xC400,
	X	0x0000,0x0007,0x00E0,0x0800,
	X	0x0000,0x0000,0xE01C,0x1000,
	X	0x0000,0x0000,0x1802,0x2000,
	X	0x0000,0x0000,0x0700,0x4000,
	X	0x0000,0x0000,0x00E0,0x8000,
	X	0x0000,0x0000,0x0019,0x0000,
	X	0x0000,0x0000,0x0006,0x0000,
	X	0x0000,0x0000,0x0000,0x0000,
	X	0x0000,0x0000,0x0000,0x0000,
	X	0x0040,0x0000,0x0000,0x0020,
	X	0x0040,0x0000,0x0100,0x0020,
	X	0x0040,0x0000,0x0100,0x0020,
	X	0x5858,0x30B0,0xE3C6,0x0C20,
	X	0x6464,0x48C9,0x1109,0x1220,
	X	0x4444,0x8489,0x1110,0xA120,
	X	0x4444,0x8489,0xF110,0xA120,
	X	0x4444,0x8489,0x0110,0xA120,
	X	0x4444,0x4889,0x1109,0x1220,
	X	0x7844,0x3088,0xE0C6,0x0C20,
	X	0x4000,0x0000,0x0000,0x0000,
	X	0x4000,0x0000,0x0000,0x0000,
	X	0x0000,0x0000,0x0000,0x0000
SHAR_EOF
if test 1997 -ne "`wc -c < 'phone.icon'`"
then
	echo shar: error transmitting "'phone.icon'" '(should have been 1997 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'phone_thick.icon'" '(1997 characters)'
if test -f 'phone_thick.icon'
then
	echo shar: will not over-write existing file "'phone_thick.icon'"
else
sed 's/^	X//' << \SHAR_EOF > 'phone_thick.icon'
	X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
	X */
	X	0x0000,0x0000,0x0000,0x0000,
	X	0x0000,0x0000,0x0000,0x0000,
	X	0x0000,0x0000,0x0000,0x0000,
	X	0x0000,0x3FFF,0xC000,0x0000,
	X	0x0007,0xFFFF,0xFE00,0x0000,
	X	0x003F,0xC000,0x3FC0,0x0000,
	X	0x03F8,0x0000,0x01FC,0x0000,
	X	0x0FC0,0x7FFF,0xE03F,0x0000,
	X	0x1C00,0xFFFF,0xE003,0x8000,
	X	0x3003,0xD800,0xBC00,0xC000,
	X	0x6007,0xDFFF,0xBE00,0x6000,
	X	0x6007,0xDFFF,0xBE00,0x6000,
	X	0xC006,0x0000,0x0600,0x3000,
	X	0xC006,0x3FFF,0xC600,0x3000,
	X	0xC01E,0x7FFF,0xE780,0x3000,
	X	0xC07E,0xC000,0x37E0,0x3000,
	X	0x63EC,0xC666,0x337C,0x6000,
	X	0x3F8D,0x8666,0x1B1F,0xC000,
	X	0x1C19,0x8000,0x1983,0x8000,
	X	0x0019,0x8666,0x1980,0x0000,
	X	0x0033,0x0666,0x0CC0,0x0000,
	X	0x0033,0x0000,0x0CC0,0x0000,
	X	0x0063,0x0666,0x0C60,0x0000,
	X	0x0066,0x0666,0x0660,0x0000,
	X	0x00C6,0x0000,0x0630,0x0000,
	X	0x00C7,0xFFFF,0xFE30,0x0000,
	X	0x0183,0xFFFF,0xFC18,0x0000,
	X	0x0180,0x0000,0x0018,0x0000,
	X	0x0180,0x0000,0x001F,0x8000,
	X	0x0180,0x0000,0x001C,0x7800,
	X	0x0180,0x0000,0x0018,0x0780,
	X	0x01FF,0xFFFF,0xFFF9,0xC078,
	X	0x00FF,0xFFFF,0xFFF0,0x3804,
	X	0x0038,0x0000,0x05C7,0x0004,
	X	0x0000,0x0000,0x1800,0xE008,
	X	0x0000,0x0000,0x2060,0x1C10,
	X	0x0000,0x0000,0xC41C,0x0220,
	X	0x0000,0x0003,0x0303,0xC040,
	X	0x0000,0x0004,0x00C0,0x3080,
	X	0x0000,0x0018,0x6038,0x0100,
	X	0x0000,0x0020,0x1C07,0x0200,
	X	0x0000,0x0038,0x0300,0xC400,
	X	0x0000,0x0007,0x00E0,0x0800,
	X	0x0000,0x0000,0xE01C,0x1000,
	X	0x0000,0x0000,0x1802,0x2000,
	X	0x0000,0x0000,0x0700,0x4000,
	X	0x0000,0x0000,0x00E0,0x8000,
	X	0x0000,0x0000,0x0019,0x0000,
	X	0x0000,0x0000,0x0006,0x0000,
	X	0x0000,0x0000,0x0000,0x0000,
	X	0x0000,0x0000,0x0000,0x0000,
	X	0x0040,0x0000,0x0000,0x0020,
	X	0x0040,0x0000,0x0100,0x0020,
	X	0x0040,0x0000,0x0100,0x0020,
	X	0x5858,0x30B0,0xE3C6,0x0C20,
	X	0x6464,0x48C9,0x1109,0x1220,
	X	0x4444,0x8489,0x1110,0xA120,
	X	0x4444,0x8489,0xF110,0xA120,
	X	0x4444,0x8489,0x0110,0xA120,
	X	0x4444,0x4889,0x1109,0x1220,
	X	0x7844,0x3088,0xE0C6,0x0C20,
	X	0x4000,0x0000,0x0000,0x0000,
	X	0x4000,0x0000,0x0000,0x0000,
	X	0x0000,0x0000,0x0000,0x0000
SHAR_EOF
if test 1997 -ne "`wc -c < 'phone_thick.icon'`"
then
	echo shar: error transmitting "'phone_thick.icon'" '(should have been 1997 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'phonetool.1'" '(3887 characters)'
if test -f 'phonetool.1'
then
	echo shar: will not over-write existing file "'phonetool.1'"
else
sed 's/^	X//' << \SHAR_EOF > 'phonetool.1'
	X.\" @(#)cc.l    @(#)phonetool.1	
	X.TH PHONETOOL 1 "25 January 1991"
	X.SH NAME
	X.B phonetool
	X\- a message-sending tool for phone calls intercepted on behalf of a co-worker
	X.SH SYNOPSIS
	X.B phonetool
	X[
	X.I any OpenLook window options
	X]
	X.SH DESCRIPTION
	X.LP
	X.B phonetool
	Xis an OpenLook style application that was originally created to run under Sun's OpenWindows environment.  It is written in XView, and its code skeleton was created using Sun's DevGuide product.  
	X
	X.B phonetool
	Xis a simple message-sending tool.  It does nothing that regular email won't do, but it is designed to reduce the typing involved when intercepting a call for a fellow worker who's not at his/her desk.  Users keep 
	X.B phonetool
	Xiconified on their desktop, and simply pop it open and fill in a name and a phone number when they intercept a call for a co-worker.
	X.LP
	X.SH OPTIONS
	X.TP 12
	XUse any OpenLook window options with this tool.
	X.SH USAGE
	X.LP
	XThe 
	X.B phonetool
	Xapplication is about the same size as those little pink or yellow slips of paper your secertary leaves on your desk with phone messages on it (about 4" x 5 1/4" here in the U.S... I'm not sure what various Europeans use...).  At the top of the 
	X.B phonetool
	Xpane is a "To:" text field with a "login id's" menu button to the right of it. Users can type in any valid email address in the text field that is under 80 characters.  Invalid addresses result in mail being returned to the sender.  For efficiency, users can select a name from the "login id's" menu instead, and that name will appear in the "To:" text field.
	X
	XThe "login id's" menu is compiled directly from the
	X.I .phonerc
	Xfile.  Users may have a
	X.I .phonerc
	Xfile in their home directory or the full path must be given in the environment variable
	X.B PHONERC.
	XThe
	X.I .phonerc
	Xfile contains the login name, email address, or email alias of co-workers for whom they might intercept phone calls.  The file may contain comments on lines beginning with a pound (#) sign.  Only one login name, email address, or email alias is allowed per line in the file.
	X
	XBelow the "To:" text field are three more text fields, "Caller:", "Company:", and "Phone:".  Users fill these text fields in with the relevant information while they are taking the message on the phone.  Below these fields are six checkbox items with "canned" messages next to them that users may select from.  Or, if elaboration is required, below the checkboxes is an "Other:" scrolling text pane in which users can enter a longer message.
	X
	XAt the bottom is a "Send Message" button that, when pressed, mails the message off to the email address specified at the top and then clears the form for the next message.  There is also a "Clear" button at the bottom which blanks out all the fields, checkboxes, and text if the user decides not to take a message he/she has already started.
	X.SH NOTES
	X.br 
	X.B phonetool 
	Xshould run under any X-based window manager.  It will not, however, run under a kernel-based windowing system, such as SunView.  Users must also have a copy of a
	X.I .phonerc 
	Xfile to build the "login id's" menu.  If the user doesn't wish to have anything in that menu, the
	X.I .phonerc
	Xfile may still be present, only it must be empty.  Or the user may forgo having a
	X.I .phonerc
	Xfile at all.  The
	X.I .phonerc
	Xfile must be in the home directory.  The
	X.I .phonerc
	Xfile contains the login name, email address, or email alias of co-workers for whom they might intercept phone calls.  The file may contain comments on lines beginning with a pound (#) sign.  Only one login name, email address, or email alias is allowed per line in the file.
	X
	X.SH BUGS
	X.br
	X.B phonetool
	Xmay not run on machines other than Sun's without font problems.
	X
	XThe scrollbar on the scrolling text pane sometimes is drawn incorrectly, and the bottom anchor does not appear.  It is still usable.
	X.SH  COMPLAINTS/FIXES
	X.br
	XTo indi, currently at uunet!ssi!young.
SHAR_EOF
if test 3887 -ne "`wc -c < 'phonetool.1'`"
then
	echo shar: error transmitting "'phonetool.1'" '(should have been 3887 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'phonetool.c'" '(31641 characters)'
if test -f 'phonetool.c'
then
	echo shar: will not over-write existing file "'phonetool.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'phonetool.c'
	X
	X#ifndef phonetool_HEADER
	X#include "phonetool.h"
	X#endif
	X
	X#include <xview/notice.h>
	X#include <xview/textsw.h>
	X
	Xvoid main(argc, argv)
	X   int    argc;
	X   char   **argv;
	X{
	X
	X   /*
	X    * Initialize XView.
	X    */
	X
	X   xv_init(XV_INIT_ARGC_PTR_ARGV, &argc, argv, 0);
	X
	X   /*
	X    * Set the global tag to unique numbers.
	X    */
	X
	X   INSTANCE = xv_unique_key();
	X	
	X   /*
	X    * Initialize user interface components.
	X    */
	X
	X   phone_msg_phonemsg_frame = phone_msg_phonemsg_frame_objects_initialize(NULL,
	X      NULL);
	X	
	X   /*
	X    * Turn control over to XView.
	X    */
	X
	X   xv_main_loop(phone_msg_phonemsg_frame->phonemsg_frame);
	X
	X   exit(0);
	X}
	X
	X								     
	X								      
	X
	X/*
	X * Menu handler for `login_menu'.
	X */
	X
	XMenu_item
	Xlogin_menu_handler(item, op)
	X	Menu_item	item;
	X	Menu_generate	op;
	X{
	X   phone_msg_phonemsg_frame_objects   *ip;
	X   char                               login[MAX_STORED_LENGTH];
	X   
	X   ip = (phone_msg_phonemsg_frame_objects *) xv_get(item,
	X      XV_KEY_DATA, INSTANCE);
	X	
	X   switch (op) {
	X
	X   case MENU_DISPLAY:
	X      break;
	X
	X   case MENU_DISPLAY_DONE:
	X      break;
	X
	X   case MENU_NOTIFY:
	X      /* Put id into the To: field. */
	X      strcpy(login, (char *) xv_get(item, MENU_STRING));
	X      (void) xv_set(ip->to_text,
	X	 PANEL_VALUE, login,
	X	 NULL);
	X      break;
	X
	X   case MENU_NOTIFY_DONE:
	X      break;
	X   }
	X
	X   return item;
	X}
	X
	X
	X
	X/*
	X * Notify callback function for `send_button'.
	X */
	X
	Xvoid send_button_handler(item, event)
	X   Panel_item   item;
	X   Event        *event;
	X{
	X   extern int                         put_up_error_notice();
	X   extern void                        clear_phone_message();
	X
	X   int                                value;
	X   int                                text_len;
	X   int                                result;
	X   char                               to[MAX_STORED_LENGTH];
	X   char                               caller[MAX_STORED_LENGTH];
	X   char                               company[MAX_STORED_LENGTH];
	X   char                               phone[MAX_STORED_LENGTH];
	X   char                               message[MAX_MESSAGE_LENGTH];
	X   char                               msg_buf[5500];
	X   char                               *mail_str;
	X   char                               text_message[MAX_TEXT_LENGTH];
	X   char                               *temp_file;
	X   FILE                               *fp_temp;
	X   Textsw_index                       next_position;
	X   phone_msg_phonemsg_frame_objects   *ip;
	X
	X   ip = (phone_msg_phonemsg_frame_objects *) xv_get(
	X      item, XV_KEY_DATA, INSTANCE);
	X
	X   /*
	X    * Get person's name to send message to. 
	X    */
	X
	X   (void) strcpy(to, (char *) xv_get(ip->to_text, PANEL_VALUE));
	X
	X   /*
	X    * Get the caller's name, company, and phone number. 
	X    */
	X
	X   (void) strcpy(caller,  (char *) xv_get(ip->caller_text, PANEL_VALUE));
	X   (void) strcpy(company, (char *) xv_get(ip->company_text, PANEL_VALUE));
	X   (void) strcpy(phone,   (char *) xv_get(ip->phone_text, PANEL_VALUE));
	X
	X   /*
	X    * Initialize message to a null string.  (patch by Eric Liefeld)
	X    */
	X
	X   (void) strcpy(message, "");
	X
	X   /*
	X    * Get the message.  See O'Reilly p. 150 for meaning of bit values.
	X    */
	X
	X   value = (int) xv_get(ip->message_setting, PANEL_VALUE);
	X
	X   switch(value) {
	X
	X   case 0: /* 000000 nothing selected */
	X      break;
	X
	X   case 1: /* 000001 the first one is selected */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      break;
	X
	X   case 2: /* 000010 the second one is selected */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      break;
	X
	X   case 3: /* 000011 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      break;
	X
	X   case 4: /* 000100 the third one is selected */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      break;
	X
	X   case 5: /* 000101 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      break;
	X
	X   case 6: /* 000110 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      break;
	X
	X   case 7: /* 000111 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      break;
	X
	X   case 8: /* 001000 fourth one selected */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      break;
	X
	X   case 9: /* 001001 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      break;
	X
	X   case 10: /* 001010 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      break;
	X
	X   case 11: /* 001011 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      break;
	X
	X   case 12: /* 001100 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      break;
	X
	X   case 13: /* 001101 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      break;
	X
	X   case 14: /* 001110 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      break;
	X
	X   case 15: /* 001111 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      break;
	X
	X   case 16: /* 010000 fifth one selected */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      break;
	X
	X   case 17: /* 010001 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      break;
	X
	X   case 18: /* 010010 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      break;
	X
	X   case 19: /* 010011 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      break;
	X
	X   case 20: /* 010100 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      break;
	X
	X   case 21: /* 010101 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      break;
	X
	X   case 22: /* 010110 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      break;
	X
	X   case 23: /* 010111 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      break;
	X
	X   case 24: /* 011000 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      break;
	X
	X   case 25: /* 011001 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      break;
	X
	X   case 26: /* 011010 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      break;
	X
	X   case 27: /* 011011 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      break;
	X
	X   case 28: /* 011100 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      break;
	X
	X   case 29: /* 011101 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      break;
	X
	X   case 30: /* 011110 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      break;
	X
	X   case 31: /* 011111 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      break;
	X
	X   case 32: /* 100000 sixth one selected */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 33: /* 100001 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 34: /* 100010 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 35: /* 100011 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 36: /* 100100 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 37: /* 100101 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 38: /* 100110 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 39: /* 100111 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 40: /* 101000 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 41: /* 101001 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 42: /* 101010 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 43: /* 101011 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 44: /* 101100 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 45: /* 101101 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 46: /* 101110 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 47: /* 101111 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 48: /* 110000 the last two are selected */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 49: /* 110001 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 50: /* 110010 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 51: /* 110011 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 52: /* 110100 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 53: /* 110101 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 54: /* 110110 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 55: /* 110111 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 56: /* 111000 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 57: /* 111001 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 58: /* 111010 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 59: /* 111011 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 60: /* 111100 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 61: /* 111101 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 62: /* 111110 */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X
	X   case 63: /* 111111 all of them selected */
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 0));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 1));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 2));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 3));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 4));
	X      strcat(message, "\n");
	X      strcat(message, (char *) xv_get(ip->message_setting,
	X         PANEL_CHOICE_STRING, 5));
	X      break;
	X   }
	X
	X   strcat(message, "\n\n");
	X
	X   /*
	X    * Compose the header.
	X    */
	X
	X   sprintf(msg_buf, "From:    %s\nCompany: %s\nPhone:   %s\n\n", caller,
	X      company, phone);
	X
	X   /*
	X    * Get the text, if any.
	X    */
	X
	X   text_len = (int) xv_get(ip->message_textsw, TEXTSW_LENGTH);
	X
	X   if (text_len > MAX_TEXT_LENGTH) {
	X
	X      /*
	X       * Put up error notice.
	X       */
	X
	X      result = put_up_error_notice(item, TEXT);
	X      return;
	X   }
	X
	X   /*
	X    * Put the text into the buffer.
	X    */
	X
	X   next_position = (Textsw_index) xv_get(ip->message_textsw,
	X      TEXTSW_CONTENTS, 0, text_message, text_len);
	X
	X   if (next_position != text_len) {
	X
	X      /*
	X       * We've got more than we can use, still.  Put up error message.
	X       */
	X
	X      result = put_up_error_notice(item, TEXT);
	X      return;
	X   }
	X
	X   else {
	X
	X      /*
	X       * Null terminate the text message.
	X       */
	X
	X      text_message[text_len] = '\0';
	X   }
	X
	X   /*
	X    * Put the "canned" and the textsw messages together.
	X    */
	X
	X   strcat(msg_buf, message);
	X   strcat(msg_buf, text_message);
	X
	X   /*
	X    * Put the message in a temp file to be read by mail.  (This is a fix
	X    * to keep sh from parsing $'s and such when the message is piped in.)
	X    */
	X
	X   temp_file = tmpnam(NULL);
	X   fp_temp   = fopen(temp_file, "w");
	X   fprintf(fp_temp, "%s", msg_buf);
	X   (void) fclose(fp_temp);
	X
	X   /*
	X    * Send the mail.
	X    */
	X
	X   mail_str = (char *)malloc(strlen(msg_buf) + 1 + 55);
	X   /*sprintf(mail_str, "mail -s \"**Phone Message**\" %s << END_MSG\n%s\nEND_MSG\n", to, msg_buf);*/
	X   sprintf(mail_str, "mail -s \"**Phone Message**\" %s < %s", to, temp_file);
	X
	X   /*
	X    * Check for mail system errors.  
	X    */
	X
	X   if (system(mail_str)) {
	X      result = put_up_error_notice(item, MAIL);
	X   }
	X
	X   else {
	X
	X      /*
	X       * Clear the message.
	X       */
	X
	X      clear_phone_message(ip);
	X   }
	X
	X   free(mail_str);
	X   unlink(temp_file);
	X
	X}
	X
	X
	X
	X
	X/*
	X * Notify callback function for `clear_button'.
	X */
	X
	Xvoid clear_button_handler(item, event)
	X   Panel_item   item;
	X   Event        *event;
	X{
	X   extern void                        clear_phone_message();
	X   phone_msg_phonemsg_frame_objects   *ip;
	X
	X   ip = (phone_msg_phonemsg_frame_objects *) xv_get(item, XV_KEY_DATA, 
	X      INSTANCE);
	X
	X   /*
	X    * Clear the message.
	X    */
	X
	X   clear_phone_message(ip);
	X
	X}
	X
	X
	X
	X
	X/*
	X * Clear the form routine.
	X */
	X
	Xvoid clear_phone_message(ip)
	X   phone_msg_phonemsg_frame_objects   *ip;
	X{
	X   /*
	X    * Clear the message.
	X    */
	X
	X   (void) xv_set(ip->to_text,
	X      PANEL_VALUE, "",
	X      NULL);
	X   (void) xv_set(ip->caller_text,
	X      PANEL_VALUE, "",
	X      NULL);
	X   (void) xv_set(ip->company_text,
	X      PANEL_VALUE, "",
	X      NULL);
	X   (void) xv_set(ip->phone_text,
	X      PANEL_VALUE, "",
	X      NULL);
	X   (void) xv_set(ip->message_setting,
	X      PANEL_VALUE, 0,
	X      NULL);
	X   (void) textsw_reset(ip->message_textsw, 50, 50); /* 50 = x & y coords */
	X}
	X
	X
	X
	X
	X/*
	X * This routine posts a notice for mailing errors.
	X */
	X
	Xint put_up_error_notice(item, notice_type)
	X   Panel_item               item;
	X   enum Error_notice_type   notice_type;
	X
	X{
	X   Panel   panel;
	X   int     result;
	X
	X   panel = (Panel) xv_get(item, PANEL_PARENT_PANEL);
	X
	X   switch(notice_type) {
	X
	X   case TEXT:
	X      result = notice_prompt(panel, NULL,
	X         NOTICE_MESSAGE_STRINGS,
	X            "The message in the Other: text pane",
	X            "is too long.",
	X            "",
	X            "Please edit it to less than",
	X            "5000",
	X            "characters.",
	X            NULL,
	X         NOTICE_BUTTON_YES, "Okay",
	X         NULL);
	X      break;
	X
	X   case MAIL:
	X      result = notice_prompt(panel, NULL,
	X         NOTICE_MESSAGE_STRINGS,
	X            "This message cannot be sent.",
	X            "",
	X            "Check the login name in the To: field",
	X            "to be sure it contains a valid mail address,",
	X            "then try to send the message again.",
	X            NULL,
	X         NOTICE_BUTTON_YES, "Okay",
	X         NULL);
	X      break;
	X   }
	X
	X   return(result);
	X}
SHAR_EOF
if test 31641 -ne "`wc -c < 'phonetool.c'`"
then
	echo shar: error transmitting "'phonetool.c'" '(should have been 31641 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'phonetool.h'" '(2418 characters)'
if test -f 'phonetool.h'
then
	echo shar: will not over-write existing file "'phonetool.h'"
else
sed 's/^	X//' << \SHAR_EOF > 'phonetool.h'
	X
	X#ifndef	phonetool_HEADER
	X#define	phonetool_HEADER
	X
	X#include <sys/types.h>
	X#include <sys/param.h>
	X#include <stdio.h>
	X#include <xview/xview.h>
	X#include <xview/xv_xrect.h>
	X#include <xview/attr.h>
	X#include <xview/panel.h>
	X
	X
	X#define MAX_STORED_LENGTH    40     /* Maximum chars in a text field */
	X#define MAX_MESSAGE_LENGTH   140    /* Maximum size of toggle messages */
	X#define MAX_TEXT_LENGTH      5000   /* Maximum num chars in the textsw */
	X                                    /* NOTE: If you change this last value,
	X                                     * change the value in the notice
	X                                     * prompt in phonetool.c put_up_error_notice
	X                                     * routine, too.
	X                                     */
	X
	Xenum Error_notice_type {
	X   TEXT,
	X   MAIL,
	X   NO_DOT_FILE,
	X   CANNOT_OPEN_DOT_FILE
	X};
	X
	Xextern Attr_attribute   INSTANCE;
	Xextern Xv_opaque        phone_msg_login_menu_create();
	X
	Xtypedef struct {
	X   Xv_opaque   phonemsg_frame;
	X   Xv_opaque   message_control;
	X   Xv_opaque   login_button;
	X   Xv_opaque   to_text;
	X   Xv_opaque   caller_text;
	X   Xv_opaque   company_text;
	X   Xv_opaque   phone_text;
	X   Xv_opaque   message_setting;
	X   Xv_opaque   other_message;
	X   Xv_opaque   message_textsw;
	X   Xv_opaque   send_control;
	X   Xv_opaque   send_button;
	X   Xv_opaque   clear_button;
	X} phone_msg_phonemsg_frame_objects;
	X
	Xextern phone_msg_phonemsg_frame_objects 
	X   *phone_msg_phonemsg_frame_objects_initialize();
	X
	Xextern Xv_opaque   phone_msg_phonemsg_frame_phonemsg_frame_create();
	Xextern Xv_opaque   phone_msg_phonemsg_frame_message_control_create();
	Xextern Xv_opaque   phone_msg_phonemsg_frame_login_button_create();
	Xextern Xv_opaque   phone_msg_phonemsg_frame_to_text_create();
	Xextern Xv_opaque   phone_msg_phonemsg_frame_caller_text_create();
	Xextern Xv_opaque   phone_msg_phonemsg_frame_company_text_create();
	Xextern Xv_opaque   phone_msg_phonemsg_frame_phone_text_create();
	Xextern Xv_opaque   phone_msg_phonemsg_frame_message_setting_create();
	Xextern Xv_opaque   phone_msg_phonemsg_frame_other_message_create();
	Xextern Xv_opaque   phone_msg_phonemsg_frame_message_textsw_create();
	Xextern Xv_opaque   phone_msg_phonemsg_frame_send_control_create();
	Xextern Xv_opaque   phone_msg_phonemsg_frame_send_button_create();
	Xextern Xv_opaque   phone_msg_phonemsg_frame_clear_button_create();
	X
	X
	X
	Xextern phone_msg_phonemsg_frame_objects   *phone_msg_phonemsg_frame;
	X
	X#endif
SHAR_EOF
if test 2418 -ne "`wc -c < 'phonetool.h'`"
then
	echo shar: error transmitting "'phonetool.h'" '(should have been 2418 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'phonetool.info'" '(1319 characters)'
if test -f 'phonetool.info'
then
	echo shar: will not over-write existing file "'phonetool.info'"
else
sed 's/^	X//' << \SHAR_EOF > 'phonetool.info'
	X#
	X# phonetool.info - User interface object help text.
	X#
	X:login_button
	XSelect a name from this list, and it will appear in the "To:" field to the
	Xleft of this menu.  The names in this list come from your .phonerc file.
	XYou may edit your .phonerc file to add any names you might wish to use.
	X
	XThe names in this menu must be valid logins or email addresses.
	X#
	X:to_text
	XEnter the login name or email address of the person for whom you are taking a 
	Xphone message.
	X#
	X:caller_text
	XEnter the name, in plain language, of the person calling.
	X#
	X:company_text
	XEnter the name of the company for which the caller works.  (optional)
	X#
	X:phone_text
	XEnter the phone number and area code, if applicable, of the person calling.
	X(optional)
	X#
	X:message_setting
	XSelect one or more of the appropriate messages.  A checkmark will appear in the
	Xbox next to the message you have selected.  You may un-mark a message by
	Xselecting it again, thus toggling the checkmark off. (optional)
	X#
	X:message_textsw
	XAdd any additional message from the caller here.
	X#
	X:send_button
	XThis button sends your message to the person named in the "To:" field, and then
	Xclears the phone message form.
	X#
	X:clear_button
	XThis button simply clears the phone message form of any names or selections
	Xyou have made.  Use this button to cancel messages you have begun to compile.
SHAR_EOF
if test 1319 -ne "`wc -c < 'phonetool.info'`"
then
	echo shar: error transmitting "'phonetool.info'" '(should have been 1319 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'phonetool_build.c'" '(14126 characters)'
if test -f 'phonetool_build.c'
then
	echo shar: will not over-write existing file "'phonetool_build.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'phonetool_build.c'
	X
	X#ifndef phonetool_HEADER
	X#include "phonetool.h"
	X#endif
	X
	X#include <xview/textsw.h>
	X#include <sys/stat.h>
	X#include <assert.h>
	X
	X
	X/*
	X * Create object `login_menu' in the specified instance.
	X */
	X
	XXv_opaque phone_msg_login_menu_create(ip, owner)
	X   caddr_t     *ip;
	X   Xv_opaque   owner;
	X{
	X#define               MAXLINE    100
	X
	X   extern Menu_item   login_menu_handler();
	X   char               name[MAXPATHLEN+10];
	X   char               line[MAXLINE];
	X   char               *menu_text;
	X   FILE               *fptr;
	X   FILE               *fopen();
	X   Menu_item          mi;
	X   struct stat        statbuf;
	X   Xv_opaque          obj;
	X
	X   /*
	X    * Open the .phonerc file.  Look in environment variable PHONERC and
	X    * then the home dir for it.  (env variable patch by Ken Nelson)
	X    */
	X
	X   if (getenv("PHONERC") != NULL) {
	X
	X      (void) strcpy(name, getenv("PHONERC"));
	X
	X      /*
	X       * Add the name of the resource file.
	X       */
	X
	X      (void) strcat(name, "/.phonerc");
	X   }
	X
	X   else if (getenv("HOME") != NULL) {
	X
	X      (void) strcpy(name, getenv("HOME"));
	X
	X      /*
	X       * Add the name of the resource file.
	X       */
	X
	X      (void) strcat(name, "/.phonerc");
	X   }
	X
	X   else {
	X
	X      /*
	X       * If it returns null, then the file doesn't exist, or the user
	X       * has messed with $HOME.  So, make the menu blank.
	X       */
	X
	X      (void) strcpy(name, "");
	X   }
	X
	X   if (stat(name, &statbuf) != 0) {
	X
	X      /*
	X       * The file does not exist in this directory.  Put up an error notice
	X       * telling the user to create a .phonerc file.
	X       */
	X
	X      fprintf(stderr, "Can't find your .phonerc file.\n");
	X      fprintf(stderr, "You should have a .phonerc file in your home \n");
	X      fprintf(stderr, "directory if you wish to have a \"login id's\" menu.\n");
	X      fprintf(stderr, "The .phonerc file contains the logins or email\n");
	X      fprintf(stderr, "addresses of people to whom you might wish to send\n");
	X      fprintf(stderr, "phone messages.  These names will appear in the\n");
	X      fprintf(stderr, "\"login id's\" menu.\n");
	X      fprintf(stderr, "The .phonerc file may contain comments on lines\n");
	X      fprintf(stderr, "starting with a pound (#) sign.\n");
	X      fprintf(stderr, "The environment variable PHONERC may be used to\n");
	X      fprintf(stderr, "specify the location of your resource file.\n");
	X      
	X      /* 
	X       * Create the menu with no items.
	X       */
	X 
	X      obj = (Xv_opaque) xv_create(owner, MENU, NULL);
	X
	X      return(obj);
	X
	X   }
	X
	X   if ((fptr = fopen(name, "r")) == NULL) {
	X
	X      /*
	X       * Can't open file.  Put up a notice to this effect.
	X       */
	X
	X      fprintf(stderr, "Can't open or read your .phonerc file.\n");
	X      fprintf(stderr, "Please check to be sure this file is readable,\n");
	X      fprintf(stderr, "and exists in your home directory.\n");
	X      exit(0);
	X   }
	X
	X   /* 
	X    * Create the menu with no items at first.
	X    */
	X 
	X   obj = (Xv_opaque) xv_create(owner, MENU, NULL);
	X
	X   fgets(line, MAXLINE, fptr);
	X
	X   while(!feof(fptr)) {
	X
	X      /*
	X       * If this line doesn't start with a comment "#" or a newline, then
	X       * write its contents into the menu.
	X       */
	X
	X      if (((strncmp("#", line, 1)) != 0) && ((strncmp("\n", line, 1)) != 0)) {
	X
	X         /*
	X          * Take out the trailing newline.
	X          */
	X
	X         (void) strtok(line, "\n");
	X
	X         /*
	X          * Malloc space for the text for this menu item.
	X          */
	X
	X         menu_text = (char *) malloc(strlen(line) + 1);
	X         (void) strcpy(menu_text, line);
	X
	X         /*
	X          * Add the entry to the menu.
	X          */
	X
	X         mi = (Menu_item) xv_create(NULL, MENUITEM,
	X            XV_KEY_DATA, INSTANCE, ip,
	X            MENU_STRING, menu_text,
	X            MENU_GEN_PROC, login_menu_handler,
	X            NULL);
	X
	X         (void) xv_set(obj,
	X            MENU_APPEND_ITEM, mi,
	X            NULL);
	X      }
	X 
	X      /*
	X       * Get another line.  Go ahead and write over what was there before.
	X       */
	X
	X      fgets(line, MAXLINE, fptr);
	X
	X   }
	X 
	X   /*
	X    * Close the .bt file.
	X    */
	X
	X   fclose(fptr);
	X
	X   return(obj);
	X
	X}
	X
	X
	X
	X
	X/*
	X * Initialize an instance of object `phonemsg_frame'.
	X */
	X
	Xphone_msg_phonemsg_frame_objects
	X   *phone_msg_phonemsg_frame_objects_initialize(ip, owner)
	X   phone_msg_phonemsg_frame_objects   *ip;
	X   Xv_opaque                          owner;
	X{
	X   if (!ip && !(ip = (phone_msg_phonemsg_frame_objects *) calloc(1, sizeof 
	X      (phone_msg_phonemsg_frame_objects))))
	X      return (phone_msg_phonemsg_frame_objects *) NULL;
	X   if (!ip->phonemsg_frame)
	X      ip->phonemsg_frame = phone_msg_phonemsg_frame_phonemsg_frame_create(ip, 
	X         owner);
	X   if (!ip->message_control)
	X      ip->message_control = phone_msg_phonemsg_frame_message_control_create(ip, 
	X         ip->phonemsg_frame);
	X   if (!ip->login_button)
	X      ip->login_button = phone_msg_phonemsg_frame_login_button_create(ip, 
	X         ip->message_control);
	X   if (!ip->to_text)
	X      ip->to_text = phone_msg_phonemsg_frame_to_text_create(ip, 
	X         ip->message_control);
	X   if (!ip->caller_text)
	X      ip->caller_text = phone_msg_phonemsg_frame_caller_text_create(ip, 
	X         ip->message_control);
	X   if (!ip->company_text)
	X      ip->company_text = phone_msg_phonemsg_frame_company_text_create(ip, 
	X         ip->message_control);
	X   if (!ip->phone_text)
	X      ip->phone_text = phone_msg_phonemsg_frame_phone_text_create(ip, 
	X         ip->message_control);
	X   if (!ip->message_setting)
	X      ip->message_setting = phone_msg_phonemsg_frame_message_setting_create(ip, 
	X         ip->message_control);
	X   if (!ip->other_message)
	X      ip->other_message = phone_msg_phonemsg_frame_other_message_create(ip, 
	X         ip->message_control);
	X   if (!ip->message_textsw)
	X      ip->message_textsw = phone_msg_phonemsg_frame_message_textsw_create(ip, 
	X         ip->phonemsg_frame);
	X   if (!ip->send_control)
	X      ip->send_control = phone_msg_phonemsg_frame_send_control_create(ip, 
	X         ip->phonemsg_frame);
	X   if (!ip->send_button)
	X      ip->send_button = phone_msg_phonemsg_frame_send_button_create(ip, 
	X         ip->send_control);
	X   if (!ip->clear_button)
	X      ip->clear_button = phone_msg_phonemsg_frame_clear_button_create(ip, 
	X         ip->send_control);
	X
	X   return ip;
	X}
	X
	X
	X
	X/*
	X * Create object `phonemsg_frame' in the specified instance.
	X */
	X
	XXv_opaque phone_msg_phonemsg_frame_phonemsg_frame_create(ip, owner)
	X   caddr_t     *ip;
	X   Xv_opaque   owner;
	X{
	X   Xv_opaque               obj;
	X   Xv_opaque               phonemsg_frame_image;
	X   static unsigned short   phonemsg_frame_bits[] = {
	X#include "phone.icon"
	X   };
	X	
	X   phonemsg_frame_image = xv_create(0, SERVER_IMAGE,
	X      SERVER_IMAGE_BITS, phonemsg_frame_bits,
	X      SERVER_IMAGE_DEPTH, 1,
	X      XV_WIDTH, 64,
	X      XV_HEIGHT, 64,
	X      0);
	X
	X   obj = xv_create(owner, FRAME,
	X      XV_KEY_DATA, INSTANCE, ip,
	X      XV_WIDTH, 321,
	X      XV_HEIGHT, 399,
	X      XV_LABEL, "Phone Message",
	X      FRAME_CLOSED, FALSE,
	X      FRAME_SHOW_FOOTER, TRUE,
	X      FRAME_ICON, xv_create(0, ICON,
	X         ICON_IMAGE, phonemsg_frame_image,
	X         0),
	X      0);
	X
	X   return obj;
	X}
	X
	X
	X
	X/*
	X * Create object `message_control' in the specified instance.
	X */
	X
	XXv_opaque phone_msg_phonemsg_frame_message_control_create(ip, owner)
	X   caddr_t     *ip;
	X   Xv_opaque   owner;
	X{
	X   Xv_opaque   obj;
	X	
	X   obj = xv_create(owner, PANEL,
	X      XV_KEY_DATA, INSTANCE, ip,
	X      XV_X, 0,
	X      XV_Y, 0,
	X      XV_WIDTH, WIN_EXTEND_TO_EDGE,
	X      XV_HEIGHT, 312,
	X      WIN_BORDER, FALSE,
	X      0);
	X
	X   return obj;
	X}
	X
	X
	X
	X/*
	X * Create object `login_button' in the specified instance.
	X */
	X
	XXv_opaque phone_msg_phonemsg_frame_login_button_create(ip, owner)
	X   caddr_t     *ip;
	X   Xv_opaque   owner;
	X{
	X   Xv_opaque   obj;
	X	
	X   obj = xv_create(owner, PANEL_BUTTON,
	X      XV_KEY_DATA, INSTANCE, ip,
	X      XV_HELP_DATA, "phonetool:login_button",
	X      XV_X, 219,
	X      XV_Y, 11,
	X      XV_WIDTH, 87,
	X      XV_HEIGHT, 20,
	X      PANEL_LABEL_STRING, "login id's",
	X      PANEL_ITEM_MENU, phone_msg_login_menu_create(ip, NULL),
	X      0);
	X
	X   return obj;
	X}
	X
	X
	X
	X/*
	X * Create object `to_text' in the specified instance.
	X */
	X
	XXv_opaque phone_msg_phonemsg_frame_to_text_create(ip, owner)
	X   caddr_t     *ip;
	X   Xv_opaque   owner;
	X{
	X   Xv_opaque   obj;
	X	
	X   obj = xv_create(owner, PANEL_TEXT,
	X      XV_KEY_DATA, INSTANCE, ip,
	X      XV_HELP_DATA, "phonetool:to_text",
	X      XV_X, 11,
	X      XV_Y, 15,
	X      XV_WIDTH, 189,
	X      XV_HEIGHT, 15,
	X      PANEL_LABEL_STRING, "To:",
	X      PANEL_VALUE_X, 40,
	X      PANEL_VALUE_Y, 15,
	X      PANEL_LAYOUT, PANEL_HORIZONTAL,
	X      PANEL_VALUE_DISPLAY_LENGTH, 20,
	X      PANEL_VALUE_STORED_LENGTH, MAX_STORED_LENGTH,
	X      PANEL_MAX_VALUE, 0,
	X      PANEL_MIN_VALUE, 0,
	X      PANEL_READ_ONLY, FALSE,
	X      0);
	X
	X   return obj;
	X}
	X
	X
	X
	X
	X/*
	X * Create object `caller_text' in the specified instance.
	X */
	X
	XXv_opaque phone_msg_phonemsg_frame_caller_text_create(ip, owner)
	X   caddr_t     *ip;
	X   Xv_opaque   owner;
	X{
	X   Xv_opaque   obj;
	X	
	X   obj = xv_create(owner, PANEL_TEXT,
	X      XV_KEY_DATA, INSTANCE, ip,
	X      XV_HELP_DATA, "phonetool:caller_text",
	X      XV_X, 32,
	X      XV_Y, 45,
	X      XV_WIDTH, 253,
	X      XV_HEIGHT, 15,
	X      PANEL_LABEL_STRING, "Caller:",
	X      PANEL_VALUE_X, 85,
	X      PANEL_VALUE_Y, 45,
	X      PANEL_LAYOUT, PANEL_HORIZONTAL,
	X      PANEL_VALUE_DISPLAY_LENGTH, 25,
	X      PANEL_VALUE_STORED_LENGTH, MAX_STORED_LENGTH,
	X      PANEL_MAX_VALUE, 0,
	X      PANEL_MIN_VALUE, 0,
	X      PANEL_READ_ONLY, FALSE,
	X      0);
	X
	X   return obj;
	X}
	X
	X
	X
	X
	X/*
	X * Create object `company_text' in the specified instance.
	X */
	X
	XXv_opaque phone_msg_phonemsg_frame_company_text_create(ip, owner)
	X   caddr_t     *ip;
	X   Xv_opaque   owner;
	X{
	X   Xv_opaque   obj;
	X	
	X   obj = xv_create(owner, PANEL_TEXT,
	X      XV_KEY_DATA, INSTANCE, ip,
	X      XV_HELP_DATA, "phonetool:company_text",
	X      XV_X, 9,
	X      XV_Y, 63,
	X      XV_WIDTH, 276,
	X      XV_HEIGHT, 15,
	X      PANEL_LABEL_STRING, "Company:",
	X      PANEL_VALUE_X, 85,
	X      PANEL_VALUE_Y, 63,
	X      PANEL_LAYOUT, PANEL_HORIZONTAL,
	X      PANEL_VALUE_DISPLAY_LENGTH, 25,
	X      PANEL_VALUE_STORED_LENGTH, MAX_STORED_LENGTH,
	X      PANEL_MAX_VALUE, 0,
	X      PANEL_MIN_VALUE, 0,
	X      PANEL_READ_ONLY, FALSE,
	X      0);
	X
	X   return obj;
	X}
	X
	X
	X
	X
	X/*
	X * Create object `phone_text' in the specified instance.
	X */
	X
	XXv_opaque phone_msg_phonemsg_frame_phone_text_create(ip, owner)
	X   caddr_t     *ip;
	X   Xv_opaque   owner;
	X{
	X   Xv_opaque   obj;
	X	
	X   obj = xv_create(owner, PANEL_TEXT,
	X      XV_KEY_DATA, INSTANCE, ip,
	X      XV_HELP_DATA, "phonetool:phone_text",
	X      XV_X, 31,
	X      XV_Y, 81,
	X      XV_WIDTH, 254,
	X      XV_HEIGHT, 15,
	X      PANEL_LABEL_STRING, "Phone:",
	X      PANEL_VALUE_X, 85,
	X      PANEL_VALUE_Y, 81,
	X      PANEL_LAYOUT, PANEL_HORIZONTAL,
	X      PANEL_VALUE_DISPLAY_LENGTH, 25,
	X      PANEL_VALUE_STORED_LENGTH, MAX_STORED_LENGTH,
	X      PANEL_MAX_VALUE, 0,
	X      PANEL_MIN_VALUE, 0,
	X      PANEL_READ_ONLY, FALSE,
	X      0);
	X
	X   return obj;
	X}
	X
	X
	X
	X
	X/*
	X * Create object `message_setting' in the specified instance.
	X */
	X
	XXv_opaque phone_msg_phonemsg_frame_message_setting_create(ip, owner)
	X   caddr_t     *ip;
	X   Xv_opaque   owner;
	X{
	X   Xv_opaque   obj;
	X	
	X   obj = xv_create(owner, PANEL_TOGGLE, PANEL_FEEDBACK, PANEL_MARKED,
	X      XV_KEY_DATA, INSTANCE, ip,
	X      XV_HELP_DATA, "phonetool:message_setting",
	X      XV_X, 16,
	X      XV_Y, 104,
	X      XV_WIDTH, 235,
	X      XV_HEIGHT, 185,
	X      PANEL_VALUE_X, 16,
	X      PANEL_VALUE_Y, 121,
	X      PANEL_LAYOUT, PANEL_VERTICAL,
	X      PANEL_CHOICE_STRINGS,
	X         "Please return this call.",
	X         "Will call again.",
	X         "URGENT - return this call ASAP.",
	X         "Wants to see you.",
	X         "Stopped by to see you.",
	X         "Returned your call.",
	X         0,
	X      PANEL_LABEL_STRING, "Message:",
	X      0);
	X
	X   return obj;
	X}
	X
	X
	X
	X
	X/*
	X * Create object `other_message' in the specified instance.
	X */
	X
	XXv_opaque phone_msg_phonemsg_frame_other_message_create(ip, owner)
	X   caddr_t     *ip;
	X   Xv_opaque   owner;
	X{
	X   Xv_opaque   obj;
	X	
	X   obj = xv_create(owner, PANEL_MESSAGE,
	X      XV_KEY_DATA, INSTANCE, ip,
	X      XV_X, 16,
	X      XV_Y, 296,
	X      XV_WIDTH, 43,
	X      XV_HEIGHT, 13,
	X      PANEL_LABEL_STRING, "Other:",
	X      PANEL_LABEL_BOLD, TRUE,
	X      0);
	X
	X   return obj;
	X}
	X
	X
	X
	X
	X/*
	X * Create object `message_textsw' in the specified instance.
	X */
	X
	XXv_opaque phone_msg_phonemsg_frame_message_textsw_create(ip, owner)
	X   caddr_t     *ip;
	X   Xv_opaque   owner;
	X{
	X   Xv_opaque   obj;
	X	
	X   obj = xv_create(owner, TEXTSW,
	X      XV_KEY_DATA, INSTANCE, ip,
	X      XV_HELP_DATA, "phonetool:message_textsw",
	X      XV_X, 16,
	X      XV_Y, 316,
	X      XV_WIDTH, WIN_EXTEND_TO_EDGE,
	X      XV_HEIGHT, 48,
	X      OPENWIN_SHOW_BORDERS, TRUE,
	X      0);
	X
	X   return obj;
	X}
	X
	X
	X
	X
	X/*
	X * Create object `send_control' in the specified instance.
	X */
	X
	XXv_opaque phone_msg_phonemsg_frame_send_control_create(ip, owner)
	X   caddr_t     *ip;
	X   Xv_opaque   owner;
	X{
	X   Xv_opaque   obj;
	X	
	X   obj = xv_create(owner, PANEL,
	X      XV_KEY_DATA, INSTANCE, ip,
	X      XV_X, 0,
	X      XV_Y, 369,
	X      XV_WIDTH, WIN_EXTEND_TO_EDGE,
	X      XV_HEIGHT, WIN_EXTEND_TO_EDGE,
	X      WIN_BORDER, FALSE,
	X      0);
	X
	X   return obj;
	X}
	X
	X
	X
	X
	X/*
	X * Create object `send_button' in the specified instance.
	X */
	X
	XXv_opaque phone_msg_phonemsg_frame_send_button_create(ip, owner)
	X   caddr_t     *ip;
	X   Xv_opaque   owner;
	X{
	X   extern void   send_button_handler();
	X   Xv_opaque     obj;
	X	
	X   obj = xv_create(owner, PANEL_BUTTON,
	X      XV_KEY_DATA, INSTANCE, ip,
	X      XV_HELP_DATA, "phonetool:send_button",
	X      XV_X, 66,
	X      XV_Y, 4,
	X      XV_WIDTH, 103,
	X      XV_HEIGHT, 20,
	X      PANEL_LABEL_STRING, "Send Message",
	X      PANEL_NOTIFY_PROC, send_button_handler,
	X      0);
	X
	X   return obj;
	X}
	X
	X
	X
	X
	X/*
	X * Create object `clear_button' in the specified instance.
	X */
	X
	XXv_opaque phone_msg_phonemsg_frame_clear_button_create(ip, owner)
	X   caddr_t     *ip;
	X   Xv_opaque   owner;
	X{
	X   extern void   clear_button_handler();
	X   Xv_opaque     obj;
	X	
	X   obj = xv_create(owner, PANEL_BUTTON,
	X      XV_KEY_DATA, INSTANCE, ip,
	X      XV_HELP_DATA, "phonetool:clear_button",
	X      XV_X, 206,
	X      XV_Y, 4,
	X      XV_WIDTH, 50,
	X      XV_HEIGHT, 20,
	X      PANEL_LABEL_STRING, "Clear",
	X      PANEL_NOTIFY_PROC, clear_button_handler,
	X      0);
	X
	X   return obj;
	X}
	X
SHAR_EOF
if test 14126 -ne "`wc -c < 'phonetool_build.c'`"
then
	echo shar: error transmitting "'phonetool_build.c'" '(should have been 14126 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'phonetool_data.c'" '(401 characters)'
if test -f 'phonetool_data.c'
then
	echo shar: will not over-write existing file "'phonetool_data.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'phonetool_data.c'
	X
	X/*
	X * THIS IS THE GLOBAL FILE.
	X */
	X
	X#ifndef phonetool_HEADER
	X#include "phonetool.h"
	X#endif
	X
	X/*
	X * Instance XV_KEY_DATA key.  An instance is a set of related
	X * user interface objects.  A pointer to an object's instance
	X * is stored under this key in every object.  This must be a
	X * global variable.
	X */
	XAttr_attribute  INSTANCE;
	X      
	Xphone_msg_phonemsg_frame_objects   *phone_msg_phonemsg_frame;
	X
SHAR_EOF
if test 401 -ne "`wc -c < 'phonetool_data.c'`"
then
	echo shar: error transmitting "'phonetool_data.c'" '(should have been 401 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'lisa_simpson.icon'" '(1997 characters)'
if test -f 'lisa_simpson.icon'
then
	echo shar: will not over-write existing file "'lisa_simpson.icon'"
else
sed 's/^	X//' << \SHAR_EOF > 'lisa_simpson.icon'
	X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
	X */
	X	0x0000,0x0060,0x00F0,0x0000,
	X	0x0000,0x0190,0x0310,0x0000,
	X	0x0000,0x0208,0x0410,0x0000,
	X	0x0000,0x0404,0x1808,0x0000,
	X	0x0008,0x0402,0x2008,0x0000,
	X	0x0017,0x8401,0xC008,0x0000,
	X	0x0010,0x6400,0x0008,0x0000,
	X	0x0010,0x3800,0x0008,0x03E0,
	X	0x0010,0x0000,0x0008,0xFC20,
	X	0x0010,0x0000,0x0007,0x8040,
	X	0x0008,0x0000,0x0000,0x0040,
	X	0x0008,0x0000,0x0000,0x0080,
	X	0x0008,0x0000,0x0000,0x0080,
	X	0x0008,0x0000,0x0000,0x0080,
	X	0x0005,0x8C00,0x0000,0x0100,
	X	0x0005,0x1800,0x0000,0x0600,
	X	0x0005,0x1060,0x0000,0x0C00,
	X	0x0005,0x1084,0x0000,0x03F0,
	X	0x0003,0xF988,0x1000,0x000C,
	X	0x0003,0x0708,0x2000,0x0002,
	X	0x0004,0x0188,0x4000,0x0002,
	X	0x0008,0x0089,0x8000,0x0004,
	X	0x0008,0xC09F,0x0000,0x0004,
	X	0x0010,0xC060,0xC780,0x0008,
	X	0x0010,0x0080,0x3800,0x0010,
	X	0x0010,0x0100,0x1000,0x0060,
	X	0x0010,0x0118,0x1000,0x0080,
	X	0x0010,0x0218,0x0800,0x0100,
	X	0x0008,0x0200,0x0FC0,0x0200,
	X	0x0008,0x0200,0x0800,0x0400,
	X	0x003F,0xF200,0x0800,0x0800,
	X	0x0040,0x0E00,0x0800,0x0400,
	X	0x0040,0x0100,0x1000,0x0200,
	X	0x0040,0x0100,0x1000,0x0100,
	X	0x0020,0x0080,0x2000,0x0080,
	X	0x07E0,0x0060,0xC000,0x0040,
	X	0x1810,0x001F,0x0000,0x0020,
	X	0x100C,0x0000,0x0000,0x0010,
	X	0x0803,0xC000,0x0000,0x0008,
	X	0x0C00,0x2000,0x01C0,0x0008,
	X	0x0200,0x0000,0x0630,0x0070,
	X	0x0080,0x0000,0x0410,0x0F80,
	X	0x0038,0x0000,0x0188,0x1000,
	X	0x000E,0x0000,0x0248,0x1000,
	X	0x0001,0xC001,0x0024,0x1000,
	X	0x0002,0x1000,0xC024,0x1000,
	X	0x0001,0x0E00,0x23E8,0x1000,
	X	0x0001,0x01E1,0xE018,0x1000,
	X	0x0000,0x801F,0x23F0,0x1000,
	X	0x0000,0x7000,0x220C,0x1000,
	X	0x0000,0x0800,0x240B,0xC800,
	X	0x0000,0x0800,0x0408,0x2800,
	X	0x0000,0x0800,0x0710,0x1800,
	X	0x0000,0x0800,0x04A0,0x0000,
	X	0x0000,0x0400,0x04A0,0x0000,
	X	0x0000,0x0400,0x0460,0x0000,
	X	0x0000,0x0E00,0x1C20,0x0000,
	X	0x0000,0x1100,0x2200,0x0000,
	X	0x0000,0x1173,0xA380,0x0000,
	X	0x0000,0x118C,0x6260,0x0000,
	X	0x0000,0x0E8C,0x5C18,0x0000,
	X	0x0000,0x108C,0x400C,0x0000,
	X	0x0000,0x1073,0x8006,0x0000,
	X	0x0000,0x1000,0x0002,0x0000
SHAR_EOF
if test 1997 -ne "`wc -c < 'lisa_simpson.icon'`"
then
	echo shar: error transmitting "'lisa_simpson.icon'" '(should have been 1997 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'Makefile'" '(2212 characters)'
if test -f 'Makefile'
then
	echo shar: will not over-write existing file "'Makefile'"
else
sed 's/^	X//' << \SHAR_EOF > 'Makefile'
	X#
	X#   Makefile for building PhoneTool
	X#
	X#   This tool was designed for use in Sun's OpenWindows environment.  If
	X#   you are not installing this on a Sun running OpenWindows, there are
	X#   a few environment variables and directories you'll need to have.
	X#   The following are examples of how OpenWindows was set up on our
	X#   system:
	X#
	X#	setenv OPENWINHOME /usr/openwin
	X#	setenv HELPPATH $OPENWINHOME/lib/help
	X#
	X#   Set up the definitions below to match those on your system, and be
	X#   sure to have your HELPPATH environment variable set.
	X#
	X#   Then type 'make install' and all should be taken care of for you...
	X#
	X#   (Three icon files are included... you can rotate them in by changing
	X#   their names to phone.icon.  To prevent losing the current phone.icon,
	X#   move it to a temporary file first.)
	X#
	X#	___________________________________________________________
	X#	indi (Cathy Young)            Supercomputer Systems, Inc
	X#	uunet!ssi!young           2021 Las Positas Court, Suite 101
	X#	(415)373-8044                   Livermore, CA  94550
	X
	X
	X#
	X# Include files, libraries, and other macros.  Be sure to change 
	X# these to match your own system.
	X#
	X
	XHOME = /home/ugiashak/young
	XOPENWINHOME = /usr/openwin
	X
	XINFOFILE = phonetool.info
	XMANPAGE = phonetool.1
	XSTARTUPFILE = .phonerc
	X
	XINSTALLDIR = /usr/local/bin
	XINFODIR = $(OPENWINHOME)/lib/help
	XMANDIR = /usr/man/man1
	XHOMEDIR = $(HOME)
	X
	XXLIB = $(OPENWINHOME)/lib/libX11.a
	XXVIEWLIB = $(OPENWINHOME)/lib/libxview.a
	XXOLGXLIB = $(OPENWINHOME)/lib/libolgx.a
	XXINCLUDE = $(OPENWINHOME)/include
	XXVIEWINCLUDE = $(OPENWINHOME)/include/xview
	X
	X#
	X# Set CPP flags here to the things you really want.
	X#
	X
	XCPPFLAGS = \
	X	-I$(XVIEWINCLUDE)	\
	X	-I$(XINCLUDE)		\
	X	-g
	X
	XEXECUTABLE = phonetool
	X
	X#
	X# Source file definitions
	X#
	X
	XSOURCES = 				\
	X	phonetool_data.c		\
	X	phonetool_build.c		\
	X	phonetool.c
	X
	XOBJECTS =       $(SOURCES:.c=.o)
	X
	Xall: $(EXECUTABLE)
	X
	Xinstall: $(EXECUTABLE) $(INFOFILE) $(MANPAGE)
	X	install -m 7555 $(EXECUTABLE) $(INSTALLDIR)
	X	install -m 0644 $(INFOFILE) $(INFODIR)
	X	install -m 0644 $(MANPAGE) $(MANDIR)
	X	install -m 0644 $(STARTUPFILE) $(HOMEDIR)
	X
	Xclean:
	X	rm -f $(OBJECTS) $(EXECUTABLE)
	X
	X$(EXECUTABLE): $(OBJECTS)
	X	$(LINK.c) -o $@ $(OBJECTS) $(XVIEWLIB) $(XOLGXLIB) $(XLIB)
SHAR_EOF
if test 2212 -ne "`wc -c < 'Makefile'`"
then
	echo shar: error transmitting "'Makefile'" '(should have been 2212 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'.phonerc'" '(80 characters)'
if test -f '.phonerc'
then
	echo shar: will not over-write existing file "'.phonerc'"
else
sed 's/^	X//' << \SHAR_EOF > '.phonerc'
	X#
	X# .phonrc -Example file for use in the "login id's" menu
	X#
	X
	Xbrown
	Xjones
	Xsmith
SHAR_EOF
if test 80 -ne "`wc -c < '.phonerc'`"
then
	echo shar: error transmitting "'.phonerc'" '(should have been 80 characters)'
fi
fi # end of overwriting check
echo shar: done with directory "''"
cd ..
#	End of shell archive
exit 0