diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-09-19 04:14:53 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-09-19 04:14:53 +0000 |
commit | a86c5f7cae7ec9a3398300555a0b644689d946a1 (patch) | |
tree | 39fe4b107c71174fd1e8a8ceb9a4d2aa14116248 /ui/win32 | |
parent | Releasing progress-linux version 4.2.6-1~progress7.99u1. (diff) | |
download | wireshark-a86c5f7cae7ec9a3398300555a0b644689d946a1.tar.xz wireshark-a86c5f7cae7ec9a3398300555a0b644689d946a1.zip |
Merging upstream version 4.4.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'ui/win32')
-rw-r--r-- | ui/win32/file_dlg_win32.cpp | 1835 | ||||
-rw-r--r-- | ui/win32/file_dlg_win32.h | 145 |
2 files changed, 11 insertions, 1969 deletions
diff --git a/ui/win32/file_dlg_win32.cpp b/ui/win32/file_dlg_win32.cpp index 6261c915..1f613bf6 100644 --- a/ui/win32/file_dlg_win32.cpp +++ b/ui/win32/file_dlg_win32.cpp @@ -13,86 +13,25 @@ #include "config.h" #include <tchar.h> -#include <stdlib.h> -#include <fcntl.h> - -#include <string> #include <windows.h> -#include <commdlg.h> -#include <richedit.h> -#include <strsafe.h> - -#include "file.h" - -#include "wsutil/file_util.h" -#include "wsutil/str_util.h" -#include "wsutil/unicode-utils.h" -#include <wsutil/ws_assert.h> -#include "wsutil/filesystem.h" -#include "epan/prefs.h" - -#include "ui/alert_box.h" -#include "ui/help_url.h" -#include "ui/file_dialog.h" -#include "ui/simple_dialog.h" -#include "ui/util.h" -#include "ui/ws_ui_util.h" -#include "ui/all_files_wildcard.h" +#include <ws_attributes.h> +#include <ws_diag_control.h> #include "file_dlg_win32.h" -typedef enum { - merge_append, - merge_chrono, - merge_prepend -} merge_action_e; - -#define FILE_OPEN_DEFAULT 2 /* All Capture Files */ - -#define FILE_MERGE_DEFAULT FILE_OPEN_DEFAULT - -#define FILE_TYPES_EXPORT \ - _T("Plain text (*.txt)\0") _T("*.txt\0") \ - _T("PostScript (*.ps)\0") _T("*.ps\0") \ - _T("CSV (Comma Separated Values summary) (*.csv)\0") _T("*.csv\0") \ - _T("PSML (XML packet summary) (*.psml)\0") _T("*.psml\0") \ - _T("PDML (XML packet detail) (*.pdml)\0") _T("*.pdml\0") \ - _T("C Arrays (packet bytes) (*.c)\0") _T("*.c\0") \ - _T("JSON (*.json)\0") _T("*.json\0") - -static const TCHAR *FILE_EXT_EXPORT[] = -{ - _T(""), /* export type starts at 1 */ - _T("txt"), - _T("ps"), - _T("csv"), - _T("psml"), - _T("pdml"), - _T("c"), - _T("json") -}; - -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 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); - -static TCHAR *build_file_open_type_list(void); -static TCHAR *build_file_save_type_list(GArray *savable_file_types); - +/* As of Wireshark 4.2, we only support Windows 10 and later, so this + * should always be defined. OTOH, Qt >= 6.0 uses DPI Awareness + * Context Per Monitor Aware v2 by default, so maybe we should make + * it a no-op there. */ #ifdef DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 typedef DPI_AWARENESS_CONTEXT (WINAPI *GetThreadDpiAwarenessContextProc)(void); typedef DPI_AWARENESS_CONTEXT (WINAPI *SetThreadDpiAwarenessContextProc)(DPI_AWARENESS_CONTEXT); static GetThreadDpiAwarenessContextProc GetThreadDpiAwarenessContextP; static SetThreadDpiAwarenessContextProc SetThreadDpiAwarenessContextP; -static bool got_proc_addresses = false; +static bool got_proc_addresses; DIAG_OFF(cast-function-type) static bool get_proc_addresses(void) { @@ -139,1764 +78,4 @@ HANDLE set_thread_per_monitor_v2_awareness(void) { return 0; } void revert_thread_per_monitor_v2_awareness(HANDLE context _U_) { } #endif // DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 -static int g_filetype; -static bool g_compressed; -static packet_range_t *g_range; -static capture_file *g_cf; -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 - * print dialog and put range widgets in it as well, - * it might be moved to a separate file. - * - * However, the save file dialog hogs the foreground, so - * this may not be necessary (and, in fact, the file dialogs - * should arguably be modal to the window for the file - * being opened/saved/etc.). - */ -static HWND g_sf_hwnd = NULL; -static char *g_dfilter_str = NULL; -static unsigned int g_format_type = WTAP_TYPE_AUTO; - -/* - * According to https://docs.microsoft.com/en-us/windows/win32/shell/common-file-dialog - * we should use IFileOpenDialog and IFileSaveDialog on Windows Vista - * and later. - */ - -bool -win32_open_file (HWND h_wnd, const wchar_t *title, GString *file_name, unsigned int *type, GString *display_filter) { - OPENFILENAME *ofn; - TCHAR file_name16[MAX_PATH] = _T(""); - int ofnsize = sizeof(OPENFILENAME); - BOOL gofn_ok; - - if (!file_name || !display_filter) - return false; - - if (file_name->len > 0) { - StringCchCopy(file_name16, MAX_PATH, utf_8to16(file_name->str)); - } - - if (display_filter->len > 0) { - g_dfilter_str = g_strdup(display_filter->str); - } else if (g_dfilter_str) { - g_free(g_dfilter_str); - g_dfilter_str = NULL; - } - - ofn = new OPENFILENAME(); - - ofn->lStructSize = ofnsize; - ofn->hwndOwner = h_wnd; - ofn->hInstance = (HINSTANCE) GetWindowLongPtr(h_wnd, GWLP_HINSTANCE); - ofn->lpstrFilter = build_file_open_type_list(); - ofn->lpstrCustomFilter = NULL; - ofn->nMaxCustFilter = 0; - ofn->nFilterIndex = FILE_OPEN_DEFAULT; - ofn->lpstrFile = file_name16; - ofn->nMaxFile = MAX_PATH; - ofn->lpstrFileTitle = NULL; - ofn->nMaxFileTitle = 0; - if (prefs.gui_fileopen_style == FO_STYLE_SPECIFIED && prefs.gui_fileopen_dir[0] != '\0') { - ofn->lpstrInitialDir = utf_8to16(prefs.gui_fileopen_dir); - } else { - ofn->lpstrInitialDir = utf_8to16(get_open_dialog_initial_dir()); - } - ofn->lpstrTitle = title; - ofn->Flags = OFN_ENABLESIZING | OFN_ENABLETEMPLATE | OFN_EXPLORER | - OFN_NOCHANGEDIR | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | - OFN_ENABLEHOOK | OFN_SHOWHELP; - ofn->lpstrDefExt = NULL; - ofn->lpfnHook = open_file_hook_proc; - ofn->lpTemplateName = _T("WIRESHARK_OPENFILENAME_TEMPLATE"); - - HANDLE save_da_ctx = set_thread_per_monitor_v2_awareness(); - gofn_ok = GetOpenFileName(ofn); - revert_thread_per_monitor_v2_awareness(save_da_ctx); - - if (gofn_ok) { - g_string_printf(file_name, "%s", utf_16to8(file_name16)); - g_string_printf(display_filter, "%s", g_dfilter_str ? g_dfilter_str : ""); - *type = g_format_type; - } - - g_free( (void *) ofn->lpstrFilter); - delete ofn; - g_free(g_dfilter_str); - g_dfilter_str = NULL; - return gofn_ok; -} - -bool -win32_save_as_file(HWND h_wnd, const wchar_t *title, capture_file *cf, GString *file_name, int *file_type, - wtap_compression_type *compression_type, - bool must_support_all_comments) -{ - uint32_t required_comment_types; - GArray *savable_file_types; - OPENFILENAME *ofn; - TCHAR file_name16[MAX_PATH] = _T(""); - int ofnsize = sizeof(OPENFILENAME); - BOOL gsfn_ok; - - if (!file_name || !file_type || !compression_type) - return false; - - if (file_name->len > 0) { - StringCchCopy(file_name16, MAX_PATH, utf_8to16(file_name->str)); - } - - /* What types of comments do we have to support? */ - if (must_support_all_comments) - required_comment_types = cf_comment_types(cf); /* all the ones the file has */ - else - required_comment_types = 0; /* none of them */ - - savable_file_types = wtap_get_savable_file_types_subtypes_for_file(cf->cd_t, - cf->linktypes, - required_comment_types, - FT_SORT_BY_DESCRIPTION); - if (savable_file_types == NULL) - return false; /* shouldn't happen - the "Save As..." item should be disabled if we can't save the file */ - g_compressed = false; - - ofn = new OPENFILENAME(); - - ofn->lStructSize = ofnsize; - ofn->hwndOwner = h_wnd; - ofn->hInstance = (HINSTANCE) GetWindowLongPtr(h_wnd, GWLP_HINSTANCE); - ofn->lpstrFilter = build_file_save_type_list(savable_file_types); - ofn->lpstrCustomFilter = NULL; - ofn->nMaxCustFilter = 0; - ofn->nFilterIndex = 1; /* the first entry is the best match; 1-origin indexing */ - ofn->lpstrFile = file_name16; - ofn->nMaxFile = MAX_PATH; - ofn->lpstrFileTitle = NULL; - ofn->nMaxFileTitle = 0; - ofn->lpstrInitialDir = utf_8to16(get_open_dialog_initial_dir()); - ofn->lpstrTitle = title; - ofn->Flags = OFN_ENABLESIZING | OFN_ENABLETEMPLATE | OFN_EXPLORER | - OFN_NOCHANGEDIR | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | - OFN_PATHMUSTEXIST | OFN_ENABLEHOOK | OFN_SHOWHELP; - ofn->lpstrDefExt = NULL; - ofn->lCustData = (LPARAM) cf; - ofn->lpfnHook = save_as_file_hook_proc; - ofn->lpTemplateName = _T("WIRESHARK_SAVEASFILENAME_TEMPLATE"); - - HANDLE save_da_ctx = set_thread_per_monitor_v2_awareness(); - gsfn_ok = GetSaveFileName(ofn); - revert_thread_per_monitor_v2_awareness(save_da_ctx); - - 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); - *compression_type = g_compressed ? WTAP_GZIP_COMPRESSED : WTAP_UNCOMPRESSED; - } 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; - } - } - - g_sf_hwnd = NULL; - g_array_free(savable_file_types, true); - g_free( (void *) ofn->lpstrFilter); - delete ofn; - return gsfn_ok; -} - -bool -win32_export_specified_packets_file(HWND h_wnd, const wchar_t *title, - capture_file *cf, - GString *file_name, - int *file_type, - wtap_compression_type *compression_type, - packet_range_t *range) { - GArray *savable_file_types; - OPENFILENAME *ofn; - TCHAR file_name16[MAX_PATH] = _T(""); - int ofnsize = sizeof(OPENFILENAME); - BOOL gsfn_ok; - - if (!file_name || !file_type || !compression_type || !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_subtypes_for_file(cf->cd_t, - cf->linktypes, 0, - FT_SORT_BY_DESCRIPTION); - if (savable_file_types == NULL) - return false; /* shouldn't happen - the "Save As..." item should be disabled if we can't save the file */ - - g_range = range; - g_cf = cf; - g_compressed = false; - - ofn = new OPENFILENAME(); - - ofn->lStructSize = ofnsize; - ofn->hwndOwner = h_wnd; - ofn->hInstance = (HINSTANCE) GetWindowLongPtr(h_wnd, GWLP_HINSTANCE); - ofn->lpstrFilter = build_file_save_type_list(savable_file_types); - ofn->lpstrCustomFilter = NULL; - ofn->nMaxCustFilter = 0; - ofn->nFilterIndex = 1; /* the first entry is the best match; 1-origin indexing */ - ofn->lpstrFile = file_name16; - ofn->nMaxFile = MAX_PATH; - ofn->lpstrFileTitle = NULL; - ofn->nMaxFileTitle = 0; - ofn->lpstrInitialDir = utf_8to16(get_open_dialog_initial_dir()); - ofn->lpstrTitle = title; - ofn->Flags = OFN_ENABLESIZING | OFN_ENABLETEMPLATE | OFN_EXPLORER | - OFN_NOCHANGEDIR | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | - OFN_PATHMUSTEXIST | OFN_ENABLEHOOK | OFN_SHOWHELP; - ofn->lpstrDefExt = NULL; - ofn->lCustData = (LPARAM) cf; - ofn->lpfnHook = export_specified_packets_file_hook_proc; - ofn->lpTemplateName = _T("WIRESHARK_EXPORT_SPECIFIED_PACKETS_FILENAME_TEMPLATE"); - - HANDLE save_da_ctx = set_thread_per_monitor_v2_awareness(); - gsfn_ok = GetSaveFileName(ofn); - revert_thread_per_monitor_v2_awareness(save_da_ctx); - - 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); - *compression_type = g_compressed ? WTAP_GZIP_COMPRESSED : WTAP_UNCOMPRESSED; - } 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; - } - } - - g_sf_hwnd = NULL; - g_range = NULL; - g_cf = NULL; - g_array_free(savable_file_types, true); - g_free( (void *) ofn->lpstrFilter); - delete ofn; - return gsfn_ok; -} - - -bool -win32_merge_file (HWND h_wnd, const wchar_t *title, GString *file_name, GString *display_filter, int *merge_type) { - OPENFILENAME *ofn; - TCHAR file_name16[MAX_PATH] = _T(""); - int ofnsize = sizeof(OPENFILENAME); - BOOL gofn_ok; - - if (!file_name || !display_filter || !merge_type) - return false; - - if (file_name->len > 0) { - StringCchCopy(file_name16, MAX_PATH, utf_8to16(file_name->str)); - } - - if (display_filter->len > 0) { - g_dfilter_str = g_strdup(display_filter->str); - } else if (g_dfilter_str) { - g_free(g_dfilter_str); - g_dfilter_str = NULL; - } - - ofn = new OPENFILENAME(); - - ofn->lStructSize = ofnsize; - ofn->hwndOwner = h_wnd; - ofn->hInstance = (HINSTANCE) GetWindowLongPtr(h_wnd, GWLP_HINSTANCE); - ofn->lpstrFilter = build_file_open_type_list(); - ofn->lpstrCustomFilter = NULL; - ofn->nMaxCustFilter = 0; - ofn->nFilterIndex = FILE_MERGE_DEFAULT; - ofn->lpstrFile = file_name16; - ofn->nMaxFile = MAX_PATH; - ofn->lpstrFileTitle = NULL; - ofn->nMaxFileTitle = 0; - if (prefs.gui_fileopen_style == FO_STYLE_SPECIFIED && prefs.gui_fileopen_dir[0] != '\0') { - ofn->lpstrInitialDir = utf_8to16(prefs.gui_fileopen_dir); - } else { - ofn->lpstrInitialDir = utf_8to16(get_open_dialog_initial_dir()); - } - ofn->lpstrTitle = title; - ofn->Flags = OFN_ENABLESIZING | OFN_ENABLETEMPLATE | OFN_EXPLORER | - OFN_NOCHANGEDIR | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | - OFN_ENABLEHOOK | OFN_SHOWHELP; - ofn->lpstrDefExt = NULL; - ofn->lpfnHook = merge_file_hook_proc; - ofn->lpTemplateName = _T("WIRESHARK_MERGEFILENAME_TEMPLATE"); - - HANDLE save_da_ctx = set_thread_per_monitor_v2_awareness(); - gofn_ok = GetOpenFileName(ofn); - revert_thread_per_monitor_v2_awareness(save_da_ctx); - - if (gofn_ok) { - g_string_printf(file_name, "%s", utf_16to8(file_name16)); - g_string_printf(display_filter, "%s", g_dfilter_str ? g_dfilter_str : ""); - - switch (g_merge_action) { - case merge_append: - *merge_type = 1; - break; - case merge_chrono: - *merge_type = 0; - break; - case merge_prepend: - *merge_type = -1; - break; - default: - ws_assert_not_reached(); - } - } - - g_free( (void *) ofn->lpstrFilter); - delete ofn; - g_free(g_dfilter_str); - g_dfilter_str = NULL; - return gofn_ok; -} - -void -win32_export_file(HWND h_wnd, const wchar_t *title, capture_file *cf, export_type_e export_type, const char *range_) { - OPENFILENAME *ofn; - TCHAR file_name[MAX_PATH] = _T(""); - char *dirname; - cf_print_status_t status; - int ofnsize = sizeof(OPENFILENAME); - - g_cf = cf; - - ofn = new OPENFILENAME(); - - ofn->lStructSize = ofnsize; - ofn->hwndOwner = h_wnd; - ofn->hInstance = (HINSTANCE) GetWindowLongPtr(h_wnd, GWLP_HINSTANCE); - ofn->lpstrFilter = FILE_TYPES_EXPORT; - ofn->lpstrCustomFilter = NULL; - ofn->nMaxCustFilter = 0; - ofn->nFilterIndex = export_type; - ofn->lpstrFile = file_name; - ofn->nMaxFile = MAX_PATH; - ofn->lpstrFileTitle = NULL; - ofn->nMaxFileTitle = 0; - ofn->lpstrInitialDir = utf_8to16(get_open_dialog_initial_dir()); - ofn->lpstrTitle = title; - ofn->Flags = OFN_ENABLESIZING | OFN_ENABLETEMPLATE | OFN_EXPLORER | - OFN_NOCHANGEDIR | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | - OFN_PATHMUSTEXIST | OFN_ENABLEHOOK | OFN_SHOWHELP; - ofn->lpstrDefExt = FILE_EXT_EXPORT[export_type]; - ofn->lCustData = (LPARAM) cf; - ofn->lpfnHook = export_file_hook_proc; - ofn->lpTemplateName = _T("WIRESHARK_EXPORTFILENAME_TEMPLATE"); - - /* Fill in our print (and export) args */ - - /* init the printing range */ - packet_range_init(&print_args.range, cf); - - if (strlen(range_) > 0) - packet_range_convert_selection_str(&print_args.range, range_); - - print_args.format = PR_FMT_TEXT; - print_args.to_file = true; - print_args.cmd = NULL; - print_args.print_summary = true; - print_args.print_col_headings = true; - print_args.print_dissections = print_dissections_as_displayed; - print_args.print_hex = false; - print_args.hexdump_options = HEXDUMP_SOURCE_MULTI; - print_args.print_formfeed = false; - print_args.stream = NULL; - - HANDLE save_da_ctx = set_thread_per_monitor_v2_awareness(); - BOOL gsfn_ok = GetSaveFileName(ofn); - revert_thread_per_monitor_v2_awareness(save_da_ctx); - - if (gsfn_ok) { - print_args.file = utf_16to8(file_name); - switch (ofn->nFilterIndex) { - case export_type_text: /* Text */ - print_args.stream = print_stream_text_new(true, print_args.file); - if (print_args.stream == NULL) { - open_failure_alert_box(print_args.file, errno, true); - delete ofn; - return; - } - status = cf_print_packets(cf, &print_args, true); - break; - case export_type_ps: /* PostScript (r) */ - print_args.stream = print_stream_ps_new(true, print_args.file); - if (print_args.stream == NULL) { - open_failure_alert_box(print_args.file, errno, true); - delete ofn; - return; - } - status = cf_print_packets(cf, &print_args, true); - break; - case export_type_csv: /* CSV */ - status = cf_write_csv_packets(cf, &print_args); - break; - case export_type_carrays: /* C Arrays */ - status = cf_write_carrays_packets(cf, &print_args); - break; - case export_type_psml: /* PSML */ - status = cf_write_psml_packets(cf, &print_args); - break; - case export_type_pdml: /* PDML */ - status = cf_write_pdml_packets(cf, &print_args); - break; - case export_type_json: /* JSON */ - status = cf_write_json_packets(cf, &print_args); - break; - default: - delete ofn; - return; - } - - switch (status) { - case CF_PRINT_OK: - break; - case CF_PRINT_OPEN_ERROR: - open_failure_alert_box(print_args.file, errno, true); - break; - case CF_PRINT_WRITE_ERROR: - write_failure_alert_box(print_args.file, errno); - break; - } - /* Save the directory name for future file dialogs. */ - dirname = get_dirname(utf_16to8(file_name)); /* Overwrites cf_name */ - set_last_open_dir(dirname); - } - - g_cf = NULL; - delete ofn; -} - - -/* - * Private routines - */ - -/** Given a print_args_t struct, update a set of print/export format controls - * accordingly. - * - * @param dlg_hwnd HWND of the dialog in question. - * @param args Pointer to a print args struct. - */ -static void -print_update_dynamic(HWND dlg_hwnd, print_args_t *args) { - HWND cur_ctrl; - - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_PKT_SUMMARY_CB); - if (SendMessage(cur_ctrl, BM_GETCHECK, 0, 0) == BST_CHECKED) { - args->print_summary = true; - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_COL_HEADINGS_CB); - EnableWindow(cur_ctrl, true); - if (SendMessage(cur_ctrl, BM_GETCHECK, 0, 0) == BST_CHECKED) - args->print_col_headings = true; - else - args->print_col_headings = false; - } else { - args->print_summary = false; - args->print_col_headings = false; - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_COL_HEADINGS_CB); - EnableWindow(cur_ctrl, false); - } - - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_PKT_DETAIL_CB); - if (SendMessage(cur_ctrl, BM_GETCHECK, 0, 0) == BST_CHECKED) { - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_PKT_DETAIL_COMBO); - switch (SendMessage(cur_ctrl, CB_GETCURSEL, 0, 0)) { - case 0: - args->print_dissections = print_dissections_collapsed; - break; - case 1: - args->print_dissections = print_dissections_as_displayed; - break; - case 2: - args->print_dissections = print_dissections_expanded; - break; - default: - ws_assert_not_reached(); - } - EnableWindow(cur_ctrl, true); - } else { - args->print_dissections = print_dissections_none; - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_PKT_DETAIL_COMBO); - EnableWindow(cur_ctrl, false); - } - - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_PKT_BYTES_CB); - if (SendMessage(cur_ctrl, BM_GETCHECK, 0, 0) == BST_CHECKED) { - args->print_hex = true; - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_DATA_SOURCES_CB); - EnableWindow(cur_ctrl, true); - if (SendMessage(cur_ctrl, BM_GETCHECK, 0, 0) == BST_CHECKED) - args->hexdump_options = HEXDUMP_SOURCE_MULTI; - else - args->hexdump_options = HEXDUMP_SOURCE_PRIMARY; - } else { - args->print_hex = false; - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_DATA_SOURCES_CB); - EnableWindow(cur_ctrl, false); - } - - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_PKT_NEW_PAGE_CB); - if (SendMessage(cur_ctrl, BM_GETCHECK, 0, 0) == BST_CHECKED) - args->print_formfeed = true; - else - args->print_formfeed = false; -} - -static void -format_handle_wm_initdialog(HWND dlg_hwnd, print_args_t *args) { - HWND cur_ctrl; - - /* Set the "Packet summary" and "Include column headings" boxes */ - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_PKT_SUMMARY_CB); - SendMessage(cur_ctrl, BM_SETCHECK, args->print_summary, 0); - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_COL_HEADINGS_CB); - SendMessage(cur_ctrl, BM_SETCHECK, args->print_col_headings, 0); - - /* Set the "Packet details" box */ - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_PKT_DETAIL_CB); - SendMessage(cur_ctrl, BM_SETCHECK, args->print_dissections != print_dissections_none, 0); - - /* Set the "Packet details" combo */ - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_PKT_DETAIL_COMBO); - SendMessage(cur_ctrl, CB_ADDSTRING, 0, (WPARAM) _T("All collapsed")); - SendMessage(cur_ctrl, CB_ADDSTRING, 0, (WPARAM) _T("As displayed")); - SendMessage(cur_ctrl, CB_ADDSTRING, 0, (WPARAM) _T("All expanded")); - - switch (args->print_dissections) { - case print_dissections_none: - case print_dissections_collapsed: - SendMessage(cur_ctrl, CB_SETCURSEL, 0, 0); - break; - case print_dissections_as_displayed: - SendMessage(cur_ctrl, CB_SETCURSEL, 1, 0); - break; - case print_dissections_expanded: - SendMessage(cur_ctrl, CB_SETCURSEL, 2, 0); - break; - default: - ws_assert_not_reached(); - } - - /* Set the "Packet bytes" box */ - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_PKT_BYTES_CB); - SendMessage(cur_ctrl, BM_SETCHECK, args->print_hex, 0); - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_DATA_SOURCES_CB); - SendMessage(cur_ctrl, BM_SETCHECK, !(args->hexdump_options & HEXDUMP_SOURCE_PRIMARY), 0); - - /* Set the "Each packet on a new page" box */ - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_PKT_NEW_PAGE_CB); - SendMessage(cur_ctrl, BM_SETCHECK, args->print_formfeed, 0); - - print_update_dynamic(dlg_hwnd, args); -} - - -#define PREVIEW_STR_MAX 200 - -/* If preview_file is NULL, disable the elements. If not, enable and - * show the preview info. */ -static bool -preview_set_file_info(HWND of_hwnd, char *preview_file) { - HWND cur_ctrl; - int i; - wtap *wth; - int err; - char *err_info; - ws_file_preview_stats stats; - ws_file_preview_stats_status status; - TCHAR string_buff[PREVIEW_STR_MAX]; - TCHAR first_buff[PREVIEW_STR_MAX]; - int64_t filesize; - char *size_str; - time_t ti_time; - struct tm *ti_tm; - unsigned elapsed_time; - - for (i = EWFD_PTX_FORMAT; i <= EWFD_PTX_START_ELAPSED; i++) { - cur_ctrl = GetDlgItem(of_hwnd, i); - if (cur_ctrl) { - EnableWindow(cur_ctrl, false); - } - } - - for (i = EWFD_PTX_FORMAT; i <= EWFD_PTX_START_ELAPSED; i++) { - cur_ctrl = GetDlgItem(of_hwnd, i); - if (cur_ctrl) { - SetWindowText(cur_ctrl, _T("-")); - } - } - - if (preview_file == NULL || strlen(preview_file) < 1) { - return false; - } - - /* Format: directory */ - cur_ctrl = GetDlgItem(of_hwnd, EWFD_PTX_FORMAT); - if (test_for_directory(preview_file) == EISDIR) { - SetWindowText(cur_ctrl, _T("directory")); - return false; - } - - wth = wtap_open_offline(preview_file, WTAP_TYPE_AUTO, &err, &err_info, true); - if (cur_ctrl && wth == NULL) { - if(err == WTAP_ERR_FILE_UNKNOWN_FORMAT) { - SetWindowText(cur_ctrl, _T("unknown file format")); - } else { - SetWindowText(cur_ctrl, _T("error opening file")); - } - return false; - } - - /* Success! */ - for (i = EWFD_PT_FORMAT; i <= EWFD_PTX_START_ELAPSED; i++) { - cur_ctrl = GetDlgItem(of_hwnd, i); - if (cur_ctrl) { - EnableWindow(cur_ctrl, true); - } - } - - /* Format */ - cur_ctrl = GetDlgItem(of_hwnd, EWFD_PTX_FORMAT); - SetWindowText(cur_ctrl, utf_8to16(wtap_file_type_subtype_description(wtap_file_type_subtype(wth)))); - - /* Size */ - filesize = wtap_file_size(wth, &err); - // Windows Explorer uses IEC. - size_str = format_size(filesize, FORMAT_SIZE_UNIT_BYTES, FORMAT_SIZE_PREFIX_IEC); - - status = get_stats_for_preview(wth, &stats, &err, &err_info); - - if(status == PREVIEW_READ_ERROR) { - /* XXX - give error details? */ - g_free(err_info); - utf_8to16_snprintf(string_buff, PREVIEW_STR_MAX, "%s, error after %u records", - size_str, stats.records); - g_free(size_str); - cur_ctrl = GetDlgItem(of_hwnd, EWFD_PTX_SIZE); - SetWindowText(cur_ctrl, string_buff); - wtap_close(wth); - return true; - } - - /* Packet count */ - if(status == PREVIEW_TIMED_OUT) { - utf_8to16_snprintf(string_buff, PREVIEW_STR_MAX, "%s, timed out at %u data records", - size_str, stats.data_records); - } else { - utf_8to16_snprintf(string_buff, PREVIEW_STR_MAX, "%s, %u data records", - size_str, stats.data_records); - } - g_free(size_str); - cur_ctrl = GetDlgItem(of_hwnd, EWFD_PTX_SIZE); - SetWindowText(cur_ctrl, string_buff); - - /* First packet / elapsed time */ - if(stats.have_times) { - /* - * We saw at least one record with a time stamp, so we can give - * a start time (if we have a mix of records with and without - * time stamps, and there were records without time stamps - * before the one with a time stamp, this may be inaccurate). - */ - ti_time = (long)stats.start_time; - ti_tm = localtime( &ti_time ); - if(ti_tm) { - StringCchPrintf(first_buff, PREVIEW_STR_MAX, - _T("%04d-%02d-%02d %02d:%02d:%02d"), - ti_tm->tm_year + 1900, - ti_tm->tm_mon + 1, - ti_tm->tm_mday, - ti_tm->tm_hour, - ti_tm->tm_min, - ti_tm->tm_sec); - } else { - StringCchPrintf(first_buff, PREVIEW_STR_MAX, _T("?")); - } - } else { - StringCchPrintf(first_buff, PREVIEW_STR_MAX, _T("unknown")); - } - - /* Elapsed time */ - if(status == PREVIEW_SUCCEEDED && stats.have_times) { - /* - * We didn't time out, so we looked at all packets, and we got - * at least one packet with a time stamp, so we can calculate - * an elapsed time from the time stamp of the last packet with - * with a time stamp (if we have a mix of records with and without - * time stamps, and there were records without time stamps after - * the last one with a time stamp, this may be inaccurate). - */ - elapsed_time = (unsigned int)(stats.stop_time-stats.start_time); - if (elapsed_time/86400) { - StringCchPrintf(string_buff, PREVIEW_STR_MAX, _T("%s / %02u days %02u:%02u:%02u"), - first_buff, elapsed_time/86400, elapsed_time%86400/3600, elapsed_time%3600/60, elapsed_time%60); - } else { - StringCchPrintf(string_buff, PREVIEW_STR_MAX, _T("%s / %02u:%02u:%02u"), - first_buff, elapsed_time%86400/3600, elapsed_time%3600/60, elapsed_time%60); - } - } else { - StringCchPrintf(string_buff, PREVIEW_STR_MAX, _T("%s / unknown"), - first_buff); - } - cur_ctrl = GetDlgItem(of_hwnd, EWFD_PTX_START_ELAPSED); - SetWindowText(cur_ctrl, string_buff); - - wtap_close(wth); - - return true; - -} - -static char * -filter_tb_get(HWND hwnd) { - TCHAR *strval = NULL; - int len; - char *ret; - - /* If filter_text is non-NULL, use it. Otherwise, grab the text from - * the window */ - len = GetWindowTextLength(hwnd); - if (len > 0) { - len++; - strval = g_new(TCHAR, len); - len = GetWindowText(hwnd, strval, len); - ret = g_utf16_to_utf8((gunichar2 *) strval, -1, NULL, NULL, NULL); - g_free(strval); - return ret; - } else { - return NULL; - } -} - - -/* XXX - Copied from "filter-util.c" in the wireshark-win32 branch */ -/* XXX - The only reason for the "filter_text" parameter is to be able to feed - * in the "real" filter string in the case of a CBN_SELCHANGE notification message. - */ -static void -filter_tb_syntax_check(HWND hwnd, const TCHAR *filter_text) { - std::wstring strval; - dfilter_t *dfp; - - /* If filter_text is non-NULL, use it. Otherwise, grab the text from - * the window */ - if (filter_text) { - strval = filter_text; - } else { - int len = GetWindowTextLength(hwnd); - if (len > 0) { - len++; - strval.resize(len); - len = GetWindowText(hwnd, &strval[0], len); - strval.resize(len); - } - } - - if (strval.empty()) { - /* Default window background */ - SendMessage(hwnd, EM_SETBKGNDCOLOR, (WPARAM) 1, COLOR_WINDOW); - return; - } else if (dfilter_compile(utf_16to8(strval.c_str()), &dfp, NULL)) { /* colorize filter string entry */ - dfilter_free(dfp); - /* Valid (light green) */ - SendMessage(hwnd, EM_SETBKGNDCOLOR, 0, RGB(0xe4, 0xff, 0xc7)); /* tango_chameleon_1 */ - } else { - /* Invalid (light red) */ - SendMessage(hwnd, EM_SETBKGNDCOLOR, 0, RGB(0xff, 0xcc, 0xcc)); /* tango_scarlet_red_1 */ - } -} - -static int alpha_sort(gconstpointer a, gconstpointer b) -{ - return g_ascii_strcasecmp(*(const char **)a, *(const char **)b); -} - -static UINT_PTR CALLBACK -open_file_hook_proc(HWND of_hwnd, UINT msg, WPARAM w_param, LPARAM l_param) { - HWND cur_ctrl, parent; - OFNOTIFY *notify = (OFNOTIFY *) l_param; - TCHAR sel_name[MAX_PATH]; - int i; - - switch(msg) { - case WM_INITDIALOG: - { - /* Retain the filter text, and fill it in. */ - if(g_dfilter_str != NULL) { - cur_ctrl = GetDlgItem(of_hwnd, EWFD_FILTER_EDIT); - SetWindowText(cur_ctrl, utf_8to16(g_dfilter_str)); - } - - /* Put Auto, as well as pcap and pcapng (which are the first two entries in - open_routines), at the top of the file type list. */ - cur_ctrl = GetDlgItem(of_hwnd, EWFD_FORMAT_TYPE); - SendMessage(cur_ctrl, CB_ADDSTRING, 0, (WPARAM) _T("Automatically detect file type")); - for (i = 0; i < 2; i += 1) { - SendMessage(cur_ctrl, CB_ADDSTRING, 0, (WPARAM) utf_8to16(open_routines[i].name)); - } - /* Generate a sorted list of the remaining file types. - The magic number 60 is a rough starting point for how big the - GPtrArray should start. It'll automatically grow if needed, so - the exact number isn't critical. (This is good, because we don't have - an easy way to get the exact number.) */ - GPtrArray *routine_names = g_ptr_array_sized_new(60); - for ( /* keep using i */ ; open_routines[i].name != NULL; i += 1) { - g_ptr_array_add(routine_names, (void *)open_routines[i].name); - } - g_ptr_array_sort(routine_names, alpha_sort); - for (unsigned i = 0; i < routine_names->len; i += 1) { - SendMessage(cur_ctrl, CB_ADDSTRING, 0, (WPARAM) utf_8to16((const char *)g_ptr_array_index(routine_names, i))); - } - g_ptr_array_free(routine_names, true); - SendMessage(cur_ctrl, CB_SETCURSEL, 0, 0); - - preview_set_file_info(of_hwnd, NULL); - } - break; - case WM_NOTIFY: - switch (notify->hdr.code) { - case CDN_FILEOK: - /* Fetch the read filter */ - cur_ctrl = GetDlgItem(of_hwnd, EWFD_FILTER_EDIT); - g_free(g_dfilter_str); - g_dfilter_str = filter_tb_get(cur_ctrl); - - cur_ctrl = GetDlgItem(of_hwnd, EWFD_FORMAT_TYPE); - g_format_type = (unsigned int) SendMessage(cur_ctrl, CB_GETCURSEL, 0, 0); - - /* The list of file formats is sorted. Get the format by name. */ - LRESULT label_len; - label_len = SendMessage(cur_ctrl, CB_GETLBTEXTLEN, (WPARAM) g_format_type, 0); - if (label_len != CB_ERR) { - TCHAR *label = g_new(TCHAR, label_len+1); - SendMessage(cur_ctrl, CB_GETLBTEXT, (WPARAM) g_format_type, (LPARAM) label); - g_format_type = open_info_name_to_type(utf_16to8(label)); - g_free(label); - } - else { - /* Problem, fall back on automatic */ - g_format_type = WTAP_TYPE_AUTO; - } - - break; - case CDN_SELCHANGE: - /* This _almost_ works correctly. We need to handle directory - selections, etc. */ - parent = GetParent(of_hwnd); - CommDlg_OpenSave_GetFilePath(parent, sel_name, MAX_PATH); - preview_set_file_info(of_hwnd, utf_16to8(sel_name)); - break; - case CDN_HELP: - topic_action(HELP_OPEN_WIN32_DIALOG); - break; - default: - break; - } - break; - case WM_COMMAND: - cur_ctrl = (HWND) l_param; - switch(w_param) { - case (EN_UPDATE << 16) | EWFD_FILTER_EDIT: - filter_tb_syntax_check(cur_ctrl, NULL); - break; - /* - * If we ever figure out a way to integrate the Windows - * and GTK+ event loops (or make a native filter dialog), - * we can re-enable the "Filter" button. - */ - /* - case EWFD_FILTER_BTN: - break; - */ - default: - break; - } - break; - default: - break; - } - return 0; -} - -/* Generate a list of the file types we can filter for in the open dialog. */ -static void -append_file_extension_type(GArray *sa, int et) -{ - GString* pattern_str = g_string_new(""); - GString* description_str = g_string_new(""); - char sep; - GSList *extensions_list, *extension; - const TCHAR *str16; - uint16_t zero = 0; - - /* Construct the list of patterns. */ - extensions_list = wtap_get_file_extension_type_extensions(et); - sep = '\0'; - for (extension = extensions_list; extension != NULL; - extension = g_slist_next(extension)) { - if (sep != '\0') - g_string_append_c(pattern_str, sep); - g_string_append_printf(pattern_str, "*.%s", (char *)extension->data); - sep = ';'; - } - wtap_free_extensions_list(extensions_list); - - /* Construct the description. */ - g_string_printf(description_str, "%s (%s)", - wtap_get_file_extension_type_name(et), - pattern_str->str); - str16 = utf_8to16(description_str->str); - sa = g_array_append_vals(sa, str16, (unsigned) strlen(description_str->str)); - sa = g_array_append_val(sa, zero); - g_string_free(description_str, true); - - str16 = utf_8to16(pattern_str->str); - sa = g_array_append_vals(sa, str16, (unsigned) strlen(pattern_str->str)); - sa = g_array_append_val(sa, zero); - g_string_free(pattern_str, true); -} - -static TCHAR * -build_file_open_type_list(void) { - const TCHAR *str16; - int et; - GArray* sa; - static const uint16_t zero = 0; - GString* pattern_str; - char sep; - GSList *extensions_list, *extension; - - /* - * Microsoft's UI guidelines say, of the file filters in open and - * save dialogs: - * - * For meta-filters, remove the file extension list to eliminate - * clutter. Examples: "All files," "All pictures," "All music," - * and "All videos." - * - * so we omit them (for "All Capture Files", the filter would be - * *really* long). On both Windows XP and Windows 7, Wordpad doesn't - * do that, but Paint does. - */ - - /* - * Array of hexadectets used as a sequence of null-terminated - * UTF-16 strings. - */ - sa = g_array_new(false /*zero_terminated*/, false /*clear_*/,2 /*element_size*/); - - /* Add the "All Files" entry. */ - str16 = utf_8to16("All Files"); - sa = g_array_append_vals(sa, str16, (unsigned) strlen("All Files")); - sa = g_array_append_val(sa, zero); - str16 = utf_8to16(ALL_FILES_WILDCARD); - sa = g_array_append_vals(sa, str16, (unsigned) strlen(ALL_FILES_WILDCARD)); - sa = g_array_append_val(sa, zero); - - /* - * Add an "All Capture Files" entry, with all the capture file - * extensions we know about. - */ - str16 = utf_8to16("All Capture Files"); - sa = g_array_append_vals(sa, str16, (unsigned) strlen("All Capture Files")); - sa = g_array_append_val(sa, zero); - - /* - * Construct its list of patterns. - */ - pattern_str = g_string_new(""); - extensions_list = wtap_get_all_capture_file_extensions_list(); - sep = '\0'; - for (extension = extensions_list; extension != NULL; - extension = g_slist_next(extension)) { - if (sep != '\0') - g_string_append_c(pattern_str, sep); - g_string_append_printf(pattern_str, "*.%s", (char *)extension->data); - sep = ';'; - } - wtap_free_extensions_list(extensions_list); - str16 = utf_8to16(pattern_str->str); - sa = g_array_append_vals(sa, str16, (unsigned) strlen(pattern_str->str)); - sa = g_array_append_val(sa, zero); - - /* Include all the file type extensions Wireshark supports. */ - for (et = 0; et < wtap_get_num_file_type_extensions(); et++) { - append_file_extension_type(sa, et); - } - - /* terminate the array */ - sa = g_array_append_val(sa, zero); - - return (TCHAR *) g_array_free(sa, false /*free_segment*/); -} - -/* Generate a list of the file types we can save this file as. - - "g_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 -*/ -static void -append_file_type(GArray *sa, int ft) -{ - GString* pattern_str = g_string_new(""); - GString* description_str = g_string_new(""); - char sep; - GSList *extensions_list, *extension; - const TCHAR *str16; - uint16_t zero = 0; - - extensions_list = wtap_get_file_extensions_list(ft, true); - if (extensions_list == NULL) { - /* This file type doesn't have any particular extension - conventionally used for it, so we'll just use a - wildcard that matches all file names - even those with - no extension, so we don't need to worry about compressed - file extensions. */ - g_string_printf(pattern_str, ALL_FILES_WILDCARD); - } else { - /* Construct the list of patterns. */ - sep = '\0'; - for (extension = extensions_list; extension != NULL; - extension = g_slist_next(extension)) { - if (sep != '\0') - g_string_append_c(pattern_str, sep); - g_string_append_printf(pattern_str, "*.%s", (char *)extension->data); - sep = ';'; - } - wtap_free_extensions_list(extensions_list); - } - - /* Construct the description. */ - g_string_printf(description_str, "%s (%s)", wtap_file_type_subtype_description(ft), - pattern_str->str); - str16 = utf_8to16(description_str->str); - sa = g_array_append_vals(sa, str16, (unsigned) strlen(description_str->str)); - sa = g_array_append_val(sa, zero); - g_string_free(description_str, true); - - str16 = utf_8to16(pattern_str->str); - sa = g_array_append_vals(sa, str16, (unsigned) strlen(pattern_str->str)); - sa = g_array_append_val(sa, zero); - g_string_free(pattern_str, true); -} - -static TCHAR * -build_file_save_type_list(GArray *savable_file_types) { - unsigned i; - int ft; - GArray* sa = g_array_new(false /*zero_terminated*/, false /*clear_*/,2 /*element_size*/); - uint16_t zero = 0; - - /* Get only the file types as which we can save this file. */ - for (i = 0; i < savable_file_types->len; i++) { - ft = g_array_index(savable_file_types, int, i); - append_file_type(sa, ft); - } - - /* terminate the array */ - sa = g_array_append_val(sa, zero); - - return (TCHAR *) g_array_free(sa, false /*free_segment*/); -} - -static UINT_PTR CALLBACK -save_as_file_hook_proc(HWND sf_hwnd, UINT msg, WPARAM w_param _U_, LPARAM l_param) { - HWND cur_ctrl; - OFNOTIFY *notify = (OFNOTIFY *) l_param; - /*int new_filetype, file_index;*/ - - switch(msg) { - case WM_INITDIALOG: { - OPENFILENAME *ofnp = (OPENFILENAME *) l_param; - capture_file *cf = (capture_file *) ofnp->lCustData; - g_sf_hwnd = sf_hwnd; - - /* Default to saving in the file's current format. */ - g_filetype = cf->cd_t; - - /* Fill in the file format list */ - /*build_file_format_list(sf_hwnd);*/ - /* 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: - break; - case WM_NOTIFY: - switch (notify->hdr.code) { - case CDN_HELP: - topic_action(HELP_SAVE_WIN32_DIALOG); - break; - case CDN_FILEOK: { - HWND parent; - char *file_name8; - OPENFILENAME *ofnp = (OPENFILENAME *) notify->lpOFN; - capture_file *cf = (capture_file *) ofnp->lCustData; - - /* 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 we're trying to overwrite the currently open file */ - parent = GetParent(sf_hwnd); - file_name8 = utf_16to8(notify->lpOFN->lpstrFile); - if (files_identical(cf->filename, file_name8)) { - /* XXX: Is MessageBox the best way to pop up an error ? How to make text bold ? */ - char *str = ws_strdup_printf( - "Capture File \"%s\" identical to loaded file.\n\n" - "Please choose a different filename.", - file_name8); - MessageBox( parent, utf_8to16(str), _T("Error"), MB_ICONERROR | MB_APPLMODAL | MB_OK); - g_free(str); - SetWindowLongPtr(sf_hwnd, DWLP_MSGRESULT, 1L); /* Don't allow ! */ - return 1; - } - } - break; - default: - break; - } - break; - default: - break; - } - return 0; -} - -#define RANGE_TEXT_MAX 128 -static UINT_PTR CALLBACK -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; - /*int new_filetype, file_index;*/ - - switch(msg) { - case WM_INITDIALOG: { - g_sf_hwnd = sf_hwnd; - - /* Default to saving all packets, in the file's current format. */ - g_filetype = g_cf->cd_t; - - /* Fill in the file format list */ - /*build_file_format_list(sf_hwnd);*/ - - 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: - cur_ctrl = (HWND) l_param; - range_handle_wm_command(sf_hwnd, cur_ctrl, w_param, g_range); - break; - case WM_NOTIFY: - switch (notify->hdr.code) { - case CDN_HELP: - topic_action(HELP_SAVE_WIN32_DIALOG); - break; - case CDN_FILEOK: { - HWND parent; - char *file_name8; - OPENFILENAME *ofnp = (OPENFILENAME *) notify->lpOFN; - capture_file *cf = (capture_file *) ofnp->lCustData; - - /* 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 we're trying to overwrite the currently open file */ - parent = GetParent(sf_hwnd); - file_name8 = utf_16to8(notify->lpOFN->lpstrFile); - if (files_identical(cf->filename, file_name8)) { - /* XXX: Is MessageBox the best way to pop up an error ? How to make text bold ? */ - char *str = ws_strdup_printf( - "Capture File \"%s\" identical to loaded file.\n\n" - "Please choose a different filename.", - file_name8); - MessageBox( parent, utf_8to16(str), _T("Error"), MB_ICONERROR | MB_APPLMODAL | MB_OK); - g_free(str); - SetWindowLongPtr(sf_hwnd, DWLP_MSGRESULT, 1L); /* Don't allow ! */ - return 1; - } - } - break; - default: - break; - } - break; - default: - break; - } - return 0; -} - -#define STATIC_LABEL_CHARS 100 -/* For each range static control, fill in its value and enable/disable it. */ -static void -range_update_dynamics(HWND dlg_hwnd, packet_range_t *range) { - HWND cur_ctrl; - bool filtered_active = false; - TCHAR static_val[STATIC_LABEL_CHARS]; - uint32_t ignored_cnt = 0, displayed_ignored_cnt = 0; - uint32_t depended_cnt = 0, displayed_depended_cnt = 0; - uint32_t label_cnt; - bool range_valid = true; - - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_DISPLAYED_BTN); - if (SendMessage(cur_ctrl, BM_GETCHECK, 0, 0) == BST_CHECKED) - filtered_active = true; - - /* RANGE_SELECT_ALL */ - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_ALL_PKTS_CAP); - EnableWindow(cur_ctrl, !filtered_active); - label_cnt = g_cf->count; - if (range->remove_ignored) { - label_cnt -= range->ignored_cnt; - } - StringCchPrintf(static_val, STATIC_LABEL_CHARS, _T("%u"), label_cnt); - SetWindowText(cur_ctrl, static_val); - - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_ALL_PKTS_DISP); - EnableWindow(cur_ctrl, filtered_active); - if (range->include_dependents) - label_cnt = range->displayed_plus_dependents_cnt; - else - label_cnt = range->displayed_cnt; - if (range->remove_ignored) { - label_cnt -= range->displayed_ignored_cnt; - } - StringCchPrintf(static_val, STATIC_LABEL_CHARS, _T("%u"), label_cnt); - SetWindowText(cur_ctrl, static_val); - - /* RANGE_SELECT_CURR */ - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_SEL_PKT_CAP); - EnableWindow(cur_ctrl, range->selection_range_cnt > 0 && !filtered_active); - if (range->include_dependents) { - label_cnt = range->selected_plus_depends_cnt; - } else { - label_cnt = range->selection_range_cnt; - } - if (range->remove_ignored) { - label_cnt -= range->ignored_selection_range_cnt; - } - StringCchPrintf(static_val, STATIC_LABEL_CHARS, _T("%d"), label_cnt); - SetWindowText(cur_ctrl, static_val); - - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_SEL_PKT_DISP); - EnableWindow(cur_ctrl, range->displayed_selection_range_cnt > 0 && filtered_active); - if (range->include_dependents) { - label_cnt = range->displayed_selected_plus_depends_cnt; - } else { - label_cnt = range->displayed_selection_range_cnt; - } - if (range->remove_ignored) { - label_cnt -= range->displayed_ignored_selection_range_cnt; - } - StringCchPrintf(static_val, STATIC_LABEL_CHARS, _T("%d"), label_cnt); - SetWindowText(cur_ctrl, static_val); - - /* RANGE_SELECT_MARKED */ - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_MARKED_BTN); - EnableWindow(cur_ctrl, g_cf->marked_count); - - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_MARKED_CAP); - EnableWindow(cur_ctrl, g_cf->marked_count && !filtered_active); - if (range->include_dependents) { - label_cnt = range->marked_plus_depends_cnt; - } else { - label_cnt = g_cf->marked_count; - } - if (range->remove_ignored) { - label_cnt -= range->ignored_marked_cnt; - } - StringCchPrintf(static_val, STATIC_LABEL_CHARS, _T("%d"), label_cnt); - SetWindowText(cur_ctrl, static_val); - - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_MARKED_DISP); - EnableWindow(cur_ctrl, g_cf->marked_count && filtered_active); - if (range->include_dependents) { - label_cnt = range->displayed_marked_plus_depends_cnt; - } else { - label_cnt = range->displayed_marked_cnt; - } - if (range->remove_ignored) { - label_cnt -= range->displayed_ignored_marked_cnt; - } - StringCchPrintf(static_val, STATIC_LABEL_CHARS, _T("%d"), label_cnt); - SetWindowText(cur_ctrl, static_val); - - /* RANGE_SELECT_MARKED_RANGE */ - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_FIRST_LAST_BTN); - EnableWindow(cur_ctrl, range->mark_range_cnt); - - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_FIRST_LAST_CAP); - EnableWindow(cur_ctrl, range->mark_range_cnt && !filtered_active); - if (range->include_dependents) { - label_cnt = range->mark_range_plus_depends_cnt; - } else { - label_cnt = range->mark_range_cnt; - } - if (range->remove_ignored) { - label_cnt -= range->ignored_mark_range_cnt; - } - StringCchPrintf(static_val, STATIC_LABEL_CHARS, _T("%d"), label_cnt); - SetWindowText(cur_ctrl, static_val); - - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_FIRST_LAST_DISP); - EnableWindow(cur_ctrl, range->displayed_mark_range_cnt && filtered_active); - if (range->include_dependents) { - label_cnt = range->displayed_mark_range_plus_depends_cnt; - } else { - label_cnt = range->displayed_mark_range_cnt; - } - if (range->remove_ignored) { - label_cnt -= range->displayed_ignored_mark_range_cnt; - } - StringCchPrintf(static_val, STATIC_LABEL_CHARS, _T("%d"), label_cnt); - SetWindowText(cur_ctrl, static_val); - - /* RANGE_SELECT_USER */ - switch (packet_range_check(range)) { - case CVT_NO_ERROR: - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_RANGE_EDIT); - SendMessage(cur_ctrl, EM_SETBKGNDCOLOR, (WPARAM) 1, COLOR_WINDOW); - - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_RANGE_CAP); - EnableWindow(cur_ctrl, !filtered_active); - if (range->include_dependents) { - label_cnt = range->user_range_plus_depends_cnt; - } else { - label_cnt = range->user_range_cnt; - } - if (range->remove_ignored) { - label_cnt -= range->ignored_user_range_cnt; - } - StringCchPrintf(static_val, STATIC_LABEL_CHARS, _T("%d"), label_cnt); - SetWindowText(cur_ctrl, static_val); - - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_RANGE_DISP); - EnableWindow(cur_ctrl, filtered_active); - if (range->include_dependents) { - label_cnt = range->displayed_user_range_plus_depends_cnt; - } else { - label_cnt = range->displayed_user_range_cnt; - } - if (range->remove_ignored) { - label_cnt -= range->displayed_ignored_user_range_cnt; - } else { - } - StringCchPrintf(static_val, STATIC_LABEL_CHARS, _T("%u"), label_cnt); - SetWindowText(cur_ctrl, static_val); - break; - case CVT_SYNTAX_ERROR: - if (range->process == range_process_user_range) range_valid = false; - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_RANGE_EDIT); - SendMessage(cur_ctrl, EM_SETBKGNDCOLOR, 0, RGB(0xff, 0xcc, 0xcc)); - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_RANGE_CAP); - SetWindowText(cur_ctrl, _T("Bad range")); - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_RANGE_DISP); - SetWindowText(cur_ctrl, _T("-")); - break; - case CVT_NUMBER_TOO_BIG: - if (range->process == range_process_user_range) range_valid = false; - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_RANGE_EDIT); - SendMessage(cur_ctrl, EM_SETBKGNDCOLOR, 0, RGB(0xff, 0xcc, 0xcc)); - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_RANGE_CAP); - SetWindowText(cur_ctrl, _T("Too large")); - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_RANGE_DISP); - SetWindowText(cur_ctrl, _T("-")); - break; - - default: - ws_assert_not_reached(); - } - - /* RANGE_REMOVE_IGNORED_PACKETS */ - switch(range->process) { - case(range_process_all): - ignored_cnt = range->ignored_cnt; - displayed_ignored_cnt = range->displayed_ignored_cnt; - break; - case(range_process_selected): - ignored_cnt = range->ignored_selection_range_cnt; - displayed_ignored_cnt = range->displayed_ignored_selection_range_cnt; - break; - case(range_process_marked): - ignored_cnt = range->ignored_marked_cnt; - displayed_ignored_cnt = range->displayed_ignored_marked_cnt; - break; - case(range_process_marked_range): - ignored_cnt = range->ignored_mark_range_cnt; - displayed_ignored_cnt = range->displayed_ignored_mark_range_cnt; - break; - case(range_process_user_range): - ignored_cnt = range->ignored_user_range_cnt; - displayed_ignored_cnt = range->displayed_ignored_user_range_cnt; - break; - default: - ws_assert_not_reached(); - } - - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_REMOVE_IGN_CB); - EnableWindow(cur_ctrl, ignored_cnt); - - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_IGNORED_CAP); - EnableWindow(cur_ctrl, ignored_cnt && !filtered_active); - StringCchPrintf(static_val, STATIC_LABEL_CHARS, _T("%u"), ignored_cnt); - SetWindowText(cur_ctrl, static_val); - - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_IGNORED_DISP); - EnableWindow(cur_ctrl, displayed_ignored_cnt && filtered_active); - StringCchPrintf(static_val, STATIC_LABEL_CHARS, _T("%u"), displayed_ignored_cnt); - SetWindowText(cur_ctrl, static_val); - - /* RANGE_REMOVE_IGNORED_PACKETS */ - switch(range->process) { - case(range_process_all): - depended_cnt = 0; - displayed_depended_cnt = range->displayed_plus_dependents_cnt - range->displayed_cnt; - break; - case(range_process_selected): - depended_cnt = range->selected_plus_depends_cnt - range->selection_range_cnt; - displayed_depended_cnt = range->displayed_selected_plus_depends_cnt - range->displayed_selection_range_cnt; - break; - case(range_process_marked): - depended_cnt = range->marked_plus_depends_cnt - range->cf->marked_count; - displayed_depended_cnt = range->displayed_marked_plus_depends_cnt - range->displayed_marked_cnt; - break; - case(range_process_marked_range): - depended_cnt = range->mark_range_plus_depends_cnt - range->mark_range_cnt; - displayed_depended_cnt = range->displayed_mark_range_plus_depends_cnt - range->displayed_mark_range_cnt; - break; - case(range_process_user_range): - depended_cnt = range->user_range_plus_depends_cnt - range->user_range_cnt; - displayed_depended_cnt = range->displayed_user_range_plus_depends_cnt - range->displayed_user_range_cnt; - break; - default: - ws_assert_not_reached(); - } - - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_INCLUDE_DPD_CB); - if (filtered_active) { - EnableWindow(cur_ctrl, displayed_depended_cnt); - } else { - EnableWindow(cur_ctrl, depended_cnt); - } - - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_DEPENDED_CAP); - EnableWindow(cur_ctrl, depended_cnt && !filtered_active); - StringCchPrintf(static_val, STATIC_LABEL_CHARS, _T("%u"), depended_cnt); - SetWindowText(cur_ctrl, static_val); - - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_DEPENDED_DISP); - EnableWindow(cur_ctrl, displayed_depended_cnt && filtered_active); - StringCchPrintf(static_val, STATIC_LABEL_CHARS, _T("%u"), displayed_depended_cnt); - SetWindowText(cur_ctrl, static_val); - - cur_ctrl = GetDlgItem(GetParent(dlg_hwnd), IDOK); - EnableWindow(cur_ctrl, range_valid); -} - -static void -range_handle_wm_initdialog(HWND dlg_hwnd, packet_range_t *range) { - HWND cur_ctrl; - - /* Set the appropriate captured/displayed radio */ - if (range->process_filtered) - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_DISPLAYED_BTN); - else - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_CAPTURED_BTN); - SendMessage(cur_ctrl, BM_SETCHECK, true, 0); - - /* Retain the filter text, and fill it in. */ - if(range->user_range != NULL) { - char* tmp_str; - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_RANGE_EDIT); - tmp_str = range_convert_range(NULL, range->user_range); - SetWindowText(cur_ctrl, utf_8to16(tmp_str)); - wmem_free(NULL, tmp_str); - } - - /* dynamic values in the range frame */ - range_update_dynamics(dlg_hwnd, range); - - /* Set the appropriate range radio */ - switch(range->process) { - case(range_process_all): - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_ALL_PKTS_BTN); - break; - case(range_process_selected): - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_SEL_PKT_BTN); - break; - case(range_process_marked): - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_MARKED_BTN); - break; - case(range_process_marked_range): - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_FIRST_LAST_BTN); - break; - case(range_process_user_range): - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_RANGE_BTN); - break; - default: - ws_assert_not_reached(); - } - SendMessage(cur_ctrl, BM_SETCHECK, true, 0); - - /* Set the include depended upon checkbox */ - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_INCLUDE_DPD_CB); - SendMessage(cur_ctrl, BM_SETCHECK, range->include_dependents, 0); -} - -static void -range_handle_wm_command(HWND dlg_hwnd, HWND ctrl, WPARAM w_param, packet_range_t *range) { - HWND cur_ctrl; - TCHAR range_text[RANGE_TEXT_MAX]; - - if (!range) return; - - switch(w_param) { - case (BN_CLICKED << 16) | EWFD_CAPTURED_BTN: - case (BN_CLICKED << 16) | EWFD_DISPLAYED_BTN: - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_CAPTURED_BTN); - if (SendMessage(cur_ctrl, BM_GETCHECK, 0, 0) == BST_CHECKED) - range->process_filtered = false; - else - range->process_filtered = true; - range_update_dynamics(dlg_hwnd, range); - break; - case (BN_CLICKED << 16) | EWFD_ALL_PKTS_BTN: - if (SendMessage(ctrl, BM_GETCHECK, 0, 0) == BST_CHECKED) { - range->process = range_process_all; - range_update_dynamics(dlg_hwnd, range); - } - break; - case (BN_CLICKED << 16) | EWFD_SEL_PKT_BTN: - if (SendMessage(ctrl, BM_GETCHECK, 0, 0) == BST_CHECKED) { - range->process = range_process_selected; - range_update_dynamics(dlg_hwnd, range); - } - break; - case (BN_CLICKED << 16) | EWFD_MARKED_BTN: - if (SendMessage(ctrl, BM_GETCHECK, 0, 0) == BST_CHECKED) { - range->process = range_process_marked; - range_update_dynamics(dlg_hwnd, range); - } - break; - case (BN_CLICKED << 16) | EWFD_FIRST_LAST_BTN: - if (SendMessage(ctrl, BM_GETCHECK, 0, 0) == BST_CHECKED) { - range->process = range_process_marked_range; - range_update_dynamics(dlg_hwnd, range); - } - break; - case (BN_CLICKED << 16) | EWFD_RANGE_BTN: - if (SendMessage(ctrl, BM_GETCHECK, 0, 0) == BST_CHECKED) { - range->process = range_process_user_range; - range_update_dynamics(dlg_hwnd, range); - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_RANGE_EDIT); - SetFocus(cur_ctrl); - } - break; - case (EN_SETFOCUS << 16) | EWFD_RANGE_EDIT: - cur_ctrl = GetDlgItem(dlg_hwnd, EWFD_RANGE_BTN); - SendMessage(cur_ctrl, BM_CLICK, 0, 0); - break; - case (EN_UPDATE << 16) | EWFD_RANGE_EDIT: - SendMessage(ctrl, WM_GETTEXT, (WPARAM) RANGE_TEXT_MAX, (LPARAM) range_text); - packet_range_convert_str(range, utf_16to8(range_text)); - range_update_dynamics(dlg_hwnd, range); - break; - case (BN_CLICKED << 16) | EWFD_REMOVE_IGN_CB: - if (SendMessage(ctrl, BM_GETCHECK, 0, 0) == BST_CHECKED) { - range->remove_ignored = true; - } else { - range->remove_ignored = false; - } - range_update_dynamics(dlg_hwnd, range); - break; - case (BN_CLICKED << 16) | EWFD_INCLUDE_DPD_CB: - if (SendMessage(ctrl, BM_GETCHECK, 0, 0) == BST_CHECKED) { - range->include_dependents = true; - } else { - range->include_dependents = false; - } - range_update_dynamics(dlg_hwnd, range); - break; - } -} - -static UINT_PTR CALLBACK -merge_file_hook_proc(HWND mf_hwnd, UINT msg, WPARAM w_param, LPARAM l_param) { - HWND cur_ctrl, parent; - OFNOTIFY *notify = (OFNOTIFY *) l_param; - TCHAR sel_name[MAX_PATH]; - - switch(msg) { - case WM_INITDIALOG: - /* Retain the filter text, and fill it in. */ - if(g_dfilter_str != NULL) { - cur_ctrl = GetDlgItem(mf_hwnd, EWFD_FILTER_EDIT); - SetWindowText(cur_ctrl, utf_8to16(g_dfilter_str)); - } - - /* Chrono by default */ - cur_ctrl = GetDlgItem(mf_hwnd, EWFD_MERGE_CHRONO_BTN); - SendMessage(cur_ctrl, BM_SETCHECK, true, 0); - g_merge_action = merge_append; - - preview_set_file_info(mf_hwnd, NULL); - break; - case WM_NOTIFY: - switch (notify->hdr.code) { - case CDN_FILEOK: - /* Fetch the read filter */ - cur_ctrl = GetDlgItem(mf_hwnd, EWFD_FILTER_EDIT); - g_free(g_dfilter_str); - g_dfilter_str = filter_tb_get(cur_ctrl); - - cur_ctrl = GetDlgItem(mf_hwnd, EWFD_MERGE_CHRONO_BTN); - if(SendMessage(cur_ctrl, BM_GETCHECK, 0, 0) == BST_CHECKED) { - g_merge_action = merge_chrono; - } else { - cur_ctrl = GetDlgItem(mf_hwnd, EWFD_MERGE_PREPEND_BTN); - if(SendMessage(cur_ctrl, BM_GETCHECK, 0, 0) == BST_CHECKED) { - g_merge_action = merge_prepend; - } - } - - break; - case CDN_SELCHANGE: - /* This _almost_ works correctly. We need to handle directory - selections, etc. */ - parent = GetParent(mf_hwnd); - CommDlg_OpenSave_GetFilePath(parent, sel_name, MAX_PATH); - preview_set_file_info(mf_hwnd, utf_16to8(sel_name)); - break; - case CDN_HELP: - topic_action(HELP_MERGE_WIN32_DIALOG); - break; - default: - break; - } - break; - case WM_COMMAND: - cur_ctrl = (HWND) l_param; - switch(w_param) { - case (EN_UPDATE << 16) | EWFD_FILTER_EDIT: - filter_tb_syntax_check(cur_ctrl, NULL); - break; - default: - break; - } - break; - default: - break; - } - return 0; -} - - -static UINT_PTR CALLBACK -export_file_hook_proc(HWND ef_hwnd, UINT msg, WPARAM w_param, LPARAM l_param) { - HWND cur_ctrl; - OFNOTIFY *notify = (OFNOTIFY *) l_param; - bool pkt_fmt_enable; - int i, filter_index; - - switch(msg) { - case WM_INITDIALOG: { - /* default to displayed packets */ - print_args.range.process_filtered = true; - range_handle_wm_initdialog(ef_hwnd, &print_args.range); - format_handle_wm_initdialog(ef_hwnd, &print_args); - - break; - } - case WM_COMMAND: - cur_ctrl = (HWND) l_param; - switch (w_param) { - case (CBN_SELCHANGE << 16) | EWFD_PKT_DETAIL_COMBO: - default: - range_handle_wm_command(ef_hwnd, cur_ctrl, w_param, &print_args.range); - print_update_dynamic(ef_hwnd, &print_args); - break; - } - break; - case WM_NOTIFY: - switch (notify->hdr.code) { - case CDN_FILEOK: - break; - case CDN_TYPECHANGE: - filter_index = notify->lpOFN->nFilterIndex; - - if (filter_index == 2) /* PostScript */ - print_args.format = PR_FMT_TEXT; - else - print_args.format = PR_FMT_PS; - if (filter_index == 3 || filter_index == 4 || filter_index == 5 || filter_index == 6) - pkt_fmt_enable = false; - else - pkt_fmt_enable = true; - for (i = EWFD_PKT_FORMAT_GB; i <= EWFD_PKT_NEW_PAGE_CB; i++) { - cur_ctrl = GetDlgItem(ef_hwnd, i); - EnableWindow(cur_ctrl, pkt_fmt_enable); - } - break; - case CDN_HELP: - topic_action(HELP_EXPORT_FILE_WIN32_DIALOG); - break; - default: - break; - } - break; - default: - break; - } - return 0; -} - #endif // _WIN32 diff --git a/ui/win32/file_dlg_win32.h b/ui/win32/file_dlg_win32.h index 2bb2fb4d..eef7fe38 100644 --- a/ui/win32/file_dlg_win32.h +++ b/ui/win32/file_dlg_win32.h @@ -12,11 +12,6 @@ #ifndef __FILE_DLG_WIN32_H__ #define __FILE_DLG_WIN32_H__ -#ifndef RC_INVOKED // RC warns about gatomic's long identifiers. -#include "ui/file_dialog.h" -#include "ui/packet_range.h" -#endif - #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ @@ -28,8 +23,10 @@ extern "C" { * via Qt:AA_EnableHighDpiScaling. We do this in main.cpp. In order for * native dialogs to be rendered correctly we need to set per-monitor * *v2* awareness prior to creating the dialog, which we can do here. - * Qt doesn't render correctly when per-monitor v2 awareness is enabled, so - * we need to revert our thread context when we're done. + * Qt < 5.14(?) or so doesn't render correctly when per-monitor v2 awareness + * is enabled, so we need to revert our thread context when we're done. + * Qt >= 6.0 is per-monitor DPI awareness v2 by default, so this doesn't + * have any effect. * * @return The current thread DPI awareness context, which should * be passed to revert_thread_per_monitor_v2_awareness. @@ -42,140 +39,6 @@ HANDLE set_thread_per_monitor_v2_awareness(void); */ void revert_thread_per_monitor_v2_awareness(HANDLE context); -/** Open the "Open" dialog box. - * - * @param h_wnd HWND of the parent window. - * @param file_name File name - * @param type File type - * @param display_filter a display filter - */ -bool win32_open_file (HWND h_wnd, const wchar_t *title, GString *file_name, unsigned int *type, GString *display_filter); - -/** Open the "Save As" dialog box. - * - * @param h_wnd HWND of the parent window. - * @param cf capture_file Structure for the capture to be saved - * @param file_name File name. May be empty. - * @param file_type Wiretap file type. - * @param compression_type Compression type to use, or uncompressed. - * @param must_support_comments true if the file format list should - * include only file formats that support comments - * - * @return true if packets were discarded when saving, false otherwise - */ -bool win32_save_as_file(HWND h_wnd, const wchar_t *title, capture_file *cf, - GString *file_name, int *file_type, - wtap_compression_type *compression_type, - bool must_support_comments); - -/** Open the "Export Specified Packets" dialog box. - * - * @param h_wnd HWND of the parent window. - * @param cf capture_file Structure for the capture to be saved - * @param file_name File name. May be empty. - * @param file_type Wiretap file type. - * @param compression_type Compression type to use, or uncompressed. - * @param range Range of packets to export. - * - * @return true if packets were discarded when saving, false otherwise - */ -bool win32_export_specified_packets_file(HWND h_wnd, - const wchar_t *title, - capture_file *cf, - GString *file_name, - int *file_type, - wtap_compression_type *compression_type, - packet_range_t *range); - - -/** Open the "Merge" dialog box. - * - * @param h_wnd HWND of the parent window. - * @param file_name File name - * @param display_filter a display filter - * @param merge_type type of merge - */ -bool win32_merge_file (HWND h_wnd, const wchar_t *title, GString *file_name, GString *display_filter, int *merge_type); - -/** Open the "Export" dialog box. - * - * @param h_wnd HWND of the parent window. - * @param cf capture_file Structure for the capture to be saved - * @param export_type The export type. - * @param range a possible range - */ -void win32_export_file (HWND h_wnd, const wchar_t *title, capture_file *cf, export_type_e export_type, const char *range); - -/* Open dialog defines */ -/* #define EWFD_FILTER_BTN 1000 */ -#define EWFD_FILTER_LBL 1000 -#define EWFD_FILTER_EDIT 1001 - -#define EWFD_MAC_NR_CB 1002 -#define EWFD_NET_NR_CB 1003 -#define EWFD_TRANS_NR_CB 1004 -#define EWFD_EXTERNAL_NR_CB 1005 - -/* Note: The preview title (PT) and text (PTX) MUST have sequential IDs; - they're used in a for loop. EWFD_PT_FILENAME MUST be first, and - EWFD_PTX_ELAPSED MUST be last. (so why don't we just use an enum? */ -#define EWFD_PT_FORMAT 1006 -#define EWFD_PT_SIZE 1007 -#define EWFD_PT_START_ELAPSED 1008 - -#define EWFD_PTX_FORMAT 1009 -#define EWFD_PTX_SIZE 1010 -#define EWFD_PTX_START_ELAPSED 1011 - -#define EWFD_FORMAT_TYPE 1020 - -/* Save as and export dialog defines */ -#define EWFD_GZIP_CB 1040 - -/* Export dialog defines */ -#define EWFD_CAPTURED_BTN 1000 -#define EWFD_DISPLAYED_BTN 1001 -#define EWFD_ALL_PKTS_BTN 1002 -#define EWFD_SEL_PKT_BTN 1003 -#define EWFD_MARKED_BTN 1004 -#define EWFD_FIRST_LAST_BTN 1005 -#define EWFD_RANGE_BTN 1006 -#define EWFD_RANGE_EDIT 1007 -#define EWFD_REMOVE_IGN_CB 1008 -#define EWFD_INCLUDE_DPD_CB 1009 - -#define EWFD_ALL_PKTS_CAP 1010 -#define EWFD_SEL_PKT_CAP 1011 -#define EWFD_MARKED_CAP 1012 -#define EWFD_FIRST_LAST_CAP 1013 -#define EWFD_RANGE_CAP 1014 -#define EWFD_IGNORED_CAP 1015 -#define EWFD_DEPENDED_CAP 1016 - -#define EWFD_ALL_PKTS_DISP 1017 -#define EWFD_SEL_PKT_DISP 1018 -#define EWFD_MARKED_DISP 1019 -#define EWFD_FIRST_LAST_DISP 1020 -#define EWFD_RANGE_DISP 1021 -#define EWFD_IGNORED_DISP 1022 -#define EWFD_DEPENDED_DISP 1023 - -/* Merge dialog defines. Overlays Open dialog defines above. */ -#define EWFD_MERGE_PREPEND_BTN 1050 -#define EWFD_MERGE_CHRONO_BTN 1051 -#define EWFD_MERGE_APPEND_BTN 1052 - -/* Export dialog defines. Overlays Save dialog defines above. */ -/* These MUST be contiguous */ -#define EWFD_PKT_FORMAT_GB 1050 -#define EWFD_PKT_SUMMARY_CB 1051 -#define EWFD_COL_HEADINGS_CB 1052 -#define EWFD_PKT_DETAIL_CB 1053 -#define EWFD_PKT_DETAIL_COMBO 1054 -#define EWFD_PKT_BYTES_CB 1055 -#define EWFD_DATA_SOURCES_CB 1056 -#define EWFD_PKT_NEW_PAGE_CB 1057 - #ifdef __cplusplus } #endif /* __cplusplus */ |