aboutsummaryrefslogtreecommitdiffstats
path: root/gtk/capture_if_dlg.c
diff options
context:
space:
mode:
authorMichael Tüxen <tuexen@fh-muenster.de>2011-08-05 07:19:17 +0000
committerMichael Tüxen <tuexen@fh-muenster.de>2011-08-05 07:19:17 +0000
commiteaffdfeaaa572bb818f116afb3c63b3d43c153ea (patch)
treec8c59bb819cd73d2b526ae2f3f9406f3d1bd1a93 /gtk/capture_if_dlg.c
parent7f895c681b301d23f0f42d8b96114e5b124a42b5 (diff)
Add support for multiple interfaces to the capture options dialog.
Obtained from Irene Ruengeler. svn path=/trunk/; revision=38350
Diffstat (limited to 'gtk/capture_if_dlg.c')
-rw-r--r--gtk/capture_if_dlg.c299
1 files changed, 163 insertions, 136 deletions
diff --git a/gtk/capture_if_dlg.c b/gtk/capture_if_dlg.c
index 806b23fb93..dc0c0dbef3 100644
--- a/gtk/capture_if_dlg.c
+++ b/gtk/capture_if_dlg.c
@@ -108,13 +108,16 @@ static GtkWidget *cap_if_w;
static GList *if_data_list = NULL;
-static guint timer_id;
+static guint timer_id;
static GtkWidget *stop_bt, *capture_bt, *options_bt;
static GList *if_list;
-static guint currently_selected = 0;
+static guint currently_selected = 0;
+
+static if_stat_cache_t *sc;
+
/*
* Timeout, in milliseconds, for reads from the stream of captured packets.
*/
@@ -182,13 +185,16 @@ store_selected(GtkWidget *choose_bt, gpointer if_data)
for (i = 0; i < global_capture_opts.ifaces->len; i++) {
if (strcmp(g_array_index(global_capture_opts.ifaces, interface_options, i).name, temp->if_info.name) == 0) {
- found = TRUE;
+ found = TRUE;
if (!temp->selected) {
interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, i);
if (gtk_widget_is_focus(choose_bt) && get_welcome_window()) {
change_interface_selection(interface_opts.name, FALSE);
}
+ if (gtk_widget_is_focus(choose_bt) && dlg_window_present()) {
+ enable_selected_interface(interface_opts.name, FALSE);
+ }
g_free(interface_opts.name);
g_free(interface_opts.descr);
g_free(interface_opts.cfilter);
@@ -234,6 +240,9 @@ store_selected(GtkWidget *choose_bt, gpointer if_data)
if (gtk_widget_is_focus(choose_bt) && get_welcome_window() != NULL) {
change_interface_selection(g_strdup(temp->if_info.name), TRUE);
}
+ if (gtk_widget_is_focus(choose_bt) && dlg_window_present()) {
+ enable_selected_interface(interface_opts.name, TRUE);
+ }
}
if (temp->selected)
@@ -249,9 +258,7 @@ store_selected(GtkWidget *choose_bt, gpointer if_data)
#else
gtk_widget_set_sensitive(capture_bt, !gbl_capture_in_progress && (currently_selected == 1));
#endif
- gtk_widget_set_sensitive(options_bt, !gbl_capture_in_progress && (currently_selected <= 1));
}
- set_menus_for_number_of_ifaces();
}
/* start capture button was pressed */
@@ -387,18 +394,16 @@ set_capture_if_dialog_for_capture_in_progress(gboolean capture_in_progress)
#else
gtk_widget_set_sensitive(capture_bt, !capture_in_progress && (currently_selected == 1));
#endif
- gtk_widget_set_sensitive(options_bt, !capture_in_progress && (currently_selected <= 1));
}
}
/* the window was closed, cleanup things */
static void
-capture_if_destroy_cb(GtkWidget *win _U_, gpointer user_data)
+capture_if_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
{
GList *curr;
int ifs;
- if_stat_cache_t *sc = user_data;
g_source_remove(timer_id);
@@ -684,16 +689,16 @@ found:
static void
capture_if_stop_cb(GtkWidget *w _U_, gpointer d _U_)
{
- guint ifs;
- GList *curr;
- if_dlg_data_t *if_data;
+ guint ifs;
+ GList *curr;
+ if_dlg_data_t *if_data;
- for (ifs = 0; ifs < g_list_length(if_data_list); ifs++) {
- curr = g_list_nth(if_data_list, ifs);
- if_data = (if_dlg_data_t *)(curr->data);
- gtk_widget_set_sensitive(if_data->choose_bt, TRUE);
- }
- capture_stop_cb(NULL, NULL);
+ for (ifs = 0; ifs < g_list_length(if_data_list); ifs++) {
+ curr = g_list_nth(if_data_list, ifs);
+ if_data = (if_dlg_data_t *)(curr->data);
+ gtk_widget_set_sensitive(if_data->choose_bt, TRUE);
+ }
+ capture_stop_cb(NULL, NULL);
}
@@ -726,7 +731,6 @@ capture_if_cb(GtkWidget *w _U_, gpointer d _U_)
GString *if_tool_str = g_string_new("");
const gchar *addr_str;
gchar *user_descr;
- if_stat_cache_t *sc;
int preselected = 0, i;
interface_options interface_opts;
gboolean found = FALSE;
@@ -811,7 +815,6 @@ capture_if_cb(GtkWidget *w _U_, gpointer d _U_)
gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(main_sw), main_vb);
-
if_tb = gtk_table_new(1,9, FALSE);
gtk_table_set_row_spacings(GTK_TABLE(if_tb), 3);
gtk_table_set_col_spacings(GTK_TABLE(if_tb), 3);
@@ -853,141 +856,139 @@ capture_if_cb(GtkWidget *w _U_, gpointer d _U_)
/* List the interfaces */
currently_selected = 0;
for (ifs = 0; (curr = g_list_nth(if_list, ifs)); ifs++) {
- g_string_assign(if_tool_str, "");
- if_info = curr->data;
+ g_string_assign(if_tool_str, "");
+ if_info = curr->data;
- /* Continue if capture device is hidden */
- if (prefs_is_capture_device_hidden(if_info->name)) {
- continue;
- }
+ /* Continue if capture device is hidden */
+ if (prefs_is_capture_device_hidden(if_info->name)) {
+ continue;
+ }
- if_dlg_data = g_malloc0(sizeof(if_dlg_data_t));
-
- if (preselected > 0) {
- found = FALSE;
- for (i = 0; i < (gint)global_capture_opts.ifaces->len; i++) {
- interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
- if ((interface_opts.name == NULL) ||
- (strcmp(interface_opts.name, (char*)if_info->name) != 0))
- continue;
- else {
- found = TRUE;
- currently_selected++;
- preselected--;
- break;
- }
+ if_dlg_data = g_malloc0(sizeof(if_dlg_data_t));
+
+ if (preselected > 0) {
+ found = FALSE;
+ for (i = 0; i < (gint)global_capture_opts.ifaces->len; i++) {
+ interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
+ if ((interface_opts.name == NULL) ||
+ (strcmp(interface_opts.name, (char*)if_info->name) != 0)) {
+ continue;
+ } else {
+ found = TRUE;
+ currently_selected++;
+ preselected--;
+ break;
}
- if_dlg_data->selected = found;
}
- else
- if_dlg_data->selected = FALSE;
-
- if_dlg_data->if_info = *if_info;
+ if_dlg_data->selected = found;
+ } else {
+ if_dlg_data->selected = FALSE;
+ }
+ if_dlg_data->if_info = *if_info;
- if_dlg_data->choose_bt = gtk_check_button_new();
- gtk_table_attach_defaults(GTK_TABLE(if_tb), if_dlg_data->choose_bt, 0, 1, row, row+1);
- if (gbl_capture_in_progress) {
- gtk_widget_set_sensitive(if_dlg_data->choose_bt, FALSE);
- } else {
- gtk_widget_set_sensitive(if_dlg_data->choose_bt, TRUE);
- }
- gtk_toggle_button_set_active((GtkToggleButton *)if_dlg_data->choose_bt, if_dlg_data->selected);
- g_signal_connect(if_dlg_data->choose_bt, "toggled", G_CALLBACK(store_selected), if_dlg_data);
+ if_dlg_data->choose_bt = gtk_check_button_new();
+ gtk_table_attach_defaults(GTK_TABLE(if_tb), if_dlg_data->choose_bt, 0, 1, row, row+1);
+ if (gbl_capture_in_progress) {
+ gtk_widget_set_sensitive(if_dlg_data->choose_bt, FALSE);
+ } else {
+ gtk_widget_set_sensitive(if_dlg_data->choose_bt, TRUE);
+ }
+ gtk_toggle_button_set_active((GtkToggleButton *)if_dlg_data->choose_bt, if_dlg_data->selected);
+ g_signal_connect(if_dlg_data->choose_bt, "toggled", G_CALLBACK(store_selected), if_dlg_data);
/* Kind of adaptor (icon) */
#ifdef HAVE_AIRPCAP
- if (get_airpcap_if_from_name(airpcap_if_list,if_info->name) != NULL)
- icon = xpm_to_widget(capture_airpcap_16_xpm);
- else
- icon = capture_get_if_icon(if_info);
-#else
+ if (get_airpcap_if_from_name(airpcap_if_list,if_info->name) != NULL)
+ icon = xpm_to_widget(capture_airpcap_16_xpm);
+ else
icon = capture_get_if_icon(if_info);
+#else
+ icon = capture_get_if_icon(if_info);
#endif
-
- gtk_table_attach_defaults(GTK_TABLE(if_tb), icon, 1, 2, row, row+1);
+ gtk_table_attach_defaults(GTK_TABLE(if_tb), icon, 1, 2, row, row+1);
/* device name */
- if_dlg_data->device_lb = gtk_label_new(if_info->name);
- if_dlg_data->device = if_info->name;
+ if_dlg_data->device_lb = gtk_label_new(if_info->name);
+ if_dlg_data->device = if_info->name;
#ifndef _WIN32
- gtk_misc_set_alignment(GTK_MISC(if_dlg_data->device_lb), 0.0f, 0.5f);
- gtk_table_attach_defaults(GTK_TABLE(if_tb), if_dlg_data->device_lb, 2, 4, row, row+1);
+ gtk_misc_set_alignment(GTK_MISC(if_dlg_data->device_lb), 0.0f, 0.5f);
+ gtk_table_attach_defaults(GTK_TABLE(if_tb), if_dlg_data->device_lb, 2, 4, row, row+1);
#endif
- g_string_append(if_tool_str, "Device: ");
- g_string_append(if_tool_str, if_info->name);
- g_string_append(if_tool_str, "\n");
-
- /* description */
- user_descr = capture_dev_user_descr_find(if_info->name);
- if (user_descr) {
- if_dlg_data->descr_lb = gtk_label_new(user_descr);
- g_free (user_descr);
- } else {
- if (if_info->description)
- if_dlg_data->descr_lb = gtk_label_new(if_info->description);
- else
- if_dlg_data->descr_lb = gtk_label_new("");
- }
- gtk_misc_set_alignment(GTK_MISC(if_dlg_data->descr_lb), 0.0f, 0.5f);
- gtk_table_attach_defaults(GTK_TABLE(if_tb), if_dlg_data->descr_lb, 4, 5, row, row+1);
-
- if (if_info->description) {
- g_string_append(if_tool_str, "Description: ");
- g_string_append(if_tool_str, if_info->description);
- g_string_append(if_tool_str, "\n");
- }
+ g_string_append(if_tool_str, "Device: ");
+ g_string_append(if_tool_str, if_info->name);
+ g_string_append(if_tool_str, "\n");
+
+ /* description */
+ user_descr = capture_dev_user_descr_find(if_info->name);
+ if (user_descr) {
+ if_dlg_data->descr_lb = gtk_label_new(user_descr);
+ g_free (user_descr);
+ } else {
+ if (if_info->description)
+ if_dlg_data->descr_lb = gtk_label_new(if_info->description);
+ else
+ if_dlg_data->descr_lb = gtk_label_new("");
+ }
+ gtk_misc_set_alignment(GTK_MISC(if_dlg_data->descr_lb), 0.0f, 0.5f);
+ gtk_table_attach_defaults(GTK_TABLE(if_tb), if_dlg_data->descr_lb, 4, 5, row, row+1);
- /* IP address */
- /* Only one IP address will be shown, start with the first */
- g_string_append(if_tool_str, "IP: ");
- if_dlg_data->ip_lb = gtk_label_new("");
- addr_str = set_ip_addr_label (if_info->addrs, if_dlg_data->ip_lb, 0);
- if (addr_str) {
- gtk_widget_set_sensitive(if_dlg_data->ip_lb, TRUE);
- g_string_append(if_tool_str, addr_str);
- } else {
- gtk_widget_set_sensitive(if_dlg_data->ip_lb, FALSE);
- g_string_append(if_tool_str, "unknown");
- }
- eb = gtk_event_box_new ();
- gtk_container_add(GTK_CONTAINER(eb), if_dlg_data->ip_lb);
- gtk_table_attach_defaults(GTK_TABLE(if_tb), eb, 5, 6, row, row+1);
- if (get_ip_addr_count(if_info->addrs) > 1) {
- /* More than one IP address, make it possible to toggle */
- g_object_set_data(G_OBJECT(eb), CAPTURE_IF_IP_ADDR_LABEL, if_dlg_data->ip_lb);
- g_signal_connect(eb, "enter-notify-event", G_CALLBACK(ip_label_enter_cb), NULL);
- g_signal_connect(eb, "leave-notify-event", G_CALLBACK(ip_label_leave_cb), NULL);
- g_signal_connect(eb, "button-press-event", G_CALLBACK(ip_label_press_cb), if_info->addrs);
- }
+ if (if_info->description) {
+ g_string_append(if_tool_str, "Description: ");
+ g_string_append(if_tool_str, if_info->description);
g_string_append(if_tool_str, "\n");
+ }
+
+ /* IP address */
+ /* Only one IP address will be shown, start with the first */
+ g_string_append(if_tool_str, "IP: ");
+ if_dlg_data->ip_lb = gtk_label_new("");
+ addr_str = set_ip_addr_label (if_info->addrs, if_dlg_data->ip_lb, 0);
+ if (addr_str) {
+ gtk_widget_set_sensitive(if_dlg_data->ip_lb, TRUE);
+ g_string_append(if_tool_str, addr_str);
+ } else {
+ gtk_widget_set_sensitive(if_dlg_data->ip_lb, FALSE);
+ g_string_append(if_tool_str, "unknown");
+ }
+ eb = gtk_event_box_new ();
+ gtk_container_add(GTK_CONTAINER(eb), if_dlg_data->ip_lb);
+ gtk_table_attach_defaults(GTK_TABLE(if_tb), eb, 5, 6, row, row+1);
+ if (get_ip_addr_count(if_info->addrs) > 1) {
+ /* More than one IP address, make it possible to toggle */
+ g_object_set_data(G_OBJECT(eb), CAPTURE_IF_IP_ADDR_LABEL, if_dlg_data->ip_lb);
+ g_signal_connect(eb, "enter-notify-event", G_CALLBACK(ip_label_enter_cb), NULL);
+ g_signal_connect(eb, "leave-notify-event", G_CALLBACK(ip_label_leave_cb), NULL);
+ g_signal_connect(eb, "button-press-event", G_CALLBACK(ip_label_press_cb), if_info->addrs);
+ }
+ g_string_append(if_tool_str, "\n");
- /* packets */
- if_dlg_data->curr_lb = gtk_label_new("-");
- gtk_table_attach_defaults(GTK_TABLE(if_tb), if_dlg_data->curr_lb, 6, 7, row, row+1);
+ /* packets */
+ if_dlg_data->curr_lb = gtk_label_new("-");
+ gtk_table_attach_defaults(GTK_TABLE(if_tb), if_dlg_data->curr_lb, 6, 7, row, row+1);
- /* packets/s */
- if_dlg_data->last_lb = gtk_label_new("-");
- gtk_table_attach_defaults(GTK_TABLE(if_tb), if_dlg_data->last_lb, 7, 8, row, row+1);
+ /* packets/s */
+ if_dlg_data->last_lb = gtk_label_new("-");
+ gtk_table_attach_defaults(GTK_TABLE(if_tb), if_dlg_data->last_lb, 7, 8, row, row+1);
- /* details button */
+ /* details button */
#ifdef _WIN32
- if_dlg_data->details_bt = gtk_button_new_from_stock(WIRESHARK_STOCK_CAPTURE_DETAILS);
- gtk_widget_set_tooltip_text(if_dlg_data->details_bt, "Open the capture details dialog of this interface.");
- gtk_table_attach_defaults(GTK_TABLE(if_tb), if_dlg_data->details_bt, 8, 9, row, row+1);
- if (capture_if_has_details(if_dlg_data->device)) {
- g_signal_connect(if_dlg_data->details_bt, "clicked", G_CALLBACK(capture_details_cb), if_dlg_data);
- } else {
- gtk_widget_set_sensitive(if_dlg_data->details_bt, FALSE);
- }
+ if_dlg_data->details_bt = gtk_button_new_from_stock(WIRESHARK_STOCK_CAPTURE_DETAILS);
+ gtk_widget_set_tooltip_text(if_dlg_data->details_bt, "Open the capture details dialog of this interface.");
+ gtk_table_attach_defaults(GTK_TABLE(if_tb), if_dlg_data->details_bt, 8, 9, row, row+1);
+ if (capture_if_has_details(if_dlg_data->device)) {
+ g_signal_connect(if_dlg_data->details_bt, "clicked", G_CALLBACK(capture_details_cb), if_dlg_data);
+ } else {
+ gtk_widget_set_sensitive(if_dlg_data->details_bt, FALSE);
+ }
#endif
- if_data_list = g_list_append(if_data_list, if_dlg_data);
-
- row++;
- if (row <= 10) {
+ if_data_list = g_list_append(if_data_list, if_dlg_data);
+
+ row++;
+ if (row <= 10) {
/* Lets add up 10 rows of interfaces, otherwise the window may become too high */
- gtk_widget_get_preferred_size(GTK_WIDGET(if_dlg_data->choose_bt), &requisition, NULL);
- height += requisition.height;
- }
+ gtk_widget_get_preferred_size(GTK_WIDGET(if_dlg_data->choose_bt), &requisition, NULL);
+ height += requisition.height;
+ }
}
g_string_free(if_tool_str, TRUE);
@@ -1010,7 +1011,7 @@ capture_if_cb(GtkWidget *w _U_, gpointer d _U_)
g_signal_connect(capture_bt, "clicked", G_CALLBACK(capture_do_cb), if_dlg_data);
gtk_widget_get_preferred_size(GTK_WIDGET(close_bt), &requisition, NULL);
/* height + static offset + what the GTK MS Windows Engine needs in addition per interface */
- height += requisition.height + 20 + ifs;
+ height += requisition.height + 40 + ifs;
gtk_window_set_default_size(GTK_WINDOW(cap_if_w), -1, height);
gtk_widget_grab_default(close_bt);
@@ -1023,13 +1024,39 @@ capture_if_cb(GtkWidget *w _U_, gpointer d _U_)
set_capture_if_dialog_for_capture_in_progress(gbl_capture_in_progress);
- /* update the interface list every 1000ms */
+ /* update the interface list every 1000ms */
timer_id = g_timeout_add(1000, update_all, sc);
}
-GtkWidget* get_interfaces_dialog_window(void)
+gboolean interfaces_dialog_window_present(void)
{
- return cap_if_w;
+ return (cap_if_w?TRUE:FALSE);
+}
+
+void refresh_if_window(void)
+{
+ capture_if_destroy_cb(NULL, NULL);
+ capture_if_cb(NULL, NULL);
+}
+
+void select_all_interfaces(gboolean enable)
+{
+ if_dlg_data_t *temp;
+ guint ifs;
+ GList *curr;
+
+ for (ifs = 0; ifs < g_list_length(if_data_list); ifs++) {
+ curr = g_list_nth(if_data_list, ifs);
+ temp = (if_dlg_data_t *)(curr->data);
+ update_selected_interface(temp->if_info.name, enable);
+ }
+}
+
+void destroy_if_window(void)
+{
+ if (cap_if_w) {
+ window_destroy(cap_if_w);
+ }
}
#else /* HAVE_LIBPCAP */