/*
 * $Id: rgsadmin.c,v 1.7 1997/01/03 17:29:02 root Exp root $
 *
 * $Log: rgsadmin.c,v $
 * Revision 1.7  1997/01/03 17:29:02  root
 * Moved some functions from dasm.c.
 * Changed some names.
 * Fixed some memory leaks.
 *
 * Revision 1.6  1996/12/21 00:24:55  root
 * Changed:
 * In main()
 * took increment of dasm_count out of loop test.
 *
 * Revision 1.5  1996/12/12 19:51:47  root
 * Added:
 * XmStringFree(str)
 * Deleted:
 * showdasm_select()
 * Changed:
 * size of host[]
 * XtSetArg() calls to XtVaSetValues()
 * error message for get_dasm_list()
 * gethostname() called earlier
 *
 * Revision 1.4  1996/12/06 20:36:47  root
 * Added #include util.h
 * Changed dasm calls to reflect change in types.
 *
 * Revision 1.3  1996/11/21 23:13:12  root
 * Main()
 * Changed dasm_label to dasm_device_label, Added dasm_type_label
 * Changed Uppercase DASM, RGS, UPS, to lowercase.
 *
 * Added get_dasm_list()
 *
 * showdasm_select()
 * Added label "dasm" for contents of dasm_data.
 * Added code to parse device from selected string
 *
 * Revision 1.2  1996/11/19 22:13:53  root
 * Added functions MenuSetSensitive, list_select, showdasm_select
 * Placed creating of "list" before Menu creation.
 * Added dasm_menu[0].callback_data = (XtPointer) list;
 *
 * Revision 1.1  1996-11-18 16:39:35-05  root
 * Initial revision
 *
 */


#include "common.h"
#include "config.h"
#include "netconfig.h"
#include "system.h"
#include "dasm.h"
#include "buildmenu.h"
#include "util.h"
#include "rgsadmin.h"

XtAppContext app;


static int get_dasm_device_list(char ***);
static int sense_dasm(char *, char **);
static int get_dasm_list(char ***);
static void menu_set_sensitive(Widget *, int, Boolean);
static void list_select(Widget, XtPointer, XtPointer);



static int
get_dasm_device_list(char ***ptr)
{
  int i = 0;
  DIR *dirp;
  struct dirent *direntp;

  *ptr = (char **) XtMalloc(sizeof(char *));

  if ((dirp = opendir(DASM_DEVICE_DIR)) == NULL)
    return BAD_DIRECTORY;
  
  while((direntp = readdir(dirp)) != NULL ) {
    if (direntp->d_name[0] == 'c') {
      *ptr = (char **) XtRealloc((char *) *ptr, (i + 2) * (sizeof(char *)));
      (*ptr)[i] = (char *) XtMalloc(strlen(direntp->d_name) + 1);
      strcpy((*ptr)[i], direntp->d_name);
      i++;
    }
    handle_pending_x_events();
  }
  closedir(dirp);
  (*ptr)[i] = NULL;
  return 0;
}


static int 
sense_dasm(char *device, char **ptr)
{
  FILE *sense;
  char cmd[BUFSIZ];
  struct passwd *pwd;

  *ptr = (char *) XtMalloc (BUFSIZ);
  
  if ((pwd = getpwnam(SPOOLER_USER)) == NULL) 
    return BAD_USER;

  sprintf(cmd, "%s/bin/%s -d /dev/dasm/%s -p", pwd->pw_dir, SENSE_DASM_CMD,
	  device);
  
  if ((sense = popen(cmd, "r")) != NULL) {
    while((fgets(*ptr, BUFSIZ, sense)) != NULL)
	;
    pclose(sense);
    (*ptr)[strlen(*ptr) - 1] = '\0';
    return 0;
  } else
    return PIPE_ERROR;
}


static int 
get_dasm_list(char ***ptr)
{
  char **dasm_device_list, *dasm_type, cur_dasm[200];
  int i, retval;


  if ((retval = get_dasm_device_list(&dasm_device_list)) >0)
    return retval;
  
  /*
   * Since we can count the length, allocate only once 
   */

  for (i = 0; dasm_device_list[i] != NULL; i++) 
    ;
  *ptr = (char **) XtMalloc((i + 1) * sizeof(char *));
  
  for (i = 0; dasm_device_list[i] != NULL; i++) {
    if ((retval = sense_dasm(dasm_device_list[i], &dasm_type)) > 0)
      return retval;
    sprintf(cur_dasm, "%-30s%s", dasm_device_list[i], dasm_type);
    (*ptr)[i] = XtMalloc(strlen(cur_dasm) + 1);
    strcpy((*ptr)[i], cur_dasm);

    /* Free memory allocated in sense_dasm() */

    XtFree(dasm_type);

    handle_pending_x_events();
  }
  (*ptr)[i] = NULL;

  /* Free memory allocated in get_dasm_device_list() */

  for (i = 0; dasm_device_list[i] != NULL; i++)
    XtFree(dasm_device_list[i]);
  XtFree((char *) dasm_device_list);

  return 0;
}


static void
menu_set_sensitive(Widget *menu, int number, Boolean sensitive)
{
  int i;

  for (i=0; i < number; i++)
    XtSetSensitive(menu[i], sensitive);
}


static void
list_select(Widget w, XtPointer client_data, XtPointer call_data)
{
  menu_set_sensitive((Widget *) client_data, 5, True);
}


int
main(int argc, char *argv[])
{
    Widget toplevel, main_w, menubar, form;
    Widget *dasm_m;
    Widget dasm_device_label, dasm_type_label, list;
    Widget messages_label, messages_text;
    Widget host_label;
    XmString str;
    XmStringTable str_list;
    int i, retval, dasm_count = 0;
    char **dasm_list, hostident[100], host[60];
    

    gethostname(host, 60);
    sprintf(hostident, "Host: %s", host);

    XtSetLanguageProc(NULL, NULL, NULL);

    toplevel = XtVaAppInitialize(&app, "Rgsadmin", NULL, 0,
        &argc, argv, fallbacks, NULL);

    /* 
     *  Create a MainWindow widget that contains a ScrolledText Widget in
     *  its work window. 
     */

    main_w = XtVaCreateManagedWidget("main_w",
				     xmMainWindowWidgetClass, toplevel,
				     NULL);
    menubar = XmCreateMenuBar(main_w, "menubar", NULL, 0);
    form = XtVaCreateManagedWidget("form", xmFormWidgetClass, main_w,
				   NULL);

    str = XmStringCreateLocalized("Dasm Device");
    dasm_device_label = XtVaCreateManagedWidget("dasm_device_label", xmLabelGadgetClass, form,
						XmNlabelString, str,
						XmNtopAttachment, XmATTACH_FORM,
						XmNtopOffset, 10, 
						XmNleftAttachment, XmATTACH_FORM,
						XmNleftOffset, 12,
						NULL);
    XmStringFree(str);

    str = XmStringCreateLocalized("Dasm Type");
    dasm_type_label = XtVaCreateManagedWidget("dasm_type_label", xmLabelGadgetClass, form,
					      XmNlabelString, str,
					      XmNtopAttachment, XmATTACH_FORM,
					      XmNtopOffset, 10, 
					      XmNleftAttachment, XmATTACH_WIDGET,
					      XmNleftWidget, dasm_device_label,
					      XmNleftOffset, 131,
					      NULL);
    XmStringFree(str);

    if ((retval = get_dasm_list(&dasm_list)) >0 ) {
      fprintf(stderr, "get_dasm_list() failed:  Exiting with status %d\n", retval);
      exit(retval);
    }
    while(dasm_list[dasm_count] != NULL)
      dasm_count++;
    str_list = (XmStringTable) XtMalloc (dasm_count * sizeof (XmString *));
    for (i = 0; i < dasm_count; i++)
      str_list[i] = XmStringCreateLocalized (dasm_list[i]);

    /* Free the memory allocated in get_dasm_list() */

    for (i = 0; dasm_list[i] != NULL; i++)
      XtFree(dasm_list[i]);
    XtFree((char *) dasm_list);

    list = XmCreateScrolledList(form, "list", NULL, 0);

    XtVaSetValues(XtParent(list),
		  XmNtopAttachment, XmATTACH_WIDGET,
		  XmNtopWidget, dasm_device_label,
		  XmNleftAttachment, XmATTACH_FORM,
		  XmNleftOffset, 13,
		  XmNrightAttachment, XmATTACH_FORM,
		  XmNrightOffset, 12,
		  NULL);

    XtVaSetValues(list, 
		  XmNitems, str_list,
		  XmNitemCount, dasm_count,
		  XmNvisibleItemCount, 5,
		  NULL);

    /* Done with the compound strings, free the memory */

    for (i = 0; i < dasm_count; i++)
      XmStringFree(str_list[i]);
    XtFree((char *) str_list);

    BuildPulldownMenu(menubar, "System", 'y', True, system_menu, NULL);
    BuildPulldownMenu(menubar, "Rgs", 'R', True, rgs_menu, NULL);
    dasm_menu[0].callback_data = (XtPointer) list;
    BuildPulldownMenu(menubar, "Dasm", 'D', True, dasm_menu, &dasm_m);
    BuildPulldownMenu(menubar, "Dicom", 'i', True, dicom_menu, NULL);
    BuildPulldownMenu(menubar, "Modem", 'M', True, modem_menu, NULL);
    BuildPulldownMenu(menubar, "Ups", 'U', True, ups_menu, NULL);

    menu_set_sensitive(dasm_m, 5, False);

    XtManageChild(menubar);
    XtManageChild(list);

    XtAddCallback(list, XmNbrowseSelectionCallback, list_select, dasm_m);
    XtAddCallback(list, XmNdefaultActionCallback, showdasm_select, list);

    str = XmStringCreateLocalized("Messages:");
    messages_label = XtVaCreateManagedWidget("messages_label", xmLabelGadgetClass, form,
					     XmNlabelString, str,
					     XmNtopAttachment, XmATTACH_WIDGET,
					     XmNtopWidget, list,
					     XmNtopOffset, 10, 
					     XmNleftAttachment, XmATTACH_FORM,
					     XmNleftOffset, 10,
					     NULL);
    XmStringFree(str);

    str = XmStringCreateLocalized(hostident);
    host_label = XtVaCreateManagedWidget("host_label", xmLabelGadgetClass,
					 form, 
					 XmNlabelString, str,
					 XmNleftAttachment, XmATTACH_FORM,
					 XmNleftOffset, 10,
					 XmNbottomAttachment, XmATTACH_FORM,
					 XmNbottomOffset, 10,
					 NULL);
    XmStringFree(str);

    messages_text = XmCreateScrolledText(form, "messages_text", NULL, 0);

    XtVaSetValues(XtParent(messages_text),
		  XmNtopAttachment, XmATTACH_WIDGET,
		  XmNtopWidget, messages_label,
		  XmNleftAttachment, XmATTACH_FORM,
		  XmNleftOffset, 10,
		  XmNrightAttachment, XmATTACH_FORM,
		  XmNrightOffset, 12,
		  XmNbottomAttachment, XmATTACH_WIDGET,
		  XmNbottomWidget, host_label,
		  XmNbottomOffset, 10,
		  NULL);
		  
    XtVaSetValues(messages_text, 
		  XmNeditable, False,
		  XmNeditMode, XmMULTI_LINE_EDIT,
		  XmNcursorPositionVisible, False,
		  NULL);
		  

    XtManageChild(messages_text);

    XtRealizeWidget(toplevel);
    XtAppMainLoop(app);
}
