Update to the stats_tree tapping API

- change the tap init_string to %s,tree instead of %s,stat
- change the registration key (it used to be tapname, that disallowed to register more than one tap per protocol)
- add a "pivot" node for convenience


svn path=/trunk/; revision=13502
This commit is contained in:
Luis Ontanon 2005-02-24 22:02:31 +00:00
parent 2ed9ca813b
commit 00435bf390
5 changed files with 84 additions and 11 deletions

View File

@ -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;
}

View File

@ -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

View File

@ -75,6 +75,7 @@ struct _stat_node {
struct _stats_tree {
guint8* abbr;
guint8* name;
guint8* tapname;
/* is this realy needed? */
char* filter;

View File

@ -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;

View File

@ -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);