diff options
Diffstat (limited to 'ui/logray')
-rw-r--r-- | ui/logray/CMakeLists.txt | 764 | ||||
-rw-r--r-- | ui/logray/i18n.qrc.in | 4 | ||||
-rw-r--r-- | ui/logray/logray_application.cpp | 59 | ||||
-rw-r--r-- | ui/logray/logray_application.h | 33 | ||||
-rw-r--r-- | ui/logray/logray_en.ts | 13687 | ||||
-rw-r--r-- | ui/logray/logray_main.cpp | 1094 | ||||
-rw-r--r-- | ui/logray/logray_main_window.cpp | 2919 | ||||
-rw-r--r-- | ui/logray/logray_main_window.h | 466 | ||||
-rw-r--r-- | ui/logray/logray_main_window.ui | 2312 | ||||
-rw-r--r-- | ui/logray/logray_main_window_slots.cpp | 3324 |
10 files changed, 24662 insertions, 0 deletions
diff --git a/ui/logray/CMakeLists.txt b/ui/logray/CMakeLists.txt new file mode 100644 index 00000000..2af4cceb --- /dev/null +++ b/ui/logray/CMakeLists.txt @@ -0,0 +1,764 @@ +# CMakeLists.txt +# +# Wireshark - Network traffic analyzer +# By Gerald Combs <gerald@wireshark.org> +# Copyright 1998 Gerald Combs +# +# SPDX-License-Identifier: GPL-2.0-or-later +# + +if(USE_qt6) + set(qtver "6") +else() + set(qtver "5") +endif() + +ADD_CUSTOM_CMAKE_INCLUDE() + +set(WIRESHARK_WIDGET_HEADERS + ../qt/widgets/additional_toolbar.h + ../qt/widgets/apply_line_edit.h + ../qt/widgets/byte_view_text.h + ../qt/widgets/capture_filter_combo.h + ../qt/widgets/capture_filter_edit.h + ../qt/widgets/clickable_label.h + ../qt/widgets/copy_from_profile_button.h + ../qt/widgets/detachable_tabwidget.h + ../qt/widgets/display_filter_combo.h + ../qt/widgets/display_filter_edit.h + ../qt/widgets/dissector_syntax_line_edit.h + ../qt/widgets/dissector_tables_view.h + ../qt/widgets/drag_drop_toolbar.h + ../qt/widgets/drag_label.h + ../qt/widgets/editor_file_dialog.h + ../qt/widgets/elided_label.h + ../qt/widgets/expert_info_view.h + ../qt/widgets/export_objects_view.h + ../qt/widgets/field_filter_edit.h + ../qt/widgets/filter_expression_toolbar.h + ../qt/widgets/find_line_edit.h + ../qt/widgets/interface_toolbar_lineedit.h + ../qt/widgets/label_stack.h + ../qt/widgets/overlay_scroll_bar.h + ../qt/widgets/packet_list_header.h + ../qt/widgets/path_selection_edit.h + ../qt/widgets/pref_module_view.h + ../qt/widgets/profile_tree_view.h + ../qt/widgets/range_syntax_lineedit.h + ../qt/widgets/splash_overlay.h + ../qt/widgets/stock_icon_tool_button.h + ../qt/widgets/syntax_line_edit.h + ../qt/widgets/wireless_timeline.h # Required by PacketListModel + ../qt/widgets/tabnav_tree_view.h + ../qt/widgets/traffic_tab.h + ../qt/widgets/traffic_tree.h + ../qt/widgets/traffic_types_list.h + ../qt/widgets/wireshark_file_dialog.h +) + +set (LOGRAY_WIDGET_HEADERS ${WIRESHARK_WIDGET_HEADERS}) + +set(WIRESHARK_3RD_PARTY_WIDGET_HEADERS + ../qt/widgets/qcustomplot.h +) + +set (LOGRAY_3RD_PARTY_WIDGET_HEADERS ${WIRESHARK_3RD_PARTY_WIDGET_HEADERS}) + +set(WIRESHARK_MANAGER_HEADERS + ../qt/manager/preference_manager.h + ../qt/manager/wireshark_preference.h +) + +set (LOGRAY_MANAGER_HEADERS ${WIRESHARK_MANAGER_HEADERS}) + +set(WIRESHARK_UTILS_HEADERS + ../qt/utils/color_utils.h + ../qt/utils/data_printer.h + ../qt/utils/field_information.h + ../qt/utils/frame_information.h + ../qt/utils/idata_printable.h + ../qt/utils/proto_node.h + ../qt/utils/qt_ui_utils.h + ../qt/utils/stock_icon.h + ../qt/utils/tango_colors.h + ../qt/utils/variant_pointer.h + ../qt/utils/wireshark_mime_data.h + ../qt/utils/wireshark_zip_helper.h +) + +set (LOGRAY_UTILS_HEADERS ${WIRESHARK_UTILS_HEADERS}) + +set(WIRESHARK_MODEL_HEADERS + ../qt/models/astringlist_list_model.h + ../qt/models/atap_data_model.h + ../qt/models/cache_proxy_model.h + ../qt/models/coloring_rules_delegate.h + ../qt/models/coloring_rules_model.h + ../qt/models/column_list_model.h + ../qt/models/decode_as_delegate.h + ../qt/models/decode_as_model.h + ../qt/models/dissector_tables_model.h + ../qt/models/enabled_protocols_model.h + ../qt/models/expert_info_model.h + ../qt/models/expert_info_proxy_model.h + ../qt/models/export_objects_model.h + ../qt/models/fileset_entry_model.h + ../qt/models/filter_list_model.h + ../qt/models/info_proxy_model.h + ../qt/models/interface_sort_filter_model.h + ../qt/models/interface_tree_cache_model.h + ../qt/models/interface_tree_model.h + ../qt/models/numeric_value_chooser_delegate.h + ../qt/models/packet_list_model.h + ../qt/models/packet_list_record.h + ../qt/models/path_selection_delegate.h + ../qt/models/percent_bar_delegate.h + ../qt/models/pref_delegate.h + ../qt/models/pref_models.h + ../qt/models/profile_model.h + ../qt/models/proto_tree_model.h + ../qt/models/related_packet_delegate.h + ../qt/models/resolved_addresses_models.h + ../qt/models/sparkline_delegate.h + ../qt/models/supported_protocols_model.h + ../qt/models/timeline_delegate.h + ../qt/models/tree_model_helpers.h + ../qt/models/uat_delegate.h + ../qt/models/uat_model.h + ../qt/models/url_link_delegate.h +) + +set (LOGRAY_MODEL_HEADERS ${WIRESHARK_MODEL_HEADERS}) + +# All .h files which inherit from QObject aka which use the Q_OBJECT macro +# need to go here. +set(WIRESHARK_QT_HEADERS + ../qt/about_dialog.h + ../qt/accordion_frame.h + ../qt/address_editor_frame.h + ../qt/byte_view_tab.h + ../qt/capture_file_dialog.h + ../qt/capture_file_properties_dialog.h + ../qt/capture_file.h + ../qt/capture_filter_syntax_worker.h + ../qt/capture_options_dialog.h + ../qt/capture_preferences_frame.h + ../qt/coloring_rules_dialog.h + ../qt/column_editor_frame.h + ../qt/column_preferences_frame.h + ../qt/compiled_filter_output.h + ../qt/conversation_colorize_action.h + ../qt/conversation_dialog.h + ../qt/conversation_hash_tables_dialog.h + ../qt/decode_as_dialog.h + ../qt/display_filter_expression_dialog.h + ../qt/dissector_tables_dialog.h + ../qt/enabled_protocols_dialog.h + ../qt/endpoint_dialog.h + ../qt/expert_info_dialog.h + ../qt/export_dissection_dialog.h + ../qt/export_object_action.h + ../qt/export_object_dialog.h + ../qt/export_pdu_dialog.h + ../qt/extcap_argument_file.h + ../qt/extcap_argument_multiselect.h + ../qt/extcap_argument.h + ../qt/extcap_options_dialog.h + ../qt/file_set_dialog.h + ../qt/filter_action.h + ../qt/filter_dialog.h + ../qt/filter_dialog.h + ../qt/filter_expression_frame.h + ../qt/follow_stream_action.h + ../qt/font_color_preferences_frame.h + ../qt/funnel_statistics.h + ../qt/funnel_string_dialog.h + ../qt/funnel_text_dialog.h + ../qt/geometry_state_dialog.h + ../qt/glib_mainloop_on_qeventloop.h + ../qt/import_text_dialog.h + ../qt/interface_frame.h + ../qt/interface_toolbar_reader.h + ../qt/interface_toolbar.h + ../qt/io_console_dialog.h + ../qt/io_graph_dialog.h + ../qt/layout_preferences_frame.h + ../qt/main_application.h + ../qt/main_status_bar.h + ../qt/main_window_preferences_frame.h + ../qt/main_window.h + ../qt/manage_interfaces_dialog.h + ../qt/module_preferences_scroll_area.h + ../qt/packet_comment_dialog.h + ../qt/packet_diagram.h + ../qt/packet_dialog.h + ../qt/packet_format_group_box.h + ../qt/packet_list.h + ../qt/packet_range_group_box.h + ../qt/preference_editor_frame.h + ../qt/preferences_dialog.h + ../qt/print_dialog.h + ../qt/profile_dialog.h + ../qt/progress_frame.h + ../qt/proto_tree.h + ../qt/protocol_hierarchy_dialog.h + ../qt/protocol_preferences_menu.h + ../qt/recent_file_status.h + ../qt/resolved_addresses_dialog.h + ../qt/response_time_delay_dialog.h + ../qt/rsa_keys_frame.h + ../qt/search_frame.h + # XXX Depends on RTP Stream Dialog + # ../qt/sequence_diagram.h + # ../qt/sequence_dialog.h + ../qt/show_packet_bytes_dialog.h + ../qt/simple_statistics_dialog.h + ../qt/stats_tree_dialog.h + ../qt/supported_protocols_dialog.h + ../qt/tabnav_tree_widget.h + ../qt/tap_parameter_dialog.h + ../qt/tcp_stream_dialog.h + ../qt/time_shift_dialog.h + ../qt/traffic_table_dialog.h + ../qt/uat_dialog.h + ../qt/uat_frame.h + ../qt/welcome_page.h + ../qt/wireshark_dialog.h + ../qt/${WIRESHARK_CUSTOM_QT_HEADERS} +) + +if(ENABLE_PCAP) + list(APPEND WIRESHARK_QT_HEADERS + ../qt/capture_info_dialog.h + ) + if(HAVE_PCAP_REMOTE) + list(APPEND WIRESHARK_QT_HEADERS + ../qt/remote_capture_dialog.h + ../qt/remote_settings_dialog.h + ) + endif() +endif() + +set (LOGRAY_QT_HEADERS + logray_application.h + logray_main_window.h + ${WIRESHARK_QT_HEADERS} +) + +set(WIRESHARK_WIDGET_SRCS + ../qt/widgets/additional_toolbar.cpp + ../qt/widgets/apply_line_edit.cpp + ../qt/widgets/byte_view_text.cpp + ../qt/widgets/capture_filter_combo.cpp + ../qt/widgets/capture_filter_edit.cpp + ../qt/widgets/clickable_label.cpp + ../qt/widgets/copy_from_profile_button.cpp + ../qt/widgets/detachable_tabwidget.cpp + ../qt/widgets/display_filter_combo.cpp + ../qt/widgets/display_filter_edit.cpp + ../qt/widgets/dissector_syntax_line_edit.cpp + ../qt/widgets/dissector_tables_view.cpp + ../qt/widgets/drag_drop_toolbar.cpp + ../qt/widgets/drag_label.cpp + ../qt/widgets/editor_file_dialog.cpp + ../qt/widgets/elided_label.cpp + ../qt/widgets/expert_info_view.cpp + ../qt/widgets/export_objects_view.cpp + ../qt/widgets/field_filter_edit.cpp + ../qt/widgets/filter_expression_toolbar.cpp + ../qt/widgets/find_line_edit.cpp + ../qt/widgets/interface_toolbar_lineedit.cpp + ../qt/widgets/label_stack.cpp + ../qt/widgets/overlay_scroll_bar.cpp + ../qt/widgets/packet_list_header.cpp + ../qt/widgets/path_selection_edit.cpp + ../qt/widgets/pref_module_view.cpp + ../qt/widgets/profile_tree_view.cpp + ../qt/widgets/range_syntax_lineedit.cpp + ../qt/widgets/splash_overlay.cpp + ../qt/widgets/stock_icon_tool_button.cpp + ../qt/widgets/syntax_line_edit.cpp + ../qt/widgets/wireless_timeline.cpp # Required by PacketListModel + ../qt/widgets/tabnav_tree_view.cpp + ../qt/widgets/traffic_tab.cpp + ../qt/widgets/traffic_tree.cpp + ../qt/widgets/traffic_types_list.cpp + ../qt/widgets/wireshark_file_dialog.cpp +) + +set (LOGRAY_WIDGET_SRCS ${WIRESHARK_WIDGET_SRCS}) + +set(WIRESHARK_3RD_PARTY_WIDGET_SRCS + ../qt/widgets/qcustomplot.cpp +) + +set (LOGRAY_3RD_PARTY_WIDGET_SRCS ${WIRESHARK_3RD_PARTY_WIDGET_SRCS}) + +set(WIRESHARK_MANAGER_SRCS + ../qt/manager/preference_manager.cpp + ../qt/manager/wireshark_preference.cpp +) + +set (LOGRAY_MANAGER_SRCS ${WIRESHARK_MANAGER_SRCS}) + +set(WIRESHARK_UTILS_SRCS + ../qt/utils/color_utils.cpp + ../qt/utils/data_printer.cpp + ../qt/utils/field_information.cpp + ../qt/utils/frame_information.cpp + ../qt/utils/proto_node.cpp + ../qt/utils/qt_ui_utils.cpp + ../qt/utils/stock_icon.cpp + ../qt/utils/wireshark_mime_data.cpp + ../qt/utils/wireshark_zip_helper.cpp +) + +set (LOGRAY_UTILS_SRCS ${WIRESHARK_UTILS_SRCS}) + +set(WIRESHARK_MODEL_SRCS + ../qt/models/astringlist_list_model.cpp + ../qt/models/atap_data_model.cpp + ../qt/models/cache_proxy_model.cpp + ../qt/models/coloring_rules_delegate.cpp + ../qt/models/coloring_rules_model.cpp + ../qt/models/column_list_model.cpp + ../qt/models/decode_as_delegate.cpp + ../qt/models/decode_as_model.cpp + ../qt/models/dissector_tables_model.cpp + ../qt/models/enabled_protocols_model.cpp + ../qt/models/expert_info_model.cpp + ../qt/models/expert_info_proxy_model.cpp + ../qt/models/export_objects_model.cpp + ../qt/models/fileset_entry_model.cpp + ../qt/models/filter_list_model.cpp + ../qt/models/info_proxy_model.cpp + ../qt/models/interface_sort_filter_model.cpp + ../qt/models/interface_tree_cache_model.cpp + ../qt/models/interface_tree_model.cpp + ../qt/models/numeric_value_chooser_delegate.cpp + ../qt/models/packet_list_model.cpp + ../qt/models/packet_list_record.cpp + ../qt/models/path_selection_delegate.cpp + ../qt/models/percent_bar_delegate.cpp + ../qt/models/pref_delegate.cpp + ../qt/models/pref_models.cpp + ../qt/models/profile_model.cpp + ../qt/models/proto_tree_model.cpp + ../qt/models/related_packet_delegate.cpp + ../qt/models/resolved_addresses_models.cpp + ../qt/models/sparkline_delegate.cpp + ../qt/models/supported_protocols_model.cpp + ../qt/models/timeline_delegate.cpp + ../qt/models/uat_delegate.cpp + ../qt/models/uat_model.cpp + ../qt/models/url_link_delegate.cpp +) + +set (LOGRAY_MODEL_SRCS ${WIRESHARK_MODEL_SRCS}) + +set(WIRESHARK_QT_SRC + ../qt/about_dialog.cpp + ../qt/accordion_frame.cpp + ../qt/address_editor_frame.cpp + ../qt/byte_view_tab.cpp + ../qt/capture_file_dialog.cpp + ../qt/capture_file_properties_dialog.cpp + ../qt/capture_file.cpp + ../qt/capture_filter_syntax_worker.cpp + ../qt/capture_options_dialog.cpp + ../qt/capture_preferences_frame.cpp + ../qt/coloring_rules_dialog.cpp + ../qt/column_editor_frame.cpp + ../qt/column_preferences_frame.cpp + ../qt/compiled_filter_output.cpp + ../qt/conversation_colorize_action.cpp + ../qt/conversation_dialog.cpp + ../qt/conversation_hash_tables_dialog.cpp + ../qt/decode_as_dialog.cpp + ../qt/display_filter_expression_dialog.cpp + ../qt/dissector_tables_dialog.cpp + ../qt/enabled_protocols_dialog.cpp + ../qt/endpoint_dialog.cpp + ../qt/export_dissection_dialog.cpp + ../qt/export_object_action.cpp + ../qt/export_object_dialog.cpp + ../qt/export_pdu_dialog.cpp + ../qt/extcap_argument_file.cpp + ../qt/extcap_argument_multiselect.cpp + ../qt/extcap_argument.cpp + ../qt/extcap_options_dialog.cpp + ../qt/file_set_dialog.cpp + ../qt/filter_action.cpp + ../qt/filter_dialog.cpp + ../qt/filter_expression_frame.cpp + ../qt/follow_stream_action.cpp + ../qt/font_color_preferences_frame.cpp + ../qt/funnel_string_dialog.cpp + ../qt/funnel_text_dialog.cpp + ../qt/geometry_state_dialog.cpp + ../qt/glib_mainloop_on_qeventloop.cpp + ../qt/import_text_dialog.cpp + ../qt/interface_frame.cpp + ../qt/interface_toolbar_reader.cpp + ../qt/interface_toolbar.cpp + ../qt/io_console_dialog.cpp + ../qt/layout_preferences_frame.cpp + ../qt/main_application.cpp + ../qt/main_status_bar.cpp + ../qt/main_window_layout.cpp + ../qt/main_window_preferences_frame.cpp + ../qt/main_window.cpp + ../qt/manage_interfaces_dialog.cpp + ../qt/module_preferences_scroll_area.cpp + ../qt/packet_comment_dialog.cpp + ../qt/packet_diagram.cpp + ../qt/packet_dialog.cpp + ../qt/packet_format_group_box.cpp + ../qt/packet_list.cpp + ../qt/packet_range_group_box.cpp + ../qt/preference_editor_frame.cpp + ../qt/preferences_dialog.cpp + ../qt/print_dialog.cpp + ../qt/profile_dialog.cpp + ../qt/progress_frame.cpp + ../qt/proto_tree.cpp + ../qt/protocol_hierarchy_dialog.cpp + ../qt/protocol_preferences_menu.cpp + ../qt/recent_file_status.cpp + ../qt/resolved_addresses_dialog.cpp + ../qt/response_time_delay_dialog.cpp + ../qt/rsa_keys_frame.cpp + ../qt/search_frame.cpp + # XXX Depends on RTP Stream Dialog + # ../qt/sequence_diagram.cpp + # ../qt/sequence_dialog.cpp + ../qt/show_packet_bytes_dialog.cpp + ../qt/simple_dialog.cpp + ../qt/simple_statistics_dialog.cpp + ../qt/supported_protocols_dialog.cpp + ../qt/tabnav_tree_widget.cpp + ../qt/tap_parameter_dialog.cpp + ../qt/tcp_stream_dialog.cpp + ../qt/time_shift_dialog.cpp + ../qt/traffic_table_dialog.cpp + ../qt/uat_dialog.cpp + ../qt/uat_frame.cpp + ../qt/welcome_page.cpp + ../qt/wireshark_dialog.cpp + ../qt/${WIRESHARK_CUSTOM_QT_SRCS} +) + +if(ENABLE_PCAP) + list(APPEND WIRESHARK_QT_SRC + ../qt/capture_info_dialog.cpp + ) + if(HAVE_PCAP_REMOTE) + list(APPEND WIRESHARK_QT_SRC + ../qt/remote_capture_dialog.cpp + ../qt/remote_settings_dialog.cpp + ) + endif() +endif() + +set (LOGRAY_QT_SRC + logray_application.cpp + logray_main.cpp + logray_main_window.cpp + logray_main_window_slots.cpp + ${WIRESHARK_QT_SRC}) + +set(WIRESHARK_QT_TAP_SRC + ${CMAKE_CURRENT_SOURCE_DIR}/../qt/expert_info_dialog.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../qt/funnel_statistics.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../qt/io_graph_dialog.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../qt/stats_tree_dialog.cpp + ${WIRESHARK_CUSTOM_TAP_SRC} +) + +set (LOGRAY_QT_TAP_SRC ${WIRESHARK_QT_TAP_SRC}) + +set(WIRESHARK_QT_FILES + ${WIRESHARK_QT_SRC} + ${WIRESHARK_QT_TAP_SRC} +) + +set (LOGRAY_QT_FILES ${WIRESHARK_QT_FILES}) + +set(WIRESHARK_QT_UI + ../qt/about_dialog.ui + ../qt/address_editor_frame.ui + ../qt/capture_file_properties_dialog.ui + ../qt/capture_info_dialog.ui + ../qt/capture_options_dialog.ui + ../qt/capture_preferences_frame.ui + ../qt/coloring_rules_dialog.ui + ../qt/column_editor_frame.ui + ../qt/column_preferences_frame.ui + ../qt/compiled_filter_output.ui + ../qt/conversation_hash_tables_dialog.ui + ../qt/decode_as_dialog.ui + ../qt/display_filter_expression_dialog.ui + ../qt/dissector_tables_dialog.ui + ../qt/enabled_protocols_dialog.ui + ../qt/expert_info_dialog.ui + ../qt/export_object_dialog.ui + ../qt/export_pdu_dialog.ui + ../qt/extcap_options_dialog.ui + ../qt/file_set_dialog.ui + ../qt/filter_dialog.ui + ../qt/filter_expression_frame.ui + ../qt/font_color_preferences_frame.ui + ../qt/funnel_string_dialog.ui + ../qt/funnel_text_dialog.ui + ../qt/import_text_dialog.ui + ../qt/interface_frame.ui + ../qt/interface_toolbar.ui + ../qt/io_console_dialog.ui + ../qt/io_graph_dialog.ui + ../qt/layout_preferences_frame.ui + ../qt/main_window_preferences_frame.ui + ../qt/manage_interfaces_dialog.ui + ../qt/module_preferences_scroll_area.ui + ../qt/packet_comment_dialog.ui + ../qt/packet_dialog.ui + ../qt/packet_format_group_box.ui + ../qt/packet_range_group_box.ui + ../qt/preference_editor_frame.ui + ../qt/preferences_dialog.ui + ../qt/print_dialog.ui + ../qt/profile_dialog.ui + ../qt/progress_frame.ui + ../qt/protocol_hierarchy_dialog.ui + ../qt/resolved_addresses_dialog.ui + ../qt/rsa_keys_frame.ui + ../qt/search_frame.ui + # XXX Depends on RTP Stream Dialog + # ../qt/sequence_dialog.ui + ../qt/show_packet_bytes_dialog.ui + ../qt/supported_protocols_dialog.ui + ../qt/tap_parameter_dialog.ui + ../qt/tcp_stream_dialog.ui + ../qt/time_shift_dialog.ui + ../qt/traffic_table_dialog.ui + ../qt/uat_dialog.ui + ../qt/uat_frame.ui + ../qt/welcome_page.ui + ../qt/widgets/splash_overlay.ui +) + +if(HAVE_PCAP_REMOTE) + list(APPEND WIRESHARK_QT_UI + ../qt/remote_capture_dialog.ui + ../qt/remote_settings_dialog.ui + ) +endif() + +set (LOGRAY_QT_UI + logray_main_window.ui + ${WIRESHARK_QT_UI} +) + +set(WIRESHARK_QT_TS + ../qt/wireshark_de.ts + ../qt/wireshark_en.ts # lupdate -pluralonly + ../qt/wireshark_es.ts + ../qt/wireshark_fr.ts + ../qt/wireshark_it.ts + ../qt/wireshark_ja_JP.ts + ../qt/wireshark_pl.ts + ../qt/wireshark_ru.ts + ../qt/wireshark_sv.ts + ../qt/wireshark_tr_TR.ts + ../qt/wireshark_uk.ts + ../qt/wireshark_zh_CN.ts +) + +set(LOGRAY_QT_TS + logray_en.ts + ${WIRESHARK_QT_TS} +) + +foreach(_file ${LOGRAY_QT_TS}) + get_filename_component(_qresource ${_file} NAME_WE) + set(_qresource_qm "${_qresource}.qm") + set(i18n_qresource "${i18n_qresource}\n <file>${_qresource_qm}</file>") +endforeach() +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/i18n.qrc.in ${CMAKE_CURRENT_BINARY_DIR}/i18n.qrc) + +set(LOGRAY_QT_QRC + ../../resources/about.qrc + ../../resources/languages/languages.qrc + ../../resources/layout.qrc + ../../resources/lricon.qrc + ../../resources/stock_icons.qrc + ${CMAKE_CURRENT_BINARY_DIR}/i18n.qrc +) + +if(NOT Qt${qtver}Widgets_VERSION VERSION_LESS "5.9") + # Drop the file modification time of source files from generated files + # to help with reproducible builds. We do not use QFileInfo.lastModified + # so this has no unwanted side effects. This mtime started appearing in + # Qt 5.8. The option to force the old file format without mtime was + # added in Qt 5.9. See https://bugreports.qt.io/browse/QTBUG-58769. + # Force the compression algorithm to zlib, since zstd requires format + # version 3. See https://gitlab.com/wireshark/wireshark/-/issues/18100. + # Use the number of dashes for each argument as documented at + # https://doc.qt.io/qt-6/rcc.html. + set(CMAKE_AUTORCC_OPTIONS --format-version 1) + if(Qt${qtver}Widgets_VERSION VERSION_GREATER_EQUAL "5.13") + list(APPEND CMAKE_AUTORCC_OPTIONS -compress-algo zlib) + endif() +endif() + +if (USE_qt6) + QT6_ADD_TRANSLATION(LOGRAY_QT_QM ${LOGRAY_QT_TS} OPTIONS -silent) +elseif(NOT Qt${qtver}Widgets_VERSION VERSION_LESS "5.11") + QT5_ADD_TRANSLATION(LOGRAY_QT_QM ${LOGRAY_QT_TS} OPTIONS -silent) +else() + QT5_ADD_TRANSLATION(LOGRAY_QT_QM ${LOGRAY_QT_TS}) +endif() + +add_custom_target( + logray_translations + DEPENDS + ${LOGRAY_QT_QM} +) +set_target_properties(logray_translations PROPERTIES FOLDER "UI") + +set_source_files_properties( + ${LOGRAY_QT_FILES} + PROPERTIES + COMPILE_FLAGS "${WERROR_COMMON_FLAGS}" +) + +set_source_files_properties( + logray-tap-register.c + PROPERTIES + SKIP_AUTOGEN ON +) + +add_definitions(${QT_DEFINITIONS}) + +register_tap_files(logray-tap-register.c + ${LOGRAY_QT_TAP_SRC} +) + +source_group("ui\\UIC Files" FILES ${LOGRAY_QT_UI}) +source_group("ui\\qrc" FILES ${LOGRAY_QT_QRC}) +source_group("ui\\Header" FILES ${LOGRAY_QT_HEADERS}) +source_group("ui\\Widget Header" FILES ${LOGRAY_WIDGET_HEADERS}) +source_group("ui\\Widget Source" FILES ${LOGRAY_WIDGET_SRCS}) +source_group("ui\\Utils Headers Files" FILES ${LOGRAY_UTILS_HEADERS}) +source_group("ui\\Utils Source" FILES ${LOGRAY_UTILS_SRCS}) +source_group("ui\\Models Headers" FILES ${LOGRAY_MODEL_HEADERS}) +source_group("ui\\Models Source" FILES ${LOGRAY_MODEL_SRCS}) +source_group("ui\\Manager Headers" FILES ${LOGRAY_MANAGER_HEADERS}) +source_group("ui\\Manager Source" FILES ${LOGRAY_MANAGER_SRCS}) + +add_library(ui_logray OBJECT + #Included so that Visual Studio can properly put header files in solution + ${LOGRAY_QT_HEADERS} + ${LOGRAY_WIDGET_HEADERS} + ${LOGRAY_3RD_PARTY_WIDGET_HEADERS} + ${LOGRAY_MANAGER_HEADERS} + ${LOGRAY_UTILS_HEADERS} + ${LOGRAY_MODEL_HEADERS} + + ${LOGRAY_QT_SRC} + ${LOGRAY_WIDGET_SRCS} + ${LOGRAY_3RD_PARTY_WIDGET_SRCS} + ${LOGRAY_MANAGER_SRCS} + ${LOGRAY_UTILS_SRCS} + ${LOGRAY_MODEL_SRCS} + + # For AUTOUIC and AUTORCC. + ${LOGRAY_QT_UI} + ${LOGRAY_QT_QRC} + + ${LOGRAY_QT_TAP_SRC} + logray-tap-register.c +) + +target_include_directories(ui_logray + SYSTEM PRIVATE + # Include Qt before anything else, see the comment about + # QT5_INCLUDE_DIRS in the top-level CMakeLists.txt + # Basically, qt@5 headers should be prioritized over qt@6 which + # would be found due to GCRYPT_INCLUDE_DIRS=/usr/local/include + ${QT5_INCLUDE_DIRS} + ${GCRYPT_INCLUDE_DIRS} + ${MINIZIP_INCLUDE_DIRS} + ${PCAP_INCLUDE_DIRS} + ${SPEEXDSP_INCLUDE_DIRS} + ${WINSPARKLE_INCLUDE_DIRS} + PRIVATE + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../qt +) + +if(USE_qt6) + target_link_libraries(ui_logray PUBLIC + Qt6::Widgets + Qt6::Core5Compat + Qt6::Concurrent + Qt6::PrintSupport + ) + if(Qt6Multimedia_FOUND) + target_link_libraries(ui_logray PUBLIC Qt6::Multimedia) + endif() +endif() + +target_compile_definitions(ui_logray + PUBLIC + ${QT5_COMPILE_DEFINITIONS} +) + +set_target_properties(ui_logray PROPERTIES + LINK_FLAGS "${WS_LINK_FLAGS}" + FOLDER "UI" + AUTOMOC ON + AUTOUIC ON + AUTORCC ON + # Ensure .qm files are generated before autogenerating i18n.qrc + AUTOGEN_TARGET_DEPENDS "${LOGRAY_QT_QM}" +) + +if(MSVC) + set_target_properties(ui_logray PROPERTIES LINK_FLAGS_DEBUG "${WS_MSVC_DEBUG_LINK_FLAGS}") +endif() + +CHECKAPI( + NAME + ui-qt-logray + SWITCHES + --nocheck-shadow + SOURCES + # QCustomPlot (LOGRAY_3RD_PARTY_WIDGET_{HEADERS,SRCS}) uses + # prohibited APIs. + ${LOGRAY_QT_HEADERS} + ${LOGRAY_WIDGET_HEADERS} + ${LOGRAY_MANAGER_HEADERS} + ${LOGRAY_UTILS_HEADERS} + ${LOGRAY_MODEL_HEADERS} + + ${LOGRAY_QT_SRC} + ${LOGRAY_WIDGET_SRCS} + ${LOGRAY_MANAGER_SRCS} + ${LOGRAY_UTILS_SRCS} + ${LOGRAY_MODEL_SRCS} + ${LOGRAY_QT_TAP_SRC} +) + +# +# Editor modelines - https://www.wireshark.org/tools/modelines.html +# +# Local variables: +# c-basic-offset: 8 +# tab-width: 8 +# indent-tabs-mode: t +# End: +# +# vi: set shiftwidth=8 tabstop=8 noexpandtab: +# :indentSize=8:tabSize=8:noTabs=false: +# diff --git a/ui/logray/i18n.qrc.in b/ui/logray/i18n.qrc.in new file mode 100644 index 00000000..7260de04 --- /dev/null +++ b/ui/logray/i18n.qrc.in @@ -0,0 +1,4 @@ +<RCC> + <qresource prefix="/i18n">@i18n_qresource@ + </qresource> +</RCC> diff --git a/ui/logray/logray_application.cpp b/ui/logray/logray_application.cpp new file mode 100644 index 00000000..76106c42 --- /dev/null +++ b/ui/logray/logray_application.cpp @@ -0,0 +1,59 @@ +/* logray_application.cpp + * + * Logray - Event log analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "logray_application.h" + +#include "extcap.h" +#include "ui/iface_lists.h" +#include "ui/ws_ui_util.h" + +LograyApplication *lwApp = NULL; + +LograyApplication::LograyApplication(int &argc, char **argv) : + MainApplication(argc, argv) +{ + lwApp = this; + Q_INIT_RESOURCE(lricon); + setApplicationName("Logray"); + setDesktopFileName(QStringLiteral("org.wireshark.Logray")); +} + +LograyApplication::~LograyApplication() +{ + lwApp = NULL; +} + +void LograyApplication::refreshLocalInterfaces() +{ + extcap_clear_interfaces(); + +#ifdef HAVE_LIBPCAP + GList * filter_list = NULL; + filter_list = g_list_append(filter_list, GUINT_TO_POINTER((guint) IF_EXTCAP)); + + scan_local_interfaces_filtered(filter_list, main_window_update); + + g_list_free(filter_list); + + emit localInterfaceListChanged(); +#endif +} + +void LograyApplication::initializeIcons() +{ + // Do this as late as possible in order to allow time for + // MimeDatabaseInitThread to do its work. + QList<int> icon_sizes = QList<int>() << 16 << 24 << 32 << 48 << 64 << 128 << 256 << 512 << 1024; + foreach (int icon_size, icon_sizes) { + QString icon_path = QString(":/lricon/lricon%1.png").arg(icon_size); + normal_icon_.addFile(icon_path); + icon_path = QString(":/lricon/lriconcap%1.png").arg(icon_size); + capture_icon_.addFile(icon_path); + } +} diff --git a/ui/logray/logray_application.h b/ui/logray/logray_application.h new file mode 100644 index 00000000..8aea112b --- /dev/null +++ b/ui/logray/logray_application.h @@ -0,0 +1,33 @@ +/** @file + * + * Logray - Event log analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef LOGRAY_APPLICATION_H +#define LOGRAY_APPLICATION_H + +#include <main_application.h> + +// To do: +// - Remove SequenceDiagram dependency on RTPStreamDialog +// - Remove PacketListModel dependency on WirelessTimeline + +class LograyApplication : public MainApplication +{ +public: + explicit LograyApplication(int &argc, char **argv); + ~LograyApplication(); + + void refreshLocalInterfaces() override; + +private: + void initializeIcons() override; +}; + +extern LograyApplication *lwApp; + +#endif // LOGRAY_APPLICATION_H diff --git a/ui/logray/logray_en.ts b/ui/logray/logray_en.ts new file mode 100644 index 00000000..1b989309 --- /dev/null +++ b/ui/logray/logray_en.ts @@ -0,0 +1,13687 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="en"> +<context> + <name>Abbreviation</name> + <message> + <source></source> + <comment>for "not applicable"</comment> + <translation></translation> + </message> +</context> +<context> + <name>AboutDialog</name> + <message> + <source>About Wireshark</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wireshark</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><span size=\"x-large\" weight=\"bold\">Network Protocol Analyzer</span></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy the version information to the clipboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy To Clipboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Authors</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Search Authors</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Folders</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Filter by path</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Plugins</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No plugins found.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Search Plugins</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Filter by type:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Keyboard Shortcuts</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Search Shortcuts</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Acknowledgments</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>License</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The directory does not exist</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Should the directory %1 be created?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The directory could not be created</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The directory %1 could not be created.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show in Finder</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show in Folder</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>Copy Row(s)</source> + <translation type="unfinished"> + <numerusform>Copy Row</numerusform> + <numerusform>Copy Rows</numerusform> + </translation> + </message> +</context> +<context> + <name>AddressEditorFrame</name> + <message> + <source>Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Name Resolution Preferences…</source> + <oldsource>Name Resolution Preferences...</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Address:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Name:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Can't assign %1 to %2.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>AdvancedPrefsModel</name> + <message> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Status</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Value</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ApplyLineEdit</name> + <message> + <source>Apply changes</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>AuthorListModel</name> + <message> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Email</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>BluetoothAttServerAttributesDialog</name> + <message> + <source>Bluetooth ATT Server Attributes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Handle</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UUID</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UUID Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All Interfaces</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All Devices</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove duplicates</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy Cell</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy Rows</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy All</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save as image</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mark/Unmark Row</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ctrl-M</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mark/Unmark Cell</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Table Image</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>PNG Image (*.png)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>BluetoothDeviceDialog</name> + <message> + <source>Bluetooth Device</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>BD_ADDR</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>OUI</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Class of Device</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LMP Version</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LMP Subversion</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Manufacturer</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>HCI Version</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>HCI Revision</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Scan</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Authentication</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Encryption</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>ACL MTU</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>ACL Total Packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SCO MTU</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SCO Total Packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LE ACL MTU</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LE ACL Total Packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LE ISO MTU</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LE ISO Total Packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Inquiry Mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Page Timeout</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Simple Pairing Mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Voice Setting</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Value</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Changes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1 changes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy Cell</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy Rows</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy All</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save as image</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mark/Unmark Row</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ctrl-M</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mark/Unmark Cell</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bluetooth Device - %1%2</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>enabled</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>disabled</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1 ms (%2 slots)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Table Image</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>PNG Image (*.png)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>BluetoothDevicesDialog</name> + <message> + <source>Bluetooth Devices</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>BD_ADDR</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>OUI</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LMP Version</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LMP Subversion</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Manufacturer</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>HCI Version</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>HCI Revision</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Is Local Adapter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All Interfaces</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show information steps</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1 items; Right click for more option; Double click for device details</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy Cell</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy Rows</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy All</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save as image</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mark/Unmark Row</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ctrl-M</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mark/Unmark Cell</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>true</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Table Image</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>PNG Image (*.png)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>BluetoothHciSummaryDialog</name> + <message> + <source>Bluetooth HCI Summary</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>OGF</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>OCF</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Opcode</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Event</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Subevent</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Status</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reason</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hardware Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Occurrence</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Link Control Commands</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>0x01</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>0</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Link Policy Commands</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>0x02</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Controller & Baseband Commands</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>0x03</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Informational Parameters</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>0x04</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Status Parameters</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>0x05</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Testing Commands</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>0x06</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LE Controller Commands</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>0x08</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bluetooth Logo Testing Commands</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>0x3E</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Vendor-Specific Commands</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>0x3F</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown OGF</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Events</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hardware Errors</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Results filter:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display filter:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All Interfaces</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All Adapters</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy Cell</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy Rows</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy All</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save as image</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mark/Unmark Row</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ctrl+M</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mark/Unmark Cell</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Adapter %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Frame %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Pending</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Table Image</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>PNG Image (*.png)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ByteViewTab</name> + <message> + <source>Packet bytes</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ByteViewText</name> + <message> + <source>Allow hover selection</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show bytes as hexadecimal</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…as bits</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show text based on packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…as ASCII</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…as EBCDIC</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>CaptureFile</name> + <message> + <source> [closing]</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> [closed]</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>CaptureFileDialog</name> + <message> + <source>This capture file contains comments.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The file format you chose doesn't support comments. Do you want to save the capture in a format that supports comments or discard the comments and save in the format you chose?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Discard comments and save</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save in another format</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No file format in which it can be saved supports comments. Do you want to discard the comments and save in the format you chose?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All Files (</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All Capture Files</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Format:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Size:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Start / elapsed:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Automatically detect file type</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>%1, error after %Ln packet(s)</source> + <oldsource>%1, error after %2 packets</oldsource> + <translation type="vanished"> + <numerusform>%1, error after %Ln packet</numerusform> + <numerusform>%1, error after %Ln packets</numerusform> + </translation> + </message> + <message numerus="yes"> + <source>%1, timed out at %Ln packet(s)</source> + <oldsource>%1, timed out at %2 packets</oldsource> + <translation type="vanished"> + <numerusform>%1, timed out at %Ln packet</numerusform> + <numerusform>%1, timed out at %Ln packets</numerusform> + </translation> + </message> + <message numerus="yes"> + <source>%1, %Ln packet(s)</source> + <translation type="vanished"> + <numerusform>%1, %Ln packet</numerusform> + <numerusform>%1, %Ln packets</numerusform> + </translation> + </message> + <message> + <source>Prepend packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Insert packets from the selected file before the current file. Packet timestamps will be ignored.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Merge chronologically</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Insert packets in chronological order.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Append packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Insert packets from the selected file after the current file. Packet timestamps will be ignored.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Read filter:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Compress with g&zip</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open Capture File</source> + <oldsource>Wireshark: Open Capture File</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Capture File As</source> + <oldsource>Wireshark: Save Capture File As</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save as:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Export Specified Packets</source> + <oldsource>Wireshark: Export Specified Packets</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Export as:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Merge Capture File</source> + <oldsource>Wireshark: Merge Capture File</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown file type returned by save as dialog.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Please report this as a Wireshark issue at https://gitlab.com/wireshark/wireshark/-/issues.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>unknown file format</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>error opening file</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>%1, error after %Ln data record(s)</source> + <oldsource>%1, error after %Ln record(s)</oldsource> + <translation type="unfinished"> + <numerusform>%1, error after %Ln data record</numerusform> + <numerusform>%1, error after %Ln data records</numerusform> + </translation> + </message> + <message numerus="yes"> + <source>%1, timed out at %Ln data record(s)</source> + <translation type="unfinished"> + <numerusform>%1, timed out at %Ln data record</numerusform> + <numerusform>%1, timed out at %Ln data records</numerusform> + </translation> + </message> + <message numerus="yes"> + <source>%1, %Ln data record(s)</source> + <translation type="unfinished"> + <numerusform>%1, %Ln data record</numerusform> + <numerusform>%1, %Ln data records</numerusform> + </translation> + </message> + <message> + <source>unknown</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>CaptureFilePropertiesDialog</name> + <message> + <source>Details</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture file comments</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Refresh</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy To Clipboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Comments</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture File Properties</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>File</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Length</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hash (SHA256)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hash (RIPEMD160)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hash (SHA1)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Format</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Encapsulation</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Snapshot length</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Time</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>First packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Last packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Elapsed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Section %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hardware</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>OS</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Application</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Interfaces</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Interface</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Dropped packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Link type</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet size limit (snaplen)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>none</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1 bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Statistics</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Measurement</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Captured</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Displayed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Marked</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Time span, s</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Average pps</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Average packet size, B</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Average bytes/s</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Average bits/s</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Section Comment</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet Comments</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Frame %1: </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Created by Wireshark %1 + +</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>CaptureFilterCombo</name> + <message> + <source>Capture filter selector</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>CaptureFilterEdit</name> + <message> + <source>Capture filter entry</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Manage saved bookmarks.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Apply this filter string to the display.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Multiple filters selected. Override them here or leave this blank to preserve them.</source> + <extracomment>This is a very long concept that needs to fit into a short space.</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>The interfaces you have selected have different capture filters. Typing a filter here will override them. Doing nothing will preserve them.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enter a capture filter %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save this filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove this filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Manage Capture Filters</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>CaptureInfoDialog</name> + <message> + <source>Capture Information</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stop Capture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1 packets, %2:%3:%4</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>CaptureInfoModel</name> + <message> + <source>Other</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>CaptureOptionsDialog</name> + <message> + <source>Input</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Interface</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Traffic</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Link-layer Header</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Promiscuous</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Snaplen (B)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Buffer (MB)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Monitor Mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>You probably want to enable this. Usually a network card will only capture the traffic sent to its own network address. If you want to capture all traffic that the network card can &quot;see&quot;, mark this option. See the FAQ for some more details of capturing packets from a switched network.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enable promiscuous mode on all interfaces</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show and hide interfaces, add comments, and manage pipes and remote interfaces.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Manage Interfaces…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture filter for selected interfaces:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Compile BPFs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Output</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Enter the file name to which captured data will be written. By default, a temporary file will be used.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture to a permanent file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>File:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Browse…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Output format:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>pcapng</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>pcap</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Instead of using a single capture file, multiple files will be created.</p><p>The generated file names will contain an incrementing number and the start time of the capture.</p><p>NOTE: If enabled, at least one of the new-file criteria MUST be selected.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Create a new file automatically…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>after</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch to the next file after the specified number of packets have been captured.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch to the next file after the file size exceeds the specified file size.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>kilobytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>megabytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>gigabytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch to the next file when the time capturing to the current file exceeds the specified time.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>seconds</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>minutes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>hours</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>when time is a multiple of</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch to the next file when the (wall clock) time is an even multiple of the specified interval. +For example, use 1 hour to have a new file created every hour on the hour.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>compression</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>None</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>gzip</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>After capturing has switched to the next file and the given number of files has exceeded, the oldest file will be removed.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Use a ring buffer with </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>files</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Options</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display Options</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Using this option will show the captured packets immediately on the main screen. Please note: this will slow down capturing, so increased packet drops might appear.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Update list of packets in real-time</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>This will scroll the &quot;Packet List&quot; automatically to the latest captured packet, when the &quot;Update list of packets in real-time&quot; option is used.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Automatically scroll during live capture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Show the capture info dialog while capturing.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show capture information during live capture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Name Resolution</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Perform MAC layer name resolution while capturing.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resolve MAC addresses</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Perform network layer name resolution while capturing.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resolve network names</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Perform transport layer name resolution while capturing.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resolve transport names</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stop capture automatically after…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Stop capturing after the specified number of packets have been captured.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stop capturing after the specified number of packets have been captured.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Stop capturing after the specified number of files have been created.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Stop capturing after the specified amount of data has been captured.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stop capturing after the specified amount of data has been captured.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stop capturing after the specified amount of time has passed.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture Options</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Start</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Leave blank to use a temporary file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Specify a Capture File</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1: %2</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Addresses</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>no addresses</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Multiple files: Requested filesize too large. The filesize cannot be greater than 2 GiB.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Multiple files: No capture file name given. You must specify a filename if you want to use multiple files.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Multiple files: No file limit given. You must specify a file size, interval, or number of packets for each file.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>CapturePreferencesFrame</name> + <message> + <source>Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Default interface</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>You probably want to enable this. Usually a network card will only capture the traffic sent to its own network address. If you want to capture all traffic that the network card can &quot;see&quot;, mark this option. See the FAQ for some more details of capturing packets from a switched network.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture packets in promiscuous mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Capture packets in the next-generation capture file format.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture packets in pcapng format</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Update the list of packets while capture is in progress. This can result in dropped packets on high-speed networks.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Update list of packets in real time</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Keep the packet list scrolled to the bottom while capturing.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Automatic scrolling in live capture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Don't load interfaces on startup</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Disable external capture interfaces</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ColoringRulesDelegate</name> + <message> + <source>the "@" symbol will be ignored.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ColoringRulesDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><small><i>A hint.</i></small></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add a new coloring rule.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Delete this coloring rule.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Duplicate this coloring rule.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clear all coloring rules.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Set the foreground color for this rule.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Foreground</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Set the background color for this rule.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Background</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Set the display filter using this rule.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Apply as filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select a file and add its filters to the end of the list.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save filters in a file.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Coloring Rules %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Import…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Export…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy coloring rules from another profile.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Double click to edit. Drag to move. Rules are processed in order until a match is found.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Import Coloring Rules</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Export %1 Coloring Rules</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Your coloring rules file contains unknown rules</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wireshark doesn't recognize one or more of your coloring rules. They have been disabled.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ColoringRulesModel</name> + <message> + <source>New coloring rule</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to save coloring rules: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Filter</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ColumnEditorFrame</name> + <message> + <source>Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Title:</source> + <oldsource>Title</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Type:</source> + <oldsource>Type</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Fields:</source> + <oldsource>Fields</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Occurrence:</source> + <oldsource>Occurrence</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Missing fields.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid fields.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid occurrence value.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ColumnListModel</name> + <message> + <source>Displayed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Title</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Fields</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Field Occurrence</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>New Column</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ColumnPreferencesFrame</name> + <message> + <source>Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add a new column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Delete selected column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show displayed columns only</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset all changes</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>CompiledFilterOutput</name> + <message> + <source>Compiled Filter Output</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy filter text to the clipboard.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ConversationDialog</name> + <message> + <source>Follow Stream…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Follow a TCP or UDP stream.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Graph…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Graph a TCP conversation.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ConversationHashTablesDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Conversation Hash Tables</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>CopyFromProfileButton</name> + <message> + <source>Copy from</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy entries from another profile.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>System default</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DataPrinter</name> + <message> + <source>Copy Bytes as Hex + ASCII Dump</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy packet bytes as a hex and ASCII dump.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…as Hex Dump</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy packet bytes as a hex dump.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…as Printable Text</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy only the printable text in the packet.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…as a Hex Stream</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy packet bytes as a stream of hex.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…as Raw Binary</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy packet bytes as application/octet-stream MIME data.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…as Escaped String</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy packet bytes as an escaped string.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DecodeAsDialog</name> + <message> + <source>Change the dissection behavior for a protocol.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove this dissection behavior.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy this dissection behavior.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clear all dissection behaviors.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Decode As…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open </source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DecodeAsModel</name> + <message> + <source>Match using this field</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Current"Decode As" behavior</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Default "Decode As" behavior</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Change behavior when the protocol field matches this value</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>String</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Integer, base </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>unknown</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><none></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>GUID</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Field</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Value</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Default</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Current</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DisplayFilterCombo</name> + <message> + <source>Display filter selector</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select from previously used filters.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DisplayFilterEdit</name> + <message> + <source>Display filter entry</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Manage saved bookmarks.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display Filter Expression…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Apply a display filter %1 <%2/></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enter a display filter %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clear display filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Apply display filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Left align buttons</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Apply a read filter %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Current filter: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid filter: </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save this filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove this filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Manage Display Filters</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Filter Button Preferences...</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DisplayFilterExpressionDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select a field to start building a display filter.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Field Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Search the list of field names.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Search:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Relations can be used to restrict fields to specific values. Each relation does the following:</p><table border="0" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px;" cellspacing="2" cellpadding="0"><tr><td><p align="center"><span style=" font-weight:600;">is present</span></p></td><td><p>Match any packet that contains this field</p></td></tr><tr><td><p align="center"><span style=" font-weight:600;">==, !=, etc.</span></p></td><td><p>Compare the field to a specific value.</p></td></tr><tr><td><p align="center"><span style=" font-weight:600;">contains, matches</span></p></td><td><p>Check the field against a string (contains) or a regular expression (matches)</p></td></tr><tr><td><p align="center"><span style=" font-weight:600;">in</span></p></td><td><p>Compare the field to a specific set of values</p></td></tr></table></body></html> + +</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Relation</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Match against this value.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Value</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>If the field you have selected has a known set of valid values they will be listed here.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Predefined Values</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>If the field you have selected covers a range of bytes (e.g. you have selected a protocol) you can restrict the match to a range of bytes here.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Range (offset:length)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No display filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><small><i>A hint.</i></small></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display Filter Expression</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select a field name to get started</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Click OK to insert this filter</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DissectorTablesDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Search:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Dissector Tables</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DissectorTablesProxyModel</name> + <message> + <source>Table Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>String</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Dissector</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Integer</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Protocol</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Short Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Table Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Selector Name</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>EnabledProtocolsDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><small><i>Disabling a protocol prevents higher layer protocols from being displayed</i></small></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Search:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>in</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enable All</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Disable All</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invert</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enabled Protocols</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Everywhere</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Only Protocols</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Only Description</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Only enabled protocols</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Only disabled protocols</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>any protocol</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>non-heuristic protocols</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>heuristic protocols</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>EnabledProtocolsModel</name> + <message> + <source>Protocol</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Description</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>EndpointDialog</name> + <message> + <source>Map</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Draw IPv4 or IPv6 endpoints on a map.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open in browser</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save As…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Map file error</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No endpoints available to map</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to create temporary file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Endpoints Map</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Failed to save map file %1.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>EthernetAddressModel</name> + <message> + <source>Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All entries</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hosts</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ethernet Addresses</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ethernet Manufacturers</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ethernet Well-Known Addresses</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ExpertInfoDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><small><i>A hint.</i></small></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Limit to Display Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Group by summary</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Search expert summaries.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Search:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show…</source> + <oldsource>Show...</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show error packets.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show warning packets.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Note</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show note packets.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show chat packets.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show comment packets.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Expert Information</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Collapse All</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Expand All</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture file closed.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No display filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No display filter set.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Limit information to "%1".</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display filter: "%1"</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ExpertInfoProxyModel</name> + <message> + <source>Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Severity</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Summary</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Group</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Protocol</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Count</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ExportDissectionDialog</name> + <message> + <source>Export Packet Dissections</source> + <oldsource>Wireshark: Export Packet Dissections</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Export As:</source> + <oldsource>Export as:</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Plain text (*.txt)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Comma Separated Values - summary (*.csv)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>PSML - summary (*.psml, *.xml)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>PDML - details (*.pdml, *.xml)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>JSON (*.json)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>C Arrays - bytes (*.c, *.h)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ExportObjectDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Content Type:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Searching for objects</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Text Filter:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Only display entries containing this string</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Preview</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All Content-Types</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Export</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1 object list</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Object As…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save All Objects In…</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ExportObjectModel</name> + <message> + <source>Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hostname</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Content Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Filename</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ExportPDUDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display filter:</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ExtArgSelector</name> + <message> + <source>Reload data</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ExtcapArgumentFileSelection</name> + <message> + <source>Clear</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All Files (</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open File</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select File</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ExtcapOptionsDialog</name> + <message> + <source>Interface Options</source> + <oldsource>Extcap Interface Options</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Start</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Default</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Extcap Help cannot be found</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The help for the extcap interface %1 cannot be found. Given file: %2</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save parameter(s) on capture start</source> + <translation type="unfinished">Save parameter on capture start</translation> + </message> +</context> +<context> + <name>FieldFilterEdit</name> + <message> + <source>Display filter entry</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enter a field %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid filter: </source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FileSetDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Directory:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No files in Set</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No capture loaded</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>%Ln File(s) in Set</source> + <oldsource>%1 File%2 in Set</oldsource> + <translation> + <numerusform>%Ln File in Set</numerusform> + <numerusform>%Ln Files in Set</numerusform> + </translation> + </message> +</context> +<context> + <name>FilesetEntryModel</name> + <message> + <source>Open this capture file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Filename</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Created</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Modified</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Size</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FilterAction</name> + <message> + <source>Selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Not Selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…and Selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…or Selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…and not Selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…or not Selected</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FilterDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Create a new filter.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove this filter.</source> + <oldsource>Remove this profile.</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy this filter.</source> + <oldsource>Copy this profile.</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture Filters</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display Filters</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>New capture filter</source> + <extracomment>This text is automatically filled in when a new filter is created</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>New display filter</source> + <extracomment>This text is automatically filled in when a new filter is created</extracomment> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FilterExpressionFrame</name> + <message> + <source>Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Filter Buttons Preferences…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Label:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enter a description for the filter button</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Filter:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enter a filter expression to be applied</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Comment:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enter a comment for the filter button</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Missing label.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Missing filter expression.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid filter expression.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FilterExpressionToolBar</name> + <message> + <source>Filter Button Preferences...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Edit</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Disable</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FilterListModel</name> + <message> + <source>Filter Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Filter Expression</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FindLineEdit</name> + <message> + <source>Textual Find</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Regular Expression Find</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FolderListModel</name> + <message> + <source>"File" dialogs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>capture files</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Temp</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>untitled capture files</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Personal configuration</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Global configuration</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>dfilters, preferences, ethers, …</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>dfilters, preferences, manuf, …</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>System</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>ethers, ipxnets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Program</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>program files</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Personal Plugins</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>binary plugins</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Global Plugins</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Personal Lua Plugins</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>lua scripts</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Global Lua Plugins</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Extcap Plugins search path</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Personal Extcap path</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Global Extcap path</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>MaxMind DB path</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>MaxMind DB database search path</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>MIB/PIB path</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SMI MIB/PIB search path</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>macOS Extras</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Extra macOS packages</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Location</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Typical Files</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FollowStreamDialog</name> + <message> + <source>Filter Out This Stream</source> + <oldsource>Hide this stream</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Print</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>%Ln client pkt(s), </source> + <translation type="vanished"> + <numerusform>%Ln client pkt, </numerusform> + <numerusform>%Ln client pkts, </numerusform> + </translation> + </message> + <message numerus="yes"> + <source>%Ln server pkt(s), </source> + <translation type="vanished"> + <numerusform>%Ln server pkt, </numerusform> + <numerusform>%Ln server pkts, </numerusform> + </translation> + </message> + <message> + <source>ASCII</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>C Arrays</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>EBCDIC</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hex Dump</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UTF-8</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>YAML</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Raw</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save as…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Back</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet %1. </source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>%Ln <span style="color: %1; background-color:%2">client</span> pkt(s), </source> + <translation> + <numerusform>%Ln <span style="color: %1; background-color:%2">client</span> pkt, </numerusform> + <numerusform>%Ln <span style="color: %1; background-color:%2">client</span> pkts, </numerusform> + </translation> + </message> + <message numerus="yes"> + <source>%Ln <span style="color: %1; background-color:%2">server</span> pkt(s), </source> + <translation> + <numerusform>%Ln <span style="color: %1; background-color:%2">server</span> pkt, </numerusform> + <numerusform>%Ln <span style="color: %1; background-color:%2">server</span> pkts, </numerusform> + </translation> + </message> + <message numerus="yes"> + <source>%Ln turn(s).</source> + <translation> + <numerusform>%Ln turn.</numerusform> + <numerusform>%Ln turns.</numerusform> + </translation> + </message> + <message> + <source> Click to select.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Regex Find:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No capture file.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Please make sure you have a capture file opened.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Error following stream.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture file invalid.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Please make sure you have a %1 packet selected.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>QUIC streams not found on the selected packet.</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>%Ln total sub stream(s).</source> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message numerus="yes"> + <source>Total number of QUIC connections: %Ln</source> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message numerus="yes"> + <source>Max QUIC Stream ID for the selected connection: %Ln</source> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <source>No streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Entire conversation (%1)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Follow %1 Stream (%2)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Error creating filter for this stream.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Stream Content As…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>[Stream output truncated]</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>A transport or network layer header is needed.</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>%Ln total stream(s).</source> + <translation type="unfinished"> + <numerusform>%Ln stream.</numerusform> + <numerusform>%Ln total streams.</numerusform> + </translation> + </message> + <message> + <source>File closed.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Follow Stream</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hint.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show data as</source> + <oldsource>Show and save data as</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stream</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Substream</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Find:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Find &Next</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FontColorPreferencesFrame</name> + <message> + <source>Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Main window font:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select Font</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Colors:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>System Default</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Solid</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sample ignored packet text</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sample marked packet text</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sample active selected item</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Style:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Gradient</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sample inactive selected item</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sample "Follow Stream" client text</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sample "Follow Stream" server text</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sample valid filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sample invalid filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sample warning filter</source> + <oldsource>Sample deprecated filter</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Example GIF query packets have jumbo window sizes</source> + <extracomment>These are pangrams. Feel free to replace with nonsense text that spans your alphabet. https://en.wikipedia.org/wiki/Pangram</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Lazy badgers move unique waxy jellyfish packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Font</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FunnelStringDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FunnelTextDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Enter some text or a regular expression. It will be highlighted above.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Highlight:</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GsmMapSummaryDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>GSM MAP Summary</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>File</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Length</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Format</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Snapshot length</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Data</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>First packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Last packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Elapsed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invokes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Total number of Invokes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Average number of Invokes per second</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Total number of bytes for Invokes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Average number of bytes per Invoke</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Return Results</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Total number of Return Results</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Average number of Return Results per second</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Total number of bytes for Return Results</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Average number of bytes per Return Result</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Totals</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Total number of GSM MAP messages</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Average number of GSM MAP messages per second</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Total number of bytes for GSM MAP messages</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Average number of bytes per GSM MAP message</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>IOGraphDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body> + +<h3>Valuable and amazing time-saving keyboard shortcuts</h3> +<table><tbody> + +<tr><th>+</th><td>Zoom in</td></th> +<tr><th>-</th><td>Zoom out</td></th> +<tr><th>x</th><td>Zoom in X axis</td></th> +<tr><th>X</th><td>Zoom out X axis</td></th> +<tr><th>y</th><td>Zoom in Y axis</td></th> +<tr><th>Y</th><td>Zoom out Y axis</td></th> +<tr><th>0</th><td>Reset graph to its initial state</td></th> + +<tr><th>→</th><td>Move right 10 pixels</td></th> +<tr><th>←</th><td>Move left 10 pixels</td></th> +<tr><th>↑</th><td>Move up 10 pixels</td></th> +<tr><th>↓</th><td>Move down 10 pixels</td></th> +<tr><th><i>Shift+</i>→</th><td>Move right 1 pixel</td></th> +<tr><th><i>Shift+</i>←</th><td>Move left 1 pixel</td></th> +<tr><th><i>Shift+</i>↑</th><td>Move up 1 pixel</td></th> +<tr><th><i>Shift+</i>↓</th><td>Move down 1 pixel</td></th> + +<tr><th>g</th><td>Go to packet under cursor</td></th> + +<tr><th>z</th><td>Toggle mouse drag / zoom</td></th> +<tr><th>t</th><td>Toggle capture / session time origin</td></th> +<tr><th>Space</th><td>Toggle crosshairs</td></th> + +</tbody></table> +</body></html></source> + <oldsource><html><head/><body> + +<h3>Valuable and amazing time-saving keyboard shortcuts</h3> +<table><tbody> + +<tr><th>+</th><td>Zoom in</td></th> +<tr><th>-</th><td>Zoom out</td></th> +<tr><th>0</th><td>Reset graph to its initial state</td></th> + +<tr><th>→</th><td>Move right 10 pixels</td></th> +<tr><th>←</th><td>Move left 10 pixels</td></th> +<tr><th>↑</th><td>Move up 10 pixels</td></th> +<tr><th>↓</th><td>Move down 10 pixels</td></th> +<tr><th><i>Shift+</i>→</th><td>Move right 1 pixel</td></th> +<tr><th><i>Shift+</i>←</th><td>Move left 1 pixel</td></th> +<tr><th><i>Shift+</i>↑</th><td>Move up 1 pixel</td></th> +<tr><th><i>Shift+</i>↓</th><td>Move down 1 pixel</td></th> + +<tr><th>g</th><td>Go to packet under cursor</td></th> + +<tr><th>z</th><td>Toggle mouse drag / zoom</td></th> +<tr><th>t</th><td>Toggle capture / session time origin</td></th> +<tr><th>Space</th><td>Toggle crosshairs</td></th> + +</tbody></table> +</body></html></oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove this graph.</source> + <oldsource>Remove this dissection behavior.</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add a new graph.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Duplicate this graph.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clear all graphs.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mouse</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Drag using the mouse button.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>drags</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select using the mouse button.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>zooms</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Interval</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Time of day</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Log scale</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Automatic Update</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset Graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset the graph to its initial state.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>0</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom In</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>+</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom Out</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>-</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Up 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Up</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Left 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Left</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Right 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Right</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Down 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Down</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Up 1 Pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Up</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Left 1 Pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Left</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Right 1 Pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Right</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Down 1 Pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move down 1 Pixel</source> + <oldsource>Move down 1 pixel</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Down</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go To Packet Under Cursor</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to packet currently under the cursor</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>G</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Drag / Zoom</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Toggle mouse drag / zoom behavior</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Z</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture / Session Time Origin</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Toggle capture / session time origin</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>T</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Crosshairs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Toggle crosshairs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Space</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom In X Axis</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>X</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom Out X Axis</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+X</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom In Y Axis</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Y</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom Out Y Axis</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Y</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>1 sec</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>10 sec</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>1 min</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>10 min</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Time (s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>I/O Graphs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save As…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy graphs from another profile.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>1 ms</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>2 ms</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>5 ms</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>10 ms</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>20 ms</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>50 ms</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>100 ms</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>200 ms</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>500 ms</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>2 sec</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>5 sec</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wireshark I/O Graphs: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Filtered packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All Packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>TCP Errors</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hover over the graph for details.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No packets in interval</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Click to select packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1 (%2s%3).</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Release to zoom, x = %1 to %2, y = %3 to %4</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to select range.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Click to select a portion of the graph.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Portable Document Format (*.pdf)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Portable Network Graphics (*.png)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Windows Bitmap (*.bmp)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>JPEG File Interchange Format (*.jpeg *.jpg)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Comma Separated Values (*.csv)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Graph As…</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Iax2AnalysisDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p><span style=" font-size:medium; font-weight:600;">Forward</span></p><p><span style=" font-size:medium; font-weight:600;">Reverse</span></p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Forward</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Delta (ms)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Jitter (ms)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bandwidth</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Status</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Length</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reverse</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Show or hide forward jitter values.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Forward Jitter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Show or hide forward difference values.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Forward Difference</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Show or hide reverse jitter values.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reverse Jitter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Show or hide reverse difference values.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reverse Difference</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><small><i>A hint.</i></small></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Audio</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save the audio data for both channels.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Forward Stream Audio</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save the forward stream audio data.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reverse Stream Audio</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save the reverse stream audio data.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save both tables as CSV.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Forward Stream CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save the forward table as CSV.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reverse Stream CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save the reverse table as CSV.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save the graph image.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select the corresponding packet in the packet list.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>G</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Next Problem Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the next problem packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>N</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>IAX2 Stream Analysis</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to save RTP data.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Please select an IAX2 packet.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> G: Go to packet, N: Next problem packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Portable Document Format (*.pdf)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Portable Network Graphics (*.png)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Windows Bitmap (*.bmp)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>JPEG File Interchange Format (*.jpeg *.jpg)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Graph As…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Can't save in a file: Wrong length of captured packets.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Can't save in a file: File I/O problem.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save forward stream audio</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save reverse stream audio</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save audio</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sun Audio (*.au)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>;;Raw (*.raw)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to save in that format</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to save %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Saving %1…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Analyzing IAX2</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save forward stream CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save reverse stream CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Comma-separated values (*.csv)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ImportTextDialog</name> + <message> + <source>File:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Set name of text file to import</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Browse for text file to import</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Browse…</source> + <oldsource>Browse...</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hex Dump</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Import a standard hex dump as exported by Wireshark</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Offsets in the text file are in octal notation</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Octal</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Offsets:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Offsets in the text file are in hexadecimal notation</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hexadecimal</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Offsets in the text file are in decimal notation</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Decimal</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Regular Expression</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Import a file formatted according to a custom regular expression</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet format regular expression</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Perl compatible regular expression capturing a single packet in the file with named groups identifieing data to import. Anchors ^ and $ also match before/after newlines </p><p>Required is only a data group, also supported are time, dir and seqno.</p><p>Regex flags: DUPNAMES, MULTILINE and NOEMPTY</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>This is regexHintLabel, it will be set to default_regex_hint</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Data encoding:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>How data is encoded</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>encodingRegexExample</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>List of characters indicating incoming packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>iI<</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>List of characters indicating outgoing packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>oO></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Timestamp format:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Whether or not the file contains information indicating the direction (inbound or outbound) of the packet.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Direction indication:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>ExportPDU</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Maximum frame length:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Encapsulation</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The text file has no offset</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>None</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><small><i>recommended regex:</small></i></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The format in which to parse timestamps in the text file (e.g. %H:%M:%S.). Format specifiers are based on strptime(3)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>The format in which to parse timestamps in the text file (e.g. %H:%M:%S.%f).</p><p>Format specifiers are based on strptime(3) with the addition of %f for second fractions. The precision of %f is determined from its length.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%H:%M:%S.%f</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>timestampExampleLabel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Encapsulation Type:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Encapsulation type of the frames in the import capture file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Dissector</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The UDP, TCP or SCTP source port for each frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The SCTP DATA payload protocol identifier for each frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The UDP, TCP or SCTP destination port for each frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Prefix each frame with an Ethernet header</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ethernet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Prefix each frame with an Ethernet, IPv4 and SCTP header</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SCTP</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>PPI:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Protocol (dec):</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Leave frames unchanged</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No dummy header</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Tag:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Prefix each frame with an Ethernet, IPv4 and UDP header</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UDP</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Source port:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The Ethertype value of each frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Prefix each frame with an Ethernet, IPv4 and TCP header</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>TCP</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The SCTP verification tag for each frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Destination port:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ethertype (hex):</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The IPv4 protocol ID for each frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Prefix each frame with an Ethernet, IPv4 and SCTP (DATA) header</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SCTP (Data)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Prefix each frame with an Ethernet and IPv4 header</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>IPv4</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The dissector to use for each frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The maximum size of the frames to write to the import capture file (max 256kiB)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Supported fields are data, dir, time, seqno</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Missing capturing group data (use (?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Import From Hex Dump</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Import</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Import Text File</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>InterfaceFrame</name> + <message> + <source>Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wired</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>AirPCAP</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Pipe</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>STDIN</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bluetooth</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wireless</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Dial-Up</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>USB</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>External Capture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Virtual</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remote interfaces</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show hidden interfaces</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>External capture interfaces disabled.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Local interfaces are unavailable because no packet capture driver is installed.</p><p>You can fix this by installing <a href="https://nmap.org/npcap/">Npcap</a> or <a href="https://www.winpcap.org/install/default.htm">WinPcap</a>.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Local interfaces are unavailable because the packet capture driver isn't loaded.</p><p>You can fix this by running <pre>net start npcap</pre> if you have Npcap installed or <pre>net start npf</pre> if you have WinPcap installed. Both commands must be run as Administrator.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>You don't have permission to capture on local interfaces.</p><p>You can fix this by <a href="file://%1">installing ChmodBPF</a>.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>You don't have permission to capture on local interfaces.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No interfaces found.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Interfaces not loaded (due to preference). Go to Capture </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Start capture</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>InterfaceSortFilterModel</name> + <message> + <source>No interfaces to be displayed. %1 interfaces hidden.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>InterfaceToolbar</name> + <message> + <source>Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select interface</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Interface</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>InterfaceToolbarLineEdit</name> + <message> + <source>Apply changes</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>InterfaceTreeModel</name> + <message> + <source>Show</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Friendly Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Interface Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No interfaces found.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>This version of Wireshark was built without packet capture support.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Local Pipe Path</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Link-Layer Header</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Promiscuous</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Snaplen (B)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Buffer (MB)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Monitor Mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Addresses</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Extcap interface: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No addresses</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No capture filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture filter</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>LBMLBTRMTransportDialog</name> + <message> + <source>LBT-RM Transport Statistics</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sources</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Address/Transport</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Data frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Data bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Data frames/bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Data rate</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RX data frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RX data bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RX data frames/bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RX data rate</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NCF frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NCF count</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NCF bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NCF frames/bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NCF count/bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NCF frames/count</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NCF frames/count/bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NCF rate</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SM frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SM bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SM frames/bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SM rate</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Data</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RX Data</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NCF</source> + <extracomment>Nak ConFirmation</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>SM</source> + <extracomment>Session Message</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>sequence numbers for transport</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>XXXXX:XXX.XXX.XXX.XXX:XXXXX:XXXXXXXX:XXX.XXX.XXX.XXX:XXXXX</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SQN</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Count</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SQN/Reason</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Receivers</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NAK frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NAK count</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NAK bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NAK rate</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NAK sequence numbers for transport</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display filter:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Regenerate statistics using this display filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Apply</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy as CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy the tree as CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy as YAML</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy the tree as YAML</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the data frames column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the data bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the data frames/bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the RX data frames column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the RX data bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the RX data frames/bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NCF frames column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NCF bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NCF count column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the data rate column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the RX data rate column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NCF frames/bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NCF count/bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NCF frames/count column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NCF frames/count/bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NCF rate column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the SM frames column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the SM bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the SM frames/bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the SM rate column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Auto-resize columns to content</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resize columns to content size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LBT-RM Statistics failed to attach to tap</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>LBMLBTRUTransportDialog</name> + <message> + <source>LBT-RU Transport Statistics</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sources</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Address/Transport/Client</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Data frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Data bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Data frames/bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Data rate</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RX data frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RX data bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RX data frames/bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RX data rate</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NCF frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NCF count</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NCF bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NCF frames/count</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NCF frames/bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NCF count/bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NCF frames/count/bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NCF rate</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SM frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SM bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SM frames/bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SM rate</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RST frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RST bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RST frames/bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RST rate</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Data SQN</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RX Data SQN</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NCF SQN</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SM SQN</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RST reason</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>details for transport</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>XXXXX:XXX.XXX.XXX.XXX:XXXXX:XXXXXXXX:XXX.XXX.XXX.XXX:XXXXX</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SQN</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Count</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reason</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SQN/Reason</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Receivers</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Address/Transport</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NAK frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NAK count</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NAK bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NAK frames/count</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NAK count/bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NAK frames/bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NAK frames/count/bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NAK rate</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>ACK frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>ACK bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>ACK frames/bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>ACK rate</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>CREQ frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>CREQ bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>CREQ frames/bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>CREQ rate</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NAK SQN</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>ACK SQN</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>CREQ request</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display filter:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Regenerate statistics using this display filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Apply</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy as CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy the tree as CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy as YAML</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy the tree as YAML</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the data frames column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the data bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the data frames/bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the data rate column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the RX data frames column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the RX data bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the RX data frames/bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the RX data rate column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NCF frames column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NCF count column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NCF bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NCF frames/bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NCF count/bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NCF frames/count column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NCF frames/count/bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the SM frames column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the SM bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the SM frames/bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the SM rate column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the RST frames column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the RST bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the RST frames/bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the RST rate column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NAK frames column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NAK count column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NAK bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NAK frames/count column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NAK count/bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NAK frames/bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NAK frames/count/bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NAK rate column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the ACK frames column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the ACK bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the ACK frames/bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the ACK rate column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the CREQ frames column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the CREQ bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the CREQ frames/bytes column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the CREQ rate column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Auto-resize columns to content</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resize columns to content size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the NCF rate column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LBT-RU Statistics failed to attach to tap</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>LBMStreamDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stream</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Endpoint A</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Endpoint B</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Messages</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>First Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Last Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display filter:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Regenerate statistics using this display filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Apply</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy as CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy the tree as CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy as YAML</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy the tree as YAML</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LBM Stream failed to attach to tap</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>LBMUIMFlowDialog</name> + <message numerus="yes"> + <source>%Ln node(s)</source> + <translation type="obsolete"> + <numerusform>%Ln node</numerusform> + <numerusform>%Ln nodes</numerusform> + </translation> + </message> + <message numerus="yes"> + <source>%Ln item(s)</source> + <translation type="obsolete"> + <numerusform>%Ln item</numerusform> + <numerusform>%Ln items</numerusform> + </translation> + </message> +</context> +<context> + <name>LayoutPreferencesFrame</name> + <message> + <source>Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Pane 1:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet List</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet Details</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet Bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet Diagram</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>None</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Pane 2:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Pane 3:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet List settings:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show packet separator</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show column definition in column context menu</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enable mouse-over colorization</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Status Bar settings:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show selected packet number</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show file load time</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>LteMacStatisticsDialog</name> + <message> + <source>LTE Mac Statistics</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Include SR frames in filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Include RACH frames in filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>MAC Statistics</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>LteRlcGraphDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body> + +<h3>Valuable and amazing time-saving keyboard shortcuts</h3> +<table><tbody> + +<tr><th>+</th><td>Zoom in</td></th> +<tr><th>-</th><td>Zoom out</td></th> +<tr><th>0</th><td>Reset graph to its initial state</td></th> + +<tr><th>→</th><td>Move right 10 pixels</td></th> +<tr><th>←</th><td>Move left 10 pixels</td></th> +<tr><th>↑</th><td>Move up 10 pixels</td></th> +<tr><th>↓</th><td>Move down 10 pixels</td></th> +<tr><th><i>Shift+</i>→</th><td>Move right 1 pixel</td></th> +<tr><th><i>Shift+</i>←</th><td>Move left 1 pixel</td></th> +<tr><th><i>Shift+</i>↑</th><td>Move up 1 pixel</td></th> +<tr><th><i>Shift+</i>↓</th><td>Move down 1 pixel</td></th> + +<tr><th>g</th><td>Go to packet under cursor</td></th> + +<tr><th>z</th><td>Toggle mouse drag / zoom</td></th> +<tr><th>t</th><td>Toggle capture / session time origin</td></th> +<tr><th>Space</th><td>Toggle crosshairs</td></th> + +</tbody></table> +</body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mouse</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Drag using the mouse button.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>drags</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select using the mouse button.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>zooms</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Reset the graph to its initial state.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Switch the direction of the connection (view the opposite flow).</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch Direction</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset Graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset the graph to its initial state.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>0</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom In</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>+</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom Out</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>-</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Up 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Up</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Left 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Left</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Right 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Right</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Down 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Down</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Up 1 Pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Up</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Left 1 Pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Left</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Right 1 Pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Right</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Down 1 Pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move down 1 Pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Down</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Drag / Zoom</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Toggle mouse drag / zoom behavior</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Z</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Crosshairs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Toggle crosshairs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Space</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Up 100 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>PgUp</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>PgDown</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go To Packet Under Cursor</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to packet currently under the cursor</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>G</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom In X Axis</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>X</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom Out Y Axis</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Y</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom In Y Axis</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Y</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom Out X Axis</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+X</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch direction (swap between UL and DL)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>D</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Time</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sequence Number</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LTE RLC Graph (UE=%1 chan=%2%3 %4 - %5)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LTE RLC Graph - no channel selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save As…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1 %2 (%3s seq %4 len %5)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Click to select packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Release to zoom, x = %1 to %2, y = %3 to %4</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to select range.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Click to select a portion of the graph.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Portable Document Format (*.pdf)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Portable Network Graphics (*.png)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Windows Bitmap (*.bmp)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>JPEG File Interchange Format (*.jpeg *.jpg)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Graph As…</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>LteRlcStatisticsDialog</name> + <message> + <source>LTE RLC Statistics</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Include SR frames in filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Include RACH frames in filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Use RLC frames only from MAC frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UL Frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UL Bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UL MB/s</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UL ACKs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UL NACKs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UL Missing</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>DL Frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>DL Bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>DL MB/s</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>DL ACKs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>DL NACKs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>DL Missing</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RLC Statistics</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>MainStatusBar</name> + <message> + <source>Ready to load or capture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ready to load file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open the Capture File Properties dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Profile: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Manage Profiles…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>New…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Edit…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Import</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>from zip file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>from directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Export</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Delete</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch to</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> is the highest expert information level</source> + <oldsource> is the highest expert info level</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>ERROR</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>WARNING</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NOTE</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>CHAT</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No expert information</source> + <oldsource>No expert info</oldsource> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>%Ln byte(s)</source> + <oldsource>, %1 bytes</oldsource> + <translation> + <numerusform>%Ln byte</numerusform> + <numerusform>%Ln bytes</numerusform> + </translation> + </message> + <message> + <source>Byte %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bytes %1-%2</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Selected Packet: %1 %2 </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packets: %1 %4 Displayed: %2 (%3%)</source> + <oldsource>Packets: %1 %4 Displayed: %2 %4 Marked: %3</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source> %1 Selected: %2 (%3%)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> %1 Marked: %2 (%3%)</source> + <oldsource> %1 Dropped: %2</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source> %1 Dropped: %2 (%3%)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> %1 Ignored: %2 (%3%)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> %1 Comments: %2</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> %1 Load time: %2:%3.%4</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No Packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>selected personal profile</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>all personal profiles</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packets: %1</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>MainWelcome</name> + <message numerus="yes"> + <source>%n interface(s) shown, %1 hidden</source> + <oldsource>%Ln interface(s) shown</oldsource> + <translation type="obsolete"> + <numerusform>%n interface shown, %1 hidden</numerusform> + <numerusform>%n interfaces shown, %1 hidden</numerusform> + </translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <source>Wireshark</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>File Set</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Export Packet Dissections</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Export Objects</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Zoom</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Time Display Format</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Manual pages</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Apply as Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Prepare as Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>900000000</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&File</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Capture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Help</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Go</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&View</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Analyze</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Follow</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Statistics</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Topics</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Queues</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UIM</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Telephon&y</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RTSP</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Edit</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet Comments</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Main Toolbar</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display Filter Toolbar</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open a capture file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Quit Wireshark</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Start</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Start capturing packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>S&top</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stop capturing packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No files found</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Contents</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wireshark Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>TShark</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Rawshark</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Dumpcap</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mergecap</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Editcap</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Text2pcap</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Website</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Downloads</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wiki</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sample Captures</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&About Wireshark</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ask (Q&&A)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Next Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the next packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Previous Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the previous packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>First Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the first packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Last Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the last packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>E&xpand Subtrees</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Expand the current packet detail</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Expand All</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Expand packet details</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Collapse &All</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Collapse all packet details</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to specified packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Merge one or more files</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Import a file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Save</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save as a different file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Export specified packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>List Files</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Next File</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Previous File</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Reload</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Options</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture options</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture filters</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Refresh Interfaces</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Refresh interfaces</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Restart</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Restart current capture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>As &CSV…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>As "C" &Arrays…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>As P&SML XML…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>As P&DML XML…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>As &JSON…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Description</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Field Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Value</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>As Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Close this capture file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Interface Toolbars</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Colorize Conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Internals</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Additional Toolbars</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Conversation Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Osmux</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Tools</source> + <oldsource>Tools</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wireless Toolbar</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Help contents</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>FAQs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Next Packet in Conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the next packet in this conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Previous Packet in Conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the previous packet in this conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Next Packet In History</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the next packet in your selection history</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Previous Packet In History</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the previous packet in your selection history</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Collapse Subtrees</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Collapse the current packet detail</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to Packet…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Merge…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Import from Hex Dump…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save this capture file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save &As…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Export Specified Packets…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Export Packet &Bytes…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Print…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reload this file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reload as File Format/Capture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy this item's description</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy this item's field name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy this item's value</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy this item as a display filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Apply as Column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Create a packet list column from the selected field.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Find a packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Find the next packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Find the previous packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Mark/Unmark Packet(s)</source> + <oldsource>&Mark/Unmark Packet</oldsource> + <translation type="unfinished">&Mark/Unmark Packet</translation> + </message> + <message> + <source>Mark All Displayed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mark all displayed packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unmark all displayed packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Next Mark</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the next marked packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Previous Mark</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the previous marked packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Ignore/Unignore Packet(s)</source> + <oldsource>&Ignore/Unignore Packet</oldsource> + <translation type="unfinished">&Ignore/Unignore Packet</translation> + </message> + <message> + <source>Ignore All Displayed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ignore all displayed packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Set/Unset Time Reference</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Set or unset a time reference for this packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unset All Time References</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove all time references</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Next Time Reference</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the next time reference</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Previous Time Reference</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the previous time reference</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift or change packet timestamps</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Delete All Packet Comments</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove all packet comments in the capture file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Configuration Profiles…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Configuration profiles</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Manage your configuration profiles</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Manage Wireshark's preferences</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture File Properties</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture file properties</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Protocol Hierarchy</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show a summary of protocols present in the capture file.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capinfos</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reordercap</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Time Sequence (Stevens)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>TCP time sequence graph (Stevens)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Throughput</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Round Trip Time</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>TCP round trip time</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Window Scaling</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Time Sequence (tcptrace)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>TCP time sequence graph (tcptrace)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Analyse this Association</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show All Associations</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Flow Graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Flow sequence diagram</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packets sorted by Instance ID</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packets sorted by IP</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packets sorted by object type</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packets sorted by service</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet Counter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Requests</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Load Distribution</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet Lengths</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet length statistics</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reload Lua Plugins</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reload Lua plugins</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Advertisements by Topic</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Advertisements by Source</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Advertisements by Transport</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Queries by Topic</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Queries by Receiver</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wildcard Queries by Pattern</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wildcard Queries by Receiver</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Advertisements by Queue</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Queries by Queue</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LBT-RM</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LBT-RU</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Filter this Association</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&I/O Graphs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Conversations</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Endpoints</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shrink the main window text</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Return the main window text to its normal size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset Layout</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset appearance layout to default size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet &Diagram</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show or hide the packet diagram</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show each conversation hash table</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show each dissector table and its entries</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the currently supported protocols and display filter fields</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>MAC Statistics</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LTE MAC statistics</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RLC Statistics</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LTE RLC statistics</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LTE RLC graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>MTP3 Summary</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>MTP3 summary statistics</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bluetooth Devices</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bluetooth HCI Summary</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display Filter &Expression…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display Filter Expression…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No GSM statistics registered</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No LTE statistics registered</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No MTP3 statistics registered</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>IAX2 Stream Analysis</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show Packet Bytes…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to &Linked Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add a display filter button.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Full Screen</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Options…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Wireless</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture &Filters…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>As Plain &Text…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>As Plain &Text</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>As &CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>As &YAML</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All Visible Items</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All Visible Selected Tree Items</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display Filter &Macros…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Find Packet…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Find Ne&xt</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Find Pre&vious</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mark or unmark each selected packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ignore or unignore each selected packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>U&nignore All Displayed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unignore all displayed packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Time Shift…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Preferences…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>TCP throughput</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>TCP Stream</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UDP Stream</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Request Sequences</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Decode &As…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Export PDUs to File…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Create graphs based on display filter fields</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Main Toolbar</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show or hide the main toolbar</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Filter Toolbar</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show or hide the display filter toolbar</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Conversations at different protocol levels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Endpoints at different protocol levels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Colorize Packet List</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Draw packets using your coloring rules</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Zoom In</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enlarge the main window text</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom Out</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Normal Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resize Columns</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resize packet list columns to fit contents</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Date and Time of Day (1970-01-01 01:02:03.123456)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show packet times as the date and time of day.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Year, Day of Year, and Time of Day (1970/001 01:02:03.123456)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show packet times as the year, day of the year and time of day.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Time of Day (01:02:03.123456)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Seconds Since 1970-01-01</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show packet times as the seconds since the UNIX / POSIX epoch (1970-01-01).</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Seconds Since Beginning of Capture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Seconds Since Previous Captured Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show packet times as the seconds since the previous captured packet.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Seconds Since Previous Displayed Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show packet times as the seconds since the previous displayed packet.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UTC Date and Time of Day (1970-01-01 01:02:03.123456)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show packet times as the UTC date and time of day.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UTC Year, Day of Year, and Time of Day (1970/001 01:02:03.123456)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show packet times as the UTC year, day of the year and time of day.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UTC Time of Day (01:02:03.123456)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show packet times as the UTC time of day.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Automatic (from capture file)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Use the time precision indicated in the capture file.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Seconds</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Tenths of a second</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hundredths of a second</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Milliseconds</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Microseconds</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Nanoseconds</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display Seconds With Hours and Minutes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display seconds with hours and minutes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resolve &Physical Addresses</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show names for known MAC addresses. Lookups use a local database.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resolve &Network Addresses</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show names for known IPv4, IPv6, and IPX addresses. Lookups can generate network traffic.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resolve &Transport Addresses</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show names for known TCP, UDP, and SCTP services. Lookups can generate traffic on some systems.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wire&less Toolbar</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show or hide the wireless toolbar</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Status Bar</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show or hide the status bar</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet &List</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show or hide the packet list</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet &Details</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show or hide the packet details</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet &Bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show or hide the packet bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Conversation Hash Tables</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Dissector Tables</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Supported Protocols</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>MAP Summary</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>GSM MAP summary statistics</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RLC &Graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Coloring Rules…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show Linked Packet in New Window</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>New Coloring Rule…</source> + <oldsource>New Conversation Rule…</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>RTP Stream Analysis for selected stream. Press CTRL key for adding reverse stream too.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RTP Player</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Play selected stream. Press CTRL key for playing reverse stream too.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>IA&X2 Stream Analysis</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enabled Protocols…</source> + <oldsource>Enable Protocols…</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wiki Protocol Page</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open the Wireshark wiki page for this protocol.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Filter Field Reference</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open the display filter reference page for this filter field.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the packet referenced by the selected field.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&VoIP Calls</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open &Recent</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Name Resol&ution</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Service &Response Time</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&RTP</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>S&CTP</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&ANSI</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&GSM</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&LTE</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&MTP3</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Open</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Quit</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display &Filters…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Unmark All Displayed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All VoIP Calls</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SIP &Flows</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SIP Flows</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RTP Streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Edit the packet list coloring rules.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bluetooth ATT Server Attributes</source> + <oldsource>ATT Server Attributes</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show Packet in New &Window</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show this packet in a separate window.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the linked packet in a separate window.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Auto Scroll in Li&ve Capture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Automatically scroll to the last packet during a live capture.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Expert Information</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show expert notifications</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add an expression to the display filter.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>REGISTER_STAT_GROUP_UNSORTED</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Start of "REGISTER_STAT_GROUP_UNSORTED"</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No ANSI statistics registered</source> + <oldsource>No tools registered</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resolved Addresses</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show each table of resolved addresses as copyable text.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Color &1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mark the current conversation with its own color.</source> + <oldsource>Mark the current coversation with its own color.</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Color &2</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Color &3</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Color &4</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Color &5</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Color &6</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Color &7</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Color &8</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Color &9</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Color 1&0</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Create a new coloring rule based on this field.</source> + <oldsource>Create a new coloring rule based on this conversation.</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset Colorization</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset colorized conversations.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RTP Stream Analysis</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Edit Resolved Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Manually edit a name resolution entry.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enable and disable specific protocols</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> before quitting</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save packets before merging?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>A temporary capture file can't be merged.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save changes in "%1" before merging?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Changes must be saved before the files can be merged.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid Display Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid Read Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The filter expression %1 isn't a valid read filter. (%2).</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> before importing a capture</source> + <oldsource> before importing a new capture</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to export to "%1".</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>You cannot export packets to the current capture file.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Do you want to save the changes you've made%1?</source> + <oldsource>Do you want to save the captured packets</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Your captured packets will be lost if you don't save them.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Do you want to save the changes you've made to the capture file "%1"%2?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Your changes will be lost if you don't save them.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Check for Updates…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to drop files during capture.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown file type returned by merge dialog.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Please report this as a Wireshark issue at https://gitlab.com/wireshark/wireshark/-/issues.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown file type returned by export dialog.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Do you want to stop the capture and save the captured packets%1?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Do you want to save the captured packets%1?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save before Continue</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stop and Save</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stop and Quit &without Saving</source> + <oldsource>Stop and Quit without Saving</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Quit &without Saving</source> + <oldsource>Quit without Saving</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>There is no "rtp.ssrc" field in this version of Wireshark.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Please select an RTPv2 packet with an SSRC value</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SSRC value not found.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show or hide the toolbar</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Continue &without Saving</source> + <oldsource>Continue without Saving</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stop and Continue &without Saving</source> + <oldsource>Stop and Continue without Saving</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>The Wireshark Network Analyzer</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capturing from %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> before opening another file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Merging files.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1: %2</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clear Menu</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> before closing the file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Export Selected Packet Bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No Keys</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>Export SSL Session Keys (%Ln key(s))</source> + <oldsource>Export SSL Session Keys (%1 key%2</oldsource> + <translation type="vanished"> + <numerusform>Export SSL Session Keys (%Ln key)</numerusform> + <numerusform>Export SSL Session Keys (%Ln keys)</numerusform> + </translation> + </message> + <message> + <source>Raw data (*.bin *.dat *.raw);;All Files (</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Couldn't copy text. Try another item.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Are you sure you want to remove all packet comments?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to build conversation filter.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> before reloading the file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Error compiling filter for this conversation.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No previous/next packet in conversation.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No interface selected.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Saving %1…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid capture filter.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>(empty comment)</source> + <comment>placeholder for empty comment</comment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add New Comment…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Edit "%1"</source> + <comment>edit packet comment</comment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Delete "%1"</source> + <comment>delete packet comment</comment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Delete packet comments</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>Delete comments from %n packet(s)</source> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <source> before starting a new capture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> before reloading Lua plugins</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Please wait while Wireshark is initializing…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No filter available. Try another %1.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>item</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The "%1" column already exists.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The "%1" column already exists as "%2".</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RTP packet search failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No Interface Selected.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> before restarting the capture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wiki Page for %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>The Wireshark Wiki is maintained by the community.</p><p>The page you are about to load might be wonderful, incomplete, wrong, or nonexistent.</p><p>Proceed to the wiki?</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Loading</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reloading</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Rescanning</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>MainWindowPreferencesFrame</name> + <message> + <source>Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Checking this will save the size, position, and maximized state of the main window.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remember main window size and placement</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open files in</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>This folder:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Browse…</source> + <oldsource>Browse...</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>The most recently used folder</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show up to</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>filter entries</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>recent files</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Confirm unsaved capture files</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display autocompletion for filter text</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Main toolbar style:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Icons only</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Text only</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Icons & Text</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Window title</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Custom window title to be appended to the existing title<br/>%F = file path of the capture file<br/>%P = profile name<br/>%S = a conditional separator (&quot; - &quot;) that only shows when surrounded by variables with values or static text<br/>%V = version info</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Prepend window title</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Custom window title to be prepended to the existing title<br/>%F = file path of the capture file<br/>%P = profile name<br/>%S = a conditional separator (&quot; - &quot;) that only shows when surrounded by variables with values or static text<br/>%V = version info</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Language: </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Use system setting</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open Files In</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ManageInterfacesDialog</name> + <message> + <source>Manage Interfaces</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Click the checkbox to hide or show a hidden interface.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Local Interfaces</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Add a pipe to capture from or remove an existing pipe from the list.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Pipes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Add a new pipe using default settings.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Remove the selected pipe from the list.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remote Interfaces</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Host / Device URL</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Add a remote host and its interfaces</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Remove the selected host from the list.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remote Settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><small><i></i></small></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>This version of Wireshark does not save pipe settings.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>This version of Wireshark does not save remote settings.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>This version of Wireshark does not support remote interfaces.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>New Pipe</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ModulePreferencesScrollArea</name> + <message> + <source>ScrollArea</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Mtp3SummaryDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>MTP3 Summary</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>File</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Length</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Format</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Snapshot length</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Data</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>First packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Last packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Elapsed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Service Indicator (SI) Totals</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SI</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>MSUs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>MSUs/s</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bytes/MSU</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bytes/s</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Totals</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Total MSUs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Total Bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Average Bytes/MSU</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Average Bytes/s</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PacketCommentDialog</name> + <message> + <source>Edit Packet Comment</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add Packet Comment</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PacketDiagram</name> + <message> + <source>Packet diagram</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show Field Values</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Diagram As…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy as Raster Image</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…as SVG</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Portable Network Graphics (*.png)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Windows Bitmap (*.bmp)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>JPEG File Interchange Format (*.jpeg *.jpg)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Scalable Vector Graphics (*.svg)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Graph As…</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PacketDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><small><i></i></small></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>[%1 closed] </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Byte %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bytes %1-%2</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PacketFormatGroupBox</name> + <message> + <source>GroupBox</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet Format</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Packet summary lines similar to the packet list</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Summary line</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Include column headings</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Packet details similar to the protocol tree</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Details:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Export only top-level packet detail items</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All co&llapsed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Expand and collapse packet details as they are currently displayed.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>As displa&yed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Export all packet detail items</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All e&xpanded</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Export a hexdump of the packet data similar to the packet bytes view</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bytes</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PacketList</name> + <message> + <source>Protocol Preferences</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Summary as Text</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…as CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…as YAML</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Decode As…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Frame %1: %2 + +</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>[ Comment text exceeds %1. Stopping. ]</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PacketListHeader</name> + <message> + <source>Align Left</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Align Center</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Align Right</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Edit Column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resize to Contents</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Column Preferences…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resize Column to Width…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resolve Names</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove this Column</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Column %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Width:</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PacketListModel</name> + <message> + <source>Sorting "%1"…</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PacketRangeGroupBox</name> + <message> + <source>Form</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet Range</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>-</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Displayed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Marked packets only</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Range:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove &ignored packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>First &to last marked</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&All packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Selected packets only</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Captured</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PathChooserDelegate</name> + <message> + <source>Browse</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open Pipe</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PluginListModel</name> + <message> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Version</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Path</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PortsModel</name> + <message> + <source>All entries</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Port</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Type</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PreferenceEditorFrame</name> + <message> + <source>Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>a preference</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Browse…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open %1 preferences…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid value.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PreferencesDialog</name> + <message> + <source>Search:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Preferences</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PrefsModel</name> + <message> + <source>Advanced</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Appearance</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Layout</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Columns</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Font and Colors</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Expert</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Filter Buttons</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RSA Keys</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PrintDialog</name> + <message> + <source>Packet Format</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Print each packet on a new page</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Print capture file information on each page</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture information header</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Use the &quot;+&quot; and &quot;-&quot; keys to zoom the preview in and out. Use the &quot;0&quot; key to reset the zoom level.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p><span style=" font-size:small; font-style:italic;">+ and - zoom, 0 resets</span></p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet Range</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Print</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Print…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Page &Setup…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1 %2 total packets, %3 shown</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Print Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to print to %1.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ProfileDialog</name> + <message> + <source>Search for profile …</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Create a new profile using default settings.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Remove this profile. System provided profiles cannot be removed. The default profile will be reset upon deletion.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy this profile.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Configuration Profiles</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Import</source> + <comment>noun</comment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Export</source> + <comment>noun</comment> + <translation type="unfinished"></translation> + </message> + <message> + <source>New profile</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Profile Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Exporting profiles</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No profiles found for export</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select zip file for export</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>… %Ln selected personal profile(s)</source> + <translation type="vanished"> + <numerusform>… %Ln selected personal profile</numerusform> + <numerusform>… %Ln selected personal profiles</numerusform> + </translation> + </message> + <message numerus="yes"> + <source>%Ln selected personal profile(s)</source> + <translation> + <numerusform>%Ln selected personal profile</numerusform> + <numerusform>%Ln selected personal profiles</numerusform> + </translation> + </message> + <message> + <source>An import of profiles is not allowed, while changes are pending</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>An import is pending to be saved. Additional imports are not allowed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>An export of profiles is only allowed for personal profiles</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>An export of profiles is not allowed, while changes are pending</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>%Ln profile(s) exported</source> + <translation> + <numerusform>%Ln profile exported</numerusform> + <numerusform>%Ln profiles exported</numerusform> + </translation> + </message> + <message> + <source>Select zip file for import</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select directory for import</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zip File (*.zip)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>from zip file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>from directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>all personal profiles</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>An error has occurred while exporting profiles</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No profiles found for import in %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>%Ln profile(s) imported</source> + <translation> + <numerusform>%Ln profile imported</numerusform> + <numerusform>%Ln profiles imported</numerusform> + </translation> + </message> + <message numerus="yes"> + <source>, %Ln profile(s) skipped</source> + <translation> + <numerusform>, %Ln profile skipped</numerusform> + <numerusform>, %Ln profiles skipped</numerusform> + </translation> + </message> + <message> + <source>Importing profiles</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>%Ln profile(s) selected</source> + <translation type="obsolete"> + <numerusform>%Ln profile selected</numerusform> + <numerusform>%Ln profiles selected</numerusform> + </translation> + </message> +</context> +<context> + <name>ProfileModel</name> + <message> + <source>Resetting to default</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Imported profile</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>This is a system provided profile</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>A profile change for this name is pending</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> (See: %1)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>This is an invalid profile definition</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>A profile already exists with this name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>A profile with this name is being deleted</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Created from default settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>system provided</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>deleted</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>copy</source> + <comment>noun</comment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Exporting profiles while changes are pending is not allowed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No profiles found to export</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Can't delete profile directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>A profile name cannot contain the following characters: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>A profile name cannot contain the '/' character</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>A profile cannot start or end with a period (.)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Default</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Global</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Personal</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Renamed from: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copied from: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>renamed to %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Profile</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Type</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ProfileSortModel</name> + <message> + <source>All profiles</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Personal profiles</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Global profiles</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ProgressFrame</name> + <message> + <source>Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Loading</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ProtoTree</name> + <message> + <source>Packet details</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Not a field or protocol</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No field reference available for text labels.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Expand Subtrees</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Collapse Subtrees</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Expand All</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Collapse All</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All Visible Items</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All Visible Selected Tree Items</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Description</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Field Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Value</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>As Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wiki Protocol Page</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Filter Field Reference</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copied </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wiki Page for %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>The Wireshark Wiki is maintained by the community.</p><p>The page you are about to load might be wonderful, incomplete, wrong, or nonexistent.</p><p>Proceed to the wiki?</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Colorize with Filter</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ProtocolHierarchyDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Protocol</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Percent Packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Percent Bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bits/s</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>End Packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>End Bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>End Bits/s</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><small><i>A hint.</i></small></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy as CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy stream list as CSV.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy as YAML</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy stream list as YAML.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Protocol Hierarchy Statistics</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>as CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>as YAML</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No display filter.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display filter: %1</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ProtocolPreferencesMenu</name> + <message> + <source>Protocol Preferences</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No protocol preferences available</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Disable %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1 has no preferences</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open %1 preferences…</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>Average Throughput (bits/s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Round Trip Time (ms)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Segment Length (B)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sequence Number (B)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Time (s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Window Size (B)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>[no capture file]</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bars show the relative timeline for each conversation.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Endpoint</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Apply as Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Prepare as Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Find</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Colorize</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Look Up</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UNKNOWN</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Not Selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…and Selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…or Selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…and not Selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…or not Selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>A </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>B </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Any </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Don't show this message again.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Multiple problems found</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1 (%L2%)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No entries.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1 entries.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Base station</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><Broadcast></source> + <translation type="unfinished"></translation> + </message> + <message> + <source><Hidden></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>BSSID</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Beacons</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Data Pkts</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Protection</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Pkts Sent</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Pkts Received</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wrong sequence number</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Payload changed to PT=%1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Incorrect timestamp</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Marker missing?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>C-RNTI</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SPS-RNTI</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RNTI</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UEId</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UL Frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UL Bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UL MB/s</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UL Padding %</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UL Re TX</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>DL Frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>DL Bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>DL MB/s</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>DL Padding %</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>DL CRC Failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>DL ReTX</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LCID 1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LCID 2</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LCID 3</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LCID 4</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LCID 5</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LCID 6</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LCID 7</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LCID 8</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LCID 9</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LCID 10</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LCID 32</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LCID 33</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LCID 34</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LCID 35</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LCID 36</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LCID 37</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>LCID 38</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>TM</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UM</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>AM</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Predef</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown (%1)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>CCCH</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SRB-%1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>DRB-%1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UE Id</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Priority</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>default</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>DLT %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid Display Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The filter expression %1 isn't a valid display filter. (%2).</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No remote interfaces found.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>PCAP not found</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Default</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Changed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Has this preference been changed?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Default value is empty</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Gap in dissection</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Edit…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Browse…</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QObject::QObject</name> + <message> + <source>CCCH</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>RemoteCaptureDialog</name> + <message> + <source>Remote Interface</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Host:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Port:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Authentication</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Null authentication</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Password authentication</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Username:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Password:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clear list</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No remote interfaces found.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>PCAP not found</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>RemoteSettingsDialog</name> + <message> + <source>Remote Capture Settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture Options</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Do not capture own RPCAP traffic</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Use UDP for data transfer</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sampling Options</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>None</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>1 of</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>1 every </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>milliseconds</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ResolvedAddressesDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hosts</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Search for entry (min 3 characters)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ports</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Search for port or name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture File Comments</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the comment.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>IPv4 Hash Table</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the IPv4 hash table entries.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>IPv6 Hash Table</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show the IPv6 hash table entries.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show All</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show all address types.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hide All</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hide all address types.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>IPv4 and IPv6 Addresses (hosts)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show resolved IPv4 and IPv6 host names in "hosts" format.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Port names (services)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show resolved port names in "services" format.</source> + <oldsource>Show resolved port names names in "servies" format.</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ethernet Addresses</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show resolved Ethernet addresses in "ethers" format.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ethernet Well-Known Addresses</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show well-known Ethernet addresses in "ethers" format.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ethernet Manufacturers</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show Ethernet manufacturers in "ethers" format.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>[no file]</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resolved Addresses</source> + <translation type="unfinished"></translation> + </message> + <message> + <source># Resolved addresses found in %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source># Comments +# +# </source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ResponseTimeDelayDialog</name> + <message> + <source>%1 Response Time Delay Statistics</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Messages</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Min SRT</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Max SRT</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Avg SRT</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Min in Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Max in Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open Requests</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Discarded Responses</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Repeated Requests</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Repeated Responses</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>RsaKeysFrame</name> + <message> + <source>RSA Keys</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RSA private keys are loaded from a file or PKCS #11 token.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add new keyfile…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add new token…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove key</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>PKCS #11 provider libraries.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add new provider…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove provider</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add PKCS #11 token or key</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No new PKCS #11 tokens or keys found, consider adding a PKCS #11 provider.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select a new PKCS #11 token or key</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>PKCS #11 token or key</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enter PIN or password for %1 (it will be stored unencrypted)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enter PIN or password for key</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Key could not be added: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RSA private key (*.pem *.p12 *.pfx *.key);;All Files (</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select RSA private key file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Libraries (*.dll)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Libraries (*.so)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select PKCS #11 Provider Library</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Changes will apply after a restart</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>PKCS #11 provider %1 will be removed after the next restart.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>RtpAnalysisDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sequence</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Delta (ms)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Jitter (ms)</source> + <oldsource>Jitter</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Skew</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bandwidth</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Marker</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Status</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stream %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stream %1 Jitter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stream %1 Difference</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stream %1 Delta</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> %1 streams, </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save one stream CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save all stream's CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Analyze</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open the analysis window for the selected stream(s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Set List</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Add to List</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Remove from List</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Replace existing list in RTP Analysis Dialog with new one</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add new set to existing list in RTP Analysis Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove selected streams from list in RTP Analysis Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><small><i>A hint.</i></small></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Export</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open export menu</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save tables as CSV.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Current Tab Stream CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save the table on the current tab as CSV.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All Tab Streams CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save the table from all tabs as CSV.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save the graph image.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select the corresponding packet in the packet list.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>G</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Next Problem Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the next problem packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>N</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Prepare &Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Prepare a filter matching the selected stream(s).</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Current Tab</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Prepare a filter matching current tab.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&All Tabs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Prepare a filter matching all tabs.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RTP Stream Analysis</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Graph As…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> G: Go to packet, N: Next problem packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Portable Document Format (*.pdf)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Portable Network Graphics (*.png)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Windows Bitmap (*.bmp)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>JPEG File Interchange Format (*.jpeg *.jpg)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Comma-separated values (*.csv)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>RtpAudioStream</name> + <message> + <source>%1 does not support PCM at %2. Preferred format is %3</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>RtpPlayerDialog</name> + <message> + <source>RTP Player</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Play</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Source Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Source Port</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Destination Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Destination Port</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SSRC</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Setup Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Time Span (s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Payloads</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><small><i>No audio</i></small></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Start playback of all unmuted streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Pause/unpause playback</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stop playback</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enable/disable skipping of silence during playback</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Min silence:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Minimum silence duration to skip in seconds</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Output Device:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Output Audio Rate:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Jitter Buffer:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The simulated jitter buffer in milliseconds.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Playback Timing:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><strong>Jitter Buffer</strong>: Use jitter buffer to simulate the RTP stream as heard by the end user. +<br/> +<strong>RTP Timestamp</strong>: Use RTP Timestamp instead of the arriving packet time. This will not reproduce the RTP stream as the user heard it, but is useful when the RTP is being tunneled and the original packet timing is missing. +<br/> +<strong>Uninterrupted Mode</strong>: Ignore the RTP Timestamp. Play the stream as it is completed. This is useful when the RTP timestamp is missing.</source> + <oldsource><strong>Jitter Buffer</strong>: Use jitter buffer to simulate the RTP stream as heard by the end user. +<br/> +<strong>RTP Timestamp</strong>: Use RTP Timestamp instead of the arriving packet time. This will not reproduce the RTP stream as the user heard it, but is useful when the RTP is being tunneled and the original packet timing is missing. +<br/> +<strong>Uniterrupted Mode</strong>: Ignore the RTP Timestamp. Play the stream as it is completed. This is useful when the RTP timestamp is missing.</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Jitter Buffer</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RTP Timestamp</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Uninterrupted Mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>View the timestamps as time of day (checked) or seconds since beginning of capture (unchecked).</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Time of Day</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Export</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Export audio of all unmuted selected channels or export payload of one channel.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>From &cursor</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save audio data started at the cursor</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Stream Synchronized Audio</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save audio data synchronized to start of the earliest stream.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&File Synchronized Audio</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save audio data synchronized to start of the capture file.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Payload</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save RTP payload of selected stream.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset Graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset the graph to its initial state.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go To Setup Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to setup packet of stream currently under the cursor</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mute</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mute selected streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unmute</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unmute selected streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invert muting of selected streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Route audio to left channel of selected streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Route audio to left and right channel of selected streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Route audio to right channel of selected streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove Streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove selected streams from the list</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select all</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>None</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clear selection</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invert</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invert selection</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Play/Pause</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Start playing or pause playing</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stop</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stop playing</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>I&naudible streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select/Deselect inaudible streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Inaudible streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Select</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select inaudible streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Deselect</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Deselect inaudible streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Prepare &Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Prepare a filter matching the selected stream(s).</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>R&efresh streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Read captured packets from capture in progress to player</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom In</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SR (Hz)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sample rate of codec</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>PR (Hz)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Play rate of decoded audio (depends e. g. on selected sound card)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom Out</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Left 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Right 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Left 1 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Right 1 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go To Packet Under Cursor</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to packet currently under the cursor</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Play the stream</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>To Left</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Left + Right</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>To Right</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invert Muting</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No devices available</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Audio Routing</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Play Streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open RTP player dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Set playlist</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Replace existing playlist in RTP Player with new one</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Add to playlist</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add new set to existing playlist in RTP Player</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Remove from playlist</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove selected streams from playlist in RTP Player</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No Audio</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Decoding streams...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Out of Sequence</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Jitter Drops</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wrong Timestamps</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Inserted Silence</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Double click on cell to change audio routing</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1 streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>, %1 selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>, %1 not muted</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>, start: %1. Double click on graph to set start of playback.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>, start: %1, cursor: %2. Press "G" to go to packet %3. Double click on graph to set start of playback.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Playback of stream %1 failed!</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Automatic</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>WAV (*.wav)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sun Audio (*.au)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save audio</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Raw (*.raw)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save payload</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No stream selected or none of selected streams provide audio</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All selected streams must use same play rate. Manual set of Output Audio Rate might help.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No streams are suitable for save</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save failed!</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Can't write header of AU file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Can't write header of WAV file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Payload save works with just one audio stream.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Double click to change audio routing</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Preparing to play...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>RtpStreamDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Source Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Source Port</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Destination Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Destination Port</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SSRC</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Start Time</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Duration</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Payload</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Lost</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Max Delta (ms)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Max Jitter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mean Jitter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Status</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><small><i>A hint.</i></small></source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Only show conversations matching the current display filter</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Limit to display filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Time of Day</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Find &Reverse</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Prepare &Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Export</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Analyze</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open the analysis window for the selected stream(s) and add it to it</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Find the reverse stream matching the selected forward stream.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Min Delta (ms)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mean Delta (ms)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Min Jitter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All forward/reverse stream actions</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>R</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Find All &Pairs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select all streams which are paired in forward/reverse relation</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+R</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Find Only &Singles</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Find all streams which don't have paired reverse stream</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ctrl+R</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mark Packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mark the packets of the selected stream(s).</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>M</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select all</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>None</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clear selection</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invert</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invert selection</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go To Setup</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the setup packet for this stream.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>G</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Prepare a filter matching the selected stream(s).</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>P</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Export the stream payload as rtpdump</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>E</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>A</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cop&y</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open copy menu</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy as CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy stream list as CSV.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy as YAML</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy stream list as YAML.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RTP Streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>as CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>as YAML</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1 streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>, %1 selected, %2 total packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save RTPDump As…</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SCTPAllAssocsDialog</name> + <message> + <source>Wireshark - SCTP Associations</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>ID</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Port 1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Port 2</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Number of Packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Number of DATA Chunks</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Number of Bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Filter Selected Association</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Analyze</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset Graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset the graph to its initial state.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>0</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom In</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>+</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom Out</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>-</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Up 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Up</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Left 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Left</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Right 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Right</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Down 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Down</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Up 1 Pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Up</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Left 1 Pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Left</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Right 1 Pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Right</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Down 1 Pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Down</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Next Stream</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the next stream in the capture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>PgUp</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Previous Stream</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the previous stream in the capture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>PgDown</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch Direction</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch direction (swap TCP endpoints)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>D</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go To Packet Under Cursor</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to packet currently under the cursor</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>G</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Drag / Zoom</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Toggle mouse drag / zoom behavior</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Z</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Relative / Absolute Sequence Numbers</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Toggle relative / absolute sequence numbers</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>S</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture / Session Time Origin</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Toggle capture / session time origin</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>T</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Crosshairs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Toggle crosshairs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Space</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Round Trip Time</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch to the Round Trip Time graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Throughput</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch to the Throughput graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>2</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Time / Sequence (Stevens)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch to the Stevens-style Time / Sequence graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>3</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Window Scaling</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch to the Window Scaling graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>5</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Time / Sequence (tcptrace)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch to the tcptrace-style Time / Sequence graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>4</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SCTPAssocAnalyseDialog</name> + <message> + <source>Wireshark - Analyse Association</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>TabWidget</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Statistics</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Chunk Statistics</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Filter Association</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Number of Data Chunks from EP2 to EP1: </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Checksum Type:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Number of Data Chunks from EP1 to EP2: </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Number of Data Bytes from EP1 to EP2:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Number of Data Bytes from EP2 to EP1: </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>TextLabel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Endpoint 1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Graph TSN</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Graph Bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Requested Number of Inbound Streams:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Port:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sent Verification Tag:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Minimum Number of Inbound Streams:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Complete List of IP addresses from INIT Chunk:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Minimum Number of Outbound Streams:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Graph Arwnd</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Endpoint 2</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Complete List of IP addresses from INIT_ACK Chunk:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Provided Number of Outbound Streams:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SCTP Analyse Association: %1 Port1 %2 Port2 %3</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No Association found for this packet.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Could not find SCTP Association with id: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Complete list of IP addresses from INIT Chunk:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Complete list of IP addresses from INIT_ACK Chunk:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>List of Used IP Addresses</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Used Number of Inbound Streams:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Used Number of Outbound Streams:</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SCTPChunkStatisticsDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Association</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Endpoint 1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Endpoint 2</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Chunk Type Order</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hide Chunk Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove the chunk type from the table</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Chunk Type Preferences</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the chunk type preferences dialog to show or hide other chunk types</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show All Registered Chunk Types</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show all chunk types with defined names</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SCTP Chunk Statistics: %1 Port1 %2 Port2 %3</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SCTPGraphArwndDialog</name> + <message> + <source>SCTP Graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset to full size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p><br/></p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>goToPacket</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SCTP Data and Adv. Rec. Window over Time: %1 Port1 %2 Port2 %3</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No Data Chunks sent</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Arwnd</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>time [secs]</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Advertised Receiver Window [Bytes]</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><small><i>Graph %1: a_rwnd=%2 Time=%3 secs </i></small></source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SCTPGraphByteDialog</name> + <message> + <source>SCTP Graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset to full size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p><br/></p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>goToPacket</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SCTP Data and Adv. Rec. Window over Time: %1 Port1 %2 Port2 %3</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No Data Chunks sent</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>time [secs]</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Received Bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><small><i>Graph %1: Received bytes=%2 Time=%3 secs </i></small></source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SCTPGraphDialog</name> + <message> + <source>SCTP Graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Relative TSNs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Only SACKs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Only TSNs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show both</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset to full size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>goToPacket</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SCTP TSNs and SACKs over Time: %1 Port1 %2 Port2 %3</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No Data Chunks sent</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>CumTSNAck</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Gap Ack</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NR Gap Ack</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Duplicate Ack</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>TSN</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>time [secs]</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>TSNs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><small><i>%1: %2 Time: %3 secs </i></small></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Portable Document Format (*.pdf)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Portable Network Graphics (*.png)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Windows Bitmap (*.bmp)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>JPEG File Interchange Format (*.jpeg *.jpg)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Graph As…</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ScsiServiceResponseTimeDialog</name> + <message> + <source><small><i>Select a command and enter a filter if desired, then press Apply.</i></small></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Command:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SCSI Service Response Times</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SearchFrame</name> + <message> + <source>Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Search the Info column of the packet list (summary pane), decoded packet display labels (tree view pane) or the ASCII-converted packet data (hex view pane).</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet list</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet details</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Search for strings containing narrow (UTF-8 and ASCII) or wide (UTF-16) characters.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Narrow & Wide</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Narrow (UTF-8 / ASCII)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wide (UTF-16)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Case sensitive</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Search for data using display filter syntax (e.g. ip.addr==10.1.1.1), a hexadecimal string (e.g. fffffda5), a plain string (e.g. My String) or a regular expression (e.g. colou?r).</p></body></html></source> + <oldsource><html><head/><body><p>Search for data using display filter syntax (e.g. ip.addr==10.1.1.1), a hexadecimal string (e.g. fffffda5) or a plain string (e.g. My String).</p></body></html></oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hex value</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>String</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Regular Expression</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Find</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No valid search type selected. Please report this to the development team.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid filter.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>That filter doesn't test anything.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>That's not a valid hex string.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>You didn't specify any text for which to search.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No valid character set selected. Please report this to the development team.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No valid search area selected. Please report this to the development team.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Searching for %1…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No packet contained those bytes.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No packet contained that string in its Info column.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No packet contained that string in its dissected display.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No packet contained that string in its converted data.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No packet matched that filter.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SequenceDialog</name> + <message> + <source>Call Flow</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Time</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No data</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>%Ln node(s)</source> + <translation type="unfinished"> + <numerusform>%Ln node</numerusform> + <numerusform>%Ln nodes</numerusform> + </translation> + </message> + <message numerus="yes"> + <source>%Ln item(s)</source> + <translation type="unfinished"> + <numerusform>%Ln item</numerusform> + <numerusform>%Ln items</numerusform> + </translation> + </message> + <message> + <source>Portable Document Format (*.pdf)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Portable Network Graphics (*.png)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Windows Bitmap (*.bmp)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>JPEG File Interchange Format (*.jpeg *.jpg)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>ASCII (*.txt)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Graph As…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Flow</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body> + +<h3>Valuable and amazing time-saving keyboard shortcuts</h3> +<table><tbody> + +<tr><th>+</th><td>Zoom in</td></th> +<tr><th>-</th><td>Zoom out</td></th> +<tr><th>0</th><td>Reset graph to its initial state</td></th> + +<tr><th>→</th><td>Move right 10 pixels</td></th> +<tr><th>←</th><td>Move left 10 pixels</td></th> +<tr><th>↑</th><td>Move up 10 pixels</td></th> +<tr><th>↓</th><td>Move down 10 pixels</td></th> +<tr><th><i>Shift+</i>→</th><td>Move right 1 pixel</td></th> +<tr><th><i>Shift+</i>←</th><td>Move left 1 pixel</td></th> +<tr><th><i>Shift+</i>↑</th><td>Move up 1 pixel</td></th> +<tr><th><i>Shift+</i>↓</th><td>Move down 1 pixel</td></th> + +<tr><th>g</th><td>Go to packet under cursor</td></th> +<tr><th>n</th><td>Go to the next packet</td></th> +<tr><th>p</th><td>Go to the previous packet</td></th> + +</tbody></table> +</body></html></source> + <oldsource><html><head/><body> + +<h3>Valuable and amazing time-saving keyboard shortcuts</h3> +<table><tbody> + +<tr><th>0</th><td>Reset graph to its initial state</td></th> + +<tr><th>→</th><td>Move right 10 pixels</td></th> +<tr><th>←</th><td>Move left 10 pixels</td></th> +<tr><th>↑</th><td>Move up 10 pixels</td></th> +<tr><th>↓</th><td>Move down 10 pixels</td></th> +<tr><th><i>Shift+</i>→</th><td>Move right 1 pixel</td></th> +<tr><th><i>Shift+</i>←</th><td>Move left 1 pixel</td></th> +<tr><th><i>Shift+</i>↑</th><td>Move up 1 pixel</td></th> +<tr><th><i>Shift+</i>↓</th><td>Move down 1 pixel</td></th> + +<tr><th>g</th><td>Go to packet under cursor</td></th> +<tr><th>n</th><td>Go to the next packet</td></th> +<tr><th>p</th><td>Go to the previous packet</td></th> + +</tbody></table> +</body></html></oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source><small><i>A hint</i></small></source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Only show flows matching the current display filter</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Limit to display filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Flow type:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Addresses:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Any</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Network</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset Diagram</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset &Diagram</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset the diagram to its initial state.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>0</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Reset Diagram</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset the diagram to its initial state</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Export</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Export diagram</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom In</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>+</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom Out</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>-</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Up 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Up</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Left 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Left</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Right 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Right</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Down 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Down</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Up 1 Pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Up</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Left 1 Pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Left</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Right 1 Pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Right</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Down 1 Pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Down</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go To Packet Under Cursor</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to packet currently under the cursor</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>G</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All Flows</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show flows for all packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>TCP Flows</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show only TCP flow information</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go To Next Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the next packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>N</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go To Previous Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the previous packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>P</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select RTP Stream</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select RTP stream in RTP Streams dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>S</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Deselect RTP Stream</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Deselect RTP stream in RTP Streams dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>D</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ShortcutListModel</name> + <message> + <source>Shortcut</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Description</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ShowPacketBytesDialog</name> + <message> + <source>Show Packet Bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hint.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Decode as</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show as</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Start</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>End</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Find:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Find &Next</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>Frame %1, %2, %Ln byte(s).</source> + <translation type="unfinished"> + <numerusform>Frame %1, %2, %Ln byte.</numerusform> + <numerusform>Frame %1, %2, %Ln bytes.</numerusform> + </translation> + </message> + <message> + <source>None</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Base64</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Compressed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hex Digits</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Quoted-Printable</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>ROT13</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>ASCII</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>ASCII & Control</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>C Array</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>EBCDIC</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hex Dump</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>HTML</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Image</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Raw</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UTF-8</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>YAML</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Print</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save as…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Selected Packet Bytes As…</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>Displaying %Ln byte(s).</source> + <translation type="unfinished"> + <numerusform>Displaying %Ln byte.</numerusform> + <numerusform>Displaying %Ln bytes.</numerusform> + </translation> + </message> + <message> + <source>Regex Find:</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ShowPacketBytesTextEdit</name> + <message> + <source>Show Selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show All</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SplashOverlay</name> + <message> + <source>Initializing dissectors</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Initializing tap listeners</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Initializing external capture plugins</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Registering dissectors</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Registering plugins</source> + <oldsource>Registering dissector</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Handing off dissectors</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Handing off plugins</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Loading Lua plugins</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Removing Lua plugins</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Loading module preferences</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Finding local interfaces</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>(Unknown action)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>StatsTreeDialog</name> + <message> + <source>Configuration not found</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to find configuration for %1.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SupportedProtocolsDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Search the list of field names.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Search:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><small><i>Gathering protocol information…</i></small></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Supported Protocols</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1 protocols, %2 fields.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SupportedProtocolsModel</name> + <message> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Description</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SyntaxLineEdit</name> + <message> + <source>"%1" is deprecated in favour of "%2". See Help section 6.4.8 for details.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TCPStreamDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body> + +<h3>Valuable and amazing time-saving keyboard shortcuts</h3> +<table><tbody> + +<tr><th>+</th><td>Zoom in</td></th> +<tr><th>-</th><td>Zoom out</td></th> +<tr><th>x</th><td>Zoom in X axis</td></th> +<tr><th>X</th><td>Zoom out X axis</td></th> +<tr><th>y</th><td>Zoom in Y axis</td></th> +<tr><th>Y</th><td>Zoom out Y axis</td></th> +<tr><th>0</th><td>Reset graph to its initial state</td></th> + +<tr><th>→</th><td>Move right 10 pixels</td></th> +<tr><th>←</th><td>Move left 10 pixels</td></th> +<tr><th>↑</th><td>Move up 10 pixels</td></th> +<tr><th>↓</th><td>Move down 10 pixels</td></th> +<tr><th><i>Shift+</i>→</th><td>Move right 1 pixel</td></th> +<tr><th><i>Shift+</i>←</th><td>Move left 1 pixel</td></th> +<tr><th><i>Shift+</i>↑</th><td>Move up 1 pixel</td></th> +<tr><th><i>Shift+</i>↓</th><td>Move down 1 pixel</td></th> + +<tr><th><i>Pg Up</i></th><td>Next stream</td></th> +<tr><th><i>Pg Dn</i></th><td>Previous stream</td></th> +<tr><th>d</th><td>Switch direction (swap TCP endpoints)</td></th> +<tr><th>g</th><td>Go to packet under cursor</td></th> + +<tr><th>z</th><td>Toggle mouse drag / zoom</td></th> +<tr><th>s</th><td>Toggle relative / absolute sequence numbers</td></th> +<tr><th>t</th><td>Toggle capture / session time origin</td></th> +<tr><th>Space</th><td>Toggle crosshairs</td></th> + +<tr><th>1</th><td>Round Trip Time graph</td></th> +<tr><th>2</th><td>Throughput graph</td></th> +<tr><th>3</th><td>Stevens-style Time / Sequence graph</td></th> +<tr><th>4</th><td>tcptrace-style Time / Sequence graph</td></th> +<tr><th>5</th><td>Window Scaling graph</td></th> + +</tbody></table> +</body></html></source> + <oldsource><html><head/><body> + +<h3>Valuable and amazing time-saving keyboard shortcuts</h3> +<table><tbody> + +<tr><th>+</th><td>Zoom in</td></th> +<tr><th>-</th><td>Zoom out</td></th> +<tr><th>0</th><td>Reset graph to its initial state</td></th> + +<tr><th>→</th><td>Move right 10 pixels</td></th> +<tr><th>←</th><td>Move left 10 pixels</td></th> +<tr><th>↑</th><td>Move up 10 pixels</td></th> +<tr><th>↓</th><td>Move down 10 pixels</td></th> +<tr><th><i>Shift+</i>→</th><td>Move right 1 pixel</td></th> +<tr><th><i>Shift+</i>←</th><td>Move left 1 pixel</td></th> +<tr><th><i>Shift+</i>↑</th><td>Move up 1 pixel</td></th> +<tr><th><i>Shift+</i>↓</th><td>Move down 1 pixel</td></th> + +<tr><th><i>Pg Up</i></th><td>Next stream</td></th> +<tr><th><i>Pg Dn</i></th><td>Previous stream</td></th> +<tr><th>d</th><td>Switch direction (swap TCP endpoints)</td></th> +<tr><th>g</th><td>Go to packet under cursor</td></th> + +<tr><th>z</th><td>Toggle mouse drag / zoom</td></th> +<tr><th>s</th><td>Toggle relative / absolute sequence numbers</td></th> +<tr><th>t</th><td>Toggle capture / session time origin</td></th> +<tr><th>Space</th><td>Toggle crosshairs</td></th> + +<tr><th>1</th><td>Round Trip Time graph</td></th> +<tr><th>2</th><td>Throughput graph</td></th> +<tr><th>3</th><td>Stevens-style Time / Sequence graph</td></th> +<tr><th>4</th><td>tcptrace-style Time / Sequence graph</td></th> +<tr><th>5</th><td>Window Scaling graph</td></th> + +</tbody></table> +</body></html></oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source><small><i>Mouse over for shortcuts</i></small></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>MA Window (s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Allow SACK segments as well as data packets to be selected by clicking on the graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select SACKs</source> + <oldsource>select SACKs</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stream</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Switch the direction of the connection (view the opposite flow).</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch Direction</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Mouse</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Drag using the mouse button.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>drags</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select using the mouse button.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>zooms</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display Round Trip Time vs Sequence Number</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>RTT By Sequence Number</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display graph of Segment Length vs Time</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Segment Length</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display graph of Mean Transmitted Bytes vs Time</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display graph of Mean ACKed Bytes vs Time</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Goodput</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display graph of Receive Window Size vs Time</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Rcv Win</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display graph of Outstanding Bytes vs Time</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bytes Out</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Reset the graph to its initial state.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset Graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset the graph to its initial state.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>0</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom In</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>+</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom Out</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>-</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Up 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Up</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Left 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Left</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Right 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Right</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Down 10 Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Down</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Up 1 Pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Up</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Left 1 Pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Left</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Right 1 Pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Right</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move Down 1 Pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Down</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Next Stream</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the next stream in the capture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>PgUp</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Previous Stream</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to the previous stream in the capture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>PgDown</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch direction (swap TCP endpoints)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>D</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go To Packet Under Cursor</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Go to packet currently under the cursor</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>G</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Drag / Zoom</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Toggle mouse drag / zoom behavior</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Z</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Relative / Absolute Sequence Numbers</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Toggle relative / absolute sequence numbers</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>S</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture / Session Time Origin</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Toggle capture / session time origin</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>T</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Crosshairs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Toggle crosshairs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Space</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Round Trip Time</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch to the Round Trip Time graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Throughput</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch to the Throughput graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>2</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Time / Sequence (Stevens)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch to the Stevens-style Time / Sequence graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>3</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Window Scaling</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch to the Window Scaling graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>5</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Time / Sequence (tcptrace)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch to the tcptrace-style Time / Sequence graph</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>4</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom In X Axis</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>X</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom Out X Axis</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+X</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom In Y Axis</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Y</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Zoom Out Y Axis</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Shift+Y</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save As…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No Capture Data</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1 %2 pkts, %3 %4 %5 pkts, %6 </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sequence Numbers (Stevens)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sequence Numbers (tcptrace)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> (MA)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> (%1 Segment MA)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> [not enough data]</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> for %1:%2 %3 %4:%5</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1 %2 (%3s len %4 seq %5 ack %6 win %7)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Click to select packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Release to zoom, x = %1 to %2, y = %3 to %4</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to select range.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Click to select a portion of the graph.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Portable Document Format (*.pdf)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Portable Network Graphics (*.png)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Windows Bitmap (*.bmp)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>JPEG File Interchange Format (*.jpeg *.jpg)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Graph As…</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TapParameterDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Item</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><small><i>A hint.</i></small></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display filter:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Regenerate statistics using this display filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Apply</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy a text representation of the tree to the clipboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save as…</source> + <oldsource>Save as...</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save the displayed data in various formats</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Collapse All</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Expand All</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save Statistics As…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Plain text file (*.txt);;Comma separated values (*.csv);;XML document (*.xml);;YAML document (*.yaml)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Plain text file (*.txt)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Error saving file %1</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TimeShiftDialog</name> + <message> + <source>Shift all packets by</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p><span style=" font-size:small; font-style:italic;">[-][[hh:]mm:]ss[.ddd] </span></p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Set the time for packet</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>to</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…then set packet</source> + <oldsource>...then set packet</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>and extrapolate the time for all other packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p align="right"><span style=" font-size:small; font-style:italic;">[YYYY-MM-DD] hh:mm:ss[.ddd] </span></p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Undo all shifts</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Time Shift</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Frame numbers must be between 1 and %1.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid frame number.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Time shifting is not available capturing packets.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TrafficTableDialog</name> + <message> + <source><html><head/><body><p>Show resolved addresses and port names rather than plain values. The corresponding name resolution preference must be enabled.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Name resolution</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Only show conversations matching the current display filter</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Limit to display filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Show absolute times in the start time column.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Absolute start time</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Add and remove conversation types.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1 Types</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>as CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy all values of this page to the clipboard in CSV (Comma Separated Values) format.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>as YAML</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy all values of this page to the clipboard in the YAML data serialization format.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>UatDialog</name> + <message> + <source>Create a new entry.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove this entry.</source> + <oldsource>Remove this profile.</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy this entry.</source> + <oldsource>Copy this profile.</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move entry up.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move entry down.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clear all entries.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown User Accessible Table</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open </source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>UatFrame</name> + <message> + <source>Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Create a new entry.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove this entry.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy this entry.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move entry up.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Move entry down.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clear all entries.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy entries from another profile.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy from</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown User Accessible Table</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open </source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>VoipCallsDialog</name> + <message> + <source><small></small></source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Only show conversations matching the current display filter</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Limit to display filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Time of Day</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Flow &Sequence</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show flow sequence for selected call(s).</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Prepare &Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Prepare a filter matching the selected calls(s).</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cop&y</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open copy menu</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select all</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>None</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invert</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invert selection</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select related RTP streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select RTP streams related to selected calls in RTP Streams dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>S</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Deselect related RTP Streams</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>D</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clear selection</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display time as time of day</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy as CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy stream list as CSV.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy as YAML</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy stream list as YAML.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SIP Flows</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>VoIP Calls</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>as CSV</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>as YAML</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>VoipCallsInfoModel</name> + <message> + <source>On</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Off</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Tunneling: %1 Fast Start: %2</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Start Time</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stop Time</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Initial Speaker</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>From</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>To</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Protocol</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Duration</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>State</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Comments</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>WelcomePage</name> + <message> + <source>Form</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p><span style=" font-size:large;">Welcome to Wireshark</span></p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Open a file on your file system</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source><h2>Open</h2></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Recent capture files</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Capture files that have been opened previously</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Capture live packets from your network.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source><h2>Capture</h2></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>…using this filter:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Interface list</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>List of available capture interfaces</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><h2>Learn</h2></source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head> +<style> +a:link { + color: palette(text); + text-decoration: none; +} +a:hover { + color: palette(text); + text-decoration: underline; +} +</style> +</head> +<body> + +<table><tr> +<th><a href="https://www.wireshark.org/docs/wsug_html_chunked/">User's Guide</a></th> + +<td style="padding-left: 8px; padding-right: 8px;">·</td> + +<th><a href="https://gitlab.com/wireshark/wireshark/-/wikis/">Wiki</a></th> + +<td style="padding-left: 8px; padding-right: 8px;">·</td> + +<th><a href="https://ask.wireshark.org/">Questions and Answers</a></th> + +<td style="padding-left: 8px; padding-right: 8px;">·</td> + +<th><a href="https://www.wireshark.org/lists/">Mailing Lists</a></th> + +</tr></table> +</body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show in Finder</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show in Folder</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All interfaces shown</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>%n interface(s) shown, %1 hidden</source> + <translation type="unfinished"> + <numerusform>%n interface shown, %1 hidden</numerusform> + <numerusform>%n interfaces shown, %1 hidden</numerusform> + </translation> + </message> + <message> + <source>You are sniffing the glue that holds the Internet together using Wireshark </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>You are running Wireshark </source> + <translation type="unfinished"></translation> + </message> + <message> + <source> You receive automatic updates.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> You have disabled automatic updates.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>not found</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy file path</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove from list</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>WirelessFrame</name> + <message> + <source>Frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Interface</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Set the 802.11 channel.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Channel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>When capturing, show all frames, ones that have a valid frame check sequence (FCS), or ones with an invalid FCS.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>FCS Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All Frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Valid Frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid Frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wireless controls are not supported in this version of Wireshark.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>External Helper</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head/><body><p>Show the IEEE 802.11 preferences, including decryption keys.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>802.11 Preferences</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>AirPcap Control Panel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open the AirPcap Control Panel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to set channel or offset.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to set FCS validation behavior.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>WirelessTimeline</name> + <message> + <source>Packet number %1 does not include TSF timestamp, not showing timeline.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Packet number %u has large negative jump in TSF, not showing timeline. Perhaps TSF reference point is set wrong?</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>WiresharkDialog</name> + <message> + <source>Failed to attach to tap "%1"</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>WlanStatisticsDialog</name> + <message> + <source>Wireless LAN Statistics</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Channel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SSID</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Percent Packets</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Percent Retry</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Probe Reqs</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Probe Resp</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Auths</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Retry</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Deauths</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Other</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/ui/logray/logray_main.cpp b/ui/logray/logray_main.cpp new file mode 100644 index 00000000..2b754402 --- /dev/null +++ b/ui/logray/logray_main.cpp @@ -0,0 +1,1094 @@ +/* logray_main.cpp + * + * Logray - Event log analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include <config.h> +#define WS_LOG_DOMAIN LOG_DOMAIN_MAIN + +#include <glib.h> + +#include <locale.h> + +#ifdef _WIN32 +#include <windows.h> +#include <tchar.h> +#include <wchar.h> +#include <shellapi.h> +#include <wsutil/console_win32.h> +#endif + +#include <ws_exit_codes.h> +#include <wsutil/clopts_common.h> +#include <wsutil/cmdarg_err.h> +#include <ui/urls.h> +#include <wsutil/time_util.h> +#include <wsutil/filesystem.h> +#include <wsutil/privileges.h> +#include <wsutil/socket.h> +#include <wsutil/wslog.h> +#ifdef HAVE_PLUGINS +#include <wsutil/plugins.h> +#endif +#include <wsutil/report_message.h> +#include <wsutil/please_report_bug.h> +#include <wsutil/unicode-utils.h> +#include <wsutil/version_info.h> + +#include <epan/addr_resolv.h> +#include <epan/ex-opt.h> +#include <epan/tap.h> +#include <epan/stat_tap_ui.h> +#include <epan/column.h> +#include <epan/disabled_protos.h> +#include <epan/prefs.h> + +#ifdef HAVE_KERBEROS +#include <epan/packet.h> +#include <epan/asn1.h> +#include <epan/dissectors/packet-kerberos.h> +#endif + +#include <wsutil/codecs.h> + +#include <extcap.h> + +/* general (not Qt specific) */ +#include "file.h" +#include "epan/color_filters.h" + +#include "epan/rtd_table.h" +#include "epan/srt_table.h" + +#include "ui/alert_box.h" +#include "ui/iface_lists.h" +#include "ui/language.h" +#include "ui/persfilepath_opt.h" +#include "ui/recent.h" +#include "ui/simple_dialog.h" +#include "ui/util.h" +#include "ui/dissect_opts.h" +#include "ui/commandline.h" +#include "ui/capture_ui_utils.h" +#include "ui/preference_utils.h" +#include "ui/software_update.h" +#include "ui/taps.h" + +#include "ui/qt/conversation_dialog.h" +#include "ui/qt/utils/color_utils.h" +#include "ui/qt/coloring_rules_dialog.h" +#include "ui/qt/endpoint_dialog.h" +#include "ui/qt/glib_mainloop_on_qeventloop.h" +#include "ui/logray/logray_main_window.h" +#include "ui/qt/simple_dialog.h" +#include "ui/qt/simple_statistics_dialog.h" +#include <ui/qt/widgets/splash_overlay.h> +#include "ui/logray/logray_application.h" + +#include "capture/capture-pcap-util.h" + +#include <QMessageBox> +#include <QScreen> + +#ifdef _WIN32 +# include "capture/capture-wpcap.h" +# include <wsutil/file_util.h> +#endif /* _WIN32 */ + +#ifdef HAVE_AIRPCAP +# include <capture/airpcap.h> +# include <capture/airpcap_loader.h> +//# include "airpcap_dlg.h" +//# include "airpcap_gui_utils.h" +#endif + +#include "epan/crypt/dot11decrypt_ws.h" + +/* Handle the addition of View menu items without request */ +#if defined(Q_OS_MAC) +#include <ui/macosx/cocoa_bridge.h> +#endif + +#include <ui/qt/utils/qt_ui_utils.h> + +//#define DEBUG_STARTUP_TIME 1 + +/* update the main window */ +void main_window_update(void) +{ + LograyApplication::processEvents(); +} + +void exit_application(int status) { + if (lwApp) { + lwApp->quit(); + } + exit(status); +} + +/* + * Report an error in command-line arguments. + * + * On Windows, Wireshark is built for the Windows subsystem, and runs + * without a console, so we create a console on Windows to receive the + * output. + * + * See create_console(), in ui/win32/console_win32.c, for an example + * of code to check whether we need to create a console. + * + * On UN*Xes: + * + * If Wireshark is run from the command line, its output either goes + * to the terminal or to wherever the standard error was redirected. + * + * If Wireshark is run by executing it as a remote command, e.g. with + * ssh, its output either goes to whatever socket was set up for the + * remote command's standard error or to wherever the standard error + * was redirected. + * + * If Wireshark was run from the GUI, e.g. by double-clicking on its + * icon or on a file that it opens, there are no guarantees as to + * where the standard error went. It could be going to /dev/null + * (current macOS), or to a socket to systemd for the journal, or + * to a log file in the user's home directory, or to the "console + * device" ("workstation console"), or.... + * + * Part of determining that, at least for locally-run Wireshark, + * is to try to open /dev/tty to determine whether the process + * has a controlling terminal. (It fails, at a minimum, for + * Wireshark launched from the GUI under macOS, Ubuntu with GNOME, + * and Ubuntu with KDE; in all cases, an attempt to open /dev/tty + * fails with ENXIO.) If it does have a controlling terminal, + * write to the standard error, otherwise assume that the standard + * error might not go anywhere that the user will be able to see. + * That doesn't handle the "run by ssh" case, however; that will + * not have a controlling terminal. (This means running it by + * remote execution, not by remote login.) Perhaps there's an + * environment variable to check there. + */ +// xxx copied from ../gtk/main.c +static void +logray_cmdarg_err(const char *fmt, va_list ap) +{ +#ifdef _WIN32 + create_console(); +#endif + fprintf(stderr, "logray: "); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); +} + +/* + * Report additional information for an error in command-line arguments. + * Creates a console on Windows. + */ +// xxx copied from ../gtk/main.c +static void +logray_cmdarg_err_cont(const char *fmt, va_list ap) +{ +#ifdef _WIN32 + create_console(); +#endif + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); +} + +void +gather_wireshark_qt_compiled_info(feature_list l) +{ +#ifdef QT_VERSION + with_feature(l, "Qt %s", QT_VERSION_STR); +#else + with_feature(l, "Qt (version unknown)"); +#endif + gather_caplibs_compile_info(l); + epan_gather_compile_info(l); +#ifdef QT_MULTIMEDIA_LIB + with_feature(l, "QtMultimedia"); +#else + without_feature(l, "QtMultimedia"); +#endif + + const char *update_info = software_update_info(); + if (update_info) { + with_feature(l, "automatic updates using %s", update_info); + } else { + without_feature(l, "automatic updates"); + } +#ifdef _WIN32 +#ifdef HAVE_AIRPCAP + gather_airpcap_compile_info(l); +#else + without_feature(l, "AirPcap"); +#endif +#endif /* _WIN32 */ + +#ifdef HAVE_MINIZIP + with_feature(l, "Minizip"); +#else + without_feature(l, "Minizip"); +#endif +} + +void +gather_wireshark_runtime_info(feature_list l) +{ + with_feature(l, "Qt %s", qVersion()); +#ifdef HAVE_LIBPCAP + gather_caplibs_runtime_info(l); +#endif + epan_gather_runtime_info(l); + +#ifdef HAVE_AIRPCAP + gather_airpcap_runtime_info(l); +#endif + + if (mainApp) { + // Display information + const char *display_mode = ColorUtils::themeIsDark() ? "dark" : "light"; + with_feature(l, "%s display mode", display_mode); + + int hidpi_count = 0; + foreach (QScreen *screen, mainApp->screens()) { + if (screen->devicePixelRatio() > 1.0) { + hidpi_count++; + } + } + if (hidpi_count == mainApp->screens().count()) { + with_feature(l, "HiDPI"); + } else if (hidpi_count) { + with_feature(l, "mixed DPI"); + } else { + without_feature(l, "HiDPI"); + } + } +} + +static void +qt_log_message_handler(QtMsgType type, const QMessageLogContext &, const QString &msg) +{ + enum ws_log_level log_level = LOG_LEVEL_DEBUG; + + switch (type) { + case QtInfoMsg: + log_level = LOG_LEVEL_INFO; + break; + // We want qDebug() messages to show up at our default log level. + case QtDebugMsg: + case QtWarningMsg: + log_level = LOG_LEVEL_WARNING; + break; + case QtCriticalMsg: + log_level = LOG_LEVEL_CRITICAL; + break; + case QtFatalMsg: + log_level = LOG_LEVEL_ERROR; + break; + default: + break; + } + ws_log(LOG_DOMAIN_QTUI, log_level, "%s", qUtf8Printable(msg)); +} + +#ifdef HAVE_LIBPCAP +/* Check if there's something important to tell the user during startup. + * We want to do this *after* showing the main window so that any windows + * we pop up will be above the main window. + */ +static void +check_and_warn_user_startup() +{ + gchar *cur_user, *cur_group; + + /* Tell the user not to run as root. */ + if (running_with_special_privs() && recent.privs_warn_if_elevated) { + cur_user = get_cur_username(); + cur_group = get_cur_groupname(); + simple_message_box(ESD_TYPE_WARN, &recent.privs_warn_if_elevated, + "Running as user \"%s\" and group \"%s\".\n" + "This could be dangerous.\n\n" + "If you're running Wireshark this way in order to perform live capture, " + "you may want to be aware that there is a better way documented at\n" + WS_WIKI_URL("CaptureSetup/CapturePrivileges"), cur_user, cur_group); + g_free(cur_user); + g_free(cur_group); + } +} +#endif + +#ifdef _WIN32 +// Try to avoid library search path collisions. QCoreApplication will +// search QT_INSTALL_PREFIX/plugins for platform DLLs before searching +// the application directory. If +// +// - You have Qt version 5.x.y installed in the default location +// (C:\Qt\5.x) on your machine. +// +// and +// +// - You install Wireshark that was built on a machine with Qt version +// 5.x.z installed in the default location. +// +// Qt5Core.dll will load qwindows.dll from your local C:\Qt\5.x\...\plugins +// directory. This may not be compatible with qwindows.dll from that +// same path on the build machine. At any rate, loading DLLs from paths +// you don't control is ill-advised. We work around this by removing every +// path except our application directory. + +static inline void +win32_reset_library_path(void) +{ + QString app_path = QDir(get_progfile_dir()).path(); + foreach (QString path, QCoreApplication::libraryPaths()) { + QCoreApplication::removeLibraryPath(path); + } + QCoreApplication::addLibraryPath(app_path); +} +#endif + +#ifdef Q_OS_MAC +// Try to work around +// +// https://gitlab.com/wireshark/wireshark/-/issues/17075 +// +// aka +// +// https://bugreports.qt.io/browse/QTBUG-87014 +// +// The fix at +// +// https://codereview.qt-project.org/c/qt/qtbase/+/322228/3/src/plugins/platforms/cocoa/qnsview_drawing.mm +// +// enables layer backing if we're running on Big Sur OR we're running on +// Catalina AND we were built with the Catalina SDK. Enable layer backing +// here by setting QT_MAC_WANTS_LAYER=1, but only if we're running on Big +// Sur and our version of Qt doesn't have a fix for QTBUG-87014. +#include <QOperatingSystemVersion> +static inline void +macos_enable_layer_backing(void) +{ + // At the time of this writing, the QTBUG-87014 for layerEnabledByMacOS is... + // + // ...in https://github.com/qt/qtbase/blob/5.12/src/plugins/platforms/cocoa/qnsview_drawing.mm + // ...not in https://github.com/qt/qtbase/blob/5.12.10/src/plugins/platforms/cocoa/qnsview_drawing.mm + // ...in https://github.com/qt/qtbase/blob/5.15/src/plugins/platforms/cocoa/qnsview_drawing.mm + // ...not in https://github.com/qt/qtbase/blob/5.15.2/src/plugins/platforms/cocoa/qnsview_drawing.mm + // ...not in https://github.com/qt/qtbase/blob/6.0/src/plugins/platforms/cocoa/qnsview_drawing.mm + // ...not in https://github.com/qt/qtbase/blob/6.0.0/src/plugins/platforms/cocoa/qnsview_drawing.mm + // + // We'll assume that it will be fixed in 5.12.11, 5.15.3, and 6.0.1. + // Note that we only ship LTS versions of Qt with our macOS packages. + // Feel free to add other versions if needed. +#if \ + (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) && QT_VERSION < QT_VERSION_CHECK(5, 12, 11) \ + || (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) && QT_VERSION < QT_VERSION_CHECK(5, 15, 3)) \ + || (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) && QT_VERSION < QT_VERSION_CHECK(6, 0, 1)) \ + ) + QOperatingSystemVersion os_ver = QOperatingSystemVersion::current(); + int major_ver = os_ver.majorVersion(); + int minor_ver = os_ver.minorVersion(); + if ( (major_ver == 10 && minor_ver >= 16) || major_ver >= 11 ) { + if (qgetenv("QT_MAC_WANTS_LAYER").isEmpty()) { + qputenv("QT_MAC_WANTS_LAYER", "1"); + } + } +#endif +} +#endif + +#ifdef HAVE_LIBPCAP +static GList * +capture_opts_get_interface_list(int *err, char **err_str) +{ + /* + * XXX - should this pass an update callback? + * We already have a window up by the time we start parsing + * the majority of the command-line arguments, because + * we need to do a bunch of initialization work before + * parsing those arguments, and we want to let the user + * know that we're doing that initialization, given that + * it can take a while. + */ + return capture_interface_list(err, err_str, NULL); +} +#endif + +/* And now our feature presentation... [ fade to music ] */ +int main(int argc, char *qt_argv[]) +{ + LograyMainWindow *main_w; + +#ifdef _WIN32 + LPWSTR *wc_argv; + int wc_argc; +#endif + int ret_val = EXIT_SUCCESS; + char **argv = qt_argv; + + char *rf_path; + int rf_open_errno; +#ifdef HAVE_LIBPCAP + gchar *err_str, *err_str_secondary;; +#else +#ifdef _WIN32 +#ifdef HAVE_AIRPCAP + gchar *err_str; +#endif +#endif +#endif + gchar *err_msg = NULL; + df_error_t *df_err = NULL; + + QString dfilter, read_filter; +#ifdef HAVE_LIBPCAP + int caps_queries = 0; +#endif + /* Start time in microseconds */ + guint64 start_time = g_get_monotonic_time(); + static const struct report_message_routines wireshark_report_routines = { + vfailure_alert_box, + vwarning_alert_box, + open_failure_alert_box, + read_failure_alert_box, + write_failure_alert_box, + cfile_open_failure_alert_box, + cfile_dump_open_failure_alert_box, + cfile_read_failure_alert_box, + cfile_write_failure_alert_box, + cfile_close_failure_alert_box + }; + +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + /* + * See: + * + * issue #16908; + * + * https://doc.qt.io/qt-5/qvector.html#maximum-size-and-out-of-memory-conditions + * + * https://forum.qt.io/topic/114950/qvector-realloc-throwing-sigsegv-when-very-large-surface3d-is-rendered + * + * for why we're doing this; the widget we use for the packet list + * uses QVector, so those limitations apply to it. + * + * Apparently, this will be fixed in Qt 6: + * + * https://github.com/qt/qtbase/commit/215ca735341b9487826023a7983382851ce8bf26 + * + * https://github.com/qt/qtbase/commit/2a6cdec718934ca2cc7f6f9c616ebe62f6912123#diff-724f419b0bb0487c2629bb16cf534c4b268ddcee89b5177189b607f940cfd83dR192 + * + * Hopefully QList won't cause any performance hits relative to + * QVector. + * + * We pick 53 million records as a value that should avoid the problem; + * see the Wireshark issue for why that value was chosen. + */ + cf_set_max_records(53000000); +#endif + +#ifdef Q_OS_MAC + macos_enable_layer_backing(); +#endif + + cmdarg_err_init(logray_cmdarg_err, logray_cmdarg_err_cont); + + /* Initialize log handler early so we can have proper logging during startup. */ + ws_log_init("logray", vcmdarg_err); + /* For backward compatibility with GLib logging and Wireshark 3.4. */ + ws_log_console_writer_set_use_stdout(TRUE); + + qInstallMessageHandler(qt_log_message_handler); + +#ifdef _WIN32 + restore_pipes(); +#endif + +#ifdef DEBUG_STARTUP_TIME + prefs.gui_console_open = console_open_always; +#endif /* DEBUG_STARTUP_TIME */ + +#if defined(Q_OS_MAC) + /* Disable automatic addition of tab menu entries in view menu */ + CocoaBridge::cleanOSGeneratedMenuItems(); +#endif + + /* + * Set the C-language locale to the native environment and set the + * code page to UTF-8 on Windows. + */ +#ifdef _WIN32 + setlocale(LC_ALL, ".UTF-8"); +#else + setlocale(LC_ALL, ""); +#endif + + ws_tzset(); + +#ifdef _WIN32 + // + // On Windows, QCoreApplication has its own WinMain(), which gets the + // command line using GetCommandLineW(), breaks it into individual + // arguments using CommandLineToArgvW(), and then "helpfully" + // converts those UTF-16LE arguments into strings in the local code + // page. + // + // We don't want that, because not all file names can be represented + // in the local code page, so we do the same, but we convert the + // strings into UTF-8. + // + wc_argv = CommandLineToArgvW(GetCommandLineW(), &wc_argc); + if (wc_argv) { + argc = wc_argc; + argv = arg_list_utf_16to8(wc_argc, wc_argv); + LocalFree(wc_argv); + } /* XXX else bail because something is horribly, horribly wrong? */ + + create_app_running_mutex(); +#endif /* _WIN32 */ + + /* Early logging command-line initialization. */ + ws_log_parse_args(&argc, argv, vcmdarg_err, WS_EXIT_INVALID_OPTION); + ws_noisy("Finished log init and parsing command line log arguments"); + + /* + * Get credential information for later use, and drop privileges + * before doing anything else. + * Let the user know if anything happened. + */ + init_process_policies(); + relinquish_special_privs_perm(); + + /* + * Attempt to get the pathname of the directory containing the + * executable file. + */ + /* configuration_init_error = */ configuration_init(argv[0], "Logray"); + /* ws_log(NULL, LOG_LEVEL_DEBUG, "progfile_dir: %s", get_progfile_dir()); */ + +#ifdef _WIN32 + ws_init_dll_search_path(); + /* Load wpcap if possible. Do this before collecting the run-time version information */ + load_wpcap(); + +#ifdef HAVE_AIRPCAP + /* Load the airpcap.dll. This must also be done before collecting + * run-time version information. */ + load_airpcap(); +#if 0 + airpcap_dll_ret_val = load_airpcap(); + + switch (airpcap_dll_ret_val) { + case AIRPCAP_DLL_OK: + /* load the airpcap interfaces */ + g_airpcap_if_list = get_airpcap_interface_list(&err, &err_str); + + if (g_airpcap_if_list == NULL || g_list_length(g_airpcap_if_list) == 0) { + if (err == CANT_GET_AIRPCAP_INTERFACE_LIST && err_str != NULL) { + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", "Failed to open Airpcap Adapters."); + g_free(err_str); + } + airpcap_if_active = NULL; + + } else { + + /* select the first as default (THIS SHOULD BE CHANGED) */ + airpcap_if_active = airpcap_get_default_if(airpcap_if_list); + } + break; + /* + * XXX - Maybe we need to warn the user if one of the following happens??? + */ + case AIRPCAP_DLL_OLD: + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s","AIRPCAP_DLL_OLD\n"); + break; + + case AIRPCAP_DLL_ERROR: + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s","AIRPCAP_DLL_ERROR\n"); + break; + + case AIRPCAP_DLL_NOT_FOUND: + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s","AIRPCAP_DDL_NOT_FOUND\n"); + break; + } +#endif +#endif /* HAVE_AIRPCAP */ +#endif /* _WIN32 */ + + /* Get the compile-time version information string */ + ws_init_version_info("Logray", gather_wireshark_qt_compiled_info, + gather_wireshark_runtime_info); + + init_report_message("Logray", &wireshark_report_routines); + + /* Create the user profiles directory */ + if (create_profiles_dir(&rf_path) == -1) { + simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK, + "Could not create profiles directory\n\"%s\": %s.", + rf_path, g_strerror(errno)); + g_free (rf_path); + } + + profile_store_persconffiles(TRUE); + recent_init(); + + /* Read the profile independent recent file. We have to do this here so we can */ + /* set the profile before it can be set from the command line parameter */ + if (!recent_read_static(&rf_path, &rf_open_errno)) { + simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK, + "Could not open common recent file\n\"%s\": %s.", + rf_path, g_strerror(rf_open_errno)); + g_free(rf_path); + } + + commandline_early_options(argc, argv); + +#ifdef _WIN32 + win32_reset_library_path(); +#endif + + // Handle DPI scaling on Windows. This causes problems in at least + // one case on X11 and we don't yet support Android. + // We do the equivalent on macOS by setting NSHighResolutionCapable + // in Info.plist. + // Note that this enables Windows 8.1-style Per-monitor DPI + // awareness but not Windows 10-style Per-monitor v2 awareness. + // https://doc.qt.io/qt-5/scalability.html + // https://doc.qt.io/qt-5/highdpi.html + // https://bugreports.qt.io/browse/QTBUG-53022 - The device pixel ratio is pretty much bogus on Windows. + // https://bugreports.qt.io/browse/QTBUG-55510 - Windows have wrong size +#if defined(Q_OS_WIN) + QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); +#endif + + /* Create The Wireshark app */ + LograyApplication ls_app(argc, qt_argv); + + /* initialize the funnel mini-api */ + // xxx qtshark + //initialize_funnel_ops(); + + Dot11DecryptInitContext(&dot11decrypt_ctx); + + QString cf_name; + unsigned int in_file_type = WTAP_TYPE_AUTO; + + err_msg = ws_init_sockets(); + if (err_msg != NULL) + { + cmdarg_err("%s", err_msg); + g_free(err_msg); + cmdarg_err_cont("%s", please_report_bug()); + ret_val = WS_EXIT_INIT_FAILED; + goto clean_exit; + } + + /* Read the profile dependent (static part) of the recent file. */ + /* Only the static part of it will be read, as we don't have the gui now to fill the */ + /* recent lists which is done in the dynamic part. */ + /* We have to do this already here, so command line parameters can overwrite these values. */ + if (!recent_read_profile_static(&rf_path, &rf_open_errno)) { + simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK, + "Could not open recent file\n\"%s\": %s.", + rf_path, g_strerror(rf_open_errno)); + g_free(rf_path); + } + lwApp->applyCustomColorsFromRecent(); + + // Initialize our language + read_language_prefs(); + lwApp->loadLanguage(language); + + /* ws_log(LOG_DOMAIN_MAIN, LOG_LEVEL_DEBUG, "Translator %s", language); */ + + // Init the main window (and splash) + main_w = new(LograyMainWindow); + main_w->show(); + // Setup GLib mainloop on Qt event loop to enable GLib and GIO watches + GLibMainloopOnQEventLoop::setup(main_w); + // We may not need a queued connection here but it would seem to make sense + // to force the issue. + main_w->connect(&ls_app, SIGNAL(openCaptureFile(QString,QString,unsigned int)), + main_w, SLOT(openCaptureFile(QString,QString,unsigned int))); + main_w->connect(&ls_app, &LograyApplication::openCaptureOptions, + main_w, &LograyMainWindow::showCaptureOptionsDialog); + + /* + * If we have a saved "last directory in which a file was opened" + * in the recent file, set it as the one for the app. + * + * (do this after the path settings are processed) + */ + if (recent.gui_fileopen_remembered_dir && + test_for_directory(recent.gui_fileopen_remembered_dir) == EISDIR) { + set_last_open_dir(recent.gui_fileopen_remembered_dir); + } + +#ifdef DEBUG_STARTUP_TIME + ws_log(LOG_DOMAIN_MAIN, LOG_LEVEL_INFO, "set_console_log_handler, elapsed time %" G_GUINT64_FORMAT " us \n", g_get_monotonic_time() - start_time); +#endif + +#ifdef HAVE_LIBPCAP + /* Set the initial values in the capture options. This might be overwritten + by preference settings and then again by the command line parameters. */ + capture_opts_init(&global_capture_opts, capture_opts_get_interface_list); +#endif + + /* + * Libwiretap must be initialized before libwireshark is, so that + * dissection-time handlers for file-type-dependent blocks can + * register using the file type/subtype value for the file type. + */ + wtap_init(TRUE); + + splash_update(RA_DISSECTORS, NULL, NULL); +#ifdef DEBUG_STARTUP_TIME + ws_log(LOG_DOMAIN_MAIN, LOG_LEVEL_INFO, "Calling epan init, elapsed time %" G_GUINT64_FORMAT " us \n", g_get_monotonic_time() - start_time); +#endif + /* Register all dissectors; we must do this before checking for the + "-G" flag, as the "-G" flag dumps information registered by the + dissectors, and we must do it before we read the preferences, in + case any dissectors register preferences. */ + if (!epan_init(splash_update, NULL, TRUE)) { + SimpleDialog::displayQueuedMessages(main_w); + ret_val = WS_EXIT_INIT_FAILED; + goto clean_exit; + } +#ifdef DEBUG_STARTUP_TIME + /* epan_init resets the preferences */ + prefs.gui_console_open = console_open_always; + ws_log(LOG_DOMAIN_MAIN, LOG_LEVEL_INFO, "epan done, elapsed time %" G_GUINT64_FORMAT " us \n", g_get_monotonic_time() - start_time); +#endif + + /* Register all audio codecs. */ + codecs_init(); + + // Read the dynamic part of the recent file. This determines whether or + // not the recent list appears in the main window so the earlier we can + // call this the better. + if (!recent_read_dynamic(&rf_path, &rf_open_errno)) { + simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK, + "Could not open recent file\n\"%s\": %s.", + rf_path, g_strerror(rf_open_errno)); + g_free(rf_path); + } + lwApp->refreshRecentCaptures(); + + splash_update(RA_LISTENERS, NULL, NULL); +#ifdef DEBUG_STARTUP_TIME + ws_log(LOG_DOMAIN_MAIN, LOG_LEVEL_INFO, "Register all tap listeners, elapsed time %" G_GUINT64_FORMAT " us \n", g_get_monotonic_time() - start_time); +#endif + /* Register all tap listeners; we do this before we parse the arguments, + as the "-z" argument can specify a registered tap. */ + + register_all_tap_listeners(tap_reg_listener); + + conversation_table_set_gui_info(init_conversation_table); + endpoint_table_set_gui_info(init_endpoint_table); +// srt_table_iterate_tables(register_service_response_tables, NULL); +// rtd_table_iterate_tables(register_response_time_delay_tables, NULL); + stat_tap_iterate_tables(register_simple_stat_tables, NULL); + + if (ex_opt_count("read_format") > 0) { + in_file_type = open_info_name_to_type(ex_opt_get_next("read_format")); + } + +#ifdef DEBUG_STARTUP_TIME + ws_log(LOG_DOMAIN_MAIN, LOG_LEVEL_INFO, "Calling extcap_register_preferences, elapsed time %" G_GUINT64_FORMAT " us \n", g_get_monotonic_time() - start_time); +#endif + splash_update(RA_EXTCAP, NULL, NULL); + extcap_register_preferences(); + splash_update(RA_PREFERENCES, NULL, NULL); +#ifdef DEBUG_STARTUP_TIME + ws_log(LOG_DOMAIN_MAIN, LOG_LEVEL_INFO, "Calling module preferences, elapsed time %" G_GUINT64_FORMAT " us \n", g_get_monotonic_time() - start_time); +#endif + + /* Read the preferences, but don't apply them yet. */ + global_commandline_info.prefs_p = ls_app.readConfigurationFiles(false); + + /* Now let's see if any of preferences were overridden at the command + * line, and store them. We have to do this before applying the + * preferences to the capture options. + */ + commandline_override_prefs(argc, argv, TRUE); + + /* Some of the preferences affect the capture options. Apply those + * before getting the other command line arguments, which can also + * affect the capture options. The command line arguments should be + * applied last to take precedence (at least until the user saves + * preferences, or switches profiles.) + */ + prefs_to_capture_opts(); + + /* Now get our remaining args */ + commandline_other_options(argc, argv, TRUE); + + /* Convert some command-line parameters to QStrings */ + if (global_commandline_info.cf_name != NULL) + cf_name = QString(global_commandline_info.cf_name); + if (global_commandline_info.rfilter != NULL) + read_filter = QString(global_commandline_info.rfilter); + if (global_commandline_info.dfilter != NULL) + dfilter = QString(global_commandline_info.dfilter); + + timestamp_set_type(recent.gui_time_format); + timestamp_set_precision(recent.gui_time_precision); + timestamp_set_seconds_type (recent.gui_seconds_format); + +#ifdef HAVE_LIBPCAP +#ifdef DEBUG_STARTUP_TIME + ws_log(LOG_DOMAIN_MAIN, LOG_LEVEL_INFO, "Calling fill_in_local_interfaces, elapsed time %" G_GUINT64_FORMAT " us \n", g_get_monotonic_time() - start_time); +#endif + splash_update(RA_INTERFACES, NULL, NULL); + + if (!global_commandline_info.cf_name && !prefs.capture_no_interface_load) { + /* Allow only extcap interfaces to be found */ + GList * filter_list = NULL; + filter_list = g_list_append(filter_list, GUINT_TO_POINTER((guint) IF_EXTCAP)); + fill_in_local_interfaces_filtered(filter_list, main_window_update); + g_list_free(filter_list); + } + + if (global_commandline_info.list_link_layer_types) + caps_queries |= CAPS_QUERY_LINK_TYPES; + if (global_commandline_info.list_timestamp_types) + caps_queries |= CAPS_QUERY_TIMESTAMP_TYPES; + + if (global_commandline_info.start_capture || caps_queries) { + /* We're supposed to do a live capture or get a list of link-layer/timestamp + types for a live capture device; if the user didn't specify an + interface to use, pick a default. */ + ret_val = capture_opts_default_iface_if_necessary(&global_capture_opts, + ((global_commandline_info.prefs_p->capture_device) && (*global_commandline_info.prefs_p->capture_device != '\0')) ? get_if_name(global_commandline_info.prefs_p->capture_device) : NULL); + if (ret_val != 0) { + goto clean_exit; + } + } + + /* + * If requested, list the link layer types and/or time stamp types + * and exit. + */ + if (caps_queries) { + guint i; + +#ifdef _WIN32 + create_console(); +#endif /* _WIN32 */ + /* Get the list of link-layer types for the capture devices. */ + ret_val = EXIT_SUCCESS; + for (i = 0; i < global_capture_opts.ifaces->len; i++) { + interface_options *interface_opts; + if_capabilities_t *caps; + char *auth_str = NULL; + + interface_opts = &g_array_index(global_capture_opts.ifaces, interface_options, i); +#ifdef HAVE_PCAP_REMOTE + if (interface_opts->auth_type == CAPTURE_AUTH_PWD) { + auth_str = g_strdup_printf("%s:%s", interface_opts->auth_username, interface_opts->auth_password); + } +#endif + caps = capture_get_if_capabilities(interface_opts->name, interface_opts->monitor_mode, + auth_str, &err_str, &err_str_secondary, NULL); + g_free(auth_str); + if (caps == NULL) { + cmdarg_err("%s%s%s", err_str, err_str_secondary ? "\n" : "", err_str_secondary ? err_str_secondary : ""); + g_free(err_str); + g_free(err_str_secondary); + ret_val = WS_EXIT_INVALID_CAPABILITY; + break; + } + ret_val = capture_opts_print_if_capabilities(caps, interface_opts, + caps_queries); + free_if_capabilities(caps); + if (ret_val != EXIT_SUCCESS) { + break; + } + } +#ifdef _WIN32 + destroy_console(); +#endif /* _WIN32 */ + goto clean_exit; + } + + capture_opts_trim_snaplen(&global_capture_opts, MIN_PACKET_SIZE); + capture_opts_trim_ring_num_files(&global_capture_opts); +#endif /* HAVE_LIBPCAP */ + + /* Notify all registered modules that have had any of their preferences + changed either from one of the preferences file or from the command + line that their preferences have changed. */ +#ifdef DEBUG_STARTUP_TIME + ws_log(LOG_DOMAIN_MAIN, LOG_LEVEL_INFO, "Calling prefs_apply_all, elapsed time %" G_GUINT64_FORMAT " us \n", g_get_monotonic_time() - start_time); +#endif + prefs_apply_all(); + lwApp->emitAppSignal(LograyApplication::PreferencesChanged); + +#ifdef HAVE_LIBPCAP + if ((global_capture_opts.num_selected == 0) && + (prefs.capture_device != NULL)) { + guint i; + interface_t *device; + for (i = 0; i < global_capture_opts.all_ifaces->len; i++) { + device = &g_array_index(global_capture_opts.all_ifaces, interface_t, i); + if (!device->hidden && strcmp(device->display_name, prefs.capture_device) == 0) { + device->selected = TRUE; + global_capture_opts.num_selected++; + break; + } + } + } +#endif + + /* + * Enabled and disabled protocols and heuristic dissectors as per + * command-line options. + */ + if (!setup_enabled_and_disabled_protocols()) { + ret_val = WS_EXIT_INVALID_OPTION; + goto clean_exit; + } + + build_column_format_array(&CaptureFile::globalCapFile()->cinfo, global_commandline_info.prefs_p->num_cols, TRUE); + lwApp->emitAppSignal(LograyApplication::ColumnsChanged); // We read "recent" widths above. + lwApp->emitAppSignal(LograyApplication::RecentPreferencesRead); // Must be emitted after PreferencesChanged. + + lwApp->setMonospaceFont(prefs.gui_font_name); + + /* For update of WindowTitle (When use gui.window_title preference) */ + main_w->setWSWindowTitle(); + + if (!color_filters_init(&err_msg, color_filter_add_cb)) { + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg); + g_free(err_msg); + } + + lwApp->allSystemsGo(); + ws_log(LOG_DOMAIN_MAIN, LOG_LEVEL_INFO, "Logray is up and ready to go, elapsed time %.3fs", (float) (g_get_monotonic_time() - start_time) / 1000000); + SimpleDialog::displayQueuedMessages(main_w); + + /* User could specify filename, or display filter, or both */ + if (!dfilter.isEmpty()) + main_w->filterPackets(dfilter, false); + if (!cf_name.isEmpty()) { + if (main_w->openCaptureFile(cf_name, read_filter, in_file_type)) { + + /* Open stat windows; we do so after creating the main window, + to avoid Qt warnings, and after successfully opening the + capture file, so we know we have something to compute stats + on, and after registering all dissectors, so that MATE will + have registered its field array and we can have a tap filter + with one of MATE's late-registered fields as part of the + filter. */ + start_requested_stats(); + + if (global_commandline_info.go_to_packet != 0) { + /* Jump to the specified frame number, kept for backward + compatibility. */ + cf_goto_frame(CaptureFile::globalCapFile(), global_commandline_info.go_to_packet); + } else if (global_commandline_info.jfilter != NULL) { + dfilter_t *jump_to_filter = NULL; + /* try to compile given filter */ + if (!dfilter_compile(global_commandline_info.jfilter, &jump_to_filter, &df_err)) { + // Similar code in MainWindow::mergeCaptureFile(). + QMessageBox::warning(main_w, QObject::tr("Invalid Display Filter"), + QObject::tr("The filter expression %1 isn't a valid display filter. (%2).") + .arg(global_commandline_info.jfilter, df_err->msg), + QMessageBox::Ok); + df_error_free(&df_err); + } else { + /* Filter ok, jump to the first packet matching the filter + conditions. Default search direction is forward, but if + option d was given, search backwards */ + cf_find_packet_dfilter(CaptureFile::globalCapFile(), jump_to_filter, global_commandline_info.jump_backwards); + } + } + } + } +#ifdef HAVE_LIBPCAP + else { + if (global_commandline_info.start_capture) { + if (global_capture_opts.save_file != NULL) { + /* Save the directory name for future file dialogs. */ + /* (get_dirname overwrites filename) */ + gchar *s = g_strdup(global_capture_opts.save_file); + set_last_open_dir(get_dirname(s)); + g_free(s); + } + /* "-k" was specified; start a capture. */ + check_and_warn_user_startup(); + + /* If no user interfaces were specified on the command line, + copy the list of selected interfaces to the set of interfaces + to use for this capture. */ + if (global_capture_opts.ifaces->len == 0) + collect_ifaces(&global_capture_opts); + CaptureFile::globalCapFile()->window = main_w; + if (capture_start(&global_capture_opts, global_commandline_info.capture_comments, + main_w->captureSession(), main_w->captureInfoData(), + main_window_update)) { + /* The capture started. Open stat windows; we do so after creating + the main window, to avoid GTK warnings, and after successfully + opening the capture file, so we know we have something to compute + stats on, and after registering all dissectors, so that MATE will + have registered its field array and we can have a tap filter with + one of MATE's late-registered fields as part of the filter. */ + start_requested_stats(); + } + } + /* if the user didn't supply a capture filter, use the one to filter out remote connections like SSH */ + if (!global_commandline_info.start_capture && !global_capture_opts.default_options.cfilter) { + global_capture_opts.default_options.cfilter = g_strdup(get_conn_cfilter()); + } + } +#endif /* HAVE_LIBPCAP */ + + // UAT and UI settings files used in configuration profiles which are used + // in Qt dialogs are not registered during startup because they only get + // loaded when the dialog is shown. Register them here. + profile_register_persconffile("io_graphs"); + profile_register_persconffile("import_hexdump.json"); + + profile_store_persconffiles(FALSE); + + // If the lwApp->exec() event loop exits cleanly, we call + // LograyApplication::cleanup(). + ret_val = lwApp->exec(); + lwApp = NULL; + + // Many widgets assume that they always have valid epan data, so this + // must be called before epan_cleanup(). + // XXX We need to clean up the Lua GUI here. We currently paper over + // this in FunnelStatistics::~FunnelStatistics, which leaks memory. + delete main_w; + + recent_cleanup(); + epan_cleanup(); + + extcap_cleanup(); + + Dot11DecryptDestroyContext(&dot11decrypt_ctx); + + ws_cleanup_sockets(); + +#ifdef _WIN32 + /* For some unknown reason, the "atexit()" call in "create_console()" + doesn't arrange that "destroy_console()" be called when we exit, + so we call it here if a console was created. */ + destroy_console(); +#endif /* _WIN32 */ + +clean_exit: +#ifdef HAVE_LIBPCAP + capture_opts_cleanup(&global_capture_opts); +#endif + col_cleanup(&CaptureFile::globalCapFile()->cinfo); + codecs_cleanup(); + wtap_cleanup(); + free_progdirs(); + commandline_options_free(); + exit_application(ret_val); +} diff --git a/ui/logray/logray_main_window.cpp b/ui/logray/logray_main_window.cpp new file mode 100644 index 00000000..f7886daf --- /dev/null +++ b/ui/logray/logray_main_window.cpp @@ -0,0 +1,2919 @@ +/* logray_main_window.cpp + * + * Logray - Event log analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "main_application.h" +#include "logray_main_window.h" + +/* + * The generated Ui_LograyMainWindow::setupUi() can grow larger than our configured limit, + * so turn off -Wframe-larger-than= for ui_main_window.h. + */ +DIAG_OFF(frame-larger-than=) +#include <ui_logray_main_window.h> +DIAG_ON(frame-larger-than=) + +#include <epan/addr_resolv.h> +#include "epan/conversation_filter.h" +#include <epan/epan_dissect.h> +#include <wsutil/filesystem.h> +#include <wsutil/wslog.h> +#include <wsutil/ws_assert.h> +#include <wsutil/version_info.h> +#include <epan/prefs.h> +#include <epan/stats_tree_priv.h> +#include <epan/plugin_if.h> +#include <epan/export_object.h> +#include <frame_tvbuff.h> + +#include "ui/iface_toolbar.h" + +#ifdef HAVE_LIBPCAP +#include "ui/capture.h" +#include <capture/capture_session.h> +#endif + +#include "ui/alert_box.h" +#ifdef HAVE_LIBPCAP +#include "ui/capture_ui_utils.h" +#endif +#include "ui/capture_globals.h" +#include "ui/main_statusbar.h" +#include "ui/recent.h" +#include "ui/recent_utils.h" +#include "ui/util.h" +#include "ui/preference_utils.h" + +#include "byte_view_tab.h" +#ifdef HAVE_LIBPCAP +#include "capture_options_dialog.h" +#endif +#include "conversation_colorize_action.h" +#include "export_dissection_dialog.h" +#include "export_object_action.h" +#include "file_set_dialog.h" +#include "filter_dialog.h" +#include "funnel_statistics.h" +#include "import_text_dialog.h" +#include "interface_toolbar.h" +#include "packet_diagram.h" +#include "packet_list.h" +#include "proto_tree.h" +#include "simple_dialog.h" +#include "tap_parameter_dialog.h" + +#include <ui/qt/widgets/additional_toolbar.h> +#include <ui/qt/widgets/display_filter_edit.h> +#include <ui/qt/widgets/filter_expression_toolbar.h> + +#include <ui/qt/utils/color_utils.h> +#include <ui/qt/utils/qt_ui_utils.h> +#include <ui/qt/utils/stock_icon.h> +#include <ui/qt/utils/variant_pointer.h> + +#include <QAction> +#include <QActionGroup> +#include <QIntValidator> +#include <QKeyEvent> +#include <QList> +#include <QMessageBox> +#include <QMetaObject> +#include <QMimeData> +#include <QTabWidget> +#include <QTextCodec> +#include <QToolButton> +#include <QTreeWidget> +#include <QUrl> + +//menu_recent_file_write_all + +// If we ever add support for multiple windows this will need to be replaced. +static LograyMainWindow *gbl_cur_main_window_ = NULL; + +static void plugin_if_mainwindow_apply_filter(GHashTable * data_set) +{ + if (!gbl_cur_main_window_ || !data_set) + return; + + if (g_hash_table_lookup_extended(data_set, "filter_string", NULL, NULL)) { + QString filter((const char *)g_hash_table_lookup(data_set, "filter_string")); + gbl_cur_main_window_->filterPackets(filter); + } +} + +static void plugin_if_mainwindow_preference(GHashTable * data_set) +{ + if (!gbl_cur_main_window_ || !data_set) + return; + + const char * module_name; + const char * pref_name; + const char * pref_value; + +DIAG_OFF_CAST_AWAY_CONST + if (g_hash_table_lookup_extended(data_set, "pref_module", NULL, (gpointer *)&module_name) && + g_hash_table_lookup_extended(data_set, "pref_key", NULL, (gpointer *)&pref_name) && + g_hash_table_lookup_extended(data_set, "pref_value", NULL, (gpointer *)&pref_value)) + { + unsigned int changed_flags = prefs_store_ext(module_name, pref_name, pref_value); + if (changed_flags) { + mainApp->emitAppSignal(WiresharkApplication::PacketDissectionChanged); + mainApp->emitAppSignal(WiresharkApplication::PreferencesChanged); + } + } +DIAG_ON_CAST_AWAY_CONST +} + +static void plugin_if_mainwindow_gotoframe(GHashTable * data_set) +{ + if (!gbl_cur_main_window_ || !data_set) + return; + + gpointer framenr; + + if (g_hash_table_lookup_extended(data_set, "frame_nr", NULL, &framenr)) { + if (GPOINTER_TO_UINT(framenr) != 0) + gbl_cur_main_window_->gotoFrame(GPOINTER_TO_UINT(framenr)); + } +} + +#ifdef HAVE_LIBPCAP + +static void plugin_if_mainwindow_get_ws_info(GHashTable * data_set) +{ + if (!gbl_cur_main_window_ || !data_set) + return; + + ws_info_t *ws_info = NULL; + + if (!g_hash_table_lookup_extended(data_set, "ws_info", NULL, (void**)&ws_info)) + return; + + CaptureFile *cfWrap = gbl_cur_main_window_->captureFile(); + capture_file *cf = cfWrap->capFile(); + + ws_info->ws_info_supported = true; + + /* If we have a filename attached to ws_info clear it */ + if (ws_info->cf_filename != NULL) + { + g_free(ws_info->cf_filename); + ws_info->cf_filename = NULL; + } + + /* Determine the true state of the capture file. We return the true state in + the ws_info structure and DON'T CHANGE the cf->state as we don't want to cause problems + with code that follows this. */ + if (cf) + { + if (cf->filename) + { + /* As we have a cf->filename we'll use the name and the state */ + ws_info->cf_filename = g_strdup(cf->filename); + ws_info->cf_state = cf->state; + } + else + { + /* When we come through here the cf->state can show FILE_READ_DONE even though the + file is actually closed (no filename). A better fix would be to have a + FILE_CLOSE_PENDING state but that involves a lot of code change elsewhere. */ + ws_info->cf_state = FILE_CLOSED; + } + } + + if (!ws_info->cf_filename) + { + /* We may have a filename associated with the main window so let's use it */ + QString fileNameString = gbl_cur_main_window_->getMwFileName(); + if (fileNameString.length()) + { + QByteArray ba = fileNameString.toLatin1(); + const char *c_file_name = ba.data(); + ws_info->cf_filename = g_strdup(c_file_name); + } + } + + if (cf) { + ws_info->cf_count = cf->count; + + QList<int> rows = gbl_cur_main_window_->selectedRows(); + frame_data * fdata = NULL; + if (rows.count() > 0) + fdata = gbl_cur_main_window_->frameDataForRow(rows.at(0)); + + if (cf->state == FILE_READ_DONE && fdata) { + ws_info->cf_framenr = fdata->num; + ws_info->frame_passed_dfilter = (fdata->passed_dfilter == 1); + } + else { + ws_info->cf_framenr = 0; + ws_info->frame_passed_dfilter = FALSE; + } + } + else + { + /* Initialise the other ws_info structure values */ + ws_info->cf_count = 0; + ws_info->cf_framenr = 0; + ws_info->frame_passed_dfilter = FALSE; + } +} + +#endif /* HAVE_LIBPCAP */ + +static void plugin_if_mainwindow_get_frame_data(GHashTable* data_set) +{ + if (!gbl_cur_main_window_ || !data_set) + return; + + plugin_if_frame_data_cb extract_cb; + void* user_data; + void** ret_value_ptr; + + if (g_hash_table_lookup_extended(data_set, "extract_cb", NULL, (void**)&extract_cb) && + g_hash_table_lookup_extended(data_set, "user_data", NULL, (void**)&user_data) && + g_hash_table_lookup_extended(data_set, "ret_value_ptr", NULL, (void**)&ret_value_ptr)) + { + QList<int> rows = gbl_cur_main_window_->selectedRows(); + if (rows.count() > 0) { + frame_data* fdata = gbl_cur_main_window_->frameDataForRow(rows.at(0)); + if (fdata) { + *ret_value_ptr = extract_cb(fdata, user_data); + } + } + } +} + +static void plugin_if_mainwindow_get_capture_file(GHashTable* data_set) +{ + if (!gbl_cur_main_window_ || !data_set) + return; + + plugin_if_capture_file_cb extract_cb; + void* user_data; + void** ret_value_ptr; + + if (g_hash_table_lookup_extended(data_set, "extract_cb", NULL, (void**)&extract_cb) && + g_hash_table_lookup_extended(data_set, "user_data", NULL, (void**)&user_data) && + g_hash_table_lookup_extended(data_set, "ret_value_ptr", NULL, (void**)&ret_value_ptr)) + { + CaptureFile* cfWrap = gbl_cur_main_window_->captureFile(); + capture_file* cf = cfWrap->capFile(); + if (cf) { + *ret_value_ptr = extract_cb(cf, user_data); + } + } +} + +static void plugin_if_mainwindow_update_toolbars(GHashTable * data_set) +{ + if (!gbl_cur_main_window_ || !data_set) + return; + + if (g_hash_table_lookup_extended(data_set, "toolbar_name", NULL, NULL)) { + QString toolbarName((const char *)g_hash_table_lookup(data_set, "toolbar_name")); + gbl_cur_main_window_->removeAdditionalToolbar(toolbarName); + + } +} + +static void mainwindow_add_toolbar(const iface_toolbar *toolbar_entry) +{ + if (gbl_cur_main_window_ && toolbar_entry) + { + gbl_cur_main_window_->addInterfaceToolbar(toolbar_entry); + } +} + +static void mainwindow_remove_toolbar(const gchar *menu_title) +{ + if (gbl_cur_main_window_ && menu_title) + { + gbl_cur_main_window_->removeInterfaceToolbar(menu_title); + } +} + +QMenu* LograyMainWindow::findOrAddMenu(QMenu *parent_menu, QString& menu_text) { + QList<QAction *> actions = parent_menu->actions(); + QList<QAction *>::const_iterator i; + for (i = actions.constBegin(); i != actions.constEnd(); ++i) { + if ((*i)->text()==menu_text) { + return (*i)->menu(); + } + } + // If we get here there menu entry was not found, add a sub menu + return parent_menu->addMenu(menu_text); +} + +LograyMainWindow::LograyMainWindow(QWidget *parent) : + MainWindow(parent), + main_ui_(new Ui::LograyMainWindow), + previous_focus_(NULL), + file_set_dialog_(NULL), + show_hide_actions_(NULL), + time_display_actions_(NULL), + time_precision_actions_(NULL), + funnel_statistics_(NULL), + freeze_focus_(NULL), + was_maximized_(false), + capture_stopping_(false), + capture_filter_valid_(false) +#ifdef HAVE_LIBPCAP + , capture_options_dialog_(NULL) + , info_data_() +#endif +#if defined(Q_OS_MAC) + , dock_menu_(NULL) +#endif +{ + if (!gbl_cur_main_window_) { + connect(mainApp, SIGNAL(openStatCommandDialog(QString, const char*, void*)), + this, SLOT(openStatCommandDialog(QString, const char*, void*))); + connect(mainApp, SIGNAL(openTapParameterDialog(QString, const QString, void*)), + this, SLOT(openTapParameterDialog(QString, const QString, void*))); + } + gbl_cur_main_window_ = this; +#ifdef HAVE_LIBPCAP + capture_input_init(&cap_session_, CaptureFile::globalCapFile()); +#endif + + findTextCodecs(); + // setpUi calls QMetaObject::connectSlotsByName(this). connectSlotsByName + // iterates over *all* of our children, looking for matching "on_" slots. + // The fewer children we have at this point the better. + main_ui_->setupUi(this); +#ifdef HAVE_SOFTWARE_UPDATE + update_action_ = new QAction(tr("Check for Updates…"), main_ui_->menuHelp); +#endif + + menu_groups_ = QList<register_stat_group_t>() + << REGISTER_LOG_ANALYZE_GROUP_UNSORTED + << REGISTER_LOG_STAT_GROUP_UNSORTED; + + setWindowIcon(mainApp->normalIcon()); + setTitlebarForCaptureFile(); + setMenusForCaptureFile(); + setForCapturedPackets(false); + setMenusForFileSet(false); + interfaceSelectionChanged(); + loadWindowGeometry(); + +#ifndef HAVE_LUA + main_ui_->actionAnalyzeReloadLuaPlugins->setVisible(false); +#endif + + qRegisterMetaType<FilterAction::Action>("FilterAction::Action"); + qRegisterMetaType<FilterAction::ActionType>("FilterAction::ActionType"); + connect(this, SIGNAL(filterAction(QString, FilterAction::Action, FilterAction::ActionType)), + this, SLOT(queuedFilterAction(QString, FilterAction::Action, FilterAction::ActionType)), + Qt::QueuedConnection); + + //To prevent users use features before initialization complete + //Otherwise unexpected problems may occur + setFeaturesEnabled(false); + connect(mainApp, SIGNAL(appInitialized()), this, SLOT(setFeaturesEnabled())); + connect(mainApp, SIGNAL(appInitialized()), this, SLOT(applyGlobalCommandLineOptions())); + connect(mainApp, SIGNAL(appInitialized()), this, SLOT(zoomText())); + connect(mainApp, SIGNAL(appInitialized()), this, SLOT(initViewColorizeMenu())); + connect(mainApp, SIGNAL(appInitialized()), this, SLOT(addStatsPluginsToMenu())); + connect(mainApp, SIGNAL(appInitialized()), this, SLOT(addDynamicMenus())); + connect(mainApp, SIGNAL(appInitialized()), this, SLOT(addPluginIFStructures())); + connect(mainApp, SIGNAL(appInitialized()), this, SLOT(initConversationMenus())); + connect(mainApp, SIGNAL(appInitialized()), this, SLOT(initExportObjectsMenus())); + + connect(mainApp, SIGNAL(profileChanging()), this, SLOT(saveWindowGeometry())); + connect(mainApp, SIGNAL(preferencesChanged()), this, SLOT(layoutPanes())); + connect(mainApp, SIGNAL(preferencesChanged()), this, SLOT(layoutToolbars())); + connect(mainApp, SIGNAL(preferencesChanged()), this, SLOT(updatePreferenceActions())); + connect(mainApp, SIGNAL(preferencesChanged()), this, SLOT(zoomText())); + connect(mainApp, SIGNAL(preferencesChanged()), this, SLOT(setTitlebarForCaptureFile())); + + connect(mainApp, SIGNAL(updateRecentCaptureStatus(const QString &, qint64, bool)), this, SLOT(updateRecentCaptures())); + updateRecentCaptures(); + +#if defined(HAVE_SOFTWARE_UPDATE) && defined(Q_OS_WIN) + connect(mainApp, SIGNAL(softwareUpdateRequested()), this, SLOT(softwareUpdateRequested()), + Qt::BlockingQueuedConnection); +#endif + + df_combo_box_ = new DisplayFilterCombo(this); + + funnel_statistics_ = new FunnelStatistics(this, capture_file_); + connect(df_combo_box_, &QComboBox::editTextChanged, funnel_statistics_, &FunnelStatistics::displayFilterTextChanged); + connect(funnel_statistics_, &FunnelStatistics::setDisplayFilter, this, &LograyMainWindow::setDisplayFilter); + connect(funnel_statistics_, SIGNAL(openCaptureFile(QString, QString)), + this, SLOT(openCaptureFile(QString, QString))); + + file_set_dialog_ = new FileSetDialog(this); + connect(file_set_dialog_, SIGNAL(fileSetOpenCaptureFile(QString)), + this, SLOT(openCaptureFile(QString))); + + initMainToolbarIcons(); + + main_ui_->displayFilterToolBar->insertWidget(main_ui_->actionNewDisplayFilterExpression, df_combo_box_); + + // Make sure filter expressions overflow into a menu instead of a + // larger toolbar. We do this by adding them to a child toolbar. + // https://bugreports.qt.io/browse/QTBUG-2472 + FilterExpressionToolBar *filter_expression_toolbar_ = new FilterExpressionToolBar(this); + connect(filter_expression_toolbar_, &FilterExpressionToolBar::filterPreferences, this, &LograyMainWindow::onFilterPreferences); + connect(filter_expression_toolbar_, &FilterExpressionToolBar::filterSelected, this, &LograyMainWindow::onFilterSelected); + connect(filter_expression_toolbar_, &FilterExpressionToolBar::filterEdit, this, &LograyMainWindow::onFilterEdit); + + main_ui_->displayFilterToolBar->addWidget(filter_expression_toolbar_); + + main_ui_->goToFrame->hide(); + connect(main_ui_->goToFrame, SIGNAL(visibilityChanged(bool)), + main_ui_->actionGoGoToPacket, SLOT(setChecked(bool))); + + // XXX For some reason the cursor is drawn funny with an input mask set + // https://bugreports.qt-project.org/browse/QTBUG-7174 + + main_ui_->searchFrame->hide(); + connect(main_ui_->searchFrame, SIGNAL(visibilityChanged(bool)), + main_ui_->actionEditFindPacket, SLOT(setChecked(bool))); + + main_ui_->addressEditorFrame->hide(); + main_ui_->columnEditorFrame->hide(); + main_ui_->preferenceEditorFrame->hide(); + main_ui_->filterExpressionFrame->hide(); + +#ifndef HAVE_LIBPCAP + main_ui_->menuCapture->setEnabled(false); + main_ui_->actionCaptureStart->setEnabled(false); + main_ui_->actionCaptureStop->setEnabled(false); + main_ui_->actionCaptureRestart->setEnabled(false); + main_ui_->actionCaptureOptions->setEnabled(false); + main_ui_->actionCaptureRefreshInterfaces->setEnabled(false); +#endif + + // Set OS specific shortcuts for fullscreen mode +#if defined(Q_OS_MAC) + main_ui_->actionViewFullScreen->setShortcut(QKeySequence::FullScreen); +#else + main_ui_->actionViewFullScreen->setShortcut(QKeySequence(Qt::Key_F11)); +#endif + +#if defined(Q_OS_MAC) + + main_ui_->goToPacketLabel->setAttribute(Qt::WA_MacSmallSize, true); + main_ui_->goToLineEdit->setAttribute(Qt::WA_MacSmallSize, true); + main_ui_->goToGo->setAttribute(Qt::WA_MacSmallSize, true); + main_ui_->goToCancel->setAttribute(Qt::WA_MacSmallSize, true); + + main_ui_->actionEditPreferences->setMenuRole(QAction::PreferencesRole); + +#endif // Q_OS_MAC + + connect(main_ui_->goToGo, &QPushButton::pressed, this, &LograyMainWindow::goToGoClicked); + connect(main_ui_->goToCancel, &QPushButton::pressed, this, &LograyMainWindow::goToCancelClicked); + +// A billion-1 is equivalent to the inputMask 900000000 previously used +// Avoid QValidator::Intermediate values by using a top value of all 9's +#define MAX_GOTO_LINE 999999999 + +QIntValidator *goToLineQiv = new QIntValidator(0,MAX_GOTO_LINE,this); +main_ui_->goToLineEdit->setValidator(goToLineQiv); + +#ifdef HAVE_SOFTWARE_UPDATE + QAction *update_sep = main_ui_->menuHelp->insertSeparator(main_ui_->actionHelpAbout); + main_ui_->menuHelp->insertAction(update_sep, update_action_); + connect(update_action_, SIGNAL(triggered()), this, SLOT(checkForUpdates())); +#endif + master_split_.setObjectName("splitterMaster"); + extra_split_.setObjectName("splitterExtra"); + master_split_.setChildrenCollapsible(false); + extra_split_.setChildrenCollapsible(false); + main_ui_->mainStack->addWidget(&master_split_); + + empty_pane_.setObjectName("emptyPane"); + empty_pane_.setVisible(false); + + packet_list_ = new PacketList(&master_split_); + connect(packet_list_, SIGNAL(framesSelected(QList<int>)), this, SLOT(setMenusForSelectedPacket())); + connect(packet_list_, SIGNAL(framesSelected(QList<int>)), this, SIGNAL(framesSelected(QList<int>))); + + QAction *action = main_ui_->menuPacketComment->addAction(tr("Add New Comment…")); + connect(action, &QAction::triggered, this, &LograyMainWindow::addPacketComment); + action->setShortcut(QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_C)); + connect(main_ui_->menuPacketComment, SIGNAL(aboutToShow()), this, SLOT(setEditCommentsMenu())); + + proto_tree_ = new ProtoTree(&master_split_); + proto_tree_->installEventFilter(this); + + packet_list_->setProtoTree(proto_tree_); + packet_list_->installEventFilter(this); + + packet_diagram_ = new PacketDiagram(&master_split_); + + main_stack_ = main_ui_->mainStack; + welcome_page_ = main_ui_->welcomePage; + main_status_bar_ = main_ui_->statusBar; + + connect(proto_tree_, &ProtoTree::fieldSelected, + this, &LograyMainWindow::fieldSelected); + connect(packet_list_, &PacketList::fieldSelected, + this, &LograyMainWindow::fieldSelected); + connect(this, &LograyMainWindow::fieldSelected, + this, &LograyMainWindow::setMenusForSelectedTreeRow); + connect(this, &LograyMainWindow::fieldSelected, + main_ui_->statusBar, &MainStatusBar::selectedFieldChanged); + + connect(this, &LograyMainWindow::fieldHighlight, + main_ui_->statusBar, &MainStatusBar::highlightedFieldChanged); + connect(mainApp, &WiresharkApplication::captureActive, + this, &LograyMainWindow::captureActive); + + byte_view_tab_ = new ByteViewTab(&master_split_); + + // Packet list and proto tree must exist before these are called. + setMenusForSelectedPacket(); + setMenusForSelectedTreeRow(); + + initShowHideMainWidgets(); + initTimeDisplayFormatMenu(); + initTimePrecisionFormatMenu(); + initFreezeActions(); + updatePreferenceActions(); + updateRecentActions(); + setForCaptureInProgress(false); + + setTabOrder(df_combo_box_->lineEdit(), packet_list_); + setTabOrder(packet_list_, proto_tree_); + + connect(&capture_file_, SIGNAL(captureEvent(CaptureEvent)), + this, SLOT(captureEventHandler(CaptureEvent))); + connect(&capture_file_, SIGNAL(captureEvent(CaptureEvent)), + mainApp, SLOT(captureEventHandler(CaptureEvent))); + connect(&capture_file_, SIGNAL(captureEvent(CaptureEvent)), + main_ui_->statusBar, SLOT(captureEventHandler(CaptureEvent))); + + connect(mainApp, SIGNAL(freezePacketList(bool)), + packet_list_, SLOT(freezePacketList(bool))); + connect(mainApp, SIGNAL(columnsChanged()), + packet_list_, SLOT(columnsChanged())); + connect(mainApp, SIGNAL(preferencesChanged()), + packet_list_, SLOT(preferencesChanged())); + connect(mainApp, SIGNAL(recentPreferencesRead()), + this, SLOT(applyRecentPaneGeometry())); + connect(mainApp, SIGNAL(recentPreferencesRead()), + this, SLOT(updateRecentActions())); + connect(mainApp, SIGNAL(packetDissectionChanged()), + this, SLOT(redissectPackets()), Qt::QueuedConnection); + + connect(mainApp, SIGNAL(checkDisplayFilter()), + this, SLOT(checkDisplayFilter())); + connect(mainApp, SIGNAL(fieldsChanged()), + this, SLOT(fieldsChanged())); + connect(mainApp, SIGNAL(reloadLuaPlugins()), + this, SLOT(reloadLuaPlugins())); + + connect(main_ui_->mainStack, SIGNAL(currentChanged(int)), + this, SLOT(mainStackChanged(int))); + + connect(welcome_page_, SIGNAL(startCapture(QStringList)), + this, SLOT(startCapture(QStringList))); + connect(welcome_page_, SIGNAL(recentFileActivated(QString)), + this, SLOT(openCaptureFile(QString))); + + connect(main_ui_->addressEditorFrame, &AddressEditorFrame::redissectPackets, + this, &LograyMainWindow::redissectPackets); + connect(main_ui_->addressEditorFrame, &AddressEditorFrame::showNameResolutionPreferences, + this, &LograyMainWindow::showPreferencesDialog); + connect(main_ui_->preferenceEditorFrame, &PreferenceEditorFrame::showProtocolPreferences, + this, &LograyMainWindow::showPreferencesDialog); + connect(main_ui_->filterExpressionFrame, &FilterExpressionFrame::showPreferencesDialog, + this, &LograyMainWindow::showPreferencesDialog); + connect(main_ui_->filterExpressionFrame, &FilterExpressionFrame::filterExpressionsChanged, + filter_expression_toolbar_, &FilterExpressionToolBar::filterExpressionsChanged); + + /* Connect change of capture file */ + connect(this, &LograyMainWindow::setCaptureFile, + main_ui_->searchFrame, &SearchFrame::setCaptureFile); + connect(this, &LograyMainWindow::setCaptureFile, + main_ui_->statusBar, &MainStatusBar::setCaptureFile); + connect(this, &LograyMainWindow::setCaptureFile, + packet_list_, &PacketList::setCaptureFile); + connect(this, &LograyMainWindow::setCaptureFile, + proto_tree_, &ProtoTree::setCaptureFile); + + connect(mainApp, SIGNAL(zoomMonospaceFont(QFont)), + packet_list_, SLOT(setMonospaceFont(QFont))); + connect(mainApp, SIGNAL(zoomMonospaceFont(QFont)), + proto_tree_, SLOT(setMonospaceFont(QFont))); + + connectFileMenuActions(); + connectEditMenuActions(); + connectViewMenuActions(); + connectGoMenuActions(); + connectCaptureMenuActions(); + connectAnalyzeMenuActions(); + connectStatisticsMenuActions(); + connectHelpMenuActions(); + + connect(packet_list_, SIGNAL(packetDissectionChanged()), + this, SLOT(redissectPackets())); + connect(packet_list_, SIGNAL(showColumnPreferences(QString)), + this, SLOT(showPreferencesDialog(QString))); + connect(packet_list_, SIGNAL(showProtocolPreferences(QString)), + this, SLOT(showPreferencesDialog(QString))); + connect(packet_list_, SIGNAL(editProtocolPreference(preference*, pref_module*)), + main_ui_->preferenceEditorFrame, SLOT(editPreference(preference*, pref_module*))); + connect(packet_list_, SIGNAL(editColumn(int)), this, SLOT(showColumnEditor(int))); + connect(main_ui_->columnEditorFrame, SIGNAL(columnEdited()), + packet_list_, SLOT(columnsChanged())); + connect(packet_list_, SIGNAL(doubleClicked(QModelIndex)), + this, SLOT(openPacketDialog())); + connect(packet_list_, SIGNAL(packetListScrolled(bool)), + main_ui_->actionGoAutoScroll, SLOT(setChecked(bool))); + + connect(proto_tree_, SIGNAL(openPacketInNewWindow(bool)), + this, SLOT(openPacketDialog(bool))); + connect(proto_tree_, SIGNAL(showProtocolPreferences(QString)), + this, SLOT(showPreferencesDialog(QString))); + connect(proto_tree_, SIGNAL(editProtocolPreference(preference*, pref_module*)), + main_ui_->preferenceEditorFrame, SLOT(editPreference(preference*, pref_module*))); + + connect(main_ui_->statusBar, &MainStatusBar::showExpertInfo, this, [=]() { + statCommandExpertInfo(NULL, NULL); + }); + + connect(main_ui_->statusBar, &MainStatusBar::stopLoading, + &capture_file_, &CaptureFile::stopLoading); + + connect(main_ui_->statusBar, &MainStatusBar::editCaptureComment, + main_ui_->actionStatisticsCaptureFileProperties, &QAction::trigger); + + connect(main_ui_->menuApplyAsFilter, &QMenu::aboutToShow, + this, &LograyMainWindow::filterMenuAboutToShow); + connect(main_ui_->menuPrepareAFilter, &QMenu::aboutToShow, + this, &LograyMainWindow::filterMenuAboutToShow); + +#ifdef HAVE_LIBPCAP + QTreeWidget *iface_tree = findChild<QTreeWidget *>("interfaceTree"); + if (iface_tree) { + connect(iface_tree, SIGNAL(itemSelectionChanged()), + this, SLOT(interfaceSelectionChanged())); + } + connect(main_ui_->welcomePage, SIGNAL(captureFilterSyntaxChanged(bool)), + this, SLOT(captureFilterSyntaxChanged(bool))); + + connect(this, SIGNAL(showExtcapOptions(QString&, bool)), + this, SLOT(showExtcapOptionsDialog(QString&, bool))); + connect(this->welcome_page_, SIGNAL(showExtcapOptions(QString&, bool)), + this, SLOT(showExtcapOptionsDialog(QString&, bool))); + +#endif // HAVE_LIBPCAP + + /* Create plugin_if hooks */ + plugin_if_register_gui_cb(PLUGIN_IF_FILTER_ACTION_APPLY, plugin_if_mainwindow_apply_filter); + plugin_if_register_gui_cb(PLUGIN_IF_FILTER_ACTION_PREPARE, plugin_if_mainwindow_apply_filter); + plugin_if_register_gui_cb(PLUGIN_IF_PREFERENCE_SAVE, plugin_if_mainwindow_preference); + plugin_if_register_gui_cb(PLUGIN_IF_GOTO_FRAME, plugin_if_mainwindow_gotoframe); +#ifdef HAVE_LIBPCAP + plugin_if_register_gui_cb(PLUGIN_IF_GET_WS_INFO, plugin_if_mainwindow_get_ws_info); +#endif + plugin_if_register_gui_cb(PLUGIN_IF_GET_FRAME_DATA, plugin_if_mainwindow_get_frame_data); + plugin_if_register_gui_cb(PLUGIN_IF_GET_CAPTURE_FILE, plugin_if_mainwindow_get_capture_file); + plugin_if_register_gui_cb(PLUGIN_IF_REMOVE_TOOLBAR, plugin_if_mainwindow_update_toolbars); + + /* Register Interface Toolbar callbacks */ + iface_toolbar_register_cb(mainwindow_add_toolbar, mainwindow_remove_toolbar); + + /* Show tooltips on menu items that go to websites */ + main_ui_->actionHelpMPWireshark->setToolTip(gchar_free_to_qstring(topic_action_url(LOCALPAGE_MAN_WIRESHARK))); + main_ui_->actionHelpMPWireshark_Filter->setToolTip(gchar_free_to_qstring(topic_action_url(LOCALPAGE_MAN_WIRESHARK_FILTER))); + main_ui_->actionHelpMPCapinfos->setToolTip(gchar_free_to_qstring(topic_action_url(LOCALPAGE_MAN_CAPINFOS))); + main_ui_->actionHelpMPDumpcap->setToolTip(gchar_free_to_qstring(topic_action_url(LOCALPAGE_MAN_DUMPCAP))); + main_ui_->actionHelpMPEditcap->setToolTip(gchar_free_to_qstring(topic_action_url(LOCALPAGE_MAN_EDITCAP))); + main_ui_->actionHelpMPMergecap->setToolTip(gchar_free_to_qstring(topic_action_url(LOCALPAGE_MAN_MERGECAP))); + main_ui_->actionHelpMPRawshark->setToolTip(gchar_free_to_qstring(topic_action_url(LOCALPAGE_MAN_RAWSHARK))); + main_ui_->actionHelpMPReordercap->setToolTip(gchar_free_to_qstring(topic_action_url(LOCALPAGE_MAN_REORDERCAP))); + main_ui_->actionHelpMPText2pcap->setToolTip(gchar_free_to_qstring(topic_action_url(LOCALPAGE_MAN_TEXT2PCAP))); + main_ui_->actionHelpMPTShark->setToolTip(gchar_free_to_qstring(topic_action_url(LOCALPAGE_MAN_TSHARK))); + + main_ui_->actionHelpContents->setToolTip(gchar_free_to_qstring(topic_action_url(ONLINEPAGE_USERGUIDE))); + main_ui_->actionHelpWebsite->setToolTip(gchar_free_to_qstring(topic_action_url(ONLINEPAGE_HOME))); + main_ui_->actionHelpFAQ->setToolTip(gchar_free_to_qstring(topic_action_url(ONLINEPAGE_FAQ))); + main_ui_->actionHelpAsk->setToolTip(gchar_free_to_qstring(topic_action_url(ONLINEPAGE_ASK))); + main_ui_->actionHelpDownloads->setToolTip(gchar_free_to_qstring(topic_action_url(ONLINEPAGE_DOWNLOAD))); + main_ui_->actionHelpWiki->setToolTip(gchar_free_to_qstring(topic_action_url(ONLINEPAGE_WIKI))); + main_ui_->actionHelpSampleCaptures->setToolTip(gchar_free_to_qstring(topic_action_url(ONLINEPAGE_SAMPLE_CAPTURES))); + + showWelcome(); +} + +LograyMainWindow::~LograyMainWindow() +{ + disconnect(main_ui_->mainStack, 0, 0, 0); + +#ifndef Q_OS_MAC + // Below dialogs inherit GeometryStateDialog + // For reasons described in geometry_state_dialog.h no parent is set when + // instantiating the dialogs and as a resul objects are not automatically + // freed by its parent. Free then here explicitly to avoid leak and numerous + // Valgrind complaints. + delete file_set_dialog_; +#ifdef HAVE_LIBPCAP + delete capture_options_dialog_; +#endif + +#endif + delete main_ui_; +} + +QMenu *LograyMainWindow::createPopupMenu() +{ + QMenu *menu = new QMenu(); + menu->addAction(main_ui_->actionViewMainToolbar); + menu->addAction(main_ui_->actionViewFilterToolbar); + + if (!main_ui_->menuInterfaceToolbars->actions().isEmpty()) { + QMenu *submenu = menu->addMenu(main_ui_->menuInterfaceToolbars->title()); + foreach(QAction *action, main_ui_->menuInterfaceToolbars->actions()) { + submenu->addAction(action); + } + } + + if (!main_ui_->menuAdditionalToolbars->actions().isEmpty()) { + QMenu *subMenu = menu->addMenu(main_ui_->menuAdditionalToolbars->title()); + foreach(QAction *action, main_ui_->menuAdditionalToolbars->actions()) { + subMenu->addAction(action); + } + } + + menu->addAction(main_ui_->actionViewStatusBar); + + menu->addSeparator(); + menu->addAction(main_ui_->actionViewPacketList); + menu->addAction(main_ui_->actionViewPacketDetails); + menu->addAction(main_ui_->actionViewPacketBytes); + menu->addAction(main_ui_->actionViewPacketDiagram); + return menu; +} + +void LograyMainWindow::addInterfaceToolbar(const iface_toolbar *toolbar_entry) +{ + QMenu *menu = main_ui_->menuInterfaceToolbars; + bool visible = g_list_find_custom(recent.interface_toolbars, toolbar_entry->menu_title, (GCompareFunc)strcmp) ? true : false; + + QString title = QString().fromUtf8(toolbar_entry->menu_title); + QAction *action = new QAction(title, menu); + action->setEnabled(true); + action->setCheckable(true); + action->setChecked(visible); + action->setToolTip(tr("Show or hide the toolbar")); + + QAction *before = NULL; + foreach(QAction *action, menu->actions()) { + // Ensure we add the menu entries in sorted order + if (action->text().compare(title, Qt::CaseInsensitive) > 0) { + before = action; + break; + } + } + menu->insertAction(before, action); + + InterfaceToolbar *interface_toolbar = new InterfaceToolbar(this, toolbar_entry); + connect(mainApp, SIGNAL(appInitialized()), interface_toolbar, SLOT(interfaceListChanged())); + connect(mainApp, SIGNAL(localInterfaceListChanged()), interface_toolbar, SLOT(interfaceListChanged())); + + QToolBar *toolbar = new QToolBar(this); + toolbar->addWidget(interface_toolbar); + toolbar->setMovable(false); + toolbar->setVisible(visible); + + action->setData(QVariant::fromValue(toolbar)); + + addToolBar(Qt::TopToolBarArea, toolbar); + insertToolBarBreak(toolbar); + + if (show_hide_actions_) { + show_hide_actions_->addAction(action); + } + + menu->menuAction()->setVisible(true); +} + +void LograyMainWindow::removeInterfaceToolbar(const gchar *menu_title) +{ + QMenu *menu = main_ui_->menuInterfaceToolbars; + QAction *action = NULL; + QMap<QAction *, QWidget *>::iterator i; + + QString title = QString().fromUtf8(menu_title); + foreach(action, menu->actions()) { + if (title.compare(action->text()) == 0) { + break; + } + } + + if (action) { + if (show_hide_actions_) { + show_hide_actions_->removeAction(action); + } + menu->removeAction(action); + + QToolBar *toolbar = action->data().value<QToolBar *>(); + removeToolBar(toolbar); + + delete action; + delete toolbar; + } + + menu->menuAction()->setVisible(!menu->actions().isEmpty()); +} + +bool LograyMainWindow::eventFilter(QObject *obj, QEvent *event) { + + // The user typed some text. Start filling in a filter. + // We may need to be more choosy here. We just need to catch events for the packet list, + // proto tree, and main welcome widgets. + if (event->type() == QEvent::KeyPress) { + QKeyEvent *kevt = static_cast<QKeyEvent *>(event); + if (kevt->text().length() > 0 && kevt->text()[0].isPrint() && + !(kevt->modifiers() & Qt::ControlModifier)) { + df_combo_box_->lineEdit()->insert(kevt->text()); + df_combo_box_->lineEdit()->setFocus(); + return true; + } + } + + return QMainWindow::eventFilter(obj, event); +} + +bool LograyMainWindow::event(QEvent *event) +{ + switch (event->type()) { + case QEvent::ApplicationPaletteChange: + initMainToolbarIcons(); + break; + default: + break; + + } + return QMainWindow::event(event); +} + +void LograyMainWindow::keyPressEvent(QKeyEvent *event) { + + // Explicitly focus on the display filter combo. + if (event->modifiers() & Qt::ControlModifier && event->key() == Qt::Key_Slash) { + df_combo_box_->setFocus(Qt::ShortcutFocusReason); + return; + } + + if (mainApp->focusWidget() == main_ui_->goToLineEdit) { + if (event->modifiers() == Qt::NoModifier) { + if (event->key() == Qt::Key_Escape) { + goToCancelClicked(); + } else if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return) { + goToGoClicked(); + } + } + return; // goToLineEdit didn't want it and we don't either. + } + + // Move up & down the packet list. + if (event->key() == Qt::Key_F7) { + packet_list_->goPreviousPacket(); + } else if (event->key() == Qt::Key_F8) { + packet_list_->goNextPacket(); + } + + // Move along, citizen. + QMainWindow::keyPressEvent(event); +} + +void LograyMainWindow::closeEvent(QCloseEvent *event) { + saveWindowGeometry(); + + /* If we're in the middle of stopping a capture, don't do anything; + the user can try deleting the window after the capture stops. */ + if (capture_stopping_) { + event->ignore(); + return; + } + + QString before_what(tr(" before quitting")); + if (!testCaptureFileClose(before_what, Quit)) { + event->ignore(); + return; + } + +#ifdef HAVE_LIBPCAP + if (capture_options_dialog_) capture_options_dialog_->close(); +#endif + // Make sure we kill any open dumpcap processes. + delete welcome_page_; + + // One of the many places we assume one main window. + if (!mainApp->isInitialized()) { + // If we're still initializing, QCoreApplication::quit() won't + // exit properly because we are not in the event loop. This + // means that the application won't clean up after itself. We + // might want to call mainApp->processEvents() during startup + // instead so that we can do a normal exit here. + exit(0); + } + mainApp->quit(); + // When the main loop is not yet running (i.e. when openCaptureFile is + // executing in main.cpp), the above quit action has no effect. + // Schedule a quit action for the next execution of the main loop. + QMetaObject::invokeMethod(mainApp, "quit", Qt::QueuedConnection); +} + +// XXX On windows the drag description is "Copy". It should be "Open" or +// "Merge" as appropriate. It looks like we need access to IDataObject in +// order to set DROPDESCRIPTION. +void LograyMainWindow::dragEnterEvent(QDragEnterEvent *event) +{ + if (!event->mimeData()->hasUrls()) + { + event->ignore(); + return; + } + + if (!main_ui_->actionFileOpen->isEnabled()) { + // We could alternatively call setAcceptDrops(!capture_in_progress) + // in setMenusForCaptureInProgress but that wouldn't provide feedback. + + mainApp->pushStatus(WiresharkApplication::TemporaryStatus, tr("Unable to drop files during capture.")); + event->setDropAction(Qt::IgnoreAction); + event->ignore(); + return; + } + + bool have_files = false; + foreach(QUrl drag_url, event->mimeData()->urls()) { + if (!drag_url.toLocalFile().isEmpty()) { + have_files = true; + break; + } + } + + if (have_files) { + event->acceptProposedAction(); + } +} + +void LograyMainWindow::dropEvent(QDropEvent *event) +{ + if (!event->mimeData()->hasUrls()) + { + event->ignore(); + return; + } + + QList<QByteArray> local_files; + int max_dropped_files = 100; // Arbitrary + + foreach(QUrl drop_url, event->mimeData()->urls()) { + QString drop_file = drop_url.toLocalFile(); + if (!drop_file.isEmpty()) { + local_files << drop_file.toUtf8(); + if (local_files.size() >= max_dropped_files) { + break; + } + } + } + + event->acceptProposedAction(); + + if (local_files.size() < 1) { + event->ignore(); + return; + } + + event->accept(); + + if (local_files.size() == 1) { + openCaptureFile(local_files.at(0)); + return; + } + + const char **in_filenames = g_new(const char *, local_files.size()); + char *tmpname = NULL; + + for (int i = 0; i < local_files.size(); i++) { + in_filenames[i] = local_files.at(i).constData(); + } + + /* merge the files in chronological order */ + if (cf_merge_files_to_tempfile(this, global_capture_opts.temp_dir, &tmpname, static_cast<int>(local_files.size()), + in_filenames, + wtap_pcapng_file_type_subtype(), + FALSE) == CF_OK) { + /* Merge succeeded; close the currently-open file and try + to open the merged capture file. */ + openCaptureFile(tmpname, QString(), WTAP_TYPE_AUTO, TRUE); + } + + g_free(tmpname); + g_free(in_filenames); +} + +// Apply recent settings to the main window geometry. +// We haven't loaded the preferences at this point so we assume that the +// position and size preference are enabled. +// Note we might end up with unexpected screen geometries if the user +// unplugs or plugs in a monitor: +// https://bugreports.qt.io/browse/QTBUG-44213 +void LograyMainWindow::loadWindowGeometry() +{ + int min_sensible_dimension = 200; + +#ifndef Q_OS_MAC + if (recent.gui_geometry_main_maximized) { + setWindowState(Qt::WindowMaximized); + } else +#endif + { + QRect recent_geom(recent.gui_geometry_main_x, recent.gui_geometry_main_y, + recent.gui_geometry_main_width, recent.gui_geometry_main_height); + if (!rect_on_screen(recent_geom)) { + // We're not visible on any screens. See if we can move onscreen + // without resizing. + recent_geom.moveTo(50, 50); // recent.c defaults to 20. + } + + if (!rect_on_screen(recent_geom)) { + // Give up and use the default geometry. + return; + } + +// if (prefs.gui_geometry_save_position) { + move(recent_geom.topLeft()); +// } + + if (// prefs.gui_geometry_save_size && + recent_geom.width() > min_sensible_dimension && + recent_geom.height() > min_sensible_dimension) { + resize(recent_geom.size()); + } + } +} + +void LograyMainWindow::saveWindowGeometry() +{ + if (prefs.gui_geometry_save_position) { + recent.gui_geometry_main_x = pos().x(); + recent.gui_geometry_main_y = pos().y(); + } + + if (prefs.gui_geometry_save_size) { + recent.gui_geometry_main_width = size().width(); + recent.gui_geometry_main_height = size().height(); + } + + if (prefs.gui_geometry_save_maximized) { + // On macOS this is false when it shouldn't be + recent.gui_geometry_main_maximized = isMaximized(); + } + + if (master_split_.sizes().length() > 0) { + recent.gui_geometry_main_upper_pane = master_split_.sizes()[0]; + } + + if (master_split_.sizes().length() > 2) { + recent.gui_geometry_main_lower_pane = master_split_.sizes()[1]; + } else if (extra_split_.sizes().length() > 0) { + recent.gui_geometry_main_lower_pane = extra_split_.sizes()[0]; + } +} + +// Our event loop becomes nested whenever we call update_progress_dlg, which +// includes several places in file.c. The GTK+ UI stays out of trouble by +// showing a modal progress dialog. We attempt to do the equivalent below by +// disabling parts of the main window. At a minumum the ProgressFrame in the +// main status bar must remain accessible. +// +// We might want to do this any time the main status bar progress frame is +// shown and hidden. +void LograyMainWindow::freeze() +{ + freeze_focus_ = mainApp->focusWidget(); + + // XXX Alternatively we could just disable and enable the main menu. + for (int i = 0; i < freeze_actions_.size(); i++) { + QAction *action = freeze_actions_[i].first; + freeze_actions_[i].second = action->isEnabled(); + action->setEnabled(false); + } + main_ui_->centralWidget->setEnabled(false); +} + +void LograyMainWindow::thaw() +{ + main_ui_->centralWidget->setEnabled(true); + for (int i = 0; i < freeze_actions_.size(); i++) { + freeze_actions_[i].first->setEnabled(freeze_actions_[i].second); + } + + if (freeze_focus_) freeze_focus_->setFocus(); + freeze_focus_ = NULL; +} + +void LograyMainWindow::mergeCaptureFile() +{ + QString file_name = ""; + QString read_filter = ""; + dfilter_t *rfcode = NULL; + int err; + + if (!capture_file_.capFile()) + return; + + if (prefs.gui_ask_unsaved) { + if (cf_has_unsaved_data(capture_file_.capFile())) { + QMessageBox msg_dialog; + gchar *display_basename; + int response; + + msg_dialog.setIcon(QMessageBox::Question); + /* This file has unsaved data; ask the user whether to save + the capture. */ + if (capture_file_.capFile()->is_tempfile) { + msg_dialog.setText(tr("Save packets before merging?")); + msg_dialog.setInformativeText(tr("A temporary capture file can't be merged.")); + } else { + /* + * Format the message. + */ + display_basename = g_filename_display_basename(capture_file_.capFile()->filename); + msg_dialog.setText(QString(tr("Save changes in \"%1\" before merging?")).arg(display_basename)); + g_free(display_basename); + msg_dialog.setInformativeText(tr("Changes must be saved before the files can be merged.")); + } + + msg_dialog.setStandardButtons(QMessageBox::Save | QMessageBox::Cancel); + msg_dialog.setDefaultButton(QMessageBox::Save); + + response = msg_dialog.exec(); + + switch (response) { + + case QMessageBox::Save: + /* Save the file but don't close it */ + saveCaptureFile(capture_file_.capFile(), false); + break; + + case QMessageBox::Cancel: + default: + /* Don't do the merge. */ + return; + } + } + } + + for (;;) { + CaptureFileDialog merge_dlg(this, capture_file_.capFile()); + int file_type; + cf_status_t merge_status; + char *in_filenames[2]; + char *tmpname; + + if (merge_dlg.merge(file_name, read_filter)) { + df_error_t *df_err = NULL; + + if (!dfilter_compile(qUtf8Printable(read_filter), &rfcode, &df_err)) { + /* Not valid. Tell the user, and go back and run the file + selection box again once they dismiss the alert. */ + // Similar to commandline_info.jfilter section in main(). + QMessageBox::warning(this, tr("Invalid Read Filter"), + QString(tr("The filter expression %1 isn't a valid read filter. (%2).").arg(read_filter, df_err->msg)), + QMessageBox::Ok); + df_error_free(&df_err); + continue; + } + } else { + return; + } + + file_type = capture_file_.capFile()->cd_t; + + /* Try to merge or append the two files */ + if (merge_dlg.mergeType() == 0) { + /* chronological order */ + in_filenames[0] = g_strdup(capture_file_.capFile()->filename); + in_filenames[1] = qstring_strdup(file_name); + merge_status = cf_merge_files_to_tempfile(this, global_capture_opts.temp_dir, &tmpname, 2, in_filenames, file_type, FALSE); + } else if (merge_dlg.mergeType() <= 0) { + /* prepend file */ + in_filenames[0] = qstring_strdup(file_name); + in_filenames[1] = g_strdup(capture_file_.capFile()->filename); + merge_status = cf_merge_files_to_tempfile(this, global_capture_opts.temp_dir, &tmpname, 2, in_filenames, file_type, TRUE); + } else { + /* append file */ + in_filenames[0] = g_strdup(capture_file_.capFile()->filename); + in_filenames[1] = qstring_strdup(file_name); + merge_status = cf_merge_files_to_tempfile(this, global_capture_opts.temp_dir, &tmpname, 2, in_filenames, file_type, TRUE); + } + + g_free(in_filenames[0]); + g_free(in_filenames[1]); + + if (merge_status != CF_OK) { + dfilter_free(rfcode); + g_free(tmpname); + continue; + } + + cf_close(capture_file_.capFile()); + + /* Try to open the merged capture file. */ + CaptureFile::globalCapFile()->window = this; + if (cf_open(CaptureFile::globalCapFile(), tmpname, WTAP_TYPE_AUTO, TRUE /* temporary file */, &err) != CF_OK) { + /* We couldn't open it; fail. */ + CaptureFile::globalCapFile()->window = NULL; + dfilter_free(rfcode); + g_free(tmpname); + return; + } + + /* Attach the new read filter to "cf" ("cf_open()" succeeded, so + it closed the previous capture file, and thus destroyed any + previous read filter attached to "cf"). */ + cf_set_rfcode(CaptureFile::globalCapFile(), rfcode); + + switch (cf_read(CaptureFile::globalCapFile(), /*reloading=*/FALSE)) { + + case CF_READ_OK: + case CF_READ_ERROR: + /* Just because we got an error, that doesn't mean we were unable + to read any of the file; we handle what we could get from the + file. */ + break; + + case CF_READ_ABORTED: + /* The user bailed out of re-reading the capture file; the + capture file has been closed - just free the capture file name + string and return (without changing the last containing + directory). */ + g_free(tmpname); + return; + } + + /* Save the name of the containing directory specified in the path name. */ + mainApp->setLastOpenDirFromFilename(tmpname); + g_free(tmpname); + main_ui_->statusBar->showExpert(); + return; + } + +} + +void LograyMainWindow::importCaptureFile() { + ImportTextDialog import_dlg; + + QString before_what(tr(" before importing a capture")); + if (!testCaptureFileClose(before_what)) + return; + + import_dlg.exec(); + + if (import_dlg.result() != QDialog::Accepted) { + showWelcome(); + return; + } + + openCaptureFile(import_dlg.capfileName()); +} + +bool LograyMainWindow::saveCaptureFile(capture_file *cf, bool dont_reopen) { + QString file_name; + gboolean discard_comments; + + if (cf->is_tempfile) { + /* This is a temporary capture file, so saving it means saving + it to a permanent file. Prompt the user for a location + to which to save it. Don't require that the file format + support comments - if it's a temporary capture file, it's + probably pcapng, which supports comments and, if it's + not pcapng, let the user decide what they want to do + if they've added comments. */ + return saveAsCaptureFile(cf, FALSE, dont_reopen); + } else { + if (cf->unsaved_changes) { + cf_write_status_t status; + + /* This is not a temporary capture file, but it has unsaved + changes, so saving it means doing a "safe save" on top + of the existing file, in the same format - no UI needed + unless the file has comments and the file's format doesn't + support them. + + If the file has comments, does the file's format support them? + If not, ask the user whether they want to discard the comments + or choose a different format. */ + switch (CaptureFileDialog::checkSaveAsWithComments(this, cf, cf->cd_t)) { + + case SAVE: + /* The file can be saved in the specified format as is; + just drive on and save in the format they selected. */ + discard_comments = FALSE; + break; + + case SAVE_WITHOUT_COMMENTS: + /* The file can't be saved in the specified format as is, + but it can be saved without the comments, and the user + said "OK, discard the comments", so save it in the + format they specified without the comments. */ + discard_comments = TRUE; + break; + + case SAVE_IN_ANOTHER_FORMAT: + /* There are file formats in which we can save this that + support comments, and the user said not to delete the + comments. Do a "Save As" so the user can select + one of those formats and choose a file name. */ + return saveAsCaptureFile(cf, TRUE, dont_reopen); + + case CANCELLED: + /* The user said "forget it". Just return. */ + return false; + + default: + /* Squelch warnings that discard_comments is being used + uninitialized. */ + ws_assert_not_reached(); + return false; + } + + /* XXX - cf->filename might get freed out from under us, because + the code path through which cf_save_records() goes currently + closes the current file and then opens and reloads the saved file, + so make a copy and free it later. */ + file_name = cf->filename; + status = cf_save_records(cf, qUtf8Printable(file_name), cf->cd_t, cf->compression_type, + discard_comments, dont_reopen); + switch (status) { + + case CF_WRITE_OK: + /* The save succeeded; we're done. + If we discarded comments, redraw the packet list to reflect + any packets that no longer have comments. If we had unsaved + changes, redraw the packet list, because saving a time + shift zeroes out the frame.offset_shift field. + If we had a color filter based on frame data, recolor. */ + /* XXX: If there is a filter based on those, we want to force + a rescan with the current filter (we don't actually + need to redissect.) + */ + if (discard_comments || cf->unsaved_changes) { + if (color_filters_use_proto(proto_get_id_by_filter_name("frame"))) { + packet_list_->recolorPackets(); + } else { + packet_list_->redrawVisiblePackets(); + } + } + + cf->unsaved_changes = false; //we just saved so we signal that we have no unsaved changes + updateForUnsavedChanges(); // we update the title bar to remove the * + break; + + case CF_WRITE_ERROR: + /* The write failed. + XXX - OK, what do we do now? Let them try a + "Save As", in case they want to try to save to a + different directory or file system? */ + break; + + case CF_WRITE_ABORTED: + /* The write was aborted; just drive on. */ + return false; + } + } + /* Otherwise just do nothing. */ + } + + return true; +} + +bool LograyMainWindow::saveAsCaptureFile(capture_file *cf, bool must_support_comments, bool dont_reopen) { + QString file_name = ""; + int file_type; + wtap_compression_type compression_type; + cf_write_status_t status; + gchar *dirname; + gboolean discard_comments = FALSE; + + if (!cf) { + return false; + } + + for (;;) { + CaptureFileDialog save_as_dlg(this, cf); + + /* If the file has comments, does the format the user selected + support them? If not, ask the user whether they want to + discard the comments or choose a different format. */ + switch (save_as_dlg.saveAs(file_name, must_support_comments)) { + + case SAVE: + /* The file can be saved in the specified format as is; + just drive on and save in the format they selected. */ + discard_comments = FALSE; + break; + + case SAVE_WITHOUT_COMMENTS: + /* The file can't be saved in the specified format as is, + but it can be saved without the comments, and the user + said "OK, discard the comments", so save it in the + format they specified without the comments. */ + discard_comments = TRUE; + break; + + case SAVE_IN_ANOTHER_FORMAT: + /* There are file formats in which we can save this that + support comments, and the user said not to delete the + comments. The combo box of file formats has had the + formats that don't support comments trimmed from it, + so run the dialog again, to let the user decide + whether to save in one of those formats or give up. */ + must_support_comments = TRUE; + continue; + + case CANCELLED: + /* The user said "forget it". Just get rid of the dialog box + and return. */ + return false; + } + file_type = save_as_dlg.selectedFileType(); + if (file_type == WTAP_FILE_TYPE_SUBTYPE_UNKNOWN) { + /* This "should not happen". */ + QMessageBox msg_dialog; + + msg_dialog.setIcon(QMessageBox::Critical); + msg_dialog.setText(tr("Unknown file type returned by merge dialog.")); + msg_dialog.setInformativeText(tr("Please report this as a Wireshark issue at https://gitlab.com/wireshark/wireshark/-/issues.")); + msg_dialog.exec(); + return false; + } + compression_type = save_as_dlg.compressionType(); + +#ifdef Q_OS_WIN + // the Windows dialog does not fixup extensions, do it manually here. + fileAddExtension(file_name, file_type, compression_type); +#endif // Q_OS_WIN + +//#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, qUtf8Printable(file_name))) { +// /* They don't. Let them try another file name or cancel. */ +// continue; +// } +//#endif + + /* Attempt to save the file */ + status = cf_save_records(cf, qUtf8Printable(file_name), file_type, compression_type, + discard_comments, dont_reopen); + switch (status) { + + case CF_WRITE_OK: + /* The save succeeded; we're done. */ + /* Save the directory name for future file dialogs. */ + dirname = qstring_strdup(file_name); /* Overwrites cf_name */ + set_last_open_dir(get_dirname(dirname)); + g_free(dirname); + /* If we discarded comments, redraw the packet list to reflect + any packets that no longer have comments. If we had unsaved + changes, redraw the packet list, because saving a time + shift zeroes out the frame.offset_shift field. + If we had a color filter based on frame data, recolor. */ + /* XXX: If there is a filter based on those, we want to force + a rescan with the current filter (we don't actually + need to redissect.) + */ + if (discard_comments || cf->unsaved_changes) { + if (color_filters_use_proto(proto_get_id_by_filter_name("frame"))) { + packet_list_->recolorPackets(); + } else { + packet_list_->redrawVisiblePackets(); + } + } + + cf->unsaved_changes = false; //we just saved so we signal that we have no unsaved changes + updateForUnsavedChanges(); // we update the title bar to remove the * + /* Add this filename to the list of recent files in the "Recent Files" submenu */ + add_menu_recent_capture_file(qUtf8Printable(file_name)); + return true; + + 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 false; + } + } + return true; +} + +void LograyMainWindow::exportSelectedPackets() { + QString file_name = ""; + int file_type; + wtap_compression_type compression_type; + packet_range_t range; + cf_write_status_t status; + gchar *dirname; + bool discard_comments = false; + + if (!capture_file_.capFile()) + return; + + /* Init the packet range */ + packet_range_init(&range, capture_file_.capFile()); + range.process_filtered = TRUE; + range.include_dependents = TRUE; + + QList<int> rows = packet_list_->selectedRows(true); + + QStringList entries; + foreach (int row, rows) + entries << QString::number(row); + QString selRange = entries.join(","); + + for (;;) { + CaptureFileDialog esp_dlg(this, capture_file_.capFile()); + + /* If the file has comments, does the format the user selected + support them? If not, ask the user whether they want to + discard the comments or choose a different format. */ + switch (esp_dlg.exportSelectedPackets(file_name, &range, selRange)) { + + case SAVE: + /* The file can be saved in the specified format as is; + just drive on and save in the format they selected. */ + discard_comments = FALSE; + break; + + case SAVE_WITHOUT_COMMENTS: + /* The file can't be saved in the specified format as is, + but it can be saved without the comments, and the user + said "OK, discard the comments", so save it in the + format they specified without the comments. */ + discard_comments = TRUE; + break; + + case SAVE_IN_ANOTHER_FORMAT: + /* There are file formats in which we can save this that + support comments, and the user said not to delete the + comments. The combo box of file formats has had the + formats that don't support comments trimmed from it, + so run the dialog again, to let the user decide + whether to save in one of those formats or give up. */ + continue; + + case CANCELLED: + /* The user said "forget it". Just get rid of the dialog box + and return. */ + goto cleanup; + } + + /* + * 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(capture_file_.capFile()->filename, qUtf8Printable(file_name))) { + QMessageBox msg_box; + gchar *display_basename = g_filename_display_basename(qUtf8Printable(file_name)); + + msg_box.setIcon(QMessageBox::Critical); + msg_box.setText(QString(tr("Unable to export to \"%1\".").arg(display_basename))); + msg_box.setInformativeText(tr("You cannot export packets to the current capture file.")); + msg_box.setStandardButtons(QMessageBox::Ok); + msg_box.setDefaultButton(QMessageBox::Ok); + msg_box.exec(); + g_free(display_basename); + continue; + } + + file_type = esp_dlg.selectedFileType(); + if (file_type == WTAP_FILE_TYPE_SUBTYPE_UNKNOWN) { + /* This "should not happen". */ + QMessageBox msg_box; + + msg_box.setIcon(QMessageBox::Critical); + msg_box.setText(tr("Unknown file type returned by export dialog.")); + msg_box.setInformativeText(tr("Please report this as a Wireshark issue at https://gitlab.com/wireshark/wireshark/-/issues.")); + msg_box.exec(); + goto cleanup; + } + compression_type = esp_dlg.compressionType(); +#ifdef Q_OS_WIN + // the Windows dialog does not fixup extensions, do it manually here. + fileAddExtension(file_name, file_type, compression_type); +#endif // Q_OS_WIN + +//#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, qUtf8Printable(file_name))) { +// /* They don't. Let them try another file name or cancel. */ +// continue; +// } +//#endif + + /* Attempt to save the file */ + status = cf_export_specified_packets(capture_file_.capFile(), qUtf8Printable(file_name), &range, file_type, compression_type); + switch (status) { + + case CF_WRITE_OK: + /* The save succeeded; we're done. */ + /* Save the directory name for future file dialogs. */ + dirname = qstring_strdup(file_name); /* Overwrites cf_name */ + set_last_open_dir(get_dirname(dirname)); + g_free(dirname); + /* If we discarded comments, redraw the packet list to reflect + any packets that no longer have comments. */ + /* XXX: Why? We're exporting some packets to a new file but not + changing our current capture file, that shouldn't change the + current packet list. */ + if (discard_comments) + packet_list_->redrawVisiblePackets(); + /* Add this filename to the list of recent files in the "Recent Files" submenu */ + add_menu_recent_capture_file(qUtf8Printable(file_name)); + goto cleanup; + + case CF_WRITE_ERROR: + /* The save failed; let the user try again. */ + continue; + + case CF_WRITE_ABORTED: + /* The user aborted the save; just return. */ + goto cleanup; + } + } + +cleanup: + packet_range_cleanup(&range); +} + +void LograyMainWindow::exportDissections(export_type_e export_type) { + capture_file *cf = capture_file_.capFile(); + g_return_if_fail(cf); + + QList<int> rows = packet_list_->selectedRows(true); + + QStringList entries; + foreach (int row, rows) + entries << QString::number(row); + QString selRange = entries.join(","); + + ExportDissectionDialog *ed_dlg = new ExportDissectionDialog(this, cf, export_type, selRange); + ed_dlg->setWindowModality(Qt::ApplicationModal); + ed_dlg->setAttribute(Qt::WA_DeleteOnClose); + ed_dlg->show(); +} + +#ifdef Q_OS_WIN +/* + * Ensure that: + * + * If the file is to be compressed: + * + * if there is a set of extensions used by the file type to be used, + * the file name has one of those extensions followed by the extension + * for the compression type to be used; + * + * otherwise, the file name has the extension for the compression type + * to be used; + * + * otherwise: + * + * if there is a set of extensions used by the file type to be used, + * the file name has one of those extensions. + */ +void LograyMainWindow::fileAddExtension(QString &file_name, int file_type, wtap_compression_type compression_type) { + QString file_name_lower; + GSList *extensions_list; + const char *compressed_file_extension; + gboolean add_extension_for_file_type; + + /* Lower-case the file name, so the extension matching is case-insensitive. */ + file_name_lower = file_name.toLower(); + + /* Get a list of all extensions used for this file type; don't + include the ones with compression type extensions, as we + only want to check for the extension for the compression + type we'll be using. */ + extensions_list = wtap_get_file_extensions_list(file_type, FALSE); + + /* Get the extension for the compression type we'll be using; + NULL is returned if the type isn't supported or compression + is not being done. */ + compressed_file_extension = wtap_compression_type_extension(compression_type); + + if (extensions_list != NULL) { + GSList *extension; + + /* This file type has one or more extensions. + Start out assuming we need to add the default one. */ + add_extension_for_file_type = TRUE; + + /* OK, see if the file has one of those extensions, followed + by the appropriate compression type extension if it's to be + compressed. */ + for (extension = extensions_list; extension != NULL; + extension = g_slist_next(extension)) { + QString file_suffix = QString(".") + (char *)extension->data; + if (compressed_file_extension != NULL) + file_suffix += QString(".") + compressed_file_extension; + if (file_name_lower.endsWith(file_suffix)) { + /* + * The file name has one of the extensions for this file + * type, followed by a compression type extension if + * appropriate, so we don't need to add an extension for + * the file type or the compression type. + */ + add_extension_for_file_type = FALSE; + break; + } + } + } else { + /* We have no extensions for this file type. Just check + to see if we need to add an extension for the compressed + file type. + + Start out assuming we do. */ + add_extension_for_file_type = TRUE; + if (compressed_file_extension != NULL) { + QString file_suffix = QString(".") + compressed_file_extension; + if (file_name_lower.endsWith(file_suffix)) { + /* + * The file name has the appropriate compressed file extension, + * so we don't need to add an extension for the compression + * type. + */ + add_extension_for_file_type = FALSE; + } + } + } + + /* + * If we need to add an extension for the file type or compressed + * file type, do so. + */ + if (add_extension_for_file_type) { + if (wtap_default_file_extension(file_type) != NULL) { + /* This file type has a default extension; append it. */ + file_name += QString(".") + wtap_default_file_extension(file_type); + } + if (compression_type != WTAP_UNCOMPRESSED) { + /* + * The file is to be compressed, so append the extension for + * its compression type. + */ + file_name += QString(".") + compressed_file_extension; + } + } +} +#endif // Q_OS_WIN + +bool LograyMainWindow::testCaptureFileClose(QString before_what, FileCloseContext context) { + bool capture_in_progress = false; + bool do_close_file = false; + + if (!capture_file_.capFile() || capture_file_.capFile()->state == FILE_CLOSED) + return true; /* Already closed, nothing to do */ + + if (capture_file_.capFile()->read_lock) { + /* + * If the file is being redissected, we cannot stop the capture since + * that would crash and burn "cf_read", so stop early. Ideally all + * callers should be modified to check this condition and act + * accordingly (ignore action or queue it up), so print a warning. + */ + ws_warning("Refusing to close \"%s\" which is being read.", capture_file_.capFile()->filename); + return false; + } + +#ifdef HAVE_LIBPCAP + if (capture_file_.capFile()->state == FILE_READ_IN_PROGRESS || + capture_file_.capFile()->state == FILE_READ_PENDING) { + /* + * FILE_READ_IN_PROGRESS is true if we're reading a capture file + * *or* if we're doing a live capture. From the capture file itself we + * cannot differentiate the cases, so check the current capture session. + * FILE_READ_PENDING is only used for a live capture, but it doesn't + * hurt to check it here. + */ + capture_in_progress = captureSession()->state != CAPTURE_STOPPED; + } +#endif + + if (prefs.gui_ask_unsaved) { + if (cf_has_unsaved_data(capture_file_.capFile())) { + if (context == Update) { + // We're being called from the software update window; + // don't spawn yet another dialog. Just try again later. + // XXX: The WinSparkle dialogs *aren't* modal, and a user + // can bring Wireshark to the foreground, close/save the + // file, and then click "Install Update" again, but it + // seems like many users don't expect that (and also don't + // know that Help->Check for Updates... exist, only knowing + // about the automatic check.) See #17658 and duplicates. + // Maybe we *should* spawn the dialog? + return false; + } + + QMessageBox msg_dialog; + QString question; + QString infotext; + QPushButton *save_button; + QPushButton *discard_button; + + msg_dialog.setIcon(QMessageBox::Question); + msg_dialog.setWindowTitle("Unsaved packets" UTF8_HORIZONTAL_ELLIPSIS); + + /* This file has unsaved data or there's a capture in + progress; ask the user whether to save the data. */ + if (capture_in_progress && context != Restart) { + question = tr("Do you want to stop the capture and save the captured packets%1?").arg(before_what); + infotext = tr("Your captured packets will be lost if you don't save them."); + } else if (capture_file_.capFile()->is_tempfile) { + if (context == Reload) { + // Reloading a tempfile will keep the packets, so this is not unsaved packets + question = tr("Do you want to save the changes you've made%1?").arg(before_what); + infotext = tr("Your changes will be lost if you don't save them."); + } else { + question = tr("Do you want to save the captured packets%1?").arg(before_what); + infotext = tr("Your captured packets will be lost if you don't save them."); + } + } else { + // No capture in progress and not a tempfile, so this is not unsaved packets + gchar *display_basename = g_filename_display_basename(capture_file_.capFile()->filename); + question = tr("Do you want to save the changes you've made to the capture file \"%1\"%2?").arg(display_basename, before_what); + infotext = tr("Your changes will be lost if you don't save them."); + g_free(display_basename); + } + + msg_dialog.setText(question); + msg_dialog.setInformativeText(infotext); + + // XXX Text comes from ui/gtk/stock_icons.[ch] + // Note that the button roles differ from the GTK+ version. + // Cancel = RejectRole + // Save = AcceptRole + // Don't Save = DestructiveRole + msg_dialog.addButton(QMessageBox::Cancel); + + if (capture_in_progress) { + QString save_button_text; + if (context == Restart) { + save_button_text = tr("Save before Continue"); + } else { + save_button_text = tr("Stop and Save"); + } + save_button = msg_dialog.addButton(save_button_text, QMessageBox::AcceptRole); + } else { + save_button = msg_dialog.addButton(QMessageBox::Save); + } + msg_dialog.setDefaultButton(save_button); + + QString discard_button_text; + if (capture_in_progress) { + switch (context) { + case Quit: + discard_button_text = tr("Stop and Quit &without Saving"); + break; + case Restart: + discard_button_text = tr("Continue &without Saving"); + break; + default: + discard_button_text = tr("Stop and Continue &without Saving"); + break; + } + } else { + switch (context) { + case Quit: + discard_button_text = tr("Quit &without Saving"); + break; + case Restart: + default: + discard_button_text = tr("Continue &without Saving"); + break; + } + } + discard_button = msg_dialog.addButton(discard_button_text, QMessageBox::DestructiveRole); + +#if defined(Q_OS_MAC) + /* + * In macOS, the "default button" is not necessarily the + * button that has the input focus; Enter/Return activates + * the default button, and the spacebar activates the button + * that has the input focus, and they might be different + * buttons. + * + * In a "do you want to save" dialog, for example, the + * "save" button is the default button, and the "don't + * save" button has the input focus, so you can press + * Enter/Return to save or space not to save (or Escape + * to dismiss the dialog). + * + * In Qt terms, this means "no auto-default", as auto-default + * makes the button with the input focus the default button, + * so that Enter/Return will activate it. + */ + QList<QAbstractButton *> buttons = msg_dialog.buttons(); + for (int i = 0; i < buttons.size(); ++i) { + QPushButton *button = static_cast<QPushButton *>(buttons.at(i));; + button->setAutoDefault(false); + } + + /* + * It also means that the "don't save" button should be the one + * initially given the focus. + */ + discard_button->setFocus(); +#endif + + msg_dialog.exec(); + /* According to the Qt doc: + * when using QMessageBox with custom buttons, exec() function returns an opaque value. + * + * Therefore we should use clickedButton() to determine which button was clicked. */ + + if (msg_dialog.clickedButton() == save_button) { +#ifdef HAVE_LIBPCAP + /* If there's a capture in progress, we have to stop the capture + and then do the save. */ + if (capture_in_progress) + captureStop(); +#endif + /* Save the file and close it */ + // XXX if no packets were captured, any unsaved comments set by + // the user are silently discarded because capFile() is null. + if (capture_file_.capFile() && saveCaptureFile(capture_file_.capFile(), true) == false) + return false; + do_close_file = true; + } else if (msg_dialog.clickedButton() == discard_button) { + /* Just close the file, discarding changes */ + do_close_file = true; + } else { + // cancelButton or some other unspecified button + return false; + } + } else { + /* Unchanged file or capturing with no packets */ + do_close_file = true; + } + } else { + /* User asked not to be bothered by those prompts, just close it. + XXX - should that apply only to saving temporary files? */ + do_close_file = true; + } + + /* + * Are we done with this file and should we close the file? + */ + if (do_close_file) { +#ifdef HAVE_LIBPCAP + /* If there's a capture in progress, we have to stop the capture + and then do the close. */ + if (capture_in_progress) + captureStop(); + else if (capture_file_.capFile() && capture_file_.capFile()->state == FILE_READ_IN_PROGRESS) { + /* + * When an offline capture is being read, mark it as aborted. + * cf_read will be responsible for actually closing the capture. + * + * We cannot just invoke cf_close here since cf_read is up in the + * call chain. (update_progress_dlg can end up processing the Quit + * event from the user which then ends up here.) + * See also the above "read_lock" check. + */ + capture_file_.capFile()->state = FILE_READ_ABORTED; + return true; + } +#endif + /* Clear MainWindow file name details */ + gbl_cur_main_window_->setMwFileName(""); + + /* captureStop() will close the file if not having any packets */ + if (capture_file_.capFile() && context != Restart && context != Reload) + // Don't really close if Restart or Reload + cf_close(capture_file_.capFile()); + } + + return true; /* File closed */ +} + +void LograyMainWindow::captureStop() { + stopCapture(); + + while (capture_file_.capFile() && (capture_file_.capFile()->state == FILE_READ_IN_PROGRESS || + capture_file_.capFile()->state == FILE_READ_PENDING)) { + WiresharkApplication::processEvents(); + } +} + +void LograyMainWindow::findTextCodecs() { + const QList<int> mibs = QTextCodec::availableMibs(); + QRegularExpression ibmRegExp("^IBM([0-9]+).*$"); + QRegularExpression iso8859RegExp("^ISO-8859-([0-9]+).*$"); + QRegularExpression windowsRegExp("^WINDOWS-([0-9]+).*$"); + QRegularExpressionMatch match; + for (int mib : mibs) { + QTextCodec *codec = QTextCodec::codecForMib(mib); + // QTextCodec::availableMibs() returns a list of hard-coded MIB + // numbers, it doesn't check if they are really available. ICU data may + // not have been compiled with support for all encodings. + if (!codec) { + continue; + } + + QString key = codec->name().toUpper(); + char rank; + + if (key.localeAwareCompare("IBM") < 0) { + rank = 1; + } else if ((match = ibmRegExp.match(key)).hasMatch()) { + rank = match.captured(1).size(); // Up to 5 + } else if (key.localeAwareCompare("ISO-8859-") < 0) { + rank = 6; + } else if ((match = iso8859RegExp.match(key)).hasMatch()) { + rank = 6 + match.captured(1).size(); // Up to 6 + 2 + } else if (key.localeAwareCompare("WINDOWS-") < 0) { + rank = 9; + } else if ((match = windowsRegExp.match(key)).hasMatch()) { + rank = 9 + match.captured(1).size(); // Up to 9 + 4 + } else { + rank = 14; + } + // This doesn't perfectly well order the IBM codecs because it's + // annoying to properly place IBM00858 and IBM00924 in the middle of + // code page numbers not zero padded to 5 digits. + // We could manipulate the key further to have more commonly used + // charsets earlier. IANA MIB ordering would be unxpected: + // https://www.iana.org/assignments/character-sets/character-sets.xml + // For data about use in HTTP (other protocols can be quite different): + // https://w3techs.com/technologies/overview/character_encoding + + key.prepend(char('0' + rank)); + // We use a map here because, due to backwards compatibility, + // the same QTextCodec may be returned for multiple MIBs, which + // happens for GBK/GB2312, EUC-KR/windows-949/UHC, and others. + text_codec_map_.insert(key, codec); + } +} + +void LograyMainWindow::initMainToolbarIcons() +{ + // Normally 16 px. Reflects current GTK+ behavior and other Windows apps. + int icon_size = style()->pixelMetric(QStyle::PM_SmallIconSize); +#if !defined(Q_OS_WIN) + // Force icons to 24x24 for now, otherwise actionFileOpen looks wonky. + // The macOS HIG specifies 32-pixel icons but they're a little too + // large IMHO. + icon_size = icon_size * 3 / 2; +#endif + main_ui_->mainToolBar->setIconSize(QSize(icon_size, icon_size)); + + // Toolbar actions. The GNOME HIG says that we should have a menu icon for each + // toolbar item but that clutters up our menu. Set menu icons sparingly. + + main_ui_->actionCaptureStart->setIcon(StockIcon("x-capture-start-circle")); + main_ui_->actionCaptureStop->setIcon(StockIcon("x-capture-stop")); + main_ui_->actionCaptureRestart->setIcon(StockIcon("x-capture-restart-circle")); + main_ui_->actionCaptureOptions->setIcon(StockIcon("x-capture-options")); + + // Menu icons are disabled in main_window.ui for these items. + main_ui_->actionFileOpen->setIcon(StockIcon("document-open")); + main_ui_->actionFileSave->setIcon(StockIcon("x-capture-file-save")); + main_ui_->actionFileClose->setIcon(StockIcon("x-capture-file-close")); + main_ui_->actionViewReload->setIcon(StockIcon("x-capture-file-reload")); + + main_ui_->actionEditFindPacket->setIcon(StockIcon("edit-find")); + main_ui_->actionGoPreviousPacket->setIcon(StockIcon("go-previous")); + main_ui_->actionGoNextPacket->setIcon(StockIcon("go-next")); + main_ui_->actionGoGoToPacket->setIcon(StockIcon("go-jump")); + main_ui_->actionGoFirstPacket->setIcon(StockIcon("go-first")); + main_ui_->actionGoLastPacket->setIcon(StockIcon("go-last")); + main_ui_->actionGoPreviousConversationPacket->setIcon(StockIcon("go-previous")); + main_ui_->actionGoNextConversationPacket->setIcon(StockIcon("go-next")); +#if defined(Q_OS_MAC) + main_ui_->actionGoPreviousConversationPacket->setShortcut(QKeySequence(Qt::META | Qt::Key_Comma)); + main_ui_->actionGoNextConversationPacket->setShortcut(QKeySequence(Qt::META | Qt::Key_Period)); +#endif + main_ui_->actionGoPreviousHistoryPacket->setIcon(StockIcon("go-previous")); + main_ui_->actionGoNextHistoryPacket->setIcon(StockIcon("go-next")); + main_ui_->actionGoAutoScroll->setIcon(StockIcon("x-stay-last")); + + main_ui_->actionViewColorizePacketList->setIcon(StockIcon("x-colorize-packets")); + + QList<QKeySequence> zi_seq = main_ui_->actionViewZoomIn->shortcuts(); + zi_seq << QKeySequence(Qt::CTRL | Qt::Key_Equal); + main_ui_->actionViewZoomIn->setIcon(StockIcon("zoom-in")); + main_ui_->actionViewZoomIn->setShortcuts(zi_seq); + main_ui_->actionViewZoomOut->setIcon(StockIcon("zoom-out")); + main_ui_->actionViewNormalSize->setIcon(StockIcon("zoom-original")); + main_ui_->actionViewResizeColumns->setIcon(StockIcon("x-resize-columns")); + + main_ui_->actionNewDisplayFilterExpression->setIcon(StockIcon("list-add")); +} + +void LograyMainWindow::initShowHideMainWidgets() +{ + if (show_hide_actions_) { + return; + } + + show_hide_actions_ = new QActionGroup(this); + QMap<QAction *, QWidget *> shmw_actions; + + show_hide_actions_->setExclusive(false); + shmw_actions[main_ui_->actionViewMainToolbar] = main_ui_->mainToolBar; + shmw_actions[main_ui_->actionViewFilterToolbar] = main_ui_->displayFilterToolBar; + shmw_actions[main_ui_->actionViewStatusBar] = main_ui_->statusBar; + shmw_actions[main_ui_->actionViewPacketList] = packet_list_; + shmw_actions[main_ui_->actionViewPacketDetails] = proto_tree_; + shmw_actions[main_ui_->actionViewPacketBytes] = byte_view_tab_; + shmw_actions[main_ui_->actionViewPacketDiagram] = packet_diagram_; + + foreach(QAction *shmwa, shmw_actions.keys()) { + shmwa->setData(QVariant::fromValue(shmw_actions[shmwa])); + show_hide_actions_->addAction(shmwa); + } + + // Initial hide the Interface Toolbar submenu + main_ui_->menuInterfaceToolbars->menuAction()->setVisible(false); + + /* Initially hide the additional toolbars menus */ + main_ui_->menuAdditionalToolbars->menuAction()->setVisible(false); + + connect(show_hide_actions_, SIGNAL(triggered(QAction*)), this, SLOT(showHideMainWidgets(QAction*))); +} + +void LograyMainWindow::initTimeDisplayFormatMenu() +{ + if (time_display_actions_) { + return; + } + + time_display_actions_ = new QActionGroup(this); + + td_actions[main_ui_->actionViewTimeDisplayFormatDateYMDandTimeOfDay] = TS_ABSOLUTE_WITH_YMD; + td_actions[main_ui_->actionViewTimeDisplayFormatDateYDOYandTimeOfDay] = TS_ABSOLUTE_WITH_YDOY; + td_actions[main_ui_->actionViewTimeDisplayFormatTimeOfDay] = TS_ABSOLUTE; + td_actions[main_ui_->actionViewTimeDisplayFormatSecondsSinceEpoch] = TS_EPOCH; + td_actions[main_ui_->actionViewTimeDisplayFormatSecondsSinceBeginningOfCapture] = TS_RELATIVE; + td_actions[main_ui_->actionViewTimeDisplayFormatSecondsSincePreviousCapturedPacket] = TS_DELTA; + td_actions[main_ui_->actionViewTimeDisplayFormatSecondsSincePreviousDisplayedPacket] = TS_DELTA_DIS; + td_actions[main_ui_->actionViewTimeDisplayFormatUTCDateYMDandTimeOfDay] = TS_UTC_WITH_YMD; + td_actions[main_ui_->actionViewTimeDisplayFormatUTCDateYDOYandTimeOfDay] = TS_UTC_WITH_YDOY; + td_actions[main_ui_->actionViewTimeDisplayFormatUTCTimeOfDay] = TS_UTC; + + foreach(QAction* tda, td_actions.keys()) { + tda->setData(QVariant::fromValue(td_actions[tda])); + time_display_actions_->addAction(tda); + } + + connect(time_display_actions_, SIGNAL(triggered(QAction*)), this, SLOT(setTimestampFormat(QAction*))); +} + +void LograyMainWindow::initTimePrecisionFormatMenu() +{ + if (time_precision_actions_) { + return; + } + + time_precision_actions_ = new QActionGroup(this); + + tp_actions[main_ui_->actionViewTimeDisplayFormatPrecisionAutomatic] = TS_PREC_AUTO; + tp_actions[main_ui_->actionViewTimeDisplayFormatPrecisionSeconds] = TS_PREC_FIXED_SEC; + tp_actions[main_ui_->actionViewTimeDisplayFormatPrecision100Milliseconds] = TS_PREC_FIXED_100_MSEC; + tp_actions[main_ui_->actionViewTimeDisplayFormatPrecision10Milliseconds] = TS_PREC_FIXED_10_MSEC; + tp_actions[main_ui_->actionViewTimeDisplayFormatPrecisionMilliseconds] = TS_PREC_FIXED_MSEC; + tp_actions[main_ui_->actionViewTimeDisplayFormatPrecision100Microseconds] = TS_PREC_FIXED_100_USEC; + tp_actions[main_ui_->actionViewTimeDisplayFormatPrecision10Microseconds] = TS_PREC_FIXED_10_USEC; + tp_actions[main_ui_->actionViewTimeDisplayFormatPrecisionMicroseconds] = TS_PREC_FIXED_USEC; + tp_actions[main_ui_->actionViewTimeDisplayFormatPrecision100Nanoseconds] = TS_PREC_FIXED_100_NSEC; + tp_actions[main_ui_->actionViewTimeDisplayFormatPrecision10Nanoseconds] = TS_PREC_FIXED_10_NSEC; + tp_actions[main_ui_->actionViewTimeDisplayFormatPrecisionNanoseconds] = TS_PREC_FIXED_NSEC; + + foreach(QAction* tpa, tp_actions.keys()) { + tpa->setData(QVariant::fromValue(tp_actions[tpa])); + time_precision_actions_->addAction(tpa); + } + + connect(time_precision_actions_, SIGNAL(triggered(QAction*)), this, SLOT(setTimestampPrecision(QAction*))); +} + +// Menu items which will be disabled when we freeze() and whose state will +// be restored when we thaw(). Add to the list as needed. +void LograyMainWindow::initFreezeActions() +{ + QList<QAction *> freeze_actions = QList<QAction *>() + << main_ui_->actionFileClose + << main_ui_->actionViewReload + << main_ui_->actionEditMarkPacket + << main_ui_->actionEditMarkAllDisplayed + << main_ui_->actionEditUnmarkAllDisplayed + << main_ui_->actionEditIgnorePacket + << main_ui_->actionEditIgnoreAllDisplayed + << main_ui_->actionEditUnignoreAllDisplayed + << main_ui_->actionEditSetTimeReference + << main_ui_->actionEditUnsetAllTimeReferences; + + foreach(QAction *action, freeze_actions) { + freeze_actions_ << QPair<QAction *, bool>(action, false); + } +} + +void LograyMainWindow::initConversationMenus() +{ + int i; + + QList<QAction *> cc_actions = QList<QAction *>() + << main_ui_->actionViewColorizeConversation1 << main_ui_->actionViewColorizeConversation2 + << main_ui_->actionViewColorizeConversation3 << main_ui_->actionViewColorizeConversation4 + << main_ui_->actionViewColorizeConversation5 << main_ui_->actionViewColorizeConversation6 + << main_ui_->actionViewColorizeConversation7 << main_ui_->actionViewColorizeConversation8 + << main_ui_->actionViewColorizeConversation9 << main_ui_->actionViewColorizeConversation10; + + for (GList *conv_filter_list_entry = log_conv_filter_list; conv_filter_list_entry; conv_filter_list_entry = gxx_list_next(conv_filter_list_entry)) { + // Main menu items + conversation_filter_t* conv_filter = gxx_list_data(conversation_filter_t *, conv_filter_list_entry); + ConversationAction *conv_action = new ConversationAction(main_ui_->menuConversationFilter, conv_filter); + main_ui_->menuConversationFilter->addAction(conv_action); + + connect(this, SIGNAL(packetInfoChanged(_packet_info*)), conv_action, SLOT(setPacketInfo(_packet_info*))); + connect(conv_action, SIGNAL(triggered()), this, SLOT(applyConversationFilter()), Qt::QueuedConnection); + + // Packet list context menu items + packet_list_->conversationMenu()->addAction(conv_action); + + QMenu *submenu = packet_list_->colorizeMenu()->addMenu(conv_action->text()); + i = 1; + + foreach(QAction *cc_action, cc_actions) { + conv_action = new ConversationAction(submenu, conv_filter); + conv_action->setText(cc_action->text()); + conv_action->setIcon(cc_action->icon()); + conv_action->setColorNumber(i++); + submenu->addAction(conv_action); + connect(this, SIGNAL(packetInfoChanged(_packet_info*)), conv_action, SLOT(setPacketInfo(_packet_info*))); + connect(conv_action, SIGNAL(triggered()), this, SLOT(colorizeActionTriggered())); + } + + conv_action = new ConversationAction(submenu, conv_filter); + conv_action->setText(main_ui_->actionViewColorizeNewColoringRule->text()); + submenu->addAction(conv_action); + connect(this, SIGNAL(packetInfoChanged(_packet_info*)), conv_action, SLOT(setPacketInfo(_packet_info*))); + connect(conv_action, SIGNAL(triggered()), this, SLOT(colorizeActionTriggered())); + + // Proto tree conversation menu is filled in in ProtoTree::contextMenuEvent. + // We should probably do that here. + } + + // Proto tree colorization items + i = 1; + ColorizeAction *colorize_action; + foreach(QAction *cc_action, cc_actions) { + colorize_action = new ColorizeAction(proto_tree_->colorizeMenu()); + colorize_action->setText(cc_action->text()); + colorize_action->setIcon(cc_action->icon()); + colorize_action->setColorNumber(i++); + proto_tree_->colorizeMenu()->addAction(colorize_action); + connect(this, SIGNAL(fieldFilterChanged(QByteArray)), colorize_action, SLOT(setFieldFilter(QByteArray))); + connect(colorize_action, SIGNAL(triggered()), this, SLOT(colorizeActionTriggered())); + } + + colorize_action = new ColorizeAction(proto_tree_->colorizeMenu()); + colorize_action->setText(main_ui_->actionViewColorizeNewColoringRule->text()); + proto_tree_->colorizeMenu()->addAction(colorize_action); + connect(this, SIGNAL(fieldFilterChanged(QByteArray)), colorize_action, SLOT(setFieldFilter(QByteArray))); + connect(colorize_action, SIGNAL(triggered()), this, SLOT(colorizeActionTriggered())); +} + +bool LograyMainWindow::addExportObjectsMenuItem(const void *, void *value, void *userdata) +{ + register_eo_t *eo = (register_eo_t*)value; + LograyMainWindow *window = (LograyMainWindow*)userdata; + + ExportObjectAction *export_action = new ExportObjectAction(window->main_ui_->menuFileExportObjects, eo); + window->main_ui_->menuFileExportObjects->addAction(export_action); + + //initially disable until a file is loaded (then file signals will take over) + export_action->setEnabled(false); + + connect(&window->capture_file_, SIGNAL(captureEvent(CaptureEvent)), export_action, SLOT(captureFileEvent(CaptureEvent))); + connect(export_action, SIGNAL(triggered()), window, SLOT(applyExportObject())); + return FALSE; +} + +void LograyMainWindow::initExportObjectsMenus() +{ + eo_iterate_tables(addExportObjectsMenuItem, this); +} + +// Titlebar +void LograyMainWindow::setTitlebarForCaptureFile() +{ + if (capture_file_.capFile() && capture_file_.capFile()->filename) { + setWSWindowTitle(QString("[*]%1").arg(capture_file_.fileDisplayName())); + // + // XXX - on non-Mac platforms, put in the application + // name? Or do so only for temporary files? + // + if (!capture_file_.capFile()->is_tempfile) { + // + // Set the file path; that way, for macOS, it'll set the + // "proxy icon". + // + setWindowFilePath(capture_file_.filePath()); + } + setWindowModified(cf_has_unsaved_data(capture_file_.capFile())); + } else { + /* We have no capture file. */ + setWSWindowTitle(); + } +} + +QString LograyMainWindow::replaceWindowTitleVariables(QString title) +{ + title.replace("%P", get_profile_name()); + title.replace("%V", get_ws_vcs_version_info()); + + if (title.contains("%F")) { + // %F is file path of the capture file. + if (capture_file_.capFile()) { + // get_dirname() will overwrite the argument so make a copy first + char *filename = g_strdup(capture_file_.capFile()->filename); + QString file(get_dirname(filename)); + g_free(filename); +#ifndef _WIN32 + // Substitute HOME with ~ + QString homedir(g_getenv("HOME")); + if (!homedir.isEmpty()) { + homedir.remove(QRegularExpression("[/]+$")); + file.replace(homedir, "~"); + } +#endif + title.replace("%F", file); + } else { + // No file loaded, no folder name + title.remove("%F"); + } + } + + if (title.contains("%S")) { + // %S is a conditional separator (" - ") that only shows when surrounded by variables + // with values or static text. Remove repeating, leading and trailing separators. + title.replace(QRegularExpression("(%S)+"), "%S"); + title.remove(QRegularExpression("^%S|%S$")); +#ifdef __APPLE__ + // On macOS we separate with a unicode em dash + title.replace("%S", " " UTF8_EM_DASH " "); +#else + title.replace("%S", " - "); +#endif + } + + return title; +} + +void LograyMainWindow::setWSWindowTitle(QString title) +{ + if (title.isEmpty()) { + title = tr("The Logray System Log Analyzer"); + } + + if (prefs.gui_prepend_window_title && prefs.gui_prepend_window_title[0]) { + QString custom_title = replaceWindowTitleVariables(prefs.gui_prepend_window_title); + if (custom_title.length() > 0) { + title.prepend(QString("[%1] ").arg(custom_title)); + } + } + + if (prefs.gui_window_title && prefs.gui_window_title[0]) { + QString custom_title = replaceWindowTitleVariables(prefs.gui_window_title); + if (custom_title.length() > 0) { +#ifdef __APPLE__ + // On macOS we separate the titles with a unicode em dash + title.append(QString(" %1 %2").arg(UTF8_EM_DASH).arg(custom_title)); +#else + title.append(QString(" [%1]").arg(custom_title)); +#endif + } + } + + setWindowTitle(title); + setWindowFilePath(NULL); +} + +void LograyMainWindow::setTitlebarForCaptureInProgress() +{ + if (capture_file_.capFile()) { + setWSWindowTitle(tr("Capturing from %1").arg(cf_get_tempfile_source(capture_file_.capFile()))); + } else { + /* We have no capture in progress. */ + setWSWindowTitle(); + } +} + +// Menu state + +/* Enable or disable menu items based on whether you have a capture file + you've finished reading and, if you have one, whether it's been saved + and whether it could be saved except by copying the raw packet data. */ +void LograyMainWindow::setMenusForCaptureFile(bool force_disable) +{ + bool enable = true; + bool can_write = false; + bool can_save = false; + bool can_save_as = false; + + if (force_disable || capture_file_.capFile() == NULL || capture_file_.capFile()->state == FILE_READ_IN_PROGRESS || capture_file_.capFile()->state == FILE_READ_PENDING) { + /* We have no capture file or we're currently reading a file */ + enable = false; + } else { + /* We have a capture file. Can we write or save? */ + can_write = cf_can_write_with_wiretap(capture_file_.capFile()); + can_save = cf_can_save(capture_file_.capFile()); + can_save_as = cf_can_save_as(capture_file_.capFile()); + } + + main_ui_->actionViewReload_as_File_Format_or_Capture->setEnabled(enable); + main_ui_->actionFileMerge->setEnabled(can_write); + main_ui_->actionFileClose->setEnabled(enable); + main_ui_->actionFileSave->setEnabled(can_save); + main_ui_->actionFileSaveAs->setEnabled(can_save_as); + main_ui_->actionStatisticsCaptureFileProperties->setEnabled(enable); + /* + * "Export Specified Packets..." should be available only if + * we can write the file out in at least one format. + */ + main_ui_->actionFileExportPackets->setEnabled(can_write); + + main_ui_->actionFileExportAsCArrays->setEnabled(enable); + main_ui_->actionFileExportAsCSV->setEnabled(enable); + main_ui_->actionFileExportAsPDML->setEnabled(enable); + main_ui_->actionFileExportAsPlainText->setEnabled(enable); + main_ui_->actionFileExportAsPSML->setEnabled(enable); + main_ui_->actionFileExportAsJSON->setEnabled(enable); + + main_ui_->actionFileExportPDU->setEnabled(enable); + + foreach(QAction *eo_action, main_ui_->menuFileExportObjects->actions()) { + eo_action->setEnabled(enable); + } + + main_ui_->actionViewReload->setEnabled(enable); + +#ifdef HAVE_SOFTWARE_UPDATE + // We might want to enable or disable automatic checks here as well. + update_action_->setEnabled(!can_save); +#endif +} + +void LograyMainWindow::setMenusForCaptureInProgress(bool capture_in_progress) { + /* Either a capture was started or stopped; in either case, it's not + in the process of stopping, so allow quitting. */ + + main_ui_->actionFileOpen->setEnabled(!capture_in_progress); + main_ui_->menuOpenRecentCaptureFile->setEnabled(!capture_in_progress); + + main_ui_->actionFileExportAsCArrays->setEnabled(capture_in_progress); + main_ui_->actionFileExportAsCSV->setEnabled(capture_in_progress); + main_ui_->actionFileExportAsPDML->setEnabled(capture_in_progress); + main_ui_->actionFileExportAsPlainText->setEnabled(capture_in_progress); + main_ui_->actionFileExportAsPSML->setEnabled(capture_in_progress); + main_ui_->actionFileExportAsJSON->setEnabled(capture_in_progress); + + main_ui_->actionFileExportPDU->setEnabled(!capture_in_progress); + + foreach(QAction *eo_action, main_ui_->menuFileExportObjects->actions()) { + eo_action->setEnabled(capture_in_progress); + } + + main_ui_->menuFileSet->setEnabled(!capture_in_progress); + main_ui_->actionFileQuit->setEnabled(true); +#ifdef HAVE_SOFTWARE_UPDATE + // We might want to enable or disable automatic checks here as well. + update_action_->setEnabled(!capture_in_progress); +#endif + + main_ui_->actionStatisticsCaptureFileProperties->setEnabled(capture_in_progress); + + // XXX Fix packet list heading menu sensitivity + // set_menu_sensitivity(ui_manager_packet_list_heading, "/PacketListHeadingPopup/SortAscending", + // !capture_in_progress); + // set_menu_sensitivity(ui_manager_packet_list_heading, "/PacketListHeadingPopup/SortDescending", + // !capture_in_progress); + // set_menu_sensitivity(ui_manager_packet_list_heading, "/PacketListHeadingPopup/NoSorting", + // !capture_in_progress); + +#ifdef HAVE_LIBPCAP + main_ui_->actionCaptureOptions->setEnabled(!capture_in_progress); + main_ui_->actionCaptureStart->setEnabled(!capture_in_progress); + main_ui_->actionCaptureStart->setChecked(capture_in_progress); + main_ui_->actionCaptureStop->setEnabled(capture_in_progress); + main_ui_->actionCaptureRestart->setEnabled(capture_in_progress); + main_ui_->actionCaptureRefreshInterfaces->setEnabled(!capture_in_progress); +#endif /* HAVE_LIBPCAP */ + +} + +void LograyMainWindow::setMenusForCaptureStopping() { + main_ui_->actionFileQuit->setEnabled(false); +#ifdef HAVE_SOFTWARE_UPDATE + update_action_->setEnabled(false); +#endif + main_ui_->actionStatisticsCaptureFileProperties->setEnabled(false); +#ifdef HAVE_LIBPCAP + main_ui_->actionCaptureStart->setChecked(false); + main_ui_->actionCaptureStop->setEnabled(false); + main_ui_->actionCaptureRestart->setEnabled(false); +#endif /* HAVE_LIBPCAP */ +} + +void LograyMainWindow::setForCapturedPackets(bool have_captured_packets) +{ + main_ui_->actionFilePrint->setEnabled(have_captured_packets); + +// set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/Print", +// have_captured_packets); + + main_ui_->actionEditFindPacket->setEnabled(have_captured_packets); + main_ui_->actionEditFindNext->setEnabled(have_captured_packets); + main_ui_->actionEditFindPrevious->setEnabled(have_captured_packets); + + main_ui_->actionGoGoToPacket->setEnabled(have_captured_packets); + main_ui_->actionGoPreviousPacket->setEnabled(have_captured_packets); + main_ui_->actionGoNextPacket->setEnabled(have_captured_packets); + main_ui_->actionGoFirstPacket->setEnabled(have_captured_packets); + main_ui_->actionGoLastPacket->setEnabled(have_captured_packets); + main_ui_->actionGoNextConversationPacket->setEnabled(have_captured_packets); + main_ui_->actionGoPreviousConversationPacket->setEnabled(have_captured_packets); + + main_ui_->actionViewZoomIn->setEnabled(have_captured_packets); + main_ui_->actionViewZoomOut->setEnabled(have_captured_packets); + main_ui_->actionViewNormalSize->setEnabled(have_captured_packets); + main_ui_->actionViewResizeColumns->setEnabled(have_captured_packets); + + main_ui_->actionStatisticsCaptureFileProperties->setEnabled(have_captured_packets); + main_ui_->actionStatisticsProtocolHierarchy->setEnabled(have_captured_packets); + main_ui_->actionStatisticsIOGraph->setEnabled(have_captured_packets); +} + +void LograyMainWindow::setMenusForFileSet(bool enable_list_files) { + bool enable_next = fileset_get_next() != NULL && enable_list_files; + bool enable_prev = fileset_get_previous() != NULL && enable_list_files; + + main_ui_->actionFileSetListFiles->setEnabled(enable_list_files); + main_ui_->actionFileSetNextFile->setEnabled(enable_next); + main_ui_->actionFileSetPreviousFile->setEnabled(enable_prev); +} + +void LograyMainWindow::setWindowIcon(const QIcon &icon) { + mainApp->setWindowIcon(icon); + QMainWindow::setWindowIcon(icon); +} + +void LograyMainWindow::updateForUnsavedChanges() { + setTitlebarForCaptureFile(); + setMenusForCaptureFile(); +} + +void LograyMainWindow::changeEvent(QEvent* event) +{ + if (0 != event) + { + switch (event->type()) + { + case QEvent::LanguageChange: + main_ui_->retranslateUi(this); + // make sure that the "Clear Menu" item is retranslated + mainApp->emitAppSignal(WiresharkApplication::RecentCapturesChanged); + break; + case QEvent::LocaleChange: { + QString locale = QLocale::system().name(); + locale.truncate(locale.lastIndexOf('_')); + mainApp->loadLanguage(locale); + } + break; + case QEvent::WindowStateChange: + main_ui_->actionViewFullScreen->setChecked(this->isFullScreen()); + break; + default: + break; + } + } + QMainWindow::changeEvent(event); +} + +/* Update main window items based on whether there's a capture in progress. */ +void LograyMainWindow::setForCaptureInProgress(bool capture_in_progress, bool handle_toolbars, GArray *ifaces) +{ + setMenusForCaptureInProgress(capture_in_progress); + +#ifdef HAVE_LIBPCAP + packet_list_->setCaptureInProgress(capture_in_progress, main_ui_->actionGoAutoScroll->isChecked()); + +// set_capture_if_dialog_for_capture_in_progress(capture_in_progress); +#endif + + if (handle_toolbars) { + QList<InterfaceToolbar *> toolbars = findChildren<InterfaceToolbar *>(); + foreach(InterfaceToolbar *toolbar, toolbars) { + if (capture_in_progress) { + toolbar->startCapture(ifaces); + } else { + toolbar->stopCapture(); + } + } + } +} + +void LograyMainWindow::addMenuActions(QList<QAction *> &actions, int menu_group) +{ + foreach(QAction *action, actions) { + switch (menu_group) { + case REGISTER_LOG_ANALYZE_GROUP_UNSORTED: + case REGISTER_LOG_STAT_GROUP_UNSORTED: + main_ui_->menuStatistics->insertAction( + main_ui_->actionStatistics_REGISTER_STAT_GROUP_UNSORTED, + action); + break; +// case REGISTER_TOOLS_GROUP_UNSORTED: +// { +// // Allow the creation of submenus. Mimics the behavor of +// // ui/gtk/main_menubar.c:add_menu_item_to_main_menubar +// // and GtkUIManager. +// // +// // For now we limit the insanity to the "Tools" menu. +// QStringList menu_path = action->text().split('/'); +// QMenu *cur_menu = main_ui_->menuTools; +// while (menu_path.length() > 1) { +// QString menu_title = menu_path.takeFirst(); +// QMenu *submenu = cur_menu->findChild<QMenu *>(menu_title.toLower(), Qt::FindDirectChildrenOnly); +// if (!submenu) { +// submenu = cur_menu->addMenu(menu_title); +// submenu->setObjectName(menu_title.toLower()); +// } +// cur_menu = submenu; +// } +// action->setText(menu_path.last()); +// cur_menu->addAction(action); +// break; +// } + default: + // Skip packet items. + return; + } + + // Connect each action type to its corresponding slot. We to + // distinguish various types of actions. Setting their objectName + // seems to work OK. + if (action->objectName() == TapParameterDialog::actionName()) { + connect(action, SIGNAL(triggered(bool)), this, SLOT(openTapParameterDialog())); + } else if (action->objectName() == FunnelStatistics::actionName()) { + connect(action, SIGNAL(triggered(bool)), funnel_statistics_, SLOT(funnelActionTriggered())); + } + } +} + +void LograyMainWindow::removeMenuActions(QList<QAction *> &actions, int menu_group) +{ + foreach(QAction *action, actions) { + switch (menu_group) { + case REGISTER_LOG_ANALYZE_GROUP_UNSORTED: + case REGISTER_LOG_STAT_GROUP_UNSORTED: + main_ui_->menuStatistics->removeAction(action); + break; +// case REGISTER_TOOLS_GROUP_UNSORTED: +// { +// // Allow removal of submenus. +// // For now we limit the insanity to the "Tools" menu. +// QStringList menu_path = action->text().split('/'); +// QMenu *cur_menu = main_ui_->menuTools; +// while (menu_path.length() > 1) { +// QString menu_title = menu_path.takeFirst(); +// QMenu *submenu = cur_menu->findChild<QMenu *>(menu_title.toLower(), Qt::FindDirectChildrenOnly); +// cur_menu = submenu; +// } +// cur_menu->removeAction(action); +// break; +// } + default: +// qDebug() << "FIX: Remove" << action->text() << "from the menu"; + break; + } + } +} + +void LograyMainWindow::addDynamicMenus() +{ + // Fill in each menu + foreach(register_stat_group_t menu_group, menu_groups_) { + QList<QAction *>actions = mainApp->dynamicMenuGroupItems(menu_group); + addMenuActions(actions, menu_group); + } +} + +void LograyMainWindow::reloadDynamicMenus() +{ + foreach(register_stat_group_t menu_group, menu_groups_) { + QList<QAction *>actions = mainApp->removedMenuGroupItems(menu_group); + removeMenuActions(actions, menu_group); + + actions = mainApp->addedMenuGroupItems(menu_group); + addMenuActions(actions, menu_group); + } + + mainApp->clearAddedMenuGroupItems(); + mainApp->clearRemovedMenuGroupItems(); +} + +void LograyMainWindow::externalMenuHelper(ext_menu_t * menu, QMenu * subMenu, gint depth) +{ + QAction * itemAction = Q_NULLPTR; + ext_menubar_t * item = Q_NULLPTR; + GList * children = Q_NULLPTR; + + /* There must exists an xpath parent */ + Q_ASSERT(subMenu != NULL); + + /* If the depth counter exceeds, something must have gone wrong */ + Q_ASSERT(depth < EXT_MENUBAR_MAX_DEPTH); + + children = menu->children; + /* Iterate the child entries */ + while (children && children->data) { + item = gxx_list_data(ext_menubar_t *, children); + + if (item->type == EXT_MENUBAR_MENU) { + /* Handle Submenu entry */ + this->externalMenuHelper(item, subMenu->addMenu(item->label), depth++); + } else if (item->type == EXT_MENUBAR_SEPARATOR) { + subMenu->addSeparator(); + } else if (item->type == EXT_MENUBAR_ITEM || item->type == EXT_MENUBAR_URL) { + itemAction = subMenu->addAction(item->name); + itemAction->setData(QVariant::fromValue(static_cast<void *>(item))); + itemAction->setText(item->label); + connect(itemAction, &QAction::triggered, this, &LograyMainWindow::externalMenuItemTriggered); + } + + /* Iterate Loop */ + children = gxx_list_next(children); + } +} + +QMenu * LograyMainWindow::searchSubMenu(QString objectName) +{ + QList<QMenu*> lst; + + if (objectName.length() > 0) { + QString searchName = QString("menu") + objectName; + + lst = main_ui_->menuBar->findChildren<QMenu*>(); + foreach(QMenu* m, lst) { + if (QString::compare(m->objectName(), searchName) == 0) + return m; + } + } + + return 0; +} + +void LograyMainWindow::addPluginIFStructures() +{ + GList *user_menu = ext_menubar_get_entries(); + + while (user_menu && user_menu->data) { + QMenu *subMenu = Q_NULLPTR; + ext_menu_t *menu = gxx_list_data(ext_menu_t *, user_menu); + + /* On this level only menu items should exist. Not doing an assert here, + * as it could be an honest mistake */ + if (menu->type != EXT_MENUBAR_MENU) { + user_menu = gxx_list_next(user_menu); + continue; + } + + /* Create main submenu and add it to the menubar */ + if (menu->parent_menu) { + QMenu *sortUnderneath = searchSubMenu(QString(menu->parent_menu)); + if (sortUnderneath) + subMenu = sortUnderneath->addMenu(menu->label); + } + + if (!subMenu) + subMenu = main_ui_->menuBar->addMenu(menu->label); + + /* This will generate the action structure for each menu. It is recursive, + * therefore a sub-routine, and we have a depth counter to prevent endless loops. */ + this->externalMenuHelper(menu, subMenu, 0); + + /* Iterate Loop */ + user_menu = gxx_list_next(user_menu); + } + + int cntToolbars = 0; + + QMenu *tbMenu = main_ui_->menuAdditionalToolbars; + GList *if_toolbars = ext_toolbar_get_entries(); + while (if_toolbars && if_toolbars->data) { + ext_toolbar_t *toolbar = gxx_list_data(ext_toolbar_t*, if_toolbars); + + if (toolbar->type != EXT_TOOLBAR_BAR) { + if_toolbars = gxx_list_next(if_toolbars); + continue; + } + + bool visible = g_list_find_custom(recent.gui_additional_toolbars, toolbar->name, reinterpret_cast<GCompareFunc>(strcmp)) ? true : false; + + AdditionalToolBar *ifToolBar = AdditionalToolBar::create(this, toolbar); + + if (ifToolBar) { + ifToolBar->setVisible(visible); + + QAction *iftbAction = new QAction(QString(toolbar->name), this); + iftbAction->setToolTip(toolbar->tooltip); + iftbAction->setEnabled(true); + iftbAction->setCheckable(true); + iftbAction->setChecked(visible); + iftbAction->setToolTip(tr("Show or hide the toolbar")); + iftbAction->setData(VariantPointer<ext_toolbar_t>::asQVariant(toolbar)); + + QAction *before = Q_NULLPTR; + + foreach(QAction *action, tbMenu->actions()) { + /* Ensure we add the menu entries in sorted order */ + if (action->text().compare(toolbar->name, Qt::CaseInsensitive) > 0) { + before = action; + break; + } + } + + tbMenu->insertAction(before, iftbAction); + + addToolBar(Qt::TopToolBarArea, ifToolBar); + insertToolBarBreak(ifToolBar); + + if (show_hide_actions_) + show_hide_actions_->addAction(iftbAction); + + cntToolbars++; + } + + if_toolbars = gxx_list_next(if_toolbars); + } + + if (cntToolbars) + tbMenu->menuAction()->setVisible(true); +} + +void LograyMainWindow::removeAdditionalToolbar(QString toolbarName) +{ + if (toolbarName.length() == 0) + return; + + QList<QToolBar *> toolbars = findChildren<QToolBar *>(); + foreach(QToolBar *tb, toolbars) { + AdditionalToolBar *ifToolBar = dynamic_cast<AdditionalToolBar *>(tb); + + if (ifToolBar && ifToolBar->menuName().compare(toolbarName)) { + GList *entry = g_list_find_custom(recent.gui_additional_toolbars, qUtf8Printable(ifToolBar->menuName()), reinterpret_cast<GCompareFunc>(strcmp)); + if (entry) { + recent.gui_additional_toolbars = g_list_remove(recent.gui_additional_toolbars, entry->data); + } + QList<QAction *> actions = main_ui_->menuAdditionalToolbars->actions(); + foreach(QAction *action, actions) { + ext_toolbar_t *item = VariantPointer<ext_toolbar_t>::asPtr(action->data()); + if (item && ifToolBar->menuName().compare(item->name)) { + if (show_hide_actions_) + show_hide_actions_->removeAction(action); + main_ui_->menuAdditionalToolbars->removeAction(action); + } + } + break; + } + } + +} + +QString LograyMainWindow::getMwFileName() +{ + return mwFileName_; +} + +void LograyMainWindow::setMwFileName(QString fileName) +{ + mwFileName_ = fileName; + return; +} diff --git a/ui/logray/logray_main_window.h b/ui/logray/logray_main_window.h new file mode 100644 index 00000000..328cf0f8 --- /dev/null +++ b/ui/logray/logray_main_window.h @@ -0,0 +1,466 @@ +/** @file + * + * Logray - Event log analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef LOGRAY_MAIN_WINDOW_H +#define LOGRAY_MAIN_WINDOW_H + +/** @defgroup main_window_group Main window + * The main window has the following submodules: + @dot + digraph main_dependencies { + node [shape=record, fontname=Helvetica, fontsize=10]; + main [ label="main window" URL="\ref main.h"]; + menu [ label="menubar" URL="\ref menus.h"]; + toolbar [ label="toolbar" URL="\ref main_toolbar.h"]; + packet_list [ label="packet list pane" URL="\ref packet_list.h"]; + proto_draw [ label="packet details & bytes panes" URL="\ref main_proto_draw.h"]; + recent [ label="recent user settings" URL="\ref recent.h"]; + main -> menu [ arrowhead="open", style="solid" ]; + main -> toolbar [ arrowhead="open", style="solid" ]; + main -> packet_list [ arrowhead="open", style="solid" ]; + main -> proto_draw [ arrowhead="open", style="solid" ]; + main -> recent [ arrowhead="open", style="solid" ]; + } + @enddot + */ + +/** @file + * The Logray main window + * @ingroup main_window_group + * @ingroup windows_group + */ + +#include <stdio.h> + +#include <config.h> + +#include <glib.h> + +#include "file.h" + +#include "ui/ws_ui_util.h" +#include "ui/iface_toolbar.h" + +#include <epan/plugin_if.h> +#include <epan/timestamp.h> + +#ifdef HAVE_LIBPCAP +#include "capture_opts.h" +#endif +#include <capture/capture_session.h> + +#include <QMainWindow> +#include <QPointer> +#include <QTextCodec> + +#ifdef _WIN32 +# include <QTimer> +#else +# include <QSocketNotifier> +#endif + +#include "capture_file.h" +#include "capture_file_dialog.h" +#include "capture_file_properties_dialog.h" +#include <ui/qt/utils/field_information.h> +#include <ui/qt/widgets/display_filter_combo.h> +#include "main_window.h" + +class AccordionFrame; +class ByteViewTab; +class CaptureOptionsDialog; +class PrintDialog; +class FileSetDialog; +class FilterDialog; +class FunnelStatistics; +class WelcomePage; +class PacketCommentDialog; +class PacketDiagram; +class PacketList; +class ProtoTree; +class FilterExpressionToolBar; +class WiresharkApplication; + +class QAction; +class QActionGroup; + +namespace Ui { + class LograyMainWindow; +} + +Q_DECLARE_METATYPE(ts_type) +Q_DECLARE_METATYPE(ts_precision) + +class LograyMainWindow : public MainWindow +{ + Q_OBJECT + +public: + explicit LograyMainWindow(QWidget *parent = nullptr); + ~LograyMainWindow(); + +#ifdef HAVE_LIBPCAP + capture_session *captureSession() { return &cap_session_; } + info_data_t *captureInfoData() { return &info_data_; } +#endif + + virtual QMenu *createPopupMenu(); + + CaptureFile *captureFile() { return &capture_file_; } + + void removeAdditionalToolbar(QString toolbarName); + + void addInterfaceToolbar(const iface_toolbar *toolbar_entry); + void removeInterfaceToolbar(const gchar *menu_title); + + QString getMwFileName(); + void setMwFileName(QString fileName); + +protected: + virtual bool eventFilter(QObject *obj, QEvent *event); + virtual bool event(QEvent *event); + virtual void keyPressEvent(QKeyEvent *event); + virtual void closeEvent(QCloseEvent *event); + virtual void dragEnterEvent(QDragEnterEvent *event); + virtual void dropEvent(QDropEvent *event); + virtual void changeEvent(QEvent* event); + +private: + // XXX Move to FilterUtils + enum MatchSelected { + MatchSelectedReplace, + MatchSelectedAnd, + MatchSelectedOr, + MatchSelectedNot, + MatchSelectedAndNot, + MatchSelectedOrNot + }; + + enum FileCloseContext { + Default, + Quit, + Restart, + Reload, + Update + }; + + Ui::LograyMainWindow *main_ui_; + CaptureFile capture_file_; + QFont mono_font_; + QMap<QString, QTextCodec *> text_codec_map_; + QWidget *previous_focus_; + FileSetDialog *file_set_dialog_; + QActionGroup *show_hide_actions_; + QActionGroup *time_display_actions_; + QActionGroup *time_precision_actions_; + FunnelStatistics *funnel_statistics_; + QList<QPair<QAction *, bool> > freeze_actions_; + QPointer<QWidget> freeze_focus_; + QMap<QAction *, ts_type> td_actions; + QMap<QAction *, ts_precision> tp_actions; + bool was_maximized_; + + /* the following values are maintained so that the capture file name and status + is available when there is no cf structure available */ + QString mwFileName_; + + bool capture_stopping_; + bool capture_filter_valid_; +#ifdef HAVE_LIBPCAP + capture_session cap_session_; + CaptureOptionsDialog *capture_options_dialog_; + info_data_t info_data_; +#endif + +#if defined(Q_OS_MAC) + QMenu *dock_menu_; +#endif + +#ifdef HAVE_SOFTWARE_UPDATE + QAction *update_action_; +#endif + + QPoint dragStartPosition; + + void freeze(); + void thaw(); + + void mergeCaptureFile(); + void importCaptureFile(); + bool saveCaptureFile(capture_file *cf, bool dont_reopen); + bool saveAsCaptureFile(capture_file *cf, bool must_support_comments = false, bool dont_reopen = false); + void exportSelectedPackets(); + void exportDissections(export_type_e export_type); + +#ifdef Q_OS_WIN + void fileAddExtension(QString &file_name, int file_type, wtap_compression_type compression_type); +#endif // Q_OS_WIN + bool testCaptureFileClose(QString before_what, FileCloseContext context = Default); + void captureStop(); + + void findTextCodecs(); + + void initMainToolbarIcons(); + void initShowHideMainWidgets(); + void initTimeDisplayFormatMenu(); + void initTimePrecisionFormatMenu(); + void initFreezeActions(); + + void setTitlebarForCaptureInProgress(); + void setMenusForCaptureFile(bool force_disable = false); + void setMenusForCaptureInProgress(bool capture_in_progress = false); + void setMenusForCaptureStopping(); + void setForCapturedPackets(bool have_captured_packets); + void setMenusForFileSet(bool enable_list_files); + void setWindowIcon(const QIcon &icon); + QString replaceWindowTitleVariables(QString title); + + void externalMenuHelper(ext_menu_t * menu, QMenu * subMenu, gint depth); + + void setForCaptureInProgress(bool capture_in_progress = false, bool handle_toolbars = false, GArray *ifaces = NULL); + QMenu* findOrAddMenu(QMenu *parent_menu, QString& menu_text); + + void captureFileReadStarted(const QString &action); + + void addMenuActions(QList<QAction *> &actions, int menu_group); + void removeMenuActions(QList<QAction *> &actions, int menu_group); + void goToConversationFrame(bool go_next); + void colorizeWithFilter(QByteArray filter, int color_number = -1); + +signals: + void setDissectedCaptureFile(capture_file *cf); + void closePacketDialogs(); + void reloadFields(); + void packetInfoChanged(struct _packet_info *pinfo); + void fieldFilterChanged(const QByteArray field_filter); + + void fieldHighlight(FieldInformation *); + + void captureActive(int); + +#ifdef HAVE_LIBPCAP + void showExtcapOptions(QString &device_name, bool startCaptureOnClose); +#endif + +public slots: + // in main_window_slots.cpp + /** + * Open a capture file. + * @param cf_path Path to the file. + * @param display_filter Display filter to apply. May be empty. + * @param type File type. + * @param is_tempfile TRUE/FALSE. + * @return True on success, false on failure. + */ + // XXX We might want to return a cf_read_status_t or a CaptureFile. + bool openCaptureFile(QString cf_path, QString display_filter, unsigned int type, gboolean is_tempfile = FALSE); + bool openCaptureFile(QString cf_path = QString(), QString display_filter = QString()) { return openCaptureFile(cf_path, display_filter, WTAP_TYPE_AUTO); } + void filterPackets(QString new_filter = QString(), bool force = false); + void updateForUnsavedChanges(); + void layoutToolbars(); + void updatePreferenceActions(); + void updateRecentActions(); + + void setTitlebarForCaptureFile(); + void setWSWindowTitle(QString title = QString()); + + void showCaptureOptionsDialog(); + +#ifdef HAVE_LIBPCAP + void captureCapturePrepared(capture_session *); + void captureCaptureUpdateStarted(capture_session *); + void captureCaptureUpdateFinished(capture_session *); + void captureCaptureFixedFinished(capture_session *cap_session); + void captureCaptureFailed(capture_session *); +#endif + + void captureFileOpened(); + void captureFileReadFinished(); + void captureFileClosing(); + void captureFileClosed(); + +private slots: + + void captureEventHandler(CaptureEvent ev); + + // Manually connected slots (no "on_<object>_<signal>"). + + void initViewColorizeMenu(); + void initConversationMenus(); + static bool addExportObjectsMenuItem(const void *key, void *value, void *userdata); + void initExportObjectsMenus(); + + // in main_window_slots.cpp + /** + * @brief startCapture + * Start capturing from the selected interfaces using the capture filter + * shown in the main welcome screen. + */ + void startCapture(QStringList); + void startCapture(); + void popLiveCaptureInProgress(); + void stopCapture(); + + void loadWindowGeometry(); + void saveWindowGeometry(); + void mainStackChanged(int); + void updateRecentCaptures(); + void recentActionTriggered(); + void addPacketComment(); + void editPacketComment(); + void deletePacketComment(); + void deleteCommentsFromPackets(); + QString commentToMenuText(QString text, int max_len = 40); + void setEditCommentsMenu(); + void setMenusForSelectedPacket(); + void setMenusForSelectedTreeRow(FieldInformation *fi = NULL); + void interfaceSelectionChanged(); + void captureFilterSyntaxChanged(bool valid); + void redissectPackets(); + void checkDisplayFilter(); + void fieldsChanged(); + void reloadLuaPlugins(); + void showAccordionFrame(AccordionFrame *show_frame, bool toggle = false); + void showColumnEditor(int column); + void showPreferenceEditor(); // module_t *, pref * + void addStatsPluginsToMenu(); + void addDynamicMenus(); + void reloadDynamicMenus(); + void addPluginIFStructures(); + QMenu * searchSubMenu(QString objectName); + void activatePluginIFToolbar(bool); + + void startInterfaceCapture(bool valid, const QString capture_filter); + + void applyGlobalCommandLineOptions(); + void setFeaturesEnabled(bool enabled = true); + + void on_actionNewDisplayFilterExpression_triggered(); + void onFilterSelected(QString, bool); + void onFilterPreferences(); + void onFilterEdit(int uatIndex); + + // Handle FilterAction signals + void queuedFilterAction(QString filter, FilterAction::Action action, FilterAction::ActionType type); + + /** Pass stat cmd arguments to a slot. + * @param menu_path slot Partial slot name, e.g. "StatisticsIOGraph". + * @param arg "-z" argument, e.g. "io,stat". + * @param userdata Optional user data. + */ + void openStatCommandDialog(const QString &menu_path, const char *arg, void *userdata); + + /** Pass tap parameter arguments to a slot. + * @param cfg_str slot Partial slot name, e.g. "StatisticsAFPSrt". + * @param arg "-z" argument, e.g. "afp,srt". + * @param userdata Optional user data. + */ + void openTapParameterDialog(const QString cfg_str, const QString arg, void *userdata); + void openTapParameterDialog(); + +#if defined(HAVE_SOFTWARE_UPDATE) && defined(Q_OS_WIN) + void softwareUpdateRequested(); +#endif + + // Automatically connected slots ("on_<object>_<signal>"). + // + // The slots below follow the naming conventaion described in + // https://doc.qt.io/archives/qt-4.8/qmetaobject.html#connectSlotsByName + // and are automatically connected at initialization time via + // main_ui_->setupUi, which in turn calls connectSlotsByName. + // + // If you're manually connecting a signal to a slot, don't prefix its name + // with "on_". Otherwise you'll get runtime warnings. + + // We might want move these to main_window_actions.cpp similar to + // gtk/main_menubar.c + + void connectFileMenuActions(); + void exportPacketBytes(); + void exportPDU(); + void printFile(); + + void connectEditMenuActions(); + void copySelectedItems(LograyMainWindow::CopySelected selection_type); + void findPacket(); + void editTimeShift(); + void editConfigurationProfiles(); + void editTimeShiftFinished(int); + void addPacketCommentFinished(PacketCommentDialog* pc_dialog, int result); + void editPacketCommentFinished(PacketCommentDialog* pc_dialog, int result, guint nComment); + void deleteAllPacketComments(); + void deleteAllPacketCommentsFinished(int result); + void showPreferencesDialog(QString module_name); + + void connectViewMenuActions(); + void showHideMainWidgets(QAction *action); + void setTimestampFormat(QAction *action); + void setTimestampPrecision(QAction *action); + void setTimeDisplaySecondsWithHoursAndMinutes(bool checked); + void editResolvedName(); + void setNameResolution(); + void zoomText(); + void showColoringRulesDialog(); + void colorizeConversation(bool create_rule = false); + void colorizeActionTriggered(); + void openPacketDialog(bool from_reference = false); + void reloadCaptureFileAsFormatOrCapture(); + void reloadCaptureFile(); + + void connectGoMenuActions(); + + void setPreviousFocus(); + void resetPreviousFocus(); + + void connectCaptureMenuActions(); + void startCaptureTriggered(); + + void connectAnalyzeMenuActions(); + + void matchFieldFilter(FilterAction::Action action, FilterAction::ActionType filter_type); + void applyFieldAsColumn(); + + void filterMenuAboutToShow(); + + void applyConversationFilter(); + void applyExportObject(); + + void statCommandExpertInfo(const char *, void *); + + void connectHelpMenuActions(); + +#ifdef HAVE_SOFTWARE_UPDATE + void checkForUpdates(); +#endif + + void goToCancelClicked(); + void goToGoClicked(); + void goToLineEditReturnPressed(); + + void connectStatisticsMenuActions(); + + void showResolvedAddressesDialog(); + void showConversationsDialog(); + void showEndpointsDialog(); + + void openStatisticsTreeDialog(const gchar *abbr); + void statCommandIOGraph(const char *, void *); + + void externalMenuItemTriggered(); + + void on_actionContextWikiProtocolPage_triggered(); + void on_actionContextFilterFieldReference_triggered(); + + void extcap_options_finished(int result); + void showExtcapOptionsDialog(QString & device_name, bool startCaptureOnClose); + + friend class MainApplication; +}; + +#endif // LOGRAY_MAIN_WINDOW_H diff --git a/ui/logray/logray_main_window.ui b/ui/logray/logray_main_window.ui new file mode 100644 index 00000000..bf2f9bc6 --- /dev/null +++ b/ui/logray/logray_main_window.ui @@ -0,0 +1,2312 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>LograyMainWindow</class> + <widget class="QMainWindow" name="LograyMainWindow"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>960</width> + <height>768</height> + </rect> + </property> + <property name="acceptDrops"> + <bool>true</bool> + </property> + <property name="windowTitle"> + <string>Wireshark</string> + </property> + <property name="unifiedTitleAndToolBarOnMac"> + <bool>true</bool> + </property> + <widget class="QWidget" name="centralWidget"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="spacing"> + <number>0</number> + </property> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="AccordionFrame" name="goToFrame"> + <layout class="QHBoxLayout" name="goToHB"> + <property name="topMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>10</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="goToPacketLabel"> + <property name="text"> + <string>Packet:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="goToLineEdit"> + </widget> + </item> + <item> + <widget class="QPushButton" name="goToGo"> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>27</height> + </size> + </property> + <property name="text"> + <string>Go to packet</string> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="goToCancel"> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>27</height> + </size> + </property> + <property name="text"> + <string>Cancel</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="SearchFrame" name="searchFrame" native="true"/> + </item> + <item> + <widget class="AddressEditorFrame" name="addressEditorFrame"/> + </item> + <item> + <widget class="ColumnEditorFrame" name="columnEditorFrame"/> + </item> + <item> + <widget class="PreferenceEditorFrame" name="preferenceEditorFrame"/> + </item> + <item> + <widget class="FilterExpressionFrame" name="filterExpressionFrame"/> + </item> + <item> + <widget class="QStackedWidget" name="mainStack"> + <property name="enabled"> + <bool>true</bool> + </property> + <widget class="WelcomePage" name="welcomePage"/> + </widget> + </item> + </layout> + </widget> + <widget class="QMenuBar" name="menuBar"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>960</width> + <height>21</height> + </rect> + </property> + <widget class="QMenu" name="menuFile"> + <property name="title"> + <string>&File</string> + </property> + <widget class="QMenu" name="menuOpenRecentCaptureFile"> + <property name="title"> + <string>Open &Recent</string> + </property> + <addaction name="actionDummyNoFilesFound"/> + </widget> + <widget class="QMenu" name="menuFileSet"> + <property name="title"> + <string>File Set</string> + </property> + <addaction name="actionFileSetListFiles"/> + <addaction name="actionFileSetNextFile"/> + <addaction name="actionFileSetPreviousFile"/> + </widget> + <widget class="QMenu" name="menuFileExportPacketDissections"> + <property name="title"> + <string>Export Packet Dissections</string> + </property> + <addaction name="actionFileExportAsPlainText"/> + <addaction name="actionFileExportAsCSV"/> + <addaction name="actionFileExportAsCArrays"/> + <addaction name="separator"/> + <addaction name="actionFileExportAsPSML"/> + <addaction name="actionFileExportAsPDML"/> + <addaction name="actionFileExportAsJSON"/> + </widget> + <widget class="QMenu" name="menuFileExportObjects"> + <property name="title"> + <string>Export Objects</string> + </property> + </widget> + <addaction name="actionFileOpen"/> + <addaction name="menuOpenRecentCaptureFile"/> + <addaction name="actionFileMerge"/> + <addaction name="actionFileImportFromHexDump"/> + <addaction name="actionFileClose"/> + <addaction name="separator"/> + <addaction name="actionFileSave"/> + <addaction name="actionFileSaveAs"/> + <addaction name="separator"/> + <addaction name="menuFileSet"/> + <addaction name="separator"/> + <addaction name="actionFileExportPackets"/> + <addaction name="menuFileExportPacketDissections"/> + <addaction name="actionFileExportPacketBytes"/> + <addaction name="actionFileExportPDU"/> + <addaction name="menuFileExportObjects"/> + <addaction name="separator"/> + <addaction name="actionFilePrint"/> + <addaction name="separator"/> + <addaction name="actionFileQuit"/> + </widget> + <widget class="QMenu" name="menuCapture"> + <property name="title"> + <string>&Capture</string> + </property> + <addaction name="actionCaptureOptions"/> + <addaction name="actionCaptureStart"/> + <addaction name="actionCaptureStop"/> + <addaction name="actionCaptureRestart"/> + <addaction name="actionCaptureCaptureFilters"/> + <addaction name="actionCaptureRefreshInterfaces"/> + <addaction name="separator"/> + </widget> + <widget class="QMenu" name="menuHelp"> + <property name="title"> + <string>&Help</string> + </property> + <property name="toolTipsVisible"> + <bool>true</bool> + </property> + <widget class="QMenu" name="menuHelpManualPages"> + <property name="title"> + <string>Manual pages</string> + </property> + <property name="toolTipsVisible"> + <bool>true</bool> + </property> + <addaction name="actionHelpMPWireshark"/> + <addaction name="actionHelpMPWireshark_Filter"/> + <addaction name="separator"/> + <addaction name="actionHelpMPCapinfos"/> + <addaction name="actionHelpMPDumpcap"/> + <addaction name="actionHelpMPEditcap"/> + <addaction name="actionHelpMPMergecap"/> + <addaction name="actionHelpMPRawshark"/> + <addaction name="actionHelpMPReordercap"/> + <addaction name="actionHelpMPText2pcap"/> + <addaction name="actionHelpMPTShark"/> + </widget> + <addaction name="actionHelpContents"/> + <addaction name="menuHelpManualPages"/> + <addaction name="separator"/> + <addaction name="actionHelpWebsite"/> + <addaction name="actionHelpFAQ"/> + <addaction name="actionHelpAsk"/> + <addaction name="actionHelpDownloads"/> + <addaction name="separator"/> + <addaction name="actionHelpWiki"/> + <addaction name="actionHelpSampleCaptures"/> + <addaction name="separator"/> + <addaction name="actionHelpAbout"/> + </widget> + <widget class="QMenu" name="menuGo"> + <property name="title"> + <string>&Go</string> + </property> + <addaction name="actionGoGoToPacket"/> + <addaction name="actionGoGoToLinkedPacket"/> + <addaction name="separator"/> + <addaction name="actionGoNextPacket"/> + <addaction name="actionGoPreviousPacket"/> + <addaction name="actionGoFirstPacket"/> + <addaction name="actionGoLastPacket"/> + <addaction name="actionGoNextConversationPacket"/> + <addaction name="actionGoPreviousConversationPacket"/> + <addaction name="actionGoNextHistoryPacket"/> + <addaction name="actionGoPreviousHistoryPacket"/> + <addaction name="separator"/> + <addaction name="actionGoAutoScroll"/> + </widget> + <widget class="QMenu" name="menuView"> + <property name="title"> + <string>&View</string> + </property> + <widget class="QMenu" name="menuInterfaceToolbars"> + <property name="title"> + <string>Interface Toolbars</string> + </property> + </widget> + <widget class="QMenu" name="menuZoom"> + <property name="title"> + <string>&Zoom</string> + </property> + <addaction name="actionViewZoomIn"/> + <addaction name="actionViewZoomOut"/> + <addaction name="actionViewNormalSize"/> + </widget> + <widget class="QMenu" name="menuTime_Display_Format"> + <property name="title"> + <string>&Time Display Format</string> + </property> + <addaction name="actionViewTimeDisplayFormatDateYMDandTimeOfDay"/> + <addaction name="actionViewTimeDisplayFormatDateYDOYandTimeOfDay"/> + <addaction name="actionViewTimeDisplayFormatTimeOfDay"/> + <addaction name="actionViewTimeDisplayFormatSecondsSinceEpoch"/> + <addaction name="actionViewTimeDisplayFormatSecondsSinceBeginningOfCapture"/> + <addaction name="actionViewTimeDisplayFormatSecondsSincePreviousCapturedPacket"/> + <addaction name="actionViewTimeDisplayFormatSecondsSincePreviousDisplayedPacket"/> + <addaction name="actionViewTimeDisplayFormatUTCDateYMDandTimeOfDay"/> + <addaction name="actionViewTimeDisplayFormatUTCDateYDOYandTimeOfDay"/> + <addaction name="actionViewTimeDisplayFormatUTCTimeOfDay"/> + <addaction name="separator"/> + <addaction name="actionViewTimeDisplayFormatPrecisionAutomatic"/> + <addaction name="actionViewTimeDisplayFormatPrecisionSeconds"/> + <addaction name="actionViewTimeDisplayFormatPrecision100Milliseconds"/> + <addaction name="actionViewTimeDisplayFormatPrecision10Milliseconds"/> + <addaction name="actionViewTimeDisplayFormatPrecisionMilliseconds"/> + <addaction name="actionViewTimeDisplayFormatPrecision100Microseconds"/> + <addaction name="actionViewTimeDisplayFormatPrecision10Microseconds"/> + <addaction name="actionViewTimeDisplayFormatPrecisionMicroseconds"/> + <addaction name="actionViewTimeDisplayFormatPrecision100Nanoseconds"/> + <addaction name="actionViewTimeDisplayFormatPrecision10Nanoseconds"/> + <addaction name="actionViewTimeDisplayFormatPrecisionNanoseconds"/> + <addaction name="separator"/> + <addaction name="actionViewTimeDisplaySecondsWithHoursAndMinutes"/> + </widget> + <widget class="QMenu" name="menuName_Resolution"> + <property name="title"> + <string>Name Resol&ution</string> + </property> + <addaction name="actionViewEditResolvedName"/> + <addaction name="separator"/> + <addaction name="actionViewNameResolutionPhysical"/> + <addaction name="actionViewNameResolutionNetwork"/> + <addaction name="actionViewNameResolutionTransport"/> + </widget> + <widget class="QMenu" name="menuColorizeConversation"> + <property name="title"> + <string>Colorize Conversation</string> + </property> + <addaction name="actionViewColorizeConversation1"/> + <addaction name="actionViewColorizeConversation2"/> + <addaction name="actionViewColorizeConversation3"/> + <addaction name="actionViewColorizeConversation4"/> + <addaction name="actionViewColorizeConversation5"/> + <addaction name="actionViewColorizeConversation6"/> + <addaction name="actionViewColorizeConversation7"/> + <addaction name="actionViewColorizeConversation8"/> + <addaction name="actionViewColorizeConversation9"/> + <addaction name="actionViewColorizeConversation10"/> + <addaction name="separator"/> + <addaction name="actionViewColorizeResetColorization"/> + <addaction name="actionViewColorizeNewColoringRule"/> + </widget> + <widget class="QMenu" name="menuInternals"> + <property name="title"> + <string>Internals</string> + </property> + <addaction name="actionViewInternalsConversationHashTables"/> + <addaction name="actionViewInternalsDissectorTables"/> + <addaction name="actionViewInternalsSupportedProtocols"/> + </widget> + <widget class="QMenu" name="menuAdditionalToolbars"> + <property name="title"> + <string>Additional Toolbars</string> + </property> + </widget> + <addaction name="actionViewMainToolbar"/> + <addaction name="actionViewFilterToolbar"/> + <addaction name="menuInterfaceToolbars"/> + <addaction name="menuAdditionalToolbars"/> + <addaction name="actionViewStatusBar"/> + <addaction name="separator"/> + <addaction name="actionViewFullScreen"/> + <addaction name="separator"/> + <addaction name="actionViewPacketList"/> + <addaction name="actionViewPacketDetails"/> + <addaction name="actionViewPacketBytes"/> + <addaction name="actionViewPacketDiagram"/> + <addaction name="separator"/> + <addaction name="menuTime_Display_Format"/> + <addaction name="menuName_Resolution"/> + <addaction name="separator"/> + <addaction name="menuZoom"/> + <addaction name="separator"/> + <addaction name="actionViewExpandSubtrees"/> + <addaction name="actionViewCollapseSubtrees"/> + <addaction name="actionViewExpandAll"/> + <addaction name="actionViewCollapseAll"/> + <addaction name="separator"/> + <addaction name="actionViewColorizePacketList"/> + <addaction name="actionViewColoringRules"/> + <addaction name="menuColorizeConversation"/> + <addaction name="separator"/> + <addaction name="actionViewResetLayout"/> + <addaction name="actionViewResizeColumns"/> + <addaction name="separator"/> + <addaction name="menuInternals"/> + <addaction name="separator"/> + <addaction name="actionViewShowPacketInNewWindow"/> + <addaction name="actionViewReload_as_File_Format_or_Capture"/> + <addaction name="actionViewReload"/> + </widget> + <widget class="QMenu" name="menuAnalyze"> + <property name="title"> + <string>&Analyze</string> + </property> + <widget class="QMenu" name="menuApplyAsFilter"> + <property name="title"> + <string>Apply as Filter</string> + </property> + </widget> + <widget class="QMenu" name="menuPrepareAFilter"> + <property name="title"> + <string>Prepare as Filter</string> + </property> + </widget> + <widget class="QMenu" name="menuConversationFilter"> + <property name="title"> + <string>Conversation Filter</string> + </property> + </widget> + <addaction name="actionAnalyzeDisplayFilters"/> + <addaction name="actionAnalyzeDisplayFilterMacros"/> + <addaction name="actionDisplayFilterExpression"/> + <addaction name="separator"/> + <addaction name="actionAnalyzeApplyAsColumn"/> + <addaction name="menuApplyAsFilter"/> + <addaction name="menuPrepareAFilter"/> + <addaction name="menuConversationFilter"/> + <addaction name="separator"/> + <addaction name="actionAnalyzeEnabledProtocols"/> + <addaction name="actionAnalyzeDecodeAs"/> + <addaction name="actionAnalyzeReloadLuaPlugins"/> + <addaction name="separator"/> + <addaction name="actionAnalyzeShowPacketBytes"/> + <addaction name="actionAnalyzeExpertInfo"/> + </widget> + <widget class="QMenu" name="menuStatistics"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="title"> + <string>&Statistics</string> + </property> + <addaction name="actionStatisticsCaptureFileProperties"/> + <addaction name="actionStatisticsResolvedAddresses"/> + <addaction name="actionStatisticsProtocolHierarchy"/> + <addaction name="actionStatisticsConversations"/> + <addaction name="actionStatisticsEndpoints"/> + <addaction name="actionStatisticsPacketLengths"/> + <addaction name="actionStatisticsIOGraph"/> + <addaction name="separator"/> + <addaction name="actionStatistics_REGISTER_STAT_GROUP_UNSORTED"/> + <addaction name="actionStatisticsFlowGraph"/> + </widget> + <widget class="QMenu" name="menuEdit"> + <property name="title"> + <string>&Edit</string> + </property> + <widget class="QMenu" name="menuEditCopy"> + <property name="title"> + <string>Copy</string> + </property> + <addaction name="actionCopyListAsText"/> + <addaction name="actionCopyListAsCSV"/> + <addaction name="actionCopyListAsYAML"/> + <addaction name="separator"/> + <addaction name="actionCopyAllVisibleItems"/> + <addaction name="actionCopyAllVisibleSelectedTreeItems"/> + <addaction name="actionEditCopyDescription"/> + <addaction name="actionEditCopyFieldName"/> + <addaction name="actionEditCopyValue"/> + <addaction name="separator"/> + <addaction name="actionEditCopyAsFilter"/> + </widget> + <widget class="QMenu" name="menuPacketComment"> + <property name="title"> + <string>Packet Comments</string> + </property> + </widget> + <addaction name="menuEditCopy"/> + <addaction name="actionEditFindPacket"/> + <addaction name="actionEditFindNext"/> + <addaction name="actionEditFindPrevious"/> + <addaction name="separator"/> + <addaction name="actionEditMarkPacket"/> + <addaction name="actionEditMarkAllDisplayed"/> + <addaction name="actionEditUnmarkAllDisplayed"/> + <addaction name="actionEditNextMark"/> + <addaction name="actionEditPreviousMark"/> + <addaction name="separator"/> + <addaction name="actionEditIgnorePacket"/> + <addaction name="actionEditIgnoreAllDisplayed"/> + <addaction name="actionEditUnignoreAllDisplayed"/> + <addaction name="separator"/> + <addaction name="actionEditSetTimeReference"/> + <addaction name="actionEditUnsetAllTimeReferences"/> + <addaction name="actionEditNextTimeReference"/> + <addaction name="actionEditPreviousTimeReference"/> + <addaction name="separator"/> + <addaction name="actionEditTimeShift"/> + <addaction name="separator"/> + <addaction name="menuPacketComment"/> + <addaction name="actionDeleteAllPacketComments"/> + <addaction name="separator"/> + <addaction name="actionEditConfigurationProfiles"/> + <addaction name="actionEditPreferences"/> + </widget> + <widget class="QMenu" name="menuTools"> + <property name="title"> + <string>&Tools</string> + </property> + </widget> + <addaction name="menuFile"/> + <addaction name="menuEdit"/> + <addaction name="menuView"/> + <addaction name="menuGo"/> + <addaction name="menuCapture"/> + <addaction name="menuAnalyze"/> + <addaction name="menuStatistics"/> + <addaction name="menuTools"/> + <addaction name="menuHelp"/> + </widget> + <widget class="QToolBar" name="mainToolBar"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="windowTitle"> + <string>Main Toolbar</string> + </property> + <property name="movable"> + <bool>false</bool> + </property> + <property name="iconSize"> + <size> + <width>32</width> + <height>32</height> + </size> + </property> + <property name="toolButtonStyle"> + <enum>Qt::ToolButtonIconOnly</enum> + </property> + <attribute name="toolBarArea"> + <enum>TopToolBarArea</enum> + </attribute> + <attribute name="toolBarBreak"> + <bool>false</bool> + </attribute> + <addaction name="actionCaptureStart"/> + <addaction name="actionCaptureStop"/> + <addaction name="actionCaptureRestart"/> + <addaction name="actionCaptureOptions"/> + <addaction name="separator"/> + <addaction name="actionFileOpen"/> + <addaction name="actionFileSave"/> + <addaction name="actionFileClose"/> + <addaction name="actionViewReload"/> + <addaction name="separator"/> + <addaction name="actionEditFindPacket"/> + <addaction name="actionGoPreviousPacket"/> + <addaction name="actionGoNextPacket"/> + <addaction name="actionGoGoToPacket"/> + <addaction name="actionGoFirstPacket"/> + <addaction name="actionGoLastPacket"/> + <addaction name="actionGoAutoScroll"/> + <addaction name="separator"/> + <addaction name="actionViewColorizePacketList"/> + <addaction name="separator"/> + <addaction name="actionViewZoomIn"/> + <addaction name="actionViewZoomOut"/> + <addaction name="actionViewNormalSize"/> + <addaction name="actionViewResizeColumns"/> + </widget> + <widget class="MainStatusBar" name="statusBar"/> + <widget class="QToolBar" name="displayFilterToolBar"> + <property name="windowTitle"> + <string>Display Filter Toolbar</string> + </property> + <property name="movable"> + <bool>false</bool> + </property> + <property name="iconSize"> + <size> + <width>14</width> + <height>14</height> + </size> + </property> + <attribute name="toolBarArea"> + <enum>TopToolBarArea</enum> + </attribute> + <attribute name="toolBarBreak"> + <bool>true</bool> + </attribute> + <addaction name="actionNewDisplayFilterExpression"/> + </widget> + <action name="actionFileOpen"> + <property name="text"> + <string>&Open</string> + </property> + <property name="toolTip"> + <string>Open a capture file</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+O</string> + </property> + <property name="iconVisibleInMenu"> + <bool>false</bool> + </property> + </action> + <action name="actionFileQuit"> + <property name="text"> + <string>&Quit</string> + </property> + <property name="toolTip"> + <string>Quit Wireshark</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Q</string> + </property> + <property name="menuRole"> + <enum>QAction::QuitRole</enum> + </property> + </action> + <action name="actionCaptureStart"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>&Start</string> + </property> + <property name="toolTip"> + <string>Start capturing packets</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+E</string> + </property> + </action> + <action name="actionCaptureStop"> + <property name="text"> + <string>S&top</string> + </property> + <property name="toolTip"> + <string>Stop capturing packets</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+E</string> + </property> + </action> + <action name="actionFileClose"> + <property name="text"> + <string>&Close</string> + </property> + <property name="toolTip"> + <string>Close this capture file</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+W</string> + </property> + <property name="iconVisibleInMenu"> + <bool>false</bool> + </property> + </action> + <action name="actionDummyNoFilesFound"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>No files found</string> + </property> + </action> + <action name="actionHelpContents"> + <property name="text"> + <string>&Contents</string> + </property> + <property name="toolTip"> + <string>Help contents</string> + </property> + <property name="shortcut"> + <string notr="true">F1</string> + </property> + <property name="iconVisibleInMenu"> + <bool>true</bool> + </property> + </action> + <action name="actionHelpMPWireshark"> + <property name="text"> + <string>Wireshark</string> + </property> + </action> + <action name="actionHelpMPWireshark_Filter"> + <property name="text"> + <string>Wireshark Filter</string> + </property> + </action> + <action name="actionHelpMPTShark"> + <property name="text"> + <string>TShark</string> + </property> + </action> + <action name="actionHelpMPRawshark"> + <property name="text"> + <string>Rawshark</string> + </property> + </action> + <action name="actionHelpMPDumpcap"> + <property name="text"> + <string>Dumpcap</string> + </property> + </action> + <action name="actionHelpMPMergecap"> + <property name="text"> + <string>Mergecap</string> + </property> + </action> + <action name="actionHelpMPEditcap"> + <property name="text"> + <string>Editcap</string> + </property> + </action> + <action name="actionHelpMPText2pcap"> + <property name="text"> + <string>Text2pcap</string> + </property> + </action> + <action name="actionHelpWebsite"> + <property name="icon"> + <iconset resource="../../resources/stock_icons.qrc"> + <normaloff>:/menu/help/lricon16.png</normaloff>:/menu/help/lricon16.png</iconset> + </property> + <property name="text"> + <string>Website</string> + </property> + </action> + <action name="actionHelpFAQ"> + <property name="text"> + <string>FAQs</string> + </property> + </action> + <action name="actionHelpDownloads"> + <property name="text"> + <string>Downloads</string> + </property> + </action> + <action name="actionHelpWiki"> + <property name="icon"> + <iconset resource="../../resources/stock_icons.qrc"> + <normaloff>:/menu/help/lricon16.png</normaloff>:/menu/help/lricon16.png</iconset> + </property> + <property name="text"> + <string>Wiki</string> + </property> + <property name="iconVisibleInMenu"> + <bool>true</bool> + </property> + </action> + <action name="actionHelpSampleCaptures"> + <property name="text"> + <string>Sample Captures</string> + </property> + </action> + <action name="actionHelpAbout"> + <property name="text"> + <string>&About Wireshark</string> + </property> + <property name="menuRole"> + <enum>QAction::AboutRole</enum> + </property> + </action> + <action name="actionHelpAsk"> + <property name="icon"> + <iconset resource="../../resources/stock_icons.qrc"> + <normaloff>:/menu/help/wsicon-ask.png</normaloff>:/menu/help/wsicon-ask.png</iconset> + </property> + <property name="text"> + <string>Ask (Q&&A)</string> + </property> + <property name="iconVisibleInMenu"> + <bool>true</bool> + </property> + </action> + <action name="actionGoNextPacket"> + <property name="text"> + <string>Next Packet</string> + </property> + <property name="toolTip"> + <string>Go to the next packet</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Down</string> + </property> + </action> + <action name="actionGoPreviousPacket"> + <property name="text"> + <string>Previous Packet</string> + </property> + <property name="toolTip"> + <string>Go to the previous packet</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Up</string> + </property> + </action> + <action name="actionGoNextConversationPacket"> + <property name="text"> + <string>Next Packet in Conversation</string> + </property> + <property name="toolTip"> + <string>Go to the next packet in this conversation</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+.</string> + </property> + </action> + <action name="actionGoPreviousConversationPacket"> + <property name="text"> + <string>Previous Packet in Conversation</string> + </property> + <property name="toolTip"> + <string>Go to the previous packet in this conversation</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+,</string> + </property> + </action> + <action name="actionGoNextHistoryPacket"> + <property name="text"> + <string>Next Packet In History</string> + </property> + <property name="toolTip"> + <string>Go to the next packet in your selection history</string> + </property> + <property name="shortcut"> + <string notr="true">Alt+Right</string> + </property> + </action> + <action name="actionGoPreviousHistoryPacket"> + <property name="text"> + <string>Previous Packet In History</string> + </property> + <property name="toolTip"> + <string>Go to the previous packet in your selection history</string> + </property> + <property name="shortcut"> + <string notr="true">Alt+Left</string> + </property> + </action> + <action name="actionGoFirstPacket"> + <property name="text"> + <string>First Packet</string> + </property> + <property name="toolTip"> + <string>Go to the first packet</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Home</string> + </property> + </action> + <action name="actionGoLastPacket"> + <property name="text"> + <string>Last Packet</string> + </property> + <property name="toolTip"> + <string>Go to the last packet</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+End</string> + </property> + </action> + <action name="actionViewExpandSubtrees"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>E&xpand Subtrees</string> + </property> + <property name="toolTip"> + <string>Expand the current packet detail</string> + </property> + <property name="shortcut"> + <string notr="true">Shift+Right</string> + </property> + </action> + <action name="actionViewCollapseSubtrees"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Collapse Subtrees</string> + </property> + <property name="toolTip"> + <string>Collapse the current packet detail</string> + </property> + <property name="shortcut"> + <string notr="true">Shift+Left</string> + </property> + </action> + <action name="actionViewExpandAll"> + <property name="text"> + <string>&Expand All</string> + </property> + <property name="toolTip"> + <string>Expand packet details</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Right</string> + </property> + </action> + <action name="actionViewCollapseAll"> + <property name="text"> + <string>Collapse &All</string> + </property> + <property name="toolTip"> + <string>Collapse all packet details</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Left</string> + </property> + </action> + <action name="actionGoGoToPacket"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Go to Packet…</string> + </property> + <property name="toolTip"> + <string>Go to specified packet</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+G</string> + </property> + </action> + <action name="actionFileMerge"> + <property name="text"> + <string>&Merge…</string> + </property> + <property name="toolTip"> + <string>Merge one or more files</string> + </property> + </action> + <action name="actionFileImportFromHexDump"> + <property name="text"> + <string>&Import from Hex Dump…</string> + </property> + <property name="toolTip"> + <string>Import a file</string> + </property> + </action> + <action name="actionFileSave"> + <property name="text"> + <string>&Save</string> + </property> + <property name="toolTip"> + <string>Save this capture file</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+S</string> + </property> + <property name="iconVisibleInMenu"> + <bool>false</bool> + </property> + </action> + <action name="actionFileSaveAs"> + <property name="text"> + <string>Save &As…</string> + </property> + <property name="toolTip"> + <string>Save as a different file</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Shift+S</string> + </property> + </action> + <action name="actionFileExportPackets"> + <property name="text"> + <string>Export Specified Packets…</string> + </property> + <property name="toolTip"> + <string>Export specified packets</string> + </property> + </action> + <action name="actionFileExportPacketBytes"> + <property name="text"> + <string>Export Packet &Bytes…</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Shift+X</string> + </property> + </action> + <action name="actionFilePrint"> + <property name="text"> + <string>&Print…</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+P</string> + </property> + </action> + <action name="actionFileSetListFiles"> + <property name="text"> + <string>List Files</string> + </property> + </action> + <action name="actionFileSetNextFile"> + <property name="text"> + <string>Next File</string> + </property> + </action> + <action name="actionFileSetPreviousFile"> + <property name="text"> + <string>Previous File</string> + </property> + </action> + <action name="actionViewReload"> + <property name="text"> + <string>&Reload</string> + </property> + <property name="toolTip"> + <string>Reload this file</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+R</string> + </property> + <property name="iconVisibleInMenu"> + <bool>true</bool> + </property> + </action> + <action name="actionViewReload_as_File_Format_or_Capture"> + <property name="text"> + <string>Reload as File Format/Capture</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Shift+F</string> + </property> + </action> + <action name="actionCaptureOptions"> + <property name="text"> + <string>&Options…</string> + </property> + <property name="iconText"> + <string>Options</string> + </property> + <property name="toolTip"> + <string>Capture options</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+K</string> + </property> + <property name="menuRole"> + <enum>QAction::NoRole</enum> + </property> + </action> + <action name="actionCaptureCaptureFilters"> + <property name="text"> + <string>Capture &Filters…</string> + </property> + <property name="toolTip"> + <string>Capture filters</string> + </property> + </action> + <action name="actionCaptureRefreshInterfaces"> + <property name="text"> + <string>Refresh Interfaces</string> + </property> + <property name="toolTip"> + <string>Refresh interfaces</string> + </property> + <property name="shortcut"> + <string notr="true">F5</string> + </property> + </action> + <action name="actionCaptureRestart"> + <property name="text"> + <string>&Restart</string> + </property> + <property name="toolTip"> + <string>Restart current capture</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+R</string> + </property> + </action> + <action name="actionFileExportAsPlainText"> + <property name="text"> + <string>As Plain &Text…</string> + </property> + </action> + <action name="actionFileExportAsCSV"> + <property name="text"> + <string>As &CSV…</string> + </property> + </action> + <action name="actionFileExportAsCArrays"> + <property name="text"> + <string>As "C" &Arrays…</string> + </property> + </action> + <action name="actionFileExportAsPSML"> + <property name="text"> + <string>As P&SML XML…</string> + </property> + </action> + <action name="actionFileExportAsPDML"> + <property name="text"> + <string>As P&DML XML…</string> + </property> + </action> + <action name="actionFileExportAsJSON"> + <property name="text"> + <string>As &JSON…</string> + </property> + </action> + <action name="actionEditCopyDescription"> + <property name="text"> + <string>Description</string> + </property> + <property name="toolTip"> + <string>Copy this item's description</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+Shift+D</string> + </property> + </action> + <action name="actionCopyListAsText"> + <property name="text"> + <string>As Plain &Text</string> + </property> + </action> + <action name="actionCopyListAsCSV"> + <property name="text"> + <string>As &CSV</string> + </property> + </action> + <action name="actionCopyListAsYAML"> + <property name="text"> + <string>As &YAML</string> + </property> + </action> + <action name="actionCopyAllVisibleItems"> + <property name="text"> + <string>All Visible Items</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+Shift+A</string> + </property> + </action> + <action name="actionCopyAllVisibleSelectedTreeItems"> + <property name="text"> + <string>All Visible Selected Tree Items</string> + </property> + </action> + <action name="actionEditCopyFieldName"> + <property name="text"> + <string>Field Name</string> + </property> + <property name="toolTip"> + <string>Copy this item's field name</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+Shift+F</string> + </property> + </action> + <action name="actionEditCopyValue"> + <property name="text"> + <string>Value</string> + </property> + <property name="toolTip"> + <string>Copy this item's value</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+Shift+V</string> + </property> + </action> + <action name="actionEditCopyAsFilter"> + <property name="text"> + <string>As Filter</string> + </property> + <property name="toolTip"> + <string>Copy this item as a display filter</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Shift+C</string> + </property> + </action> + <action name="actionAnalyzeDisplayFilters"> + <property name="text"> + <string>Display &Filters…</string> + </property> + </action> + <action name="actionAnalyzeDisplayFilterMacros"> + <property name="text"> + <string>Display Filter &Macros…</string> + </property> + </action> + <action name="actionAnalyzeApplyAsColumn"> + <property name="text"> + <string>Apply as Column</string> + </property> + <property name="toolTip"> + <string>Create a packet list column from the selected field.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Shift+I</string> + </property> + </action> + <action name="actionEditFindPacket"> + <property name="text"> + <string>&Find Packet…</string> + </property> + <property name="toolTip"> + <string>Find a packet</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+F</string> + </property> + </action> + <action name="actionEditFindNext"> + <property name="text"> + <string>Find Ne&xt</string> + </property> + <property name="toolTip"> + <string>Find the next packet</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+N</string> + </property> + </action> + <action name="actionEditFindPrevious"> + <property name="text"> + <string>Find Pre&vious</string> + </property> + <property name="toolTip"> + <string>Find the previous packet</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+B</string> + </property> + </action> + <action name="actionEditMarkPacket"> + <property name="text"> + <string>&Mark/Unmark Packet(s)</string> + </property> + <property name="toolTip"> + <string>Mark or unmark each selected packet</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+M</string> + </property> + </action> + <action name="actionEditMarkAllDisplayed"> + <property name="text"> + <string>Mark All Displayed</string> + </property> + <property name="toolTip"> + <string>Mark all displayed packets</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Shift+M</string> + </property> + </action> + <action name="actionEditUnmarkAllDisplayed"> + <property name="text"> + <string>&Unmark All Displayed</string> + </property> + <property name="toolTip"> + <string>Unmark all displayed packets</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+M</string> + </property> + </action> + <action name="actionEditNextMark"> + <property name="text"> + <string>Next Mark</string> + </property> + <property name="toolTip"> + <string>Go to the next marked packet</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Shift+N</string> + </property> + </action> + <action name="actionEditPreviousMark"> + <property name="text"> + <string>Previous Mark</string> + </property> + <property name="toolTip"> + <string>Go to the previous marked packet</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Shift+B</string> + </property> + </action> + <action name="actionEditIgnorePacket"> + <property name="text"> + <string>&Ignore/Unignore Packet(s)</string> + </property> + <property name="toolTip"> + <string>Ignore or unignore each selected packet</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+D</string> + </property> + </action> + <action name="actionEditIgnoreAllDisplayed"> + <property name="text"> + <string>Ignore All Displayed</string> + </property> + <property name="toolTip"> + <string>Ignore all displayed packets</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Shift+D</string> + </property> + </action> + <action name="actionEditUnignoreAllDisplayed"> + <property name="text"> + <string>U&nignore All Displayed</string> + </property> + <property name="toolTip"> + <string>Unignore all displayed packets</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+D</string> + </property> + </action> + <action name="actionEditSetTimeReference"> + <property name="text"> + <string>Set/Unset Time Reference</string> + </property> + <property name="toolTip"> + <string>Set or unset a time reference for this packet</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+T</string> + </property> + </action> + <action name="actionEditUnsetAllTimeReferences"> + <property name="text"> + <string>Unset All Time References</string> + </property> + <property name="toolTip"> + <string>Remove all time references</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+T</string> + </property> + </action> + <action name="actionEditNextTimeReference"> + <property name="text"> + <string>Next Time Reference</string> + </property> + <property name="toolTip"> + <string>Go to the next time reference</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+N</string> + </property> + </action> + <action name="actionEditPreviousTimeReference"> + <property name="text"> + <string>Previous Time Reference</string> + </property> + <property name="toolTip"> + <string>Go to the previous time reference</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+B</string> + </property> + </action> + <action name="actionEditTimeShift"> + <property name="text"> + <string>Time Shift…</string> + </property> + <property name="toolTip"> + <string>Shift or change packet timestamps</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Shift+T</string> + </property> + </action> + <action name="actionDeleteAllPacketComments"> + <property name="text"> + <string>Delete All Packet Comments</string> + </property> + <property name="toolTip"> + <string>Remove all packet comments in the capture file</string> + </property> + </action> + <action name="actionEditConfigurationProfiles"> + <property name="checkable"> + <bool>false</bool> + </property> + <property name="text"> + <string>&Configuration Profiles…</string> + </property> + <property name="iconText"> + <string>Configuration profiles</string> + </property> + <property name="toolTip"> + <string>Manage your configuration profiles</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Shift+A</string> + </property> + <property name="menuRole"> + <enum>QAction::NoRole</enum> + </property> + </action> + <action name="actionEditPreferences"> + <property name="text"> + <string>&Preferences…</string> + </property> + <property name="toolTip"> + <string>Manage Wireshark's preferences</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Shift+P</string> + </property> + <property name="menuRole"> + <enum>QAction::PreferencesRole</enum> + </property> + </action> + <action name="actionStatisticsCaptureFileProperties"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Capture File Properties</string> + </property> + <property name="toolTip"> + <string>Capture file properties</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+Shift+C</string> + </property> + </action> + <action name="actionStatisticsProtocolHierarchy"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>&Protocol Hierarchy</string> + </property> + <property name="toolTip"> + <string>Show a summary of protocols present in the capture file.</string> + </property> + </action> + <action name="actionHelpMPCapinfos"> + <property name="text"> + <string>Capinfos</string> + </property> + </action> + <action name="actionHelpMPReordercap"> + <property name="text"> + <string>Reordercap</string> + </property> + </action> + <action name="actionStatisticsFlowGraph"> + <property name="text"> + <string>Flow Graph</string> + </property> + <property name="toolTip"> + <string>Flow sequence diagram</string> + </property> + </action> + <action name="actionStatisticsPacketLengths"> + <property name="text"> + <string>Packet Lengths</string> + </property> + <property name="toolTip"> + <string>Packet length statistics</string> + </property> + </action> + <action name="actionAnalyzeDecodeAs"> + <property name="text"> + <string>Decode &As…</string> + </property> + <property name="toolTip"> + <string>Change the way packets are dissected</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Shift+U</string> + </property> + </action> + <action name="actionAnalyzeReloadLuaPlugins"> + <property name="text"> + <string>Reload Lua Plugins</string> + </property> + <property name="toolTip"> + <string>Reload Lua plugins</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Shift+L</string> + </property> + </action> + <action name="actionFileExportPDU"> + <property name="text"> + <string>Export PDUs to File…</string> + </property> + </action> + <action name="actionStatisticsIOGraph"> + <property name="text"> + <string>&I/O Graphs</string> + </property> + <property name="toolTip"> + <string>Create graphs based on display filter fields</string> + </property> + </action> + <action name="actionViewMainToolbar"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="text"> + <string>&Main Toolbar</string> + </property> + <property name="toolTip"> + <string>Show or hide the main toolbar</string> + </property> + </action> + <action name="actionViewFilterToolbar"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="text"> + <string>&Filter Toolbar</string> + </property> + <property name="toolTip"> + <string>Show or hide the display filter toolbar</string> + </property> + </action> + <action name="actionStatisticsConversations"> + <property name="text"> + <string>&Conversations</string> + </property> + <property name="toolTip"> + <string>Conversations at different protocol levels</string> + </property> + </action> + <action name="actionStatisticsEndpoints"> + <property name="text"> + <string>&Endpoints</string> + </property> + <property name="toolTip"> + <string>Endpoints at different protocol levels</string> + </property> + </action> + <action name="actionViewColorizePacketList"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Colorize Packet List</string> + </property> + <property name="toolTip"> + <string>Draw packets using your coloring rules</string> + </property> + </action> + <action name="actionViewZoomIn"> + <property name="text"> + <string>&Zoom In</string> + </property> + <property name="toolTip"> + <string>Enlarge the main window text</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl++</string> + </property> + </action> + <action name="actionViewZoomOut"> + <property name="text"> + <string>Zoom Out</string> + </property> + <property name="toolTip"> + <string>Shrink the main window text</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+-</string> + </property> + </action> + <action name="actionViewNormalSize"> + <property name="text"> + <string>Normal Size</string> + </property> + <property name="toolTip"> + <string>Return the main window text to its normal size</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+0</string> + </property> + </action> + <action name="actionViewResetLayout"> + <property name="text"> + <string>Reset Layout</string> + </property> + <property name="toolTip"> + <string>Reset appearance layout to default size</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Shift+W</string> + </property> + </action> + <action name="actionViewResizeColumns"> + <property name="text"> + <string>Resize Columns</string> + </property> + <property name="toolTip"> + <string>Resize packet list columns to fit contents</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Shift+R</string> + </property> + </action> + <action name="actionViewTimeDisplayFormatDateYMDandTimeOfDay"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Date and Time of Day (1970-01-01 01:02:03.123456)</string> + </property> + <property name="toolTip"> + <string>Show packet times as the date and time of day.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+1</string> + </property> + </action> + <action name="actionViewTimeDisplayFormatDateYDOYandTimeOfDay"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Year, Day of Year, and Time of Day (1970/001 01:02:03.123456)</string> + </property> + <property name="toolTip"> + <string>Show packet times as the year, day of the year and time of day.</string> + </property> + </action> + <action name="actionViewTimeDisplayFormatTimeOfDay"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Time of Day (01:02:03.123456)</string> + </property> + <property name="toolTip"> + <string>Show packet times as the date and time of day.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+2</string> + </property> + </action> + <action name="actionViewTimeDisplayFormatSecondsSinceEpoch"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Seconds Since 1970-01-01</string> + </property> + <property name="toolTip"> + <string>Show packet times as the seconds since the UNIX / POSIX epoch (1970-01-01).</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+3</string> + </property> + </action> + <action name="actionViewTimeDisplayFormatSecondsSinceBeginningOfCapture"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Seconds Since Beginning of Capture</string> + </property> + <property name="toolTip"> + <string>Show packet times as the date and time of day.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+4</string> + </property> + </action> + <action name="actionViewTimeDisplayFormatSecondsSincePreviousCapturedPacket"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Seconds Since Previous Captured Packet</string> + </property> + <property name="toolTip"> + <string>Show packet times as the seconds since the previous captured packet.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+5</string> + </property> + </action> + <action name="actionViewTimeDisplayFormatSecondsSincePreviousDisplayedPacket"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Seconds Since Previous Displayed Packet</string> + </property> + <property name="toolTip"> + <string>Show packet times as the seconds since the previous displayed packet.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+6</string> + </property> + </action> + <action name="actionViewTimeDisplayFormatUTCDateYMDandTimeOfDay"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>UTC Date and Time of Day (1970-01-01 01:02:03.123456)</string> + </property> + <property name="toolTip"> + <string>Show packet times as the UTC date and time of day.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+7</string> + </property> + </action> + <action name="actionViewTimeDisplayFormatUTCDateYDOYandTimeOfDay"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>UTC Year, Day of Year, and Time of Day (1970/001 01:02:03.123456)</string> + </property> + <property name="toolTip"> + <string>Show packet times as the UTC year, day of the year and time of day.</string> + </property> + </action> + <action name="actionViewTimeDisplayFormatUTCTimeOfDay"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>UTC Time of Day (01:02:03.123456)</string> + </property> + <property name="toolTip"> + <string>Show packet times as the UTC time of day.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+8</string> + </property> + </action> + <action name="actionViewTimeDisplayFormatPrecisionAutomatic"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Automatic (from capture file)</string> + </property> + <property name="toolTip"> + <string>Use the time precision indicated in the capture file.</string> + </property> + </action> + <action name="actionViewTimeDisplayFormatPrecisionSeconds"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Seconds</string> + </property> + </action> + <action name="actionViewTimeDisplayFormatPrecision100Milliseconds"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Tenths of a second</string> + </property> + </action> + <action name="actionViewTimeDisplayFormatPrecision10Milliseconds"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Hundredths of a second</string> + </property> + </action> + <action name="actionViewTimeDisplayFormatPrecisionMilliseconds"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Milliseconds</string> + </property> + </action> + <action name="actionViewTimeDisplayFormatPrecision100Microseconds"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Tenths of a millisecond</string> + </property> + </action> + <action name="actionViewTimeDisplayFormatPrecision10Microseconds"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Hundredths of a millisecond</string> + </property> + </action> + <action name="actionViewTimeDisplayFormatPrecisionMicroseconds"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Microseconds</string> + </property> + </action> + <action name="actionViewTimeDisplayFormatPrecision100Nanoseconds"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Tenths of a microsecond</string> + </property> + </action> + <action name="actionViewTimeDisplayFormatPrecision10Nanoseconds"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Hundredths of a microsecond</string> + </property> + </action> + <action name="actionViewTimeDisplayFormatPrecisionNanoseconds"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Nanoseconds</string> + </property> + </action> + <action name="actionViewTimeDisplaySecondsWithHoursAndMinutes"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Display Seconds With Hours and Minutes</string> + </property> + <property name="toolTip"> + <string>Display seconds with hours and minutes</string> + </property> + </action> + <action name="actionViewNameResolutionPhysical"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Resolve &Physical Addresses</string> + </property> + <property name="toolTip"> + <string>Show names for known MAC addresses. Lookups use a local database.</string> + </property> + </action> + <action name="actionViewNameResolutionNetwork"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Resolve &Network Addresses</string> + </property> + <property name="toolTip"> + <string>Show names for known IPv4, IPv6, and IPX addresses. Lookups can generate network traffic.</string> + </property> + </action> + <action name="actionViewNameResolutionTransport"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Resolve &Transport Addresses</string> + </property> + <property name="toolTip"> + <string>Show names for known TCP, UDP, and SCTP services. Lookups can generate traffic on some systems.</string> + </property> + </action> + <action name="actionViewStatusBar"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="text"> + <string>&Status Bar</string> + </property> + <property name="toolTip"> + <string>Show or hide the status bar</string> + </property> + </action> + <action name="actionViewPacketList"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="text"> + <string>Packet &List</string> + </property> + <property name="toolTip"> + <string>Show or hide the packet list</string> + </property> + </action> + <action name="actionViewPacketDetails"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="text"> + <string>Packet &Details</string> + </property> + <property name="toolTip"> + <string>Show or hide the packet details</string> + </property> + </action> + <action name="actionViewPacketBytes"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="text"> + <string>Packet &Bytes</string> + </property> + <property name="toolTip"> + <string>Show or hide the packet bytes</string> + </property> + </action> + <action name="actionViewPacketDiagram"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="text"> + <string>Packet &Diagram</string> + </property> + <property name="toolTip"> + <string>Show or hide the packet diagram</string> + </property> + </action> + <action name="actionViewInternalsConversationHashTables"> + <property name="text"> + <string>&Conversation Hash Tables</string> + </property> + <property name="toolTip"> + <string>Show each conversation hash table</string> + </property> + </action> + <action name="actionViewInternalsDissectorTables"> + <property name="text"> + <string>&Dissector Tables</string> + </property> + <property name="toolTip"> + <string>Show each dissector table and its entries</string> + </property> + </action> + <action name="actionViewInternalsSupportedProtocols"> + <property name="text"> + <string>&Supported Protocols</string> + </property> + <property name="toolTip"> + <string>Show the currently supported protocols and display filter fields</string> + </property> + </action> + <action name="actionViewColoringRules"> + <property name="text"> + <string>&Coloring Rules…</string> + </property> + <property name="toolTip"> + <string>Edit the packet list coloring rules.</string> + </property> + </action> + <action name="actionViewShowPacketInNewWindow"> + <property name="text"> + <string>Show Packet in New &Window</string> + </property> + <property name="toolTip"> + <string>Show this packet in a separate window.</string> + </property> + </action> + <action name="actionContextShowLinkedPacketInNewWindow"> + <property name="text"> + <string>Show Linked Packet in New Window</string> + </property> + <property name="toolTip"> + <string>Show the linked packet in a separate window.</string> + </property> + </action> + <action name="actionGoAutoScroll"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Auto Scroll in Li&ve Capture</string> + </property> + <property name="toolTip"> + <string>Automatically scroll to the last packet during a live capture.</string> + </property> + </action> + <action name="actionAnalyzeExpertInfo"> + <property name="text"> + <string>Expert Information</string> + </property> + <property name="toolTip"> + <string>Show expert notifications</string> + </property> + </action> + <action name="actionDisplayFilterExpression"> + <property name="text"> + <string>Display Filter &Expression…</string> + </property> + <property name="iconText"> + <string>Display Filter Expression…</string> + </property> + <property name="toolTip"> + <string>Add an expression to the display filter.</string> + </property> + </action> + <action name="actionStatistics_REGISTER_STAT_GROUP_UNSORTED"> + <property name="text"> + <string>REGISTER_STAT_GROUP_UNSORTED</string> + </property> + <property name="toolTip"> + <string>Start of "REGISTER_STAT_GROUP_UNSORTED"</string> + </property> + <property name="visible"> + <bool>false</bool> + </property> + <property name="menuRole"> + <enum>QAction::NoRole</enum> + </property> + </action> + <action name="actionStatisticsResolvedAddresses"> + <property name="text"> + <string>Resolved Addresses</string> + </property> + <property name="toolTip"> + <string>Show each table of resolved addresses as copyable text.</string> + </property> + </action> + <action name="actionViewColorizeConversation1"> + <property name="text"> + <string>Color &1</string> + </property> + <property name="toolTip"> + <string>Mark the current conversation with its own color.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+1</string> + </property> + </action> + <action name="actionViewColorizeConversation2"> + <property name="text"> + <string>Color &2</string> + </property> + <property name="toolTip"> + <string>Mark the current conversation with its own color.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+2</string> + </property> + </action> + <action name="actionViewColorizeConversation3"> + <property name="text"> + <string>Color &3</string> + </property> + <property name="toolTip"> + <string>Mark the current conversation with its own color.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+3</string> + </property> + </action> + <action name="actionViewColorizeConversation4"> + <property name="text"> + <string>Color &4</string> + </property> + <property name="toolTip"> + <string>Mark the current conversation with its own color.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+4</string> + </property> + </action> + <action name="actionViewColorizeConversation5"> + <property name="text"> + <string>Color &5</string> + </property> + <property name="toolTip"> + <string>Mark the current conversation with its own color.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+5</string> + </property> + </action> + <action name="actionViewColorizeConversation6"> + <property name="text"> + <string>Color &6</string> + </property> + <property name="toolTip"> + <string>Mark the current conversation with its own color.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+6</string> + </property> + </action> + <action name="actionViewColorizeConversation7"> + <property name="text"> + <string>Color &7</string> + </property> + <property name="toolTip"> + <string>Mark the current conversation with its own color.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+7</string> + </property> + </action> + <action name="actionViewColorizeConversation8"> + <property name="text"> + <string>Color &8</string> + </property> + <property name="toolTip"> + <string>Mark the current conversation with its own color.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+8</string> + </property> + </action> + <action name="actionViewColorizeConversation9"> + <property name="text"> + <string>Color &9</string> + </property> + <property name="toolTip"> + <string>Mark the current conversation with its own color.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+9</string> + </property> + </action> + <action name="actionViewColorizeConversation10"> + <property name="text"> + <string>Color 1&0</string> + </property> + <property name="toolTip"> + <string>Mark the current conversation with its own color.</string> + </property> + </action> + <action name="actionViewColorizeNewColoringRule"> + <property name="text"> + <string>New Coloring Rule…</string> + </property> + <property name="toolTip"> + <string>Create a new coloring rule based on this field.</string> + </property> + </action> + <action name="actionViewColorizeResetColorization"> + <property name="text"> + <string>Reset Colorization</string> + </property> + <property name="toolTip"> + <string>Reset colorized conversations.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Space</string> + </property> + </action> + <action name="actionViewEditResolvedName"> + <property name="text"> + <string>Edit Resolved Name</string> + </property> + <property name="toolTip"> + <string>Manually edit a name resolution entry.</string> + </property> + </action> + <action name="actionAnalyzeEnabledProtocols"> + <property name="text"> + <string>Enabled Protocols…</string> + </property> + <property name="toolTip"> + <string>Enable and disable specific protocols</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Shift+E</string> + </property> + </action> + <action name="actionAnalyzeShowPacketBytes"> + <property name="text"> + <string>Show Packet Bytes…</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Shift+O</string> + </property> + </action> + <action name="actionContextWikiProtocolPage"> + <property name="text"> + <string>Wiki Protocol Page</string> + </property> + <property name="toolTip"> + <string>Open the Wireshark wiki page for this protocol.</string> + </property> + </action> + <action name="actionContextFilterFieldReference"> + <property name="text"> + <string>Filter Field Reference</string> + </property> + <property name="toolTip"> + <string>Open the display filter reference page for this filter field.</string> + </property> + </action> + <action name="actionGoGoToLinkedPacket"> + <property name="text"> + <string>Go to &Linked Packet</string> + </property> + <property name="toolTip"> + <string>Go to the packet referenced by the selected field.</string> + </property> + </action> + <action name="actionNewDisplayFilterExpression"> + <property name="toolTip"> + <string>Add a display filter button.</string> + </property> + </action> + <action name="actionViewFullScreen"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>&Full Screen</string> + </property> + </action> + </widget> + <layoutdefault spacing="6" margin="11"/> + <customwidgets> + <customwidget> + <class>AccordionFrame</class> + <extends>QFrame</extends> + <header>accordion_frame.h</header> + <container>1</container> + </customwidget> + <customwidget> + <class>MainStatusBar</class> + <extends>QStatusBar</extends> + <header>main_status_bar.h</header> + </customwidget> + <customwidget> + <class>WelcomePage</class> + <extends>QFrame</extends> + <header>welcome_page.h</header> + <container>1</container> + </customwidget> + <customwidget> + <class>SearchFrame</class> + <extends>QWidget</extends> + <header>search_frame.h</header> + </customwidget> + <customwidget> + <class>ColumnEditorFrame</class> + <extends>QFrame</extends> + <header>column_editor_frame.h</header> + <container>1</container> + </customwidget> + <customwidget> + <class>PreferenceEditorFrame</class> + <extends>QFrame</extends> + <header>preference_editor_frame.h</header> + <container>1</container> + </customwidget> + <customwidget> + <class>AddressEditorFrame</class> + <extends>QFrame</extends> + <header>address_editor_frame.h</header> + <container>1</container> + </customwidget> + <customwidget> + <class>FilterExpressionFrame</class> + <extends>QFrame</extends> + <header>filter_expression_frame.h</header> + <container>1</container> + </customwidget> + </customwidgets> + <resources> + <include location="../../resources/stock_icons.qrc"/> + <include location="../../resources/stock_icons.qrc"/> + </resources> + <connections> + <connection> + <sender>actionFileQuit</sender> + <signal>triggered()</signal> + <receiver>LograyMainWindow</receiver> + <slot>close()</slot> + <hints> + <hint type="sourcelabel"> + <x>-1</x> + <y>-1</y> + </hint> + <hint type="destinationlabel"> + <x>408</x> + <y>258</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/ui/logray/logray_main_window_slots.cpp b/ui/logray/logray_main_window_slots.cpp new file mode 100644 index 00000000..f0882ed5 --- /dev/null +++ b/ui/logray/logray_main_window_slots.cpp @@ -0,0 +1,3324 @@ +/* main_window_slots.cpp + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include <config.h> + +// Qt 5.5.0 + Visual C++ 2013 +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable:4996) +#endif + +#include "logray_main_window.h" + +/* + * The generated Ui_LograyMainWindow::setupUi() can grow larger than our configured limit, + * so turn off -Wframe-larger-than= for ui_main_window.h. + */ +DIAG_OFF(frame-larger-than=) +#include <ui_logray_main_window.h> +DIAG_ON(frame-larger-than=) + +#ifdef _WIN32 +#include <windows.h> +#endif + +#include "ui/dissect_opts.h" + +#ifdef HAVE_LIBPCAP +#include "ui/capture.h" +#endif + +#include "ui/commandline.h" + +#include "ui/urls.h" + +#include "epan/color_filters.h" +#include "epan/export_object.h" + +#include "wsutil/file_util.h" +#include "wsutil/filesystem.h" +#include <wsutil/wslog.h> +#include <wsutil/ws_assert.h> + +#include "epan/addr_resolv.h" +#include "epan/column.h" +#include "epan/dfilter/dfilter-macro.h" +#include "epan/conversation_filter.h" +#include "epan/epan_dissect.h" +#include "epan/filter_expressions.h" +#include "epan/prefs.h" +#include "epan/plugin_if.h" +#include "epan/uat.h" +#include "epan/uat-int.h" +#include "epan/value_string.h" + +#ifdef HAVE_LUA +#include <epan/wslua/init_wslua.h> +#endif + +#include "ui/alert_box.h" +#ifdef HAVE_LIBPCAP +#include "ui/capture_ui_utils.h" +#endif + +#include "ui/capture_globals.h" +#include "ui/help_url.h" +#include "ui/main_statusbar.h" +#include "ui/preference_utils.h" +#include "ui/recent.h" +#include "ui/recent_utils.h" +#include "ui/ssl_key_export.h" +#include "ui/ws_ui_util.h" +#include "ui/all_files_wildcard.h" +#include "ui/qt/simple_dialog.h" + +#include <ui/qt/utils/variant_pointer.h> +#include <ui/qt/widgets/drag_drop_toolbar.h> +#include "ui/qt/widgets/wireshark_file_dialog.h" + +#ifdef HAVE_SOFTWARE_UPDATE +#include "ui/software_update.h" +#endif + +#include "about_dialog.h" +#include "capture_file_dialog.h" +#include "capture_file_properties_dialog.h" +#ifdef HAVE_LIBPCAP +#include "capture_options_dialog.h" +#endif +#include <ui/qt/utils/color_utils.h> +#include "coloring_rules_dialog.h" +#include "conversation_dialog.h" +#include "conversation_colorize_action.h" +#include "conversation_hash_tables_dialog.h" +#include "enabled_protocols_dialog.h" +#include "decode_as_dialog.h" +#include <ui/qt/widgets/display_filter_edit.h> +#include "display_filter_expression_dialog.h" +#include "dissector_tables_dialog.h" +#include "endpoint_dialog.h" +#include "expert_info_dialog.h" +#include "export_object_action.h" +#include "export_object_dialog.h" +#include "export_pdu_dialog.h" +#include "extcap_options_dialog.h" +#include "file_set_dialog.h" +#include "filter_action.h" +#include "filter_dialog.h" +#include "funnel_statistics.h" +#include "interface_toolbar.h" +#include "io_graph_dialog.h" +#include <ui/qt/widgets/additional_toolbar.h> +#include "main_application.h" +#include "packet_comment_dialog.h" +#include "packet_diagram.h" +#include "packet_dialog.h" +#include "packet_list.h" +#include "preferences_dialog.h" +#include "print_dialog.h" +#include "profile_dialog.h" +#include "protocol_hierarchy_dialog.h" +#include <ui/qt/utils/qt_ui_utils.h> +#include "resolved_addresses_dialog.h" +#include "show_packet_bytes_dialog.h" +#include "stats_tree_dialog.h" +#include <ui/qt/utils/stock_icon.h> +#include "supported_protocols_dialog.h" +#include "tap_parameter_dialog.h" +#include "time_shift_dialog.h" +#include "uat_dialog.h" + +#include <functional> +#include <QClipboard> +#include <QFileInfo> +#include <QMessageBox> +#include <QMetaObject> +#include <QToolBar> +#include <QDesktopServices> +#include <QUrl> +#include <QMutex> + +// XXX You must uncomment QT_WINEXTRAS_LIB lines in CMakeList.txt and +// cmakeconfig.h.in. +// #if defined(QT_WINEXTRAS_LIB) +// #include <QWinJumpList> +// #include <QWinJumpListCategory> +// #include <QWinJumpListItem> +// #endif + +// +// Public slots +// + +bool LograyMainWindow::openCaptureFile(QString cf_path, QString read_filter, unsigned int type, gboolean is_tempfile) +{ + QString file_name = ""; + dfilter_t *rfcode = NULL; + df_error_t *df_err = NULL; + int err; + gboolean name_param; + gboolean ret = true; + + // was a file name given as function parameter? + name_param = !cf_path.isEmpty(); + + for (;;) { + + if (cf_path.isEmpty()) { + CaptureFileDialog open_dlg(this, capture_file_.capFile()); + + if (open_dlg.open(file_name, type, read_filter)) { + cf_path = file_name; + } else { + ret = false; + goto finish; + } + } else { + this->welcome_page_->getInterfaceFrame()->showRunOnFile(); + } + + // TODO detect call from "cf_read" -> "update_progress_dlg" + // ("capture_file_.capFile()->read_lock"), possibly queue opening the + // file and return early to avoid the warning in testCaptureFileClose. + + QString before_what(tr(" before opening another file")); + if (!testCaptureFileClose(before_what)) { + ret = false; + goto finish; + } + + if (dfilter_compile(qUtf8Printable(read_filter), &rfcode, &df_err)) { + cf_set_rfcode(CaptureFile::globalCapFile(), rfcode); + } else { + /* Not valid. Tell the user, and go back and run the file + selection box again once they dismiss the alert. */ + //bad_dfilter_alert_box(top_level, read_filter->str); + QMessageBox::warning(this, tr("Invalid Display Filter"), + QString("The filter expression ") + + read_filter + + QString(" isn't a valid display filter. (") + + df_err->msg + QString(")."), + QMessageBox::Ok); + df_error_free(&df_err); + + if (!name_param) { + // go back to the selection dialogue only if the file + // was selected from this dialogue + cf_path.clear(); + continue; + } + } + + /* Make the file name available via MainWindow */ + setMwFileName(cf_path); + + /* Try to open the capture file. This closes the current file if it succeeds. */ + CaptureFile::globalCapFile()->window = this; + if (cf_open(CaptureFile::globalCapFile(), qUtf8Printable(cf_path), type, is_tempfile, &err) != CF_OK) { + /* We couldn't open it; don't dismiss the open dialog box, + just leave it around so that the user can, after they + dismiss the alert box popped up for the open error, + try again. */ + CaptureFile::globalCapFile()->window = NULL; + dfilter_free(rfcode); + cf_path.clear(); + continue; + } + + switch (cf_read(CaptureFile::globalCapFile(), /*reloading=*/FALSE)) { + case CF_READ_OK: + case CF_READ_ERROR: + /* Just because we got an error, that doesn't mean we were unable + to read any of the file; we handle what we could get from the + file. */ + break; + + case CF_READ_ABORTED: + /* The user bailed out of re-reading the capture file; the + capture file has been closed - just free the capture file name + string and return (without changing the last containing + directory). */ + capture_file_.setCapFile(NULL); + ret = false; + goto finish; + } + break; + } + + mainApp->setLastOpenDirFromFilename(cf_path); + + main_ui_->statusBar->showExpert(); + +finish: +#ifdef HAVE_LIBPCAP + if (global_commandline_info.quit_after_cap) + exit(0); +#endif + return ret; +} + +void LograyMainWindow::filterPackets(QString new_filter, bool force) +{ + cf_status_t cf_status; + + cf_status = cf_filter_packets(CaptureFile::globalCapFile(), new_filter.toUtf8().data(), force); + + if (cf_status == CF_OK) { + if (new_filter.length() > 0) { + int index = df_combo_box_->findText(new_filter); + if (index == -1) { + df_combo_box_->insertItem(0, new_filter); + df_combo_box_->setCurrentIndex(0); + } else { + df_combo_box_->setCurrentIndex(index); + } + } else { + df_combo_box_->lineEdit()->clear(); + } + // Only after the display filter has been updated, + // disable the arrow button + emit displayFilterSuccess(true); + } else { + emit displayFilterSuccess(false); + } +} + +void LograyMainWindow::layoutToolbars() +{ + Qt::ToolButtonStyle tbstyle = Qt::ToolButtonIconOnly; + switch (prefs.gui_toolbar_main_style) { + case TB_STYLE_TEXT: + tbstyle = Qt::ToolButtonTextOnly; + break; + case TB_STYLE_BOTH: + tbstyle = Qt::ToolButtonTextUnderIcon; + break; + } + + main_ui_->mainToolBar->setToolButtonStyle(tbstyle); + + main_ui_->mainToolBar->setVisible(recent.main_toolbar_show); + main_ui_->displayFilterToolBar->setVisible(recent.filter_toolbar_show); + main_ui_->statusBar->setVisible(recent.statusbar_show); + + foreach(QAction *action, main_ui_->menuInterfaceToolbars->actions()) { + QToolBar *toolbar = action->data().value<QToolBar *>(); + if (g_list_find_custom(recent.interface_toolbars, action->text().toUtf8(), (GCompareFunc)strcmp)) { + toolbar->setVisible(true); + } else { + toolbar->setVisible(false); + } + } + + QList<QToolBar *> toolbars = findChildren<QToolBar *>(); + foreach(QToolBar *bar, toolbars) { + AdditionalToolBar *iftoolbar = dynamic_cast<AdditionalToolBar *>(bar); + if (iftoolbar) { + bool visible = false; + if (g_list_find_custom(recent.gui_additional_toolbars, qUtf8Printable(iftoolbar->menuName()), (GCompareFunc)strcmp)) + visible = true; + + iftoolbar->setVisible(visible); + + } + } +} + +void LograyMainWindow::updatePreferenceActions() +{ + main_ui_->actionViewPacketList->setEnabled(prefs_has_layout_pane_content(layout_pane_content_plist)); + main_ui_->actionViewPacketDetails->setEnabled(prefs_has_layout_pane_content(layout_pane_content_pdetails)); + main_ui_->actionViewPacketBytes->setEnabled(prefs_has_layout_pane_content(layout_pane_content_pbytes)); + main_ui_->actionViewPacketDiagram->setEnabled(prefs_has_layout_pane_content(layout_pane_content_pdiagram)); + + main_ui_->actionViewNameResolutionPhysical->setChecked(gbl_resolv_flags.mac_name); + main_ui_->actionViewNameResolutionNetwork->setChecked(gbl_resolv_flags.network_name); + main_ui_->actionViewNameResolutionTransport->setChecked(gbl_resolv_flags.transport_name); +} + +void LograyMainWindow::updateRecentActions() +{ + main_ui_->actionViewMainToolbar->setChecked(recent.main_toolbar_show); + main_ui_->actionViewFilterToolbar->setChecked(recent.filter_toolbar_show); + main_ui_->actionViewStatusBar->setChecked(recent.statusbar_show); + main_ui_->actionViewPacketList->setChecked(recent.packet_list_show && prefs_has_layout_pane_content(layout_pane_content_plist)); + main_ui_->actionViewPacketDetails->setChecked(recent.tree_view_show && prefs_has_layout_pane_content(layout_pane_content_pdetails)); + main_ui_->actionViewPacketBytes->setChecked(recent.byte_view_show && prefs_has_layout_pane_content(layout_pane_content_pbytes)); + main_ui_->actionViewPacketDiagram->setChecked(recent.packet_diagram_show && prefs_has_layout_pane_content(layout_pane_content_pdiagram)); + + foreach(QAction *action, main_ui_->menuInterfaceToolbars->actions()) { + if (g_list_find_custom(recent.interface_toolbars, action->text().toUtf8(), (GCompareFunc)strcmp)) { + action->setChecked(true); + } else { + action->setChecked(false); + } + } + + foreach(QAction * action, main_ui_->menuAdditionalToolbars->actions()) { + ext_toolbar_t * toolbar = VariantPointer<ext_toolbar_t>::asPtr(action->data()); + bool checked = false; + if (toolbar && g_list_find_custom(recent.gui_additional_toolbars, toolbar->name, (GCompareFunc)strcmp)) + checked = true; + + action->setChecked(checked); + } + + foreach(QAction* tda, td_actions.keys()) { + if (recent.gui_time_format == td_actions[tda]) { + tda->setChecked(true); + } + } + foreach(QAction* tpa, tp_actions.keys()) { + if (recent.gui_time_precision == tp_actions[tpa]) { + tpa->setChecked(true); + break; + } + } + main_ui_->actionViewTimeDisplaySecondsWithHoursAndMinutes->setChecked(recent.gui_seconds_format == TS_SECONDS_HOUR_MIN_SEC); + + main_ui_->actionViewColorizePacketList->setChecked(recent.packet_list_colorize); + + main_ui_->actionGoAutoScroll->setChecked(recent.capture_auto_scroll); +} + +// Don't connect to this directly. Connect to or emit fiterAction(...) instead. +void LograyMainWindow::queuedFilterAction(QString action_filter, FilterAction::Action action, FilterAction::ActionType type) +{ + QString cur_filter, new_filter; + + if (!df_combo_box_) return; + cur_filter = df_combo_box_->lineEdit()->text(); + + switch (type) { + case FilterAction::ActionTypePlain: + new_filter = action_filter; + break; + case FilterAction::ActionTypeAnd: + if (cur_filter.length()) { + new_filter = "(" + cur_filter + ") && (" + action_filter + ")"; + } + else { + new_filter = action_filter; + } + break; + case FilterAction::ActionTypeOr: + if (cur_filter.length()) { + new_filter = "(" + cur_filter + ") || (" + action_filter + ")"; + } else { + new_filter = action_filter; + } + break; + case FilterAction::ActionTypeNot: + new_filter = "!(" + action_filter + ")"; + break; + case FilterAction::ActionTypeAndNot: + if (cur_filter.length()) { + new_filter = "(" + cur_filter + ") && !(" + action_filter + ")"; + } else { + new_filter = "!(" + action_filter + ")"; + } + break; + case FilterAction::ActionTypeOrNot: + if (cur_filter.length()) { + new_filter = "(" + cur_filter + ") || !(" + action_filter + ")"; + } else { + new_filter = "!(" + action_filter + ")"; + } + break; + default: + ws_assert_not_reached(); + break; + } + + switch (action) { + case FilterAction::ActionApply: + df_combo_box_->lineEdit()->setText(new_filter); + df_combo_box_->applyDisplayFilter(); + break; + case FilterAction::ActionColorize: + colorizeWithFilter(new_filter.toUtf8()); + break; + case FilterAction::ActionCopy: + mainApp->clipboard()->setText(new_filter); + break; + case FilterAction::ActionFind: + main_ui_->searchFrame->findFrameWithFilter(new_filter); + break; + case FilterAction::ActionPrepare: + df_combo_box_->lineEdit()->setText(new_filter); + df_combo_box_->lineEdit()->setFocus(); + break; + case FilterAction::ActionWebLookup: + { + QString url = QString("https://www.google.com/search?q=") + new_filter; + QDesktopServices::openUrl(QUrl(url)); + break; + } + default: + ws_assert_not_reached(); + break; + } +} + +// Capture callbacks + +#ifdef HAVE_LIBPCAP +void LograyMainWindow::captureCapturePrepared(capture_session *session) { + setTitlebarForCaptureInProgress(); + + setWindowIcon(mainApp->captureIcon()); + + /* Disable menu items that make no sense if you're currently running + a capture. */ + bool handle_toolbars = (session->session_will_restart ? false : true); + setForCaptureInProgress(true, handle_toolbars, session->capture_opts->ifaces); +// set_capture_if_dialog_for_capture_in_progress(TRUE); + +// /* Don't set up main window for a capture file. */ +// main_set_for_capture_file(FALSE); + showCapture(); +} + +void LograyMainWindow::captureCaptureUpdateStarted(capture_session *session) { + + /* We've done this in "prepared" above, but it will be cleared while + switching to the next multiple file. */ + setTitlebarForCaptureInProgress(); + setWindowIcon(mainApp->captureIcon()); + + bool handle_toolbars = (session->session_will_restart ? false : true); + setForCaptureInProgress(true, handle_toolbars, session->capture_opts->ifaces); + + setForCapturedPackets(true); +} + +void LograyMainWindow::captureCaptureUpdateFinished(capture_session *session) { + + /* The capture isn't stopping any more - it's stopped. */ + capture_stopping_ = false; + + /* Update the main window as appropriate */ + updateForUnsavedChanges(); + + /* Enable menu items that make sense if you're not currently running + a capture. */ + bool handle_toolbars = (session->session_will_restart ? false : true); + setForCaptureInProgress(false, handle_toolbars); + setMenusForCaptureFile(); + + setWindowIcon(mainApp->normalIcon()); + popLiveCaptureInProgress(); + + if (global_commandline_info.quit_after_cap) { + // Command line asked us to quit after capturing. + // Don't pop up a dialog to ask for unsaved files etc. + exit(0); + } +} + +void LograyMainWindow::captureCaptureFixedFinished(capture_session *) { + + /* The capture isn't stopping any more - it's stopped. */ + capture_stopping_ = false; + + /* Enable menu items that make sense if you're not currently running + a capture. */ + setForCaptureInProgress(false); + /* There isn't a real capture_file structure yet, so just force disabling + menu options. They will "refresh" when the capture file is reloaded to + display packets */ + setMenusForCaptureFile(true); + + setWindowIcon(mainApp->normalIcon()); + popLiveCaptureInProgress(); + + if (global_commandline_info.quit_after_cap) { + // Command line asked us to quit after capturing. + // Don't pop up a dialog to ask for unsaved files etc. + exit(0); + } +} + +void LograyMainWindow::captureCaptureFailed(capture_session *) { + /* Capture isn't stopping any more. */ + capture_stopping_ = false; + + setForCaptureInProgress(false); + showWelcome(); + + // Reset expert information indicator + main_ui_->statusBar->captureFileClosing(); + mainApp->popStatus(WiresharkApplication::FileStatus); + + setWindowIcon(mainApp->normalIcon()); + popLiveCaptureInProgress(); + + if (global_commandline_info.quit_after_cap) { + // Command line asked us to quit after capturing. + // Don't pop up a dialog to ask for unsaved files etc. + exit(0); + } +} +#endif // HAVE_LIBPCAP + +// Callbacks from cfile.c and file.c via CaptureFile::captureFileCallback + +void LograyMainWindow::captureEventHandler(CaptureEvent ev) +{ + switch (ev.captureContext()) { + + case CaptureEvent::File: + switch (ev.eventType()) { + case CaptureEvent::Opened: + captureFileOpened(); + break; + case CaptureEvent::Closing: + captureFileClosing(); + break; + case CaptureEvent::Closed: + captureFileClosed(); + break; + case CaptureEvent::Started: + captureFileReadStarted(tr("Loading")); + break; + case CaptureEvent::Finished: + captureFileReadFinished(); + break; + default: + break; + } + break; + + case CaptureEvent::Reload: + switch (ev.eventType()) { + case CaptureEvent::Started: + captureFileReadStarted(tr("Reloading")); + break; + case CaptureEvent::Finished: + captureFileReadFinished(); + break; + default: + break; + } + break; + + case CaptureEvent::Rescan: + switch (ev.eventType()) { + case CaptureEvent::Started: + setMenusForCaptureFile(true); + captureFileReadStarted(tr("Rescanning")); + break; + case CaptureEvent::Finished: + captureFileReadFinished(); + break; + default: + break; + } + break; + + case CaptureEvent::Retap: + switch (ev.eventType()) { + case CaptureEvent::Started: + freeze(); + break; + case CaptureEvent::Finished: + thaw(); + break; + case CaptureEvent::Flushed: + draw_tap_listeners(FALSE); + break; + default: + break; + } + break; + + case CaptureEvent::Merge: + switch (ev.eventType()) { + case CaptureEvent::Started: + mainApp->popStatus(WiresharkApplication::FileStatus); + mainApp->pushStatus(WiresharkApplication::FileStatus, tr("Merging files."), QString()); + break; + case CaptureEvent::Finished: + mainApp->popStatus(WiresharkApplication::FileStatus); + break; + default: + break; + } + break; + + case CaptureEvent::Save: + switch (ev.eventType()) { + case CaptureEvent::Started: + { + QFileInfo file_info(ev.filePath()); + mainApp->popStatus(WiresharkApplication::FileStatus); + mainApp->pushStatus(WiresharkApplication::FileStatus, tr("Saving %1…").arg(file_info.fileName())); + break; + } + default: + break; + } + break; + +#ifdef HAVE_LIBPCAP + case CaptureEvent::Capture: + switch (ev.eventType()) { + case CaptureEvent::Prepared: + captureCapturePrepared(ev.capSession()); + break; + case CaptureEvent::Stopping: + capture_stopping_ = true; + setMenusForCaptureStopping(); + break; + case CaptureEvent::Failed: + captureCaptureFailed(ev.capSession()); + default: + break; + } + break; + + case CaptureEvent::Update: + switch (ev.eventType()) { + case CaptureEvent::Started: + captureCaptureUpdateStarted(ev.capSession()); + break; + case CaptureEvent::Finished: + captureCaptureUpdateFinished(ev.capSession()); + break; + default: + break; + } + break; + + case CaptureEvent::Fixed: + switch (ev.eventType()) { + case CaptureEvent::Finished: + captureCaptureFixedFinished(ev.capSession()); + break; + default: + break; + } + break; +#endif + } +} + +void LograyMainWindow::captureFileOpened() { + if (capture_file_.window() != this) return; + + file_set_dialog_->fileOpened(capture_file_.capFile()); + setMenusForFileSet(true); + emit setCaptureFile(capture_file_.capFile()); +} + +void LograyMainWindow::captureFileReadStarted(const QString &action) { +// tap_param_dlg_update(); + + /* Set up main window for a capture file. */ +// main_set_for_capture_file(TRUE); + + mainApp->popStatus(WiresharkApplication::FileStatus); + QString msg = QString(tr("%1: %2")).arg(action).arg(capture_file_.fileName()); + QString msgtip = QString(); + mainApp->pushStatus(WiresharkApplication::FileStatus, msg, msgtip); + showCapture(); + main_ui_->actionAnalyzeReloadLuaPlugins->setEnabled(false); +} + +void LograyMainWindow::captureFileReadFinished() { + if (!capture_file_.capFile()->is_tempfile && capture_file_.capFile()->filename) { + /* Add this filename to the list of recent files in the "Recent Files" submenu */ + add_menu_recent_capture_file(capture_file_.capFile()->filename); + + /* Remember folder for next Open dialog and save it in recent */ + mainApp->setLastOpenDirFromFilename(capture_file_.capFile()->filename); + } + + /* Update the appropriate parts of the main window. */ + updateForUnsavedChanges(); + + /* Enable menu items that make sense if you have some captured packets. */ + setForCapturedPackets(true); + + main_ui_->statusBar->setFileName(capture_file_); + main_ui_->actionAnalyzeReloadLuaPlugins->setEnabled(true); + + packet_list_->captureFileReadFinished(); + + emit setDissectedCaptureFile(capture_file_.capFile()); +} + +void LograyMainWindow::captureFileClosing() { + setMenusForCaptureFile(true); + setForCapturedPackets(false); + setForCaptureInProgress(false); + + // Reset expert information indicator + main_ui_->statusBar->captureFileClosing(); + main_ui_->searchFrame->animatedHide(); + main_ui_->goToFrame->animatedHide(); + // gtk_widget_show(expert_info_none); + emit setCaptureFile(NULL); + emit setDissectedCaptureFile(NULL); +} + +void LograyMainWindow::captureFileClosed() { + packets_bar_update(); + + file_set_dialog_->fileClosed(); + setMenusForFileSet(false); + setWindowModified(false); + + // Reset expert information indicator + main_ui_->statusBar->captureFileClosing(); + mainApp->popStatus(WiresharkApplication::FileStatus); + + setWSWindowTitle(); + setWindowIcon(mainApp->normalIcon()); + setMenusForSelectedPacket(); + setMenusForSelectedTreeRow(); + +#ifdef HAVE_LIBPCAP + if (!global_capture_opts.multi_files_on) + showWelcome(); +#endif +} + +// +// Private slots +// + +// ui/gtk/capture_dlg.c:start_capture_confirmed + +void LograyMainWindow::startCapture() { + startCapture(QStringList()); +} + +void LograyMainWindow::startCapture(QStringList interfaces _U_) { +#ifdef HAVE_LIBPCAP + interface_options *interface_opts; + guint i; + interface_t *device; + gboolean can_start_capture = TRUE; + + /* did the user ever select a capture interface before? */ + if (global_capture_opts.num_selected == 0) { + QString msg = QString(tr("No interface selected.")); + mainApp->pushStatus(WiresharkApplication::TemporaryStatus, msg); + main_ui_->actionCaptureStart->setChecked(false); + return; + } + + for (i = 0; i < global_capture_opts.all_ifaces->len; i++) { + device = &g_array_index(global_capture_opts.all_ifaces, interface_t, i); + if (device->selected && (device->if_info.type == IF_EXTCAP)) { + /* device is EXTCAP and is selected. Check if all mandatory + * settings are set. + */ + if (extcap_requires_configuration(device->name)) + { + /* Request openning of extcap options dialog */ + QString device_name(device->name); + emit showExtcapOptions(device_name, false); + /* Cancel start of capture */ + can_start_capture = FALSE; + } + } + } + + /* If some of extcap was not configured, do not start with the capture */ + if (!can_start_capture) { + QString msg = QString(tr("Configure all extcaps before start of capture.")); + mainApp->pushStatus(WiresharkApplication::TemporaryStatus, msg); + main_ui_->actionCaptureStart->setChecked(false); + return; + } + + // Ideally we should have disabled the start capture + // toolbar buttons and menu items. This may not be the + // case, e.g. with QtMacExtras. + if (!capture_filter_valid_) { + QString msg = QString(tr("Invalid capture filter.")); + mainApp->pushStatus(WiresharkApplication::TemporaryStatus, msg); + main_ui_->actionCaptureStart->setChecked(false); + return; + } + + showCapture(); + + /* XXX - we might need to init other pref data as well... */ + main_ui_->actionGoAutoScroll->setChecked(recent.capture_auto_scroll); + + /* XXX - can this ever happen? */ + if (cap_session_.state != CAPTURE_STOPPED) + return; + + /* close the currently loaded capture file */ + cf_close((capture_file *)cap_session_.cf); + + /* Copy the selected interfaces to the set of interfaces to use for + this capture. */ + collect_ifaces(&global_capture_opts); + + CaptureFile::globalCapFile()->window = this; + info_data_.ui.ui = this; + if (capture_start(&global_capture_opts, NULL, &cap_session_, &info_data_, + main_window_update)) { + capture_options *capture_opts = cap_session_.capture_opts; + GString *interface_names; + + /* Add "interface name<live capture in progress>" on main status bar */ + interface_names = get_iface_list_string(capture_opts, 0); + if (strlen(interface_names->str) > 0) { + g_string_append(interface_names, ":"); + } + g_string_append(interface_names, " "); + + mainApp->popStatus(WiresharkApplication::FileStatus); + QString msg = QString("%1<live capture in progress>").arg(interface_names->str); + QString msgtip = QString("to file: "); + if (capture_opts->save_file) + msgtip += capture_opts->save_file; + mainApp->pushStatus(WiresharkApplication::FileStatus, msg, msgtip); + g_string_free(interface_names, TRUE); + + /* The capture succeeded, which means the capture filter syntax is + valid; add this capture filter to the recent capture filter list. */ + QByteArray filter_ba; + for (i = 0; i < global_capture_opts.ifaces->len; i++) { + interface_opts = &g_array_index(global_capture_opts.ifaces, interface_options, i); + if (interface_opts->cfilter) { + recent_add_cfilter(interface_opts->name, interface_opts->cfilter); + if (filter_ba.isEmpty()) { + filter_ba = interface_opts->cfilter; + } else { + /* Not the first selected interface; is its capture filter + the same as the one the other interfaces we've looked + at have? */ + if (strcmp(interface_opts->cfilter, filter_ba.constData()) != 0) { + /* No, so not all selected interfaces have the same capture + filter. */ + filter_ba.clear(); + } + } + } + } + if (!filter_ba.isEmpty()) { + recent_add_cfilter(NULL, filter_ba.constData()); + } + } else { + CaptureFile::globalCapFile()->window = NULL; + } +#endif // HAVE_LIBPCAP +} + +void LograyMainWindow::popLiveCaptureInProgress() { + /* Pop the "<live capture in progress>" message off the status bar. */ + main_ui_->statusBar->setFileName(capture_file_); +} + +void LograyMainWindow::stopCapture() { +//#ifdef HAVE_AIRPCAP +// if (airpcap_if_active) +// airpcap_set_toolbar_stop_capture(airpcap_if_active); +//#endif + +#ifdef HAVE_LIBPCAP + capture_stop(&cap_session_); +#endif // HAVE_LIBPCAP + +} + +// Keep focus rects from showing through the welcome screen. Primarily for +// macOS. +void LograyMainWindow::mainStackChanged(int) +{ + for (int i = 0; i < main_ui_->mainStack->count(); i++) { + main_ui_->mainStack->widget(i)->setEnabled(i == main_ui_->mainStack->currentIndex()); + } +} + +// XXX - Copied from ui/gtk/menus.c + +/** + * Add the capture filename (with an absolute path) to the "Recent Files" menu. + */ +// XXX - We should probably create a RecentFile class. +void LograyMainWindow::updateRecentCaptures() { + QAction *ra; + QMenu *recentMenu = main_ui_->menuOpenRecentCaptureFile; + QString action_cf_name; + + if (!recentMenu) { + return; + } + recentMenu->clear(); + +#if 0 +#if defined(QT_WINEXTRAS_LIB) + QWinJumpList recent_jl(this); + QWinJumpListCategory *recent_jlc = recent_jl.recent(); + if (recent_jlc) { + recent_jlc->clear(); + recent_jlc->setVisible(true); + } +#endif +#endif +#if defined(Q_OS_MAC) + if (!dock_menu_) { + dock_menu_ = new QMenu(); + dock_menu_->setAsDockMenu(); + } + dock_menu_->clear(); +#endif + + /* Iterate through the actions in menuOpenRecentCaptureFile, + * removing special items, a maybe duplicate entry and every item above count_max */ + int shortcut = Qt::Key_0; + foreach(recent_item_status *ri, mainApp->recentItems()) { + // Add the new item + ra = new QAction(recentMenu); + ra->setData(ri->filename); + // XXX - Needs get_recent_item_status or equivalent + ra->setEnabled(ri->accessible); + recentMenu->insertAction(NULL, ra); + action_cf_name = ra->data().toString(); + if (shortcut <= Qt::Key_9) { + ra->setShortcut(Qt::META | (Qt::Key)shortcut); + shortcut++; + } + ra->setText(action_cf_name); + connect(ra, SIGNAL(triggered()), this, SLOT(recentActionTriggered())); + +/* This is slow, at least on my VM here. The added links also open Wireshark + * in a new window. It might make more sense to add a recent item when we + * open a capture file. */ +#if 0 +#if defined(QT_WINEXTRAS_LIB) + if (recent_jlc) { + QFileInfo fi(ri->filename); + QWinJumpListItem *jli = recent_jlc->addLink( + fi.fileName(), + QApplication::applicationFilePath(), + QStringList() << "-r" << ri->filename + ); + // XXX set icon + jli->setWorkingDirectory(QDir::toNativeSeparators(QApplication::applicationDirPath())); + } +#endif +#endif +#if defined(Q_OS_MAC) + QAction *rda = new QAction(dock_menu_); + QFileInfo fi(ri->filename); + rda->setText(fi.fileName()); + dock_menu_->insertAction(NULL, rda); + connect(rda, SIGNAL(triggered()), ra, SLOT(trigger())); +#endif + } + + if (recentMenu->actions().count() > 0) { + // Separator + "Clear" + // XXX - Do we really need this? + ra = new QAction(recentMenu); + ra->setSeparator(true); + recentMenu->insertAction(NULL, ra); + + ra = new QAction(recentMenu); + ra->setText(tr("Clear Menu")); + recentMenu->insertAction(NULL, ra); + connect(ra, SIGNAL(triggered()), mainApp, SLOT(clearRecentCaptures())); + } else { + if (main_ui_->actionDummyNoFilesFound) { + recentMenu->addAction(main_ui_->actionDummyNoFilesFound); + } + } +} + +void LograyMainWindow::recentActionTriggered() { + QAction *ra = qobject_cast<QAction*>(sender()); + + if (ra) { + QString cfPath = ra->data().toString(); + openCaptureFile(cfPath); + } +} + +QString LograyMainWindow::commentToMenuText(QString text, int max_len) +{ + text = text.trimmed().replace(QRegularExpression("(\\r?\\n|\\r\\n?)+"), " "); + if (text.size() > 0) { + if (text.size() > max_len) { + text.truncate(max_len); + text += "…"; + } + } + else { + text = tr("(empty comment)", "placeholder for empty comment"); + } + return text; +} + +void LograyMainWindow::setEditCommentsMenu() +{ + main_ui_->menuPacketComment->clear(); + QAction *action = main_ui_->menuPacketComment->addAction(tr("Add New Comment…")); + connect(action, &QAction::triggered, this, &LograyMainWindow::addPacketComment); + action->setShortcut(QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_C)); + if (selectedRows().count() == 1) { + const int thisRow = selectedRows().first(); + frame_data * current_frame = frameDataForRow(thisRow); + wtap_block_t pkt_block = cf_get_packet_block(capture_file_.capFile(), current_frame); + guint nComments = wtap_block_count_option(pkt_block, OPT_COMMENT); + if (nComments > 0) { + main_ui_->menuPacketComment->addSeparator(); + for (guint i = 0; i < nComments; i++) { + QString comment = packet_list_->getPacketComment(i); + comment = this->commentToMenuText(comment); + action = main_ui_->menuPacketComment->addAction(tr("Edit \"%1\"", "edit packet comment").arg(comment)); + connect(action, &QAction::triggered, this, &LograyMainWindow::editPacketComment); + action->setData(i); + } + + main_ui_->menuPacketComment->addSeparator(); + for (guint i = 0; i < nComments; i++) { + QString comment = packet_list_->getPacketComment(i); + comment = this->commentToMenuText(comment); + action = main_ui_->menuPacketComment->addAction(tr("Delete \"%1\"", "delete packet comment").arg(comment)); + connect(action, &QAction::triggered, this, &LograyMainWindow::deletePacketComment); + action->setData(i); + } + main_ui_->menuPacketComment->addSeparator(); + action = main_ui_->menuPacketComment->addAction(tr("Delete packet comments")); + connect(action, &QAction::triggered, this, &LograyMainWindow::deleteCommentsFromPackets); + } + wtap_block_unref(pkt_block); + } + if (selectedRows().count() > 1) { + main_ui_->menuPacketComment->addSeparator(); + action = main_ui_->menuPacketComment->addAction(tr("Delete comments from %n packet(s)", nullptr, static_cast<int>(selectedRows().count()))); + connect(action, &QAction::triggered, this, &LograyMainWindow::deleteCommentsFromPackets); + } +} + +void LograyMainWindow::setMenusForSelectedPacket() +{ + /* Making the menu context-sensitive allows for easier selection of the + desired item and has the added benefit, with large captures, of + avoiding needless looping through huge lists for marked, ignored, + or time-referenced packets. */ + + /* We have one or more items in the packet list */ + bool have_frames = false; + /* A frame is selected */ + bool frame_selected = false; + bool multi_selection = false; + /* A visible packet comes after this one in the selection history */ + bool next_selection_history = false; + /* A visible packet comes before this one in the selection history */ + bool previous_selection_history = false; + /* We have marked frames. (XXX - why check frame_selected?) */ + bool have_marked = false; + /* We have a marked frame other than the current frame (i.e., + we have at least one marked frame, and either there's more + than one marked frame or the current frame isn't marked). */ + bool another_is_marked = false; + /* One or more frames are hidden by a display filter */ + bool have_filtered = false; + /* One or more frames have been ignored */ + bool have_ignored = false; + bool have_time_ref = false; + /* We have a time reference frame other than the current frame (i.e., + we have at least one time reference frame, and either there's more + than one time reference frame or the current frame isn't a + time reference frame). (XXX - why check frame_selected?) */ + bool another_is_time_ref = false; + + QList<QAction *> cc_actions = QList<QAction *>() + << main_ui_->actionViewColorizeConversation1 << main_ui_->actionViewColorizeConversation2 + << main_ui_->actionViewColorizeConversation3 << main_ui_->actionViewColorizeConversation4 + << main_ui_->actionViewColorizeConversation5 << main_ui_->actionViewColorizeConversation6 + << main_ui_->actionViewColorizeConversation7 << main_ui_->actionViewColorizeConversation8 + << main_ui_->actionViewColorizeConversation9 << main_ui_->actionViewColorizeConversation10; + + if (capture_file_.capFile()) { + QList<int> rows = selectedRows(); + frame_data * current_frame = 0; + if (rows.count() > 0) + current_frame = frameDataForRow(rows.at(0)); + + frame_selected = rows.count() == 1; + if (packet_list_->multiSelectActive()) + { + frame_selected = false; + multi_selection = true; + } + next_selection_history = packet_list_->haveNextHistory(); + previous_selection_history = packet_list_->havePreviousHistory(); + have_frames = capture_file_.capFile()->count > 0; + have_marked = capture_file_.capFile()->marked_count > 0; + another_is_marked = have_marked && rows.count() <= 1 && + !(capture_file_.capFile()->marked_count == 1 && frame_selected && current_frame->marked); + have_filtered = capture_file_.capFile()->displayed_count > 0 && capture_file_.capFile()->displayed_count != capture_file_.capFile()->count; + have_ignored = capture_file_.capFile()->ignored_count > 0; + have_time_ref = capture_file_.capFile()->ref_time_count > 0; + another_is_time_ref = have_time_ref && rows.count() <= 1 && + !(capture_file_.capFile()->ref_time_count == 1 && frame_selected && current_frame->ref_time); + } + + main_ui_->actionEditMarkPacket->setText(tr("&Mark/Unmark Packet(s)", "", static_cast<int>(selectedRows().count()))); + main_ui_->actionEditIgnorePacket->setText(tr("&Ignore/Unignore Packet(s)", "", static_cast<int>(selectedRows().count()))); + + main_ui_->actionCopyListAsText->setEnabled(selectedRows().count() > 0); + main_ui_->actionCopyListAsCSV->setEnabled(selectedRows().count() > 0); + main_ui_->actionCopyListAsYAML->setEnabled(selectedRows().count() > 0); + + main_ui_->actionEditMarkPacket->setEnabled(frame_selected || multi_selection); + main_ui_->actionEditMarkAllDisplayed->setEnabled(have_frames); + /* Unlike un-ignore, do not allow unmark of all frames when no frames are displayed */ + main_ui_->actionEditUnmarkAllDisplayed->setEnabled(have_marked); + main_ui_->actionEditNextMark->setEnabled(another_is_marked); + main_ui_->actionEditPreviousMark->setEnabled(another_is_marked); + + GArray * linkTypes = Q_NULLPTR; + if (capture_file_.capFile() && capture_file_.capFile()->linktypes) + linkTypes = capture_file_.capFile()->linktypes; + + bool enableEditComments = linkTypes && wtap_dump_can_write(capture_file_.capFile()->linktypes, WTAP_COMMENT_PER_PACKET); + main_ui_->menuPacketComment->setEnabled(enableEditComments && selectedRows().count() > 0); + main_ui_->actionDeleteAllPacketComments->setEnabled(enableEditComments); + + main_ui_->actionEditIgnorePacket->setEnabled(frame_selected || multi_selection); + main_ui_->actionEditIgnoreAllDisplayed->setEnabled(have_filtered); + /* Allow un-ignore of all frames even with no frames currently displayed */ + main_ui_->actionEditUnignoreAllDisplayed->setEnabled(have_ignored); + + main_ui_->actionEditSetTimeReference->setEnabled(frame_selected); + main_ui_->actionEditUnsetAllTimeReferences->setEnabled(have_time_ref); + main_ui_->actionEditNextTimeReference->setEnabled(another_is_time_ref); + main_ui_->actionEditPreviousTimeReference->setEnabled(another_is_time_ref); + main_ui_->actionEditTimeShift->setEnabled(have_frames); + + main_ui_->actionGoGoToLinkedPacket->setEnabled(false); + main_ui_->actionGoNextHistoryPacket->setEnabled(next_selection_history); + main_ui_->actionGoPreviousHistoryPacket->setEnabled(previous_selection_history); + + foreach(QAction *cc_action, cc_actions) { + cc_action->setEnabled(frame_selected); + } + main_ui_->actionViewColorizeNewColoringRule->setEnabled(frame_selected); + + main_ui_->actionViewColorizeResetColorization->setEnabled(tmp_color_filters_used()); + + main_ui_->actionViewShowPacketInNewWindow->setEnabled(frame_selected); +// main_ui_->actionViewEditResolvedName->setEnabled(frame_selected && is_ip); + + emit packetInfoChanged(capture_file_.packetInfo()); + +// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/NameResolution/ResolveName", +// frame_selected && (gbl_resolv_flags.mac_name || gbl_resolv_flags.network_name || +// gbl_resolv_flags.transport_name)); +} + +void LograyMainWindow::setMenusForSelectedTreeRow(FieldInformation *finfo) { + + bool can_match_selected = false; + bool is_framenum = false; + bool have_subtree = false; + bool can_open_url = false; + bool have_packet_bytes = false; + QByteArray field_filter; + int field_id = -1; + + field_info * fi = 0; + if (finfo) + fi = finfo->fieldInfo(); + + if (capture_file_.capFile()) { + capture_file_.capFile()->finfo_selected = fi; + + if (fi && fi->tree_type != -1) { + have_subtree = true; + } + + if (fi && fi->ds_tvb && (fi->length > 0)) { + have_packet_bytes = true; + } + } + + if (capture_file_.capFile() != NULL && fi != NULL) { + header_field_info *hfinfo = fi->hfinfo; + int linked_frame = -1; + + can_match_selected = proto_can_match_selected(capture_file_.capFile()->finfo_selected, capture_file_.capFile()->edt); + if (hfinfo && hfinfo->type == FT_FRAMENUM) { + is_framenum = true; + linked_frame = fvalue_get_uinteger(fi->value); + } + + char *tmp_field = proto_construct_match_selected_string(fi, capture_file_.capFile()->edt); + field_filter = tmp_field; + wmem_free(NULL, tmp_field); + emit fieldFilterChanged(field_filter); + + field_id = fi->hfinfo->id; + /* if the selected field isn't a protocol, get its parent */ + if (!proto_registrar_is_protocol(field_id)) { + field_id = proto_registrar_get_parent(fi->hfinfo->id); + } + + if (field_id >= 0) { + can_open_url = true; + main_ui_->actionContextWikiProtocolPage->setData(field_id); + main_ui_->actionContextFilterFieldReference->setData(field_id); + } else { + main_ui_->actionContextWikiProtocolPage->setData(QVariant()); + main_ui_->actionContextFilterFieldReference->setData(QVariant()); + } + + if (linked_frame > 0) { + main_ui_->actionGoGoToLinkedPacket->setData(linked_frame); + } else { + main_ui_->actionGoGoToLinkedPacket->setData(QVariant()); + } + } + + // Always enable / disable the following items. + main_ui_->actionCopyAllVisibleItems->setEnabled(capture_file_.capFile() != NULL && ! packet_list_->multiSelectActive()); + main_ui_->actionCopyAllVisibleSelectedTreeItems->setEnabled(can_match_selected); + main_ui_->actionEditCopyDescription->setEnabled(can_match_selected); + main_ui_->actionEditCopyFieldName->setEnabled(can_match_selected); + main_ui_->actionEditCopyValue->setEnabled(can_match_selected); + main_ui_->actionEditCopyAsFilter->setEnabled(can_match_selected); + + main_ui_->actionAnalyzeShowPacketBytes->setEnabled(have_packet_bytes); + main_ui_->actionFileExportPacketBytes->setEnabled(have_packet_bytes); + + main_ui_->actionViewExpandSubtrees->setEnabled(have_subtree); + main_ui_->actionViewCollapseSubtrees->setEnabled(have_subtree); + + main_ui_->actionGoGoToLinkedPacket->setEnabled(is_framenum); + + main_ui_->actionAnalyzeApplyAsColumn->setEnabled(can_match_selected); + + main_ui_->actionContextShowLinkedPacketInNewWindow->setEnabled(is_framenum); + + main_ui_->actionContextWikiProtocolPage->setEnabled(can_open_url); + main_ui_->actionContextFilterFieldReference->setEnabled(can_open_url); + + +// Only enable / disable the following items if we have focus so that we +// don't clobber anything we may have set in setMenusForSelectedPacket. + if (!proto_tree_ || !proto_tree_->hasFocus()) return; + + emit packetInfoChanged(capture_file_.packetInfo()); + + // set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ResolveName", + // frame_selected && (gbl_resolv_flags.mac_name || gbl_resolv_flags.network_name || + // gbl_resolv_flags.transport_name)); + +} + +void LograyMainWindow::interfaceSelectionChanged() +{ +#ifdef HAVE_LIBPCAP + // XXX This doesn't disable the toolbar button when using + // QtMacExtras. + if (global_capture_opts.num_selected > 0 && capture_filter_valid_) { + main_ui_->actionCaptureStart->setEnabled(true); + } else { + main_ui_->actionCaptureStart->setEnabled(false); + } +#endif // HAVE_LIBPCAP +} + +void LograyMainWindow::captureFilterSyntaxChanged(bool valid) +{ + capture_filter_valid_ = valid; + interfaceSelectionChanged(); +} + +void LograyMainWindow::startInterfaceCapture(bool valid, const QString capture_filter) +{ + capture_filter_valid_ = valid; + welcome_page_->setCaptureFilter(capture_filter); + QString before_what(tr(" before starting a new capture")); + if (testCaptureFileClose(before_what)) { + // The interface tree will update the selected interfaces via its timer + // so no need to do anything here. + startCapture(); + } +} + +void LograyMainWindow::applyGlobalCommandLineOptions() +{ + if (global_dissect_options.time_format != TS_NOT_SET) { + foreach(QAction* tda, td_actions.keys()) { + if (global_dissect_options.time_format == td_actions[tda]) { + tda->setChecked(true); + // XXX - this means that if the user sets the + // time stamp format with the -t flag, that + // setting will persist and will be used as + // the default the next time Logray is run. + recent.gui_time_format = global_dissect_options.time_format; + timestamp_set_type(global_dissect_options.time_format); + break; + } + } + } + if (global_dissect_options.time_precision != TS_PREC_NOT_SET) { + foreach(QAction* tpa, tp_actions.keys()) { + if (global_dissect_options.time_precision == tp_actions[tpa]) { + tpa->setChecked(true); + // XXX - this means that if the user sets the + // time stamp precision with the -t flag, that + // setting will persist and will be used as + // the default the next time Logray is run. + recent.gui_time_precision = global_dissect_options.time_precision; + timestamp_set_precision(global_dissect_options.time_precision); + break; + } + } + } + if (global_commandline_info.full_screen) { + this->showFullScreen(); + } +} + +void LograyMainWindow::redissectPackets() +{ + if (capture_file_.capFile()) { + cf_redissect_packets(capture_file_.capFile()); + main_ui_->statusBar->expertUpdate(); + } + + proto_free_deregistered_fields(); +} + +void LograyMainWindow::checkDisplayFilter() +{ + if (!df_combo_box_->checkDisplayFilter()) { + g_free(CaptureFile::globalCapFile()->dfilter); + CaptureFile::globalCapFile()->dfilter = NULL; + } +} + +void LograyMainWindow::fieldsChanged() +{ + gchar *err_msg = NULL; + if (!color_filters_reload(&err_msg, color_filter_add_cb)) { + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg); + g_free(err_msg); + } + tap_listeners_dfilter_recompile(); + + emit checkDisplayFilter(); + + if (have_custom_cols(&CaptureFile::globalCapFile()->cinfo)) { + // Recreate packet list columns according to new/changed/deleted fields + packet_list_->fieldsChanged(CaptureFile::globalCapFile()); + } + + emit reloadFields(); +} + +void LograyMainWindow::reloadLuaPlugins() +{ +#ifdef HAVE_LUA + if (mainApp->isReloadingLua()) + return; + + gboolean uses_lua_filehandler = FALSE; + + if (capture_file_.capFile()) { + // Check if the current capture file is opened with a Lua FileHandler + capture_file *cf = capture_file_.capFile(); + uses_lua_filehandler = wtap_uses_lua_filehandler(cf->provider.wth); + + if (uses_lua_filehandler && cf->unsaved_changes) { + // Prompt to save the file before reloading, in case the FileHandler has changed + QString before_what(tr(" before reloading Lua plugins")); + if (!testCaptureFileClose(before_what, Reload)) { + return; + } + } + } + + mainApp->setReloadingLua(true); + + wslua_reload_plugins(NULL, NULL); + funnel_statistics_reload_menus(); + reloadDynamicMenus(); + closePacketDialogs(); + + // Preferences may have been deleted so close all widgets using prefs + main_ui_->preferenceEditorFrame->animatedHide(); + + mainApp->readConfigurationFiles(true); + commandline_options_reapply(); + + fieldsChanged(); + prefs_apply_all(); + + if (uses_lua_filehandler) { + // Reload the file in case the FileHandler has changed + if (cf_reload(capture_file_.capFile()) != CF_OK) { + cf_close(capture_file_.capFile()); + } + proto_free_deregistered_fields(); + } else { + redissectPackets(); + } + + mainApp->setReloadingLua(false); + SimpleDialog::displayQueuedMessages(); +#endif +} + +void LograyMainWindow::showAccordionFrame(AccordionFrame *show_frame, bool toggle) +{ + QList<AccordionFrame *>frame_list = QList<AccordionFrame *>() + << main_ui_->goToFrame << main_ui_->searchFrame + << main_ui_->addressEditorFrame << main_ui_->columnEditorFrame + << main_ui_->preferenceEditorFrame << main_ui_->filterExpressionFrame; + + frame_list.removeAll(show_frame); + foreach(AccordionFrame *af, frame_list) af->animatedHide(); + + if (toggle) { + if (show_frame->isVisible()) { + show_frame->animatedHide(); + return; + } + } + show_frame->animatedShow(); +} + +void LograyMainWindow::showColumnEditor(int column) +{ + setPreviousFocus(); + main_ui_->columnEditorFrame->editColumn(column); + showAccordionFrame(main_ui_->columnEditorFrame); +} + +void LograyMainWindow::showPreferenceEditor() +{ + showAccordionFrame(main_ui_->preferenceEditorFrame); +} + +void LograyMainWindow::initViewColorizeMenu() +{ + QList<QAction *> cc_actions = QList<QAction *>() + << main_ui_->actionViewColorizeConversation1 << main_ui_->actionViewColorizeConversation2 + << main_ui_->actionViewColorizeConversation3 << main_ui_->actionViewColorizeConversation4 + << main_ui_->actionViewColorizeConversation5 << main_ui_->actionViewColorizeConversation6 + << main_ui_->actionViewColorizeConversation7 << main_ui_->actionViewColorizeConversation8 + << main_ui_->actionViewColorizeConversation9 << main_ui_->actionViewColorizeConversation10; + + guint8 color_num = 1; + + foreach(QAction *cc_action, cc_actions) { + cc_action->setData(color_num); + connect(cc_action, SIGNAL(triggered()), this, SLOT(colorizeConversation())); + + const color_filter_t *colorf = color_filters_tmp_color(color_num); + if (colorf) { + QColor bg = ColorUtils::fromColorT(colorf->bg_color); + QColor fg = ColorUtils::fromColorT(colorf->fg_color); + cc_action->setIcon(StockIcon::colorIcon(bg.rgb(), fg.rgb(), QString::number(color_num))); + } + color_num++; + } + +#ifdef Q_OS_MAC + // Spotlight uses Cmd+Space + main_ui_->actionViewColorizeResetColorization->setShortcut(QKeySequence("Meta+Space")); +#endif +} + +void LograyMainWindow::addStatsPluginsToMenu() { + GList *cfg_list = stats_tree_get_cfg_list(); + QAction *stats_tree_action; + QMenu *parent_menu; + bool first_item = true; + + for (GList *iter = g_list_first(cfg_list); iter; iter = gxx_list_next(iter)) { + stats_tree_cfg *cfg = gxx_list_data(stats_tree_cfg *, iter); + if (!menu_groups_.contains(cfg->stat_group)) { + continue; + } + if (cfg->plugin) { + if (first_item) { + main_ui_->menuStatistics->addSeparator(); + first_item = false; + } + + parent_menu = main_ui_->menuStatistics; + // gtk/main_menubar.c compresses double slashes, hence SkipEmptyParts +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + QStringList cfg_name_parts = QString(cfg->name).split("/", Qt::SkipEmptyParts); +#else + QStringList cfg_name_parts = QString(cfg->name).split("/", QString::SkipEmptyParts); +#endif + if (cfg_name_parts.isEmpty()) continue; + + QString stat_name = cfg_name_parts.takeLast(); + if (!cfg_name_parts.isEmpty()) { + QString menu_name = cfg_name_parts.join("/"); + parent_menu = findOrAddMenu(parent_menu, menu_name); + } + + stats_tree_action = new QAction(stat_name, this); + stats_tree_action->setData(QString::fromUtf8(cfg->abbr)); + parent_menu->addAction(stats_tree_action); + connect(stats_tree_action, &QAction::triggered, this, [this]() { + QAction* action = qobject_cast<QAction*>(sender()); + if (action) { + openStatisticsTreeDialog(action->data().toString().toUtf8()); + } + }); + } + } + g_list_free(cfg_list); +} + +void LograyMainWindow::setFeaturesEnabled(bool enabled) +{ + main_ui_->menuBar->setEnabled(enabled); + main_ui_->mainToolBar->setEnabled(enabled); + main_ui_->displayFilterToolBar->setEnabled(enabled); + if (enabled) + { + main_ui_->statusBar->clearMessage(); +#ifdef HAVE_LIBPCAP + main_ui_->actionGoAutoScroll->setChecked(recent.capture_auto_scroll); +#endif + } + else + { + main_ui_->statusBar->showMessage(tr("Please wait while Wireshark is initializing…")); + } +} + +// Display Filter Toolbar + +void LograyMainWindow::on_actionNewDisplayFilterExpression_triggered() +{ + main_ui_->filterExpressionFrame->addExpression(df_combo_box_->lineEdit()->text()); +} + +void LograyMainWindow::onFilterSelected(QString filterText, bool prepare) +{ + if (filterText.length() <= 0) + return; + + df_combo_box_->setDisplayFilter(filterText); + // Holding down the Shift key will only prepare filter. + if (!prepare) + df_combo_box_->applyDisplayFilter(); +} + +void LograyMainWindow::onFilterPreferences() +{ + emit showPreferencesDialog(PrefsModel::typeToString(PrefsModel::FilterButtons)); +} + +void LograyMainWindow::onFilterEdit(int uatIndex) +{ + main_ui_->filterExpressionFrame->editExpression(uatIndex); +} + +void LograyMainWindow::openStatCommandDialog(const QString &menu_path, const char *arg, void *userdata) +{ + QString slot = QString("statCommand%1").arg(menu_path); + QMetaObject::invokeMethod(this, slot.toLatin1().constData(), Q_ARG(const char *, arg), Q_ARG(void *, userdata)); +} + +void LograyMainWindow::openTapParameterDialog(const QString cfg_str, const QString arg, void *userdata) +{ + TapParameterDialog *tp_dialog = TapParameterDialog::showTapParameterStatistics(*this, capture_file_, cfg_str, arg, userdata); + if (!tp_dialog) return; + + connect(tp_dialog, SIGNAL(filterAction(QString, FilterAction::Action, FilterAction::ActionType)), + this, SIGNAL(filterAction(QString, FilterAction::Action, FilterAction::ActionType))); + connect(tp_dialog, SIGNAL(updateFilter(QString)), + df_combo_box_->lineEdit(), SLOT(setText(QString))); + tp_dialog->show(); +} + +void LograyMainWindow::openTapParameterDialog() +{ + QAction *tpa = qobject_cast<QAction *>(QObject::sender()); + if (!tpa) return; + + const QString cfg_str = tpa->data().toString(); + openTapParameterDialog(cfg_str, NULL, NULL); +} + +#if defined(HAVE_SOFTWARE_UPDATE) && defined(Q_OS_WIN) +void LograyMainWindow::softwareUpdateRequested() { + // testCaptureFileClose doesn't use this string because we aren't + // going to launch another dialog, but maybe we'll change that. + QString before_what(tr(" before updating")); + if (!testCaptureFileClose(before_what, Update)) { + mainApp->rejectSoftwareUpdate(); + } +} +#endif + +// File Menu + +void LograyMainWindow::connectFileMenuActions() +{ + connect(main_ui_->actionFileOpen, &QAction::triggered, this, + [this]() { openCaptureFile(); }); + + connect(main_ui_->actionFileMerge, &QAction::triggered, this, + [this]() { mergeCaptureFile(); }); + + connect(main_ui_->actionFileImportFromHexDump, &QAction::triggered, this, + [this]() { importCaptureFile(); }); + + connect(main_ui_->actionFileClose, &QAction::triggered, this, [this]() { + QString before_what(tr(" before closing the file")); + if (testCaptureFileClose(before_what)) { + showWelcome(); + } + }); + + connect(main_ui_->actionFileSave, &QAction::triggered, this, + [this]() { saveCaptureFile(capture_file_.capFile(), false); }); + + connect(main_ui_->actionFileSaveAs, &QAction::triggered, this, + [this]() { saveAsCaptureFile(capture_file_.capFile()); }); + + connect(main_ui_->actionFileSetListFiles, &QAction::triggered, this, + [this]() { file_set_dialog_->show(); }); + + connect(main_ui_->actionFileSetNextFile, &QAction::triggered, this, [this]() { + fileset_entry *entry = fileset_get_next(); + + if (entry) { + QString new_cf_path = entry->fullname; + openCaptureFile(new_cf_path); + } + }); + + connect(main_ui_->actionFileSetPreviousFile, &QAction::triggered, this, [this]() { + fileset_entry *entry = fileset_get_previous(); + + if (entry) { + QString new_cf_path = entry->fullname; + openCaptureFile(new_cf_path); + } + }); + + connect(main_ui_->actionFileExportPackets, &QAction::triggered, this, + [this]() { exportSelectedPackets(); }); + + connect(main_ui_->actionFileExportAsPlainText, &QAction::triggered, this, + [this]() { exportDissections(export_type_text); }); + + connect(main_ui_->actionFileExportAsCSV, &QAction::triggered, this, + [this]() { exportDissections(export_type_csv); }); + + connect(main_ui_->actionFileExportAsCArrays, &QAction::triggered, this, + [this]() { exportDissections(export_type_carrays); }); + + connect(main_ui_->actionFileExportAsPSML, &QAction::triggered, this, + [this]() { exportDissections(export_type_psml); }); + + connect(main_ui_->actionFileExportAsPDML, &QAction::triggered, this, + [this]() { exportDissections(export_type_pdml); }); + + connect(main_ui_->actionFileExportAsJSON, &QAction::triggered, this, + [this]() { exportDissections(export_type_json); }); + + connect(main_ui_->actionFileExportPacketBytes, &QAction::triggered, this, + [this]() { exportPacketBytes(); }, Qt::QueuedConnection); + + connect(main_ui_->actionFileExportPDU, &QAction::triggered, this, + [this]() { exportPDU(); }); + + connect(main_ui_->actionFilePrint, &QAction::triggered, this, + [this]() { printFile(); }); +} + +void LograyMainWindow::exportPacketBytes() +{ + QString file_name; + + if (!capture_file_.capFile() || !capture_file_.capFile()->finfo_selected) return; + + file_name = WiresharkFileDialog::getSaveFileName(this, + mainApp->windowTitleString(tr("Export Selected Packet Bytes")), + mainApp->openDialogInitialDir().canonicalPath(), + tr("Raw data (*.bin *.dat *.raw);;All Files (" ALL_FILES_WILDCARD ")") + ); + + if (file_name.length() > 0) { + const guint8 *data_p; + + data_p = tvb_get_ptr(capture_file_.capFile()->finfo_selected->ds_tvb, 0, -1) + + capture_file_.capFile()->finfo_selected->start; + write_file_binary_mode(qUtf8Printable(file_name), data_p, capture_file_.capFile()->finfo_selected->length); + + /* Save the directory name for future file dialogs. */ + mainApp->setLastOpenDirFromFilename(file_name); + } +} + +void LograyMainWindow::exportPDU() +{ + ExportPDUDialog *exportpdu_dialog = new ExportPDUDialog(this); + + if (exportpdu_dialog->isMinimized() == true) + { + exportpdu_dialog->showNormal(); + } + else + { + exportpdu_dialog->show(); + } + + exportpdu_dialog->raise(); + exportpdu_dialog->activateWindow(); +} + +void LograyMainWindow::printFile() +{ + capture_file *cf = capture_file_.capFile(); + g_return_if_fail(cf); + + QList<int> rows = packet_list_->selectedRows(true); + + QStringList entries; + foreach (int row, rows) + entries << QString::number(row); + QString selRange = entries.join(","); + + PrintDialog * pdlg_ = new PrintDialog(this, cf, selRange); + pdlg_->setWindowModality(Qt::ApplicationModal); + pdlg_->show(); +} + +// Edit Menu + +void LograyMainWindow::connectEditMenuActions() +{ + connect(main_ui_->actionCopyAllVisibleItems, &QAction::triggered, this, + [this]() { copySelectedItems(CopyAllVisibleItems); }); + + connect(main_ui_->actionCopyListAsText, &QAction::triggered, this, + [this]() { copySelectedItems(CopyListAsText); }); + + connect(main_ui_->actionCopyListAsCSV, &QAction::triggered, this, + [this]() { copySelectedItems(CopyListAsCSV); }); + + connect(main_ui_->actionCopyListAsYAML, &QAction::triggered, this, + [this]() { copySelectedItems(CopyListAsYAML); }); + + connect(main_ui_->actionCopyAllVisibleSelectedTreeItems, &QAction::triggered, this, + [this]() { copySelectedItems(CopyAllVisibleSelectedTreeItems); }); + + connect(main_ui_->actionEditCopyDescription, &QAction::triggered, this, + [this]() { copySelectedItems(CopySelectedDescription); }); + + connect(main_ui_->actionEditCopyFieldName, &QAction::triggered, this, + [this]() { copySelectedItems(CopySelectedFieldName); }); + + connect(main_ui_->actionEditCopyValue, &QAction::triggered, this, + [this]() { copySelectedItems(CopySelectedValue); }); + + connect(main_ui_->actionEditCopyAsFilter, &QAction::triggered, this, + [this]() { matchFieldFilter(FilterAction::ActionCopy, FilterAction::ActionTypePlain); }); + + connect(main_ui_->actionEditFindPacket, &QAction::triggered, this, + [this]() { findPacket(); }); + + connect(main_ui_->actionEditFindNext, &QAction::triggered, this, + [this]() { main_ui_->searchFrame->findNext(); }); + + connect(main_ui_->actionEditFindPrevious, &QAction::triggered, this, + [this]() { main_ui_->searchFrame->findPrevious(); }); + + // The items below are used in the packet list and detail context menus. + // Use QueuedConnections so that the context menus aren't destroyed + // prematurely. + connect(main_ui_->actionEditMarkPacket, &QAction::triggered, this, [this]() { + freeze(); + packet_list_->markFrame(); + thaw(); + setMenusForSelectedPacket(); + }, Qt::QueuedConnection); + + connect(main_ui_->actionEditMarkAllDisplayed, &QAction::triggered, this, [this]() { + freeze(); + packet_list_->markAllDisplayedFrames(true); + thaw(); + setMenusForSelectedPacket(); + }, Qt::QueuedConnection); + + connect(main_ui_->actionEditUnmarkAllDisplayed, &QAction::triggered, this, [this]() { + freeze(); + packet_list_->markAllDisplayedFrames(false); + thaw(); + setMenusForSelectedPacket(); + }, Qt::QueuedConnection); + + connect(main_ui_->actionEditNextMark, &QAction::triggered, this, [this]() { + if (capture_file_.capFile()) { + cf_find_packet_marked(capture_file_.capFile(), SD_FORWARD); + } + }, Qt::QueuedConnection); + + connect(main_ui_->actionEditPreviousMark, &QAction::triggered, this, [this]() { + if (capture_file_.capFile()) { + cf_find_packet_marked(capture_file_.capFile(), SD_BACKWARD); + } + }, Qt::QueuedConnection); + + connect(main_ui_->actionEditIgnorePacket, &QAction::triggered, this, [this]() { + freeze(); + packet_list_->ignoreFrame(); + thaw(); + setMenusForSelectedPacket(); + }, Qt::QueuedConnection); + + connect(main_ui_->actionEditIgnoreAllDisplayed, &QAction::triggered, this, [this]() { + freeze(); + packet_list_->ignoreAllDisplayedFrames(true); + thaw(); + setMenusForSelectedPacket(); + }, Qt::QueuedConnection); + + connect(main_ui_->actionEditUnignoreAllDisplayed, &QAction::triggered, this, [this]() { + freeze(); + packet_list_->ignoreAllDisplayedFrames(false); + thaw(); + setMenusForSelectedPacket(); + }, Qt::QueuedConnection); + + connect(main_ui_->actionEditSetTimeReference, &QAction::triggered, this, [this]() { + packet_list_->setTimeReference(); + setMenusForSelectedPacket(); + }, Qt::QueuedConnection); + + connect(main_ui_->actionEditUnsetAllTimeReferences, &QAction::triggered, this, [this]() { + packet_list_->unsetAllTimeReferences(); + setMenusForSelectedPacket(); + }, Qt::QueuedConnection); + + connect(main_ui_->actionEditNextTimeReference, &QAction::triggered, this, [this]() { + if (!capture_file_.capFile()) return; + cf_find_packet_time_reference(capture_file_.capFile(), SD_FORWARD); + }, Qt::QueuedConnection); + + connect(main_ui_->actionEditPreviousTimeReference, &QAction::triggered, this, [this]() { + if (!capture_file_.capFile()) return; + cf_find_packet_time_reference(capture_file_.capFile(), SD_BACKWARD); + }, Qt::QueuedConnection); + + connect(main_ui_->actionEditTimeShift, &QAction::triggered, this, + [this]() { editTimeShift(); }, Qt::QueuedConnection); + + connect(main_ui_->actionDeleteAllPacketComments, &QAction::triggered, this, + [this]() { deleteAllPacketComments(); }, Qt::QueuedConnection); + + connect(main_ui_->actionEditConfigurationProfiles, &QAction::triggered, this, + [this]() { editConfigurationProfiles(); }, Qt::QueuedConnection); + + connect(main_ui_->actionEditPreferences, &QAction::triggered, this, + [this]() { showPreferencesDialog(PrefsModel::typeToString(PrefsModel::Appearance)); }, Qt::QueuedConnection); +} + +// XXX This should probably be somewhere else. +void LograyMainWindow::copySelectedItems(LograyMainWindow::CopySelected selection_type) +{ + char label_str[ITEM_LABEL_LENGTH]; + QString clip; + + if (!capture_file_.capFile()) return; + + field_info *finfo_selected = capture_file_.capFile()->finfo_selected; + + switch (selection_type) { + case CopySelectedDescription: + if (proto_tree_->selectionModel()->hasSelection()) { + QModelIndex idx = proto_tree_->selectionModel()->selectedIndexes().first(); + clip = idx.data(Qt::DisplayRole).toString(); + } + break; + case CopySelectedFieldName: + if (finfo_selected && finfo_selected->hfinfo->abbrev != 0) { + clip.append(finfo_selected->hfinfo->abbrev); + } + break; + case CopySelectedValue: + if (finfo_selected && capture_file_.capFile()->edt != 0) { + gchar* field_str = get_node_field_value(finfo_selected, capture_file_.capFile()->edt); + clip.append(field_str); + g_free(field_str); + } + break; + case CopyAllVisibleItems: + clip = proto_tree_->toString(); + break; + case CopyAllVisibleSelectedTreeItems: + if (proto_tree_->selectionModel()->hasSelection()) { + clip = proto_tree_->toString(proto_tree_->selectionModel()->selectedIndexes().first()); + } + break; + case CopyListAsText: + case CopyListAsCSV: + case CopyListAsYAML: + if (packet_list_->selectedRows().count() > 0) + { + QList<int> rows = packet_list_->selectedRows(); + QStringList content; + + PacketList::SummaryCopyType copyType = PacketList::CopyAsText; + if (selection_type == CopyListAsCSV) + copyType = PacketList::CopyAsCSV; + else if (selection_type == CopyListAsYAML) + copyType = PacketList::CopyAsYAML; + + if ((copyType == PacketList::CopyAsText) || + (copyType == PacketList::CopyAsCSV)) { + QString headerEntry = packet_list_->createHeaderSummaryText(copyType); + content << headerEntry; + } + foreach (int row, rows) + { + QModelIndex idx = packet_list_->model()->index(row, 0); + if (! idx.isValid()) + continue; + + QString entry = packet_list_->createSummaryText(idx, copyType); + content << entry; + } + + if (content.count() > 0) { + clip = content.join("\n"); + // + // Each YAML item ends with a newline, so the string + // ends with a newline already if it's CopyListAsYAML. + // If we add a newline, there'd be an extra blank + // line. + // + // Otherwise, we've used newlines as separators, not + // terminators, so there's no final newline. Add it. + // + if (selection_type != CopyListAsYAML) + clip += "\n"; + } + } + break; + } + + if (clip.length() == 0) { + /* If no representation then... Try to read the value */ + proto_item_fill_label(capture_file_.capFile()->finfo_selected, label_str); + clip.append(label_str); + } + + if (clip.length()) { + mainApp->clipboard()->setText(clip); + } else { + QString err = tr("Couldn't copy text. Try another item."); + mainApp->pushStatus(WiresharkApplication::TemporaryStatus, err); + } +} + +void LograyMainWindow::findPacket() +{ + if (! packet_list_->model() || packet_list_->model()->rowCount() < 1) { + return; + } + setPreviousFocus(); + if (!main_ui_->searchFrame->isVisible()) { + showAccordionFrame(main_ui_->searchFrame, true); + } else { + main_ui_->searchFrame->animatedHide(); + } + main_ui_->searchFrame->setFocus(); +} + +void LograyMainWindow::editTimeShift() +{ + TimeShiftDialog *ts_dialog = new TimeShiftDialog(this, capture_file_.capFile()); + connect(ts_dialog, SIGNAL(finished(int)), this, SLOT(editTimeShiftFinished(int))); + + connect(this, SIGNAL(setCaptureFile(capture_file*)), + ts_dialog, SLOT(setCaptureFile(capture_file*))); + connect(ts_dialog, SIGNAL(timeShifted()), packet_list_, SLOT(applyTimeShift())); + + ts_dialog->setWindowModality(Qt::ApplicationModal); + ts_dialog->setAttribute(Qt::WA_DeleteOnClose); + ts_dialog->show(); +} + +void LograyMainWindow::editTimeShiftFinished(int) +{ + if (capture_file_.capFile()->unsaved_changes) { + updateForUnsavedChanges(); + } +} + +void LograyMainWindow::addPacketComment() +{ + QList<int> rows = selectedRows(); + if (rows.count() == 0) + return; + + frame_data * fdata = frameDataForRow(rows.at(0)); + if (! fdata) + return; + + PacketCommentDialog* pc_dialog; + pc_dialog = new PacketCommentDialog(false, this, NULL); + connect(pc_dialog, &QDialog::finished, std::bind(&LograyMainWindow::addPacketCommentFinished, this, pc_dialog, std::placeholders::_1)); + pc_dialog->setWindowModality(Qt::ApplicationModal); + pc_dialog->setAttribute(Qt::WA_DeleteOnClose); + pc_dialog->show(); +} + +void LograyMainWindow::addPacketCommentFinished(PacketCommentDialog* pc_dialog _U_, int result _U_) +{ + if (result == QDialog::Accepted) { + packet_list_->addPacketComment(pc_dialog->text()); + updateForUnsavedChanges(); + } +} + +void LograyMainWindow::editPacketComment() +{ + QList<int> rows = selectedRows(); + if (rows.count() != 1) + return; + + QAction *ra = qobject_cast<QAction*>(sender()); + guint nComment = ra->data().toUInt(); + PacketCommentDialog* pc_dialog; + pc_dialog = new PacketCommentDialog(true, this, packet_list_->getPacketComment(nComment)); + connect(pc_dialog, &QDialog::finished, std::bind(&LograyMainWindow::editPacketCommentFinished, this, pc_dialog, std::placeholders::_1, nComment)); + pc_dialog->setWindowModality(Qt::ApplicationModal); + pc_dialog->setAttribute(Qt::WA_DeleteOnClose); + pc_dialog->show(); +} + +void LograyMainWindow::editPacketCommentFinished(PacketCommentDialog* pc_dialog _U_, int result _U_, guint nComment) +{ + if (result == QDialog::Accepted) { + packet_list_->setPacketComment(nComment, pc_dialog->text()); + updateForUnsavedChanges(); + } +} + +void LograyMainWindow::deletePacketComment() +{ + QAction *ra = qobject_cast<QAction*>(sender()); + guint nComment = ra->data().toUInt(); + packet_list_->setPacketComment(nComment, QString("")); + updateForUnsavedChanges(); +} + +void LograyMainWindow::deleteCommentsFromPackets() +{ + packet_list_->deleteCommentsFromPackets(); + updateForUnsavedChanges(); +} + +void LograyMainWindow::deleteAllPacketComments() +{ + QMessageBox *msg_dialog = new QMessageBox(); + connect(msg_dialog, SIGNAL(finished(int)), this, SLOT(deleteAllPacketCommentsFinished(int))); + + msg_dialog->setIcon(QMessageBox::Question); + msg_dialog->setText(tr("Are you sure you want to remove all packet comments?")); + + msg_dialog->setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); + msg_dialog->setDefaultButton(QMessageBox::Ok); + + msg_dialog->setWindowModality(Qt::ApplicationModal); + msg_dialog->setAttribute(Qt::WA_DeleteOnClose); + msg_dialog->show(); +} + +void LograyMainWindow::deleteAllPacketCommentsFinished(int result) +{ + if (result == QMessageBox::Ok) { + /* XXX Do we need a wait/hourglass for large files? */ + packet_list_->deleteAllPacketComments(); + updateForUnsavedChanges(); + } +} + +void LograyMainWindow::editConfigurationProfiles() +{ + ProfileDialog *cp_dialog = new ProfileDialog(); + cp_dialog->setWindowModality(Qt::ApplicationModal); + cp_dialog->setAttribute(Qt::WA_DeleteOnClose); + cp_dialog->show(); +} + +void LograyMainWindow::showPreferencesDialog(QString module_name) +{ + PreferencesDialog *pref_dialog = new PreferencesDialog(this); + connect(pref_dialog, SIGNAL(destroyed(QObject*)), mainApp, SLOT(flushAppSignals())); + saveWindowGeometry(); // Save in case the layout panes are rearranged + + pref_dialog->setPane(module_name); + pref_dialog->setWindowModality(Qt::ApplicationModal); + pref_dialog->setAttribute(Qt::WA_DeleteOnClose); + pref_dialog->show(); +} + +// View Menu + +void LograyMainWindow::connectViewMenuActions() +{ + connect(main_ui_->actionViewFullScreen, &QAction::triggered, this, [this](bool checked) { + if (checked) { + // Save the state for future restore + was_maximized_ = this->isMaximized(); + this->showFullScreen(); + } else { + // Restore the previous state + if (was_maximized_) { + this->showMaximized(); + } else { + this->showNormal(); + } + } + }); + + connect(main_ui_->actionViewTimeDisplaySecondsWithHoursAndMinutes, &QAction::triggered, this, + [this](bool checked) { setTimeDisplaySecondsWithHoursAndMinutes(checked); }); + + connect(main_ui_->actionViewEditResolvedName, &QAction::triggered, this, + [this]() { editResolvedName(); }); + + connect(main_ui_->actionViewNameResolutionPhysical, &QAction::triggered, this, + [this]() { setNameResolution(); }); + + connect(main_ui_->actionViewNameResolutionNetwork, &QAction::triggered, this, + [this]() { setNameResolution(); }); + + connect(main_ui_->actionViewNameResolutionTransport, &QAction::triggered, this, + [this]() { setNameResolution(); }); + + connect(main_ui_->actionViewZoomIn, &QAction::triggered, this, [this]() { + recent.gui_zoom_level++; + zoomText(); + }); + + connect(main_ui_->actionViewZoomOut, &QAction::triggered, this, [this]() { + recent.gui_zoom_level--; + zoomText(); + }); + + connect(main_ui_->actionViewNormalSize, &QAction::triggered, this, [this]() { + recent.gui_zoom_level = 0; + zoomText(); + }); + + connect(main_ui_->actionViewExpandSubtrees, &QAction::triggered, + proto_tree_, &ProtoTree::expandSubtrees); + + connect(main_ui_->actionViewCollapseSubtrees, &QAction::triggered, + proto_tree_, &ProtoTree::collapseSubtrees); + + connect(main_ui_->actionViewExpandAll, &QAction::triggered, + proto_tree_, &ProtoTree::expandAll); + + connect(main_ui_->actionViewCollapseAll, &QAction::triggered, + proto_tree_, &ProtoTree::collapseAll); + + connect(main_ui_->actionViewColorizePacketList, &QAction::triggered, this, [this](bool checked) { + recent.packet_list_colorize = checked; + packet_list_->recolorPackets(); + }); + + connect(main_ui_->actionViewColoringRules, &QAction::triggered, this, + [this]() { showColoringRulesDialog(); }); + + connect(main_ui_->actionViewColorizeResetColorization, &QAction::triggered, this, [this]() { + gchar *err_msg = NULL; + if (!color_filters_reset_tmp(&err_msg)) { + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg); + g_free(err_msg); + } + packet_list_->recolorPackets(); + setMenusForSelectedPacket(); + }); + + connect(main_ui_->actionViewColorizeNewColoringRule, &QAction::triggered, this, + [this]() { colorizeConversation(true); }); + + connect(main_ui_->actionViewResetLayout, &QAction::triggered, this, [this]() { + recent.gui_geometry_main_upper_pane = 0; + recent.gui_geometry_main_lower_pane = 0; + applyRecentPaneGeometry(); + }); + + connect(main_ui_->actionViewResizeColumns, &QAction::triggered, this, [this]() { + if (! packet_list_->model()) + return; + for (int col = 0; col < packet_list_->model()->columnCount(); col++) { + packet_list_->resizeColumnToContents(col); + recent_set_column_width(col, packet_list_->columnWidth(col)); + } + }); + + connect(main_ui_->actionViewInternalsConversationHashTables, &QAction::triggered, this, [this]() { + ConversationHashTablesDialog *conversation_hash_tables_dlg = new ConversationHashTablesDialog(this); + conversation_hash_tables_dlg->show(); + }); + + connect(main_ui_->actionViewInternalsDissectorTables, &QAction::triggered, this, [this]() { + DissectorTablesDialog *dissector_tables_dlg = new DissectorTablesDialog(this); + dissector_tables_dlg->show(); + }); + + connect(main_ui_->actionViewInternalsSupportedProtocols, &QAction::triggered, this, [this]() { + SupportedProtocolsDialog *supported_protocols_dlg = new SupportedProtocolsDialog(this); + supported_protocols_dlg->show(); + }); + + connect(main_ui_->actionViewShowPacketInNewWindow, &QAction::triggered, this, + [this]() { openPacketDialog(); }); + + // This is only used in ProtoTree. Defining it here makes more sense. + connect(main_ui_->actionContextShowLinkedPacketInNewWindow, &QAction::triggered, this, + [this]() { openPacketDialog(true); }); + + connect(main_ui_->actionViewReload_as_File_Format_or_Capture, &QAction::triggered, this, + [this]() { reloadCaptureFileAsFormatOrCapture(); }); + + connect(main_ui_->actionViewReload, &QAction::triggered, this, + [this]() { reloadCaptureFile(); }); +} + +void LograyMainWindow::showHideMainWidgets(QAction *action) +{ + if (!action) { + return; + } + bool show = action->isChecked(); + QWidget *widget = action->data().value<QWidget*>(); + + // We may have come from the toolbar context menu, so check/uncheck each + // action as well. + if (widget == main_ui_->mainToolBar) { + recent.main_toolbar_show = show; + main_ui_->actionViewMainToolbar->setChecked(show); + } else if (widget == main_ui_->displayFilterToolBar) { + recent.filter_toolbar_show = show; + main_ui_->actionViewFilterToolbar->setChecked(show); + } else if (widget == main_ui_->statusBar) { + recent.statusbar_show = show; + main_ui_->actionViewStatusBar->setChecked(show); + } else if (widget == packet_list_) { + recent.packet_list_show = show; + main_ui_->actionViewPacketList->setChecked(show); + } else if (widget == proto_tree_) { + recent.tree_view_show = show; + main_ui_->actionViewPacketDetails->setChecked(show); + } else if (widget == byte_view_tab_) { + recent.byte_view_show = show; + main_ui_->actionViewPacketBytes->setChecked(show); + } else if (widget == packet_diagram_) { + recent.packet_diagram_show = show; + main_ui_->actionViewPacketDiagram->setChecked(show); + } else { + foreach(QAction *action, main_ui_->menuInterfaceToolbars->actions()) { + QToolBar *toolbar = action->data().value<QToolBar *>(); + if (widget == toolbar) { + GList *entry = g_list_find_custom(recent.interface_toolbars, action->text().toUtf8(), (GCompareFunc)strcmp); + if (show && !entry) { + recent.interface_toolbars = g_list_append(recent.interface_toolbars, g_strdup(action->text().toUtf8())); + } else if (!show && entry) { + recent.interface_toolbars = g_list_remove(recent.interface_toolbars, entry->data); + } + action->setChecked(show); + } + } + + ext_toolbar_t * toolbar = VariantPointer<ext_toolbar_t>::asPtr(action->data()); + if (toolbar) { + GList *entry = g_list_find_custom(recent.gui_additional_toolbars, toolbar->name, (GCompareFunc)strcmp); + if (show && !entry) { + recent.gui_additional_toolbars = g_list_append(recent.gui_additional_toolbars, g_strdup(toolbar->name)); + } else if (!show && entry) { + recent.gui_additional_toolbars = g_list_remove(recent.gui_additional_toolbars, entry->data); + } + action->setChecked(show); + + QList<QToolBar *> toolbars = findChildren<QToolBar *>(); + foreach(QToolBar *bar, toolbars) { + AdditionalToolBar *iftoolbar = dynamic_cast<AdditionalToolBar *>(bar); + if (iftoolbar && iftoolbar->menuName().compare(toolbar->name) == 0) { + iftoolbar->setVisible(show); + } + } + } + } + + if (widget) { + widget->setVisible(show); + } +} + +void LograyMainWindow::setTimestampFormat(QAction *action) +{ + if (!action) { + return; + } + ts_type tsf = action->data().value<ts_type>(); + if (recent.gui_time_format != tsf) { + timestamp_set_type(tsf); + recent.gui_time_format = tsf; + + if (packet_list_) { + packet_list_->resetColumns(); + packet_list_->resizeAllColumns(true); + } + } +} + +void LograyMainWindow::setTimestampPrecision(QAction *action) +{ + if (!action) { + return; + } + ts_precision tsp = action->data().value<ts_precision>(); + if (recent.gui_time_precision != tsp) { + timestamp_set_precision(tsp); + recent.gui_time_precision = tsp; + + if (packet_list_) { + packet_list_->resetColumns(); + packet_list_->resizeAllColumns(true); + } + } +} + +void LograyMainWindow::setTimeDisplaySecondsWithHoursAndMinutes(bool checked) +{ + if (checked) { + recent.gui_seconds_format = TS_SECONDS_HOUR_MIN_SEC; + } else { + recent.gui_seconds_format = TS_SECONDS_DEFAULT; + } + timestamp_set_seconds_type(recent.gui_seconds_format); + + if (packet_list_) { + packet_list_->resetColumns(); + packet_list_->resizeAllColumns(true); + } +} + +void LograyMainWindow::editResolvedName() +{ + //int column = packet_list_->selectedColumn(); + int column = -1; + + if (packet_list_->contextMenuActive() || packet_list_->hasFocus()) { + if (packet_list_->currentIndex().isValid()) { + column = packet_list_->currentIndex().column(); + } + } + + main_ui_->addressEditorFrame->editAddresses(capture_file_, column); + showAccordionFrame(main_ui_->addressEditorFrame); +} + +void LograyMainWindow::setNameResolution() +{ + gbl_resolv_flags.mac_name = main_ui_->actionViewNameResolutionPhysical->isChecked() ? TRUE : FALSE; + gbl_resolv_flags.network_name = main_ui_->actionViewNameResolutionNetwork->isChecked() ? TRUE : FALSE; + gbl_resolv_flags.transport_name = main_ui_->actionViewNameResolutionTransport->isChecked() ? TRUE : FALSE; + + if (packet_list_) { + packet_list_->resetColumns(); + } + mainApp->emitAppSignal(WiresharkApplication::NameResolutionChanged); +} + +void LograyMainWindow::zoomText() +{ + mainApp->zoomTextFont(recent.gui_zoom_level); +} + +void LograyMainWindow::showColoringRulesDialog() +{ + ColoringRulesDialog *coloring_rules_dialog = new ColoringRulesDialog(this); + connect(coloring_rules_dialog, &ColoringRulesDialog::accepted, + packet_list_, &PacketList::recolorPackets); + connect(coloring_rules_dialog, &ColoringRulesDialog::filterAction, + this, &LograyMainWindow::filterAction); + + coloring_rules_dialog->setWindowModality(Qt::ApplicationModal); + coloring_rules_dialog->setAttribute(Qt::WA_DeleteOnClose); + coloring_rules_dialog->show(); +} + +// actionViewColorizeConversation1 - 10 +void LograyMainWindow::colorizeConversation(bool create_rule) +{ + QAction *colorize_action = qobject_cast<QAction *>(sender()); + if (!colorize_action) return; + + if (capture_file_.capFile() && selectedRows().count() > 0) { + packet_info *pi = capture_file_.packetInfo(); + guint8 cc_num = colorize_action->data().toUInt(); + gchar *filter = conversation_filter_from_log(pi); + if (filter == NULL) { + mainApp->pushStatus(WiresharkApplication::TemporaryStatus, tr("Unable to build conversation filter.")); + return; + } + + if (create_rule) { + ColoringRulesDialog coloring_rules_dialog(this, filter); + connect(&coloring_rules_dialog, &ColoringRulesDialog::accepted, + packet_list_, &PacketList::recolorPackets); + connect(&coloring_rules_dialog, &ColoringRulesDialog::filterAction, + this, &LograyMainWindow::filterAction); + coloring_rules_dialog.exec(); + } else { + gchar *err_msg = NULL; + if (!color_filters_set_tmp(cc_num, filter, FALSE, &err_msg)) { + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg); + g_free(err_msg); + } + packet_list_->recolorPackets(); + } + } + setMenusForSelectedPacket(); +} + +void LograyMainWindow::colorizeActionTriggered() +{ + QByteArray filter; + int color_number = -1; + + ConversationAction *conv_action = qobject_cast<ConversationAction *>(sender()); + if (conv_action) { + filter = conv_action->filter(); + color_number = conv_action->colorNumber(); + } else { + ColorizeAction *colorize_action = qobject_cast<ColorizeAction *>(sender()); + if (colorize_action) { + filter = colorize_action->filter(); + color_number = colorize_action->colorNumber(); + } + } + + colorizeWithFilter(filter, color_number); +} + +void LograyMainWindow::colorizeWithFilter(QByteArray filter, int color_number) +{ + if (filter.isEmpty()) return; + + if (color_number > 0) { + // Assume "Color X" + gchar *err_msg = NULL; + if (!color_filters_set_tmp(color_number, filter.constData(), FALSE, &err_msg)) { + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg); + g_free(err_msg); + } + packet_list_->recolorPackets(); + } else { + // New coloring rule + ColoringRulesDialog coloring_rules_dialog(window(), filter); + connect(&coloring_rules_dialog, &ColoringRulesDialog::accepted, + packet_list_, &PacketList::recolorPackets); + connect(&coloring_rules_dialog, &ColoringRulesDialog::filterAction, + this, &LograyMainWindow::filterAction); + coloring_rules_dialog.exec(); + } + main_ui_->actionViewColorizeResetColorization->setEnabled(tmp_color_filters_used()); +} + +void LograyMainWindow::openPacketDialog(bool from_reference) +{ + frame_data * fdata = Q_NULLPTR; + + /* Find the frame for which we're popping up a dialog */ + if (from_reference) { + guint32 framenum = fvalue_get_uinteger(capture_file_.capFile()->finfo_selected->value); + if (framenum == 0) + return; + + fdata = frame_data_sequence_find(capture_file_.capFile()->provider.frames, framenum); + } else if (selectedRows().count() == 1) { + fdata = frameDataForRow(selectedRows().at(0)); + } else if (selectedRows().count() > 1) + return; + + /* If we have a frame, pop up the dialog */ + if (fdata) { + PacketDialog *packet_dialog = new PacketDialog(*this, capture_file_, fdata); + + connect(packet_dialog, &PacketDialog::showProtocolPreferences, + this, &LograyMainWindow::showPreferencesDialog); + connect(packet_dialog, SIGNAL(editProtocolPreference(preference*, pref_module*)), + main_ui_->preferenceEditorFrame, SLOT(editPreference(preference*, pref_module*))); + + connect(this, &LograyMainWindow::closePacketDialogs, packet_dialog, &PacketDialog::close); + zoomText(); // Emits mainApp->zoomMonospaceFont(QFont) + + packet_dialog->show(); + } +} + +void LograyMainWindow::reloadCaptureFileAsFormatOrCapture() +{ + capture_file *cf = CaptureFile::globalCapFile(); + + if (cf->unsaved_changes) { + QString before_what(tr(" before reloading the file")); + if (!testCaptureFileClose(before_what, Reload)) + return; + } + + if (cf->open_type == WTAP_TYPE_AUTO) + cf->open_type = open_info_name_to_type("MIME Files Format"); + else /* TODO: This should be latest format chosen by user */ + cf->open_type = WTAP_TYPE_AUTO; + + cf_reload(cf); +} + +void LograyMainWindow::reloadCaptureFile() +{ + capture_file *cf = CaptureFile::globalCapFile(); + + if (cf->unsaved_changes) { + QString before_what(tr(" before reloading the file")); + if (!testCaptureFileClose(before_what, Reload)) + return; + } + + cf_reload(cf); +} + + +// Expand / collapse slots in proto_tree + +// Go Menu + +void LograyMainWindow::connectGoMenuActions() +{ + connect(main_ui_->actionGoGoToPacket, &QAction::triggered, this, [this]() { + if (! packet_list_->model() || packet_list_->model()->rowCount() < 1) { + return; + } + setPreviousFocus(); + + showAccordionFrame(main_ui_->goToFrame, true); + if (main_ui_->goToFrame->isVisible()) { + main_ui_->goToLineEdit->clear(); + main_ui_->goToLineEdit->setFocus(); + } + }); + + connect(main_ui_->actionGoGoToLinkedPacket, &QAction::triggered, this, [this]() { + QAction *gta = qobject_cast<QAction*>(sender()); + if (!gta) return; + + bool ok = false; + int packet_num = gta->data().toInt(&ok); + if (!ok) return; + + packet_list_->goToPacket(packet_num); + }); + + connect(main_ui_->actionGoNextPacket, &QAction::triggered, + packet_list_, &PacketList::goNextPacket); + + connect(main_ui_->actionGoPreviousPacket, &QAction::triggered, + packet_list_, &PacketList::goPreviousPacket); + + connect(main_ui_->actionGoFirstPacket, &QAction::triggered, + packet_list_, &PacketList::goFirstPacket); + + connect(main_ui_->actionGoLastPacket, &QAction::triggered, + packet_list_, &PacketList::goLastPacket); + + connect(main_ui_->actionGoNextConversationPacket, &QAction::triggered, this, + [this]() { goToConversationFrame(true); }); + + connect(main_ui_->actionGoPreviousConversationPacket, &QAction::triggered, this, + [this]() { goToConversationFrame(false); }); + + connect(main_ui_->actionGoNextHistoryPacket, &QAction::triggered, + packet_list_, &PacketList::goNextHistoryPacket); + + connect(main_ui_->actionGoPreviousHistoryPacket, &QAction::triggered, + packet_list_, &PacketList::goPreviousHistoryPacket); + + // triggered is whenever the user clicks the button; save that as + // the new recent value + connect(main_ui_->actionGoAutoScroll, &QAction::triggered, this, + [](bool checked) { recent.capture_auto_scroll = checked; }); + + // toggled is whenever the value changes; if it changes programmatically + // (e.g., the user scrolls upwards so we stop auto scrolling) change + // whether the button is checked but don't save value to recent (it's + // a temporary change) + connect(main_ui_->actionGoAutoScroll, &QAction::toggled, this, + [this](bool checked) { packet_list_->setVerticalAutoScroll(checked); }); +} + +void LograyMainWindow::goToConversationFrame(bool go_next) { + gchar *filter = NULL; + dfilter_t *dfcode = NULL; + gboolean found_packet = FALSE; + packet_info *pi = capture_file_.packetInfo(); + + if (!pi) { + // No packet was selected, or multiple packets were selected. + return; + } + + /* Try to build a conversation + * filter in the order TCP, UDP, IP, Ethernet and apply the + * coloring */ + filter = conversation_filter_from_log(pi); + if (filter == NULL) { + mainApp->pushStatus(WiresharkApplication::TemporaryStatus, tr("Unable to build conversation filter.")); + g_free(filter); + return; + } + + if (!dfilter_compile(filter, &dfcode, NULL)) { + /* The attempt failed; report an error. */ + mainApp->pushStatus(WiresharkApplication::TemporaryStatus, tr("Error compiling filter for this conversation.")); + g_free(filter); + return; + } + + found_packet = cf_find_packet_dfilter(capture_file_.capFile(), dfcode, go_next ? SD_FORWARD : SD_BACKWARD); + + if (!found_packet) { + /* We didn't find a packet */ + mainApp->pushStatus(WiresharkApplication::TemporaryStatus, tr("No previous/next packet in conversation.")); + } + + dfilter_free(dfcode); + g_free(filter); +} + +// Capture Menu + +void LograyMainWindow::connectCaptureMenuActions() +{ +#ifdef HAVE_LIBPCAP + connect(main_ui_->actionCaptureOptions, &QAction::triggered, this, + [this]() { showCaptureOptionsDialog(); }); +#endif + + connect(main_ui_->actionCaptureStart, &QAction::triggered, this, + [this]() { startCaptureTriggered(); }); + + connect(main_ui_->actionCaptureStop, &QAction::triggered, this, + [this]() { stopCapture(); }); + + connect(main_ui_->actionCaptureRestart, &QAction::triggered, this, [this]() { +#ifdef HAVE_LIBPCAP + QString before_what(tr(" before restarting the capture")); + cap_session_.capture_opts->restart = TRUE; + if (!testCaptureFileClose(before_what, Restart)) { + return; + } + startCapture(QStringList()); +#endif // HAVE_LIBPCAP + }); + + connect(main_ui_->actionCaptureCaptureFilters, &QAction::triggered, this, [this]() { + FilterDialog *capture_filter_dlg = new FilterDialog(window(), FilterDialog::CaptureFilter); + capture_filter_dlg->setWindowModality(Qt::ApplicationModal); + capture_filter_dlg->setAttribute(Qt::WA_DeleteOnClose); + capture_filter_dlg->show(); + }); + +#ifdef HAVE_LIBPCAP + connect(main_ui_->actionCaptureRefreshInterfaces, &QAction::triggered, this, [this]() { + main_ui_->actionCaptureRefreshInterfaces->setEnabled(false); + mainApp->refreshLocalInterfaces(); + main_ui_->actionCaptureRefreshInterfaces->setEnabled(true); + }); +#endif +} + +void LograyMainWindow::showCaptureOptionsDialog() +{ +#ifdef HAVE_LIBPCAP + if (!capture_options_dialog_) { + capture_options_dialog_ = new CaptureOptionsDialog(this); + + connect(capture_options_dialog_, &CaptureOptionsDialog::startCapture, this, [this]() { startCapture(); }); + connect(capture_options_dialog_, &CaptureOptionsDialog::stopCapture, this, &LograyMainWindow::stopCapture); + + connect(capture_options_dialog_, &CaptureOptionsDialog::interfacesChanged, + this->welcome_page_, &WelcomePage::interfaceSelected); + connect(capture_options_dialog_, &CaptureOptionsDialog::interfacesChanged, + this->welcome_page_->getInterfaceFrame(), &InterfaceFrame::updateSelectedInterfaces); + connect(capture_options_dialog_, &CaptureOptionsDialog::interfaceListChanged, + this->welcome_page_->getInterfaceFrame(), &InterfaceFrame::interfaceListChanged); + connect(capture_options_dialog_, &CaptureOptionsDialog::captureFilterTextEdited, + this->welcome_page_, &WelcomePage::setCaptureFilterText); + // Propagate selection changes from main UI to dialog. + connect(this->welcome_page_, &WelcomePage::interfacesChanged, + capture_options_dialog_, &CaptureOptionsDialog::interfaceSelected); + + connect(capture_options_dialog_, &CaptureOptionsDialog::setFilterValid, + this, &LograyMainWindow::startInterfaceCapture); + + connect(capture_options_dialog_, &CaptureOptionsDialog::showExtcapOptions, + this, &LograyMainWindow::showExtcapOptionsDialog); + } + capture_options_dialog_->updateInterfaces(); + + if (capture_options_dialog_->isMinimized()) { + capture_options_dialog_->showNormal(); + } else { + capture_options_dialog_->show(); + } + + capture_options_dialog_->raise(); + capture_options_dialog_->activateWindow(); +#endif +} + +void LograyMainWindow::startCaptureTriggered() +{ +//#ifdef HAVE_AIRPCAP +// airpcap_if_active = airpcap_if_selected; +// if (airpcap_if_active) +// airpcap_set_toolbar_start_capture(airpcap_if_active); +//#endif + +// if (cap_open_w) { +// /* +// * There's an options dialog; get the values from it and close it. +// */ +// gboolean success; + +// /* Determine if "capture start" while building of the "capture options" window */ +// /* is in progress. If so, ignore the "capture start. */ +// /* XXX: Would it be better/cleaner for the "capture options" window code to */ +// /* disable the capture start button temporarily ? */ +// if (cap_open_complete == FALSE) { +// return; /* Building options window: ignore "capture start" */ +// } +// success = capture_dlg_prep(cap_open_w); +// window_destroy(GTK_WIDGET(cap_open_w)); +// if (!success) +// return; /* error in options dialog */ +// } + +#ifdef HAVE_LIBPCAP + if (global_capture_opts.num_selected == 0) { + QString err_msg = tr("No Interface Selected."); + mainApp->pushStatus(WiresharkApplication::TemporaryStatus, err_msg); + main_ui_->actionCaptureStart->setChecked(false); + return; + } + + /* XXX - will closing this remove a temporary file? */ + QString before_what(tr(" before starting a new capture")); + if (testCaptureFileClose(before_what)) { + startCapture(); + } else { + // simply clicking the button sets it to 'checked' even though we've + // decided to do nothing, so undo that + main_ui_->actionCaptureStart->setChecked(false); + } +#endif // HAVE_LIBPCAP +} + +// Analyze Menu + +void LograyMainWindow::connectAnalyzeMenuActions() +{ + connect(main_ui_->actionAnalyzeDisplayFilters, &QAction::triggered, this, [=]() { + FilterDialog *display_filter_dlg = new FilterDialog(window(), FilterDialog::DisplayFilter); + display_filter_dlg->setWindowModality(Qt::ApplicationModal); + display_filter_dlg->setAttribute(Qt::WA_DeleteOnClose); + display_filter_dlg->show(); + }); + + connect(main_ui_->actionAnalyzeDisplayFilterMacros, &QAction::triggered, this, [=]() { + struct epan_uat* dfm_uat; + dfilter_macro_get_uat(&dfm_uat); + UatDialog *uat_dlg = new UatDialog(parentWidget(), dfm_uat); + connect(uat_dlg, SIGNAL(destroyed(QObject*)), mainApp, SLOT(flushAppSignals())); + + uat_dlg->setWindowModality(Qt::ApplicationModal); + uat_dlg->setAttribute(Qt::WA_DeleteOnClose); + uat_dlg->show(); + }); + + connect(main_ui_->actionDisplayFilterExpression, &QAction::triggered, this, [=]() { + DisplayFilterExpressionDialog *dfe_dialog = new DisplayFilterExpressionDialog(this); + + connect(dfe_dialog, &DisplayFilterExpressionDialog::insertDisplayFilter, + qobject_cast<SyntaxLineEdit *>(df_combo_box_->lineEdit()), &SyntaxLineEdit::insertFilter); + + dfe_dialog->show(); + }); + + connect(main_ui_->actionAnalyzeApplyAsColumn, &QAction::triggered, this, &LograyMainWindow::applyFieldAsColumn); + + connect(main_ui_->actionAnalyzeEnabledProtocols, &QAction::triggered, this, [=]() { + EnabledProtocolsDialog *enable_proto_dialog = new EnabledProtocolsDialog(this); + connect(enable_proto_dialog, SIGNAL(destroyed(QObject*)), mainApp, SLOT(flushAppSignals())); + + enable_proto_dialog->setWindowModality(Qt::ApplicationModal); + enable_proto_dialog->setAttribute(Qt::WA_DeleteOnClose); + enable_proto_dialog->show(); + }); + + connect(main_ui_->actionAnalyzeDecodeAs, &QAction::triggered, this, [=]() { + QAction *da_action = qobject_cast<QAction*>(sender()); + bool create_new = da_action && da_action->property("create_new").toBool(); + + DecodeAsDialog *da_dialog = new DecodeAsDialog(this, capture_file_.capFile(), create_new); + connect(da_dialog, SIGNAL(destroyed(QObject*)), mainApp, SLOT(flushAppSignals())); + + da_dialog->setWindowModality(Qt::ApplicationModal); + da_dialog->setAttribute(Qt::WA_DeleteOnClose); + da_dialog->show(); + }); + + connect(main_ui_->actionAnalyzeReloadLuaPlugins, &QAction::triggered, this, &LograyMainWindow::reloadLuaPlugins); + + connect(main_ui_->actionAnalyzeShowPacketBytes, &QAction::triggered, this, [=]() { + ShowPacketBytesDialog *spbd = new ShowPacketBytesDialog(*this, capture_file_); + spbd->addCodecs(text_codec_map_); + spbd->show(); + }); + + connect(main_ui_->actionAnalyzeExpertInfo, &QAction::triggered, this, [=]() { + statCommandExpertInfo(NULL, NULL); + }); +} + + +void LograyMainWindow::filterMenuAboutToShow() +{ + QMenu * menu = qobject_cast<QMenu *>(sender()); + QString field_filter; + + if (capture_file_.capFile() && capture_file_.capFile()->finfo_selected) { + char *tmp_field = proto_construct_match_selected_string(capture_file_.capFile()->finfo_selected, + capture_file_.capFile()->edt); + field_filter = QString(tmp_field); + wmem_free(NULL, tmp_field); + } + bool enable = ! field_filter.isEmpty(); + bool prepare = menu->objectName().compare("menuPrepareAFilter") == 0; + + menu->clear(); + QActionGroup * group = FilterAction::createFilterGroup(field_filter, prepare, enable, menu); + menu->addActions(group->actions()); +} + +void LograyMainWindow::matchFieldFilter(FilterAction::Action action, FilterAction::ActionType filter_type) +{ + QString field_filter; + + if (packet_list_->contextMenuActive() || packet_list_->hasFocus()) { + field_filter = packet_list_->getFilterFromRowAndColumn(packet_list_->currentIndex()); + } else if (capture_file_.capFile() && capture_file_.capFile()->finfo_selected) { + char *tmp_field = proto_construct_match_selected_string(capture_file_.capFile()->finfo_selected, + capture_file_.capFile()->edt); + field_filter = QString(tmp_field); + wmem_free(NULL, tmp_field); + } + + if (field_filter.isEmpty()) { + QString err = tr("No filter available. Try another %1.").arg(packet_list_->contextMenuActive() ? tr("column") : tr("item")); + mainApp->pushStatus(WiresharkApplication::TemporaryStatus, err); + return; + } + + setDisplayFilter(field_filter, action, filter_type); +} + +void LograyMainWindow::applyFieldAsColumn() +{ + if (capture_file_.capFile() != 0 && capture_file_.capFile()->finfo_selected != 0) { + header_field_info *hfinfo = capture_file_.capFile()->finfo_selected->hfinfo; + int col = column_prefs_has_custom(hfinfo->abbrev); + if (col == -1) { + insertColumn(hfinfo->name, hfinfo->abbrev); + } else { + QString status; + if (QString(hfinfo->name) == get_column_title(col)) { + status = tr("The \"%1\" column already exists.").arg(hfinfo->name); + } else { + status = tr("The \"%1\" column already exists as \"%2\".").arg(hfinfo->name).arg(get_column_title(col)); + } + mainApp->pushStatus(WiresharkApplication::TemporaryStatus, status); + + if (!get_column_visible(col)) { + packet_list_->setColumnHidden(col, false); + set_column_visible(col, TRUE); + prefs_main_write(); + } + } + } +} + +void LograyMainWindow::applyConversationFilter() +{ + ConversationAction *conv_action = qobject_cast<ConversationAction*>(sender()); + if (!conv_action) return; + + packet_info *pinfo = capture_file_.packetInfo(); + if (!pinfo) return; + + QByteArray conv_filter = conv_action->filter(); + if (conv_filter.isEmpty()) return; + + if (conv_action->isFilterValid(pinfo)) { + + df_combo_box_->lineEdit()->setText(conv_filter); + df_combo_box_->applyDisplayFilter(); + } +} + +void LograyMainWindow::applyExportObject() +{ + ExportObjectAction *export_action = qobject_cast<ExportObjectAction*>(sender()); + if (!export_action) + return; + + ExportObjectDialog* export_dialog = new ExportObjectDialog(*this, capture_file_, export_action->exportObject()); + export_dialog->setWindowModality(Qt::ApplicationModal); + export_dialog->setAttribute(Qt::WA_DeleteOnClose); + export_dialog->show(); +} + +// -z expert +void LograyMainWindow::statCommandExpertInfo(const char *, void *) +{ + const DisplayFilterEdit *df_edit = dynamic_cast<DisplayFilterEdit *>(df_combo_box_->lineEdit()); + ExpertInfoDialog *expert_dialog = new ExpertInfoDialog(*this, capture_file_, df_edit->text()); + + connect(expert_dialog->getExpertInfoView(), SIGNAL(goToPacket(int, int)), + packet_list_, SLOT(goToPacket(int, int))); + connect(expert_dialog, SIGNAL(filterAction(QString, FilterAction::Action, FilterAction::ActionType)), + this, SIGNAL(filterAction(QString, FilterAction::Action, FilterAction::ActionType))); + + expert_dialog->show(); +} + + +// Next / previous / first / last slots in packet_list + +// Statistics Menu + +void LograyMainWindow::connectStatisticsMenuActions() +{ + connect(main_ui_->actionStatisticsCaptureFileProperties, &QAction::triggered, this, [=]() { + CaptureFilePropertiesDialog *capture_file_properties_dialog = new CaptureFilePropertiesDialog(*this, capture_file_); + connect(capture_file_properties_dialog, SIGNAL(captureCommentChanged()), + this, SLOT(updateForUnsavedChanges())); + capture_file_properties_dialog->show(); + }); + + connect(main_ui_->actionStatisticsResolvedAddresses, &QAction::triggered, this, &LograyMainWindow::showResolvedAddressesDialog); + + connect(main_ui_->actionStatisticsProtocolHierarchy, &QAction::triggered, this, [=]() { + ProtocolHierarchyDialog *phd = new ProtocolHierarchyDialog(*this, capture_file_); + connect(phd, SIGNAL(filterAction(QString, FilterAction::Action, FilterAction::ActionType)), + this, SIGNAL(filterAction(QString, FilterAction::Action, FilterAction::ActionType))); + phd->show(); + }); + + connect(main_ui_->actionStatisticsConversations, &QAction::triggered, this, &LograyMainWindow::showConversationsDialog); + connect(main_ui_->actionStatisticsEndpoints, &QAction::triggered, this, &LograyMainWindow::showEndpointsDialog); + + connect(main_ui_->actionStatisticsPacketLengths, &QAction::triggered, this, [=]() { openStatisticsTreeDialog("plen"); }); + + connect(main_ui_->actionStatisticsIOGraph, &QAction::triggered, this, [=]() { statCommandIOGraph(NULL, NULL); }); + + connect(main_ui_->actionStatisticsFlowGraph, &QAction::triggered, this, [=]() { + QMessageBox::warning(this, "Oops", "SequenceDialog depends on RTPStreamDialog"); + // SequenceDialog *sequence_dialog = new SequenceDialog(*this, capture_file_); + // sequence_dialog->show(); + }); +} + +void LograyMainWindow::openStatisticsTreeDialog(const gchar *abbr) +{ + StatsTreeDialog *st_dialog = new StatsTreeDialog(*this, capture_file_, abbr); +// connect(st_dialog, SIGNAL(goToPacket(int)), +// packet_list_, SLOT(goToPacket(int))); + st_dialog->show(); +} + +// -z io,stat +void LograyMainWindow::statCommandIOGraph(const char *, void *) +{ + const DisplayFilterEdit *df_edit = qobject_cast<DisplayFilterEdit *>(df_combo_box_->lineEdit()); + QString displayFilter; + if (df_edit) + displayFilter = df_edit->text(); + + IOGraphDialog *iog_dialog = new IOGraphDialog(*this, capture_file_, displayFilter); + connect(iog_dialog, SIGNAL(goToPacket(int)), packet_list_, SLOT(goToPacket(int))); + connect(this, SIGNAL(reloadFields()), iog_dialog, SLOT(reloadFields())); + iog_dialog->show(); +} + +// Tools Menu + +// XXX No log tools yet + +// Help Menu +void LograyMainWindow::connectHelpMenuActions() +{ + connect(main_ui_->actionHelpAbout, &QAction::triggered, this, [=]() { + AboutDialog *about_dialog = new AboutDialog(this); + + if (about_dialog->isMinimized() == true) + { + about_dialog->showNormal(); + } + else + { + about_dialog->show(); + } + + about_dialog->raise(); + about_dialog->activateWindow(); + }); + + connect(main_ui_->actionHelpContents, &QAction::triggered, this, [=]() { mainApp->helpTopicAction(HELP_CONTENT); }); + connect(main_ui_->actionHelpMPWireshark, &QAction::triggered, this, [=]() { mainApp->helpTopicAction(LOCALPAGE_MAN_WIRESHARK); }); + connect(main_ui_->actionHelpMPWireshark_Filter, &QAction::triggered, this, [=]() { mainApp->helpTopicAction(LOCALPAGE_MAN_WIRESHARK_FILTER); }); + connect(main_ui_->actionHelpMPCapinfos, &QAction::triggered, this, [=]() { mainApp->helpTopicAction(LOCALPAGE_MAN_CAPINFOS); }); + connect(main_ui_->actionHelpMPDumpcap, &QAction::triggered, this, [=]() { mainApp->helpTopicAction(LOCALPAGE_MAN_DUMPCAP); }); + connect(main_ui_->actionHelpMPEditcap, &QAction::triggered, this, [=]() { mainApp->helpTopicAction(LOCALPAGE_MAN_EDITCAP); }); + connect(main_ui_->actionHelpMPMergecap, &QAction::triggered, this, [=]() { mainApp->helpTopicAction(LOCALPAGE_MAN_MERGECAP); }); + connect(main_ui_->actionHelpMPRawshark, &QAction::triggered, this, [=]() { mainApp->helpTopicAction(LOCALPAGE_MAN_RAWSHARK); }); + connect(main_ui_->actionHelpMPReordercap, &QAction::triggered, this, [=]() { mainApp->helpTopicAction(LOCALPAGE_MAN_REORDERCAP); }); + connect(main_ui_->actionHelpMPText2pcap, &QAction::triggered, this, [=]() { mainApp->helpTopicAction(LOCALPAGE_MAN_TEXT2PCAP); }); + connect(main_ui_->actionHelpMPTShark, &QAction::triggered, this, [=]() { mainApp->helpTopicAction(LOCALPAGE_MAN_TSHARK); }); + connect(main_ui_->actionHelpWebsite, &QAction::triggered, this, [=]() { mainApp->helpTopicAction(ONLINEPAGE_HOME); }); + connect(main_ui_->actionHelpFAQ, &QAction::triggered, this, [=]() { mainApp->helpTopicAction(ONLINEPAGE_FAQ); }); + connect(main_ui_->actionHelpAsk, &QAction::triggered, this, [=]() { mainApp->helpTopicAction(ONLINEPAGE_ASK); }); + connect(main_ui_->actionHelpDownloads, &QAction::triggered, this, [=]() { mainApp->helpTopicAction(ONLINEPAGE_DOWNLOAD); }); + connect(main_ui_->actionHelpWiki, &QAction::triggered, this, [=]() { mainApp->helpTopicAction(ONLINEPAGE_WIKI); }); + connect(main_ui_->actionHelpSampleCaptures, &QAction::triggered, this, [=]() { mainApp->helpTopicAction(ONLINEPAGE_SAMPLE_FILES); }); +} + +#ifdef HAVE_SOFTWARE_UPDATE +void LograyMainWindow::checkForUpdates() +{ + software_update_check(); +} +#endif + +void LograyMainWindow::setPreviousFocus() { + previous_focus_ = mainApp->focusWidget(); + if (previous_focus_ != nullptr) { + connect(previous_focus_, SIGNAL(destroyed()), this, SLOT(resetPreviousFocus())); + } +} + +void LograyMainWindow::resetPreviousFocus() { + previous_focus_ = nullptr; +} + +void LograyMainWindow::goToCancelClicked() +{ + main_ui_->goToFrame->animatedHide(); + if (previous_focus_) { + disconnect(previous_focus_, SIGNAL(destroyed()), this, SLOT(resetPreviousFocus())); + previous_focus_->setFocus(); + resetPreviousFocus(); + } +} + +void LograyMainWindow::goToGoClicked() +{ + gotoFrame(main_ui_->goToLineEdit->text().toInt()); + + goToCancelClicked(); +} + +void LograyMainWindow::goToLineEditReturnPressed() +{ + goToGoClicked(); +} + +void LograyMainWindow::showResolvedAddressesDialog() +{ + QString capFileName; + wtap* wth = Q_NULLPTR; + if (capture_file_.isValid()) + { + capFileName = capture_file_.capFile()->filename; + wth = capture_file_.capFile()->provider.wth; + } + ResolvedAddressesDialog *resolved_addresses_dialog = + new ResolvedAddressesDialog(this, capFileName, wth); + resolved_addresses_dialog->show(); +} + +void LograyMainWindow::showConversationsDialog() +{ + ConversationDialog *conv_dialog = new ConversationDialog(*this, capture_file_); + connect(conv_dialog, SIGNAL(filterAction(QString, FilterAction::Action, FilterAction::ActionType)), + this, SIGNAL(filterAction(QString, FilterAction::Action, FilterAction::ActionType))); + connect(conv_dialog, SIGNAL(openFollowStreamDialog(int, guint, guint)), + this, SLOT(openFollowStreamDialog(int, guint, guint))); + conv_dialog->show(); +} + +void LograyMainWindow::showEndpointsDialog() +{ + EndpointDialog *endp_dialog = new EndpointDialog(*this, capture_file_); + connect(endp_dialog, SIGNAL(filterAction(QString, FilterAction::Action, FilterAction::ActionType)), + this, SIGNAL(filterAction(QString, FilterAction::Action, FilterAction::ActionType))); + connect(endp_dialog, SIGNAL(openFollowStreamDialog(int)), + this, SLOT(openFollowStreamDialog(int))); + endp_dialog->show(); +} + +void LograyMainWindow::externalMenuItemTriggered() +{ + QAction * triggerAction = NULL; + QVariant v; + ext_menubar_t * entry = NULL; + + if (QObject::sender()) { + triggerAction = (QAction *)QObject::sender(); + v = triggerAction->data(); + + if (v.canConvert<void *>()) { + entry = (ext_menubar_t *)v.value<void *>(); + + if (entry->type == EXT_MENUBAR_ITEM) { + entry->callback(EXT_MENUBAR_QT_GUI, (gpointer)((void *)main_ui_), entry->user_data); + } else { + QDesktopServices::openUrl(QUrl(QString((gchar *)entry->user_data))); + } + } + } +} + +void LograyMainWindow::extcap_options_finished(int result) +{ + if (result == QDialog::Accepted) { + QString before_what(tr(" before starting a new capture")); + if (testCaptureFileClose(before_what)) { + startCapture(); + } + } + this->welcome_page_->getInterfaceFrame()->interfaceListChanged(); +} + +void LograyMainWindow::showExtcapOptionsDialog(QString &device_name, bool startCaptureOnClose) +{ + ExtcapOptionsDialog * extcap_options_dialog = ExtcapOptionsDialog::createForDevice(device_name, startCaptureOnClose, this); + /* The dialog returns null, if the given device name is not a valid extcap device */ + if (extcap_options_dialog) { + extcap_options_dialog->setModal(true); + extcap_options_dialog->setAttribute(Qt::WA_DeleteOnClose); + if (startCaptureOnClose) { + connect(extcap_options_dialog, SIGNAL(finished(int)), + this, SLOT(extcap_options_finished(int))); + } +#ifdef HAVE_LIBPCAP + if (capture_options_dialog_ && startCaptureOnClose) { + /* Allow capture options dialog to close */ + connect(extcap_options_dialog, SIGNAL(accepted()), + capture_options_dialog_, SLOT(accept())); + } +#endif + extcap_options_dialog->show(); + } +} + +void LograyMainWindow::on_actionContextWikiProtocolPage_triggered() +{ + QAction *wa = qobject_cast<QAction*>(sender()); + if (!wa) return; + + bool ok = false; + int field_id = wa->data().toInt(&ok); + if (!ok) return; + + const QString proto_abbrev = proto_registrar_get_abbrev(field_id); + + int ret = QMessageBox::question(this, mainApp->windowTitleString(tr("Wiki Page for %1").arg(proto_abbrev)), + tr("<p>The Wireshark Wiki is maintained by the community.</p>" + "<p>The page you are about to load might be wonderful, " + "incomplete, wrong, or nonexistent.</p>" + "<p>Proceed to the wiki?</p>"), + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + + if (ret != QMessageBox::Yes) return; + + QUrl wiki_url = QString(WS_WIKI_URL("Protocols/%1")).arg(proto_abbrev); + QDesktopServices::openUrl(wiki_url); +} + +void LograyMainWindow::on_actionContextFilterFieldReference_triggered() +{ + QAction *wa = qobject_cast<QAction*>(sender()); + if (!wa) return; + + bool ok = false; + int field_id = wa->data().toInt(&ok); + if (!ok) return; + + const QString proto_abbrev = proto_registrar_get_abbrev(field_id); + + QUrl dfref_url = QString(WS_DOCS_URL "/dfref/%1/%2") + .arg(proto_abbrev[0]) + .arg(proto_abbrev); + QDesktopServices::openUrl(dfref_url); +} + +void LograyMainWindow::activatePluginIFToolbar(bool) +{ + QAction *sendingAction = dynamic_cast<QAction *>(sender()); + if (!sendingAction || !sendingAction->data().isValid()) + return; + + ext_toolbar_t *toolbar = VariantPointer<ext_toolbar_t>::asPtr(sendingAction->data()); + + QList<QToolBar *> toolbars = findChildren<QToolBar *>(); + foreach(QToolBar *bar, toolbars) { + AdditionalToolBar *iftoolbar = dynamic_cast<AdditionalToolBar *>(bar); + if (iftoolbar && iftoolbar->menuName().compare(toolbar->name) == 0) { + if (iftoolbar->isVisible()) { + iftoolbar->setVisible(false); + sendingAction->setChecked(true); + } else { + iftoolbar->setVisible(true); + sendingAction->setChecked(true); + } + } + } +} + +#ifdef _MSC_VER +#pragma warning(pop) +#endif |