diff --git a/epan/stats_tree.c b/epan/stats_tree.c index 1d67a04b62..85cdcd4aa5 100644 --- a/epan/stats_tree.c +++ b/epan/stats_tree.c @@ -88,7 +88,7 @@ extern void stat_branch_to_str(const stat_node* node, GString* s, guint indent) for ( i = 0 ; i<(indent-1); i++) indentation[i] = ' '; indentation[i] = '\0'; - g_string_sprintfa(s,"%s%s = %s (%s/s) (%s)\n", + g_string_sprintfa(s,"%s%s\t%s\t%s\t%s\n", indentation,node->name,value,rate,percent); if (node->children) { @@ -121,6 +121,7 @@ static void free_stat_node( stat_node* node ) { extern void free_stats_tree(stats_tree* st) { stat_node* child; + g_free(st->tapname); g_free(st->abbr); g_free(st->filter); @@ -175,7 +176,8 @@ extern void reinit_stats_tree(void* p) { } /* register a new stats_tree */ -extern void register_stats_tree(guint8* abbr, +extern void register_stats_tree(guint8* tapname, + guint8* abbr, guint8* name, stat_tree_packet_cb packet, stat_tree_init_cb init ) { @@ -183,8 +185,9 @@ extern void register_stats_tree(guint8* abbr, stats_tree* st = g_malloc( sizeof(stats_tree) ); /* at the very least the abbrev and the packet function should be given */ - g_assert( abbr && packet ); + g_assert( tapname && abbr && packet ); + st->tapname = g_strdup(tapname); st->abbr = g_strdup(abbr); st->name = name ? g_strdup(name) : g_strdup(abbr); st->filter = NULL; @@ -424,6 +427,10 @@ extern guint8* manip_stat_node(manip_node_mode mode, stats_tree* st, const guint extern guint8* get_st_abbr(const guint8* optarg) { guint i; + + /* XXX: this fails when tethereal is given any options + after the -z */ + g_assert(optarg != NULL); for (i=0; optarg[i] && optarg[i] != ','; i++); @@ -540,3 +547,41 @@ extern int tick_range(stats_tree* st, return node->id; } + +extern int create_pivot_node(stats_tree* st, + const gchar* name, + int parent_id) { + stat_node* node = new_stat_node(st,name,parent_id,TRUE,TRUE); + + if (node) + return node->id; + else + return 0; +} + +extern int create_pivot_node_with_parent_name(stats_tree* st, + const gchar* name, + const gchar* parent_name) { + int parent_id = get_parent_id_by_name(st,parent_name); + stat_node* node; + + node = new_stat_node(st,name,parent_id,TRUE,TRUE); + + if (node) + return node->id; + else + return 0; +} + +extern int tick_pivot(stats_tree* st, + int pivot_id, + const gchar* pivot_value) { + + stat_node* parent = g_ptr_array_index(st->parents,pivot_id); + + parent->counter++; + manip_stat_node( MN_INCREASE, st, pivot_value, pivot_id, FALSE, 1); + + return pivot_id; +} + diff --git a/epan/stats_tree.h b/epan/stats_tree.h index 9b62ee3213..dbeb7c287b 100644 --- a/epan/stats_tree.h +++ b/epan/stats_tree.h @@ -52,7 +52,8 @@ typedef void (*stat_tree_init_cb)(stats_tree*); * packet: per packet callback * init: tree initialization callback */ -extern void register_stats_tree(guint8* abbr, +extern void register_stats_tree(guint8* tapname, + guint8* abbr, guint8* name, stat_tree_packet_cb packet, stat_tree_init_cb init ); @@ -101,6 +102,18 @@ extern int tick_range_with_parent_name(stats_tree* st, const gchar* parent_name, int value_in_range); +/* */ +extern int create_pivot_node(stats_tree* st, + const gchar* name, + int parent_id); + +extern int create_pivot_node_with_parent_name(stats_tree* st, + const gchar* name, + const gchar* parent_name); + +extern int tick_pivot(stats_tree* st, + int pivot_id, + const gchar* pivot_value); /* * manipulates the value of the node whose name is given diff --git a/epan/stats_tree_priv.h b/epan/stats_tree_priv.h index b3813d5194..3c0904bf93 100644 --- a/epan/stats_tree_priv.h +++ b/epan/stats_tree_priv.h @@ -75,6 +75,7 @@ struct _stat_node { struct _stats_tree { guint8* abbr; guint8* name; + guint8* tapname; /* is this realy needed? */ char* filter; diff --git a/gtk/stats_tree_stat.c b/gtk/stats_tree_stat.c index 34c0d894b6..3431990fb9 100644 --- a/gtk/stats_tree_stat.c +++ b/gtk/stats_tree_stat.c @@ -23,6 +23,15 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +/* + TODO + + - at reinitialization I have one of these for every node in the tree + Gtk-CRITICAL **: file gtktreestore.c: line 1044 (gtk_tree_store_set): assertion `VALID_ITER (iter, tree_store)' failed + + - GTK1 +*/ + #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -193,11 +202,13 @@ static void init_gtk_tree(char* optarg) { } else { g_error("no such stats_tree (%s) found in stats_tree registry",abbr); } + g_free(abbr); + } else { g_error("could not obtain stats_tree abbr from optarg"); } - window_name = g_strdup_printf("%s_stat", st->abbr); + window_name = g_strdup_printf("%s Stats Tree", st->abbr); st->pr->win = window_new_with_geom(GTK_WINDOW_TOPLEVEL,window_name,window_name); g_free(window_name); @@ -262,7 +273,7 @@ static void init_gtk_tree(char* optarg) { gtk_container_add( GTK_CONTAINER(st->pr->win), scr_win); #endif - error_string = register_tap_listener( st->abbr, + error_string = register_tap_listener( st->tapname, st, st->filter, /* reinit_stats_tree*/ NULL, @@ -294,7 +305,7 @@ static void register_gtk_stats_tree_tap (gpointer k _U_, gpointer v, gpointer p stats_tree* st = v; guint8* s; - s = g_strdup_printf("%s,stat",st->abbr); + s = g_strdup_printf("%s,tree",st->abbr); register_ethereal_tap(s, init_gtk_tree); g_free(s); @@ -313,7 +324,7 @@ static void register_gtk_stats_tree_tap (gpointer k _U_, gpointer v, gpointer p st->pr->stat_dlg = g_malloc(sizeof(tap_dfilter_dlg)); st->pr->stat_dlg->win_title = g_strdup_printf("%s Packet Counter",st->name); - st->pr->stat_dlg->init_string = g_strdup_printf("%s,stat",st->abbr); + st->pr->stat_dlg->init_string = g_strdup_printf("%s,tree",st->abbr); st->pr->stat_dlg->tap_init_cb = init_gtk_tree; st->pr->stat_dlg->index = -1; diff --git a/tap-stats_tree.c b/tap-stats_tree.c index 8150260eb2..a09bf637b1 100644 --- a/tap-stats_tree.c +++ b/tap-stats_tree.c @@ -79,11 +79,14 @@ static void init_stats_tree(char *optarg) { } else { g_error("no such stats_tree (%s) found in stats_tree registry",abbr); } + + g_free(abbr); + } else { - g_error("could not obtain stats_tree abbr from optarg"); + g_error("could not obtain stats_tree abbr (%s) from optarg '%s'",abbr,optarg); } - error_string = register_tap_listener( st->abbr, + error_string = register_tap_listener( st->tapname, st, st->filter, reset_stats_tree, @@ -102,7 +105,7 @@ void register_stats_tree_tap (gpointer k _U_, gpointer v, gpointer p _U_) { stats_tree* st = v; st->pr = g_malloc(sizeof(tree_pres)); - st->pr->init_string = g_strdup_printf("%s,stat",st->abbr); + st->pr->init_string = g_strdup_printf("%s,tree",st->abbr); register_ethereal_tap(st->pr->init_string, init_stats_tree);