From bcd2cea7740a78ef0387ce7664b8f61fd731fd58 Mon Sep 17 00:00:00 2001 From: Gerald Combs Date: Wed, 3 Oct 2012 19:24:14 +0000 Subject: [PATCH] Unify the GTK+ and Win32 versions of "Export Specified Packets". Add a shared "file_add_extension" routine. We no longer support _MSC_VER < 1400 so get rid of some clutter. Add a gzip checkbox to the Win32 export packets dialog. Windows code hasn't yet been tested (and is likely broken). I'll fix it shortly. svn path=/trunk/; revision=45296 --- image/file_dlg_win32.rc | 8 +- ui/gtk/capture_file_dlg.c | 390 +++++++++++++++++++------------------- ui/win32/file_dlg_win32.c | 227 +++++----------------- ui/win32/file_dlg_win32.h | 10 +- 4 files changed, 257 insertions(+), 378 deletions(-) diff --git a/image/file_dlg_win32.rc b/image/file_dlg_win32.rc index fa179e115b..7236a8fab7 100644 --- a/image/file_dlg_win32.rc +++ b/image/file_dlg_win32.rc @@ -27,17 +27,17 @@ FONT 8, "MS Shell Dlg" LTEXT "Elapsed:", EWFD_PT_ELAPSED, 224, 62, 40, 8 LTEXT "-", EWFD_PTX_ELAPSED, 271, 62, 150, 8 // 164/211, 79, 40/150, 8 - + } WIRESHARK_SAVEASFILENAME_TEMPLATE DIALOGEX 0, 0, 167, 15 STYLE WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | DS_3DLOOK | DS_CONTROL FONT 8, "MS Shell Dlg" { - CHECKBOX "Compress with gzip", EWFD_GZIP_CB, 67, 0, 100, 8, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Compress with gzip", EWFD_GZIP_CB, 67, 0, 100, 8, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP } -WIRESHARK_EXPORT_SPECIFIED_PACKETS_FILENAME_TEMPLATE DIALOGEX 0, 0, 275, 107 +WIRESHARK_EXPORT_SPECIFIED_PACKETS_FILENAME_TEMPLATE DIALOGEX 0, 0, 442, 107 STYLE WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | DS_3DLOOK | DS_CONTROL FONT 8, "MS Shell Dlg" { @@ -67,6 +67,8 @@ FONT 8, "MS Shell Dlg" LTEXT "0", EWFD_FIRST_LAST_DISP, 282, 60, 41, 8, SS_RIGHT LTEXT "0", EWFD_RANGE_DISP, 282, 72, 41, 8, SS_RIGHT LTEXT "0", EWFD_IGNORED_DISP, 282, 84, 41, 8, SS_RIGHT + + CHECKBOX "Compress with gzip", EWFD_GZIP_CB, 342, 0, 100, 8, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP } WIRESHARK_MERGEFILENAME_TEMPLATE DIALOGEX 0, 0, 421, 77 diff --git a/ui/gtk/capture_file_dlg.c b/ui/gtk/capture_file_dlg.c index 41e654cf22..32c9e7db7d 100644 --- a/ui/gtk/capture_file_dlg.c +++ b/ui/gtk/capture_file_dlg.c @@ -82,7 +82,6 @@ static void do_file_save(capture_file *cf, gboolean dont_reopen); static void file_save_as_cmd(capture_file *cf, gboolean must_support_comments, gboolean dont_reopen); static void file_select_file_type_cb(GtkWidget *w, gpointer data); -static cf_write_status_t file_export_specified_packets_cb(GtkWidget *fs, packet_range_t *range); static int set_file_type_list(GtkWidget *combo_box, capture_file *cf, gboolean must_support_comments); static gboolean test_file_close(capture_file *cf, gboolean from_quit, @@ -1698,6 +1697,65 @@ gtk_save_as_file(GtkWidget *w _U_, capture_file *cf, GString *file_name, int *fi } #endif /* USE_WIN32_FILE_DIALOGS */ +static void +file_add_extension(GString *file_name, int file_type, gboolean compressed) { + gchar *file_name_lower; + GString *file_suffix; + GSList *extensions_list, *extension; + gboolean add_extension; + + /* + * Append the default file extension if there's none given by + * the user or if they gave one that's not one of the valid + * extensions for the file type. + */ + file_name_lower = g_utf8_strdown(file_name->str, -1); + file_suffix = g_string_new(""); + extensions_list = wtap_get_file_extensions_list(file_type, FALSE); + if (extensions_list != NULL) { + /* We have one or more extensions for this file type. + Start out assuming we need to add the default one. */ + add_extension = TRUE; + + /* OK, see if the file has one of those extensions. */ + for (extension = extensions_list; extension != NULL; + extension = g_slist_next(extension)) { + g_string_printf(file_suffix, ".%s", (char *)extension->data); + if (g_str_has_suffix(file_name_lower, file_suffix->str)) { + /* + * The file name has one of the extensions for + * this file type. + */ + add_extension = FALSE; + break; + } + g_string_append(file_suffix, ".gz"); + if (g_str_has_suffix(file_name_lower, file_suffix->str)) { + /* + * The file name has one of the extensions for + * this file type. + */ + add_extension = FALSE; + break; + } + } + } else { + /* We have no extensions for this file type. Don't add one. */ + add_extension = FALSE; + } + g_free(file_name_lower); + g_string_free(file_suffix, TRUE); + if (add_extension) { + if (wtap_default_file_extension(file_type) != NULL) { + g_string_append_printf(file_name, ".%s", + wtap_default_file_extension(file_type)); + if (compressed) { + g_string_append(file_name, ".gz"); + } + } + } +} + /* Save a file with a user-specified name */ /* @@ -1716,10 +1774,6 @@ file_save_as_cmd(capture_file *cf, gboolean must_support_comments, int file_type; gboolean compressed; cf_write_status_t status; - gchar *file_name_lower; - GString *file_suffix; - GSList *extensions_list, *extension; - gboolean add_extension; gchar *dirname; gboolean discard_comments = FALSE; @@ -1778,56 +1832,7 @@ file_save_as_cmd(capture_file *cf, gboolean must_support_comments, return; } - /* - * Append the default file extension if there's none given by - * the user or if they gave one that's not one of the valid - * extensions for the file type. - */ - file_name_lower = g_utf8_strdown(file_name->str, -1); - file_suffix = g_string_new(""); - extensions_list = wtap_get_file_extensions_list(file_type, FALSE); - if (extensions_list != NULL) { - /* We have one or more extensions for this file type. - Start out assuming we need to add the default one. */ - add_extension = TRUE; - - /* OK, see if the file has one of those extensions. */ - for (extension = extensions_list; extension != NULL; - extension = g_slist_next(extension)) { - g_string_printf(file_suffix, ".%s", (char *)extension->data); - if (g_str_has_suffix(file_name_lower, file_suffix->str)) { - /* - * The file name has one of the extensions for - * this file type. - */ - add_extension = FALSE; - break; - } - g_string_append(file_suffix, ".gz"); - if (g_str_has_suffix(file_name_lower, file_suffix->str)) { - /* - * The file name has one of the extensions for - * this file type. - */ - add_extension = FALSE; - break; - } - } - } else { - /* We have no extensions for this file type. Don't add one. */ - add_extension = FALSE; - } - g_free(file_name_lower); - g_string_free(file_suffix, TRUE); - if (add_extension) { - if (wtap_default_file_extension(file_type) != NULL) { - g_string_append_printf(file_name, ".%s", - wtap_default_file_extension(file_type)); - if (compressed) { - g_string_append(file_name, ".gz"); - } - } - } + file_add_extension(file_name, file_type, compressed); #ifndef _WIN32 /* If the file exists and it's user-immutable or not writable, @@ -1846,7 +1851,7 @@ file_save_as_cmd(capture_file *cf, gboolean must_support_comments, case CF_WRITE_OK: /* The save succeeded; we're done. */ /* Save the directory name for future file dialogs. */ - dirname = get_dirname(file_name->str); /* Overwrites cf_name */ + dirname = get_dirname(file_name->str); /* Overwrites file_name->str */ set_last_open_dir(dirname); /* If we discarded comments, redraw the packet list to reflect any packets that no longer have comments. */ @@ -1875,27 +1880,22 @@ file_save_as_cmd_cb(GtkWidget *w _U_, gpointer data _U_) file_save_as_cmd(&cfile, FALSE, FALSE); } -void -file_export_specified_packets_cmd_cb(GtkWidget *widget _U_, gpointer data _U_) +#ifndef USE_WIN32_FILE_DIALOGS +static gboolean +gtk_export_specified_packets_file(GtkWidget *w _U_, GString *file_name, int *file_type, + gboolean *compressed, packet_range_t *range) { -#ifdef USE_WIN32_FILE_DIALOGS - win32_export_specified_packets_file(GDK_WINDOW_HWND(gtk_widget_get_window(top_level))); -#else /* USE_WIN32_FILE_DIALOGS */ GtkWidget *file_export_specified_packets_w; GtkWidget *main_vb, *ft_hb, *ft_lb, *ft_combo_box, *range_fr, *range_tb, *compressed_cb; - packet_range_t range; char *cf_name; - gchar *display_basename; - GtkWidget *msg_dialog; + gpointer ptr; + + if (!file_name || !file_type || !compressed || !range) + return FALSE; /* Default to writing out all displayed packets, in the file's current format. */ - /* init the packet range */ - packet_range_init(&range); - range.process_filtered = TRUE; - range.include_dependents = TRUE; - /* build the file selection */ file_export_specified_packets_w = file_selection_new("Wireshark: Export Specified Packets", FILE_SELECTION_SAVE); @@ -1915,7 +1915,7 @@ file_export_specified_packets_cmd_cb(GtkWidget *widget _U_, gpointer data _U_) gtk_widget_show(range_fr); /* range table */ - range_tb = range_new(&range, TRUE); + range_tb = range_new(range, TRUE); gtk_container_add(GTK_CONTAINER(range_fr), range_tb); gtk_widget_show(range_tb); @@ -1950,142 +1950,138 @@ file_export_specified_packets_cmd_cb(GtkWidget *widget _U_, gpointer data _U_) g_signal_connect(ft_combo_box, "changed", G_CALLBACK(file_select_file_type_cb), file_export_specified_packets_w); ws_combo_box_set_active(GTK_COMBO_BOX(ft_combo_box), 0); - /* - * Loop until the user either selects a file or gives up. - */ - for (;;) { - cf_name = file_selection_run(file_export_specified_packets_w); - if (cf_name == NULL) { - /* User cancelled or closed the dialog. */ - return; - } - - /* Check whether the range is valid. */ - if (!range_check_validity_modal(file_export_specified_packets_w, &range)) { - /* The range isn't valid; the user was told that, and dismissed - the dialog telling them that, so let them fix the range - and try again, or cancel. */ - g_free(cf_name); - continue; - } - - /* - * Check that we're not going to save on top of the current - * capture file. - * We do it here so we catch all cases ... - * Unfortunately, the file requester gives us an absolute file - * name and the read file name may be relative (if supplied on - * the command line). From Joerg Mayer. - */ - if (files_identical(cfile.filename, cf_name)) { - display_basename = g_filename_display_basename(cf_name); - msg_dialog = gtk_message_dialog_new(GTK_WINDOW(file_export_specified_packets_w), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_OK, - "The file \"%s\" is the capture file from which you're exporting the packets.", - display_basename); - g_free(display_basename); - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(msg_dialog), - "You cannot export packets on top of the current capture file."); - gtk_dialog_run(GTK_DIALOG(msg_dialog)); - gtk_widget_destroy(msg_dialog); - g_free(cf_name); - continue; - } - -#ifndef _WIN32 - /* If the file exists and it's user-immutable or not writable, - ask the user whether they want to override that. */ - if (!file_target_unwritable_ui(file_export_specified_packets_w, cf_name)) { - /* They don't. Let them try another file name or cancel. */ - g_free(cf_name); - continue; - } -#endif - - /* attempt to export the packets */ - g_free(cf_name); - switch (file_export_specified_packets_cb(file_export_specified_packets_w, - &range)) { - - case CF_WRITE_OK: - /* The save succeeded; we're done. */ - return; - - case CF_WRITE_ERROR: - /* The save failed; let the user try again */ - continue; - - case CF_WRITE_ABORTED: - /* The user aborted the save; just return. */ - return; - } + cf_name = file_selection_run(file_export_specified_packets_w); + if (cf_name == NULL) { + /* User cancelled or closed the dialog. */ + return FALSE; } -#endif /* USE_WIN32_FILE_DIALOGS */ -} - -/* all tests ok, we only have to write out the packets */ -/* (and probably continue with a pending operation) */ -static cf_write_status_t -file_export_specified_packets_cb(GtkWidget *fs, packet_range_t *range) -{ - GtkWidget *ft_combo_box; - GtkWidget *compressed_cb; - gchar *cf_name; - gchar *dirname; - gpointer ptr; - int file_type; - gboolean compressed; - cf_write_status_t status; - - /* Hide the file chooser while we're doing the export. */ - gtk_widget_hide(fs); - - cf_name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fs)); - - compressed_cb = (GtkWidget *)g_object_get_data(G_OBJECT(fs), E_COMPRESSED_CB_KEY); - ft_combo_box = (GtkWidget *)g_object_get_data(G_OBJECT(fs), E_FILE_TYPE_COMBO_BOX_KEY); if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(ft_combo_box), &ptr)) { g_assert_not_reached(); /* Programming error: somehow nothing is active */ } - file_type = GPOINTER_TO_INT(ptr); - compressed = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(compressed_cb)); + *file_type = GPOINTER_TO_INT(ptr); + *compressed = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(compressed_cb)); - /* Write out the specified packets to the file with the specified name. */ - status = cf_export_specified_packets(&cfile, cf_name, range, file_type, - compressed); - switch (status) { + /* We've crossed the Rubicon; get rid of the file export box. */ + window_destroy(GTK_WIDGET(file_export_specified_packets_w)); - case CF_WRITE_OK: - /* The write succeeded; get rid of the file selection box. */ - /* cf_export_specified_packets() might already closed our dialog! */ - window_destroy(GTK_WIDGET(fs)); - - /* Save the directory name for future file dialogs. - XXX - should there be separate ones for "Save As" and - "Export Specified Packets"? */ - dirname = get_dirname(cf_name); /* Overwrites cf_name */ - set_last_open_dir(dirname); - break; - - case CF_WRITE_ERROR: - /* The write failed. - just leave the file selection box around so that the user can, - after they dismiss the alert box popped up for the error, try - again. */ - break; - - case CF_WRITE_ABORTED: - /* The write was aborted; just get rid of the file selection - box and return. */ - window_destroy(fs); - break; - } + g_string_printf(file_name, "%s", cf_name); g_free(cf_name); - return status; + return TRUE; } +#endif /* USE_WIN32_FILE_DIALOGS */ + +/* + * _export_specified_packets_file routines should upon entry... + * Set the path and fill in the filename if the path+filename is provided. + * ...and upon exit... + * Return TRUE on "OK" and "FALSE" on "Cancel". + * Close the window. + */ + +void +file_export_specified_packets_cmd_cb(GtkWidget *w _U_, gpointer data _U_) { + GString *file_name = g_string_new(""); + int file_type; + gboolean compressed; + packet_range_t range; + cf_write_status_t status; + gchar *dirname; + gchar *display_basename; + GtkWidget *msg_dialog; + + /* init the packet range */ + packet_range_init(&range); + range.process_filtered = TRUE; + range.include_dependents = TRUE; + + /* + * Loop until the user either selects a file or gives up. + */ + for (;;) { +#ifdef USE_WIN32_FILE_DIALOGS + if (win32_export_specified_packets_file(GDK_WINDOW_HWND(gtk_widget_get_window(top_level)), + file_name, &file_type, &compressed, &range)) { +#else /* USE_WIN32_FILE_DIALOGS */ + if (gtk_export_specified_packets_file(w, file_name, &file_type, &compressed, &range)) { +#endif /* USE_WIN32_FILE_DIALOGS */ + + /* Check whether the range is valid. */ + if (!range_check_validity_modal(top_level, &range)) { + /* The range isn't valid; the user was told that, and dismissed + the dialog telling them that, so let them fix the range + and try again, or cancel. */ + continue; + } + + /* XXX - Check for comments? */ + + /* + * Check that we're not going to save on top of the current + * capture file. + * We do it here so we catch all cases ... + * Unfortunately, the file requester gives us an absolute file + * name and the read file name may be relative (if supplied on + * the command line). From Joerg Mayer. + */ + if (files_identical(cfile.filename, file_name->str)) { + display_basename = g_filename_display_basename(file_name->str); + msg_dialog = gtk_message_dialog_new(GTK_WINDOW(top_level), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + "The file \"%s\" is the capture file from which you're exporting the packets.", + display_basename); + g_free(display_basename); + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(msg_dialog), + "You cannot export packets on top of the current capture file."); + gtk_dialog_run(GTK_DIALOG(msg_dialog)); + gtk_widget_destroy(msg_dialog); + continue; + } + + file_add_extension(file_name, file_type, compressed); + +#ifndef _WIN32 + /* If the file exists and it's user-immutable or not writable, + ask the user whether they want to override that. */ + if (!file_target_unwritable_ui(top_level, file_name->str)) { + /* They don't. Let them try another file name or cancel. */ + continue; + } +#endif + + /* Attempt to export the file */ + status = cf_export_specified_packets(&cfile, file_name->str, &range, file_type, + compressed); + switch (status) { + + case CF_WRITE_OK: + /* The write succeeded; get rid of the file selection box. */ + /* cf_export_specified_packets() might already closed our dialog! */ + + /* Save the directory name for future file dialogs. + XXX - should there be separate ones for "Save As" and + "Export Specified Packets"? */ + dirname = get_dirname(file_name->str); /* Overwrites file_name->str */ + set_last_open_dir(dirname); + break; + + case CF_WRITE_ERROR: + /* The save failed; let the user try again. */ + continue; + + case CF_WRITE_ABORTED: + /* The user aborted the save; just return. */ + g_string_free(file_name, TRUE); + return; + } + } + g_string_free(file_name, TRUE); + return; + } +} + /* Reload a file using the current read and display filters */ void diff --git a/ui/win32/file_dlg_win32.c b/ui/win32/file_dlg_win32.c index fef9e49c3f..164d0898e5 100644 --- a/ui/win32/file_dlg_win32.c +++ b/ui/win32/file_dlg_win32.c @@ -106,28 +106,6 @@ typedef enum { #define FILE_DEFAULT_COLOR 2 -/* - * We should probably test the SDK version instead of the compiler version, - * but this should work for our purposes. - */ -#if (_MSC_VER <= 1200) -static UINT CALLBACK open_file_hook_proc(HWND of_hwnd, UINT ui_msg, WPARAM w_param, LPARAM l_param); -static UINT CALLBACK save_as_file_hook_proc(HWND of_hwnd, UINT ui_msg, WPARAM w_param, LPARAM l_param); -static UINT CALLBACK export_specified_packets_file_hook_proc(HWND of_hwnd, UINT ui_msg, WPARAM w_param, LPARAM l_param); -static UINT CALLBACK merge_file_hook_proc(HWND mf_hwnd, UINT ui_msg, WPARAM w_param, LPARAM l_param); -static UINT CALLBACK export_file_hook_proc(HWND of_hwnd, UINT ui_msg, WPARAM w_param, LPARAM l_param); -static UINT CALLBACK export_raw_file_hook_proc(HWND of_hwnd, UINT ui_msg, WPARAM w_param, LPARAM l_param); -static UINT CALLBACK export_sslkeys_file_hook_proc(HWND of_hwnd, UINT ui_msg, WPARAM w_param, LPARAM l_param); -#else -static UINT_PTR CALLBACK open_file_hook_proc(HWND of_hwnd, UINT ui_msg, WPARAM w_param, LPARAM l_param); -static UINT_PTR CALLBACK save_as_file_hook_proc(HWND of_hwnd, UINT ui_msg, WPARAM w_param, LPARAM l_param); -static UINT_PTR CALLBACK export_specified_packets_file_hook_proc(HWND of_hwnd, UINT ui_msg, WPARAM w_param, LPARAM l_param); -static UINT_PTR CALLBACK merge_file_hook_proc(HWND mf_hwnd, UINT ui_msg, WPARAM w_param, LPARAM l_param); -static UINT_PTR CALLBACK export_file_hook_proc(HWND of_hwnd, UINT ui_msg, WPARAM w_param, LPARAM l_param); -static UINT_PTR CALLBACK export_raw_file_hook_proc(HWND of_hwnd, UINT ui_msg, WPARAM w_param, LPARAM l_param); -static UINT_PTR CALLBACK export_sslkeys_file_hook_proc(HWND of_hwnd, UINT ui_msg, WPARAM w_param, LPARAM l_param); -#endif /* (_MSC_VER <= 1200) */ - static void range_update_dynamics(HWND sf_hwnd, packet_range_t *range); static void range_handle_wm_initdialog(HWND dlg_hwnd, packet_range_t *range); static void range_handle_wm_command(HWND dlg_hwnd, HWND ctrl, WPARAM w_param, packet_range_t *range); @@ -136,11 +114,11 @@ static TCHAR *build_file_open_type_list(void); static TCHAR *build_file_save_type_list(GArray *savable_file_types, gboolean must_support_comments); -static int g_filetype; -static gboolean g_compressed; -static packet_range_t g_range; -static merge_action_e g_merge_action; -static print_args_t print_args; +static int g_filetype; +static gboolean g_compressed; +static packet_range_t *g_range; +static merge_action_e g_merge_action; +static print_args_t print_args; /* XXX - The reason g_sf_hwnd exists is so that we can call * range_update_dynamics() from anywhere; it's currently * static, but if we move to using the native Windows @@ -222,11 +200,7 @@ win32_open_file (HWND h_wnd, GString *file_name, GString *display_filter) { ofn->lStructSize = ofnsize; ofn->hwndOwner = h_wnd; -#if (_MSC_VER <= 1200) - ofn->hInstance = (HINSTANCE) GetWindowLong(h_wnd, GWL_HINSTANCE); -#else ofn->hInstance = (HINSTANCE) GetWindowLongPtr(h_wnd, GWLP_HINSTANCE); -#endif ofn->lpstrFilter = build_file_open_type_list(); ofn->lpstrCustomFilter = NULL; ofn->nMaxCustFilter = 0; @@ -403,11 +377,7 @@ win32_save_as_file(HWND h_wnd, capture_file *cf, GString *file_name, int *file_t ofn->lStructSize = ofnsize; ofn->hwndOwner = h_wnd; -#if (_MSC_VER <= 1200) - ofn->hInstance = (HINSTANCE) GetWindowLong(h_wnd, GWL_HINSTANCE); -#else ofn->hInstance = (HINSTANCE) GetWindowLongPtr(h_wnd, GWLP_HINSTANCE); -#endif ofn->lpstrFilter = build_file_save_type_list(savable_file_types, must_support_comments); ofn->lpstrCustomFilter = NULL; @@ -452,25 +422,34 @@ win32_save_as_file(HWND h_wnd, capture_file *cf, GString *file_name, int *file_t return gsfn_ok; } -void -win32_export_specified_packets_file(HWND h_wnd) { +gboolean +win32_export_specified_packets_file(HWND h_wnd, GString *file_name, + int *file_type, + gboolean *compressed, + packet_range_t *range) { GArray *savable_file_types; OPENFILENAME *ofn; TCHAR file_name16[MAX_PATH] = _T(""); - GString *file_name8; - gchar *file_last_dot; - GSList *extensions_list, *extension; - gboolean add_extension; - gchar *dirname; int ofnsize; + gboolean gsfn_ok; #if (_MSC_VER >= 1500) OSVERSIONINFO osvi; #endif + if (!file_name || !file_type || !compressed || !range) + return FALSE; + + if (file_name->len > 0) { + StringCchCopy(file_name16, MAX_PATH, utf_8to16(file_name->str)); + } + savable_file_types = wtap_get_savable_file_types(cfile.cd_t, cfile.linktypes); if (savable_file_types == NULL) return; /* shouldn't happen - the "Save As..." item should be disabled if we can't save the file */ + g_range = range; + g_compressed = FALSE; + /* see OPENFILENAME comment in win32_open_file */ #if (_MSC_VER >= 1500) SecureZeroMemory(&osvi, sizeof(OSVERSIONINFO)); @@ -488,11 +467,7 @@ win32_export_specified_packets_file(HWND h_wnd) { ofn->lStructSize = ofnsize; ofn->hwndOwner = h_wnd; -#if (_MSC_VER <= 1200) - ofn->hInstance = (HINSTANCE) GetWindowLong(h_wnd, GWL_HINSTANCE); -#else ofn->hInstance = (HINSTANCE) GetWindowLongPtr(h_wnd, GWLP_HINSTANCE); -#endif ofn->lpstrFilter = build_file_save_type_list(savable_file_types, FALSE); ofn->lpstrCustomFilter = NULL; ofn->nMaxCustFilter = 0; @@ -510,82 +485,31 @@ win32_export_specified_packets_file(HWND h_wnd) { ofn->lpfnHook = export_specified_packets_file_hook_proc; ofn->lpTemplateName = _T("WIRESHARK_EXPORT_SPECIFIED_PACKETS_FILENAME_TEMPLATE"); - if (GetSaveFileName(ofn)) { - g_filetype = g_array_index(savable_file_types, int, ofn->nFilterIndex - 1); + gsfn_ok = GetSaveFileName(ofn); - /* - * Append the default file extension if there's none given by the user - * or if they gave one that's not one of the valid extensions for - * the file type. - */ - file_name8 = g_string_new(utf_16to8(file_name16)); - file_last_dot = strrchr(file_name8->str,'.'); - extensions_list = wtap_get_file_extensions_list(g_filetype, FALSE); - if (extensions_list != NULL) { - /* We have one or more extensions for this file type. - Start out assuming we need to add the default one. */ - add_extension = TRUE; - if (file_last_dot != NULL) { - /* Skip past the dot. */ - file_last_dot++; - - /* OK, see if the file has one of those extensions. */ - for (extension = extensions_list; extension != NULL; - extension = g_slist_next(extension)) { - if (g_ascii_strcasecmp((char *)extension->data, file_last_dot) == 0) { - /* The file name has one of the extensions for this file type */ - add_extension = FALSE; - break; - } - } - } - } else { - /* We have no extensions for this file type. Don't add one. */ - add_extension = FALSE; + if (gsfn_ok) { + g_string_printf(file_name, "%s", utf_16to8(file_name16)); + /* What file format was specified? */ + *file_type = g_array_index(savable_file_types, int, ofn->nFilterIndex - 1); + *compressed = g_compressed; + } else { + /* User cancelled or closed the dialog, or an error occurred. */ + if (CommDlgExtendedError() != 0) { + /* XXX - pop up some error here. FNERR_INVALIDFILENAME + * might be a user error; if so, they should know about + * it. For now we force a do-over. + */ + g_string_truncate(file_name, 0); + gsfn_ok = TRUE; } - if (add_extension) { - if (wtap_default_file_extension(g_filetype) != NULL) { - g_string_append_printf(file_name8, ".%s", wtap_default_file_extension(g_filetype)); - } - } - - g_sf_hwnd = NULL; - - /* - * GetSaveFileName() already asked the user if he wants to overwrite - * the old file, so if we are here, the user already said "yes". - * Write out the specified packets to the file with the specified - * name. - * - * XXX: if the cf_export_specified_packets() fails, it will do a - * GTK+ simple_dialog(), which is not useful while runing a Windows - * dialog. - * (A GTK dialog box will be generated and basically will - * only appear when the redisplayed Windows 'save_as-file' - * dialog is dismissed. It will then need to be dismissed. - * This should be fixed even though the cf_save_packets() - * presumably should rarely fail in this case. - */ - if (cf_export_specified_packets(&cfile, file_name8->str, &g_range, g_filetype, FALSE) != CF_OK) { - /* The write failed. Try again. */ - g_array_free(savable_file_types, TRUE); - g_string_free(file_name8, TRUE /* free_segment */); - g_free( (void *) ofn->lpstrFilter); - g_free( (void *) ofn); - win32_export_specified_packets_file(h_wnd); - return; - } - - /* Save the directory name for future file dialogs. */ - dirname = get_dirname(file_name8->str); /* Overwrites cf_name */ - set_last_open_dir(dirname); - - g_string_free(file_name8, TRUE /* free_segment */); } + g_sf_hwnd = NULL; + g_range = NULL; g_array_free(savable_file_types, TRUE); g_free( (void *) ofn->lpstrFilter); g_free( (void *) ofn); + return gsfn_ok; } @@ -630,11 +554,7 @@ win32_merge_file (HWND h_wnd, GString *file_name, GString *display_filter, int * ofn->lStructSize = ofnsize; ofn->hwndOwner = h_wnd; -#if (_MSC_VER <= 1200) - ofn->hInstance = (HINSTANCE) GetWindowLong(h_wnd, GWL_HINSTANCE); -#else ofn->hInstance = (HINSTANCE) GetWindowLongPtr(h_wnd, GWLP_HINSTANCE); -#endif ofn->lpstrFilter = build_file_open_type_list(); ofn->lpstrCustomFilter = NULL; ofn->nMaxCustFilter = 0; @@ -712,11 +632,7 @@ win32_export_file(HWND h_wnd, export_type_e export_type) { ofn->lStructSize = ofnsize; ofn->hwndOwner = h_wnd; -#if (_MSC_VER <= 1200) - ofn->hInstance = (HINSTANCE) GetWindowLong(h_wnd, GWL_HINSTANCE); -#else ofn->hInstance = (HINSTANCE) GetWindowLongPtr(h_wnd, GWLP_HINSTANCE); -#endif ofn->lpstrFilter = FILE_TYPES_EXPORT; ofn->lpstrCustomFilter = NULL; ofn->nMaxCustFilter = 0; @@ -836,11 +752,7 @@ win32_export_raw_file(HWND h_wnd) { ofn->lStructSize = ofnsize; ofn->hwndOwner = h_wnd; -#if (_MSC_VER <= 1200) - ofn->hInstance = (HINSTANCE) GetWindowLong(h_wnd, GWL_HINSTANCE); -#else ofn->hInstance = (HINSTANCE) GetWindowLongPtr(h_wnd, GWLP_HINSTANCE); -#endif ofn->lpstrFilter = FILE_TYPES_RAW; ofn->lpstrCustomFilter = NULL; ofn->nMaxCustFilter = 0; @@ -930,11 +842,7 @@ win32_export_sslkeys_file(HWND h_wnd) { ofn->lStructSize = ofnsize; ofn->hwndOwner = h_wnd; -#if (_MSC_VER <= 1200) - ofn->hInstance = (HINSTANCE) GetWindowLong(h_wnd, GWL_HINSTANCE); -#else ofn->hInstance = (HINSTANCE) GetWindowLongPtr(h_wnd, GWLP_HINSTANCE); -#endif ofn->lpstrFilter = FILE_TYPES_SSLKEYS; ofn->lpstrCustomFilter = NULL; ofn->nMaxCustFilter = 0; @@ -1015,11 +923,7 @@ win32_export_color_file(HWND h_wnd, gpointer filter_list) { ofn->lStructSize = ofnsize; ofn->hwndOwner = h_wnd; -#if (_MSC_VER <= 1200) - ofn->hInstance = (HINSTANCE) GetWindowLong(h_wnd, GWL_HINSTANCE); -#else ofn->hInstance = (HINSTANCE) GetWindowLongPtr(h_wnd, GWLP_HINSTANCE); -#endif ofn->lpstrFilter = FILE_TYPES_COLOR; ofn->lpstrCustomFilter = NULL; ofn->nMaxCustFilter = 0; @@ -1080,11 +984,7 @@ win32_import_color_file(HWND h_wnd, gpointer color_filters) { ofn->lStructSize = ofnsize; ofn->hwndOwner = h_wnd; -#if (_MSC_VER <= 1200) - ofn->hInstance = (HINSTANCE) GetWindowLong(h_wnd, GWL_HINSTANCE); -#else ofn->hInstance = (HINSTANCE) GetWindowLongPtr(h_wnd, GWLP_HINSTANCE); -#endif ofn->lpstrFilter = FILE_TYPES_COLOR; ofn->lpstrCustomFilter = NULL; ofn->nMaxCustFilter = 0; @@ -1443,11 +1343,7 @@ filter_tb_syntax_check(HWND hwnd, TCHAR *filter_text) { } -#if (_MSC_VER <= 1200) -static UINT CALLBACK -#else static UINT_PTR CALLBACK -#endif open_file_hook_proc(HWND of_hwnd, UINT msg, WPARAM w_param, LPARAM l_param) { HWND cur_ctrl, parent; OFNOTIFY *notify = (OFNOTIFY *) l_param; @@ -1673,7 +1569,7 @@ build_file_format_list(HWND sf_hwnd) { if (ft == WTAP_FILE_UNKNOWN) continue; /* not a real file type */ - if (!packet_range_process_all(&g_range) || ft != cfile.cd_t) { + if (!packet_range_process_all(g_range) || ft != cfile.cd_t) { /* not all unfiltered packets or a different file type. We have to use Wiretap. */ if (!wtap_can_save_with_wiretap(ft, cfile.linktypes)) continue; /* We can't. */ @@ -1699,11 +1595,7 @@ build_file_format_list(HWND sf_hwnd) { } #endif -#if (_MSC_VER <= 1200) -static UINT CALLBACK -#else static UINT_PTR CALLBACK -#endif save_as_file_hook_proc(HWND sf_hwnd, UINT msg, WPARAM w_param, LPARAM l_param) { HWND cur_ctrl; OFNOTIFY *notify = (OFNOTIFY *) l_param; @@ -1813,11 +1705,7 @@ save_as_file_hook_proc(HWND sf_hwnd, UINT msg, WPARAM w_param, LPARAM l_param) { } #define RANGE_TEXT_MAX 128 -#if (_MSC_VER <= 1200) -static UINT CALLBACK -#else static UINT_PTR CALLBACK -#endif export_specified_packets_file_hook_proc(HWND sf_hwnd, UINT msg, WPARAM w_param, LPARAM l_param) { HWND cur_ctrl; OFNOTIFY *notify = (OFNOTIFY *) l_param; @@ -1830,16 +1718,14 @@ export_specified_packets_file_hook_proc(HWND sf_hwnd, UINT msg, WPARAM w_param, /* Default to saving all packets, in the file's current format. */ g_filetype = cfile.cd_t; - /* init the packet range */ - packet_range_init(&g_range); - /* default to displayed packets */ - g_range.process_filtered = TRUE; - g_range.include_dependents = TRUE; - /* Fill in the file format list */ /*build_file_format_list(sf_hwnd);*/ - range_handle_wm_initdialog(sf_hwnd, &g_range); + range_handle_wm_initdialog(sf_hwnd, g_range); + + /* Fill in the compression checkbox */ + cur_ctrl = GetDlgItem(sf_hwnd, EWFD_GZIP_CB); + SendMessage(cur_ctrl, BM_SETCHECK, g_compressed, 0); break; case WM_COMMAND: @@ -1887,6 +1773,13 @@ export_specified_packets_file_hook_proc(HWND sf_hwnd, UINT msg, WPARAM w_param, char *file_name8_selected; int selected_size; + /* Fetch our compression value */ + cur_ctrl = GetDlgItem(sf_hwnd, EWFD_GZIP_CB); + if (SendMessage(cur_ctrl, BM_GETCHECK, 0, 0) == BST_CHECKED) + g_compressed = TRUE; + else + g_compressed = FALSE; + /* Check if trying to do 'save as' to the currently open file */ parent = GetParent(sf_hwnd); selected_size = CommDlg_OpenSave_GetFilePath(parent, file_name16_selected, MAX_PATH); @@ -2182,11 +2075,7 @@ range_handle_wm_command(HWND dlg_hwnd, HWND ctrl, WPARAM w_param, packet_range_t } } -#if (_MSC_VER <= 1200) -static UINT CALLBACK -#else static UINT_PTR CALLBACK -#endif merge_file_hook_proc(HWND mf_hwnd, UINT msg, WPARAM w_param, LPARAM l_param) { HWND cur_ctrl, parent; OFNOTIFY *notify = (OFNOTIFY *) l_param; @@ -2258,11 +2147,7 @@ merge_file_hook_proc(HWND mf_hwnd, UINT msg, WPARAM w_param, LPARAM l_param) { } -#if (_MSC_VER <= 1200) -static UINT CALLBACK -#else static UINT_PTR CALLBACK -#endif export_file_hook_proc(HWND ef_hwnd, UINT msg, WPARAM w_param, LPARAM l_param) { HWND cur_ctrl; OFNOTIFY *notify = (OFNOTIFY *) l_param; @@ -2322,11 +2207,7 @@ export_file_hook_proc(HWND ef_hwnd, UINT msg, WPARAM w_param, LPARAM l_param) { return 0; } -#if (_MSC_VER <= 1200) -static UINT CALLBACK -#else static UINT_PTR CALLBACK -#endif export_raw_file_hook_proc(HWND ef_hwnd, UINT msg, WPARAM w_param, LPARAM l_param) { HWND cur_ctrl; OPENFILENAME *ofnp = (OPENFILENAME *) l_param; @@ -2354,11 +2235,7 @@ export_raw_file_hook_proc(HWND ef_hwnd, UINT msg, WPARAM w_param, LPARAM l_param return 0; } -#if (_MSC_VER <= 1200) -static UINT CALLBACK -#else static UINT_PTR CALLBACK -#endif export_sslkeys_file_hook_proc(HWND ef_hwnd, UINT msg, WPARAM w_param, LPARAM l_param) { HWND cur_ctrl; OPENFILENAME *ofnp = (OPENFILENAME *) l_param; diff --git a/ui/win32/file_dlg_win32.h b/ui/win32/file_dlg_win32.h index 296bf9d4f0..1a23ad1ede 100644 --- a/ui/win32/file_dlg_win32.h +++ b/ui/win32/file_dlg_win32.h @@ -77,7 +77,11 @@ gboolean win32_save_as_file(HWND h_wnd, capture_file *cf, * * @param h_wnd HWND of the parent window. */ -void win32_export_specified_packets_file(HWND h_wnd); +void win32_export_specified_packets_file(HWND h_wnd, GString *file_name, + int *file_type, + gboolean *compressed, + packet_range_t *range); + /** Open the "Merge" dialog box. * @@ -145,8 +149,8 @@ void file_set_save_marked_sensitive(); #define EWFD_PTX_FIRST_PKT 1014 #define EWFD_PTX_ELAPSED 1015 -/* Save as dialog defines */ -#define EWFD_GZIP_CB 1000 +/* Save as and export dialog defines */ +#define EWFD_GZIP_CB 1040 /* Export dialog defines */ #define EWFD_CAPTURED_BTN 1000