/*
* TCPVIEW
*
* Author: Martin Hunt
* Networks and Distributed Computing
* Computing & Communications
* University of Washington
* Administration Building, AG-44
* Seattle, WA 98195
* Internet: martinh@cac.washington.edu
*
*
* Copyright 1992 by the University of Washington
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose and without fee is hereby granted, provided
* that the above copyright notice appears in all copies and that both the
* above copyright notice and this permission notice appear in supporting
* documentation, and that the name of the University of Washington not be
* used in advertising or publicity pertaining to distribution of the software
* without specific, written prior permission. This software is made
* available "as is", and
* THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
* WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN
* NO EVENT SHALL THE UNIVERSITY OF WASHINGTON BE LIABLE FOR ANY SPECIAL,
* INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT
* (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
*/
#ifndef lint
static char rcsid[] =
"@(#) $Header: /usr/staff/martinh/tcpview/RCS/dialogs.c,v 1.1 1993/04/22 20:18:20 martinh Exp $ (UW)";
#endif
#include <stdio.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <Xm/Xm.h>
#include <Xm/Frame.h>
#include <Xm/MessageB.h>
#include <Xm/RowColumn.h>
#include <Xm/SeparatoG.h>
#include <Xm/ToggleB.h>
#include <Xm/BulletinB.h>
#include <Xm/TextF.h>
#include <Xm/Form.h>
#include "tcpview.h"
#include "motif.h"
void generic_callback();
static void timea_callback(), timer_callback(), timed_callback();
static void times_callback(), timen_callback(), line_callback();
static void addr1_callback(), addr2_callback(), addr3_callback(), addr4_callback();
static void verbose_callback(), brief_callback(), seq_callback(), dlc_callback();
static Widget bb_widget, text_widget;
#ifdef __STDC__
void savefile( char *, Boolean , u_short );
void printfile( char *, Boolean , u_short );
#else
void savefile();
void printfile();
#endif
extern char FileName1[];
char PrintName[128];
static Boolean SaveAll=False;
static u_short Filetype = 0;
static Boolean Print2File=False;
/* these are temporary flags */
static int nfl, Nfl, qfl, vfl, Sfl, efl, tfl;
static u_short Line_Fl, Man_Fl;
extern u_long Current_Packets, Packet_Count;
static
void save_callback( widget, name, call_data )
Widget widget;
char *name;
caddr_t call_data;
{
char *string;
string = XmTextFieldGetString(text_widget);
XtUnrealizeWidget( bb_widget );
savefile( string, SaveAll, Filetype );
SaveAll = False;
XtFree(string);
} /* save_callback */
static
void print_callback( widget, name, call_data )
Widget widget;
char *name;
caddr_t call_data;
{
char *filename, str[128];
extern char PrintCommand[];
if( Print2File )
filename = XmTextFieldGetString(text_widget);
else
filename = tmpnam(NULL);
XtUnrealizeWidget( bb_widget );
printfile( filename, SaveAll, Filetype );
if( Print2File == False ) {
sprintf( str, "%s %s",PrintCommand, filename );
system( str );
unlink( filename );
}
SaveAll = False;
XtFree(filename);
} /* print_callback */
static
void tog_callback( widget, data, call_data )
Widget widget;
caddr_t data;
caddr_t call_data;
{
int i = (int)data;
switch(i) {
case 0:
SaveAll = False;
break;
case 1:
SaveAll = True;
break;
case 2:
Filetype = 0;
break;
case 3:
Filetype = 1;
break;
case 4:
if( Print2File==True )
Print2File = False;
else
Print2File = True;
}
} /* tog_callback */
static void sumopts_callback( widget, name, call_data )
Widget widget;
char *name;
caddr_t call_data;
{
void redisplay_current_list();
XtUnrealizeWidget( bb_widget );
/* set flags with their temporary values */
tflag = tfl; eflag = efl; vflag = vfl; nflag = nfl;
Nflag = Nfl; Sflag = Sfl; Line_Flag = Line_Fl;
Man_Flag = Man_Fl;
/* rescan list and display */
redisplay_current_list();
}
static void cancel_callback( widget, name, call_data )
Widget widget;
char *name;
caddr_t call_data;
{
XtUnrealizeWidget( bb_widget );
}
/*
** SaveDialog() creates the dialog displayed when "Save"
** is selected.
*/
void SaveDialog (parent, name, callback)
Widget parent;
char *name;
void (*callback)();
{
Widget pack_label, main_row, row, ok, cancel, help;
Widget frame1, frame2, rc1, rc2, form;
Arg args[10];
int n;
char buf[30];
n=0;
XtSetArg( args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL ); n++;
bb_widget = XmCreateBulletinBoardDialog (parent,"save",args,n);
n = 0;
XtSetArg( args[n], XmNorientation, XmVERTICAL ); n++;
main_row = XmCreateRowColumn( bb_widget,"main",args,n);
XtManageChild( main_row );
sprintf(buf,"%d packets selected out of %d",Current_Packets,Packet_Count);
n=0;
pack_label = CreateLabelWidget (main_row,"save_packets",buf,args,n);
n = 0;
XtSetArg( args[n], XmNorientation, XmHORIZONTAL ); n++;
XtSetArg( args[n], XmNpacking, XmPACK_COLUMN ); n++;
row = XmCreateRowColumn( main_row,"row",args,n);
XtManageChild( row );
/* make a frame */
n=0;
XtSetArg ( args[n], XmNshadowThickness, 4 ); n++;
frame1 = XmCreateFrame (row,"frame",args,n);
XtManageChild(frame1);
/* create a radio box to hold toggle buttons */
rc1 = CreateRadioBox (frame1, "options");
/* create toggles */
(void)CreateSimpleToggle (rc1, "Filtered",!SaveAll,XmONE_OF_MANY,
tog_callback,(caddr_t)0);
(void)CreateSimpleToggle (rc1,"All",SaveAll,XmONE_OF_MANY,
tog_callback,(caddr_t)1);
XtManageChild(rc1);
/* create another frame */
n=0;
XtSetArg ( args[n], XmNshadowThickness, 4 ); n++;
frame2 = XmCreateFrame (row,"frame",args,n);
XtManageChild(frame2);
/* create a radio box to hold toggle buttons */
rc2 = CreateRadioBox (frame2, "options");
/* create toggles */
CreateSimpleToggle (rc2, "Sniffer Format",(Filetype==0)?True:False,
XmONE_OF_MANY,tog_callback,(caddr_t)2);
CreateSimpleToggle (rc2, "TCPDUMP Format",(Filetype==1)?True:False,
XmONE_OF_MANY,tog_callback,(caddr_t)3);
XtManageChild(rc2);
n=0;
(void)CreateLabelWidget (main_row,"","Filename:",args,n);
/* make a textfield to hold filename */
n=0;
if( *FileName1 ) {
XtSetArg ( args[n], XmNvalue, FileName1 ); n++;
XtSetArg ( args[n], XmNcursorPosition, strlen(FileName1) ); n++;
}
text_widget = XmCreateTextField(main_row,"text",args,n);
XtManageChild(text_widget);
/* create a form to hold OK, Cancel, and Help buttons */
n = 0;
form = XtCreateManagedWidget("buttons",
xmFormWidgetClass,main_row,args,n);
/* create 'OK' pushbutton */
n = 0;
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
XtSetArg (args[n], XmNrightPosition, 30); n++;
ok = CreatePushButton( form, "OK", "OK" ,args, n, save_callback );
/* Set OK button as default */
BulletinDefaultButton( bb_widget, ok );
/* create 'Cancel' pushbutton */
n = 0;
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
XtSetArg (args[n], XmNleftPosition, 35); n++;
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
XtSetArg (args[n], XmNrightPosition, 65); n++;
cancel = CreatePushButton( form, "Cancel", "Cancel", args, n,
cancel_callback );
/* create 'Help' pushbutton */
n = 0;
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
XtSetArg (args[n], XmNleftPosition, 70); n++;
help = CreatePushButton( form, "Help", "Help", args, n, generic_callback );
/* turn off 'Help' pushbutton for now */
XtSetSensitive( help, False );
XtManageChild(form);
XtManageChild( bb_widget );
}
void SummaryOptionDialog (parent, name, callback)
Widget parent;
char *name;
void (*callback)();
{
Widget frame1, frame2, tog_row, main_row, form;
Widget rc1, rc2, help, cancel, ok, add_label, col1;
int n;
Arg args[10];
tfl = tflag; efl = eflag; vfl = vflag; nfl = nflag; Man_Fl = Man_Flag;
Nfl = Nflag; Sfl = Sflag; Line_Fl = Line_Flag;
n=0;
XtSetArg( args[n], XmNautoUnmanage, False ); n++;
XtSetArg( args[n], XmNnoResize, True ); n++;
XtSetArg( args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL ); n++;
bb_widget = XmCreateBulletinBoardDialog (parent,"sumopts",args,n);
n = 0;
XtSetArg( args[n], XmNorientation, XmVERTICAL ); n++;
main_row = XmCreateRowColumn( bb_widget,"main",args,n);
XtManageChild( main_row );
n = 0;
XtSetArg( args[n], XmNorientation, XmHORIZONTAL ); n++;
XtSetArg( args[n], XmNpacking, XmPACK_COLUMN ); n++;
tog_row = XmCreateRowColumn( main_row,"sumopts_row",args,n);
XtManageChild( tog_row );
/* make a frame */
n=0;
XtSetArg ( args[n], XmNshadowThickness, 4 ); n++;
frame1 = XmCreateFrame (tog_row,"frame",args,n);
XtManageChild(frame1);
n = 0;
XtSetArg( args[n], XmNorientation, XmVERTICAL ); n++;
col1 = XmCreateRowColumn( frame1,"col1",args,n);
n=0;
XtSetArg( args[n], XmNalignment, XmALIGNMENT_CENTER ); n++;
add_label = CreateLabelWidget (col1,"addopt","ADDRESS OPTIONS",args,n);
/* create a radio box to hold toggle buttons */
rc1 = CreateRadioBox (col1, "addroptions");
/* create toggles */
(void)CreateToggle (rc1, "name","Name (from DNS or host table)",
nfl?False:True,XmONE_OF_MANY,addr1_callback);
(void)CreateToggle (rc1, "numerical","Number (IP or DLC)",nfl,
XmONE_OF_MANY,addr2_callback);
XtManageChild(rc1);
/* create toggles */
(void)CreateSimpleToggle (col1, "Use full domain name",
Nfl?False:True,XmN_OF_MANY,addr3_callback,(caddr_t)0);
(void)CreateSimpleToggle (col1, "Use manuf. name in DLC addresses",Man_Fl,
XmN_OF_MANY,addr4_callback,(caddr_t)0);
XtManageChild( col1 );
/* Now do the time options */
/* create another frame */
n=0;
XtSetArg ( args[n], XmNshadowThickness, 4 ); n++;
frame2 = XmCreateFrame (tog_row,"frame",args,n);
XtManageChild(frame2);
n = 0;
XtSetArg( args[n], XmNorientation, XmVERTICAL ); n++;
col1 = XmCreateRowColumn( frame2,"col1",args,n);
n=0;
XtSetArg( args[n], XmNalignment, XmALIGNMENT_CENTER ); n++;
(void)CreateLabelWidget (col1,"timeopt"," TIME OPTIONS",args,n);
/* create a rowcolumn to hold toggle buttons */
n = 0;
XtSetArg( args[n], XmNorientation, XmVERTICAL ); n++;
XtSetArg( args[n], XmNnumColumns, 2 ); n++;
rc2 = XmCreateRadioBox( col1,"timecol",args,n);
/* create toggles */
(void)CreateSimpleToggle (rc2, "Absolute",tfl==0?True:False,
XmONE_OF_MANY,timea_callback,(caddr_t)0);
(void)CreateSimpleToggle (rc2, "Delta",tfl==3?True:False,
XmONE_OF_MANY,timed_callback,(caddr_t)0);
(void)CreateSimpleToggle (rc2, "None", tfl==1?True:False,
XmONE_OF_MANY,timen_callback,(caddr_t)0);
(void)CreateSimpleToggle (rc2, "Unix Timestamp",tfl==2?True:False,
XmONE_OF_MANY,times_callback,(caddr_t)0);
(void)CreateSimpleToggle (rc2, "Relative",tfl==4?True:False,
XmONE_OF_MANY,timer_callback,(caddr_t)0);
XtManageChild(rc2);
XtManageChild(col1);
/* make a frame */
n=0;
XtSetArg ( args[n], XmNshadowThickness, 4 ); n++;
frame1 = XmCreateFrame (main_row,"frame",args,n);
XtManageChild(frame1);
/* put a row-column in frame */
n = 0;
XtSetArg( args[n], XmNorientation, XmVERTICAL ); n++;
XtSetArg( args[n], XmNpacking, XmPACK_COLUMN ); n++;
XtSetArg( args[n], XmNnumColumns, 2 ); n++;
col1 = XmCreateRowColumn( frame1,"col1",args,n);
/* create toggles */
(void)CreateSimpleToggle (col1, "Verbose",vfl,XmN_OF_MANY,verbose_callback,(caddr_t)0);
(void)CreateSimpleToggle (col1, "Brief",qfl,XmN_OF_MANY,brief_callback,(caddr_t)0);
(void)CreateSimpleToggle (col1, "Display DLC header",efl,XmN_OF_MANY,dlc_callback,(caddr_t)0);
(void)CreateSimpleToggle (col1, "Use relative TCP sequence numbers",!Sfl,XmN_OF_MANY,seq_callback,(caddr_t)0);
(void)CreateSimpleToggle (col1, "Display line numbers", Line_Fl,XmN_OF_MANY, line_callback,(caddr_t)0);
XtManageChild( col1 );
/* create a form to hold OK, Cancel, and Help buttons */
n = 0;
form = XtCreateManagedWidget("buttons",
xmFormWidgetClass,main_row,args,n);
/* create 'OK' pushbutton */
n = 0;
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
XtSetArg (args[n], XmNrightPosition, 30); n++;
ok = CreatePushButton( form, "OK", "OK",args, n, sumopts_callback );
/* Set OK button as default */
BulletinDefaultButton( bb_widget, ok );
/* create 'Cancel' pushbutton */
n = 0;
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
XtSetArg (args[n], XmNleftPosition, 35); n++;
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
XtSetArg (args[n], XmNrightPosition, 65); n++;
cancel = CreatePushButton( form, "Cancel", "Cancel",args, n, cancel_callback );
/* create 'Help' pushbutton */
n = 0;
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
XtSetArg (args[n], XmNleftPosition, 70); n++;
help = CreatePushButton( form, "Help", "Help",args, n, generic_callback );
/* turn off 'Help' pushbutton for now */
XtSetSensitive( help, False );
XtManageChild( form );
XtManageChild( bb_widget );
}
static void timea_callback( widget, name, x )
Widget widget;
char *name;
XmToggleButtonCallbackStruct *x;
{
tfl = 0;
}
static void timer_callback( widget, name, x )
Widget widget;
char *name;
XmToggleButtonCallbackStruct *x;
{
tfl = 4;
}
static void timed_callback( widget, name, x )
Widget widget;
char *name;
XmToggleButtonCallbackStruct *x;
{
tfl = 3;
}
static void times_callback( widget, name, x )
Widget widget;
char *name;
XmToggleButtonCallbackStruct *x;
{
tfl = 2;
}
static void timen_callback( widget, name, x )
Widget widget;
char *name;
XmToggleButtonCallbackStruct *x;
{
tfl = 1;
}
static void addr1_callback( widget, name, call_data )
Widget widget;
char *name;
caddr_t call_data;
{
nfl = 0;
}
static void addr2_callback( widget, name, call_data )
Widget widget;
char *name;
caddr_t call_data;
{
nfl = 1;
}
static void addr3_callback( widget, name, x )
Widget widget;
char *name;
XmToggleButtonCallbackStruct *x;
{
if(Nfl)
Nfl = 0;
else
Nfl = 1;
}
static void addr4_callback( widget, name, x )
Widget widget;
char *name;
XmToggleButtonCallbackStruct *x;
{
if(Man_Fl)
Man_Fl = 0;
else
Man_Fl = 1;
}
static void verbose_callback( widget, name, call_data )
Widget widget;
caddr_t name, call_data;
{
if(vfl)
vfl = 0;
else
vfl = 1;
}
static void brief_callback( widget, name, call_data )
Widget widget;
caddr_t name, call_data;
{
if(qfl)
qfl = 0;
else
qfl = 1;
}
static void dlc_callback( widget, name, call_data )
Widget widget;
char *name;
caddr_t call_data;
{
if(efl)
efl = 0;
else
efl = 1;
}
static void seq_callback( widget, name, call_data )
Widget widget;
char *name;
caddr_t call_data;
{
if(Sfl)
Sfl = 0;
else
Sfl = 1;
}
static void line_callback( widget, name, call_data )
Widget widget;
char *name;
caddr_t call_data;
{
if(Line_Fl)
Line_Fl = 0;
else
Line_Fl = 1;
}
void PrintDialog (parent, name, callback)
Widget parent;
char *name;
void (*callback)();
{
Widget pack_label, main_row, row, ok, cancel, help;
Widget frame1, frame2, rc1, rc2, form;
Arg args[10];
int n;
char buf[30];
n=0;
XtSetArg( args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL ); n++;
bb_widget = XmCreateBulletinBoardDialog (parent,"save",args,n);
n = 0;
XtSetArg( args[n], XmNorientation, XmVERTICAL ); n++;
main_row = XmCreateRowColumn( bb_widget,"main",args,n);
XtManageChild( main_row );
sprintf(buf,"%d packets selected out of %d",Current_Packets,Packet_Count);
n=0;
pack_label = CreateLabelWidget (main_row,"save_packets",buf,args,n);
n = 0;
XtSetArg( args[n], XmNorientation, XmHORIZONTAL ); n++;
XtSetArg( args[n], XmNpacking, XmPACK_COLUMN ); n++;
row = XmCreateRowColumn( main_row,"row",args,n);
XtManageChild( row );
/* make a frame */
n=0;
XtSetArg ( args[n], XmNshadowThickness, 4 ); n++;
frame1 = XmCreateFrame (row,"frame",args,n);
XtManageChild(frame1);
/* create a radio box to hold toggle buttons */
rc1 = CreateRadioBox (frame1, "options");
/* create toggles */
CreateSimpleToggle (rc1, "Filtered",!SaveAll,XmONE_OF_MANY,tog_callback,(caddr_t)0);
CreateSimpleToggle (rc1, "All",SaveAll,XmONE_OF_MANY,tog_callback,(caddr_t)1);
XtManageChild(rc1);
/* create another frame */
n=0;
XtSetArg ( args[n], XmNshadowThickness, 4 ); n++;
frame2 = XmCreateFrame (row,"frame",args,n);
XtManageChild(frame2);
/* create a radiobox to hold toggle buttons */
rc2 = CreateRadioBox (frame2, "options");
Filetype = 0;
/* create toggles */
CreateSimpleToggle (rc2, "Summary",!Filetype,XmONE_OF_MANY,tog_callback,(caddr_t)2);
CreateSimpleToggle (rc2, "Detail",Filetype,XmONE_OF_MANY,tog_callback,(caddr_t)3);
XtManageChild(rc2);
n=0;
/* pack_label = CreateLabelWidget (main_row,"save_packets","Print to file: ",args,n); */
CreateSimpleToggle(main_row,"Print to File",Print2File,
XmN_OF_MANY,tog_callback,(caddr_t)4);
/* make a textfield to hold filename */
n=0;
if( PrintName[0] != '\0' ) {
XtSetArg ( args[n], XmNvalue, PrintName ), n++;
XtSetArg ( args[n], XmNcursorPosition, strlen(PrintName) ); n++;
}
text_widget = XmCreateTextField(main_row,"text",args,n);
XtManageChild(text_widget);
/* create a form to hold OK, Cancel, and Help buttons */
n = 0;
form = XtCreateManagedWidget("buttons",xmFormWidgetClass,main_row,args,n);
/* create 'OK' pushbutton */
n = 0;
/* XtSetArg( args[n], XmNshowAsDefault, 1 ); n++; */
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
XtSetArg (args[n], XmNrightPosition, 30); n++;
ok = CreatePushButton( form, "OK", "OK" ,args, n, print_callback );
/* Set OK button as default */
BulletinDefaultButton( bb_widget, ok );
/* create 'Cancel' pushbutton */
n = 0;
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
XtSetArg (args[n], XmNleftPosition, 35); n++;
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
XtSetArg (args[n], XmNrightPosition, 65); n++;
cancel = CreatePushButton( form, "Cancel", "Cancel", args, n,
cancel_callback );
/* create 'Help' pushbutton */
n = 0;
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
XtSetArg (args[n], XmNleftPosition, 70); n++;
help = CreatePushButton( form, "Help", "Help", args, n, generic_callback );
/* turn off 'Help' pushbutton for now */
XtSetSensitive( help, False );
XtManageChild(form);
XtManageChild( bb_widget );
}
void AboutDialog (parent, name, callback)
Widget parent;
char *name;
void (*callback)();
{
extern char tcpview_version[];
char buf[256];
XmString ms, Str2XmString();
int n;
Arg a[4];
Widget widget;
sprintf(buf,"TCPVIEW version %s\n\nBy Martin M. Hunt\nmartinh@cac.washington.edu\nUniversity of Washington\nNetworks and Distributed Computing",tcpview_version);
ms = Str2XmString(buf);
n=0;
XtSetArg( a[n], XmNmessageString, ms ); n++;
widget = XmCreateInformationDialog(parent, "About", a, n );
RemoveDialButton( widget, XmDIALOG_CANCEL_BUTTON );
RemoveDialButton( widget, XmDIALOG_HELP_BUTTON );
XtManageChild(widget);
XmStringFree(ms);
}
syntax highlighted by Code2HTML, v. 0.9.1