aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>2006-02-11 11:21:38 +0000
committerguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>2006-02-11 11:21:38 +0000
commit4eeeb7d9231419272efd9b32edcdec2f0d1591c7 (patch)
treeff956e880115576e487829bce6a27e383a9fe274
parentc3453c37fb10d38d011f8d9b32092a74f2c08b8f (diff)
In "Save As", support only file types we can write to; that simplifies
the logic, making it easier to get it right (fewer interactions between components of the dialog - the file type doesn't affect whether we can save some but not all packets). It also means we don't offer a file type for saving, only to take it away if you choose anything other than saving all packets. If the capture file is a temporary file from a capture done in the current Ethereal session, it's libpcap format, which we can write to, so you would be able to save it. If it's a saved file we read in, saving the file in its entirety in its own format is just copying the file, and it's not clear supporting that adds enough useful functionality to justify the extra complication. Fix "range_update_dynamics()" to update all the rows of the range button/count table properly (make the button active iff there's a non-zero count in the currently-selected column, make a count active iff the column is selected), to select the "Captured" column if the count of displayed packets goes to zero, and to select the "Save all packets" row if the count of packets in the currently-selected row and column goes to zero. (XXX - we should perhaps do that with the "user-defined range" counts as well, which would involve updating the counts on every change to the range field.) git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@17251 f5534014-38df-0310-8fa8-9805f1628bb7
-rw-r--r--gtk/file_dlg.c85
-rw-r--r--gtk/file_dlg.h2
-rw-r--r--gtk/packet_list.c2
-rw-r--r--gtk/range_utils.c144
-rw-r--r--gtk/range_utils.h14
5 files changed, 108 insertions, 139 deletions
diff --git a/gtk/file_dlg.c b/gtk/file_dlg.c
index a2a6dd0da8..5943bcb00c 100644
--- a/gtk/file_dlg.c
+++ b/gtk/file_dlg.c
@@ -1161,20 +1161,8 @@ can_save_with_wiretap(int ft)
}
-/* Generate a list of the file types we can save this file as.
-
- "filetype" is the type it has now.
-
- "encap" is the encapsulation for its packets (which could be
- "unknown" or "per-packet").
-
- "filtered" is TRUE if we're to save only the packets that passed
- the display filter (in which case we have to save it using Wiretap)
- and FALSE if we're to save the entire file (in which case, if we're
- saving it in the type it has already, we can just copy it).
-
- The same applies for sel_curr, sel_all, sel_m_only, sel_m_range and sel_man_range
-*/
+/* Generate a list of the file types we can save this file as, by
+ checking what Wiretap supports. */
static void
set_file_type_list(GtkWidget *option_menu)
{
@@ -1192,23 +1180,19 @@ set_file_type_list(GtkWidget *option_menu)
/* Check all file types. */
index = 0;
for (ft = 0; ft < WTAP_NUM_FILE_TYPES; ft++) {
- if (!packet_range_process_all(&range) || ft != cfile.cd_t) {
- /* not all unfiltered packets or a different file type. We have to use Wiretap. */
- if (!can_save_with_wiretap(ft))
- continue; /* We can't. */
- }
-
- /* OK, we can write it out in this type. */
- ft_menu_item = gtk_menu_item_new_with_label(wtap_file_type_string(ft));
- if (ft == filetype) {
- /* Default to the same format as the file, if it's supported. */
- item_to_select = index;
+ if (can_save_with_wiretap(ft)) {
+ /* OK, we can write it out in this type. */
+ ft_menu_item = gtk_menu_item_new_with_label(wtap_file_type_string(ft));
+ if (ft == filetype) {
+ /* Default to the same format as the file, if it's supported. */
+ item_to_select = index;
+ }
+ SIGNAL_CONNECT(ft_menu_item, "activate", select_file_type_cb,
+ GINT_TO_POINTER(ft));
+ gtk_menu_append(GTK_MENU(ft_menu), ft_menu_item);
+ gtk_widget_show(ft_menu_item);
+ index++;
}
- SIGNAL_CONNECT(ft_menu_item, "activate", select_file_type_cb,
- GINT_TO_POINTER(ft));
- gtk_menu_append(GTK_MENU(ft_menu), ft_menu_item);
- gtk_widget_show(ft_menu_item);
- index++;
}
gtk_option_menu_set_menu(GTK_OPTION_MENU(option_menu), ft_menu);
@@ -1222,46 +1206,26 @@ select_file_type_cb(GtkWidget *w _U_, gpointer data)
GtkWidget *compressed_cb;
if (filetype != new_filetype) {
- /* We can select only the filtered or marked packets to be saved if we can
- use Wiretap to save the file. */
- if (range_tb != NULL)
- range_set_displayed_sensitive(range_tb, can_save_with_wiretap(new_filetype));
filetype = new_filetype;
- file_set_save_marked_sensitive();
- compressed_cb = OBJECT_GET_DATA(file_save_as_w, "compressed");
- gtk_widget_set_sensitive(compressed_cb, wtap_dump_can_compress(new_filetype));
+ compressed_cb = OBJECT_GET_DATA(file_save_as_w, "compressed");
+ gtk_widget_set_sensitive(compressed_cb, wtap_dump_can_compress(new_filetype));
}
}
/*
- * Set the "Save only marked packets" toggle button as appropriate for
- * the current output file type and count of marked packets.
- *
- * Called when the "Save As..." dialog box is created and when either
- * the file type or the marked count changes.
+ * Update various dynamic parts of the range controls; called from outside
+ * the file dialog code whenever the packet counts change.
*/
void
-file_set_save_marked_sensitive(void)
+file_save_update_dynamics(void)
{
if (file_save_as_w == NULL) {
/* We don't currently have a "Save As..." dialog box up. */
return;
}
- /* We can request that only the marked packets be saved only if we
- can use Wiretap to save the file and if there *are* marked packets. */
- if (can_save_with_wiretap(filetype) && cfile.marked_count > 0) {
- range_set_marked_sensitive(range_tb, TRUE);
- }
- else {
- /* Force the "Save only marked packets" toggle to "false", turn
- off the flag it controls, and update the list of types we can
- save the file as. */
- range.process = range_process_all;
- set_file_type_list(ft_om);
- range_set_marked_sensitive(range_tb, FALSE);
- }
+ range_update_dynamics(range_tb);
}
@@ -1345,15 +1309,6 @@ file_save_as_cmd(action_after_save_e action_after_save, gpointer action_after_sa
gtk_box_pack_start(GTK_BOX(ft_hb), ft_om, FALSE, FALSE, 0);
gtk_widget_show(ft_om);
- /*
- * Set the sensitivity of the "Save only marked packets" toggle
- * button
- *
- * This has to be done after we create the file type menu option,
- * as the routine that sets it also sets that menu.
- */
- file_set_save_marked_sensitive();
-
/* dynamic values in the range frame */
range_update_dynamics(range_tb);
diff --git a/gtk/file_dlg.h b/gtk/file_dlg.h
index 7a86136362..9ad1511242 100644
--- a/gtk/file_dlg.h
+++ b/gtk/file_dlg.h
@@ -115,6 +115,6 @@ void file_color_export_cmd_cb(GtkWidget *widget, gpointer data);
* Called when the "Save As..." dialog box is created and when either
* the file type or the marked count changes.
*/
-void file_set_save_marked_sensitive(void);
+void file_save_update_dynamics(void);
#endif /* file_dlg.h */
diff --git a/gtk/packet_list.c b/gtk/packet_list.c
index 8b1e2bc789..4792efc24d 100644
--- a/gtk/packet_list.c
+++ b/gtk/packet_list.c
@@ -314,7 +314,7 @@ set_frame_mark(gboolean set, frame_data *frame, gint row) {
/* call this after last set_frame_mark is done */
static void mark_frames_ready(void) {
- file_set_save_marked_sensitive();
+ file_save_update_dynamics();
packets_bar_update();
}
diff --git a/gtk/range_utils.c b/gtk/range_utils.c
index 703826bd3a..12371f2ca4 100644
--- a/gtk/range_utils.c
+++ b/gtk/range_utils.c
@@ -44,6 +44,7 @@
#define RANGE_CAPTURED_BT_KEY "range_captured_button"
#define RANGE_DISPLAYED_BT_KEY "range_displayed_button"
+#define RANGE_SELECT_ALL_KEY "range_select_all_rb"
#define RANGE_SELECT_ALL_C_KEY "range_select_all_c_lb"
#define RANGE_SELECT_ALL_D_KEY "range_select_all_d_lb"
#define RANGE_SELECT_CURR_KEY "range_select_curr_rb"
@@ -86,65 +87,127 @@ range_check_validity(packet_range_t *range)
/* update all "dynamic" things */
void
-range_update_dynamics(gpointer data) {
+range_update_dynamics(gpointer data)
+{
+ packet_range_t *range;
+ GtkWidget *range_displayed_bt;
gboolean filtered_active;
- gchar label_text[100];
gint selected_num;
- GtkWidget *bt;
- packet_range_t *range;
+ gboolean can_select;
+ gchar label_text[100];
range = OBJECT_GET_DATA(data, RANGE_VALUES_KEY);
- bt = OBJECT_GET_DATA(data, RANGE_DISPLAYED_BT_KEY);
- filtered_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bt));
+ range_displayed_bt = OBJECT_GET_DATA(data, RANGE_DISPLAYED_BT_KEY);
+ filtered_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(range_displayed_bt));
- gtk_widget_set_sensitive(bt, TRUE);
+ /* Enable saving only the displayed packets only if there *are*
+ displayed packets. */
+ if (range->displayed_cnt != 0)
+ gtk_widget_set_sensitive(range_displayed_bt, TRUE);
+ else {
+ /* If saving the displayed packets is selected, select saving the
+ captured packets. */
+ filtered_active = FALSE;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_KEY)), FALSE);
+ gtk_widget_set_sensitive(range_displayed_bt, FALSE);
+ }
gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_C_KEY), !filtered_active);
g_snprintf(label_text, sizeof(label_text), "%u", cfile.count);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_C_KEY)), label_text);
gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_D_KEY), filtered_active);
g_snprintf(label_text, sizeof(label_text), "%u", range->displayed_cnt);
-
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_D_KEY)), label_text);
+ /* Enable saving the currently-selected packet only if there *is* a
+ currently-selected packet. */
selected_num = (cfile.current_frame) ? cfile.current_frame->num : 0;
+ can_select = (selected_num != 0);
+ if (can_select) {
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_KEY), TRUE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_C_KEY), !filtered_active);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_D_KEY), filtered_active);
+ } else {
+ /* If "save selected packet" is selected, select "save all packets". */
+ if (range->process == range_process_selected) {
+ range->process = range_process_all;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_KEY)), TRUE);
+ }
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_KEY), FALSE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_C_KEY), FALSE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_D_KEY), FALSE);
+ }
/* XXX: how to update the radio button label but keep the mnemonic? */
-/* g_snprintf(label_text, sizeof(label_text), "_Selected packet #%u only", selected_num);
+/*g_snprintf(label_text, sizeof(label_text), "_Selected packet #%u only", selected_num);
gtk_label_set_text(GTK_LABEL(GTK_BIN(select_curr_rb)->child), label_text);*/
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_KEY), selected_num);
g_snprintf(label_text, sizeof(label_text), "%u", selected_num ? 1 : 0);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_C_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_C_KEY), selected_num && !filtered_active);
g_snprintf(label_text, sizeof(label_text), "%u", selected_num ? 1 : 0);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_D_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_D_KEY), selected_num && filtered_active);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY), cfile.marked_count > 0);
+ /* Enable the buttons for saving marked packets only if there *are*
+ marked packets. */
+ if (filtered_active)
+ can_select = (range->displayed_marked_cnt != 0);
+ else
+ can_select = (cfile.marked_count > 0);
+ if (can_select) {
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY), TRUE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_C_KEY), !filtered_active);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_D_KEY), filtered_active);
+ }
+ else {
+ /* If "save marked packet" is selected, select "save all packets". */
+ if (range->process == range_process_marked) {
+ range->process = range_process_all;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_KEY)), TRUE);
+ }
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY), FALSE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_C_KEY), FALSE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_D_KEY), FALSE);
+ }
g_snprintf(label_text, sizeof(label_text), "%u", cfile.marked_count);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_C_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_C_KEY), cfile.marked_count > 0 && !filtered_active);
g_snprintf(label_text, sizeof(label_text), "%u", range->displayed_marked_cnt);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_D_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_D_KEY), range->displayed_marked_cnt && filtered_active);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY), range->mark_range_cnt);
- g_snprintf(label_text, sizeof(label_text), "%u", range->mark_range_cnt);
+ /* Enable the buttons for saving the range of marked packets only if
+ there *is* a range of marked packets. */
+ if (filtered_active)
+ can_select = (range->displayed_mark_range_cnt != 0);
+ else
+ can_select = (range->mark_range_cnt != 0);
+ if (can_select) {
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY), TRUE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_C_KEY), !filtered_active);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_D_KEY), filtered_active);
+ }
+ else {
+ /* If "save range between first and last marked packet" is selected,
+ select "save all packets". */
+ if (range->process == range_process_marked_range) {
+ range->process = range_process_all;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_KEY)), TRUE);
+ }
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY), FALSE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_C_KEY), FALSE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_D_KEY), FALSE);
+ }
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_C_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_C_KEY), range->mark_range_cnt && !filtered_active);
g_snprintf(label_text, sizeof(label_text), "%u", range->displayed_mark_range_cnt);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_D_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_D_KEY), range->displayed_mark_range_cnt && filtered_active);
+ g_snprintf(label_text, sizeof(label_text), "%u", range->mark_range_cnt);
gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_USER_KEY), TRUE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_USER_C_KEY), !filtered_active);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_USER_D_KEY), filtered_active);
g_snprintf(label_text, sizeof(label_text), "%u", range->user_range_cnt);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_USER_C_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_USER_C_KEY), !filtered_active);
g_snprintf(label_text, sizeof(label_text), "%u", range->displayed_user_range_cnt);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_USER_D_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_USER_D_KEY), filtered_active);
}
@@ -313,42 +376,6 @@ range_entry_in_event(GtkWidget *widget, GdkEventFocus *event _U_, gpointer user_
}
-/* set the "Process only marked packets" toggle button as appropriate */
-void
-range_set_marked_sensitive(gpointer data, gboolean marked_valid)
-{
- packet_range_t *range;
-
-
- range = OBJECT_GET_DATA(data, RANGE_VALUES_KEY);
-
- /* We can request that only the marked packets be processed only if we
- if there *are* marked packets. */
- if (marked_valid) {
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY), TRUE);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY), TRUE);
- }
- else {
- /* Force the "Process only marked packets" toggle to "false", turn
- off the flag it controls. */
- range->process = range_process_all;
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY)), FALSE);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY)), FALSE);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY), FALSE);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY), FALSE);
- }
-}
-
-
-/* set the "displayed" button as appropriate */
-void
-range_set_displayed_sensitive(gpointer data, gboolean displayed_valid)
-{
-
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_DISPLAYED_BT_KEY), displayed_valid);
-}
-
-
/* create a new range "widget" */
GtkWidget *range_new(packet_range_t *range
#if GTK_MAJOR_VERSION < 2
@@ -477,6 +504,7 @@ GtkWidget *range_new(packet_range_t *range
OBJECT_SET_DATA(range_tb, RANGE_CAPTURED_BT_KEY, captured_bt);
OBJECT_SET_DATA(range_tb, RANGE_DISPLAYED_BT_KEY, displayed_bt);
+ OBJECT_SET_DATA(range_tb, RANGE_SELECT_ALL_KEY, select_all_rb);
OBJECT_SET_DATA(range_tb, RANGE_SELECT_ALL_C_KEY, select_all_c_lb);
OBJECT_SET_DATA(range_tb, RANGE_SELECT_ALL_D_KEY, select_all_d_lb);
@@ -515,7 +543,7 @@ GtkWidget *range_new(packet_range_t *range
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(select_user_range_rb), TRUE);
break;
default:
- g_assert_not_reached();
+ g_assert_not_reached();
}
return range_tb;
diff --git a/gtk/range_utils.h b/gtk/range_utils.h
index 2da6fd272b..8d7ff239c5 100644
--- a/gtk/range_utils.h
+++ b/gtk/range_utils.h
@@ -65,18 +65,4 @@ extern GtkWidget *range_new(packet_range_t *range
*/
extern void range_update_dynamics(gpointer data);
-/** Set the "Process only marked packets" toggle button as appropriate.
- *
- * @param data range widget
- * @param marked_valid TRUE, if marked packets available
- */
-extern void range_set_marked_sensitive(gpointer data, gboolean marked_valid);
-
-/** Set the "displayed" button as appropriate.
- *
- * @param data range widget
- * @param displayed_valid TRUE, if displayed packets available
- */
-extern void range_set_displayed_sensitive(gpointer data, gboolean displayed_valid);
-
#endif