diff options
-rw-r--r-- | file.c | 98 | ||||
-rw-r--r-- | file.h | 29 | ||||
-rw-r--r-- | ui/gtk/capture_file_dlg.c | 13 | ||||
-rw-r--r-- | ui/gtk/main_menubar.c | 27 | ||||
-rw-r--r-- | ui/gtk/main_titlebar.c | 2 | ||||
-rw-r--r-- | ui/gtk/main_toolbar.c | 19 | ||||
-rw-r--r-- | ui/qt/main_window.cpp | 44 |
7 files changed, 142 insertions, 90 deletions
@@ -3973,15 +3973,103 @@ cf_can_write_with_wiretap(capture_file *cf) { /* We don't care whether we support the comments in this file or not; if we can't, we'll offer the user the option of discarding the - comments. - - XXX - we shouldn't offer the option of adding or editing comments - of a particular type if we don't support that particular type of - comment in any file format. */ + comments. */ return wtap_dump_can_write(cf->linktypes, 0); } /* + * Should we let the user do a save? + * + * We should if: + * + * the file has unsaved changes, and we can save it in some + * format through Wiretap + * + * or + * + * the file is a temporary file and has no unsaved changes (so + * that "saving" it just means copying it). + * + * XXX - we shouldn't allow files to be edited if they can't be saved, + * so cf->unsaved_changes should be true only if the file can be saved. + * + * We don't care whether we support the comments in this file or not; + * if we can't, we'll offer the user the option of discarding the + * comments. + */ +gboolean +cf_can_save(capture_file *cf) +{ + if (cf->unsaved_changes && wtap_dump_can_write(cf->linktypes, 0)) { + /* Saved changes, and we can write it out with Wiretap. */ + return TRUE; + } + + if (cf->is_tempfile && !cf->unsaved_changes) { + /* + * Temporary file with no unsaved changes, so we can just do a + * raw binary copy. + */ + return TRUE; + } + + /* Nothing to save. */ + return FALSE; +} + +/* + * Should we let the user do a "save as"? + * + * That's true if: + * + * we can save it in some format through Wiretap + * + * or + * + * the file is a temporary file and has no unsaved changes (so + * that "saving" it just means copying it). + * + * XXX - we shouldn't allow files to be edited if they can't be saved, + * so cf->unsaved_changes should be true only if the file can be saved. + * + * We don't care whether we support the comments in this file or not; + * if we can't, we'll offer the user the option of discarding the + * comments. + */ +gboolean +cf_can_save_as(capture_file *cf) +{ + if (wtap_dump_can_write(cf->linktypes, 0)) { + /* We can write it out with Wiretap. */ + return TRUE; + } + + if (cf->is_tempfile && !cf->unsaved_changes) { + /* + * Temporary file with no unsaved changes, so we can just do a + * raw binary copy. + */ + return TRUE; + } + + /* Nothing to save. */ + return FALSE; +} + +/* + * Does this file have unsaved data? + */ +gboolean +cf_not_saved(capture_file *cf) +{ + /* + * If this is a temporary file, or a file with unsaved changes, it + * has unsaved data. + */ + return cf->is_tempfile || cf->unsaved_changes; +} + +/* * Quick scan to find packet offsets. */ static cf_read_status_t @@ -201,15 +201,40 @@ void cf_fake_continue_tail(capture_file *cf); cf_read_status_t cf_finish_tail(capture_file *cf, int *err); /** - * Determine whether this capture file (or a range of it) can be saved + * Determine whether this capture file (or a range of it) can be written * in any format using Wiretap rather than by copying the raw data. * * @param cf the capture file to check - * @return TRUE if it can be saved, FALSE if it can't + * @return TRUE if it can be written, FALSE if it can't */ gboolean cf_can_write_with_wiretap(capture_file *cf); /** + * Determine whether this capture file can be saved with a "save" operation; + * if there's nothing unsaved, it can't. + * + * @param cf the capture file to check + * @return TRUE if it can be saved, FALSE if it can't + */ +gboolean cf_can_save(capture_file *cf); + +/** + * Determine whether this capture file can be saved with a "save as" operation. + * + * @param cf the capture file to check + * @return TRUE if it can be saved, FALSE if it can't + */ +gboolean cf_can_save_as(capture_file *cf); + +/** + * Determine whether this capture file has unsaved data. + * + * @param cf the capture file to check + * @return TRUE if it has unsaved data, FALSE if it doesn't + */ +gboolean cf_not_saved(capture_file *cf); + +/** * Save all packets in a capture file to a new file, and, if that succeeds, * make that file the current capture file. If there's already a file with * that name, do a "safe save", writing to a temporary file in the same diff --git a/ui/gtk/capture_file_dlg.c b/ui/gtk/capture_file_dlg.c index cabbd712e3..2b460159c5 100644 --- a/ui/gtk/capture_file_dlg.c +++ b/ui/gtk/capture_file_dlg.c @@ -1027,9 +1027,9 @@ file_merge_cmd_cb(GtkWidget *widget, gpointer data _U_) { gint response; if (prefs.gui_ask_unsaved) { - if (cfile.is_tempfile || cfile.unsaved_changes) { - /* This is a temporary capture file or has unsaved changes; ask the - user whether to save the capture. */ + if (cf_not_saved(&cfile)) { + /* This file has unsaved data; ask the user whether to save the + capture. */ if (cfile.is_tempfile) { msg_dialog = gtk_message_dialog_new(GTK_WINDOW(top_level), (GtkDialogFlags)(GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT), @@ -1135,10 +1135,9 @@ test_file_close(capture_file *cf, gboolean from_quit, const char *before_what) capture_in_progress = FALSE; if (prefs.gui_ask_unsaved) { - if (cf->is_tempfile || capture_in_progress || cf->unsaved_changes) { - /* This is a temporary capture file, or there's a capture in - progress, or the file has unsaved changes; ask the user whether - to save the data. */ + if (cf_not_saved(cf) || capture_in_progress) { + /* This file has unsaved data or there's a capture in progress; + ask the user whether to save the data. */ if (cf->is_tempfile) { msg_dialog = gtk_message_dialog_new(GTK_WINDOW(top_level), (GtkDialogFlags)(GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT), diff --git a/ui/gtk/main_menubar.c b/ui/gtk/main_menubar.c index 0670ff00ad..7bcf4bf6d2 100644 --- a/ui/gtk/main_menubar.c +++ b/ui/gtk/main_menubar.c @@ -4771,33 +4771,10 @@ set_menus_for_capture_file(capture_file *cf) } else { set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/Merge", cf_can_write_with_wiretap(cf)); set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/Close", TRUE); - /* - * "Save" should be available only if: - * - * the file has unsaved changes, and we can save it in some - * format through Wiretap - * - * or - * - * the file is a temporary file and has no unsaved changes (so - * that "saving" it just means copying it). - */ set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/Save", - (cf->unsaved_changes && cf_can_write_with_wiretap(cf)) || - (cf->is_tempfile && !cf->unsaved_changes)); - /* - * "Save As..." should be available only if: - * - * we can save it in some format through Wiretap - * - * or - * - * the file is a temporary file and has no unsaved changes (so - * that "saving" it just means copying it). - */ + cf_can_save(cf)); set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/SaveAs", - cf_can_write_with_wiretap(cf) || - (cf->is_tempfile && !cf->unsaved_changes)); + cf_can_save_as(cf)); /* * "Export Specified Packets..." should be available only if * we can write the file out in at least one format. diff --git a/ui/gtk/main_titlebar.c b/ui/gtk/main_titlebar.c index edfc2b1094..0d0a8cc2f1 100644 --- a/ui/gtk/main_titlebar.c +++ b/ui/gtk/main_titlebar.c @@ -95,7 +95,7 @@ set_titlebar_for_capture_file(capture_file *cf) if (cf && cf->filename) { display_name = cf_get_display_name(cf); - window_name = g_strdup_printf("%s%s", cf->unsaved_changes ? "*" : "", + window_name = g_strdup_printf("%s%s", cf_not_saved(cf) ? "*" : "", display_name); g_free(display_name); main_set_window_name(window_name); diff --git a/ui/gtk/main_toolbar.c b/ui/gtk/main_toolbar.c index 2abec2bea0..5d11fe9d86 100644 --- a/ui/gtk/main_toolbar.c +++ b/ui/gtk/main_toolbar.c @@ -105,26 +105,15 @@ void set_toolbar_for_capture_file(capture_file *cf) { if (cf == NULL || cf->state == FILE_READ_IN_PROGRESS) { /* We have no open capture file, or we have one but we're in the process of reading it. Disable everything having to - do with the file*/ + do with the file. */ gtk_widget_set_sensitive(GTK_WIDGET(save_button), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(close_button), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(reload_button), FALSE); } else { /* We have an open capture file and we're finished reading it. - Enable "Save" if and only if: - - the file has unsaved changes, and we can save it in some - format through Wiretap - - or - - the file is a temporary file and has no unsaved changes (so - that "saving" it just means copying it). - - Enable "Close" and "Reload". */ - gtk_widget_set_sensitive(GTK_WIDGET(save_button), - (cf->unsaved_changes && cf_can_write_with_wiretap(cf)) || - (cf->is_tempfile && !cf->unsaved_changes)); + Enable "Save" if and only if we have something to save and + can do so. Enable "Close" and "Reload" unconditionally. */ + gtk_widget_set_sensitive(GTK_WIDGET(save_button), cf_can_save(cf)); gtk_widget_set_sensitive(GTK_WIDGET(close_button), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(reload_button), TRUE); } diff --git a/ui/qt/main_window.cpp b/ui/qt/main_window.cpp index 96eb9ea01b..47b4cf556d 100644 --- a/ui/qt/main_window.cpp +++ b/ui/qt/main_window.cpp @@ -372,14 +372,14 @@ void MainWindow::mergeCaptureFile() return; if (prefs.gui_ask_unsaved) { - if (cap_file_->is_tempfile || cap_file_->unsaved_changes) { + if (cf_not_saved(cap_file_)) { QMessageBox msg_dialog; gchar *display_basename; int response; msg_dialog.setIcon(QMessageBox::Question); - /* This is a temporary capture file or has unsaved changes; ask the - user whether to save the capture. */ + /* This file has unsaved data; ask the user whether to save + the capture. */ if (cap_file_->is_tempfile) { msg_dialog.setText(tr("Save packets before merging?")); msg_dialog.setInformativeText(tr("A temporary capture file can't be merged.")); @@ -980,7 +980,7 @@ bool MainWindow::testCaptureFileClose(bool from_quit, QString &before_what) { #endif if (prefs.gui_ask_unsaved) { - if (cap_file_->is_tempfile || capture_in_progress || cap_file_->unsaved_changes) { + if (cf_not_saved(cap_file_) || capture_in_progress) { QMessageBox msg_dialog; QString question; QPushButton *default_button; @@ -988,9 +988,8 @@ bool MainWindow::testCaptureFileClose(bool from_quit, QString &before_what) { msg_dialog.setIcon(QMessageBox::Question); - /* This is a temporary capture file, or there's a capture in - progress, or the file has unsaved changes; ask the user whether - to save the data. */ + /* This file has unsaved data or there's a capture in + progress; ask the user whether to save the data. */ if (cap_file_->is_tempfile) { msg_dialog.setText(tr("You have unsaved packets")); @@ -1121,7 +1120,7 @@ void MainWindow::setTitlebarForCaptureFile() if (cap_file_ && cap_file_->filename) { display_name = cf_get_display_name(cap_file_); - setWindowModified(cap_file_->unsaved_changes); + setWindowModified(cf_not_saved(cap_file_)); // Clear the window title so that setWindowFilePath does something setWindowTitle(NULL); setWindowFilePath(display_name); @@ -1169,33 +1168,8 @@ void MainWindow::setMenusForCaptureFile(bool force_disable) main_ui_->actionFileMerge->setEnabled(cf_can_write_with_wiretap(cap_file_)); main_ui_->actionFileClose->setEnabled(true); - /* - * "Save" should be available only if: - * - * the file has unsaved changes, and we can save it in some - * format through Wiretap - * - * or - * - * the file is a temporary file and has no unsaved changes (so - * that "saving" it just means copying it). - */ - main_ui_->actionFileSave->setEnabled( - (cap_file_->unsaved_changes && cf_can_write_with_wiretap(cap_file_)) || - (cap_file_->is_tempfile && !cap_file_->unsaved_changes)); - /* - * "Save As..." should be available only if: - * - * we can save it in some format through Wiretap - * - * or - * - * the file is a temporary file and has no unsaved changes (so - * that "saving" it just means copying it). - */ - main_ui_->actionFileSaveAs->setEnabled( - cf_can_write_with_wiretap(cap_file_) || - (cap_file_->is_tempfile && !cap_file_->unsaved_changes)); + main_ui_->actionFileSave->setEnabled(cf_can_save(cap_file_)); + main_ui_->actionFileSaveAs->setEnabled(cf_can_save_as(cap_file_)); /* * "Export Specified Packets..." should be available only if * we can write the file out in at least one format. |