2 * Dialog boxes for handling files
4 * $Id: file_dlg.c,v 1.5 1999/10/02 19:24:27 guy Exp $
6 * Ethereal - Network traffic analyzer
7 * By Gerald Combs <gerald@zing.org>
8 * Copyright 1998 Gerald Combs
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
48 #ifndef __PREFS_DLG_H__
49 #include "prefs_dlg.h"
64 static void file_open_ok_cb(GtkWidget *w, GtkFileSelection *fs);
65 static void file_save_ok_cb(GtkWidget *w, GtkFileSelection *fs);
66 static void file_save_as_ok_cb(GtkWidget *w, GtkFileSelection *fs);
70 file_open_cmd_cb(GtkWidget *w, gpointer data) {
71 GtkWidget *filter_hbox, *filter_bt, *filter_te;
76 file_sel = gtk_file_selection_new ("Ethereal: Open Capture File");
78 /* Connect the ok_button to file_open_ok_cb function and pass along a
79 pointer to the file selection box widget */
80 gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (file_sel)->ok_button),
81 "clicked", (GtkSignalFunc) file_open_ok_cb, file_sel );
83 gtk_object_set_data(GTK_OBJECT(GTK_FILE_SELECTION(file_sel)->ok_button),
84 E_DFILTER_TE_KEY, gtk_object_get_data(GTK_OBJECT(w), E_DFILTER_TE_KEY));
86 filter_hbox = gtk_hbox_new(FALSE, 1);
87 gtk_container_border_width(GTK_CONTAINER(filter_hbox), 0);
88 gtk_box_pack_start(GTK_BOX(GTK_FILE_SELECTION(file_sel)->action_area),
89 filter_hbox, FALSE, FALSE, 0);
90 gtk_widget_show(filter_hbox);
92 filter_bt = gtk_button_new_with_label("Filter:");
93 gtk_signal_connect(GTK_OBJECT(filter_bt), "clicked",
94 GTK_SIGNAL_FUNC(prefs_cb), (gpointer) E_PR_PG_FILTER);
95 gtk_box_pack_start(GTK_BOX(filter_hbox), filter_bt, FALSE, TRUE, 0);
96 gtk_widget_show(filter_bt);
98 filter_te = gtk_entry_new();
99 gtk_object_set_data(GTK_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, filter_te);
100 gtk_box_pack_start(GTK_BOX(filter_hbox), filter_te, TRUE, TRUE, 3);
101 gtk_widget_show(filter_te);
103 gtk_object_set_data(GTK_OBJECT(GTK_FILE_SELECTION(file_sel)->ok_button),
104 E_RFILTER_TE_KEY, filter_te);
106 /* Connect the cancel_button to destroy the widget */
107 gtk_signal_connect_object(GTK_OBJECT (GTK_FILE_SELECTION
108 (file_sel)->cancel_button), "clicked", (GtkSignalFunc)
109 gtk_widget_destroy, GTK_OBJECT (file_sel));
112 if ((sync_mode || fork_mode) && (cf.save_file != NULL))
114 if (cf.save_file != NULL)
116 gtk_file_selection_set_filename(GTK_FILE_SELECTION(file_sel), cf.save_file);
118 gtk_file_selection_set_filename(GTK_FILE_SELECTION(file_sel), "");
120 gtk_widget_show(file_sel);
124 file_open_ok_cb(GtkWidget *w, GtkFileSelection *fs) {
125 gchar *cf_name, *rfilter, *s;
126 GtkWidget *filter_te;
127 dfilter *rfcode = NULL;
130 cf_name = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION (fs)));
131 filter_te = gtk_object_get_data(GTK_OBJECT(w), E_RFILTER_TE_KEY);
132 rfilter = gtk_entry_get_text(GTK_ENTRY(filter_te));
133 if (rfilter[0] != '\0') {
134 rfcode = dfilter_new();
135 if (dfilter_compile(rfcode, rfilter) != 0) {
136 simple_dialog(ESD_TYPE_WARN, NULL, dfilter_error_msg);
137 dfilter_destroy(rfcode);
142 /* Try to open the capture file. */
143 if ((err = open_cap_file(cf_name, &cf)) != 0) {
144 /* We couldn't open it; don't dismiss the open dialog box,
145 just leave it around so that the user can, after they
146 dismiss the alert box popped up for the open error,
149 dfilter_destroy(rfcode);
153 /* Attach the new read filter to "cf" ("open_cap_file()" succeeded, so
154 it closed the previous capture file, and thus destroyed any
155 previous read filter attached to "cf"). */
158 /* We've crossed the Rubicon; get rid of the file selection box. */
159 gtk_widget_hide(GTK_WIDGET (fs));
160 gtk_widget_destroy(GTK_WIDGET (fs));
162 err = read_cap_file(&cf);
163 /* Save the directory name; we can write over cf_name. */
164 s = strrchr(cf_name, '/');
165 if (s && last_open_dir) {
167 if (strcmp(last_open_dir, cf_name) != 0) {
168 g_free(last_open_dir);
169 last_open_dir = g_strdup(cf_name);
172 else if (s) { /* ! last_open_dir */
174 last_open_dir = g_strdup(cf_name);
177 last_open_dir = NULL;
179 set_menu_sensitivity("/File/Save", FALSE);
180 set_menu_sensitivity("/File/Save As...", TRUE);
186 file_close_cmd_cb(GtkWidget *widget, gpointer data) {
187 close_cap_file(&cf, info_bar, file_ctx);
191 file_save_cmd_cb(GtkWidget *w, gpointer data) {
192 file_sel = gtk_file_selection_new ("Ethereal: Save Capture File");
194 /* Connect the ok_button to file_save_ok_cb function and pass along a
195 pointer to the file selection box widget */
196 gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (file_sel)->ok_button),
197 "clicked", (GtkSignalFunc) file_save_ok_cb, file_sel );
199 /* Connect the cancel_button to destroy the widget */
200 gtk_signal_connect_object(GTK_OBJECT (GTK_FILE_SELECTION
201 (file_sel)->cancel_button), "clicked", (GtkSignalFunc)
202 gtk_widget_destroy, GTK_OBJECT (file_sel));
204 gtk_file_selection_set_filename(GTK_FILE_SELECTION(file_sel), "");
206 gtk_widget_show(file_sel);
210 file_save_as_cmd_cb(GtkWidget *w, gpointer data) {
211 file_sel = gtk_file_selection_new ("Ethereal: Save Capture File As");
213 /* Connect the ok_button to file_save_as_ok_cb function and pass along a
214 pointer to the file selection box widget */
215 gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (file_sel)->ok_button),
216 "clicked", (GtkSignalFunc) file_save_as_ok_cb, file_sel );
218 /* Connect the cancel_button to destroy the widget */
219 gtk_signal_connect_object(GTK_OBJECT (GTK_FILE_SELECTION
220 (file_sel)->cancel_button), "clicked", (GtkSignalFunc)
221 gtk_widget_destroy, GTK_OBJECT (file_sel));
223 gtk_file_selection_set_filename(GTK_FILE_SELECTION(file_sel), "");
224 gtk_widget_show(file_sel);
228 file_save_ok_cb(GtkWidget *w, GtkFileSelection *fs) {
232 cf_name = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs)));
233 gtk_widget_hide(GTK_WIDGET (fs));
234 gtk_widget_destroy(GTK_WIDGET (fs));
236 if (!file_mv(cf.save_file, cf_name))
239 g_free(cf.save_file);
240 cf.save_file = g_strdup(cf_name);
242 if ((err = open_cap_file(cf_name, &cf)) == 0) {
243 err = read_cap_file(&cf);
244 set_menu_sensitivity("/File/Save", FALSE);
245 set_menu_sensitivity("/File/Save As...", TRUE);
250 file_save_as_ok_cb(GtkWidget *w, GtkFileSelection *fs) {
254 cf_name = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs)));
255 gtk_widget_hide(GTK_WIDGET (fs));
256 gtk_widget_destroy(GTK_WIDGET (fs));
257 if (!file_cp(cf.filename, cf_name))
260 cf.filename = g_strdup(cf_name);
262 if ((err = open_cap_file(cf.filename, &cf)) == 0) {
263 err = read_cap_file(&cf);
264 set_menu_sensitivity("/File/Save", FALSE);
265 set_menu_sensitivity("/File/Save As...", TRUE);
269 /* Reload a file using the current read and display filters */
271 file_reload_cmd_cb(GtkWidget *w, gpointer data) {
272 /*GtkWidget *filter_te = gtk_object_get_data(GTK_OBJECT(w), E_DFILTER_TE_KEY);*/
273 GtkWidget *filter_te;
275 filter_te = gtk_object_get_data(GTK_OBJECT(w), E_DFILTER_TE_KEY);
277 if (cf.dfilter) g_free(cf.dfilter);
278 cf.dfilter = g_strdup(gtk_entry_get_text(GTK_ENTRY(filter_te)));
279 if (open_cap_file(cf.filename, &cf) == 0)
281 /* XXX - change the menu if the open fails? */