aboutsummaryrefslogtreecommitdiffstats
path: root/gtk/dcerpc_stat.c
diff options
context:
space:
mode:
authorRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>2003-09-05 00:48:58 +0000
committerRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>2003-09-05 00:48:58 +0000
commit51b7e878f8358507956a8be006fb31ca6c8e9dbc (patch)
tree07210cfa8ea76f43b6c24dc4bf2542c0a60cd00f /gtk/dcerpc_stat.c
parente3cde3715e5e62df4056b4ae7d43f18373fb404b (diff)
Update DCERPCSTAT, change the program menu to show the programs sorted in alphabetical order
svn path=/trunk/; revision=8380
Diffstat (limited to 'gtk/dcerpc_stat.c')
-rw-r--r--gtk/dcerpc_stat.c83
1 files changed, 73 insertions, 10 deletions
diff --git a/gtk/dcerpc_stat.c b/gtk/dcerpc_stat.c
index 4f4ea6051d..9064974361 100644
--- a/gtk/dcerpc_stat.c
+++ b/gtk/dcerpc_stat.c
@@ -1,7 +1,7 @@
/* dcerpc_stat.c
* dcerpc_stat 2002 Ronnie Sahlberg
*
- * $Id: dcerpc_stat.c,v 1.14 2003/09/02 08:27:23 sahlberg Exp $
+ * $Id: dcerpc_stat.c,v 1.15 2003/09/05 00:48:58 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -282,6 +282,10 @@ static GtkWidget *vers_label, *vers_opt, *vers_menu;
static GtkWidget *filter_box;
static GtkWidget *filter_label, *filter_entry;
static GtkWidget *start_button;
+static dcerpc_uuid_key *current_uuid_key=NULL;
+static dcerpc_uuid_value *current_uuid_value=NULL;
+static dcerpc_uuid_key *new_uuid_key=NULL;
+static dcerpc_uuid_value *new_uuid_value=NULL;
static void
@@ -355,21 +359,67 @@ dcerpcstat_program_select(GtkWidget *item _U_, gpointer key)
}
+static void
+dcerpcstat_add_program_to_menu(dcerpc_uuid_key *k, dcerpc_uuid_value *v)
+{
+ GtkWidget *program_menu_item;
+
+ program_menu_item=gtk_menu_item_new_with_label(v->name);
+ SIGNAL_CONNECT(program_menu_item, "activate", dcerpcstat_program_select, k);
+
+ gtk_widget_show(program_menu_item);
+ gtk_menu_append(GTK_MENU(prog_menu), program_menu_item);
+
+ if(!dcerpc_uuid_program){
+ dcerpc_uuid_program=&k->uuid;
+ }
+
+ return;
+}
+
static void *
-dcerpcstat_list_programs(gpointer *key, gpointer *value, gpointer *user_data _U_)
+dcerpcstat_find_next_program(gpointer *key, gpointer *value, gpointer *user_data _U_)
{
dcerpc_uuid_key *k=(dcerpc_uuid_key *)key;
dcerpc_uuid_value *v=(dcerpc_uuid_value *)value;
- GtkWidget *menu_item;
- menu_item=gtk_menu_item_new_with_label(v->name);
- SIGNAL_CONNECT(menu_item, "activate", dcerpcstat_program_select, k);
+ /* first time called, just set new_uuid to this one */
+ if((current_uuid_key==NULL)&&(new_uuid_key==NULL)){
+ new_uuid_key=k;
+ new_uuid_value=v;
+ return NULL;
+ }
- gtk_widget_show(menu_item);
- gtk_menu_append(GTK_MENU(prog_menu), menu_item);
+ /* if we havent got a current one yet, just check the new
+ and scan for the first one alphabetically */
+ if(current_uuid_key==NULL){
+ if(strcmp(new_uuid_value->name, v->name)>0){
+ new_uuid_key=k;
+ new_uuid_value=v;
+ return NULL;
+ }
+ return NULL;
+ }
- if(!dcerpc_uuid_program){
- dcerpc_uuid_program=&k->uuid;
+ /* searching for the next one we are only interested in those
+ that sorts alphabetically after the current one */
+ if(strcmp(current_uuid_value->name, v->name)>=0){
+ /* this one doesnt so just skip it */
+ return NULL;
+ }
+
+ /* is it the first potential new entry? */
+ if(new_uuid_key==NULL){
+ new_uuid_key=k;
+ new_uuid_value=v;
+ return NULL;
+ }
+
+ /* does it sort before the current new one? */
+ if(strcmp(new_uuid_value->name, v->name)>0){
+ new_uuid_key=k;
+ new_uuid_value=v;
+ return NULL;
}
return NULL;
@@ -420,7 +470,20 @@ gtk_dcerpcstat_cb(GtkWidget *w _U_, gpointer d _U_)
/* Program menu */
prog_opt=gtk_option_menu_new();
prog_menu=gtk_menu_new();
- g_hash_table_foreach(dcerpc_uuids, (GHFunc)dcerpcstat_list_programs, NULL);
+ current_uuid_key=NULL;
+ current_uuid_value=NULL;
+ do {
+ new_uuid_key=NULL;
+ new_uuid_value=NULL;
+ g_hash_table_foreach(dcerpc_uuids, (GHFunc)dcerpcstat_find_next_program, NULL);
+ if(new_uuid_key){
+ dcerpcstat_add_program_to_menu(new_uuid_key, new_uuid_value);
+ }
+ current_uuid_key=new_uuid_key;
+ current_uuid_value=new_uuid_value;
+ } while(new_uuid_key!=NULL);
+
+
gtk_option_menu_set_menu(GTK_OPTION_MENU(prog_opt), prog_menu);
gtk_box_pack_start(GTK_BOX(prog_box), prog_opt, TRUE, TRUE, 0);
gtk_widget_show(prog_opt);