/*
 * This file contains the x callbacks for various things.
 *
 * Copyright 1990 by the Massachusetts Institute of Technology.
 *
 * For copying and distribution information, please see the file
 * <mit-copyright.h>.
 *
 * Tom Coppeto
 * MIT Network Services
 * 8 August 1990
 *
 *    $Source: /afs/net.mit.edu/tools/src/xinterface/RCS/callback.c,v $
 *    $Author: tom $
 *    $Locker:  $
 *    $Log:	callback.c,v $
 * Revision 1.2  91/02/21  13:44:11  tom
 * *** empty log message ***
 * 
 * Revision 1.1  90/08/15  01:12:27  tom
 * Initial revision
 * 
 */

#ifndef lint
static char *rcsid = "$Header: /afs/net.mit.edu/tools/src/xinterface/RCS/callback.c,v 1.2 91/02/21 13:44:11 tom Exp $";
#endif

#include "xport.h"

#include <X11/Xatom.h>
#include <X11/IntrinsicP.h>
#include <X11/CompositeP.h>
#include <X11/StringDefs.h>
#include <X11/Shell.h>
#include <X11/Xaw/Paned.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Command.h>
#include <X11/Xaw/Toggle.h>
#include <X11/Xaw/Box.h>
#include <X11/Xaw/Viewport.h>
#include <X11/Xaw/Label.h>
#include <X11/Xaw/StripChart.h>
#include <X11/Xaw/AsciiText.h>
#include <X11/Xaw/Cardinals.h>
#include <X11/Xaw/Dialog.h>
#include <X11/Xaw/MenuButton.h>
#include <X11/Xaw/SimpleMenu.h>
#include <X11/Xaw/Sme.h>
#include <X11/Xaw/SmeBSB.h>

#include <mit-copyright.h>



extern XtAppContext  app_con;


void
stat_update(w, data, closure)   /* don't use these args */
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  float f;
  int i;

  do_update_status();

  for(i = 0; i < nints; i++)
    {
      f = (float) interface[i].gage.status/interface[i].speed;
      XawScrollbarSetThumb(interface[i].gage.widget, 0.0, f);
    }
  XtAppAddTimeOut(app_con, update * 1000, stat_update, NULL);
  redraw();
}


void 
set_interface(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  struct   _interface *i;
  Arg       args[3];
  caddr_t   d;
  Dimension width;
  int       state;

  if(protect)
    {
      redraw();
      return;
    }

  i = (struct _interface *) data;
  state = i->admin.status;
  XtSetArg(args[0], XtNwidth, (XtArgVal) &width);
  XtGetValues(w, args, 1);
  if(state == 0)
    state = 1;
  else
    state = 2;
  vIfAdminStatus.cmp[vIfAdminStatus.ncmp - 1] = i->index + 1;
  make_snmp_set(&vIfAdminStatus, &state, INT);  
  d = make_snmp_query(&vIfAdminStatus);  
  bcopy(d, &(i->admin.status), sizeof(i->admin.status));
  redraw();
  if(i->admin.status == 2)
    {
      XWarpPointer(XtDisplay(w), XtWindow(w), None, 0, 0, 0, 0, 
		   width+16, 0);		
      explode(w, NULL);
      i->admin.status = 0;
    }
  redraw();
  return;
}



void 
restore_toggle(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  redraw();
  return;
}


void
stat_ip(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  char        *stats;
  char        line[BUFSIZ];

  sprintf(line, "IP statistics");
  stats     = do_ip_stats();
  make_text_popup(data, line, stats);
  return;
}


void
stat_icmp(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  char        *stats;
  char        line[BUFSIZ];

  sprintf(line, "ICMP statistics");
  stats     = do_icmp_stats();
  make_text_popup(data, line, stats);
  return;
}


void
stat_udp(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  char        *stats;
  char        line[BUFSIZ];

  sprintf(line, "UDP statistics");
  stats     = do_udp_stats();
  make_text_popup(data, line, stats);
  return;
}


void
stat_tcp(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  char        *stats;
  char        line[BUFSIZ];

  sprintf(line, "TCP statistics");
  stats     = do_tcp_stats();
  make_text_popup(data, line, stats);
  return;
}


void
stat_memory(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  char        *stats;
  char        line[BUFSIZ];

  sprintf(line, "Memory statistics");
  stats     = do_cisco_memory();
  make_text_popup(data, line, stats);
  return;
}




void
stat_interface(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  char        *stats;
  char        line[BUFSIZ];
  struct      _interface *i;

  i         = (struct _interface *) data;
  stats     = do_interface_stats(i->index + 1);
  sprintf(line, "Interface %d (%s/%d.%d.%d.%d)", i->index, i->descr,
	  i->addr[0], i->addr[1], i->addr[2], i->addr[3]);

  make_text_popup(i->oper.widget, line, stats);
  return;
}



void
stat_address(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  char        *stats;
  char        line[BUFSIZ];
  struct      _interface *i;

  i         = (struct _interface *) data;
  stats     = do_address_stats(i->index + 1);
  sprintf(line, "Interface %d (%s/%d.%d.%d.%d)", i->index, i->descr,
	  i->addr[0], i->addr[1], i->addr[2], i->addr[3]);
  make_text_popup(i->oper.widget, line, stats);
  return;
}


void
stat_ifstats(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  char        *stats;
  char        line[BUFSIZ];
  struct      _interface *i;

  i         = (struct _interface *) data;
  stats     = do_ifstats(i->index + 1);
  sprintf(line, "Interface %d (%s/%d.%d.%d.%d)", i->index, i->descr,
	  i->addr[0], i->addr[1], i->addr[2], i->addr[3]);
  make_text_popup(i->oper.widget, line, stats);
  return;
}


void
stat_ifaddr(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  char        *stats;
  char        line[BUFSIZ];
  struct      _interface *i;

  i         = (struct _interface *) data;
  stats     = do_ifaddr(i->index + 1);
  sprintf(line, "Interface %d (%s/%d.%d.%d.%d)", i->index, i->descr,
	  i->addr[0], i->addr[1], i->addr[2], i->addr[3]);
  make_text_popup(i->oper.widget, line, stats);
  return;
}


void
stat_ifroute(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  char        *stats;
  char        line[BUFSIZ];
  struct      _interface *i;

  i         = (struct _interface *) data;
  stats     = do_ifroute(i->index + 1);
  sprintf(line, "Interface %d (%s/%d.%d.%d.%d)", i->index, i->descr,
	  i->addr[0], i->addr[1], i->addr[2], i->addr[3]);
  make_text_popup(i->oper.widget, line, stats);
  return;
}



void
stat_ifmisc(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  char        *stats;
  char        line[BUFSIZ];
  struct      _interface *i;

  i         = (struct _interface *) data;
  stats     = do_ifmisc(i->index + 1);
  sprintf(line, "Interface %d (%s/%d.%d.%d.%d)", i->index, i->descr,
	  i->addr[0], i->addr[1], i->addr[2], i->addr[3]);
  make_text_popup(i->oper.widget, line, stats);
  return;
}



void
info_boot(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  char        *stats;
  char        line[BUFSIZ];

  sprintf(line, "Configuration info");
  stats     = do_cisco_boot_info();
  make_text_popup(data, line, stats);
  return;
}



void
info_author(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  make_label_popup(data);
  return;
}



void 
set_protect(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  if(protect)
    {
      protect = 0;
      uncheck_menu(w);
    }
  else
    {
      protect = 1;
      check_menu(w);
    }
}



void
change_community(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  make_prompt_popup(data, "community name:", community, 
		    really_change_community);
  return;
}



void
really_change_community(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  char *nc = XawDialogGetValueString(data);

  if(community)
    free(community);

  if((community = (char *) malloc((strlen(nc) + 1) * sizeof(char))) == 
     (char *) NULL)
    return;

  strcpy(community, nc);
  XtDestroyWidget(XtParent((Widget) data));
  return;
}
  
    

void
save_text(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  make_prompt_popup(w, "filename:", "", really_save_text);
  return;
}



void
really_save_text(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  Widget parent  = XtParent((Widget) data);
  String cname   = XawDialogGetValueString(data);
  
/*
  if(XawAsciiSaveAsFile(data, cname))*/
    XtDestroyWidget(parent);
  
  return;
}
 



void 
change_update(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  char value[16];

  sprintf(value, "%d", update);
  make_number_popup(data, "update interval:", value, really_change_update_box);
  return;
}





void
increment_number(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  String cname   = XawDialogGetValueString(data);
  Arg args[1];
  char value[16];
  int n;

  if(!isnumber(cname))
    {
      XBell(XtDisplay(w), 0);
      return;
    }

  n = atoi(cname) + 1;
  sprintf(value, "%d", n);
  XtSetArg(args[0], XtNvalue, value);
  XtSetValues(data, args, 1);
  return;
}



void
decrement_number(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  String cname   = XawDialogGetValueString(data);
  Arg args[1];
  char value[16];
  int n;

  if(!isnumber(cname))
    {
      XBell(XtDisplay(w), 0);
      return;
    }

  n = atoi(cname);
  if(n <= 10)
    {
      XBell(XtDisplay(w), 0);
      return;
    }
  --n;
  sprintf(value, "%d", n);
  XtSetArg(args[0], XtNvalue, value);
  XtSetValues(data, args, 1);
  return;
}




void
really_change_update_box(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  Widget parent  = XtParent((Widget) data);
  String cname   = XawDialogGetValueString(data);
  int n;

  if(!isnumber(cname))
    {
      XBell(XtDisplay(w), 0);
      return;
    }

  n = atoi(cname);
  if(n < 10)
    {
      XBell(XtDisplay(w), 0);
      return;
    }
  update = n;

  stat_update(w, data, closure);
  XtDestroyWidget(parent);
}



void 
destroy_widget(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  XtDestroyWidget((Widget) data);
}




void 
quit(w, data, closure)
     Widget w;
     caddr_t data;
     caddr_t closure;
{
  exit(0);
}

