diff options
author | Anders Broman <anders.broman@ericsson.com> | 2012-07-15 16:24:35 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2012-07-15 16:24:35 +0000 |
commit | 5d9d9b82219cb87ee74b94ee3a8bf0d5ec51b57c (patch) | |
tree | c494459b75db5141e5035de2546e23ce53f01fc9 | |
parent | 7deecbf36bcd15eda28be17fbf00d7fc05b31003 (diff) |
From Wonil Kim: Enable statistics menu register for the tap plug-in. Fixes https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=7466
svn path=/trunk/; revision=43726
-rw-r--r-- | epan/libwireshark.def | 2 | ||||
-rw-r--r-- | epan/stats_tree.c | 24 | ||||
-rw-r--r-- | epan/stats_tree.h | 16 | ||||
-rw-r--r-- | epan/stats_tree_priv.h | 5 | ||||
-rw-r--r-- | plugins/stats_tree/pinfo_stats_tree.c | 9 | ||||
-rw-r--r-- | ui/gtk/main_menubar.c | 63 |
6 files changed, 107 insertions, 12 deletions
diff --git a/epan/libwireshark.def b/epan/libwireshark.def index 52b2eff149..caca3de840 100644 --- a/epan/libwireshark.def +++ b/epan/libwireshark.def @@ -1013,6 +1013,7 @@ stats_tree_create_range_node_string stats_tree_free stats_tree_get_abbr stats_tree_get_cfg_by_abbr +stats_tree_get_cfg_list stats_tree_get_strs_from_node stats_tree_manip_node stats_tree_new @@ -1022,6 +1023,7 @@ stats_tree_parent_id_by_name stats_tree_presentation stats_tree_range_node_with_pname stats_tree_register +stats_tree_register_plugin stats_tree_register_with_group stats_tree_reinit stats_tree_reset diff --git a/epan/stats_tree.c b/epan/stats_tree.c index 6e1c52d56e..799bcdb88a 100644 --- a/epan/stats_tree.c +++ b/epan/stats_tree.c @@ -270,6 +270,7 @@ stats_tree_register_with_group(const char *tapname, const char *abbr, const char /* at the very least the abbrev and the packet function should be given */ g_assert( tapname && abbr && packet ); + cfg->plugin = FALSE; cfg->tapname = g_strdup(tapname); cfg->abbr = g_strdup(abbr); cfg->name = name ? g_strdup(name) : g_strdup(abbr); @@ -294,7 +295,6 @@ stats_tree_register_with_group(const char *tapname, const char *abbr, const char if (!registry) registry = g_hash_table_new(g_str_hash,g_str_equal); g_hash_table_insert(registry,cfg->abbr,cfg); - } /* register a new stats_tree with default group REGISTER_STAT_GROUP_UNSORTED */ @@ -310,6 +310,23 @@ stats_tree_register(const char *tapname, const char *abbr, const char *name, cleanup, REGISTER_STAT_GROUP_UNSORTED); } +/* register a new stat_tree with default group REGISTER_STAT_GROUP_UNSORTED from a plugin */ +extern void +stats_tree_register_plugin(const char *tapname, const char *abbr, const char *name, + guint flags, + stat_tree_packet_cb packet, stat_tree_init_cb init, + stat_tree_cleanup_cb cleanup) +{ + stats_tree_cfg *cfg; + + stats_tree_register(tapname, abbr, name, + flags, + packet, init, + cleanup); + cfg = stats_tree_get_cfg_by_abbr((char*)abbr); + cfg->plugin = TRUE; +} + extern stats_tree* stats_tree_new(stats_tree_cfg *cfg, tree_pres *pr, const char *filter) { @@ -362,6 +379,11 @@ stats_tree_get_cfg_by_abbr(char *abbr) return g_hash_table_lookup(registry,abbr); } +extern GList* +stats_tree_get_cfg_list(void) +{ + return g_hash_table_get_values(registry); +} struct _stats_tree_pres_cbs { void (*setup_node_pr)(stat_node*); diff --git a/epan/stats_tree.h b/epan/stats_tree.h index 98c6309d20..12385763a4 100644 --- a/epan/stats_tree.h +++ b/epan/stats_tree.h @@ -66,6 +66,22 @@ extern void stats_tree_register(const gchar *tapname, stat_tree_init_cb init, stat_tree_cleanup_cb cleanup); +/* registers a new stats tree with default group REGISTER_STAT_GROUP_UNSORTED from a plugin + * abbr: protocol abbr + * name: protocol display name + * flags: tap listener flags for per-packet callback + * packet: per packet callback + * init: tree initialization callback + * cleanup: cleanup callback + */ +extern void stats_tree_register_plugin(const gchar *tapname, + const gchar *abbr, + const gchar *name, + guint flags, + stat_tree_packet_cb packet, + stat_tree_init_cb init, + stat_tree_cleanup_cb cleanup); + /* registers a new stats tree * abbr: protocol abbr * name: protocol display name diff --git a/epan/stats_tree_priv.h b/epan/stats_tree_priv.h index c6c3e153bd..6c90bf0cfe 100644 --- a/epan/stats_tree_priv.h +++ b/epan/stats_tree_priv.h @@ -113,6 +113,7 @@ struct _stats_tree_cfg { register_stat_group_t stat_group; gboolean in_use; + gboolean plugin; /** dissector defined callbacks */ stat_tree_packet_cb packet; @@ -181,6 +182,10 @@ extern gchar *stats_tree_get_abbr(const gchar *optarg); /** obtains a stats tree from the registry given its abbr */ extern stats_tree_cfg *stats_tree_get_cfg_by_abbr(gchar *abbr); +/** obtains a stats tree list from the registry + caller should free returned list with g_list_free() */ +extern GList *stats_tree_get_cfg_list(void); + /** extracts node data as strings from a stat_node into the buffers given by value, rate and precent if NULL they are ignored */ diff --git a/plugins/stats_tree/pinfo_stats_tree.c b/plugins/stats_tree/pinfo_stats_tree.c index 853beb468d..4371a92e8e 100644 --- a/plugins/stats_tree/pinfo_stats_tree.c +++ b/plugins/stats_tree/pinfo_stats_tree.c @@ -208,10 +208,10 @@ void register_pinfo_stat_trees(void) { UAT_END_FIELDS }; - stats_tree_register("ip","ip_hosts",st_str_ip, 0, ip_hosts_stats_tree_packet, ip_hosts_stats_tree_init, NULL ); - stats_tree_register("ip","ptype",st_str_ptype, 0, ptype_stats_tree_packet, ptype_stats_tree_init, NULL ); + stats_tree_register_plugin("ip","ip_hosts",st_str_ip, 0, ip_hosts_stats_tree_packet, ip_hosts_stats_tree_init, NULL ); + stats_tree_register_plugin("ip","ptype",st_str_ptype, 0, ptype_stats_tree_packet, ptype_stats_tree_init, NULL ); stats_tree_register_with_group("frame","plen",st_str_plen, 0, plen_stats_tree_packet, plen_stats_tree_init, NULL, REGISTER_STAT_GROUP_GENERIC ); - stats_tree_register("ip","dests",st_str_dsts, 0, dsts_stats_tree_packet, dsts_stats_tree_init, NULL ); + stats_tree_register_plugin("ip","dests",st_str_dsts, 0, dsts_stats_tree_packet, dsts_stats_tree_init, NULL ); stat_module = prefs_register_stat("stat_tree", "Stats Tree", "Stats Tree", NULL); @@ -231,5 +231,4 @@ void register_pinfo_stat_trees(void) { prefs_register_uat_preference(stat_module, "packet_lengths", "Packet Lengths", "Delineated packet sizes to count", plen_uat); -} - +}
\ No newline at end of file diff --git a/ui/gtk/main_menubar.c b/ui/gtk/main_menubar.c index 03b53e4fc0..523b1c7206 100644 --- a/ui/gtk/main_menubar.c +++ b/ui/gtk/main_menubar.c @@ -43,6 +43,7 @@ #include <epan/plugins.h> #include <epan/epan_dissect.h> #include <epan/column.h> +#include <epan/stats_tree_priv.h> #include <epan/filesystem.h> @@ -144,6 +145,7 @@ GtkWidget *popup_menu_object; static void menu_open_recent_file_cmd_cb(GtkAction *action, gpointer data _U_ ); static void add_recent_items (guint merge_id, GtkUIManager *ui_manager); +static void add_tap_plugins (guint merge_id, GtkUIManager *ui_manager); static void menus_init(void); static void merge_lua_menu_items(GList *node); @@ -1272,9 +1274,6 @@ static const char *ui_desc_menubar = " <menuitem name='http_req' action='/StatisticsMenu/HTTP/http_req'/>\n" " <menuitem name='http_srv' action='/StatisticsMenu/HTTP/http_srv'/>\n" " </menu>\n" -" <menuitem name='IPAddresses' action='/StatisticsMenu/ip_hosts'/>\n" -" <menuitem name='IPDestinations' action='/StatisticsMenu/dests'/>\n" -" <menuitem name='IPptype' action='/StatisticsMenu/ptype'/>\n" " <menuitem name='ONC-RPC-Programs' action='/StatisticsMenu/ONC-RPC-Programs'/>\n" " <menu name= 'SametimeMenu' action='/StatisticsMenu/Sametime'>\n" " <menuitem name='sametime' action='/StatisticsMenu/Sametime/sametime'/>\n" @@ -1736,9 +1735,6 @@ static const GtkActionEntry main_menu_bar_entries[] = { { "/StatisticsMenu/HTTP/http_req", NULL, "Requests", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) }, { "/StatisticsMenu/HTTP/http_srv", NULL, "Load Distribution", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) }, - { "/StatisticsMenu/ip_hosts", NULL, "IP Addresses...", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) }, - { "/StatisticsMenu/dests", NULL, "IP Destinations...", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) }, - { "/StatisticsMenu/ptype", NULL, "IP Protocol Types..", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) }, { "/StatisticsMenu/ONC-RPC-Programs", NULL, "ONC-RPC Programs", NULL, NULL, G_CALLBACK(gtk_rpcprogs_cb) }, { "/StatisticsMenu/Sametime", NULL, "Sametime", NULL, NULL, NULL }, { "/StatisticsMenu/Sametime/sametime", NULL, "Messages", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) }, @@ -3462,6 +3458,11 @@ menus_init(void) { merge_id = gtk_ui_manager_new_merge_id (ui_manager_main_menubar); add_recent_items (merge_id, ui_manager_main_menubar); + /* Add statistics tap plug-in to the menu + */ + merge_id = gtk_ui_manager_new_merge_id (ui_manager_main_menubar); + add_tap_plugins (merge_id, ui_manager_main_menubar); + statusbar_profiles_action_group = gtk_action_group_new ("StatusBarProfilesPopUpMenuActionGroup"); gtk_action_group_add_actions (statusbar_profiles_action_group, /* the action group */ @@ -4123,6 +4124,56 @@ add_recent_items (guint merge_id, GtkUIManager *ui_manager) } +#define MENU_STATISTICS_PATH "/Menubar/StatisticsMenu" + +static void +add_tap_plugins (guint merge_id, GtkUIManager *ui_manager) +{ + GtkActionGroup *action_group; + GtkAction *action; + GtkWidget *submenu_statistics; + GList *cfg_list; + GList *iter; + gchar *action_name; + + action_group = gtk_action_group_new ("tap-plugins-group"); + + submenu_statistics = gtk_ui_manager_get_widget(ui_manager_main_menubar, MENU_STATISTICS_PATH); + if(!submenu_statistics){ + g_warning("add_tap_plugins: No submenu_statistics found, path= MENU_STATISTICS_PATH"); + return; + } + gtk_ui_manager_insert_action_group (ui_manager_main_menubar, action_group, 0); + g_object_set_data (G_OBJECT (ui_manager_main_menubar), + "tap-plugins-merge-id", GUINT_TO_POINTER (merge_id)); + + cfg_list = stats_tree_get_cfg_list(); + iter = g_list_first(cfg_list); + while (iter) { + stats_tree_cfg *cfg = (stats_tree_cfg*)iter->data; + if (cfg->plugin) { + action_name = g_strdup_printf(MENU_STATISTICS_PATH "/%s", cfg->abbr); + action = g_object_new (GTK_TYPE_ACTION, + "name", action_name, + "label", cfg->name, + NULL); + g_signal_connect (action, "activate", G_CALLBACK (gtk_stats_tree_cb), NULL); + gtk_action_group_add_action (action_group, action); + g_object_unref (action); + + gtk_ui_manager_add_ui (ui_manager, merge_id, + MENU_STATISTICS_PATH, + action_name, + action_name, + GTK_UI_MANAGER_MENUITEM, + FALSE); + + g_free (action_name); + } + iter = g_list_next(iter); + } + g_list_free(cfg_list); +} /* Open a file by it's name (Beware: will not ask to close existing capture file!) */ |