Sort each conversation column numerically. Fix up whitespace.
It looks like we can't put "COPYCMD=/Y" in config.nmake and expect nmake to do the right thing. Add a comment, and set COPYCMD explicitly in the root Makefile.nmake. The rest of the occurrences of xcopy will have to be taken care of at some point. svn path=/trunk/; revision=15840
This commit is contained in:
parent
092c0c20ed
commit
33cfe1725a
|
@ -360,6 +360,7 @@ gtk:: help config.h svnversion.h AUTHORS-SHORT doxygen
|
|||
gtk2:: help config.h svnversion.h AUTHORS-SHORT
|
||||
if not exist gtk2.tmp mkdir gtk2.tmp
|
||||
cd gtk
|
||||
set copycmd=/y
|
||||
xcopy Makefile.* ..\gtk2.tmp /d
|
||||
xcopy *.c ..\gtk2.tmp /d
|
||||
xcopy *.h ..\gtk2.tmp /d
|
||||
|
@ -532,6 +533,7 @@ install-deps: clean-deps install-gtk1-deps install-gtk2-deps
|
|||
|
||||
install-gtk2-deps: install-required-deps
|
||||
!IFDEF GTK2_DIR
|
||||
set copycmd=/y
|
||||
xcopy $(GTK2_DIR)\bin\libgdk-win32-2.0-0.dll . /d
|
||||
xcopy $(GTK2_DIR)\bin\libgdk_pixbuf-2.0-0.dll . /d
|
||||
xcopy $(GTK2_DIR)\bin\libgtk-win32-2.0-0.dll . /d
|
||||
|
@ -558,11 +560,13 @@ install-gtk2-deps: install-required-deps
|
|||
|
||||
install-gtk1-deps: install-required-deps
|
||||
!IFDEF GTK1_DIR
|
||||
set copycmd=/y
|
||||
xcopy $(GTK1_DIR)\lib\libgtk-0.dll . /d
|
||||
xcopy $(GTK1_DIR)\lib\libgdk-0.dll . /d
|
||||
!ENDIF
|
||||
|
||||
install-required-deps:
|
||||
set copycmd=/y
|
||||
xcopy wiretap\wiretap-$(WTAP_VERSION).dll . /d
|
||||
!IFDEF ENABLE_LIBETHEREAL
|
||||
xcopy epan\libethereal.dll . /d
|
||||
|
|
|
@ -240,7 +240,10 @@ MAKENSIS_MODERN_UI=USE
|
|||
# According to http://bugs.ethereal.com/bugzilla/show_bug.cgi?id=403
|
||||
# XCOPY under Windows NT doesn't support the "/Y" flag. This works
|
||||
# around that bug.
|
||||
COPYCMD=/Y
|
||||
# XXX - This apparently doesn't work for some versions of nmake:
|
||||
# http://support.microsoft.com/default.aspx?scid=kb;en-us;86814
|
||||
# It looks like we'll have to call "set copycmd=/y" before we run xcopy.
|
||||
COPYCMD=/y
|
||||
|
||||
# If you don't want to build libethereal.dll, you should comment out the
|
||||
# following line. (Note: for plugin support this option must stay activated)
|
||||
|
@ -361,4 +364,4 @@ LIBETHEREAL_CONFIG=
|
|||
!ENDIF
|
||||
|
||||
# Construct the path
|
||||
PATH=$(PATH);$(CYGWIN_PATH);$(DLL_PATH);$(ZLIB_PATH);$(ADNS_PATH)
|
||||
PATH=$(PATH);$(CYGWIN_PATH);$(DLL_PATH);$(ZLIB_PATH);$(ADNS_PATH)
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
|
||||
#include <epan/packet_info.h>
|
||||
#include <epan/to_str.h>
|
||||
#include <epan/address.h>
|
||||
#include <epan/addr_resolv.h>
|
||||
#include <epan/tap.h>
|
||||
|
||||
|
@ -62,7 +63,15 @@
|
|||
#define GTK_MENU_FUNC(a) ((GtkItemFactoryCallback)(a))
|
||||
|
||||
#define NUM_COLS 10
|
||||
#define CONV_PTR_KEY "conversations-pointer"
|
||||
|
||||
#define CMP_INT(i1, i2) \
|
||||
if ((i1) > (i2)) \
|
||||
return 1; \
|
||||
else if ((i1) < (i2)) \
|
||||
return -1; \
|
||||
else \
|
||||
return 0;
|
||||
|
||||
/* convert a port number into a string */
|
||||
static char *
|
||||
|
@ -257,7 +266,7 @@ reset_ct_table_data(conversations_table *ct)
|
|||
{
|
||||
guint32 i;
|
||||
char title[256];
|
||||
|
||||
|
||||
/* Allow clist to update */
|
||||
gtk_clist_thaw(ct->table);
|
||||
|
||||
|
@ -311,44 +320,50 @@ ct_win_destroy_cb(GtkWindow *win _U_, gpointer data)
|
|||
static gint
|
||||
ct_sort_column(GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2)
|
||||
{
|
||||
char *text1 = NULL;
|
||||
char *text2 = NULL;
|
||||
guint64 i1, i2;
|
||||
guint32 idx1, idx2;
|
||||
conversations_table *ct = OBJECT_GET_DATA(clist, CONV_PTR_KEY);
|
||||
conversation_t *conv1 = NULL;
|
||||
conversation_t *conv2 = NULL;
|
||||
|
||||
const GtkCListRow *row1 = ptr1;
|
||||
const GtkCListRow *row2 = ptr2;
|
||||
|
||||
text1 = GTK_CELL_TEXT (row1->cell[clist->sort_column])->text;
|
||||
text2 = GTK_CELL_TEXT (row2->cell[clist->sort_column])->text;
|
||||
idx1 = GPOINTER_TO_INT(row1->data);
|
||||
idx2 = GPOINTER_TO_INT(row2->data);
|
||||
|
||||
if (!ct || idx1 >= ct->num_conversations || idx2 >= ct->num_conversations)
|
||||
return 0;
|
||||
|
||||
conv1 = &ct->conversations[idx1];
|
||||
conv2 = &ct->conversations[idx2];
|
||||
|
||||
switch(clist->sort_column){
|
||||
case 0:
|
||||
case 2:
|
||||
/* Addresses */
|
||||
/* XXX - We should sort addresses numerically. */
|
||||
return strcmp (text1, text2);
|
||||
case 1:
|
||||
case 3:
|
||||
/* Ports */
|
||||
/* If we have two numbers, do a numeric compare. Otherwise,
|
||||
* use strcmp. */
|
||||
if (text1 && text2 && isdigit(text1[0]) && isdigit(text2[0])) {
|
||||
sscanf(text1, "%" PRIu64, &i1);
|
||||
sscanf(text2, "%" PRIu64, &i2);
|
||||
/* XXX - See overflow comment below */
|
||||
return (gint) (i1-i2);
|
||||
} else {
|
||||
return strcmp (text1, text2);
|
||||
}
|
||||
case 0: /* Source address */
|
||||
return(CMP_ADDRESS(&conv1->src_address, &conv2->src_address));
|
||||
case 2: /* Destination address */
|
||||
return(CMP_ADDRESS(&conv1->dst_address, &conv2->dst_address));
|
||||
case 1: /* Source port */
|
||||
CMP_INT(conv1->src_port, conv2->src_port);
|
||||
case 3: /* Destination port */
|
||||
CMP_INT(conv1->dst_port, conv2->dst_port);
|
||||
case 4: /* Packets */
|
||||
CMP_INT(conv1->tx_frames+conv1->rx_frames,
|
||||
conv2->tx_frames+conv2->rx_frames);
|
||||
case 5: /* Bytes */
|
||||
CMP_INT(conv1->tx_bytes+conv1->rx_bytes,
|
||||
conv2->tx_bytes+conv2->rx_bytes);
|
||||
case 6: /* Packets A->B */
|
||||
CMP_INT(conv1->tx_frames, conv2->tx_frames);
|
||||
case 7: /* Bytes A->B */
|
||||
CMP_INT(conv1->tx_bytes, conv2->tx_bytes);
|
||||
case 8: /* Packets A<-B */
|
||||
CMP_INT(conv1->rx_frames, conv2->rx_frames);
|
||||
case 9: /* Bytes A<-B */
|
||||
CMP_INT(conv1->rx_bytes, conv2->rx_bytes);
|
||||
default:
|
||||
sscanf(text1, "%" PRIu64, &i1);
|
||||
sscanf(text2, "%" PRIu64, &i2);
|
||||
/* XXX - this might cause trouble because of overflow problems */
|
||||
/* XXX - is this correct anyway? Subtracting two unsigned values will still be an unsigned value, which will never become negative */
|
||||
return (gint) (i1-i2);
|
||||
g_assert_not_reached();
|
||||
}
|
||||
g_assert_not_reached();
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -373,8 +388,8 @@ ct_click_column_cb(GtkCList *clist, gint column, gpointer data)
|
|||
gtk_widget_show(col_arrows[column].ascend_pm);
|
||||
}
|
||||
} else {
|
||||
clist->sort_type = GTK_SORT_DESCENDING;
|
||||
gtk_widget_show(col_arrows[column].descend_pm);
|
||||
clist->sort_type = GTK_SORT_ASCENDING;
|
||||
gtk_widget_show(col_arrows[column].ascend_pm);
|
||||
gtk_clist_set_sort_column(clist, column);
|
||||
}
|
||||
|
||||
|
@ -1101,9 +1116,9 @@ draw_ct_table_data(conversations_table *ct)
|
|||
gtk_clist_set_text(ct->table, j, 9, str);
|
||||
|
||||
}
|
||||
|
||||
|
||||
draw_ct_table_addresses(ct);
|
||||
|
||||
|
||||
gtk_clist_sort(ct->table);
|
||||
|
||||
/* Allow table to redraw */
|
||||
|
@ -1121,13 +1136,13 @@ draw_ct_table_data_cb(void *arg)
|
|||
static void
|
||||
copy_as_csv_cb(GtkWindow *win _U_, gpointer data)
|
||||
{
|
||||
guint32 i,j;
|
||||
gchar *table_entry;
|
||||
gchar *CSV_str;
|
||||
GtkClipboard *cb;
|
||||
|
||||
guint32 i,j;
|
||||
gchar *table_entry;
|
||||
gchar *CSV_str;
|
||||
GtkClipboard *cb;
|
||||
|
||||
conversations_table *talkers=(conversations_table *)data;
|
||||
|
||||
|
||||
CSV_str=g_new(gchar,(80*(talkers->num_conversations+1))); /* 80 chars * num rows */
|
||||
strcpy(CSV_str,""); /* initialize string */
|
||||
/* Add the column headers to the CSV data */
|
||||
|
@ -1137,7 +1152,7 @@ copy_as_csv_cb(GtkWindow *win _U_, gpointer data)
|
|||
strcat(CSV_str,",");
|
||||
}
|
||||
strcat(CSV_str,"\n"); /* new row */
|
||||
|
||||
|
||||
/* Add the column values to the CSV data */
|
||||
for(i=0;i<talkers->num_conversations;i++){ /* all rows */
|
||||
for(j=0;j<talkers->num_columns;j++){ /* all columns */
|
||||
|
@ -1145,15 +1160,15 @@ copy_as_csv_cb(GtkWindow *win _U_, gpointer data)
|
|||
gtk_clist_get_text(talkers->table,i,j,&table_entry);/* copy table item into string */
|
||||
strcat(CSV_str,table_entry); /* add the table entry to the CSV string */
|
||||
strcat(CSV_str,",");
|
||||
}
|
||||
strcat(CSV_str,"\n"); /* new row */
|
||||
}
|
||||
strcat(CSV_str,"\n"); /* new row */
|
||||
}
|
||||
|
||||
/* Now that we have the CSV data, copy it into the default clipboard */
|
||||
cb = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); /* Get the default clipboard */
|
||||
gtk_clipboard_set_text(cb, CSV_str, -1); /* Copy the CSV data into the clipboard */
|
||||
g_free(CSV_str); /* Free the memory */
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -1170,13 +1185,13 @@ init_ct_table_page(conversations_table *conversations, GtkWidget *vbox, gboolean
|
|||
#if (GTK_MAJOR_VERSION >= 2)
|
||||
GtkWidget *copy_bt;
|
||||
GtkTooltips *tooltips = gtk_tooltips_new();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
conversations->page_lb=NULL;
|
||||
conversations->resolve_names=TRUE;
|
||||
conversations->has_ports=!hide_ports;
|
||||
conversations->num_columns=NUM_COLS;
|
||||
conversations->has_ports=!hide_ports;
|
||||
conversations->num_columns=NUM_COLS;
|
||||
conversations->default_titles[0]="Address A",
|
||||
conversations->default_titles[1]="Port A";
|
||||
conversations->default_titles[2]="Address B";
|
||||
|
@ -1197,6 +1212,7 @@ init_ct_table_page(conversations_table *conversations, GtkWidget *vbox, gboolean
|
|||
gtk_box_pack_start(GTK_BOX(vbox), conversations->scrolled_window, TRUE, TRUE, 0);
|
||||
|
||||
conversations->table=(GtkCList *)gtk_clist_new(NUM_COLS);
|
||||
OBJECT_SET_DATA(conversations->table, CONV_PTR_KEY, conversations);
|
||||
|
||||
col_arrows = (column_arrows *) g_malloc(sizeof(column_arrows) * NUM_COLS);
|
||||
win_style = gtk_widget_get_style(conversations->scrolled_window);
|
||||
|
@ -1213,7 +1229,7 @@ init_ct_table_page(conversations_table *conversations, GtkWidget *vbox, gboolean
|
|||
gtk_table_attach(GTK_TABLE(col_arrows[i].table), col_arrows[i].descend_pm, 1, 2, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
|
||||
/* make total frames be the default sort order */
|
||||
if (i == 4) {
|
||||
gtk_widget_show(col_arrows[i].descend_pm);
|
||||
gtk_widget_show(col_arrows[i].ascend_pm);
|
||||
}
|
||||
gtk_clist_set_column_widget(GTK_CLIST(conversations->table), i, col_arrows[i].table);
|
||||
gtk_widget_show(col_arrows[i].table);
|
||||
|
@ -1222,7 +1238,7 @@ init_ct_table_page(conversations_table *conversations, GtkWidget *vbox, gboolean
|
|||
|
||||
gtk_clist_set_compare_func(conversations->table, ct_sort_column);
|
||||
gtk_clist_set_sort_column(conversations->table, 4);
|
||||
gtk_clist_set_sort_type(conversations->table, GTK_SORT_DESCENDING);
|
||||
gtk_clist_set_sort_type(conversations->table, GTK_SORT_ASCENDING);
|
||||
|
||||
|
||||
gtk_clist_set_column_auto_resize(conversations->table, 0, TRUE);
|
||||
|
@ -1258,11 +1274,11 @@ init_ct_table_page(conversations_table *conversations, GtkWidget *vbox, gboolean
|
|||
/* XXX - maybe we want to have a "Copy as CSV" stock button here? */
|
||||
/*copy_bt = gtk_button_new_with_label ("Copy content to clipboard as CSV");*/
|
||||
copy_bt = BUTTON_NEW_FROM_STOCK(GTK_STOCK_COPY);
|
||||
gtk_tooltips_set_tip(tooltips, copy_bt,
|
||||
gtk_tooltips_set_tip(tooltips, copy_bt,
|
||||
"Copy all statistical values of this page to the clipboard in CSV (Comma Seperated Values) format.", NULL);
|
||||
SIGNAL_CONNECT(copy_bt, "clicked", copy_as_csv_cb,(gpointer *) conversations);
|
||||
gtk_box_pack_start(GTK_BOX(vbox), copy_bt, FALSE, FALSE, 0);
|
||||
#endif
|
||||
SIGNAL_CONNECT(copy_bt, "clicked", copy_as_csv_cb,(gpointer *) conversations);
|
||||
gtk_box_pack_start(GTK_BOX(vbox), copy_bt, FALSE, FALSE, 0);
|
||||
#endif
|
||||
|
||||
/* register the tap and rerun the taps on the packet list */
|
||||
error_string=register_tap_listener(tap_name, conversations, filter, reset_ct_table_data_cb, packet_func, draw_ct_table_data_cb);
|
||||
|
@ -1329,7 +1345,7 @@ init_conversation_table(gboolean hide_ports, const char *table_name, const char
|
|||
|
||||
cf_retap_packets(&cfile, FALSE);
|
||||
|
||||
|
||||
|
||||
/* Keep clist frozen to cause modifications to the clist (inserts, appends, others that are extremely slow
|
||||
in GTK2) to not be drawn, allow refreshes to occur at strategic points for performance */
|
||||
gtk_clist_freeze(conversations->table);
|
||||
|
|
Loading…
Reference in New Issue