aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Kaiser <wireshark@kaiser.cx>2013-08-21 21:44:48 +0000
committerMartin Kaiser <wireshark@kaiser.cx>2013-08-21 21:44:48 +0000
commit8c484c090b756f0c6eda16688d745792b6bb7f44 (patch)
tree481486d6d1083e22ba1f1a1e721f70620fc9e2d9
parentac73f00086ff62bf19803c34ce31609f587bf187 (diff)
The export PDU mechanism creates a new capture which contains only the
exported PDUs. The currently opened capture file is closed. Make sure that this does not discard any unsaved data. Ask the user for confirmation and save the changes before running the export. svn path=/trunk/; revision=51459
-rw-r--r--ui/gtk/capture_file_dlg.c70
-rw-r--r--ui/gtk/capture_file_dlg.h8
-rw-r--r--ui/gtk/export_pdu_dlg.c63
-rw-r--r--ui/gtk/export_pdu_dlg.h1
4 files changed, 109 insertions, 33 deletions
diff --git a/ui/gtk/capture_file_dlg.c b/ui/gtk/capture_file_dlg.c
index 0c97311512..36523058ed 100644
--- a/ui/gtk/capture_file_dlg.c
+++ b/ui/gtk/capture_file_dlg.c
@@ -58,6 +58,7 @@
#include "ui/gtk/file_dlg.h"
#include "ui/gtk/capture_file_dlg.h"
#include "ui/gtk/drag_and_drop.h"
+#include "ui/gtk/export_pdu_dlg.h"
#include "ui/gtk/main.h"
#include "ui/gtk/color_dlg.h"
#include "ui/gtk/packet_list.h"
@@ -2114,6 +2115,75 @@ file_export_specified_packets_cmd_cb(GtkWidget *w _U_, gpointer data _U_) {
}
+void
+file_export_pdu_ok_cb(GtkWidget *widget _U_, gpointer data)
+{
+ GtkWidget *msg_dialog;
+ gchar *display_basename;
+ gint response;
+
+ if (prefs.gui_ask_unsaved && cf_has_unsaved_data(&cfile)) {
+ if (cfile.is_tempfile) {
+ msg_dialog = gtk_message_dialog_new(GTK_WINDOW(top_level),
+ (GtkDialogFlags)(GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT),
+ GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE,
+ "Do you want to save the captured packets before exporting PDUs?");
+
+ gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(msg_dialog),
+ "After the export, the captured packets will no longer be accessible.");
+ }
+ else {
+ display_basename = g_filename_display_basename(cfile.filename);
+ msg_dialog = gtk_message_dialog_new(GTK_WINDOW(top_level),
+ (GtkDialogFlags)(GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT),
+ GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE,
+ "Do you want to save the changes you've made "
+ "to the capture file \"%s\" before exporting PDUs from it?",
+ display_basename);
+ g_free(display_basename);
+ gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(msg_dialog),
+ "Unsaved changes will be discarded when PDUs are exported.");
+ }
+
+ gtk_dialog_add_button(GTK_DIALOG(msg_dialog),
+ WIRESHARK_STOCK_DONT_SAVE, GTK_RESPONSE_CLOSE);
+ gtk_dialog_add_button(GTK_DIALOG(msg_dialog),
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
+ gtk_dialog_add_button(GTK_DIALOG(msg_dialog),
+ WIRESHARK_STOCK_SAVE, GTK_RESPONSE_ACCEPT);
+ gtk_dialog_set_alternative_button_order(GTK_DIALOG(msg_dialog),
+ GTK_RESPONSE_ACCEPT,
+ GTK_RESPONSE_CANCEL,
+ GTK_RESPONSE_CLOSE,
+ -1);
+ gtk_dialog_set_default_response(GTK_DIALOG(msg_dialog), GTK_RESPONSE_ACCEPT);
+
+ response = gtk_dialog_run(GTK_DIALOG(msg_dialog));
+ gtk_widget_destroy(msg_dialog);
+
+ switch (response) {
+ case GTK_RESPONSE_CLOSE:
+ /* nothing to do, user chose to discard the unsaved data */
+ break;
+
+ case GTK_RESPONSE_ACCEPT:
+ /* save the file but don't close it */
+ do_file_save(&cfile, FALSE);
+ break;
+
+ case GTK_RESPONSE_CANCEL:
+ case GTK_RESPONSE_NONE:
+ case GTK_RESPONSE_DELETE_EVENT:
+ default:
+ /* don't do the export. */
+ return;
+ }
+ }
+
+ do_export_pdu(data);
+}
+
+
/* Reload a file using the current read and display filters */
void
file_reload_cmd_cb(GtkWidget *w _U_, gpointer data _U_) {
diff --git a/ui/gtk/capture_file_dlg.h b/ui/gtk/capture_file_dlg.h
index 7517a24da4..ef1342cb1c 100644
--- a/ui/gtk/capture_file_dlg.h
+++ b/ui/gtk/capture_file_dlg.h
@@ -85,6 +85,14 @@ void file_close_cmd_cb(GtkWidget *widget, gpointer data);
*/
void file_export_specified_packets_cmd_cb(GtkWidget *widget, gpointer data);
+/** User requested the "Export PDUs to file" dialogue box
+ * and pressed OK to start the export
+ *
+ * @param widget parent widget
+ * @param data pointer to internal data used by the export pdu part
+ */
+void file_export_pdu_ok_cb(GtkWidget *widget, gpointer data);
+
/** User requested "Reload".
*
* @param widget parent widget
diff --git a/ui/gtk/export_pdu_dlg.c b/ui/gtk/export_pdu_dlg.c
index 99752a4b8c..a8799a7dc7 100644
--- a/ui/gtk/export_pdu_dlg.c
+++ b/ui/gtk/export_pdu_dlg.c
@@ -38,6 +38,7 @@
#include "ui/alert_box.h"
#include "ui/simple_dialog.h"
+#include "ui/gtk/capture_file_dlg.h"
#include "ui/gtk/dlg_utils.h"
#include "ui/gtk/gui_utils.h"
#include "ui/gtk/filter_dlg.h"
@@ -229,40 +230,36 @@ export_pdu_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
export_pdu_dlg = NULL;
}
-static void
-export_pdu_ok_cb(GtkWidget *widget _U_, gpointer data)
+void
+do_export_pdu(gpointer data)
{
- const char *filter = NULL;
- GString *error_string;
- exp_pdu_t *exp_pdu_tap_data = (exp_pdu_t *)data;
- gchar *tap_name = NULL;
-
- filter = gtk_entry_get_text(GTK_ENTRY(exp_pdu_tap_data->filter_widget));
- tap_name = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(exp_pdu_tap_data->tap_name_widget));
-
- /* Register this tap listener now */
- error_string = register_tap_listener(tap_name, /* The name of the tap we want to listen to */
- exp_pdu_tap_data, /* instance identifier/pointer to a struct holding
- * all state variables
- */
- filter, /* pointer to a filter string */
- TL_REQUIRES_NOTHING, /* flags for the tap listener */
- export_pdu_reset,
- export_pdu_packet,
- export_pdu_draw);
- if (error_string){
- /* Error. We failed to attach to the tap. Clean up */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_free(exp_pdu_tap_data);
- g_string_free(error_string, TRUE);
- return;
- }
-
-
- exp_pdu_file_open(exp_pdu_tap_data);
-
- window_destroy(export_pdu_dlg);
+ const char *filter = NULL;
+ GString *error_string;
+ exp_pdu_t *exp_pdu_tap_data = (exp_pdu_t *)data;
+ gchar *tap_name = NULL;
+
+ filter = gtk_entry_get_text(GTK_ENTRY(exp_pdu_tap_data->filter_widget));
+ tap_name = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(exp_pdu_tap_data->tap_name_widget));
+
+ /* Register this tap listener now */
+ error_string = register_tap_listener(tap_name, /* The name of the tap we want to listen to */
+ exp_pdu_tap_data, /* instance identifier/pointer to a struct holding
+ * all state variables */
+ filter, /* pointer to a filter string */
+ TL_REQUIRES_NOTHING, /* flags for the tap listener */
+ export_pdu_reset,
+ export_pdu_packet,
+ export_pdu_draw);
+ if (error_string){
+ /* Error. We failed to attach to the tap. Clean up */
+ simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
+ g_free(exp_pdu_tap_data);
+ g_string_free(error_string, TRUE);
+ return;
+ }
+ exp_pdu_file_open(exp_pdu_tap_data);
+ window_destroy(export_pdu_dlg);
}
@@ -353,7 +350,7 @@ export_pdu_show_cb(GtkWidget *w _U_, gpointer d _U_)
gtk_widget_set_tooltip_text(close_bt, "Close this dialog");
ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(export_pdu_ok_cb), exp_pdu_tap_data);
+ g_signal_connect(ok_bt, "clicked", G_CALLBACK(file_export_pdu_ok_cb), exp_pdu_tap_data);
gtk_widget_grab_default(ok_bt);
gtk_widget_set_tooltip_text(ok_bt, "Export PDU:s to a temporary capture file");
diff --git a/ui/gtk/export_pdu_dlg.h b/ui/gtk/export_pdu_dlg.h
index 593961934a..f443ec4564 100644
--- a/ui/gtk/export_pdu_dlg.h
+++ b/ui/gtk/export_pdu_dlg.h
@@ -27,5 +27,6 @@
#define __EXPORT_PDU_DLG_H__
void export_pdu_show_cb(GtkWidget *widget, gpointer data);
+void do_export_pdu(gpointer data);
#endif /* __EXPORT_PDU_DLG_H__ */